@cowprotocol/cow-sdk 5.10.0-RC.2 → 5.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/composable/utils.d.ts +2 -1
- package/dist/index-cc713836.js +29 -0
- package/dist/index-cc713836.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.modern.mjs +1 -1
- package/dist/index.module.js +2 -2
- package/dist/index.module.js.map +1 -1
- package/dist/package.json +2 -2
- package/dist/src/trading/README.md +134 -115
- package/dist/trading/consts.d.ts +4 -4
- package/dist/trading/getEthFlowTransaction.d.ts +2 -1
- package/dist/trading/tradingSdk.d.ts +1 -1
- package/dist/trading/types.d.ts +1 -1
- package/dist/trading/utils.d.ts +8 -0
- package/dist/{utils-25a7c027.js → utils-04fc2d68.js} +1 -1
- package/dist/{utils-25a7c027.js.map → utils-04fc2d68.js.map} +1 -1
- package/dist/{utils-bb189bec.js → utils-35087bda.js} +1 -1
- package/dist/{utils-bb189bec.js.map → utils-35087bda.js.map} +1 -1
- package/dist/{utils-5f6fce88.js → utils-ce0d26d7.js} +2 -2
- package/dist/{utils-5f6fce88.js.map → utils-ce0d26d7.js.map} +1 -1
- package/package.json +2 -2
- package/dist/index-0d332c04.js +0 -29
- package/dist/index-0d332c04.js.map +0 -1
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cowprotocol/cow-sdk",
|
|
3
|
-
"version": "5.10.
|
|
3
|
+
"version": "5.10.1",
|
|
4
4
|
"license": "(MIT OR Apache-2.0)",
|
|
5
5
|
"files": [
|
|
6
6
|
"/dist"
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"exponential-backoff": "^3.1.1",
|
|
42
42
|
"graphql": "^16.3.0",
|
|
43
43
|
"graphql-request": "^4.3.0",
|
|
44
|
-
"limiter": "^
|
|
44
|
+
"limiter": "^3.0.0"
|
|
45
45
|
},
|
|
46
46
|
"peerDependencies": {
|
|
47
47
|
"ethers": "^5.7.2"
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# Trading SDK
|
|
2
2
|
|
|
3
3
|
CoW Protocol is intent based, decentralized trading protocol that allows users to trade ERC-20 tokens.
|
|
4
|
+
This SDK makes it easier to interact with CoW Protocol by handling order parameters, calculating amounts, and signing orders.
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
### Basic Trading Flow
|
|
6
7
|
1. 🔎 Get a quote (price) for a trade
|
|
7
8
|
2. ✍️ Sign the order
|
|
8
9
|
3. ✅ Post the order to the order-book
|
|
@@ -12,36 +13,34 @@ However, this flexibility comes with a cost: the complexity of the protocol.
|
|
|
12
13
|
This SDK serves to simplify the interaction with the CoW Protocol.
|
|
13
14
|
It will put all necessary parameters to your order, calculates proper amounts, and signs the order.
|
|
14
15
|
|
|
15
|
-
|
|
16
|
+
### Why Use This SDK?
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
- [App-data](https://docs.cow.fi/cow-protocol/reference/sdks/app-data) (order metadata)
|
|
19
|
+
- [Order signing](https://docs.cow.fi/cow-protocol/reference/sdks/cow-sdk/classes/OrderSigningUtils)
|
|
20
|
+
- Network costs, fees, and slippage
|
|
21
|
+
- Order parameters (validity, partial fills, etc.)
|
|
22
|
+
- Quote API settings (price quality, signing scheme, etc.)
|
|
23
|
+
- Order types (market, limit, on-chain trades, etc.)
|
|
18
24
|
|
|
19
|
-
|
|
20
|
-
- [order signing](https://docs.cow.fi/cow-protocol/reference/sdks/cow-sdk/classes/OrderSigningUtils)
|
|
21
|
-
- network costs, partner fee and slippage
|
|
22
|
-
- order parameters (validTo, partiallyFillable, etc.)
|
|
23
|
-
- quote API (priceQuality, signingScheme, etc.)
|
|
24
|
-
- order kind (sell/buy)
|
|
25
|
-
- order class (swap/limit/and others)
|
|
26
|
-
- on-chain trades
|
|
25
|
+
> See the [examples](../../examples/vanilla/src/index.ts) for usage.
|
|
27
26
|
|
|
28
|
-
## TradingSdk
|
|
27
|
+
## TradingSdk Functions
|
|
29
28
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
Main functions:
|
|
30
|
+
- `postSwapOrder` - Get a quote and create a swap order.
|
|
31
|
+
- `postLimitOrder` - Create a limit order.
|
|
32
|
+
- `getQuote` - Fetch a quote for a swap order.
|
|
34
33
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
Special cases:
|
|
35
|
+
- `postSellNativeCurrencyOrder` - Sell blockchain native tokens (e.g., ETH on Ethereum).
|
|
36
|
+
- `getPreSignTransaction` - Sign an order using a smart contract wallet.
|
|
38
37
|
|
|
39
|
-
###
|
|
38
|
+
### Setup
|
|
40
39
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
40
|
+
You need:
|
|
41
|
+
- `chainId` - Supported chain ID ([see list](../common/chains.ts)).
|
|
42
|
+
- `signer` - Private key, ethers signer, or `Eip1193` provider.
|
|
43
|
+
- `appCode` - Unique app identifier for tracking orders.
|
|
45
44
|
|
|
46
45
|
#### Example
|
|
47
46
|
```typescript
|
|
@@ -54,48 +53,24 @@ const sdk = new TradingSdk({
|
|
|
54
53
|
})
|
|
55
54
|
```
|
|
56
55
|
|
|
57
|
-
###
|
|
58
|
-
|
|
59
|
-
This function fetches a quote for a swap order and just creates the order.
|
|
60
|
-
|
|
61
|
-
The parameters required are:
|
|
62
|
-
- `kind` - the order kind (sell/buy)
|
|
63
|
-
- `sellToken` - the sell token address
|
|
64
|
-
- `sellTokenDecimals` - the sell token decimals
|
|
65
|
-
- `buyToken` - the buy token address
|
|
66
|
-
- `buyTokenDecimals` - the buy token decimals
|
|
67
|
-
- `amount` - the amount to sell/buy in atoms
|
|
68
|
-
|
|
69
|
-
> When sell token is a blockchain native token (ETH for Ethereum), then order will be created as an on-chain transaction. See [postSellNativeCurrencyOrder](#postSellNativeCurrencyOrder)
|
|
56
|
+
### Options
|
|
70
57
|
|
|
71
|
-
|
|
58
|
+
For detailed information about trading steps you can enable the SDK logging:
|
|
72
59
|
|
|
73
60
|
```typescript
|
|
74
|
-
import {
|
|
75
|
-
SupportedChainId,
|
|
76
|
-
OrderKind,
|
|
77
|
-
TradeParameters,
|
|
78
|
-
TradingSdk
|
|
79
|
-
} from '@cowprotocol/cow-sdk'
|
|
61
|
+
import { SupportedChainId, TradingSdk, TradingSdkOptions } from '@cowprotocol/cow-sdk'
|
|
80
62
|
|
|
81
|
-
const
|
|
63
|
+
const traderParams = {
|
|
82
64
|
chainId: SupportedChainId.SEPOLIA,
|
|
83
65
|
signer: '<privateKeyOrEthersSigner>',
|
|
84
66
|
appCode: '<YOUR_APP_CODE>',
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
const parameters: TradeParameters = {
|
|
88
|
-
kind: OrderKind.BUY,
|
|
89
|
-
sellToken: '0xfff9976782d46cc05630d1f6ebab18b2324d6b14',
|
|
90
|
-
sellTokenDecimals: 18,
|
|
91
|
-
buyToken: '0x0625afb445c3b6b7b929342a04a22599fd5dbb59',
|
|
92
|
-
buyTokenDecimals: 18,
|
|
93
|
-
amount: '120000000000000000'
|
|
94
67
|
}
|
|
95
68
|
|
|
96
|
-
const
|
|
69
|
+
const sdkOptions: TradingSdkOptions = {
|
|
70
|
+
enableLogging: true // <--
|
|
71
|
+
}
|
|
97
72
|
|
|
98
|
-
|
|
73
|
+
const sdk = new TradingSdk(traderParams, sdkOptions)
|
|
99
74
|
```
|
|
100
75
|
|
|
101
76
|
### getQuote
|
|
@@ -151,54 +126,19 @@ if (confirm(`You will get at least: ${buyAmount}, ok?`)) {
|
|
|
151
126
|
}
|
|
152
127
|
```
|
|
153
128
|
|
|
154
|
-
###
|
|
155
|
-
|
|
156
|
-
If you want to use a smart-contract wallet to sign the order, you should specify the `signingScheme` parameter in order to get more accurate quote in terms of gas efficiency.
|
|
157
|
-
Smart-contract wallets are supported by using a different signing scheme - `SigningScheme.PRESIGN`.
|
|
158
|
-
|
|
159
|
-
#### Example
|
|
160
|
-
|
|
161
|
-
```typescript
|
|
162
|
-
import {
|
|
163
|
-
SupportedChainId,
|
|
164
|
-
OrderKind,
|
|
165
|
-
TradeParameters,
|
|
166
|
-
SwapAdvancedSettings,
|
|
167
|
-
SigningScheme,
|
|
168
|
-
TradingSdk
|
|
169
|
-
} from '@cowprotocol/cow-sdk'
|
|
170
|
-
|
|
171
|
-
const sdk = new TradingSdk({
|
|
172
|
-
chainId: SupportedChainId.SEPOLIA,
|
|
173
|
-
signer: '<privateKeyOrEthersSigner>',
|
|
174
|
-
appCode: '<YOUR_APP_CODE>',
|
|
175
|
-
})
|
|
176
|
-
|
|
177
|
-
const parameters: TradeParameters = {
|
|
178
|
-
kind: OrderKind.BUY,
|
|
179
|
-
sellToken: '0xfff9976782d46cc05630d1f6ebab18b2324d6b14',
|
|
180
|
-
sellTokenDecimals: 18,
|
|
181
|
-
buyToken: '0x0625afb445c3b6b7b929342a04a22599fd5dbb59',
|
|
182
|
-
buyTokenDecimals: 18,
|
|
183
|
-
amount: '120000000000000000'
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
const advancedParameters: SwapAdvancedSettings = {
|
|
187
|
-
quoteRequest: {
|
|
188
|
-
// Specify the signing scheme
|
|
189
|
-
signingScheme: SigningScheme.PRESIGN
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
const { quoteResults } = await sdk.getQuote(parameters)
|
|
129
|
+
### postSwapOrder
|
|
194
130
|
|
|
195
|
-
|
|
196
|
-
````
|
|
131
|
+
This function fetches a quote for a swap order and just creates the order.
|
|
197
132
|
|
|
198
|
-
|
|
133
|
+
The parameters required are:
|
|
134
|
+
- `kind` - the order kind (sell/buy)
|
|
135
|
+
- `sellToken` - the sell token address
|
|
136
|
+
- `sellTokenDecimals` - the sell token decimals
|
|
137
|
+
- `buyToken` - the buy token address
|
|
138
|
+
- `buyTokenDecimals` - the buy token decimals
|
|
139
|
+
- `amount` - the amount to sell/buy in atoms
|
|
199
140
|
|
|
200
|
-
|
|
201
|
-
And then you need to send a transaction from `getPreSignTransaction` result in order to sign the order.
|
|
141
|
+
> When sell token is a blockchain native token (ETH for Ethereum), then order will be created as an on-chain transaction. See [postSellNativeCurrencyOrder](#postSellNativeCurrencyOrder)
|
|
202
142
|
|
|
203
143
|
#### Example
|
|
204
144
|
|
|
@@ -225,22 +165,11 @@ const parameters: TradeParameters = {
|
|
|
225
165
|
amount: '120000000000000000'
|
|
226
166
|
}
|
|
227
167
|
|
|
228
|
-
const
|
|
229
|
-
quoteRequest: {
|
|
230
|
-
// Specify the signing scheme
|
|
231
|
-
signingScheme: SigningScheme.PRESIGN
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
const smartContractWalletAddress = '0x<smartContractWalletAddress>'
|
|
236
|
-
const orderId = await sdk.postSwapOrder(parameters, advancedParameters)
|
|
237
|
-
const preSignTransaction = await sdk.getPreSignTransaction({ orderId, account: smartContractWalletAddress })
|
|
168
|
+
const orderId = await sdk.postSwapOrder(parameters)
|
|
238
169
|
|
|
239
|
-
console.log('Order created
|
|
240
|
-
console.log('Execute the transaction to sign the order', preSignTransaction)
|
|
170
|
+
console.log('Order created, id: ', orderId)
|
|
241
171
|
```
|
|
242
172
|
|
|
243
|
-
|
|
244
173
|
### postLimitOrder
|
|
245
174
|
|
|
246
175
|
This main difference between this function and `postSwapOrder` is that here you need to specify both sell and buy amounts.
|
|
@@ -324,6 +253,96 @@ const orderId = await sdk.postSellNativeCurrencyOrder(parameters)
|
|
|
324
253
|
console.log('Order created, id: ', orderId)
|
|
325
254
|
```
|
|
326
255
|
|
|
256
|
+
|
|
257
|
+
### Get quote for a smart-contract wallet
|
|
258
|
+
|
|
259
|
+
If you want to use a smart-contract wallet to sign the order, you should specify the `signingScheme` parameter in order to get more accurate quote in terms of gas efficiency.
|
|
260
|
+
Smart-contract wallets are supported by using a different signing scheme - `SigningScheme.PRESIGN`.
|
|
261
|
+
|
|
262
|
+
#### Example
|
|
263
|
+
|
|
264
|
+
```typescript
|
|
265
|
+
import {
|
|
266
|
+
SupportedChainId,
|
|
267
|
+
OrderKind,
|
|
268
|
+
TradeParameters,
|
|
269
|
+
SwapAdvancedSettings,
|
|
270
|
+
SigningScheme,
|
|
271
|
+
TradingSdk
|
|
272
|
+
} from '@cowprotocol/cow-sdk'
|
|
273
|
+
|
|
274
|
+
const sdk = new TradingSdk({
|
|
275
|
+
chainId: SupportedChainId.SEPOLIA,
|
|
276
|
+
signer: '<privateKeyOrEthersSigner>',
|
|
277
|
+
appCode: '<YOUR_APP_CODE>',
|
|
278
|
+
})
|
|
279
|
+
|
|
280
|
+
const parameters: TradeParameters = {
|
|
281
|
+
kind: OrderKind.BUY,
|
|
282
|
+
sellToken: '0xfff9976782d46cc05630d1f6ebab18b2324d6b14',
|
|
283
|
+
sellTokenDecimals: 18,
|
|
284
|
+
buyToken: '0x0625afb445c3b6b7b929342a04a22599fd5dbb59',
|
|
285
|
+
buyTokenDecimals: 18,
|
|
286
|
+
amount: '120000000000000000'
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
const advancedParameters: SwapAdvancedSettings = {
|
|
290
|
+
quoteRequest: {
|
|
291
|
+
// Specify the signing scheme
|
|
292
|
+
signingScheme: SigningScheme.PRESIGN
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
const { quoteResults } = await sdk.getQuote(parameters)
|
|
297
|
+
|
|
298
|
+
console.log('Quote:', quoteResults)
|
|
299
|
+
````
|
|
300
|
+
|
|
301
|
+
### Create an order with smart-contract wallet
|
|
302
|
+
|
|
303
|
+
If you want to create an order with a smart-contract wallet, you should specify the `signingScheme` parameter in the `postSwapOrder` function.
|
|
304
|
+
And then you need to send a transaction from `getPreSignTransaction` result in order to sign the order.
|
|
305
|
+
|
|
306
|
+
#### Example
|
|
307
|
+
|
|
308
|
+
```typescript
|
|
309
|
+
import {
|
|
310
|
+
SupportedChainId,
|
|
311
|
+
OrderKind,
|
|
312
|
+
TradeParameters,
|
|
313
|
+
TradingSdk
|
|
314
|
+
} from '@cowprotocol/cow-sdk'
|
|
315
|
+
|
|
316
|
+
const sdk = new TradingSdk({
|
|
317
|
+
chainId: SupportedChainId.SEPOLIA,
|
|
318
|
+
signer: '<privateKeyOrEthersSigner>',
|
|
319
|
+
appCode: '<YOUR_APP_CODE>',
|
|
320
|
+
})
|
|
321
|
+
|
|
322
|
+
const parameters: TradeParameters = {
|
|
323
|
+
kind: OrderKind.BUY,
|
|
324
|
+
sellToken: '0xfff9976782d46cc05630d1f6ebab18b2324d6b14',
|
|
325
|
+
sellTokenDecimals: 18,
|
|
326
|
+
buyToken: '0x0625afb445c3b6b7b929342a04a22599fd5dbb59',
|
|
327
|
+
buyTokenDecimals: 18,
|
|
328
|
+
amount: '120000000000000000'
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
const advancedParameters: SwapAdvancedSettings = {
|
|
332
|
+
quoteRequest: {
|
|
333
|
+
// Specify the signing scheme
|
|
334
|
+
signingScheme: SigningScheme.PRESIGN
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
const smartContractWalletAddress = '0x<smartContractWalletAddress>'
|
|
339
|
+
const orderId = await sdk.postSwapOrder(parameters, advancedParameters)
|
|
340
|
+
const preSignTransaction = await sdk.getPreSignTransaction({ orderId, account: smartContractWalletAddress })
|
|
341
|
+
|
|
342
|
+
console.log('Order created with "pre-sign" state, id: ', orderId)
|
|
343
|
+
console.log('Execute the transaction to sign the order', preSignTransaction)
|
|
344
|
+
```
|
|
345
|
+
|
|
327
346
|
### Optional parameters
|
|
328
347
|
|
|
329
348
|
Both `postSwapOrder` and `postLimitOrder` functions have optional parameters.
|
|
@@ -335,7 +354,7 @@ See `TradeOptionalParameters` type for more details.
|
|
|
335
354
|
| `partiallyFillable` | `boolean` | `false` | Indicates whether the order is fill-or-kill or partially fillable. |
|
|
336
355
|
| `slippageBps` | `number` | 50 | Slippage tolerance applied to the order to get the limit price. Expressed in Basis Points (BPS). One basis point is equivalent to 0.01% (1/100th of a percent). |
|
|
337
356
|
| `receiver` | `string` | order creator | The address that will receive the order's tokens. |
|
|
338
|
-
| `validFor` | `number` |
|
|
357
|
+
| `validFor` | `number` | 30 mins | The order expiration time in seconds. |
|
|
339
358
|
| `partnerFee` | `PartnerFee` | - | Partners of the protocol can specify their fee for the order, including the fee in basis points (BPS) and the fee recipient address. [Read more](https://docs.cow.fi/governance/fees/partner-fee) |
|
|
340
359
|
|
|
341
360
|
##### Example
|
package/dist/trading/consts.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { SigningScheme } from '../order-book';
|
|
2
|
-
export declare
|
|
3
|
-
|
|
4
|
-
enabled: boolean;
|
|
5
|
-
}
|
|
2
|
+
export declare function log(text: string): void;
|
|
3
|
+
export declare namespace log {
|
|
4
|
+
var enabled: boolean;
|
|
5
|
+
}
|
|
6
6
|
export declare const DEFAULT_QUOTE_VALIDITY: number;
|
|
7
7
|
export declare const DEFAULT_SLIPPAGE_BPS = 50;
|
|
8
8
|
export declare const SIGN_SCHEME_MAP: {
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Signer } from 'ethers';
|
|
2
2
|
import { LimitTradeParametersFromQuote, TransactionParams } from './types';
|
|
3
3
|
import { EthFlowOrderExistsCallback } from './calculateUniqueOrderId';
|
|
4
|
-
|
|
4
|
+
import { SupportedChainId } from '../common';
|
|
5
|
+
export declare function getEthFlowTransaction(signer: Signer, appDataKeccak256: string, _params: LimitTradeParametersFromQuote, chainId: SupportedChainId, networkCostsAmount?: string, checkEthFlowOrderExists?: EthFlowOrderExistsCallback): Promise<{
|
|
5
6
|
orderId: string;
|
|
6
7
|
transaction: TransactionParams;
|
|
7
8
|
}>;
|
|
@@ -3,7 +3,7 @@ import { postSellNativeCurrencyOrder } from './postSellNativeCurrencyOrder';
|
|
|
3
3
|
import { getPreSignTransaction } from './getPreSignTransaction';
|
|
4
4
|
import { OrderBookApi } from '../order-book';
|
|
5
5
|
interface TradingSdkOptions {
|
|
6
|
-
|
|
6
|
+
enableLogging: boolean;
|
|
7
7
|
orderBookApi: OrderBookApi;
|
|
8
8
|
}
|
|
9
9
|
export declare class TradingSdk {
|
package/dist/trading/types.d.ts
CHANGED
package/dist/trading/utils.d.ts
CHANGED
|
@@ -13,3 +13,11 @@ export declare function getSigner(signer: Signer | ExternalProvider | PrivateKey
|
|
|
13
13
|
*/
|
|
14
14
|
export declare function calculateGasMargin(value: bigint): bigint;
|
|
15
15
|
export declare function mapQuoteAmountsAndCosts<T, R>(value: QuoteAmountsAndCosts<T>, mapper: (value: T) => R): QuoteAmountsAndCosts<R>;
|
|
16
|
+
/**
|
|
17
|
+
* Set sell token to the initial one
|
|
18
|
+
* Because for ETH-flow orders we do quote requests with wrapped token
|
|
19
|
+
*/
|
|
20
|
+
export declare function getTradeParametersAfterQuote({ quoteParameters, orderParameters, }: {
|
|
21
|
+
quoteParameters: TradeParameters;
|
|
22
|
+
orderParameters: TradeParameters;
|
|
23
|
+
}): TradeParameters;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
var e=require("@cowprotocol/contracts"),r=require("./index.js");require("cross-fetch/polyfill"),require("limiter"),require("exponential-backoff"),require("graphql-request"),require("ethers"),require("@openzeppelin/merkle-tree"),require("ethers/lib/utils"),require("@ethersproject/abstract-signer"),require("@cowprotocol/app-data");const t=function(n,i,o,l="v4"){try{let f;function m(e){if(f)return e;const r=v?.data;return{signature:r?.toString()||"",signingScheme:p}}const p="eth_sign"===l?r.EcdsaSigningScheme.ETHSIGN:r.EcdsaSigningScheme.EIP712;let S,v=null;try{switch(l){case"default":case"v3":S=new e.TypedDataVersionedSigner(o);break;case"int_v4":S=new e.IntChainIdTypedDataV4Signer(o);break;default:S=o}}catch(w){throw console.error("Wallet not supported:",w),new r.CowError("Wallet not supported")}const P=function(e,r){try{var t=Promise.resolve(i({...n,signer:S,signingScheme:p})).then(function(e){v=e})}catch(e){return r(e)}return t&&t.then?t.then(void 0,r):t}(0,function(e){if(void 0===(r=e).code&&void 0===r.message)throw console.error(e),e;var r;const m=[a,h].some(r=>[e.message,e.toString()].some(e=>r.test(e)));if(e.code!==c&&!m){if(g.test(e.message)){const e=t(n,i,o,"int_v4");return f=1,e}if(e.code===s){const e=t(n,i,o,"eth_sign");return f=1,e}if(d.test(e.message)){const e=t(n,i,o,"v3");return f=1,e}if(u.test(e.message)){const e=t(n,i,o,"eth_sign");return f=1,e}throw console.error(e),e}switch(l){case"v4":const r=t(n,i,o,"default");return f=1,r;case"default":const s=t(n,i,o,"v3");return f=1,s;case"v3":const c=t(n,i,o,"eth_sign");return f=1,c;default:throw e}});return Promise.resolve(P&&P.then?P.then(m):m(P))}catch(E){return Promise.reject(E)}},n=function(r){try{const{chainId:t,signer:n,signingScheme:i,orderUids:o}=r,s=m(t);return Promise.resolve(e.signOrderCancellations(s,o,n,l[i]))}catch(e){return Promise.reject(e)}},i=function(r){try{const{chainId:t,signer:n,signingScheme:i,orderUid:o}=r,s=m(t);return Promise.resolve(e.signOrderCancellation(s,o,n,l[i]))}catch(e){return Promise.reject(e)}},o=function(r){try{const{chainId:t,signer:n,order:i,signingScheme:o}=r,s=m(t);return Promise.resolve(e.signOrder(s,i,n,l[o]))}catch(e){return Promise.reject(e)}},s=-32603,c=-32601,a=/Method not found/i,d=/eth_signTypedData_v4 does not exist/i,u=/eth_signTypedData_v3 does not exist/i,h=/RPC request failed/i,g=/provided chainid .* must match the active chainid/i,l={[r.EcdsaSigningScheme.EIP712]:e.SigningScheme.EIP712,[r.EcdsaSigningScheme.ETHSIGN]:e.SigningScheme.ETHSIGN};function m(t){const n=r.COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS[t];if(!n)throw new r.CowError("Unsupported network. Settlement contract is not deployed");return e.domain(t,n)}exports.generateOrderId=function(r,t,n){try{return Promise.resolve(m(r)).then(function(r){const i=e.hashOrder(r,t);return{orderId:e.packOrderUidParams({...n,orderDigest:i,validTo:t.validTo}),orderDigest:i}})}catch(e){return Promise.reject(e)}},exports.getDomain=m,exports.signOrder=function(e,r,n){return t({order:e,chainId:r},o,n)},exports.signOrderCancellation=function(e,r,n){return t({orderUid:e,chainId:r},i,n)},exports.signOrderCancellations=function(e,r,i){return t({orderUids:e,chainId:r},n,i)};
|
|
2
|
-
//# sourceMappingURL=utils-
|
|
2
|
+
//# sourceMappingURL=utils-04fc2d68.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils-25a7c027.js","sources":["../src/order-signing/utils.ts"],"sourcesContent":["import type {\n Order as OrderFromContract,\n Signature,\n TypedDataDomain,\n EcdsaSigningScheme as EcdsaSigningSchemeContract,\n Order,\n OrderUidParams,\n} from '@cowprotocol/contracts'\nimport {\n domain as domainGp,\n EcdsaSignature,\n IntChainIdTypedDataV4Signer,\n SigningScheme,\n hashOrder,\n packOrderUidParams,\n signOrder as signOrderGp,\n signOrderCancellation as signOrderCancellationGp,\n signOrderCancellations as signOrderCancellationsGp,\n TypedDataVersionedSigner,\n} from '@cowprotocol/contracts'\nimport type { Signer } from '@ethersproject/abstract-signer'\nimport type { SigningResult, SignOrderParams, SignOrderCancellationParams, UnsignedOrder } from './types'\n\nimport { COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS } from '../common/consts'\nimport { CowError, SupportedChainId } from '../common'\nimport { EcdsaSigningScheme } from '../order-book'\nimport { SignOrderCancellationsParams } from './types'\n\n// For error codes, see:\n// - https://eth.wiki/json-rpc/json-rpc-error-codes-improvement-proposal\n// - https://www.jsonrpc.org/specification#error_object\nconst METAMASK_SIGNATURE_ERROR_CODE = -32603\nconst METHOD_NOT_FOUND_ERROR_CODE = -32601\n// Added the following because of 1Inch wallet who doesn't send the error code\n// So we will check the actual error text\nconst METHOD_NOT_FOUND_ERROR_MSG_REGEX = /Method not found/i\nconst V4_ERROR_MSG_REGEX = /eth_signTypedData_v4 does not exist/i\nconst V3_ERROR_MSG_REGEX = /eth_signTypedData_v3 does not exist/i\nconst RPC_REQUEST_FAILED_REGEX = /RPC request failed/i\nconst METAMASK_STRING_CHAINID_REGEX = /provided chainid .* must match the active chainid/i\n\nconst mapSigningSchema: Record<EcdsaSigningScheme, EcdsaSigningSchemeContract> = {\n [EcdsaSigningScheme.EIP712]: SigningScheme.EIP712,\n [EcdsaSigningScheme.ETHSIGN]: SigningScheme.ETHSIGN,\n}\n\ninterface ProviderRpcError extends Error {\n message: string\n code: number\n data?: unknown\n}\n\ntype PayloadParams =\n | Pick<SignOrderParams, 'order' & 'chainId'>\n | Pick<SignOrderCancellationParams, 'chainId' & 'orderId'>\n | Pick<SignOrderCancellationsParams, 'chainId' & 'orderUids'>\n\nfunction isProviderRpcError(error: unknown): error is ProviderRpcError {\n return (error as ProviderRpcError).code !== undefined || (error as ProviderRpcError).message !== undefined\n}\n\nasync function _signOrder(params: SignOrderParams): Promise<Signature> {\n const { chainId, signer, order, signingScheme } = params\n\n const domain = getDomain(chainId)\n\n return signOrderGp(domain, order as unknown as OrderFromContract, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellation(params: SignOrderCancellationParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUid } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationGp(domain, orderUid, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellations(params: SignOrderCancellationsParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUids } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationsGp(domain, orderUids, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signPayload(\n payload: PayloadParams,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n signFn: (params: any) => Promise<Signature>,\n signer: Signer,\n signingMethod: 'default' | 'v4' | 'int_v4' | 'v3' | 'eth_sign' = 'v4'\n): Promise<SigningResult> {\n const signingScheme: EcdsaSigningScheme =\n signingMethod === 'eth_sign' ? EcdsaSigningScheme.ETHSIGN : EcdsaSigningScheme.EIP712\n let signature: Signature | null = null\n\n let _signer\n try {\n switch (signingMethod) {\n case 'default':\n case 'v3':\n _signer = new TypedDataVersionedSigner(signer)\n break\n case 'int_v4':\n _signer = new IntChainIdTypedDataV4Signer(signer)\n break\n default:\n _signer = signer\n }\n } catch (e) {\n console.error('Wallet not supported:', e)\n throw new CowError('Wallet not supported')\n }\n\n try {\n signature = (await signFn({ ...payload, signer: _signer, signingScheme })) as EcdsaSignature // Only ECDSA signing supported for now\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (!isProviderRpcError(e)) {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n\n const regexErrorCheck = [METHOD_NOT_FOUND_ERROR_MSG_REGEX, RPC_REQUEST_FAILED_REGEX].some((regex) =>\n // for example 1Inch error doesn't have e.message so we will check the output of toString()\n [e.message, e.toString()].some((msg) => regex.test(msg))\n )\n\n if (e.code === METHOD_NOT_FOUND_ERROR_CODE || regexErrorCheck) {\n // Maybe the wallet returns the proper error code? We can only hope 🤞\n // OR it failed with a generic message, there's no error code set, and we also hope it'll work\n // with other methods...\n switch (signingMethod) {\n case 'v4':\n return _signPayload(payload, signFn, signer, 'default')\n case 'default':\n return _signPayload(payload, signFn, signer, 'v3')\n case 'v3':\n return _signPayload(payload, signFn, signer, 'eth_sign')\n default:\n throw e\n }\n } else if (METAMASK_STRING_CHAINID_REGEX.test(e.message)) {\n // Metamask now enforces chainId to be an integer\n return _signPayload(payload, signFn, signer, 'int_v4')\n } else if (e.code === METAMASK_SIGNATURE_ERROR_CODE) {\n // We tried to sign order the nice way.\n // That works fine for regular MM addresses. Does not work for Hardware wallets, though.\n // See https://github.com/MetaMask/metamask-extension/issues/10240#issuecomment-810552020\n // So, when that specific error occurs, we know this is a problem with MM + HW.\n // Then, we fallback to ETHSIGN.\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else if (V4_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v4`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'v3')\n } else if (V3_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v3`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n }\n\n const data: unknown = signature?.data\n\n return { signature: data?.toString() || '', signingScheme }\n}\n\n/**\n * Returns the signature for the specified order with the signing scheme encoded\n * into the signature.\n * @param {UnsignedOrder} order The order to sign.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrder(\n order: UnsignedOrder,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ order, chainId }, _signOrder, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellation with the signing scheme encoded\n * into the signature.\n * @param {string} orderUid The unique identifier of the order being cancelled.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellation(\n orderUid: string,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUid, chainId }, _signOrderCancellation, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellations with the signing scheme encoded\n * into the signature.\n *\n * @param {string[]} orderUids The unique identifiers of the orders being cancelled.\n * @param {SupportedChainId} chainId The CoW Protocol protocol `chainId` context that's being used.\n * @param {Signer} signer The owner that had placed the orders used to sign.\n * @returns {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellations(\n orderUids: string[],\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUids, chainId }, _signOrderCancellations, signer)\n}\n\n/**\n * Returns the TypedDataDomain used for signing for the specified chainId.\n * @param {SupportedChainId} chainId The chain Id\n * @return {*} The TypedDataDomain for the specified chainId.\n * @throws {CowError} If the chainId is not supported.\n */\nexport function getDomain(chainId: SupportedChainId): TypedDataDomain {\n // Get settlement contract address\n const settlementContract = COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS[chainId]\n\n if (!settlementContract) {\n throw new CowError('Unsupported network. Settlement contract is not deployed')\n }\n\n return domainGp(chainId, settlementContract)\n}\n\n/**\n * Generate a deterministic order ID for the specified order.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Order} order order to sign\n * @param {Pick<OrderUidParams, 'owner'>} params order unique identifier parameters.\n */\nexport async function generateOrderId(\n chainId: SupportedChainId,\n order: Order,\n params: Pick<OrderUidParams, 'owner'>\n): Promise<{ orderId: string; orderDigest: string }> {\n const domain = await getDomain(chainId)\n const orderDigest = hashOrder(domain, order)\n // Generate the orderId from owner, orderDigest, and max validTo\n const orderId = packOrderUidParams({\n ...params,\n orderDigest,\n // Different validTo when signing because EthFlow contract expects it to be max for all orders\n validTo: order.validTo,\n })\n\n return { orderId, orderDigest }\n}\n"],"names":["_signPayload","payload","signFn","signer","signingMethod","_exit","_temp2","_result","data","signature","toString","signingScheme","EcdsaSigningScheme","ETHSIGN","EIP712","_signer","TypedDataVersionedSigner","IntChainIdTypedDataV4Signer","e","console","error","CowError","_temp","Promise","resolve","then","_signFn","_catch","undefined","code","message","regexErrorCheck","METHOD_NOT_FOUND_ERROR_MSG_REGEX","RPC_REQUEST_FAILED_REGEX","some","regex","msg","test","METHOD_NOT_FOUND_ERROR_CODE","METAMASK_STRING_CHAINID_REGEX","_signPayload5","METAMASK_SIGNATURE_ERROR_CODE","_signPayload6","V4_ERROR_MSG_REGEX","_signPayload7","V3_ERROR_MSG_REGEX","_signPayload8","_signPayload2","_signPayload3","_signPayload4","reject","_signOrderCancellations","params","chainId","orderUids","domain","getDomain","signOrderCancellationsGp","mapSigningSchema","_signOrderCancellation","orderUid","signOrderCancellationGp","signOrderCancellation","_signOrder","order","signOrderGp","signOrder","SigningScheme","settlementContract","COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS","domainGp","generateOrderId","orderDigest","hashOrder","orderId","packOrderUidParams","validTo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils-04fc2d68.js","sources":["../src/order-signing/utils.ts"],"sourcesContent":["import type {\n Order as OrderFromContract,\n Signature,\n TypedDataDomain,\n EcdsaSigningScheme as EcdsaSigningSchemeContract,\n Order,\n OrderUidParams,\n} from '@cowprotocol/contracts'\nimport {\n domain as domainGp,\n EcdsaSignature,\n IntChainIdTypedDataV4Signer,\n SigningScheme,\n hashOrder,\n packOrderUidParams,\n signOrder as signOrderGp,\n signOrderCancellation as signOrderCancellationGp,\n signOrderCancellations as signOrderCancellationsGp,\n TypedDataVersionedSigner,\n} from '@cowprotocol/contracts'\nimport type { Signer } from '@ethersproject/abstract-signer'\nimport type { SigningResult, SignOrderParams, SignOrderCancellationParams, UnsignedOrder } from './types'\n\nimport { COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS } from '../common/consts'\nimport { CowError, SupportedChainId } from '../common'\nimport { EcdsaSigningScheme } from '../order-book'\nimport { SignOrderCancellationsParams } from './types'\n\n// For error codes, see:\n// - https://eth.wiki/json-rpc/json-rpc-error-codes-improvement-proposal\n// - https://www.jsonrpc.org/specification#error_object\nconst METAMASK_SIGNATURE_ERROR_CODE = -32603\nconst METHOD_NOT_FOUND_ERROR_CODE = -32601\n// Added the following because of 1Inch wallet who doesn't send the error code\n// So we will check the actual error text\nconst METHOD_NOT_FOUND_ERROR_MSG_REGEX = /Method not found/i\nconst V4_ERROR_MSG_REGEX = /eth_signTypedData_v4 does not exist/i\nconst V3_ERROR_MSG_REGEX = /eth_signTypedData_v3 does not exist/i\nconst RPC_REQUEST_FAILED_REGEX = /RPC request failed/i\nconst METAMASK_STRING_CHAINID_REGEX = /provided chainid .* must match the active chainid/i\n\nconst mapSigningSchema: Record<EcdsaSigningScheme, EcdsaSigningSchemeContract> = {\n [EcdsaSigningScheme.EIP712]: SigningScheme.EIP712,\n [EcdsaSigningScheme.ETHSIGN]: SigningScheme.ETHSIGN,\n}\n\ninterface ProviderRpcError extends Error {\n message: string\n code: number\n data?: unknown\n}\n\ntype PayloadParams =\n | Pick<SignOrderParams, 'order' & 'chainId'>\n | Pick<SignOrderCancellationParams, 'chainId' & 'orderId'>\n | Pick<SignOrderCancellationsParams, 'chainId' & 'orderUids'>\n\nfunction isProviderRpcError(error: unknown): error is ProviderRpcError {\n return (error as ProviderRpcError).code !== undefined || (error as ProviderRpcError).message !== undefined\n}\n\nasync function _signOrder(params: SignOrderParams): Promise<Signature> {\n const { chainId, signer, order, signingScheme } = params\n\n const domain = getDomain(chainId)\n\n return signOrderGp(domain, order as unknown as OrderFromContract, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellation(params: SignOrderCancellationParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUid } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationGp(domain, orderUid, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellations(params: SignOrderCancellationsParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUids } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationsGp(domain, orderUids, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signPayload(\n payload: PayloadParams,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n signFn: (params: any) => Promise<Signature>,\n signer: Signer,\n signingMethod: 'default' | 'v4' | 'int_v4' | 'v3' | 'eth_sign' = 'v4'\n): Promise<SigningResult> {\n const signingScheme: EcdsaSigningScheme =\n signingMethod === 'eth_sign' ? EcdsaSigningScheme.ETHSIGN : EcdsaSigningScheme.EIP712\n let signature: Signature | null = null\n\n let _signer\n try {\n switch (signingMethod) {\n case 'default':\n case 'v3':\n _signer = new TypedDataVersionedSigner(signer)\n break\n case 'int_v4':\n _signer = new IntChainIdTypedDataV4Signer(signer)\n break\n default:\n _signer = signer\n }\n } catch (e) {\n console.error('Wallet not supported:', e)\n throw new CowError('Wallet not supported')\n }\n\n try {\n signature = (await signFn({ ...payload, signer: _signer, signingScheme })) as EcdsaSignature // Only ECDSA signing supported for now\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (!isProviderRpcError(e)) {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n\n const regexErrorCheck = [METHOD_NOT_FOUND_ERROR_MSG_REGEX, RPC_REQUEST_FAILED_REGEX].some((regex) =>\n // for example 1Inch error doesn't have e.message so we will check the output of toString()\n [e.message, e.toString()].some((msg) => regex.test(msg))\n )\n\n if (e.code === METHOD_NOT_FOUND_ERROR_CODE || regexErrorCheck) {\n // Maybe the wallet returns the proper error code? We can only hope 🤞\n // OR it failed with a generic message, there's no error code set, and we also hope it'll work\n // with other methods...\n switch (signingMethod) {\n case 'v4':\n return _signPayload(payload, signFn, signer, 'default')\n case 'default':\n return _signPayload(payload, signFn, signer, 'v3')\n case 'v3':\n return _signPayload(payload, signFn, signer, 'eth_sign')\n default:\n throw e\n }\n } else if (METAMASK_STRING_CHAINID_REGEX.test(e.message)) {\n // Metamask now enforces chainId to be an integer\n return _signPayload(payload, signFn, signer, 'int_v4')\n } else if (e.code === METAMASK_SIGNATURE_ERROR_CODE) {\n // We tried to sign order the nice way.\n // That works fine for regular MM addresses. Does not work for Hardware wallets, though.\n // See https://github.com/MetaMask/metamask-extension/issues/10240#issuecomment-810552020\n // So, when that specific error occurs, we know this is a problem with MM + HW.\n // Then, we fallback to ETHSIGN.\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else if (V4_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v4`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'v3')\n } else if (V3_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v3`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n }\n\n const data: unknown = signature?.data\n\n return { signature: data?.toString() || '', signingScheme }\n}\n\n/**\n * Returns the signature for the specified order with the signing scheme encoded\n * into the signature.\n * @param {UnsignedOrder} order The order to sign.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrder(\n order: UnsignedOrder,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ order, chainId }, _signOrder, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellation with the signing scheme encoded\n * into the signature.\n * @param {string} orderUid The unique identifier of the order being cancelled.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellation(\n orderUid: string,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUid, chainId }, _signOrderCancellation, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellations with the signing scheme encoded\n * into the signature.\n *\n * @param {string[]} orderUids The unique identifiers of the orders being cancelled.\n * @param {SupportedChainId} chainId The CoW Protocol protocol `chainId` context that's being used.\n * @param {Signer} signer The owner that had placed the orders used to sign.\n * @returns {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellations(\n orderUids: string[],\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUids, chainId }, _signOrderCancellations, signer)\n}\n\n/**\n * Returns the TypedDataDomain used for signing for the specified chainId.\n * @param {SupportedChainId} chainId The chain Id\n * @return {*} The TypedDataDomain for the specified chainId.\n * @throws {CowError} If the chainId is not supported.\n */\nexport function getDomain(chainId: SupportedChainId): TypedDataDomain {\n // Get settlement contract address\n const settlementContract = COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS[chainId]\n\n if (!settlementContract) {\n throw new CowError('Unsupported network. Settlement contract is not deployed')\n }\n\n return domainGp(chainId, settlementContract)\n}\n\n/**\n * Generate a deterministic order ID for the specified order.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Order} order order to sign\n * @param {Pick<OrderUidParams, 'owner'>} params order unique identifier parameters.\n */\nexport async function generateOrderId(\n chainId: SupportedChainId,\n order: Order,\n params: Pick<OrderUidParams, 'owner'>\n): Promise<{ orderId: string; orderDigest: string }> {\n const domain = await getDomain(chainId)\n const orderDigest = hashOrder(domain, order)\n // Generate the orderId from owner, orderDigest, and max validTo\n const orderId = packOrderUidParams({\n ...params,\n orderDigest,\n // Different validTo when signing because EthFlow contract expects it to be max for all orders\n validTo: order.validTo,\n })\n\n return { orderId, orderDigest }\n}\n"],"names":["_signPayload","payload","signFn","signer","signingMethod","_exit","_temp2","_result","data","signature","toString","signingScheme","EcdsaSigningScheme","ETHSIGN","EIP712","_signer","TypedDataVersionedSigner","IntChainIdTypedDataV4Signer","e","console","error","CowError","_temp","Promise","resolve","then","_signFn","_catch","undefined","code","message","regexErrorCheck","METHOD_NOT_FOUND_ERROR_MSG_REGEX","RPC_REQUEST_FAILED_REGEX","some","regex","msg","test","METHOD_NOT_FOUND_ERROR_CODE","METAMASK_STRING_CHAINID_REGEX","_signPayload5","METAMASK_SIGNATURE_ERROR_CODE","_signPayload6","V4_ERROR_MSG_REGEX","_signPayload7","V3_ERROR_MSG_REGEX","_signPayload8","_signPayload2","_signPayload3","_signPayload4","reject","_signOrderCancellations","params","chainId","orderUids","domain","getDomain","signOrderCancellationsGp","mapSigningSchema","_signOrderCancellation","orderUid","signOrderCancellationGp","signOrderCancellation","_signOrder","order","signOrderGp","signOrder","SigningScheme","settlementContract","COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS","domainGp","generateOrderId","orderDigest","hashOrder","orderId","packOrderUidParams","validTo"],"mappings":"2UAmPsB,MA9JPA,EAAYA,SACzBC,EAEAC,EACAC,EACAC,EAAiE,MAAI,IAAAC,IAAAA,EAAAC,SAAAA,EAAAC,GAAA,GAAAF,EAAA,OAAAE,EA4ErE,MAAMC,EAAgBC,GAAWD,KAEjC,MAAO,CAAEC,UAAWD,GAAME,YAAc,GAAIC,gBAAe,CA5E3D,MAAMA,EACc,aAAlBP,EAA+BQ,EAAkBA,mBAACC,QAAUD,EAAkBA,mBAACE,OACjF,IAEIC,EAFAN,EAA8B,KAGlC,IACE,OAAQL,GACN,IAAK,UACL,IAAK,KACHW,EAAU,IAAIC,EAAwBA,yBAACb,GACvC,MACF,IAAK,SACHY,EAAU,IAAIE,EAA2BA,4BAACd,GAC1C,MACF,QACEY,EAAUZ,EAEf,CAAC,MAAOe,GAEP,MADAC,QAAQC,MAAM,wBAAyBF,GACjC,IAAIG,EAAQA,SAAC,uBACpB,CAAA,MAAAC,0BAEGC,QAAAC,QACiBtB,EAAO,IAAKD,EAASE,OAAQY,EAASJ,mBAAgBc,KAAA,SAAAC,GAAzEjB,EAASiB,CAAmF,4DAH7FC,CAEG,EAGH,SAAQT,GACP,QA5D0CU,KADlBR,EA6DAF,GA5DSW,WAA8DD,IAAvCR,EAA2BU,QA+DjF,MADAX,QAAQC,MAAMF,GACRA,EAhEZ,IAA4BE,EAmExB,MAAMW,EAAkB,CAACC,EAAkCC,GAA0BC,KAAMC,GAEzF,CAACjB,EAAEY,QAASZ,EAAER,YAAYwB,KAAME,GAAQD,EAAME,KAAKD,KACpD,GAEGlB,EAAEW,OAASS,IAA+BP,EAcvC,IAAIQ,EAA8BF,KAAKnB,EAAEY,SAAU,CAAA,MAAAU,EAEjDxC,EAAaC,EAASC,EAAQC,EAAQ,UAASqC,OAAAnC,EAAAmC,EAAAA,CACvD,CAAUtB,GAAAA,EAAEW,OAASY,EAA+B,CAAA,MAAAC,EAM5C1C,EAAaC,EAASC,EAAQC,EAAQ,YAAWuC,OAAArC,EAAAqC,EAAAA,CACzD,CAAUC,GAAAA,EAAmBN,KAAKnB,EAAEY,SAAU,CAAAc,MAAAA,EAEtC5C,EAAaC,EAASC,EAAQC,EAAQ,MAAK,OAAAE,EAAA,EAAAuC,CACnD,CAAM,GAAIC,EAAmBR,KAAKnB,EAAEY,SAAU,CAAA,MAAAgB,EAEtC9C,EAAaC,EAASC,EAAQC,EAAQ,YAAW2C,OAAAzC,EAAAyC,EAAAA,CACzD,CAGC,MADA3B,QAAQC,MAAMF,GACRA,CACP,CA9BC,OAAQd,GACN,IAAK,KAAI2C,MAAAA,EACA/C,EAAaC,EAASC,EAAQC,EAAQ,WAAU,OAAAE,EAAA,EAAA0C,EACzD,IAAK,UAASC,MAAAA,EACLhD,EAAaC,EAASC,EAAQC,EAAQ,MAAK,OAAAE,EAAA,EAAA2C,EACpD,IAAK,KAAIC,MAAAA,EACAjD,EAAaC,EAASC,EAAQC,EAAQ,YAAW,OAAAE,EAAA,EAAA4C,EAC1D,QACE,MAAM/B,EAuBb,GAAA,OAAAK,QAAAC,QAAAF,GAAAA,EAAAG,KAAAH,EAAAG,KAAAnB,GAAAA,EAAAgB,GAKH,CAAC,MAAAJ,GAAA,OAAAK,QAAA2B,OAAAhC,EAAA,CAAA,EA5FciC,EAAuBA,SAACC,GAAoC,IACzE,MAAMC,QAAEA,EAAOlD,OAAEA,EAAMQ,cAAEA,EAAa2C,UAAEA,GAAcF,EAEhDG,EAASC,EAAUH,GAEzB,OAAA9B,QAAAC,QAAOiC,EAAAA,uBAAyBF,EAAQD,EAAWnD,EAAQuD,EAAiB/C,IAC9E,CAAC,MAAAO,GAAA,OAAAK,QAAA2B,OAAAhC,EAAA,CAAA,EAdcyC,EAAsBA,SAACP,GAAmC,IACvE,MAAMC,QAAEA,EAAOlD,OAAEA,EAAMQ,cAAEA,EAAaiD,SAAEA,GAAaR,EAE/CG,EAASC,EAAUH,GAEzB,OAAA9B,QAAAC,QAAOqC,EAAuBC,sBAACP,EAAQK,EAAUzD,EAAQuD,EAAiB/C,IAC5E,CAAC,MAAAO,GAAA,OAAAK,QAAA2B,OAAAhC,EAAA,CAAA,EAdc6C,EAAUA,SAACX,GAAuB,IAC/C,MAAMC,QAAEA,EAAOlD,OAAEA,EAAM6D,MAAEA,EAAKrD,cAAEA,GAAkByC,EAE5CG,EAASC,EAAUH,GAEzB,OAAA9B,QAAAC,QAAOyC,EAAWC,UAACX,EAAQS,EAAuC7D,EAAQuD,EAAiB/C,IAC7F,CAAC,MAAAO,GAAA,OAAAK,QAAA2B,OAAAhC,EAAA,CAAA,EApCKuB,GAAiC,MACjCH,GAA+B,MAG/BN,EAAmC,oBACnCW,EAAqB,uCACrBE,EAAqB,uCACrBZ,EAA2B,sBAC3BM,EAAgC,qDAEhCmB,EAA2E,CAC/E,CAAC9C,EAAAA,mBAAmBE,QAASqD,EAAAA,cAAcrD,OAC3C,CAACF,EAAkBA,mBAACC,SAAUsD,EAAaA,cAACtD,SAuL9B,SAAA2C,EAAUH,GAExB,MAAMe,EAAqBC,EAAAA,yCAAyChB,GAEpE,IAAKe,EACH,MAAU,IAAA/C,EAAAA,SAAS,4DAGrB,OAAOiD,EAAAA,OAASjB,EAASe,EAC3B,yBAQqCG,SACnClB,EACAW,EACAZ,GAAqC,IAAA7B,OAAAA,QAAAC,QAEhBgC,EAAUH,IAAQ5B,KAAA,SAAjC8B,GACN,MAAMiB,EAAcC,EAAAA,UAAUlB,EAAQS,GAStC,MAAO,CAAEU,QAPOC,EAAAA,mBAAmB,IAC9BvB,EACHoB,cAEAI,QAASZ,EAAMY,UAGCJ,cAAa,EACjC,CAAC,MAAAtD,GAAA,OAAAK,QAAA2B,OAAAhC,EAAA,CAAA,wCAhF8B,SAC7B8C,EACAX,EACAlD,GAEA,OAAOH,EAAa,CAAEgE,QAAOX,WAAWU,EAAY5D,EACtD,gCAU2C,SACzCyD,EACAP,EACAlD,GAEA,OAAOH,EAAa,CAAE4D,WAAUP,WAAWM,EAAwBxD,EACrE,iCAW4C,SAC1CmD,EACAD,EACAlD,GAEA,OAAOH,EAAa,CAAEsD,YAAWD,WAAWF,EAAyBhD,EACvE"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import{hashOrder as e,packOrderUidParams as t,IntChainIdTypedDataV4Signer as r,TypedDataVersionedSigner as n,signOrderCancellations as o,signOrderCancellation as i,signOrder as s,SigningScheme as c,domain as a}from"@cowprotocol/contracts";import{EcdsaSigningScheme as d,CowError as u,COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS as h}from"./index.module.js";import"cross-fetch/polyfill";import"limiter";import"exponential-backoff";import"graphql-request";import"ethers";import"@openzeppelin/merkle-tree";import"ethers/lib/utils";import"@ethersproject/abstract-signer";import"@cowprotocol/app-data";const l=function(r,n,o){try{return Promise.resolve(k(r)).then(function(r){const i=e(r,n);return{orderId:t({...o,orderDigest:i,validTo:n.validTo}),orderDigest:i}})}catch(e){return Promise.reject(e)}},m=function(e,t,r){return p({orderUids:e,chainId:t},v,r)},f=function(e,t,r){return p({orderUid:e,chainId:t},P,r)},g=function(e,t,r){return p({order:e,chainId:t},w,r)},p=function(e,t,o,i="v4"){try{let c;function s(e){if(c)return e;const t=l?.data;return{signature:t?.toString()||"",signingScheme:a}}const a="eth_sign"===i?d.ETHSIGN:d.EIP712;let h,l=null;try{switch(i){case"default":case"v3":h=new n(o);break;case"int_v4":h=new r(o);break;default:h=o}}catch(f){throw console.error("Wallet not supported:",f),new u("Wallet not supported")}const m=function(r,n){try{var o=Promise.resolve(t({...e,signer:h,signingScheme:a})).then(function(e){l=e})}catch(e){return n(e)}return o&&o.then?o.then(void 0,n):o}(0,function(r){if(void 0===(n=r).code&&void 0===n.message)throw console.error(r),r;var n;const s=[S,T].some(e=>[r.message,r.toString()].some(t=>e.test(t)));if(r.code!==y&&!s){if(E.test(r.message)){const r=p(e,t,o,"int_v4");return c=1,r}if(r.code===I){const r=p(e,t,o,"eth_sign");return c=1,r}if(_.test(r.message)){const r=p(e,t,o,"v3");return c=1,r}if(j.test(r.message)){const r=p(e,t,o,"eth_sign");return c=1,r}throw console.error(r),r}switch(i){case"v4":const n=p(e,t,o,"default");return c=1,n;case"default":const i=p(e,t,o,"v3");return c=1,i;case"v3":const s=p(e,t,o,"eth_sign");return c=1,s;default:throw r}});return Promise.resolve(m&&m.then?m.then(s):s(m))}catch(g){return Promise.reject(g)}},v=function(e){try{const{chainId:t,signer:r,signingScheme:n,orderUids:i}=e,s=k(t);return Promise.resolve(o(s,i,r,b[n]))}catch(e){return Promise.reject(e)}},P=function(e){try{const{chainId:t,signer:r,signingScheme:n,orderUid:o}=e,s=k(t);return Promise.resolve(i(s,o,r,b[n]))}catch(e){return Promise.reject(e)}},w=function(e){try{const{chainId:t,signer:r,order:n,signingScheme:o}=e,i=k(t);return Promise.resolve(s(i,n,r,b[o]))}catch(e){return Promise.reject(e)}},I=-32603,y=-32601,S=/Method not found/i,_=/eth_signTypedData_v4 does not exist/i,j=/eth_signTypedData_v3 does not exist/i,T=/RPC request failed/i,E=/provided chainid .* must match the active chainid/i,b={[d.EIP712]:c.EIP712,[d.ETHSIGN]:c.ETHSIGN};function k(e){const t=h[e];if(!t)throw new u("Unsupported network. Settlement contract is not deployed");return a(e,t)}export{l as generateOrderId,k as getDomain,g as signOrder,f as signOrderCancellation,m as signOrderCancellations};
|
|
2
|
-
//# sourceMappingURL=utils-
|
|
2
|
+
//# sourceMappingURL=utils-35087bda.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils-bb189bec.js","sources":["../src/order-signing/utils.ts"],"sourcesContent":["import type {\n Order as OrderFromContract,\n Signature,\n TypedDataDomain,\n EcdsaSigningScheme as EcdsaSigningSchemeContract,\n Order,\n OrderUidParams,\n} from '@cowprotocol/contracts'\nimport {\n domain as domainGp,\n EcdsaSignature,\n IntChainIdTypedDataV4Signer,\n SigningScheme,\n hashOrder,\n packOrderUidParams,\n signOrder as signOrderGp,\n signOrderCancellation as signOrderCancellationGp,\n signOrderCancellations as signOrderCancellationsGp,\n TypedDataVersionedSigner,\n} from '@cowprotocol/contracts'\nimport type { Signer } from '@ethersproject/abstract-signer'\nimport type { SigningResult, SignOrderParams, SignOrderCancellationParams, UnsignedOrder } from './types'\n\nimport { COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS } from '../common/consts'\nimport { CowError, SupportedChainId } from '../common'\nimport { EcdsaSigningScheme } from '../order-book'\nimport { SignOrderCancellationsParams } from './types'\n\n// For error codes, see:\n// - https://eth.wiki/json-rpc/json-rpc-error-codes-improvement-proposal\n// - https://www.jsonrpc.org/specification#error_object\nconst METAMASK_SIGNATURE_ERROR_CODE = -32603\nconst METHOD_NOT_FOUND_ERROR_CODE = -32601\n// Added the following because of 1Inch wallet who doesn't send the error code\n// So we will check the actual error text\nconst METHOD_NOT_FOUND_ERROR_MSG_REGEX = /Method not found/i\nconst V4_ERROR_MSG_REGEX = /eth_signTypedData_v4 does not exist/i\nconst V3_ERROR_MSG_REGEX = /eth_signTypedData_v3 does not exist/i\nconst RPC_REQUEST_FAILED_REGEX = /RPC request failed/i\nconst METAMASK_STRING_CHAINID_REGEX = /provided chainid .* must match the active chainid/i\n\nconst mapSigningSchema: Record<EcdsaSigningScheme, EcdsaSigningSchemeContract> = {\n [EcdsaSigningScheme.EIP712]: SigningScheme.EIP712,\n [EcdsaSigningScheme.ETHSIGN]: SigningScheme.ETHSIGN,\n}\n\ninterface ProviderRpcError extends Error {\n message: string\n code: number\n data?: unknown\n}\n\ntype PayloadParams =\n | Pick<SignOrderParams, 'order' & 'chainId'>\n | Pick<SignOrderCancellationParams, 'chainId' & 'orderId'>\n | Pick<SignOrderCancellationsParams, 'chainId' & 'orderUids'>\n\nfunction isProviderRpcError(error: unknown): error is ProviderRpcError {\n return (error as ProviderRpcError).code !== undefined || (error as ProviderRpcError).message !== undefined\n}\n\nasync function _signOrder(params: SignOrderParams): Promise<Signature> {\n const { chainId, signer, order, signingScheme } = params\n\n const domain = getDomain(chainId)\n\n return signOrderGp(domain, order as unknown as OrderFromContract, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellation(params: SignOrderCancellationParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUid } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationGp(domain, orderUid, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellations(params: SignOrderCancellationsParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUids } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationsGp(domain, orderUids, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signPayload(\n payload: PayloadParams,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n signFn: (params: any) => Promise<Signature>,\n signer: Signer,\n signingMethod: 'default' | 'v4' | 'int_v4' | 'v3' | 'eth_sign' = 'v4'\n): Promise<SigningResult> {\n const signingScheme: EcdsaSigningScheme =\n signingMethod === 'eth_sign' ? EcdsaSigningScheme.ETHSIGN : EcdsaSigningScheme.EIP712\n let signature: Signature | null = null\n\n let _signer\n try {\n switch (signingMethod) {\n case 'default':\n case 'v3':\n _signer = new TypedDataVersionedSigner(signer)\n break\n case 'int_v4':\n _signer = new IntChainIdTypedDataV4Signer(signer)\n break\n default:\n _signer = signer\n }\n } catch (e) {\n console.error('Wallet not supported:', e)\n throw new CowError('Wallet not supported')\n }\n\n try {\n signature = (await signFn({ ...payload, signer: _signer, signingScheme })) as EcdsaSignature // Only ECDSA signing supported for now\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (!isProviderRpcError(e)) {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n\n const regexErrorCheck = [METHOD_NOT_FOUND_ERROR_MSG_REGEX, RPC_REQUEST_FAILED_REGEX].some((regex) =>\n // for example 1Inch error doesn't have e.message so we will check the output of toString()\n [e.message, e.toString()].some((msg) => regex.test(msg))\n )\n\n if (e.code === METHOD_NOT_FOUND_ERROR_CODE || regexErrorCheck) {\n // Maybe the wallet returns the proper error code? We can only hope 🤞\n // OR it failed with a generic message, there's no error code set, and we also hope it'll work\n // with other methods...\n switch (signingMethod) {\n case 'v4':\n return _signPayload(payload, signFn, signer, 'default')\n case 'default':\n return _signPayload(payload, signFn, signer, 'v3')\n case 'v3':\n return _signPayload(payload, signFn, signer, 'eth_sign')\n default:\n throw e\n }\n } else if (METAMASK_STRING_CHAINID_REGEX.test(e.message)) {\n // Metamask now enforces chainId to be an integer\n return _signPayload(payload, signFn, signer, 'int_v4')\n } else if (e.code === METAMASK_SIGNATURE_ERROR_CODE) {\n // We tried to sign order the nice way.\n // That works fine for regular MM addresses. Does not work for Hardware wallets, though.\n // See https://github.com/MetaMask/metamask-extension/issues/10240#issuecomment-810552020\n // So, when that specific error occurs, we know this is a problem with MM + HW.\n // Then, we fallback to ETHSIGN.\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else if (V4_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v4`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'v3')\n } else if (V3_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v3`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n }\n\n const data: unknown = signature?.data\n\n return { signature: data?.toString() || '', signingScheme }\n}\n\n/**\n * Returns the signature for the specified order with the signing scheme encoded\n * into the signature.\n * @param {UnsignedOrder} order The order to sign.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrder(\n order: UnsignedOrder,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ order, chainId }, _signOrder, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellation with the signing scheme encoded\n * into the signature.\n * @param {string} orderUid The unique identifier of the order being cancelled.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellation(\n orderUid: string,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUid, chainId }, _signOrderCancellation, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellations with the signing scheme encoded\n * into the signature.\n *\n * @param {string[]} orderUids The unique identifiers of the orders being cancelled.\n * @param {SupportedChainId} chainId The CoW Protocol protocol `chainId` context that's being used.\n * @param {Signer} signer The owner that had placed the orders used to sign.\n * @returns {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellations(\n orderUids: string[],\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUids, chainId }, _signOrderCancellations, signer)\n}\n\n/**\n * Returns the TypedDataDomain used for signing for the specified chainId.\n * @param {SupportedChainId} chainId The chain Id\n * @return {*} The TypedDataDomain for the specified chainId.\n * @throws {CowError} If the chainId is not supported.\n */\nexport function getDomain(chainId: SupportedChainId): TypedDataDomain {\n // Get settlement contract address\n const settlementContract = COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS[chainId]\n\n if (!settlementContract) {\n throw new CowError('Unsupported network. Settlement contract is not deployed')\n }\n\n return domainGp(chainId, settlementContract)\n}\n\n/**\n * Generate a deterministic order ID for the specified order.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Order} order order to sign\n * @param {Pick<OrderUidParams, 'owner'>} params order unique identifier parameters.\n */\nexport async function generateOrderId(\n chainId: SupportedChainId,\n order: Order,\n params: Pick<OrderUidParams, 'owner'>\n): Promise<{ orderId: string; orderDigest: string }> {\n const domain = await getDomain(chainId)\n const orderDigest = hashOrder(domain, order)\n // Generate the orderId from owner, orderDigest, and max validTo\n const orderId = packOrderUidParams({\n ...params,\n orderDigest,\n // Different validTo when signing because EthFlow contract expects it to be max for all orders\n validTo: order.validTo,\n })\n\n return { orderId, orderDigest }\n}\n"],"names":["generateOrderId","chainId","order","params","Promise","resolve","getDomain","then","domain","orderDigest","hashOrder","orderId","packOrderUidParams","validTo","e","reject","signOrderCancellations","orderUids","signer","_signPayload","_signOrderCancellations","signOrderCancellation","orderUid","_signOrderCancellation","signOrder","_signOrder","payload","signFn","signingMethod","_exit","_temp2","_result","data","signature","toString","signingScheme","EcdsaSigningScheme","ETHSIGN","EIP712","_signer","TypedDataVersionedSigner","IntChainIdTypedDataV4Signer","console","error","CowError","_temp","_signFn","_catch","undefined","code","message","regexErrorCheck","METHOD_NOT_FOUND_ERROR_MSG_REGEX","RPC_REQUEST_FAILED_REGEX","some","regex","msg","test","METHOD_NOT_FOUND_ERROR_CODE","METAMASK_STRING_CHAINID_REGEX","_signPayload5","METAMASK_SIGNATURE_ERROR_CODE","_signPayload6","V4_ERROR_MSG_REGEX","_signPayload7","V3_ERROR_MSG_REGEX","_signPayload8","_signPayload2","_signPayload3","_signPayload4","signOrderCancellationsGp","mapSigningSchema","signOrderCancellationGp","signOrderGp","SigningScheme","settlementContract","COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS","domainGp"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils-35087bda.js","sources":["../src/order-signing/utils.ts"],"sourcesContent":["import type {\n Order as OrderFromContract,\n Signature,\n TypedDataDomain,\n EcdsaSigningScheme as EcdsaSigningSchemeContract,\n Order,\n OrderUidParams,\n} from '@cowprotocol/contracts'\nimport {\n domain as domainGp,\n EcdsaSignature,\n IntChainIdTypedDataV4Signer,\n SigningScheme,\n hashOrder,\n packOrderUidParams,\n signOrder as signOrderGp,\n signOrderCancellation as signOrderCancellationGp,\n signOrderCancellations as signOrderCancellationsGp,\n TypedDataVersionedSigner,\n} from '@cowprotocol/contracts'\nimport type { Signer } from '@ethersproject/abstract-signer'\nimport type { SigningResult, SignOrderParams, SignOrderCancellationParams, UnsignedOrder } from './types'\n\nimport { COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS } from '../common/consts'\nimport { CowError, SupportedChainId } from '../common'\nimport { EcdsaSigningScheme } from '../order-book'\nimport { SignOrderCancellationsParams } from './types'\n\n// For error codes, see:\n// - https://eth.wiki/json-rpc/json-rpc-error-codes-improvement-proposal\n// - https://www.jsonrpc.org/specification#error_object\nconst METAMASK_SIGNATURE_ERROR_CODE = -32603\nconst METHOD_NOT_FOUND_ERROR_CODE = -32601\n// Added the following because of 1Inch wallet who doesn't send the error code\n// So we will check the actual error text\nconst METHOD_NOT_FOUND_ERROR_MSG_REGEX = /Method not found/i\nconst V4_ERROR_MSG_REGEX = /eth_signTypedData_v4 does not exist/i\nconst V3_ERROR_MSG_REGEX = /eth_signTypedData_v3 does not exist/i\nconst RPC_REQUEST_FAILED_REGEX = /RPC request failed/i\nconst METAMASK_STRING_CHAINID_REGEX = /provided chainid .* must match the active chainid/i\n\nconst mapSigningSchema: Record<EcdsaSigningScheme, EcdsaSigningSchemeContract> = {\n [EcdsaSigningScheme.EIP712]: SigningScheme.EIP712,\n [EcdsaSigningScheme.ETHSIGN]: SigningScheme.ETHSIGN,\n}\n\ninterface ProviderRpcError extends Error {\n message: string\n code: number\n data?: unknown\n}\n\ntype PayloadParams =\n | Pick<SignOrderParams, 'order' & 'chainId'>\n | Pick<SignOrderCancellationParams, 'chainId' & 'orderId'>\n | Pick<SignOrderCancellationsParams, 'chainId' & 'orderUids'>\n\nfunction isProviderRpcError(error: unknown): error is ProviderRpcError {\n return (error as ProviderRpcError).code !== undefined || (error as ProviderRpcError).message !== undefined\n}\n\nasync function _signOrder(params: SignOrderParams): Promise<Signature> {\n const { chainId, signer, order, signingScheme } = params\n\n const domain = getDomain(chainId)\n\n return signOrderGp(domain, order as unknown as OrderFromContract, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellation(params: SignOrderCancellationParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUid } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationGp(domain, orderUid, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellations(params: SignOrderCancellationsParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUids } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationsGp(domain, orderUids, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signPayload(\n payload: PayloadParams,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n signFn: (params: any) => Promise<Signature>,\n signer: Signer,\n signingMethod: 'default' | 'v4' | 'int_v4' | 'v3' | 'eth_sign' = 'v4'\n): Promise<SigningResult> {\n const signingScheme: EcdsaSigningScheme =\n signingMethod === 'eth_sign' ? EcdsaSigningScheme.ETHSIGN : EcdsaSigningScheme.EIP712\n let signature: Signature | null = null\n\n let _signer\n try {\n switch (signingMethod) {\n case 'default':\n case 'v3':\n _signer = new TypedDataVersionedSigner(signer)\n break\n case 'int_v4':\n _signer = new IntChainIdTypedDataV4Signer(signer)\n break\n default:\n _signer = signer\n }\n } catch (e) {\n console.error('Wallet not supported:', e)\n throw new CowError('Wallet not supported')\n }\n\n try {\n signature = (await signFn({ ...payload, signer: _signer, signingScheme })) as EcdsaSignature // Only ECDSA signing supported for now\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (!isProviderRpcError(e)) {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n\n const regexErrorCheck = [METHOD_NOT_FOUND_ERROR_MSG_REGEX, RPC_REQUEST_FAILED_REGEX].some((regex) =>\n // for example 1Inch error doesn't have e.message so we will check the output of toString()\n [e.message, e.toString()].some((msg) => regex.test(msg))\n )\n\n if (e.code === METHOD_NOT_FOUND_ERROR_CODE || regexErrorCheck) {\n // Maybe the wallet returns the proper error code? We can only hope 🤞\n // OR it failed with a generic message, there's no error code set, and we also hope it'll work\n // with other methods...\n switch (signingMethod) {\n case 'v4':\n return _signPayload(payload, signFn, signer, 'default')\n case 'default':\n return _signPayload(payload, signFn, signer, 'v3')\n case 'v3':\n return _signPayload(payload, signFn, signer, 'eth_sign')\n default:\n throw e\n }\n } else if (METAMASK_STRING_CHAINID_REGEX.test(e.message)) {\n // Metamask now enforces chainId to be an integer\n return _signPayload(payload, signFn, signer, 'int_v4')\n } else if (e.code === METAMASK_SIGNATURE_ERROR_CODE) {\n // We tried to sign order the nice way.\n // That works fine for regular MM addresses. Does not work for Hardware wallets, though.\n // See https://github.com/MetaMask/metamask-extension/issues/10240#issuecomment-810552020\n // So, when that specific error occurs, we know this is a problem with MM + HW.\n // Then, we fallback to ETHSIGN.\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else if (V4_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v4`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'v3')\n } else if (V3_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v3`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n }\n\n const data: unknown = signature?.data\n\n return { signature: data?.toString() || '', signingScheme }\n}\n\n/**\n * Returns the signature for the specified order with the signing scheme encoded\n * into the signature.\n * @param {UnsignedOrder} order The order to sign.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrder(\n order: UnsignedOrder,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ order, chainId }, _signOrder, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellation with the signing scheme encoded\n * into the signature.\n * @param {string} orderUid The unique identifier of the order being cancelled.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellation(\n orderUid: string,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUid, chainId }, _signOrderCancellation, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellations with the signing scheme encoded\n * into the signature.\n *\n * @param {string[]} orderUids The unique identifiers of the orders being cancelled.\n * @param {SupportedChainId} chainId The CoW Protocol protocol `chainId` context that's being used.\n * @param {Signer} signer The owner that had placed the orders used to sign.\n * @returns {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellations(\n orderUids: string[],\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUids, chainId }, _signOrderCancellations, signer)\n}\n\n/**\n * Returns the TypedDataDomain used for signing for the specified chainId.\n * @param {SupportedChainId} chainId The chain Id\n * @return {*} The TypedDataDomain for the specified chainId.\n * @throws {CowError} If the chainId is not supported.\n */\nexport function getDomain(chainId: SupportedChainId): TypedDataDomain {\n // Get settlement contract address\n const settlementContract = COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS[chainId]\n\n if (!settlementContract) {\n throw new CowError('Unsupported network. Settlement contract is not deployed')\n }\n\n return domainGp(chainId, settlementContract)\n}\n\n/**\n * Generate a deterministic order ID for the specified order.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Order} order order to sign\n * @param {Pick<OrderUidParams, 'owner'>} params order unique identifier parameters.\n */\nexport async function generateOrderId(\n chainId: SupportedChainId,\n order: Order,\n params: Pick<OrderUidParams, 'owner'>\n): Promise<{ orderId: string; orderDigest: string }> {\n const domain = await getDomain(chainId)\n const orderDigest = hashOrder(domain, order)\n // Generate the orderId from owner, orderDigest, and max validTo\n const orderId = packOrderUidParams({\n ...params,\n orderDigest,\n // Different validTo when signing because EthFlow contract expects it to be max for all orders\n validTo: order.validTo,\n })\n\n return { orderId, orderDigest }\n}\n"],"names":["generateOrderId","chainId","order","params","Promise","resolve","getDomain","then","domain","orderDigest","hashOrder","orderId","packOrderUidParams","validTo","e","reject","signOrderCancellations","orderUids","signer","_signPayload","_signOrderCancellations","signOrderCancellation","orderUid","_signOrderCancellation","signOrder","_signOrder","payload","signFn","signingMethod","_exit","_temp2","_result","data","signature","toString","signingScheme","EcdsaSigningScheme","ETHSIGN","EIP712","_signer","TypedDataVersionedSigner","IntChainIdTypedDataV4Signer","console","error","CowError","_temp","_signFn","_catch","undefined","code","message","regexErrorCheck","METHOD_NOT_FOUND_ERROR_MSG_REGEX","RPC_REQUEST_FAILED_REGEX","some","regex","msg","test","METHOD_NOT_FOUND_ERROR_CODE","METAMASK_STRING_CHAINID_REGEX","_signPayload5","METAMASK_SIGNATURE_ERROR_CODE","_signPayload6","V4_ERROR_MSG_REGEX","_signPayload7","V3_ERROR_MSG_REGEX","_signPayload8","_signPayload2","_signPayload3","_signPayload4","signOrderCancellationsGp","mapSigningSchema","signOrderCancellationGp","signOrderGp","SigningScheme","settlementContract","COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS","domainGp"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{C as e,_ as t,a as n,E as r}from"./index-
|
|
2
|
-
//# sourceMappingURL=utils-
|
|
1
|
+
import{C as e,_ as t,a as n,E as r}from"./index-cc713836.js";import{domain as i,hashOrder as o,packOrderUidParams as s,IntChainIdTypedDataV4Signer as a,TypedDataVersionedSigner as c,signOrder as d,signOrderCancellation as u,signOrderCancellations as l,SigningScheme as h}from"@cowprotocol/contracts";import"cross-fetch/polyfill";import"limiter";import"exponential-backoff";import"graphql-request";import"ethers";import"@openzeppelin/merkle-tree";import"ethers/lib/utils";import"@ethersproject/abstract-signer";import"@cowprotocol/app-data";const g=-32603,p=-32601,m=/Method not found/i,f=/eth_signTypedData_v4 does not exist/i,v=/eth_signTypedData_v3 does not exist/i,w=/RPC request failed/i,y=/provided chainid .* must match the active chainid/i,I={[r.EIP712]:h.EIP712,[r.ETHSIGN]:h.ETHSIGN};async function S(e){const{chainId:t,signer:n,order:r,signingScheme:i}=e,o=U(t);return d(o,r,n,I[i])}async function _(e){const{chainId:t,signer:n,signingScheme:r,orderUid:i}=e,o=U(t);return u(o,i,n,I[r])}async function E(e){const{chainId:t,signer:n,signingScheme:r,orderUids:i}=e,o=U(t);return l(o,i,n,I[r])}async function T(n,i,o,s="v4"){var d;const u="eth_sign"===s?r.ETHSIGN:r.EIP712;let l,h=null;try{switch(s){case"default":case"v3":l=new c(o);break;case"int_v4":l=new a(o);break;default:l=o}}catch(t){throw console.error("Wallet not supported:",t),new e("Wallet not supported")}try{h=await i(t({},n,{signer:l,signingScheme:u}))}catch(e){if(void 0===(I=e).code&&void 0===I.message)throw console.error(e),e;const t=[m,w].some(t=>[e.message,e.toString()].some(e=>t.test(e)));if(e.code!==p&&!t){if(y.test(e.message))return T(n,i,o,"int_v4");if(e.code===g)return T(n,i,o,"eth_sign");if(f.test(e.message))return T(n,i,o,"v3");if(v.test(e.message))return T(n,i,o,"eth_sign");throw console.error(e),e}switch(s){case"v4":return T(n,i,o,"default");case"default":return T(n,i,o,"v3");case"v3":return T(n,i,o,"eth_sign");default:throw e}}var I;const S=null==(d=h)?void 0:d.data;return{signature:(null==S?void 0:S.toString())||"",signingScheme:u}}async function b(e,t,n){return T({order:e,chainId:t},S,n)}async function k(e,t,n){return T({orderUid:e,chainId:t},_,n)}async function x(e,t,n){return T({orderUids:e,chainId:t},E,n)}function U(t){const r=n[t];if(!r)throw new e("Unsupported network. Settlement contract is not deployed");return i(t,r)}async function C(e,n,r){const i=await U(e),a=o(i,n);return{orderId:s(t({},r,{orderDigest:a,validTo:n.validTo})),orderDigest:a}}export{C as generateOrderId,U as getDomain,b as signOrder,k as signOrderCancellation,x as signOrderCancellations};
|
|
2
|
+
//# sourceMappingURL=utils-ce0d26d7.js.map
|