@cowprotocol/cow-sdk 5.2.0 → 5.3.0-RC.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
@@ -28,7 +28,6 @@ yarn add @cowprotocol/cow-sdk
28
28
  - `OrderSigningUtils` - serves to sign orders and cancel them using [EIP-712](https://eips.ethereum.org/EIPS/eip-712)
29
29
  - `SubgraphApi` - provides statistics data about CoW protocol from [Subgraph](https://github.com/cowprotocol/subgraph), such as trading volume, trade count and others
30
30
 
31
-
32
31
  ```typescript
33
32
  import { OrderBookApi, OrderSigningUtils, SubgraphApi } from '@cowprotocol/cow-sdk'
34
33
 
@@ -47,6 +46,7 @@ For clarity, let's look at the use of the API with a practical example:
47
46
  Exchanging `0.4 GNO` to `WETH` on `Gnosis chain` network.
48
47
 
49
48
  We will do the following operations:
49
+
50
50
  1. Get a quote
51
51
  2. Sign the order
52
52
  3. Send the order to the order-book
@@ -56,7 +56,6 @@ We will do the following operations:
56
56
 
57
57
  [You also can check this code in the CRA example](https://github.com/cowprotocol/cow-sdk/blob/main/examples/cra/src/pages/quickStart/index.tsx)
58
58
 
59
-
60
59
  ```typescript
61
60
  import { OrderBookApi, OrderSigningUtils, SupportedChainId } from '@cowprotocol/cow-sdk'
62
61
  import { Web3Provider } from '@ethersproject/providers'
@@ -78,21 +77,24 @@ const quoteRequest = {
78
77
  const orderBookApi = new OrderBookApi({ chainId: SupportedChainId.GNOSIS_CHAIN })
79
78
 
80
79
  async function main() {
81
- const { quote } = await orderBookApi.getQuote(quoteRequest)
80
+ const { quote } = await orderBookApi.getQuote(quoteRequest)
82
81
 
83
- const orderSigningResult = await OrderSigningUtils.signOrder(quote, chainId, signer)
82
+ const orderSigningResult = await OrderSigningUtils.signOrder(quote, chainId, signer)
84
83
 
85
- const orderId = await orderBookApi.sendOrder({ ...quote, ...orderSigningResult })
84
+ const orderId = await orderBookApi.sendOrder({ ...quote, ...orderSigningResult })
86
85
 
87
- const order = await orderBookApi.getOrder(orderId)
86
+ const order = await orderBookApi.getOrder(orderId)
88
87
 
89
- const trades = await orderBookApi.getTrades({ orderId })
88
+ const trades = await orderBookApi.getTrades({ orderId })
90
89
 
91
- const orderCancellationSigningResult = await OrderSigningUtils.signOrderCancellations([orderId], chainId, signer)
90
+ const orderCancellationSigningResult = await OrderSigningUtils.signOrderCancellations([orderId], chainId, signer)
92
91
 
93
- const cancellationResult = await orderBookApi.sendSignedOrderCancellations({...orderCancellationSigningResult, orderUids: [orderId] })
92
+ const cancellationResult = await orderBookApi.sendSignedOrderCancellations({
93
+ ...orderCancellationSigningResult,
94
+ orderUids: [orderId],
95
+ })
94
96
 
95
- console.log('Results: ', { orderId, order, trades, orderCancellationSigningResult, cancellationResult })
97
+ console.log('Results: ', { orderId, order, trades, orderCancellationSigningResult, cancellationResult })
96
98
  }
97
99
  ```
98
100
 
@@ -103,18 +105,19 @@ Since the API supports different networks and environments, there are some optio
103
105
 
104
106
  #### Environment configuration
105
107
 
106
- `chainId` - can be one of `SupportedChainId.MAINNET`, `SupportedChainId.GNOSIS_CHAIN`, or `SupportedChainId.SEPOLIA`
108
+ `chainId` - can be one of `SupportedChainId.MAINNET`, `SupportedChainId.GNOSIS_CHAIN`, `SupportedChainId.ARBITRUM` or `SupportedChainId.SEPOLIA`
107
109
 
108
110
  `env` - this parameter affects which environment will be used:
109
- - `https://api.cow.fi` for `prod` (default)
110
- - `https://barn.api.cow.fi` for `staging`
111
+
112
+ - `https://api.cow.fi` for `prod` (default)
113
+ - `https://barn.api.cow.fi` for `staging`
111
114
 
112
115
  ```typescript
113
116
  import { OrderBookApi } from '@cowprotocol/cow-sdk'
114
117
 
115
118
  const orderBookApi = new OrderBookApi({
116
119
  chainId: SupportedChainId.GNOSIS_CHAIN,
117
- env: 'staging' // <-----
120
+ env: 'staging', // <-----
118
121
  })
119
122
  ```
120
123
 
@@ -127,19 +130,22 @@ import { OrderBookApi } from '@cowprotocol/cow-sdk'
127
130
 
128
131
  const orderBookApi = new OrderBookApi({
129
132
  chainId: SupportedChainId.GNOSIS_CHAIN,
130
- baseUrls: { // <-----
133
+ baseUrls: {
134
+ // <-----
131
135
  [SupportedChainId.MAINNET]: 'https://YOUR_ENDPOINT/mainnet',
132
- [SupportedChainId.GNOSIS_CHAIN]: 'https://YOUR_ENDPOINT/gnosis-chain',
136
+ [SupportedChainId.GNOSIS_CHAIN]: 'https://YOUR_ENDPOINT/gnosis_chain',
137
+ [SupportedChainId.ARBITRUM]: 'https://YOUR_ENDPOINT/arbitrum_one',
133
138
  [SupportedChainId.SEPOLIA]: 'https://YOUR_ENDPOINT/sepolia',
134
- }
139
+ },
135
140
  })
136
141
  ```
137
142
 
138
143
  The [CoW Protocol API](https://api.cow.fi/docs/#/) has restrictions on the backend side to protect against DDOS and other issues.
139
144
 
140
- >The main restriction is request rate limit of: **5 requests per second for each IP address**
145
+ > The main restriction is request rate limit of: **5 requests per second for each IP address**
146
+
147
+ The _client's_ limiter settings can be configured as well:
141
148
 
142
- The *client's* limiter settings can be configured as well:
143
149
  ```typescript
144
150
  import { OrderBookApi } from '@cowprotocol/cow-sdk'
145
151
  import { BackoffOptions } from 'exponential-backoff'
@@ -156,9 +162,7 @@ const backOffOpts: BackoffOptions = {
156
162
  jitter: 'none',
157
163
  }
158
164
 
159
- const orderBookApi = new OrderBookApi(
160
- {chainId: SupportedChainId.GNOSIS_CHAIN, limiterOpts, backOffOpts},
161
- )
165
+ const orderBookApi = new OrderBookApi({ chainId: SupportedChainId.GNOSIS_CHAIN, limiterOpts, backOffOpts })
162
166
  ```
163
167
 
164
168
  ### Querying the CoW Subgraph
@@ -201,7 +205,6 @@ const response = await cowSubgraphApi.runQuery(query, variables)
201
205
  console.log(response)
202
206
  ```
203
207
 
204
-
205
208
  ## Architecture
206
209
 
207
210
  One way to make the most out of the SDK is to get familiar with its architecture.
package/dist/README.md CHANGED
@@ -28,7 +28,6 @@ yarn add @cowprotocol/cow-sdk
28
28
  - `OrderSigningUtils` - serves to sign orders and cancel them using [EIP-712](https://eips.ethereum.org/EIPS/eip-712)
29
29
  - `SubgraphApi` - provides statistics data about CoW protocol from [Subgraph](https://github.com/cowprotocol/subgraph), such as trading volume, trade count and others
30
30
 
31
-
32
31
  ```typescript
33
32
  import { OrderBookApi, OrderSigningUtils, SubgraphApi } from '@cowprotocol/cow-sdk'
34
33
 
@@ -47,6 +46,7 @@ For clarity, let's look at the use of the API with a practical example:
47
46
  Exchanging `0.4 GNO` to `WETH` on `Gnosis chain` network.
48
47
 
49
48
  We will do the following operations:
49
+
50
50
  1. Get a quote
51
51
  2. Sign the order
52
52
  3. Send the order to the order-book
@@ -56,7 +56,6 @@ We will do the following operations:
56
56
 
57
57
  [You also can check this code in the CRA example](https://github.com/cowprotocol/cow-sdk/blob/main/examples/cra/src/pages/quickStart/index.tsx)
58
58
 
59
-
60
59
  ```typescript
61
60
  import { OrderBookApi, OrderSigningUtils, SupportedChainId } from '@cowprotocol/cow-sdk'
62
61
  import { Web3Provider } from '@ethersproject/providers'
@@ -78,21 +77,24 @@ const quoteRequest = {
78
77
  const orderBookApi = new OrderBookApi({ chainId: SupportedChainId.GNOSIS_CHAIN })
79
78
 
80
79
  async function main() {
81
- const { quote } = await orderBookApi.getQuote(quoteRequest)
80
+ const { quote } = await orderBookApi.getQuote(quoteRequest)
82
81
 
83
- const orderSigningResult = await OrderSigningUtils.signOrder(quote, chainId, signer)
82
+ const orderSigningResult = await OrderSigningUtils.signOrder(quote, chainId, signer)
84
83
 
85
- const orderId = await orderBookApi.sendOrder({ ...quote, ...orderSigningResult })
84
+ const orderId = await orderBookApi.sendOrder({ ...quote, ...orderSigningResult })
86
85
 
87
- const order = await orderBookApi.getOrder(orderId)
86
+ const order = await orderBookApi.getOrder(orderId)
88
87
 
89
- const trades = await orderBookApi.getTrades({ orderId })
88
+ const trades = await orderBookApi.getTrades({ orderId })
90
89
 
91
- const orderCancellationSigningResult = await OrderSigningUtils.signOrderCancellations([orderId], chainId, signer)
90
+ const orderCancellationSigningResult = await OrderSigningUtils.signOrderCancellations([orderId], chainId, signer)
92
91
 
93
- const cancellationResult = await orderBookApi.sendSignedOrderCancellations({...orderCancellationSigningResult, orderUids: [orderId] })
92
+ const cancellationResult = await orderBookApi.sendSignedOrderCancellations({
93
+ ...orderCancellationSigningResult,
94
+ orderUids: [orderId],
95
+ })
94
96
 
95
- console.log('Results: ', { orderId, order, trades, orderCancellationSigningResult, cancellationResult })
97
+ console.log('Results: ', { orderId, order, trades, orderCancellationSigningResult, cancellationResult })
96
98
  }
97
99
  ```
98
100
 
@@ -103,18 +105,19 @@ Since the API supports different networks and environments, there are some optio
103
105
 
104
106
  #### Environment configuration
105
107
 
106
- `chainId` - can be one of `SupportedChainId.MAINNET`, `SupportedChainId.GNOSIS_CHAIN`, or `SupportedChainId.SEPOLIA`
108
+ `chainId` - can be one of `SupportedChainId.MAINNET`, `SupportedChainId.GNOSIS_CHAIN`, `SupportedChainId.ARBITRUM` or `SupportedChainId.SEPOLIA`
107
109
 
108
110
  `env` - this parameter affects which environment will be used:
109
- - `https://api.cow.fi` for `prod` (default)
110
- - `https://barn.api.cow.fi` for `staging`
111
+
112
+ - `https://api.cow.fi` for `prod` (default)
113
+ - `https://barn.api.cow.fi` for `staging`
111
114
 
112
115
  ```typescript
113
116
  import { OrderBookApi } from '@cowprotocol/cow-sdk'
114
117
 
115
118
  const orderBookApi = new OrderBookApi({
116
119
  chainId: SupportedChainId.GNOSIS_CHAIN,
117
- env: 'staging' // <-----
120
+ env: 'staging', // <-----
118
121
  })
119
122
  ```
120
123
 
@@ -127,19 +130,22 @@ import { OrderBookApi } from '@cowprotocol/cow-sdk'
127
130
 
128
131
  const orderBookApi = new OrderBookApi({
129
132
  chainId: SupportedChainId.GNOSIS_CHAIN,
130
- baseUrls: { // <-----
133
+ baseUrls: {
134
+ // <-----
131
135
  [SupportedChainId.MAINNET]: 'https://YOUR_ENDPOINT/mainnet',
132
- [SupportedChainId.GNOSIS_CHAIN]: 'https://YOUR_ENDPOINT/gnosis-chain',
136
+ [SupportedChainId.GNOSIS_CHAIN]: 'https://YOUR_ENDPOINT/gnosis_chain',
137
+ [SupportedChainId.ARBITRUM]: 'https://YOUR_ENDPOINT/arbitrum_one',
133
138
  [SupportedChainId.SEPOLIA]: 'https://YOUR_ENDPOINT/sepolia',
134
- }
139
+ },
135
140
  })
136
141
  ```
137
142
 
138
143
  The [CoW Protocol API](https://api.cow.fi/docs/#/) has restrictions on the backend side to protect against DDOS and other issues.
139
144
 
140
- >The main restriction is request rate limit of: **5 requests per second for each IP address**
145
+ > The main restriction is request rate limit of: **5 requests per second for each IP address**
146
+
147
+ The _client's_ limiter settings can be configured as well:
141
148
 
142
- The *client's* limiter settings can be configured as well:
143
149
  ```typescript
144
150
  import { OrderBookApi } from '@cowprotocol/cow-sdk'
145
151
  import { BackoffOptions } from 'exponential-backoff'
@@ -156,9 +162,7 @@ const backOffOpts: BackoffOptions = {
156
162
  jitter: 'none',
157
163
  }
158
164
 
159
- const orderBookApi = new OrderBookApi(
160
- {chainId: SupportedChainId.GNOSIS_CHAIN, limiterOpts, backOffOpts},
161
- )
165
+ const orderBookApi = new OrderBookApi({ chainId: SupportedChainId.GNOSIS_CHAIN, limiterOpts, backOffOpts })
162
166
  ```
163
167
 
164
168
  ### Querying the CoW Subgraph
@@ -201,7 +205,6 @@ const response = await cowSubgraphApi.runQuery(query, variables)
201
205
  console.log(response)
202
206
  ```
203
207
 
204
-
205
208
  ## Architecture
206
209
 
207
210
  One way to make the most out of the SDK is to get familiar with its architecture.
@@ -5,5 +5,6 @@
5
5
  export declare enum SupportedChainId {
6
6
  MAINNET = 1,
7
7
  GNOSIS_CHAIN = 100,
8
+ ARBITRUM = 42161,
8
9
  SEPOLIA = 11155111
9
10
  }
@@ -0,0 +1,29 @@
1
+ import"cross-fetch/polyfill";import{RateLimiter as e}from"limiter";import{backOff as t}from"exponential-backoff";import{gql as n,request as r}from"graphql-request";import{utils as a,Contract as s,ethers as i,constants as o,BigNumber as p}from"ethers";import{OrderBalance as d,OrderKind as u}from"@cowprotocol/contracts";import{StandardMerkleTree as l}from"@openzeppelin/merkle-tree";var y;!function(e){e[e.MAINNET=1]="MAINNET",e[e.GNOSIS_CHAIN=100]="GNOSIS_CHAIN",e[e.ARBITRUM=42161]="ARBITRUM",e[e.SEPOLIA=11155111]="SEPOLIA"}(y||(y={}));const c=["prod","staging"],m={env:"prod",chainId:y.MAINNET};class T extends Error{constructor(e,t){super(e),this.error_code=void 0,this.error_code=t}}const h="cow-sdk:",f="https://gnosis.mypinata.cloud/ipfs",b="https://api.pinata.cloud";function I(){return I=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},I.apply(this,arguments)}function E(e,t){if(null==e)return{};var n,r,a={},s=Object.keys(e);for(r=0;r<s.length;r++)t.indexOf(n=s[r])>=0||(a[n]=e[n]);return a}const O="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",A="0x2f55e8b20D0B9FEFA187AA7d00B6Cbe563605bF5",S="0xfdaFc9d1902f4e0b84f65F49f244b32b31013b74",g=Object.values(y).filter(e=>"number"==typeof e);function N(e){return g.reduce((t,n)=>I({},t,{[n]:"function"==typeof e?e(n):e}),{})}function v(e){return N(e)}const w=v("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"),_=v("0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"),P=v(A),R=v(S);class C extends Error{constructor(e,t){super("string"==typeof t?t:e.statusText),this.response=void 0,this.body=void 0,this.response=e,this.body=t}}const D=[408,425,429,500,502,503,504],M={numOfAttempts:10,maxDelay:Infinity,jitter:"none",retry:e=>!(e instanceof C)||D.includes(e.response.status)},x={tokensPerInterval:5,interval:"second"},U=async e=>{if(204!==e.status)try{const t=e.headers.get("Content-Type");if(t)return t.toLowerCase().startsWith("application/json")?await e.json():await e.text()}catch(e){console.error(e)}};async function L(e,{path:n,query:r,method:a,body:s},i,o){const p=`${e}${n}${r?"?"+r:""}`,d={method:a,body:(()=>{if(s)return"string"==typeof s?s:JSON.stringify(s)})(),headers:{Accept:"application/json","Content-Type":"application/json"}};return t(async()=>{await i.removeTokens(1);const e=await fetch(p,d),t=await U(e);return e.status>=200&&e.status<300?t:Promise.reject(new C(e,t))},o)}function k(e){return function(e){const{ethflowData:t}=e;if(!t)return e;const{userValidTo:n}=t;return I({},e,{validTo:n,owner:e.onchainUser||e.owner,sellToken:O})}(function(e){const{executedFeeAmount:t,executedSurplusFee:n}=e,r=BigInt(t||"0"),a=BigInt(n||"0");return I({},e,{totalFee:String(r+a)})}(e))}const V={[y.MAINNET]:"https://api.cow.fi/mainnet",[y.GNOSIS_CHAIN]:"https://api.cow.fi/xdai",[y.ARBITRUM]:"https://api.cow.fi/arbitrum_one",[y.SEPOLIA]:"https://api.cow.fi/sepolia"},$={[y.MAINNET]:"https://barn.api.cow.fi/mainnet",[y.GNOSIS_CHAIN]:"https://barn.api.cow.fi/xdai",[y.ARBITRUM]:"https://barn.api.cow.fi/arbitrum_one",[y.SEPOLIA]:"https://barn.api.cow.fi/sepolia"};function B(e){return Object.keys(e).reduce((t,n)=>{const r=e[n];return void 0!==r&&(t[n]=r),t},{})}class G{constructor(t={}){this.context=void 0,this.rateLimiter=void 0,this.context=I({},m,t),this.rateLimiter=new e(t.limiterOpts||x)}getVersion(e={}){return this.fetch({path:"/api/v1/version",method:"GET"},e)}getTrades(e,t={}){if(e.owner&&e.orderUid)return Promise.reject(new T("Cannot specify both owner and orderId"));if(!e.owner&&!e.orderUid)return Promise.reject(new T("Must specify either owner or orderId"));const n=new URLSearchParams(B(e));return this.fetch({path:"/api/v1/trades",method:"GET",query:n},t)}getOrders({owner:e,offset:t=0,limit:n=1e3},r={}){const a=new URLSearchParams(B({offset:t.toString(),limit:n.toString()}));return this.fetch({path:`/api/v1/account/${e}/orders`,method:"GET",query:a},r).then(e=>e.map(k))}getTxOrders(e,t={}){return this.fetch({path:`/api/v1/transactions/${e}/orders`,method:"GET"},t).then(e=>e.map(k))}getOrder(e,t={}){return this.fetch({path:`/api/v1/orders/${e}`,method:"GET"},t).then(e=>k(e))}getOrderMultiEnv(e,t={}){const{env:n}=this.getContextWithOverride(t),r=c.filter(e=>e!==n);let a=0;const s=n=>{const i=r[a];return n instanceof C&&404===n.response.status&&i?(a++,this.getOrder(e,I({},t,{env:i})).catch(s)):Promise.reject(n)};return this.getOrder(e,I({},t,{env:n})).catch(s)}getQuote(e,t={}){return this.fetch({path:"/api/v1/quote",method:"POST",body:e},t)}sendSignedOrderCancellations(e,t={}){return this.fetch({path:"/api/v1/orders",method:"DELETE",body:e},t)}sendOrder(e,t={}){return this.fetch({path:"/api/v1/orders",method:"POST",body:e},t)}getNativePrice(e,t={}){return this.fetch({path:`/api/v1/token/${e}/native_price`,method:"GET"},t)}getTotalSurplus(e,t={}){return this.fetch({path:`/api/v1/users/${e}/total_surplus`,method:"GET"},t)}getAppData(e,t={}){return this.fetch({path:`/api/v1/app_data/${e}`,method:"GET"},t)}uploadAppData(e,t,n={}){return this.fetch({path:`/api/v1/app_data/${e}`,method:"PUT",body:{fullAppData:t}},n)}getSolverCompetition(e,t={}){return this.fetch({path:`/api/v1/solver_competition${"string"==typeof e?"/by_tx_hash":""}/${e}`,method:"GET"},t)}getOrderLink(e,t){const{chainId:n,env:r}=this.getContextWithOverride(t);return this.getApiBaseUrls(r)[n]+`/api/v1/orders/${e}`}getContextWithOverride(e={}){return I({},this.context,e)}getApiBaseUrls(e){return this.context.baseUrls?this.context.baseUrls:"prod"===e?V:$}fetch(e,t={}){const{chainId:n,env:r}=this.getContextWithOverride(t);return L(this.getApiBaseUrls(r)[n],e,this.rateLimiter,this.context.backoffOpts||M)}}var F,W,H,Y,j,Z,K,X,q,z,J,Q,ee,te;!function(e){e.ERC20="erc20",e.INTERNAL="internal"}(F||(F={})),function(e){e.EIP712="eip712",e.ETHSIGN="ethsign"}(W||(W={})),function(e){var t;(t=e.placementError||(e.placementError={})).QUOTE_NOT_FOUND="QuoteNotFound",t.VALID_TO_TOO_FAR_IN_FUTURE="ValidToTooFarInFuture",t.PRE_VALIDATION_ERROR="PreValidationError"}(H||(H={})),function(e){var t;(t=e.errorType||(e.errorType={})).INVALID_SIGNATURE="InvalidSignature",t.WRONG_OWNER="WrongOwner",t.ORDER_NOT_FOUND="OrderNotFound",t.ALREADY_CANCELLED="AlreadyCancelled",t.ORDER_FULLY_EXECUTED="OrderFullyExecuted",t.ORDER_EXPIRED="OrderExpired",t.ON_CHAIN_ORDER="OnChainOrder"}(Y||(Y={})),function(e){e.MARKET="market",e.LIMIT="limit",e.LIQUIDITY="liquidity"}(j||(j={})),function(e){e.BUY="buy",e.SELL="sell"}(Z||(Z={})),function(e){var t;(t=e.errorType||(e.errorType={})).DUPLICATED_ORDER="DuplicatedOrder",t.QUOTE_NOT_FOUND="QuoteNotFound",t.INVALID_QUOTE="InvalidQuote",t.MISSING_FROM="MissingFrom",t.WRONG_OWNER="WrongOwner",t.INVALID_EIP1271SIGNATURE="InvalidEip1271Signature",t.INSUFFICIENT_BALANCE="InsufficientBalance",t.INSUFFICIENT_ALLOWANCE="InsufficientAllowance",t.INVALID_SIGNATURE="InvalidSignature",t.SELL_AMOUNT_OVERFLOW="SellAmountOverflow",t.TRANSFER_SIMULATION_FAILED="TransferSimulationFailed",t.ZERO_AMOUNT="ZeroAmount",t.INCOMPATIBLE_SIGNING_SCHEME="IncompatibleSigningScheme",t.TOO_MANY_LIMIT_ORDERS="TooManyLimitOrders",t.TOO_MUCH_GAS="TooMuchGas",t.UNSUPPORTED_BUY_TOKEN_DESTINATION="UnsupportedBuyTokenDestination",t.UNSUPPORTED_SELL_TOKEN_SOURCE="UnsupportedSellTokenSource",t.UNSUPPORTED_ORDER_TYPE="UnsupportedOrderType",t.INSUFFICIENT_VALID_TO="InsufficientValidTo",t.EXCESSIVE_VALID_TO="ExcessiveValidTo",t.INVALID_NATIVE_SELL_TOKEN="InvalidNativeSellToken",t.SAME_BUY_AND_SELL_TOKEN="SameBuyAndSellToken",t.UNSUPPORTED_TOKEN="UnsupportedToken",t.INVALID_APP_DATA="InvalidAppData",t.APP_DATA_HASH_MISMATCH="AppDataHashMismatch",t.APPDATA_FROM_MISMATCH="AppdataFromMismatch"}(K||(K={})),function(e){e.BUY="buy"}(X||(X={})),function(e){e.SELL="sell"}(q||(q={})),function(e){e.PRESIGNATURE_PENDING="presignaturePending",e.OPEN="open",e.FULFILLED="fulfilled",e.CANCELLED="cancelled",e.EXPIRED="expired"}(z||(z={})),function(e){var t;(t=e.errorType||(e.errorType={})).UNSUPPORTED_TOKEN="UnsupportedToken",t.ZERO_AMOUNT="ZeroAmount",t.UNSUPPORTED_ORDER_TYPE="UnsupportedOrderType"}(J||(J={})),function(e){e.FAST="fast",e.OPTIMAL="optimal",e.VERIFIED="verified"}(Q||(Q={})),function(e){e.ERC20="erc20",e.INTERNAL="internal",e.EXTERNAL="external"}(ee||(ee={})),function(e){e.EIP712="eip712",e.ETHSIGN="ethsign",e.PRESIGN="presign",e.EIP1271="eip1271"}(te||(te={}));let ne,re,ae,se=e=>e;const ie=n(ne||(ne=se`
2
+ query Totals {
3
+ totals {
4
+ tokens
5
+ orders
6
+ traders
7
+ settlements
8
+ volumeUsd
9
+ volumeEth
10
+ feesUsd
11
+ feesEth
12
+ }
13
+ }
14
+ `)),oe=n(re||(re=se`
15
+ query LastDaysVolume($days: Int!) {
16
+ dailyTotals(orderBy: timestamp, orderDirection: desc, first: $days) {
17
+ timestamp
18
+ volumeUsd
19
+ }
20
+ }
21
+ `)),pe=n(ae||(ae=se`
22
+ query LastHoursVolume($hours: Int!) {
23
+ hourlyTotals(orderBy: timestamp, orderDirection: desc, first: $hours) {
24
+ timestamp
25
+ volumeUsd
26
+ }
27
+ }
28
+ `)),de="https://api.thegraph.com/subgraphs/name/cowprotocol",ue={[y.MAINNET]:de+"/cow",[y.GNOSIS_CHAIN]:de+"/cow-gc",[y.ARBITRUM]:null,[y.SEPOLIA]:null},le={[y.MAINNET]:de+"/cow-staging",[y.GNOSIS_CHAIN]:de+"/cow-gc-staging",[y.ARBITRUM]:null,[y.SEPOLIA]:null};class ye{constructor(e={}){this.API_NAME="CoW Protocol Subgraph",this.context=void 0,this.context=I({},m,e)}async getTotals(e={}){return(await this.runQuery(ie,void 0,e)).totals[0]}async getLastDaysVolume(e,t={}){return this.runQuery(oe,{days:e},t)}async getLastHoursVolume(e,t={}){return this.runQuery(pe,{hours:e},t)}async runQuery(e,t=undefined,n={}){const{chainId:a,env:s}=this.getContextWithOverride(n),i=this.getEnvConfigs(s)[a];if(null===i)throw new Error("Unsupported Network. The subgraph API is not available in the Network "+a);try{return await r(i,e,t)}catch(n){throw console.error(`[subgraph:${this.API_NAME}]`,n),new T(`Error running query: ${e}. Variables: ${JSON.stringify(t)}. API: ${i}. Inner Error: ${n}`)}}getContextWithOverride(e={}){return I({},this.context,e)}getEnvConfigs(e){return this.context.baseUrls?this.context.baseUrls:"prod"===e?ue:le}}const ce=()=>import("./utils-b6308334.js");class me{static async signOrder(e,t,n){const{signOrder:r}=await ce();return r(e,t,n)}static async signOrderCancellation(e,t,n){const{signOrderCancellation:r}=await ce();return r(e,t,n)}static async signOrderCancellations(e,t,n){const{signOrderCancellations:r}=await ce();return r(e,t,n)}static async getDomain(e){const{getDomain:t}=await ce();return t(e)}static async getDomainSeparator(e){const{getDomain:t}=await ce(),{_TypedDataEncoder:n}=await import("ethers/lib/utils");return n.hashDomain(t(e))}static getEIP712Types(){return{Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}}}var Te,he;!function(e){e[e.PRIVATE=0]="PRIVATE",e[e.EMITTED=1]="EMITTED",e[e.SWARM=2]="SWARM",e[e.WAKU=3]="WAKU",e[e.RESERVED=4]="RESERVED",e[e.IPFS=5]="IPFS"}(Te||(Te={})),function(e){e.SUCCESS="SUCCESS",e.UNEXPECTED_ERROR="UNEXPECTED_ERROR",e.TRY_NEXT_BLOCK="TRY_NEXT_BLOCK",e.TRY_ON_BLOCK="TRY_ON_BLOCK",e.TRY_AT_EPOCH="TRY_AT_EPOCH",e.DONT_TRY_AGAIN="DONT_TRY_AGAIN"}(he||(he={}));const fe=[{inputs:[{internalType:"address",name:"_settlement",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"InterfaceNotSupported",type:"error"},{inputs:[],name:"InvalidHandler",type:"error"},{inputs:[],name:"ProofNotAuthed",type:"error"},{inputs:[],name:"SingleOrderNotAuthed",type:"error"},{inputs:[],name:"SwapGuardRestricted",type:"error"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{components:[{internalType:"contract IConditionalOrder",name:"handler",type:"address"},{internalType:"bytes32",name:"salt",type:"bytes32"},{internalType:"bytes",name:"staticInput",type:"bytes"}],indexed:!1,internalType:"struct IConditionalOrder.ConditionalOrderParams",name:"params",type:"tuple"}],name:"ConditionalOrderCreated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!1,internalType:"bytes32",name:"root",type:"bytes32"},{components:[{internalType:"uint256",name:"location",type:"uint256"},{internalType:"bytes",name:"data",type:"bytes"}],indexed:!1,internalType:"struct ComposableCoW.Proof",name:"proof",type:"tuple"}],name:"MerkleRootSet",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!1,internalType:"contract ISwapGuard",name:"swapGuard",type:"address"}],name:"SwapGuardSet",type:"event"},{inputs:[{internalType:"address",name:"",type:"address"},{internalType:"bytes32",name:"",type:"bytes32"}],name:"cabinet",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{components:[{internalType:"contract IConditionalOrder",name:"handler",type:"address"},{internalType:"bytes32",name:"salt",type:"bytes32"},{internalType:"bytes",name:"staticInput",type:"bytes"}],internalType:"struct IConditionalOrder.ConditionalOrderParams",name:"params",type:"tuple"},{internalType:"bool",name:"dispatch",type:"bool"}],name:"create",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"contract IConditionalOrder",name:"handler",type:"address"},{internalType:"bytes32",name:"salt",type:"bytes32"},{internalType:"bytes",name:"staticInput",type:"bytes"}],internalType:"struct IConditionalOrder.ConditionalOrderParams",name:"params",type:"tuple"},{internalType:"contract IValueFactory",name:"factory",type:"address"},{internalType:"bytes",name:"data",type:"bytes"},{internalType:"bool",name:"dispatch",type:"bool"}],name:"createWithContext",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"domainSeparator",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"},{components:[{internalType:"contract IConditionalOrder",name:"handler",type:"address"},{internalType:"bytes32",name:"salt",type:"bytes32"},{internalType:"bytes",name:"staticInput",type:"bytes"}],internalType:"struct IConditionalOrder.ConditionalOrderParams",name:"params",type:"tuple"},{internalType:"bytes",name:"offchainInput",type:"bytes"},{internalType:"bytes32[]",name:"proof",type:"bytes32[]"}],name:"getTradeableOrderWithSignature",outputs:[{components:[{internalType:"contract IERC20",name:"sellToken",type:"address"},{internalType:"contract IERC20",name:"buyToken",type:"address"},{internalType:"address",name:"receiver",type:"address"},{internalType:"uint256",name:"sellAmount",type:"uint256"},{internalType:"uint256",name:"buyAmount",type:"uint256"},{internalType:"uint32",name:"validTo",type:"uint32"},{internalType:"bytes32",name:"appData",type:"bytes32"},{internalType:"uint256",name:"feeAmount",type:"uint256"},{internalType:"bytes32",name:"kind",type:"bytes32"},{internalType:"bool",name:"partiallyFillable",type:"bool"},{internalType:"bytes32",name:"sellTokenBalance",type:"bytes32"},{internalType:"bytes32",name:"buyTokenBalance",type:"bytes32"}],internalType:"struct GPv2Order.Data",name:"order",type:"tuple"},{internalType:"bytes",name:"signature",type:"bytes"}],stateMutability:"view",type:"function"},{inputs:[{components:[{internalType:"contract IConditionalOrder",name:"handler",type:"address"},{internalType:"bytes32",name:"salt",type:"bytes32"},{internalType:"bytes",name:"staticInput",type:"bytes"}],internalType:"struct IConditionalOrder.ConditionalOrderParams",name:"params",type:"tuple"}],name:"hash",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract Safe",name:"safe",type:"address"},{internalType:"address",name:"sender",type:"address"},{internalType:"bytes32",name:"_hash",type:"bytes32"},{internalType:"bytes32",name:"_domainSeparator",type:"bytes32"},{internalType:"bytes32",name:"",type:"bytes32"},{internalType:"bytes",name:"encodeData",type:"bytes"},{internalType:"bytes",name:"payload",type:"bytes"}],name:"isValidSafeSignature",outputs:[{internalType:"bytes4",name:"magic",type:"bytes4"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"singleOrderHash",type:"bytes32"}],name:"remove",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"}],name:"roots",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"root",type:"bytes32"},{components:[{internalType:"uint256",name:"location",type:"uint256"},{internalType:"bytes",name:"data",type:"bytes"}],internalType:"struct ComposableCoW.Proof",name:"proof",type:"tuple"}],name:"setRoot",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"root",type:"bytes32"},{components:[{internalType:"uint256",name:"location",type:"uint256"},{internalType:"bytes",name:"data",type:"bytes"}],internalType:"struct ComposableCoW.Proof",name:"proof",type:"tuple"},{internalType:"contract IValueFactory",name:"factory",type:"address"},{internalType:"bytes",name:"data",type:"bytes"}],name:"setRootWithContext",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract ISwapGuard",name:"swapGuard",type:"address"}],name:"setSwapGuard",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"},{internalType:"bytes32",name:"",type:"bytes32"}],name:"singleOrders",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"}],name:"swapGuards",outputs:[{internalType:"contract ISwapGuard",name:"",type:"address"}],stateMutability:"view",type:"function"}];class be{static createInterface(){return new a.Interface(fe)}static connect(e,t){return new s(e,fe,t)}}be.abi=fe;const Ie=[{anonymous:!1,inputs:[{indexed:!0,internalType:"contract Safe",name:"safe",type:"address"},{indexed:!1,internalType:"bytes32",name:"domainSeparator",type:"bytes32"},{indexed:!1,internalType:"contract ISafeSignatureVerifier",name:"verifier",type:"address"}],name:"AddedDomainVerifier",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"contract Safe",name:"safe",type:"address"},{indexed:!1,internalType:"bytes4",name:"interfaceId",type:"bytes4"}],name:"AddedInterface",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"contract Safe",name:"safe",type:"address"},{indexed:!1,internalType:"bytes4",name:"selector",type:"bytes4"},{indexed:!1,internalType:"bytes32",name:"method",type:"bytes32"}],name:"AddedSafeMethod",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"contract Safe",name:"safe",type:"address"},{indexed:!1,internalType:"bytes32",name:"domainSeparator",type:"bytes32"},{indexed:!1,internalType:"contract ISafeSignatureVerifier",name:"oldVerifier",type:"address"},{indexed:!1,internalType:"contract ISafeSignatureVerifier",name:"newVerifier",type:"address"}],name:"ChangedDomainVerifier",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"contract Safe",name:"safe",type:"address"},{indexed:!1,internalType:"bytes4",name:"selector",type:"bytes4"},{indexed:!1,internalType:"bytes32",name:"oldMethod",type:"bytes32"},{indexed:!1,internalType:"bytes32",name:"newMethod",type:"bytes32"}],name:"ChangedSafeMethod",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"contract Safe",name:"safe",type:"address"},{indexed:!1,internalType:"bytes32",name:"domainSeparator",type:"bytes32"}],name:"RemovedDomainVerifier",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"contract Safe",name:"safe",type:"address"},{indexed:!1,internalType:"bytes4",name:"interfaceId",type:"bytes4"}],name:"RemovedInterface",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"contract Safe",name:"safe",type:"address"},{indexed:!1,internalType:"bytes4",name:"selector",type:"bytes4"}],name:"RemovedSafeMethod",type:"event"},{stateMutability:"nonpayable",type:"fallback"},{inputs:[{internalType:"contract Safe",name:"",type:"address"},{internalType:"bytes32",name:"",type:"bytes32"}],name:"domainVerifiers",outputs:[{internalType:"contract ISafeSignatureVerifier",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_hash",type:"bytes32"},{internalType:"bytes",name:"signature",type:"bytes"}],name:"isValidSignature",outputs:[{internalType:"bytes4",name:"magic",type:"bytes4"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"},{internalType:"address",name:"",type:"address"},{internalType:"uint256[]",name:"",type:"uint256[]"},{internalType:"uint256[]",name:"",type:"uint256[]"},{internalType:"bytes",name:"",type:"bytes"}],name:"onERC1155BatchReceived",outputs:[{internalType:"bytes4",name:"",type:"bytes4"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"},{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint256",name:"",type:"uint256"},{internalType:"bytes",name:"",type:"bytes"}],name:"onERC1155Received",outputs:[{internalType:"bytes4",name:"",type:"bytes4"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"},{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"},{internalType:"bytes",name:"",type:"bytes"}],name:"onERC721Received",outputs:[{internalType:"bytes4",name:"",type:"bytes4"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract Safe",name:"",type:"address"},{internalType:"bytes4",name:"",type:"bytes4"}],name:"safeInterfaces",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract Safe",name:"",type:"address"},{internalType:"bytes4",name:"",type:"bytes4"}],name:"safeMethods",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"domainSeparator",type:"bytes32"},{internalType:"contract ISafeSignatureVerifier",name:"newVerifier",type:"address"}],name:"setDomainVerifier",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes4",name:"selector",type:"bytes4"},{internalType:"bytes32",name:"newMethod",type:"bytes32"}],name:"setSafeMethod",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes4",name:"interfaceId",type:"bytes4"},{internalType:"bool",name:"supported",type:"bool"}],name:"setSupportedInterface",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes4",name:"_interfaceId",type:"bytes4"},{internalType:"bytes32[]",name:"handlerWithSelectors",type:"bytes32[]"}],name:"setSupportedInterfaceBatch",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes4",name:"interfaceId",type:"bytes4"}],name:"supportsInterface",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"}];class Ee{static createInterface(){return new a.Interface(Ie)}static connect(e,t){return new s(e,Ie,t)}}Ee.abi=Ie;const Oe=["erc20","0x5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc9"],Ae=["external","0xabee3b73373acd583a130924aad6dc38cfdc44ba0555ba94ce2ff63980ea0632"],Se=["internal","0x4ac99ace14ee0a5ef932dc609df0943ab7ac16b7583634612f8dc35a4289a6ce"],ge=["sell","0xf3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee346775"],Ne=["buy","0x6ed88e868af0a1983e3886d5f3e95a2fafbd6c3450bc229e27342283dc429ccc"],ve=["tuple(address handler, bytes32 salt, bytes staticInput)"],we=(e,t)=>`${t}@${e}`;function _e(e,t){return e===P[t]}function Pe(e,t){return e===R[t]}async function Re(e,t,n,r){const a=Ee.connect(P[n],r);return await a.callStatic.domainVerifiers(e,t)}function Ce(e,t){return Ee.createInterface().encodeFunctionData("setDomainVerifier",[e,t])}function De(e){return a.defaultAbiCoder.encode(ve,[e])}function Me(e){const{handler:t,salt:n,staticInput:r}=a.defaultAbiCoder.decode(ve,e)[0];return{handler:t,salt:n,staticInput:r}}function xe(e,t){try{a.defaultAbiCoder.encode(e,t)}catch(e){return!1}return!0}async function Ue(e){const t=await e.getBlock("latest");return{blockNumber:t.number,blockTimestamp:t.timestamp}}function Le(e){return new Date(1e3*e).toISOString()}function ke(e){if(Oe.includes(e))return d.ERC20;if(Ae.includes(e))return d.EXTERNAL;if(Se.includes(e))return d.INTERNAL;throw new Error(`Unknown balance type: ${e}`)}function Ve(e){if(ge.includes(e))return u.SELL;if(Ne.includes(e))return u.BUY;throw new Error(`Unknown kind: ${e}`)}function $e(e){const{sellToken:t,sellAmount:n,buyToken:r,buyAmount:a,buyTokenBalance:s,sellTokenBalance:i,feeAmount:o,kind:p,receiver:d,validTo:u,partiallyFillable:l,appData:y}=e;return{sellToken:t,sellAmount:n,buyToken:r,buyAmount:a,feeAmount:o,receiver:d,partiallyFillable:l,appData:y,validTo:Number(u),kind:Ve(p.toString()),sellTokenBalance:ke(i.toString()),buyTokenBalance:ke(s.toString())}}let Be,Ge;function Fe(){return Be||(Be=be.createInterface()),Be}function We(e,t){return Ge||(Ge=be.connect(R[e],t)),Ge}class He{constructor(e){this.handler=void 0,this.salt=void 0,this.data=void 0,this.staticInput=void 0,this.hasOffChainInput=void 0;const{handler:t,salt:n=a.keccak256(a.randomBytes(32)),data:r,hasOffChainInput:s=!1}=e;if(!i.utils.isAddress(t))throw new Error(`Invalid handler: ${t}`);if(!i.utils.isHexString(n)||32!==i.utils.hexDataLength(n))throw new Error(`Invalid salt: ${n}`);this.handler=t,this.salt=n,this.data=r,this.staticInput=this.transformDataToStruct(r),this.hasOffChainInput=s}get context(){}assertIsValid(){const e=this.isValid();if(!e.isValid)throw new Error(`Invalid order: ${e.reason}`)}get createCalldata(){this.assertIsValid();const e=this.context,t=Fe(),n={handler:this.handler,salt:this.salt,staticInput:this.encodeStaticInput()};if(e){const r=e.factoryArgs?a.defaultAbiCoder.encode(e.factoryArgs.argsType,e.factoryArgs.args):"0x";return t.encodeFunctionData("createWithContext",[n,e.address,r,!0])}return t.encodeFunctionData("create",[n,!0])}get removeCalldata(){return this.assertIsValid(),Fe().encodeFunctionData("remove",[this.id])}get id(){return a.keccak256(this.serialize())}get ctx(){return this.isSingleOrder?this.id:o.HashZero}get leaf(){return{handler:this.handler,salt:this.salt,staticInput:this.encodeStaticInput()}}static leafToId(e){return a.keccak256(De(e))}get offChainInput(){return"0x"}encodeStaticInputHelper(e,t){return a.defaultAbiCoder.encode(e,[t])}async poll(e){const{chainId:t,owner:n,provider:r,orderBookApi:a}=e,s=We(t,r);try{const r=this.isValid();if(!r.isValid)return{result:he.DONT_TRY_AGAIN,reason:`InvalidConditionalOrder. Reason: ${r.reason}`};const i=await this.pollValidate(e);if(i)return i;if(!await this.isAuthorized(e))return{result:he.DONT_TRY_AGAIN,reason:`NotAuthorized: Order ${this.id} is not authorized for ${n} on chain ${t}`};const[o,p]=await s.getTradeableOrderWithSignature(n,this.leaf,this.offChainInput,[]),d=await async function(e,t,n){const{computeOrderUid:r}=await import("@cowprotocol/contracts");return r(await me.getDomain(e),n,t)}(t,n,$e(o));return await a.getOrder(d).then(()=>!0).catch(()=>!1)?await this.handlePollFailedAlreadyPresent(d,o,e)||{result:he.TRY_NEXT_BLOCK,reason:"Order already in orderbook"}:{result:he.SUCCESS,order:o,signature:p}}catch(e){return{result:he.UNEXPECTED_ERROR,error:e}}}isAuthorized(e){const{chainId:t,owner:n,provider:r}=e;return We(t,r).callStatic.singleOrders(n,this.id)}cabinet(e){const{chainId:t,owner:n,provider:r}=e;return We(t,r).callStatic.cabinet(n,this.ctx)}static deserializeHelper(e,t,n,r){try{const{handler:s,salt:i,staticInput:o}=Me(e);if(s!=t)throw new Error("HandlerMismatch");const[p]=a.defaultAbiCoder.decode(n,o);return r(p,i)}catch(e){throw"HandlerMismatch"===e.message?e:new Error("InvalidSerializedConditionalOrder")}}}const Ye=["orderType"],je=["address","bytes32","bytes"],Ze=["tuple(bytes32[] proof, tuple(address handler, bytes32 salt, bytes staticInput) params)[]"];class Ke{constructor(e,t,n,r=Te.PRIVATE){if(this.chain=void 0,this.location=void 0,this.orders={},this.tree=void 0,this.ctx=void 0,this.chain=e,this.location=r,t&&0===Object.keys(t).length)throw new Error("orders must have non-zero length");if(t&&!n||!t&&n)throw new Error("orders cannot have undefined root");for(const e in t)if(t.hasOwnProperty(e)){const n=t[e];if(!Ke.orderTypeRegistry.hasOwnProperty(n.orderType))throw new Error(`Unknown order type: ${n.orderType}`)}if(t&&(this.orders=t,this.getOrGenerateTree().root!==n))throw new Error("root mismatch")}static fromJSON(e){const{chain:t,orders:n,root:r,location:a}=JSON.parse(e,(e,t)=>{if("orders"===e&&"object"==typeof t&&null!==t){const e={};for(const n in t)if(t.hasOwnProperty(n)){const r=t[n],{orderType:a}=r,s=E(r,Ye);if(!Ke.orderTypeRegistry.hasOwnProperty(a))throw new Error(`Unknown order type: ${a}`);e[n]=new(0,Ke.orderTypeRegistry[a])(s)}return e}return"object"==typeof t&&null!==t&&t.hasOwnProperty("type")&&t.hasOwnProperty("hex")&&"BigNumber"===t.type?p.from(t):t}),s=new Ke(t,n,r);return s.location=a,s}toJSON(){const e=this.getOrGenerateTree().root;return JSON.stringify(I({},this,{root:e}),(e,t)=>{if("tree"!==e)return"object"==typeof t&&null!==t&&"orderType"in t?I({},t,{orderType:t.orderType}):t})}add(e){e.assertIsValid(),this.orders[e.id]=e,this.reset()}remove(e){delete this.orders[e],this.reset()}update(e,t){const n=t(this.orders[e],this.ctx);delete this.orders[e],this.orders[n.id]=n,this.reset()}getById(e){return this.orders[e]}getByIndex(e){return this.orders[this.orderIds[e]]}get orderIds(){return Object.keys(this.orders)}get root(){return this.getOrGenerateTree().root}getOrGenerateTree(){return this.tree||(this.tree=l.of(Object.values(this.orders).map(e=>[...Object.values(e.leaf)]),je)),this.tree}static decodeFromJSON(e){return JSON.parse(e)}async prepareProofStruct(e=this.location,t,n){var r=this;return await async function(){switch(e){case Te.PRIVATE:return"0x";case Te.EMITTED:return r.encodeToABI(t);case Te.SWARM:case Te.WAKU:case Te.IPFS:if(!n)throw new Error("Must provide an uploader function");try{return await n(r.encodeToJSON(t))}catch(t){throw new Error(`Error uploading to decentralized storage ${e}: ${t}`)}default:throw new Error("Unsupported location")}}().then(t=>{try{return a.hexlify(a.arrayify(t)),this.location=e,{location:e,data:t}}catch(e){throw new Error("data returned by uploader is invalid")}}).catch(e=>{throw new Error(`Error preparing proof struct: ${e}`)})}static async poll(e,t,n,r,a){const s=We(n,r),i=a?await a(e,t.params):"0x";return await s.getTradeableOrderWithSignature(e,t.params,i,t.proof)}dumpProofs(e){return this.encodeToJSON(e)}dumpProofsAndParams(e){return this.getProofs(e)}getProofs(e){return[...this.getOrGenerateTree().entries()].map(([t,n])=>e&&e(n)||void 0===e?{idx:t,value:n}:void 0).reduce((e,t)=>{if(t){const n={handler:t.value[0],salt:t.value[1],staticInput:t.value[2]};e.push({proof:this.getOrGenerateTree().getProof(t.idx),params:n})}return e},[])}encodeToABI(e){return a.defaultAbiCoder.encode(Ze,[this.getProofs(e)])}encodeToJSON(e){return JSON.stringify(this.getProofs(e))}reset(){this.tree=void 0}static registerOrderType(e,t){Ke.orderTypeRegistry[e]=t}static resetOrderTypeRegistry(){Ke.orderTypeRegistry={}}}Ke.orderTypeRegistry={};class Xe{constructor(e){this.knownOrderTypes=void 0,this.knownOrderTypes=e}fromParams(e){const{handler:t}=e,n=this.knownOrderTypes[t];if(n)return n(e)}}const qe=["sellAmount","buyAmount","numberOfParts","startTime","timeBetweenParts","durationOfPart"],ze=["n","partSellAmount","minPartLimit","t","t0","span"],Je="0x6cF1e9cA41f7611dEf408122793c358a3d11E5a5",Qe="0x52eD56Da04309Aca4c3FECC595298d80C2f16BAc",et=p.from(2).pow(32).sub(1),tt=p.from(31536e3),nt=["tuple(address sellToken, address buyToken, address receiver, uint256 partSellAmount, uint256 minPartLimit, uint256 t0, uint256 n, uint256 t, uint256 span, bytes32 appData)"];var rt,at;!function(e){e.AUTO="AUTO",e.LIMIT_DURATION="LIMIT_DURATION"}(rt||(rt={})),function(e){e.AT_MINING_TIME="AT_MINING_TIME",e.AT_EPOCH="AT_EPOCH"}(at||(at={}));const st={startType:at.AT_MINING_TIME},it={durationType:rt.AUTO};class ot extends He{constructor(e){const{handler:t,salt:n,data:r,hasOffChainInput:a}=e;if(t!==Je)throw new Error(`InvalidHandler: Expected: ${Je}, provided: ${t}`);super({handler:Je,salt:n,data:r,hasOffChainInput:a}),this.isSingleOrder=!0}static fromData(e,t){return new ot({handler:Je,data:e,salt:t})}static fromParams(e){return ot.deserialize(De(e))}get context(){return this.staticInput.t0.gt(0)?super.context:{address:Qe,factoryArgs:void 0}}get orderType(){return"twap"}isValid(){const e=(()=>{const{sellToken:e,sellAmount:t,buyToken:n,buyAmount:r,startTime:a=st,numberOfParts:s,timeBetweenParts:i,durationOfPart:p=it}=this.data;if(e==n)return"InvalidSameToken";if(e==o.AddressZero||n==o.AddressZero)return"InvalidToken";if(!t.gt(o.Zero))return"InvalidSellAmount";if(!r.gt(o.Zero))return"InvalidMinBuyAmount";if(a.startType===at.AT_EPOCH){const e=a.epoch;if(!e.gte(o.Zero)||!e.lt(et))return"InvalidStartTime"}return s.gt(o.One)&&s.lte(et)?i.gt(o.Zero)&&i.lte(tt)?p.durationType!==rt.LIMIT_DURATION||p.duration.lte(i)?xe(nt,[this.staticInput])?void 0:"InvalidData":"InvalidSpan":"InvalidFrequency":"InvalidNumParts"})();return e?{isValid:!1,reason:e}:{isValid:!0}}async startTimestamp(e){const{startTime:t}=this.data;if((null==t?void 0:t.startType)===at.AT_EPOCH)return t.epoch.toNumber();const n=await this.cabinet(e),r=a.defaultAbiCoder.decode(["uint256"],n)[0];if(r.gt(et))throw new Error(`Cabinet epoch out of range: ${r.toString()}`);const s=r.toNumber();if(0===s)throw new Error("Cabinet is not set. Required for TWAP orders that start at mining time.");return s}endTimestamp(e){const{numberOfParts:t,timeBetweenParts:n,durationOfPart:r}=this.data;return r&&r.durationType===rt.LIMIT_DURATION?e+t.sub(1).mul(n).add(r.duration).toNumber():e+t.mul(n).toNumber()}async pollValidate(e){const{blockInfo:t=await Ue(e.provider)}=e,{blockTimestamp:n}=t;try{const t=await this.startTimestamp(e);if(t>n)return{result:he.TRY_AT_EPOCH,epoch:t,reason:`TWAP hasn't started yet. Starts at ${t} (${Le(t)})`};const r=this.endTimestamp(t);return n>=r?{result:he.DONT_TRY_AGAIN,reason:`TWAP has expired. Expired at ${r} (${Le(r)})`}:void 0}catch(e){var r,a;return null!=e&&null!=(r=e.message)&&r.includes("Cabinet is not set")?{result:he.DONT_TRY_AGAIN,reason:`${null==e?void 0:e.message}. User likely removed the order.`}:null!=e&&null!=(a=e.message)&&a.includes("Cabinet epoch out of range")?{result:he.DONT_TRY_AGAIN,reason:`${null==e?void 0:e.message}`}:{result:he.UNEXPECTED_ERROR,reason:`Unexpected error: ${e.message}`,error:e}}}async handlePollFailedAlreadyPresent(e,t,n){const{blockInfo:r=await Ue(n.provider)}=n,{blockTimestamp:a}=r,s=this.data.timeBetweenParts.toNumber(),{numberOfParts:i}=this.data,o=await this.startTimestamp(n);if(a<o)return{result:he.UNEXPECTED_ERROR,reason:`TWAP part hash't started. First TWAP part start at ${o} (${Le(o)})`,error:void 0};const p=i.mul(s).add(o).toNumber();if(a>=p)return{result:he.UNEXPECTED_ERROR,reason:`TWAP is expired. Expired at ${p} (${Le(p)})`,error:void 0};const d=Math.floor((a-o)/s);if(d===i.toNumber()-1)return{result:he.DONT_TRY_AGAIN,reason:`Current active TWAP part (${d+1}/${i}) is already in the Order Book. This was the last TWAP part, no more orders need to be placed`};const u=o+(d+1)*s;return{result:he.TRY_AT_EPOCH,epoch:u,reason:`Current active TWAP part (${d+1}/${i}) is already in the Order Book. TWAP part ${d+2} doesn't start until ${u} (${Le(u)})`}}serialize(){return De(this.leaf)}encodeStaticInput(){return super.encodeStaticInputHelper(nt,this.staticInput)}static deserialize(e){return super.deserializeHelper(e,Je,nt,(e,t)=>new ot({handler:Je,salt:t,data:dt(e)}))}toString(){const{sellAmount:e,sellToken:t,buyAmount:n,buyToken:r,numberOfParts:a,startTime:s=st,timeBetweenParts:i,durationOfPart:o=it,receiver:p,appData:d}=this.data,u=s.startType===at.AT_MINING_TIME?"AT_MINING_TIME":s.epoch.toNumber(),l=o.durationType===rt.AUTO?"AUTO":o.duration.toNumber(),y={sellAmount:e.toString(),sellToken:t,buyAmount:n.toString(),buyToken:r,numberOfParts:a.toString(),startTime:u,timeBetweenParts:i.toNumber(),durationOfPart:l,receiver:p,appData:d};return`${this.orderType} (${this.id}): ${JSON.stringify(y)}`}transformDataToStruct(e){return pt(e)}transformStructToData(e){return dt(e)}}function pt(e){const{sellAmount:t,buyAmount:n,numberOfParts:r,startTime:a=st,timeBetweenParts:s,durationOfPart:i=it}=e,p=E(e,qe),{partSellAmount:d,minPartLimit:u}=r&&!r.isZero()?{partSellAmount:t.div(r),minPartLimit:n.div(r)}:{partSellAmount:o.Zero,minPartLimit:o.Zero};return I({partSellAmount:d,minPartLimit:u,t0:a.startType===at.AT_MINING_TIME?o.Zero:a.epoch,n:r,t:s,span:i.durationType===rt.AUTO?o.Zero:i.duration},p)}function dt(e){const{n:t,partSellAmount:n,minPartLimit:r,t:a,t0:s,span:i}=e,o=E(e,ze),p=i.isZero()?{durationType:rt.AUTO}:{durationType:rt.LIMIT_DURATION,duration:i},d=i.isZero()?{startType:at.AT_MINING_TIME}:{startType:at.AT_EPOCH,epoch:s};return I({sellAmount:n.mul(t),buyAmount:r.mul(t),startTime:d,numberOfParts:t,timeBetweenParts:a,durationOfPart:p},o)}const ut={[Je]:e=>ot.fromParams(e)};export{xe as $,g as A,O as B,T as C,m as D,W as E,C as F,M as G,x as H,L as I,ue as J,le as K,ye as L,me as M,Te as N,V as O,J as P,he as Q,ve as R,y as S,we as T,_e as U,Pe as V,Re as W,Ce as X,De as Y,Me as Z,I as _,w as a,Ue as a0,Le as a1,$e as a2,He as a3,Ke as a4,Xe as a5,ut as a6,Je as a7,Qe as a8,et as a9,tt as aa,rt as ab,at as ac,ot as ad,pt as ae,dt as af,c as b,f as c,b as d,A as e,S as f,v as g,_ as h,P as i,R as j,$ as k,h as l,N as m,G as n,F as o,H as p,Y as q,j as r,Z as s,K as t,X as u,q as v,z as w,Q as x,ee as y,te as z};
29
+ //# sourceMappingURL=index-73a1b0b0.js.map