@7kprotocol/sdk-ts 3.6.1-beta.2 → 5.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -12
- package/dist/bluefin7k-63A5CV3A.mjs +2 -0
- package/dist/bluefin7k-63A5CV3A.mjs.map +1 -0
- package/dist/bluefin7k-MP3A4MG4.js +2 -0
- package/dist/bluefin7k-MP3A4MG4.js.map +1 -0
- package/dist/cetus-HOKHMQSS.mjs +2 -0
- package/dist/cetus-HOKHMQSS.mjs.map +1 -0
- package/dist/cetus-MUHFO44Y.js +2 -0
- package/dist/cetus-MUHFO44Y.js.map +1 -0
- package/dist/chunk-CYI4MM5C.mjs +2 -0
- package/dist/chunk-CYI4MM5C.mjs.map +1 -0
- package/dist/chunk-E5KM5OVW.js +2 -0
- package/dist/chunk-E5KM5OVW.js.map +1 -0
- package/dist/flowx-533PLKYB.mjs +2 -0
- package/dist/flowx-533PLKYB.mjs.map +1 -0
- package/dist/flowx-SIZHC2DP.js +2 -0
- package/dist/flowx-SIZHC2DP.js.map +1 -0
- package/dist/index.d.mts +44 -6
- package/dist/index.d.ts +44 -6
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -6
- package/dist/bluefin7k-I6ZCDWDN.js +0 -2
- package/dist/bluefin7k-I6ZCDWDN.js.map +0 -1
- package/dist/bluefin7k-TERLUCNL.mjs +0 -2
- package/dist/bluefin7k-TERLUCNL.mjs.map +0 -1
- package/dist/cetus-AU3OMWOY.mjs +0 -2
- package/dist/cetus-AU3OMWOY.mjs.map +0 -1
- package/dist/cetus-SIPX6FYL.js +0 -2
- package/dist/cetus-SIPX6FYL.js.map +0 -1
- package/dist/chunk-ETQEI4QC.mjs +0 -2
- package/dist/chunk-ETQEI4QC.mjs.map +0 -1
- package/dist/chunk-KVGSSW22.js +0 -2
- package/dist/chunk-KVGSSW22.js.map +0 -1
- package/dist/flowx-6M54WFWO.js +0 -2
- package/dist/flowx-6M54WFWO.js.map +0 -1
- package/dist/flowx-OXZZX5FD.mjs +0 -2
- package/dist/flowx-OXZZX5FD.mjs.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkKVGSSW22js = require('./chunk-KVGSSW22.js');var _client = require('@mysten/sui/client');var _transactions = require('@mysten/sui/transactions');var _utils = require('@mysten/sui/utils');var tt="0x0000000000000000000000000000000000000000000000000000000000000000";var St=["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000403","0x000000000000000000000000000000000000000000000000000000000000000c"],v=s=>{let t=_utils.normalizeSuiAddress.call(void 0, s);return St.includes(t)};var V=class{async getObject(t){let[e,r]=await Promise.all([this.get("OwnedObject",t),this.get("SharedOrImmutableObject",t)]);return _nullishCoalesce(_nullishCoalesce(e, () => (r)), () => (null))}async getObjects(t){return Promise.all(t.map(e=>this.getObject(e)))}async addObject(t){return t.owner?await this.set("OwnedObject",t.objectId,t):await this.set("SharedOrImmutableObject",t.objectId,t),t}async addObjects(t){await Promise.all(t.map(async e=>this.addObject(e)))}async deleteObject(t){await Promise.all([this.delete("OwnedObject",t),this.delete("SharedOrImmutableObject",t)])}async deleteObjects(t){await Promise.all(t.map(e=>this.deleteObject(e)))}async getMoveFunctionDefinition(t){let e=`${_utils.normalizeSuiAddress.call(void 0, t.package)}::${t.module}::${t.function}`;return this.get("MoveFunction",e)}async addMoveFunctionDefinition(t){let e=_utils.normalizeSuiAddress.call(void 0, t.package),r=`${e}::${t.module}::${t.function}`,i={...t,package:e};return await this.set("MoveFunction",r,i),i}async deleteMoveFunctionDefinition(t){let e=`${_utils.normalizeSuiAddress.call(void 0, t.package)}::${t.module}::${t.function}`;await this.delete("MoveFunction",e)}async getCustom(t){return this.get("Custom",t)}async setCustom(t,e){return this.set("Custom",t,e)}async deleteCustom(t){return this.delete("Custom",t)}},h,q=class extends V{constructor(){super(...arguments);_chunkKVGSSW22js.b.call(void 0, this,h,{OwnedObject:new Map,SharedOrImmutableObject:new Map,MoveFunction:new Map,Custom:new Map})}async get(e,r){return _nullishCoalesce(_chunkKVGSSW22js.a.call(void 0, this,h)[e].get(r), () => (null))}async set(e,r,i){_chunkKVGSSW22js.a.call(void 0, this,h)[e].set(r,i)}async delete(e,r){_chunkKVGSSW22js.a.call(void 0, this,h)[e].delete(r)}async clear(e){if(e)_chunkKVGSSW22js.a.call(void 0, this,h)[e].clear();else for(let r of Object.values(_chunkKVGSSW22js.a.call(void 0, this,h)))r.clear()}};h=new WeakMap;var S,l,A,M=class{constructor({cache:t=new q,onEffects:e,client:r}){_chunkKVGSSW22js.b.call(void 0, this,S);_chunkKVGSSW22js.b.call(void 0, this,l);_chunkKVGSSW22js.b.call(void 0, this,A);_chunkKVGSSW22js.c.call(void 0, this,S,r),_chunkKVGSSW22js.c.call(void 0, this,l,t),_chunkKVGSSW22js.c.call(void 0, this,A,e)}async applyCache(t,e){let r=(await _chunkKVGSSW22js.a.call(void 0, this,l).getObjects(e)).filter(n=>n!==null),i=new Map(r.map(n=>[n.objectId,n])),o=[];for(let n of t.inputs){if(!n.UnresolvedObject)continue;let a=i.get(n.UnresolvedObject.objectId);if(!a){o.push(n.UnresolvedObject.objectId);continue}a.initialSharedVersion&&!n.UnresolvedObject.initialSharedVersion?n.UnresolvedObject.initialSharedVersion=a.initialSharedVersion:(a.version&&!n.UnresolvedObject.version&&(n.UnresolvedObject.version=a.version),a.digest&&!n.UnresolvedObject.digest&&(n.UnresolvedObject.digest=a.digest))}return o}async resolveObjects(t,e){let r=await this.applyCache(t,e);if(r.length===0)return[];let i=[...new Set(r)],o=await _chunkKVGSSW22js.a.call(void 0, this,S).multiGetObjects({ids:i,options:{showOwner:!0}}),n=[];for(let a of o||[]){if(!a.data)continue;let c=a.data.owner,p=c&&typeof c=="object"&&"Shared"in c?c.Shared.initial_shared_version:null,g=c&&typeof c=="object"&&"AddressOwner"in c?c.AddressOwner:null,_={objectId:a.data.objectId,version:a.data.version,digest:a.data.digest,initialSharedVersion:p,owner:g};n.push(_)}return await _chunkKVGSSW22js.a.call(void 0, this,l).addObjects(n),await this.applyCache(t,r)}asPlugin(){return async(t,e,r)=>{let i=t.inputs.filter(o=>o.UnresolvedObject).map(o=>o.UnresolvedObject.objectId);await this.resolveObjects(t,i),await Promise.all(t.commands.map(async o=>{if(o.MoveCall){let n=await this.getMoveFunctionDefinition({package:o.MoveCall.package,module:o.MoveCall.module,function:o.MoveCall.function});n&&(o.MoveCall._argumentTypes=n.parameters)}})),await r(),await Promise.all(t.commands.map(async o=>{_optionalChain([o, 'access', _2 => _2.MoveCall, 'optionalAccess', _3 => _3._argumentTypes])&&await _chunkKVGSSW22js.a.call(void 0, this,l).addMoveFunctionDefinition({package:o.MoveCall.package,module:o.MoveCall.module,function:o.MoveCall.function,parameters:o.MoveCall._argumentTypes})}))}}async clear(){await _chunkKVGSSW22js.a.call(void 0, this,l).clear()}async getMoveFunctionDefinition(t){return _chunkKVGSSW22js.a.call(void 0, this,l).getMoveFunctionDefinition(t)}async getObjects(t){return _chunkKVGSSW22js.a.call(void 0, this,l).getObjects(t)}async deleteObjects(t){return _chunkKVGSSW22js.a.call(void 0, this,l).deleteObjects(t)}async clearOwnedObjects(){await _chunkKVGSSW22js.a.call(void 0, this,l).clear("OwnedObject")}async clearCustom(){await _chunkKVGSSW22js.a.call(void 0, this,l).clear("Custom")}async getCustom(t){return _chunkKVGSSW22js.a.call(void 0, this,l).getCustom(t)}async setCustom(t,e){return _chunkKVGSSW22js.a.call(void 0, this,l).setCustom(t,e)}async deleteCustom(t){return _chunkKVGSSW22js.a.call(void 0, this,l).deleteCustom(t)}async applyEffects(t){var n;if(!t.V2)throw new Error(`Unsupported transaction effects version ${t.$kind}`);let{lamportVersion:e,changedObjects:r}=t.V2,i=[],o=[];r.forEach(([a,c])=>{if(c.outputState.NotExist)i.push(a);else if(c.outputState.ObjectWrite){let[p,g]=c.outputState.ObjectWrite;o.push({objectId:a,digest:p,version:e,owner:_nullishCoalesce(_nullishCoalesce(g.AddressOwner, () => (g.ObjectOwner)), () => (null)),initialSharedVersion:_nullishCoalesce(_optionalChain([g, 'access', _4 => _4.Shared, 'optionalAccess', _5 => _5.initialSharedVersion]), () => (null))})}}),await Promise.all([_chunkKVGSSW22js.a.call(void 0, this,l).addObjects(o),_chunkKVGSSW22js.a.call(void 0, this,l).deleteObjects(i),(n=_chunkKVGSSW22js.a.call(void 0, this,A))==null?void 0:n.call(this,t)])}};S=new WeakMap,l=new WeakMap,A=new WeakMap;var T,E=class{constructor(t){this.client=t;_chunkKVGSSW22js.b.call(void 0, this,T);this.devInspectTransactionBlock=async t=>{t.transactionBlock instanceof _transactions.Transaction&&t.transactionBlock.addBuildPlugin(_chunkKVGSSW22js.a.call(void 0, this,T).asPlugin());try{return await this.client.devInspectTransactionBlock(t)}catch(e){throw await _chunkKVGSSW22js.a.call(void 0, this,T).clear(),e}finally{await _chunkKVGSSW22js.a.call(void 0, this,T).clearOwnedObjects()}};_chunkKVGSSW22js.c.call(void 0, this,T,new M({client:this.client}))}};T=new WeakMap;var k=(s,t,e,r=0)=>{if(t>1e4)throw new Error("Slippage must be less than 100%");if(e>1e4)throw new Error("Commission must be less than 100%");if(r>1e4)throw new Error("Tip must be less than 100%");let i=BigInt(s),o=i*BigInt(r||0)/10000n,n=(i-o)*BigInt(e)/10000n,a=i-o-n,c=a*BigInt(1e4-t)/10000n;return{tipAmount:o,minAmount:c,commissionAmount:n,expectedAmount:a.toString(10)}};var X=async(s,t,e)=>{let r=await G(()=>t.devInspectTransactionBlock({sender:e.sender,transactionBlock:s}),_nullishCoalesce(e.timeout, () => (2e3)));if(r.effects.status.status==="failure")throw new (0, _chunkKVGSSW22js.l)(_nullishCoalesce(r.error, () => ("Simulation failed")),1008,{error:r.error});return{simulatedAmountOut:It(r.events),gasUsed:r.effects.gasUsed}},rt=async(s,t,e,r,i)=>{let o=new _transactions.Transaction,n=await s.swap({quote:t,coinIn:_transactions.coinWithBalance.call(void 0, {balance:BigInt(t.amountIn),type:t.coinTypeIn,useGasCoin:!1}),signer:e.sender,tx:o});o.add(P(t,n,1e4,i.tipBps,i.partner,i.partnerCommissionBps)),o.transferObjects([n],e.sender);let a=await X(o,r,e);return{id:t.id,provider:s.kind,...a}},P=(s,t,e=100,r=0,i,o=0)=>n=>{let{minAmount:a,expectedAmount:c}=k(s.rawAmountOut,e,o,r);r>0&&n.moveCall({target:`${_chunkKVGSSW22js.g}::vault::collect_tip`,typeArguments:[s.coinTypeOut],arguments:[n.object(_chunkKVGSSW22js.i),n.object(_chunkKVGSSW22js.j),t,n.pure.u64(r)]}),n.moveCall({target:`${_chunkKVGSSW22js.g}::settle::settle`,typeArguments:[s.coinTypeIn,s.coinTypeOut],arguments:[n.object(_chunkKVGSSW22js.j),n.object(_chunkKVGSSW22js.i),n.pure.u64(s.amountIn),t,n.pure.u64(a),n.pure.u64(c),n.pure.option("address",i),n.pure.u64(o),n.pure.u64(0)]})},It=s=>_optionalChain([s, 'access', _6 => _6.filter, 'call', _7 => _7(e=>e.type===`${_chunkKVGSSW22js.h}::settle::Swap`), 'optionalAccess', _8 => _8.pop, 'call', _9 => _9(), 'optionalAccess', _10 => _10.parsedJson, 'optionalAccess', _11 => _11.amount_out]),G=async(s,t,e)=>t<=0?s():new Promise((r,i)=>{let o=setTimeout(()=>i(new (0, _chunkKVGSSW22js.l)(`Timeout ${_nullishCoalesce(e, () => ("operation"))}`,1001,{timeout:t})),t);s().then(r).catch(i).finally(()=>clearTimeout(o))});var _uuid = require('uuid');var w="0x2::sui::SUI",j="0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI";var Lt="https://web3.okx.com",ot="/api/v6/dex/aggregator/swap",Ut="784",st=_utils.normalizeStructTag.call(void 0, w),L=class{constructor(t,e,r){this.options=t;this.metaOptions=e;this.client=r;this.kind="okx"}async quote({amountIn:t,coinTypeIn:e,coinTypeOut:r,signer:i}){if(!i||v(i))return null;let o={chainIndex:Ut,amount:t,fromTokenAddress:e===st?w:e,toTokenAddress:r===st?w:r,slippagePercent:(this.metaOptions.slippageBps/100).toString(),userWalletAddress:i},n="?"+new URLSearchParams(o).toString(),a=`${_nullishCoalesce(this.options.api, () => (Lt))}${ot}${n}`,p=await(await fetch(a,{headers:await Bt(this.options,"GET",ot,n)})).json();return _chunkKVGSSW22js.l.assert(p.code==="0"&&p.data.length>0,"No quote found",1005,{provider:this.kind}),{id:_uuid.v4.call(void 0, ),provider:this.kind,coinTypeIn:e,coinTypeOut:r,amountIn:t,amountOut:p.data[0].routerResult.toTokenAmount,rawAmountOut:p.data[0].routerResult.toTokenAmount,quote:p.data[0]}}async fastSwap(t){let{quote:e,signer:r,signTransaction:i}=t;_chunkKVGSSW22js.l.assert(e.provider==="okx","Invalid quote",1004,{quote:e,expectedProvider:"okx"});let{tx:o,coin:n}=at({quote:e,signer:r});o.add(P(e,n,this.metaOptions.slippageBps,this.metaOptions.tipBps,this.metaOptions.partner,this.metaOptions.partnerCommissionBps)),o.transferObjects([n],r);let a=await o.build({client:this.client}),{bytes:c,signature:p}=await i(_utils.toBase64.call(void 0, a));return(await this.client.executeTransactionBlock({signature:p,transactionBlock:c})).digest}};async function Rt(s,t){let e=new TextEncoder,r=o=>{if(typeof Buffer<"u")return Buffer.from(o).toString("base64");let n="";for(let a=0;a<o.byteLength;a++)n+=String.fromCharCode(o[a]);if(typeof btoa<"u")return btoa(n);throw new (0, _chunkKVGSSW22js.l)("Base64 encoder not available in this environment")};if(typeof globalThis<"u"&&_optionalChain([globalThis, 'access', _12 => _12.crypto, 'optionalAccess', _13 => _13.subtle])){let o=await globalThis.crypto.subtle.importKey("raw",e.encode(t),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),n=await globalThis.crypto.subtle.sign("HMAC",o,e.encode(s));return r(new Uint8Array(n))}let{createHmac:i}=await Promise.resolve().then(() => _interopRequireWildcard(require("crypto")));return i("sha256",t).update(s).digest("base64")}async function Bt(s,t,e,r=""){let{apiKey:i,secretKey:o,apiPassphrase:n,projectId:a}=s;if(!i||!o||!n||!a)throw new (0, _chunkKVGSSW22js.l)("Missing required environment variables");let c=new Date().toISOString(),p=c+t+e+r;return{"Content-Type":"application/json","OK-ACCESS-KEY":i,"OK-ACCESS-SIGN":await Rt(p,o),"OK-ACCESS-TIMESTAMP":c,"OK-ACCESS-PASSPHRASE":n,"OK-ACCESS-PROJECT":a}}var $t=(s,t)=>{let e=_transactions.TransactionDataBuilder.restore(s.getData()),r=e.commands.findIndex(n=>n.$kind==="MoveCall"&&_utils.normalizeSuiAddress.call(void 0, n.MoveCall.package)===_utils.normalizeSuiAddress.call(void 0, t)&&n.MoveCall.module==="router"&&n.MoveCall.function==="finalize"),i=e.commands[r];return _chunkKVGSSW22js.l.assert(i.MoveCall,"OKX: Finalize command not found",1100,{packageId:t}),e.replaceCommand(r,_transactions.Commands.MoveCall({package:t,module:"router",function:"finalize_without_transfer",typeArguments:i.MoveCall.typeArguments,arguments:[i.MoveCall.arguments[0],i.MoveCall.arguments[5],i.MoveCall.arguments[6]]})),{tx:_transactions.Transaction.from(e.build()),coin:{NestedResult:[r,0]}}},at=s=>{let{quote:t,signer:e}=s;_chunkKVGSSW22js.l.assert(t.provider==="okx","Invalid quote",1004,{quote:t,expectedProvider:"okx"});let r=_transactions.Transaction.from(t.quote.tx.data);r.setSenderIfNotSet(e);let{tx:i,coin:o}=$t(r,t.quote.tx.to);return{tx:i,coin:o}},ct=async(s,t,e,r)=>{let{tx:i,coin:o}=at({quote:s,signer:s.quote.tx.from});i.add(P(s,o,1e4,r.tipBps,r.partner,r.partnerCommissionBps)),i.transferObjects([o],s.quote.tx.from);let n=await X(i,t,e);return{id:s.id,provider:s.provider,...n}};var Vt="https://hermes.pyth.network",qt={bluefin7k:{},flowx:{},cetus:{}},U= exports.MetaAg =class{constructor(t){this.providers={};this.options={providers:{...qt,..._optionalChain([t, 'optionalAccess', _14 => _14.providers])},slippageBps:_nullishCoalesce(_optionalChain([t, 'optionalAccess', _15 => _15.slippageBps]), () => (100)),fullnodeUrl:_nullishCoalesce(_optionalChain([t, 'optionalAccess', _16 => _16.fullnodeUrl]), () => (_client.getFullnodeUrl.call(void 0, "mainnet"))),hermesApi:_nullishCoalesce(_optionalChain([t, 'optionalAccess', _17 => _17.hermesApi]), () => (Vt)),partner:_nullishCoalesce(_optionalChain([t, 'optionalAccess', _18 => _18.partner]), () => (tt)),partnerCommissionBps:_nullishCoalesce(_optionalChain([t, 'optionalAccess', _19 => _19.partnerCommissionBps]), () => (0)),tipBps:_nullishCoalesce(_optionalChain([t, 'optionalAccess', _20 => _20.tipBps]), () => (0))},this.client=new (0, _client.SuiClient)({url:this.options.fullnodeUrl}),this.inspector=new E(this.client)}async _getProvider(t){let e=this.providers[t];if(e)return e;let r=this.options.providers[t];switch(_chunkKVGSSW22js.l.assert(!!r,`Provider not found: ${t}`,1002,{provider:t}),t){case"bluefin7k":let{Bluefin7kProvider:i}=await Promise.resolve().then(() => _interopRequireWildcard(require("./bluefin7k-I6ZCDWDN.js"))).catch(W("bluefin7k"));this.providers.bluefin7k=new i(r,this.options,this.client);break;case"flowx":let{FlowxProvider:o}=await Promise.resolve().then(() => _interopRequireWildcard(require("./flowx-6M54WFWO.js"))).catch(W("flowx"));this.providers.flowx=new o(r,this.client);break;case"cetus":let{CetusProvider:n}=await Promise.resolve().then(() => _interopRequireWildcard(require("./cetus-SIPX6FYL.js"))).catch(W("cetus"));this.providers.cetus=new n(r,this.options,this.client);break;case"okx":this.providers.okx=new L(r,this.options,this.client);break;default:throw new (0, _chunkKVGSSW22js.l)(`Provider not supported: ${t}`,1003,{provider:t})}return this.providers[t]}async _simulate(t,e,r){try{if(_chunkKVGSSW22js.e.call(void 0, t))return rt(t,e,r,this.inspector,this.options);if(e.provider==="okx")return ct(e,this.inspector,r,this.options);throw new (0, _chunkKVGSSW22js.l)(`Provider not supported: ${t.kind}`,1003,{provider:t.kind})}catch(i){console.warn(i,{provider:t.kind,quote:e.id})}}async _quote(t,e){return await G(async()=>{let i=await t.quote(e);if(!i)return null;let{expectedAmount:o}=k(i.rawAmountOut,0,this.options.partnerCommissionBps,this.options.tipBps);return i.amountOut=o,i},_nullishCoalesce(e.timeout, () => (2e3)),`quote for ${t.kind} provider from ${e.coinTypeIn} to ${e.coinTypeOut}`)}async _fastSwap({quote:t,signer:e,useGasCoin:r,signTransaction:i},o){let n=new _transactions.Transaction,a=await this.swap({quote:t,signer:e,tx:n,coinIn:_transactions.coinWithBalance.call(void 0, {type:t.coinTypeIn,balance:BigInt(t.amountIn),useGasCoin:r})});n.transferObjects([a],e),n.setSenderIfNotSet(e);let c=await n.build({client:this.client}),{signature:p,bytes:g}=await i(_utils.toBase64.call(void 0, c));return this.client.executeTransactionBlock({transactionBlock:g,signature:p,options:_optionalChain([o, 'optionalAccess', _21 => _21.options]),signal:_optionalChain([o, 'optionalAccess', _22 => _22.signal])})}async quote(t,e){let r={...t,coinTypeIn:_utils.normalizeStructTag.call(void 0, t.coinTypeIn),coinTypeOut:_utils.normalizeStructTag.call(void 0, t.coinTypeOut)},o=(await Promise.allSettled(Object.entries(this.options.providers).filter(([n,a])=>!a.disabled).map(async([n])=>{let a=await this._getProvider(n);return this._quote(a,r)}))).map(n=>n.status==="fulfilled"?n.value:(console.warn(n.reason),null)).filter(n=>n!==null);if(e){let n=o.map(async a=>{let c=await this._getProvider(a.provider),p=await this._simulate(c,a,e);a.simulatedAmountOut=_optionalChain([p, 'optionalAccess', _23 => _23.simulatedAmountOut]),a.gasUsed=_optionalChain([p, 'optionalAccess', _24 => _24.gasUsed]),_optionalChain([e, 'optionalAccess', _25 => _25.onSimulated, 'optionalCall', _26 => _26({...a})])});e.onSimulated||await Promise.all(n)}return o}async swap(t,e){let r=await this._getProvider(t.quote.provider);_chunkKVGSSW22js.l.assert(!!r,`Provider not found: ${t.quote.provider}`,1002,{provider:t.quote.provider}),_chunkKVGSSW22js.l.assert(_chunkKVGSSW22js.e.call(void 0, r),`Provider does not support swap: ${r.kind}, use fastSwap instead`,1007,{provider:r.kind}),_chunkKVGSSW22js.l.assert(t.signer&&!v(t.signer),"Invalid signer address",1006,{signer:t.signer});let i=await r.swap(t);return t.tx.add(P(t.quote,i,_nullishCoalesce(_nullishCoalesce(e, () => (this.options.slippageBps)), () => (100)),this.options.tipBps,this.options.partner,this.options.partnerCommissionBps)),t.tx.setSenderIfNotSet(t.signer),i}async fastSwap(t,e){_chunkKVGSSW22js.l.assert(t.signer&&!v(t.signer),"Invalid signer address",1006,{signer:t.signer});let r=await this._getProvider(t.quote.provider);if(_chunkKVGSSW22js.e.call(void 0, r))return this._fastSwap(t,e);if(_chunkKVGSSW22js.f.call(void 0, r))return this.client.waitForTransaction({...e,digest:await r.fastSwap(t)});throw new (0, _chunkKVGSSW22js.l)(`Provider not supported: ${r.kind}`,1003,{provider:r.kind})}updateMetaAgOptions(t){if(Object.keys(t).length!==0){this.options.slippageBps=_nullishCoalesce(t.slippageBps, () => (this.options.slippageBps)),this.options.partner=_nullishCoalesce(t.partner, () => (this.options.partner)),this.options.partnerCommissionBps=_nullishCoalesce(t.partnerCommissionBps, () => (this.options.partnerCommissionBps)),this.options.tipBps=_nullishCoalesce(t.tipBps, () => (this.options.tipBps)),t.fullnodeUrl&&t.fullnodeUrl!==this.options.fullnodeUrl&&(this.client=new (0, _client.SuiClient)({url:t.fullnodeUrl}),this.inspector=new E(this.client),this.options.fullnodeUrl=t.fullnodeUrl),t.hermesApi&&t.hermesApi!==this.options.hermesApi&&(this.providers={},this.options.hermesApi=t.hermesApi);for(let[e,r]of Object.entries(t.providers||{}))this.options.providers[e]={...r,...this.options.providers[e]},delete this.providers[e]}}},W=s=>t=>{let e={cetus:"@cetusprotocol/aggregator-sdk",flowx:"@flowx-finance/sdk",bluefin7k:"@bluefin-exchange/bluefin7k-aggregator-sdk",okx:""};throw console.warn(`Please install ${e[s]} to use ${s} provider`),t};async function d(s,t){let e=new Headers(_optionalChain([t, 'optionalAccess', _27 => _27.headers])),r={...t,headers:e};return fetch(s,r)}var R={MAIN:"https://api.7k.ag",LO_DCA:"https://lod-dca.7k.ag",PRICES:"https://lp-pro-api.7k.ag/price",STATISTIC:"https://statistic.7k.ag"};function B(s){return s===w?j:s}var Xt=(s,t)=>{let e=[];for(let r=0;r<s.length;r+=t)e.push(s.slice(r,r+t));return e},mt=500,Gt=100;function Wt(){return Math.floor(Date.now()/1e3).toString()}async function z(s){try{let t=B(s);return(await H([t]))[t]||0}catch (e2){return 0}}async function H(s){try{if(s.length===0)return{};let t=s.slice(0,mt).map(B),e=Xt(t,Gt),r=Wt(),o=(await Promise.all(e.map(async a=>{let c={timestamp:r,token_ids:a},p=await d(`${R.PRICES}/prices/batch`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)});if(!p.ok)throw new Error(`Price API returned status ${p.status}`);return await p.json()}))).reduce((a,c)=>(c.forEach(p=>{a[p.token_id]=p.price}),a),{});return t.reduce((a,c)=>(a[c]=o[c]||0,a),{})}catch (e3){return s.slice(0,mt).reduce((e,r)=>(e[B(r)]=0,e),{})}}async function lt(){return await z(j)}var $="0xffc7f420b481ed7a012b42e125fd7e5716b5673759cf4629e5fcfebce970a72d",br=BigInt("1000000000000"),vr=BigInt("10000"),Y="0x0ef0f805710cf53c10f29c4f73e1144a662747e1839689a846e2520cae122adc",b=`${Y}::limit_order`,F=`${Y}::dca_order`,Sr=`${Y}::config`,Ar=BigInt("18446744073709551615"),f=`${R.LO_DCA}/api`;async function dt({accountAddress:s,payCoinType:t,targetCoinType:e,payCoinAmount:r,rate:i,slippage:o,expireTs:n,devInspect:a}){let c=new _transactions.Transaction,p=c.add(_transactions.coinWithBalance.call(void 0, {type:t,balance:r,useGasCoin:!a}));return c.moveCall({target:`${b}::place_limit_order`,arguments:[c.object($),p,c.pure.u64(i),c.pure.u64(o),c.pure.u64(n),c.object.clock()],typeArguments:[t,e]}),c.setSenderIfNotSet(s),c}async function gt({orderId:s,payCoinType:t,targetCoinType:e}){let r=new _transactions.Transaction;return r.moveCall({target:`${b}::cancel_limit_order`,typeArguments:[t,e],arguments:[r.object(s),r.object.clock()]}),r}async function ft({orderId:s,payCoinType:t,targetCoinType:e}){let r=new _transactions.Transaction;return r.moveCall({target:`${b}::claim_expired_order`,typeArguments:[t,e],arguments:[r.object(s),r.object.clock()]}),r}function O(s){let t="";return Object.entries(s).forEach(([e,r])=>{if(Array.isArray(r))for(let i of r)t+=t?`&${e}=${i}`:`${e}=${i}`;else r!==void 0&&(t+=t?`&${e}=${r}`:`${e}=${r}`)}),t}async function Ot({owner:s,offset:t=0,limit:e=10,tokenPair:r}){let o=O({owner:s,statuses:["ACTIVE","EXPIRED"],offset:t,limit:e,tokenPair:r}),n=await d(`${f}/limit-orders?${o}`);if(!n.ok)throw new Error("Failed to fetch open limit orders");return await n.json()}async function ht({owner:s,offset:t=0,limit:e=10,tokenPair:r}){let o=O({owner:s,statuses:["CLOSED"],offset:t,limit:e,tokenPair:r}),n=await d(`${f}/limit-orders?${o}`);if(!n.ok)throw new Error("Failed to fetch closed limit orders");return await n.json()}async function yt({payCoinType:s,targetCoinType:t,payCoinAmountEach:e,numOrders:r,interval:i,slippage:o,minRate:n,maxRate:a}){let c=new _transactions.Transaction,p=[];for(let _=0;_<r;_++){let bt=_transactions.coinWithBalance.call(void 0, {type:s,balance:e});p.push(bt)}let g=c.makeMoveVec({elements:p});return c.moveCall({target:`${F}::place_dca_order`,arguments:[c.object($),g,c.pure.u64(i),c.pure.u64(o),c.pure.u64(n),c.pure.u64(a),c.object.clock()],typeArguments:[s,t]}),c}async function Tt({orderId:s,payCoinType:t,targetCoinType:e}){let r=new _transactions.Transaction;return r.moveCall({target:`${F}::cancel_dca_order`,arguments:[r.object(s),r.object.clock()],typeArguments:[t,e]}),r}async function Ct({owner:s,offset:t=0,limit:e=10,tokenPair:r}){let o=O({owner:s,statuses:["ACTIVE","EXPIRED"],offset:t,limit:e,tokenPair:r}),n=await d(`${f}/dca-orders?${o}`);if(!n.ok)throw new Error("Failed to fetch open dca orders");return await n.json()}async function Pt({owner:s,offset:t=0,limit:e=10,tokenPair:r}){let o=O({owner:s,statuses:["SUCCESS"],offset:t,limit:e,orderType:"DCA",tokenPair:r}),n=await d(`${f}/order-executions?${o}`);if(!n.ok)throw new Error("Failed to fetch closed dca orders");return await n.json()}async function wt({owner:s,orderId:t,offset:e=0,limit:r=10}){let o=O({owner:s,orderId:t,statuses:["SUCCESS"],offset:e,limit:r,orderType:"DCA"}),n=await d(`${f}/order-executions?${o}`);if(!n.ok)throw new Error("Failed to fetch dca order executions");return await n.json()}var An={getTokenPrice:z,getTokenPrices:H,getSuiPrice:lt,placeLimitOrder:dt,getOpenLimitOrders:Ot,cancelLimitOrder:gt,claimExpiredLimitOrder:ft,getClosedLimitOrders:ht,placeDcaOrder:yt,getOpenDcaOrders:Ct,cancelDcaOrder:Tt,getClosedDcaOrders:Pt,getDcaOrderExecutions:wt,MetaAg:U};exports.EProvider = _chunkKVGSSW22js.d; exports.MetaAg = U; exports.cancelDcaOrder = Tt; exports.cancelLimitOrder = gt; exports.claimExpiredLimitOrder = ft; exports.default = An; exports.getClosedDcaOrders = Pt; exports.getClosedLimitOrders = ht; exports.getDcaOrderExecutions = wt; exports.getOpenDcaOrders = Ct; exports.getOpenLimitOrders = Ot; exports.getSuiPrice = lt; exports.getTokenPrice = z; exports.getTokenPrices = H; exports.isAggregatorProvider = _chunkKVGSSW22js.e; exports.isSwapAPIProvider = _chunkKVGSSW22js.f; exports.placeDcaOrder = yt; exports.placeLimitOrder = dt;
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkE5KM5OVWjs = require('./chunk-E5KM5OVW.js');var _grpc = require('@mysten/sui/grpc');var _jsonRpc = require('@mysten/sui/jsonRpc');var _transactions = require('@mysten/sui/transactions');var _utils = require('@mysten/sui/utils');var ee="0x0000000000000000000000000000000000000000000000000000000000000000";var be=["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000403","0x000000000000000000000000000000000000000000000000000000000000000c"],S=o=>{let e=_utils.normalizeSuiAddress.call(void 0, o);return be.includes(e)};var Q=class{async getObject(e){let[t,r]=await Promise.all([this.get("OwnedObject",e),this.get("SharedOrImmutableObject",e)]);return _nullishCoalesce(_nullishCoalesce(t, () => (r)), () => (null))}async getObjects(e){return Promise.all(e.map(t=>this.getObject(t)))}async addObject(e){return e.owner?await this.set("OwnedObject",e.objectId,e):await this.set("SharedOrImmutableObject",e.objectId,e),e}async addObjects(e){await Promise.all(e.map(async t=>this.addObject(t)))}async deleteObject(e){await Promise.all([this.delete("OwnedObject",e),this.delete("SharedOrImmutableObject",e)])}async deleteObjects(e){await Promise.all(e.map(t=>this.deleteObject(t)))}async getMoveFunctionDefinition(e){let t=`${_utils.normalizeSuiAddress.call(void 0, e.package)}::${e.module}::${e.function}`;return this.get("MoveFunction",t)}async addMoveFunctionDefinition(e){let t=_utils.normalizeSuiAddress.call(void 0, e.package),r=`${t}::${e.module}::${e.function}`,i={...e,package:t};return await this.set("MoveFunction",r,i),i}async deleteMoveFunctionDefinition(e){let t=`${_utils.normalizeSuiAddress.call(void 0, e.package)}::${e.module}::${e.function}`;await this.delete("MoveFunction",t)}async getCustom(e){return this.get("Custom",e)}async setCustom(e,t){return this.set("Custom",e,t)}async deleteCustom(e){return this.delete("Custom",e)}},C,q=class extends Q{constructor(){super(...arguments);_chunkE5KM5OVWjs.c.call(void 0, this,C,{OwnedObject:new Map,SharedOrImmutableObject:new Map,MoveFunction:new Map,Custom:new Map})}async get(t,r){return _nullishCoalesce(_chunkE5KM5OVWjs.b.call(void 0, this,C)[t].get(r), () => (null))}async set(t,r,i){_chunkE5KM5OVWjs.b.call(void 0, this,C)[t].set(r,i)}async delete(t,r){_chunkE5KM5OVWjs.b.call(void 0, this,C)[t].delete(r)}async clear(t){if(t)_chunkE5KM5OVWjs.b.call(void 0, this,C)[t].clear();else for(let r of Object.values(_chunkE5KM5OVWjs.b.call(void 0, this,C)))r.clear()}};C=new WeakMap;var E,l,A,M=class{constructor({cache:e=new q,onEffects:t,client:r}){_chunkE5KM5OVWjs.c.call(void 0, this,E);_chunkE5KM5OVWjs.c.call(void 0, this,l);_chunkE5KM5OVWjs.c.call(void 0, this,A);_chunkE5KM5OVWjs.d.call(void 0, this,E,r),_chunkE5KM5OVWjs.d.call(void 0, this,l,e),_chunkE5KM5OVWjs.d.call(void 0, this,A,t)}async applyCache(e,t){let r=(await _chunkE5KM5OVWjs.b.call(void 0, this,l).getObjects(t)).filter(n=>n!==null),i=new Map(r.map(n=>[n.objectId,n])),s=[];for(let n of e.inputs){if(!n.UnresolvedObject)continue;let a=i.get(n.UnresolvedObject.objectId);if(!a){s.push(n.UnresolvedObject.objectId);continue}a.initialSharedVersion&&!n.UnresolvedObject.initialSharedVersion?n.UnresolvedObject.initialSharedVersion=a.initialSharedVersion:(a.version&&!n.UnresolvedObject.version&&(n.UnresolvedObject.version=a.version),a.digest&&!n.UnresolvedObject.digest&&(n.UnresolvedObject.digest=a.digest))}return s}async resolveObjects(e,t){let r=await this.applyCache(e,t);if(r.length===0)return[];let i=[...new Set(r)],s=await _chunkE5KM5OVWjs.b.call(void 0, this,E).core.getObjects({objectIds:i}),n=[];for(let a of s.objects){if(a instanceof Error)continue;let c=a.owner,p=c.$kind==="Shared"?c.Shared.initialSharedVersion:null,d=c.$kind==="AddressOwner"?c.AddressOwner:c.$kind==="ObjectOwner"?c.ObjectOwner:null,I={objectId:a.objectId,version:a.version,digest:a.digest,initialSharedVersion:p,owner:d};n.push(I)}return await _chunkE5KM5OVWjs.b.call(void 0, this,l).addObjects(n),await this.applyCache(e,r)}asPlugin(){return async(e,t,r)=>{let i=e.inputs.filter(s=>s.UnresolvedObject).map(s=>s.UnresolvedObject.objectId);await this.resolveObjects(e,i),await Promise.all(e.commands.map(async s=>{if(s.MoveCall){let n=await this.getMoveFunctionDefinition({package:s.MoveCall.package,module:s.MoveCall.module,function:s.MoveCall.function});n&&(s.MoveCall._argumentTypes=n.parameters)}})),await r(),await Promise.all(e.commands.map(async s=>{_optionalChain([s, 'access', _2 => _2.MoveCall, 'optionalAccess', _3 => _3._argumentTypes])&&await _chunkE5KM5OVWjs.b.call(void 0, this,l).addMoveFunctionDefinition({package:s.MoveCall.package,module:s.MoveCall.module,function:s.MoveCall.function,parameters:s.MoveCall._argumentTypes})}))}}async clear(){await _chunkE5KM5OVWjs.b.call(void 0, this,l).clear()}async getMoveFunctionDefinition(e){return _chunkE5KM5OVWjs.b.call(void 0, this,l).getMoveFunctionDefinition(e)}async getObjects(e){return _chunkE5KM5OVWjs.b.call(void 0, this,l).getObjects(e)}async deleteObjects(e){return _chunkE5KM5OVWjs.b.call(void 0, this,l).deleteObjects(e)}async clearOwnedObjects(){await _chunkE5KM5OVWjs.b.call(void 0, this,l).clear("OwnedObject")}async clearCustom(){await _chunkE5KM5OVWjs.b.call(void 0, this,l).clear("Custom")}async getCustom(e){return _chunkE5KM5OVWjs.b.call(void 0, this,l).getCustom(e)}async setCustom(e,t){return _chunkE5KM5OVWjs.b.call(void 0, this,l).setCustom(e,t)}async deleteCustom(e){return _chunkE5KM5OVWjs.b.call(void 0, this,l).deleteCustom(e)}async applyEffects(e){var n;if(!e.V2)throw new Error(`Unsupported transaction effects version ${e.$kind}`);let{lamportVersion:t,changedObjects:r}=e.V2,i=[],s=[];r.forEach(([a,c])=>{if(c.outputState.NotExist)i.push(a);else if(c.outputState.ObjectWrite){let[p,d]=c.outputState.ObjectWrite;s.push({objectId:a,digest:p,version:t,owner:_nullishCoalesce(_nullishCoalesce(d.AddressOwner, () => (d.ObjectOwner)), () => (null)),initialSharedVersion:_nullishCoalesce(_optionalChain([d, 'access', _4 => _4.Shared, 'optionalAccess', _5 => _5.initialSharedVersion]), () => (null))})}}),await Promise.all([_chunkE5KM5OVWjs.b.call(void 0, this,l).addObjects(s),_chunkE5KM5OVWjs.b.call(void 0, this,l).deleteObjects(i),(n=_chunkE5KM5OVWjs.b.call(void 0, this,A))==null?void 0:n.call(this,e)])}};E=new WeakMap,l=new WeakMap,A=new WeakMap;var T,_,x=class{constructor(e){this.client=e;_chunkE5KM5OVWjs.c.call(void 0, this,T);_chunkE5KM5OVWjs.c.call(void 0, this,_,new WeakSet);_chunkE5KM5OVWjs.a.call(void 0, this,"simulateTransaction",async e=>{e.transactionBlock.setSenderIfNotSet(e.sender),_chunkE5KM5OVWjs.b.call(void 0, this,_).has(e.transactionBlock)||(e.transactionBlock.addBuildPlugin(_chunkE5KM5OVWjs.b.call(void 0, this,T).asPlugin()),_chunkE5KM5OVWjs.b.call(void 0, this,_).add(e.transactionBlock));try{return await this.client.core.simulateTransaction({transaction:e.transactionBlock,checksEnabled:!1,include:{effects:!0,events:!0,commandResults:!0}})}catch(t){throw await _chunkE5KM5OVWjs.b.call(void 0, this,T).clear(),t}finally{await _chunkE5KM5OVWjs.b.call(void 0, this,T).clearOwnedObjects()}});_chunkE5KM5OVWjs.d.call(void 0, this,T,new M({client:this.client}))}};T=new WeakMap,_=new WeakMap;var _uuid = require('uuid');var b="0x2::sui::SUI",k="0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI";var Ie="https://web3.okx.com",re="/api/v6/dex/aggregator/swap",De="784",ne=_utils.normalizeStructTag.call(void 0, b),j=class{constructor(e,t,r){this.options=e;this.metaOptions=t;this.client=r;_chunkE5KM5OVWjs.a.call(void 0, this,"kind","okx")}async quote({amountIn:e,coinTypeIn:t,coinTypeOut:r,signer:i}){if(!i||S(i))return null;let s={chainIndex:De,amount:e,fromTokenAddress:t===ne?b:t,toTokenAddress:r===ne?b:r,slippagePercent:(this.metaOptions.slippageBps/100).toString(),userWalletAddress:i},n="?"+new URLSearchParams(s).toString(),a=`${_nullishCoalesce(this.options.api, () => (Ie))}${re}${n}`,p=await(await fetch(a,{headers:await ke(this.options,"GET",re,n)})).json();return _chunkE5KM5OVWjs.j.assert(p.code==="0"&&p.data.length>0,"No quote found",1005,{provider:this.kind}),{id:_uuid.v4.call(void 0, ),provider:this.kind,coinTypeIn:t,coinTypeOut:r,amountIn:e,amountOut:p.data[0].routerResult.toTokenAmount,rawAmountOut:p.data[0].routerResult.toTokenAmount,quote:p.data[0]}}async fastSwap(e){let{quote:t,signer:r,signTransaction:i}=e;_chunkE5KM5OVWjs.k.call(void 0, t,"okx");let{tx:s,coin:n}=ie({quote:t,signer:r});s.add(_chunkE5KM5OVWjs.n.call(void 0, t,n,this.metaOptions.slippageBps,this.metaOptions.tipBps,this.metaOptions.partner,this.metaOptions.partnerCommissionBps)),s.transferObjects([n],r);let a=await s.build({client:this.client}),{bytes:c,signature:p}=await i(_utils.toBase64.call(void 0, a)),d=await this.client.core.executeTransaction({transaction:_utils.fromBase64.call(void 0, c),signatures:[p]});if(!_optionalChain([d, 'access', _6 => _6.Transaction, 'optionalAccess', _7 => _7.digest]))throw new (0, _chunkE5KM5OVWjs.j)("OKX transaction failed or returned no digest",1008,{error:_nullishCoalesce(_optionalChain([d, 'access', _8 => _8.FailedTransaction, 'optionalAccess', _9 => _9.digest]), () => ("no digest"))});return d.Transaction.digest}};async function Me(o,e){let t=new TextEncoder,r=s=>{if(typeof Buffer<"u")return Buffer.from(s).toString("base64");let n="";for(let a=0;a<s.byteLength;a++)n+=String.fromCharCode(s[a]);if(typeof btoa<"u")return btoa(n);throw new (0, _chunkE5KM5OVWjs.j)("Base64 encoder not available in this environment")};if(typeof globalThis<"u"&&_optionalChain([globalThis, 'access', _10 => _10.crypto, 'optionalAccess', _11 => _11.subtle])){let s=await globalThis.crypto.subtle.importKey("raw",t.encode(e),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),n=await globalThis.crypto.subtle.sign("HMAC",s,t.encode(o));return r(new Uint8Array(n))}let{createHmac:i}=await Promise.resolve().then(() => _interopRequireWildcard(require("crypto")));return i("sha256",e).update(o).digest("base64")}async function ke(o,e,t,r=""){let{apiKey:i,secretKey:s,apiPassphrase:n,projectId:a}=o;if(!i||!s||!n||!a)throw new (0, _chunkE5KM5OVWjs.j)("Missing required environment variables");let c=new Date().toISOString(),p=c+e+t+r;return{"Content-Type":"application/json","OK-ACCESS-KEY":i,"OK-ACCESS-SIGN":await Me(p,s),"OK-ACCESS-TIMESTAMP":c,"OK-ACCESS-PASSPHRASE":n,"OK-ACCESS-PROJECT":a}}var je=(o,e)=>{let t=_transactions.TransactionDataBuilder.restore(o.getData()),r=t.commands.findIndex(n=>n.$kind==="MoveCall"&&_utils.normalizeSuiAddress.call(void 0, n.MoveCall.package)===_utils.normalizeSuiAddress.call(void 0, e)&&n.MoveCall.module==="router"&&n.MoveCall.function==="finalize"),i=t.commands[r];return _chunkE5KM5OVWjs.j.assert(i.MoveCall,"OKX: Finalize command not found",1100,{packageId:e}),t.replaceCommand(r,_transactions.TransactionCommands.MoveCall({package:e,module:"router",function:"finalize_without_transfer",typeArguments:i.MoveCall.typeArguments,arguments:[i.MoveCall.arguments[0],i.MoveCall.arguments[5],i.MoveCall.arguments[6]]})),{tx:_transactions.Transaction.from(t.build()),coin:{NestedResult:[r,0]}}},ie=o=>{let{quote:e,signer:t}=o;_chunkE5KM5OVWjs.k.call(void 0, e,"okx");let r=_transactions.Transaction.from(e.quote.tx.data);r.setSenderIfNotSet(t);let{tx:i,coin:s}=je(r,e.quote.tx.to);return{tx:i,coin:s}},oe=async(o,e,t,r)=>{let{tx:i,coin:s}=ie({quote:o,signer:o.quote.tx.from});i.add(_chunkE5KM5OVWjs.n.call(void 0, o,s,1e4,r.tipBps,r.partner,r.partnerCommissionBps)),i.transferObjects([s],o.quote.tx.from);let n=await _chunkE5KM5OVWjs.l.call(void 0, i,e,t);return{id:o.id,provider:o.provider,...n}};var Ne=()=>new (0, _grpc.SuiGrpcClient)({baseUrl:_jsonRpc.getJsonRpcFullnodeUrl.call(void 0, "mainnet"),network:"mainnet"}),Qe="https://hermes.pyth.network",qe={bluefin7k:{},flowx:{},cetus:{}},R= exports.MetaAg =class{constructor(e){_chunkE5KM5OVWjs.a.call(void 0, this,"client");_chunkE5KM5OVWjs.a.call(void 0, this,"providers",{});_chunkE5KM5OVWjs.a.call(void 0, this,"inspector");_chunkE5KM5OVWjs.a.call(void 0, this,"options");this.client=_nullishCoalesce(_optionalChain([e, 'optionalAccess', _12 => _12.client]), () => (Ne())),this.options={providers:{...qe,..._optionalChain([e, 'optionalAccess', _13 => _13.providers])},slippageBps:_nullishCoalesce(_optionalChain([e, 'optionalAccess', _14 => _14.slippageBps]), () => (100)),client:this.client,hermesApi:_nullishCoalesce(_optionalChain([e, 'optionalAccess', _15 => _15.hermesApi]), () => (Qe)),partner:_nullishCoalesce(_optionalChain([e, 'optionalAccess', _16 => _16.partner]), () => (ee)),partnerCommissionBps:_nullishCoalesce(_optionalChain([e, 'optionalAccess', _17 => _17.partnerCommissionBps]), () => (0)),tipBps:_nullishCoalesce(_optionalChain([e, 'optionalAccess', _18 => _18.tipBps]), () => (0))},this.inspector=new x(this.client)}async _getProvider(e){let t=this.providers[e];if(t)return t;let r=this.options.providers[e];switch(_chunkE5KM5OVWjs.j.assert(!!r,`Provider not found: ${e}`,1002,{provider:e}),e){case"bluefin7k":let{Bluefin7kProvider:i}=await Promise.resolve().then(() => _interopRequireWildcard(require("./bluefin7k-MP3A4MG4.js"))).catch(K("bluefin7k"));this.providers.bluefin7k=new i(r,this.options,this.client);break;case"flowx":let{FlowxProvider:s}=await Promise.resolve().then(() => _interopRequireWildcard(require("./flowx-SIZHC2DP.js"))).catch(K("flowx"));this.providers.flowx=new s(r,this.client);break;case"cetus":let{CetusProvider:n}=await Promise.resolve().then(() => _interopRequireWildcard(require("./cetus-MUHFO44Y.js"))).catch(K("cetus"));this.providers.cetus=new n(r,this.options,this.client);break;case"okx":this.providers.okx=new j(r,this.options,this.client);break;default:throw new (0, _chunkE5KM5OVWjs.j)(`Provider not supported: ${e}`,1003,{provider:e})}return this.providers[e]}async _simulate(e,t,r){try{if(_chunkE5KM5OVWjs.f.call(void 0, e))return await _chunkE5KM5OVWjs.m.call(void 0, e,t,r,this.inspector,this.options);if(t.provider==="okx")return await oe(t,this.inspector,r,this.options);throw new (0, _chunkE5KM5OVWjs.j)(`Provider not supported: ${e.kind}`,1003,{provider:e.kind})}catch(i){console.warn(i,{provider:e.kind,quote:t.id});return}}async _quote(e,t){return await _chunkE5KM5OVWjs.o.call(void 0, async()=>{let i=await e.quote(t);if(!i)return null;let{expectedAmount:s}=_chunkE5KM5OVWjs.i.call(void 0, i.rawAmountOut,0,this.options.partnerCommissionBps,this.options.tipBps);return i.amountOut=s,i},_nullishCoalesce(t.timeout, () => (2e3)),`quote for ${e.kind} provider from ${t.coinTypeIn} to ${t.coinTypeOut}`)}async _fastSwap({quote:e,signer:t,useGasCoin:r,signTransaction:i},s){let n=new _transactions.Transaction,a=await this.swap({quote:e,signer:t,tx:n,coinIn:_transactions.coinWithBalance.call(void 0, {type:e.coinTypeIn,balance:BigInt(e.amountIn),useGasCoin:r})});n.transferObjects([a],t),n.setSenderIfNotSet(t);let c=await n.build({client:this.client}),{signature:p,bytes:d}=await i(_utils.toBase64.call(void 0, c));return this.client.core.executeTransaction({transaction:_utils.fromBase64.call(void 0, d),signatures:[p],signal:_optionalChain([s, 'optionalAccess', _19 => _19.signal]),include:_optionalChain([s, 'optionalAccess', _20 => _20.include])})}async quote(e,t){let r={...e,coinTypeIn:_utils.normalizeStructTag.call(void 0, e.coinTypeIn),coinTypeOut:_utils.normalizeStructTag.call(void 0, e.coinTypeOut)},s=(await Promise.allSettled(Object.entries(this.options.providers).filter(([n,a])=>!a.disabled).map(async([n])=>{let a=await this._getProvider(n);return this._quote(a,r)}))).map(n=>n.status==="fulfilled"?n.value:(console.warn(n.reason),null)).filter(n=>n!==null);if(t){let n=s.map(async a=>{let c=await this._getProvider(a.provider),p=await this._simulate(c,a,t);a.simulatedAmountOut=_optionalChain([p, 'optionalAccess', _21 => _21.simulatedAmountOut]),a.gasUsed=_optionalChain([p, 'optionalAccess', _22 => _22.gasUsed]),_optionalChain([t, 'optionalAccess', _23 => _23.onSimulated, 'optionalCall', _24 => _24({...a})])});t.onSimulated||await Promise.all(n)}return s}async swap(e,t){let r=await this._getProvider(e.quote.provider);_chunkE5KM5OVWjs.j.assert(!!r,`Provider not found: ${e.quote.provider}`,1002,{provider:e.quote.provider}),_chunkE5KM5OVWjs.j.assert(_chunkE5KM5OVWjs.f.call(void 0, r),`Provider does not support swap: ${r.kind}, use fastSwap instead`,1007,{provider:r.kind}),_chunkE5KM5OVWjs.j.assert(e.signer&&!S(e.signer),"Invalid signer address",1006,{signer:e.signer});let i=await r.swap(e);return e.tx.add(_chunkE5KM5OVWjs.n.call(void 0, e.quote,i,_nullishCoalesce(_nullishCoalesce(t, () => (this.options.slippageBps)), () => (100)),this.options.tipBps,this.options.partner,this.options.partnerCommissionBps)),e.tx.setSenderIfNotSet(e.signer),i}async fastSwap(e,t){_chunkE5KM5OVWjs.j.assert(e.signer&&!S(e.signer),"Invalid signer address",1006,{signer:e.signer});let r=await this._getProvider(e.quote.provider);if(_chunkE5KM5OVWjs.f.call(void 0, r))return this._fastSwap(e,t);if(_chunkE5KM5OVWjs.g.call(void 0, r))return this.client.core.waitForTransaction({digest:await r.fastSwap(e),signal:_optionalChain([t, 'optionalAccess', _25 => _25.signal]),include:_optionalChain([t, 'optionalAccess', _26 => _26.include])});throw new (0, _chunkE5KM5OVWjs.j)(`Provider not supported: ${r.kind}`,1003,{provider:r.kind})}updateMetaAgOptions(e){if(Object.keys(e).length===0)return;this.options.slippageBps=_nullishCoalesce(e.slippageBps, () => (this.options.slippageBps)),this.options.partner=_nullishCoalesce(e.partner, () => (this.options.partner)),this.options.partnerCommissionBps=_nullishCoalesce(e.partnerCommissionBps, () => (this.options.partnerCommissionBps)),this.options.tipBps=_nullishCoalesce(e.tipBps, () => (this.options.tipBps));let t=!!(e.client&&e.client!==this.client),r=!!(e.hermesApi&&e.hermesApi!==this.options.hermesApi);t&&(this.client=e.client,this.options.client=this.client,this.inspector=new x(this.client)),r&&(this.options.hermesApi=e.hermesApi),(t||r)&&(this.providers={});for(let[i,s]of Object.entries(e.providers||{}))this.options.providers[i]={...s,...this.options.providers[i]},delete this.providers[i]}},K=o=>e=>{let t={cetus:"@cetusprotocol/aggregator-sdk",flowx:"@flowx-finance/sdk",bluefin7k:"@bluefin-exchange/bluefin7k-aggregator-sdk",okx:""};throw console.warn(`Please install ${t[o]} to use ${o} provider`),e};async function g(o,e){let t=new Headers(_optionalChain([e, 'optionalAccess', _27 => _27.headers])),r={...e,headers:t};return fetch(o,r)}var L={MAIN:"https://api.7k.ag",LO_DCA:"https://lod-dca.7k.ag",PRICES:"https://lp-pro-api.7k.ag/price",STATISTIC:"https://statistic.7k.ag"};function B(o){return o===b?k:o}var Ke=(o,e)=>{let t=[];for(let r=0;r<o.length;r+=e)t.push(o.slice(r,r+e));return t},ce=500,Ve=100;function We(){return Math.floor(Date.now()/1e3).toString()}async function V(o){try{let e=B(o);return(await W([e]))[e]||0}catch (e2){return 0}}async function W(o){try{if(o.length===0)return{};let e=o.slice(0,ce).map(B),t=Ke(e,Ve),r=We(),s=(await Promise.all(t.map(async a=>{let c={timestamp:r,token_ids:a},p=await g(`${L.PRICES}/prices/batch`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)});if(!p.ok)throw new Error(`Price API returned status ${p.status}`);return await p.json()}))).reduce((a,c)=>(c.forEach(p=>{a[p.token_id]=p.price}),a),{});return e.reduce((a,c)=>(a[c]=s[c]||0,a),{})}catch (e3){return o.slice(0,ce).reduce((t,r)=>(t[B(r)]=0,t),{})}}async function pe(){return await V(k)}var U="0xffc7f420b481ed7a012b42e125fd7e5716b5673759cf4629e5fcfebce970a72d",hr=BigInt("1000000000000"),yr=BigInt("10000"),X="0x0ef0f805710cf53c10f29c4f73e1144a662747e1839689a846e2520cae122adc",w=`${X}::limit_order`,$=`${X}::dca_order`,Cr=`${X}::config`,Tr=BigInt("18446744073709551615"),f=`${L.LO_DCA}/api`;async function ue({accountAddress:o,payCoinType:e,targetCoinType:t,payCoinAmount:r,rate:i,slippage:s,expireTs:n,devInspect:a}){let c=new _transactions.Transaction,p=c.add(_transactions.coinWithBalance.call(void 0, {type:e,balance:r,useGasCoin:!a}));return c.moveCall({target:`${w}::place_limit_order`,arguments:[c.object(U),p,c.pure.u64(i),c.pure.u64(s),c.pure.u64(n),c.object.clock()],typeArguments:[e,t]}),c.setSenderIfNotSet(o),c}async function le({orderId:o,payCoinType:e,targetCoinType:t}){let r=new _transactions.Transaction;return r.moveCall({target:`${w}::cancel_limit_order`,typeArguments:[e,t],arguments:[r.object(o),r.object.clock()]}),r}async function me({orderId:o,payCoinType:e,targetCoinType:t}){let r=new _transactions.Transaction;return r.moveCall({target:`${w}::claim_expired_order`,typeArguments:[e,t],arguments:[r.object(o),r.object.clock()]}),r}function O(o){let e="";return Object.entries(o).forEach(([t,r])=>{if(Array.isArray(r))for(let i of r)e+=e?`&${t}=${i}`:`${t}=${i}`;else r!==void 0&&(e+=e?`&${t}=${r}`:`${t}=${r}`)}),e}async function de({owner:o,offset:e=0,limit:t=10,tokenPair:r}){let s=O({owner:o,statuses:["ACTIVE","EXPIRED"],offset:e,limit:t,tokenPair:r}),n=await g(`${f}/limit-orders?${s}`);if(!n.ok)throw new Error("Failed to fetch open limit orders");return await n.json()}async function ge({owner:o,offset:e=0,limit:t=10,tokenPair:r}){let s=O({owner:o,statuses:["CLOSED"],offset:e,limit:t,tokenPair:r}),n=await g(`${f}/limit-orders?${s}`);if(!n.ok)throw new Error("Failed to fetch closed limit orders");return await n.json()}async function fe({payCoinType:o,targetCoinType:e,payCoinAmountEach:t,numOrders:r,interval:i,slippage:s,minRate:n,maxRate:a}){let c=new _transactions.Transaction,p=[];for(let I=0;I<r;I++){let Te=_transactions.coinWithBalance.call(void 0, {type:o,balance:t});p.push(Te)}let d=c.makeMoveVec({elements:p});return c.moveCall({target:`${$}::place_dca_order`,arguments:[c.object(U),d,c.pure.u64(i),c.pure.u64(s),c.pure.u64(n),c.pure.u64(a),c.object.clock()],typeArguments:[o,e]}),c}async function Oe({orderId:o,payCoinType:e,targetCoinType:t}){let r=new _transactions.Transaction;return r.moveCall({target:`${$}::cancel_dca_order`,arguments:[r.object(o),r.object.clock()],typeArguments:[e,t]}),r}async function he({owner:o,offset:e=0,limit:t=10,tokenPair:r}){let s=O({owner:o,statuses:["ACTIVE","EXPIRED"],offset:e,limit:t,tokenPair:r}),n=await g(`${f}/dca-orders?${s}`);if(!n.ok)throw new Error("Failed to fetch open dca orders");return await n.json()}async function ye({owner:o,offset:e=0,limit:t=10,tokenPair:r}){let s=O({owner:o,statuses:["SUCCESS"],offset:e,limit:t,orderType:"DCA",tokenPair:r}),n=await g(`${f}/order-executions?${s}`);if(!n.ok)throw new Error("Failed to fetch closed dca orders");return await n.json()}async function Ce({owner:o,orderId:e,offset:t=0,limit:r=10}){let s=O({owner:o,orderId:e,statuses:["SUCCESS"],offset:t,limit:r,orderType:"DCA"}),n=await g(`${f}/order-executions?${s}`);if(!n.ok)throw new Error("Failed to fetch dca order executions");return await n.json()}var Tn={getTokenPrice:V,getTokenPrices:W,getSuiPrice:pe,placeLimitOrder:ue,getOpenLimitOrders:de,cancelLimitOrder:le,claimExpiredLimitOrder:me,getClosedLimitOrders:ge,placeDcaOrder:fe,getOpenDcaOrders:he,cancelDcaOrder:Oe,getClosedDcaOrders:ye,getDcaOrderExecutions:Ce,MetaAg:R};exports.EProvider = _chunkE5KM5OVWjs.e; exports.MetaAg = R; exports.cancelDcaOrder = Oe; exports.cancelLimitOrder = le; exports.claimExpiredLimitOrder = me; exports.default = Tn; exports.getClosedDcaOrders = ye; exports.getClosedLimitOrders = ge; exports.getDcaOrderExecutions = Ce; exports.getOpenDcaOrders = he; exports.getOpenLimitOrders = de; exports.getSuiPrice = pe; exports.getTokenPrice = V; exports.getTokenPrices = W; exports.isAggregatorProvider = _chunkE5KM5OVWjs.f; exports.isSwapAPIProvider = _chunkE5KM5OVWjs.g; exports.placeDcaOrder = fe; exports.placeLimitOrder = ue;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/otis/Documents/7k-ts-sdk/dist/index.js","../src/features/metaAg/index.ts","../src/constants/sui.ts","../src/utils/sui.ts","../src/utils/SuiClientUtils.ts","../src/utils/ObjectCache.ts"],"names":["SUI_ADDRESS_ZERO","RESERVED_ADDRESSES","isSystemAddress","address","addr","normalizeSuiAddress","AsyncCache","id","owned","shared","ids","object","objects","ref","functionName"],"mappings":"AAAA,y/BAA6G,4CCKtG,wDAKA,0CACsC,ICXhCA,EAAAA,CACX,oEAAA,CCAF,IAiHMC,EAAAA,CAAqB,CACzB,oEAAA,CACA,oEAAA,CACA,oEAAA,CACA,oEAAA,CACA,oEAAA,CACA,oEAAA,CACA,oEAAA,CACA,oEAAA,CACA,oEAAA,CACA,oEAAA,CACA,oEAAA,CACA,oEACF,CAAA,CAEaC,CAAAA,CAAmBC,CAAAA,EAAoB,CAClD,IAAMC,CAAAA,CAAOC,wCAAAA,CAA2B,CAAA,CACxC,OAAOJ,EAAAA,CAAmB,QAAA,CAASG,CAAI,CACzC,CAAA,CChIA,IC0BsBE,CAAAA,CAAf,KAA0B,CAgB/B,MAAM,SAAA,CAAUC,CAAAA,CAAY,CAC1B,GAAM,CAACC,CAAAA,CAAOC,CAAM,CAAA,CAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CACxC,IAAA,CAAK,GAAA,CAAI,aAAA,CAAeF,CAAE,CAAA,CAC1B,IAAA,CAAK,GAAA,CAAI,yBAAA,CAA2BA,CAAE,CACxC,CAAC,CAAA,CAED,yCAAOC,CAAAA,SAASC,GAAAA,SAAU,MAC5B,CAEA,MAAM,UAAA,CAAWC,CAAAA,CAAe,CAC9B,OAAO,OAAA,CAAQ,GAAA,CAAIA,CAAAA,CAAI,GAAA,CAAKH,CAAAA,EAAO,IAAA,CAAK,SAAA,CAAUA,CAAE,CAAC,CAAC,CACxD,CAEA,MAAM,SAAA,CAAUI,CAAAA,CAA0B,CACxC,OAAIA,CAAAA,CAAO,KAAA,CACT,MAAM,IAAA,CAAK,GAAA,CAAI,aAAA,CAAeA,CAAAA,CAAO,QAAA,CAAUA,CAAM,CAAA,CAErD,MAAM,IAAA,CAAK,GAAA,CAAI,yBAAA,CAA2BA,CAAAA,CAAO,QAAA,CAAUA,CAAM,CAAA,CAG5DA,CACT,CAEA,MAAM,UAAA,CAAWC,CAAAA,CAA6B,CAC5C,MAAM,OAAA,CAAQ,GAAA,CAAIA,CAAAA,CAAQ,GAAA,CAAI,MAAOD,CAAAA,EAAW,IAAA,CAAK,SAAA,CAAUA,CAAM,CAAC,CAAC,CACzE,CAEA,MAAM,YAAA,CAAaJ,CAAAA,CAAY,CAC7B,MAAM,OAAA,CAAQ,GAAA,CAAI,CAChB,IAAA,CAAK,MAAA,CAAO,aAAA,CAAeA,CAAE,CAAA,CAC7B,IAAA,CAAK,MAAA,CAAO,yBAAA,CAA2BA,CAAE,CAC3C,CAAC,CACH,CAEA,MAAM,aAAA,CAAcG,CAAAA,CAAe,CACjC,MAAM,OAAA,CAAQ,GAAA,CAAIA,CAAAA,CAAI,GAAA,CAAKH,CAAAA,EAAO,IAAA,CAAK,YAAA,CAAaA,CAAE,CAAC,CAAC,CAC1D,CAEA,MAAM,yBAAA,CAA0BM,CAAAA,CAI7B,CACD,IAAMC,CAAAA,CAAe,CAAA,EAAA","file":"/Users/otis/Documents/7k-ts-sdk/dist/index.js","sourcesContent":[null,"import {\n getFullnodeUrl,\n GetTransactionBlockParams,\n SuiClient,\n SuiTransactionBlockResponse,\n} from \"@mysten/sui/client\";\nimport {\n coinWithBalance,\n Transaction,\n TransactionObjectArgument,\n} from \"@mysten/sui/transactions\";\nimport { normalizeStructTag, toBase64 } from \"@mysten/sui/utils\";\nimport { SUI_ADDRESS_ZERO } from \"../../constants/sui\";\nimport {\n Bluefin7kProviderOptions,\n CetusProviderOptions,\n EProvider,\n FlowxProviderOptions,\n isAggregatorProvider,\n isSwapAPIProvider,\n MetaAgOptions,\n MetaFastSwapOptions,\n MetaQuote,\n MetaQuoteOptions,\n MetaSimulationOptions,\n MetaSwapOptions,\n OkxProviderOptions,\n QuoteProvider,\n} from \"../../types/metaAg\";\nimport { isSystemAddress } from \"../../utils/sui\";\nimport { SuiClientUtils } from \"../../utils/SuiClientUtils\";\nimport { getExpectedReturn } from \"../../utils/swap\";\nimport { metaSettle, simulateAggregator, timeout } from \"./common\";\nimport { MetaAgError, MetaAgErrorCode } from \"./error\";\nimport { OkxProvider, simulateOKXSwap } from \"./providers/okx\";\n\nconst HERMES_API = \"https://hermes.pyth.network\";\n\nconst DEFAULT_PROVIDERS: Required<MetaAgOptions>[\"providers\"] = {\n [EProvider.BLUEFIN7K]: {},\n [EProvider.FLOWX]: {},\n [EProvider.CETUS]: {},\n};\n\nexport class MetaAg {\n client: SuiClient;\n private providers: Partial<Record<EProvider, QuoteProvider>> = {};\n private inspector: SuiClientUtils;\n private options: Required<MetaAgOptions>;\n constructor(options?: MetaAgOptions) {\n this.options = {\n providers: { ...DEFAULT_PROVIDERS, ...options?.providers },\n slippageBps: options?.slippageBps ?? 100,\n fullnodeUrl: options?.fullnodeUrl ?? getFullnodeUrl(\"mainnet\"),\n hermesApi: options?.hermesApi ?? HERMES_API,\n partner: options?.partner ?? SUI_ADDRESS_ZERO,\n partnerCommissionBps: options?.partnerCommissionBps ?? 0,\n tipBps: options?.tipBps ?? 0,\n };\n\n this.client = new SuiClient({\n url: this.options.fullnodeUrl,\n });\n\n this.inspector = new SuiClientUtils(this.client);\n }\n\n private async _getProvider(provider: EProvider) {\n const p = this.providers[provider];\n if (p) return p;\n\n const providerOptions = this.options.providers[provider];\n MetaAgError.assert(\n !!providerOptions,\n `Provider not found: ${provider}`,\n MetaAgErrorCode.PROVIDER_NOT_FOUND,\n { provider }\n );\n switch (provider) {\n case EProvider.BLUEFIN7K:\n const { Bluefin7kProvider } = await import(\n \"./providers/bluefin7k\"\n ).catch(catchImportError(EProvider.BLUEFIN7K));\n this.providers[EProvider.BLUEFIN7K] = new Bluefin7kProvider(\n providerOptions as Bluefin7kProviderOptions,\n this.options,\n this.client\n );\n break;\n case EProvider.FLOWX:\n const { FlowxProvider } = await import(\"./providers/flowx\").catch(\n catchImportError(EProvider.FLOWX)\n );\n this.providers[EProvider.FLOWX] = new FlowxProvider(\n providerOptions as FlowxProviderOptions,\n this.client\n );\n break;\n case EProvider.CETUS:\n const { CetusProvider } = await import(\"./providers/cetus\").catch(\n catchImportError(EProvider.CETUS)\n );\n this.providers[EProvider.CETUS] = new CetusProvider(\n providerOptions as CetusProviderOptions,\n this.options,\n this.client\n );\n break;\n case EProvider.OKX:\n this.providers[EProvider.OKX] = new OkxProvider(\n providerOptions as OkxProviderOptions,\n this.options,\n this.client\n );\n break;\n default:\n throw new MetaAgError(\n `Provider not supported: ${provider}`,\n MetaAgErrorCode.PROVIDER_NOT_SUPPORTED,\n { provider }\n );\n }\n return this.providers[provider]!;\n }\n\n private async _simulate(\n provider: QuoteProvider,\n quote: MetaQuote,\n simulation: MetaSimulationOptions\n ) {\n try {\n if (isAggregatorProvider(provider)) {\n return simulateAggregator(\n provider,\n quote,\n simulation,\n this.inspector,\n this.options\n );\n }\n\n switch (quote.provider) {\n case EProvider.OKX:\n return simulateOKXSwap(\n quote,\n this.inspector,\n simulation,\n this.options\n );\n default:\n throw new MetaAgError(\n `Provider not supported: ${provider.kind}`,\n MetaAgErrorCode.PROVIDER_NOT_SUPPORTED,\n { provider: provider.kind }\n );\n }\n } catch (error) {\n console.warn(error, { provider: provider.kind, quote: quote.id });\n }\n }\n\n private async _quote(provider: QuoteProvider, options: MetaQuoteOptions) {\n const quote = await timeout(\n async () => {\n const quote = await provider.quote(options);\n if (!quote) return null;\n const { expectedAmount } = getExpectedReturn(\n quote.rawAmountOut,\n 0,\n this.options.partnerCommissionBps,\n this.options.tipBps\n );\n quote.amountOut = expectedAmount;\n return quote;\n },\n options.timeout ?? 2000,\n `quote for ${provider.kind} provider from ${options.coinTypeIn} to ${options.coinTypeOut}`\n );\n\n return quote;\n }\n\n private async _fastSwap(\n { quote, signer, useGasCoin, signTransaction }: MetaFastSwapOptions,\n getTransactionBlockParams?: Omit<GetTransactionBlockParams, \"digest\">\n ) {\n const tx = new Transaction();\n const coin = await this.swap({\n quote,\n signer,\n tx,\n coinIn: coinWithBalance({\n type: quote.coinTypeIn,\n balance: BigInt(quote.amountIn),\n useGasCoin,\n }),\n });\n tx.transferObjects([coin], signer);\n tx.setSenderIfNotSet(signer);\n const txBytes = await tx.build({ client: this.client });\n const { signature, bytes } = await signTransaction(toBase64(txBytes));\n return this.client.executeTransactionBlock({\n transactionBlock: bytes,\n signature,\n options: getTransactionBlockParams?.options,\n signal: getTransactionBlockParams?.signal,\n });\n }\n\n /**\n * Get quotes from all providers\n * @param options - quote options\n * @param simulation - if present, the quote will be simulated\n * @returns quotes from all providers\n */\n async quote(\n options: MetaQuoteOptions,\n simulation?: MetaSimulationOptions\n ): Promise<MetaQuote[]> {\n const opts: MetaQuoteOptions = {\n ...options,\n coinTypeIn: normalizeStructTag(options.coinTypeIn),\n coinTypeOut: normalizeStructTag(options.coinTypeOut),\n };\n const quotes = await Promise.allSettled(\n Object.entries(this.options.providers)\n .filter(([_k, v]) => !v.disabled)\n .map(async ([provider]) => {\n const p = await this._getProvider(provider as EProvider);\n return this._quote(p, opts);\n })\n );\n const result = quotes\n .map((quote) =>\n quote.status === \"fulfilled\"\n ? quote.value\n : (console.warn(quote.reason), null)\n )\n .filter((quote) => quote !== null);\n\n if (simulation) {\n const requests = result.map(async (quote) => {\n const provider = await this._getProvider(quote.provider);\n const updated = await this._simulate(provider, quote, simulation);\n quote.simulatedAmountOut = updated?.simulatedAmountOut;\n quote.gasUsed = updated?.gasUsed;\n simulation?.onSimulated?.({ ...quote });\n });\n if (!simulation.onSimulated) {\n await Promise.all(requests);\n }\n }\n\n return result;\n }\n\n /**\n * Build transaction from quote\n * @info Use this function to build composable transaction (ie: add more commands after the swap, consume the coin out object)\n * @warning Providers that build transaction on the fly (typically RFQ, Swap-API providers ie: Okx, ...) are not supported, please use `fastSwap` instead\n * @param options - build tx options\n * @param slippageBps - slippage bps if not specified, fallback to global slippage bps, if none of them specified, default to 100\n * @returns coin out object, you must consume it by transferObjects, or other sub sequence commands\n */\n async swap(\n options: MetaSwapOptions,\n slippageBps?: number\n ): Promise<TransactionObjectArgument> {\n const provider = await this._getProvider(options.quote.provider);\n MetaAgError.assert(\n !!provider,\n `Provider not found: ${options.quote.provider}`,\n MetaAgErrorCode.PROVIDER_NOT_FOUND,\n { provider: options.quote.provider }\n );\n MetaAgError.assert(\n isAggregatorProvider(provider),\n `Provider does not support swap: ${provider.kind}, use fastSwap instead`,\n MetaAgErrorCode.PROVIDER_NOT_SUPPORT_SWAP,\n { provider: provider.kind }\n );\n MetaAgError.assert(\n options.signer && !isSystemAddress(options.signer),\n \"Invalid signer address\",\n MetaAgErrorCode.INVALID_SIGNER_ADDRESS,\n { signer: options.signer }\n );\n const coinOut = await provider.swap(options);\n options.tx.add(\n metaSettle(\n options.quote,\n coinOut,\n slippageBps ?? this.options.slippageBps ?? 100,\n this.options.tipBps,\n this.options.partner,\n this.options.partnerCommissionBps\n )\n );\n options.tx.setSenderIfNotSet(options.signer);\n return coinOut;\n }\n\n /**\n * Build, Sign, and Execute transaction in one step\n * @param options - fast swap options\n * @returns - txDigest of the transaction\n */\n async fastSwap(\n options: MetaFastSwapOptions,\n getTransactionBlockParams?: Omit<GetTransactionBlockParams, \"digest\">\n ): Promise<SuiTransactionBlockResponse> {\n MetaAgError.assert(\n options.signer && !isSystemAddress(options.signer),\n \"Invalid signer address\",\n MetaAgErrorCode.INVALID_SIGNER_ADDRESS,\n { signer: options.signer }\n );\n const provider = await this._getProvider(options.quote.provider);\n if (isAggregatorProvider(provider)) {\n return this._fastSwap(options, getTransactionBlockParams);\n } else if (isSwapAPIProvider(provider)) {\n return this.client.waitForTransaction({\n ...getTransactionBlockParams,\n digest: await provider.fastSwap(options),\n });\n } else {\n throw new MetaAgError(\n `Provider not supported: ${provider.kind}`,\n MetaAgErrorCode.PROVIDER_NOT_SUPPORTED,\n { provider: provider.kind }\n );\n }\n }\n\n /**\n * Update meta aggregator options\n * @param options - update options payload\n */\n updateMetaAgOptions(options: MetaAgOptions) {\n if (Object.keys(options).length === 0) return;\n this.options.slippageBps = options.slippageBps ?? this.options.slippageBps;\n this.options.partner = options.partner ?? this.options.partner;\n this.options.partnerCommissionBps =\n options.partnerCommissionBps ?? this.options.partnerCommissionBps;\n this.options.tipBps = options.tipBps ?? this.options.tipBps;\n if (\n options.fullnodeUrl &&\n options.fullnodeUrl !== this.options.fullnodeUrl\n ) {\n this.client = new SuiClient({ url: options.fullnodeUrl });\n this.inspector = new SuiClientUtils(this.client);\n this.options.fullnodeUrl = options.fullnodeUrl;\n }\n if (options.hermesApi && options.hermesApi !== this.options.hermesApi) {\n this.providers = {};\n this.options.hermesApi = options.hermesApi;\n }\n // if update provider's options, we need to re-initialize the provider\n for (const [provider, opt] of Object.entries(options.providers || {})) {\n this.options.providers[provider as EProvider] = {\n ...opt,\n ...this.options.providers[provider as EProvider],\n } as any;\n delete this.providers[provider as EProvider];\n }\n }\n}\n\nconst catchImportError = (provider: EProvider) => {\n return (e: any) => {\n const map = {\n [EProvider.CETUS]: \"@cetusprotocol/aggregator-sdk\",\n [EProvider.FLOWX]: \"@flowx-finance/sdk\",\n [EProvider.BLUEFIN7K]: \"@bluefin-exchange/bluefin7k-aggregator-sdk\",\n [EProvider.OKX]: \"\",\n };\n console.warn(`Please install ${map[provider]} to use ${provider} provider`);\n throw e;\n };\n};\n","export const SUI_ADDRESS_ZERO =\n \"0x0000000000000000000000000000000000000000000000000000000000000000\";\n","import { Transaction, TransactionArgument } from \"@mysten/sui/transactions\";\nimport { normalizeSuiAddress, parseStructTag } from \"@mysten/sui/utils\";\nimport {\n _7K_META_CONFIG,\n _7K_META_PACKAGE_ID,\n _7K_META_VAULT,\n} from \"../constants/_7k\";\n\nexport const SuiUtils = {\n getSuiCoin(\n amount: bigint | TransactionArgument,\n txb: Transaction,\n ): TransactionArgument {\n const [coin] = txb.splitCoins(txb.gas, [amount]);\n return coin;\n },\n\n getCoinValue(\n coinType: string,\n coinObject: string | TransactionArgument,\n txb: Transaction,\n ): TransactionArgument {\n const inputCoinObject =\n typeof coinObject == \"string\" ? txb.object(coinObject) : coinObject;\n const [value] = txb.moveCall({\n target: `0x2::coin::value`,\n typeArguments: [coinType],\n arguments: [inputCoinObject],\n });\n return value;\n },\n\n isValidStructTag(value: string) {\n try {\n return !!parseStructTag(value);\n } catch (_) {\n return false;\n }\n },\n\n zeroBalance(tx: Transaction, coinType: string) {\n return tx.moveCall({\n target: `0x2::balance::zero`,\n typeArguments: [coinType],\n arguments: [],\n })[0];\n },\n\n zeroCoin(tx: Transaction, coinType: string) {\n return tx.moveCall({\n target: `0x2::coin::zero`,\n typeArguments: [coinType],\n arguments: [],\n })[0];\n },\n\n coinIntoBalance(\n tx: Transaction,\n coinType: string,\n coinObject: TransactionArgument,\n ) {\n return tx.moveCall({\n target: `0x2::coin::into_balance`,\n typeArguments: [coinType],\n arguments: [coinObject],\n })[0];\n },\n\n coinFromBalance(\n tx: Transaction,\n coinType: string,\n balance: TransactionArgument,\n ) {\n return tx.moveCall({\n target: `0x2::coin::from_balance`,\n typeArguments: [coinType],\n arguments: [balance],\n })[0];\n },\n\n balanceDestroyZero(\n tx: Transaction,\n coinType: string,\n balance: TransactionArgument,\n ) {\n tx.moveCall({\n target: `0x2::balance::destroy_zero`,\n typeArguments: [coinType],\n arguments: [balance],\n });\n },\n\n collectDust(tx: Transaction, coinType: string, coin: TransactionArgument) {\n tx.moveCall({\n target: `${_7K_META_PACKAGE_ID}::vault::collect_dust`,\n typeArguments: [coinType],\n arguments: [tx.object(_7K_META_VAULT), tx.object(_7K_META_CONFIG), coin],\n });\n },\n\n transferOrDestroyZeroCoin(\n tx: Transaction,\n coinType: string,\n coin: TransactionArgument,\n address: string,\n ) {\n tx.moveCall({\n target: `${_7K_META_PACKAGE_ID}::utils::transfer_or_destroy`,\n typeArguments: [coinType],\n arguments: [coin, tx.pure.address(address)],\n });\n },\n};\n\nconst RESERVED_ADDRESSES = [\n \"0x0000000000000000000000000000000000000000000000000000000000000000\", // zero\n \"0x0000000000000000000000000000000000000000000000000000000000000001\", // std\n \"0x0000000000000000000000000000000000000000000000000000000000000002\", // sui framework\n \"0x0000000000000000000000000000000000000000000000000000000000000003\", // unknown but we reserved to be safe\n \"0x0000000000000000000000000000000000000000000000000000000000000004\", // unknown but we reserved to be safe\n \"0x0000000000000000000000000000000000000000000000000000000000000005\", // system state\n \"0x0000000000000000000000000000000000000000000000000000000000000006\", // time\n \"0x0000000000000000000000000000000000000000000000000000000000000007\", // unknown but we reserved to be safe\n \"0x0000000000000000000000000000000000000000000000000000000000000008\", // random\n \"0x0000000000000000000000000000000000000000000000000000000000000009\", // unknown but we reserved to be safe\n \"0x0000000000000000000000000000000000000000000000000000000000000403\", // coin deny list\n \"0x000000000000000000000000000000000000000000000000000000000000000c\", // coin registry\n];\n\nexport const isSystemAddress = (address: string) => {\n const addr = normalizeSuiAddress(address);\n return RESERVED_ADDRESSES.includes(addr);\n};\n","import {\n DevInspectTransactionBlockParams,\n SuiClient,\n} from \"@mysten/sui/client\";\nimport { Transaction } from \"@mysten/sui/transactions\";\nimport { CustomObjectCache } from \"./ObjectCache\";\n\n/**\n * Utility class for interacting with Sui blockchain coins\n */\nexport class SuiClientUtils {\n #devInspectCache: CustomObjectCache;\n /**\n * Creates a new instance of SuiClientUtils\n * @param client - The Sui client instance to use for blockchain interactions\n */\n constructor(private client: SuiClient) {\n this.#devInspectCache = new CustomObjectCache({ client: this.client });\n }\n\n devInspectTransactionBlock = async (\n params: DevInspectTransactionBlockParams,\n ) => {\n if (params.transactionBlock instanceof Transaction) {\n params.transactionBlock.addBuildPlugin(this.#devInspectCache.asPlugin());\n }\n try {\n const res = await this.client.devInspectTransactionBlock(params);\n return res;\n } catch (error) {\n // clear all cache if devInspectTransactionBlock fails\n await this.#devInspectCache.clear();\n throw error;\n } finally {\n await this.#devInspectCache.clearOwnedObjects();\n }\n };\n}\n","import { bcs } from \"@mysten/sui/bcs\";\nimport { SuiClient } from \"@mysten/sui/client\";\nimport {\n OpenMoveTypeSignature,\n TransactionDataBuilder,\n TransactionPlugin,\n} from \"@mysten/sui/transactions\";\nimport { normalizeSuiAddress } from \"@mysten/sui/utils\";\n\nexport interface ObjectCacheEntry {\n objectId: string;\n version: string;\n digest: string;\n owner: string | null;\n initialSharedVersion: string | null;\n}\n\nexport interface MoveFunctionCacheEntry {\n package: string;\n module: string;\n function: string;\n parameters: OpenMoveTypeSignature[];\n}\n\nexport interface CacheEntryTypes {\n OwnedObject: ObjectCacheEntry;\n SharedOrImmutableObject: ObjectCacheEntry;\n MoveFunction: MoveFunctionCacheEntry;\n Custom: unknown;\n}\nexport abstract class AsyncCache {\n protected abstract get<T extends keyof CacheEntryTypes>(\n type: T,\n key: string,\n ): Promise<CacheEntryTypes[T] | null>;\n protected abstract set<T extends keyof CacheEntryTypes>(\n type: T,\n key: string,\n value: CacheEntryTypes[T],\n ): Promise<void>;\n protected abstract delete<T extends keyof CacheEntryTypes>(\n type: T,\n key: string,\n ): Promise<void>;\n abstract clear<T extends keyof CacheEntryTypes>(type?: T): Promise<void>;\n\n async getObject(id: string) {\n const [owned, shared] = await Promise.all([\n this.get(\"OwnedObject\", id),\n this.get(\"SharedOrImmutableObject\", id),\n ]);\n\n return owned ?? shared ?? null;\n }\n\n async getObjects(ids: string[]) {\n return Promise.all(ids.map((id) => this.getObject(id)));\n }\n\n async addObject(object: ObjectCacheEntry) {\n if (object.owner) {\n await this.set(\"OwnedObject\", object.objectId, object);\n } else {\n await this.set(\"SharedOrImmutableObject\", object.objectId, object);\n }\n\n return object;\n }\n\n async addObjects(objects: ObjectCacheEntry[]) {\n await Promise.all(objects.map(async (object) => this.addObject(object)));\n }\n\n async deleteObject(id: string) {\n await Promise.all([\n this.delete(\"OwnedObject\", id),\n this.delete(\"SharedOrImmutableObject\", id),\n ]);\n }\n\n async deleteObjects(ids: string[]) {\n await Promise.all(ids.map((id) => this.deleteObject(id)));\n }\n\n async getMoveFunctionDefinition(ref: {\n package: string;\n module: string;\n function: string;\n }) {\n const functionName = `${normalizeSuiAddress(ref.package)}::${ref.module}::${ref.function}`;\n return this.get(\"MoveFunction\", functionName);\n }\n\n async addMoveFunctionDefinition(functionEntry: MoveFunctionCacheEntry) {\n const pkg = normalizeSuiAddress(functionEntry.package);\n const functionName = `${pkg}::${functionEntry.module}::${functionEntry.function}`;\n const entry = {\n ...functionEntry,\n package: pkg,\n };\n\n await this.set(\"MoveFunction\", functionName, entry);\n\n return entry;\n }\n\n async deleteMoveFunctionDefinition(ref: {\n package: string;\n module: string;\n function: string;\n }) {\n const functionName = `${normalizeSuiAddress(ref.package)}::${ref.module}::${ref.function}`;\n await this.delete(\"MoveFunction\", functionName);\n }\n\n async getCustom<T>(key: string) {\n return this.get(\"Custom\", key) as Promise<T | null>;\n }\n\n async setCustom<T>(key: string, value: T) {\n return this.set(\"Custom\", key, value);\n }\n\n async deleteCustom(key: string) {\n return this.delete(\"Custom\", key);\n }\n}\n\nexport class InMemoryObjectCache extends AsyncCache {\n #caches = {\n OwnedObject: new Map<string, ObjectCacheEntry>(),\n SharedOrImmutableObject: new Map<string, ObjectCacheEntry>(),\n MoveFunction: new Map<string, MoveFunctionCacheEntry>(),\n Custom: new Map<string, unknown>(),\n };\n\n protected async get<T extends keyof CacheEntryTypes>(type: T, key: string) {\n return (this.#caches[type].get(key) as CacheEntryTypes[T]) ?? null;\n }\n\n protected async set<T extends keyof CacheEntryTypes>(\n type: T,\n key: string,\n value: CacheEntryTypes[T],\n ) {\n (this.#caches[type] as Map<string, typeof value>).set(key, value as never);\n }\n\n protected async delete<T extends keyof CacheEntryTypes>(\n type: T,\n key: string,\n ) {\n this.#caches[type].delete(key);\n }\n\n async clear<T extends keyof CacheEntryTypes>(type?: T) {\n if (type) {\n this.#caches[type].clear();\n } else {\n for (const cache of Object.values(this.#caches)) {\n cache.clear();\n }\n }\n }\n}\n\nexport interface ObjectCacheOptions {\n cache?: AsyncCache;\n client: SuiClient;\n onEffects?: (\n effects: typeof bcs.TransactionEffects.$inferType,\n ) => Promise<void>;\n}\n\nexport class CustomObjectCache {\n #client: SuiClient;\n #cache: AsyncCache;\n #onEffects?: (\n effects: typeof bcs.TransactionEffects.$inferType,\n ) => Promise<void>;\n\n constructor({\n cache = new InMemoryObjectCache(),\n onEffects,\n client,\n }: ObjectCacheOptions) {\n this.#client = client;\n this.#cache = cache;\n this.#onEffects = onEffects;\n }\n\n private async applyCache(\n transactionData: TransactionDataBuilder,\n unresolvedObjects: string[],\n ) {\n const cached = (await this.#cache.getObjects(unresolvedObjects)).filter(\n (obj) => obj !== null,\n );\n\n const byId = new Map(cached.map((obj) => [obj!.objectId, obj]));\n const unresolved: string[] = [];\n for (const input of transactionData.inputs) {\n if (!input.UnresolvedObject) {\n continue;\n }\n\n const cached = byId.get(input.UnresolvedObject.objectId);\n\n if (!cached) {\n unresolved.push(input.UnresolvedObject.objectId);\n continue;\n }\n\n if (\n cached.initialSharedVersion &&\n !input.UnresolvedObject.initialSharedVersion\n ) {\n input.UnresolvedObject.initialSharedVersion =\n cached.initialSharedVersion;\n } else {\n if (cached.version && !input.UnresolvedObject.version) {\n input.UnresolvedObject.version = cached.version;\n }\n\n if (cached.digest && !input.UnresolvedObject.digest) {\n input.UnresolvedObject.digest = cached.digest;\n }\n }\n }\n return unresolved;\n }\n\n private async resolveObjects(\n transactionData: TransactionDataBuilder,\n unresolved: string[],\n ) {\n const unresolvedObjects = await this.applyCache(\n transactionData,\n unresolved,\n );\n if (unresolvedObjects.length === 0) {\n return [];\n }\n const dedup = [...new Set(unresolvedObjects)];\n const res = await this.#client.multiGetObjects({\n ids: dedup,\n options: {\n showOwner: true,\n },\n });\n const objects: ObjectCacheEntry[] = [];\n for (const obj of res || []) {\n if (!obj.data) {\n continue;\n }\n const owner = obj.data.owner;\n\n const initialSharedVersion =\n owner && typeof owner === \"object\" && \"Shared\" in owner\n ? owner.Shared.initial_shared_version\n : null;\n const ownerAddress =\n owner && typeof owner === \"object\" && \"AddressOwner\" in owner\n ? owner.AddressOwner\n : null;\n const cached: ObjectCacheEntry = {\n objectId: obj.data.objectId,\n version: obj.data.version,\n digest: obj.data.digest,\n initialSharedVersion,\n owner: ownerAddress,\n };\n objects.push(cached);\n }\n await this.#cache.addObjects(objects);\n return await this.applyCache(transactionData, unresolvedObjects);\n }\n\n asPlugin(): TransactionPlugin {\n return async (transactionData, _options, next) => {\n const unresolvedObjects = transactionData.inputs\n .filter((input) => input.UnresolvedObject)\n .map((input) => input.UnresolvedObject!.objectId);\n\n // if object is not in cache yet, fetch from RPC and save to cache and resolve all objects\n await this.resolveObjects(transactionData, unresolvedObjects);\n\n await Promise.all(\n transactionData.commands.map(async (commands) => {\n if (commands.MoveCall) {\n const def = await this.getMoveFunctionDefinition({\n package: commands.MoveCall.package,\n module: commands.MoveCall.module,\n function: commands.MoveCall.function,\n });\n\n if (def) {\n commands.MoveCall._argumentTypes = def.parameters;\n }\n }\n }),\n );\n\n await next();\n\n await Promise.all(\n transactionData.commands.map(async (commands) => {\n if (commands.MoveCall?._argumentTypes) {\n await this.#cache.addMoveFunctionDefinition({\n package: commands.MoveCall.package,\n module: commands.MoveCall.module,\n function: commands.MoveCall.function,\n parameters: commands.MoveCall._argumentTypes,\n });\n }\n }),\n );\n };\n }\n\n async clear() {\n await this.#cache.clear();\n }\n\n async getMoveFunctionDefinition(ref: {\n package: string;\n module: string;\n function: string;\n }) {\n return this.#cache.getMoveFunctionDefinition(ref);\n }\n\n async getObjects(ids: string[]) {\n return this.#cache.getObjects(ids);\n }\n\n async deleteObjects(ids: string[]) {\n return this.#cache.deleteObjects(ids);\n }\n\n async clearOwnedObjects() {\n await this.#cache.clear(\"OwnedObject\");\n }\n\n async clearCustom() {\n await this.#cache.clear(\"Custom\");\n }\n\n async getCustom<T>(key: string) {\n return this.#cache.getCustom<T>(key);\n }\n\n async setCustom<T>(key: string, value: T) {\n return this.#cache.setCustom(key, value);\n }\n\n async deleteCustom(key: string) {\n return this.#cache.deleteCustom(key);\n }\n\n async applyEffects(effects: typeof bcs.TransactionEffects.$inferType) {\n if (!effects.V2) {\n throw new Error(\n `Unsupported transaction effects version ${effects.$kind}`,\n );\n }\n\n const { lamportVersion, changedObjects } = effects.V2;\n\n const deletedIds: string[] = [];\n const addedObjects: ObjectCacheEntry[] = [];\n\n changedObjects.forEach(([id, change]) => {\n if (change.outputState.NotExist) {\n deletedIds.push(id);\n } else if (change.outputState.ObjectWrite) {\n const [digest, owner] = change.outputState.ObjectWrite;\n\n addedObjects.push({\n objectId: id,\n digest,\n version: lamportVersion,\n owner: owner.AddressOwner ?? owner.ObjectOwner ?? null,\n initialSharedVersion: owner.Shared?.initialSharedVersion ?? null,\n });\n }\n });\n\n await Promise.all([\n this.#cache.addObjects(addedObjects),\n this.#cache.deleteObjects(deletedIds),\n this.#onEffects?.(effects),\n ]);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/otis/Documents/7k-ts-sdk/dist/index.js","../src/features/metaAg/index.ts","../src/constants/sui.ts","../src/utils/sui.ts","../src/utils/ObjectCache.ts"],"names":["SUI_ADDRESS_ZERO","RESERVED_ADDRESSES","isSystemAddress","address","addr","normalizeSuiAddress","AsyncCache","id","owned","shared","ids","object","objects","ref","functionName"],"mappings":"AAAA,y/BAAkI,wCCCpG,8CAIQ,wDAK/B,0CACkD,ICX5CA,EAAAA,CACX,oEAAA,CCAF,IAiHMC,EAAAA,CAAqB,CACzB,oEAAA,CACA,oEAAA,CACA,oEAAA,CACA,oEAAA,CACA,oEAAA,CACA,oEAAA,CACA,oEAAA,CACA,oEAAA,CACA,oEAAA,CACA,oEAAA,CACA,oEAAA,CACA,oEACF,CAAA,CAEaC,CAAAA,CAAmBC,CAAAA,EAAoB,CAClD,IAAMC,CAAAA,CAAOC,wCAAAA,CAA2B,CAAA,CACxC,OAAOJ,EAAAA,CAAmB,QAAA,CAASG,CAAI,CACzC,CAAA,CC7HA,IA6BsBE,CAAAA,CAAf,KAA0B,CAgB/B,MAAM,SAAA,CAAUC,CAAAA,CAAY,CAC1B,GAAM,CAACC,CAAAA,CAAOC,CAAM,CAAA,CAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CACxC,IAAA,CAAK,GAAA,CAAI,aAAA,CAAeF,CAAE,CAAA,CAC1B,IAAA,CAAK,GAAA,CAAI,yBAAA,CAA2BA,CAAE,CACxC,CAAC,CAAA,CAED,yCAAOC,CAAAA,SAASC,GAAAA,SAAU,MAC5B,CAEA,MAAM,UAAA,CAAWC,CAAAA,CAAe,CAC9B,OAAO,OAAA,CAAQ,GAAA,CAAIA,CAAAA,CAAI,GAAA,CAAKH,CAAAA,EAAO,IAAA,CAAK,SAAA,CAAUA,CAAE,CAAC,CAAC,CACxD,CAEA,MAAM,SAAA,CAAUI,CAAAA,CAA0B,CACxC,OAAIA,CAAAA,CAAO,KAAA,CACT,MAAM,IAAA,CAAK,GAAA,CAAI,aAAA,CAAeA,CAAAA,CAAO,QAAA,CAAUA,CAAM,CAAA,CAErD,MAAM,IAAA,CAAK,GAAA,CAAI,yBAAA,CAA2BA,CAAAA,CAAO,QAAA,CAAUA,CAAM,CAAA,CAG5DA,CACT,CAEA,MAAM,UAAA,CAAWC,CAAAA,CAA6B,CAC5C,MAAM,OAAA,CAAQ,GAAA,CAAIA,CAAAA,CAAQ,GAAA,CAAI,MAAOD,CAAAA,EAAW,IAAA,CAAK,SAAA,CAAUA,CAAM,CAAC,CAAC,CACzE,CAEA,MAAM,YAAA,CAAaJ,CAAAA,CAAY,CAC7B,MAAM,OAAA,CAAQ,GAAA,CAAI,CAChB,IAAA,CAAK,MAAA,CAAO,aAAA,CAAeA,CAAE,CAAA,CAC7B,IAAA,CAAK,MAAA,CAAO,yBAAA,CAA2BA,CAAE,CAC3C,CAAC,CACH,CAEA,MAAM,aAAA,CAAcG,CAAAA,CAAe,CACjC,MAAM,OAAA,CAAQ,GAAA,CAAIA,CAAAA,CAAI,GAAA,CAAKH,CAAAA,EAAO,IAAA,CAAK,YAAA,CAAaA,CAAE,CAAC,CAAC,CAC1D,CAEA,MAAM,yBAAA,CAA0BM,CAAAA,CAI7B,CACD,IAAMC,CAAAA,CAAe,CAAA,EAAA","file":"/Users/otis/Documents/7k-ts-sdk/dist/index.js","sourcesContent":[null,"import { ClientWithCoreApi, CoreClient } from \"@mysten/sui/client\";\nimport { SuiGrpcClient } from \"@mysten/sui/grpc\";\n// The Sui fullnode URL is the same endpoint for JSON-RPC and gRPC — the v2\n// gRPC transport hits the same host as the legacy JSON-RPC. We reuse the\n// upstream helper for the value, not to construct a JSON-RPC client.\nimport { getJsonRpcFullnodeUrl } from \"@mysten/sui/jsonRpc\";\nimport {\n coinWithBalance,\n Transaction,\n TransactionObjectArgument,\n} from \"@mysten/sui/transactions\";\nimport { fromBase64, normalizeStructTag, toBase64 } from \"@mysten/sui/utils\";\nimport { SUI_ADDRESS_ZERO } from \"../../constants/sui\";\nimport {\n Bluefin7kProviderOptions,\n CetusProviderOptions,\n EProvider,\n FlowxProviderOptions,\n isAggregatorProvider,\n isSwapAPIProvider,\n MetaAgOptions,\n MetaFastSwapOptions,\n MetaQuote,\n MetaQuoteOptions,\n MetaSimulationOptions,\n MetaSwapOptions,\n OkxProviderOptions,\n QuoteProvider,\n} from \"../../types/metaAg\";\nimport { isSystemAddress } from \"../../utils/sui\";\nimport { SuiClientUtils } from \"../../utils/SuiClientUtils\";\nimport { getExpectedReturn } from \"../../utils/swap\";\nimport { metaSettle, simulateAggregator, timeout } from \"./common\";\nimport { MetaAgError, MetaAgErrorCode } from \"./error\";\nimport { OkxProvider, simulateOKXSwap } from \"./providers/okx\";\n\nconst DEFAULT_CLIENT = (): ClientWithCoreApi =>\n new SuiGrpcClient({\n baseUrl: getJsonRpcFullnodeUrl(\"mainnet\"),\n network: \"mainnet\",\n });\n\nconst HERMES_API = \"https://hermes.pyth.network\";\n\n/** Result type returned by `MetaAg.fastSwap` (transport-agnostic v2 shape). */\nexport type MetaTransactionResult = Awaited<\n ReturnType<CoreClient[\"executeTransaction\"]>\n>;\n\n/** Subset of v2 `TransactionInclude` flags exposed by `MetaAg.fastSwap`. */\nexport interface MetaExecuteInclude {\n balanceChanges?: boolean;\n effects?: boolean;\n events?: boolean;\n objectTypes?: boolean;\n}\n\nexport interface ExecuteTransactionExtraOptions {\n signal?: AbortSignal;\n /**\n * Flags forwarded to the gRPC `executeTransaction`/`waitForTransaction`\n * call. When omitted, the result contains `digest`/`signatures` only; pass\n * `{ effects: true, events: true }` to populate the corresponding fields.\n */\n include?: MetaExecuteInclude;\n}\n\nconst DEFAULT_PROVIDERS: Required<MetaAgOptions>[\"providers\"] = {\n [EProvider.BLUEFIN7K]: {},\n [EProvider.FLOWX]: {},\n [EProvider.CETUS]: {},\n};\n\nexport class MetaAg {\n client: ClientWithCoreApi;\n private providers: Partial<Record<EProvider, QuoteProvider>> = {};\n private inspector: SuiClientUtils;\n private options: Required<MetaAgOptions>;\n constructor(options?: MetaAgOptions) {\n this.client = options?.client ?? DEFAULT_CLIENT();\n this.options = {\n providers: { ...DEFAULT_PROVIDERS, ...options?.providers },\n slippageBps: options?.slippageBps ?? 100,\n client: this.client,\n hermesApi: options?.hermesApi ?? HERMES_API,\n partner: options?.partner ?? SUI_ADDRESS_ZERO,\n partnerCommissionBps: options?.partnerCommissionBps ?? 0,\n tipBps: options?.tipBps ?? 0,\n };\n this.inspector = new SuiClientUtils(this.client);\n }\n\n private async _getProvider(provider: EProvider) {\n const p = this.providers[provider];\n if (p) return p;\n\n const providerOptions = this.options.providers[provider];\n MetaAgError.assert(\n !!providerOptions,\n `Provider not found: ${provider}`,\n MetaAgErrorCode.PROVIDER_NOT_FOUND,\n { provider },\n );\n switch (provider) {\n case EProvider.BLUEFIN7K:\n const { Bluefin7kProvider } =\n await import(\"./providers/bluefin7k\").catch(\n catchImportError(EProvider.BLUEFIN7K),\n );\n this.providers[EProvider.BLUEFIN7K] = new Bluefin7kProvider(\n providerOptions as Bluefin7kProviderOptions,\n this.options,\n this.client,\n );\n break;\n case EProvider.FLOWX:\n const { FlowxProvider } = await import(\"./providers/flowx\").catch(\n catchImportError(EProvider.FLOWX),\n );\n this.providers[EProvider.FLOWX] = new FlowxProvider(\n providerOptions as FlowxProviderOptions,\n this.client,\n );\n break;\n case EProvider.CETUS:\n const { CetusProvider } = await import(\"./providers/cetus\").catch(\n catchImportError(EProvider.CETUS),\n );\n this.providers[EProvider.CETUS] = new CetusProvider(\n providerOptions as CetusProviderOptions,\n this.options,\n this.client,\n );\n break;\n case EProvider.OKX:\n this.providers[EProvider.OKX] = new OkxProvider(\n providerOptions as OkxProviderOptions,\n this.options,\n this.client,\n );\n break;\n default:\n throw new MetaAgError(\n `Provider not supported: ${provider}`,\n MetaAgErrorCode.PROVIDER_NOT_SUPPORTED,\n { provider },\n );\n }\n return this.providers[provider]!;\n }\n\n private async _simulate(\n provider: QuoteProvider,\n quote: MetaQuote,\n simulation: MetaSimulationOptions,\n ) {\n try {\n if (isAggregatorProvider(provider)) {\n return await simulateAggregator(\n provider,\n quote,\n simulation,\n this.inspector,\n this.options,\n );\n }\n\n switch (quote.provider) {\n case EProvider.OKX:\n return await simulateOKXSwap(\n quote,\n this.inspector,\n simulation,\n this.options,\n );\n default:\n throw new MetaAgError(\n `Provider not supported: ${provider.kind}`,\n MetaAgErrorCode.PROVIDER_NOT_SUPPORTED,\n { provider: provider.kind },\n );\n }\n } catch (error) {\n console.warn(error, { provider: provider.kind, quote: quote.id });\n return undefined;\n }\n }\n\n private async _quote(provider: QuoteProvider, options: MetaQuoteOptions) {\n const quote = await timeout(\n async () => {\n const quote = await provider.quote(options);\n if (!quote) return null;\n const { expectedAmount } = getExpectedReturn(\n quote.rawAmountOut,\n 0,\n this.options.partnerCommissionBps,\n this.options.tipBps,\n );\n quote.amountOut = expectedAmount;\n return quote;\n },\n options.timeout ?? 2000,\n `quote for ${provider.kind} provider from ${options.coinTypeIn} to ${options.coinTypeOut}`,\n );\n\n return quote;\n }\n\n private async _fastSwap(\n { quote, signer, useGasCoin, signTransaction }: MetaFastSwapOptions,\n extraOptions?: ExecuteTransactionExtraOptions,\n ): Promise<MetaTransactionResult> {\n const tx = new Transaction();\n const coin = await this.swap({\n quote,\n signer,\n tx,\n coinIn: coinWithBalance({\n type: quote.coinTypeIn,\n balance: BigInt(quote.amountIn),\n useGasCoin,\n }),\n });\n tx.transferObjects([coin], signer);\n tx.setSenderIfNotSet(signer);\n const txBytes = await tx.build({ client: this.client });\n const { signature, bytes } = await signTransaction(toBase64(txBytes));\n return this.client.core.executeTransaction({\n transaction: fromBase64(bytes),\n signatures: [signature],\n signal: extraOptions?.signal,\n include: extraOptions?.include,\n });\n }\n\n /**\n * Get quotes from all providers\n * @param options - quote options\n * @param simulation - if present, the quote will be simulated\n * @returns quotes from all providers\n */\n async quote(\n options: MetaQuoteOptions,\n simulation?: MetaSimulationOptions,\n ): Promise<MetaQuote[]> {\n const opts: MetaQuoteOptions = {\n ...options,\n coinTypeIn: normalizeStructTag(options.coinTypeIn),\n coinTypeOut: normalizeStructTag(options.coinTypeOut),\n };\n const quotes = await Promise.allSettled(\n Object.entries(this.options.providers)\n .filter(([_k, v]) => !v.disabled)\n .map(async ([provider]) => {\n const p = await this._getProvider(provider as EProvider);\n return this._quote(p, opts);\n }),\n );\n const result = quotes\n .map((quote) =>\n quote.status === \"fulfilled\"\n ? quote.value\n : (console.warn(quote.reason), null),\n )\n .filter((quote) => quote !== null);\n\n if (simulation) {\n const requests = result.map(async (quote) => {\n const provider = await this._getProvider(quote.provider);\n const updated = await this._simulate(provider, quote, simulation);\n quote.simulatedAmountOut = updated?.simulatedAmountOut;\n quote.gasUsed = updated?.gasUsed;\n simulation?.onSimulated?.({ ...quote });\n });\n if (!simulation.onSimulated) {\n await Promise.all(requests);\n }\n }\n\n return result;\n }\n\n /**\n * Build transaction from quote\n * @info Use this function to build composable transaction (ie: add more commands after the swap, consume the coin out object)\n * @warning Providers that build transaction on the fly (typically RFQ, Swap-API providers ie: Okx, ...) are not supported, please use `fastSwap` instead\n * @param options - build tx options\n * @param slippageBps - slippage bps if not specified, fallback to global slippage bps, if none of them specified, default to 100\n * @returns coin out object, you must consume it by transferObjects, or other sub sequence commands\n */\n async swap(\n options: MetaSwapOptions,\n slippageBps?: number,\n ): Promise<TransactionObjectArgument> {\n const provider = await this._getProvider(options.quote.provider);\n MetaAgError.assert(\n !!provider,\n `Provider not found: ${options.quote.provider}`,\n MetaAgErrorCode.PROVIDER_NOT_FOUND,\n { provider: options.quote.provider },\n );\n MetaAgError.assert(\n isAggregatorProvider(provider),\n `Provider does not support swap: ${provider.kind}, use fastSwap instead`,\n MetaAgErrorCode.PROVIDER_NOT_SUPPORT_SWAP,\n { provider: provider.kind },\n );\n MetaAgError.assert(\n options.signer && !isSystemAddress(options.signer),\n \"Invalid signer address\",\n MetaAgErrorCode.INVALID_SIGNER_ADDRESS,\n { signer: options.signer },\n );\n const coinOut = await provider.swap(options);\n options.tx.add(\n metaSettle(\n options.quote,\n coinOut,\n slippageBps ?? this.options.slippageBps ?? 100,\n this.options.tipBps,\n this.options.partner,\n this.options.partnerCommissionBps,\n ),\n );\n options.tx.setSenderIfNotSet(options.signer);\n return coinOut;\n }\n\n /**\n * Build, Sign, and Execute transaction in one step\n * @param options - fast swap options\n * @returns - txDigest of the transaction\n */\n async fastSwap(\n options: MetaFastSwapOptions,\n extraOptions?: ExecuteTransactionExtraOptions,\n ): Promise<MetaTransactionResult> {\n MetaAgError.assert(\n options.signer && !isSystemAddress(options.signer),\n \"Invalid signer address\",\n MetaAgErrorCode.INVALID_SIGNER_ADDRESS,\n { signer: options.signer },\n );\n const provider = await this._getProvider(options.quote.provider);\n if (isAggregatorProvider(provider)) {\n return this._fastSwap(options, extraOptions);\n } else if (isSwapAPIProvider(provider)) {\n return this.client.core.waitForTransaction({\n digest: await provider.fastSwap(options),\n signal: extraOptions?.signal,\n include: extraOptions?.include,\n });\n } else {\n throw new MetaAgError(\n `Provider not supported: ${provider.kind}`,\n MetaAgErrorCode.PROVIDER_NOT_SUPPORTED,\n { provider: provider.kind },\n );\n }\n }\n\n /**\n * Update meta aggregator options\n * @param options - update options payload\n */\n updateMetaAgOptions(options: MetaAgOptions) {\n if (Object.keys(options).length === 0) return;\n this.options.slippageBps = options.slippageBps ?? this.options.slippageBps;\n this.options.partner = options.partner ?? this.options.partner;\n this.options.partnerCommissionBps =\n options.partnerCommissionBps ?? this.options.partnerCommissionBps;\n this.options.tipBps = options.tipBps ?? this.options.tipBps;\n const clientChanged = Boolean(\n options.client && options.client !== this.client,\n );\n const hermesChanged = Boolean(\n options.hermesApi && options.hermesApi !== this.options.hermesApi,\n );\n if (clientChanged) {\n this.client = options.client!;\n this.options.client = this.client;\n this.inspector = new SuiClientUtils(this.client);\n }\n if (hermesChanged) {\n this.options.hermesApi = options.hermesApi!;\n }\n // Providers capture the previous client / Hermes URL — drop them so they\n // re-initialize with the latest options on next use.\n if (clientChanged || hermesChanged) {\n this.providers = {};\n }\n // if update provider's options, we need to re-initialize the provider\n for (const [provider, opt] of Object.entries(options.providers || {})) {\n this.options.providers[provider as EProvider] = {\n ...opt,\n ...this.options.providers[provider as EProvider],\n } as Bluefin7kProviderOptions &\n CetusProviderOptions &\n FlowxProviderOptions &\n OkxProviderOptions;\n delete this.providers[provider as EProvider];\n }\n }\n}\n\nconst catchImportError = (provider: EProvider) => {\n return (e: unknown): never => {\n const map = {\n [EProvider.CETUS]: \"@cetusprotocol/aggregator-sdk\",\n [EProvider.FLOWX]: \"@flowx-finance/sdk\",\n [EProvider.BLUEFIN7K]: \"@bluefin-exchange/bluefin7k-aggregator-sdk\",\n [EProvider.OKX]: \"\",\n };\n console.warn(`Please install ${map[provider]} to use ${provider} provider`);\n throw e;\n };\n};\n","export const SUI_ADDRESS_ZERO =\n \"0x0000000000000000000000000000000000000000000000000000000000000000\";\n","import { Transaction, TransactionArgument } from \"@mysten/sui/transactions\";\nimport { normalizeSuiAddress, parseStructTag } from \"@mysten/sui/utils\";\nimport {\n _7K_META_CONFIG,\n _7K_META_PACKAGE_ID,\n _7K_META_VAULT,\n} from \"../constants/_7k\";\n\nexport const SuiUtils = {\n getSuiCoin(\n amount: bigint | TransactionArgument,\n txb: Transaction,\n ): TransactionArgument {\n const [coin] = txb.splitCoins(txb.gas, [amount]);\n return coin;\n },\n\n getCoinValue(\n coinType: string,\n coinObject: string | TransactionArgument,\n txb: Transaction,\n ): TransactionArgument {\n const inputCoinObject =\n typeof coinObject == \"string\" ? txb.object(coinObject) : coinObject;\n const [value] = txb.moveCall({\n target: `0x2::coin::value`,\n typeArguments: [coinType],\n arguments: [inputCoinObject],\n });\n return value;\n },\n\n isValidStructTag(value: string) {\n try {\n return !!parseStructTag(value);\n } catch (_) {\n return false;\n }\n },\n\n zeroBalance(tx: Transaction, coinType: string) {\n return tx.moveCall({\n target: `0x2::balance::zero`,\n typeArguments: [coinType],\n arguments: [],\n })[0];\n },\n\n zeroCoin(tx: Transaction, coinType: string) {\n return tx.moveCall({\n target: `0x2::coin::zero`,\n typeArguments: [coinType],\n arguments: [],\n })[0];\n },\n\n coinIntoBalance(\n tx: Transaction,\n coinType: string,\n coinObject: TransactionArgument,\n ) {\n return tx.moveCall({\n target: `0x2::coin::into_balance`,\n typeArguments: [coinType],\n arguments: [coinObject],\n })[0];\n },\n\n coinFromBalance(\n tx: Transaction,\n coinType: string,\n balance: TransactionArgument,\n ) {\n return tx.moveCall({\n target: `0x2::coin::from_balance`,\n typeArguments: [coinType],\n arguments: [balance],\n })[0];\n },\n\n balanceDestroyZero(\n tx: Transaction,\n coinType: string,\n balance: TransactionArgument,\n ) {\n tx.moveCall({\n target: `0x2::balance::destroy_zero`,\n typeArguments: [coinType],\n arguments: [balance],\n });\n },\n\n collectDust(tx: Transaction, coinType: string, coin: TransactionArgument) {\n tx.moveCall({\n target: `${_7K_META_PACKAGE_ID}::vault::collect_dust`,\n typeArguments: [coinType],\n arguments: [tx.object(_7K_META_VAULT), tx.object(_7K_META_CONFIG), coin],\n });\n },\n\n transferOrDestroyZeroCoin(\n tx: Transaction,\n coinType: string,\n coin: TransactionArgument,\n address: string,\n ) {\n tx.moveCall({\n target: `${_7K_META_PACKAGE_ID}::utils::transfer_or_destroy`,\n typeArguments: [coinType],\n arguments: [coin, tx.pure.address(address)],\n });\n },\n};\n\nconst RESERVED_ADDRESSES = [\n \"0x0000000000000000000000000000000000000000000000000000000000000000\", // zero\n \"0x0000000000000000000000000000000000000000000000000000000000000001\", // std\n \"0x0000000000000000000000000000000000000000000000000000000000000002\", // sui framework\n \"0x0000000000000000000000000000000000000000000000000000000000000003\", // unknown but we reserved to be safe\n \"0x0000000000000000000000000000000000000000000000000000000000000004\", // unknown but we reserved to be safe\n \"0x0000000000000000000000000000000000000000000000000000000000000005\", // system state\n \"0x0000000000000000000000000000000000000000000000000000000000000006\", // time\n \"0x0000000000000000000000000000000000000000000000000000000000000007\", // unknown but we reserved to be safe\n \"0x0000000000000000000000000000000000000000000000000000000000000008\", // random\n \"0x0000000000000000000000000000000000000000000000000000000000000009\", // unknown but we reserved to be safe\n \"0x0000000000000000000000000000000000000000000000000000000000000403\", // coin deny list\n \"0x000000000000000000000000000000000000000000000000000000000000000c\", // coin registry\n];\n\nexport const isSystemAddress = (address: string) => {\n const addr = normalizeSuiAddress(address);\n return RESERVED_ADDRESSES.includes(addr);\n};\n","import { bcs } from \"@mysten/sui/bcs\";\nimport { ClientWithCoreApi } from \"@mysten/sui/client\";\nimport {\n Command,\n TransactionDataBuilder,\n TransactionPlugin,\n} from \"@mysten/sui/transactions\";\nimport { normalizeSuiAddress } from \"@mysten/sui/utils\";\n\n// `MoveCall: any` is intentional — `Extract` needs a shape check, not a full\n// type match, to pick the discriminated-union arm we want.\ntype MoveCallArgumentTypes = NonNullable<\n NonNullable<Extract<Command, { MoveCall: any }>[\"MoveCall\"]>[\"_argumentTypes\"]\n>;\n\nexport interface ObjectCacheEntry {\n objectId: string;\n version: string;\n digest: string;\n owner: string | null;\n initialSharedVersion: string | null;\n}\n\nexport interface MoveFunctionCacheEntry {\n package: string;\n module: string;\n function: string;\n parameters: MoveCallArgumentTypes;\n}\n\nexport interface CacheEntryTypes {\n OwnedObject: ObjectCacheEntry;\n SharedOrImmutableObject: ObjectCacheEntry;\n MoveFunction: MoveFunctionCacheEntry;\n Custom: unknown;\n}\nexport abstract class AsyncCache {\n protected abstract get<T extends keyof CacheEntryTypes>(\n type: T,\n key: string,\n ): Promise<CacheEntryTypes[T] | null>;\n protected abstract set<T extends keyof CacheEntryTypes>(\n type: T,\n key: string,\n value: CacheEntryTypes[T],\n ): Promise<void>;\n protected abstract delete<T extends keyof CacheEntryTypes>(\n type: T,\n key: string,\n ): Promise<void>;\n abstract clear<T extends keyof CacheEntryTypes>(type?: T): Promise<void>;\n\n async getObject(id: string) {\n const [owned, shared] = await Promise.all([\n this.get(\"OwnedObject\", id),\n this.get(\"SharedOrImmutableObject\", id),\n ]);\n\n return owned ?? shared ?? null;\n }\n\n async getObjects(ids: string[]) {\n return Promise.all(ids.map((id) => this.getObject(id)));\n }\n\n async addObject(object: ObjectCacheEntry) {\n if (object.owner) {\n await this.set(\"OwnedObject\", object.objectId, object);\n } else {\n await this.set(\"SharedOrImmutableObject\", object.objectId, object);\n }\n\n return object;\n }\n\n async addObjects(objects: ObjectCacheEntry[]) {\n await Promise.all(objects.map(async (object) => this.addObject(object)));\n }\n\n async deleteObject(id: string) {\n await Promise.all([\n this.delete(\"OwnedObject\", id),\n this.delete(\"SharedOrImmutableObject\", id),\n ]);\n }\n\n async deleteObjects(ids: string[]) {\n await Promise.all(ids.map((id) => this.deleteObject(id)));\n }\n\n async getMoveFunctionDefinition(ref: {\n package: string;\n module: string;\n function: string;\n }) {\n const functionName = `${normalizeSuiAddress(ref.package)}::${ref.module}::${ref.function}`;\n return this.get(\"MoveFunction\", functionName);\n }\n\n async addMoveFunctionDefinition(functionEntry: MoveFunctionCacheEntry) {\n const pkg = normalizeSuiAddress(functionEntry.package);\n const functionName = `${pkg}::${functionEntry.module}::${functionEntry.function}`;\n const entry = {\n ...functionEntry,\n package: pkg,\n };\n\n await this.set(\"MoveFunction\", functionName, entry);\n\n return entry;\n }\n\n async deleteMoveFunctionDefinition(ref: {\n package: string;\n module: string;\n function: string;\n }) {\n const functionName = `${normalizeSuiAddress(ref.package)}::${ref.module}::${ref.function}`;\n await this.delete(\"MoveFunction\", functionName);\n }\n\n async getCustom<T>(key: string) {\n return this.get(\"Custom\", key) as Promise<T | null>;\n }\n\n async setCustom<T>(key: string, value: T) {\n return this.set(\"Custom\", key, value);\n }\n\n async deleteCustom(key: string) {\n return this.delete(\"Custom\", key);\n }\n}\n\nexport class InMemoryObjectCache extends AsyncCache {\n #caches = {\n OwnedObject: new Map<string, ObjectCacheEntry>(),\n SharedOrImmutableObject: new Map<string, ObjectCacheEntry>(),\n MoveFunction: new Map<string, MoveFunctionCacheEntry>(),\n Custom: new Map<string, unknown>(),\n };\n\n protected async get<T extends keyof CacheEntryTypes>(type: T, key: string) {\n return (this.#caches[type].get(key) as CacheEntryTypes[T]) ?? null;\n }\n\n protected async set<T extends keyof CacheEntryTypes>(\n type: T,\n key: string,\n value: CacheEntryTypes[T],\n ) {\n (this.#caches[type] as Map<string, typeof value>).set(key, value as never);\n }\n\n protected async delete<T extends keyof CacheEntryTypes>(\n type: T,\n key: string,\n ) {\n this.#caches[type].delete(key);\n }\n\n async clear<T extends keyof CacheEntryTypes>(type?: T) {\n if (type) {\n this.#caches[type].clear();\n } else {\n for (const cache of Object.values(this.#caches)) {\n cache.clear();\n }\n }\n }\n}\n\nexport interface ObjectCacheOptions {\n cache?: AsyncCache;\n client: ClientWithCoreApi;\n onEffects?: (\n effects: typeof bcs.TransactionEffects.$inferType,\n ) => Promise<void>;\n}\n\nexport class CustomObjectCache {\n #client: ClientWithCoreApi;\n #cache: AsyncCache;\n #onEffects?: (\n effects: typeof bcs.TransactionEffects.$inferType,\n ) => Promise<void>;\n\n constructor({\n cache = new InMemoryObjectCache(),\n onEffects,\n client,\n }: ObjectCacheOptions) {\n this.#client = client;\n this.#cache = cache;\n this.#onEffects = onEffects;\n }\n\n private async applyCache(\n transactionData: TransactionDataBuilder,\n unresolvedObjects: string[],\n ) {\n const cached = (await this.#cache.getObjects(unresolvedObjects)).filter(\n (obj) => obj !== null,\n );\n\n const byId = new Map(cached.map((obj) => [obj!.objectId, obj]));\n const unresolved: string[] = [];\n for (const input of transactionData.inputs) {\n if (!input.UnresolvedObject) {\n continue;\n }\n\n const cached = byId.get(input.UnresolvedObject.objectId);\n\n if (!cached) {\n unresolved.push(input.UnresolvedObject.objectId);\n continue;\n }\n\n if (\n cached.initialSharedVersion &&\n !input.UnresolvedObject.initialSharedVersion\n ) {\n input.UnresolvedObject.initialSharedVersion =\n cached.initialSharedVersion;\n } else {\n if (cached.version && !input.UnresolvedObject.version) {\n input.UnresolvedObject.version = cached.version;\n }\n\n if (cached.digest && !input.UnresolvedObject.digest) {\n input.UnresolvedObject.digest = cached.digest;\n }\n }\n }\n return unresolved;\n }\n\n private async resolveObjects(\n transactionData: TransactionDataBuilder,\n unresolved: string[],\n ) {\n const unresolvedObjects = await this.applyCache(\n transactionData,\n unresolved,\n );\n if (unresolvedObjects.length === 0) {\n return [];\n }\n const dedup = [...new Set(unresolvedObjects)];\n const res = await this.#client.core.getObjects({\n objectIds: dedup,\n });\n const objects: ObjectCacheEntry[] = [];\n for (const obj of res.objects) {\n if (obj instanceof Error) {\n continue;\n }\n const owner = obj.owner;\n\n const initialSharedVersion =\n owner.$kind === \"Shared\" ? owner.Shared.initialSharedVersion : null;\n const ownerAddress =\n owner.$kind === \"AddressOwner\"\n ? owner.AddressOwner\n : owner.$kind === \"ObjectOwner\"\n ? owner.ObjectOwner\n : null;\n const cached: ObjectCacheEntry = {\n objectId: obj.objectId,\n version: obj.version,\n digest: obj.digest,\n initialSharedVersion,\n owner: ownerAddress,\n };\n objects.push(cached);\n }\n await this.#cache.addObjects(objects);\n return await this.applyCache(transactionData, unresolvedObjects);\n }\n\n asPlugin(): TransactionPlugin {\n return async (transactionData, _options, next) => {\n const unresolvedObjects = transactionData.inputs\n .filter((input) => input.UnresolvedObject)\n .map((input) => input.UnresolvedObject!.objectId);\n\n // if object is not in cache yet, fetch from RPC and save to cache and resolve all objects\n await this.resolveObjects(transactionData, unresolvedObjects);\n\n await Promise.all(\n transactionData.commands.map(async (commands) => {\n if (commands.MoveCall) {\n const def = await this.getMoveFunctionDefinition({\n package: commands.MoveCall.package,\n module: commands.MoveCall.module,\n function: commands.MoveCall.function,\n });\n\n if (def) {\n commands.MoveCall._argumentTypes = def.parameters;\n }\n }\n }),\n );\n\n await next();\n\n await Promise.all(\n transactionData.commands.map(async (commands) => {\n if (commands.MoveCall?._argumentTypes) {\n await this.#cache.addMoveFunctionDefinition({\n package: commands.MoveCall.package,\n module: commands.MoveCall.module,\n function: commands.MoveCall.function,\n parameters: commands.MoveCall._argumentTypes,\n });\n }\n }),\n );\n };\n }\n\n async clear() {\n await this.#cache.clear();\n }\n\n async getMoveFunctionDefinition(ref: {\n package: string;\n module: string;\n function: string;\n }) {\n return this.#cache.getMoveFunctionDefinition(ref);\n }\n\n async getObjects(ids: string[]) {\n return this.#cache.getObjects(ids);\n }\n\n async deleteObjects(ids: string[]) {\n return this.#cache.deleteObjects(ids);\n }\n\n async clearOwnedObjects() {\n await this.#cache.clear(\"OwnedObject\");\n }\n\n async clearCustom() {\n await this.#cache.clear(\"Custom\");\n }\n\n async getCustom<T>(key: string) {\n return this.#cache.getCustom<T>(key);\n }\n\n async setCustom<T>(key: string, value: T) {\n return this.#cache.setCustom(key, value);\n }\n\n async deleteCustom(key: string) {\n return this.#cache.deleteCustom(key);\n }\n\n async applyEffects(effects: typeof bcs.TransactionEffects.$inferType) {\n if (!effects.V2) {\n throw new Error(\n `Unsupported transaction effects version ${effects.$kind}`,\n );\n }\n\n const { lamportVersion, changedObjects } = effects.V2;\n\n const deletedIds: string[] = [];\n const addedObjects: ObjectCacheEntry[] = [];\n\n changedObjects.forEach(([id, change]) => {\n if (change.outputState.NotExist) {\n deletedIds.push(id);\n } else if (change.outputState.ObjectWrite) {\n const [digest, owner] = change.outputState.ObjectWrite;\n\n addedObjects.push({\n objectId: id,\n digest,\n version: lamportVersion,\n owner: owner.AddressOwner ?? owner.ObjectOwner ?? null,\n initialSharedVersion: owner.Shared?.initialSharedVersion ?? null,\n });\n }\n });\n\n await Promise.all([\n this.#cache.addObjects(addedObjects),\n this.#cache.deleteObjects(deletedIds),\n this.#onEffects?.(effects),\n ]);\n }\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as u,b as y,c as C,d as Z,e as I,f as J,g as N,h as Q,i as x,j as D,l as m}from"./chunk-ETQEI4QC.mjs";import{getFullnodeUrl as Ft,SuiClient as pt}from"@mysten/sui/client";import{coinWithBalance as Nt,Transaction as Qt}from"@mysten/sui/transactions";import{normalizeStructTag as ut,toBase64 as Kt}from"@mysten/sui/utils";var tt="0x0000000000000000000000000000000000000000000000000000000000000000";import{normalizeSuiAddress as vt,parseStructTag as oe}from"@mysten/sui/utils";var St=["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000403","0x000000000000000000000000000000000000000000000000000000000000000c"],v=s=>{let t=vt(s);return St.includes(t)};import{Transaction as At}from"@mysten/sui/transactions";import{normalizeSuiAddress as K}from"@mysten/sui/utils";var V=class{async getObject(t){let[e,r]=await Promise.all([this.get("OwnedObject",t),this.get("SharedOrImmutableObject",t)]);return e??r??null}async getObjects(t){return Promise.all(t.map(e=>this.getObject(e)))}async addObject(t){return t.owner?await this.set("OwnedObject",t.objectId,t):await this.set("SharedOrImmutableObject",t.objectId,t),t}async addObjects(t){await Promise.all(t.map(async e=>this.addObject(e)))}async deleteObject(t){await Promise.all([this.delete("OwnedObject",t),this.delete("SharedOrImmutableObject",t)])}async deleteObjects(t){await Promise.all(t.map(e=>this.deleteObject(e)))}async getMoveFunctionDefinition(t){let e=`${K(t.package)}::${t.module}::${t.function}`;return this.get("MoveFunction",e)}async addMoveFunctionDefinition(t){let e=K(t.package),r=`${e}::${t.module}::${t.function}`,i={...t,package:e};return await this.set("MoveFunction",r,i),i}async deleteMoveFunctionDefinition(t){let e=`${K(t.package)}::${t.module}::${t.function}`;await this.delete("MoveFunction",e)}async getCustom(t){return this.get("Custom",t)}async setCustom(t,e){return this.set("Custom",t,e)}async deleteCustom(t){return this.delete("Custom",t)}},h,q=class extends V{constructor(){super(...arguments);y(this,h,{OwnedObject:new Map,SharedOrImmutableObject:new Map,MoveFunction:new Map,Custom:new Map})}async get(e,r){return u(this,h)[e].get(r)??null}async set(e,r,i){u(this,h)[e].set(r,i)}async delete(e,r){u(this,h)[e].delete(r)}async clear(e){if(e)u(this,h)[e].clear();else for(let r of Object.values(u(this,h)))r.clear()}};h=new WeakMap;var S,l,A,M=class{constructor({cache:t=new q,onEffects:e,client:r}){y(this,S);y(this,l);y(this,A);C(this,S,r),C(this,l,t),C(this,A,e)}async applyCache(t,e){let r=(await u(this,l).getObjects(e)).filter(n=>n!==null),i=new Map(r.map(n=>[n.objectId,n])),o=[];for(let n of t.inputs){if(!n.UnresolvedObject)continue;let a=i.get(n.UnresolvedObject.objectId);if(!a){o.push(n.UnresolvedObject.objectId);continue}a.initialSharedVersion&&!n.UnresolvedObject.initialSharedVersion?n.UnresolvedObject.initialSharedVersion=a.initialSharedVersion:(a.version&&!n.UnresolvedObject.version&&(n.UnresolvedObject.version=a.version),a.digest&&!n.UnresolvedObject.digest&&(n.UnresolvedObject.digest=a.digest))}return o}async resolveObjects(t,e){let r=await this.applyCache(t,e);if(r.length===0)return[];let i=[...new Set(r)],o=await u(this,S).multiGetObjects({ids:i,options:{showOwner:!0}}),n=[];for(let a of o||[]){if(!a.data)continue;let c=a.data.owner,p=c&&typeof c=="object"&&"Shared"in c?c.Shared.initial_shared_version:null,g=c&&typeof c=="object"&&"AddressOwner"in c?c.AddressOwner:null,_={objectId:a.data.objectId,version:a.data.version,digest:a.data.digest,initialSharedVersion:p,owner:g};n.push(_)}return await u(this,l).addObjects(n),await this.applyCache(t,r)}asPlugin(){return async(t,e,r)=>{let i=t.inputs.filter(o=>o.UnresolvedObject).map(o=>o.UnresolvedObject.objectId);await this.resolveObjects(t,i),await Promise.all(t.commands.map(async o=>{if(o.MoveCall){let n=await this.getMoveFunctionDefinition({package:o.MoveCall.package,module:o.MoveCall.module,function:o.MoveCall.function});n&&(o.MoveCall._argumentTypes=n.parameters)}})),await r(),await Promise.all(t.commands.map(async o=>{o.MoveCall?._argumentTypes&&await u(this,l).addMoveFunctionDefinition({package:o.MoveCall.package,module:o.MoveCall.module,function:o.MoveCall.function,parameters:o.MoveCall._argumentTypes})}))}}async clear(){await u(this,l).clear()}async getMoveFunctionDefinition(t){return u(this,l).getMoveFunctionDefinition(t)}async getObjects(t){return u(this,l).getObjects(t)}async deleteObjects(t){return u(this,l).deleteObjects(t)}async clearOwnedObjects(){await u(this,l).clear("OwnedObject")}async clearCustom(){await u(this,l).clear("Custom")}async getCustom(t){return u(this,l).getCustom(t)}async setCustom(t,e){return u(this,l).setCustom(t,e)}async deleteCustom(t){return u(this,l).deleteCustom(t)}async applyEffects(t){var n;if(!t.V2)throw new Error(`Unsupported transaction effects version ${t.$kind}`);let{lamportVersion:e,changedObjects:r}=t.V2,i=[],o=[];r.forEach(([a,c])=>{if(c.outputState.NotExist)i.push(a);else if(c.outputState.ObjectWrite){let[p,g]=c.outputState.ObjectWrite;o.push({objectId:a,digest:p,version:e,owner:g.AddressOwner??g.ObjectOwner??null,initialSharedVersion:g.Shared?.initialSharedVersion??null})}}),await Promise.all([u(this,l).addObjects(o),u(this,l).deleteObjects(i),(n=u(this,A))==null?void 0:n.call(this,t)])}};S=new WeakMap,l=new WeakMap,A=new WeakMap;var T,E=class{constructor(t){this.client=t;y(this,T);this.devInspectTransactionBlock=async t=>{t.transactionBlock instanceof At&&t.transactionBlock.addBuildPlugin(u(this,T).asPlugin());try{return await this.client.devInspectTransactionBlock(t)}catch(e){throw await u(this,T).clear(),e}finally{await u(this,T).clearOwnedObjects()}};C(this,T,new M({client:this.client}))}};T=new WeakMap;var k=(s,t,e,r=0)=>{if(t>1e4)throw new Error("Slippage must be less than 100%");if(e>1e4)throw new Error("Commission must be less than 100%");if(r>1e4)throw new Error("Tip must be less than 100%");let i=BigInt(s),o=i*BigInt(r||0)/10000n,n=(i-o)*BigInt(e)/10000n,a=i-o-n,c=a*BigInt(1e4-t)/10000n;return{tipAmount:o,minAmount:c,commissionAmount:n,expectedAmount:a.toString(10)}};import{coinWithBalance as Et,Transaction as _t}from"@mysten/sui/transactions";var X=async(s,t,e)=>{let r=await G(()=>t.devInspectTransactionBlock({sender:e.sender,transactionBlock:s}),e.timeout??2e3);if(r.effects.status.status==="failure")throw new m(r.error??"Simulation failed",1008,{error:r.error});return{simulatedAmountOut:It(r.events),gasUsed:r.effects.gasUsed}},rt=async(s,t,e,r,i)=>{let o=new _t,n=await s.swap({quote:t,coinIn:Et({balance:BigInt(t.amountIn),type:t.coinTypeIn,useGasCoin:!1}),signer:e.sender,tx:o});o.add(P(t,n,1e4,i.tipBps,i.partner,i.partnerCommissionBps)),o.transferObjects([n],e.sender);let a=await X(o,r,e);return{id:t.id,provider:s.kind,...a}},P=(s,t,e=100,r=0,i,o=0)=>n=>{let{minAmount:a,expectedAmount:c}=k(s.rawAmountOut,e,o,r);r>0&&n.moveCall({target:`${N}::vault::collect_tip`,typeArguments:[s.coinTypeOut],arguments:[n.object(x),n.object(D),t,n.pure.u64(r)]}),n.moveCall({target:`${N}::settle::settle`,typeArguments:[s.coinTypeIn,s.coinTypeOut],arguments:[n.object(D),n.object(x),n.pure.u64(s.amountIn),t,n.pure.u64(a),n.pure.u64(c),n.pure.option("address",i),n.pure.u64(o),n.pure.u64(0)]})},It=s=>s.filter(e=>e.type===`${Q}::settle::Swap`)?.pop()?.parsedJson?.amount_out,G=async(s,t,e)=>t<=0?s():new Promise((r,i)=>{let o=setTimeout(()=>i(new m(`Timeout ${e??"operation"}`,1001,{timeout:t})),t);s().then(r).catch(i).finally(()=>clearTimeout(o))});import{Commands as xt,Transaction as it,TransactionDataBuilder as Dt}from"@mysten/sui/transactions";import{normalizeStructTag as Mt,normalizeSuiAddress as nt,toBase64 as kt}from"@mysten/sui/utils";import{v4 as jt}from"uuid";var w="0x2::sui::SUI",j="0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI";var Lt="https://web3.okx.com",ot="/api/v6/dex/aggregator/swap",Ut="784",st=Mt(w),L=class{constructor(t,e,r){this.options=t;this.metaOptions=e;this.client=r;this.kind="okx"}async quote({amountIn:t,coinTypeIn:e,coinTypeOut:r,signer:i}){if(!i||v(i))return null;let o={chainIndex:Ut,amount:t,fromTokenAddress:e===st?w:e,toTokenAddress:r===st?w:r,slippagePercent:(this.metaOptions.slippageBps/100).toString(),userWalletAddress:i},n="?"+new URLSearchParams(o).toString(),a=`${this.options.api??Lt}${ot}${n}`,p=await(await fetch(a,{headers:await Bt(this.options,"GET",ot,n)})).json();return m.assert(p.code==="0"&&p.data.length>0,"No quote found",1005,{provider:this.kind}),{id:jt(),provider:this.kind,coinTypeIn:e,coinTypeOut:r,amountIn:t,amountOut:p.data[0].routerResult.toTokenAmount,rawAmountOut:p.data[0].routerResult.toTokenAmount,quote:p.data[0]}}async fastSwap(t){let{quote:e,signer:r,signTransaction:i}=t;m.assert(e.provider==="okx","Invalid quote",1004,{quote:e,expectedProvider:"okx"});let{tx:o,coin:n}=at({quote:e,signer:r});o.add(P(e,n,this.metaOptions.slippageBps,this.metaOptions.tipBps,this.metaOptions.partner,this.metaOptions.partnerCommissionBps)),o.transferObjects([n],r);let a=await o.build({client:this.client}),{bytes:c,signature:p}=await i(kt(a));return(await this.client.executeTransactionBlock({signature:p,transactionBlock:c})).digest}};async function Rt(s,t){let e=new TextEncoder,r=o=>{if(typeof Buffer<"u")return Buffer.from(o).toString("base64");let n="";for(let a=0;a<o.byteLength;a++)n+=String.fromCharCode(o[a]);if(typeof btoa<"u")return btoa(n);throw new m("Base64 encoder not available in this environment")};if(typeof globalThis<"u"&&globalThis.crypto?.subtle){let o=await globalThis.crypto.subtle.importKey("raw",e.encode(t),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),n=await globalThis.crypto.subtle.sign("HMAC",o,e.encode(s));return r(new Uint8Array(n))}let{createHmac:i}=await import("crypto");return i("sha256",t).update(s).digest("base64")}async function Bt(s,t,e,r=""){let{apiKey:i,secretKey:o,apiPassphrase:n,projectId:a}=s;if(!i||!o||!n||!a)throw new m("Missing required environment variables");let c=new Date().toISOString(),p=c+t+e+r;return{"Content-Type":"application/json","OK-ACCESS-KEY":i,"OK-ACCESS-SIGN":await Rt(p,o),"OK-ACCESS-TIMESTAMP":c,"OK-ACCESS-PASSPHRASE":n,"OK-ACCESS-PROJECT":a}}var $t=(s,t)=>{let e=Dt.restore(s.getData()),r=e.commands.findIndex(n=>n.$kind==="MoveCall"&&nt(n.MoveCall.package)===nt(t)&&n.MoveCall.module==="router"&&n.MoveCall.function==="finalize"),i=e.commands[r];return m.assert(i.MoveCall,"OKX: Finalize command not found",1100,{packageId:t}),e.replaceCommand(r,xt.MoveCall({package:t,module:"router",function:"finalize_without_transfer",typeArguments:i.MoveCall.typeArguments,arguments:[i.MoveCall.arguments[0],i.MoveCall.arguments[5],i.MoveCall.arguments[6]]})),{tx:it.from(e.build()),coin:{NestedResult:[r,0]}}},at=s=>{let{quote:t,signer:e}=s;m.assert(t.provider==="okx","Invalid quote",1004,{quote:t,expectedProvider:"okx"});let r=it.from(t.quote.tx.data);r.setSenderIfNotSet(e);let{tx:i,coin:o}=$t(r,t.quote.tx.to);return{tx:i,coin:o}},ct=async(s,t,e,r)=>{let{tx:i,coin:o}=at({quote:s,signer:s.quote.tx.from});i.add(P(s,o,1e4,r.tipBps,r.partner,r.partnerCommissionBps)),i.transferObjects([o],s.quote.tx.from);let n=await X(i,t,e);return{id:s.id,provider:s.provider,...n}};var Vt="https://hermes.pyth.network",qt={bluefin7k:{},flowx:{},cetus:{}},U=class{constructor(t){this.providers={};this.options={providers:{...qt,...t?.providers},slippageBps:t?.slippageBps??100,fullnodeUrl:t?.fullnodeUrl??Ft("mainnet"),hermesApi:t?.hermesApi??Vt,partner:t?.partner??tt,partnerCommissionBps:t?.partnerCommissionBps??0,tipBps:t?.tipBps??0},this.client=new pt({url:this.options.fullnodeUrl}),this.inspector=new E(this.client)}async _getProvider(t){let e=this.providers[t];if(e)return e;let r=this.options.providers[t];switch(m.assert(!!r,`Provider not found: ${t}`,1002,{provider:t}),t){case"bluefin7k":let{Bluefin7kProvider:i}=await import("./bluefin7k-TERLUCNL.mjs").catch(W("bluefin7k"));this.providers.bluefin7k=new i(r,this.options,this.client);break;case"flowx":let{FlowxProvider:o}=await import("./flowx-OXZZX5FD.mjs").catch(W("flowx"));this.providers.flowx=new o(r,this.client);break;case"cetus":let{CetusProvider:n}=await import("./cetus-AU3OMWOY.mjs").catch(W("cetus"));this.providers.cetus=new n(r,this.options,this.client);break;case"okx":this.providers.okx=new L(r,this.options,this.client);break;default:throw new m(`Provider not supported: ${t}`,1003,{provider:t})}return this.providers[t]}async _simulate(t,e,r){try{if(I(t))return rt(t,e,r,this.inspector,this.options);if(e.provider==="okx")return ct(e,this.inspector,r,this.options);throw new m(`Provider not supported: ${t.kind}`,1003,{provider:t.kind})}catch(i){console.warn(i,{provider:t.kind,quote:e.id})}}async _quote(t,e){return await G(async()=>{let i=await t.quote(e);if(!i)return null;let{expectedAmount:o}=k(i.rawAmountOut,0,this.options.partnerCommissionBps,this.options.tipBps);return i.amountOut=o,i},e.timeout??2e3,`quote for ${t.kind} provider from ${e.coinTypeIn} to ${e.coinTypeOut}`)}async _fastSwap({quote:t,signer:e,useGasCoin:r,signTransaction:i},o){let n=new Qt,a=await this.swap({quote:t,signer:e,tx:n,coinIn:Nt({type:t.coinTypeIn,balance:BigInt(t.amountIn),useGasCoin:r})});n.transferObjects([a],e),n.setSenderIfNotSet(e);let c=await n.build({client:this.client}),{signature:p,bytes:g}=await i(Kt(c));return this.client.executeTransactionBlock({transactionBlock:g,signature:p,options:o?.options,signal:o?.signal})}async quote(t,e){let r={...t,coinTypeIn:ut(t.coinTypeIn),coinTypeOut:ut(t.coinTypeOut)},o=(await Promise.allSettled(Object.entries(this.options.providers).filter(([n,a])=>!a.disabled).map(async([n])=>{let a=await this._getProvider(n);return this._quote(a,r)}))).map(n=>n.status==="fulfilled"?n.value:(console.warn(n.reason),null)).filter(n=>n!==null);if(e){let n=o.map(async a=>{let c=await this._getProvider(a.provider),p=await this._simulate(c,a,e);a.simulatedAmountOut=p?.simulatedAmountOut,a.gasUsed=p?.gasUsed,e?.onSimulated?.({...a})});e.onSimulated||await Promise.all(n)}return o}async swap(t,e){let r=await this._getProvider(t.quote.provider);m.assert(!!r,`Provider not found: ${t.quote.provider}`,1002,{provider:t.quote.provider}),m.assert(I(r),`Provider does not support swap: ${r.kind}, use fastSwap instead`,1007,{provider:r.kind}),m.assert(t.signer&&!v(t.signer),"Invalid signer address",1006,{signer:t.signer});let i=await r.swap(t);return t.tx.add(P(t.quote,i,e??this.options.slippageBps??100,this.options.tipBps,this.options.partner,this.options.partnerCommissionBps)),t.tx.setSenderIfNotSet(t.signer),i}async fastSwap(t,e){m.assert(t.signer&&!v(t.signer),"Invalid signer address",1006,{signer:t.signer});let r=await this._getProvider(t.quote.provider);if(I(r))return this._fastSwap(t,e);if(J(r))return this.client.waitForTransaction({...e,digest:await r.fastSwap(t)});throw new m(`Provider not supported: ${r.kind}`,1003,{provider:r.kind})}updateMetaAgOptions(t){if(Object.keys(t).length!==0){this.options.slippageBps=t.slippageBps??this.options.slippageBps,this.options.partner=t.partner??this.options.partner,this.options.partnerCommissionBps=t.partnerCommissionBps??this.options.partnerCommissionBps,this.options.tipBps=t.tipBps??this.options.tipBps,t.fullnodeUrl&&t.fullnodeUrl!==this.options.fullnodeUrl&&(this.client=new pt({url:t.fullnodeUrl}),this.inspector=new E(this.client),this.options.fullnodeUrl=t.fullnodeUrl),t.hermesApi&&t.hermesApi!==this.options.hermesApi&&(this.providers={},this.options.hermesApi=t.hermesApi);for(let[e,r]of Object.entries(t.providers||{}))this.options.providers[e]={...r,...this.options.providers[e]},delete this.providers[e]}}},W=s=>t=>{let e={cetus:"@cetusprotocol/aggregator-sdk",flowx:"@flowx-finance/sdk",bluefin7k:"@bluefin-exchange/bluefin7k-aggregator-sdk",okx:""};throw console.warn(`Please install ${e[s]} to use ${s} provider`),t};async function d(s,t){let e=new Headers(t?.headers),r={...t,headers:e};return fetch(s,r)}var R={MAIN:"https://api.7k.ag",LO_DCA:"https://lod-dca.7k.ag",PRICES:"https://lp-pro-api.7k.ag/price",STATISTIC:"https://statistic.7k.ag"};function B(s){return s===w?j:s}var Xt=(s,t)=>{let e=[];for(let r=0;r<s.length;r+=t)e.push(s.slice(r,r+t));return e},mt=500,Gt=100;function Wt(){return Math.floor(Date.now()/1e3).toString()}async function z(s){try{let t=B(s);return(await H([t]))[t]||0}catch{return 0}}async function H(s){try{if(s.length===0)return{};let t=s.slice(0,mt).map(B),e=Xt(t,Gt),r=Wt(),o=(await Promise.all(e.map(async a=>{let c={timestamp:r,token_ids:a},p=await d(`${R.PRICES}/prices/batch`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)});if(!p.ok)throw new Error(`Price API returned status ${p.status}`);return await p.json()}))).reduce((a,c)=>(c.forEach(p=>{a[p.token_id]=p.price}),a),{});return t.reduce((a,c)=>(a[c]=o[c]||0,a),{})}catch{return s.slice(0,mt).reduce((e,r)=>(e[B(r)]=0,e),{})}}async function lt(){return await z(j)}import{coinWithBalance as zt,Transaction as Ht}from"@mysten/sui/transactions";var $="0xffc7f420b481ed7a012b42e125fd7e5716b5673759cf4629e5fcfebce970a72d",br=BigInt("1000000000000"),vr=BigInt("10000"),Y="0x0ef0f805710cf53c10f29c4f73e1144a662747e1839689a846e2520cae122adc",b=`${Y}::limit_order`,F=`${Y}::dca_order`,Sr=`${Y}::config`,Ar=BigInt("18446744073709551615"),f=`${R.LO_DCA}/api`;async function dt({accountAddress:s,payCoinType:t,targetCoinType:e,payCoinAmount:r,rate:i,slippage:o,expireTs:n,devInspect:a}){let c=new Ht,p=c.add(zt({type:t,balance:r,useGasCoin:!a}));return c.moveCall({target:`${b}::place_limit_order`,arguments:[c.object($),p,c.pure.u64(i),c.pure.u64(o),c.pure.u64(n),c.object.clock()],typeArguments:[t,e]}),c.setSenderIfNotSet(s),c}import{Transaction as Yt}from"@mysten/sui/transactions";async function gt({orderId:s,payCoinType:t,targetCoinType:e}){let r=new Yt;return r.moveCall({target:`${b}::cancel_limit_order`,typeArguments:[t,e],arguments:[r.object(s),r.object.clock()]}),r}import{Transaction as Zt}from"@mysten/sui/transactions";async function ft({orderId:s,payCoinType:t,targetCoinType:e}){let r=new Zt;return r.moveCall({target:`${b}::claim_expired_order`,typeArguments:[t,e],arguments:[r.object(s),r.object.clock()]}),r}function O(s){let t="";return Object.entries(s).forEach(([e,r])=>{if(Array.isArray(r))for(let i of r)t+=t?`&${e}=${i}`:`${e}=${i}`;else r!==void 0&&(t+=t?`&${e}=${r}`:`${e}=${r}`)}),t}async function Ot({owner:s,offset:t=0,limit:e=10,tokenPair:r}){let o=O({owner:s,statuses:["ACTIVE","EXPIRED"],offset:t,limit:e,tokenPair:r}),n=await d(`${f}/limit-orders?${o}`);if(!n.ok)throw new Error("Failed to fetch open limit orders");return await n.json()}async function ht({owner:s,offset:t=0,limit:e=10,tokenPair:r}){let o=O({owner:s,statuses:["CLOSED"],offset:t,limit:e,tokenPair:r}),n=await d(`${f}/limit-orders?${o}`);if(!n.ok)throw new Error("Failed to fetch closed limit orders");return await n.json()}import{coinWithBalance as Jt,Transaction as te}from"@mysten/sui/transactions";async function yt({payCoinType:s,targetCoinType:t,payCoinAmountEach:e,numOrders:r,interval:i,slippage:o,minRate:n,maxRate:a}){let c=new te,p=[];for(let _=0;_<r;_++){let bt=Jt({type:s,balance:e});p.push(bt)}let g=c.makeMoveVec({elements:p});return c.moveCall({target:`${F}::place_dca_order`,arguments:[c.object($),g,c.pure.u64(i),c.pure.u64(o),c.pure.u64(n),c.pure.u64(a),c.object.clock()],typeArguments:[s,t]}),c}import{Transaction as ee}from"@mysten/sui/transactions";async function Tt({orderId:s,payCoinType:t,targetCoinType:e}){let r=new ee;return r.moveCall({target:`${F}::cancel_dca_order`,arguments:[r.object(s),r.object.clock()],typeArguments:[t,e]}),r}async function Ct({owner:s,offset:t=0,limit:e=10,tokenPair:r}){let o=O({owner:s,statuses:["ACTIVE","EXPIRED"],offset:t,limit:e,tokenPair:r}),n=await d(`${f}/dca-orders?${o}`);if(!n.ok)throw new Error("Failed to fetch open dca orders");return await n.json()}async function Pt({owner:s,offset:t=0,limit:e=10,tokenPair:r}){let o=O({owner:s,statuses:["SUCCESS"],offset:t,limit:e,orderType:"DCA",tokenPair:r}),n=await d(`${f}/order-executions?${o}`);if(!n.ok)throw new Error("Failed to fetch closed dca orders");return await n.json()}async function wt({owner:s,orderId:t,offset:e=0,limit:r=10}){let o=O({owner:s,orderId:t,statuses:["SUCCESS"],offset:e,limit:r,orderType:"DCA"}),n=await d(`${f}/order-executions?${o}`);if(!n.ok)throw new Error("Failed to fetch dca order executions");return await n.json()}var An={getTokenPrice:z,getTokenPrices:H,getSuiPrice:lt,placeLimitOrder:dt,getOpenLimitOrders:Ot,cancelLimitOrder:gt,claimExpiredLimitOrder:ft,getClosedLimitOrders:ht,placeDcaOrder:yt,getOpenDcaOrders:Ct,cancelDcaOrder:Tt,getClosedDcaOrders:Pt,getDcaOrderExecutions:wt,MetaAg:U};export{Z as EProvider,U as MetaAg,Tt as cancelDcaOrder,gt as cancelLimitOrder,ft as claimExpiredLimitOrder,An as default,Pt as getClosedDcaOrders,ht as getClosedLimitOrders,wt as getDcaOrderExecutions,Ct as getOpenDcaOrders,Ot as getOpenLimitOrders,lt as getSuiPrice,z as getTokenPrice,H as getTokenPrices,I as isAggregatorProvider,J as isSwapAPIProvider,yt as placeDcaOrder,dt as placeLimitOrder};
|
|
1
|
+
import{a as h,b as u,c as y,d as P,e as z,f as D,g as G,i as H,j as m,k as F,l as Y,m as Z,n as v,o as J}from"./chunk-CYI4MM5C.mjs";import{SuiGrpcClient as Re}from"@mysten/sui/grpc";import{getJsonRpcFullnodeUrl as Le}from"@mysten/sui/jsonRpc";import{coinWithBalance as Be,Transaction as Ue}from"@mysten/sui/transactions";import{fromBase64 as $e,normalizeStructTag as ae,toBase64 as Fe}from"@mysten/sui/utils";var ee="0x0000000000000000000000000000000000000000000000000000000000000000";import{normalizeSuiAddress as Pe,parseStructTag as it}from"@mysten/sui/utils";var be=["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000403","0x000000000000000000000000000000000000000000000000000000000000000c"],S=o=>{let e=Pe(o);return be.includes(e)};import{normalizeSuiAddress as N}from"@mysten/sui/utils";var Q=class{async getObject(e){let[t,r]=await Promise.all([this.get("OwnedObject",e),this.get("SharedOrImmutableObject",e)]);return t??r??null}async getObjects(e){return Promise.all(e.map(t=>this.getObject(t)))}async addObject(e){return e.owner?await this.set("OwnedObject",e.objectId,e):await this.set("SharedOrImmutableObject",e.objectId,e),e}async addObjects(e){await Promise.all(e.map(async t=>this.addObject(t)))}async deleteObject(e){await Promise.all([this.delete("OwnedObject",e),this.delete("SharedOrImmutableObject",e)])}async deleteObjects(e){await Promise.all(e.map(t=>this.deleteObject(t)))}async getMoveFunctionDefinition(e){let t=`${N(e.package)}::${e.module}::${e.function}`;return this.get("MoveFunction",t)}async addMoveFunctionDefinition(e){let t=N(e.package),r=`${t}::${e.module}::${e.function}`,i={...e,package:t};return await this.set("MoveFunction",r,i),i}async deleteMoveFunctionDefinition(e){let t=`${N(e.package)}::${e.module}::${e.function}`;await this.delete("MoveFunction",t)}async getCustom(e){return this.get("Custom",e)}async setCustom(e,t){return this.set("Custom",e,t)}async deleteCustom(e){return this.delete("Custom",e)}},C,q=class extends Q{constructor(){super(...arguments);y(this,C,{OwnedObject:new Map,SharedOrImmutableObject:new Map,MoveFunction:new Map,Custom:new Map})}async get(t,r){return u(this,C)[t].get(r)??null}async set(t,r,i){u(this,C)[t].set(r,i)}async delete(t,r){u(this,C)[t].delete(r)}async clear(t){if(t)u(this,C)[t].clear();else for(let r of Object.values(u(this,C)))r.clear()}};C=new WeakMap;var E,l,A,M=class{constructor({cache:e=new q,onEffects:t,client:r}){y(this,E);y(this,l);y(this,A);P(this,E,r),P(this,l,e),P(this,A,t)}async applyCache(e,t){let r=(await u(this,l).getObjects(t)).filter(n=>n!==null),i=new Map(r.map(n=>[n.objectId,n])),s=[];for(let n of e.inputs){if(!n.UnresolvedObject)continue;let a=i.get(n.UnresolvedObject.objectId);if(!a){s.push(n.UnresolvedObject.objectId);continue}a.initialSharedVersion&&!n.UnresolvedObject.initialSharedVersion?n.UnresolvedObject.initialSharedVersion=a.initialSharedVersion:(a.version&&!n.UnresolvedObject.version&&(n.UnresolvedObject.version=a.version),a.digest&&!n.UnresolvedObject.digest&&(n.UnresolvedObject.digest=a.digest))}return s}async resolveObjects(e,t){let r=await this.applyCache(e,t);if(r.length===0)return[];let i=[...new Set(r)],s=await u(this,E).core.getObjects({objectIds:i}),n=[];for(let a of s.objects){if(a instanceof Error)continue;let c=a.owner,p=c.$kind==="Shared"?c.Shared.initialSharedVersion:null,d=c.$kind==="AddressOwner"?c.AddressOwner:c.$kind==="ObjectOwner"?c.ObjectOwner:null,I={objectId:a.objectId,version:a.version,digest:a.digest,initialSharedVersion:p,owner:d};n.push(I)}return await u(this,l).addObjects(n),await this.applyCache(e,r)}asPlugin(){return async(e,t,r)=>{let i=e.inputs.filter(s=>s.UnresolvedObject).map(s=>s.UnresolvedObject.objectId);await this.resolveObjects(e,i),await Promise.all(e.commands.map(async s=>{if(s.MoveCall){let n=await this.getMoveFunctionDefinition({package:s.MoveCall.package,module:s.MoveCall.module,function:s.MoveCall.function});n&&(s.MoveCall._argumentTypes=n.parameters)}})),await r(),await Promise.all(e.commands.map(async s=>{s.MoveCall?._argumentTypes&&await u(this,l).addMoveFunctionDefinition({package:s.MoveCall.package,module:s.MoveCall.module,function:s.MoveCall.function,parameters:s.MoveCall._argumentTypes})}))}}async clear(){await u(this,l).clear()}async getMoveFunctionDefinition(e){return u(this,l).getMoveFunctionDefinition(e)}async getObjects(e){return u(this,l).getObjects(e)}async deleteObjects(e){return u(this,l).deleteObjects(e)}async clearOwnedObjects(){await u(this,l).clear("OwnedObject")}async clearCustom(){await u(this,l).clear("Custom")}async getCustom(e){return u(this,l).getCustom(e)}async setCustom(e,t){return u(this,l).setCustom(e,t)}async deleteCustom(e){return u(this,l).deleteCustom(e)}async applyEffects(e){var n;if(!e.V2)throw new Error(`Unsupported transaction effects version ${e.$kind}`);let{lamportVersion:t,changedObjects:r}=e.V2,i=[],s=[];r.forEach(([a,c])=>{if(c.outputState.NotExist)i.push(a);else if(c.outputState.ObjectWrite){let[p,d]=c.outputState.ObjectWrite;s.push({objectId:a,digest:p,version:t,owner:d.AddressOwner??d.ObjectOwner??null,initialSharedVersion:d.Shared?.initialSharedVersion??null})}}),await Promise.all([u(this,l).addObjects(s),u(this,l).deleteObjects(i),(n=u(this,A))==null?void 0:n.call(this,e)])}};E=new WeakMap,l=new WeakMap,A=new WeakMap;var T,_,x=class{constructor(e){this.client=e;y(this,T);y(this,_,new WeakSet);h(this,"simulateTransaction",async e=>{e.transactionBlock.setSenderIfNotSet(e.sender),u(this,_).has(e.transactionBlock)||(e.transactionBlock.addBuildPlugin(u(this,T).asPlugin()),u(this,_).add(e.transactionBlock));try{return await this.client.core.simulateTransaction({transaction:e.transactionBlock,checksEnabled:!1,include:{effects:!0,events:!0,commandResults:!0}})}catch(t){throw await u(this,T).clear(),t}finally{await u(this,T).clearOwnedObjects()}});P(this,T,new M({client:this.client}))}};T=new WeakMap,_=new WeakMap;import{TransactionCommands as ve,Transaction as se,TransactionDataBuilder as Se}from"@mysten/sui/transactions";import{fromBase64 as Ee,normalizeStructTag as Ae,normalizeSuiAddress as te,toBase64 as xe}from"@mysten/sui/utils";import{v4 as _e}from"uuid";var b="0x2::sui::SUI",k="0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI";var Ie="https://web3.okx.com",re="/api/v6/dex/aggregator/swap",De="784",ne=Ae(b),j=class{constructor(e,t,r){this.options=e;this.metaOptions=t;this.client=r;h(this,"kind","okx")}async quote({amountIn:e,coinTypeIn:t,coinTypeOut:r,signer:i}){if(!i||S(i))return null;let s={chainIndex:De,amount:e,fromTokenAddress:t===ne?b:t,toTokenAddress:r===ne?b:r,slippagePercent:(this.metaOptions.slippageBps/100).toString(),userWalletAddress:i},n="?"+new URLSearchParams(s).toString(),a=`${this.options.api??Ie}${re}${n}`,p=await(await fetch(a,{headers:await ke(this.options,"GET",re,n)})).json();return m.assert(p.code==="0"&&p.data.length>0,"No quote found",1005,{provider:this.kind}),{id:_e(),provider:this.kind,coinTypeIn:t,coinTypeOut:r,amountIn:e,amountOut:p.data[0].routerResult.toTokenAmount,rawAmountOut:p.data[0].routerResult.toTokenAmount,quote:p.data[0]}}async fastSwap(e){let{quote:t,signer:r,signTransaction:i}=e;F(t,"okx");let{tx:s,coin:n}=ie({quote:t,signer:r});s.add(v(t,n,this.metaOptions.slippageBps,this.metaOptions.tipBps,this.metaOptions.partner,this.metaOptions.partnerCommissionBps)),s.transferObjects([n],r);let a=await s.build({client:this.client}),{bytes:c,signature:p}=await i(xe(a)),d=await this.client.core.executeTransaction({transaction:Ee(c),signatures:[p]});if(!d.Transaction?.digest)throw new m("OKX transaction failed or returned no digest",1008,{error:d.FailedTransaction?.digest??"no digest"});return d.Transaction.digest}};async function Me(o,e){let t=new TextEncoder,r=s=>{if(typeof Buffer<"u")return Buffer.from(s).toString("base64");let n="";for(let a=0;a<s.byteLength;a++)n+=String.fromCharCode(s[a]);if(typeof btoa<"u")return btoa(n);throw new m("Base64 encoder not available in this environment")};if(typeof globalThis<"u"&&globalThis.crypto?.subtle){let s=await globalThis.crypto.subtle.importKey("raw",t.encode(e),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),n=await globalThis.crypto.subtle.sign("HMAC",s,t.encode(o));return r(new Uint8Array(n))}let{createHmac:i}=await import("crypto");return i("sha256",e).update(o).digest("base64")}async function ke(o,e,t,r=""){let{apiKey:i,secretKey:s,apiPassphrase:n,projectId:a}=o;if(!i||!s||!n||!a)throw new m("Missing required environment variables");let c=new Date().toISOString(),p=c+e+t+r;return{"Content-Type":"application/json","OK-ACCESS-KEY":i,"OK-ACCESS-SIGN":await Me(p,s),"OK-ACCESS-TIMESTAMP":c,"OK-ACCESS-PASSPHRASE":n,"OK-ACCESS-PROJECT":a}}var je=(o,e)=>{let t=Se.restore(o.getData()),r=t.commands.findIndex(n=>n.$kind==="MoveCall"&&te(n.MoveCall.package)===te(e)&&n.MoveCall.module==="router"&&n.MoveCall.function==="finalize"),i=t.commands[r];return m.assert(i.MoveCall,"OKX: Finalize command not found",1100,{packageId:e}),t.replaceCommand(r,ve.MoveCall({package:e,module:"router",function:"finalize_without_transfer",typeArguments:i.MoveCall.typeArguments,arguments:[i.MoveCall.arguments[0],i.MoveCall.arguments[5],i.MoveCall.arguments[6]]})),{tx:se.from(t.build()),coin:{NestedResult:[r,0]}}},ie=o=>{let{quote:e,signer:t}=o;F(e,"okx");let r=se.from(e.quote.tx.data);r.setSenderIfNotSet(t);let{tx:i,coin:s}=je(r,e.quote.tx.to);return{tx:i,coin:s}},oe=async(o,e,t,r)=>{let{tx:i,coin:s}=ie({quote:o,signer:o.quote.tx.from});i.add(v(o,s,1e4,r.tipBps,r.partner,r.partnerCommissionBps)),i.transferObjects([s],o.quote.tx.from);let n=await Y(i,e,t);return{id:o.id,provider:o.provider,...n}};var Ne=()=>new Re({baseUrl:Le("mainnet"),network:"mainnet"}),Qe="https://hermes.pyth.network",qe={bluefin7k:{},flowx:{},cetus:{}},R=class{constructor(e){h(this,"client");h(this,"providers",{});h(this,"inspector");h(this,"options");this.client=e?.client??Ne(),this.options={providers:{...qe,...e?.providers},slippageBps:e?.slippageBps??100,client:this.client,hermesApi:e?.hermesApi??Qe,partner:e?.partner??ee,partnerCommissionBps:e?.partnerCommissionBps??0,tipBps:e?.tipBps??0},this.inspector=new x(this.client)}async _getProvider(e){let t=this.providers[e];if(t)return t;let r=this.options.providers[e];switch(m.assert(!!r,`Provider not found: ${e}`,1002,{provider:e}),e){case"bluefin7k":let{Bluefin7kProvider:i}=await import("./bluefin7k-63A5CV3A.mjs").catch(K("bluefin7k"));this.providers.bluefin7k=new i(r,this.options,this.client);break;case"flowx":let{FlowxProvider:s}=await import("./flowx-533PLKYB.mjs").catch(K("flowx"));this.providers.flowx=new s(r,this.client);break;case"cetus":let{CetusProvider:n}=await import("./cetus-HOKHMQSS.mjs").catch(K("cetus"));this.providers.cetus=new n(r,this.options,this.client);break;case"okx":this.providers.okx=new j(r,this.options,this.client);break;default:throw new m(`Provider not supported: ${e}`,1003,{provider:e})}return this.providers[e]}async _simulate(e,t,r){try{if(D(e))return await Z(e,t,r,this.inspector,this.options);if(t.provider==="okx")return await oe(t,this.inspector,r,this.options);throw new m(`Provider not supported: ${e.kind}`,1003,{provider:e.kind})}catch(i){console.warn(i,{provider:e.kind,quote:t.id});return}}async _quote(e,t){return await J(async()=>{let i=await e.quote(t);if(!i)return null;let{expectedAmount:s}=H(i.rawAmountOut,0,this.options.partnerCommissionBps,this.options.tipBps);return i.amountOut=s,i},t.timeout??2e3,`quote for ${e.kind} provider from ${t.coinTypeIn} to ${t.coinTypeOut}`)}async _fastSwap({quote:e,signer:t,useGasCoin:r,signTransaction:i},s){let n=new Ue,a=await this.swap({quote:e,signer:t,tx:n,coinIn:Be({type:e.coinTypeIn,balance:BigInt(e.amountIn),useGasCoin:r})});n.transferObjects([a],t),n.setSenderIfNotSet(t);let c=await n.build({client:this.client}),{signature:p,bytes:d}=await i(Fe(c));return this.client.core.executeTransaction({transaction:$e(d),signatures:[p],signal:s?.signal,include:s?.include})}async quote(e,t){let r={...e,coinTypeIn:ae(e.coinTypeIn),coinTypeOut:ae(e.coinTypeOut)},s=(await Promise.allSettled(Object.entries(this.options.providers).filter(([n,a])=>!a.disabled).map(async([n])=>{let a=await this._getProvider(n);return this._quote(a,r)}))).map(n=>n.status==="fulfilled"?n.value:(console.warn(n.reason),null)).filter(n=>n!==null);if(t){let n=s.map(async a=>{let c=await this._getProvider(a.provider),p=await this._simulate(c,a,t);a.simulatedAmountOut=p?.simulatedAmountOut,a.gasUsed=p?.gasUsed,t?.onSimulated?.({...a})});t.onSimulated||await Promise.all(n)}return s}async swap(e,t){let r=await this._getProvider(e.quote.provider);m.assert(!!r,`Provider not found: ${e.quote.provider}`,1002,{provider:e.quote.provider}),m.assert(D(r),`Provider does not support swap: ${r.kind}, use fastSwap instead`,1007,{provider:r.kind}),m.assert(e.signer&&!S(e.signer),"Invalid signer address",1006,{signer:e.signer});let i=await r.swap(e);return e.tx.add(v(e.quote,i,t??this.options.slippageBps??100,this.options.tipBps,this.options.partner,this.options.partnerCommissionBps)),e.tx.setSenderIfNotSet(e.signer),i}async fastSwap(e,t){m.assert(e.signer&&!S(e.signer),"Invalid signer address",1006,{signer:e.signer});let r=await this._getProvider(e.quote.provider);if(D(r))return this._fastSwap(e,t);if(G(r))return this.client.core.waitForTransaction({digest:await r.fastSwap(e),signal:t?.signal,include:t?.include});throw new m(`Provider not supported: ${r.kind}`,1003,{provider:r.kind})}updateMetaAgOptions(e){if(Object.keys(e).length===0)return;this.options.slippageBps=e.slippageBps??this.options.slippageBps,this.options.partner=e.partner??this.options.partner,this.options.partnerCommissionBps=e.partnerCommissionBps??this.options.partnerCommissionBps,this.options.tipBps=e.tipBps??this.options.tipBps;let t=!!(e.client&&e.client!==this.client),r=!!(e.hermesApi&&e.hermesApi!==this.options.hermesApi);t&&(this.client=e.client,this.options.client=this.client,this.inspector=new x(this.client)),r&&(this.options.hermesApi=e.hermesApi),(t||r)&&(this.providers={});for(let[i,s]of Object.entries(e.providers||{}))this.options.providers[i]={...s,...this.options.providers[i]},delete this.providers[i]}},K=o=>e=>{let t={cetus:"@cetusprotocol/aggregator-sdk",flowx:"@flowx-finance/sdk",bluefin7k:"@bluefin-exchange/bluefin7k-aggregator-sdk",okx:""};throw console.warn(`Please install ${t[o]} to use ${o} provider`),e};async function g(o,e){let t=new Headers(e?.headers),r={...e,headers:t};return fetch(o,r)}var L={MAIN:"https://api.7k.ag",LO_DCA:"https://lod-dca.7k.ag",PRICES:"https://lp-pro-api.7k.ag/price",STATISTIC:"https://statistic.7k.ag"};function B(o){return o===b?k:o}var Ke=(o,e)=>{let t=[];for(let r=0;r<o.length;r+=e)t.push(o.slice(r,r+e));return t},ce=500,Ve=100;function We(){return Math.floor(Date.now()/1e3).toString()}async function V(o){try{let e=B(o);return(await W([e]))[e]||0}catch{return 0}}async function W(o){try{if(o.length===0)return{};let e=o.slice(0,ce).map(B),t=Ke(e,Ve),r=We(),s=(await Promise.all(t.map(async a=>{let c={timestamp:r,token_ids:a},p=await g(`${L.PRICES}/prices/batch`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)});if(!p.ok)throw new Error(`Price API returned status ${p.status}`);return await p.json()}))).reduce((a,c)=>(c.forEach(p=>{a[p.token_id]=p.price}),a),{});return e.reduce((a,c)=>(a[c]=s[c]||0,a),{})}catch{return o.slice(0,ce).reduce((t,r)=>(t[B(r)]=0,t),{})}}async function pe(){return await V(k)}import{coinWithBalance as Xe,Transaction as ze}from"@mysten/sui/transactions";var U="0xffc7f420b481ed7a012b42e125fd7e5716b5673759cf4629e5fcfebce970a72d",hr=BigInt("1000000000000"),yr=BigInt("10000"),X="0x0ef0f805710cf53c10f29c4f73e1144a662747e1839689a846e2520cae122adc",w=`${X}::limit_order`,$=`${X}::dca_order`,Cr=`${X}::config`,Tr=BigInt("18446744073709551615"),f=`${L.LO_DCA}/api`;async function ue({accountAddress:o,payCoinType:e,targetCoinType:t,payCoinAmount:r,rate:i,slippage:s,expireTs:n,devInspect:a}){let c=new ze,p=c.add(Xe({type:e,balance:r,useGasCoin:!a}));return c.moveCall({target:`${w}::place_limit_order`,arguments:[c.object(U),p,c.pure.u64(i),c.pure.u64(s),c.pure.u64(n),c.object.clock()],typeArguments:[e,t]}),c.setSenderIfNotSet(o),c}import{Transaction as Ge}from"@mysten/sui/transactions";async function le({orderId:o,payCoinType:e,targetCoinType:t}){let r=new Ge;return r.moveCall({target:`${w}::cancel_limit_order`,typeArguments:[e,t],arguments:[r.object(o),r.object.clock()]}),r}import{Transaction as He}from"@mysten/sui/transactions";async function me({orderId:o,payCoinType:e,targetCoinType:t}){let r=new He;return r.moveCall({target:`${w}::claim_expired_order`,typeArguments:[e,t],arguments:[r.object(o),r.object.clock()]}),r}function O(o){let e="";return Object.entries(o).forEach(([t,r])=>{if(Array.isArray(r))for(let i of r)e+=e?`&${t}=${i}`:`${t}=${i}`;else r!==void 0&&(e+=e?`&${t}=${r}`:`${t}=${r}`)}),e}async function de({owner:o,offset:e=0,limit:t=10,tokenPair:r}){let s=O({owner:o,statuses:["ACTIVE","EXPIRED"],offset:e,limit:t,tokenPair:r}),n=await g(`${f}/limit-orders?${s}`);if(!n.ok)throw new Error("Failed to fetch open limit orders");return await n.json()}async function ge({owner:o,offset:e=0,limit:t=10,tokenPair:r}){let s=O({owner:o,statuses:["CLOSED"],offset:e,limit:t,tokenPair:r}),n=await g(`${f}/limit-orders?${s}`);if(!n.ok)throw new Error("Failed to fetch closed limit orders");return await n.json()}import{coinWithBalance as Ye,Transaction as Ze}from"@mysten/sui/transactions";async function fe({payCoinType:o,targetCoinType:e,payCoinAmountEach:t,numOrders:r,interval:i,slippage:s,minRate:n,maxRate:a}){let c=new Ze,p=[];for(let I=0;I<r;I++){let Te=Ye({type:o,balance:t});p.push(Te)}let d=c.makeMoveVec({elements:p});return c.moveCall({target:`${$}::place_dca_order`,arguments:[c.object(U),d,c.pure.u64(i),c.pure.u64(s),c.pure.u64(n),c.pure.u64(a),c.object.clock()],typeArguments:[o,e]}),c}import{Transaction as Je}from"@mysten/sui/transactions";async function Oe({orderId:o,payCoinType:e,targetCoinType:t}){let r=new Je;return r.moveCall({target:`${$}::cancel_dca_order`,arguments:[r.object(o),r.object.clock()],typeArguments:[e,t]}),r}async function he({owner:o,offset:e=0,limit:t=10,tokenPair:r}){let s=O({owner:o,statuses:["ACTIVE","EXPIRED"],offset:e,limit:t,tokenPair:r}),n=await g(`${f}/dca-orders?${s}`);if(!n.ok)throw new Error("Failed to fetch open dca orders");return await n.json()}async function ye({owner:o,offset:e=0,limit:t=10,tokenPair:r}){let s=O({owner:o,statuses:["SUCCESS"],offset:e,limit:t,orderType:"DCA",tokenPair:r}),n=await g(`${f}/order-executions?${s}`);if(!n.ok)throw new Error("Failed to fetch closed dca orders");return await n.json()}async function Ce({owner:o,orderId:e,offset:t=0,limit:r=10}){let s=O({owner:o,orderId:e,statuses:["SUCCESS"],offset:t,limit:r,orderType:"DCA"}),n=await g(`${f}/order-executions?${s}`);if(!n.ok)throw new Error("Failed to fetch dca order executions");return await n.json()}var Tn={getTokenPrice:V,getTokenPrices:W,getSuiPrice:pe,placeLimitOrder:ue,getOpenLimitOrders:de,cancelLimitOrder:le,claimExpiredLimitOrder:me,getClosedLimitOrders:ge,placeDcaOrder:fe,getOpenDcaOrders:he,cancelDcaOrder:Oe,getClosedDcaOrders:ye,getDcaOrderExecutions:Ce,MetaAg:R};export{z as EProvider,R as MetaAg,Oe as cancelDcaOrder,le as cancelLimitOrder,me as claimExpiredLimitOrder,Tn as default,ye as getClosedDcaOrders,ge as getClosedLimitOrders,Ce as getDcaOrderExecutions,he as getOpenDcaOrders,de as getOpenLimitOrders,pe as getSuiPrice,V as getTokenPrice,W as getTokenPrices,D as isAggregatorProvider,G as isSwapAPIProvider,fe as placeDcaOrder,ue as placeLimitOrder};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|