@gala-chain/gswap-sdk 1.0.0-rc.4 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -50,6 +50,19 @@ GalaChain gateway hosts directly.
50
50
 
51
51
  Use `dexBackendBaseUrl` for a test or private deployment override.
52
52
 
53
+ ## Realtime stream
54
+
55
+ `gSwap.stream` is a client for the realtime stream (`wss://…/ws`, JSON-RPC 2.0): live swaps, liquidity
56
+ adds/removes/collects, pool and balance changes, new pools and blocks, with automatic reconnect.
57
+
58
+ ```typescript
59
+ const gSwap = new GSwap({ env: 'stage' });
60
+ await gSwap.stream.connect();
61
+ await gSwap.stream.subscribeLiquidity((e) => console.log(e.action, e.owner, e.amount0, e.amount1));
62
+ ```
63
+
64
+ See the [realtime stream guide](./docs/docs/tutorial-basics/realtime-stream.md).
65
+
53
66
  ## Signers and identity
54
67
 
55
68
  | Signer | Scheme | Identity resolved by the chain |
@@ -1,5 +1,5 @@
1
- import e from"bignumber.js";import{Decimal as t}from"decimal.js";import n from"debug";import{serialize as r,signatures as i}from"@gala-chain/api";function a(e){"@babel/helpers - typeof";return a=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},a(e)}function o(e,t){if(a(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(a(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function s(e){var t=o(e,`string`);return a(t)==`symbol`?t:t+``}function c(e,t,n){return(t=s(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var l=class e extends Error{constructor(e,t,n,r,i){super(e),this.code=t,this.details=n,c(this,`chainMessage`,void 0),c(this,`retryAfterMs`,void 0),this.name=`GSwapSDKError`,this.chainMessage=r,this.retryAfterMs=i}static noSignerError(){return new e(`This method requires a signer. Please provide a signer to the GSwap constructor.`,`NO_SIGNER`)}static noWalletAddressError(){return new e(`Cannot confirm this write: no walletAddress was provided to the GSwap constructor, so the resulting position cannot be looked up to confirm it landed on chain.`,`NO_WALLET_ADDRESS`)}static noPoolAvailableError(t,n,r){return new e(`No pool is available for the requested pair.`,`NO_POOL_AVAILABLE`,{tokenIn:t,tokenOut:n,...r===void 0?{}:{fee:r}})}static insufficientLiquidityError(t,n,r){return new e(`The selected pool has insufficient liquidity for the requested quote.`,`INSUFFICIENT_LIQUIDITY`,{tokenIn:t,tokenOut:n,...r===void 0?{}:{fee:r}})}static fromGatewayBounce(t,n,r,i){let a={status:r,chainMessage:n};i!==void 0&&(a.retryAfterMs=i);let o=t===`CHAIN_DISPATCH_FAILED`?n:`Gateway rejected ${t}: ${n}`;return new e(o,t,a,n,i)}static fromChainError(t,n,r){return new e(`GalaChain error ${t}: ${n}`,t,{...r,errorKey:t,message:n},n)}static unknownTokenError(t){let n=typeof t==`string`?t:JSON.stringify(t);return new e(`Token ${n} has no trading symbol on the new DEX contract (no gcdex pool includes it yet).`,`UNKNOWN_TOKEN`,{token:t})}static confirmationTimeoutError(t,n){return new e(`Transaction confirmation timed out; the trade may still apply. Confirm the same uniqueKey again later instead of resubmitting.`,`CONFIRMATION_TIMEOUT`,{uniqueKey:t,...n===void 0?{}:{cause:n}})}static async fromErrorResponse(t,n){let r=await n.text(),i=f(r),a=u(i,`error`),o=d(a,`ErrorKey`),s=d(a,`Message`);return o!==void 0&&s!==void 0?new e(`GalaChain Error ${o} from ${t}: ${s}`,o,{message:s,errorKey:o,status:n.status,body:i,url:t},s):new e(`Unexpected HTTP Error ${n.status} from ${t}`,`HTTP_ERROR`,{status:n.status,body:i??r,url:t})}};function u(e,t){if(typeof e!=`object`||!e||!(t in e))return;let n=e[t];return typeof n==`object`&&n?n:void 0}function d(e,t){if(typeof e!=`object`||!e||!(t in e))return;let n=e[t];return typeof n==`string`?n:void 0}function f(e){try{return JSON.parse(e)}catch{return}}let p=/* @__PURE__ */ function(e){return e[e.PERCENT_00_00=0]=`PERCENT_00_00`,e[e.PERCENT_00_05=500]=`PERCENT_00_05`,e[e.PERCENT_00_30=3e3]=`PERCENT_00_30`,e[e.PERCENT_01_00=1e4]=`PERCENT_01_00`,e}({});const m={0:200,500:10,3e3:60,1e4:200},h=[0,500,3e3,1e4],g=-887272,_=887272,v=e.clone({DECIMAL_PLACES:60,ROUNDING_MODE:e.ROUND_DOWN}),y=t.clone({precision:60});function b(t){return new e(new y(1.0001).pow(t/2).toString())}function ee(e){let t;try{t=new v(e)}catch{return NaN}if(!t.isFinite()||t.isLessThanOrEqualTo(0))return NaN;let n=Math.log(t.toNumber()**2)/Math.log(1.0001);if(!Number.isFinite(n))return NaN;let r=Math.min(_,Math.max(g,Math.floor(n)));for(;r<887272&&b(r+1).isLessThanOrEqualTo(t);)r+=1;for(;r>-887272&&b(r).isGreaterThan(t);)--r;return r}function x(t){let n=typeof t==`string`?t:typeof t==`number`||e.isBigNumber(t)?t.toString():`NaN`,r=new y(n);if(!r.isFinite()||r.lessThanOrEqualTo(0)||!Number.isFinite(r.toNumber()))return NaN;let i=r.ln().dividedBy(new y(1.0001).ln()).floor().toNumber();return Number.isFinite(i)?i:NaN}function S(e,t){return ne(t),Math.floor(e/t)*t}function te(e,t){return ne(t),Math.ceil(e/t)*t}function C(e,t,n){let r=m[n];if(r===void 0)throw RangeError(`Unsupported fee tier: ${n}`);if(!Number.isInteger(e)||!Number.isInteger(t))throw RangeError(`Ticks must be integers`);if(e<-887272||t>887272||e>=t)throw RangeError(`Tick range must satisfy ${g} <= lower < upper <= ${_}`);if(e%r!==0||t%r!==0)throw RangeError(`Ticks must be aligned to spacing ${r}`)}function ne(e){if(!Number.isInteger(e)||e<=0)throw RangeError(`Tick spacing must be positive`)}function w(t,n,r=!1){if(typeof t==`number`)throw new l(`Invalid ${n}: use a decimal string or BigNumber, not a JavaScript number`,`VALIDATION_ERROR`,{type:`INVALID_NUMERIC_AMOUNT`,parameterName:n,value:t,reason:`number_input`});let i;try{i=e(t)}catch{i=e(NaN)}if(!i.isFinite())throw new l(`Invalid ${n}: must be a finite number`,`VALIDATION_ERROR`,{type:`INVALID_NUMERIC_AMOUNT`,parameterName:n,value:t,reason:`not_finite`});if(!r&&i.isZero())throw new l(`Invalid ${n}: must be positive`,`VALIDATION_ERROR`,{type:`INVALID_NUMERIC_AMOUNT`,parameterName:n,value:t,reason:`zero_not_allowed`});if(i.isNegative())throw new l(`Invalid ${n}: must be ${r?`non-negative`:`positive`}`,`VALIDATION_ERROR`,{type:`INVALID_NUMERIC_AMOUNT`,parameterName:n,value:t,reason:`negative`})}function re(t,n,r){if([t,n,r].some(e=>typeof e==`number`))throw new l(`Invalid price values: use decimal strings or BigNumber values, not JavaScript numbers`,`VALIDATION_ERROR`,{type:`INVALID_NUMERIC_AMOUNT`,reason:`number_input`});let i=t=>{try{return e(t)}catch{return e(NaN)}},a=i(t),o=i(n),s=i(r);if(s=s.isFinite()?s:e(0xde0b6b3a7640000),!a.isFinite()||!o.isFinite()||!s.isFinite()||!a.isPositive()||!o.isPositive()||!s.isPositive())throw new l(`Invalid price values: all prices must be finite and positive`,`VALIDATION_ERROR`,{type:`INVALID_PRICE_VALUES`,spotPrice:t,lowerPrice:n,upperPrice:r});if(o.isGreaterThan(s))throw new l(`Invalid price range: lower price must be less than or equal to upper price`,`VALIDATION_ERROR`,{type:`INVALID_PRICE_RANGE`,lowerPrice:n,upperPrice:r})}function ie(e,t){if(e<0||!Number.isInteger(e))throw new l(`Invalid ${t}: must be a non-negative integer`,`VALIDATION_ERROR`,{type:`INVALID_TOKEN_DECIMALS`,parameterName:t,value:e})}function ae(e,t){if(!Number.isInteger(e)||!Number.isInteger(t))throw new l(`Invalid tick values: ticks must be integers`,`VALIDATION_ERROR`,{type:`INVALID_TICK_VALUES`,tickLower:e,tickUpper:t});if(e>=t)throw new l(`Invalid tick range: tickLower must be less than tickUpper`,`VALIDATION_ERROR`,{type:`INVALID_TICK_RANGE`,tickLower:e,tickUpper:t});if(e<-887272||t>887272)throw new l(`Invalid tick range: ticks must be between ${g} and ${_}`,`VALIDATION_ERROR`,{type:`INVALID_TICK_BOUNDS`,tickLower:e,tickUpper:t,minTick:g,maxTick:_})}function T(e){if(!h.some(t=>Number(t)===e))throw new l(`Invalid fee tier: must be one of 0, 500, 3000, or 10000`,`VALIDATION_ERROR`,{type:`INVALID_FEE`,value:e})}function oe(e){if(!Number.isInteger(e)||e<=0)throw new l(`Invalid tick spacing: must be a positive integer`,`VALIDATION_ERROR`,{type:`INVALID_TICK_SPACING`,value:e})}function se(e){if(e===void 0)throw new l(`Invalid wallet address: No wallet address provided`,`VALIDATION_ERROR`,{type:`MISSING_WALLET_ADDRESS`,hint:`Either provide a wallet address to the function you are calling, or set one when instantiating GSwapSDK`});if(!e||typeof e!=`string`||e.trim().length===0)throw new l(`Invalid wallet address: must be a non-empty string`,`VALIDATION_ERROR`,{type:`INVALID_WALLET_ADDRESS`,value:e})}var E=class{constructor(e,t){this.dexBackendBaseUrl=e,this.httpClient=t}async getUserAssets(e,t=1,n=10){if(se(e),!Number.isInteger(t)||t<1)throw new l(`Invalid page: must be a positive integer`,`VALIDATION_ERROR`,{page:t});if(!Number.isInteger(n)||n<1||n>100)throw new l(`Invalid limit: must be an integer between 1 and 100`,`VALIDATION_ERROR`,{limit:n});return ce(await this.httpClient.sendGetRequest(this.dexBackendBaseUrl,`/user/assets`,``,{address:e,page:t.toString(),limit:n.toString()}))}};function ce(e){let t=u(e,`data`),n=t?.token;if(!Array.isArray(n)||!n.every(le))throw new l(`Backend returned an invalid user assets response.`,`INVALID_CHAIN_RESPONSE`,{data:e});let r=t?.count;return{tokens:n.map(e=>({...e,decimals:parseInt(e.decimals,10)})),count:typeof r==`number`?r:0}}function le(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.image==`string`&&typeof t.name==`string`&&typeof t.decimals==`string`&&/^\d+$/u.test(t.decimals)&&typeof t.verify==`boolean`&&typeof t.symbol==`string`&&typeof t.quantity==`string`}async function D(e,t,n,r){let i=new AbortController,a=setTimeout(()=>i.abort(),r),o=n.signal,s=()=>i.abort();o?.addEventListener(`abort`,s,{once:!0});try{return await e(t,{...n,signal:i.signal})}catch(e){throw i.signal.aborted?new l(`Request timed out after ${r} ms.`,`REQUEST_TIMEOUT`,{url:t,timeoutMs:r,cause:e}):e}finally{clearTimeout(a),o?.removeEventListener(`abort`,s)}}async function O(e){let t=await e.text();return f(t)??t}function k(e,t){let n=e.headers;if(n===void 0)return;if(ue(n)){let e=n.get(t);return e===null||e===``?void 0:e}let r=Object.entries(n).find(([e])=>e.toLowerCase()===t.toLowerCase())?.[1];return r===void 0||r===``?void 0:r}function A(e){let t=k(e,`retry-after`);if(t===void 0)return;let n=Number(t);return Number.isFinite(n)&&n>=0?n*1e3:void 0}function j(e,t=`x-block-number`){let n=k(e,t);if(n===void 0)return;let r=Number(n);return Number.isInteger(r)&&r>=0?r:void 0}function ue(e){return`get`in e&&typeof e.get==`function`}var M=class{constructor(e){c(this,`method`,void 0),c(this,`uniqueKey`,void 0),c(this,`transactionId`,void 0),c(this,`blockNumber`,void 0),c(this,`mode`,void 0),c(this,`result`,void 0),c(this,`backendBaseUrl`,void 0),c(this,`requestor`,void 0),c(this,`requestTimeoutMs`,void 0),c(this,`positionConfirmation`,void 0),this.method=e.method,this.uniqueKey=e.uniqueKey,this.transactionId=e.transactionId,this.blockNumber=e.blockNumber??null,this.mode=e.mode,this.result=e.result,this.backendBaseUrl=e.dexBackendBaseUrl.replace(/\/$/u,``),this.requestor=e.httpRequestor,this.requestTimeoutMs=e.requestTimeoutMs??3e4,this.positionConfirmation=e.positionConfirmation}async confirm(e){return this.method===`RequestTrade`?this.confirmApplied(e):this.confirmPosition(e)}async confirmApplied(e){let t=N(e,3e3);await t.waitForRead();let n=`${this.backendBaseUrl}/v1/chain/apply-results/${encodeURIComponent(this.uniqueKey)}?channel=asset&contract=dex-contract`,r;for(;;){let e,i;try{e=await D(this.requestor,n,{method:`GET`},this.requestTimeoutMs),i=await O(e)}catch(e){if(r=e,!await t.waitForRead())break;continue}if(e.status===200)return this.readAppliedResult(e,i,n);if(e.status===404||e.status===429||fe(e.status)){if(e.status===429){let n=A(e);if(n!==void 0){if(!await t.waitForRead(n))break;continue}}}else throw new l(pe(i),`CONFIRMATION_FAILED`,{status:e.status,body:i,url:n});if(!await t.waitForRead())break}throw l.confirmationTimeoutError(this.uniqueKey,r)}readAppliedResult(e,t,n){let r=me(t),i=r?.Status,a=k(e,`x-apply-transaction-id`)??null,o=j(e,`x-apply-block-number`)??null;if(i===0)throw l.fromChainError(d(r,`ErrorKey`)??`CHAIN_ERROR`,d(r,`Message`)??`The chain rejected this trade.`,{uniqueKey:this.uniqueKey,applyTransactionId:a,blockNumber:o,status:e.status,body:t,url:n});if(i!==1)throw P(e,t,n);let s=de(r?.Data);if(s===void 0)throw P(e,t,n);return{uniqueKey:this.uniqueKey,transactionId:a,blockNumber:o,requestTransactionId:this.transactionId,result:s}}async confirmPosition(e){if(this.positionConfirmation===void 0)throw l.noWalletAddressError();let t=N(e,0);for(await t.waitForRead();;){let e=new AbortController,n=setTimeout(()=>e.abort(),this.requestTimeoutMs);try{let t=await this.positionConfirmation(e.signal);if(t.confirmed)return t.position}finally{clearTimeout(n)}if(!await t.waitForRead())break}throw l.confirmationTimeoutError(this.uniqueKey)}};function N(e,t){let n=Math.max(0,e?.timeoutMs??6e4),r=Math.max(500,e?.pollIntervalMs??2e3),i=Math.max(0,e?.initialDelayMs??t),a=Date.now()+n,o=!0,s=0;return{async waitForRead(e){if(o){o=!1;let e=Math.max(0,a-Date.now());return await he(Math.min(i,e)),!0}let t=Math.min(8e3,r*2**Math.min(s,5));s+=1;let n=e===void 0?ge(t):e;return Date.now()+n>a?!1:(await he(n),!0)}}}function de(e){let t=me(e);if(t===void 0||typeof t.token0!=`string`||typeof t.token1!=`string`||typeof t.fee!=`number`)return;let n=[`sell0Qty`,`sell1Qty`,`buy0Qty`,`buy1Qty`,`tradingFees`,`protocolFees`,`totalFees`];for(let e of n)if(e in t&&typeof t[e]!=`string`)return;return{token0:t.token0,token1:t.token1,fee:t.fee,...Object.fromEntries(n.flatMap(e=>typeof t[e]==`string`?[[e,t[e]]]:[]))}}function P(e,t,n){return new l(`Transaction confirmation returned a malformed body`,`CONFIRMATION_FAILED`,{status:e.status,body:t,url:n})}function fe(e){return e===500||e===502||e===503||e===504}function pe(e){return d(e,`message`)??d(e,`Message`)??d(u(e,`error`),`message`)??d(u(e,`error`),`Message`)??(typeof e==`string`?e:`Transaction confirmation failed`)}function me(e){return typeof e==`object`&&e?e:void 0}function he(e){return new Promise(t=>setTimeout(t,e))}function ge(e){return Math.max(0,Math.round(e*(.9+Math.random()*.2)))}var _e=class{constructor(e){c(this,`requestor`,void 0),c(this,`walletAddress`,void 0),c(this,`chainCallTimeoutMs`,void 0),c(this,`requestTimeoutMs`,void 0),c(this,`dexBackendBaseUrl`,void 0),this.dexBackendBaseUrl=ve(e.dexBackendBaseUrl),this.requestor=e.httpRequestor??fetch.bind(globalThis),this.walletAddress=e.walletAddress,this.chainCallTimeoutMs=e.chainCallTimeoutMs??3e4,this.requestTimeoutMs=this.chainCallTimeoutMs}async submit(e,t,n){if(e===`Trade`)throw new l(`The synchronous Trade method was removed; swaps are queued through RequestTrade.`,`METHOD_NOT_SUPPORTED`,{method:e});let r=`${this.dexBackendBaseUrl}/v1/chain/asset/dex-contract/${e}`,i={"content-type":`application/json`},a=n?.walletAddress??this.walletAddress;a!==void 0&&(i[`X-Wallet-Address`]=a);let o;try{o=await D(this.requestor,r,{method:`POST`,headers:i,body:JSON.stringify(t)},this.chainCallTimeoutMs)}catch(e){throw e instanceof l&&e.code===`REQUEST_TIMEOUT`?new l(`The submission outcome is unknown because the gateway request timed out. Confirm before retrying.`,`SUBMISSION_OUTCOME_UNKNOWN`,{uniqueKey:d(t,`uniqueKey`)??``,cause:e}):e}let s=await O(o);if(!o.ok)throw ye(o,s,r);let c=I(s),u=I(c?.data??c?.Data);if(u===void 0)throw F(o,s,r,`Expected a data object.`);let f=d(u,`transactionId`),p=d(u,`mode`),m=u.transactionId,h=u.blockNumber,g=`Gateway response must contain data.mode="sync" with data.result, or data.mode="queued".`;if(p!==`sync`&&p!==`queued`||`transactionId`in u&&typeof m!=`string`||h!=null&&!L(h))throw F(o,s,r,g);if(e===`RequestTrade`&&p===`sync`)throw F(o,s,r,`The gateway executed RequestTrade synchronously, which this SDK refuses; RequestTrade must be queued.`);if(e===`RequestTrade`&&p===`queued`){let e=d(t,`uniqueKey`);if(`uniqueKey`in u&&(typeof u.uniqueKey!=`string`||u.uniqueKey!==e))throw F(o,s,r,`Gateway response data.uniqueKey must match the signed RequestTrade uniqueKey.`)}else if(p===`queued`||!(`result`in u))throw F(o,s,r,g);if(p===`sync`){let e=I(u.result);if(e!==void 0){let t=e.Status;if(t!==void 0&&t!==1)throw l.fromChainError(d(e,`ErrorKey`)??`CHAIN_ERROR`,d(e,`Message`)??`The chain rejected this write.`,{status:o.status,body:s,url:r})}}let _=d(t,`uniqueKey`)??``,v=k(o,`x-transaction-id`),y=f===void 0||f===``?v:f,b=h==null?j(o):L(h)?h:void 0;return new M({method:e,uniqueKey:_,transactionId:y===void 0||y===``?null:y,blockNumber:b??null,mode:p,result:p===`queued`?void 0:u.result,dexBackendBaseUrl:this.dexBackendBaseUrl,httpRequestor:this.requestor,requestTimeoutMs:this.chainCallTimeoutMs,...n?.positionConfirmation===void 0?{}:{positionConfirmation:n.positionConfirmation}})}get httpRequestor(){return this.requestor}};function ve(e){return e.replace(/\/$/u,``)}function F(e,t,n,r){return new l(r,`INVALID_GATEWAY_RESPONSE`,{status:e.status,body:t,url:n})}function ye(e,t,n){let r=I(t),i=u(t,`error`),a=d(r,`code`)??d(i,`code`)??d(i,`ErrorKey`)??`HTTP_ERROR`,o=d(r,`message`)??d(i,`message`)??d(i,`Message`)??(typeof t==`string`?t:`Gateway request failed with HTTP ${e.status}`),s=e.status===429?A(e):void 0;return a===`HTTP_ERROR`?new l(o,a,{status:e.status,body:t,url:n}):l.fromGatewayBounce(a,o,e.status,s)}function I(e){return typeof e==`object`&&e?e:void 0}function L(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0}const R=n(`GSWAP_SDK`);var z=class{constructor(e=fetch,t=3e4){this.httpRequestor=e,this.timeoutMs=t}async sendRequest(e,t,n,r,i,a){let o=`${t}${n}${r}`;R(`Sending request to ${o} with body:`,i);let s=await D(this.httpRequestor,o,{method:e,headers:{"Content-Type":`application/json`,"User-Agent":`GalaChain-SDK/1.0.0-rc.4`},...i?{body:JSON.stringify(i)}:{},...a?.signal===void 0?{}:{signal:a.signal}},this.timeoutMs);if(!s.ok)throw await l.fromErrorResponse(o,s);let c=await O(s);return R(`Response from ${t}${n}${r}:`,c),c}async sendPostRequest(e,t,n,r){return this.sendRequest(`POST`,e,t,n,r)}async sendGetRequest(e,t,n,r,i){let a=r?new URLSearchParams(r):void 0,o=a?`${n}?${a.toString()}`:n;return this.sendRequest(`GET`,e,t,o,void 0,i)}};function B(e,t){return e<t?[e,t]:[t,e]}function V(e){if(Array.isArray(e)&&e.length>=2){let t=e[0],n=e[1];if(typeof t==`string`&&typeof n==`string`)return{token0:t,token1:n}}if(typeof e==`object`&&e){let t=e,n=t.token0,r=t.token1;if(typeof n==`string`&&typeof r==`string`)return{token0:n,token1:r}}throw new l(`Unable to order trading symbols.`,`VALIDATION_ERROR`,{value:e})}function H(e){return[e.collection,e.category,e.type,e.additionalKey].join(`$`)}function U(e){if(typeof e==`object`)return{collection:e.collection,category:e.category,type:e.type,additionalKey:e.additionalKey};let t=e.includes(`|`)?`|`:`$`,n=e.split(t),r=n.slice(-3),i=n.slice(0,-3).join(t);if(n.length<4||i.length===0||r.some(e=>e.length===0))throw new l(`Invalid token class key: expected a collection followed by category, type and additionalKey`,`VALIDATION_ERROR`,{tokenClassKey:e});let[a,o,s]=r;return{collection:i,category:a,type:o,additionalKey:s}}var W=class{constructor(e,t){this.gateway=e,this.symbols=t,c(this,`http`,void 0),this.http=new z(e.httpRequestor,e.requestTimeoutMs??3e4)}async getPools(e){let t=await this.http.sendGetRequest(this.gateway.dexBackendBaseUrl,`/v2/trade`,`/pools`,void 0,e?.signal===void 0?void 0:{signal:e.signal});if(!Array.isArray(t.data)||!t.data.every(be))throw new l(`Backend returned an invalid pool list.`,`INVALID_CHAIN_RESPONSE`,{data:t.data});return t.data}async getPool(e,t,n){return T(n),this.getBackend(`/pool`,await this.backendParams(e,t,n))}async getSlot0(e,t,n){return T(n),this.getBackend(`/slot0`,await this.backendParams(e,t,n))}async getCompositePool(e,t,n){T(n);let r=V(B(await G(this.symbols,e),await G(this.symbols,t)));return this.getBackend(`/composite-pool`,{token0:r.token0,token1:r.token1,fee:String(n)})}async backendParams(e,t,n){return{token0:await G(this.symbols,e),token1:await G(this.symbols,t),fee:String(n)}}async getBackend(e,t){try{return(await this.http.sendGetRequest(this.gateway.dexBackendBaseUrl,`/v2/trade`,e,t)).data}catch(e){throw e instanceof l?e:new l(`Pool request failed.`,`HTTP_ERROR`,{cause:e})}}};async function G(e,t){let n=await e.resolve(t);if(n.symbol.length>0)return n.symbol;throw new l(`Token could not be resolved to a trading symbol.`,`SYMBOL_NOT_FOUND`,{token:t})}function be(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.contractVersion===`v2`&&typeof t.token0==`string`&&typeof t.token1==`string`&&typeof t.poolName==`string`&&typeof t.poolRef==`string`&&[`fee`,`tickSpacing`,`protocolFees`,`tradingFees`].every(e=>K(t[e]))&&[`token0CompositeKey`,`token1CompositeKey`,`creator`,`price`,`sqrtPrice`,`token0Tvl`,`token1Tvl`].every(e=>xe(t[e]))&&[`tick`,`tvlUsd`,`volume1d`,`volume7d`,`volume30d`,`trades1d`,`fee24h`,`apr1d`,`token0Price`,`token1Price`].every(e=>Se(t[e]))}function K(e){return typeof e==`number`&&Number.isFinite(e)}function xe(e){return e===void 0||typeof e==`string`}function Se(e){return e===void 0||K(e)}var q=class{constructor(e,t,n,r){this.gateway=e,this.symbols=t,this.signer=n,this.walletAddress=r,c(this,`http`,void 0),this.http=new z(e.httpRequestor,e.requestTimeoutMs??3e4)}async getUserPositions(e){return(await this.get(`/positions`,{user:e})).data.map(e=>this.mapPosition(e))}async getPosition(e,t){let n=await this.symbols.orderPair(e.token0,e.token1),r=this.canonicalTicks(e.tickLower,e.tickUpper,n.flipped),i=await this.getNullable(`/position`,{token0:n.token0.symbol,token1:n.token1.symbol,fee:`${e.fee}`,owner:e.owner,tickLower:`${r.tickLower}`,tickUpper:`${r.tickUpper}`},t);return i===null?null:this.mapPosition(i.data)}async estimateAddLiquidity(t){return w(t.amount,`amount`),(await this.get(`/add-liq-estimate`,{token0:this.requestToken(t.token0),token1:this.requestToken(t.token1),fee:`${t.fee}`,tickLower:`${t.tickLower}`,tickUpper:`${t.tickUpper}`,amount:new e(t.amount).toFixed(),amountIsToken0:String(t.amountIsToken0)})).data}async estimateRemoveLiquidity(t){return w(t.liquidity,`liquidity`),(await this.get(`/remove-liq-estimate`,{token0:this.requestToken(t.token0),token1:this.requestToken(t.token1),fee:`${t.fee}`,tickLower:`${t.tickLower}`,tickUpper:`${t.tickUpper}`,liquidity:new e(t.liquidity).toFixed()})).data}async addLiquidityByTicks(t){T(t.fee);let n=await this.symbols.orderPair(t.token0,t.token1),r=this.canonicalTicks(t.tickLower,t.tickUpper,n.flipped);C(r.tickLower,r.tickUpper,t.fee),w(t.amount,`amount`);let i=new e(t.amount).toFixed(),a={token0:n.token0.symbol,token1:n.token1.symbol,fee:t.fee,tickLower:r.tickLower,tickUpper:r.tickUpper,uniqueKey:this.uniqueKey(),...n.flipped===t.amountIsToken0?{depositQuantityToken1:i}:{depositQuantityToken0:i}};return this.submit(`AddLiquidity`,a,{kind:`add`,identity:{token0:n.token0.symbol,token1:n.token1.symbol,fee:t.fee,tickLower:r.tickLower,tickUpper:r.tickUpper}})}async addLiquidityByPrice(t){T(t.fee),this.rejectNumber(t.minPrice,`minPrice`),this.rejectNumber(t.maxPrice,`maxPrice`);let n=new e(t.minPrice),r=new e(t.maxPrice);if(!n.isFinite()||!r.isFinite()||n.isLessThanOrEqualTo(0)||r.isLessThanOrEqualTo(0))throw new l(`Price bounds must be finite and positive.`,`VALIDATION_ERROR`);if(n.isGreaterThan(r))throw new l(`minPrice must be less than or equal to maxPrice.`,`VALIDATION_ERROR`);let i=this.tickSpacing(t.fee),a=S(x(n),i),o=te(x(r),i);return this.addLiquidityByTicks({token0:t.token0,token1:t.token1,fee:t.fee,tickLower:a,tickUpper:o,amount:t.amount,amountIsToken0:t.amountIsToken0})}async removeLiquidity(t){T(t.fee);let n=await this.symbols.orderPair(t.token0,t.token1),r=this.canonicalTicks(t.tickLower,t.tickUpper,n.flipped);if(C(r.tickLower,r.tickUpper,t.fee),t.amount0!==void 0&&t.amount1!==void 0)throw new l(`Provide at most one of amount0 or amount1.`,`VALIDATION_ERROR`);t.amount0!==void 0&&w(t.amount0,`amount0`),t.amount1!==void 0&&w(t.amount1,`amount1`);let i=t.amount0===void 0?t.amount1===void 0?{}:n.flipped?{withdrawalQuantityToken0:new e(t.amount1).toFixed()}:{withdrawalQuantityToken1:new e(t.amount1).toFixed()}:n.flipped?{withdrawalQuantityToken1:new e(t.amount0).toFixed()}:{withdrawalQuantityToken0:new e(t.amount0).toFixed()},a={token0:n.token0.symbol,token1:n.token1.symbol,fee:t.fee,tickLower:r.tickLower,tickUpper:r.tickUpper,uniqueKey:this.uniqueKey(),...i},o=t.amount0===void 0&&t.amount1===void 0;return this.submit(`RemoveLiquidity`,a,{kind:o?`removeFull`:`removePartial`,identity:{token0:n.token0.symbol,token1:n.token1.symbol,fee:t.fee,tickLower:r.tickLower,tickUpper:r.tickUpper}})}async collectPositionFees(e){T(e.fee);let t=await this.symbols.orderPair(e.token0,e.token1),n=this.canonicalTicks(e.tickLower,e.tickUpper,t.flipped);C(n.tickLower,n.tickUpper,e.fee);let r={token0:t.token0.symbol,token1:t.token1.symbol,fee:e.fee,tickLower:n.tickLower,tickUpper:n.tickUpper,uniqueKey:this.uniqueKey()};return this.submit(`CollectPositionFees`,r,{kind:`collect`,identity:{token0:t.token0.symbol,token1:t.token1.symbol,fee:e.fee,tickLower:n.tickLower,tickUpper:n.tickUpper}})}async createPool(t){let n=t.startingPrice!==void 0;if(n===(t.startingSqrtPrice!==void 0))throw new l(`Provide exactly one of startingPrice or startingSqrtPrice.`,`VALIDATION_ERROR`);T(t.fee);let[r,i]=await Promise.all([this.resolveCreateToken(t.token0,t.token0Symbol),this.resolveCreateToken(t.token1,t.token1Symbol)]),a=r.symbol>i.symbol,[o,s]=a?[i,r]:[r,i],c=n?t.startingPrice:t.startingSqrtPrice;this.rejectNumber(c,n?`startingPrice`:`startingSqrtPrice`);let u=new e(c);if(!u.isFinite()||u.isLessThanOrEqualTo(0))throw new l(`Starting price must be finite and positive.`,`VALIDATION_ERROR`);let d=a?new e(1).dividedBy(u):u,f={token0Key:o.classKey,token1Key:s.classKey,token0Symbol:o.symbol,token1Symbol:s.symbol,fee:t.fee,uniqueKey:this.uniqueKey(),...n?{startingPrice:d.toFixed()}:{startingSqrtPrice:d.toFixed()},...t.isPrivate===void 0?{}:{isPrivate:t.isPrivate},...t.privateAccess===void 0?{}:{privateAccess:t.privateAccess}},p=await this.submit(`CreatePool`,f,{kind:`createPool`,token0:o.symbol,token1:s.symbol,fee:t.fee});return this.symbols.invalidate?.(),p}async submit(e,t,n){if(this.signer===void 0)throw l.noSignerError();let r=await this.signer.signObject(e,t),i=this.walletAddress===void 0?{}:{walletAddress:this.walletAddress},a=this.walletAddress,o=this.buildPositionConfirmation(n,a),s={...i,...o===void 0?{}:{positionConfirmation:o}};return this.gateway.submit(e,r,s)}buildPositionConfirmation(t,n){if(t===void 0)return;if(t.kind===`createPool`){let{token0:e,token1:n,fee:r}=t;return async t=>await this.getNullable(`/pool`,{token0:e,token1:n,fee:`${r}`},t)===null?{confirmed:!1}:{confirmed:!0,position:null}}if(n===void 0)return;let{kind:r,identity:i}=t,a;return async t=>{let o=await this.getPosition({...i,owner:n},t);if(a===void 0)return a={liquidity:new e(o?.liquidity??0),fees:new e(o?.fees0??0).plus(new e(o?.fees1??0))},r===`removeFull`&&o===null?{confirmed:!0,position:null}:{confirmed:!1};switch(r){case`add`:return o!==null&&new e(o.liquidity).isGreaterThan(a.liquidity)?{confirmed:!0,position:o}:{confirmed:!1};case`removePartial`:return o!==null&&new e(o.liquidity).isLessThan(a.liquidity)?{confirmed:!0,position:o}:{confirmed:!1};case`removeFull`:return o===null?{confirmed:!0,position:null}:{confirmed:!1};case`collect`:{if(o===null)return{confirmed:!1};let t=new e(o.fees0??0).plus(new e(o.fees1??0));return t.isLessThan(a.fees)||a.fees.isZero()&&t.isZero()?{confirmed:!0,position:o}:{confirmed:!1}}}}}async get(e,t,n){return this.http.sendGetRequest(this.gateway.dexBackendBaseUrl,`/v2/trade`,e,t,n===void 0?void 0:{signal:n})}async getNullable(e,t,n){try{return await this.get(e,t,n)}catch(e){if(this.isNotFound(e))return null;throw e}}isNotFound(e){return!(e instanceof l)||e.details===void 0?!1:e.details.status===404}mapPosition(e){return{token0Symbol:e.token0Symbol,token1Symbol:e.token1Symbol,...e.token0CompositeKey===void 0?{}:{token0CompositeKey:e.token0CompositeKey},...e.token1CompositeKey===void 0?{}:{token1CompositeKey:e.token1CompositeKey},fee:e.fee,tickLower:e.tickLower,tickUpper:e.tickUpper,liquidity:e.liquidity,amount0:e.amount0,amount1:e.amount1,inRange:e.inRange,...e.currentTick===void 0?{}:{currentTick:e.currentTick},...e.sqrtPrice===void 0?{}:{sqrtPrice:e.sqrtPrice},pool:e.poolRef??e.pool??``,owner:e.owner,...e.fees0===void 0?{}:{fees0:e.fees0},...e.fees1===void 0?{}:{fees1:e.fees1}}}requestToken(e){return typeof e==`string`?e:H(e)}canonicalTicks(e,t,n){return n?{tickLower:-t,tickUpper:-e}:{tickLower:e,tickUpper:t}}tickSpacing(e){let t=m[e];if(t===void 0)throw new l(`Unsupported fee tier: ${e}.`,`VALIDATION_ERROR`);return t}rejectNumber(e,t){if(typeof e==`number`)throw new l(`Invalid ${t}: use a decimal string or BigNumber, not a JavaScript number`,`VALIDATION_ERROR`)}uniqueKey(){return`gswap-sdk-${globalThis.crypto.randomUUID()}`}async resolveCreateToken(e,t){try{let n=typeof e==`object`?H(e):e,r=await this.symbols.resolve(n);if(t!==void 0&&t!==``&&t!==r.symbol)throw new l(`Supplied symbol ${t} disagrees with the registered trading symbol ${r.symbol}.`,`VALIDATION_ERROR`,{token:e,suppliedSymbol:t,registeredSymbol:r.symbol});let i=this.tryParseClassKey(e);return{symbol:r.symbol,classKey:i??U({collection:r.collection,category:r.category,type:r.type,additionalKey:r.additionalKey})}}catch(n){if(!(n instanceof l)||n.code!==`UNKNOWN_TOKEN`)throw n;let r;try{r=U(e)}catch{throw n}if(t===void 0||t===``)throw new l(`Token is not registered in the trading-symbol registry yet; pass token0Symbol/token1Symbol (the token class symbol) to propose one. A symbol cannot be derived from a class key.`,`VALIDATION_ERROR`,{token:e});if(!/^[A-Za-z0-9]+$/u.test(t))throw new l(`Invalid trading symbol: must be ASCII letters and digits only.`,`VALIDATION_ERROR`,{symbol:t});return{symbol:t,classKey:r}}}tryParseClassKey(e){try{return U(e)}catch{return}}},J=class{constructor(e,t,n){this.dexBackendBaseUrl=e,this.http=t,this.symbols=n}async quoteExactInput(e,t,n,r){return w(n,`amountIn`),this.quote(e,t,{amountIn:je(n)},r)}async quoteExactOutput(e,t,n,r){return w(n,`amountOut`),this.quote(e,t,{amountOut:je(n)},r)}async quote(e,t,n,r){Ae(r);let i={tokenIn:await Me(this.symbols,e),tokenOut:await Me(this.symbols,t),...n};r!==void 0&&(i.fee=String(r));try{return Ce((await this.http.sendGetRequest(this.dexBackendBaseUrl,`/v2/trade`,`/quote`,i)).data)}catch(n){throw De(n,e,t,r)}}};function Ce(t){if(!Ee(t))throw new l(`Backend returned an invalid quote.`,`INVALID_CHAIN_RESPONSE`,{data:t});let n=t,r=n.currentPrice===void 0?Te(n.currentSqrtPrice,n.tokenInIsToken0):new e(n.currentPrice),i=n.newPrice===void 0?Te(n.newSqrtPrice,n.tokenInIsToken0):new e(n.newPrice),a=i.minus(r).dividedBy(r);return{contractVersion:n.contractVersion,fee:n.fee,amountIn:n.amountIn,amountOut:n.amountOut,...n.currentSqrtPrice===void 0?{}:{currentSqrtPrice:n.currentSqrtPrice},...n.newSqrtPrice===void 0?{}:{newSqrtPrice:n.newSqrtPrice},feeTier:n.fee,newTick:n.newTick,tradingFees:n.tradingFees,protocolFees:n.protocolFees,totalFees:n.totalFees,feeTokenSymbol:n.feeTokenSymbol,token0Symbol:n.token0Symbol,token1Symbol:n.token1Symbol,tokenInIsToken0:n.tokenInIsToken0,currentPrice:r,newPrice:i,priceImpact:a}}const we=e.clone({DECIMAL_PLACES:60});function Te(e,t){let n=new we(e).pow(2);return t?n:new we(1).dividedBy(n)}function Ee(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.contractVersion===`v2`&&typeof t.fee==`number`&&Number.isFinite(t.fee)&&[`amountIn`,`amountOut`,`tradingFees`,`protocolFees`,`totalFees`,`feeTokenSymbol`,`token0Symbol`,`token1Symbol`].every(e=>typeof t[e]==`string`)&&typeof t.newTick==`number`&&Number.isInteger(t.newTick)&&typeof t.tokenInIsToken0==`boolean`&&Y(t.currentSqrtPrice)&&Y(t.newSqrtPrice)&&Y(t.currentPrice)&&Y(t.newPrice)&&(t.currentSqrtPrice!==void 0||t.currentPrice!==void 0)&&(t.newSqrtPrice!==void 0||t.newPrice!==void 0)}function Y(t){if(t===void 0)return!0;if(typeof t!=`string`)return!1;try{let n=new e(t);return n.isFinite()&&n.isGreaterThan(0)}catch{return!1}}function De(e,t,n,r){if(e instanceof l){let i=Oe(e.details),a=ke(e.details)??e.message;return i===404||/no pool|no pools|pool does not exist/iu.test(a)?l.noPoolAvailableError(t,n,r):i===400&&/insufficient liquidity/iu.test(a)?l.insufficientLiquidityError(t,n,r):e}return new l(`Quote request failed.`,`HTTP_ERROR`,{cause:e,tokenIn:t,tokenOut:n,fee:r})}function Oe(e){let t=e?.status;return typeof t==`number`?t:void 0}function ke(e){let t=e?.message;if(typeof t==`string`)return t;let n=e?.body;if(typeof n!=`object`||!n||Array.isArray(n))return;let r=n.message;return typeof r==`string`?r:void 0}function Ae(e){if(e!==void 0&&!h.some(t=>Number(t)===Number(e)))throw new l(`Invalid fee tier: ${e}`,`VALIDATION_ERROR`,{fee:e})}function je(t){return new e(t).toFixed()}async function Me(e,t){let n=await e.resolve(t);if(n.symbol.length>0)return n.symbol;throw new l(`Token could not be resolved to a trading symbol.`,`SYMBOL_NOT_FOUND`,{token:t})}var Ne=class{constructor(e){this.gateway=e,c(this,`cachedSymbols`,void 0),c(this,`cachedAt`,0),c(this,`refreshInFlight`,void 0),c(this,`http`,void 0),this.http=new z(e.httpRequestor,e.requestTimeoutMs)}async list(){return this.cachedSymbols!==void 0&&Date.now()-this.cachedAt<6e4?this.cachedSymbols:(this.refreshInFlight===void 0&&(this.refreshInFlight=this.http.sendGetRequest(this.gateway.dexBackendBaseUrl,`/v2/trade`,`/symbols`).then(e=>Pe(e.data)).then(e=>(this.cachedSymbols=e,this.cachedAt=Date.now(),e)).finally(()=>{this.refreshInFlight=void 0})),this.refreshInFlight)}invalidate(){this.cachedSymbols=void 0,this.cachedAt=0}async refresh(){return this.invalidate(),this.refreshInFlight=void 0,this.list()}async resolve(e){let t=await this.list(),n=typeof e==`string`?Ie(e)?H(U(e)):void 0:H(e),r=t.find(t=>t.symbol===e||n!==void 0&&H(t)===n);if(r===void 0){t=await this.refresh();let r=t.find(t=>t.symbol===e||n!==void 0&&H(t)===n);if(r===void 0)throw l.unknownTokenError(e);return r}return r}async orderPair(e,t){let[n,r]=await Promise.all([this.resolve(e),this.resolve(t)]),[i,a]=B(n.symbol,r.symbol);return{token0:i===n.symbol?n:r,token1:a===r.symbol?r:n,flipped:i!==n.symbol}}};function Pe(e){if(!Array.isArray(e)||!e.every(Fe))throw new l(`Backend returned an invalid symbol list.`,`INVALID_CHAIN_RESPONSE`,{data:e});return e}function Fe(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.symbol==`string`&&typeof t.collection==`string`&&typeof t.category==`string`&&typeof t.type==`string`&&typeof t.additionalKey==`string`&&typeof t.decimals==`number`&&Number.isInteger(t.decimals)&&t.decimals>=0}function Ie(e){return e.includes(`|`)||e.includes(`$`)}const Le=/^[A-Za-z0-9._:-]{1,128}$/u;var X=class{constructor(e,t,n,r){this.gateway=e,this.symbols=t,this.signer=n,this.walletAddress=r}async swap(e,t,n,r){T(n);let i=await this.buildRequestTradeDto(e,t,n,r);if(this.signer===void 0)throw l.noSignerError();let a=await this.signer.signObject(`RequestTrade`,i),o=this.walletAddress===void 0?{}:{walletAddress:this.walletAddress};return this.gateway.submit(`RequestTrade`,a,o)}async confirmSwap(e,t){if(!Le.test(e))throw new l(`uniqueKey must be 1-128 characters of A-Z, a-z, 0-9, ".", "_", ":" or "-".`,`VALIDATION_ERROR`,{uniqueKey:e});return new M({method:`RequestTrade`,uniqueKey:e,transactionId:null,mode:`queued`,result:void 0,dexBackendBaseUrl:this.gateway.dexBackendBaseUrl,httpRequestor:this.gateway.httpRequestor,requestTimeoutMs:this.gateway.requestTimeoutMs}).confirm({initialDelayMs:0,...t})}async buildRequestTradeDto(e,t,n,r){let i=await Re(this.symbols,e),a=V(B(i,await Re(this.symbols,t))),o=i===a.token0,s={token0:a.token0,token1:a.token1,fee:n,uniqueKey:`gswap-sdk-${globalThis.crypto.randomUUID()}`};if(`exactIn`in r){let e=r.exactIn;if(e===void 0)throw new l(`exactIn is required for an exact-input swap.`,`VALIDATION_ERROR`);w(e,`exactIn`),s[o?`sell0Qty`:`sell1Qty`]=Z(e),r.amountOutMinimum!==void 0&&(w(r.amountOutMinimum,`amountOutMinimum`,!0),s.amountOutMinimum=Z(r.amountOutMinimum))}else{let e=r.exactOut;if(e===void 0)throw new l(`exactOut is required for an exact-output swap.`,`VALIDATION_ERROR`);w(e,`exactOut`),s[o?`buy1Qty`:`buy0Qty`]=Z(e),r.amountInMaximum!==void 0&&(w(r.amountInMaximum,`amountInMaximum`,!0),s.amountInMaximum=Z(r.amountInMaximum))}return s}};function Z(t){return new e(t).toFixed()}async function Re(e,t){let n=await e.resolve(t);if(n.symbol.length>0)return n.symbol;throw new l(`Token could not be resolved to a trading symbol.`,`SYMBOL_NOT_FOUND`,{token:t})}const ze={prod:{dexBackendBaseUrl:`https://dex-backend-prod1.defi.gala.com`},stage:{dexBackendBaseUrl:`https://swap-backend.stage.defi.ovh.gala.com`}};var Be=class{constructor(e){c(this,`dexBackendBaseUrl`,void 0),c(this,`chainCallTimeoutMs`,void 0),c(this,`signer`,void 0),c(this,`walletAddress`,void 0),c(this,`gateway`,void 0),c(this,`symbols`,void 0),c(this,`quoting`,void 0),c(this,`pools`,void 0),c(this,`positions`,void 0),c(this,`swaps`,void 0),c(this,`assets`,void 0);let t=ze[e?.env??`prod`];this.dexBackendBaseUrl=Ve(e?.dexBackendBaseUrl??t.dexBackendBaseUrl),this.chainCallTimeoutMs=e?.chainCallTimeoutMs??3e4,this.signer=e?.signer,this.walletAddress=e?.walletAddress;let n=new z(e?.httpRequestor,this.chainCallTimeoutMs);this.gateway=new _e({dexBackendBaseUrl:this.dexBackendBaseUrl,chainCallTimeoutMs:this.chainCallTimeoutMs,...e?.httpRequestor===void 0?{}:{httpRequestor:e.httpRequestor},...this.walletAddress===void 0?{}:{walletAddress:this.walletAddress}}),this.symbols=new Ne(this.gateway),this.quoting=new J(this.dexBackendBaseUrl,n,this.symbols),this.pools=new W(this.gateway,this.symbols),this.positions=new q(this.gateway,this.symbols,this.signer,this.walletAddress),this.swaps=new X(this.gateway,this.symbols,this.signer,this.walletAddress),this.assets=new E(this.dexBackendBaseUrl,n)}};function Ve(e){return e.replace(/\/$/u,``)}function He(e,t){let n={};n[e]=[];function r(e){let t=n[e];
1
+ import e from"bignumber.js";import{Decimal as t}from"decimal.js";import n from"debug";import{serialize as r,signatures as i}from"@gala-chain/api";function a(e){"@babel/helpers - typeof";return a=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},a(e)}function o(e,t){if(a(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(a(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function s(e){var t=o(e,`string`);return a(t)==`symbol`?t:t+``}function c(e,t,n){return(t=s(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var l=class e extends Error{constructor(e,t,n,r,i){super(e),this.code=t,this.details=n,c(this,`chainMessage`,void 0),c(this,`retryAfterMs`,void 0),this.name=`GSwapSDKError`,this.chainMessage=r,this.retryAfterMs=i}static noSignerError(){return new e(`This method requires a signer. Please provide a signer to the GSwap constructor.`,`NO_SIGNER`)}static noWalletAddressError(){return new e(`Cannot confirm this write: no walletAddress was provided to the GSwap constructor, so the resulting position cannot be looked up to confirm it landed on chain.`,`NO_WALLET_ADDRESS`)}static noPoolAvailableError(t,n,r){return new e(`No pool is available for the requested pair.`,`NO_POOL_AVAILABLE`,{tokenIn:t,tokenOut:n,...r===void 0?{}:{fee:r}})}static insufficientLiquidityError(t,n,r){return new e(`The selected pool has insufficient liquidity for the requested quote.`,`INSUFFICIENT_LIQUIDITY`,{tokenIn:t,tokenOut:n,...r===void 0?{}:{fee:r}})}static fromGatewayBounce(t,n,r,i){let a={status:r,chainMessage:n};i!==void 0&&(a.retryAfterMs=i);let o=t===`CHAIN_DISPATCH_FAILED`?n:`Gateway rejected ${t}: ${n}`;return new e(o,t,a,n,i)}static fromChainError(t,n,r){return new e(`GalaChain error ${t}: ${n}`,t,{...r,errorKey:t,message:n},n)}static unknownTokenError(t){let n=typeof t==`string`?t:JSON.stringify(t);return new e(`Token ${n} has no trading symbol on the new DEX contract (no gcdex pool includes it yet).`,`UNKNOWN_TOKEN`,{token:t})}static confirmationTimeoutError(t,n){return new e(`Transaction confirmation timed out; the trade may still apply. Confirm the same uniqueKey again later instead of resubmitting.`,`CONFIRMATION_TIMEOUT`,{uniqueKey:t,...n===void 0?{}:{cause:n}})}static async fromErrorResponse(t,n){let r=await n.text(),i=f(r),a=u(i,`error`),o=d(a,`ErrorKey`),s=d(a,`Message`);return o!==void 0&&s!==void 0?new e(`GalaChain Error ${o} from ${t}: ${s}`,o,{message:s,errorKey:o,status:n.status,body:i,url:t},s):new e(`Unexpected HTTP Error ${n.status} from ${t}`,`HTTP_ERROR`,{status:n.status,body:i??r,url:t})}};function u(e,t){if(typeof e!=`object`||!e||!(t in e))return;let n=e[t];return typeof n==`object`&&n?n:void 0}function d(e,t){if(typeof e!=`object`||!e||!(t in e))return;let n=e[t];return typeof n==`string`?n:void 0}function f(e){try{return JSON.parse(e)}catch{return}}let p=/* @__PURE__ */ function(e){return e[e.PERCENT_00_00=0]=`PERCENT_00_00`,e[e.PERCENT_00_05=500]=`PERCENT_00_05`,e[e.PERCENT_00_30=3e3]=`PERCENT_00_30`,e[e.PERCENT_01_00=1e4]=`PERCENT_01_00`,e}({});const m={0:200,500:10,3e3:60,1e4:200},h=[0,500,3e3,1e4],g=-887272,_=887272,v=e.clone({DECIMAL_PLACES:60,ROUNDING_MODE:e.ROUND_DOWN}),y=t.clone({precision:60});function b(t){return new e(new y(1.0001).pow(t/2).toString())}function ee(e){let t;try{t=new v(e)}catch{return NaN}if(!t.isFinite()||t.isLessThanOrEqualTo(0))return NaN;let n=Math.log(t.toNumber()**2)/Math.log(1.0001);if(!Number.isFinite(n))return NaN;let r=Math.min(_,Math.max(g,Math.floor(n)));for(;r<887272&&b(r+1).isLessThanOrEqualTo(t);)r+=1;for(;r>-887272&&b(r).isGreaterThan(t);)--r;return r}function x(t){let n=typeof t==`string`?t:typeof t==`number`||e.isBigNumber(t)?t.toString():`NaN`,r=new y(n);if(!r.isFinite()||r.lessThanOrEqualTo(0)||!Number.isFinite(r.toNumber()))return NaN;let i=r.ln().dividedBy(new y(1.0001).ln()).floor().toNumber();return Number.isFinite(i)?i:NaN}function S(e,t){return ne(t),Math.floor(e/t)*t}function te(e,t){return ne(t),Math.ceil(e/t)*t}function C(e,t,n){let r=m[n];if(r===void 0)throw RangeError(`Unsupported fee tier: ${n}`);if(!Number.isInteger(e)||!Number.isInteger(t))throw RangeError(`Ticks must be integers`);if(e<-887272||t>887272||e>=t)throw RangeError(`Tick range must satisfy ${g} <= lower < upper <= ${_}`);if(e%r!==0||t%r!==0)throw RangeError(`Ticks must be aligned to spacing ${r}`)}function ne(e){if(!Number.isInteger(e)||e<=0)throw RangeError(`Tick spacing must be positive`)}function w(t,n,r=!1){if(typeof t==`number`)throw new l(`Invalid ${n}: use a decimal string or BigNumber, not a JavaScript number`,`VALIDATION_ERROR`,{type:`INVALID_NUMERIC_AMOUNT`,parameterName:n,value:t,reason:`number_input`});let i;try{i=e(t)}catch{i=e(NaN)}if(!i.isFinite())throw new l(`Invalid ${n}: must be a finite number`,`VALIDATION_ERROR`,{type:`INVALID_NUMERIC_AMOUNT`,parameterName:n,value:t,reason:`not_finite`});if(!r&&i.isZero())throw new l(`Invalid ${n}: must be positive`,`VALIDATION_ERROR`,{type:`INVALID_NUMERIC_AMOUNT`,parameterName:n,value:t,reason:`zero_not_allowed`});if(i.isNegative())throw new l(`Invalid ${n}: must be ${r?`non-negative`:`positive`}`,`VALIDATION_ERROR`,{type:`INVALID_NUMERIC_AMOUNT`,parameterName:n,value:t,reason:`negative`})}function re(t,n,r){if([t,n,r].some(e=>typeof e==`number`))throw new l(`Invalid price values: use decimal strings or BigNumber values, not JavaScript numbers`,`VALIDATION_ERROR`,{type:`INVALID_NUMERIC_AMOUNT`,reason:`number_input`});let i=t=>{try{return e(t)}catch{return e(NaN)}},a=i(t),o=i(n),s=i(r);if(s=s.isFinite()?s:e(0xde0b6b3a7640000),!a.isFinite()||!o.isFinite()||!s.isFinite()||!a.isPositive()||!o.isPositive()||!s.isPositive())throw new l(`Invalid price values: all prices must be finite and positive`,`VALIDATION_ERROR`,{type:`INVALID_PRICE_VALUES`,spotPrice:t,lowerPrice:n,upperPrice:r});if(o.isGreaterThan(s))throw new l(`Invalid price range: lower price must be less than or equal to upper price`,`VALIDATION_ERROR`,{type:`INVALID_PRICE_RANGE`,lowerPrice:n,upperPrice:r})}function ie(e,t){if(e<0||!Number.isInteger(e))throw new l(`Invalid ${t}: must be a non-negative integer`,`VALIDATION_ERROR`,{type:`INVALID_TOKEN_DECIMALS`,parameterName:t,value:e})}function ae(e,t){if(!Number.isInteger(e)||!Number.isInteger(t))throw new l(`Invalid tick values: ticks must be integers`,`VALIDATION_ERROR`,{type:`INVALID_TICK_VALUES`,tickLower:e,tickUpper:t});if(e>=t)throw new l(`Invalid tick range: tickLower must be less than tickUpper`,`VALIDATION_ERROR`,{type:`INVALID_TICK_RANGE`,tickLower:e,tickUpper:t});if(e<-887272||t>887272)throw new l(`Invalid tick range: ticks must be between ${g} and ${_}`,`VALIDATION_ERROR`,{type:`INVALID_TICK_BOUNDS`,tickLower:e,tickUpper:t,minTick:g,maxTick:_})}function T(e){if(!h.some(t=>Number(t)===e))throw new l(`Invalid fee tier: must be one of 0, 500, 3000, or 10000`,`VALIDATION_ERROR`,{type:`INVALID_FEE`,value:e})}function oe(e){if(!Number.isInteger(e)||e<=0)throw new l(`Invalid tick spacing: must be a positive integer`,`VALIDATION_ERROR`,{type:`INVALID_TICK_SPACING`,value:e})}function E(e){if(e===void 0)throw new l(`Invalid wallet address: No wallet address provided`,`VALIDATION_ERROR`,{type:`MISSING_WALLET_ADDRESS`,hint:`Either provide a wallet address to the function you are calling, or set one when instantiating GSwapSDK`});if(!e||typeof e!=`string`||e.trim().length===0)throw new l(`Invalid wallet address: must be a non-empty string`,`VALIDATION_ERROR`,{type:`INVALID_WALLET_ADDRESS`,value:e})}var D=class{constructor(e,t){this.dexBackendBaseUrl=e,this.httpClient=t}async getUserAssets(e,t=1,n=10){if(E(e),!Number.isInteger(t)||t<1)throw new l(`Invalid page: must be a positive integer`,`VALIDATION_ERROR`,{page:t});if(!Number.isInteger(n)||n<1||n>100)throw new l(`Invalid limit: must be an integer between 1 and 100`,`VALIDATION_ERROR`,{limit:n});return se(await this.httpClient.sendGetRequest(this.dexBackendBaseUrl,`/user/assets`,``,{address:e,page:t.toString(),limit:n.toString()}))}};function se(e){let t=u(e,`data`),n=t?.token;if(!Array.isArray(n)||!n.every(ce))throw new l(`Backend returned an invalid user assets response.`,`INVALID_CHAIN_RESPONSE`,{data:e});let r=t?.count;return{tokens:n.map(e=>({...e,decimals:parseInt(e.decimals,10)})),count:typeof r==`number`?r:0}}function ce(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.image==`string`&&typeof t.name==`string`&&typeof t.decimals==`string`&&/^\d+$/u.test(t.decimals)&&typeof t.verify==`boolean`&&typeof t.symbol==`string`&&typeof t.quantity==`string`}async function O(e,t,n,r){let i=new AbortController,a=setTimeout(()=>i.abort(),r),o=n.signal,s=()=>i.abort();o?.addEventListener(`abort`,s,{once:!0});try{return await e(t,{...n,signal:i.signal})}catch(e){throw i.signal.aborted?new l(`Request timed out after ${r} ms.`,`REQUEST_TIMEOUT`,{url:t,timeoutMs:r,cause:e}):e}finally{clearTimeout(a),o?.removeEventListener(`abort`,s)}}async function k(e){let t=await e.text();return f(t)??t}function A(e,t){let n=e.headers;if(n===void 0)return;if(de(n)){let e=n.get(t);return e===null||e===``?void 0:e}let r=Object.entries(n).find(([e])=>e.toLowerCase()===t.toLowerCase())?.[1];return r===void 0||r===``?void 0:r}function le(e){let t=A(e,`retry-after`);if(t===void 0)return;let n=Number(t);return Number.isFinite(n)&&n>=0?n*1e3:void 0}function ue(e,t=`x-block-number`){let n=A(e,t);if(n===void 0)return;let r=Number(n);return Number.isInteger(r)&&r>=0?r:void 0}function de(e){return`get`in e&&typeof e.get==`function`}var j=class{constructor(e){c(this,`method`,void 0),c(this,`uniqueKey`,void 0),c(this,`transactionId`,void 0),c(this,`blockNumber`,void 0),c(this,`mode`,void 0),c(this,`result`,void 0),c(this,`backendBaseUrl`,void 0),c(this,`requestor`,void 0),c(this,`requestTimeoutMs`,void 0),c(this,`positionConfirmation`,void 0),this.method=e.method,this.uniqueKey=e.uniqueKey,this.transactionId=e.transactionId,this.blockNumber=e.blockNumber??null,this.mode=e.mode,this.result=e.result,this.backendBaseUrl=e.dexBackendBaseUrl.replace(/\/$/u,``),this.requestor=e.httpRequestor,this.requestTimeoutMs=e.requestTimeoutMs??3e4,this.positionConfirmation=e.positionConfirmation}async confirm(e){return this.method===`RequestTrade`?this.confirmApplied(e):this.confirmPosition(e)}async confirmApplied(e){let t=fe(e,3e3);await t.waitForRead();let n=`${this.backendBaseUrl}/v1/chain/apply-results/${encodeURIComponent(this.uniqueKey)}?channel=asset&contract=dex-contract`,r;for(;;){let e,i;try{e=await O(this.requestor,n,{method:`GET`},this.requestTimeoutMs),i=await k(e)}catch(e){if(r=e,!await t.waitForRead())break;continue}if(e.status===200)return this.readAppliedResult(e,i,n);if(e.status===404||e.status===429||me(e.status)){if(e.status===429){let n=le(e);if(n!==void 0){if(!await t.waitForRead(n))break;continue}}}else throw new l(he(i),`CONFIRMATION_FAILED`,{status:e.status,body:i,url:n});if(!await t.waitForRead())break}throw l.confirmationTimeoutError(this.uniqueKey,r)}readAppliedResult(e,t,n){let r=N(t),i=r?.Status,a=A(e,`x-apply-transaction-id`)??null,o=ue(e,`x-apply-block-number`)??null;if(i===0)throw l.fromChainError(d(r,`ErrorKey`)??`CHAIN_ERROR`,d(r,`Message`)??`The chain rejected this trade.`,{uniqueKey:this.uniqueKey,applyTransactionId:a,blockNumber:o,status:e.status,body:t,url:n});if(i!==1)throw M(e,t,n);let s=pe(r?.Data);if(s===void 0)throw M(e,t,n);return{uniqueKey:this.uniqueKey,transactionId:a,blockNumber:o,requestTransactionId:this.transactionId,result:s}}async confirmPosition(e){if(this.positionConfirmation===void 0)throw l.noWalletAddressError();let t=fe(e,0);for(await t.waitForRead();;){let e=new AbortController,n=setTimeout(()=>e.abort(),this.requestTimeoutMs);try{let t=await this.positionConfirmation(e.signal);if(t.confirmed)return t.position}finally{clearTimeout(n)}if(!await t.waitForRead())break}throw l.confirmationTimeoutError(this.uniqueKey)}};function fe(e,t){let n=Math.max(0,e?.timeoutMs??6e4),r=Math.max(500,e?.pollIntervalMs??2e3),i=Math.max(0,e?.initialDelayMs??t),a=Date.now()+n,o=!0,s=0;return{async waitForRead(e){if(o){o=!1;let e=Math.max(0,a-Date.now());return await P(Math.min(i,e)),!0}let t=Math.min(8e3,r*2**Math.min(s,5));s+=1;let n=e===void 0?ge(t):e;return Date.now()+n>a?!1:(await P(n),!0)}}}function pe(e){let t=N(e);if(t===void 0||typeof t.token0!=`string`||typeof t.token1!=`string`||typeof t.fee!=`number`)return;let n=[`sell0Qty`,`sell1Qty`,`buy0Qty`,`buy1Qty`,`tradingFees`,`protocolFees`,`totalFees`];for(let e of n)if(e in t&&typeof t[e]!=`string`)return;return{token0:t.token0,token1:t.token1,fee:t.fee,...Object.fromEntries(n.flatMap(e=>typeof t[e]==`string`?[[e,t[e]]]:[]))}}function M(e,t,n){return new l(`Transaction confirmation returned a malformed body`,`CONFIRMATION_FAILED`,{status:e.status,body:t,url:n})}function me(e){return e===500||e===502||e===503||e===504}function he(e){return d(e,`message`)??d(e,`Message`)??d(u(e,`error`),`message`)??d(u(e,`error`),`Message`)??(typeof e==`string`?e:`Transaction confirmation failed`)}function N(e){return typeof e==`object`&&e?e:void 0}function P(e){return new Promise(t=>setTimeout(t,e))}function ge(e){return Math.max(0,Math.round(e*(.9+Math.random()*.2)))}var F=class{constructor(e){c(this,`requestor`,void 0),c(this,`walletAddress`,void 0),c(this,`chainCallTimeoutMs`,void 0),c(this,`requestTimeoutMs`,void 0),c(this,`dexBackendBaseUrl`,void 0),this.dexBackendBaseUrl=_e(e.dexBackendBaseUrl),this.requestor=e.httpRequestor??fetch.bind(globalThis),this.walletAddress=e.walletAddress,this.chainCallTimeoutMs=e.chainCallTimeoutMs??3e4,this.requestTimeoutMs=this.chainCallTimeoutMs}async submit(e,t,n){if(e===`Trade`)throw new l(`The synchronous Trade method was removed; swaps are queued through RequestTrade.`,`METHOD_NOT_SUPPORTED`,{method:e});let r=`${this.dexBackendBaseUrl}/v1/chain/asset/dex-contract/${e}`,i={"content-type":`application/json`},a=n?.walletAddress??this.walletAddress;a!==void 0&&(i[`X-Wallet-Address`]=a);let o;try{o=await O(this.requestor,r,{method:`POST`,headers:i,body:JSON.stringify(t)},this.chainCallTimeoutMs)}catch(e){throw e instanceof l&&e.code===`REQUEST_TIMEOUT`?new l(`The submission outcome is unknown because the gateway request timed out. Confirm before retrying.`,`SUBMISSION_OUTCOME_UNKNOWN`,{uniqueKey:d(t,`uniqueKey`)??``,cause:e}):e}let s=await k(o);if(!o.ok)throw ve(o,s,r);let c=L(s),u=L(c?.data??c?.Data);if(u===void 0)throw I(o,s,r,`Expected a data object.`);let f=d(u,`transactionId`),p=d(u,`mode`),m=u.transactionId,h=u.blockNumber,g=`Gateway response must contain data.mode="sync" with data.result, or data.mode="queued".`;if(p!==`sync`&&p!==`queued`||`transactionId`in u&&typeof m!=`string`||h!=null&&!R(h))throw I(o,s,r,g);if(e===`RequestTrade`&&p===`sync`)throw I(o,s,r,`The gateway executed RequestTrade synchronously, which this SDK refuses; RequestTrade must be queued.`);if(e===`RequestTrade`&&p===`queued`){let e=d(t,`uniqueKey`);if(`uniqueKey`in u&&(typeof u.uniqueKey!=`string`||u.uniqueKey!==e))throw I(o,s,r,`Gateway response data.uniqueKey must match the signed RequestTrade uniqueKey.`)}else if(p===`queued`||!(`result`in u))throw I(o,s,r,g);if(p===`sync`){let e=L(u.result);if(e!==void 0){let t=e.Status;if(t!==void 0&&t!==1)throw l.fromChainError(d(e,`ErrorKey`)??`CHAIN_ERROR`,d(e,`Message`)??`The chain rejected this write.`,{status:o.status,body:s,url:r})}}let _=d(t,`uniqueKey`)??``,v=A(o,`x-transaction-id`),y=f===void 0||f===``?v:f,b=h==null?ue(o):R(h)?h:void 0;return new j({method:e,uniqueKey:_,transactionId:y===void 0||y===``?null:y,blockNumber:b??null,mode:p,result:p===`queued`?void 0:u.result,dexBackendBaseUrl:this.dexBackendBaseUrl,httpRequestor:this.requestor,requestTimeoutMs:this.chainCallTimeoutMs,...n?.positionConfirmation===void 0?{}:{positionConfirmation:n.positionConfirmation}})}get httpRequestor(){return this.requestor}};function _e(e){return e.replace(/\/$/u,``)}function I(e,t,n,r){return new l(r,`INVALID_GATEWAY_RESPONSE`,{status:e.status,body:t,url:n})}function ve(e,t,n){let r=L(t),i=u(t,`error`),a=d(r,`code`)??d(i,`code`)??d(i,`ErrorKey`)??`HTTP_ERROR`,o=d(r,`message`)??d(i,`message`)??d(i,`Message`)??(typeof t==`string`?t:`Gateway request failed with HTTP ${e.status}`),s=e.status===429?le(e):void 0;return a===`HTTP_ERROR`?new l(o,a,{status:e.status,body:t,url:n}):l.fromGatewayBounce(a,o,e.status,s)}function L(e){return typeof e==`object`&&e?e:void 0}function R(e){return typeof e==`number`&&Number.isInteger(e)&&e>=0}const z={prod:{dexBackendBaseUrl:`https://dex-backend-prod1.defi.gala.com`,dexBackendWsUrl:`wss://dex-backend-prod1.defi.gala.com/ws`},stage:{dexBackendBaseUrl:`https://swap-backend.stage.defi.ovh.gala.com`,dexBackendWsUrl:`wss://swap-backend.stage.defi.ovh.gala.com/ws`}},B=n(`GSWAP_SDK`);var ye=class{constructor(e){this.options=e,c(this,`attempts`,0),c(this,`delayMs`,void 0),c(this,`maxDelayMs`,void 0),this.delayMs=e.baseDelayMs,this.maxDelayMs=e.maxDelayMs??3e4}shouldRetry(){return this.attempts<this.options.maxAttempts}nextDelayMs(){return this.delayMs}recordAttempt(){this.attempts+=1,this.delayMs=Math.min(this.delayMs*2,this.maxDelayMs)}reset(){this.attempts=0,this.delayMs=this.options.baseDelayMs}get attemptCount(){return this.attempts}get maxAttempts(){return this.options.maxAttempts}};const be=[`add`,`remove`,`collect`];function V(e){let{pool:t}=e;return(e.version===`v1`||e.version===`v2`)&&typeof t==`object`&&!!t&&typeof e.poolHash==`string`&&typeof e.transactionId==`string`&&be.includes(e.action)&&typeof e.owner==`string`&&typeof e.amount0==`string`&&typeof e.amount1==`string`&&typeof e.blockNumber==`number`&&typeof e.timestamp==`string`}var H=class extends Error{constructor(e,t,n){super(t),c(this,`code`,void 0),c(this,`data`,void 0),this.name=`GdexStreamError`,this.code=e,n!==void 0&&(this.data=n)}},U=class{constructor(e={}){c(this,`url`,void 0),c(this,`requestTimeoutMs`,void 0),c(this,`webSocketConstructor`,void 0),c(this,`backoff`,void 0),c(this,`socket`,void 0),c(this,`connectPromise`,void 0),c(this,`nextRequestId`,0),c(this,`pending`,/* @__PURE__ */ new Map),c(this,`subscriptionsByServerId`,/* @__PURE__ */ new Map),c(this,`activeSubscriptions`,/* @__PURE__ */ new Set),c(this,`intentionalClose`,!1),c(this,`reconnecting`,!1),c(this,`reconnectTimer`,void 0),c(this,`reconnectDelayResolve`,void 0),this.url=e.url??z.prod.dexBackendWsUrl,this.requestTimeoutMs=e.requestTimeoutMs??15e3,this.backoff=new ye({maxAttempts:e.reconnectAttempts??5,baseDelayMs:e.reconnectDelayMs??2e3});let t=e.webSocketImpl??globalThis.WebSocket;if(typeof t!=`function`)throw Error(`GdexStreamService requires a standards-compatible WebSocket constructor. Node.js versions before 22 must provide one with config.webSocketImpl (for example, from the "ws" package).`);this.webSocketConstructor=t}connect(){return this.isConnected()?Promise.resolve():this.connectPromise?this.connectPromise:(this.intentionalClose=!1,this.clearReconnectTimer(),this.connectPromise=this.openSocket(),this.connectPromise)}disconnect(){this.intentionalClose=!0,this.reconnecting=!1,this.clearReconnectTimer(),this.rejectPending(/* @__PURE__ */ Error(`GDEX stream disconnected`));let e=this.socket;this.socket=void 0,this.connectPromise=void 0,e?.close(1e3,`client disconnect`)}isConnected(){return this.socket?.readyState===1}request(e,t){if(!this.isConnected()||!this.socket)return Promise.reject(/* @__PURE__ */ Error(`GDEX stream is not connected. Call connect() first.`));let n=++this.nextRequestId,r={jsonrpc:`2.0`,id:n,method:e};return t!==void 0&&(r.params=t),new Promise((t,i)=>{let a=setTimeout(()=>{this.pending.delete(n),i(/* @__PURE__ */ Error(`GDEX request "${e}" timed out after ${this.requestTimeoutMs}ms`))},this.requestTimeoutMs);this.pending.set(n,{resolve:e=>t(e),reject:i,timeout:a});try{this.socket?.send(JSON.stringify(r))}catch(e){clearTimeout(a),this.pending.delete(n),i(e instanceof Error?e:Error(String(e)))}})}serverInfo(){return this.request(`gdex_serverInfo`)}ping(){return this.request(`gdex_ping`)}getPool(e){return this.request(`gdex_getPool`,e)}getBalance(e,t){return this.request(`gdex_getBalance`,t===void 0?{owner:e}:{owner:e,tokenClassKey:t})}getPositions(e){return this.request(`gdex_getPositions`,e)}getBlockHeight(){return this.request(`gdex_getBlockHeight`)}quote(e){return this.request(`gdex_quote`,e)}getToken(e){return this.request(`gdex_getToken`,{tokenClassKey:e})}subscribeSwaps(e,t={}){return this.subscribe(`swap`,e,t)}subscribePool(e,t,n={}){return this.subscribe(`pool`,t,{...e,...n})}subscribeBalances(e,t,n={}){return this.subscribe(`balance`,t,{owner:e,...n})}subscribePoolCreated(e,t={}){return this.subscribe(`poolCreated`,e,t)}subscribeLiquidity(e,t={}){return this.subscribe(`liquidity`,t=>{V(t)?e(t):B(`Ignoring a malformed liquidity event from the GDEX stream`)},t)}subscribeBlocks(e,t={}){return this.subscribe(`blocks`,e,t)}openSocket(){return new Promise((e,t)=>{let n=!1,r=new this.webSocketConstructor(this.url,`gdex.jsonrpc.v1`);this.socket=r,r.onopen=()=>{this.socket===r&&(n=!0,this.connectPromise=void 0,this.reconnecting||this.backoff.reset(),B(`Connected to GDEX stream`),e())},r.onmessage=e=>this.handleMessage(e.data),r.onerror=()=>{n||t(/* @__PURE__ */ Error(`Failed to connect to GDEX stream at ${this.url}`))},r.onclose=e=>{this.socket===r&&(this.socket=void 0,this.connectPromise=void 0,n||t(/* @__PURE__ */ Error(`GDEX stream closed before connecting (code ${e.code??0})`)),this.rejectPending(/* @__PURE__ */ Error(`GDEX stream connection closed (code ${e.code??0})`)),!this.intentionalClose&&!this.reconnecting&&this.startReconnectLoop())}})}handleMessage(e){if(typeof e!=`string`){B(`Ignoring non-text GDEX WebSocket frame`);return}let t;try{t=JSON.parse(e)}catch{B(`Ignoring invalid JSON from GDEX stream`);return}if(typeof t.id==`number`){let e=this.pending.get(t.id);if(!e)return;if(clearTimeout(e.timeout),this.pending.delete(t.id),t.error){let n=typeof t.error.code==`number`?t.error.code:-32603,r=typeof t.error.message==`string`?t.error.message:`GDEX request failed`;e.reject(new H(n,r,t.error.data))}else e.resolve(t.result);return}if(t.method!==`gdex_subscription`||!this.isRecord(t.params))return;let n=t.params.subscription,r=t.params.result;if(typeof n!=`string`||!this.isRecord(r))return;let i=this.subscriptionsByServerId.get(n);if(i?.active)try{i.callback(r)}catch(e){B(`GDEX subscription callback failed`,e)}}async subscribe(e,t,n){let r={channel:e,...n},i=await this.request(`gdex_subscribe`,r),a,o={subscriptionId:i.subscriptionId,unsubscribe:async()=>this.unsubscribe(a)};return a={serverId:i.subscriptionId,params:r,callback:t,handle:o,active:!0},this.activeSubscriptions.add(a),this.subscriptionsByServerId.set(a.serverId,a),o}async unsubscribe(e){e.active&&(e.active=!1,this.activeSubscriptions.delete(e),this.subscriptionsByServerId.delete(e.serverId),this.isConnected()&&await this.request(`gdex_unsubscribe`,{subscriptionId:e.serverId}))}startReconnectLoop(){this.reconnecting||this.intentionalClose||(this.reconnecting=!0,this.reconnectLoop())}async reconnectLoop(){for(;!this.intentionalClose&&this.backoff.shouldRetry();){let e=this.backoff.nextDelayMs();if(this.backoff.recordAttempt(),B(`GDEX reconnect attempt ${this.backoff.attemptCount}/${this.backoff.maxAttempts} in ${e}ms`),await this.waitForReconnectDelay(e),this.intentionalClose)break;try{await this.openSocket(),await this.resubscribeAll(),this.backoff.reset(),this.reconnecting=!1;return}catch(e){B(`GDEX reconnect failed: ${e instanceof Error?e.message:String(e)}`)}}this.reconnecting=!1,this.intentionalClose||B(`GDEX reconnection attempts exhausted`)}async resubscribeAll(){this.subscriptionsByServerId.clear();for(let e of this.activeSubscriptions){if(!e.active)continue;let t={...e.params,snapshot:!0},n=await this.resubscribeWithRateLimitRetry(t);if(!e.active){await this.request(`gdex_unsubscribe`,{subscriptionId:n.subscriptionId});continue}e.serverId=n.subscriptionId,e.handle.subscriptionId=n.subscriptionId,this.subscriptionsByServerId.set(n.subscriptionId,e)}}async resubscribeWithRateLimitRetry(e){for(let t=0;;t++)try{return await this.request(`gdex_subscribe`,e)}catch(e){if(!(e instanceof H)||e.code!==-32003||t>=5)throw e;let n=this.readRetryAfterMs(e.data);B(`GDEX resubscribe rate limited; retrying in ${n}ms`),await new Promise(e=>setTimeout(e,n))}}waitForReconnectDelay(e){return new Promise(t=>{this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.reconnectDelayResolve=void 0,t()},e),this.reconnectDelayResolve=t})}clearReconnectTimer(){this.reconnectTimer!==void 0&&clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0;let e=this.reconnectDelayResolve;this.reconnectDelayResolve=void 0,e?.()}rejectPending(e){for(let t of this.pending.values())clearTimeout(t.timeout),t.reject(e);this.pending.clear()}readRetryAfterMs(e){return!this.isRecord(e)||typeof e.retryAfterMs!=`number`||e.retryAfterMs<0?1e3:e.retryAfterMs}isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}},W=class{constructor(e=fetch,t=3e4){this.httpRequestor=e,this.timeoutMs=t}async sendRequest(e,t,n,r,i,a){let o=`${t}${n}${r}`;B(`Sending request to ${o} with body:`,i);let s=await O(this.httpRequestor,o,{method:e,headers:{"Content-Type":`application/json`,"User-Agent":`GalaChain-SDK/1.1.0`},...i?{body:JSON.stringify(i)}:{},...a?.signal===void 0?{}:{signal:a.signal}},this.timeoutMs);if(!s.ok)throw await l.fromErrorResponse(o,s);let c=await k(s);return B(`Response from ${t}${n}${r}:`,c),c}async sendPostRequest(e,t,n,r){return this.sendRequest(`POST`,e,t,n,r)}async sendGetRequest(e,t,n,r,i){let a=r?new URLSearchParams(r):void 0,o=a?`${n}?${a.toString()}`:n;return this.sendRequest(`GET`,e,t,o,void 0,i)}};function G(e,t){return e<t?[e,t]:[t,e]}function K(e){if(Array.isArray(e)&&e.length>=2){let t=e[0],n=e[1];if(typeof t==`string`&&typeof n==`string`)return{token0:t,token1:n}}if(typeof e==`object`&&e){let t=e,n=t.token0,r=t.token1;if(typeof n==`string`&&typeof r==`string`)return{token0:n,token1:r}}throw new l(`Unable to order trading symbols.`,`VALIDATION_ERROR`,{value:e})}function q(e){return[e.collection,e.category,e.type,e.additionalKey].join(`$`)}function J(e){if(typeof e==`object`)return{collection:e.collection,category:e.category,type:e.type,additionalKey:e.additionalKey};let t=e.includes(`|`)?`|`:`$`,n=e.split(t),r=n.slice(-3),i=n.slice(0,-3).join(t);if(n.length<4||i.length===0||r.some(e=>e.length===0))throw new l(`Invalid token class key: expected a collection followed by category, type and additionalKey`,`VALIDATION_ERROR`,{tokenClassKey:e});let[a,o,s]=r;return{collection:i,category:a,type:o,additionalKey:s}}var xe=class{constructor(e,t){this.gateway=e,this.symbols=t,c(this,`http`,void 0),this.http=new W(e.httpRequestor,e.requestTimeoutMs??3e4)}async getPools(e){let t=await this.http.sendGetRequest(this.gateway.dexBackendBaseUrl,`/v2/trade`,`/pools`,void 0,e?.signal===void 0?void 0:{signal:e.signal});if(!Array.isArray(t.data)||!t.data.every(Se))throw new l(`Backend returned an invalid pool list.`,`INVALID_CHAIN_RESPONSE`,{data:t.data});return t.data}async getPool(e,t,n){return T(n),this.getBackend(`/pool`,await this.backendParams(e,t,n))}async getSlot0(e,t,n){return T(n),this.getBackend(`/slot0`,await this.backendParams(e,t,n))}async getCompositePool(e,t,n){T(n);let r=K(G(await Y(this.symbols,e),await Y(this.symbols,t)));return this.getBackend(`/composite-pool`,{token0:r.token0,token1:r.token1,fee:String(n)})}async backendParams(e,t,n){return{token0:await Y(this.symbols,e),token1:await Y(this.symbols,t),fee:String(n)}}async getBackend(e,t){try{return(await this.http.sendGetRequest(this.gateway.dexBackendBaseUrl,`/v2/trade`,e,t)).data}catch(e){throw e instanceof l?e:new l(`Pool request failed.`,`HTTP_ERROR`,{cause:e})}}};async function Y(e,t){let n=await e.resolve(t);if(n.symbol.length>0)return n.symbol;throw new l(`Token could not be resolved to a trading symbol.`,`SYMBOL_NOT_FOUND`,{token:t})}function Se(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.contractVersion===`v2`&&typeof t.token0==`string`&&typeof t.token1==`string`&&typeof t.poolName==`string`&&typeof t.poolRef==`string`&&[`fee`,`tickSpacing`,`protocolFees`,`tradingFees`].every(e=>Ce(t[e]))&&[`token0CompositeKey`,`token1CompositeKey`,`creator`,`price`,`sqrtPrice`,`token0Tvl`,`token1Tvl`].every(e=>we(t[e]))&&[`tick`,`tvlUsd`,`volume1d`,`volume7d`,`volume30d`,`trades1d`,`fee24h`,`apr1d`,`token0Price`,`token1Price`].every(e=>Te(t[e]))}function Ce(e){return typeof e==`number`&&Number.isFinite(e)}function we(e){return e===void 0||typeof e==`string`}function Te(e){return e===void 0||Ce(e)}var Ee=class{constructor(e,t,n,r){this.gateway=e,this.symbols=t,this.signer=n,this.walletAddress=r,c(this,`http`,void 0),this.http=new W(e.httpRequestor,e.requestTimeoutMs??3e4)}async getUserPositions(e){return(await this.get(`/positions`,{user:e})).data.map(e=>this.mapPosition(e))}async getPosition(e,t){let n=await this.symbols.orderPair(e.token0,e.token1),r=this.canonicalTicks(e.tickLower,e.tickUpper,n.flipped),i=await this.getNullable(`/position`,{token0:n.token0.symbol,token1:n.token1.symbol,fee:`${e.fee}`,owner:e.owner,tickLower:`${r.tickLower}`,tickUpper:`${r.tickUpper}`},t);return i===null?null:this.mapPosition(i.data)}async estimateAddLiquidity(t){return w(t.amount,`amount`),(await this.get(`/add-liq-estimate`,{token0:this.requestToken(t.token0),token1:this.requestToken(t.token1),fee:`${t.fee}`,tickLower:`${t.tickLower}`,tickUpper:`${t.tickUpper}`,amount:new e(t.amount).toFixed(),amountIsToken0:String(t.amountIsToken0)})).data}async estimateRemoveLiquidity(t){return w(t.liquidity,`liquidity`),(await this.get(`/remove-liq-estimate`,{token0:this.requestToken(t.token0),token1:this.requestToken(t.token1),fee:`${t.fee}`,tickLower:`${t.tickLower}`,tickUpper:`${t.tickUpper}`,liquidity:new e(t.liquidity).toFixed()})).data}async addLiquidityByTicks(t){T(t.fee);let n=await this.symbols.orderPair(t.token0,t.token1),r=this.canonicalTicks(t.tickLower,t.tickUpper,n.flipped);C(r.tickLower,r.tickUpper,t.fee),w(t.amount,`amount`);let i=new e(t.amount).toFixed(),a={token0:n.token0.symbol,token1:n.token1.symbol,fee:t.fee,tickLower:r.tickLower,tickUpper:r.tickUpper,uniqueKey:this.uniqueKey(),...n.flipped===t.amountIsToken0?{depositQuantityToken1:i}:{depositQuantityToken0:i}};return this.submit(`AddLiquidity`,a,{kind:`add`,identity:{token0:n.token0.symbol,token1:n.token1.symbol,fee:t.fee,tickLower:r.tickLower,tickUpper:r.tickUpper}})}async addLiquidityByPrice(t){T(t.fee),this.rejectNumber(t.minPrice,`minPrice`),this.rejectNumber(t.maxPrice,`maxPrice`);let n=new e(t.minPrice),r=new e(t.maxPrice);if(!n.isFinite()||!r.isFinite()||n.isLessThanOrEqualTo(0)||r.isLessThanOrEqualTo(0))throw new l(`Price bounds must be finite and positive.`,`VALIDATION_ERROR`);if(n.isGreaterThan(r))throw new l(`minPrice must be less than or equal to maxPrice.`,`VALIDATION_ERROR`);let i=this.tickSpacing(t.fee),a=S(x(n),i),o=te(x(r),i);return this.addLiquidityByTicks({token0:t.token0,token1:t.token1,fee:t.fee,tickLower:a,tickUpper:o,amount:t.amount,amountIsToken0:t.amountIsToken0})}async removeLiquidity(t){T(t.fee);let n=await this.symbols.orderPair(t.token0,t.token1),r=this.canonicalTicks(t.tickLower,t.tickUpper,n.flipped);if(C(r.tickLower,r.tickUpper,t.fee),t.amount0!==void 0&&t.amount1!==void 0)throw new l(`Provide at most one of amount0 or amount1.`,`VALIDATION_ERROR`);t.amount0!==void 0&&w(t.amount0,`amount0`),t.amount1!==void 0&&w(t.amount1,`amount1`);let i=t.amount0===void 0?t.amount1===void 0?{}:n.flipped?{withdrawalQuantityToken0:new e(t.amount1).toFixed()}:{withdrawalQuantityToken1:new e(t.amount1).toFixed()}:n.flipped?{withdrawalQuantityToken1:new e(t.amount0).toFixed()}:{withdrawalQuantityToken0:new e(t.amount0).toFixed()},a={token0:n.token0.symbol,token1:n.token1.symbol,fee:t.fee,tickLower:r.tickLower,tickUpper:r.tickUpper,uniqueKey:this.uniqueKey(),...i},o=t.amount0===void 0&&t.amount1===void 0;return this.submit(`RemoveLiquidity`,a,{kind:o?`removeFull`:`removePartial`,identity:{token0:n.token0.symbol,token1:n.token1.symbol,fee:t.fee,tickLower:r.tickLower,tickUpper:r.tickUpper}})}async collectPositionFees(e){T(e.fee);let t=await this.symbols.orderPair(e.token0,e.token1),n=this.canonicalTicks(e.tickLower,e.tickUpper,t.flipped);C(n.tickLower,n.tickUpper,e.fee);let r={token0:t.token0.symbol,token1:t.token1.symbol,fee:e.fee,tickLower:n.tickLower,tickUpper:n.tickUpper,uniqueKey:this.uniqueKey()};return this.submit(`CollectPositionFees`,r,{kind:`collect`,identity:{token0:t.token0.symbol,token1:t.token1.symbol,fee:e.fee,tickLower:n.tickLower,tickUpper:n.tickUpper}})}async createPool(t){let n=t.startingPrice!==void 0;if(n===(t.startingSqrtPrice!==void 0))throw new l(`Provide exactly one of startingPrice or startingSqrtPrice.`,`VALIDATION_ERROR`);T(t.fee);let[r,i]=await Promise.all([this.resolveCreateToken(t.token0,t.token0Symbol),this.resolveCreateToken(t.token1,t.token1Symbol)]),a=r.symbol>i.symbol,[o,s]=a?[i,r]:[r,i],c=n?t.startingPrice:t.startingSqrtPrice;this.rejectNumber(c,n?`startingPrice`:`startingSqrtPrice`);let u=new e(c);if(!u.isFinite()||u.isLessThanOrEqualTo(0))throw new l(`Starting price must be finite and positive.`,`VALIDATION_ERROR`);let d=a?new e(1).dividedBy(u):u,f={token0Key:o.classKey,token1Key:s.classKey,token0Symbol:o.symbol,token1Symbol:s.symbol,fee:t.fee,uniqueKey:this.uniqueKey(),...n?{startingPrice:d.toFixed()}:{startingSqrtPrice:d.toFixed()},...t.isPrivate===void 0?{}:{isPrivate:t.isPrivate},...t.privateAccess===void 0?{}:{privateAccess:t.privateAccess}},p=await this.submit(`CreatePool`,f,{kind:`createPool`,token0:o.symbol,token1:s.symbol,fee:t.fee});return this.symbols.invalidate?.(),p}async submit(e,t,n){if(this.signer===void 0)throw l.noSignerError();let r=await this.signer.signObject(e,t),i=this.walletAddress===void 0?{}:{walletAddress:this.walletAddress},a=this.walletAddress,o=this.buildPositionConfirmation(n,a),s={...i,...o===void 0?{}:{positionConfirmation:o}};return this.gateway.submit(e,r,s)}buildPositionConfirmation(t,n){if(t===void 0)return;if(t.kind===`createPool`){let{token0:e,token1:n,fee:r}=t;return async t=>await this.getNullable(`/pool`,{token0:e,token1:n,fee:`${r}`},t)===null?{confirmed:!1}:{confirmed:!0,position:null}}if(n===void 0)return;let{kind:r,identity:i}=t,a;return async t=>{let o=await this.getPosition({...i,owner:n},t);if(a===void 0)return a={liquidity:new e(o?.liquidity??0),fees:new e(o?.fees0??0).plus(new e(o?.fees1??0))},r===`removeFull`&&o===null?{confirmed:!0,position:null}:{confirmed:!1};switch(r){case`add`:return o!==null&&new e(o.liquidity).isGreaterThan(a.liquidity)?{confirmed:!0,position:o}:{confirmed:!1};case`removePartial`:return o!==null&&new e(o.liquidity).isLessThan(a.liquidity)?{confirmed:!0,position:o}:{confirmed:!1};case`removeFull`:return o===null?{confirmed:!0,position:null}:{confirmed:!1};case`collect`:{if(o===null)return{confirmed:!1};let t=new e(o.fees0??0).plus(new e(o.fees1??0));return t.isLessThan(a.fees)||a.fees.isZero()&&t.isZero()?{confirmed:!0,position:o}:{confirmed:!1}}}}}async get(e,t,n){return this.http.sendGetRequest(this.gateway.dexBackendBaseUrl,`/v2/trade`,e,t,n===void 0?void 0:{signal:n})}async getNullable(e,t,n){try{return await this.get(e,t,n)}catch(e){if(this.isNotFound(e))return null;throw e}}isNotFound(e){return!(e instanceof l)||e.details===void 0?!1:e.details.status===404}mapPosition(e){return{token0Symbol:e.token0Symbol,token1Symbol:e.token1Symbol,...e.token0CompositeKey===void 0?{}:{token0CompositeKey:e.token0CompositeKey},...e.token1CompositeKey===void 0?{}:{token1CompositeKey:e.token1CompositeKey},fee:e.fee,tickLower:e.tickLower,tickUpper:e.tickUpper,liquidity:e.liquidity,amount0:e.amount0,amount1:e.amount1,inRange:e.inRange,...e.currentTick===void 0?{}:{currentTick:e.currentTick},...e.sqrtPrice===void 0?{}:{sqrtPrice:e.sqrtPrice},pool:e.poolRef??e.pool??``,owner:e.owner,...e.fees0===void 0?{}:{fees0:e.fees0},...e.fees1===void 0?{}:{fees1:e.fees1}}}requestToken(e){return typeof e==`string`?e:q(e)}canonicalTicks(e,t,n){return n?{tickLower:-t,tickUpper:-e}:{tickLower:e,tickUpper:t}}tickSpacing(e){let t=m[e];if(t===void 0)throw new l(`Unsupported fee tier: ${e}.`,`VALIDATION_ERROR`);return t}rejectNumber(e,t){if(typeof e==`number`)throw new l(`Invalid ${t}: use a decimal string or BigNumber, not a JavaScript number`,`VALIDATION_ERROR`)}uniqueKey(){return`gswap-sdk-${globalThis.crypto.randomUUID()}`}async resolveCreateToken(e,t){try{let n=typeof e==`object`?q(e):e,r=await this.symbols.resolve(n);if(t!==void 0&&t!==``&&t!==r.symbol)throw new l(`Supplied symbol ${t} disagrees with the registered trading symbol ${r.symbol}.`,`VALIDATION_ERROR`,{token:e,suppliedSymbol:t,registeredSymbol:r.symbol});let i=this.tryParseClassKey(e);return{symbol:r.symbol,classKey:i??J({collection:r.collection,category:r.category,type:r.type,additionalKey:r.additionalKey})}}catch(n){if(!(n instanceof l)||n.code!==`UNKNOWN_TOKEN`)throw n;let r;try{r=J(e)}catch{throw n}if(t===void 0||t===``)throw new l(`Token is not registered in the trading-symbol registry yet; pass token0Symbol/token1Symbol (the token class symbol) to propose one. A symbol cannot be derived from a class key.`,`VALIDATION_ERROR`,{token:e});if(!/^[A-Za-z0-9]+$/u.test(t))throw new l(`Invalid trading symbol: must be ASCII letters and digits only.`,`VALIDATION_ERROR`,{symbol:t});return{symbol:t,classKey:r}}}tryParseClassKey(e){try{return J(e)}catch{return}}},De=class{constructor(e,t,n){this.dexBackendBaseUrl=e,this.http=t,this.symbols=n}async quoteExactInput(e,t,n,r){return w(n,`amountIn`),this.quote(e,t,{amountIn:Ie(n)},r)}async quoteExactOutput(e,t,n,r){return w(n,`amountOut`),this.quote(e,t,{amountOut:Ie(n)},r)}async quote(e,t,n,r){Fe(r);let i={tokenIn:await Le(this.symbols,e),tokenOut:await Le(this.symbols,t),...n};r!==void 0&&(i.fee=String(r));try{return Oe((await this.http.sendGetRequest(this.dexBackendBaseUrl,`/v2/trade`,`/quote`,i)).data)}catch(n){throw Me(n,e,t,r)}}};function Oe(t){if(!je(t))throw new l(`Backend returned an invalid quote.`,`INVALID_CHAIN_RESPONSE`,{data:t});let n=t,r=n.currentPrice===void 0?Ae(n.currentSqrtPrice,n.tokenInIsToken0):new e(n.currentPrice),i=n.newPrice===void 0?Ae(n.newSqrtPrice,n.tokenInIsToken0):new e(n.newPrice),a=i.minus(r).dividedBy(r);return{contractVersion:n.contractVersion,fee:n.fee,amountIn:n.amountIn,amountOut:n.amountOut,...n.currentSqrtPrice===void 0?{}:{currentSqrtPrice:n.currentSqrtPrice},...n.newSqrtPrice===void 0?{}:{newSqrtPrice:n.newSqrtPrice},feeTier:n.fee,newTick:n.newTick,tradingFees:n.tradingFees,protocolFees:n.protocolFees,totalFees:n.totalFees,feeTokenSymbol:n.feeTokenSymbol,token0Symbol:n.token0Symbol,token1Symbol:n.token1Symbol,tokenInIsToken0:n.tokenInIsToken0,currentPrice:r,newPrice:i,priceImpact:a}}const ke=e.clone({DECIMAL_PLACES:60});function Ae(e,t){let n=new ke(e).pow(2);return t?n:new ke(1).dividedBy(n)}function je(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.contractVersion===`v2`&&typeof t.fee==`number`&&Number.isFinite(t.fee)&&[`amountIn`,`amountOut`,`tradingFees`,`protocolFees`,`totalFees`,`feeTokenSymbol`,`token0Symbol`,`token1Symbol`].every(e=>typeof t[e]==`string`)&&typeof t.newTick==`number`&&Number.isInteger(t.newTick)&&typeof t.tokenInIsToken0==`boolean`&&X(t.currentSqrtPrice)&&X(t.newSqrtPrice)&&X(t.currentPrice)&&X(t.newPrice)&&(t.currentSqrtPrice!==void 0||t.currentPrice!==void 0)&&(t.newSqrtPrice!==void 0||t.newPrice!==void 0)}function X(t){if(t===void 0)return!0;if(typeof t!=`string`)return!1;try{let n=new e(t);return n.isFinite()&&n.isGreaterThan(0)}catch{return!1}}function Me(e,t,n,r){if(e instanceof l){let i=Ne(e.details),a=Pe(e.details)??e.message;return i===404||/no pool|no pools|pool does not exist/iu.test(a)?l.noPoolAvailableError(t,n,r):i===400&&/insufficient liquidity/iu.test(a)?l.insufficientLiquidityError(t,n,r):e}return new l(`Quote request failed.`,`HTTP_ERROR`,{cause:e,tokenIn:t,tokenOut:n,fee:r})}function Ne(e){let t=e?.status;return typeof t==`number`?t:void 0}function Pe(e){let t=e?.message;if(typeof t==`string`)return t;let n=e?.body;if(typeof n!=`object`||!n||Array.isArray(n))return;let r=n.message;return typeof r==`string`?r:void 0}function Fe(e){if(e!==void 0&&!h.some(t=>Number(t)===Number(e)))throw new l(`Invalid fee tier: ${e}`,`VALIDATION_ERROR`,{fee:e})}function Ie(t){return new e(t).toFixed()}async function Le(e,t){let n=await e.resolve(t);if(n.symbol.length>0)return n.symbol;throw new l(`Token could not be resolved to a trading symbol.`,`SYMBOL_NOT_FOUND`,{token:t})}var Re=class{constructor(e){this.gateway=e,c(this,`cachedSymbols`,void 0),c(this,`cachedAt`,0),c(this,`refreshInFlight`,void 0),c(this,`http`,void 0),this.http=new W(e.httpRequestor,e.requestTimeoutMs)}async list(){return this.cachedSymbols!==void 0&&Date.now()-this.cachedAt<6e4?this.cachedSymbols:(this.refreshInFlight===void 0&&(this.refreshInFlight=this.http.sendGetRequest(this.gateway.dexBackendBaseUrl,`/v2/trade`,`/symbols`).then(e=>ze(e.data)).then(e=>(this.cachedSymbols=e,this.cachedAt=Date.now(),e)).finally(()=>{this.refreshInFlight=void 0})),this.refreshInFlight)}invalidate(){this.cachedSymbols=void 0,this.cachedAt=0}async refresh(){return this.invalidate(),this.refreshInFlight=void 0,this.list()}async resolve(e){let t=await this.list(),n=typeof e==`string`?Ve(e)?q(J(e)):void 0:q(e),r=t.find(t=>t.symbol===e||n!==void 0&&q(t)===n);if(r===void 0){t=await this.refresh();let r=t.find(t=>t.symbol===e||n!==void 0&&q(t)===n);if(r===void 0)throw l.unknownTokenError(e);return r}return r}async orderPair(e,t){let[n,r]=await Promise.all([this.resolve(e),this.resolve(t)]),[i,a]=G(n.symbol,r.symbol);return{token0:i===n.symbol?n:r,token1:a===r.symbol?r:n,flipped:i!==n.symbol}}};function ze(e){if(!Array.isArray(e)||!e.every(Be))throw new l(`Backend returned an invalid symbol list.`,`INVALID_CHAIN_RESPONSE`,{data:e});return e}function Be(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.symbol==`string`&&typeof t.collection==`string`&&typeof t.category==`string`&&typeof t.type==`string`&&typeof t.additionalKey==`string`&&typeof t.decimals==`number`&&Number.isInteger(t.decimals)&&t.decimals>=0}function Ve(e){return e.includes(`|`)||e.includes(`$`)}const He=/^[A-Za-z0-9._:-]{1,128}$/u;var Ue=class{constructor(e,t,n,r){this.gateway=e,this.symbols=t,this.signer=n,this.walletAddress=r}async swap(e,t,n,r){T(n);let i=await this.buildRequestTradeDto(e,t,n,r);if(this.signer===void 0)throw l.noSignerError();let a=await this.signer.signObject(`RequestTrade`,i),o=this.walletAddress===void 0?{}:{walletAddress:this.walletAddress};return this.gateway.submit(`RequestTrade`,a,o)}async confirmSwap(e,t){if(!He.test(e))throw new l(`uniqueKey must be 1-128 characters of A-Z, a-z, 0-9, ".", "_", ":" or "-".`,`VALIDATION_ERROR`,{uniqueKey:e});return new j({method:`RequestTrade`,uniqueKey:e,transactionId:null,mode:`queued`,result:void 0,dexBackendBaseUrl:this.gateway.dexBackendBaseUrl,httpRequestor:this.gateway.httpRequestor,requestTimeoutMs:this.gateway.requestTimeoutMs}).confirm({initialDelayMs:0,...t})}async buildRequestTradeDto(e,t,n,r){let i=await We(this.symbols,e),a=K(G(i,await We(this.symbols,t))),o=i===a.token0,s={token0:a.token0,token1:a.token1,fee:n,uniqueKey:`gswap-sdk-${globalThis.crypto.randomUUID()}`};if(`exactIn`in r){let e=r.exactIn;if(e===void 0)throw new l(`exactIn is required for an exact-input swap.`,`VALIDATION_ERROR`);w(e,`exactIn`),s[o?`sell0Qty`:`sell1Qty`]=Z(e),r.amountOutMinimum!==void 0&&(w(r.amountOutMinimum,`amountOutMinimum`,!0),s.amountOutMinimum=Z(r.amountOutMinimum))}else{let e=r.exactOut;if(e===void 0)throw new l(`exactOut is required for an exact-output swap.`,`VALIDATION_ERROR`);w(e,`exactOut`),s[o?`buy1Qty`:`buy0Qty`]=Z(e),r.amountInMaximum!==void 0&&(w(r.amountInMaximum,`amountInMaximum`,!0),s.amountInMaximum=Z(r.amountInMaximum))}return s}};function Z(t){return new e(t).toFixed()}async function We(e,t){let n=await e.resolve(t);if(n.symbol.length>0)return n.symbol;throw new l(`Token could not be resolved to a trading symbol.`,`SYMBOL_NOT_FOUND`,{token:t})}var Ge=class{constructor(e){c(this,`dexBackendBaseUrl`,void 0),c(this,`chainCallTimeoutMs`,void 0),c(this,`signer`,void 0),c(this,`walletAddress`,void 0),c(this,`gateway`,void 0),c(this,`symbols`,void 0),c(this,`quoting`,void 0),c(this,`pools`,void 0),c(this,`positions`,void 0),c(this,`swaps`,void 0),c(this,`assets`,void 0),c(this,`dexBackendWsUrl`,void 0),c(this,`webSocketImpl`,void 0),c(this,`streamClient`,void 0);let t=z[e?.env??`prod`];this.dexBackendBaseUrl=Ke(e?.dexBackendBaseUrl??t.dexBackendBaseUrl),this.chainCallTimeoutMs=e?.chainCallTimeoutMs??3e4,this.signer=e?.signer,this.walletAddress=e?.walletAddress;let n=new W(e?.httpRequestor,this.chainCallTimeoutMs);this.gateway=new F({dexBackendBaseUrl:this.dexBackendBaseUrl,chainCallTimeoutMs:this.chainCallTimeoutMs,...e?.httpRequestor===void 0?{}:{httpRequestor:e.httpRequestor},...this.walletAddress===void 0?{}:{walletAddress:this.walletAddress}}),this.symbols=new Re(this.gateway),this.quoting=new De(this.dexBackendBaseUrl,n,this.symbols),this.pools=new xe(this.gateway,this.symbols),this.positions=new Ee(this.gateway,this.symbols,this.signer,this.walletAddress),this.swaps=new Ue(this.gateway,this.symbols,this.signer,this.walletAddress),this.assets=new D(this.dexBackendBaseUrl,n),this.dexBackendWsUrl=e?.dexBackendWsUrl??(e?.dexBackendBaseUrl===void 0?t.dexBackendWsUrl:`${this.dexBackendBaseUrl.replace(/^http/u,`ws`)}/ws`),this.webSocketImpl=e?.webSocketImpl}get stream(){return this.streamClient??(this.streamClient=new U({url:this.dexBackendWsUrl,...this.webSocketImpl===void 0?{}:{webSocketImpl:this.webSocketImpl}})),this.streamClient}};function Ke(e){return e.replace(/\/$/u,``)}function qe(e,t){let n={};n[e]=[];function r(e){let t=n[e];
2
2
  /* c8 ignore next */
3
- if(!t)throw Error(`Missing EIP-712 type definition for ${e}`);return t}function i(e,t,a,o=!1){if(Array.isArray(t)){let n=t.length>0?i(e,t[0],a,!0):`string`;o||r(a).push({name:e,type:(n??e)+`[]`})}else if(typeof t==`object`&&t){if(n[e])throw Error(`Name collisions not yet supported`);n[e]=[],Object.entries(t).forEach(([t,n])=>{i(t,n,e)}),o||r(a).push({name:e,type:e})}else{let n;switch(typeof t){case`string`:n=`string`;break;case`number`:n=`int256`;break;case`boolean`:n=`bool`;break;case`bigint`:case`symbol`:case`undefined`:case`function`:case`object`:throw Error(`Unsupported type, ${typeof t}, value: ${Object.prototype.toString.call(t)}`)}if(o)return n;r(a).push({name:e,type:n})}}return Object.entries(t).forEach(([t,n])=>{i(t,n,e)}),n}const Ue={name:`ethereum`,chainId:1},We=/* @__PURE__ */ new Set([`RequestTrade`,`AddLiquidity`,`RemoveLiquidity`,`CollectPositionFees`]);function Q(e,t){return typeof e[t]==`number`?e[t]:0}function Ge(e){return{...e,amount0Desired:Q(e,`amount0Desired`),amount0Min:Q(e,`amount0Min`),amount1Desired:Q(e,`amount1Desired`),amount1Min:Q(e,`amount1Min`),positionId:e.positionId??``}}function Ke(e){return{...e,amount:Q(e,`amount`),amount0Min:Q(e,`amount0Min`),amount1Min:Q(e,`amount1Min`),positionId:e.positionId??``}}function qe(e){return{...e,amount0Requested:Q(e,`amount0Requested`),amount1Requested:Q(e,`amount1Requested`),positionId:e.positionId??``}}const Je={AddLiquidity:Ge,RemoveLiquidity:Ke,CollectPositionFees:qe};function Ye(e,t){let n=Je[e],r=n?n(t):t;return{completedDto:r,types:He(e,r)}}function Xe(e){let t={...e};delete t.prefix;let n=r(t);return`Ethereum Signed Message:
4
- `+String(new TextEncoder().encode(n).length)}function Ze(){let e=globalThis.window?.gala;if(!e)throw new l(`Gala wallet is not available. Please ensure the Gala wallet is connected.`,`GALA_WALLET_NOT_AVAILABLE`);return e}function Qe(e){if(typeof e!=`string`)throw new l(`Wallet returned an invalid signature.`,`INVALID_SIGNATURE`);if(!/^[0-9a-fA-F]{130}$/u.test(e))throw new l(`Wallet returned an invalid native signature.`,`INVALID_SIGNATURE`);return e}function $e(e){if(typeof e!=`string`||!/^(?:0x)?[0-9a-fA-F]{130}$/u.test(e))throw new l(`Wallet returned an invalid personal-sign signature.`,`INVALID_SIGNATURE`);return e}function et(e,t){let n=t&&e.startsWith(`eth|`)?e.slice(4):e;if(!/^0x[0-9a-fA-F]{40}$/u.test(n))throw new l(`Wallet address must be the selected Ethereum account in 0x-prefixed form.`,`VALIDATION_ERROR`,{type:`INVALID_WALLET_ADDRESS`,value:e});return`0x${n.slice(2).toLowerCase()}`}function tt(e){if(e instanceof Error)return e.message;if(typeof e==`string`)return e;if(typeof e==`object`&&e&&`message`in e){let t=e.message;return typeof t==`string`?t:``}return``}function nt(e){return/unsupported|unknown scheme/i.test(tt(e))}function $(e,t,n,i){let a=Xe(t),o={...t,prefix:a},s=i===void 0?[r(t),n]:[r(o),n,i];return e.request({method:i===void 0?`personal_sign`:`gala_signChainDto`,params:s}).then(e=>({...o,signature:$e(e)}))}function rt(e,t,n,r){let{completedDto:i,types:a}=Ye(t,n),o=Xe(i),s={...i,prefix:o},c=[{name:`name`,type:`string`},{name:`chainId`,type:`uint256`}],l={domain:Ue,types:{...a,EIP712Domain:c},primaryType:t,message:s};return e.request({method:`eth_signTypedData_v4`,params:[r,JSON.stringify(l)]}).then(e=>({...s,types:a,domain:Ue,signature:$e(e)}))}var it=class{constructor(e){c(this,`keyBuffer`,void 0),this.keyBuffer=i.normalizePrivateKey(e)}signObject(e,t){let n=i.getSignature(t,this.keyBuffer);return Promise.resolve({...t,signature:n})}},at=class{constructor(e,t={}){c(this,`walletAddress`,void 0),c(this,`effectiveScheme`,void 0),this.walletAddress=et(e,!0),this.effectiveScheme=t.scheme??`native`}async signObject(e,t){let n=Ze();if(this.effectiveScheme===`personal-sign`)return $(n,t,this.walletAddress,e);try{let i=await n.request({method:`gala_signChainDto`,params:[r(t),this.walletAddress,e,`native`]});return{...t,signature:Qe(i)}}catch(r){if(!nt(r))throw r;return this.effectiveScheme=`personal-sign`,$(n,t,this.walletAddress,e)}}},ot=class{constructor(e,t,n={}){this.provider=e,c(this,`walletAddress`,void 0),c(this,`scheme`,void 0),this.walletAddress=et(t,!1),this.scheme=n.scheme??`personal-sign`}signObject(e,t){return this.scheme===`eip712`&&We.has(e)?rt(this.provider,e,t,this.walletAddress):$(this.provider,t,this.walletAddress)}};export{h as ALL_FEE_TIERS,E as Assets,ot as BrowserWalletSigner,_e as ChainGateway,p as FEE_TIER,_ as GC_MAX_TICK,g as GC_MIN_TICK,ze as GSWAP_ENVIRONMENTS,Be as GSwap,l as GSwapSDKError,at as GalaWalletSigner,W as Pools,q as Positions,it as PrivateKeySigner,J as Quoting,M as SubmittedTransaction,X as Swaps,Ne as Symbols,m as TICK_SPACING_BY_FEE,S as alignTickDown,te as alignTickUp,C as assertTickRange,H as compositeKeyOf,u as getObjectProperty,d as getStringProperty,B as orderSymbols,f as parseJson,U as parseTokenClassKey,V as readOrderedSymbols,ee as sqrtPriceToTick,x as tickFromPrice,b as tickToSqrtPrice,T as validateFee,w as validateNumericAmount,re as validatePriceValues,ae as validateTickRange,oe as validateTickSpacing,ie as validateTokenDecimals,se as validateWalletAddress};
3
+ if(!t)throw Error(`Missing EIP-712 type definition for ${e}`);return t}function i(e,t,a,o=!1){if(Array.isArray(t)){let n=t.length>0?i(e,t[0],a,!0):`string`;o||r(a).push({name:e,type:(n??e)+`[]`})}else if(typeof t==`object`&&t){if(n[e])throw Error(`Name collisions not yet supported`);n[e]=[],Object.entries(t).forEach(([t,n])=>{i(t,n,e)}),o||r(a).push({name:e,type:e})}else{let n;switch(typeof t){case`string`:n=`string`;break;case`number`:n=`int256`;break;case`boolean`:n=`bool`;break;case`bigint`:case`symbol`:case`undefined`:case`function`:case`object`:throw Error(`Unsupported type, ${typeof t}, value: ${Object.prototype.toString.call(t)}`)}if(o)return n;r(a).push({name:e,type:n})}}return Object.entries(t).forEach(([t,n])=>{i(t,n,e)}),n}const Je={name:`ethereum`,chainId:1},Ye=/* @__PURE__ */ new Set([`RequestTrade`,`AddLiquidity`,`RemoveLiquidity`,`CollectPositionFees`]);function Q(e,t){return typeof e[t]==`number`?e[t]:0}function Xe(e){return{...e,amount0Desired:Q(e,`amount0Desired`),amount0Min:Q(e,`amount0Min`),amount1Desired:Q(e,`amount1Desired`),amount1Min:Q(e,`amount1Min`),positionId:e.positionId??``}}function Ze(e){return{...e,amount:Q(e,`amount`),amount0Min:Q(e,`amount0Min`),amount1Min:Q(e,`amount1Min`),positionId:e.positionId??``}}function Qe(e){return{...e,amount0Requested:Q(e,`amount0Requested`),amount1Requested:Q(e,`amount1Requested`),positionId:e.positionId??``}}const $e={AddLiquidity:Xe,RemoveLiquidity:Ze,CollectPositionFees:Qe};function et(e,t){let n=$e[e],r=n?n(t):t;return{completedDto:r,types:qe(e,r)}}function tt(e){let t={...e};delete t.prefix;let n=r(t);return`Ethereum Signed Message:
4
+ `+String(new TextEncoder().encode(n).length)}function nt(){let e=globalThis.window?.gala;if(!e)throw new l(`Gala wallet is not available. Please ensure the Gala wallet is connected.`,`GALA_WALLET_NOT_AVAILABLE`);return e}function rt(e){if(typeof e!=`string`)throw new l(`Wallet returned an invalid signature.`,`INVALID_SIGNATURE`);if(!/^[0-9a-fA-F]{130}$/u.test(e))throw new l(`Wallet returned an invalid native signature.`,`INVALID_SIGNATURE`);return e}function it(e){if(typeof e!=`string`||!/^(?:0x)?[0-9a-fA-F]{130}$/u.test(e))throw new l(`Wallet returned an invalid personal-sign signature.`,`INVALID_SIGNATURE`);return e}function at(e,t){let n=t&&e.startsWith(`eth|`)?e.slice(4):e;if(!/^0x[0-9a-fA-F]{40}$/u.test(n))throw new l(`Wallet address must be the selected Ethereum account in 0x-prefixed form.`,`VALIDATION_ERROR`,{type:`INVALID_WALLET_ADDRESS`,value:e});return`0x${n.slice(2).toLowerCase()}`}function ot(e){if(e instanceof Error)return e.message;if(typeof e==`string`)return e;if(typeof e==`object`&&e&&`message`in e){let t=e.message;return typeof t==`string`?t:``}return``}function st(e){return/unsupported|unknown scheme/i.test(ot(e))}function $(e,t,n,i){let a=tt(t),o={...t,prefix:a},s=i===void 0?[r(t),n]:[r(o),n,i];return e.request({method:i===void 0?`personal_sign`:`gala_signChainDto`,params:s}).then(e=>({...o,signature:it(e)}))}function ct(e,t,n,r){let{completedDto:i,types:a}=et(t,n),o=tt(i),s={...i,prefix:o},c=[{name:`name`,type:`string`},{name:`chainId`,type:`uint256`}],l={domain:Je,types:{...a,EIP712Domain:c},primaryType:t,message:s};return e.request({method:`eth_signTypedData_v4`,params:[r,JSON.stringify(l)]}).then(e=>({...s,types:a,domain:Je,signature:it(e)}))}var lt=class{constructor(e){c(this,`keyBuffer`,void 0),this.keyBuffer=i.normalizePrivateKey(e)}signObject(e,t){let n=i.getSignature(t,this.keyBuffer);return Promise.resolve({...t,signature:n})}},ut=class{constructor(e,t={}){c(this,`walletAddress`,void 0),c(this,`effectiveScheme`,void 0),this.walletAddress=at(e,!0),this.effectiveScheme=t.scheme??`native`}async signObject(e,t){let n=nt();if(this.effectiveScheme===`personal-sign`)return $(n,t,this.walletAddress,e);try{let i=await n.request({method:`gala_signChainDto`,params:[r(t),this.walletAddress,e,`native`]});return{...t,signature:rt(i)}}catch(r){if(!st(r))throw r;return this.effectiveScheme=`personal-sign`,$(n,t,this.walletAddress,e)}}},dt=class{constructor(e,t,n={}){this.provider=e,c(this,`walletAddress`,void 0),c(this,`scheme`,void 0),this.walletAddress=at(t,!1),this.scheme=n.scheme??`personal-sign`}signObject(e,t){return this.scheme===`eip712`&&Ye.has(e)?ct(this.provider,e,t,this.walletAddress):$(this.provider,t,this.walletAddress)}};export{h as ALL_FEE_TIERS,D as Assets,dt as BrowserWalletSigner,F as ChainGateway,p as FEE_TIER,_ as GC_MAX_TICK,g as GC_MIN_TICK,z as GSWAP_ENVIRONMENTS,Ge as GSwap,l as GSwapSDKError,ut as GalaWalletSigner,H as GdexStreamError,U as GdexStreamService,xe as Pools,Ee as Positions,lt as PrivateKeySigner,De as Quoting,j as SubmittedTransaction,Ue as Swaps,Re as Symbols,m as TICK_SPACING_BY_FEE,S as alignTickDown,te as alignTickUp,C as assertTickRange,q as compositeKeyOf,u as getObjectProperty,d as getStringProperty,V as isGdexLiquidityEvent,G as orderSymbols,f as parseJson,J as parseTokenClassKey,K as readOrderedSymbols,ee as sqrtPriceToTick,x as tickFromPrice,b as tickToSqrtPrice,T as validateFee,w as validateNumericAmount,re as validatePriceValues,ae as validateTickRange,oe as validateTickSpacing,ie as validateTokenDecimals,E as validateWalletAddress};
5
5
  //# sourceMappingURL=index.js.map