@cowprotocol/cow-sdk 5.10.2 → 5.11.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 +2 -0
- package/dist/README.md +2 -0
- package/dist/bridging/BridgingSdk/BridgingSdk.d.ts +90 -0
- package/dist/bridging/BridgingSdk/getCrossChainOrder.d.ts +14 -0
- package/dist/bridging/BridgingSdk/getErc20Decimals.d.ts +4 -0
- package/dist/bridging/BridgingSdk/getQuoteWithBridging.d.ts +32 -0
- package/dist/bridging/BridgingSdk/getQuoteWithoutBridge.d.ts +7 -0
- package/dist/bridging/const.d.ts +2 -0
- package/dist/bridging/errors.d.ts +4 -0
- package/dist/bridging/index.d.ts +6 -0
- package/dist/bridging/providers/across/AcrossApi.d.ts +27 -0
- package/dist/bridging/providers/across/AcrossBridgeProvider.d.ts +43 -0
- package/dist/bridging/providers/across/abi.d.ts +154 -0
- package/dist/bridging/providers/across/const/contracts.d.ts +3 -0
- package/dist/bridging/providers/across/const/misc.d.ts +1 -0
- package/dist/bridging/providers/across/const/tokens.d.ts +11 -0
- package/dist/bridging/providers/across/createAcrossDepositCall.d.ts +9 -0
- package/dist/bridging/providers/across/types.d.ts +169 -0
- package/dist/bridging/providers/across/util.d.ts +39 -0
- package/dist/bridging/providers/mock/MockBridgeProvider.d.ts +21 -0
- package/dist/bridging/types.d.ts +287 -0
- package/dist/bridging/utils.d.ts +9 -0
- package/dist/chains/const/index.d.ts +25 -0
- package/dist/chains/const/path.d.ts +1 -0
- package/dist/chains/details/arbitrum.d.ts +7 -0
- package/dist/chains/details/avalanche.d.ts +2 -0
- package/dist/chains/details/base.d.ts +7 -0
- package/dist/chains/details/gnosis.d.ts +7 -0
- package/dist/chains/details/mainnet.d.ts +7 -0
- package/dist/chains/details/optimism.d.ts +2 -0
- package/dist/chains/details/polygon.d.ts +2 -0
- package/dist/chains/details/sepolia.d.ts +7 -0
- package/dist/chains/index.d.ts +3 -0
- package/dist/chains/types.d.ts +123 -0
- package/dist/chains/utils.d.ts +18 -0
- package/dist/common/consts/config.d.ts +9 -0
- package/dist/common/{consts.d.ts → consts/contracts.d.ts} +1 -12
- package/dist/common/consts/path.d.ts +1 -0
- package/dist/common/consts/tokens.d.ts +9 -0
- package/dist/common/index.d.ts +12 -5
- package/dist/common/{configs.d.ts → types/config.d.ts} +1 -9
- package/dist/common/{cow-error.d.ts → types/cow-error.d.ts} +0 -1
- package/dist/common/types/ethereum.d.ts +5 -0
- package/dist/common/types/tokens.d.ts +12 -0
- package/dist/common/types/wallets.d.ts +5 -0
- package/dist/common/utils/config.d.ts +4 -0
- package/dist/common/utils/log.d.ts +2 -0
- package/dist/common/utils/serialize.d.ts +1 -0
- package/dist/common/utils/wallet.d.ts +3 -0
- package/dist/composable/Multiplexer.d.ts +1 -1
- package/dist/composable/contracts.d.ts +1 -1
- package/dist/composable/types.d.ts +1 -1
- package/dist/composable/utils.d.ts +1 -1
- package/dist/cow-shed/CowShedSdk.d.ts +69 -0
- package/dist/cow-shed/{proxyInitCode.d.ts → contracts/CoWShedHooks.d.ts} +44 -0
- package/dist/cow-shed/contracts/utils.d.ts +4 -0
- package/dist/cow-shed/index.d.ts +2 -3
- package/dist/cow-shed/types.d.ts +0 -16
- package/dist/hooks/utils.d.ts +3 -0
- package/dist/index-ef9ef589.js +29 -0
- package/dist/index-ef9ef589.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/index.modern.mjs +1 -1
- package/dist/index.module.js +4 -4
- package/dist/index.module.js.map +1 -1
- package/dist/order-book/api.d.ts +1 -1
- package/dist/order-book/quoteAmountsAndCostsUtils.d.ts +13 -2
- package/dist/order-book/types.d.ts +54 -18
- package/dist/order-signing/orderSigningUtils.d.ts +1 -1
- package/dist/order-signing/types.d.ts +1 -1
- package/dist/order-signing/utils.d.ts +1 -1
- package/dist/package.json +13 -11
- package/dist/schemas/trading/LimitOrderAdvancedSettings.ts +26 -0
- package/dist/schemas/trading/LimitTradeParameters.ts +3 -0
- package/dist/schemas/trading/QuoteResultsSerialized.ts +21 -12
- package/dist/schemas/trading/QuoterParameters.ts +11 -1
- package/dist/schemas/trading/SwapAdvancedSettings.ts +206 -0
- package/dist/schemas/trading/TradeParameters.ts +3 -0
- package/dist/src/bridging/README.md +54 -0
- package/dist/src/cow-shed/README.md +60 -0
- package/dist/src/trading/README.md +55 -7
- package/dist/src/weiroll/README.md +58 -0
- package/dist/subgraph/api.d.ts +2 -2
- package/dist/test/utils.d.ts +1 -0
- package/dist/trading/appDataUtils.d.ts +2 -1
- package/dist/trading/calculateUniqueOrderId.d.ts +3 -4
- package/dist/trading/consts.d.ts +2 -4
- package/dist/trading/getEthFlowTransaction.d.ts +6 -5
- package/dist/trading/getOrderTypedData.d.ts +1 -1
- package/dist/trading/getPreSignTransaction.d.ts +2 -2
- package/dist/trading/getQuote.d.ts +1 -1
- package/dist/trading/postCoWProtocolTrade.d.ts +4 -4
- package/dist/trading/postLimitOrder.d.ts +2 -2
- package/dist/trading/postSellNativeCurrencyOrder.d.ts +2 -6
- package/dist/trading/postSwapOrder.d.ts +3 -3
- package/dist/trading/tradingSdk.d.ts +14 -11
- package/dist/trading/types.d.ts +73 -11
- package/dist/trading/utils.d.ts +8 -4
- package/dist/utils-757fe114.js +2 -0
- package/dist/utils-757fe114.js.map +1 -0
- package/dist/utils-9a7618d8.js +2 -0
- package/dist/utils-9a7618d8.js.map +1 -0
- package/dist/utils-f4151c05.js +2 -0
- package/dist/utils-f4151c05.js.map +1 -0
- package/dist/utils.d.ts +1 -1
- package/dist/weiroll/index.d.ts +23 -0
- package/package.json +13 -11
- package/dist/common/chains.d.ts +0 -11
- package/dist/cow-shed/CoWShedHooks.d.ts +0 -35
- package/dist/cow-shed/contracts.d.ts +0 -4
- package/dist/index-2ed223c8.js +0 -29
- package/dist/index-2ed223c8.js.map +0 -1
- package/dist/utils-4bdd94dd.js +0 -2
- package/dist/utils-4bdd94dd.js.map +0 -1
- package/dist/utils-63156cab.js +0 -2
- package/dist/utils-63156cab.js.map +0 -1
- package/dist/utils-faedc0ab.js +0 -2
- package/dist/utils-faedc0ab.js.map +0 -1
- /package/dist/common/{ipfs.d.ts → consts/ipfs.d.ts} +0 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Cow Shed SDK
|
|
2
|
+
|
|
3
|
+
The Cow Shed SDK is a TypeScript library that provides a set of functions to interact with the [Cow Shed contract](https://github.com/cowdao-grants/cow-shed).
|
|
4
|
+
|
|
5
|
+
In essence, CoW Shed acts as a user owned smart contract (1/1 multisig if you will) that can execute multiple calls on behalf of the user (once the user has pre-authorized the calls).
|
|
6
|
+
|
|
7
|
+
## Usage
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import { ethers } from 'ethers'
|
|
11
|
+
import { CowShedSdk, ICoWShedCall, SupportedChainId } from '@cowprotocol/cow-sdk'
|
|
12
|
+
|
|
13
|
+
const cowShedSdk = new CowShedSdk({
|
|
14
|
+
signer: '<privateKeyOrEthersSigner>', // You can provide the signer in the constructor, or the `signCalls` method
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
// Get the cow-shed account for any given chainId and owner's address
|
|
18
|
+
const cowShedAccount = cowShedSdk.getCowShedAccount(1, '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045')
|
|
19
|
+
|
|
20
|
+
// Prepare the calls you want to execute using the cow-shed account
|
|
21
|
+
const calls: ICoWShedCall[] = [
|
|
22
|
+
{
|
|
23
|
+
target: '<contract-address-1>',
|
|
24
|
+
callData: 'call-data-1',
|
|
25
|
+
value: 0n,
|
|
26
|
+
isDelegateCall: true,
|
|
27
|
+
allowFailure: false,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
target: '<contract-address-2>',
|
|
31
|
+
callData: '<call-data-2>',
|
|
32
|
+
value: 0n,
|
|
33
|
+
isDelegateCall: true,
|
|
34
|
+
allowFailure: false,
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
// Sign the calls
|
|
39
|
+
const preAuthorizedCall = await cowShedSdk.signCalls({
|
|
40
|
+
chainId: SupportedChainId.MAINNET,
|
|
41
|
+
calls,
|
|
42
|
+
signer: '<privateKeyOrEthersSigner>',
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
// Get the details of the pre-authorized call you need to send
|
|
46
|
+
const { signedMulticall, gasLimit, cowShedAccount } = preAuthorizedCall
|
|
47
|
+
const { to, data, value } = signedMulticall
|
|
48
|
+
|
|
49
|
+
// Execute the transaction using any wallet. The calldata has been pre-authed, so you don't need any special permissions to send this transaction
|
|
50
|
+
let anotherWallet = new ethers.Wallet('<another-private-key>');
|
|
51
|
+
const tx = await anotherWallet.sendTransaction({
|
|
52
|
+
to,
|
|
53
|
+
data,
|
|
54
|
+
value,
|
|
55
|
+
gasLimit,
|
|
56
|
+
})
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
@@ -32,6 +32,7 @@ Main functions:
|
|
|
32
32
|
- `getQuote` - Fetch a quote for a swap order.
|
|
33
33
|
|
|
34
34
|
Special cases:
|
|
35
|
+
- 'setTraderParams' - In case if you work with different chains and need to switch between them in runtime.
|
|
35
36
|
- `postSellNativeCurrencyOrder` - Sell blockchain native tokens (e.g., ETH on Ethereum).
|
|
36
37
|
- `getPreSignTransaction` - Sign an order using a smart contract wallet.
|
|
37
38
|
|
|
@@ -165,7 +166,7 @@ const parameters: TradeParameters = {
|
|
|
165
166
|
amount: '120000000000000000'
|
|
166
167
|
}
|
|
167
168
|
|
|
168
|
-
const orderId = await sdk.postSwapOrder(parameters)
|
|
169
|
+
const { orderId } = await sdk.postSwapOrder(parameters)
|
|
169
170
|
|
|
170
171
|
console.log('Order created, id: ', orderId)
|
|
171
172
|
```
|
|
@@ -211,7 +212,7 @@ const limitOrderParameters: LimitTradeParameters = {
|
|
|
211
212
|
buyAmount: '66600000000000000000',
|
|
212
213
|
}
|
|
213
214
|
|
|
214
|
-
const orderId = await sdk.postLimitOrder(limitOrderParameters)
|
|
215
|
+
const { orderId } = await sdk.postLimitOrder(limitOrderParameters)
|
|
215
216
|
|
|
216
217
|
console.log('Order created, id: ', orderId)
|
|
217
218
|
```
|
|
@@ -248,7 +249,7 @@ const parameters: TradeParameters = {
|
|
|
248
249
|
amount: '120000000000000000'
|
|
249
250
|
}
|
|
250
251
|
|
|
251
|
-
const orderId = await sdk.postSellNativeCurrencyOrder(parameters)
|
|
252
|
+
const { orderId } = await sdk.postSellNativeCurrencyOrder(parameters)
|
|
252
253
|
|
|
253
254
|
console.log('Order created, id: ', orderId)
|
|
254
255
|
```
|
|
@@ -303,7 +304,7 @@ console.log('Quote:', quoteResults)
|
|
|
303
304
|
If you want to create an order with a smart-contract wallet, you should specify the `signingScheme` parameter in the `postSwapOrder` function.
|
|
304
305
|
And then you need to send a transaction from `getPreSignTransaction` result in order to sign the order.
|
|
305
306
|
|
|
306
|
-
#### Example
|
|
307
|
+
#### Example of Swap order
|
|
307
308
|
|
|
308
309
|
```typescript
|
|
309
310
|
import {
|
|
@@ -336,13 +337,60 @@ const advancedParameters: SwapAdvancedSettings = {
|
|
|
336
337
|
}
|
|
337
338
|
|
|
338
339
|
const smartContractWalletAddress = '0x<smartContractWalletAddress>'
|
|
339
|
-
const orderId = await sdk.postSwapOrder(parameters, advancedParameters)
|
|
340
|
+
const { orderId } = await sdk.postSwapOrder(parameters, advancedParameters)
|
|
341
|
+
const preSignTransaction = await sdk.getPreSignTransaction({ orderId, account: smartContractWalletAddress })
|
|
342
|
+
|
|
343
|
+
console.log('Order created with "pre-sign" state, id: ', orderId)
|
|
344
|
+
console.log('Execute the transaction to sign the order', preSignTransaction)
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
#### Example of Limit order
|
|
348
|
+
|
|
349
|
+
```typescript
|
|
350
|
+
import {
|
|
351
|
+
SupportedChainId,
|
|
352
|
+
OrderKind,
|
|
353
|
+
LimitTradeParameters,
|
|
354
|
+
LimitOrderAdvancedSettings,
|
|
355
|
+
SigningScheme,
|
|
356
|
+
TradingSdk
|
|
357
|
+
} from '@cowprotocol/cow-sdk'
|
|
358
|
+
|
|
359
|
+
const sdk = new TradingSdk({
|
|
360
|
+
chainId: SupportedChainId.SEPOLIA,
|
|
361
|
+
signer: '<privateKeyOrEthersSigner>',
|
|
362
|
+
appCode: '<YOUR_APP_CODE>',
|
|
363
|
+
})
|
|
364
|
+
|
|
365
|
+
const smartContractWalletAddress = '0x<smartContractWalletAddress>'
|
|
366
|
+
|
|
367
|
+
const limitOrderParameters: LimitTradeParameters = {
|
|
368
|
+
kind: OrderKind.BUY,
|
|
369
|
+
sellToken: '0xfff9976782d46cc05630d1f6ebab18b2324d6b14',
|
|
370
|
+
sellTokenDecimals: 18,
|
|
371
|
+
buyToken: '0x0625afb445c3b6b7b929342a04a22599fd5dbb59',
|
|
372
|
+
buyTokenDecimals: 18,
|
|
373
|
+
sellAmount: '120000000000000000',
|
|
374
|
+
buyAmount: '66600000000000000000',
|
|
375
|
+
owner: smartContractWalletAddress // See note bellow why you need to specify the parameter
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
const advancedParameters: LimitOrderAdvancedSettings = {
|
|
379
|
+
additionalParams: {
|
|
380
|
+
signingScheme: SigningScheme.PRESIGN
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
const { orderId } = await sdk.postLimitOrder(limitOrderParameters, advancedParameters)
|
|
340
385
|
const preSignTransaction = await sdk.getPreSignTransaction({ orderId, account: smartContractWalletAddress })
|
|
341
386
|
|
|
342
387
|
console.log('Order created with "pre-sign" state, id: ', orderId)
|
|
343
388
|
console.log('Execute the transaction to sign the order', preSignTransaction)
|
|
344
389
|
```
|
|
345
390
|
|
|
391
|
+
> **Note:** it's important to specify the `owner` parameter if you create an order with a smart-contract wallet, and it differs from the signer (for example Safe).
|
|
392
|
+
> CoW Protocol will use `owner` in order to check the order owner balance, allowance and other things.
|
|
393
|
+
|
|
346
394
|
### Optional parameters
|
|
347
395
|
|
|
348
396
|
Both `postSwapOrder` and `postLimitOrder` functions have optional parameters.
|
|
@@ -381,7 +429,7 @@ const parameters: TradeParameters = {
|
|
|
381
429
|
receiver: '0xdef1ca1fb7f1232777520aa7f396b4e015f497ab' // Just a random address, don't use it!
|
|
382
430
|
}
|
|
383
431
|
|
|
384
|
-
const orderId = await sdk.postSwapOrder(parameters)
|
|
432
|
+
const { orderId } = await sdk.postSwapOrder(parameters)
|
|
385
433
|
|
|
386
434
|
console.log('Order created, id: ', orderId)
|
|
387
435
|
```
|
|
@@ -441,7 +489,7 @@ const advancedSettings: SwapAdvancedSettings = {
|
|
|
441
489
|
}
|
|
442
490
|
},
|
|
443
491
|
}
|
|
444
|
-
const orderId = await sdk.postSwapOrder(parameters, advancedSettings)
|
|
492
|
+
const { orderId } = await sdk.postSwapOrder(parameters, advancedSettings)
|
|
445
493
|
|
|
446
494
|
console.log('Order created, id: ', orderId)
|
|
447
495
|
```
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Weiroll utils
|
|
2
|
+
|
|
3
|
+
This module some utilities to simplify the use of the [Weiroll contract](https://github.com/weiroll/weiroll).
|
|
4
|
+
|
|
5
|
+
Weiroll is a simple and efficient operation-chaining/scripting language for the EVM.
|
|
6
|
+
|
|
7
|
+
The main utilities function are:
|
|
8
|
+
- `createWeirollContract` which creates a Weiroll contract from an ethers contract to perform evm calls.
|
|
9
|
+
- `createWeirollLibrary` which creates a Weiroll library from an ethers contract to perform static calls.
|
|
10
|
+
- `createWeirollDelegateCall` which returns an EVM `delegatecall` with some plan encoded as Weiroll calldata.
|
|
11
|
+
|
|
12
|
+
To understand how this works, let's see an example:
|
|
13
|
+
|
|
14
|
+
## Usage
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
import { CommandFlags, createWeirollDelegateCall, createWeirollContract } from './index'
|
|
18
|
+
import { Planner, Contract as WeirollContract } from '@weiroll/weiroll.js'
|
|
19
|
+
import { ethers } from 'ethers'
|
|
20
|
+
|
|
21
|
+
const ERC20_ABI = [
|
|
22
|
+
'function balanceOf(address account) external view returns (uint256)',
|
|
23
|
+
'function transfer(address to, uint256 amount) external returns (bool)',
|
|
24
|
+
] as const
|
|
25
|
+
|
|
26
|
+
// Create ethers DAI contract
|
|
27
|
+
const contract = new ethers.Contract('0x6b175474e89094c44da98b954eedeac495271d0f', ERC20_ABI)
|
|
28
|
+
|
|
29
|
+
// Create the Weiroll contract (wrapping the ethers contract)
|
|
30
|
+
// You can choose between different command flags, like `CALL`, `DELEGATECALL`, `STATICCALL`, etc.
|
|
31
|
+
const daiContract = createWeirollContract(contract, CommandFlags.CALL)
|
|
32
|
+
|
|
33
|
+
// Let's pretend we have a smart contract that wants to transfer all DAI to Vitalik
|
|
34
|
+
const ownerContractAddress = '0xf6e72Db5454dd049d0788e411b06CfAF16853042'
|
|
35
|
+
|
|
36
|
+
// Main function to create the delegatecall
|
|
37
|
+
const { to, value, data } = createWeirollDelegateCall((planner: Planner) => {
|
|
38
|
+
// Add to plan: Get the balance of the token
|
|
39
|
+
const daiBalance = planner.add(daiContract.balanceOf(ownerContractAddress))
|
|
40
|
+
|
|
41
|
+
// Add to plan: Transfer all balance to Vitalik. Note how we can chain the balance from previous call
|
|
42
|
+
planner.add(daiContract.transfer('0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', daiBalance))
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
// Execute the delegatecall from "ownerContract" context.
|
|
46
|
+
// For illustration purposes, lets imagine there's a contract with a function `executeDelegateCall` (not a very realistic example because this would likely need a signature to be safe)
|
|
47
|
+
|
|
48
|
+
// Create instance of owner contract
|
|
49
|
+
const SMART_ACCOUNT_ABI = [
|
|
50
|
+
'function executeDelegateCall(address,uint256,bytes)',
|
|
51
|
+
]
|
|
52
|
+
const ownerContract = new ethers.Contract(ownerContractAddress, SMART_ACCOUNT_ABI)
|
|
53
|
+
|
|
54
|
+
// Execute the delegatecall, transferring all DAI to Vitalik
|
|
55
|
+
const tx = await ownerContract.executeDelegateCall(to, value, data)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
|
package/dist/subgraph/api.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Variables } from 'graphql-request';
|
|
2
2
|
import { DocumentNode } from 'graphql/index';
|
|
3
|
-
import { SupportedChainId } from '../
|
|
4
|
-
import { ApiContext } from '../common/
|
|
3
|
+
import { SupportedChainId } from '../chains/types';
|
|
4
|
+
import { ApiContext } from '../common/types/config';
|
|
5
5
|
import { LastDaysVolumeQuery, LastHoursVolumeQuery, TotalsQuery } from './graphql';
|
|
6
6
|
type SubgraphApiBaseUrls = Record<SupportedChainId, string | null>;
|
|
7
7
|
interface SubgraphApiContext extends Omit<ApiContext, 'baseUrls'> {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function expectToEqual(actual: unknown, expected: unknown): void;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AppDataInfo, AppDataRootSchema, BuildAppDataParams } from './types';
|
|
2
|
-
import { AppDataParams } from '@cowprotocol/app-data';
|
|
2
|
+
import { AppDataParams, type LatestAppDataDocVersion } from '@cowprotocol/app-data';
|
|
3
3
|
export declare function buildAppData({ slippageBps, appCode, orderClass: orderClassName, partnerFee }: BuildAppDataParams, advancedParams?: AppDataParams): Promise<AppDataInfo>;
|
|
4
4
|
export declare function generateAppDataFromDoc(doc: AppDataRootSchema): Promise<Pick<AppDataInfo, 'fullAppData' | 'appDataKeccak256'>>;
|
|
5
|
+
export declare function mergeAppDataDoc(_doc: LatestAppDataDocVersion, appDataOverride: AppDataParams): Promise<AppDataInfo>;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { UnsignedOrder } from '../order-signing';
|
|
2
|
-
import { CowEnv
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
2
|
+
import { CowEnv } from '../common';
|
|
3
|
+
import { SupportedChainId } from '../chains';
|
|
4
|
+
import { EthFlowOrderExistsCallback } from './types';
|
|
6
5
|
export declare function calculateUniqueOrderId(chainId: SupportedChainId, order: UnsignedOrder, checkEthFlowOrderExists?: EthFlowOrderExistsCallback, env?: CowEnv): Promise<string>;
|
package/dist/trading/consts.d.ts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { SigningScheme } from '../order-book';
|
|
2
|
-
|
|
3
|
-
export declare namespace log {
|
|
4
|
-
var enabled: boolean;
|
|
5
|
-
}
|
|
2
|
+
import { SupportedChainId } from '../chains';
|
|
6
3
|
export declare const DEFAULT_QUOTE_VALIDITY: number;
|
|
7
4
|
export declare const DEFAULT_SLIPPAGE_BPS = 50;
|
|
5
|
+
export declare const ETH_FLOW_DEFAULT_SLIPPAGE_BPS: Record<SupportedChainId, number>;
|
|
8
6
|
export declare const SIGN_SCHEME_MAP: {
|
|
9
7
|
eip712: SigningScheme;
|
|
10
8
|
ethsign: SigningScheme;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
export declare function getEthFlowTransaction(signer: Signer, appDataKeccak256: string, _params: LimitTradeParametersFromQuote, chainId: SupportedChainId,
|
|
1
|
+
import { LimitTradeParametersFromQuote, PostTradeAdditionalParams, TransactionParams } from './types';
|
|
2
|
+
import { SupportedChainId } from '../chains';
|
|
3
|
+
import { Signer } from '@ethersproject/abstract-signer';
|
|
4
|
+
import type { UnsignedOrder } from '../order-signing';
|
|
5
|
+
export declare function getEthFlowTransaction(signer: Signer, appDataKeccak256: string, _params: LimitTradeParametersFromQuote, chainId: SupportedChainId, additionalParams?: PostTradeAdditionalParams): Promise<{
|
|
6
6
|
orderId: string;
|
|
7
7
|
transaction: TransactionParams;
|
|
8
|
+
orderToSign: UnsignedOrder;
|
|
8
9
|
}>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { OrderTypedData } from './types';
|
|
2
2
|
import { UnsignedOrder } from '../order-signing';
|
|
3
|
-
import { SupportedChainId } from '../
|
|
3
|
+
import { SupportedChainId } from '../chains';
|
|
4
4
|
export declare function getOrderTypedData(chainId: SupportedChainId, orderToSign: UnsignedOrder): Promise<OrderTypedData>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SupportedChainId } from '../
|
|
2
|
-
import type { Signer } from '
|
|
1
|
+
import { SupportedChainId } from '../chains';
|
|
2
|
+
import type { Signer } from '@ethersproject/abstract-signer';
|
|
3
3
|
import { TransactionParams } from './types';
|
|
4
4
|
export declare function getPreSignTransaction(signer: Signer, chainId: SupportedChainId, account: string, orderId: string): Promise<TransactionParams>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { QuoteResults, QuoterParameters, SwapAdvancedSettings, SwapParameters, TradeParameters } from './types';
|
|
2
2
|
import { OrderBookApi } from '../order-book';
|
|
3
|
-
import { Signer } from '
|
|
3
|
+
import { Signer } from '@ethersproject/abstract-signer';
|
|
4
4
|
export type QuoteResultsWithSigner = {
|
|
5
5
|
result: QuoteResults & {
|
|
6
6
|
signer: Signer;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { OrderBookApi
|
|
2
|
-
import type { Signer } from '
|
|
3
|
-
import { AppDataInfo, LimitTradeParameters } from './types';
|
|
4
|
-
export declare function postCoWProtocolTrade(orderBookApi: OrderBookApi, signer: Signer, appData: AppDataInfo, params: LimitTradeParameters,
|
|
1
|
+
import { OrderBookApi } from '../order-book';
|
|
2
|
+
import type { Signer } from '@ethersproject/abstract-signer';
|
|
3
|
+
import { AppDataInfo, LimitTradeParameters, OrderPostingResult, PostTradeAdditionalParams } from './types';
|
|
4
|
+
export declare function postCoWProtocolTrade(orderBookApi: OrderBookApi, signer: Signer, appData: AppDataInfo, params: LimitTradeParameters, additionalParams?: PostTradeAdditionalParams): Promise<OrderPostingResult>;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { LimitOrderAdvancedSettings, LimitOrderParameters } from './types';
|
|
1
|
+
import { LimitOrderAdvancedSettings, LimitOrderParameters, OrderPostingResult } from './types';
|
|
2
2
|
import { OrderBookApi } from '../order-book';
|
|
3
|
-
export declare function postLimitOrder(params: LimitOrderParameters, advancedSettings?: LimitOrderAdvancedSettings, _orderBookApi?: OrderBookApi): Promise<
|
|
3
|
+
export declare function postLimitOrder(params: LimitOrderParameters, advancedSettings?: LimitOrderAdvancedSettings, _orderBookApi?: OrderBookApi): Promise<OrderPostingResult>;
|
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
import { Signer } from 'ethers';
|
|
2
|
-
import { AppDataInfo, LimitTradeParametersFromQuote } from './types';
|
|
3
|
-
import { EthFlowOrderExistsCallback } from './calculateUniqueOrderId';
|
|
2
|
+
import { AppDataInfo, LimitTradeParametersFromQuote, OrderPostingResult, PostTradeAdditionalParams } from './types';
|
|
4
3
|
import { OrderBookApi } from '../order-book';
|
|
5
|
-
export declare function postSellNativeCurrencyOrder(orderBookApi: OrderBookApi, signer: Signer, appData: Pick<AppDataInfo, 'fullAppData' | 'appDataKeccak256'>, _params: LimitTradeParametersFromQuote,
|
|
6
|
-
txHash: string;
|
|
7
|
-
orderId: string;
|
|
8
|
-
}>;
|
|
4
|
+
export declare function postSellNativeCurrencyOrder(orderBookApi: OrderBookApi, signer: Signer, appData: Pick<AppDataInfo, 'fullAppData' | 'appDataKeccak256'>, _params: LimitTradeParametersFromQuote, additionalParams?: PostTradeAdditionalParams): Promise<OrderPostingResult>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { SwapAdvancedSettings, SwapParameters } from './types';
|
|
1
|
+
import { OrderPostingResult, SwapAdvancedSettings, SwapParameters } from './types';
|
|
2
2
|
import { QuoteResultsWithSigner } from './getQuote';
|
|
3
3
|
import { OrderBookApi } from '../order-book';
|
|
4
|
-
export declare function postSwapOrder(params: SwapParameters, advancedSettings?: SwapAdvancedSettings, orderBookApi?: OrderBookApi): Promise<
|
|
5
|
-
export declare function postSwapOrderFromQuote({ orderBookApi, result: { signer, appDataInfo, quoteResponse, tradeParameters } }: QuoteResultsWithSigner, advancedSettings?: SwapAdvancedSettings): Promise<
|
|
4
|
+
export declare function postSwapOrder(params: SwapParameters, advancedSettings?: SwapAdvancedSettings, orderBookApi?: OrderBookApi): Promise<OrderPostingResult>;
|
|
5
|
+
export declare function postSwapOrderFromQuote({ orderBookApi, result: { signer, appDataInfo: _appDataInfo, quoteResponse, tradeParameters }, }: QuoteResultsWithSigner, advancedSettings?: SwapAdvancedSettings): Promise<OrderPostingResult>;
|
|
@@ -1,23 +1,26 @@
|
|
|
1
|
-
import { LimitOrderAdvancedSettings, LimitTradeParameters, QuoteAndPost, SwapAdvancedSettings, TradeParameters, TraderParameters } from './types';
|
|
1
|
+
import { LimitOrderAdvancedSettings, LimitTradeParameters, OrderPostingResult, QuoteAndPost, SwapAdvancedSettings, TradeParameters, TraderParameters } from './types';
|
|
2
|
+
import { QuoteResultsWithSigner } from './getQuote';
|
|
2
3
|
import { postSellNativeCurrencyOrder } from './postSellNativeCurrencyOrder';
|
|
3
4
|
import { getPreSignTransaction } from './getPreSignTransaction';
|
|
4
5
|
import { OrderBookApi } from '../order-book';
|
|
5
|
-
|
|
6
|
+
export type WithPartialTraderParams<T> = T & Partial<TraderParameters>;
|
|
7
|
+
export interface TradingSdkOptions {
|
|
6
8
|
enableLogging: boolean;
|
|
7
9
|
orderBookApi: OrderBookApi;
|
|
8
10
|
}
|
|
9
11
|
export declare class TradingSdk {
|
|
10
|
-
|
|
12
|
+
traderParams: Partial<TraderParameters>;
|
|
11
13
|
readonly options: Partial<TradingSdkOptions>;
|
|
12
|
-
constructor(traderParams
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
constructor(traderParams?: Partial<TraderParameters>, options?: Partial<TradingSdkOptions>);
|
|
15
|
+
setTraderParams(params: Partial<TraderParameters>): this;
|
|
16
|
+
getQuote(params: WithPartialTraderParams<TradeParameters>, advancedSettings?: SwapAdvancedSettings): Promise<QuoteAndPost>;
|
|
17
|
+
getQuoteResults(params: WithPartialTraderParams<TradeParameters>, advancedSettings?: SwapAdvancedSettings): Promise<QuoteResultsWithSigner>;
|
|
18
|
+
postSwapOrder(params: WithPartialTraderParams<TradeParameters>, advancedSettings?: SwapAdvancedSettings): Promise<OrderPostingResult>;
|
|
19
|
+
postLimitOrder(params: WithPartialTraderParams<LimitTradeParameters>, advancedSettings?: LimitOrderAdvancedSettings): Promise<OrderPostingResult>;
|
|
20
|
+
postSellNativeCurrencyOrder(params: WithPartialTraderParams<TradeParameters>, advancedSettings?: SwapAdvancedSettings): Promise<ReturnType<typeof postSellNativeCurrencyOrder>>;
|
|
21
|
+
getPreSignTransaction(params: WithPartialTraderParams<{
|
|
18
22
|
orderId: string;
|
|
19
23
|
account: string;
|
|
20
|
-
}): ReturnType<typeof getPreSignTransaction>;
|
|
24
|
+
}>): ReturnType<typeof getPreSignTransaction>;
|
|
21
25
|
private mergeParams;
|
|
22
26
|
}
|
|
23
|
-
export {};
|
package/dist/trading/types.d.ts
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import type { AppDataParams, latest, LatestAppDataDocVersion } from '@cowprotocol/app-data';
|
|
2
|
-
import { AppData, AppDataHash, OrderKind, OrderParameters, OrderQuoteRequest, OrderQuoteResponse, QuoteAmountsAndCosts, TokenAmount } from '../order-book';
|
|
3
|
-
import type {
|
|
4
|
-
import type { CowEnv, SupportedChainId } from '../common';
|
|
5
|
-
import type { ExternalProvider } from '@ethersproject/providers';
|
|
2
|
+
import { AppData, AppDataHash, OrderKind, OrderParameters, OrderQuoteRequest, OrderQuoteResponse, QuoteAmountsAndCosts, type Signature, SigningScheme, TokenAmount } from '../order-book';
|
|
3
|
+
import type { AccountAddress, CowEnv, SignerLike } from '../common';
|
|
6
4
|
import type { UnsignedOrder } from '../order-signing';
|
|
7
|
-
|
|
8
|
-
export type AccountAddress = `0x${string}`;
|
|
5
|
+
import type { SupportedChainId } from '../chains';
|
|
9
6
|
export declare const ORDER_PRIMARY_TYPE: "Order";
|
|
10
7
|
/**
|
|
11
8
|
* EIP-712 typed data domain.
|
|
@@ -37,6 +34,7 @@ export interface OrderTypedData {
|
|
|
37
34
|
*/
|
|
38
35
|
export interface TradeBaseParameters {
|
|
39
36
|
kind: OrderKind;
|
|
37
|
+
owner?: AccountAddress;
|
|
40
38
|
sellToken: OrderParameters['sellToken'];
|
|
41
39
|
sellTokenDecimals: number;
|
|
42
40
|
buyToken: OrderParameters['buyToken'];
|
|
@@ -60,7 +58,8 @@ export interface TradeOptionalParameters {
|
|
|
60
58
|
export interface TraderParameters {
|
|
61
59
|
chainId: SupportedChainId;
|
|
62
60
|
appCode: latest.AppCode;
|
|
63
|
-
signer:
|
|
61
|
+
signer: SignerLike;
|
|
62
|
+
env?: CowEnv;
|
|
64
63
|
}
|
|
65
64
|
export type QuoterParameters = Omit<TraderParameters, 'signer'> & {
|
|
66
65
|
account: AccountAddress;
|
|
@@ -87,30 +86,63 @@ export interface LimitTradeParametersFromQuote extends LimitTradeParameters {
|
|
|
87
86
|
export interface LimitOrderParameters extends TraderParameters, LimitTradeParameters {
|
|
88
87
|
}
|
|
89
88
|
export interface SwapAdvancedSettings {
|
|
90
|
-
quoteRequest?: Partial<Omit<OrderQuoteRequest, 'kind'
|
|
89
|
+
quoteRequest?: Partial<Omit<OrderQuoteRequest, 'kind'> & {
|
|
90
|
+
validTo: number;
|
|
91
|
+
}>;
|
|
91
92
|
appData?: AppDataParams;
|
|
93
|
+
additionalParams?: PostTradeAdditionalParams;
|
|
94
|
+
quoteSigner?: SignerLike;
|
|
92
95
|
}
|
|
93
96
|
export interface LimitOrderAdvancedSettings {
|
|
94
97
|
appData?: AppDataParams;
|
|
98
|
+
additionalParams?: PostTradeAdditionalParams;
|
|
95
99
|
}
|
|
96
100
|
/**
|
|
97
|
-
*
|
|
101
|
+
* Quote information for the CoW Protocol order, including information about the trade, quote, order, "app-data", and more.
|
|
102
|
+
*
|
|
98
103
|
* This data is used to create a trade, sign an order, and post it to the order book.
|
|
99
104
|
*/
|
|
100
105
|
export interface QuoteResults {
|
|
106
|
+
/**
|
|
107
|
+
* Information about the trade, including the kind of order, the owner, the sell and buy tokens, and the amount.
|
|
108
|
+
*/
|
|
101
109
|
tradeParameters: TradeParameters;
|
|
110
|
+
/**
|
|
111
|
+
* Details about costs and amounts, costs and fees of a quote.
|
|
112
|
+
*/
|
|
102
113
|
amountsAndCosts: QuoteAmountsAndCosts;
|
|
114
|
+
/**
|
|
115
|
+
* Information about the order to be signed.
|
|
116
|
+
*
|
|
117
|
+
* For signining, please use orderTypedData (EIP-712 typed data, which also includes the unsigned order)
|
|
118
|
+
*/
|
|
103
119
|
orderToSign: UnsignedOrder;
|
|
120
|
+
/**
|
|
121
|
+
* Information about the quote response from the order book API.
|
|
122
|
+
*/
|
|
104
123
|
quoteResponse: OrderQuoteResponse;
|
|
124
|
+
/**
|
|
125
|
+
* Information about the app-data, including the JSON document and the keccak256 hash of the full document.
|
|
126
|
+
*/
|
|
105
127
|
appDataInfo: AppDataInfo;
|
|
128
|
+
/**
|
|
129
|
+
* EIP-712 typed data for the order ready to be signed.
|
|
130
|
+
*/
|
|
106
131
|
orderTypedData: OrderTypedData;
|
|
107
132
|
}
|
|
108
133
|
export interface QuoteResultsSerialized extends Omit<QuoteResults, 'amountsAndCosts'> {
|
|
109
134
|
amountsAndCosts: QuoteAmountsAndCosts<string>;
|
|
110
135
|
}
|
|
136
|
+
export interface OrderPostingResult {
|
|
137
|
+
orderId: string;
|
|
138
|
+
txHash?: string;
|
|
139
|
+
signingScheme: SigningScheme;
|
|
140
|
+
signature: Signature;
|
|
141
|
+
orderToSign: UnsignedOrder;
|
|
142
|
+
}
|
|
111
143
|
export interface QuoteAndPost {
|
|
112
144
|
quoteResults: QuoteResults;
|
|
113
|
-
postSwapOrderFromQuote(): Promise<
|
|
145
|
+
postSwapOrderFromQuote(advancedSettings?: SwapAdvancedSettings): Promise<OrderPostingResult>;
|
|
114
146
|
}
|
|
115
147
|
export type AppDataRootSchema = latest.AppDataRootSchema;
|
|
116
148
|
export interface BuildAppDataParams {
|
|
@@ -120,7 +152,9 @@ export interface BuildAppDataParams {
|
|
|
120
152
|
partnerFee?: latest.PartnerFee;
|
|
121
153
|
}
|
|
122
154
|
/**
|
|
123
|
-
*
|
|
155
|
+
* Information about the app-data, including the JSON document and the keccak256 hash of the full document.
|
|
156
|
+
*
|
|
157
|
+
* See https://github.com/cowprotocol/app-data
|
|
124
158
|
*/
|
|
125
159
|
export interface AppDataInfo {
|
|
126
160
|
doc: LatestAppDataDocVersion;
|
|
@@ -136,4 +170,32 @@ export interface TransactionParams {
|
|
|
136
170
|
to: string;
|
|
137
171
|
value: string;
|
|
138
172
|
}
|
|
173
|
+
export interface EthFlowOrderExistsCallback {
|
|
174
|
+
(orderId: string, orderDigest: string): Promise<boolean>;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Additional parameters for posting orders.
|
|
178
|
+
* In most of the cases you don't need to use them.
|
|
179
|
+
*/
|
|
180
|
+
export interface PostTradeAdditionalParams {
|
|
181
|
+
/**
|
|
182
|
+
* Selling native token orders are special, because they are created from smart-contract,
|
|
183
|
+
* and their validTo is always the same.
|
|
184
|
+
* Because of that, you might get the same orderId when trying to create an order with the same parameters
|
|
185
|
+
* The callback is needed to check if there is already an order with the same orderId
|
|
186
|
+
*
|
|
187
|
+
* @see https://github.com/cowprotocol/ethflowcontract/blob/main/src/libraries/EthFlowOrder.sol#L90
|
|
188
|
+
*/
|
|
189
|
+
checkEthFlowOrderExists?: EthFlowOrderExistsCallback;
|
|
190
|
+
/**
|
|
191
|
+
* Cost of executing the order onchain.
|
|
192
|
+
* The value is used in getQuoteAmountsAndCosts in order to calculate proper amounts
|
|
193
|
+
*/
|
|
194
|
+
networkCostsAmount?: string;
|
|
195
|
+
/**
|
|
196
|
+
* By default, is EIP712 for EOA wallets.
|
|
197
|
+
* You might need other types of signing, for example PRESIGN when sign order via Smart Contract wallets.
|
|
198
|
+
*/
|
|
199
|
+
signingScheme?: SigningScheme;
|
|
200
|
+
}
|
|
139
201
|
export {};
|
package/dist/trading/utils.d.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import { LimitTradeParametersFromQuote,
|
|
1
|
+
import { LimitTradeParametersFromQuote, TradeParameters } from './types';
|
|
2
2
|
import { OrderQuoteResponse, QuoteAmountsAndCosts } from '../order-book';
|
|
3
|
-
import {
|
|
4
|
-
import { type ExternalProvider } from '@ethersproject/providers';
|
|
3
|
+
import { SupportedChainId } from '../chains';
|
|
5
4
|
export declare function swapParamsToLimitOrderParams(params: TradeParameters, quoteResponse: OrderQuoteResponse): LimitTradeParametersFromQuote;
|
|
6
5
|
export declare function getIsEthFlowOrder(params: {
|
|
7
6
|
sellToken: string;
|
|
8
7
|
}): boolean;
|
|
9
|
-
export declare function getSigner(signer: Signer | ExternalProvider | PrivateKey): Signer;
|
|
10
8
|
/**
|
|
11
9
|
* Returns the gas value plus a margin for unexpected or variable gas costs (20%)
|
|
12
10
|
* @param value the gas value to pad
|
|
@@ -21,3 +19,9 @@ export declare function getTradeParametersAfterQuote({ quoteParameters, orderPar
|
|
|
21
19
|
quoteParameters: TradeParameters;
|
|
22
20
|
orderParameters: TradeParameters;
|
|
23
21
|
}): TradeParameters;
|
|
22
|
+
/**
|
|
23
|
+
* ETH-flow orders are special and need to be adjusted
|
|
24
|
+
* 1. Sell token should be the wrapped native currency
|
|
25
|
+
* 2. Default slippage is 2%
|
|
26
|
+
*/
|
|
27
|
+
export declare function adjustEthFlowOrderParams(chainId: SupportedChainId, params: TradeParameters | LimitTradeParametersFromQuote): typeof params;
|
|
@@ -0,0 +1,2 @@
|
|
|
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 l}from"./index.module.js";import"cross-fetch/polyfill";import"limiter";import"exponential-backoff";import"ethers";import"@cowprotocol/app-data";import"ethers/lib/utils";import"deepmerge";import"@ethersproject/abstract-signer";import"@weiroll/weiroll.js";import"graphql-request";import"@openzeppelin/merkle-tree";const h=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 f({orderUids:e,chainId:t},v,r)},g=function(e,t,r){return f({orderUid:e,chainId:t},w,r)},p=function(e,t,r){return f({order:e,chainId:t},P,r)},f=function(e,t,o,i="v4"){try{let c;function s(e){if(c)return e;const t=h?.data;return{signature:t?.toString()||"",signingScheme:a}}const a="eth_sign"===i?d.ETHSIGN:d.EIP712;let l,h=null;try{switch(i){case"default":case"v3":l=new n(o);break;case"int_v4":l=new r(o);break;default:l=o}}catch(g){throw console.error("Wallet not supported:",g),new u("Wallet not supported")}const m=function(r,n){try{var o=Promise.resolve(t({...e,signer:l,signingScheme:a})).then(function(e){h=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=f(e,t,o,"int_v4");return c=1,r}if(r.code===I){const r=f(e,t,o,"eth_sign");return c=1,r}if(_.test(r.message)){const r=f(e,t,o,"v3");return c=1,r}if(j.test(r.message)){const r=f(e,t,o,"eth_sign");return c=1,r}throw console.error(r),r}switch(i){case"v4":const n=f(e,t,o,"default");return c=1,n;case"default":const i=f(e,t,o,"v3");return c=1,i;case"v3":const s=f(e,t,o,"eth_sign");return c=1,s;default:throw r}});return Promise.resolve(m&&m.then?m.then(s):s(m))}catch(p){return Promise.reject(p)}},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)}},w=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)}},P=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=l[e];if(!t)throw new u("Unsupported network. Settlement contract is not deployed");return a(e,t)}export{h as generateOrderId,k as getDomain,p as signOrder,g as signOrderCancellation,m as signOrderCancellations};
|
|
2
|
+
//# sourceMappingURL=utils-757fe114.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils-757fe114.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/contracts'\nimport { CowError } from '../common'\nimport type { SupportedChainId } from '../chains'\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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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=require("@cowprotocol/contracts"),r=require("./index.js");require("cross-fetch/polyfill"),require("limiter"),require("exponential-backoff"),require("ethers"),require("@cowprotocol/app-data"),require("ethers/lib/utils"),require("deepmerge"),require("@ethersproject/abstract-signer"),require("@weiroll/weiroll.js"),require("graphql-request"),require("@openzeppelin/merkle-tree");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(P){throw console.error("Wallet not supported:",P),new r.CowError("Wallet not supported")}const w=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(w&&w.then?w.then(m):m(w))}catch(q){return Promise.reject(q)}},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-9a7618d8.js.map
|