@7kprotocol/sdk-ts 5.0.0-beta.1 → 5.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{bluefin7k-63A5CV3A.mjs → bluefin7k-555A3TO5.mjs} +2 -2
- package/dist/{bluefin7k-MP3A4MG4.js → bluefin7k-ZCZGF5WO.js} +2 -2
- package/dist/{bluefin7k-MP3A4MG4.js.map → bluefin7k-ZCZGF5WO.js.map} +1 -1
- package/dist/cetus-N2YTKDL7.mjs +2 -0
- package/dist/cetus-N2YTKDL7.mjs.map +1 -0
- package/dist/cetus-PDGDXSRR.js +2 -0
- package/dist/cetus-PDGDXSRR.js.map +1 -0
- package/dist/{chunk-E5KM5OVW.js → chunk-CH5S2TCQ.js} +2 -2
- package/dist/chunk-CH5S2TCQ.js.map +1 -0
- package/dist/{chunk-CYI4MM5C.mjs → chunk-GXWST4PS.mjs} +2 -2
- package/dist/chunk-GXWST4PS.mjs.map +1 -0
- package/dist/flowx-NEIM34AB.js +2 -0
- package/dist/flowx-NEIM34AB.js.map +1 -0
- package/dist/flowx-WHLIVV6Q.mjs +2 -0
- package/dist/flowx-WHLIVV6Q.mjs.map +1 -0
- package/dist/index.d.mts +23 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/cetus-HOKHMQSS.mjs +0 -2
- package/dist/cetus-HOKHMQSS.mjs.map +0 -1
- package/dist/cetus-MUHFO44Y.js +0 -2
- package/dist/cetus-MUHFO44Y.js.map +0 -1
- package/dist/chunk-CYI4MM5C.mjs.map +0 -1
- package/dist/chunk-E5KM5OVW.js.map +0 -1
- package/dist/flowx-FTPJ3RYF.mjs +0 -2
- package/dist/flowx-FTPJ3RYF.mjs.map +0 -1
- package/dist/flowx-RRIX3SC4.js +0 -2
- package/dist/flowx-RRIX3SC4.js.map +0 -1
- /package/dist/{bluefin7k-63A5CV3A.mjs.map → bluefin7k-555A3TO5.mjs.map} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as r,h as i,j as n,k as a}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=bluefin7k-
|
|
1
|
+
import{a as r,h as i,j as n,k as a}from"./chunk-GXWST4PS.mjs";import{buildTx as d,Config as s,getQuote as c}from"@bluefin-exchange/bluefin7k-aggregator-sdk";import{v4 as l}from"uuid";var p=class{constructor(o,t,e){this.options=o;this.metaOptions=t;r(this,"kind","bluefin7k");o.apiKey&&s.setApiKey(o.apiKey),s.setSuiClient(e)}async quote(o){let t=await c({tokenIn:o.coinTypeIn,tokenOut:o.coinTypeOut,amountIn:o.amountIn,sources:this.options.sources,excludedPools:this.options.excludedPools,targetPools:this.options.targetPools});return n.assert(!!t,"No quote found",1005,{provider:this.kind}),{id:l(),provider:"bluefin7k",quote:t,amountIn:t.swapAmountWithDecimal,rawAmountOut:t.returnAmountWithDecimal,amountOut:t.returnAmountWithDecimal,coinTypeIn:o.coinTypeIn,coinTypeOut:o.coinTypeOut}}async swap({quote:o,signer:t,tx:e,coinIn:u}){a(o,"bluefin7k");let{coinOut:m}=await d({quoteResponse:o.quote,accountAddress:t,commission:{commissionBps:0,partner:i},slippage:1,extendTx:{tx:e,coinIn:u}});return m}};export{p as Bluefin7kProvider};
|
|
2
|
+
//# sourceMappingURL=bluefin7k-555A3TO5.mjs.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var
|
|
2
|
-
//# sourceMappingURL=bluefin7k-
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkCH5S2TCQjs = require('./chunk-CH5S2TCQ.js');var _bluefin7kaggregatorsdk = require('@bluefin-exchange/bluefin7k-aggregator-sdk');var _uuid = require('uuid');var p=class{constructor(o,t,e){this.options=o;this.metaOptions=t;_chunkCH5S2TCQjs.a.call(void 0, this,"kind","bluefin7k");o.apiKey&&_bluefin7kaggregatorsdk.Config.setApiKey(o.apiKey),_bluefin7kaggregatorsdk.Config.setSuiClient(e)}async quote(o){let t=await _bluefin7kaggregatorsdk.getQuote.call(void 0, {tokenIn:o.coinTypeIn,tokenOut:o.coinTypeOut,amountIn:o.amountIn,sources:this.options.sources,excludedPools:this.options.excludedPools,targetPools:this.options.targetPools});return _chunkCH5S2TCQjs.j.assert(!!t,"No quote found",1005,{provider:this.kind}),{id:_uuid.v4.call(void 0, ),provider:"bluefin7k",quote:t,amountIn:t.swapAmountWithDecimal,rawAmountOut:t.returnAmountWithDecimal,amountOut:t.returnAmountWithDecimal,coinTypeIn:o.coinTypeIn,coinTypeOut:o.coinTypeOut}}async swap({quote:o,signer:t,tx:e,coinIn:u}){_chunkCH5S2TCQjs.k.call(void 0, o,"bluefin7k");let{coinOut:m}=await _bluefin7kaggregatorsdk.buildTx.call(void 0, {quoteResponse:o.quote,accountAddress:t,commission:{commissionBps:0,partner:_chunkCH5S2TCQjs.h},slippage:1,extendTx:{tx:e,coinIn:u}});return m}};exports.Bluefin7kProvider = p;
|
|
2
|
+
//# sourceMappingURL=bluefin7k-ZCZGF5WO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/otis/Documents/7k-ts-sdk/dist/bluefin7k-
|
|
1
|
+
{"version":3,"sources":["/Users/otis/Documents/7k-ts-sdk/dist/bluefin7k-ZCZGF5WO.js","../src/features/metaAg/providers/bluefin7k.ts"],"names":["Bluefin7kProvider","options","metaOptions","client","__publicField","Config","quoteOptions","quote","getQuote","MetaAgError","v4","signer","tx","coinIn","assertQuoteProvider","coinOut","buildTx","_7K_PARTNER_ADDRESS"],"mappings":"AAAA,+HAA4D,oFCIrD,4BAEY,IAeNA,CAAAA,CAAN,KAAqE,CAE1E,WAAA,CACmBC,CAAAA,CACAC,CAAAA,CACjBC,CAAAA,CACA,CAHiB,IAAA,CAAA,OAAA,CAAAF,CAAAA,CACA,IAAA,CAAA,WAAA,CAAAC,CAAAA,CAHnBE,gCAAAA,IAAA,CAAS,MAAA,CAAA,WAAA,CAAA,CAMHH,CAAAA,CAAQ,MAAA,EAAQI,8BAAAA,CAAO,SAAA,CAAUJ,CAAAA,CAAQ,MAAM,CAAA,CACnDI,8BAAAA,CAAO,YAAA,CAAaF,CAAM,CAC5B,CAEA,MAAM,KAAA,CAAMG,CAAAA,CAAoD,CAC9D,IAAMC,CAAAA,CAAQ,MAAMC,8CAAAA,CAClB,OAAA,CAASF,CAAAA,CAAa,UAAA,CACtB,QAAA,CAAUA,CAAAA,CAAa,WAAA,CACvB,QAAA,CAAUA,CAAAA,CAAa,QAAA,CACvB,OAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,OAAA,CACtB,aAAA,CAAe,IAAA,CAAK,OAAA,CAAQ,aAAA,CAC5B,WAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,WAC5B,CAAC,CAAA,CACD,OAAAG,kBAAAA,CAAY,MAAA,CACV,CAAC,CAACF,CAAAA,CACF,gBAAA,CAAA,IAAA,CAEA,CAAE,QAAA,CAAU,IAAA,CAAK,IAAK,CACxB,CAAA,CACO,CACL,EAAA,CAAIG,sBAAAA,CAAG,CACP,QAAA,CAAA,WAAA,CACA,KAAA,CAAAH,CAAAA,CACA,QAAA,CAAUA,CAAAA,CAAM,qBAAA,CAChB,YAAA,CAAcA,CAAAA,CAAM,uBAAA,CACpB,SAAA,CAAWA,CAAAA,CAAM,uBAAA,CACjB,UAAA,CAAYD,CAAAA,CAAa,UAAA,CACzB,WAAA,CAAaA,CAAAA,CAAa,WAC5B,CACF,CAEA,MAAM,IAAA,CAAK,CAAE,KAAA,CAAAC,CAAAA,CAAO,MAAA,CAAAI,CAAAA,CAAQ,EAAA,CAAAC,CAAAA,CAAI,MAAA,CAAAC,CAAO,CAAA,CAAoB,CACzDC,gCAAAA,CAAoBP,CAAAA,WAA0B,CAAA,CAC9C,GAAM,CAAE,OAAA,CAAAQ,CAAQ,CAAA,CAAI,MAAMC,6CAAAA,CACxB,aAAA,CAAeT,CAAAA,CAAM,KAAA,CACrB,cAAA,CAAgBI,CAAAA,CAChB,UAAA,CAAY,CACV,aAAA,CAAe,CAAA,CACf,OAAA,CAASM,kBACX,CAAA,CACA,QAAA,CAAU,CAAA,CACV,QAAA,CAAU,CACR,EAAA,CAAAL,CAAAA,CACA,MAAA,CAAAC,CACF,CACF,CAAC,CAAA,CACD,OAAOE,CACT,CACF,CAAA,CAAA,8BAAA","file":"/Users/otis/Documents/7k-ts-sdk/dist/bluefin7k-ZCZGF5WO.js","sourcesContent":[null,"import {\n buildTx,\n Config,\n getQuote,\n} from \"@bluefin-exchange/bluefin7k-aggregator-sdk\";\nimport { ClientWithCoreApi } from \"@mysten/sui/client\";\nimport { v4 } from \"uuid\";\nimport { _7K_PARTNER_ADDRESS } from \"../../../constants/_7k\";\nimport {\n AggregatorProvider,\n Bluefin7kProviderOptions,\n EProvider,\n MetaAgOptions,\n MetaQuote,\n MetaQuoteOptions,\n MetaSwapOptions,\n QuoteProvider,\n} from \"../../../types/metaAg\";\nimport { assertQuoteProvider } from \"../common\";\nimport { MetaAgError, MetaAgErrorCode } from \"../error\";\n\nexport class Bluefin7kProvider implements QuoteProvider, AggregatorProvider {\n readonly kind = EProvider.BLUEFIN7K;\n constructor(\n private readonly options: Bluefin7kProviderOptions,\n private readonly metaOptions: Required<MetaAgOptions>,\n client: ClientWithCoreApi,\n ) {\n if (options.apiKey) Config.setApiKey(options.apiKey);\n Config.setSuiClient(client);\n }\n\n async quote(quoteOptions: MetaQuoteOptions): Promise<MetaQuote> {\n const quote = await getQuote({\n tokenIn: quoteOptions.coinTypeIn,\n tokenOut: quoteOptions.coinTypeOut,\n amountIn: quoteOptions.amountIn,\n sources: this.options.sources,\n excludedPools: this.options.excludedPools,\n targetPools: this.options.targetPools,\n });\n MetaAgError.assert(\n !!quote,\n \"No quote found\",\n MetaAgErrorCode.QUOTE_NOT_FOUND,\n { provider: this.kind },\n );\n return {\n id: v4(),\n provider: EProvider.BLUEFIN7K,\n quote,\n amountIn: quote.swapAmountWithDecimal,\n rawAmountOut: quote.returnAmountWithDecimal,\n amountOut: quote.returnAmountWithDecimal,\n coinTypeIn: quoteOptions.coinTypeIn,\n coinTypeOut: quoteOptions.coinTypeOut,\n };\n }\n\n async swap({ quote, signer, tx, coinIn }: MetaSwapOptions) {\n assertQuoteProvider(quote, EProvider.BLUEFIN7K);\n const { coinOut } = await buildTx({\n quoteResponse: quote.quote,\n accountAddress: signer,\n commission: {\n commissionBps: 0,\n partner: _7K_PARTNER_ADDRESS,\n },\n slippage: 1,\n extendTx: {\n tx,\n coinIn,\n },\n });\n return coinOut!;\n }\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as o,h as i,j as r,k as n}from"./chunk-GXWST4PS.mjs";import{AggregatorClient as u,Env as l}from"@cetusprotocol/aggregator-sdk";import{v4 as m}from"uuid";var s=class{constructor(t,e,a){this.options=t;o(this,"kind","cetus");o(this,"cetusClient");let p=t.client??a;this.cetusClient=new u({apiKey:t.apiKey,client:p,endpoint:t.api,env:l.Mainnet,pythUrls:e.hermesApi?[e.hermesApi]:[],overlayFeeRate:0,overlayFeeReceiver:i})}async quote(t){let e=await this.cetusClient.findRouters({amount:t.amountIn,byAmountIn:!0,from:t.coinTypeIn,target:t.coinTypeOut,providers:this.options.sources,splitCount:this.options.splitCount,splitAlgorithm:this.options.splitAlgorithm,splitFactor:this.options.splitFactor,depth:this.options.depth,liquidityChanges:this.options.liquidityChanges});return r.assert(!!e,"No quote found",1005,{provider:this.kind}),{id:m(),provider:"cetus",quote:e,amountIn:e.amountIn.toString()||"0",rawAmountOut:e.amountOut.toString()||"0",amountOut:e.amountOut.toString()||"0",coinTypeIn:t.coinTypeIn,coinTypeOut:t.coinTypeOut}}async swap(t){return n(t.quote,"cetus"),await this.cetusClient.routerSwap({inputCoin:t.coinIn,router:t.quote.quote,slippage:1,txb:t.tx})}};export{s as CetusProvider};
|
|
2
|
+
//# sourceMappingURL=cetus-N2YTKDL7.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/features/metaAg/providers/cetus.ts"],"sourcesContent":["import { AggregatorClient, Env } from \"@cetusprotocol/aggregator-sdk\";\nimport { ClientWithCoreApi } from \"@mysten/sui/client\";\nimport { SuiJsonRpcClient } from \"@mysten/sui/jsonRpc\";\nimport { v4 } from \"uuid\";\nimport { _7K_PARTNER_ADDRESS } from \"../../../constants/_7k\";\nimport {\n AggregatorProvider,\n CetusProviderOptions,\n EProvider,\n MetaAgOptions,\n MetaQuote,\n MetaQuoteOptions,\n MetaSwapOptions,\n QuoteProvider,\n} from \"../../../types/metaAg\";\nimport { assertQuoteProvider } from \"../common\";\nimport { MetaAgError, MetaAgErrorCode } from \"../error\";\n\n/**\n * Cetus 1.5.4 types its internal client as `SuiJsonRpcClient` and exercises\n * legacy JSON-RPC methods (`getDynamicFieldObject`, `getCoins`,\n * `getOwnedObjects`, `devInspectTransactionBlock`) on Pyth-priced and\n * DeepBookV3 routes. Caller must supply a `SuiJsonRpcClient` (via\n * `CetusProviderOptions.client` or the global `MetaAgOptions.client`) for\n * full coverage. When a future Cetus release widens to `ClientWithCoreApi`,\n * we can narrow this constructor to that type.\n */\nexport class CetusProvider implements QuoteProvider, AggregatorProvider {\n readonly kind = EProvider.CETUS;\n private readonly cetusClient: AggregatorClient;\n constructor(\n private readonly options: CetusProviderOptions,\n metaOptions: MetaAgOptions,\n client: ClientWithCoreApi,\n ) {\n // Resolve to a `SuiJsonRpcClient`-shaped client: per-provider override\n // wins, otherwise cast the global `ClientWithCoreApi` at this single\n // vendor seam. Cetus 1.5.4 doesn't yet accept `ClientWithCoreApi`; when\n // it does, this cast (and the option override) can be dropped.\n const cetusClient =\n options.client ?? (client as unknown as SuiJsonRpcClient);\n this.cetusClient = new AggregatorClient({\n apiKey: options.apiKey,\n client: cetusClient,\n endpoint: options.api,\n env: Env.Mainnet,\n pythUrls: metaOptions.hermesApi ? [metaOptions.hermesApi] : [],\n overlayFeeRate: 0,\n overlayFeeReceiver: _7K_PARTNER_ADDRESS,\n });\n }\n\n async quote(quoteOptions: MetaQuoteOptions): Promise<MetaQuote> {\n const quote = await this.cetusClient.findRouters({\n amount: quoteOptions.amountIn,\n byAmountIn: true,\n from: quoteOptions.coinTypeIn,\n target: quoteOptions.coinTypeOut,\n providers: this.options.sources,\n splitCount: this.options.splitCount,\n splitAlgorithm: this.options.splitAlgorithm,\n splitFactor: this.options.splitFactor,\n depth: this.options.depth,\n liquidityChanges: this.options.liquidityChanges,\n });\n MetaAgError.assert(\n !!quote,\n \"No quote found\",\n MetaAgErrorCode.QUOTE_NOT_FOUND,\n { provider: this.kind },\n );\n return {\n id: v4(),\n provider: EProvider.CETUS,\n quote,\n amountIn: quote.amountIn.toString() || \"0\",\n rawAmountOut: quote.amountOut.toString() || \"0\",\n amountOut: quote.amountOut.toString() || \"0\",\n coinTypeIn: quoteOptions.coinTypeIn,\n coinTypeOut: quoteOptions.coinTypeOut,\n };\n }\n\n async swap(options: MetaSwapOptions) {\n assertQuoteProvider(options.quote, EProvider.CETUS);\n const coinOut = await this.cetusClient.routerSwap({\n inputCoin: options.coinIn,\n router: options.quote.quote,\n slippage: 1,\n txb: options.tx,\n });\n return coinOut;\n }\n}\n"],"mappings":"8DAAA,OAAS,oBAAAA,EAAkB,OAAAC,MAAW,gCAGtC,OAAS,MAAAC,MAAU,OAwBZ,IAAMC,EAAN,KAAiE,CAGtE,YACmBC,EACjBC,EACAC,EACA,CAHiB,aAAAF,EAHnBG,EAAA,KAAS,gBACTA,EAAA,KAAiB,eAUf,IAAMC,EACJJ,EAAQ,QAAWE,EACrB,KAAK,YAAc,IAAIG,EAAiB,CACtC,OAAQL,EAAQ,OAChB,OAAQI,EACR,SAAUJ,EAAQ,IAClB,IAAKM,EAAI,QACT,SAAUL,EAAY,UAAY,CAACA,EAAY,SAAS,EAAI,CAAC,EAC7D,eAAgB,EAChB,mBAAoBM,CACtB,CAAC,CACH,CAEA,MAAM,MAAMC,EAAoD,CAC9D,IAAMC,EAAQ,MAAM,KAAK,YAAY,YAAY,CAC/C,OAAQD,EAAa,SACrB,WAAY,GACZ,KAAMA,EAAa,WACnB,OAAQA,EAAa,YACrB,UAAW,KAAK,QAAQ,QACxB,WAAY,KAAK,QAAQ,WACzB,eAAgB,KAAK,QAAQ,eAC7B,YAAa,KAAK,QAAQ,YAC1B,MAAO,KAAK,QAAQ,MACpB,iBAAkB,KAAK,QAAQ,gBACjC,CAAC,EACD,OAAAE,EAAY,OACV,CAAC,CAACD,EACF,sBAEA,CAAE,SAAU,KAAK,IAAK,CACxB,EACO,CACL,GAAIE,EAAG,EACP,iBACA,MAAAF,EACA,SAAUA,EAAM,SAAS,SAAS,GAAK,IACvC,aAAcA,EAAM,UAAU,SAAS,GAAK,IAC5C,UAAWA,EAAM,UAAU,SAAS,GAAK,IACzC,WAAYD,EAAa,WACzB,YAAaA,EAAa,WAC5B,CACF,CAEA,MAAM,KAAKR,EAA0B,CACnC,OAAAY,EAAoBZ,EAAQ,aAAsB,EAClC,MAAM,KAAK,YAAY,WAAW,CAChD,UAAWA,EAAQ,OACnB,OAAQA,EAAQ,MAAM,MACtB,SAAU,EACV,IAAKA,EAAQ,EACf,CAAC,CAEH,CACF","names":["AggregatorClient","Env","v4","CetusProvider","options","metaOptions","client","__publicField","cetusClient","AggregatorClient","Env","_7K_PARTNER_ADDRESS","quoteOptions","quote","MetaAgError","v4","assertQuoteProvider"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }var _chunkCH5S2TCQjs = require('./chunk-CH5S2TCQ.js');var _aggregatorsdk = require('@cetusprotocol/aggregator-sdk');var _uuid = require('uuid');var s=class{constructor(t,e,a){this.options=t;_chunkCH5S2TCQjs.a.call(void 0, this,"kind","cetus");_chunkCH5S2TCQjs.a.call(void 0, this,"cetusClient");let p=_nullishCoalesce(t.client, () => (a));this.cetusClient=new (0, _aggregatorsdk.AggregatorClient)({apiKey:t.apiKey,client:p,endpoint:t.api,env:_aggregatorsdk.Env.Mainnet,pythUrls:e.hermesApi?[e.hermesApi]:[],overlayFeeRate:0,overlayFeeReceiver:_chunkCH5S2TCQjs.h})}async quote(t){let e=await this.cetusClient.findRouters({amount:t.amountIn,byAmountIn:!0,from:t.coinTypeIn,target:t.coinTypeOut,providers:this.options.sources,splitCount:this.options.splitCount,splitAlgorithm:this.options.splitAlgorithm,splitFactor:this.options.splitFactor,depth:this.options.depth,liquidityChanges:this.options.liquidityChanges});return _chunkCH5S2TCQjs.j.assert(!!e,"No quote found",1005,{provider:this.kind}),{id:_uuid.v4.call(void 0, ),provider:"cetus",quote:e,amountIn:e.amountIn.toString()||"0",rawAmountOut:e.amountOut.toString()||"0",amountOut:e.amountOut.toString()||"0",coinTypeIn:t.coinTypeIn,coinTypeOut:t.coinTypeOut}}async swap(t){return _chunkCH5S2TCQjs.k.call(void 0, t.quote,"cetus"),await this.cetusClient.routerSwap({inputCoin:t.coinIn,router:t.quote.quote,slippage:1,txb:t.tx})}};exports.CetusProvider = s;
|
|
2
|
+
//# sourceMappingURL=cetus-PDGDXSRR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/otis/Documents/7k-ts-sdk/dist/cetus-PDGDXSRR.js","../src/features/metaAg/providers/cetus.ts"],"names":["CetusProvider","options","metaOptions","client","__publicField","cetusClient","AggregatorClient","Env","_7K_PARTNER_ADDRESS","quoteOptions","quote","MetaAgError","v4","assertQuoteProvider"],"mappings":"AAAA,mOAA4D,8DCAtB,4BAGnB,IAwBNA,CAAAA,CAAN,KAAiE,CAGtE,WAAA,CACmBC,CAAAA,CACjBC,CAAAA,CACAC,CAAAA,CACA,CAHiB,IAAA,CAAA,OAAA,CAAAF,CAAAA,CAHnBG,gCAAAA,IAAA,CAAS,MAAA,CAAA,OAAA,CAAA,CACTA,gCAAAA,IAAA,CAAiB,aAAA,CAAA,CAUf,IAAMC,CAAAA,kBACJJ,CAAAA,CAAQ,MAAA,SAAWE,GAAAA,CACrB,IAAA,CAAK,WAAA,CAAc,IAAIG,oCAAAA,CAAiB,CACtC,MAAA,CAAQL,CAAAA,CAAQ,MAAA,CAChB,MAAA,CAAQI,CAAAA,CACR,QAAA,CAAUJ,CAAAA,CAAQ,GAAA,CAClB,GAAA,CAAKM,kBAAAA,CAAI,OAAA,CACT,QAAA,CAAUL,CAAAA,CAAY,SAAA,CAAY,CAACA,CAAAA,CAAY,SAAS,CAAA,CAAI,CAAC,CAAA,CAC7D,cAAA,CAAgB,CAAA,CAChB,kBAAA,CAAoBM,kBACtB,CAAC,CACH,CAEA,MAAM,KAAA,CAAMC,CAAAA,CAAoD,CAC9D,IAAMC,CAAAA,CAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,WAAA,CAAY,CAC/C,MAAA,CAAQD,CAAAA,CAAa,QAAA,CACrB,UAAA,CAAY,CAAA,CAAA,CACZ,IAAA,CAAMA,CAAAA,CAAa,UAAA,CACnB,MAAA,CAAQA,CAAAA,CAAa,WAAA,CACrB,SAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,OAAA,CACxB,UAAA,CAAY,IAAA,CAAK,OAAA,CAAQ,UAAA,CACzB,cAAA,CAAgB,IAAA,CAAK,OAAA,CAAQ,cAAA,CAC7B,WAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,WAAA,CAC1B,KAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CACpB,gBAAA,CAAkB,IAAA,CAAK,OAAA,CAAQ,gBACjC,CAAC,CAAA,CACD,OAAAE,kBAAAA,CAAY,MAAA,CACV,CAAC,CAACD,CAAAA,CACF,gBAAA,CAAA,IAAA,CAEA,CAAE,QAAA,CAAU,IAAA,CAAK,IAAK,CACxB,CAAA,CACO,CACL,EAAA,CAAIE,sBAAAA,CAAG,CACP,QAAA,CAAA,OAAA,CACA,KAAA,CAAAF,CAAAA,CACA,QAAA,CAAUA,CAAAA,CAAM,QAAA,CAAS,QAAA,CAAS,CAAA,EAAK,GAAA,CACvC,YAAA,CAAcA,CAAAA,CAAM,SAAA,CAAU,QAAA,CAAS,CAAA,EAAK,GAAA,CAC5C,SAAA,CAAWA,CAAAA,CAAM,SAAA,CAAU,QAAA,CAAS,CAAA,EAAK,GAAA,CACzC,UAAA,CAAYD,CAAAA,CAAa,UAAA,CACzB,WAAA,CAAaA,CAAAA,CAAa,WAC5B,CACF,CAEA,MAAM,IAAA,CAAKR,CAAAA,CAA0B,CACnC,OAAAY,gCAAAA,CAAoBZ,CAAQ,KAAA,CAAA,OAAsB,CAAA,CAClC,MAAM,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,CAChD,SAAA,CAAWA,CAAAA,CAAQ,MAAA,CACnB,MAAA,CAAQA,CAAAA,CAAQ,KAAA,CAAM,KAAA,CACtB,QAAA,CAAU,CAAA,CACV,GAAA,CAAKA,CAAAA,CAAQ,EACf,CAAC,CAEH,CACF,CAAA,CAAA,0BAAA","file":"/Users/otis/Documents/7k-ts-sdk/dist/cetus-PDGDXSRR.js","sourcesContent":[null,"import { AggregatorClient, Env } from \"@cetusprotocol/aggregator-sdk\";\nimport { ClientWithCoreApi } from \"@mysten/sui/client\";\nimport { SuiJsonRpcClient } from \"@mysten/sui/jsonRpc\";\nimport { v4 } from \"uuid\";\nimport { _7K_PARTNER_ADDRESS } from \"../../../constants/_7k\";\nimport {\n AggregatorProvider,\n CetusProviderOptions,\n EProvider,\n MetaAgOptions,\n MetaQuote,\n MetaQuoteOptions,\n MetaSwapOptions,\n QuoteProvider,\n} from \"../../../types/metaAg\";\nimport { assertQuoteProvider } from \"../common\";\nimport { MetaAgError, MetaAgErrorCode } from \"../error\";\n\n/**\n * Cetus 1.5.4 types its internal client as `SuiJsonRpcClient` and exercises\n * legacy JSON-RPC methods (`getDynamicFieldObject`, `getCoins`,\n * `getOwnedObjects`, `devInspectTransactionBlock`) on Pyth-priced and\n * DeepBookV3 routes. Caller must supply a `SuiJsonRpcClient` (via\n * `CetusProviderOptions.client` or the global `MetaAgOptions.client`) for\n * full coverage. When a future Cetus release widens to `ClientWithCoreApi`,\n * we can narrow this constructor to that type.\n */\nexport class CetusProvider implements QuoteProvider, AggregatorProvider {\n readonly kind = EProvider.CETUS;\n private readonly cetusClient: AggregatorClient;\n constructor(\n private readonly options: CetusProviderOptions,\n metaOptions: MetaAgOptions,\n client: ClientWithCoreApi,\n ) {\n // Resolve to a `SuiJsonRpcClient`-shaped client: per-provider override\n // wins, otherwise cast the global `ClientWithCoreApi` at this single\n // vendor seam. Cetus 1.5.4 doesn't yet accept `ClientWithCoreApi`; when\n // it does, this cast (and the option override) can be dropped.\n const cetusClient =\n options.client ?? (client as unknown as SuiJsonRpcClient);\n this.cetusClient = new AggregatorClient({\n apiKey: options.apiKey,\n client: cetusClient,\n endpoint: options.api,\n env: Env.Mainnet,\n pythUrls: metaOptions.hermesApi ? [metaOptions.hermesApi] : [],\n overlayFeeRate: 0,\n overlayFeeReceiver: _7K_PARTNER_ADDRESS,\n });\n }\n\n async quote(quoteOptions: MetaQuoteOptions): Promise<MetaQuote> {\n const quote = await this.cetusClient.findRouters({\n amount: quoteOptions.amountIn,\n byAmountIn: true,\n from: quoteOptions.coinTypeIn,\n target: quoteOptions.coinTypeOut,\n providers: this.options.sources,\n splitCount: this.options.splitCount,\n splitAlgorithm: this.options.splitAlgorithm,\n splitFactor: this.options.splitFactor,\n depth: this.options.depth,\n liquidityChanges: this.options.liquidityChanges,\n });\n MetaAgError.assert(\n !!quote,\n \"No quote found\",\n MetaAgErrorCode.QUOTE_NOT_FOUND,\n { provider: this.kind },\n );\n return {\n id: v4(),\n provider: EProvider.CETUS,\n quote,\n amountIn: quote.amountIn.toString() || \"0\",\n rawAmountOut: quote.amountOut.toString() || \"0\",\n amountOut: quote.amountOut.toString() || \"0\",\n coinTypeIn: quoteOptions.coinTypeIn,\n coinTypeOut: quoteOptions.coinTypeOut,\n };\n }\n\n async swap(options: MetaSwapOptions) {\n assertQuoteProvider(options.quote, EProvider.CETUS);\n const coinOut = await this.cetusClient.routerSwap({\n inputCoin: options.coinIn,\n router: options.quote.quote,\n slippage: 1,\n txb: options.tx,\n });\n return coinOut;\n }\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); 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 E=Object.defineProperty;var T=e=>{throw TypeError(e)};var A=(e,t,r)=>t in e?E(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var c=(e,t,r)=>A(e,typeof t!="symbol"?t+"":t,r),g=(e,t,r)=>t.has(e)||T("Cannot "+r);var D=(e,t,r)=>(g(e,t,"read from private field"),r?r.call(e):t.get(e)),M= exports.c =(e,t,r)=>t.has(e)?T("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),w= exports.d =(e,t,r,n)=>(g(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r);var f=(o=>(o.BLUEFIN7K="bluefin7k",o.CETUS="cetus",o.FLOWX="flowx",o.OKX="okx",o))(f||{}),U= exports.f =e=>e.kind==="bluefin7k"||e.kind==="cetus"||e.kind==="flowx",R= exports.g =e=>e.kind==="okx";var d="0x17c0b1f7a6ad73f51268f16b8c06c049eecc2f28a270cdd29c06e3d2dea23302",O="0x17c0b1f7a6ad73f51268f16b8c06c049eecc2f28a270cdd29c06e3d2dea23302",m="0x9a8abd32fe5721307ce3b697cf982ee84e9ffbd58d667a4a199f1683c1a3d23c",l="0xbbb3a51877ed9b492f26f4e2181811cfb2bd70c532f6f7621263d122d5e96b56",
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); 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 E=Object.defineProperty;var T=e=>{throw TypeError(e)};var A=(e,t,r)=>t in e?E(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var c=(e,t,r)=>A(e,typeof t!="symbol"?t+"":t,r),g=(e,t,r)=>t.has(e)||T("Cannot "+r);var D=(e,t,r)=>(g(e,t,"read from private field"),r?r.call(e):t.get(e)),M= exports.c =(e,t,r)=>t.has(e)?T("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),w= exports.d =(e,t,r,n)=>(g(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r);var f=(o=>(o.BLUEFIN7K="bluefin7k",o.CETUS="cetus",o.FLOWX="flowx",o.OKX="okx",o))(f||{}),U= exports.f =e=>e.kind==="bluefin7k"||e.kind==="cetus"||e.kind==="flowx",R= exports.g =e=>e.kind==="okx";var d="0x17c0b1f7a6ad73f51268f16b8c06c049eecc2f28a270cdd29c06e3d2dea23302",O="0x17c0b1f7a6ad73f51268f16b8c06c049eecc2f28a270cdd29c06e3d2dea23302",m="0x9a8abd32fe5721307ce3b697cf982ee84e9ffbd58d667a4a199f1683c1a3d23c",l="0xbbb3a51877ed9b492f26f4e2181811cfb2bd70c532f6f7621263d122d5e96b56",C= exports.h ="0x93ead46c1e48a9b62e25b6787f2ea6f75caedabb21726f12431acc4381f5f4c5";var u=class e extends Error{constructor(r,n,o){super(r);c(this,"code");c(this,"details");this.name="MetaAgError",this.code=_nullishCoalesce(n, () => (1e3)),this.details=o}static assert(r,n,o,s){if(!r)throw new e(_nullishCoalesce(n, () => ("Assertion failed")),o,s)}};var _transactions = require('@mysten/sui/transactions');var P=(e,t,r,n=0)=>{if(t>1e4)throw new Error("Slippage must be less than 100%");if(r>1e4)throw new Error("Commission must be less than 100%");if(n>1e4)throw new Error("Tip must be less than 100%");let o=BigInt(e),s=o*BigInt(n||0)/10000n,i=(o-s)*BigInt(r)/10000n,a=o-s-i,p=a*BigInt(1e4-t)/10000n;return{tipAmount:s,minAmount:p,commissionAmount:i,expectedAmount:a.toString(10)}};var _=(e,t="Transaction returned no result")=>{let r=_nullishCoalesce(e.Transaction, () => (e.FailedTransaction));if(!r)throw new u(t,1008,{error:t});return r};function G(e,t){u.assert(e.provider===t,"Invalid quote",1004,{quote:e,expectedProvider:t})}var I=async(e,t,r)=>{let n=await N(()=>t.simulateTransaction({sender:r.sender,transactionBlock:e}),_nullishCoalesce(r.timeout, () => (2e3))),o=_(n,"Simulation failed"),s=o.effects.status;if(!s.success){let a=_nullishCoalesce(s.error.message, () => ("Simulation failed"));throw new u(a,1008,{error:a})}return{simulatedAmountOut:b(_nullishCoalesce(o.events, () => ([]))),gasUsed:o.effects.gasUsed}},q= exports.m =async(e,t,r,n,o)=>{let s=new _transactions.Transaction,i=await e.swap({quote:t,coinIn:_transactions.coinWithBalance.call(void 0, {balance:BigInt(t.amountIn),type:t.coinTypeIn,useGasCoin:!1}),signer:r.sender,tx:s});s.add(x(t,i,1e4,o.tipBps,o.partner,o.partnerCommissionBps)),s.transferObjects([i],r.sender);let a=await I(s,n,r);return{id:t.id,provider:e.kind,...a}},x= exports.n =(e,t,r=100,n=0,o,s=0)=>i=>{let{minAmount:a,expectedAmount:p}=P(e.rawAmountOut,r,s,n);n>0&&i.moveCall({target:`${d}::vault::collect_tip`,typeArguments:[e.coinTypeOut],arguments:[i.object(m),i.object(l),t,i.pure.u64(n)]}),i.moveCall({target:`${d}::settle::settle`,typeArguments:[e.coinTypeIn,e.coinTypeOut],arguments:[i.object(l),i.object(m),i.pure.u64(e.amountIn),t,i.pure.u64(a),i.pure.u64(p),i.pure.option("address",o),i.pure.u64(s),i.pure.u64(0)]})},b=e=>_optionalChain([e, 'access', _2 => _2.filter, 'call', _3 => _3(n=>n.eventType===`${O}::settle::Swap`), 'optionalAccess', _4 => _4.pop, 'call', _5 => _5(), 'optionalAccess', _6 => _6.json, 'optionalAccess', _7 => _7.amount_out]),N= exports.o =async(e,t,r)=>t<=0?e():new Promise((n,o)=>{let s=setTimeout(()=>o(new u(`Timeout ${_nullishCoalesce(r, () => ("operation"))}`,1001,{timeout:t})),t);e().then(n).catch(o).finally(()=>clearTimeout(s))});exports.a = c; exports.b = D; exports.c = M; exports.d = w; exports.e = f; exports.f = U; exports.g = R; exports.h = C; exports.i = P; exports.j = u; exports.k = G; exports.l = I; exports.m = q; exports.n = x; exports.o = N;
|
|
2
|
+
//# sourceMappingURL=chunk-CH5S2TCQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/otis/Documents/7k-ts-sdk/dist/chunk-CH5S2TCQ.js","../src/types/metaAg.ts","../src/constants/_7k.ts","../src/features/metaAg/error.ts","../src/features/metaAg/common.ts","../src/utils/swap.ts"],"names":["EProvider","isAggregatorProvider","provider","isSwapAPIProvider","_7K_META_PUBLISHED_AT","_7K_META_PACKAGE_ID","_7K_META_VAULT","_7K_META_CONFIG","_7K_PARTNER_ADDRESS","MetaAgError","_MetaAgError","message","code","details","__publicField","condition","getExpectedReturn","returnAmount","slippageBps","commissionBps","tipBps","returnAmountWithDecimal","tipAmountWithDecimal","commissionAmountWithDecimal","expectedReturnWithDecimal","minAmountWithDecimal","unwrapTxResult","res","msg","inner","assertQuoteProvider","quote","expected","simulateSwapTx","tx","inspector","simulation","timeout","result","status","errorMessage","extractAmountOutWrapper","simulateAggregator","options","Transaction","coinOut","coinWithBalance","metaSettle","partner","minAmount","expectedAmount"],"mappings":"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","file":"/Users/otis/Documents/7k-ts-sdk/dist/chunk-CH5S2TCQ.js","sourcesContent":[null,"import type {\n QuoteResponse,\n SourceDex,\n} from \"@bluefin-exchange/bluefin7k-aggregator-sdk\";\nimport type {\n PreSwapLpChangeParams,\n RouterDataV3,\n} from \"@cetusprotocol/aggregator-sdk\";\nimport type { AggregatorQuoter, Protocol } from \"@flowx-finance/sdk\";\nimport { ClientWithCoreApi, SuiClientTypes } from \"@mysten/sui/client\";\nimport { SignatureWithBytes } from \"@mysten/sui/cryptography\";\nimport { SuiGrpcClient } from \"@mysten/sui/grpc\";\nimport { SuiJsonRpcClient } from \"@mysten/sui/jsonRpc\";\nimport type {\n Transaction,\n TransactionObjectArgument,\n} from \"@mysten/sui/transactions\";\nimport { OkxSwapResponseData } from \"./okx\";\n\nexport enum EProvider {\n BLUEFIN7K = \"bluefin7k\",\n CETUS = \"cetus\",\n FLOWX = \"flowx\",\n OKX = \"okx\",\n}\ntype ProviderBaseOptions = {\n api?: string;\n apiKey?: string;\n disabled?: boolean;\n};\nexport type Bluefin7kProviderOptions = ProviderBaseOptions & {\n sources?: SourceDex[];\n excludedPools?: string[];\n targetPools?: string[];\n};\nexport type FlowxProviderOptions = ProviderBaseOptions & {\n sources?: Protocol[];\n excludePools?: string[];\n excludeSources?: Protocol[];\n maxHops?: number;\n splitDistributionPercent?: number;\n /**\n * Per-provider client override for FlowX. FlowX 2.0.3's `Trade.swap`\n * invokes native methods on `SuiGrpcClient` (`getBalance`,\n * `getDynamicField`, `getObject`, etc.) — it does not yet accept\n * `ClientWithCoreApi`. When supplied, this client is used for the FlowX\n * swap path; otherwise the global `MetaAgOptions.client` is cast to\n * `SuiGrpcClient` at the boundary. Once FlowX widens its types to\n * `ClientWithCoreApi`, this override can be removed.\n */\n client?: SuiGrpcClient;\n};\nexport type CetusProviderOptions = ProviderBaseOptions & {\n sources?: string[];\n splitCount?: number;\n splitAlgorithm?: string;\n splitFactor?: number;\n depth?: number;\n liquidityChanges?: PreSwapLpChangeParams[];\n /**\n * Per-provider client override for Cetus. Cetus 1.5.4's `AggregatorClient`\n * requires `SuiJsonRpcClient` for full coverage — legacy JSON-RPC methods\n * (`getDynamicFieldObject`, `getCoins`, `getOwnedObjects`,\n * `devInspectTransactionBlock`) are called on Pyth-priced and DeepBookV3\n * routes. When supplied, this client is used for the Cetus swap path;\n * otherwise the global `MetaAgOptions.client` is cast to `SuiJsonRpcClient`\n * at the boundary. Once Cetus widens its types to `ClientWithCoreApi`,\n * this override can be removed.\n */\n client?: SuiJsonRpcClient;\n};\nexport type OkxProviderOptions = Required<Omit<ProviderBaseOptions, \"api\">> & {\n api?: string;\n secretKey: string;\n apiPassphrase: string;\n projectId: string;\n};\nexport interface MetaAgOptions {\n /**If not specified, all providers will be used */\n providers?: {\n [EProvider.BLUEFIN7K]?: Bluefin7kProviderOptions;\n [EProvider.FLOWX]?: FlowxProviderOptions;\n [EProvider.CETUS]?: CetusProviderOptions;\n [EProvider.OKX]?: OkxProviderOptions;\n };\n /**\n * Sui client to use for on-chain reads, simulation, and execution. Accepts\n * any v2 `ClientWithCoreApi` implementation (`SuiGrpcClient`,\n * `SuiGraphQLClient`, `SuiJsonRpcClient`, or a custom transport). If not\n * specified, a default `SuiGrpcClient` against Sui mainnet is constructed.\n *\n * @warning **Cetus provider compatibility**: `@cetusprotocol/aggregator-sdk`\n * is **only fully compatible with `SuiJsonRpcClient`**. It calls legacy\n * JSON-RPC-only methods (`getDynamicFieldObject`, `getCoins`,\n * `getOwnedObjects`, `devInspectTransactionBlock`) for specific routes:\n *\n * - Pyth-priced routes (uses `getDynamicFieldObject` to resolve price\n * feeds in `routerSwap`).\n * - DeepBookV3 routes (uses `getCoins` for coin merging and\n * `getOwnedObjects` to mint/find an account cap).\n *\n * Passing a `SuiGrpcClient` / `SuiGraphQLClient` will work for plain\n * `findRouters + routerSwap` routes but **will throw at runtime** for the\n * cases above. If you need full Cetus coverage, pass a `SuiJsonRpcClient`\n * here (or disable the Cetus provider, or update to the latest cetus sdk that fully compatible with any sui client).\n */\n client?: ClientWithCoreApi;\n /**Hermes Api url, if not specified, the default hermes api url will be used */\n hermesApi?: string;\n /**Address to receive commission, if not specified, the commission will not be used */\n partner?: string;\n /**@default 0 */\n partnerCommissionBps?: number;\n /**@default 100 */\n slippageBps?: number;\n /**\n * Tip to support 7k\n * @default 0 */\n tipBps?: number;\n}\nexport interface MetaQuoteOptions {\n coinTypeIn: string;\n coinTypeOut: string;\n amountIn: string;\n /** Required for api-tx providers (ie: Okx) */\n signer?: string;\n /**\n * Timeout for quote operation in milliseconds\n * @default 2000ms\n */\n timeout?: number;\n}\nexport interface MetaSimulationOptions {\n sender: string;\n /**\n * Timeout for simulation operation in milliseconds\n * @default 2000ms\n */\n timeout?: number;\n /** If specify, defer the simulation that could reduce the time to display quote result, you must update the quote via the id on callback\n * else await all quote and simulation before return\n */\n onSimulated?: (payload: MetaQuote) => void;\n}\nexport interface MetaFastSwapOptions {\n /** Quote object from the quote operation */\n quote: MetaQuote;\n /** Signer address (owner of `coinIn`) */\n signer: string;\n /** If true, use the gas coin for the swap\n * @default true */\n useGasCoin?: boolean;\n /**\n * Sign the transaction bytes\n * @param txBytes - base64 transaction bytes\n * @returns - signature with bytes\n */\n signTransaction: (txBytes: string) => Promise<SignatureWithBytes>;\n}\nexport interface MetaSwapOptions {\n /** Quote object from the quote operation */\n quote: MetaQuote;\n /** Signer address (owner of `coinIn`) */\n signer: string;\n /** Transaction object to add the swap operation */\n tx: Transaction;\n /**\n * Coin object used for the swap, must be consumed completely, no `coinIn` left, user must pass the coinIn object with the balance required for the swap - ie in quote `amountIn`\n * @warning `coinIn` value must match the quote `amountIn` */\n coinIn: TransactionObjectArgument;\n}\n\nexport type FlowxQuoteResponse = Awaited<\n ReturnType<AggregatorQuoter[\"getRoutes\"]>\n>;\nexport type MetaQuote = (\n | {\n provider: EProvider.BLUEFIN7K;\n quote: QuoteResponse;\n }\n | {\n provider: EProvider.CETUS;\n quote: RouterDataV3;\n }\n | {\n provider: EProvider.FLOWX;\n quote: FlowxQuoteResponse;\n }\n | {\n provider: EProvider.OKX;\n quote: OkxSwapResponseData;\n }\n) & {\n /** uuid to keep track the quote result, used to apply simulation result on quote on callback `onSimulated`*/\n id: string;\n /** coin type: ie 0x2::sui::SUI */\n coinTypeIn: string;\n /** coin type: ie 0x2::sui::SUI */\n coinTypeOut: string;\n /** Amount in as u64 */\n amountIn: string;\n /** Amount out as u64 if there're no commission be applied to the amount out */\n rawAmountOut: string;\n /** Amount as u64 after minus any commission kind */\n amountOut: string;\n /** Simulated amount out if the transaction is executed */\n simulatedAmountOut?: string;\n /** Estimate gas consumption if the transaction is executed */\n gasUsed?: SuiClientTypes.GasCostSummary;\n};\nexport interface QuoteProvider {\n readonly kind: EProvider;\n quote(_quoteOptions: MetaQuoteOptions): Promise<MetaQuote | null>;\n}\n\nexport interface SwapAPIProvider extends QuoteProvider {\n readonly kind: EProvider.OKX;\n fastSwap(options: MetaFastSwapOptions): Promise<string>;\n}\n\nexport interface AggregatorProvider extends QuoteProvider {\n readonly kind: EProvider.BLUEFIN7K | EProvider.CETUS | EProvider.FLOWX;\n swap(options: MetaSwapOptions): Promise<TransactionObjectArgument>;\n}\n\nexport const isAggregatorProvider = (\n provider: QuoteProvider,\n): provider is AggregatorProvider =>\n provider.kind === EProvider.BLUEFIN7K ||\n provider.kind === EProvider.CETUS ||\n provider.kind === EProvider.FLOWX;\n\nexport const isSwapAPIProvider = (\n provider: QuoteProvider,\n): provider is SwapAPIProvider => provider.kind === EProvider.OKX;\n","// export const _7K_PACKAGE_ID =\n// \"0x62412b7268c35f3808336aee57a52836501f40b8ba5d936f8ad275e672befd04\";\n// //legacy V4: \"0xe8f996ea6ff38c557c253d3b93cfe2ebf393816487266786371aa4532a9229f2\";\n// //legacy V3: \"0x7ea6e27ad7af6f3b8671d59df1aaebd7c03dddab893e52a714227b2f4fe91519\";\n// //legacy V2: \"0xa13447019cd982d6bef91cf7b46ad384a52583b1dfc2bdecf31ef0c4bd787a0f\";\n// //legacy V1: \"0xd48e7cdc9e92bec69ce3baa75578010458a0c5b2733d661a84971e8cef6806bc\";\n// export const _7K_CONFIG =\n// \"0x47442a93f7727d188ba7cb71031170d1786af70013cb7ad5115f3fe877ff0c54\";\n// //legacy v3: \"0x0f8fc23dbcc9362b72c7a4c5aa53fcefa02ebfbb83a812c8c262ccd2c076d9ee\";\n\n// export const _7K_VAULT =\n// \"0x442ad50389ed5cda6f7a6f5a7ae6361a4c05ef1d9fb2e54fbba5a268d690bfe6\";\n// //legacy v3: \"0x39a3c55742c0e011b6f65548e73cf589e1ae5e82dbfab449ca57f24c3bcd9514\";\nexport const _7K_META_PUBLISHED_AT =\n \"0x17c0b1f7a6ad73f51268f16b8c06c049eecc2f28a270cdd29c06e3d2dea23302\";\nexport const _7K_META_PACKAGE_ID =\n \"0x17c0b1f7a6ad73f51268f16b8c06c049eecc2f28a270cdd29c06e3d2dea23302\";\nexport const _7K_META_VAULT =\n \"0x9a8abd32fe5721307ce3b697cf982ee84e9ffbd58d667a4a199f1683c1a3d23c\";\nexport const _7K_META_CONFIG =\n \"0xbbb3a51877ed9b492f26f4e2181811cfb2bd70c532f6f7621263d122d5e96b56\";\nexport const _7K_PARTNER_ADDRESS =\n \"0x93ead46c1e48a9b62e25b6787f2ea6f75caedabb21726f12431acc4381f5f4c5\";\n","import { EProvider, MetaQuote, MetaQuoteOptions } from \"../../types/metaAg\";\n\nexport enum MetaAgErrorCode {\n UNKNOWN = 1000,\n TIMEOUT = 1001,\n PROVIDER_NOT_FOUND = 1002,\n PROVIDER_NOT_SUPPORTED = 1003,\n INVALID_QUOTE = 1004,\n QUOTE_NOT_FOUND = 1005,\n INVALID_SIGNER_ADDRESS = 1006,\n PROVIDER_NOT_SUPPORT_SWAP = 1007,\n SIMULATION_FAILED = 1008,\n // OKX error\n OKX_FINALIZE_COMMAND_NOT_FOUND = 1100,\n}\n\nexport type MetaAgErrorDetailsMap = {\n [MetaAgErrorCode.UNKNOWN]: unknown;\n [MetaAgErrorCode.TIMEOUT]: { timeout: number };\n [MetaAgErrorCode.PROVIDER_NOT_FOUND]: { provider: EProvider };\n [MetaAgErrorCode.PROVIDER_NOT_SUPPORTED]: { provider: EProvider };\n [MetaAgErrorCode.INVALID_QUOTE]: {\n quote: MetaQuote;\n expectedProvider: EProvider;\n };\n [MetaAgErrorCode.QUOTE_NOT_FOUND]: {\n provider: EProvider;\n quoteOptions?: MetaQuoteOptions;\n };\n [MetaAgErrorCode.INVALID_SIGNER_ADDRESS]: { signer: string };\n [MetaAgErrorCode.PROVIDER_NOT_SUPPORT_SWAP]: { provider: EProvider };\n [MetaAgErrorCode.SIMULATION_FAILED]: { error: string | undefined };\n // OKX error\n [MetaAgErrorCode.OKX_FINALIZE_COMMAND_NOT_FOUND]: { packageId: string };\n};\n\nexport type MetaAgErrorDetails<T extends MetaAgErrorCode> =\n T extends keyof MetaAgErrorDetailsMap ? MetaAgErrorDetailsMap[T] : never;\n\nexport class MetaAgError<T extends MetaAgErrorCode> extends Error {\n code: T;\n details?: MetaAgErrorDetails<T>;\n constructor(message: string, code?: T, details?: MetaAgErrorDetails<T>) {\n super(message);\n this.name = \"MetaAgError\";\n this.code = code ?? (MetaAgErrorCode.UNKNOWN as T);\n this.details = details;\n }\n\n static assert<T extends MetaAgErrorCode>(\n condition: any,\n message?: string | null,\n code?: T,\n details?: MetaAgErrorDetails<T>,\n ): asserts condition {\n if (!condition) {\n throw new MetaAgError(message ?? \"Assertion failed\", code, details);\n }\n }\n}\n","import {\n coinWithBalance,\n Transaction,\n TransactionObjectArgument,\n} from \"@mysten/sui/transactions\";\nimport {\n _7K_META_CONFIG,\n _7K_META_PACKAGE_ID,\n _7K_META_PUBLISHED_AT,\n _7K_META_VAULT,\n} from \"../../constants/_7k\";\nimport {\n AggregatorProvider,\n EProvider,\n MetaAgOptions,\n MetaQuote,\n MetaSimulationOptions,\n} from \"../../types/metaAg\";\nimport type { SimulateTransactionResult } from \"../../utils/SuiClientUtils\";\nimport { SuiClientUtils } from \"../../utils/SuiClientUtils\";\nimport { getExpectedReturn } from \"../../utils/swap\";\nimport { MetaAgError, MetaAgErrorCode } from \"./error\";\n\ntype SimulatedTransaction = NonNullable<\n | SimulateTransactionResult[\"Transaction\"]\n | SimulateTransactionResult[\"FailedTransaction\"]\n>;\ntype SimulatedEvent = NonNullable<SimulatedTransaction[\"events\"]>[number];\n\n/**\n * v2 gRPC returns a `{ Transaction?, FailedTransaction? }` envelope from\n * both `executeTransaction` and `simulateTransaction`. Unwrap to the inner\n * payload, throwing `SIMULATION_FAILED` if neither arm is populated.\n */\nexport const unwrapTxResult = <\n T extends {\n Transaction?: unknown;\n FailedTransaction?: unknown;\n },\n>(\n res: T,\n msg = \"Transaction returned no result\",\n): NonNullable<T[\"Transaction\"] | T[\"FailedTransaction\"]> => {\n const inner = (res.Transaction ?? res.FailedTransaction) as\n | NonNullable<T[\"Transaction\"] | T[\"FailedTransaction\"]>\n | undefined;\n if (!inner) {\n throw new MetaAgError(msg, MetaAgErrorCode.SIMULATION_FAILED, {\n error: msg,\n });\n }\n return inner;\n};\n\n/**\n * Assert that `quote.provider` matches the expected provider kind. All\n * provider classes use this identical guard at the top of `swap`/`fastSwap`.\n */\nexport function assertQuoteProvider<E extends EProvider>(\n quote: MetaQuote,\n expected: E,\n): asserts quote is Extract<MetaQuote, { provider: E }> {\n MetaAgError.assert(\n quote.provider === expected,\n \"Invalid quote\",\n MetaAgErrorCode.INVALID_QUOTE,\n { quote, expectedProvider: expected },\n );\n}\n\nexport const simulateSwapTx = async (\n tx: Transaction,\n inspector: SuiClientUtils,\n simulation: MetaSimulationOptions,\n) => {\n const res = await timeout(\n () =>\n inspector.simulateTransaction({\n sender: simulation.sender,\n transactionBlock: tx,\n }),\n simulation.timeout ?? 2000,\n );\n const result = unwrapTxResult(res, \"Simulation failed\");\n const status = result.effects.status;\n if (!status.success) {\n const errorMessage = status.error.message ?? \"Simulation failed\";\n throw new MetaAgError(errorMessage, MetaAgErrorCode.SIMULATION_FAILED, {\n error: errorMessage,\n });\n }\n const amountOut = extractAmountOutWrapper(result.events ?? []);\n return {\n simulatedAmountOut: amountOut,\n gasUsed: result.effects.gasUsed,\n };\n};\nexport const simulateAggregator = async (\n provider: AggregatorProvider,\n quote: MetaQuote,\n simulation: MetaSimulationOptions,\n inspector: SuiClientUtils,\n options: Required<MetaAgOptions>,\n) => {\n const tx = new Transaction();\n const coinOut = await provider.swap({\n quote,\n coinIn: coinWithBalance({\n balance: BigInt(quote.amountIn),\n type: quote.coinTypeIn,\n useGasCoin: false,\n }),\n signer: simulation.sender,\n tx,\n });\n tx.add(\n metaSettle(\n quote,\n coinOut,\n 10000,\n options.tipBps,\n options.partner,\n options.partnerCommissionBps,\n ),\n );\n tx.transferObjects([coinOut], simulation.sender);\n const res = await simulateSwapTx(tx, inspector, simulation);\n return {\n id: quote.id,\n provider: provider.kind,\n ...res,\n };\n};\n\n/**\n * this settlement does not charge commission fee for partner, since all integrated aggregators already charge commission fee for partner\n * @param quote Meta Aggregator Quote\n * @param coinOut Coin Out Object\n * @param slippageBps Slippage Bps\n * @param tipBps Tip Bps default = 0\n * @param partner address of partner for analytic default is zero address\n */\nexport const metaSettle = (\n quote: MetaQuote,\n coinOut: TransactionObjectArgument,\n slippageBps = 100,\n tipBps = 0,\n partner?: string,\n commissionBps = 0,\n) => {\n return (tx: Transaction) => {\n const { minAmount, expectedAmount } = getExpectedReturn(\n quote.rawAmountOut,\n slippageBps,\n commissionBps,\n tipBps,\n );\n\n if (tipBps > 0) {\n tx.moveCall({\n target: `${_7K_META_PUBLISHED_AT}::vault::collect_tip`,\n typeArguments: [quote.coinTypeOut],\n arguments: [\n tx.object(_7K_META_VAULT),\n tx.object(_7K_META_CONFIG),\n coinOut,\n tx.pure.u64(tipBps),\n ],\n });\n }\n\n tx.moveCall({\n target: `${_7K_META_PUBLISHED_AT}::settle::settle`,\n typeArguments: [quote.coinTypeIn, quote.coinTypeOut],\n arguments: [\n tx.object(_7K_META_CONFIG),\n tx.object(_7K_META_VAULT),\n tx.pure.u64(quote.amountIn),\n coinOut,\n tx.pure.u64(minAmount),\n tx.pure.u64(expectedAmount),\n tx.pure.option(\"address\", partner),\n tx.pure.u64(commissionBps),\n tx.pure.u64(0), // ps\n ],\n });\n };\n};\n\nconst extractAmountOutWrapper = (events: SimulatedEvent[]) => {\n const swapEvent = events\n .filter(\n (event) => event.eventType === `${_7K_META_PACKAGE_ID}::settle::Swap`,\n )\n ?.pop();\n const json = swapEvent?.json as { amount_out?: string } | null | undefined;\n return json?.amount_out;\n};\n\nexport const timeout = async <T>(\n fn: () => Promise<T>,\n timeout: number,\n msg?: string,\n): Promise<T> => {\n if (timeout <= 0) return fn();\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(\n () =>\n reject(\n new MetaAgError(\n `Timeout ${msg ?? \"operation\"}`,\n MetaAgErrorCode.TIMEOUT,\n { timeout },\n ),\n ),\n timeout,\n );\n fn()\n .then(resolve)\n .catch(reject)\n .finally(() => clearTimeout(timer));\n });\n};\n","/**\n * Calculate expected return amount after applying slippage, commission, and tip\n * @param returnAmount - The raw return amount (with decimals)\n * @param slippageBps - Slippage in basis points (1 bps = 0.01%)\n * @param commissionBps - Commission in basis points\n * @param tipBps - Tip in basis points (default: 0)\n * @returns Object containing tipAmount, minAmount, commissionAmount, and expectedAmount\n */\nexport const getExpectedReturn = (\n returnAmount: string,\n slippageBps: number,\n commissionBps: number,\n tipBps: number = 0,\n) => {\n if (slippageBps > 10000) {\n throw new Error(\"Slippage must be less than 100%\");\n }\n if (commissionBps > 10000) {\n throw new Error(\"Commission must be less than 100%\");\n }\n if (tipBps > 10000) {\n throw new Error(\"Tip must be less than 100%\");\n }\n const returnAmountWithDecimal = BigInt(returnAmount);\n const tipAmountWithDecimal =\n (returnAmountWithDecimal * BigInt(tipBps || 0)) / 10000n;\n const commissionAmountWithDecimal =\n ((returnAmountWithDecimal - tipAmountWithDecimal) * BigInt(commissionBps)) /\n 10000n;\n const expectedReturnWithDecimal =\n returnAmountWithDecimal -\n tipAmountWithDecimal -\n commissionAmountWithDecimal;\n const minAmountWithDecimal =\n (expectedReturnWithDecimal * BigInt(1e4 - slippageBps)) / 10000n;\n\n return {\n tipAmount: tipAmountWithDecimal,\n minAmount: minAmountWithDecimal,\n commissionAmount: commissionAmountWithDecimal,\n expectedAmount: expectedReturnWithDecimal.toString(10),\n };\n};\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var E=Object.defineProperty;var T=e=>{throw TypeError(e)};var A=(e,t,r)=>t in e?E(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var c=(e,t,r)=>A(e,typeof t!="symbol"?t+"":t,r),g=(e,t,r)=>t.has(e)||T("Cannot "+r);var D=(e,t,r)=>(g(e,t,"read from private field"),r?r.call(e):t.get(e)),M=(e,t,r)=>t.has(e)?T("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),w=(e,t,r,n)=>(g(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r);var f=(o=>(o.BLUEFIN7K="bluefin7k",o.CETUS="cetus",o.FLOWX="flowx",o.OKX="okx",o))(f||{}),U=e=>e.kind==="bluefin7k"||e.kind==="cetus"||e.kind==="flowx",R=e=>e.kind==="okx";var d="0x17c0b1f7a6ad73f51268f16b8c06c049eecc2f28a270cdd29c06e3d2dea23302",O="0x17c0b1f7a6ad73f51268f16b8c06c049eecc2f28a270cdd29c06e3d2dea23302",m="0x9a8abd32fe5721307ce3b697cf982ee84e9ffbd58d667a4a199f1683c1a3d23c",l="0xbbb3a51877ed9b492f26f4e2181811cfb2bd70c532f6f7621263d122d5e96b56",
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
var E=Object.defineProperty;var T=e=>{throw TypeError(e)};var A=(e,t,r)=>t in e?E(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var c=(e,t,r)=>A(e,typeof t!="symbol"?t+"":t,r),g=(e,t,r)=>t.has(e)||T("Cannot "+r);var D=(e,t,r)=>(g(e,t,"read from private field"),r?r.call(e):t.get(e)),M=(e,t,r)=>t.has(e)?T("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),w=(e,t,r,n)=>(g(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r);var f=(o=>(o.BLUEFIN7K="bluefin7k",o.CETUS="cetus",o.FLOWX="flowx",o.OKX="okx",o))(f||{}),U=e=>e.kind==="bluefin7k"||e.kind==="cetus"||e.kind==="flowx",R=e=>e.kind==="okx";var d="0x17c0b1f7a6ad73f51268f16b8c06c049eecc2f28a270cdd29c06e3d2dea23302",O="0x17c0b1f7a6ad73f51268f16b8c06c049eecc2f28a270cdd29c06e3d2dea23302",m="0x9a8abd32fe5721307ce3b697cf982ee84e9ffbd58d667a4a199f1683c1a3d23c",l="0xbbb3a51877ed9b492f26f4e2181811cfb2bd70c532f6f7621263d122d5e96b56",C="0x93ead46c1e48a9b62e25b6787f2ea6f75caedabb21726f12431acc4381f5f4c5";var u=class e extends Error{constructor(r,n,o){super(r);c(this,"code");c(this,"details");this.name="MetaAgError",this.code=n??1e3,this.details=o}static assert(r,n,o,s){if(!r)throw new e(n??"Assertion failed",o,s)}};import{coinWithBalance as v,Transaction as S}from"@mysten/sui/transactions";var P=(e,t,r,n=0)=>{if(t>1e4)throw new Error("Slippage must be less than 100%");if(r>1e4)throw new Error("Commission must be less than 100%");if(n>1e4)throw new Error("Tip must be less than 100%");let o=BigInt(e),s=o*BigInt(n||0)/10000n,i=(o-s)*BigInt(r)/10000n,a=o-s-i,p=a*BigInt(1e4-t)/10000n;return{tipAmount:s,minAmount:p,commissionAmount:i,expectedAmount:a.toString(10)}};var _=(e,t="Transaction returned no result")=>{let r=e.Transaction??e.FailedTransaction;if(!r)throw new u(t,1008,{error:t});return r};function G(e,t){u.assert(e.provider===t,"Invalid quote",1004,{quote:e,expectedProvider:t})}var I=async(e,t,r)=>{let n=await N(()=>t.simulateTransaction({sender:r.sender,transactionBlock:e}),r.timeout??2e3),o=_(n,"Simulation failed"),s=o.effects.status;if(!s.success){let a=s.error.message??"Simulation failed";throw new u(a,1008,{error:a})}return{simulatedAmountOut:b(o.events??[]),gasUsed:o.effects.gasUsed}},q=async(e,t,r,n,o)=>{let s=new S,i=await e.swap({quote:t,coinIn:v({balance:BigInt(t.amountIn),type:t.coinTypeIn,useGasCoin:!1}),signer:r.sender,tx:s});s.add(x(t,i,1e4,o.tipBps,o.partner,o.partnerCommissionBps)),s.transferObjects([i],r.sender);let a=await I(s,n,r);return{id:t.id,provider:e.kind,...a}},x=(e,t,r=100,n=0,o,s=0)=>i=>{let{minAmount:a,expectedAmount:p}=P(e.rawAmountOut,r,s,n);n>0&&i.moveCall({target:`${d}::vault::collect_tip`,typeArguments:[e.coinTypeOut],arguments:[i.object(m),i.object(l),t,i.pure.u64(n)]}),i.moveCall({target:`${d}::settle::settle`,typeArguments:[e.coinTypeIn,e.coinTypeOut],arguments:[i.object(l),i.object(m),i.pure.u64(e.amountIn),t,i.pure.u64(a),i.pure.u64(p),i.pure.option("address",o),i.pure.u64(s),i.pure.u64(0)]})},b=e=>e.filter(n=>n.eventType===`${O}::settle::Swap`)?.pop()?.json?.amount_out,N=async(e,t,r)=>t<=0?e():new Promise((n,o)=>{let s=setTimeout(()=>o(new u(`Timeout ${r??"operation"}`,1001,{timeout:t})),t);e().then(n).catch(o).finally(()=>clearTimeout(s))});export{c as a,D as b,M as c,w as d,f as e,U as f,R as g,C as h,P as i,u as j,G as k,I as l,q as m,x as n,N as o};
|
|
2
|
+
//# sourceMappingURL=chunk-GXWST4PS.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/metaAg.ts","../src/constants/_7k.ts","../src/features/metaAg/error.ts","../src/features/metaAg/common.ts","../src/utils/swap.ts"],"sourcesContent":["import type {\n QuoteResponse,\n SourceDex,\n} from \"@bluefin-exchange/bluefin7k-aggregator-sdk\";\nimport type {\n PreSwapLpChangeParams,\n RouterDataV3,\n} from \"@cetusprotocol/aggregator-sdk\";\nimport type { AggregatorQuoter, Protocol } from \"@flowx-finance/sdk\";\nimport { ClientWithCoreApi, SuiClientTypes } from \"@mysten/sui/client\";\nimport { SignatureWithBytes } from \"@mysten/sui/cryptography\";\nimport { SuiGrpcClient } from \"@mysten/sui/grpc\";\nimport { SuiJsonRpcClient } from \"@mysten/sui/jsonRpc\";\nimport type {\n Transaction,\n TransactionObjectArgument,\n} from \"@mysten/sui/transactions\";\nimport { OkxSwapResponseData } from \"./okx\";\n\nexport enum EProvider {\n BLUEFIN7K = \"bluefin7k\",\n CETUS = \"cetus\",\n FLOWX = \"flowx\",\n OKX = \"okx\",\n}\ntype ProviderBaseOptions = {\n api?: string;\n apiKey?: string;\n disabled?: boolean;\n};\nexport type Bluefin7kProviderOptions = ProviderBaseOptions & {\n sources?: SourceDex[];\n excludedPools?: string[];\n targetPools?: string[];\n};\nexport type FlowxProviderOptions = ProviderBaseOptions & {\n sources?: Protocol[];\n excludePools?: string[];\n excludeSources?: Protocol[];\n maxHops?: number;\n splitDistributionPercent?: number;\n /**\n * Per-provider client override for FlowX. FlowX 2.0.3's `Trade.swap`\n * invokes native methods on `SuiGrpcClient` (`getBalance`,\n * `getDynamicField`, `getObject`, etc.) — it does not yet accept\n * `ClientWithCoreApi`. When supplied, this client is used for the FlowX\n * swap path; otherwise the global `MetaAgOptions.client` is cast to\n * `SuiGrpcClient` at the boundary. Once FlowX widens its types to\n * `ClientWithCoreApi`, this override can be removed.\n */\n client?: SuiGrpcClient;\n};\nexport type CetusProviderOptions = ProviderBaseOptions & {\n sources?: string[];\n splitCount?: number;\n splitAlgorithm?: string;\n splitFactor?: number;\n depth?: number;\n liquidityChanges?: PreSwapLpChangeParams[];\n /**\n * Per-provider client override for Cetus. Cetus 1.5.4's `AggregatorClient`\n * requires `SuiJsonRpcClient` for full coverage — legacy JSON-RPC methods\n * (`getDynamicFieldObject`, `getCoins`, `getOwnedObjects`,\n * `devInspectTransactionBlock`) are called on Pyth-priced and DeepBookV3\n * routes. When supplied, this client is used for the Cetus swap path;\n * otherwise the global `MetaAgOptions.client` is cast to `SuiJsonRpcClient`\n * at the boundary. Once Cetus widens its types to `ClientWithCoreApi`,\n * this override can be removed.\n */\n client?: SuiJsonRpcClient;\n};\nexport type OkxProviderOptions = Required<Omit<ProviderBaseOptions, \"api\">> & {\n api?: string;\n secretKey: string;\n apiPassphrase: string;\n projectId: string;\n};\nexport interface MetaAgOptions {\n /**If not specified, all providers will be used */\n providers?: {\n [EProvider.BLUEFIN7K]?: Bluefin7kProviderOptions;\n [EProvider.FLOWX]?: FlowxProviderOptions;\n [EProvider.CETUS]?: CetusProviderOptions;\n [EProvider.OKX]?: OkxProviderOptions;\n };\n /**\n * Sui client to use for on-chain reads, simulation, and execution. Accepts\n * any v2 `ClientWithCoreApi` implementation (`SuiGrpcClient`,\n * `SuiGraphQLClient`, `SuiJsonRpcClient`, or a custom transport). If not\n * specified, a default `SuiGrpcClient` against Sui mainnet is constructed.\n *\n * @warning **Cetus provider compatibility**: `@cetusprotocol/aggregator-sdk`\n * is **only fully compatible with `SuiJsonRpcClient`**. It calls legacy\n * JSON-RPC-only methods (`getDynamicFieldObject`, `getCoins`,\n * `getOwnedObjects`, `devInspectTransactionBlock`) for specific routes:\n *\n * - Pyth-priced routes (uses `getDynamicFieldObject` to resolve price\n * feeds in `routerSwap`).\n * - DeepBookV3 routes (uses `getCoins` for coin merging and\n * `getOwnedObjects` to mint/find an account cap).\n *\n * Passing a `SuiGrpcClient` / `SuiGraphQLClient` will work for plain\n * `findRouters + routerSwap` routes but **will throw at runtime** for the\n * cases above. If you need full Cetus coverage, pass a `SuiJsonRpcClient`\n * here (or disable the Cetus provider, or update to the latest cetus sdk that fully compatible with any sui client).\n */\n client?: ClientWithCoreApi;\n /**Hermes Api url, if not specified, the default hermes api url will be used */\n hermesApi?: string;\n /**Address to receive commission, if not specified, the commission will not be used */\n partner?: string;\n /**@default 0 */\n partnerCommissionBps?: number;\n /**@default 100 */\n slippageBps?: number;\n /**\n * Tip to support 7k\n * @default 0 */\n tipBps?: number;\n}\nexport interface MetaQuoteOptions {\n coinTypeIn: string;\n coinTypeOut: string;\n amountIn: string;\n /** Required for api-tx providers (ie: Okx) */\n signer?: string;\n /**\n * Timeout for quote operation in milliseconds\n * @default 2000ms\n */\n timeout?: number;\n}\nexport interface MetaSimulationOptions {\n sender: string;\n /**\n * Timeout for simulation operation in milliseconds\n * @default 2000ms\n */\n timeout?: number;\n /** If specify, defer the simulation that could reduce the time to display quote result, you must update the quote via the id on callback\n * else await all quote and simulation before return\n */\n onSimulated?: (payload: MetaQuote) => void;\n}\nexport interface MetaFastSwapOptions {\n /** Quote object from the quote operation */\n quote: MetaQuote;\n /** Signer address (owner of `coinIn`) */\n signer: string;\n /** If true, use the gas coin for the swap\n * @default true */\n useGasCoin?: boolean;\n /**\n * Sign the transaction bytes\n * @param txBytes - base64 transaction bytes\n * @returns - signature with bytes\n */\n signTransaction: (txBytes: string) => Promise<SignatureWithBytes>;\n}\nexport interface MetaSwapOptions {\n /** Quote object from the quote operation */\n quote: MetaQuote;\n /** Signer address (owner of `coinIn`) */\n signer: string;\n /** Transaction object to add the swap operation */\n tx: Transaction;\n /**\n * Coin object used for the swap, must be consumed completely, no `coinIn` left, user must pass the coinIn object with the balance required for the swap - ie in quote `amountIn`\n * @warning `coinIn` value must match the quote `amountIn` */\n coinIn: TransactionObjectArgument;\n}\n\nexport type FlowxQuoteResponse = Awaited<\n ReturnType<AggregatorQuoter[\"getRoutes\"]>\n>;\nexport type MetaQuote = (\n | {\n provider: EProvider.BLUEFIN7K;\n quote: QuoteResponse;\n }\n | {\n provider: EProvider.CETUS;\n quote: RouterDataV3;\n }\n | {\n provider: EProvider.FLOWX;\n quote: FlowxQuoteResponse;\n }\n | {\n provider: EProvider.OKX;\n quote: OkxSwapResponseData;\n }\n) & {\n /** uuid to keep track the quote result, used to apply simulation result on quote on callback `onSimulated`*/\n id: string;\n /** coin type: ie 0x2::sui::SUI */\n coinTypeIn: string;\n /** coin type: ie 0x2::sui::SUI */\n coinTypeOut: string;\n /** Amount in as u64 */\n amountIn: string;\n /** Amount out as u64 if there're no commission be applied to the amount out */\n rawAmountOut: string;\n /** Amount as u64 after minus any commission kind */\n amountOut: string;\n /** Simulated amount out if the transaction is executed */\n simulatedAmountOut?: string;\n /** Estimate gas consumption if the transaction is executed */\n gasUsed?: SuiClientTypes.GasCostSummary;\n};\nexport interface QuoteProvider {\n readonly kind: EProvider;\n quote(_quoteOptions: MetaQuoteOptions): Promise<MetaQuote | null>;\n}\n\nexport interface SwapAPIProvider extends QuoteProvider {\n readonly kind: EProvider.OKX;\n fastSwap(options: MetaFastSwapOptions): Promise<string>;\n}\n\nexport interface AggregatorProvider extends QuoteProvider {\n readonly kind: EProvider.BLUEFIN7K | EProvider.CETUS | EProvider.FLOWX;\n swap(options: MetaSwapOptions): Promise<TransactionObjectArgument>;\n}\n\nexport const isAggregatorProvider = (\n provider: QuoteProvider,\n): provider is AggregatorProvider =>\n provider.kind === EProvider.BLUEFIN7K ||\n provider.kind === EProvider.CETUS ||\n provider.kind === EProvider.FLOWX;\n\nexport const isSwapAPIProvider = (\n provider: QuoteProvider,\n): provider is SwapAPIProvider => provider.kind === EProvider.OKX;\n","// export const _7K_PACKAGE_ID =\n// \"0x62412b7268c35f3808336aee57a52836501f40b8ba5d936f8ad275e672befd04\";\n// //legacy V4: \"0xe8f996ea6ff38c557c253d3b93cfe2ebf393816487266786371aa4532a9229f2\";\n// //legacy V3: \"0x7ea6e27ad7af6f3b8671d59df1aaebd7c03dddab893e52a714227b2f4fe91519\";\n// //legacy V2: \"0xa13447019cd982d6bef91cf7b46ad384a52583b1dfc2bdecf31ef0c4bd787a0f\";\n// //legacy V1: \"0xd48e7cdc9e92bec69ce3baa75578010458a0c5b2733d661a84971e8cef6806bc\";\n// export const _7K_CONFIG =\n// \"0x47442a93f7727d188ba7cb71031170d1786af70013cb7ad5115f3fe877ff0c54\";\n// //legacy v3: \"0x0f8fc23dbcc9362b72c7a4c5aa53fcefa02ebfbb83a812c8c262ccd2c076d9ee\";\n\n// export const _7K_VAULT =\n// \"0x442ad50389ed5cda6f7a6f5a7ae6361a4c05ef1d9fb2e54fbba5a268d690bfe6\";\n// //legacy v3: \"0x39a3c55742c0e011b6f65548e73cf589e1ae5e82dbfab449ca57f24c3bcd9514\";\nexport const _7K_META_PUBLISHED_AT =\n \"0x17c0b1f7a6ad73f51268f16b8c06c049eecc2f28a270cdd29c06e3d2dea23302\";\nexport const _7K_META_PACKAGE_ID =\n \"0x17c0b1f7a6ad73f51268f16b8c06c049eecc2f28a270cdd29c06e3d2dea23302\";\nexport const _7K_META_VAULT =\n \"0x9a8abd32fe5721307ce3b697cf982ee84e9ffbd58d667a4a199f1683c1a3d23c\";\nexport const _7K_META_CONFIG =\n \"0xbbb3a51877ed9b492f26f4e2181811cfb2bd70c532f6f7621263d122d5e96b56\";\nexport const _7K_PARTNER_ADDRESS =\n \"0x93ead46c1e48a9b62e25b6787f2ea6f75caedabb21726f12431acc4381f5f4c5\";\n","import { EProvider, MetaQuote, MetaQuoteOptions } from \"../../types/metaAg\";\n\nexport enum MetaAgErrorCode {\n UNKNOWN = 1000,\n TIMEOUT = 1001,\n PROVIDER_NOT_FOUND = 1002,\n PROVIDER_NOT_SUPPORTED = 1003,\n INVALID_QUOTE = 1004,\n QUOTE_NOT_FOUND = 1005,\n INVALID_SIGNER_ADDRESS = 1006,\n PROVIDER_NOT_SUPPORT_SWAP = 1007,\n SIMULATION_FAILED = 1008,\n // OKX error\n OKX_FINALIZE_COMMAND_NOT_FOUND = 1100,\n}\n\nexport type MetaAgErrorDetailsMap = {\n [MetaAgErrorCode.UNKNOWN]: unknown;\n [MetaAgErrorCode.TIMEOUT]: { timeout: number };\n [MetaAgErrorCode.PROVIDER_NOT_FOUND]: { provider: EProvider };\n [MetaAgErrorCode.PROVIDER_NOT_SUPPORTED]: { provider: EProvider };\n [MetaAgErrorCode.INVALID_QUOTE]: {\n quote: MetaQuote;\n expectedProvider: EProvider;\n };\n [MetaAgErrorCode.QUOTE_NOT_FOUND]: {\n provider: EProvider;\n quoteOptions?: MetaQuoteOptions;\n };\n [MetaAgErrorCode.INVALID_SIGNER_ADDRESS]: { signer: string };\n [MetaAgErrorCode.PROVIDER_NOT_SUPPORT_SWAP]: { provider: EProvider };\n [MetaAgErrorCode.SIMULATION_FAILED]: { error: string | undefined };\n // OKX error\n [MetaAgErrorCode.OKX_FINALIZE_COMMAND_NOT_FOUND]: { packageId: string };\n};\n\nexport type MetaAgErrorDetails<T extends MetaAgErrorCode> =\n T extends keyof MetaAgErrorDetailsMap ? MetaAgErrorDetailsMap[T] : never;\n\nexport class MetaAgError<T extends MetaAgErrorCode> extends Error {\n code: T;\n details?: MetaAgErrorDetails<T>;\n constructor(message: string, code?: T, details?: MetaAgErrorDetails<T>) {\n super(message);\n this.name = \"MetaAgError\";\n this.code = code ?? (MetaAgErrorCode.UNKNOWN as T);\n this.details = details;\n }\n\n static assert<T extends MetaAgErrorCode>(\n condition: any,\n message?: string | null,\n code?: T,\n details?: MetaAgErrorDetails<T>,\n ): asserts condition {\n if (!condition) {\n throw new MetaAgError(message ?? \"Assertion failed\", code, details);\n }\n }\n}\n","import {\n coinWithBalance,\n Transaction,\n TransactionObjectArgument,\n} from \"@mysten/sui/transactions\";\nimport {\n _7K_META_CONFIG,\n _7K_META_PACKAGE_ID,\n _7K_META_PUBLISHED_AT,\n _7K_META_VAULT,\n} from \"../../constants/_7k\";\nimport {\n AggregatorProvider,\n EProvider,\n MetaAgOptions,\n MetaQuote,\n MetaSimulationOptions,\n} from \"../../types/metaAg\";\nimport type { SimulateTransactionResult } from \"../../utils/SuiClientUtils\";\nimport { SuiClientUtils } from \"../../utils/SuiClientUtils\";\nimport { getExpectedReturn } from \"../../utils/swap\";\nimport { MetaAgError, MetaAgErrorCode } from \"./error\";\n\ntype SimulatedTransaction = NonNullable<\n | SimulateTransactionResult[\"Transaction\"]\n | SimulateTransactionResult[\"FailedTransaction\"]\n>;\ntype SimulatedEvent = NonNullable<SimulatedTransaction[\"events\"]>[number];\n\n/**\n * v2 gRPC returns a `{ Transaction?, FailedTransaction? }` envelope from\n * both `executeTransaction` and `simulateTransaction`. Unwrap to the inner\n * payload, throwing `SIMULATION_FAILED` if neither arm is populated.\n */\nexport const unwrapTxResult = <\n T extends {\n Transaction?: unknown;\n FailedTransaction?: unknown;\n },\n>(\n res: T,\n msg = \"Transaction returned no result\",\n): NonNullable<T[\"Transaction\"] | T[\"FailedTransaction\"]> => {\n const inner = (res.Transaction ?? res.FailedTransaction) as\n | NonNullable<T[\"Transaction\"] | T[\"FailedTransaction\"]>\n | undefined;\n if (!inner) {\n throw new MetaAgError(msg, MetaAgErrorCode.SIMULATION_FAILED, {\n error: msg,\n });\n }\n return inner;\n};\n\n/**\n * Assert that `quote.provider` matches the expected provider kind. All\n * provider classes use this identical guard at the top of `swap`/`fastSwap`.\n */\nexport function assertQuoteProvider<E extends EProvider>(\n quote: MetaQuote,\n expected: E,\n): asserts quote is Extract<MetaQuote, { provider: E }> {\n MetaAgError.assert(\n quote.provider === expected,\n \"Invalid quote\",\n MetaAgErrorCode.INVALID_QUOTE,\n { quote, expectedProvider: expected },\n );\n}\n\nexport const simulateSwapTx = async (\n tx: Transaction,\n inspector: SuiClientUtils,\n simulation: MetaSimulationOptions,\n) => {\n const res = await timeout(\n () =>\n inspector.simulateTransaction({\n sender: simulation.sender,\n transactionBlock: tx,\n }),\n simulation.timeout ?? 2000,\n );\n const result = unwrapTxResult(res, \"Simulation failed\");\n const status = result.effects.status;\n if (!status.success) {\n const errorMessage = status.error.message ?? \"Simulation failed\";\n throw new MetaAgError(errorMessage, MetaAgErrorCode.SIMULATION_FAILED, {\n error: errorMessage,\n });\n }\n const amountOut = extractAmountOutWrapper(result.events ?? []);\n return {\n simulatedAmountOut: amountOut,\n gasUsed: result.effects.gasUsed,\n };\n};\nexport const simulateAggregator = async (\n provider: AggregatorProvider,\n quote: MetaQuote,\n simulation: MetaSimulationOptions,\n inspector: SuiClientUtils,\n options: Required<MetaAgOptions>,\n) => {\n const tx = new Transaction();\n const coinOut = await provider.swap({\n quote,\n coinIn: coinWithBalance({\n balance: BigInt(quote.amountIn),\n type: quote.coinTypeIn,\n useGasCoin: false,\n }),\n signer: simulation.sender,\n tx,\n });\n tx.add(\n metaSettle(\n quote,\n coinOut,\n 10000,\n options.tipBps,\n options.partner,\n options.partnerCommissionBps,\n ),\n );\n tx.transferObjects([coinOut], simulation.sender);\n const res = await simulateSwapTx(tx, inspector, simulation);\n return {\n id: quote.id,\n provider: provider.kind,\n ...res,\n };\n};\n\n/**\n * this settlement does not charge commission fee for partner, since all integrated aggregators already charge commission fee for partner\n * @param quote Meta Aggregator Quote\n * @param coinOut Coin Out Object\n * @param slippageBps Slippage Bps\n * @param tipBps Tip Bps default = 0\n * @param partner address of partner for analytic default is zero address\n */\nexport const metaSettle = (\n quote: MetaQuote,\n coinOut: TransactionObjectArgument,\n slippageBps = 100,\n tipBps = 0,\n partner?: string,\n commissionBps = 0,\n) => {\n return (tx: Transaction) => {\n const { minAmount, expectedAmount } = getExpectedReturn(\n quote.rawAmountOut,\n slippageBps,\n commissionBps,\n tipBps,\n );\n\n if (tipBps > 0) {\n tx.moveCall({\n target: `${_7K_META_PUBLISHED_AT}::vault::collect_tip`,\n typeArguments: [quote.coinTypeOut],\n arguments: [\n tx.object(_7K_META_VAULT),\n tx.object(_7K_META_CONFIG),\n coinOut,\n tx.pure.u64(tipBps),\n ],\n });\n }\n\n tx.moveCall({\n target: `${_7K_META_PUBLISHED_AT}::settle::settle`,\n typeArguments: [quote.coinTypeIn, quote.coinTypeOut],\n arguments: [\n tx.object(_7K_META_CONFIG),\n tx.object(_7K_META_VAULT),\n tx.pure.u64(quote.amountIn),\n coinOut,\n tx.pure.u64(minAmount),\n tx.pure.u64(expectedAmount),\n tx.pure.option(\"address\", partner),\n tx.pure.u64(commissionBps),\n tx.pure.u64(0), // ps\n ],\n });\n };\n};\n\nconst extractAmountOutWrapper = (events: SimulatedEvent[]) => {\n const swapEvent = events\n .filter(\n (event) => event.eventType === `${_7K_META_PACKAGE_ID}::settle::Swap`,\n )\n ?.pop();\n const json = swapEvent?.json as { amount_out?: string } | null | undefined;\n return json?.amount_out;\n};\n\nexport const timeout = async <T>(\n fn: () => Promise<T>,\n timeout: number,\n msg?: string,\n): Promise<T> => {\n if (timeout <= 0) return fn();\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(\n () =>\n reject(\n new MetaAgError(\n `Timeout ${msg ?? \"operation\"}`,\n MetaAgErrorCode.TIMEOUT,\n { timeout },\n ),\n ),\n timeout,\n );\n fn()\n .then(resolve)\n .catch(reject)\n .finally(() => clearTimeout(timer));\n });\n};\n","/**\n * Calculate expected return amount after applying slippage, commission, and tip\n * @param returnAmount - The raw return amount (with decimals)\n * @param slippageBps - Slippage in basis points (1 bps = 0.01%)\n * @param commissionBps - Commission in basis points\n * @param tipBps - Tip in basis points (default: 0)\n * @returns Object containing tipAmount, minAmount, commissionAmount, and expectedAmount\n */\nexport const getExpectedReturn = (\n returnAmount: string,\n slippageBps: number,\n commissionBps: number,\n tipBps: number = 0,\n) => {\n if (slippageBps > 10000) {\n throw new Error(\"Slippage must be less than 100%\");\n }\n if (commissionBps > 10000) {\n throw new Error(\"Commission must be less than 100%\");\n }\n if (tipBps > 10000) {\n throw new Error(\"Tip must be less than 100%\");\n }\n const returnAmountWithDecimal = BigInt(returnAmount);\n const tipAmountWithDecimal =\n (returnAmountWithDecimal * BigInt(tipBps || 0)) / 10000n;\n const commissionAmountWithDecimal =\n ((returnAmountWithDecimal - tipAmountWithDecimal) * BigInt(commissionBps)) /\n 10000n;\n const expectedReturnWithDecimal =\n returnAmountWithDecimal -\n tipAmountWithDecimal -\n commissionAmountWithDecimal;\n const minAmountWithDecimal =\n (expectedReturnWithDecimal * BigInt(1e4 - slippageBps)) / 10000n;\n\n return {\n tipAmount: tipAmountWithDecimal,\n minAmount: minAmountWithDecimal,\n commissionAmount: commissionAmountWithDecimal,\n expectedAmount: expectedReturnWithDecimal.toString(10),\n };\n};\n"],"mappings":"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","names":["EProvider","isAggregatorProvider","provider","isSwapAPIProvider","_7K_META_PUBLISHED_AT","_7K_META_PACKAGE_ID","_7K_META_VAULT","_7K_META_CONFIG","_7K_PARTNER_ADDRESS","MetaAgError","_MetaAgError","message","code","details","__publicField","condition","coinWithBalance","Transaction","getExpectedReturn","returnAmount","slippageBps","commissionBps","tipBps","returnAmountWithDecimal","tipAmountWithDecimal","commissionAmountWithDecimal","expectedReturnWithDecimal","minAmountWithDecimal","unwrapTxResult","res","msg","inner","MetaAgError","assertQuoteProvider","quote","expected","simulateSwapTx","tx","inspector","simulation","timeout","result","status","errorMessage","extractAmountOutWrapper","simulateAggregator","provider","options","Transaction","coinOut","coinWithBalance","metaSettle","slippageBps","tipBps","partner","commissionBps","minAmount","expectedAmount","getExpectedReturn","_7K_META_PUBLISHED_AT","_7K_META_VAULT","_7K_META_CONFIG","events","event","_7K_META_PACKAGE_ID","fn","resolve","reject","timer"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); 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 _chunkCH5S2TCQjs = require('./chunk-CH5S2TCQ.js');var _sdk = require('@flowx-finance/sdk');var _uuid = require('uuid');var s=class{constructor(t,e){this.options=t;_chunkCH5S2TCQjs.a.call(void 0, this,"kind","flowx");_chunkCH5S2TCQjs.a.call(void 0, this,"quoter");_chunkCH5S2TCQjs.a.call(void 0, this,"client");this.client=_nullishCoalesce(t.client, () => (e)),this.quoter=new (0, _sdk.AggregatorQuoter)("mainnet",t.apiKey)}async quote(t){let e=await this.quoter.getRoutes({amountIn:t.amountIn,tokenIn:t.coinTypeIn,tokenOut:t.coinTypeOut,includeSources:this.options.sources,excludePools:this.options.excludePools,excludeSources:this.options.excludeSources,maxHops:this.options.maxHops,splitDistributionPercent:this.options.splitDistributionPercent});return{id:_uuid.v4.call(void 0, ),provider:"flowx",quote:e,amountIn:_nullishCoalesce(_optionalChain([e, 'access', _ => _.amountIn, 'optionalAccess', _2 => _2.toString, 'call', _3 => _3()]), () => ("0")),rawAmountOut:_nullishCoalesce(_optionalChain([e, 'access', _4 => _4.amountOut, 'optionalAccess', _5 => _5.toString, 'call', _6 => _6()]), () => ("0")),amountOut:_nullishCoalesce(_optionalChain([e, 'access', _7 => _7.amountOut, 'optionalAccess', _8 => _8.toString, 'call', _9 => _9()]), () => ("0")),coinTypeIn:t.coinTypeIn,coinTypeOut:t.coinTypeOut}}async swap(t){_chunkCH5S2TCQjs.k.call(void 0, t.quote,"flowx");let e=new (0, _sdk.TradeBuilder)("mainnet",t.quote.quote.routes);e.sender(t.signer),e.slippage(1e4*100),e.commission(new (0, _sdk.Commission)(_chunkCH5S2TCQjs.h,t.quote.quote.coinOut,_sdk.CommissionType.PERCENTAGE,0,!0));let r=await e.build().swap({tx:t.tx,client:this.client,coinIn:t.coinIn});return _chunkCH5S2TCQjs.j.assert(!!r,"FlowX swap returned no coin out",1004,{quote:t.quote,expectedProvider:"flowx"}),r}};exports.FlowxProvider = s;
|
|
2
|
+
//# sourceMappingURL=flowx-NEIM34AB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/otis/Documents/7k-ts-sdk/dist/flowx-NEIM34AB.js","../src/features/metaAg/providers/flowx.ts"],"names":["FlowxProvider","options","client","__publicField","AggregatorQuoter","quoteOptions","quote","v4","assertQuoteProvider","builder","TradeBuilder","Commission","_7K_PARTNER_ADDRESS","CommissionType","res","MetaAgError"],"mappings":"AAAA,uuBAA4D,yCCKrD,4BAIY,IAcNA,CAAAA,CAAN,KAAiE,CAUtE,WAAA,CACmBC,CAAAA,CACjBC,CAAAA,CACA,CAFiB,IAAA,CAAA,OAAA,CAAAD,CAAAA,CAVnBE,gCAAAA,IAAA,CAAS,MAAA,CAAA,OAAA,CAAA,CACTA,gCAAAA,IAAA,CAAQ,QAAA,CAAA,CAORA,gCAAAA,IAAA,CAAiB,QAAA,CAAA,CAKf,IAAA,CAAK,MAAA,kBAASF,CAAAA,CAAQ,MAAA,SAAWC,GAAAA,CACjC,IAAA,CAAK,MAAA,CAAS,IAAIE,0BAAAA,CAAiB,SAAA,CAAWH,CAAAA,CAAQ,MAAM,CAC9D,CAEA,MAAM,KAAA,CAAMI,CAAAA,CAAoD,CAC9D,IAAMC,CAAAA,CAAQ,MAAM,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,CACxC,QAAA,CAAUD,CAAAA,CAAa,QAAA,CACvB,OAAA,CAASA,CAAAA,CAAa,UAAA,CACtB,QAAA,CAAUA,CAAAA,CAAa,WAAA,CACvB,cAAA,CAAgB,IAAA,CAAK,OAAA,CAAQ,OAAA,CAC7B,YAAA,CAAc,IAAA,CAAK,OAAA,CAAQ,YAAA,CAC3B,cAAA,CAAgB,IAAA,CAAK,OAAA,CAAQ,cAAA,CAC7B,OAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,OAAA,CACtB,wBAAA,CAA0B,IAAA,CAAK,OAAA,CAAQ,wBACzC,CAAC,CAAA,CACD,MAAO,CACL,EAAA,CAAIE,sBAAAA,CAAG,CACP,QAAA,CAAA,OAAA,CACA,KAAA,CAAOD,CAAAA,CACP,QAAA,kCAAUA,CAAAA,mBAAM,QAAA,6BAAU,QAAA,mBAAS,GAAA,SAAK,KAAA,CACxC,YAAA,kCAAcA,CAAAA,qBAAM,SAAA,6BAAW,QAAA,mBAAS,GAAA,SAAK,KAAA,CAC7C,SAAA,kCAAWA,CAAAA,qBAAM,SAAA,6BAAW,QAAA,mBAAS,GAAA,SAAK,KAAA,CAC1C,UAAA,CAAYD,CAAAA,CAAa,UAAA,CACzB,WAAA,CAAaA,CAAAA,CAAa,WAC5B,CACF,CAEA,MAAM,IAAA,CAAKJ,CAAAA,CAA8D,CACvEO,gCAAAA,CAAoBP,CAAQ,KAAA,CAAA,OAAsB,CAAA,CAClD,IAAMQ,CAAAA,CAAU,IAAIC,sBAAAA,CAAa,SAAA,CAAWT,CAAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,CACtEQ,CAAAA,CAAQ,MAAA,CAAOR,CAAAA,CAAQ,MAAM,CAAA,CAC7BQ,CAAAA,CAAQ,QAAA,CAAS,GAAA,CAAQ,GAAG,CAAA,CAC5BA,CAAAA,CAAQ,UAAA,CACN,IAAIE,oBAAAA,CACFC,kBAAAA,CACAX,CAAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,OAAA,CACpBY,mBAAAA,CAAe,UAAA,CACf,CAAA,CACA,CAAA,CACF,CACF,CAAA,CACA,IAAMC,CAAAA,CAAM,MAAML,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAE,IAAA,CAAK,CACrC,EAAA,CAAIR,CAAAA,CAAQ,EAAA,CACZ,MAAA,CAAQ,IAAA,CAAK,MAAA,CACb,MAAA,CAAQA,CAAAA,CAAQ,MAClB,CAAC,CAAA,CACD,OAAAc,kBAAAA,CAAY,MAAA,CACV,CAAC,CAACD,CAAAA,CACF,iCAAA,CAAA,IAAA,CAEA,CAAE,KAAA,CAAOb,CAAAA,CAAQ,KAAA,CAAO,gBAAA,CAAA,OAAkC,CAC5D,CAAA,CACOa,CACT,CACF,CAAA,CAAA,0BAAA","file":"/Users/otis/Documents/7k-ts-sdk/dist/flowx-NEIM34AB.js","sourcesContent":[null,"import {\n AggregatorQuoter,\n Commission,\n CommissionType,\n TradeBuilder,\n} from \"@flowx-finance/sdk\";\nimport { ClientWithCoreApi } from \"@mysten/sui/client\";\nimport { SuiGrpcClient } from \"@mysten/sui/grpc\";\nimport { TransactionObjectArgument } from \"@mysten/sui/transactions\";\nimport { v4 } from \"uuid\";\nimport { _7K_PARTNER_ADDRESS } from \"../../../constants/_7k\";\nimport {\n AggregatorProvider,\n EProvider,\n FlowxProviderOptions,\n MetaQuote,\n MetaQuoteOptions,\n MetaSwapOptions,\n QuoteProvider,\n} from \"../../../types/metaAg\";\nimport { assertQuoteProvider } from \"../common\";\nimport { MetaAgError, MetaAgErrorCode } from \"../error\";\n\nexport class FlowxProvider implements QuoteProvider, AggregatorProvider {\n readonly kind = EProvider.FLOWX;\n private quoter: AggregatorQuoter;\n // FlowX 2.0.3 calls native methods on `SuiGrpcClient` (`getBalance`,\n // `getDynamicField`, `getObject`, etc.) and does not yet accept\n // `ClientWithCoreApi`. We accept the global `ClientWithCoreApi` for\n // forward compatibility and let callers override per-provider via\n // `FlowxProviderOptions.client` when the global isn't a gRPC client.\n // The cast is the single vendor seam — drop it when FlowX widens.\n private readonly client: SuiGrpcClient;\n constructor(\n private readonly options: FlowxProviderOptions,\n client: ClientWithCoreApi,\n ) {\n this.client = options.client ?? (client as unknown as SuiGrpcClient);\n this.quoter = new AggregatorQuoter(\"mainnet\", options.apiKey);\n }\n\n async quote(quoteOptions: MetaQuoteOptions): Promise<MetaQuote> {\n const quote = await this.quoter.getRoutes({\n amountIn: quoteOptions.amountIn,\n tokenIn: quoteOptions.coinTypeIn,\n tokenOut: quoteOptions.coinTypeOut,\n includeSources: this.options.sources,\n excludePools: this.options.excludePools,\n excludeSources: this.options.excludeSources,\n maxHops: this.options.maxHops,\n splitDistributionPercent: this.options.splitDistributionPercent,\n });\n return {\n id: v4(),\n provider: EProvider.FLOWX,\n quote: quote,\n amountIn: quote.amountIn?.toString() ?? \"0\",\n rawAmountOut: quote.amountOut?.toString() ?? \"0\",\n amountOut: quote.amountOut?.toString() ?? \"0\",\n coinTypeIn: quoteOptions.coinTypeIn,\n coinTypeOut: quoteOptions.coinTypeOut,\n };\n }\n\n async swap(options: MetaSwapOptions): Promise<TransactionObjectArgument> {\n assertQuoteProvider(options.quote, EProvider.FLOWX);\n const builder = new TradeBuilder(\"mainnet\", options.quote.quote.routes);\n builder.sender(options.signer);\n builder.slippage(10000 * 100);\n builder.commission(\n new Commission(\n _7K_PARTNER_ADDRESS,\n options.quote.quote.coinOut,\n CommissionType.PERCENTAGE,\n 0,\n true,\n ),\n );\n const res = await builder.build().swap({\n tx: options.tx,\n client: this.client,\n coinIn: options.coinIn,\n });\n MetaAgError.assert(\n !!res,\n \"FlowX swap returned no coin out\",\n MetaAgErrorCode.INVALID_QUOTE,\n { quote: options.quote, expectedProvider: EProvider.FLOWX },\n );\n return res;\n }\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as o,h as i,j as n,k as u}from"./chunk-GXWST4PS.mjs";import{AggregatorQuoter as a,Commission as c,CommissionType as m,TradeBuilder as p}from"@flowx-finance/sdk";import{v4 as l}from"uuid";var s=class{constructor(t,e){this.options=t;o(this,"kind","flowx");o(this,"quoter");o(this,"client");this.client=t.client??e,this.quoter=new a("mainnet",t.apiKey)}async quote(t){let e=await this.quoter.getRoutes({amountIn:t.amountIn,tokenIn:t.coinTypeIn,tokenOut:t.coinTypeOut,includeSources:this.options.sources,excludePools:this.options.excludePools,excludeSources:this.options.excludeSources,maxHops:this.options.maxHops,splitDistributionPercent:this.options.splitDistributionPercent});return{id:l(),provider:"flowx",quote:e,amountIn:e.amountIn?.toString()??"0",rawAmountOut:e.amountOut?.toString()??"0",amountOut:e.amountOut?.toString()??"0",coinTypeIn:t.coinTypeIn,coinTypeOut:t.coinTypeOut}}async swap(t){u(t.quote,"flowx");let e=new p("mainnet",t.quote.quote.routes);e.sender(t.signer),e.slippage(1e4*100),e.commission(new c(i,t.quote.quote.coinOut,m.PERCENTAGE,0,!0));let r=await e.build().swap({tx:t.tx,client:this.client,coinIn:t.coinIn});return n.assert(!!r,"FlowX swap returned no coin out",1004,{quote:t.quote,expectedProvider:"flowx"}),r}};export{s as FlowxProvider};
|
|
2
|
+
//# sourceMappingURL=flowx-WHLIVV6Q.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/features/metaAg/providers/flowx.ts"],"sourcesContent":["import {\n AggregatorQuoter,\n Commission,\n CommissionType,\n TradeBuilder,\n} from \"@flowx-finance/sdk\";\nimport { ClientWithCoreApi } from \"@mysten/sui/client\";\nimport { SuiGrpcClient } from \"@mysten/sui/grpc\";\nimport { TransactionObjectArgument } from \"@mysten/sui/transactions\";\nimport { v4 } from \"uuid\";\nimport { _7K_PARTNER_ADDRESS } from \"../../../constants/_7k\";\nimport {\n AggregatorProvider,\n EProvider,\n FlowxProviderOptions,\n MetaQuote,\n MetaQuoteOptions,\n MetaSwapOptions,\n QuoteProvider,\n} from \"../../../types/metaAg\";\nimport { assertQuoteProvider } from \"../common\";\nimport { MetaAgError, MetaAgErrorCode } from \"../error\";\n\nexport class FlowxProvider implements QuoteProvider, AggregatorProvider {\n readonly kind = EProvider.FLOWX;\n private quoter: AggregatorQuoter;\n // FlowX 2.0.3 calls native methods on `SuiGrpcClient` (`getBalance`,\n // `getDynamicField`, `getObject`, etc.) and does not yet accept\n // `ClientWithCoreApi`. We accept the global `ClientWithCoreApi` for\n // forward compatibility and let callers override per-provider via\n // `FlowxProviderOptions.client` when the global isn't a gRPC client.\n // The cast is the single vendor seam — drop it when FlowX widens.\n private readonly client: SuiGrpcClient;\n constructor(\n private readonly options: FlowxProviderOptions,\n client: ClientWithCoreApi,\n ) {\n this.client = options.client ?? (client as unknown as SuiGrpcClient);\n this.quoter = new AggregatorQuoter(\"mainnet\", options.apiKey);\n }\n\n async quote(quoteOptions: MetaQuoteOptions): Promise<MetaQuote> {\n const quote = await this.quoter.getRoutes({\n amountIn: quoteOptions.amountIn,\n tokenIn: quoteOptions.coinTypeIn,\n tokenOut: quoteOptions.coinTypeOut,\n includeSources: this.options.sources,\n excludePools: this.options.excludePools,\n excludeSources: this.options.excludeSources,\n maxHops: this.options.maxHops,\n splitDistributionPercent: this.options.splitDistributionPercent,\n });\n return {\n id: v4(),\n provider: EProvider.FLOWX,\n quote: quote,\n amountIn: quote.amountIn?.toString() ?? \"0\",\n rawAmountOut: quote.amountOut?.toString() ?? \"0\",\n amountOut: quote.amountOut?.toString() ?? \"0\",\n coinTypeIn: quoteOptions.coinTypeIn,\n coinTypeOut: quoteOptions.coinTypeOut,\n };\n }\n\n async swap(options: MetaSwapOptions): Promise<TransactionObjectArgument> {\n assertQuoteProvider(options.quote, EProvider.FLOWX);\n const builder = new TradeBuilder(\"mainnet\", options.quote.quote.routes);\n builder.sender(options.signer);\n builder.slippage(10000 * 100);\n builder.commission(\n new Commission(\n _7K_PARTNER_ADDRESS,\n options.quote.quote.coinOut,\n CommissionType.PERCENTAGE,\n 0,\n true,\n ),\n );\n const res = await builder.build().swap({\n tx: options.tx,\n client: this.client,\n coinIn: options.coinIn,\n });\n MetaAgError.assert(\n !!res,\n \"FlowX swap returned no coin out\",\n MetaAgErrorCode.INVALID_QUOTE,\n { quote: options.quote, expectedProvider: EProvider.FLOWX },\n );\n return res;\n }\n}\n"],"mappings":"8DAAA,OACE,oBAAAA,EACA,cAAAC,EACA,kBAAAC,EACA,gBAAAC,MACK,qBAIP,OAAS,MAAAC,MAAU,OAcZ,IAAMC,EAAN,KAAiE,CAUtE,YACmBC,EACjBC,EACA,CAFiB,aAAAD,EAVnBE,EAAA,KAAS,gBACTA,EAAA,KAAQ,UAORA,EAAA,KAAiB,UAKf,KAAK,OAASF,EAAQ,QAAWC,EACjC,KAAK,OAAS,IAAIE,EAAiB,UAAWH,EAAQ,MAAM,CAC9D,CAEA,MAAM,MAAMI,EAAoD,CAC9D,IAAMC,EAAQ,MAAM,KAAK,OAAO,UAAU,CACxC,SAAUD,EAAa,SACvB,QAASA,EAAa,WACtB,SAAUA,EAAa,YACvB,eAAgB,KAAK,QAAQ,QAC7B,aAAc,KAAK,QAAQ,aAC3B,eAAgB,KAAK,QAAQ,eAC7B,QAAS,KAAK,QAAQ,QACtB,yBAA0B,KAAK,QAAQ,wBACzC,CAAC,EACD,MAAO,CACL,GAAIE,EAAG,EACP,iBACA,MAAOD,EACP,SAAUA,EAAM,UAAU,SAAS,GAAK,IACxC,aAAcA,EAAM,WAAW,SAAS,GAAK,IAC7C,UAAWA,EAAM,WAAW,SAAS,GAAK,IAC1C,WAAYD,EAAa,WACzB,YAAaA,EAAa,WAC5B,CACF,CAEA,MAAM,KAAKJ,EAA8D,CACvEO,EAAoBP,EAAQ,aAAsB,EAClD,IAAMQ,EAAU,IAAIC,EAAa,UAAWT,EAAQ,MAAM,MAAM,MAAM,EACtEQ,EAAQ,OAAOR,EAAQ,MAAM,EAC7BQ,EAAQ,SAAS,IAAQ,GAAG,EAC5BA,EAAQ,WACN,IAAIE,EACFC,EACAX,EAAQ,MAAM,MAAM,QACpBY,EAAe,WACf,EACA,EACF,CACF,EACA,IAAMC,EAAM,MAAML,EAAQ,MAAM,EAAE,KAAK,CACrC,GAAIR,EAAQ,GACZ,OAAQ,KAAK,OACb,OAAQA,EAAQ,MAClB,CAAC,EACD,OAAAc,EAAY,OACV,CAAC,CAACD,EACF,uCAEA,CAAE,MAAOb,EAAQ,MAAO,wBAAkC,CAC5D,EACOa,CACT,CACF","names":["AggregatorQuoter","Commission","CommissionType","TradeBuilder","v4","FlowxProvider","options","client","__publicField","AggregatorQuoter","quoteOptions","quote","v4","assertQuoteProvider","builder","TradeBuilder","Commission","_7K_PARTNER_ADDRESS","CommissionType","res","MetaAgError"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -3,6 +3,8 @@ import { PreSwapLpChangeParams, RouterDataV3 } from '@cetusprotocol/aggregator-s
|
|
|
3
3
|
import { Protocol, AggregatorQuoter } from '@flowx-finance/sdk';
|
|
4
4
|
import { ClientWithCoreApi, SuiClientTypes, CoreClient } from '@mysten/sui/client';
|
|
5
5
|
import { SignatureWithBytes } from '@mysten/sui/cryptography';
|
|
6
|
+
import { SuiGrpcClient } from '@mysten/sui/grpc';
|
|
7
|
+
import { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';
|
|
6
8
|
import { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions';
|
|
7
9
|
|
|
8
10
|
/**
|
|
@@ -155,6 +157,16 @@ type FlowxProviderOptions = ProviderBaseOptions & {
|
|
|
155
157
|
excludeSources?: Protocol[];
|
|
156
158
|
maxHops?: number;
|
|
157
159
|
splitDistributionPercent?: number;
|
|
160
|
+
/**
|
|
161
|
+
* Per-provider client override for FlowX. FlowX 2.0.3's `Trade.swap`
|
|
162
|
+
* invokes native methods on `SuiGrpcClient` (`getBalance`,
|
|
163
|
+
* `getDynamicField`, `getObject`, etc.) — it does not yet accept
|
|
164
|
+
* `ClientWithCoreApi`. When supplied, this client is used for the FlowX
|
|
165
|
+
* swap path; otherwise the global `MetaAgOptions.client` is cast to
|
|
166
|
+
* `SuiGrpcClient` at the boundary. Once FlowX widens its types to
|
|
167
|
+
* `ClientWithCoreApi`, this override can be removed.
|
|
168
|
+
*/
|
|
169
|
+
client?: SuiGrpcClient;
|
|
158
170
|
};
|
|
159
171
|
type CetusProviderOptions = ProviderBaseOptions & {
|
|
160
172
|
sources?: string[];
|
|
@@ -163,6 +175,17 @@ type CetusProviderOptions = ProviderBaseOptions & {
|
|
|
163
175
|
splitFactor?: number;
|
|
164
176
|
depth?: number;
|
|
165
177
|
liquidityChanges?: PreSwapLpChangeParams[];
|
|
178
|
+
/**
|
|
179
|
+
* Per-provider client override for Cetus. Cetus 1.5.4's `AggregatorClient`
|
|
180
|
+
* requires `SuiJsonRpcClient` for full coverage — legacy JSON-RPC methods
|
|
181
|
+
* (`getDynamicFieldObject`, `getCoins`, `getOwnedObjects`,
|
|
182
|
+
* `devInspectTransactionBlock`) are called on Pyth-priced and DeepBookV3
|
|
183
|
+
* routes. When supplied, this client is used for the Cetus swap path;
|
|
184
|
+
* otherwise the global `MetaAgOptions.client` is cast to `SuiJsonRpcClient`
|
|
185
|
+
* at the boundary. Once Cetus widens its types to `ClientWithCoreApi`,
|
|
186
|
+
* this override can be removed.
|
|
187
|
+
*/
|
|
188
|
+
client?: SuiJsonRpcClient;
|
|
166
189
|
};
|
|
167
190
|
type OkxProviderOptions = Required<Omit<ProviderBaseOptions, "api">> & {
|
|
168
191
|
api?: string;
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,8 @@ import { PreSwapLpChangeParams, RouterDataV3 } from '@cetusprotocol/aggregator-s
|
|
|
3
3
|
import { Protocol, AggregatorQuoter } from '@flowx-finance/sdk';
|
|
4
4
|
import { ClientWithCoreApi, SuiClientTypes, CoreClient } from '@mysten/sui/client';
|
|
5
5
|
import { SignatureWithBytes } from '@mysten/sui/cryptography';
|
|
6
|
+
import { SuiGrpcClient } from '@mysten/sui/grpc';
|
|
7
|
+
import { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';
|
|
6
8
|
import { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions';
|
|
7
9
|
|
|
8
10
|
/**
|
|
@@ -155,6 +157,16 @@ type FlowxProviderOptions = ProviderBaseOptions & {
|
|
|
155
157
|
excludeSources?: Protocol[];
|
|
156
158
|
maxHops?: number;
|
|
157
159
|
splitDistributionPercent?: number;
|
|
160
|
+
/**
|
|
161
|
+
* Per-provider client override for FlowX. FlowX 2.0.3's `Trade.swap`
|
|
162
|
+
* invokes native methods on `SuiGrpcClient` (`getBalance`,
|
|
163
|
+
* `getDynamicField`, `getObject`, etc.) — it does not yet accept
|
|
164
|
+
* `ClientWithCoreApi`. When supplied, this client is used for the FlowX
|
|
165
|
+
* swap path; otherwise the global `MetaAgOptions.client` is cast to
|
|
166
|
+
* `SuiGrpcClient` at the boundary. Once FlowX widens its types to
|
|
167
|
+
* `ClientWithCoreApi`, this override can be removed.
|
|
168
|
+
*/
|
|
169
|
+
client?: SuiGrpcClient;
|
|
158
170
|
};
|
|
159
171
|
type CetusProviderOptions = ProviderBaseOptions & {
|
|
160
172
|
sources?: string[];
|
|
@@ -163,6 +175,17 @@ type CetusProviderOptions = ProviderBaseOptions & {
|
|
|
163
175
|
splitFactor?: number;
|
|
164
176
|
depth?: number;
|
|
165
177
|
liquidityChanges?: PreSwapLpChangeParams[];
|
|
178
|
+
/**
|
|
179
|
+
* Per-provider client override for Cetus. Cetus 1.5.4's `AggregatorClient`
|
|
180
|
+
* requires `SuiJsonRpcClient` for full coverage — legacy JSON-RPC methods
|
|
181
|
+
* (`getDynamicFieldObject`, `getCoins`, `getOwnedObjects`,
|
|
182
|
+
* `devInspectTransactionBlock`) are called on Pyth-priced and DeepBookV3
|
|
183
|
+
* routes. When supplied, this client is used for the Cetus swap path;
|
|
184
|
+
* otherwise the global `MetaAgOptions.client` is cast to `SuiJsonRpcClient`
|
|
185
|
+
* at the boundary. Once Cetus widens its types to `ClientWithCoreApi`,
|
|
186
|
+
* this override can be removed.
|
|
187
|
+
*/
|
|
188
|
+
client?: SuiJsonRpcClient;
|
|
166
189
|
};
|
|
167
190
|
type OkxProviderOptions = Required<Omit<ProviderBaseOptions, "api">> & {
|
|
168
191
|
api?: string;
|
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 _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-RRIX3SC4.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;
|
|
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 _chunkCH5S2TCQjs = require('./chunk-CH5S2TCQ.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);_chunkCH5S2TCQjs.c.call(void 0, this,C,{OwnedObject:new Map,SharedOrImmutableObject:new Map,MoveFunction:new Map,Custom:new Map})}async get(t,r){return _nullishCoalesce(_chunkCH5S2TCQjs.b.call(void 0, this,C)[t].get(r), () => (null))}async set(t,r,i){_chunkCH5S2TCQjs.b.call(void 0, this,C)[t].set(r,i)}async delete(t,r){_chunkCH5S2TCQjs.b.call(void 0, this,C)[t].delete(r)}async clear(t){if(t)_chunkCH5S2TCQjs.b.call(void 0, this,C)[t].clear();else for(let r of Object.values(_chunkCH5S2TCQjs.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}){_chunkCH5S2TCQjs.c.call(void 0, this,E);_chunkCH5S2TCQjs.c.call(void 0, this,l);_chunkCH5S2TCQjs.c.call(void 0, this,A);_chunkCH5S2TCQjs.d.call(void 0, this,E,r),_chunkCH5S2TCQjs.d.call(void 0, this,l,e),_chunkCH5S2TCQjs.d.call(void 0, this,A,t)}async applyCache(e,t){let r=(await _chunkCH5S2TCQjs.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 _chunkCH5S2TCQjs.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 _chunkCH5S2TCQjs.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 _chunkCH5S2TCQjs.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 _chunkCH5S2TCQjs.b.call(void 0, this,l).clear()}async getMoveFunctionDefinition(e){return _chunkCH5S2TCQjs.b.call(void 0, this,l).getMoveFunctionDefinition(e)}async getObjects(e){return _chunkCH5S2TCQjs.b.call(void 0, this,l).getObjects(e)}async deleteObjects(e){return _chunkCH5S2TCQjs.b.call(void 0, this,l).deleteObjects(e)}async clearOwnedObjects(){await _chunkCH5S2TCQjs.b.call(void 0, this,l).clear("OwnedObject")}async clearCustom(){await _chunkCH5S2TCQjs.b.call(void 0, this,l).clear("Custom")}async getCustom(e){return _chunkCH5S2TCQjs.b.call(void 0, this,l).getCustom(e)}async setCustom(e,t){return _chunkCH5S2TCQjs.b.call(void 0, this,l).setCustom(e,t)}async deleteCustom(e){return _chunkCH5S2TCQjs.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([_chunkCH5S2TCQjs.b.call(void 0, this,l).addObjects(s),_chunkCH5S2TCQjs.b.call(void 0, this,l).deleteObjects(i),(n=_chunkCH5S2TCQjs.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;_chunkCH5S2TCQjs.c.call(void 0, this,T);_chunkCH5S2TCQjs.c.call(void 0, this,_,new WeakSet);_chunkCH5S2TCQjs.a.call(void 0, this,"simulateTransaction",async e=>{e.transactionBlock.setSenderIfNotSet(e.sender),_chunkCH5S2TCQjs.b.call(void 0, this,_).has(e.transactionBlock)||(e.transactionBlock.addBuildPlugin(_chunkCH5S2TCQjs.b.call(void 0, this,T).asPlugin()),_chunkCH5S2TCQjs.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 _chunkCH5S2TCQjs.b.call(void 0, this,T).clear(),t}finally{await _chunkCH5S2TCQjs.b.call(void 0, this,T).clearOwnedObjects()}});_chunkCH5S2TCQjs.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;_chunkCH5S2TCQjs.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 _chunkCH5S2TCQjs.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;_chunkCH5S2TCQjs.k.call(void 0, t,"okx");let{tx:s,coin:n}=ie({quote:t,signer:r});s.add(_chunkCH5S2TCQjs.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, _chunkCH5S2TCQjs.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, _chunkCH5S2TCQjs.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, _chunkCH5S2TCQjs.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 _chunkCH5S2TCQjs.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;_chunkCH5S2TCQjs.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(_chunkCH5S2TCQjs.n.call(void 0, o,s,1e4,r.tipBps,r.partner,r.partnerCommissionBps)),i.transferObjects([s],o.quote.tx.from);let n=await _chunkCH5S2TCQjs.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){_chunkCH5S2TCQjs.a.call(void 0, this,"client");_chunkCH5S2TCQjs.a.call(void 0, this,"providers",{});_chunkCH5S2TCQjs.a.call(void 0, this,"inspector");_chunkCH5S2TCQjs.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(_chunkCH5S2TCQjs.j.assert(!!r,`Provider not found: ${e}`,1002,{provider:e}),e){case"bluefin7k":let{Bluefin7kProvider:i}=await Promise.resolve().then(() => _interopRequireWildcard(require("./bluefin7k-ZCZGF5WO.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-NEIM34AB.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-PDGDXSRR.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, _chunkCH5S2TCQjs.j)(`Provider not supported: ${e}`,1003,{provider:e})}return this.providers[e]}async _simulate(e,t,r){try{if(_chunkCH5S2TCQjs.f.call(void 0, e))return await _chunkCH5S2TCQjs.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, _chunkCH5S2TCQjs.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 _chunkCH5S2TCQjs.o.call(void 0, async()=>{let i=await e.quote(t);if(!i)return null;let{expectedAmount:s}=_chunkCH5S2TCQjs.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);_chunkCH5S2TCQjs.j.assert(!!r,`Provider not found: ${e.quote.provider}`,1002,{provider:e.quote.provider}),_chunkCH5S2TCQjs.j.assert(_chunkCH5S2TCQjs.f.call(void 0, r),`Provider does not support swap: ${r.kind}, use fastSwap instead`,1007,{provider:r.kind}),_chunkCH5S2TCQjs.j.assert(e.signer&&!S(e.signer),"Invalid signer address",1006,{signer:e.signer});let i=await r.swap(e);return e.tx.add(_chunkCH5S2TCQjs.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){_chunkCH5S2TCQjs.j.assert(e.signer&&!S(e.signer),"Invalid signer address",1006,{signer:e.signer});let r=await this._getProvider(e.quote.provider);if(_chunkCH5S2TCQjs.f.call(void 0, r))return this._fastSwap(e,t);if(_chunkCH5S2TCQjs.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, _chunkCH5S2TCQjs.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 = _chunkCH5S2TCQjs.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 = _chunkCH5S2TCQjs.f; exports.isSwapAPIProvider = _chunkCH5S2TCQjs.g; exports.placeDcaOrder = fe; exports.placeLimitOrder = ue;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
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-FTPJ3RYF.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};
|
|
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-GXWST4PS.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-555A3TO5.mjs").catch(K("bluefin7k"));this.providers.bluefin7k=new i(r,this.options,this.client);break;case"flowx":let{FlowxProvider:s}=await import("./flowx-WHLIVV6Q.mjs").catch(K("flowx"));this.providers.flowx=new s(r,this.client);break;case"cetus":let{CetusProvider:n}=await import("./cetus-N2YTKDL7.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
|
package/package.json
CHANGED
package/dist/cetus-HOKHMQSS.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as o,h as i,j as r,k as n}from"./chunk-CYI4MM5C.mjs";import{AggregatorClient as p,Env as u}from"@cetusprotocol/aggregator-sdk";import{v4 as m}from"uuid";var a=class{constructor(t,e,s){this.options=t;o(this,"kind","cetus");o(this,"cetusClient");this.cetusClient=new p({apiKey:t.apiKey,client:s,endpoint:t.api,env:u.Mainnet,pythUrls:e.hermesApi?[e.hermesApi]:[],overlayFeeRate:0,overlayFeeReceiver:i})}async quote(t){let e=await this.cetusClient.findRouters({amount:t.amountIn,byAmountIn:!0,from:t.coinTypeIn,target:t.coinTypeOut,providers:this.options.sources,splitCount:this.options.splitCount,splitAlgorithm:this.options.splitAlgorithm,splitFactor:this.options.splitFactor,depth:this.options.depth,liquidityChanges:this.options.liquidityChanges});return r.assert(!!e,"No quote found",1005,{provider:this.kind}),{id:m(),provider:"cetus",quote:e,amountIn:e.amountIn.toString()||"0",rawAmountOut:e.amountOut.toString()||"0",amountOut:e.amountOut.toString()||"0",coinTypeIn:t.coinTypeIn,coinTypeOut:t.coinTypeOut}}async swap(t){return n(t.quote,"cetus"),await this.cetusClient.routerSwap({inputCoin:t.coinIn,router:t.quote.quote,slippage:1,txb:t.tx})}};export{a as CetusProvider};
|
|
2
|
-
//# sourceMappingURL=cetus-HOKHMQSS.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/features/metaAg/providers/cetus.ts"],"sourcesContent":["import { AggregatorClient, Env } from \"@cetusprotocol/aggregator-sdk\";\nimport { ClientWithCoreApi } from \"@mysten/sui/client\";\nimport { v4 } from \"uuid\";\nimport { _7K_PARTNER_ADDRESS } from \"../../../constants/_7k\";\nimport {\n AggregatorProvider,\n CetusProviderOptions,\n EProvider,\n MetaAgOptions,\n MetaQuote,\n MetaQuoteOptions,\n MetaSwapOptions,\n QuoteProvider,\n} from \"../../../types/metaAg\";\nimport { assertQuoteProvider } from \"../common\";\nimport { MetaAgError, MetaAgErrorCode } from \"../error\";\n\nexport class CetusProvider implements QuoteProvider, AggregatorProvider {\n readonly kind = EProvider.CETUS;\n private readonly cetusClient: AggregatorClient;\n constructor(\n private readonly options: CetusProviderOptions,\n metaOptions: MetaAgOptions,\n client: ClientWithCoreApi,\n ) {\n this.cetusClient = new AggregatorClient({\n apiKey: options.apiKey,\n // Cetus 1.5.4 types `client` as `SuiJsonRpcClient` but the methods\n // exercised by the `findRouters` + `routerSwap` path we use here are\n // present on `SuiGrpcClient`. The legacy-only methods it can call\n // (`getDynamicFieldObject`, `getCoins`, `getOwnedObjects`,\n // `devInspectTransactionBlock`) sit behind code paths we don't enter\n // (Pyth-priced routes, DeepBookV3 account caps, in-pool simulation).\n // Cast at this single boundary to keep the SDK gRPC-only.\n client: client as unknown as ConstructorParameters<\n typeof AggregatorClient\n >[0][\"client\"],\n endpoint: options.api,\n env: Env.Mainnet,\n pythUrls: metaOptions.hermesApi ? [metaOptions.hermesApi] : [],\n overlayFeeRate: 0,\n overlayFeeReceiver: _7K_PARTNER_ADDRESS,\n });\n }\n\n async quote(quoteOptions: MetaQuoteOptions): Promise<MetaQuote> {\n const quote = await this.cetusClient.findRouters({\n amount: quoteOptions.amountIn,\n byAmountIn: true,\n from: quoteOptions.coinTypeIn,\n target: quoteOptions.coinTypeOut,\n providers: this.options.sources,\n splitCount: this.options.splitCount,\n splitAlgorithm: this.options.splitAlgorithm,\n splitFactor: this.options.splitFactor,\n depth: this.options.depth,\n liquidityChanges: this.options.liquidityChanges,\n });\n MetaAgError.assert(\n !!quote,\n \"No quote found\",\n MetaAgErrorCode.QUOTE_NOT_FOUND,\n { provider: this.kind },\n );\n return {\n id: v4(),\n provider: EProvider.CETUS,\n quote,\n amountIn: quote.amountIn.toString() || \"0\",\n rawAmountOut: quote.amountOut.toString() || \"0\",\n amountOut: quote.amountOut.toString() || \"0\",\n coinTypeIn: quoteOptions.coinTypeIn,\n coinTypeOut: quoteOptions.coinTypeOut,\n };\n }\n\n async swap(options: MetaSwapOptions) {\n assertQuoteProvider(options.quote, EProvider.CETUS);\n const coinOut = await this.cetusClient.routerSwap({\n inputCoin: options.coinIn,\n router: options.quote.quote,\n slippage: 1,\n txb: options.tx,\n });\n return coinOut;\n }\n}\n"],"mappings":"8DAAA,OAAS,oBAAAA,EAAkB,OAAAC,MAAW,gCAEtC,OAAS,MAAAC,MAAU,OAeZ,IAAMC,EAAN,KAAiE,CAGtE,YACmBC,EACjBC,EACAC,EACA,CAHiB,aAAAF,EAHnBG,EAAA,KAAS,gBACTA,EAAA,KAAiB,eAMf,KAAK,YAAc,IAAIC,EAAiB,CACtC,OAAQJ,EAAQ,OAQhB,OAAQE,EAGR,SAAUF,EAAQ,IAClB,IAAKK,EAAI,QACT,SAAUJ,EAAY,UAAY,CAACA,EAAY,SAAS,EAAI,CAAC,EAC7D,eAAgB,EAChB,mBAAoBK,CACtB,CAAC,CACH,CAEA,MAAM,MAAMC,EAAoD,CAC9D,IAAMC,EAAQ,MAAM,KAAK,YAAY,YAAY,CAC/C,OAAQD,EAAa,SACrB,WAAY,GACZ,KAAMA,EAAa,WACnB,OAAQA,EAAa,YACrB,UAAW,KAAK,QAAQ,QACxB,WAAY,KAAK,QAAQ,WACzB,eAAgB,KAAK,QAAQ,eAC7B,YAAa,KAAK,QAAQ,YAC1B,MAAO,KAAK,QAAQ,MACpB,iBAAkB,KAAK,QAAQ,gBACjC,CAAC,EACD,OAAAE,EAAY,OACV,CAAC,CAACD,EACF,sBAEA,CAAE,SAAU,KAAK,IAAK,CACxB,EACO,CACL,GAAIE,EAAG,EACP,iBACA,MAAAF,EACA,SAAUA,EAAM,SAAS,SAAS,GAAK,IACvC,aAAcA,EAAM,UAAU,SAAS,GAAK,IAC5C,UAAWA,EAAM,UAAU,SAAS,GAAK,IACzC,WAAYD,EAAa,WACzB,YAAaA,EAAa,WAC5B,CACF,CAEA,MAAM,KAAKP,EAA0B,CACnC,OAAAW,EAAoBX,EAAQ,aAAsB,EAClC,MAAM,KAAK,YAAY,WAAW,CAChD,UAAWA,EAAQ,OACnB,OAAQA,EAAQ,MAAM,MACtB,SAAU,EACV,IAAKA,EAAQ,EACf,CAAC,CAEH,CACF","names":["AggregatorClient","Env","v4","CetusProvider","options","metaOptions","client","__publicField","AggregatorClient","Env","_7K_PARTNER_ADDRESS","quoteOptions","quote","MetaAgError","v4","assertQuoteProvider"]}
|
package/dist/cetus-MUHFO44Y.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkE5KM5OVWjs = require('./chunk-E5KM5OVW.js');var _aggregatorsdk = require('@cetusprotocol/aggregator-sdk');var _uuid = require('uuid');var a=class{constructor(t,e,s){this.options=t;_chunkE5KM5OVWjs.a.call(void 0, this,"kind","cetus");_chunkE5KM5OVWjs.a.call(void 0, this,"cetusClient");this.cetusClient=new (0, _aggregatorsdk.AggregatorClient)({apiKey:t.apiKey,client:s,endpoint:t.api,env:_aggregatorsdk.Env.Mainnet,pythUrls:e.hermesApi?[e.hermesApi]:[],overlayFeeRate:0,overlayFeeReceiver:_chunkE5KM5OVWjs.h})}async quote(t){let e=await this.cetusClient.findRouters({amount:t.amountIn,byAmountIn:!0,from:t.coinTypeIn,target:t.coinTypeOut,providers:this.options.sources,splitCount:this.options.splitCount,splitAlgorithm:this.options.splitAlgorithm,splitFactor:this.options.splitFactor,depth:this.options.depth,liquidityChanges:this.options.liquidityChanges});return _chunkE5KM5OVWjs.j.assert(!!e,"No quote found",1005,{provider:this.kind}),{id:_uuid.v4.call(void 0, ),provider:"cetus",quote:e,amountIn:e.amountIn.toString()||"0",rawAmountOut:e.amountOut.toString()||"0",amountOut:e.amountOut.toString()||"0",coinTypeIn:t.coinTypeIn,coinTypeOut:t.coinTypeOut}}async swap(t){return _chunkE5KM5OVWjs.k.call(void 0, t.quote,"cetus"),await this.cetusClient.routerSwap({inputCoin:t.coinIn,router:t.quote.quote,slippage:1,txb:t.tx})}};exports.CetusProvider = a;
|
|
2
|
-
//# sourceMappingURL=cetus-MUHFO44Y.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/otis/Documents/7k-ts-sdk/dist/cetus-MUHFO44Y.js","../src/features/metaAg/providers/cetus.ts"],"names":["CetusProvider","options","metaOptions","client","__publicField","AggregatorClient","Env","_7K_PARTNER_ADDRESS","quoteOptions","quote","MetaAgError","v4","assertQuoteProvider"],"mappings":"AAAA,+HAA4D,8DCAtB,4BAEnB,IAeNA,CAAAA,CAAN,KAAiE,CAGtE,WAAA,CACmBC,CAAAA,CACjBC,CAAAA,CACAC,CAAAA,CACA,CAHiB,IAAA,CAAA,OAAA,CAAAF,CAAAA,CAHnBG,gCAAAA,IAAA,CAAS,MAAA,CAAA,OAAA,CAAA,CACTA,gCAAAA,IAAA,CAAiB,aAAA,CAAA,CAMf,IAAA,CAAK,WAAA,CAAc,IAAIC,oCAAAA,CAAiB,CACtC,MAAA,CAAQJ,CAAAA,CAAQ,MAAA,CAQhB,MAAA,CAAQE,CAAAA,CAGR,QAAA,CAAUF,CAAAA,CAAQ,GAAA,CAClB,GAAA,CAAKK,kBAAAA,CAAI,OAAA,CACT,QAAA,CAAUJ,CAAAA,CAAY,SAAA,CAAY,CAACA,CAAAA,CAAY,SAAS,CAAA,CAAI,CAAC,CAAA,CAC7D,cAAA,CAAgB,CAAA,CAChB,kBAAA,CAAoBK,kBACtB,CAAC,CACH,CAEA,MAAM,KAAA,CAAMC,CAAAA,CAAoD,CAC9D,IAAMC,CAAAA,CAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,WAAA,CAAY,CAC/C,MAAA,CAAQD,CAAAA,CAAa,QAAA,CACrB,UAAA,CAAY,CAAA,CAAA,CACZ,IAAA,CAAMA,CAAAA,CAAa,UAAA,CACnB,MAAA,CAAQA,CAAAA,CAAa,WAAA,CACrB,SAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,OAAA,CACxB,UAAA,CAAY,IAAA,CAAK,OAAA,CAAQ,UAAA,CACzB,cAAA,CAAgB,IAAA,CAAK,OAAA,CAAQ,cAAA,CAC7B,WAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,WAAA,CAC1B,KAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CACpB,gBAAA,CAAkB,IAAA,CAAK,OAAA,CAAQ,gBACjC,CAAC,CAAA,CACD,OAAAE,kBAAAA,CAAY,MAAA,CACV,CAAC,CAACD,CAAAA,CACF,gBAAA,CAAA,IAAA,CAEA,CAAE,QAAA,CAAU,IAAA,CAAK,IAAK,CACxB,CAAA,CACO,CACL,EAAA,CAAIE,sBAAAA,CAAG,CACP,QAAA,CAAA,OAAA,CACA,KAAA,CAAAF,CAAAA,CACA,QAAA,CAAUA,CAAAA,CAAM,QAAA,CAAS,QAAA,CAAS,CAAA,EAAK,GAAA,CACvC,YAAA,CAAcA,CAAAA,CAAM,SAAA,CAAU,QAAA,CAAS,CAAA,EAAK,GAAA,CAC5C,SAAA,CAAWA,CAAAA,CAAM,SAAA,CAAU,QAAA,CAAS,CAAA,EAAK,GAAA,CACzC,UAAA,CAAYD,CAAAA,CAAa,UAAA,CACzB,WAAA,CAAaA,CAAAA,CAAa,WAC5B,CACF,CAEA,MAAM,IAAA,CAAKP,CAAAA,CAA0B,CACnC,OAAAW,gCAAAA,CAAoBX,CAAQ,KAAA,CAAA,OAAsB,CAAA,CAClC,MAAM,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,CAChD,SAAA,CAAWA,CAAAA,CAAQ,MAAA,CACnB,MAAA,CAAQA,CAAAA,CAAQ,KAAA,CAAM,KAAA,CACtB,QAAA,CAAU,CAAA,CACV,GAAA,CAAKA,CAAAA,CAAQ,EACf,CAAC,CAEH,CACF,CAAA,CAAA,0BAAA","file":"/Users/otis/Documents/7k-ts-sdk/dist/cetus-MUHFO44Y.js","sourcesContent":[null,"import { AggregatorClient, Env } from \"@cetusprotocol/aggregator-sdk\";\nimport { ClientWithCoreApi } from \"@mysten/sui/client\";\nimport { v4 } from \"uuid\";\nimport { _7K_PARTNER_ADDRESS } from \"../../../constants/_7k\";\nimport {\n AggregatorProvider,\n CetusProviderOptions,\n EProvider,\n MetaAgOptions,\n MetaQuote,\n MetaQuoteOptions,\n MetaSwapOptions,\n QuoteProvider,\n} from \"../../../types/metaAg\";\nimport { assertQuoteProvider } from \"../common\";\nimport { MetaAgError, MetaAgErrorCode } from \"../error\";\n\nexport class CetusProvider implements QuoteProvider, AggregatorProvider {\n readonly kind = EProvider.CETUS;\n private readonly cetusClient: AggregatorClient;\n constructor(\n private readonly options: CetusProviderOptions,\n metaOptions: MetaAgOptions,\n client: ClientWithCoreApi,\n ) {\n this.cetusClient = new AggregatorClient({\n apiKey: options.apiKey,\n // Cetus 1.5.4 types `client` as `SuiJsonRpcClient` but the methods\n // exercised by the `findRouters` + `routerSwap` path we use here are\n // present on `SuiGrpcClient`. The legacy-only methods it can call\n // (`getDynamicFieldObject`, `getCoins`, `getOwnedObjects`,\n // `devInspectTransactionBlock`) sit behind code paths we don't enter\n // (Pyth-priced routes, DeepBookV3 account caps, in-pool simulation).\n // Cast at this single boundary to keep the SDK gRPC-only.\n client: client as unknown as ConstructorParameters<\n typeof AggregatorClient\n >[0][\"client\"],\n endpoint: options.api,\n env: Env.Mainnet,\n pythUrls: metaOptions.hermesApi ? [metaOptions.hermesApi] : [],\n overlayFeeRate: 0,\n overlayFeeReceiver: _7K_PARTNER_ADDRESS,\n });\n }\n\n async quote(quoteOptions: MetaQuoteOptions): Promise<MetaQuote> {\n const quote = await this.cetusClient.findRouters({\n amount: quoteOptions.amountIn,\n byAmountIn: true,\n from: quoteOptions.coinTypeIn,\n target: quoteOptions.coinTypeOut,\n providers: this.options.sources,\n splitCount: this.options.splitCount,\n splitAlgorithm: this.options.splitAlgorithm,\n splitFactor: this.options.splitFactor,\n depth: this.options.depth,\n liquidityChanges: this.options.liquidityChanges,\n });\n MetaAgError.assert(\n !!quote,\n \"No quote found\",\n MetaAgErrorCode.QUOTE_NOT_FOUND,\n { provider: this.kind },\n );\n return {\n id: v4(),\n provider: EProvider.CETUS,\n quote,\n amountIn: quote.amountIn.toString() || \"0\",\n rawAmountOut: quote.amountOut.toString() || \"0\",\n amountOut: quote.amountOut.toString() || \"0\",\n coinTypeIn: quoteOptions.coinTypeIn,\n coinTypeOut: quoteOptions.coinTypeOut,\n };\n }\n\n async swap(options: MetaSwapOptions) {\n assertQuoteProvider(options.quote, EProvider.CETUS);\n const coinOut = await this.cetusClient.routerSwap({\n inputCoin: options.coinIn,\n router: options.quote.quote,\n slippage: 1,\n txb: options.tx,\n });\n return coinOut;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/metaAg.ts","../src/constants/_7k.ts","../src/features/metaAg/error.ts","../src/features/metaAg/common.ts","../src/utils/swap.ts"],"sourcesContent":["import type {\n QuoteResponse,\n SourceDex,\n} from \"@bluefin-exchange/bluefin7k-aggregator-sdk\";\nimport type {\n PreSwapLpChangeParams,\n RouterDataV3,\n} from \"@cetusprotocol/aggregator-sdk\";\nimport type { AggregatorQuoter, Protocol } from \"@flowx-finance/sdk\";\nimport { ClientWithCoreApi, SuiClientTypes } from \"@mysten/sui/client\";\nimport { SignatureWithBytes } from \"@mysten/sui/cryptography\";\nimport type {\n Transaction,\n TransactionObjectArgument,\n} from \"@mysten/sui/transactions\";\nimport { OkxSwapResponseData } from \"./okx\";\n\nexport enum EProvider {\n BLUEFIN7K = \"bluefin7k\",\n CETUS = \"cetus\",\n FLOWX = \"flowx\",\n OKX = \"okx\",\n}\ntype ProviderBaseOptions = {\n api?: string;\n apiKey?: string;\n disabled?: boolean;\n};\nexport type Bluefin7kProviderOptions = ProviderBaseOptions & {\n sources?: SourceDex[];\n excludedPools?: string[];\n targetPools?: string[];\n};\nexport type FlowxProviderOptions = ProviderBaseOptions & {\n sources?: Protocol[];\n excludePools?: string[];\n excludeSources?: Protocol[];\n maxHops?: number;\n splitDistributionPercent?: number;\n};\nexport type CetusProviderOptions = ProviderBaseOptions & {\n sources?: string[];\n splitCount?: number;\n splitAlgorithm?: string;\n splitFactor?: number;\n depth?: number;\n liquidityChanges?: PreSwapLpChangeParams[];\n};\nexport type OkxProviderOptions = Required<Omit<ProviderBaseOptions, \"api\">> & {\n api?: string;\n secretKey: string;\n apiPassphrase: string;\n projectId: string;\n};\nexport interface MetaAgOptions {\n /**If not specified, all providers will be used */\n providers?: {\n [EProvider.BLUEFIN7K]?: Bluefin7kProviderOptions;\n [EProvider.FLOWX]?: FlowxProviderOptions;\n [EProvider.CETUS]?: CetusProviderOptions;\n [EProvider.OKX]?: OkxProviderOptions;\n };\n /**\n * Sui client to use for on-chain reads, simulation, and execution. Accepts\n * any v2 `ClientWithCoreApi` implementation (`SuiGrpcClient`,\n * `SuiGraphQLClient`, `SuiJsonRpcClient`, or a custom transport). If not\n * specified, a default `SuiGrpcClient` against Sui mainnet is constructed.\n *\n * @warning **Cetus provider compatibility**: `@cetusprotocol/aggregator-sdk`\n * is **only fully compatible with `SuiJsonRpcClient`**. It calls legacy\n * JSON-RPC-only methods (`getDynamicFieldObject`, `getCoins`,\n * `getOwnedObjects`, `devInspectTransactionBlock`) for specific routes:\n *\n * - Pyth-priced routes (uses `getDynamicFieldObject` to resolve price\n * feeds in `routerSwap`).\n * - DeepBookV3 routes (uses `getCoins` for coin merging and\n * `getOwnedObjects` to mint/find an account cap).\n *\n * Passing a `SuiGrpcClient` / `SuiGraphQLClient` will work for plain\n * `findRouters + routerSwap` routes but **will throw at runtime** for the\n * cases above. If you need full Cetus coverage, pass a `SuiJsonRpcClient`\n * here (or disable the Cetus provider, or update to the latest cetus sdk that fully compatible with any sui client).\n */\n client?: ClientWithCoreApi;\n /**Hermes Api url, if not specified, the default hermes api url will be used */\n hermesApi?: string;\n /**Address to receive commission, if not specified, the commission will not be used */\n partner?: string;\n /**@default 0 */\n partnerCommissionBps?: number;\n /**@default 100 */\n slippageBps?: number;\n /**\n * Tip to support 7k\n * @default 0 */\n tipBps?: number;\n}\nexport interface MetaQuoteOptions {\n coinTypeIn: string;\n coinTypeOut: string;\n amountIn: string;\n /** Required for api-tx providers (ie: Okx) */\n signer?: string;\n /**\n * Timeout for quote operation in milliseconds\n * @default 2000ms\n */\n timeout?: number;\n}\nexport interface MetaSimulationOptions {\n sender: string;\n /**\n * Timeout for simulation operation in milliseconds\n * @default 2000ms\n */\n timeout?: number;\n /** If specify, defer the simulation that could reduce the time to display quote result, you must update the quote via the id on callback\n * else await all quote and simulation before return\n */\n onSimulated?: (payload: MetaQuote) => void;\n}\nexport interface MetaFastSwapOptions {\n /** Quote object from the quote operation */\n quote: MetaQuote;\n /** Signer address (owner of `coinIn`) */\n signer: string;\n /** If true, use the gas coin for the swap\n * @default true */\n useGasCoin?: boolean;\n /**\n * Sign the transaction bytes\n * @param txBytes - base64 transaction bytes\n * @returns - signature with bytes\n */\n signTransaction: (txBytes: string) => Promise<SignatureWithBytes>;\n}\nexport interface MetaSwapOptions {\n /** Quote object from the quote operation */\n quote: MetaQuote;\n /** Signer address (owner of `coinIn`) */\n signer: string;\n /** Transaction object to add the swap operation */\n tx: Transaction;\n /**\n * Coin object used for the swap, must be consumed completely, no `coinIn` left, user must pass the coinIn object with the balance required for the swap - ie in quote `amountIn`\n * @warning `coinIn` value must match the quote `amountIn` */\n coinIn: TransactionObjectArgument;\n}\n\nexport type FlowxQuoteResponse = Awaited<\n ReturnType<AggregatorQuoter[\"getRoutes\"]>\n>;\nexport type MetaQuote = (\n | {\n provider: EProvider.BLUEFIN7K;\n quote: QuoteResponse;\n }\n | {\n provider: EProvider.CETUS;\n quote: RouterDataV3;\n }\n | {\n provider: EProvider.FLOWX;\n quote: FlowxQuoteResponse;\n }\n | {\n provider: EProvider.OKX;\n quote: OkxSwapResponseData;\n }\n) & {\n /** uuid to keep track the quote result, used to apply simulation result on quote on callback `onSimulated`*/\n id: string;\n /** coin type: ie 0x2::sui::SUI */\n coinTypeIn: string;\n /** coin type: ie 0x2::sui::SUI */\n coinTypeOut: string;\n /** Amount in as u64 */\n amountIn: string;\n /** Amount out as u64 if there're no commission be applied to the amount out */\n rawAmountOut: string;\n /** Amount as u64 after minus any commission kind */\n amountOut: string;\n /** Simulated amount out if the transaction is executed */\n simulatedAmountOut?: string;\n /** Estimate gas consumption if the transaction is executed */\n gasUsed?: SuiClientTypes.GasCostSummary;\n};\nexport interface QuoteProvider {\n readonly kind: EProvider;\n quote(_quoteOptions: MetaQuoteOptions): Promise<MetaQuote | null>;\n}\n\nexport interface SwapAPIProvider extends QuoteProvider {\n readonly kind: EProvider.OKX;\n fastSwap(options: MetaFastSwapOptions): Promise<string>;\n}\n\nexport interface AggregatorProvider extends QuoteProvider {\n readonly kind: EProvider.BLUEFIN7K | EProvider.CETUS | EProvider.FLOWX;\n swap(options: MetaSwapOptions): Promise<TransactionObjectArgument>;\n}\n\nexport const isAggregatorProvider = (\n provider: QuoteProvider,\n): provider is AggregatorProvider =>\n provider.kind === EProvider.BLUEFIN7K ||\n provider.kind === EProvider.CETUS ||\n provider.kind === EProvider.FLOWX;\n\nexport const isSwapAPIProvider = (\n provider: QuoteProvider,\n): provider is SwapAPIProvider => provider.kind === EProvider.OKX;\n","// export const _7K_PACKAGE_ID =\n// \"0x62412b7268c35f3808336aee57a52836501f40b8ba5d936f8ad275e672befd04\";\n// //legacy V4: \"0xe8f996ea6ff38c557c253d3b93cfe2ebf393816487266786371aa4532a9229f2\";\n// //legacy V3: \"0x7ea6e27ad7af6f3b8671d59df1aaebd7c03dddab893e52a714227b2f4fe91519\";\n// //legacy V2: \"0xa13447019cd982d6bef91cf7b46ad384a52583b1dfc2bdecf31ef0c4bd787a0f\";\n// //legacy V1: \"0xd48e7cdc9e92bec69ce3baa75578010458a0c5b2733d661a84971e8cef6806bc\";\n// export const _7K_CONFIG =\n// \"0x47442a93f7727d188ba7cb71031170d1786af70013cb7ad5115f3fe877ff0c54\";\n// //legacy v3: \"0x0f8fc23dbcc9362b72c7a4c5aa53fcefa02ebfbb83a812c8c262ccd2c076d9ee\";\n\n// export const _7K_VAULT =\n// \"0x442ad50389ed5cda6f7a6f5a7ae6361a4c05ef1d9fb2e54fbba5a268d690bfe6\";\n// //legacy v3: \"0x39a3c55742c0e011b6f65548e73cf589e1ae5e82dbfab449ca57f24c3bcd9514\";\nexport const _7K_META_PUBLISHED_AT =\n \"0x17c0b1f7a6ad73f51268f16b8c06c049eecc2f28a270cdd29c06e3d2dea23302\";\nexport const _7K_META_PACKAGE_ID =\n \"0x17c0b1f7a6ad73f51268f16b8c06c049eecc2f28a270cdd29c06e3d2dea23302\";\nexport const _7K_META_VAULT =\n \"0x9a8abd32fe5721307ce3b697cf982ee84e9ffbd58d667a4a199f1683c1a3d23c\";\nexport const _7K_META_CONFIG =\n \"0xbbb3a51877ed9b492f26f4e2181811cfb2bd70c532f6f7621263d122d5e96b56\";\nexport const _7K_PARTNER_ADDRESS =\n \"0x93ead46c1e48a9b62e25b6787f2ea6f75caedabb21726f12431acc4381f5f4c5\";\n","import { EProvider, MetaQuote, MetaQuoteOptions } from \"../../types/metaAg\";\n\nexport enum MetaAgErrorCode {\n UNKNOWN = 1000,\n TIMEOUT = 1001,\n PROVIDER_NOT_FOUND = 1002,\n PROVIDER_NOT_SUPPORTED = 1003,\n INVALID_QUOTE = 1004,\n QUOTE_NOT_FOUND = 1005,\n INVALID_SIGNER_ADDRESS = 1006,\n PROVIDER_NOT_SUPPORT_SWAP = 1007,\n SIMULATION_FAILED = 1008,\n // OKX error\n OKX_FINALIZE_COMMAND_NOT_FOUND = 1100,\n}\n\nexport type MetaAgErrorDetailsMap = {\n [MetaAgErrorCode.UNKNOWN]: unknown;\n [MetaAgErrorCode.TIMEOUT]: { timeout: number };\n [MetaAgErrorCode.PROVIDER_NOT_FOUND]: { provider: EProvider };\n [MetaAgErrorCode.PROVIDER_NOT_SUPPORTED]: { provider: EProvider };\n [MetaAgErrorCode.INVALID_QUOTE]: {\n quote: MetaQuote;\n expectedProvider: EProvider;\n };\n [MetaAgErrorCode.QUOTE_NOT_FOUND]: {\n provider: EProvider;\n quoteOptions?: MetaQuoteOptions;\n };\n [MetaAgErrorCode.INVALID_SIGNER_ADDRESS]: { signer: string };\n [MetaAgErrorCode.PROVIDER_NOT_SUPPORT_SWAP]: { provider: EProvider };\n [MetaAgErrorCode.SIMULATION_FAILED]: { error: string | undefined };\n // OKX error\n [MetaAgErrorCode.OKX_FINALIZE_COMMAND_NOT_FOUND]: { packageId: string };\n};\n\nexport type MetaAgErrorDetails<T extends MetaAgErrorCode> =\n T extends keyof MetaAgErrorDetailsMap ? MetaAgErrorDetailsMap[T] : never;\n\nexport class MetaAgError<T extends MetaAgErrorCode> extends Error {\n code: T;\n details?: MetaAgErrorDetails<T>;\n constructor(message: string, code?: T, details?: MetaAgErrorDetails<T>) {\n super(message);\n this.name = \"MetaAgError\";\n this.code = code ?? (MetaAgErrorCode.UNKNOWN as T);\n this.details = details;\n }\n\n static assert<T extends MetaAgErrorCode>(\n condition: any,\n message?: string | null,\n code?: T,\n details?: MetaAgErrorDetails<T>,\n ): asserts condition {\n if (!condition) {\n throw new MetaAgError(message ?? \"Assertion failed\", code, details);\n }\n }\n}\n","import {\n coinWithBalance,\n Transaction,\n TransactionObjectArgument,\n} from \"@mysten/sui/transactions\";\nimport {\n _7K_META_CONFIG,\n _7K_META_PACKAGE_ID,\n _7K_META_PUBLISHED_AT,\n _7K_META_VAULT,\n} from \"../../constants/_7k\";\nimport {\n AggregatorProvider,\n EProvider,\n MetaAgOptions,\n MetaQuote,\n MetaSimulationOptions,\n} from \"../../types/metaAg\";\nimport type { SimulateTransactionResult } from \"../../utils/SuiClientUtils\";\nimport { SuiClientUtils } from \"../../utils/SuiClientUtils\";\nimport { getExpectedReturn } from \"../../utils/swap\";\nimport { MetaAgError, MetaAgErrorCode } from \"./error\";\n\ntype SimulatedTransaction = NonNullable<\n | SimulateTransactionResult[\"Transaction\"]\n | SimulateTransactionResult[\"FailedTransaction\"]\n>;\ntype SimulatedEvent = NonNullable<SimulatedTransaction[\"events\"]>[number];\n\n/**\n * v2 gRPC returns a `{ Transaction?, FailedTransaction? }` envelope from\n * both `executeTransaction` and `simulateTransaction`. Unwrap to the inner\n * payload, throwing `SIMULATION_FAILED` if neither arm is populated.\n */\nexport const unwrapTxResult = <\n T extends {\n Transaction?: unknown;\n FailedTransaction?: unknown;\n },\n>(\n res: T,\n msg = \"Transaction returned no result\",\n): NonNullable<T[\"Transaction\"] | T[\"FailedTransaction\"]> => {\n const inner = (res.Transaction ?? res.FailedTransaction) as\n | NonNullable<T[\"Transaction\"] | T[\"FailedTransaction\"]>\n | undefined;\n if (!inner) {\n throw new MetaAgError(msg, MetaAgErrorCode.SIMULATION_FAILED, {\n error: msg,\n });\n }\n return inner;\n};\n\n/**\n * Assert that `quote.provider` matches the expected provider kind. All\n * provider classes use this identical guard at the top of `swap`/`fastSwap`.\n */\nexport function assertQuoteProvider<E extends EProvider>(\n quote: MetaQuote,\n expected: E,\n): asserts quote is Extract<MetaQuote, { provider: E }> {\n MetaAgError.assert(\n quote.provider === expected,\n \"Invalid quote\",\n MetaAgErrorCode.INVALID_QUOTE,\n { quote, expectedProvider: expected },\n );\n}\n\nexport const simulateSwapTx = async (\n tx: Transaction,\n inspector: SuiClientUtils,\n simulation: MetaSimulationOptions,\n) => {\n const res = await timeout(\n () =>\n inspector.simulateTransaction({\n sender: simulation.sender,\n transactionBlock: tx,\n }),\n simulation.timeout ?? 2000,\n );\n const result = unwrapTxResult(res, \"Simulation failed\");\n const status = result.effects.status;\n if (!status.success) {\n const errorMessage = status.error.message ?? \"Simulation failed\";\n throw new MetaAgError(errorMessage, MetaAgErrorCode.SIMULATION_FAILED, {\n error: errorMessage,\n });\n }\n const amountOut = extractAmountOutWrapper(result.events ?? []);\n return {\n simulatedAmountOut: amountOut,\n gasUsed: result.effects.gasUsed,\n };\n};\nexport const simulateAggregator = async (\n provider: AggregatorProvider,\n quote: MetaQuote,\n simulation: MetaSimulationOptions,\n inspector: SuiClientUtils,\n options: Required<MetaAgOptions>,\n) => {\n const tx = new Transaction();\n const coinOut = await provider.swap({\n quote,\n coinIn: coinWithBalance({\n balance: BigInt(quote.amountIn),\n type: quote.coinTypeIn,\n useGasCoin: false,\n }),\n signer: simulation.sender,\n tx,\n });\n tx.add(\n metaSettle(\n quote,\n coinOut,\n 10000,\n options.tipBps,\n options.partner,\n options.partnerCommissionBps,\n ),\n );\n tx.transferObjects([coinOut], simulation.sender);\n const res = await simulateSwapTx(tx, inspector, simulation);\n return {\n id: quote.id,\n provider: provider.kind,\n ...res,\n };\n};\n\n/**\n * this settlement does not charge commission fee for partner, since all integrated aggregators already charge commission fee for partner\n * @param quote Meta Aggregator Quote\n * @param coinOut Coin Out Object\n * @param slippageBps Slippage Bps\n * @param tipBps Tip Bps default = 0\n * @param partner address of partner for analytic default is zero address\n */\nexport const metaSettle = (\n quote: MetaQuote,\n coinOut: TransactionObjectArgument,\n slippageBps = 100,\n tipBps = 0,\n partner?: string,\n commissionBps = 0,\n) => {\n return (tx: Transaction) => {\n const { minAmount, expectedAmount } = getExpectedReturn(\n quote.rawAmountOut,\n slippageBps,\n commissionBps,\n tipBps,\n );\n\n if (tipBps > 0) {\n tx.moveCall({\n target: `${_7K_META_PUBLISHED_AT}::vault::collect_tip`,\n typeArguments: [quote.coinTypeOut],\n arguments: [\n tx.object(_7K_META_VAULT),\n tx.object(_7K_META_CONFIG),\n coinOut,\n tx.pure.u64(tipBps),\n ],\n });\n }\n\n tx.moveCall({\n target: `${_7K_META_PUBLISHED_AT}::settle::settle`,\n typeArguments: [quote.coinTypeIn, quote.coinTypeOut],\n arguments: [\n tx.object(_7K_META_CONFIG),\n tx.object(_7K_META_VAULT),\n tx.pure.u64(quote.amountIn),\n coinOut,\n tx.pure.u64(minAmount),\n tx.pure.u64(expectedAmount),\n tx.pure.option(\"address\", partner),\n tx.pure.u64(commissionBps),\n tx.pure.u64(0), // ps\n ],\n });\n };\n};\n\nconst extractAmountOutWrapper = (events: SimulatedEvent[]) => {\n const swapEvent = events\n .filter(\n (event) => event.eventType === `${_7K_META_PACKAGE_ID}::settle::Swap`,\n )\n ?.pop();\n const json = swapEvent?.json as { amount_out?: string } | null | undefined;\n return json?.amount_out;\n};\n\nexport const timeout = async <T>(\n fn: () => Promise<T>,\n timeout: number,\n msg?: string,\n): Promise<T> => {\n if (timeout <= 0) return fn();\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(\n () =>\n reject(\n new MetaAgError(\n `Timeout ${msg ?? \"operation\"}`,\n MetaAgErrorCode.TIMEOUT,\n { timeout },\n ),\n ),\n timeout,\n );\n fn()\n .then(resolve)\n .catch(reject)\n .finally(() => clearTimeout(timer));\n });\n};\n","/**\n * Calculate expected return amount after applying slippage, commission, and tip\n * @param returnAmount - The raw return amount (with decimals)\n * @param slippageBps - Slippage in basis points (1 bps = 0.01%)\n * @param commissionBps - Commission in basis points\n * @param tipBps - Tip in basis points (default: 0)\n * @returns Object containing tipAmount, minAmount, commissionAmount, and expectedAmount\n */\nexport const getExpectedReturn = (\n returnAmount: string,\n slippageBps: number,\n commissionBps: number,\n tipBps: number = 0,\n) => {\n if (slippageBps > 10000) {\n throw new Error(\"Slippage must be less than 100%\");\n }\n if (commissionBps > 10000) {\n throw new Error(\"Commission must be less than 100%\");\n }\n if (tipBps > 10000) {\n throw new Error(\"Tip must be less than 100%\");\n }\n const returnAmountWithDecimal = BigInt(returnAmount);\n const tipAmountWithDecimal =\n (returnAmountWithDecimal * BigInt(tipBps || 0)) / 10000n;\n const commissionAmountWithDecimal =\n ((returnAmountWithDecimal - tipAmountWithDecimal) * BigInt(commissionBps)) /\n 10000n;\n const expectedReturnWithDecimal =\n returnAmountWithDecimal -\n tipAmountWithDecimal -\n commissionAmountWithDecimal;\n const minAmountWithDecimal =\n (expectedReturnWithDecimal * BigInt(1e4 - slippageBps)) / 10000n;\n\n return {\n tipAmount: tipAmountWithDecimal,\n minAmount: minAmountWithDecimal,\n commissionAmount: commissionAmountWithDecimal,\n expectedAmount: expectedReturnWithDecimal.toString(10),\n };\n};\n"],"mappings":"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","names":["EProvider","isAggregatorProvider","provider","isSwapAPIProvider","_7K_META_PUBLISHED_AT","_7K_META_PACKAGE_ID","_7K_META_VAULT","_7K_META_CONFIG","_7K_PARTNER_ADDRESS","MetaAgError","_MetaAgError","message","code","details","__publicField","condition","coinWithBalance","Transaction","getExpectedReturn","returnAmount","slippageBps","commissionBps","tipBps","returnAmountWithDecimal","tipAmountWithDecimal","commissionAmountWithDecimal","expectedReturnWithDecimal","minAmountWithDecimal","unwrapTxResult","res","msg","inner","MetaAgError","assertQuoteProvider","quote","expected","simulateSwapTx","tx","inspector","simulation","timeout","result","status","errorMessage","extractAmountOutWrapper","simulateAggregator","provider","options","Transaction","coinOut","coinWithBalance","metaSettle","slippageBps","tipBps","partner","commissionBps","minAmount","expectedAmount","getExpectedReturn","_7K_META_PUBLISHED_AT","_7K_META_VAULT","_7K_META_CONFIG","events","event","_7K_META_PACKAGE_ID","fn","resolve","reject","timer"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/otis/Documents/7k-ts-sdk/dist/chunk-E5KM5OVW.js","../src/types/metaAg.ts","../src/constants/_7k.ts","../src/features/metaAg/error.ts","../src/features/metaAg/common.ts","../src/utils/swap.ts"],"names":["EProvider","isAggregatorProvider","provider","isSwapAPIProvider","_7K_META_PUBLISHED_AT","_7K_META_PACKAGE_ID","_7K_META_VAULT","_7K_META_CONFIG","_7K_PARTNER_ADDRESS","MetaAgError","_MetaAgError","message","code","details","__publicField","condition","getExpectedReturn","returnAmount","slippageBps","commissionBps","tipBps","returnAmountWithDecimal","tipAmountWithDecimal","commissionAmountWithDecimal","expectedReturnWithDecimal","minAmountWithDecimal","unwrapTxResult","res","msg","inner","assertQuoteProvider","quote","expected","simulateSwapTx","tx","inspector","simulation","timeout","result","status","errorMessage","extractAmountOutWrapper","simulateAggregator","options","Transaction","coinOut","coinWithBalance","metaSettle","partner","minAmount","expectedAmount"],"mappings":"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","file":"/Users/otis/Documents/7k-ts-sdk/dist/chunk-E5KM5OVW.js","sourcesContent":[null,"import type {\n QuoteResponse,\n SourceDex,\n} from \"@bluefin-exchange/bluefin7k-aggregator-sdk\";\nimport type {\n PreSwapLpChangeParams,\n RouterDataV3,\n} from \"@cetusprotocol/aggregator-sdk\";\nimport type { AggregatorQuoter, Protocol } from \"@flowx-finance/sdk\";\nimport { ClientWithCoreApi, SuiClientTypes } from \"@mysten/sui/client\";\nimport { SignatureWithBytes } from \"@mysten/sui/cryptography\";\nimport type {\n Transaction,\n TransactionObjectArgument,\n} from \"@mysten/sui/transactions\";\nimport { OkxSwapResponseData } from \"./okx\";\n\nexport enum EProvider {\n BLUEFIN7K = \"bluefin7k\",\n CETUS = \"cetus\",\n FLOWX = \"flowx\",\n OKX = \"okx\",\n}\ntype ProviderBaseOptions = {\n api?: string;\n apiKey?: string;\n disabled?: boolean;\n};\nexport type Bluefin7kProviderOptions = ProviderBaseOptions & {\n sources?: SourceDex[];\n excludedPools?: string[];\n targetPools?: string[];\n};\nexport type FlowxProviderOptions = ProviderBaseOptions & {\n sources?: Protocol[];\n excludePools?: string[];\n excludeSources?: Protocol[];\n maxHops?: number;\n splitDistributionPercent?: number;\n};\nexport type CetusProviderOptions = ProviderBaseOptions & {\n sources?: string[];\n splitCount?: number;\n splitAlgorithm?: string;\n splitFactor?: number;\n depth?: number;\n liquidityChanges?: PreSwapLpChangeParams[];\n};\nexport type OkxProviderOptions = Required<Omit<ProviderBaseOptions, \"api\">> & {\n api?: string;\n secretKey: string;\n apiPassphrase: string;\n projectId: string;\n};\nexport interface MetaAgOptions {\n /**If not specified, all providers will be used */\n providers?: {\n [EProvider.BLUEFIN7K]?: Bluefin7kProviderOptions;\n [EProvider.FLOWX]?: FlowxProviderOptions;\n [EProvider.CETUS]?: CetusProviderOptions;\n [EProvider.OKX]?: OkxProviderOptions;\n };\n /**\n * Sui client to use for on-chain reads, simulation, and execution. Accepts\n * any v2 `ClientWithCoreApi` implementation (`SuiGrpcClient`,\n * `SuiGraphQLClient`, `SuiJsonRpcClient`, or a custom transport). If not\n * specified, a default `SuiGrpcClient` against Sui mainnet is constructed.\n *\n * @warning **Cetus provider compatibility**: `@cetusprotocol/aggregator-sdk`\n * is **only fully compatible with `SuiJsonRpcClient`**. It calls legacy\n * JSON-RPC-only methods (`getDynamicFieldObject`, `getCoins`,\n * `getOwnedObjects`, `devInspectTransactionBlock`) for specific routes:\n *\n * - Pyth-priced routes (uses `getDynamicFieldObject` to resolve price\n * feeds in `routerSwap`).\n * - DeepBookV3 routes (uses `getCoins` for coin merging and\n * `getOwnedObjects` to mint/find an account cap).\n *\n * Passing a `SuiGrpcClient` / `SuiGraphQLClient` will work for plain\n * `findRouters + routerSwap` routes but **will throw at runtime** for the\n * cases above. If you need full Cetus coverage, pass a `SuiJsonRpcClient`\n * here (or disable the Cetus provider, or update to the latest cetus sdk that fully compatible with any sui client).\n */\n client?: ClientWithCoreApi;\n /**Hermes Api url, if not specified, the default hermes api url will be used */\n hermesApi?: string;\n /**Address to receive commission, if not specified, the commission will not be used */\n partner?: string;\n /**@default 0 */\n partnerCommissionBps?: number;\n /**@default 100 */\n slippageBps?: number;\n /**\n * Tip to support 7k\n * @default 0 */\n tipBps?: number;\n}\nexport interface MetaQuoteOptions {\n coinTypeIn: string;\n coinTypeOut: string;\n amountIn: string;\n /** Required for api-tx providers (ie: Okx) */\n signer?: string;\n /**\n * Timeout for quote operation in milliseconds\n * @default 2000ms\n */\n timeout?: number;\n}\nexport interface MetaSimulationOptions {\n sender: string;\n /**\n * Timeout for simulation operation in milliseconds\n * @default 2000ms\n */\n timeout?: number;\n /** If specify, defer the simulation that could reduce the time to display quote result, you must update the quote via the id on callback\n * else await all quote and simulation before return\n */\n onSimulated?: (payload: MetaQuote) => void;\n}\nexport interface MetaFastSwapOptions {\n /** Quote object from the quote operation */\n quote: MetaQuote;\n /** Signer address (owner of `coinIn`) */\n signer: string;\n /** If true, use the gas coin for the swap\n * @default true */\n useGasCoin?: boolean;\n /**\n * Sign the transaction bytes\n * @param txBytes - base64 transaction bytes\n * @returns - signature with bytes\n */\n signTransaction: (txBytes: string) => Promise<SignatureWithBytes>;\n}\nexport interface MetaSwapOptions {\n /** Quote object from the quote operation */\n quote: MetaQuote;\n /** Signer address (owner of `coinIn`) */\n signer: string;\n /** Transaction object to add the swap operation */\n tx: Transaction;\n /**\n * Coin object used for the swap, must be consumed completely, no `coinIn` left, user must pass the coinIn object with the balance required for the swap - ie in quote `amountIn`\n * @warning `coinIn` value must match the quote `amountIn` */\n coinIn: TransactionObjectArgument;\n}\n\nexport type FlowxQuoteResponse = Awaited<\n ReturnType<AggregatorQuoter[\"getRoutes\"]>\n>;\nexport type MetaQuote = (\n | {\n provider: EProvider.BLUEFIN7K;\n quote: QuoteResponse;\n }\n | {\n provider: EProvider.CETUS;\n quote: RouterDataV3;\n }\n | {\n provider: EProvider.FLOWX;\n quote: FlowxQuoteResponse;\n }\n | {\n provider: EProvider.OKX;\n quote: OkxSwapResponseData;\n }\n) & {\n /** uuid to keep track the quote result, used to apply simulation result on quote on callback `onSimulated`*/\n id: string;\n /** coin type: ie 0x2::sui::SUI */\n coinTypeIn: string;\n /** coin type: ie 0x2::sui::SUI */\n coinTypeOut: string;\n /** Amount in as u64 */\n amountIn: string;\n /** Amount out as u64 if there're no commission be applied to the amount out */\n rawAmountOut: string;\n /** Amount as u64 after minus any commission kind */\n amountOut: string;\n /** Simulated amount out if the transaction is executed */\n simulatedAmountOut?: string;\n /** Estimate gas consumption if the transaction is executed */\n gasUsed?: SuiClientTypes.GasCostSummary;\n};\nexport interface QuoteProvider {\n readonly kind: EProvider;\n quote(_quoteOptions: MetaQuoteOptions): Promise<MetaQuote | null>;\n}\n\nexport interface SwapAPIProvider extends QuoteProvider {\n readonly kind: EProvider.OKX;\n fastSwap(options: MetaFastSwapOptions): Promise<string>;\n}\n\nexport interface AggregatorProvider extends QuoteProvider {\n readonly kind: EProvider.BLUEFIN7K | EProvider.CETUS | EProvider.FLOWX;\n swap(options: MetaSwapOptions): Promise<TransactionObjectArgument>;\n}\n\nexport const isAggregatorProvider = (\n provider: QuoteProvider,\n): provider is AggregatorProvider =>\n provider.kind === EProvider.BLUEFIN7K ||\n provider.kind === EProvider.CETUS ||\n provider.kind === EProvider.FLOWX;\n\nexport const isSwapAPIProvider = (\n provider: QuoteProvider,\n): provider is SwapAPIProvider => provider.kind === EProvider.OKX;\n","// export const _7K_PACKAGE_ID =\n// \"0x62412b7268c35f3808336aee57a52836501f40b8ba5d936f8ad275e672befd04\";\n// //legacy V4: \"0xe8f996ea6ff38c557c253d3b93cfe2ebf393816487266786371aa4532a9229f2\";\n// //legacy V3: \"0x7ea6e27ad7af6f3b8671d59df1aaebd7c03dddab893e52a714227b2f4fe91519\";\n// //legacy V2: \"0xa13447019cd982d6bef91cf7b46ad384a52583b1dfc2bdecf31ef0c4bd787a0f\";\n// //legacy V1: \"0xd48e7cdc9e92bec69ce3baa75578010458a0c5b2733d661a84971e8cef6806bc\";\n// export const _7K_CONFIG =\n// \"0x47442a93f7727d188ba7cb71031170d1786af70013cb7ad5115f3fe877ff0c54\";\n// //legacy v3: \"0x0f8fc23dbcc9362b72c7a4c5aa53fcefa02ebfbb83a812c8c262ccd2c076d9ee\";\n\n// export const _7K_VAULT =\n// \"0x442ad50389ed5cda6f7a6f5a7ae6361a4c05ef1d9fb2e54fbba5a268d690bfe6\";\n// //legacy v3: \"0x39a3c55742c0e011b6f65548e73cf589e1ae5e82dbfab449ca57f24c3bcd9514\";\nexport const _7K_META_PUBLISHED_AT =\n \"0x17c0b1f7a6ad73f51268f16b8c06c049eecc2f28a270cdd29c06e3d2dea23302\";\nexport const _7K_META_PACKAGE_ID =\n \"0x17c0b1f7a6ad73f51268f16b8c06c049eecc2f28a270cdd29c06e3d2dea23302\";\nexport const _7K_META_VAULT =\n \"0x9a8abd32fe5721307ce3b697cf982ee84e9ffbd58d667a4a199f1683c1a3d23c\";\nexport const _7K_META_CONFIG =\n \"0xbbb3a51877ed9b492f26f4e2181811cfb2bd70c532f6f7621263d122d5e96b56\";\nexport const _7K_PARTNER_ADDRESS =\n \"0x93ead46c1e48a9b62e25b6787f2ea6f75caedabb21726f12431acc4381f5f4c5\";\n","import { EProvider, MetaQuote, MetaQuoteOptions } from \"../../types/metaAg\";\n\nexport enum MetaAgErrorCode {\n UNKNOWN = 1000,\n TIMEOUT = 1001,\n PROVIDER_NOT_FOUND = 1002,\n PROVIDER_NOT_SUPPORTED = 1003,\n INVALID_QUOTE = 1004,\n QUOTE_NOT_FOUND = 1005,\n INVALID_SIGNER_ADDRESS = 1006,\n PROVIDER_NOT_SUPPORT_SWAP = 1007,\n SIMULATION_FAILED = 1008,\n // OKX error\n OKX_FINALIZE_COMMAND_NOT_FOUND = 1100,\n}\n\nexport type MetaAgErrorDetailsMap = {\n [MetaAgErrorCode.UNKNOWN]: unknown;\n [MetaAgErrorCode.TIMEOUT]: { timeout: number };\n [MetaAgErrorCode.PROVIDER_NOT_FOUND]: { provider: EProvider };\n [MetaAgErrorCode.PROVIDER_NOT_SUPPORTED]: { provider: EProvider };\n [MetaAgErrorCode.INVALID_QUOTE]: {\n quote: MetaQuote;\n expectedProvider: EProvider;\n };\n [MetaAgErrorCode.QUOTE_NOT_FOUND]: {\n provider: EProvider;\n quoteOptions?: MetaQuoteOptions;\n };\n [MetaAgErrorCode.INVALID_SIGNER_ADDRESS]: { signer: string };\n [MetaAgErrorCode.PROVIDER_NOT_SUPPORT_SWAP]: { provider: EProvider };\n [MetaAgErrorCode.SIMULATION_FAILED]: { error: string | undefined };\n // OKX error\n [MetaAgErrorCode.OKX_FINALIZE_COMMAND_NOT_FOUND]: { packageId: string };\n};\n\nexport type MetaAgErrorDetails<T extends MetaAgErrorCode> =\n T extends keyof MetaAgErrorDetailsMap ? MetaAgErrorDetailsMap[T] : never;\n\nexport class MetaAgError<T extends MetaAgErrorCode> extends Error {\n code: T;\n details?: MetaAgErrorDetails<T>;\n constructor(message: string, code?: T, details?: MetaAgErrorDetails<T>) {\n super(message);\n this.name = \"MetaAgError\";\n this.code = code ?? (MetaAgErrorCode.UNKNOWN as T);\n this.details = details;\n }\n\n static assert<T extends MetaAgErrorCode>(\n condition: any,\n message?: string | null,\n code?: T,\n details?: MetaAgErrorDetails<T>,\n ): asserts condition {\n if (!condition) {\n throw new MetaAgError(message ?? \"Assertion failed\", code, details);\n }\n }\n}\n","import {\n coinWithBalance,\n Transaction,\n TransactionObjectArgument,\n} from \"@mysten/sui/transactions\";\nimport {\n _7K_META_CONFIG,\n _7K_META_PACKAGE_ID,\n _7K_META_PUBLISHED_AT,\n _7K_META_VAULT,\n} from \"../../constants/_7k\";\nimport {\n AggregatorProvider,\n EProvider,\n MetaAgOptions,\n MetaQuote,\n MetaSimulationOptions,\n} from \"../../types/metaAg\";\nimport type { SimulateTransactionResult } from \"../../utils/SuiClientUtils\";\nimport { SuiClientUtils } from \"../../utils/SuiClientUtils\";\nimport { getExpectedReturn } from \"../../utils/swap\";\nimport { MetaAgError, MetaAgErrorCode } from \"./error\";\n\ntype SimulatedTransaction = NonNullable<\n | SimulateTransactionResult[\"Transaction\"]\n | SimulateTransactionResult[\"FailedTransaction\"]\n>;\ntype SimulatedEvent = NonNullable<SimulatedTransaction[\"events\"]>[number];\n\n/**\n * v2 gRPC returns a `{ Transaction?, FailedTransaction? }` envelope from\n * both `executeTransaction` and `simulateTransaction`. Unwrap to the inner\n * payload, throwing `SIMULATION_FAILED` if neither arm is populated.\n */\nexport const unwrapTxResult = <\n T extends {\n Transaction?: unknown;\n FailedTransaction?: unknown;\n },\n>(\n res: T,\n msg = \"Transaction returned no result\",\n): NonNullable<T[\"Transaction\"] | T[\"FailedTransaction\"]> => {\n const inner = (res.Transaction ?? res.FailedTransaction) as\n | NonNullable<T[\"Transaction\"] | T[\"FailedTransaction\"]>\n | undefined;\n if (!inner) {\n throw new MetaAgError(msg, MetaAgErrorCode.SIMULATION_FAILED, {\n error: msg,\n });\n }\n return inner;\n};\n\n/**\n * Assert that `quote.provider` matches the expected provider kind. All\n * provider classes use this identical guard at the top of `swap`/`fastSwap`.\n */\nexport function assertQuoteProvider<E extends EProvider>(\n quote: MetaQuote,\n expected: E,\n): asserts quote is Extract<MetaQuote, { provider: E }> {\n MetaAgError.assert(\n quote.provider === expected,\n \"Invalid quote\",\n MetaAgErrorCode.INVALID_QUOTE,\n { quote, expectedProvider: expected },\n );\n}\n\nexport const simulateSwapTx = async (\n tx: Transaction,\n inspector: SuiClientUtils,\n simulation: MetaSimulationOptions,\n) => {\n const res = await timeout(\n () =>\n inspector.simulateTransaction({\n sender: simulation.sender,\n transactionBlock: tx,\n }),\n simulation.timeout ?? 2000,\n );\n const result = unwrapTxResult(res, \"Simulation failed\");\n const status = result.effects.status;\n if (!status.success) {\n const errorMessage = status.error.message ?? \"Simulation failed\";\n throw new MetaAgError(errorMessage, MetaAgErrorCode.SIMULATION_FAILED, {\n error: errorMessage,\n });\n }\n const amountOut = extractAmountOutWrapper(result.events ?? []);\n return {\n simulatedAmountOut: amountOut,\n gasUsed: result.effects.gasUsed,\n };\n};\nexport const simulateAggregator = async (\n provider: AggregatorProvider,\n quote: MetaQuote,\n simulation: MetaSimulationOptions,\n inspector: SuiClientUtils,\n options: Required<MetaAgOptions>,\n) => {\n const tx = new Transaction();\n const coinOut = await provider.swap({\n quote,\n coinIn: coinWithBalance({\n balance: BigInt(quote.amountIn),\n type: quote.coinTypeIn,\n useGasCoin: false,\n }),\n signer: simulation.sender,\n tx,\n });\n tx.add(\n metaSettle(\n quote,\n coinOut,\n 10000,\n options.tipBps,\n options.partner,\n options.partnerCommissionBps,\n ),\n );\n tx.transferObjects([coinOut], simulation.sender);\n const res = await simulateSwapTx(tx, inspector, simulation);\n return {\n id: quote.id,\n provider: provider.kind,\n ...res,\n };\n};\n\n/**\n * this settlement does not charge commission fee for partner, since all integrated aggregators already charge commission fee for partner\n * @param quote Meta Aggregator Quote\n * @param coinOut Coin Out Object\n * @param slippageBps Slippage Bps\n * @param tipBps Tip Bps default = 0\n * @param partner address of partner for analytic default is zero address\n */\nexport const metaSettle = (\n quote: MetaQuote,\n coinOut: TransactionObjectArgument,\n slippageBps = 100,\n tipBps = 0,\n partner?: string,\n commissionBps = 0,\n) => {\n return (tx: Transaction) => {\n const { minAmount, expectedAmount } = getExpectedReturn(\n quote.rawAmountOut,\n slippageBps,\n commissionBps,\n tipBps,\n );\n\n if (tipBps > 0) {\n tx.moveCall({\n target: `${_7K_META_PUBLISHED_AT}::vault::collect_tip`,\n typeArguments: [quote.coinTypeOut],\n arguments: [\n tx.object(_7K_META_VAULT),\n tx.object(_7K_META_CONFIG),\n coinOut,\n tx.pure.u64(tipBps),\n ],\n });\n }\n\n tx.moveCall({\n target: `${_7K_META_PUBLISHED_AT}::settle::settle`,\n typeArguments: [quote.coinTypeIn, quote.coinTypeOut],\n arguments: [\n tx.object(_7K_META_CONFIG),\n tx.object(_7K_META_VAULT),\n tx.pure.u64(quote.amountIn),\n coinOut,\n tx.pure.u64(minAmount),\n tx.pure.u64(expectedAmount),\n tx.pure.option(\"address\", partner),\n tx.pure.u64(commissionBps),\n tx.pure.u64(0), // ps\n ],\n });\n };\n};\n\nconst extractAmountOutWrapper = (events: SimulatedEvent[]) => {\n const swapEvent = events\n .filter(\n (event) => event.eventType === `${_7K_META_PACKAGE_ID}::settle::Swap`,\n )\n ?.pop();\n const json = swapEvent?.json as { amount_out?: string } | null | undefined;\n return json?.amount_out;\n};\n\nexport const timeout = async <T>(\n fn: () => Promise<T>,\n timeout: number,\n msg?: string,\n): Promise<T> => {\n if (timeout <= 0) return fn();\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(\n () =>\n reject(\n new MetaAgError(\n `Timeout ${msg ?? \"operation\"}`,\n MetaAgErrorCode.TIMEOUT,\n { timeout },\n ),\n ),\n timeout,\n );\n fn()\n .then(resolve)\n .catch(reject)\n .finally(() => clearTimeout(timer));\n });\n};\n","/**\n * Calculate expected return amount after applying slippage, commission, and tip\n * @param returnAmount - The raw return amount (with decimals)\n * @param slippageBps - Slippage in basis points (1 bps = 0.01%)\n * @param commissionBps - Commission in basis points\n * @param tipBps - Tip in basis points (default: 0)\n * @returns Object containing tipAmount, minAmount, commissionAmount, and expectedAmount\n */\nexport const getExpectedReturn = (\n returnAmount: string,\n slippageBps: number,\n commissionBps: number,\n tipBps: number = 0,\n) => {\n if (slippageBps > 10000) {\n throw new Error(\"Slippage must be less than 100%\");\n }\n if (commissionBps > 10000) {\n throw new Error(\"Commission must be less than 100%\");\n }\n if (tipBps > 10000) {\n throw new Error(\"Tip must be less than 100%\");\n }\n const returnAmountWithDecimal = BigInt(returnAmount);\n const tipAmountWithDecimal =\n (returnAmountWithDecimal * BigInt(tipBps || 0)) / 10000n;\n const commissionAmountWithDecimal =\n ((returnAmountWithDecimal - tipAmountWithDecimal) * BigInt(commissionBps)) /\n 10000n;\n const expectedReturnWithDecimal =\n returnAmountWithDecimal -\n tipAmountWithDecimal -\n commissionAmountWithDecimal;\n const minAmountWithDecimal =\n (expectedReturnWithDecimal * BigInt(1e4 - slippageBps)) / 10000n;\n\n return {\n tipAmount: tipAmountWithDecimal,\n minAmount: minAmountWithDecimal,\n commissionAmount: commissionAmountWithDecimal,\n expectedAmount: expectedReturnWithDecimal.toString(10),\n };\n};\n"]}
|
package/dist/flowx-FTPJ3RYF.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as o,h as i,j as n,k as u}from"./chunk-CYI4MM5C.mjs";import{AggregatorQuoter as a,Commission as m,CommissionType as c,TradeBuilder as p}from"@flowx-finance/sdk";import{v4 as d}from"uuid";var s=class{constructor(t,e){this.options=t;this.client=e;o(this,"kind","flowx");o(this,"quoter");this.quoter=new a("mainnet",t.apiKey)}async quote(t){let e=await this.quoter.getRoutes({amountIn:t.amountIn,tokenIn:t.coinTypeIn,tokenOut:t.coinTypeOut,includeSources:this.options.sources,excludePools:this.options.excludePools,excludeSources:this.options.excludeSources,maxHops:this.options.maxHops,splitDistributionPercent:this.options.splitDistributionPercent});return{id:d(),provider:"flowx",quote:e,amountIn:e.amountIn?.toString()??"0",rawAmountOut:e.amountOut?.toString()??"0",amountOut:e.amountOut?.toString()??"0",coinTypeIn:t.coinTypeIn,coinTypeOut:t.coinTypeOut}}async swap(t){u(t.quote,"flowx");let e=new p("mainnet",t.quote.quote.routes);e.sender(t.signer),e.slippage(1e4*100),e.commission(new m(i,t.quote.quote.coinOut,c.PERCENTAGE,0,!0));let r=await e.build().swap({tx:t.tx,client:this.client,coinIn:t.coinIn});return n.assert(!!r,"FlowX swap returned no coin out",1004,{quote:t.quote,expectedProvider:"flowx"}),r}};export{s as FlowxProvider};
|
|
2
|
-
//# sourceMappingURL=flowx-FTPJ3RYF.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/features/metaAg/providers/flowx.ts"],"sourcesContent":["import {\n AggregatorQuoter,\n Commission,\n CommissionType,\n TradeBuilder,\n} from \"@flowx-finance/sdk\";\nimport { ClientWithCoreApi } from \"@mysten/sui/client\";\nimport { SuiGrpcClient } from \"@mysten/sui/grpc\";\nimport { TransactionObjectArgument } from \"@mysten/sui/transactions\";\nimport { v4 } from \"uuid\";\nimport { _7K_PARTNER_ADDRESS } from \"../../../constants/_7k\";\nimport {\n AggregatorProvider,\n EProvider,\n FlowxProviderOptions,\n MetaQuote,\n MetaQuoteOptions,\n MetaSwapOptions,\n QuoteProvider,\n} from \"../../../types/metaAg\";\nimport { assertQuoteProvider } from \"../common\";\nimport { MetaAgError, MetaAgErrorCode } from \"../error\";\n\nexport class FlowxProvider implements QuoteProvider, AggregatorProvider {\n readonly kind = EProvider.FLOWX;\n private quoter: AggregatorQuoter;\n constructor(\n private readonly options: FlowxProviderOptions,\n private readonly client: ClientWithCoreApi,\n ) {\n this.quoter = new AggregatorQuoter(\"mainnet\", options.apiKey);\n }\n\n async quote(quoteOptions: MetaQuoteOptions): Promise<MetaQuote> {\n const quote = await this.quoter.getRoutes({\n amountIn: quoteOptions.amountIn,\n tokenIn: quoteOptions.coinTypeIn,\n tokenOut: quoteOptions.coinTypeOut,\n includeSources: this.options.sources,\n excludePools: this.options.excludePools,\n excludeSources: this.options.excludeSources,\n maxHops: this.options.maxHops,\n splitDistributionPercent: this.options.splitDistributionPercent,\n });\n return {\n id: v4(),\n provider: EProvider.FLOWX,\n quote: quote,\n amountIn: quote.amountIn?.toString() ?? \"0\",\n rawAmountOut: quote.amountOut?.toString() ?? \"0\",\n amountOut: quote.amountOut?.toString() ?? \"0\",\n coinTypeIn: quoteOptions.coinTypeIn,\n coinTypeOut: quoteOptions.coinTypeOut,\n };\n }\n\n async swap(options: MetaSwapOptions): Promise<TransactionObjectArgument> {\n assertQuoteProvider(options.quote, EProvider.FLOWX);\n const builder = new TradeBuilder(\"mainnet\", options.quote.quote.routes);\n builder.sender(options.signer);\n builder.slippage(10000 * 100);\n builder.commission(\n new Commission(\n _7K_PARTNER_ADDRESS,\n options.quote.quote.coinOut,\n CommissionType.PERCENTAGE,\n 0,\n true,\n ),\n );\n const res = await builder.build().swap({\n tx: options.tx,\n client: this.client as unknown as SuiGrpcClient,\n coinIn: options.coinIn,\n });\n MetaAgError.assert(\n !!res,\n \"FlowX swap returned no coin out\",\n MetaAgErrorCode.INVALID_QUOTE,\n { quote: options.quote, expectedProvider: EProvider.FLOWX },\n );\n return res;\n }\n}\n"],"mappings":"8DAAA,OACE,oBAAAA,EACA,cAAAC,EACA,kBAAAC,EACA,gBAAAC,MACK,qBAIP,OAAS,MAAAC,MAAU,OAcZ,IAAMC,EAAN,KAAiE,CAGtE,YACmBC,EACAC,EACjB,CAFiB,aAAAD,EACA,YAAAC,EAJnBC,EAAA,KAAS,gBACTA,EAAA,KAAQ,UAKN,KAAK,OAAS,IAAIC,EAAiB,UAAWH,EAAQ,MAAM,CAC9D,CAEA,MAAM,MAAMI,EAAoD,CAC9D,IAAMC,EAAQ,MAAM,KAAK,OAAO,UAAU,CACxC,SAAUD,EAAa,SACvB,QAASA,EAAa,WACtB,SAAUA,EAAa,YACvB,eAAgB,KAAK,QAAQ,QAC7B,aAAc,KAAK,QAAQ,aAC3B,eAAgB,KAAK,QAAQ,eAC7B,QAAS,KAAK,QAAQ,QACtB,yBAA0B,KAAK,QAAQ,wBACzC,CAAC,EACD,MAAO,CACL,GAAIE,EAAG,EACP,iBACA,MAAOD,EACP,SAAUA,EAAM,UAAU,SAAS,GAAK,IACxC,aAAcA,EAAM,WAAW,SAAS,GAAK,IAC7C,UAAWA,EAAM,WAAW,SAAS,GAAK,IAC1C,WAAYD,EAAa,WACzB,YAAaA,EAAa,WAC5B,CACF,CAEA,MAAM,KAAKJ,EAA8D,CACvEO,EAAoBP,EAAQ,aAAsB,EAClD,IAAMQ,EAAU,IAAIC,EAAa,UAAWT,EAAQ,MAAM,MAAM,MAAM,EACtEQ,EAAQ,OAAOR,EAAQ,MAAM,EAC7BQ,EAAQ,SAAS,IAAQ,GAAG,EAC5BA,EAAQ,WACN,IAAIE,EACFC,EACAX,EAAQ,MAAM,MAAM,QACpBY,EAAe,WACf,EACA,EACF,CACF,EACA,IAAMC,EAAM,MAAML,EAAQ,MAAM,EAAE,KAAK,CACrC,GAAIR,EAAQ,GACZ,OAAQ,KAAK,OACb,OAAQA,EAAQ,MAClB,CAAC,EACD,OAAAc,EAAY,OACV,CAAC,CAACD,EACF,uCAEA,CAAE,MAAOb,EAAQ,MAAO,wBAAkC,CAC5D,EACOa,CACT,CACF","names":["AggregatorQuoter","Commission","CommissionType","TradeBuilder","v4","FlowxProvider","options","client","__publicField","AggregatorQuoter","quoteOptions","quote","v4","assertQuoteProvider","builder","TradeBuilder","Commission","_7K_PARTNER_ADDRESS","CommissionType","res","MetaAgError"]}
|
package/dist/flowx-RRIX3SC4.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); 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 _sdk = require('@flowx-finance/sdk');var _uuid = require('uuid');var s=class{constructor(t,e){this.options=t;this.client=e;_chunkE5KM5OVWjs.a.call(void 0, this,"kind","flowx");_chunkE5KM5OVWjs.a.call(void 0, this,"quoter");this.quoter=new (0, _sdk.AggregatorQuoter)("mainnet",t.apiKey)}async quote(t){let e=await this.quoter.getRoutes({amountIn:t.amountIn,tokenIn:t.coinTypeIn,tokenOut:t.coinTypeOut,includeSources:this.options.sources,excludePools:this.options.excludePools,excludeSources:this.options.excludeSources,maxHops:this.options.maxHops,splitDistributionPercent:this.options.splitDistributionPercent});return{id:_uuid.v4.call(void 0, ),provider:"flowx",quote:e,amountIn:_nullishCoalesce(_optionalChain([e, 'access', _ => _.amountIn, 'optionalAccess', _2 => _2.toString, 'call', _3 => _3()]), () => ("0")),rawAmountOut:_nullishCoalesce(_optionalChain([e, 'access', _4 => _4.amountOut, 'optionalAccess', _5 => _5.toString, 'call', _6 => _6()]), () => ("0")),amountOut:_nullishCoalesce(_optionalChain([e, 'access', _7 => _7.amountOut, 'optionalAccess', _8 => _8.toString, 'call', _9 => _9()]), () => ("0")),coinTypeIn:t.coinTypeIn,coinTypeOut:t.coinTypeOut}}async swap(t){_chunkE5KM5OVWjs.k.call(void 0, t.quote,"flowx");let e=new (0, _sdk.TradeBuilder)("mainnet",t.quote.quote.routes);e.sender(t.signer),e.slippage(1e4*100),e.commission(new (0, _sdk.Commission)(_chunkE5KM5OVWjs.h,t.quote.quote.coinOut,_sdk.CommissionType.PERCENTAGE,0,!0));let r=await e.build().swap({tx:t.tx,client:this.client,coinIn:t.coinIn});return _chunkE5KM5OVWjs.j.assert(!!r,"FlowX swap returned no coin out",1004,{quote:t.quote,expectedProvider:"flowx"}),r}};exports.FlowxProvider = s;
|
|
2
|
-
//# sourceMappingURL=flowx-RRIX3SC4.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/otis/Documents/7k-ts-sdk/dist/flowx-RRIX3SC4.js","../src/features/metaAg/providers/flowx.ts"],"names":["FlowxProvider","options","client","__publicField","AggregatorQuoter","quoteOptions","quote","v4","assertQuoteProvider","builder","TradeBuilder","Commission","_7K_PARTNER_ADDRESS","CommissionType","res","MetaAgError"],"mappings":"AAAA,uuBAA4D,yCCKrD,4BAIY,IAcNA,CAAAA,CAAN,KAAiE,CAGtE,WAAA,CACmBC,CAAAA,CACAC,CAAAA,CACjB,CAFiB,IAAA,CAAA,OAAA,CAAAD,CAAAA,CACA,IAAA,CAAA,MAAA,CAAAC,CAAAA,CAJnBC,gCAAAA,IAAA,CAAS,MAAA,CAAA,OAAA,CAAA,CACTA,gCAAAA,IAAA,CAAQ,QAAA,CAAA,CAKN,IAAA,CAAK,MAAA,CAAS,IAAIC,0BAAAA,CAAiB,SAAA,CAAWH,CAAAA,CAAQ,MAAM,CAC9D,CAEA,MAAM,KAAA,CAAMI,CAAAA,CAAoD,CAC9D,IAAMC,CAAAA,CAAQ,MAAM,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,CACxC,QAAA,CAAUD,CAAAA,CAAa,QAAA,CACvB,OAAA,CAASA,CAAAA,CAAa,UAAA,CACtB,QAAA,CAAUA,CAAAA,CAAa,WAAA,CACvB,cAAA,CAAgB,IAAA,CAAK,OAAA,CAAQ,OAAA,CAC7B,YAAA,CAAc,IAAA,CAAK,OAAA,CAAQ,YAAA,CAC3B,cAAA,CAAgB,IAAA,CAAK,OAAA,CAAQ,cAAA,CAC7B,OAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,OAAA,CACtB,wBAAA,CAA0B,IAAA,CAAK,OAAA,CAAQ,wBACzC,CAAC,CAAA,CACD,MAAO,CACL,EAAA,CAAIE,sBAAAA,CAAG,CACP,QAAA,CAAA,OAAA,CACA,KAAA,CAAOD,CAAAA,CACP,QAAA,kCAAUA,CAAAA,mBAAM,QAAA,6BAAU,QAAA,mBAAS,GAAA,SAAK,KAAA,CACxC,YAAA,kCAAcA,CAAAA,qBAAM,SAAA,6BAAW,QAAA,mBAAS,GAAA,SAAK,KAAA,CAC7C,SAAA,kCAAWA,CAAAA,qBAAM,SAAA,6BAAW,QAAA,mBAAS,GAAA,SAAK,KAAA,CAC1C,UAAA,CAAYD,CAAAA,CAAa,UAAA,CACzB,WAAA,CAAaA,CAAAA,CAAa,WAC5B,CACF,CAEA,MAAM,IAAA,CAAKJ,CAAAA,CAA8D,CACvEO,gCAAAA,CAAoBP,CAAQ,KAAA,CAAA,OAAsB,CAAA,CAClD,IAAMQ,CAAAA,CAAU,IAAIC,sBAAAA,CAAa,SAAA,CAAWT,CAAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,CACtEQ,CAAAA,CAAQ,MAAA,CAAOR,CAAAA,CAAQ,MAAM,CAAA,CAC7BQ,CAAAA,CAAQ,QAAA,CAAS,GAAA,CAAQ,GAAG,CAAA,CAC5BA,CAAAA,CAAQ,UAAA,CACN,IAAIE,oBAAAA,CACFC,kBAAAA,CACAX,CAAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,OAAA,CACpBY,mBAAAA,CAAe,UAAA,CACf,CAAA,CACA,CAAA,CACF,CACF,CAAA,CACA,IAAMC,CAAAA,CAAM,MAAML,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAE,IAAA,CAAK,CACrC,EAAA,CAAIR,CAAAA,CAAQ,EAAA,CACZ,MAAA,CAAQ,IAAA,CAAK,MAAA,CACb,MAAA,CAAQA,CAAAA,CAAQ,MAClB,CAAC,CAAA,CACD,OAAAc,kBAAAA,CAAY,MAAA,CACV,CAAC,CAACD,CAAAA,CACF,iCAAA,CAAA,IAAA,CAEA,CAAE,KAAA,CAAOb,CAAAA,CAAQ,KAAA,CAAO,gBAAA,CAAA,OAAkC,CAC5D,CAAA,CACOa,CACT,CACF,CAAA,CAAA,0BAAA","file":"/Users/otis/Documents/7k-ts-sdk/dist/flowx-RRIX3SC4.js","sourcesContent":[null,"import {\n AggregatorQuoter,\n Commission,\n CommissionType,\n TradeBuilder,\n} from \"@flowx-finance/sdk\";\nimport { ClientWithCoreApi } from \"@mysten/sui/client\";\nimport { SuiGrpcClient } from \"@mysten/sui/grpc\";\nimport { TransactionObjectArgument } from \"@mysten/sui/transactions\";\nimport { v4 } from \"uuid\";\nimport { _7K_PARTNER_ADDRESS } from \"../../../constants/_7k\";\nimport {\n AggregatorProvider,\n EProvider,\n FlowxProviderOptions,\n MetaQuote,\n MetaQuoteOptions,\n MetaSwapOptions,\n QuoteProvider,\n} from \"../../../types/metaAg\";\nimport { assertQuoteProvider } from \"../common\";\nimport { MetaAgError, MetaAgErrorCode } from \"../error\";\n\nexport class FlowxProvider implements QuoteProvider, AggregatorProvider {\n readonly kind = EProvider.FLOWX;\n private quoter: AggregatorQuoter;\n constructor(\n private readonly options: FlowxProviderOptions,\n private readonly client: ClientWithCoreApi,\n ) {\n this.quoter = new AggregatorQuoter(\"mainnet\", options.apiKey);\n }\n\n async quote(quoteOptions: MetaQuoteOptions): Promise<MetaQuote> {\n const quote = await this.quoter.getRoutes({\n amountIn: quoteOptions.amountIn,\n tokenIn: quoteOptions.coinTypeIn,\n tokenOut: quoteOptions.coinTypeOut,\n includeSources: this.options.sources,\n excludePools: this.options.excludePools,\n excludeSources: this.options.excludeSources,\n maxHops: this.options.maxHops,\n splitDistributionPercent: this.options.splitDistributionPercent,\n });\n return {\n id: v4(),\n provider: EProvider.FLOWX,\n quote: quote,\n amountIn: quote.amountIn?.toString() ?? \"0\",\n rawAmountOut: quote.amountOut?.toString() ?? \"0\",\n amountOut: quote.amountOut?.toString() ?? \"0\",\n coinTypeIn: quoteOptions.coinTypeIn,\n coinTypeOut: quoteOptions.coinTypeOut,\n };\n }\n\n async swap(options: MetaSwapOptions): Promise<TransactionObjectArgument> {\n assertQuoteProvider(options.quote, EProvider.FLOWX);\n const builder = new TradeBuilder(\"mainnet\", options.quote.quote.routes);\n builder.sender(options.signer);\n builder.slippage(10000 * 100);\n builder.commission(\n new Commission(\n _7K_PARTNER_ADDRESS,\n options.quote.quote.coinOut,\n CommissionType.PERCENTAGE,\n 0,\n true,\n ),\n );\n const res = await builder.build().swap({\n tx: options.tx,\n client: this.client as unknown as SuiGrpcClient,\n coinIn: options.coinIn,\n });\n MetaAgError.assert(\n !!res,\n \"FlowX swap returned no coin out\",\n MetaAgErrorCode.INVALID_QUOTE,\n { quote: options.quote, expectedProvider: EProvider.FLOWX },\n );\n return res;\n }\n}\n"]}
|
|
File without changes
|