@cowprotocol/cow-sdk 0.0.6 → 0.0.8-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.
Files changed (68) hide show
  1. package/.babelrc +4 -0
  2. package/.github/workflows/build.yml +50 -0
  3. package/.github/workflows/lint.yml +19 -0
  4. package/.github/workflows/publish.yml +5 -8
  5. package/.github/workflows/test.yml +47 -0
  6. package/README.md +34 -1
  7. package/babel.config.js +2 -5
  8. package/dist/CowSdk.d.ts +22 -0
  9. package/dist/{src/src/api → api}/cow/errors/OperatorError.d.ts +1 -1
  10. package/dist/{src/src/api → api}/cow/errors/QuoteError.d.ts +1 -1
  11. package/dist/{src/src/api → api}/cow/index.d.ts +8 -8
  12. package/dist/{src/src/api → api}/cow/types.d.ts +2 -2
  13. package/dist/api/index.d.ts +2 -0
  14. package/dist/api/metadata/index.d.ts +9 -0
  15. package/dist/api/metadata/types.d.ts +15 -0
  16. package/dist/{src/appData.schema-d44994e0.js → appData.schema-d44994e0.js} +0 -0
  17. package/dist/{src/appData.schema-d44994e0.js.map → appData.schema-d44994e0.js.map} +0 -0
  18. package/dist/{src/appData.schema-fb2df827.js → appData.schema-fb2df827.js} +0 -0
  19. package/dist/{src/appData.schema-fb2df827.js.map → appData.schema-fb2df827.js.map} +0 -0
  20. package/dist/{src/src/constants → constants}/chains.d.ts +0 -0
  21. package/dist/{src/src/constants → constants}/index.d.ts +1 -0
  22. package/dist/{src/src/constants → constants}/tokens.d.ts +2 -2
  23. package/dist/index.d.ts +4 -0
  24. package/dist/index.js +2 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/index.modern.js +2 -0
  27. package/dist/index.modern.js.map +1 -0
  28. package/dist/index.module.js +2 -0
  29. package/dist/index.module.js.map +1 -0
  30. package/dist/{src/src/types → types}/index.d.ts +2 -1
  31. package/dist/utils/appData.d.ts +10 -0
  32. package/dist/{src/src/utils → utils}/common.d.ts +2 -0
  33. package/dist/utils/context.d.ts +30 -0
  34. package/dist/{src/src/utils → utils}/sign.d.ts +1 -1
  35. package/dist/{src/src/utils → utils}/tokens.d.ts +1 -1
  36. package/package.json +22 -21
  37. package/src/CowSdk.ts +39 -17
  38. package/src/api/cow/errors/OperatorError.ts +5 -3
  39. package/src/api/cow/errors/QuoteError.ts +4 -3
  40. package/src/api/cow/index.ts +69 -45
  41. package/src/api/cow/types.ts +2 -2
  42. package/src/api/index.ts +1 -0
  43. package/src/api/metadata/index.ts +37 -0
  44. package/src/api/metadata/types.ts +17 -0
  45. package/src/constants/index.ts +2 -0
  46. package/src/constants/tokens.ts +2 -2
  47. package/src/index.ts +4 -4
  48. package/src/types/index.ts +2 -1
  49. package/src/utils/appData.spec.ts +44 -1
  50. package/src/utils/appData.ts +28 -2
  51. package/src/utils/common.ts +8 -0
  52. package/src/utils/context.ts +61 -14
  53. package/src/utils/price.ts +1 -1
  54. package/src/utils/sign.ts +5 -5
  55. package/src/utils/tokens.ts +2 -2
  56. package/src/workflows/publish.sh +4 -32
  57. package/tsconfig.json +5 -6
  58. package/dist/src/cow-sdk.esm.js +0 -2
  59. package/dist/src/cow-sdk.esm.js.map +0 -1
  60. package/dist/src/cow-sdk.js +0 -2
  61. package/dist/src/cow-sdk.js.map +0 -1
  62. package/dist/src/cow-sdk.modern.js +0 -2
  63. package/dist/src/cow-sdk.modern.js.map +0 -1
  64. package/dist/src/src/CowSdk.d.ts +0 -16
  65. package/dist/src/src/api/index.d.ts +0 -1
  66. package/dist/src/src/index.d.ts +0 -4
  67. package/dist/src/src/utils/appData.d.ts +0 -7
  68. package/dist/src/src/utils/context.d.ts +0 -24
package/.babelrc ADDED
@@ -0,0 +1,4 @@
1
+ {
2
+ "plugins": [["@babel/plugin-proposal-nullish-coalescing-operator"]]
3
+ }
4
+
@@ -0,0 +1,50 @@
1
+ name: Build
2
+
3
+ # Run on pushes to main or PRs
4
+ on:
5
+ # Pull request hook without any config. Launches for every pull request
6
+ pull_request:
7
+ # Launches for pushes to main or dev
8
+ push:
9
+ branches:
10
+ - main
11
+ # Launches build when release is published
12
+ release:
13
+ types: [published]
14
+
15
+ jobs:
16
+ build:
17
+ name: Build Package
18
+ runs-on: ubuntu-latest
19
+
20
+ steps:
21
+ - name: Cancel Previous Runs
22
+ uses: styfle/cancel-workflow-action@0.8.0
23
+ with:
24
+ access_token: ${{ github.token }}
25
+ - name: Remove broken apt repos [Ubuntu]
26
+ if: ${{ matrix.os }} == 'ubuntu-latest'
27
+ run: |
28
+ for apt_file in `grep -lr microsoft /etc/apt/sources.list.d/`; do sudo rm $apt_file; done
29
+ - uses: actions/checkout@v2
30
+ - name: Setup Node.js
31
+ uses: actions/setup-node@v2
32
+ with:
33
+ node-version: 14
34
+
35
+ - uses: actions/cache@v2
36
+ with:
37
+ path: '**/node_modules'
38
+ key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
39
+
40
+ - run: |
41
+ # Due to some dependencies yarn may randomly throw an error about invalid cache
42
+ # This approach is taken from https://github.com/yarnpkg/yarn/issues/7212#issuecomment-506155894 to fix the issue
43
+ # Another approach is to install with flag --network-concurrency 1, but this will make the installation pretty slow (default value is 8)
44
+ mkdir .yarncache
45
+ yarn install --cache-folder ./.yarncache --frozen-lockfile
46
+ rm -rf .yarncache
47
+ yarn cache clean
48
+
49
+ - name: Build app
50
+ run: yarn build
@@ -0,0 +1,19 @@
1
+ name: 'ESLint check'
2
+ on: [pull_request]
3
+
4
+ jobs:
5
+ eslint:
6
+ runs-on: ubuntu-latest
7
+ steps:
8
+ - uses: actions/checkout@v2
9
+ - uses: gnosis/safe-react-eslint-plus-action@v4.0.0
10
+ with:
11
+ issueSummary: true
12
+ issueSummaryType: compact
13
+ issueSummaryMethod: edit
14
+ reportSuggestions: true
15
+ reportIgnoredFiles: true
16
+ reportWarningsAsErrors: true
17
+ configFile: .eslintrc.json
18
+ useEslintrc: true
19
+ npmInstall: true
@@ -8,16 +8,13 @@ jobs:
8
8
  deploy:
9
9
  runs-on: ubuntu-latest
10
10
  steps:
11
- - uses: actions/checkout@v2
12
- - uses: actions/setup-node@v1
11
+ - uses: actions/checkout@v3
12
+ - uses: actions/setup-node@v3
13
13
  with:
14
14
  node-version: 14.x
15
+ registry-url: 'https://registry.npmjs.org'
16
+ scope: '@cowprotocol'
15
17
  - run: yarn --frozen-lockfile
16
18
  - run: bash src/workflows/publish.sh
17
19
  env:
18
- PUBLISH_SERVER: ${{ secrets.PUBLISH_SERVER }}
19
- GITLAB_TRIGGER_TOKEN: ${{ secrets.GITLAB_TRIGGER_TOKEN }}
20
- BUCKET_NAME: ${{ secrets.BUCKET_NAME }}
21
- AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
22
- AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
23
- AWS_REGION: ${{ secrets.AWS_REGION }}
20
+ NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
@@ -0,0 +1,47 @@
1
+ name: Unit tests
2
+ on:
3
+ pull_request:
4
+ push:
5
+ branches:
6
+ - main
7
+
8
+ jobs:
9
+ test:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - name: Cancel Previous Runs
13
+ uses: styfle/cancel-workflow-action@0.8.0
14
+ with:
15
+ access_token: ${{ github.token }}
16
+
17
+ - name: Checkout
18
+ uses: actions/checkout@v2
19
+
20
+ - name: Setup Node.js
21
+ uses: actions/setup-node@v2
22
+ with:
23
+ node-version: 14
24
+
25
+ - name: Yarn cache
26
+ uses: actions/cache@v2
27
+ with:
28
+ path: '**/node_modules'
29
+ key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
30
+
31
+ - name: Yarn install
32
+ run: |
33
+ mkdir .yarncache
34
+ yarn install --cache-folder ./.yarncache --frozen-lockfile
35
+ rm -rf .yarncache
36
+ yarn cache clean
37
+ - name: Run tests
38
+ run: 'npm run test'
39
+
40
+ - name: Comment in failing tests
41
+ uses: mattallty/jest-github-action@v1.0.3
42
+ if: failure()
43
+ env:
44
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
45
+ with:
46
+ test-command: 'echo unit tests already executed'
47
+ coverage-comment: false
package/README.md CHANGED
@@ -96,6 +96,40 @@ const orderId = await cowSdk.cowApi.sendOrder({
96
96
  console.log(`https://explorer.cow.fi/rinkeby/orders/${orderId}`)
97
97
  ```
98
98
 
99
+ SDK also includes a Metadata API to interact with AppData documents and IPFS CIDs
100
+
101
+ ```js
102
+ const chainId = 4 // Rinkeby
103
+ const cowSdk = new CowSdk(chainId)
104
+ let hash = '0xa6c81f4ca727252a05b108f1742a07430f28d474d2a3492d8f325746824d22e5'
105
+
106
+ // Decode AppData document given a CID hash
107
+ const appDataDoc = await cowSdk.metadataApi.decodeAppData(hash)
108
+ console.log(appDataDoc)
109
+ /* {
110
+ "appCode": "CowSwap",
111
+ "metadata": {
112
+ "referrer": {
113
+ "address": "0x1f5B740436Fc5935622e92aa3b46818906F416E9",
114
+ "version": "0.1.0"
115
+ }
116
+ },
117
+ "version": "0.1.0"
118
+ } */
119
+
120
+ const cid = 'QmUf2TrpSANVXdgcYfAAACe6kg551cY3rAemB7xfEMjYvs'
121
+
122
+ // Decode CID hash to AppData Hex
123
+ const decodedAppDataHex = await cowSdk.metadataApi.cidToAppDataHex(cid)
124
+ console.log(decodedAppDataHex) //0x5ddb2c8207c10b96fac92cb934ef9ba004bc007a073c9e5b13edc422f209ed80
125
+
126
+ hash = '0x5ddb2c8207c10b96fac92cb934ef9ba004bc007a073c9e5b13edc422f209ed80'
127
+
128
+ // Decode AppData Hex to CID
129
+ const decodedAppDataHex = await cowSdk.metadataApi.appDataHexToCid(hash)
130
+ console.log(decodedAppDataHex) //QmUf2TrpSANVXdgcYfAAACe6kg551cY3rAemB7xfEMjYvs
131
+ ```
132
+
99
133
  ### Install Dependencies
100
134
 
101
135
  ```bash
@@ -116,4 +150,3 @@ yarn start
116
150
  ```bash
117
151
  yarn test
118
152
  ```
119
-
package/babel.config.js CHANGED
@@ -1,6 +1,3 @@
1
1
  module.exports = {
2
- presets: [
3
- ['@babel/preset-env', {targets: {node: 'current'}}],
4
- '@babel/preset-typescript',
5
- ],
6
- };
2
+ presets: [['@babel/preset-env', { targets: { node: 'current' } }], '@babel/preset-typescript'],
3
+ }
@@ -0,0 +1,22 @@
1
+ import { Signer } from 'ethers';
2
+ import { LogLevelDesc } from 'loglevel';
3
+ import { CowApi, MetadataApi } from './api';
4
+ import { SupportedChainId as ChainId } from './constants/chains';
5
+ import { validateAppDataDocument } from './utils/appData';
6
+ import { Context, CowContext } from './utils/context';
7
+ import { UnsignedOrder } from './utils/sign';
8
+ declare type Options = {
9
+ loglevel?: LogLevelDesc;
10
+ };
11
+ export declare class CowSdk<T extends ChainId> {
12
+ context: Context;
13
+ cowApi: CowApi;
14
+ metadataApi: MetadataApi;
15
+ constructor(chainId: T, cowContext?: CowContext, options?: Options);
16
+ updateChainId: (chainId: ChainId) => void;
17
+ validateAppDataDocument: typeof validateAppDataDocument;
18
+ signOrder(order: Omit<UnsignedOrder, 'appData'>): Promise<import("./utils/sign").SigningResult>;
19
+ signOrderCancellation(orderId: string): Promise<import("./utils/sign").SigningResult>;
20
+ _checkSigner(signer?: Signer | undefined): Signer;
21
+ }
22
+ export default CowSdk;
@@ -1,4 +1,4 @@
1
- import { CowError } from '/utils/common';
1
+ import { CowError } from '../../../utils/common';
2
2
  declare type ApiActionType = 'get' | 'create' | 'delete';
3
3
  export interface ApiErrorObject {
4
4
  errorType: ApiErrorCodes;
@@ -1,4 +1,4 @@
1
- import { CowError } from '/utils/common';
1
+ import { CowError } from '../../../utils/common';
2
2
  import { ApiErrorObject } from './OperatorError';
3
3
  export interface GpQuoteErrorObject {
4
4
  errorType: GpQuoteErrorCodes;
@@ -1,13 +1,12 @@
1
- import { SupportedChainId as ChainId } from '/constants/chains';
2
- import { OrderCreation } from '/utils/sign';
3
- import { FeeQuoteParams, PriceInformation, PriceQuoteParams, SimpleGetQuoteResponse } from '/utils/price';
4
- import { GetOrdersParams, GetTradesParams, OrderCancellationParams, OrderID, OrderMetaData, ProfileData, TradeMetaData } from '/api/cow/types';
5
- import { Context } from '/utils/context';
6
- export declare class CowApi<T extends ChainId> {
7
- chainId: T;
1
+ import { SupportedChainId as ChainId } from '../../constants/chains';
2
+ import { OrderCreation } from '../../utils/sign';
3
+ import { FeeQuoteParams, PriceInformation, PriceQuoteParams, SimpleGetQuoteResponse } from '../../utils/price';
4
+ import { GetOrdersParams, GetTradesParams, OrderCancellationParams, OrderID, OrderMetaData, ProfileData, TradeMetaData } from './types';
5
+ import { Context } from '../../utils/context';
6
+ export declare class CowApi {
8
7
  context: Context;
9
8
  API_NAME: string;
10
- constructor(chainId: T, context: Context);
9
+ constructor(context: Context);
11
10
  get DEFAULT_HEADERS(): {
12
11
  'Content-Type': string;
13
12
  'X-AppId': string;
@@ -17,6 +16,7 @@ export declare class CowApi<T extends ChainId> {
17
16
  getProfileData(address: string): Promise<ProfileData | null>;
18
17
  getTrades(params: GetTradesParams): Promise<TradeMetaData[]>;
19
18
  getOrders(params: GetOrdersParams): Promise<OrderMetaData[]>;
19
+ getTxOrders(txHash: string): Promise<OrderMetaData[]>;
20
20
  getOrder(orderId: string): Promise<OrderMetaData | null>;
21
21
  getPriceQuoteLegacy(params: PriceQuoteParams): Promise<PriceInformation | null>;
22
22
  getQuote(params: FeeQuoteParams): Promise<SimpleGetQuoteResponse>;
@@ -1,6 +1,6 @@
1
1
  import { OrderKind } from '@gnosis.pm/gp-v2-contracts';
2
- import { SupportedChainId as ChainId } from '/constants/chains';
3
- import { OrderCancellation, SigningSchemeValue } from '/utils/sign';
2
+ import { SupportedChainId as ChainId } from '../../constants/chains';
3
+ import { OrderCancellation, SigningSchemeValue } from '../../utils/sign';
4
4
  /**
5
5
  * Unique identifier for the order, calculated by keccak256(orderDigest, ownerAddress, validTo),
6
6
  * where orderDigest = keccak256(orderStruct). bytes32.
@@ -0,0 +1,2 @@
1
+ export * from './cow';
2
+ export * from './metadata';
@@ -0,0 +1,9 @@
1
+ import { Context } from '../../utils/context';
2
+ import { AppDataDoc } from './types';
3
+ export declare class MetadataApi {
4
+ context: Context;
5
+ constructor(context: Context);
6
+ decodeAppData(hash: string): Promise<void | AppDataDoc>;
7
+ cidToAppDataHex(ipfsHash: string): Promise<string | void>;
8
+ appDataHexToCid(hash: string): Promise<string | void>;
9
+ }
@@ -0,0 +1,15 @@
1
+ interface Metadata {
2
+ version: string;
3
+ }
4
+ export interface ReferralMetadata extends Metadata {
5
+ address: string;
6
+ }
7
+ export declare type MetadataDoc = {
8
+ referrer?: ReferralMetadata;
9
+ };
10
+ export declare type AppDataDoc = {
11
+ version: string;
12
+ appCode?: string;
13
+ metadata: MetadataDoc;
14
+ };
15
+ export {};
@@ -1,3 +1,4 @@
1
1
  export declare const GP_SETTLEMENT_CONTRACT_ADDRESS: Partial<Record<number, string>>;
2
2
  export declare const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
3
3
  export declare const DEFAULT_APP_DATA_HASH = "0x0000000000000000000000000000000000000000000000000000000000000000";
4
+ export declare const DEFAULT_IPFS_GATEWAY_URI = "https://gnosis.mypinata.cloud/ipfs";
@@ -1,5 +1,5 @@
1
- import { SupportedChainId as ChainId } from '/constants/chains';
2
- import { Token } from '/types';
1
+ import { SupportedChainId as ChainId } from './chains';
2
+ import { Token } from '../types';
3
3
  export declare const XDAI_SYMBOL = "XDAI";
4
4
  export declare const WRAPPED_NATIVE_TOKEN: Record<ChainId, Token>;
5
5
  export declare const NATIVE: Record<ChainId, string>;
@@ -0,0 +1,4 @@
1
+ export { CowError } from './utils/common';
2
+ export { ALL_SUPPORTED_CHAIN_IDS } from './constants/chains';
3
+ export * from './types';
4
+ export { CowSdk } from './CowSdk';
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ var e=require("@gnosis.pm/gp-v2-contracts"),r=require("loglevel"),t=require("cross-fetch"),n=require("@gnosis.pm/gp-v2-contracts/networks.json"),o=require("ajv");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function s(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach(function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}}),r.default=e,r}var a=/*#__PURE__*/i(r),c=/*#__PURE__*/i(t),u=/*#__PURE__*/i(n),d=/*#__PURE__*/i(o);class l extends Error{constructor(e,r){super(e),this.error_code=void 0,this.error_code=r}}function h(e){if(!e)return"";const r=new URLSearchParams;for(const t of Object.keys(e)){const n=e[t];n&&r.append(t,n)}const t=r.toString();return t?`?${t}`:""}const f="cow-sdk:";var p;!function(e){e[e.MAINNET=1]="MAINNET",e[e.RINKEBY=4]="RINKEBY",e[e.GNOSIS_CHAIN=100]="GNOSIS_CHAIN"}(p||(p={}));const m=[p.MAINNET,p.RINKEBY,p.GNOSIS_CHAIN];class g{constructor(e,r){this.symbol=void 0,this.address=void 0,this.symbol=e,this.address=r}}const{GPv2Settlement:E}=u.default,v={[p.MAINNET]:E[p.MAINNET].address,[p.RINKEBY]:E[p.RINKEBY].address,[p.GNOSIS_CHAIN]:E[p.GNOSIS_CHAIN].address},P=function(r,t,n,o="v4"){try{let s;function i(e){return s?e:{signature:d.data.toString(),signingScheme:c}}const c="eth_sign"===o?e.SigningScheme.ETHSIGN:e.SigningScheme.EIP712;let u,d=null;try{switch(o){case"v3":u=new e.TypedDataV3Signer(n);break;case"int_v4":u=new e.IntChainIdTypedDataV4Signer(n);break;default:u=n}}catch(e){throw a.default.error(f,"Wallet not supported:",e),new l("Wallet not supported")}const h=function(e,n){try{var o=Promise.resolve(t({...r,signer:u,signingScheme:c})).then(function(e){d=e})}catch(e){return n(e)}return o&&o.then?o.then(void 0,n):o}(0,function(e){if(void 0===(i=e).code&&void 0===i.message)throw a.default.error(f,e),e;var i;if(e.code===N||D.test(e.message))switch(o){case"v4":const o=P(r,t,n,"v3");return s=1,o;case"v3":const i=P(r,t,n,"eth_sign");return s=1,i;default:throw e}else{if(_.test(e.message)){const e=P(r,t,n,"int_v4");return s=1,e}if(e.code===A){const e=P(r,t,n,"eth_sign");return s=1,e}if(w.test(e.message)){const e=P(r,t,n,"v3");return s=1,e}if(T.test(e.message)){const e=P(r,t,n,"eth_sign");return s=1,e}}});return Promise.resolve(h&&h.then?h.then(i):i(h))}catch(e){return Promise.reject(e)}},y=function(r){try{const{chainId:t,signer:n,signingScheme:o,orderId:i}=r,s=b(t);return Promise.resolve(e.signOrderCancellation(s,i,n,k(o)))}catch(e){return Promise.reject(e)}},I=function(r){try{const{chainId:t,signer:n,order:o,signingScheme:i}=r,s=b(t);return Promise.resolve(e.signOrder(s,o,n,k(i)))}catch(e){return Promise.reject(e)}},A=-32603,N=-32601,w=/eth_signTypedData_v4 does not exist/i,T=/eth_signTypedData_v3 does not exist/i,D=/RPC request failed/i,_=/provided chainid .* must match the active chainid/i,R=new Map([[e.SigningScheme.EIP712,{libraryValue:0,apiValue:"eip712"}],[e.SigningScheme.ETHSIGN,{libraryValue:1,apiValue:"ethsign"}],[e.SigningScheme.EIP1271,{libraryValue:2,apiValue:"eip1271"}],[e.SigningScheme.PRESIGN,{libraryValue:3,apiValue:"presign"}]]);function O(e){const r=R.get(e);if(void 0===r)throw new l("Unknown schema "+e);return r}function S(e){return O(e).apiValue}function k(e){return O(e).libraryValue}function b(r){const t=v[r];if(!t)throw new l("Unsupported network. Settlement contract is not deployed");return e.domain(r,t)}var x,C,j,U;!function(e){e.DuplicateOrder="DuplicateOrder",e.InvalidSignature="InvalidSignature",e.MissingOrderData="MissingOrderData",e.InsufficientValidTo="InsufficientValidTo",e.InsufficientAllowance="InsufficientAllowance",e.InsufficientBalance="InsufficientBalance",e.InsufficientFee="InsufficientFee",e.WrongOwner="WrongOwner",e.NotFound="NotFound",e.OrderNotFound="OrderNotFound",e.AlreadyCancelled="AlreadyCancelled",e.OrderFullyExecuted="OrderFullyExecuted",e.OrderExpired="OrderExpired",e.NoLiquidity="NoLiquidity",e.UnsupportedToken="UnsupportedToken",e.AmountIsZero="AmountIsZero",e.SellAmountDoesNotCoverFee="SellAmountDoesNotCoverFee",e.TransferEthToContract="TransferEthToContract",e.UNHANDLED_GET_ERROR="UNHANDLED_GET_ERROR",e.UNHANDLED_CREATE_ERROR="UNHANDLED_CREATE_ERROR",e.UNHANDLED_DELETE_ERROR="UNHANDLED_DELETE_ERROR"}(x||(x={})),function(e){e.DuplicateOrder="There was another identical order already submitted. Please try again.",e.InsufficientFee="The signed fee is insufficient. It's possible that is higher now due to a change in the gas price, ether price, or the sell token price. Please try again to get an updated fee quote.",e.InvalidSignature="The order signature is invalid. Check whether your Wallet app supports off-chain signing.",e.MissingOrderData="The order has missing information",e.InsufficientValidTo="The order you are signing is already expired. This can happen if you set a short expiration in the settings and waited too long before signing the transaction. Please try again.",e.InsufficientAllowance="The account doesn't have enough funds",e.InsufficientBalance="The account needs to approve the selling token in order to trade",e.WrongOwner="The signature is invalid.\n\nIt's likely that the signing method provided by your wallet doesn't comply with the standards required by CowSwap.\n\nCheck whether your Wallet app supports off-chain signing (EIP-712 or ETHSIGN).",e.NotFound="Token pair selected has insufficient liquidity",e.OrderNotFound="The order you are trying to cancel does not exist",e.AlreadyCancelled="Order is already cancelled",e.OrderFullyExecuted="Order is already filled",e.OrderExpired="Order is expired",e.NoLiquidity="Token pair selected has insufficient liquidity",e.UnsupportedToken="One of the tokens you are trading is unsupported. Please read the FAQ for more info.",e.AmountIsZero="Amount is zero",e.SellAmountDoesNotCoverFee="Sell amount does not sufficiently cover the current fee",e.TransferEthToContract="Sending the native currency to smart contract wallets is not currently supported",e.UNHANDLED_GET_ERROR="Order fetch failed. This may be due to a server or network connectivity issue. Please try again later.",e.UNHANDLED_CREATE_ERROR="The order was not accepted by the network",e.UNHANDLED_DELETE_ERROR="The order cancellation was not accepted by the network"}(C||(C={}));class L extends l{static getErrorMessage(e,r){try{return Promise.resolve(function(r,t){try{var n=Promise.resolve(e.json()).then(function(e){return e.errorType?L.apiErrorDetails[e.errorType]||e.errorType:(a.default.error(f,"Unknown reason for bad order submission",e),e.description)})}catch(e){return t()}return n&&n.then?n.then(void 0,t):n}(0,function(){return a.default.error(f,"Error handling a 400 error. Likely a problem deserialising the JSON response"),function(e){switch(e){case"get":return C.UNHANDLED_GET_ERROR;case"create":return C.UNHANDLED_CREATE_ERROR;case"delete":return C.UNHANDLED_DELETE_ERROR;default:return a.default.error(f,"[OperatorError::_mapActionToErrorDetails] Uncaught error mapping error action type to server error. Please try again later."),"Something failed. Please try again later."}}(r)}))}catch(e){return Promise.reject(e)}}static getErrorFromStatusCode(e,r){try{const t=this;switch(e.status){case 400:case 404:return Promise.resolve(t.getErrorMessage(e,r));case 403:return Promise.resolve(`The order cannot be ${"create"===r?"accepted":"cancelled"}. Your account is deny-listed.`);case 429:return Promise.resolve(`The order cannot be ${"create"===r?"accepted. Too many order placements":"cancelled. Too many order cancellations"}. Please, retry in a minute`);default:return a.default.error(f,`[OperatorError::getErrorFromStatusCode] Error ${"create"===r?"creating":"cancelling"} the order, status code:`,e.status||"unknown"),Promise.resolve(`Error ${"create"===r?"creating":"cancelling"} the order`)}return Promise.resolve()}catch(e){return Promise.reject(e)}}constructor(e){super(e.description,e.errorType),this.name="OperatorError",this.description=void 0,this.description=e.description,this.message=C[e.errorType]}}L.apiErrorDetails=C,function(e){e.UnsupportedToken="UnsupportedToken",e.InsufficientLiquidity="InsufficientLiquidity",e.FeeExceedsFrom="FeeExceedsFrom",e.ZeroPrice="ZeroPrice",e.UNHANDLED_ERROR="UNHANDLED_ERROR"}(j||(j={})),function(e){e.UnsupportedToken="One of the tokens you are trading is unsupported. Please read the FAQ for more info.",e.InsufficientLiquidity="Token pair selected has insufficient liquidity",e.FeeExceedsFrom='Current fee exceeds entered "from" amount',e.ZeroPrice="Quoted price is zero. This is likely due to a significant price difference between the two tokens. Please try increasing amounts.",e.UNHANDLED_ERROR="Quote fetch failed. This may be due to a server or network connectivity issue. Please try again later."}(U||(U={}));class H extends l{static getErrorMessage(e){try{return Promise.resolve(function(r,t){try{var n=Promise.resolve(e.json()).then(function(e){return e.errorType?H.quoteErrorDetails[e.errorType]||e.errorType:(a.default.error(f,"Unknown reason for bad quote fetch",e),e.description)})}catch(e){return t()}return n&&n.then?n.then(void 0,t):n}(0,function(){return a.default.error(f,"Error handling 400/404 error. Likely a problem deserialising the JSON response"),H.quoteErrorDetails.UNHANDLED_ERROR}))}catch(e){return Promise.reject(e)}}static getErrorFromStatusCode(e){try{const r=this;switch(e.status){case 400:case 404:return Promise.resolve(r.getErrorMessage(e));default:return a.default.error(f,"[QuoteError::getErrorFromStatusCode] Error fetching quote, status code:",e.status||"unknown"),Promise.resolve("Error fetching quote")}return Promise.resolve()}catch(e){return Promise.reject(e)}}constructor(e){super(e.description,e.errorType),this.name="QuoteErrorObject",this.description=void 0,this.data=void 0,this.description=e.description,this.message=H.quoteErrorDetails[e.errorType],this.data=null==e?void 0:e.data}}H.quoteErrorDetails=U;const F={[p.MAINNET]:new g("WETH","0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"),[p.RINKEBY]:new g("WETH","0xc778417E063141139Fce010982780140Aa0cD5Ab"),[p.GNOSIS_CHAIN]:new g("WXDAI","0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d")},$={[p.MAINNET]:"ETH",[p.RINKEBY]:"ETH",[p.GNOSIS_CHAIN]:"XDAI"};function q(e,r){let t=e;return e===$[r]&&(t=F[r].address),t}function M(e,r){try{var t=e()}catch(e){return r(e)}return t&&t.then?t.then(void 0,r):t}const G=function(e,r){try{return e.ok?Promise.resolve(e.json()):Promise.resolve(e.json()).then(function(e){const t=function(e){switch(null==e?void 0:e.errorType){case x.NotFound:case x.NoLiquidity:return{errorType:j.InsufficientLiquidity,description:U.InsufficientLiquidity};case x.SellAmountDoesNotCoverFee:return{errorType:j.FeeExceedsFrom,description:U.FeeExceedsFrom,data:null==e?void 0:e.data};case x.UnsupportedToken:return{errorType:j.UnsupportedToken,description:e.description};case x.SellAmountDoesNotCoverFee:return{errorType:j.FeeExceedsFrom,description:e.description};default:return{errorType:j.UNHANDLED_ERROR,description:U.UNHANDLED_ERROR}}}(e),n=new H(t);if(r){const{sellToken:e,buyToken:t}=r;a.default.error(f,`Error querying fee from API - sellToken: ${e}, buyToken: ${t}`)}throw n})}catch(e){return Promise.reject(e)}},B={errorType:j.UNHANDLED_ERROR,description:U.UNHANDLED_ERROR},V={errorType:x.UNHANDLED_CREATE_ERROR,description:C.UNHANDLED_CREATE_ERROR};class K{constructor(e){this.context=void 0,this.API_NAME="CoW Protocol",this.context=e}get DEFAULT_HEADERS(){return{"Content-Type":"application/json","X-AppId":this.context.appDataHash}}get API_BASE_URL(){return this.context.isDevEnvironment?{[p.MAINNET]:"https://barn.api.cow.fi/mainnet/api",[p.RINKEBY]:"https://barn.api.cow.fi/rinkeby/api",[p.GNOSIS_CHAIN]:"https://barn.api.cow.fi/xdai/api"}:{[p.MAINNET]:"https://api.cow.fi/mainnet/api",[p.RINKEBY]:"https://api.cow.fi/rinkeby/api",[p.GNOSIS_CHAIN]:"https://api.cow.fi/xdai/api"}}get PROFILE_API_BASE_URL(){return this.context.isDevEnvironment?{[p.MAINNET]:"https://barn.api.cow.fi/affiliate/api"}:{[p.MAINNET]:"https://api.cow.fi/affiliate/api"}}getProfileData(e){try{const r=this;return Promise.resolve(r.context.chainId).then(function(t){return a.default.debug(f,`[api:${r.API_NAME}] Get profile data for`,t,e),t!==p.MAINNET?(a.default.info(f,"Profile data is only available for mainnet"),null):Promise.resolve(r.getProfile(`/profile/${e}`)).then(function(e){return e.ok?e.json():Promise.resolve(e.json()).then(function(e){throw a.default.error(f,e),new l(null==e?void 0:e.description)})})})}catch(e){return Promise.reject(e)}}getTrades(e){try{const r=this,{owner:t,limit:n,offset:o}=e,i=h({owner:t,limit:n,offset:o});return Promise.resolve(r.context.chainId).then(function(e){return a.default.debug(f,"[util:operator] Get trades for",e,t,{limit:n,offset:o}),M(function(){return Promise.resolve(r.get(`/trades${i}`)).then(function(e){return e.ok?e.json():Promise.resolve(e.json()).then(function(e){throw new l(e)})})},function(e){throw a.default.error(f,"Error getting trades:",e),new l("Error getting trades: "+e)})})}catch(e){return Promise.reject(e)}}getOrders(e){try{const r=this,{owner:t,limit:n=1e3,offset:o=0}=e,i=h({limit:n,offset:o});return Promise.resolve(r.context.chainId).then(function(e){return a.default.debug(f,`[api:${r.API_NAME}] Get orders for `,e,t,n,o),M(function(){return Promise.resolve(r.get(`/account/${t}/orders/${i}`)).then(function(e){return e.ok?e.json():Promise.resolve(e.json()).then(function(e){throw new L(e)})})},function(e){throw a.default.error(f,"Error getting orders information:",e),new L(V)})})}catch(e){return Promise.reject(e)}}getTxOrders(e){try{const r=this;return Promise.resolve(r.context.chainId).then(function(t){return a.default.debug(`[api:${r.API_NAME}] Get tx orders for `,t,e),M(function(){return Promise.resolve(r.get(`/transactions/${e}/orders`)).then(function(e){return e.ok?e.json():Promise.resolve(e.json()).then(function(e){throw new L(e)})})},function(e){if(a.default.error("Error getting transaction orders information:",e),e instanceof L)throw e;throw new L(V)})})}catch(e){return Promise.reject(e)}}getOrder(e){try{const r=this;return Promise.resolve(r.context.chainId).then(function(t){return a.default.debug(f,`[api:${r.API_NAME}] Get order for `,t,e),M(function(){return Promise.resolve(r.get(`/orders/${e}`)).then(function(e){return e.ok?e.json():Promise.resolve(e.json()).then(function(e){throw new L(e)})})},function(e){throw a.default.error(f,"Error getting order information:",e),new L(V)})})}catch(e){return Promise.reject(e)}}getPriceQuoteLegacy(e){try{const r=this,{baseToken:t,quoteToken:n,amount:o,kind:i}=e;return Promise.resolve(r.context.chainId).then(function(s){return a.default.debug(f,`[api:${r.API_NAME}] Get price from API`,e,"for",s),Promise.resolve(r.get(`/markets/${q(t,s)}-${q(n,s)}/${i}/${o}`).catch(e=>{throw a.default.error(f,"Error getting price quote:",e),new H(B)})).then(G)})}catch(e){return Promise.reject(e)}}getQuote(e){try{const r=this;return Promise.resolve(r.context.chainId).then(function(t){const n=r.mapNewToLegacyParams(e,t);return Promise.resolve(r.post("/quote",n)).then(G)})}catch(e){return Promise.reject(e)}}sendSignedOrderCancellation(e){try{const r=this,{cancellation:t,owner:n}=e;return Promise.resolve(r.context.chainId).then(function(e){return a.default.debug(f,`[api:${r.API_NAME}] Delete signed order for network`,e,t),Promise.resolve(r.delete(`/orders/${t.orderUid}`,{signature:t.signature,signingScheme:S(t.signingScheme),from:n})).then(function(n){function o(n){a.default.debug(f,`[api:${r.API_NAME}] Cancelled order`,t.orderUid,e)}const i=function(){if(!n.ok)return Promise.resolve(L.getErrorFromStatusCode(n,"delete")).then(function(e){throw new l(e)})}();return i&&i.then?i.then(o):o()})})}catch(e){return Promise.reject(e)}}sendOrder(e){try{const r=this,t={...e.order,appData:r.context.appDataHash};return Promise.resolve(r.context.chainId).then(function(n){const{owner:o}=e;return a.default.debug(f,`[api:${r.API_NAME}] Post signed order for network`,n,t),Promise.resolve(r.post("/orders",{...t,signingScheme:S(t.signingScheme),from:o})).then(function(e){function t(t){return Promise.resolve(e.json()).then(function(e){return a.default.debug(f,`[api:${r.API_NAME}] Success posting the signed order`,e),e})}const n=function(){if(!e.ok)return Promise.resolve(L.getErrorFromStatusCode(e,"create")).then(function(e){throw new l(e)})}();return n&&n.then?n.then(t):t()})})}catch(e){return Promise.reject(e)}}getOrderLink(e){return this.getApiBaseUrl()+`/orders/${e}`}mapNewToLegacyParams(r,t){const{amount:n,kind:o,userAddress:i,receiver:s,validTo:a,sellToken:c,buyToken:u}=r,d=i||"0x0000000000000000000000000000000000000000",l={sellToken:q(c,t),buyToken:q(u,t),from:d,receiver:s||d,appData:this.context.appDataHash,validTo:a,partiallyFillable:!1};return o===e.OrderKind.SELL?{kind:e.OrderKind.SELL,sellAmountBeforeFee:n,...l}:{kind:e.OrderKind.BUY,buyAmountAfterFee:n,...l}}getApiBaseUrl(){try{const e=this;return Promise.resolve(e.context.chainId).then(function(r){const t=e.API_BASE_URL[r];if(t)return t+"/v1";throw new l(`Unsupported Network. The ${e.API_NAME} API is not deployed in the Network `+r)})}catch(e){return Promise.reject(e)}}getProfileApiBaseUrl(){try{const e=this;return Promise.resolve(e.context.chainId).then(function(r){const t=e.PROFILE_API_BASE_URL[r];if(t)return t+"/v1";throw new l(`Unsupported Network. The ${e.API_NAME} API is not deployed in the Network `+r)})}catch(e){return Promise.reject(e)}}fetch(e,r,t){try{const n=this;return Promise.resolve(n.getApiBaseUrl()).then(function(o){return c.default(o+e,{headers:n.DEFAULT_HEADERS,method:r,body:void 0!==t?JSON.stringify(t):t})})}catch(e){return Promise.reject(e)}}fetchProfile(e,r,t){try{const n=this;return Promise.resolve(n.getProfileApiBaseUrl()).then(function(o){return c.default(o+e,{headers:n.DEFAULT_HEADERS,method:r,body:void 0!==t?JSON.stringify(t):t})})}catch(e){return Promise.reject(e)}}post(e,r){return this.fetch(e,"POST",r)}get(e){return this.fetch(e,"GET")}getProfile(e){return this.fetchProfile(e,"GET")}delete(e,r){return this.fetch(e,"DELETE",r)}}const W=function(e){try{return Promise.resolve(Q()).then(function({ajv:r,validate:t}){var n;return{result:!!t(e),errors:null!==(n=r.errors)&&void 0!==n?n:void 0}})}catch(e){return Promise.reject(e)}},Y=function(e){try{const r=1,t=112,n=18,o=32,i=function(e){const r=e.match(/.{1,2}/g);if(r)return new Uint8Array(r.map(e=>parseInt(e,16)))}(e.replace(/(^0x)/,""));if(!i)return Promise.resolve();const a=Uint8Array.from([r,t,n,o,...i]);return Promise.resolve(Promise.resolve().then(function(){/*#__PURE__*/return s(require("multiformats/cid"))})).then(function({CID:e}){return e.decode(a).toV0().toString()})}catch(e){return Promise.reject(e)}},Q=function(){try{function e(){return{ajv:z,validate:Z}}z||(z=new d.default);const r=function(){if(!Z)return Promise.resolve(Promise.resolve().then(function(){return require("./appData.schema-d44994e0.js")})).then(function(e){Z=z.compile(e)})}();return Promise.resolve(r&&r.then?r.then(e):e())}catch(e){return Promise.reject(e)}};let Z,z;class J{constructor(e){this.context=void 0,this.context=e}decodeAppData(e){try{return Promise.resolve(function(r,t){try{var n=Promise.resolve(Y(e)).then(function(e){if(!e)throw new l("Error getting serialized CID");return Promise.resolve(function(e,r="https://gnosis.mypinata.cloud/ipfs"){try{return Promise.resolve(Promise.resolve().then(function(){/*#__PURE__*/return s(require("cross-fetch"))})).then(function({default:t}){return Promise.resolve(t(`${r}/${e}`)).then(function(e){return Promise.resolve(e.json())})})}catch(e){return Promise.reject(e)}}(e))})}catch(e){return t(e)}return n&&n.then?n.then(void 0,t):n}(0,function(e){throw a.default.error("Error decoding AppData:",e),new l("Error decoding AppData: "+e)}))}catch(e){return Promise.reject(e)}}cidToAppDataHex(e){try{return Promise.resolve(Promise.resolve().then(function(){/*#__PURE__*/return s(require("multiformats/cid"))})).then(function({CID:r}){const{digest:t}=r.parse(e).multihash;return`0x${Buffer.from(t).toString("hex")}`})}catch(e){return Promise.reject(e)}}appDataHexToCid(e){try{return Promise.resolve(Y(e)).then(function(e){if(!e)throw new l("Error getting serialized CID");return e})}catch(e){return Promise.reject(e)}}}var X=0;function ee(e){return"__private_"+X+++"_"+e}function re(e,r){if(!Object.prototype.hasOwnProperty.call(e,r))throw new TypeError("attempted to use private field on non-instance");return e}const te={appDataHash:"0x0000000000000000000000000000000000000000000000000000000000000000",isDevEnvironment:!1,ipfsUri:"https://gnosis.mypinata.cloud/ipfs"};var ne=/*#__PURE__*/ee("context"),oe=/*#__PURE__*/ee("chainId");class ie{constructor(e,r){Object.defineProperty(this,ne,{writable:!0,value:void 0}),Object.defineProperty(this,oe,{writable:!0,value:void 0}),re(this,oe)[oe]=this.updateChainId(e),re(this,ne)[ne]={...te,...r}}updateChainId(e){if(!p[e])throw new l(`Invalid chainId: ${e}`);return a.default.debug(f,`Updating chainId to: ${e}`),re(this,oe)[oe]=e,e}get chainId(){const e=this;var r;const t=null==(r=re(this,ne)[ne].signer)?void 0:r.provider;return t?(a.default.debug(f,"Getting chainId from provider"),function(){try{return Promise.resolve(t.getNetwork()).then(function(r){const t=r.chainId;return t!==re(e,oe)[oe]&&(a.default.debug(f,`ChainId mismatch: Provider's chainId: ${t} vs Context's chainId: ${re(e,oe)[oe]}. Updating Context's chainId`),e.updateChainId(t)),t})}catch(e){return Promise.reject(e)}}()):Promise.resolve(re(this,oe)[oe])}get appDataHash(){var e;return null!==(e=re(this,ne)[ne].appDataHash)&&void 0!==e?e:te.appDataHash}get isDevEnvironment(){var e;return null!==(e=re(this,ne)[ne].isDevEnvironment)&&void 0!==e?e:te.isDevEnvironment}get signer(){return re(this,ne)[ne].signer}get ipfsUri(){var e;return null!==(e=re(this,ne)[ne].ipfsUri)&&void 0!==e?e:te.ipfsUri}}Object.defineProperty(exports,"OrderKind",{enumerable:!0,get:function(){return e.OrderKind}}),exports.ALL_SUPPORTED_CHAIN_IDS=m,exports.CowError=l,exports.CowSdk=class{constructor(e,r={},t={}){this.context=void 0,this.cowApi=void 0,this.metadataApi=void 0,this.updateChainId=e=>{this.context.updateChainId(e)},this.validateAppDataDocument=W,this.context=new ie(e,{...r}),this.cowApi=new K(this.context),this.metadataApi=new J(this.context),a.default.setLevel(t.loglevel||"error")}signOrder(e){try{const r=this,t=r._checkSigner();return Promise.resolve(r.context.chainId).then(function(n){return function(e,r,t){return P({order:e,chainId:r},I,t)}({...e,appData:r.context.appDataHash},n,t)})}catch(e){return Promise.reject(e)}}signOrderCancellation(e){try{const r=this,t=r._checkSigner();return Promise.resolve(r.context.chainId).then(function(r){return function(e,r,t){return P({orderId:e,chainId:r},y,t)}(e,r,t)})}catch(e){return Promise.reject(e)}}_checkSigner(e=this.context.signer){if(!e)throw new l("No signer available");return e}},exports.Token=g;
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/utils/common.ts","../src/constants/chains.ts","../src/types/index.ts","../src/constants/index.ts","../src/utils/sign.ts","../src/api/cow/errors/OperatorError.ts","../src/api/cow/errors/QuoteError.ts","../src/constants/tokens.ts","../src/utils/tokens.ts","../src/api/cow/index.ts","../src/utils/appData.ts","../src/api/metadata/index.ts","../src/utils/context.ts","../src/CowSdk.ts"],"sourcesContent":["export class CowError extends Error {\n error_code?: string\n\n constructor(message: string, error_code?: string) {\n super(message)\n this.error_code = error_code\n }\n}\n\nexport function objectToQueryString(o: any): string {\n if (!o) {\n return ''\n }\n\n const qs = new URLSearchParams()\n\n for (const key of Object.keys(o)) {\n const value = o[key]\n if (value) {\n qs.append(key, value)\n }\n }\n\n const qsResult = qs.toString()\n\n return qsResult ? `?${qsResult}` : ''\n}\n\nexport const logPrefix = 'cow-sdk:'\n\nexport function fromHexString(hexString: string) {\n const stringMatch = hexString.match(/.{1,2}/g)\n if (!stringMatch) return\n return new Uint8Array(stringMatch.map((byte) => parseInt(byte, 16)))\n}\n","export enum SupportedChainId {\n MAINNET = 1,\n RINKEBY = 4,\n GNOSIS_CHAIN = 100,\n}\n\nexport const ALL_SUPPORTED_CHAIN_IDS: SupportedChainId[] = [\n SupportedChainId.MAINNET,\n SupportedChainId.RINKEBY,\n SupportedChainId.GNOSIS_CHAIN,\n]\n","export * from '../api/cow/types'\nexport * from '../api/metadata/types'\nexport { OrderKind } from '@gnosis.pm/gp-v2-contracts'\nexport class Token {\n constructor(public symbol: string, public address: string) {}\n}\n","import contractNetworks from '@gnosis.pm/gp-v2-contracts/networks.json'\nimport { SupportedChainId as ChainId } from './chains'\n\nconst { GPv2Settlement } = contractNetworks\n\nexport const GP_SETTLEMENT_CONTRACT_ADDRESS: Partial<Record<number, string>> = {\n [ChainId.MAINNET]: GPv2Settlement[ChainId.MAINNET].address,\n [ChainId.RINKEBY]: GPv2Settlement[ChainId.RINKEBY].address,\n [ChainId.GNOSIS_CHAIN]: GPv2Settlement[ChainId.GNOSIS_CHAIN].address,\n}\n\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'\n\nexport const DEFAULT_APP_DATA_HASH = '0x0000000000000000000000000000000000000000000000000000000000000000'\n\nexport const DEFAULT_IPFS_GATEWAY_URI = 'https://gnosis.mypinata.cloud/ipfs'\n","import {\n domain as domainGp,\n signOrder as signOrderGp,\n signOrderCancellation as signOrderCancellationGp,\n EcdsaSignature,\n Order,\n OrderCancellation as OrderCancellationGp,\n Signature,\n TypedDataV3Signer,\n IntChainIdTypedDataV4Signer,\n SigningScheme,\n} from '@gnosis.pm/gp-v2-contracts'\nimport log from 'loglevel'\n\nimport { SupportedChainId as ChainId } from '../constants/chains'\nimport { GP_SETTLEMENT_CONTRACT_ADDRESS } from '../constants'\nimport { TypedDataDomain, Signer } from '@ethersproject/abstract-signer'\nimport { CowError, logPrefix } from './common'\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\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\nexport type UnsignedOrder = Omit<Order, 'receiver'> & { receiver: string }\n\nexport interface SignOrderParams {\n chainId: ChainId\n signer: Signer\n order: UnsignedOrder\n signingScheme: SigningScheme\n}\n\n// posted to /api/v1/orders on Order creation\n// serializable, so no BigNumbers\n// See https://protocol-rinkeby.dev.gnosisdev.com/api/\nexport interface OrderCreation extends UnsignedOrder {\n signingScheme: SigningScheme // signed method\n\n // Signature is used for:\n // - Signature: EIP-712,ETHSIGN\n // - Owner address: for PRESIGN\n signature: string // 65 bytes encoded as hex without `0x` prefix. r + s + v from the spec\n}\n\nexport interface SingOrderCancellationParams {\n chainId: ChainId\n signer: Signer\n orderId: string\n signingScheme: SigningScheme\n}\n\nexport interface OrderCancellation extends OrderCancellationGp {\n signature: string\n signingScheme: SigningScheme\n}\n\nexport type SigningSchemeValue = 'eip712' | 'ethsign' | 'eip1271' | 'presign'\n\ninterface SchemaInfo {\n libraryValue: number\n apiValue: SigningSchemeValue\n}\nconst mapSigningSchema: Map<SigningScheme, SchemaInfo> = new Map([\n [SigningScheme.EIP712, { libraryValue: 0, apiValue: 'eip712' }],\n [SigningScheme.ETHSIGN, { libraryValue: 1, apiValue: 'ethsign' }],\n [SigningScheme.EIP1271, { libraryValue: 2, apiValue: 'eip1271' }],\n [SigningScheme.PRESIGN, { libraryValue: 3, apiValue: 'presign' }],\n])\n\nfunction _getSigningSchemeInfo(ecdaSigningScheme: SigningScheme): SchemaInfo {\n const value = mapSigningSchema.get(ecdaSigningScheme)\n if (value === undefined) {\n throw new CowError('Unknown schema ' + ecdaSigningScheme)\n }\n\n return value\n}\n\ninterface ProviderRpcError extends Error {\n message: string\n code: number\n data?: unknown\n}\n\nfunction isProviderRpcError(error: unknown): error is ProviderRpcError {\n return (error as ProviderRpcError).code !== undefined || (error as ProviderRpcError).message !== undefined\n}\n\nexport function getSigningSchemeApiValue(ecdaSigningScheme: SigningScheme): string {\n return _getSigningSchemeInfo(ecdaSigningScheme).apiValue\n}\n\nexport function getSigningSchemeLibValue(ecdaSigningScheme: SigningScheme): number {\n return _getSigningSchemeInfo(ecdaSigningScheme).libraryValue\n}\n\nfunction _getDomain(chainId: ChainId): TypedDataDomain {\n // Get settlement contract address\n const settlementContract = GP_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\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, signer, getSigningSchemeLibValue(signingScheme))\n}\n\nasync function _signOrderCancellation(params: SingOrderCancellationParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderId } = params\n\n const domain = _getDomain(chainId)\n\n return signOrderCancellationGp(domain, orderId, signer, getSigningSchemeLibValue(signingScheme))\n}\n\nexport type SigningResult = { signature: string; signingScheme: SigningScheme }\n\nasync function _signPayload(\n payload: any,\n signFn: typeof _signOrder | typeof _signOrderCancellation,\n signer: Signer,\n signingMethod: 'v4' | 'int_v4' | 'v3' | 'eth_sign' = 'v4'\n): Promise<SigningResult> {\n const signingScheme = signingMethod === 'eth_sign' ? SigningScheme.ETHSIGN : SigningScheme.EIP712\n let signature: Signature | null = null\n\n let _signer\n try {\n switch (signingMethod) {\n case 'v3':\n _signer = new TypedDataV3Signer(signer)\n break\n case 'int_v4':\n _signer = new IntChainIdTypedDataV4Signer(signer)\n break\n default:\n _signer = signer\n }\n } catch (e) {\n log.error(logPrefix, '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 } catch (e) {\n if (!isProviderRpcError(e)) {\n // Some other error signing. Let it bubble up.\n log.error(logPrefix, e)\n throw e\n }\n\n if (e.code === METHOD_NOT_FOUND_ERROR_CODE || RPC_REQUEST_FAILED_REGEX.test(e.message)) {\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, '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 }\n }\n return { signature: signature!.data.toString(), signingScheme }\n}\n/**\n * Returns the signature for the specified order with the signing scheme encoded\n * into the signature.\n * @export\n * @param {UnsignedOrder} order The order to sign.\n * @param {ChainId} 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(order: UnsignedOrder, chainId: ChainId, signer: Signer): 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 *\n * @export\n * @param {string} orderId The unique identifier of the order being cancelled.\n * @param {ChainId} 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(orderId: string, chainId: ChainId, signer: Signer): Promise<SigningResult> {\n return _signPayload({ orderId, chainId }, _signOrderCancellation, signer)\n}\n","import log from 'loglevel'\nimport { CowError, logPrefix } from '../../../utils/common'\n\ntype ApiActionType = 'get' | 'create' | 'delete'\n\nexport interface ApiErrorObject {\n errorType: ApiErrorCodes\n description: string\n data?: any\n}\n\n// Conforms to backend API\n// https://github.com/gnosis/gp-v2-services/blob/d932e11c9a2125fdba239530be7684799f694909/crates/orderbook/openapi.yml#L801\n// and\n// https://github.com/gnosis/gp-v2-services/blob/d932e11c9a2125fdba239530be7684799f694909/crates/orderbook/openapi.yml#L740\nexport enum ApiErrorCodes {\n DuplicateOrder = 'DuplicateOrder',\n InvalidSignature = 'InvalidSignature',\n MissingOrderData = 'MissingOrderData',\n InsufficientValidTo = 'InsufficientValidTo',\n InsufficientAllowance = 'InsufficientAllowance',\n InsufficientBalance = 'InsufficientBalance',\n InsufficientFee = 'InsufficientFee',\n WrongOwner = 'WrongOwner',\n NotFound = 'NotFound',\n OrderNotFound = 'OrderNotFound',\n AlreadyCancelled = 'AlreadyCancelled',\n OrderFullyExecuted = 'OrderFullyExecuted',\n OrderExpired = 'OrderExpired',\n NoLiquidity = 'NoLiquidity',\n UnsupportedToken = 'UnsupportedToken',\n AmountIsZero = 'AmountIsZero',\n SellAmountDoesNotCoverFee = 'SellAmountDoesNotCoverFee',\n TransferEthToContract = 'TransferEthToContract',\n UNHANDLED_GET_ERROR = 'UNHANDLED_GET_ERROR',\n UNHANDLED_CREATE_ERROR = 'UNHANDLED_CREATE_ERROR',\n UNHANDLED_DELETE_ERROR = 'UNHANDLED_DELETE_ERROR',\n}\n\nexport enum ApiErrorCodeDetails {\n DuplicateOrder = 'There was another identical order already submitted. Please try again.',\n InsufficientFee = \"The signed fee is insufficient. It's possible that is higher now due to a change in the gas price, ether price, or the sell token price. Please try again to get an updated fee quote.\",\n InvalidSignature = 'The order signature is invalid. Check whether your Wallet app supports off-chain signing.',\n MissingOrderData = 'The order has missing information',\n InsufficientValidTo = 'The order you are signing is already expired. This can happen if you set a short expiration in the settings and waited too long before signing the transaction. Please try again.',\n InsufficientAllowance = \"The account doesn't have enough funds\",\n InsufficientBalance = 'The account needs to approve the selling token in order to trade',\n WrongOwner = \"The signature is invalid.\\n\\nIt's likely that the signing method provided by your wallet doesn't comply with the standards required by CowSwap.\\n\\nCheck whether your Wallet app supports off-chain signing (EIP-712 or ETHSIGN).\",\n NotFound = 'Token pair selected has insufficient liquidity',\n OrderNotFound = 'The order you are trying to cancel does not exist',\n AlreadyCancelled = 'Order is already cancelled',\n OrderFullyExecuted = 'Order is already filled',\n OrderExpired = 'Order is expired',\n NoLiquidity = 'Token pair selected has insufficient liquidity',\n UnsupportedToken = 'One of the tokens you are trading is unsupported. Please read the FAQ for more info.',\n AmountIsZero = 'Amount is zero',\n SellAmountDoesNotCoverFee = 'Sell amount does not sufficiently cover the current fee',\n TransferEthToContract = 'Sending the native currency to smart contract wallets is not currently supported',\n UNHANDLED_GET_ERROR = 'Order fetch failed. This may be due to a server or network connectivity issue. Please try again later.',\n UNHANDLED_CREATE_ERROR = 'The order was not accepted by the network',\n UNHANDLED_DELETE_ERROR = 'The order cancellation was not accepted by the network',\n}\n\nfunction _mapActionToErrorDetail(action?: ApiActionType) {\n switch (action) {\n case 'get':\n return ApiErrorCodeDetails.UNHANDLED_GET_ERROR\n case 'create':\n return ApiErrorCodeDetails.UNHANDLED_CREATE_ERROR\n case 'delete':\n return ApiErrorCodeDetails.UNHANDLED_DELETE_ERROR\n default:\n log.error(\n logPrefix,\n '[OperatorError::_mapActionToErrorDetails] Uncaught error mapping error action type to server error. Please try again later.'\n )\n return 'Something failed. Please try again later.'\n }\n}\n\nexport default class OperatorError extends CowError {\n name = 'OperatorError'\n description: ApiErrorObject['description']\n\n // Status 400 errors\n // https://github.com/gnosis/gp-v2-services/blob/9014ae55412a356e46343e051aefeb683cc69c41/orderbook/openapi.yml#L563\n static apiErrorDetails = ApiErrorCodeDetails\n\n public static async getErrorMessage(response: Response, action: ApiActionType) {\n try {\n const orderPostError: ApiErrorObject = await response.json()\n\n if (orderPostError.errorType) {\n const errorMessage = OperatorError.apiErrorDetails[orderPostError.errorType]\n // shouldn't fall through as this error constructor expects the error code to exist but just in case\n return errorMessage || orderPostError.errorType\n } else {\n log.error(logPrefix, 'Unknown reason for bad order submission', orderPostError)\n return orderPostError.description\n }\n } catch (error) {\n log.error(logPrefix, 'Error handling a 400 error. Likely a problem deserialising the JSON response')\n return _mapActionToErrorDetail(action)\n }\n }\n static async getErrorFromStatusCode(response: Response, action: 'create' | 'delete') {\n switch (response.status) {\n case 400:\n case 404:\n return this.getErrorMessage(response, action)\n\n case 403:\n return `The order cannot be ${action === 'create' ? 'accepted' : 'cancelled'}. Your account is deny-listed.`\n\n case 429:\n return `The order cannot be ${\n action === 'create' ? 'accepted. Too many order placements' : 'cancelled. Too many order cancellations'\n }. Please, retry in a minute`\n\n case 500:\n default:\n log.error(\n logPrefix,\n `[OperatorError::getErrorFromStatusCode] Error ${\n action === 'create' ? 'creating' : 'cancelling'\n } the order, status code:`,\n response.status || 'unknown'\n )\n return `Error ${action === 'create' ? 'creating' : 'cancelling'} the order`\n }\n }\n constructor(apiError: ApiErrorObject) {\n super(apiError.description, apiError.errorType)\n\n this.description = apiError.description\n this.message = ApiErrorCodeDetails[apiError.errorType]\n }\n}\n\nexport function isValidOperatorError(error: any): error is OperatorError {\n return error instanceof OperatorError\n}\n","import log from 'loglevel'\nimport { CowError, logPrefix } from '../../../utils/common'\nimport { ApiErrorCodes, ApiErrorObject } from './OperatorError'\n\nexport interface GpQuoteErrorObject {\n errorType: GpQuoteErrorCodes\n description: string\n data?: any\n}\n\n// Conforms to backend API\n// https://github.com/gnosis/gp-v2-services/blob/0bd5f7743bebaa5acd3be13e35ede2326a096f14/orderbook/openapi.yml#L562\nexport enum GpQuoteErrorCodes {\n UnsupportedToken = 'UnsupportedToken',\n InsufficientLiquidity = 'InsufficientLiquidity',\n FeeExceedsFrom = 'FeeExceedsFrom',\n ZeroPrice = 'ZeroPrice',\n UNHANDLED_ERROR = 'UNHANDLED_ERROR',\n}\n\nexport enum GpQuoteErrorDetails {\n UnsupportedToken = 'One of the tokens you are trading is unsupported. Please read the FAQ for more info.',\n InsufficientLiquidity = 'Token pair selected has insufficient liquidity',\n FeeExceedsFrom = 'Current fee exceeds entered \"from\" amount',\n ZeroPrice = 'Quoted price is zero. This is likely due to a significant price difference between the two tokens. Please try increasing amounts.',\n UNHANDLED_ERROR = 'Quote fetch failed. This may be due to a server or network connectivity issue. Please try again later.',\n}\n\nexport function mapOperatorErrorToQuoteError(error?: ApiErrorObject): GpQuoteErrorObject {\n switch (error?.errorType) {\n case ApiErrorCodes.NotFound:\n case ApiErrorCodes.NoLiquidity:\n return {\n errorType: GpQuoteErrorCodes.InsufficientLiquidity,\n description: GpQuoteErrorDetails.InsufficientLiquidity,\n }\n\n case ApiErrorCodes.SellAmountDoesNotCoverFee:\n return {\n errorType: GpQuoteErrorCodes.FeeExceedsFrom,\n description: GpQuoteErrorDetails.FeeExceedsFrom,\n data: error?.data,\n }\n\n case ApiErrorCodes.UnsupportedToken:\n return {\n errorType: GpQuoteErrorCodes.UnsupportedToken,\n description: error.description,\n }\n case ApiErrorCodes.SellAmountDoesNotCoverFee:\n return {\n errorType: GpQuoteErrorCodes.FeeExceedsFrom,\n description: error.description,\n }\n default:\n return { errorType: GpQuoteErrorCodes.UNHANDLED_ERROR, description: GpQuoteErrorDetails.UNHANDLED_ERROR }\n }\n}\n\nexport default class GpQuoteError extends CowError {\n name = 'QuoteErrorObject'\n description: string\n // any data attached\n data?: any\n\n // Status 400 errors\n // https://github.com/gnosis/gp-v2-services/blob/9014ae55412a356e46343e051aefeb683cc69c41/orderbook/openapi.yml#L563\n static quoteErrorDetails = GpQuoteErrorDetails\n\n public static async getErrorMessage(response: Response) {\n try {\n const orderPostError: GpQuoteErrorObject = await response.json()\n\n if (orderPostError.errorType) {\n const errorMessage = GpQuoteError.quoteErrorDetails[orderPostError.errorType]\n // shouldn't fall through as this error constructor expects the error code to exist but just in case\n return errorMessage || orderPostError.errorType\n } else {\n log.error(logPrefix, 'Unknown reason for bad quote fetch', orderPostError)\n return orderPostError.description\n }\n } catch (error) {\n log.error(logPrefix, 'Error handling 400/404 error. Likely a problem deserialising the JSON response')\n return GpQuoteError.quoteErrorDetails.UNHANDLED_ERROR\n }\n }\n\n static async getErrorFromStatusCode(response: Response) {\n switch (response.status) {\n case 400:\n case 404:\n return this.getErrorMessage(response)\n\n case 500:\n default:\n log.error(\n logPrefix,\n '[QuoteError::getErrorFromStatusCode] Error fetching quote, status code:',\n response.status || 'unknown'\n )\n return 'Error fetching quote'\n }\n }\n constructor(quoteError: GpQuoteErrorObject) {\n super(quoteError.description, quoteError.errorType)\n\n this.description = quoteError.description\n this.message = GpQuoteError.quoteErrorDetails[quoteError.errorType]\n this.data = quoteError?.data\n }\n}\n\nexport function isValidQuoteError(error: any): error is GpQuoteError {\n return error instanceof GpQuoteError\n}\n","import { SupportedChainId as ChainId } from './chains'\nimport { Token } from '../types'\n\nexport const XDAI_SYMBOL = 'XDAI'\n\nexport const WRAPPED_NATIVE_TOKEN: Record<ChainId, Token> = {\n [ChainId.MAINNET]: new Token('WETH', '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'),\n [ChainId.RINKEBY]: new Token('WETH', '0xc778417E063141139Fce010982780140Aa0cD5Ab'),\n [ChainId.GNOSIS_CHAIN]: new Token('WXDAI', '0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d'),\n}\n\nexport const NATIVE: Record<ChainId, string> = {\n [ChainId.MAINNET]: 'ETH',\n [ChainId.RINKEBY]: 'ETH',\n [ChainId.GNOSIS_CHAIN]: XDAI_SYMBOL,\n}\n","import { SupportedChainId as ChainId } from '../constants/chains'\nimport { NATIVE, WRAPPED_NATIVE_TOKEN } from '../constants/tokens'\n\nexport function toErc20Address(tokenAddress: string, chainId: ChainId): string {\n let checkedAddress = tokenAddress\n\n if (tokenAddress === NATIVE[chainId]) {\n checkedAddress = WRAPPED_NATIVE_TOKEN[chainId].address\n }\n\n return checkedAddress\n}\n","import log from 'loglevel'\nimport fetch from 'cross-fetch'\nimport { OrderKind, QuoteQuery } from '@gnosis.pm/gp-v2-contracts'\nimport { SupportedChainId as ChainId } from '../../constants/chains'\nimport { getSigningSchemeApiValue, OrderCreation } from '../../utils/sign'\nimport OperatorError, { ApiErrorCodeDetails, ApiErrorCodes, ApiErrorObject } from './errors/OperatorError'\nimport QuoteError, {\n GpQuoteErrorCodes,\n GpQuoteErrorObject,\n mapOperatorErrorToQuoteError,\n GpQuoteErrorDetails,\n} from './errors/QuoteError'\nimport { toErc20Address } from '../../utils/tokens'\nimport { FeeQuoteParams, PriceInformation, PriceQuoteParams, SimpleGetQuoteResponse } from '../../utils/price'\n\nimport { ZERO_ADDRESS } from '../../constants'\nimport {\n GetOrdersParams,\n GetTradesParams,\n OrderCancellationParams,\n OrderID,\n OrderMetaData,\n ProfileData,\n TradeMetaData,\n} from './types'\nimport { CowError, logPrefix, objectToQueryString } from '../../utils/common'\nimport { Context } from '../../utils/context'\n\nfunction getGnosisProtocolUrl(isDev: boolean): Partial<Record<ChainId, string>> {\n if (isDev) {\n return {\n [ChainId.MAINNET]: 'https://barn.api.cow.fi/mainnet/api',\n [ChainId.RINKEBY]: 'https://barn.api.cow.fi/rinkeby/api',\n [ChainId.GNOSIS_CHAIN]: 'https://barn.api.cow.fi/xdai/api',\n }\n }\n\n return {\n [ChainId.MAINNET]: 'https://api.cow.fi/mainnet/api',\n [ChainId.RINKEBY]: 'https://api.cow.fi/rinkeby/api',\n [ChainId.GNOSIS_CHAIN]: 'https://api.cow.fi/xdai/api',\n }\n}\n\nfunction getProfileUrl(isDev: boolean): Partial<Record<ChainId, string>> {\n if (isDev) {\n return {\n [ChainId.MAINNET]: 'https://barn.api.cow.fi/affiliate/api',\n }\n }\n\n return {\n [ChainId.MAINNET]: 'https://api.cow.fi/affiliate/api',\n }\n}\n\nconst UNHANDLED_QUOTE_ERROR: GpQuoteErrorObject = {\n errorType: GpQuoteErrorCodes.UNHANDLED_ERROR,\n description: GpQuoteErrorDetails.UNHANDLED_ERROR,\n}\n\nconst UNHANDLED_ORDER_ERROR: ApiErrorObject = {\n errorType: ApiErrorCodes.UNHANDLED_CREATE_ERROR,\n description: ApiErrorCodeDetails.UNHANDLED_CREATE_ERROR,\n}\n\nasync function _handleQuoteResponse<T = any, P extends QuoteQuery = QuoteQuery>(\n response: Response,\n params?: P\n): Promise<T> {\n if (!response.ok) {\n const errorObj: ApiErrorObject = await response.json()\n\n // we need to map the backend error codes to match our own for quotes\n const mappedError = mapOperatorErrorToQuoteError(errorObj)\n const quoteError = new QuoteError(mappedError)\n\n if (params) {\n const { sellToken, buyToken } = params\n log.error(logPrefix, `Error querying fee from API - sellToken: ${sellToken}, buyToken: ${buyToken}`)\n }\n\n throw quoteError\n } else {\n return response.json()\n }\n}\n\nexport class CowApi {\n context: Context\n\n API_NAME = 'CoW Protocol'\n\n constructor(context: Context) {\n this.context = context\n }\n\n get DEFAULT_HEADERS() {\n return { 'Content-Type': 'application/json', 'X-AppId': this.context.appDataHash }\n }\n\n get API_BASE_URL() {\n return getGnosisProtocolUrl(this.context.isDevEnvironment)\n }\n\n get PROFILE_API_BASE_URL(): Partial<Record<ChainId, string>> {\n return getProfileUrl(this.context.isDevEnvironment)\n }\n\n async getProfileData(address: string): Promise<ProfileData | null> {\n const chainId = await this.context.chainId\n log.debug(logPrefix, `[api:${this.API_NAME}] Get profile data for`, chainId, address)\n if (chainId !== ChainId.MAINNET) {\n log.info(logPrefix, 'Profile data is only available for mainnet')\n return null\n }\n\n const response = await this.getProfile(`/profile/${address}`)\n\n if (!response.ok) {\n const errorResponse = await response.json()\n log.error(logPrefix, errorResponse)\n throw new CowError(errorResponse?.description)\n } else {\n return response.json()\n }\n }\n\n async getTrades(params: GetTradesParams): Promise<TradeMetaData[]> {\n const { owner, limit, offset } = params\n const qsParams = objectToQueryString({ owner, limit, offset })\n const chainId = await this.context.chainId\n log.debug(logPrefix, '[util:operator] Get trades for', chainId, owner, { limit, offset })\n try {\n const response = await this.get(`/trades${qsParams}`)\n\n if (!response.ok) {\n const errorResponse = await response.json()\n throw new CowError(errorResponse)\n } else {\n return response.json()\n }\n } catch (error) {\n log.error(logPrefix, 'Error getting trades:', error)\n throw new CowError('Error getting trades: ' + error)\n }\n }\n\n async getOrders(params: GetOrdersParams): Promise<OrderMetaData[]> {\n const { owner, limit = 1000, offset = 0 } = params\n const queryString = objectToQueryString({ limit, offset })\n const chainId = await this.context.chainId\n log.debug(logPrefix, `[api:${this.API_NAME}] Get orders for `, chainId, owner, limit, offset)\n\n try {\n const response = await this.get(`/account/${owner}/orders/${queryString}`)\n\n if (!response.ok) {\n const errorResponse: ApiErrorObject = await response.json()\n throw new OperatorError(errorResponse)\n } else {\n return response.json()\n }\n } catch (error) {\n log.error(logPrefix, 'Error getting orders information:', error)\n throw new OperatorError(UNHANDLED_ORDER_ERROR)\n }\n }\n\n async getTxOrders(txHash: string): Promise<OrderMetaData[]> {\n const chainId = await this.context.chainId\n log.debug(`[api:${this.API_NAME}] Get tx orders for `, chainId, txHash)\n\n try {\n const response = await this.get(`/transactions/${txHash}/orders`)\n\n if (!response.ok) {\n const errorResponse: ApiErrorObject = await response.json()\n throw new OperatorError(errorResponse)\n } else {\n return response.json()\n }\n } catch (error) {\n log.error('Error getting transaction orders information:', error)\n if (error instanceof OperatorError) throw error\n throw new OperatorError(UNHANDLED_ORDER_ERROR)\n }\n }\n\n async getOrder(orderId: string): Promise<OrderMetaData | null> {\n const chainId = await this.context.chainId\n log.debug(logPrefix, `[api:${this.API_NAME}] Get order for `, chainId, orderId)\n try {\n const response = await this.get(`/orders/${orderId}`)\n\n if (!response.ok) {\n const errorResponse: ApiErrorObject = await response.json()\n throw new OperatorError(errorResponse)\n } else {\n return response.json()\n }\n } catch (error) {\n log.error(logPrefix, 'Error getting order information:', error)\n throw new OperatorError(UNHANDLED_ORDER_ERROR)\n }\n }\n\n async getPriceQuoteLegacy(params: PriceQuoteParams): Promise<PriceInformation | null> {\n const { baseToken, quoteToken, amount, kind } = params\n const chainId = await this.context.chainId\n log.debug(logPrefix, `[api:${this.API_NAME}] Get price from API`, params, 'for', chainId)\n\n const response = await this.get(\n `/markets/${toErc20Address(baseToken, chainId)}-${toErc20Address(quoteToken, chainId)}/${kind}/${amount}`\n ).catch((error) => {\n log.error(logPrefix, 'Error getting price quote:', error)\n throw new QuoteError(UNHANDLED_QUOTE_ERROR)\n })\n\n return _handleQuoteResponse<PriceInformation | null>(response)\n }\n\n async getQuote(params: FeeQuoteParams): Promise<SimpleGetQuoteResponse> {\n const chainId = await this.context.chainId\n const quoteParams = this.mapNewToLegacyParams(params, chainId)\n const response = await this.post('/quote', quoteParams)\n\n return _handleQuoteResponse<SimpleGetQuoteResponse>(response)\n }\n\n async sendSignedOrderCancellation(params: OrderCancellationParams): Promise<void> {\n const { cancellation, owner: from } = params\n const chainId = await this.context.chainId\n log.debug(logPrefix, `[api:${this.API_NAME}] Delete signed order for network`, chainId, cancellation)\n\n const response = await this.delete(`/orders/${cancellation.orderUid}`, {\n signature: cancellation.signature,\n signingScheme: getSigningSchemeApiValue(cancellation.signingScheme),\n from,\n })\n\n if (!response.ok) {\n // Raise an exception\n const errorMessage = await OperatorError.getErrorFromStatusCode(response, 'delete')\n throw new CowError(errorMessage)\n }\n\n log.debug(logPrefix, `[api:${this.API_NAME}] Cancelled order`, cancellation.orderUid, chainId)\n }\n\n async sendOrder(params: { order: Omit<OrderCreation, 'appData'>; owner: string }): Promise<OrderID> {\n const fullOrder: OrderCreation = { ...params.order, appData: this.context.appDataHash }\n const chainId = await this.context.chainId\n const { owner } = params\n log.debug(logPrefix, `[api:${this.API_NAME}] Post signed order for network`, chainId, fullOrder)\n\n // Call API\n const response = await this.post(`/orders`, {\n ...fullOrder,\n signingScheme: getSigningSchemeApiValue(fullOrder.signingScheme),\n from: owner,\n })\n\n // Handle response\n if (!response.ok) {\n // Raise an exception\n const errorMessage = await OperatorError.getErrorFromStatusCode(response, 'create')\n throw new CowError(errorMessage)\n }\n\n const uid = (await response.json()) as string\n log.debug(logPrefix, `[api:${this.API_NAME}] Success posting the signed order`, uid)\n return uid\n }\n\n getOrderLink(orderId: OrderID): string {\n const baseUrl = this.getApiBaseUrl()\n\n return baseUrl + `/orders/${orderId}`\n }\n\n private mapNewToLegacyParams(params: FeeQuoteParams, chainId: ChainId): QuoteQuery {\n const { amount, kind, userAddress, receiver, validTo, sellToken, buyToken } = params\n const fallbackAddress = userAddress || ZERO_ADDRESS\n\n const baseParams = {\n sellToken: toErc20Address(sellToken, chainId),\n buyToken: toErc20Address(buyToken, chainId),\n from: fallbackAddress,\n receiver: receiver || fallbackAddress,\n appData: this.context.appDataHash,\n validTo,\n partiallyFillable: false,\n }\n\n const finalParams: QuoteQuery =\n kind === OrderKind.SELL\n ? {\n kind: OrderKind.SELL,\n sellAmountBeforeFee: amount,\n ...baseParams,\n }\n : {\n kind: OrderKind.BUY,\n buyAmountAfterFee: amount,\n ...baseParams,\n }\n\n return finalParams\n }\n\n private async getApiBaseUrl(): Promise<string> {\n const chainId = await this.context.chainId\n const baseUrl = this.API_BASE_URL[chainId]\n\n if (!baseUrl) {\n throw new CowError(`Unsupported Network. The ${this.API_NAME} API is not deployed in the Network ` + chainId)\n } else {\n return baseUrl + '/v1'\n }\n }\n\n private async getProfileApiBaseUrl(): Promise<string> {\n const chainId = await this.context.chainId\n const baseUrl = this.PROFILE_API_BASE_URL[chainId]\n\n if (!baseUrl) {\n throw new CowError(`Unsupported Network. The ${this.API_NAME} API is not deployed in the Network ` + chainId)\n } else {\n return baseUrl + '/v1'\n }\n }\n\n private async fetch(url: string, method: 'GET' | 'POST' | 'DELETE', data?: any): Promise<Response> {\n const baseUrl = await this.getApiBaseUrl()\n return fetch(baseUrl + url, {\n headers: this.DEFAULT_HEADERS,\n method,\n body: data !== undefined ? JSON.stringify(data) : data,\n })\n }\n\n private async fetchProfile(url: string, method: 'GET' | 'POST' | 'DELETE', data?: any): Promise<Response> {\n const baseUrl = await this.getProfileApiBaseUrl()\n return fetch(baseUrl + url, {\n headers: this.DEFAULT_HEADERS,\n method,\n body: data !== undefined ? JSON.stringify(data) : data,\n })\n }\n\n private post(url: string, data: any): Promise<Response> {\n return this.fetch(url, 'POST', data)\n }\n\n private get(url: string): Promise<Response> {\n return this.fetch(url, 'GET')\n }\n\n private getProfile(url: string): Promise<Response> {\n return this.fetchProfile(url, 'GET')\n }\n\n private delete(url: string, data: any): Promise<Response> {\n return this.fetch(url, 'DELETE', data)\n }\n}\n","import Ajv, { ErrorObject, ValidateFunction } from 'ajv'\nimport { fromHexString } from './common'\nimport { DEFAULT_IPFS_GATEWAY_URI } from '../constants'\nimport { AppDataDoc } from '../types'\n\nlet validate: ValidateFunction | undefined\nlet ajv: Ajv\n\ninterface ValidationResult {\n result: boolean\n errors?: ErrorObject[]\n}\n\nasync function getValidator(): Promise<{ ajv: Ajv; validate: ValidateFunction }> {\n if (!ajv) {\n ajv = new Ajv()\n }\n\n if (!validate) {\n const appDataSchema = await import('../schemas/appData.schema.json')\n validate = ajv.compile(appDataSchema)\n }\n\n return { ajv, validate }\n}\n\nexport async function getSerializedCID(hash: string): Promise<void | string> {\n const cidVersion = 0x1 //cidv1\n const codec = 0x70 //dag-pb\n const type = 0x12 //sha2-256\n const length = 32 //256 bits\n const _hash = hash.replace(/(^0x)/, '')\n\n const hexHash = fromHexString(_hash)\n\n if (!hexHash) return\n\n const uint8array = Uint8Array.from([cidVersion, codec, type, length, ...hexHash])\n const { CID } = await import('multiformats/cid')\n return CID.decode(uint8array).toV0().toString()\n}\n\nexport async function loadIpfsFromCid(cid: string, ipfsUri = DEFAULT_IPFS_GATEWAY_URI): Promise<AppDataDoc> {\n const { default: fetch } = await import('cross-fetch')\n const response = await fetch(`${ipfsUri}/${cid}`)\n\n return await response.json()\n}\n\nexport async function validateAppDataDocument(appDataDocument: unknown): Promise<ValidationResult> {\n const { ajv, validate } = await getValidator()\n const result = !!validate(appDataDocument)\n\n return {\n result,\n errors: ajv.errors ?? undefined,\n }\n}\n","import log from 'loglevel'\nimport { Context } from '../../utils/context'\nimport { getSerializedCID, loadIpfsFromCid } from '../../utils/appData'\nimport { AppDataDoc } from './types'\nimport { CowError } from '../../utils/common'\n\nexport class MetadataApi {\n context: Context\n\n constructor(context: Context) {\n this.context = context\n }\n\n async decodeAppData(hash: string): Promise<void | AppDataDoc> {\n try {\n const cidV0 = await getSerializedCID(hash)\n if (!cidV0) throw new CowError('Error getting serialized CID')\n return await loadIpfsFromCid(cidV0)\n } catch (error) {\n log.error('Error decoding AppData:', error)\n throw new CowError('Error decoding AppData: ' + error)\n }\n }\n\n async cidToAppDataHex(ipfsHash: string): Promise<string | void> {\n const { CID } = await import('multiformats/cid')\n\n const { digest } = CID.parse(ipfsHash).multihash\n return `0x${Buffer.from(digest).toString('hex')}`\n }\n\n async appDataHexToCid(hash: string): Promise<string | void> {\n const cidV0 = await getSerializedCID(hash)\n if (!cidV0) throw new CowError('Error getting serialized CID')\n return cidV0\n }\n}\n","import { Signer } from 'ethers'\nimport log from 'loglevel'\nimport { CowError, logPrefix } from './common'\nimport { SupportedChainId as ChainId } from '../constants/chains'\nimport { DEFAULT_APP_DATA_HASH, DEFAULT_IPFS_GATEWAY_URI } from '../constants'\n\nexport interface CowContext {\n appDataHash?: string\n isDevEnvironment?: boolean\n signer?: Signer\n ipfsUri?: string\n}\n\nexport const DefaultCowContext = {\n appDataHash: DEFAULT_APP_DATA_HASH,\n isDevEnvironment: false,\n ipfsUri: DEFAULT_IPFS_GATEWAY_URI,\n}\n\n/**\n *\n *\n * @export\n * @class Context\n * @implements {Required<CowContext>}\n */\nexport class Context implements Partial<CowContext> {\n #context: CowContext\n #chainId: ChainId\n\n constructor(chainId: ChainId, context: CowContext) {\n this.#chainId = this.updateChainId(chainId)\n this.#context = { ...DefaultCowContext, ...context }\n }\n\n updateChainId(chainId: ChainId) {\n if (!ChainId[chainId]) {\n throw new CowError(`Invalid chainId: ${chainId}`)\n }\n\n log.debug(logPrefix, `Updating chainId to: ${chainId}`)\n\n this.#chainId = chainId\n return chainId\n }\n\n get chainId(): Promise<ChainId> {\n const provider = this.#context.signer?.provider\n if (!provider) {\n return Promise.resolve(this.#chainId)\n }\n\n log.debug(logPrefix, 'Getting chainId from provider')\n\n const getAndReconciliateNetwork = async () => {\n const network = await provider.getNetwork()\n const chainId = network.chainId\n\n if (chainId !== this.#chainId) {\n log.debug(\n logPrefix,\n `ChainId mismatch: Provider's chainId: ${chainId} vs Context's chainId: ${\n this.#chainId\n }. Updating Context's chainId`\n )\n this.updateChainId(chainId)\n }\n return chainId\n }\n\n return getAndReconciliateNetwork()\n }\n\n get appDataHash(): string {\n return this.#context.appDataHash ?? DefaultCowContext.appDataHash\n }\n\n get isDevEnvironment(): boolean {\n return this.#context.isDevEnvironment ?? DefaultCowContext.isDevEnvironment\n }\n\n get signer(): Signer | undefined {\n return this.#context.signer\n }\n\n get ipfsUri(): string {\n return this.#context.ipfsUri ?? DefaultCowContext.ipfsUri\n }\n}\n","import { Signer } from 'ethers'\nimport log, { LogLevelDesc } from 'loglevel'\nimport { CowError } from './utils/common'\nimport { CowApi, MetadataApi } from './api'\nimport { SupportedChainId as ChainId } from './constants/chains'\nimport { validateAppDataDocument } from './utils/appData'\nimport { Context, CowContext } from './utils/context'\nimport { signOrder, signOrderCancellation, UnsignedOrder } from './utils/sign'\n\ntype Options = {\n loglevel?: LogLevelDesc\n}\n\nexport class CowSdk<T extends ChainId> {\n context: Context\n cowApi: CowApi\n metadataApi: MetadataApi\n\n constructor(chainId: T, cowContext: CowContext = {}, options: Options = {}) {\n this.context = new Context(chainId, { ...cowContext })\n this.cowApi = new CowApi(this.context)\n this.metadataApi = new MetadataApi(this.context)\n log.setLevel(options.loglevel || 'error')\n }\n\n updateChainId = (chainId: ChainId) => {\n this.context.updateChainId(chainId)\n }\n\n validateAppDataDocument = validateAppDataDocument\n\n async signOrder(order: Omit<UnsignedOrder, 'appData'>) {\n const signer = this._checkSigner()\n const chainId = await this.context.chainId\n return signOrder({ ...order, appData: this.context.appDataHash }, chainId, signer)\n }\n\n async signOrderCancellation(orderId: string) {\n const signer = this._checkSigner()\n const chainId = await this.context.chainId\n return signOrderCancellation(orderId, chainId, signer)\n }\n\n _checkSigner(signer: Signer | undefined = this.context.signer) {\n if (!signer) {\n throw new CowError('No signer available')\n }\n\n return signer\n }\n}\n\nexport default CowSdk\n"],"names":["CowError","Error","constructor","message","error_code","super","this","objectToQueryString","o","qs","URLSearchParams","key","Object","keys","value","append","qsResult","toString","logPrefix","SupportedChainId","ALL_SUPPORTED_CHAIN_IDS","MAINNET","RINKEBY","GNOSIS_CHAIN","Token","symbol","address","GPv2Settlement","contractNetworks","GP_SETTLEMENT_CONTRACT_ADDRESS","ChainId","_signPayload","payload","signFn","signer","signingMethod","signature","data","signingScheme","SigningScheme","ETHSIGN","EIP712","_signer","TypedDataV3Signer","IntChainIdTypedDataV4Signer","e","log","error","undefined","code","METHOD_NOT_FOUND_ERROR_CODE","RPC_REQUEST_FAILED_REGEX","test","METAMASK_STRING_CHAINID_REGEX","METAMASK_SIGNATURE_ERROR_CODE","V4_ERROR_MSG_REGEX","V3_ERROR_MSG_REGEX","_signOrderCancellation","params","chainId","orderId","domain","_getDomain","signOrderCancellationGp","getSigningSchemeLibValue","_signOrder","order","signOrderGp","mapSigningSchema","Map","libraryValue","apiValue","EIP1271","PRESIGN","_getSigningSchemeInfo","ecdaSigningScheme","get","getSigningSchemeApiValue","settlementContract","domainGp","ApiErrorCodes","ApiErrorCodeDetails","GpQuoteErrorCodes","GpQuoteErrorDetails","OperatorError","static","response","action","json","orderPostError","errorType","apiErrorDetails","description","UNHANDLED_GET_ERROR","UNHANDLED_CREATE_ERROR","UNHANDLED_DELETE_ERROR","_mapActionToErrorDetail","status","_this","getErrorMessage","apiError","name","GpQuoteError","quoteErrorDetails","UNHANDLED_ERROR","quoteError","WRAPPED_NATIVE_TOKEN","NATIVE","toErc20Address","tokenAddress","checkedAddress","_handleQuoteResponse","ok","errorObj","mappedError","NotFound","NoLiquidity","InsufficientLiquidity","SellAmountDoesNotCoverFee","FeeExceedsFrom","UnsupportedToken","mapOperatorErrorToQuoteError","QuoteError","sellToken","buyToken","UNHANDLED_QUOTE_ERROR","UNHANDLED_ORDER_ERROR","CowApi","context","API_NAME","DEFAULT_HEADERS","appDataHash","API_BASE_URL","isDevEnvironment","PROFILE_API_BASE_URL","getProfileData","debug","info","getProfile","errorResponse","getTrades","owner","limit","offset","qsParams","_this2","getOrders","queryString","_this3","getTxOrders","txHash","_this4","getOrder","_this5","getPriceQuoteLegacy","baseToken","quoteToken","amount","kind","_this6","catch","getQuote","_this7","quoteParams","mapNewToLegacyParams","post","sendSignedOrderCancellation","cancellation","from","_this8","delete","orderUid","getErrorFromStatusCode","errorMessage","sendOrder","fullOrder","appData","_this9","uid","getOrderLink","getApiBaseUrl","userAddress","receiver","validTo","fallbackAddress","baseParams","partiallyFillable","OrderKind","SELL","sellAmountBeforeFee","BUY","buyAmountAfterFee","_this10","baseUrl","getProfileApiBaseUrl","_this11","fetch","url","method","_this12","headers","body","JSON","stringify","fetchProfile","_this13","validateAppDataDocument","appDataDocument","getValidator","ajv","validate","result","errors","getSerializedCID","hash","cidVersion","codec","type","length","hexHash","hexString","stringMatch","match","Uint8Array","map","byte","parseInt","fromHexString","replace","uint8array","Promise","CID","decode","toV0","Ajv","appDataSchema","compile","MetadataApi","decodeAppData","cidV0","cid","ipfsUri","default","loadIpfsFromCid","cidToAppDataHex","ipfsHash","digest","parse","multihash","Buffer","appDataHexToCid","DefaultCowContext","Context","_classPrivateFieldLooseBase","updateChainId","provider","_classPrivateFieldLoo","getNetwork","network","getAndReconciliateNetwork","resolve","cowContext","options","cowApi","metadataApi","setLevel","loglevel","signOrder","_checkSigner","signOrderCancellation"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{IntChainIdTypedDataV4Signer as e,TypedDataV3Signer as t,SigningScheme as r,domain as n,signOrder as i,signOrderCancellation as o,OrderKind as a}from"@gnosis.pm/gp-v2-contracts";export{OrderKind}from"@gnosis.pm/gp-v2-contracts";import s from"loglevel";import c from"cross-fetch";import d from"@gnosis.pm/gp-v2-contracts/networks.json";import u from"ajv";class h extends Error{constructor(e,t){super(e),this.error_code=void 0,this.error_code=t}}function l(e){if(!e)return"";const t=new URLSearchParams;for(const r of Object.keys(e)){const n=e[r];n&&t.append(r,n)}const r=t.toString();return r?`?${r}`:""}const p="cow-sdk:";var f;!function(e){e[e.MAINNET=1]="MAINNET",e[e.RINKEBY=4]="RINKEBY",e[e.GNOSIS_CHAIN=100]="GNOSIS_CHAIN"}(f||(f={}));const g=[f.MAINNET,f.RINKEBY,f.GNOSIS_CHAIN];class E{constructor(e,t){this.symbol=void 0,this.address=void 0,this.symbol=e,this.address=t}}function w(){return w=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},w.apply(this,arguments)}var y=0;function m(e){return"__private_"+y+++"_"+e}function N(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw new TypeError("attempted to use private field on non-instance");return e}const{GPv2Settlement:A}=d,I={[f.MAINNET]:A[f.MAINNET].address,[f.RINKEBY]:A[f.RINKEBY].address,[f.GNOSIS_CHAIN]:A[f.GNOSIS_CHAIN].address},T=/eth_signTypedData_v4 does not exist/i,v=/eth_signTypedData_v3 does not exist/i,D=/RPC request failed/i,R=/provided chainid .* must match the active chainid/i,_=new Map([[r.EIP712,{libraryValue:0,apiValue:"eip712"}],[r.ETHSIGN,{libraryValue:1,apiValue:"ethsign"}],[r.EIP1271,{libraryValue:2,apiValue:"eip1271"}],[r.PRESIGN,{libraryValue:3,apiValue:"presign"}]]);function O(e){const t=_.get(e);if(void 0===t)throw new h("Unknown schema "+e);return t}function S(e){return O(e).apiValue}function k(e){return O(e).libraryValue}function x(e){const t=I[e];if(!t)throw new h("Unsupported network. Settlement contract is not deployed");return n(e,t)}async function b(e){const{chainId:t,signer:r,order:n,signingScheme:o}=e,a=x(t);return i(a,n,r,k(o))}async function P(e){const{chainId:t,signer:r,signingScheme:n,orderId:i}=e,a=x(t);return o(a,i,r,k(n))}async function C(n,i,o,a="v4"){const c="eth_sign"===a?r.ETHSIGN:r.EIP712;let d,u=null;try{switch(a){case"v3":d=new t(o);break;case"int_v4":d=new e(o);break;default:d=o}}catch(e){throw s.error(p,"Wallet not supported:",e),new h("Wallet not supported")}try{u=await i(w({},n,{signer:d,signingScheme:c}))}catch(e){if(void 0===(l=e).code&&void 0===l.message)throw s.error(p,e),e;if(-32601===e.code||D.test(e.message))switch(a){case"v4":return C(n,i,o,"v3");case"v3":return C(n,i,o,"eth_sign");default:throw e}else{if(R.test(e.message))return C(n,i,o,"int_v4");if(-32603===e.code)return C(n,i,o,"eth_sign");if(T.test(e.message))return C(n,i,o,"v3");if(v.test(e.message))return C(n,i,o,"eth_sign")}}var l;return{signature:u.data.toString(),signingScheme:c}}var U,L,H,F;!function(e){e.DuplicateOrder="DuplicateOrder",e.InvalidSignature="InvalidSignature",e.MissingOrderData="MissingOrderData",e.InsufficientValidTo="InsufficientValidTo",e.InsufficientAllowance="InsufficientAllowance",e.InsufficientBalance="InsufficientBalance",e.InsufficientFee="InsufficientFee",e.WrongOwner="WrongOwner",e.NotFound="NotFound",e.OrderNotFound="OrderNotFound",e.AlreadyCancelled="AlreadyCancelled",e.OrderFullyExecuted="OrderFullyExecuted",e.OrderExpired="OrderExpired",e.NoLiquidity="NoLiquidity",e.UnsupportedToken="UnsupportedToken",e.AmountIsZero="AmountIsZero",e.SellAmountDoesNotCoverFee="SellAmountDoesNotCoverFee",e.TransferEthToContract="TransferEthToContract",e.UNHANDLED_GET_ERROR="UNHANDLED_GET_ERROR",e.UNHANDLED_CREATE_ERROR="UNHANDLED_CREATE_ERROR",e.UNHANDLED_DELETE_ERROR="UNHANDLED_DELETE_ERROR"}(U||(U={})),function(e){e.DuplicateOrder="There was another identical order already submitted. Please try again.",e.InsufficientFee="The signed fee is insufficient. It's possible that is higher now due to a change in the gas price, ether price, or the sell token price. Please try again to get an updated fee quote.",e.InvalidSignature="The order signature is invalid. Check whether your Wallet app supports off-chain signing.",e.MissingOrderData="The order has missing information",e.InsufficientValidTo="The order you are signing is already expired. This can happen if you set a short expiration in the settings and waited too long before signing the transaction. Please try again.",e.InsufficientAllowance="The account doesn't have enough funds",e.InsufficientBalance="The account needs to approve the selling token in order to trade",e.WrongOwner="The signature is invalid.\n\nIt's likely that the signing method provided by your wallet doesn't comply with the standards required by CowSwap.\n\nCheck whether your Wallet app supports off-chain signing (EIP-712 or ETHSIGN).",e.NotFound="Token pair selected has insufficient liquidity",e.OrderNotFound="The order you are trying to cancel does not exist",e.AlreadyCancelled="Order is already cancelled",e.OrderFullyExecuted="Order is already filled",e.OrderExpired="Order is expired",e.NoLiquidity="Token pair selected has insufficient liquidity",e.UnsupportedToken="One of the tokens you are trading is unsupported. Please read the FAQ for more info.",e.AmountIsZero="Amount is zero",e.SellAmountDoesNotCoverFee="Sell amount does not sufficiently cover the current fee",e.TransferEthToContract="Sending the native currency to smart contract wallets is not currently supported",e.UNHANDLED_GET_ERROR="Order fetch failed. This may be due to a server or network connectivity issue. Please try again later.",e.UNHANDLED_CREATE_ERROR="The order was not accepted by the network",e.UNHANDLED_DELETE_ERROR="The order cancellation was not accepted by the network"}(L||(L={}));class $ extends h{static async getErrorMessage(e,t){try{const t=await e.json();return t.errorType?$.apiErrorDetails[t.errorType]||t.errorType:(s.error(p,"Unknown reason for bad order submission",t),t.description)}catch(e){return s.error(p,"Error handling a 400 error. Likely a problem deserialising the JSON response"),function(e){switch(e){case"get":return L.UNHANDLED_GET_ERROR;case"create":return L.UNHANDLED_CREATE_ERROR;case"delete":return L.UNHANDLED_DELETE_ERROR;default:return s.error(p,"[OperatorError::_mapActionToErrorDetails] Uncaught error mapping error action type to server error. Please try again later."),"Something failed. Please try again later."}}(t)}}static async getErrorFromStatusCode(e,t){switch(e.status){case 400:case 404:return this.getErrorMessage(e,t);case 403:return`The order cannot be ${"create"===t?"accepted":"cancelled"}. Your account is deny-listed.`;case 429:return`The order cannot be ${"create"===t?"accepted. Too many order placements":"cancelled. Too many order cancellations"}. Please, retry in a minute`;default:return s.error(p,`[OperatorError::getErrorFromStatusCode] Error ${"create"===t?"creating":"cancelling"} the order, status code:`,e.status||"unknown"),`Error ${"create"===t?"creating":"cancelling"} the order`}}constructor(e){super(e.description,e.errorType),this.name="OperatorError",this.description=void 0,this.description=e.description,this.message=L[e.errorType]}}$.apiErrorDetails=L,function(e){e.UnsupportedToken="UnsupportedToken",e.InsufficientLiquidity="InsufficientLiquidity",e.FeeExceedsFrom="FeeExceedsFrom",e.ZeroPrice="ZeroPrice",e.UNHANDLED_ERROR="UNHANDLED_ERROR"}(H||(H={})),function(e){e.UnsupportedToken="One of the tokens you are trading is unsupported. Please read the FAQ for more info.",e.InsufficientLiquidity="Token pair selected has insufficient liquidity",e.FeeExceedsFrom='Current fee exceeds entered "from" amount',e.ZeroPrice="Quoted price is zero. This is likely due to a significant price difference between the two tokens. Please try increasing amounts.",e.UNHANDLED_ERROR="Quote fetch failed. This may be due to a server or network connectivity issue. Please try again later."}(F||(F={}));class M extends h{static async getErrorMessage(e){try{const t=await e.json();return t.errorType?M.quoteErrorDetails[t.errorType]||t.errorType:(s.error(p,"Unknown reason for bad quote fetch",t),t.description)}catch(e){return s.error(p,"Error handling 400/404 error. Likely a problem deserialising the JSON response"),M.quoteErrorDetails.UNHANDLED_ERROR}}static async getErrorFromStatusCode(e){switch(e.status){case 400:case 404:return this.getErrorMessage(e);default:return s.error(p,"[QuoteError::getErrorFromStatusCode] Error fetching quote, status code:",e.status||"unknown"),"Error fetching quote"}}constructor(e){super(e.description,e.errorType),this.name="QuoteErrorObject",this.description=void 0,this.data=void 0,this.description=e.description,this.message=M.quoteErrorDetails[e.errorType],this.data=null==e?void 0:e.data}}M.quoteErrorDetails=F;const j={[f.MAINNET]:new E("WETH","0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"),[f.RINKEBY]:new E("WETH","0xc778417E063141139Fce010982780140Aa0cD5Ab"),[f.GNOSIS_CHAIN]:new E("WXDAI","0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d")},G={[f.MAINNET]:"ETH",[f.RINKEBY]:"ETH",[f.GNOSIS_CHAIN]:"XDAI"};function q(e,t){let r=e;return e===G[t]&&(r=j[t].address),r}const B={errorType:H.UNHANDLED_ERROR,description:F.UNHANDLED_ERROR},V={errorType:U.UNHANDLED_CREATE_ERROR,description:L.UNHANDLED_CREATE_ERROR};async function W(e,t){if(e.ok)return e.json();{const r=function(e){switch(null==e?void 0:e.errorType){case U.NotFound:case U.NoLiquidity:return{errorType:H.InsufficientLiquidity,description:F.InsufficientLiquidity};case U.SellAmountDoesNotCoverFee:return{errorType:H.FeeExceedsFrom,description:F.FeeExceedsFrom,data:null==e?void 0:e.data};case U.UnsupportedToken:return{errorType:H.UnsupportedToken,description:e.description};case U.SellAmountDoesNotCoverFee:return{errorType:H.FeeExceedsFrom,description:e.description};default:return{errorType:H.UNHANDLED_ERROR,description:F.UNHANDLED_ERROR}}}(await e.json()),n=new M(r);if(t){const{sellToken:e,buyToken:r}=t;s.error(p,`Error querying fee from API - sellToken: ${e}, buyToken: ${r}`)}throw n}}class Y{constructor(e){this.context=void 0,this.API_NAME="CoW Protocol",this.context=e}get DEFAULT_HEADERS(){return{"Content-Type":"application/json","X-AppId":this.context.appDataHash}}get API_BASE_URL(){return this.context.isDevEnvironment?{[f.MAINNET]:"https://barn.api.cow.fi/mainnet/api",[f.RINKEBY]:"https://barn.api.cow.fi/rinkeby/api",[f.GNOSIS_CHAIN]:"https://barn.api.cow.fi/xdai/api"}:{[f.MAINNET]:"https://api.cow.fi/mainnet/api",[f.RINKEBY]:"https://api.cow.fi/rinkeby/api",[f.GNOSIS_CHAIN]:"https://api.cow.fi/xdai/api"}}get PROFILE_API_BASE_URL(){return this.context.isDevEnvironment?{[f.MAINNET]:"https://barn.api.cow.fi/affiliate/api"}:{[f.MAINNET]:"https://api.cow.fi/affiliate/api"}}async getProfileData(e){const t=await this.context.chainId;if(s.debug(p,`[api:${this.API_NAME}] Get profile data for`,t,e),t!==f.MAINNET)return s.info(p,"Profile data is only available for mainnet"),null;const r=await this.getProfile(`/profile/${e}`);if(r.ok)return r.json();{const e=await r.json();throw s.error(p,e),new h(null==e?void 0:e.description)}}async getTrades(e){const{owner:t,limit:r,offset:n}=e,i=l({owner:t,limit:r,offset:n}),o=await this.context.chainId;s.debug(p,"[util:operator] Get trades for",o,t,{limit:r,offset:n});try{const e=await this.get(`/trades${i}`);if(e.ok)return e.json();{const t=await e.json();throw new h(t)}}catch(e){throw s.error(p,"Error getting trades:",e),new h("Error getting trades: "+e)}}async getOrders(e){const{owner:t,limit:r=1e3,offset:n=0}=e,i=l({limit:r,offset:n}),o=await this.context.chainId;s.debug(p,`[api:${this.API_NAME}] Get orders for `,o,t,r,n);try{const e=await this.get(`/account/${t}/orders/${i}`);if(e.ok)return e.json();{const t=await e.json();throw new $(t)}}catch(e){throw s.error(p,"Error getting orders information:",e),new $(V)}}async getTxOrders(e){const t=await this.context.chainId;s.debug(`[api:${this.API_NAME}] Get tx orders for `,t,e);try{const t=await this.get(`/transactions/${e}/orders`);if(t.ok)return t.json();{const e=await t.json();throw new $(e)}}catch(e){if(s.error("Error getting transaction orders information:",e),e instanceof $)throw e;throw new $(V)}}async getOrder(e){const t=await this.context.chainId;s.debug(p,`[api:${this.API_NAME}] Get order for `,t,e);try{const t=await this.get(`/orders/${e}`);if(t.ok)return t.json();{const e=await t.json();throw new $(e)}}catch(e){throw s.error(p,"Error getting order information:",e),new $(V)}}async getPriceQuoteLegacy(e){const{baseToken:t,quoteToken:r,amount:n,kind:i}=e,o=await this.context.chainId;return s.debug(p,`[api:${this.API_NAME}] Get price from API`,e,"for",o),W(await this.get(`/markets/${q(t,o)}-${q(r,o)}/${i}/${n}`).catch(e=>{throw s.error(p,"Error getting price quote:",e),new M(B)}))}async getQuote(e){const t=await this.context.chainId,r=this.mapNewToLegacyParams(e,t);return W(await this.post("/quote",r))}async sendSignedOrderCancellation(e){const{cancellation:t,owner:r}=e,n=await this.context.chainId;s.debug(p,`[api:${this.API_NAME}] Delete signed order for network`,n,t);const i=await this.delete(`/orders/${t.orderUid}`,{signature:t.signature,signingScheme:S(t.signingScheme),from:r});if(!i.ok){const e=await $.getErrorFromStatusCode(i,"delete");throw new h(e)}s.debug(p,`[api:${this.API_NAME}] Cancelled order`,t.orderUid,n)}async sendOrder(e){const t=w({},e.order,{appData:this.context.appDataHash}),r=await this.context.chainId,{owner:n}=e;s.debug(p,`[api:${this.API_NAME}] Post signed order for network`,r,t);const i=await this.post("/orders",w({},t,{signingScheme:S(t.signingScheme),from:n}));if(!i.ok){const e=await $.getErrorFromStatusCode(i,"create");throw new h(e)}const o=await i.json();return s.debug(p,`[api:${this.API_NAME}] Success posting the signed order`,o),o}getOrderLink(e){return this.getApiBaseUrl()+`/orders/${e}`}mapNewToLegacyParams(e,t){const{amount:r,kind:n,userAddress:i,receiver:o,validTo:s,sellToken:c,buyToken:d}=e,u=i||"0x0000000000000000000000000000000000000000",h={sellToken:q(c,t),buyToken:q(d,t),from:u,receiver:o||u,appData:this.context.appDataHash,validTo:s,partiallyFillable:!1};return w(n===a.SELL?{kind:a.SELL,sellAmountBeforeFee:r}:{kind:a.BUY,buyAmountAfterFee:r},h)}async getApiBaseUrl(){const e=await this.context.chainId,t=this.API_BASE_URL[e];if(t)return t+"/v1";throw new h(`Unsupported Network. The ${this.API_NAME} API is not deployed in the Network `+e)}async getProfileApiBaseUrl(){const e=await this.context.chainId,t=this.PROFILE_API_BASE_URL[e];if(t)return t+"/v1";throw new h(`Unsupported Network. The ${this.API_NAME} API is not deployed in the Network `+e)}async fetch(e,t,r){const n=await this.getApiBaseUrl();return c(n+e,{headers:this.DEFAULT_HEADERS,method:t,body:void 0!==r?JSON.stringify(r):r})}async fetchProfile(e,t,r){const n=await this.getProfileApiBaseUrl();return c(n+e,{headers:this.DEFAULT_HEADERS,method:t,body:void 0!==r?JSON.stringify(r):r})}post(e,t){return this.fetch(e,"POST",t)}get(e){return this.fetch(e,"GET")}getProfile(e){return this.fetchProfile(e,"GET")}delete(e,t){return this.fetch(e,"DELETE",t)}}let K,Q;async function Z(){if(Q||(Q=new u),!K){const e=await import("./appData.schema-fb2df827.js");K=Q.compile(e)}return{ajv:Q,validate:K}}async function z(e){const t=function(e){const t=e.match(/.{1,2}/g);if(t)return new Uint8Array(t.map(e=>parseInt(e,16)))}(e.replace(/(^0x)/,""));if(!t)return;const r=Uint8Array.from([1,112,18,32,...t]),{CID:n}=await import("multiformats/cid");return n.decode(r).toV0().toString()}async function J(e){var t;const{ajv:r,validate:n}=await Z();return{result:!!n(e),errors:null!==(t=r.errors)&&void 0!==t?t:void 0}}class X{constructor(e){this.context=void 0,this.context=e}async decodeAppData(e){try{const t=await z(e);if(!t)throw new h("Error getting serialized CID");return await async function(e,t="https://gnosis.mypinata.cloud/ipfs"){const{default:r}=await import("cross-fetch"),n=await r(`${t}/${e}`);return await n.json()}(t)}catch(e){throw s.error("Error decoding AppData:",e),new h("Error decoding AppData: "+e)}}async cidToAppDataHex(e){const{CID:t}=await import("multiformats/cid"),{digest:r}=t.parse(e).multihash;return`0x${Buffer.from(r).toString("hex")}`}async appDataHexToCid(e){const t=await z(e);if(!t)throw new h("Error getting serialized CID");return t}}const ee={appDataHash:"0x0000000000000000000000000000000000000000000000000000000000000000",isDevEnvironment:!1,ipfsUri:"https://gnosis.mypinata.cloud/ipfs"};var te=/*#__PURE__*/m("context"),re=/*#__PURE__*/m("chainId");class ne{constructor(e,t){Object.defineProperty(this,te,{writable:!0,value:void 0}),Object.defineProperty(this,re,{writable:!0,value:void 0}),N(this,re)[re]=this.updateChainId(e),N(this,te)[te]=w({},ee,t)}updateChainId(e){if(!f[e])throw new h(`Invalid chainId: ${e}`);return s.debug(p,`Updating chainId to: ${e}`),N(this,re)[re]=e,e}get chainId(){var e,t=this;const r=null==(e=N(this,te)[te].signer)?void 0:e.provider;return r?(s.debug(p,"Getting chainId from provider"),async function(){const e=(await r.getNetwork()).chainId;return e!==N(t,re)[re]&&(s.debug(p,`ChainId mismatch: Provider's chainId: ${e} vs Context's chainId: ${N(t,re)[re]}. Updating Context's chainId`),t.updateChainId(e)),e}()):Promise.resolve(N(this,re)[re])}get appDataHash(){var e;return null!==(e=N(this,te)[te].appDataHash)&&void 0!==e?e:ee.appDataHash}get isDevEnvironment(){var e;return null!==(e=N(this,te)[te].isDevEnvironment)&&void 0!==e?e:ee.isDevEnvironment}get signer(){return N(this,te)[te].signer}get ipfsUri(){var e;return null!==(e=N(this,te)[te].ipfsUri)&&void 0!==e?e:ee.ipfsUri}}class ie{constructor(e,t={},r={}){this.context=void 0,this.cowApi=void 0,this.metadataApi=void 0,this.updateChainId=e=>{this.context.updateChainId(e)},this.validateAppDataDocument=J,this.context=new ne(e,w({},t)),this.cowApi=new Y(this.context),this.metadataApi=new X(this.context),s.setLevel(r.loglevel||"error")}async signOrder(e){const t=this._checkSigner(),r=await this.context.chainId;return async function(e,t,r){return C({order:e,chainId:t},b,r)}(w({},e,{appData:this.context.appDataHash}),r,t)}async signOrderCancellation(e){const t=this._checkSigner();return async function(e,t,r){return C({orderId:e,chainId:t},P,r)}(e,await this.context.chainId,t)}_checkSigner(e=this.context.signer){if(!e)throw new h("No signer available");return e}}export{g as ALL_SUPPORTED_CHAIN_IDS,h as CowError,ie as CowSdk,E as Token};
2
+ //# sourceMappingURL=index.modern.js.map