@cowprotocol/cow-sdk 4.0.5 → 4.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cowprotocol/cow-sdk",
3
- "version": "4.0.5",
3
+ "version": "4.0.7",
4
4
  "license": "(MIT OR Apache-2.0)",
5
5
  "files": [
6
6
  "/dist"
@@ -1,65 +1,71 @@
1
1
  import { LastDaysVolumeQuery, LastHoursVolumeQuery, TotalsQuery } from './graphql';
2
2
  import { DocumentNode } from 'graphql/index';
3
3
  import { Variables } from 'graphql-request';
4
- import { ApiContext, ApiBaseUrls, PartialApiContext } from '../common/configs';
4
+ import { ApiContext } from '../common/configs';
5
+ import { SupportedChainId } from '../common/chains';
6
+ type SubgraphApiBaseUrls = Record<SupportedChainId, string | null>;
7
+ interface SubgraphApiContext extends Omit<ApiContext, 'baseUrls'> {
8
+ baseUrls?: SubgraphApiBaseUrls;
9
+ }
10
+ type PartialSubgraphApiContext = Partial<SubgraphApiContext>;
5
11
  /**
6
12
  * CoW Protocol Production Subgraph API configuration.
7
13
  * @see {@link https://api.thegraph.com/subgraphs/name/cowprotocol/cow}
8
14
  * @see {@link https://api.thegraph.com/subgraphs/name/cowprotocol/cow-gc}
9
15
  * @see {@link https://api.thegraph.com/subgraphs/name/cowprotocol/cow-goerli}
10
16
  */
11
- export declare const SUBGRAPH_PROD_CONFIG: ApiBaseUrls;
17
+ export declare const SUBGRAPH_PROD_CONFIG: SubgraphApiBaseUrls;
12
18
  /**
13
19
  * CoW Protocol Staging Subgraph API configuration.
14
20
  * @deprecated
15
21
  * @see {@link https://api.thegraph.com/subgraphs/name/cowprotocol/cow-staging}
16
22
  * @see {@link https://api.thegraph.com/subgraphs/name/cowprotocol/cow-gc-staging}
17
23
  */
18
- export declare const SUBGRAPH_STAGING_CONFIG: ApiBaseUrls;
24
+ export declare const SUBGRAPH_STAGING_CONFIG: SubgraphApiBaseUrls;
19
25
  /**
20
26
  * TheGraph API client for CoW Protocol.
21
27
  */
22
28
  export declare class SubgraphApi {
23
29
  API_NAME: string;
24
- context: ApiContext;
30
+ context: SubgraphApiContext;
25
31
  /**
26
32
  * Create a new CoW Protocol API instance.
27
- * @param context Any properties of the {@link ApiContext} may be overridden by passing a {@link PartialApiContext}.
33
+ * @param context Any properties of the {@link SubgraphApiContext} may be overridden by passing a {@link PartialSubgraphApiContext}.
28
34
  */
29
- constructor(context?: PartialApiContext);
35
+ constructor(context?: PartialSubgraphApiContext);
30
36
  /**
31
37
  * Query the totals from TheGraph for the CoW Protocol.
32
38
  * @param contextOverride Override the context for this call only.
33
39
  * @returns The totals for the CoW Protocol.
34
40
  */
35
- getTotals(contextOverride?: PartialApiContext): Promise<TotalsQuery['totals'][0]>;
41
+ getTotals(contextOverride?: PartialSubgraphApiContext): Promise<TotalsQuery['totals'][0]>;
36
42
  /**
37
43
  * Query the volume over the last N days from TheGraph for the CoW Protocol.
38
44
  * @param {number} days The number of days to query.
39
- * @param {PartialApiContext} contextOverride Override the context for this call only.
45
+ * @param {PartialSubgraphApiContext} contextOverride Override the context for this call only.
40
46
  * @returns The volume for the last N days.
41
47
  */
42
- getLastDaysVolume(days: number, contextOverride?: PartialApiContext): Promise<LastDaysVolumeQuery>;
48
+ getLastDaysVolume(days: number, contextOverride?: PartialSubgraphApiContext): Promise<LastDaysVolumeQuery>;
43
49
  /**
44
50
  * Query the volume over the last N hours from TheGraph for the CoW Protocol.
45
51
  * @param {number} hours The number of hours to query.
46
- * @param {PartialApiContext} contextOverride Override the context for this call only.
52
+ * @param {PartialSubgraphApiContext} contextOverride Override the context for this call only.
47
53
  * @returns The volume for the last N hours.
48
54
  */
49
- getLastHoursVolume(hours: number, contextOverride?: PartialApiContext): Promise<LastHoursVolumeQuery>;
55
+ getLastHoursVolume(hours: number, contextOverride?: PartialSubgraphApiContext): Promise<LastHoursVolumeQuery>;
50
56
  /**
51
57
  * Run a query against the CoW Protocol Subgraph.
52
58
  * @param {string | DocumentNode} query GQL query string or DocumentNode.
53
59
  * @param {Variables | undefined} variables To be passed to the query.
54
- * @param {PartialApiContext} contextOverride Override the context for this call only.
60
+ * @param {PartialSubgraphApiContext} contextOverride Override the context for this call only.
55
61
  * @returns Results of the query.
56
62
  * @throws {@link CowError} if the query fails.
57
63
  */
58
- runQuery<T>(query: string | DocumentNode, variables?: Variables | undefined, contextOverride?: PartialApiContext): Promise<T>;
64
+ runQuery<T>(query: string | DocumentNode, variables?: Variables | undefined, contextOverride?: PartialSubgraphApiContext): Promise<T>;
59
65
  /**
60
66
  * Override parts of the context for a specific call.
61
- * @param {PartialApiContext} contextOverride Override the context for this call only.
62
- * @returns {ApiContext} The context with the override applied.
67
+ * @param {PartialSubgraphApiContext} contextOverride Override the context for this call only.
68
+ * @returns {SubgraphApiContext} The context with the override applied.
63
69
  */
64
70
  private getContextWithOverride;
65
71
  /**
@@ -69,3 +75,4 @@ export declare class SubgraphApi {
69
75
  */
70
76
  private getEnvConfigs;
71
77
  }
78
+ export {};
@@ -1,2 +1,2 @@
1
- import{C as e,_ as t,a as n,E as r}from"./index-623f3ae6.js";import{domain as i,IntChainIdTypedDataV4Signer as o,TypedDataVersionedSigner as s,signOrder as a,signOrderCancellation as c,signOrderCancellations as d,SigningScheme as u}from"@cowprotocol/contracts";import"cross-fetch/polyfill";import"limiter";import"exponential-backoff";import"graphql-request";import"ethers";import"@openzeppelin/merkle-tree";const l=-32603,h=-32601,g=/Method not found/i,f=/eth_signTypedData_v4 does not exist/i,m=/eth_signTypedData_v3 does not exist/i,p=/RPC request failed/i,v=/provided chainid .* must match the active chainid/i,w={[r.EIP712]:u.EIP712,[r.ETHSIGN]:u.ETHSIGN};async function y(e){const{chainId:t,signer:n,order:r,signingScheme:i}=e,o=T(t);return a(o,r,n,w[i])}async function I(e){const{chainId:t,signer:n,signingScheme:r,orderUid:i}=e,o=T(t);return c(o,i,n,w[r])}async function S(e){const{chainId:t,signer:n,signingScheme:r,orderUids:i}=e,o=T(t);return d(o,i,n,w[r])}async function _(n,i,a,c="v4"){var d;const u="eth_sign"===c?r.ETHSIGN:r.EIP712;let w,y=null;try{switch(c){case"default":case"v3":w=new s(a);break;case"int_v4":w=new o(a);break;default:w=a}}catch(t){throw console.error("Wallet not supported:",t),new e("Wallet not supported")}try{y=await i(t({},n,{signer:w,signingScheme:u}))}catch(e){if(void 0===(I=e).code&&void 0===I.message)throw console.error(e),e;const t=[g,p].some(t=>[e.message,e.toString()].some(e=>t.test(e)));if(e.code!==h&&!t){if(v.test(e.message))return _(n,i,a,"int_v4");if(e.code===l)return _(n,i,a,"eth_sign");if(f.test(e.message))return _(n,i,a,"v3");if(m.test(e.message))return _(n,i,a,"eth_sign");throw console.error(e),e}switch(c){case"v4":return _(n,i,a,"default");case"default":return _(n,i,a,"v3");case"v3":return _(n,i,a,"eth_sign");default:throw e}}var I;const S=null==(d=y)?void 0:d.data;return{signature:(null==S?void 0:S.toString())||"",signingScheme:u}}async function E(e,t,n){return _({order:e,chainId:t},y,n)}async function k(e,t,n){return _({orderUid:e,chainId:t},I,n)}async function x(e,t,n){return _({orderUids:e,chainId:t},S,n)}function T(t){const r=n[t];if(!r)throw new e("Unsupported network. Settlement contract is not deployed");return i(t,r)}export{T as getDomain,E as signOrder,k as signOrderCancellation,x as signOrderCancellations};
2
- //# sourceMappingURL=utils-e89042f2.js.map
1
+ import{C as e,_ as t,a as n,E as r}from"./index-27d2b4d8.js";import{domain as i,IntChainIdTypedDataV4Signer as o,TypedDataVersionedSigner as s,signOrder as a,signOrderCancellation as c,signOrderCancellations as d,SigningScheme as u}from"@cowprotocol/contracts";import"cross-fetch/polyfill";import"limiter";import"exponential-backoff";import"graphql-request";import"ethers";import"@openzeppelin/merkle-tree";const l=-32603,h=-32601,g=/Method not found/i,f=/eth_signTypedData_v4 does not exist/i,m=/eth_signTypedData_v3 does not exist/i,p=/RPC request failed/i,v=/provided chainid .* must match the active chainid/i,w={[r.EIP712]:u.EIP712,[r.ETHSIGN]:u.ETHSIGN};async function y(e){const{chainId:t,signer:n,order:r,signingScheme:i}=e,o=T(t);return a(o,r,n,w[i])}async function I(e){const{chainId:t,signer:n,signingScheme:r,orderUid:i}=e,o=T(t);return c(o,i,n,w[r])}async function S(e){const{chainId:t,signer:n,signingScheme:r,orderUids:i}=e,o=T(t);return d(o,i,n,w[r])}async function _(n,i,a,c="v4"){var d;const u="eth_sign"===c?r.ETHSIGN:r.EIP712;let w,y=null;try{switch(c){case"default":case"v3":w=new s(a);break;case"int_v4":w=new o(a);break;default:w=a}}catch(t){throw console.error("Wallet not supported:",t),new e("Wallet not supported")}try{y=await i(t({},n,{signer:w,signingScheme:u}))}catch(e){if(void 0===(I=e).code&&void 0===I.message)throw console.error(e),e;const t=[g,p].some(t=>[e.message,e.toString()].some(e=>t.test(e)));if(e.code!==h&&!t){if(v.test(e.message))return _(n,i,a,"int_v4");if(e.code===l)return _(n,i,a,"eth_sign");if(f.test(e.message))return _(n,i,a,"v3");if(m.test(e.message))return _(n,i,a,"eth_sign");throw console.error(e),e}switch(c){case"v4":return _(n,i,a,"default");case"default":return _(n,i,a,"v3");case"v3":return _(n,i,a,"eth_sign");default:throw e}}var I;const S=null==(d=y)?void 0:d.data;return{signature:(null==S?void 0:S.toString())||"",signingScheme:u}}async function E(e,t,n){return _({order:e,chainId:t},y,n)}async function k(e,t,n){return _({orderUid:e,chainId:t},I,n)}async function x(e,t,n){return _({orderUids:e,chainId:t},S,n)}function T(t){const r=n[t];if(!r)throw new e("Unsupported network. Settlement contract is not deployed");return i(t,r)}export{T as getDomain,E as signOrder,k as signOrderCancellation,x as signOrderCancellations};
2
+ //# sourceMappingURL=utils-4bf958ac.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils-e89042f2.js","sources":["../src/order-signing/utils.ts"],"sourcesContent":["import type {\n Order as OrderFromContract,\n Signature,\n TypedDataDomain,\n EcdsaSigningScheme as EcdsaSigningSchemeContract,\n} from '@cowprotocol/contracts'\nimport {\n domain as domainGp,\n EcdsaSignature,\n IntChainIdTypedDataV4Signer,\n SigningScheme,\n signOrder as signOrderGp,\n signOrderCancellation as signOrderCancellationGp,\n signOrderCancellations as signOrderCancellationsGp,\n TypedDataVersionedSigner,\n} from '@cowprotocol/contracts'\nimport type { Signer } from '@ethersproject/abstract-signer'\nimport type { SigningResult, SignOrderParams, SignOrderCancellationParams, UnsignedOrder } from './types'\n\nimport { COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS } from '../common/consts'\nimport { CowError, SupportedChainId } from '../common'\nimport { EcdsaSigningScheme } from '../order-book'\nimport { SignOrderCancellationsParams } from './types'\n\n// For error codes, see:\n// - https://eth.wiki/json-rpc/json-rpc-error-codes-improvement-proposal\n// - https://www.jsonrpc.org/specification#error_object\nconst METAMASK_SIGNATURE_ERROR_CODE = -32603\nconst METHOD_NOT_FOUND_ERROR_CODE = -32601\n// Added the following because of 1Inch wallet who doesn't send the error code\n// So we will check the actual error text\nconst METHOD_NOT_FOUND_ERROR_MSG_REGEX = /Method not found/i\nconst V4_ERROR_MSG_REGEX = /eth_signTypedData_v4 does not exist/i\nconst V3_ERROR_MSG_REGEX = /eth_signTypedData_v3 does not exist/i\nconst RPC_REQUEST_FAILED_REGEX = /RPC request failed/i\nconst METAMASK_STRING_CHAINID_REGEX = /provided chainid .* must match the active chainid/i\n\nconst mapSigningSchema: Record<EcdsaSigningScheme, EcdsaSigningSchemeContract> = {\n [EcdsaSigningScheme.EIP712]: SigningScheme.EIP712,\n [EcdsaSigningScheme.ETHSIGN]: SigningScheme.ETHSIGN,\n}\n\ninterface ProviderRpcError extends Error {\n message: string\n code: number\n data?: unknown\n}\n\ntype PayloadParams =\n | Pick<SignOrderParams, 'order' & 'chainId'>\n | Pick<SignOrderCancellationParams, 'chainId' & 'orderId'>\n | Pick<SignOrderCancellationsParams, 'chainId' & 'orderUids'>\n\nfunction isProviderRpcError(error: unknown): error is ProviderRpcError {\n return (error as ProviderRpcError).code !== undefined || (error as ProviderRpcError).message !== undefined\n}\n\nasync function _signOrder(params: SignOrderParams): Promise<Signature> {\n const { chainId, signer, order, signingScheme } = params\n\n const domain = getDomain(chainId)\n\n return signOrderGp(domain, order as OrderFromContract, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellation(params: SignOrderCancellationParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUid } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationGp(domain, orderUid, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellations(params: SignOrderCancellationsParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUids } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationsGp(domain, orderUids, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signPayload(\n payload: PayloadParams,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n signFn: (params: any) => Promise<Signature>,\n signer: Signer,\n signingMethod: 'default' | 'v4' | 'int_v4' | 'v3' | 'eth_sign' = 'v4'\n): Promise<SigningResult> {\n const signingScheme: EcdsaSigningScheme =\n signingMethod === 'eth_sign' ? EcdsaSigningScheme.ETHSIGN : EcdsaSigningScheme.EIP712\n let signature: Signature | null = null\n\n let _signer\n try {\n switch (signingMethod) {\n case 'default':\n case 'v3':\n _signer = new TypedDataVersionedSigner(signer)\n break\n case 'int_v4':\n _signer = new IntChainIdTypedDataV4Signer(signer)\n break\n default:\n _signer = signer\n }\n } catch (e) {\n console.error('Wallet not supported:', e)\n throw new CowError('Wallet not supported')\n }\n\n try {\n signature = (await signFn({ ...payload, signer: _signer, signingScheme })) as EcdsaSignature // Only ECDSA signing supported for now\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (!isProviderRpcError(e)) {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n\n const regexErrorCheck = [METHOD_NOT_FOUND_ERROR_MSG_REGEX, RPC_REQUEST_FAILED_REGEX].some((regex) =>\n // for example 1Inch error doesn't have e.message so we will check the output of toString()\n [e.message, e.toString()].some((msg) => regex.test(msg))\n )\n\n if (e.code === METHOD_NOT_FOUND_ERROR_CODE || regexErrorCheck) {\n // Maybe the wallet returns the proper error code? We can only hope 🤞\n // OR it failed with a generic message, there's no error code set, and we also hope it'll work\n // with other methods...\n switch (signingMethod) {\n case 'v4':\n return _signPayload(payload, signFn, signer, 'default')\n case 'default':\n return _signPayload(payload, signFn, signer, 'v3')\n case 'v3':\n return _signPayload(payload, signFn, signer, 'eth_sign')\n default:\n throw e\n }\n } else if (METAMASK_STRING_CHAINID_REGEX.test(e.message)) {\n // Metamask now enforces chainId to be an integer\n return _signPayload(payload, signFn, signer, 'int_v4')\n } else if (e.code === METAMASK_SIGNATURE_ERROR_CODE) {\n // We tried to sign order the nice way.\n // That works fine for regular MM addresses. Does not work for Hardware wallets, though.\n // See https://github.com/MetaMask/metamask-extension/issues/10240#issuecomment-810552020\n // So, when that specific error occurs, we know this is a problem with MM + HW.\n // Then, we fallback to ETHSIGN.\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else if (V4_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v4`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'v3')\n } else if (V3_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v3`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n }\n\n const data: unknown = signature?.data\n\n return { signature: data?.toString() || '', signingScheme }\n}\n\n/**\n * Returns the signature for the specified order with the signing scheme encoded\n * into the signature.\n * @param {UnsignedOrder} order The order to sign.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrder(\n order: UnsignedOrder,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ order, chainId }, _signOrder, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellation with the signing scheme encoded\n * into the signature.\n * @param {string} orderUid The unique identifier of the order being cancelled.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellation(\n orderUid: string,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUid, chainId }, _signOrderCancellation, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellations with the signing scheme encoded\n * into the signature.\n *\n * @param {string[]} orderUids The unique identifiers of the orders being cancelled.\n * @param {SupportedChainId} chainId The CoW Protocol protocol `chainId` context that's being used.\n * @param {Signer} signer The owner that had placed the orders used to sign.\n * @returns {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellations(\n orderUids: string[],\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUids, chainId }, _signOrderCancellations, signer)\n}\n\n/**\n * Returns the TypedDataDomain used for signing for the specified chainId.\n * @param {SupportedChainId} chainId The chain Id\n * @return {*} The TypedDataDomain for the specified chainId.\n * @throws {CowError} If the chainId is not supported.\n */\nexport function getDomain(chainId: SupportedChainId): TypedDataDomain {\n // Get settlement contract address\n const settlementContract = COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS[chainId]\n\n if (!settlementContract) {\n throw new CowError('Unsupported network. Settlement contract is not deployed')\n }\n\n return domainGp(chainId, settlementContract)\n}\n"],"names":["METAMASK_SIGNATURE_ERROR_CODE","METHOD_NOT_FOUND_ERROR_CODE","METHOD_NOT_FOUND_ERROR_MSG_REGEX","V4_ERROR_MSG_REGEX","V3_ERROR_MSG_REGEX","RPC_REQUEST_FAILED_REGEX","METAMASK_STRING_CHAINID_REGEX","mapSigningSchema","EcdsaSigningScheme","EIP712","SigningScheme","ETHSIGN","async","_signOrder","params","chainId","signer","order","signingScheme","domain","getDomain","signOrderGp","_signOrderCancellation","orderUid","signOrderCancellationGp","_signOrderCancellations","orderUids","signOrderCancellationsGp","_signPayload","payload","signFn","signingMethod","_signature","_signer","signature","TypedDataVersionedSigner","IntChainIdTypedDataV4Signer","e","console","error","CowError","_extends","undefined","code","message","regexErrorCheck","some","regex","toString","msg","test","data","signOrder","signOrderCancellation","signOrderCancellations","settlementContract","COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS","domainGp"],"mappings":"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"}
1
+ {"version":3,"file":"utils-4bf958ac.js","sources":["../src/order-signing/utils.ts"],"sourcesContent":["import type {\n Order as OrderFromContract,\n Signature,\n TypedDataDomain,\n EcdsaSigningScheme as EcdsaSigningSchemeContract,\n} from '@cowprotocol/contracts'\nimport {\n domain as domainGp,\n EcdsaSignature,\n IntChainIdTypedDataV4Signer,\n SigningScheme,\n signOrder as signOrderGp,\n signOrderCancellation as signOrderCancellationGp,\n signOrderCancellations as signOrderCancellationsGp,\n TypedDataVersionedSigner,\n} from '@cowprotocol/contracts'\nimport type { Signer } from '@ethersproject/abstract-signer'\nimport type { SigningResult, SignOrderParams, SignOrderCancellationParams, UnsignedOrder } from './types'\n\nimport { COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS } from '../common/consts'\nimport { CowError, SupportedChainId } from '../common'\nimport { EcdsaSigningScheme } from '../order-book'\nimport { SignOrderCancellationsParams } from './types'\n\n// For error codes, see:\n// - https://eth.wiki/json-rpc/json-rpc-error-codes-improvement-proposal\n// - https://www.jsonrpc.org/specification#error_object\nconst METAMASK_SIGNATURE_ERROR_CODE = -32603\nconst METHOD_NOT_FOUND_ERROR_CODE = -32601\n// Added the following because of 1Inch wallet who doesn't send the error code\n// So we will check the actual error text\nconst METHOD_NOT_FOUND_ERROR_MSG_REGEX = /Method not found/i\nconst V4_ERROR_MSG_REGEX = /eth_signTypedData_v4 does not exist/i\nconst V3_ERROR_MSG_REGEX = /eth_signTypedData_v3 does not exist/i\nconst RPC_REQUEST_FAILED_REGEX = /RPC request failed/i\nconst METAMASK_STRING_CHAINID_REGEX = /provided chainid .* must match the active chainid/i\n\nconst mapSigningSchema: Record<EcdsaSigningScheme, EcdsaSigningSchemeContract> = {\n [EcdsaSigningScheme.EIP712]: SigningScheme.EIP712,\n [EcdsaSigningScheme.ETHSIGN]: SigningScheme.ETHSIGN,\n}\n\ninterface ProviderRpcError extends Error {\n message: string\n code: number\n data?: unknown\n}\n\ntype PayloadParams =\n | Pick<SignOrderParams, 'order' & 'chainId'>\n | Pick<SignOrderCancellationParams, 'chainId' & 'orderId'>\n | Pick<SignOrderCancellationsParams, 'chainId' & 'orderUids'>\n\nfunction isProviderRpcError(error: unknown): error is ProviderRpcError {\n return (error as ProviderRpcError).code !== undefined || (error as ProviderRpcError).message !== undefined\n}\n\nasync function _signOrder(params: SignOrderParams): Promise<Signature> {\n const { chainId, signer, order, signingScheme } = params\n\n const domain = getDomain(chainId)\n\n return signOrderGp(domain, order as OrderFromContract, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellation(params: SignOrderCancellationParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUid } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationGp(domain, orderUid, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellations(params: SignOrderCancellationsParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUids } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationsGp(domain, orderUids, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signPayload(\n payload: PayloadParams,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n signFn: (params: any) => Promise<Signature>,\n signer: Signer,\n signingMethod: 'default' | 'v4' | 'int_v4' | 'v3' | 'eth_sign' = 'v4'\n): Promise<SigningResult> {\n const signingScheme: EcdsaSigningScheme =\n signingMethod === 'eth_sign' ? EcdsaSigningScheme.ETHSIGN : EcdsaSigningScheme.EIP712\n let signature: Signature | null = null\n\n let _signer\n try {\n switch (signingMethod) {\n case 'default':\n case 'v3':\n _signer = new TypedDataVersionedSigner(signer)\n break\n case 'int_v4':\n _signer = new IntChainIdTypedDataV4Signer(signer)\n break\n default:\n _signer = signer\n }\n } catch (e) {\n console.error('Wallet not supported:', e)\n throw new CowError('Wallet not supported')\n }\n\n try {\n signature = (await signFn({ ...payload, signer: _signer, signingScheme })) as EcdsaSignature // Only ECDSA signing supported for now\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (!isProviderRpcError(e)) {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n\n const regexErrorCheck = [METHOD_NOT_FOUND_ERROR_MSG_REGEX, RPC_REQUEST_FAILED_REGEX].some((regex) =>\n // for example 1Inch error doesn't have e.message so we will check the output of toString()\n [e.message, e.toString()].some((msg) => regex.test(msg))\n )\n\n if (e.code === METHOD_NOT_FOUND_ERROR_CODE || regexErrorCheck) {\n // Maybe the wallet returns the proper error code? We can only hope 🤞\n // OR it failed with a generic message, there's no error code set, and we also hope it'll work\n // with other methods...\n switch (signingMethod) {\n case 'v4':\n return _signPayload(payload, signFn, signer, 'default')\n case 'default':\n return _signPayload(payload, signFn, signer, 'v3')\n case 'v3':\n return _signPayload(payload, signFn, signer, 'eth_sign')\n default:\n throw e\n }\n } else if (METAMASK_STRING_CHAINID_REGEX.test(e.message)) {\n // Metamask now enforces chainId to be an integer\n return _signPayload(payload, signFn, signer, 'int_v4')\n } else if (e.code === METAMASK_SIGNATURE_ERROR_CODE) {\n // We tried to sign order the nice way.\n // That works fine for regular MM addresses. Does not work for Hardware wallets, though.\n // See https://github.com/MetaMask/metamask-extension/issues/10240#issuecomment-810552020\n // So, when that specific error occurs, we know this is a problem with MM + HW.\n // Then, we fallback to ETHSIGN.\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else if (V4_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v4`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'v3')\n } else if (V3_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v3`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n }\n\n const data: unknown = signature?.data\n\n return { signature: data?.toString() || '', signingScheme }\n}\n\n/**\n * Returns the signature for the specified order with the signing scheme encoded\n * into the signature.\n * @param {UnsignedOrder} order The order to sign.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrder(\n order: UnsignedOrder,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ order, chainId }, _signOrder, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellation with the signing scheme encoded\n * into the signature.\n * @param {string} orderUid The unique identifier of the order being cancelled.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellation(\n orderUid: string,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUid, chainId }, _signOrderCancellation, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellations with the signing scheme encoded\n * into the signature.\n *\n * @param {string[]} orderUids The unique identifiers of the orders being cancelled.\n * @param {SupportedChainId} chainId The CoW Protocol protocol `chainId` context that's being used.\n * @param {Signer} signer The owner that had placed the orders used to sign.\n * @returns {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellations(\n orderUids: string[],\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUids, chainId }, _signOrderCancellations, signer)\n}\n\n/**\n * Returns the TypedDataDomain used for signing for the specified chainId.\n * @param {SupportedChainId} chainId The chain Id\n * @return {*} The TypedDataDomain for the specified chainId.\n * @throws {CowError} If the chainId is not supported.\n */\nexport function getDomain(chainId: SupportedChainId): TypedDataDomain {\n // Get settlement contract address\n const settlementContract = COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS[chainId]\n\n if (!settlementContract) {\n throw new CowError('Unsupported network. Settlement contract is not deployed')\n }\n\n return domainGp(chainId, settlementContract)\n}\n"],"names":["METAMASK_SIGNATURE_ERROR_CODE","METHOD_NOT_FOUND_ERROR_CODE","METHOD_NOT_FOUND_ERROR_MSG_REGEX","V4_ERROR_MSG_REGEX","V3_ERROR_MSG_REGEX","RPC_REQUEST_FAILED_REGEX","METAMASK_STRING_CHAINID_REGEX","mapSigningSchema","EcdsaSigningScheme","EIP712","SigningScheme","ETHSIGN","async","_signOrder","params","chainId","signer","order","signingScheme","domain","getDomain","signOrderGp","_signOrderCancellation","orderUid","signOrderCancellationGp","_signOrderCancellations","orderUids","signOrderCancellationsGp","_signPayload","payload","signFn","signingMethod","_signature","_signer","signature","TypedDataVersionedSigner","IntChainIdTypedDataV4Signer","e","console","error","CowError","_extends","undefined","code","message","regexErrorCheck","some","regex","toString","msg","test","data","signOrder","signOrderCancellation","signOrderCancellations","settlementContract","COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS","domainGp"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
1
  import{IntChainIdTypedDataV4Signer as e,TypedDataVersionedSigner as t,signOrderCancellations as r,signOrderCancellation as n,signOrder as o,SigningScheme as i,domain as s}from"@cowprotocol/contracts";import{EcdsaSigningScheme as c,CowError as a,COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS as u}from"./index.module.js";import"cross-fetch/polyfill";import"limiter";import"exponential-backoff";import"graphql-request";import"ethers";import"@openzeppelin/merkle-tree";const d=function(e,t,r){return m({orderUids:e,chainId:t},f,r)},h=function(e,t,r){return m({orderUid:e,chainId:t},g,r)},l=function(e,t,r){return m({order:e,chainId:t},p,r)},m=function(r,n,o,i="v4"){try{let u;function s(e){if(u)return e;const t=l?.data;return{signature:t?.toString()||"",signingScheme:d}}const d="eth_sign"===i?c.ETHSIGN:c.EIP712;let h,l=null;try{switch(i){case"default":case"v3":h=new t(o);break;case"int_v4":h=new e(o);break;default:h=o}}catch(g){throw console.error("Wallet not supported:",g),new a("Wallet not supported")}const f=function(e,t){try{var o=Promise.resolve(n({...r,signer:h,signingScheme:d})).then(function(e){l=e})}catch(e){return t(e)}return o&&o.then?o.then(void 0,t):o}(0,function(e){if(void 0===(t=e).code&&void 0===t.message)throw console.error(e),e;var t;const s=[P,y].some(t=>[e.message,e.toString()].some(e=>t.test(e)));if(e.code!==w&&!s){if(_.test(e.message)){const e=m(r,n,o,"int_v4");return u=1,e}if(e.code===v){const e=m(r,n,o,"eth_sign");return u=1,e}if(I.test(e.message)){const e=m(r,n,o,"v3");return u=1,e}if(S.test(e.message)){const e=m(r,n,o,"eth_sign");return u=1,e}throw console.error(e),e}switch(i){case"v4":const t=m(r,n,o,"default");return u=1,t;case"default":const i=m(r,n,o,"v3");return u=1,i;case"v3":const s=m(r,n,o,"eth_sign");return u=1,s;default:throw e}});return Promise.resolve(f&&f.then?f.then(s):s(f))}catch(p){return Promise.reject(p)}},f=function(e){try{const{chainId:t,signer:n,signingScheme:o,orderUids:i}=e,s=j(t);return Promise.resolve(r(s,i,n,E[o]))}catch(e){return Promise.reject(e)}},g=function(e){try{const{chainId:t,signer:r,signingScheme:o,orderUid:i}=e,s=j(t);return Promise.resolve(n(s,i,r,E[o]))}catch(e){return Promise.reject(e)}},p=function(e){try{const{chainId:t,signer:r,order:n,signingScheme:i}=e,s=j(t);return Promise.resolve(o(s,n,r,E[i]))}catch(e){return Promise.reject(e)}},v=-32603,w=-32601,P=/Method not found/i,I=/eth_signTypedData_v4 does not exist/i,S=/eth_signTypedData_v3 does not exist/i,y=/RPC request failed/i,_=/provided chainid .* must match the active chainid/i,E={[c.EIP712]:i.EIP712,[c.ETHSIGN]:i.ETHSIGN};function j(e){const t=u[e];if(!t)throw new a("Unsupported network. Settlement contract is not deployed");return s(e,t)}export{j as getDomain,l as signOrder,h as signOrderCancellation,d as signOrderCancellations};
2
- //# sourceMappingURL=utils-7228f4a7.js.map
2
+ //# sourceMappingURL=utils-c968a948.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils-7228f4a7.js","sources":["../src/order-signing/utils.ts"],"sourcesContent":["import type {\n Order as OrderFromContract,\n Signature,\n TypedDataDomain,\n EcdsaSigningScheme as EcdsaSigningSchemeContract,\n} from '@cowprotocol/contracts'\nimport {\n domain as domainGp,\n EcdsaSignature,\n IntChainIdTypedDataV4Signer,\n SigningScheme,\n signOrder as signOrderGp,\n signOrderCancellation as signOrderCancellationGp,\n signOrderCancellations as signOrderCancellationsGp,\n TypedDataVersionedSigner,\n} from '@cowprotocol/contracts'\nimport type { Signer } from '@ethersproject/abstract-signer'\nimport type { SigningResult, SignOrderParams, SignOrderCancellationParams, UnsignedOrder } from './types'\n\nimport { COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS } from '../common/consts'\nimport { CowError, SupportedChainId } from '../common'\nimport { EcdsaSigningScheme } from '../order-book'\nimport { SignOrderCancellationsParams } from './types'\n\n// For error codes, see:\n// - https://eth.wiki/json-rpc/json-rpc-error-codes-improvement-proposal\n// - https://www.jsonrpc.org/specification#error_object\nconst METAMASK_SIGNATURE_ERROR_CODE = -32603\nconst METHOD_NOT_FOUND_ERROR_CODE = -32601\n// Added the following because of 1Inch wallet who doesn't send the error code\n// So we will check the actual error text\nconst METHOD_NOT_FOUND_ERROR_MSG_REGEX = /Method not found/i\nconst V4_ERROR_MSG_REGEX = /eth_signTypedData_v4 does not exist/i\nconst V3_ERROR_MSG_REGEX = /eth_signTypedData_v3 does not exist/i\nconst RPC_REQUEST_FAILED_REGEX = /RPC request failed/i\nconst METAMASK_STRING_CHAINID_REGEX = /provided chainid .* must match the active chainid/i\n\nconst mapSigningSchema: Record<EcdsaSigningScheme, EcdsaSigningSchemeContract> = {\n [EcdsaSigningScheme.EIP712]: SigningScheme.EIP712,\n [EcdsaSigningScheme.ETHSIGN]: SigningScheme.ETHSIGN,\n}\n\ninterface ProviderRpcError extends Error {\n message: string\n code: number\n data?: unknown\n}\n\ntype PayloadParams =\n | Pick<SignOrderParams, 'order' & 'chainId'>\n | Pick<SignOrderCancellationParams, 'chainId' & 'orderId'>\n | Pick<SignOrderCancellationsParams, 'chainId' & 'orderUids'>\n\nfunction isProviderRpcError(error: unknown): error is ProviderRpcError {\n return (error as ProviderRpcError).code !== undefined || (error as ProviderRpcError).message !== undefined\n}\n\nasync function _signOrder(params: SignOrderParams): Promise<Signature> {\n const { chainId, signer, order, signingScheme } = params\n\n const domain = getDomain(chainId)\n\n return signOrderGp(domain, order as OrderFromContract, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellation(params: SignOrderCancellationParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUid } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationGp(domain, orderUid, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellations(params: SignOrderCancellationsParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUids } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationsGp(domain, orderUids, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signPayload(\n payload: PayloadParams,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n signFn: (params: any) => Promise<Signature>,\n signer: Signer,\n signingMethod: 'default' | 'v4' | 'int_v4' | 'v3' | 'eth_sign' = 'v4'\n): Promise<SigningResult> {\n const signingScheme: EcdsaSigningScheme =\n signingMethod === 'eth_sign' ? EcdsaSigningScheme.ETHSIGN : EcdsaSigningScheme.EIP712\n let signature: Signature | null = null\n\n let _signer\n try {\n switch (signingMethod) {\n case 'default':\n case 'v3':\n _signer = new TypedDataVersionedSigner(signer)\n break\n case 'int_v4':\n _signer = new IntChainIdTypedDataV4Signer(signer)\n break\n default:\n _signer = signer\n }\n } catch (e) {\n console.error('Wallet not supported:', e)\n throw new CowError('Wallet not supported')\n }\n\n try {\n signature = (await signFn({ ...payload, signer: _signer, signingScheme })) as EcdsaSignature // Only ECDSA signing supported for now\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (!isProviderRpcError(e)) {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n\n const regexErrorCheck = [METHOD_NOT_FOUND_ERROR_MSG_REGEX, RPC_REQUEST_FAILED_REGEX].some((regex) =>\n // for example 1Inch error doesn't have e.message so we will check the output of toString()\n [e.message, e.toString()].some((msg) => regex.test(msg))\n )\n\n if (e.code === METHOD_NOT_FOUND_ERROR_CODE || regexErrorCheck) {\n // Maybe the wallet returns the proper error code? We can only hope 🤞\n // OR it failed with a generic message, there's no error code set, and we also hope it'll work\n // with other methods...\n switch (signingMethod) {\n case 'v4':\n return _signPayload(payload, signFn, signer, 'default')\n case 'default':\n return _signPayload(payload, signFn, signer, 'v3')\n case 'v3':\n return _signPayload(payload, signFn, signer, 'eth_sign')\n default:\n throw e\n }\n } else if (METAMASK_STRING_CHAINID_REGEX.test(e.message)) {\n // Metamask now enforces chainId to be an integer\n return _signPayload(payload, signFn, signer, 'int_v4')\n } else if (e.code === METAMASK_SIGNATURE_ERROR_CODE) {\n // We tried to sign order the nice way.\n // That works fine for regular MM addresses. Does not work for Hardware wallets, though.\n // See https://github.com/MetaMask/metamask-extension/issues/10240#issuecomment-810552020\n // So, when that specific error occurs, we know this is a problem with MM + HW.\n // Then, we fallback to ETHSIGN.\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else if (V4_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v4`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'v3')\n } else if (V3_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v3`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n }\n\n const data: unknown = signature?.data\n\n return { signature: data?.toString() || '', signingScheme }\n}\n\n/**\n * Returns the signature for the specified order with the signing scheme encoded\n * into the signature.\n * @param {UnsignedOrder} order The order to sign.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrder(\n order: UnsignedOrder,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ order, chainId }, _signOrder, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellation with the signing scheme encoded\n * into the signature.\n * @param {string} orderUid The unique identifier of the order being cancelled.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellation(\n orderUid: string,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUid, chainId }, _signOrderCancellation, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellations with the signing scheme encoded\n * into the signature.\n *\n * @param {string[]} orderUids The unique identifiers of the orders being cancelled.\n * @param {SupportedChainId} chainId The CoW Protocol protocol `chainId` context that's being used.\n * @param {Signer} signer The owner that had placed the orders used to sign.\n * @returns {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellations(\n orderUids: string[],\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUids, chainId }, _signOrderCancellations, signer)\n}\n\n/**\n * Returns the TypedDataDomain used for signing for the specified chainId.\n * @param {SupportedChainId} chainId The chain Id\n * @return {*} The TypedDataDomain for the specified chainId.\n * @throws {CowError} If the chainId is not supported.\n */\nexport function getDomain(chainId: SupportedChainId): TypedDataDomain {\n // Get settlement contract address\n const settlementContract = COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS[chainId]\n\n if (!settlementContract) {\n throw new CowError('Unsupported network. Settlement contract is not deployed')\n }\n\n return domainGp(chainId, settlementContract)\n}\n"],"names":["signOrderCancellations","orderUids","chainId","signer","_signPayload","_signOrderCancellations","signOrderCancellation","orderUid","_signOrderCancellation","signOrder","order","_signOrder","payload","signFn","signingMethod","_exit","_temp2","_result","data","signature","toString","signingScheme","EcdsaSigningScheme","ETHSIGN","EIP712","_signer","TypedDataVersionedSigner","IntChainIdTypedDataV4Signer","e","console","error","CowError","_temp","Promise","resolve","then","_signFn","_catch","undefined","code","message","regexErrorCheck","METHOD_NOT_FOUND_ERROR_MSG_REGEX","RPC_REQUEST_FAILED_REGEX","some","regex","msg","test","METHOD_NOT_FOUND_ERROR_CODE","METAMASK_STRING_CHAINID_REGEX","_signPayload5","METAMASK_SIGNATURE_ERROR_CODE","_signPayload6","V4_ERROR_MSG_REGEX","_signPayload7","V3_ERROR_MSG_REGEX","_signPayload8","_signPayload2","_signPayload3","_signPayload4","reject","params","domain","getDomain","signOrderCancellationsGp","mapSigningSchema","signOrderCancellationGp","signOrderGp","SigningScheme","settlementContract","COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS","domainGp"],"mappings":"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"}
1
+ {"version":3,"file":"utils-c968a948.js","sources":["../src/order-signing/utils.ts"],"sourcesContent":["import type {\n Order as OrderFromContract,\n Signature,\n TypedDataDomain,\n EcdsaSigningScheme as EcdsaSigningSchemeContract,\n} from '@cowprotocol/contracts'\nimport {\n domain as domainGp,\n EcdsaSignature,\n IntChainIdTypedDataV4Signer,\n SigningScheme,\n signOrder as signOrderGp,\n signOrderCancellation as signOrderCancellationGp,\n signOrderCancellations as signOrderCancellationsGp,\n TypedDataVersionedSigner,\n} from '@cowprotocol/contracts'\nimport type { Signer } from '@ethersproject/abstract-signer'\nimport type { SigningResult, SignOrderParams, SignOrderCancellationParams, UnsignedOrder } from './types'\n\nimport { COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS } from '../common/consts'\nimport { CowError, SupportedChainId } from '../common'\nimport { EcdsaSigningScheme } from '../order-book'\nimport { SignOrderCancellationsParams } from './types'\n\n// For error codes, see:\n// - https://eth.wiki/json-rpc/json-rpc-error-codes-improvement-proposal\n// - https://www.jsonrpc.org/specification#error_object\nconst METAMASK_SIGNATURE_ERROR_CODE = -32603\nconst METHOD_NOT_FOUND_ERROR_CODE = -32601\n// Added the following because of 1Inch wallet who doesn't send the error code\n// So we will check the actual error text\nconst METHOD_NOT_FOUND_ERROR_MSG_REGEX = /Method not found/i\nconst V4_ERROR_MSG_REGEX = /eth_signTypedData_v4 does not exist/i\nconst V3_ERROR_MSG_REGEX = /eth_signTypedData_v3 does not exist/i\nconst RPC_REQUEST_FAILED_REGEX = /RPC request failed/i\nconst METAMASK_STRING_CHAINID_REGEX = /provided chainid .* must match the active chainid/i\n\nconst mapSigningSchema: Record<EcdsaSigningScheme, EcdsaSigningSchemeContract> = {\n [EcdsaSigningScheme.EIP712]: SigningScheme.EIP712,\n [EcdsaSigningScheme.ETHSIGN]: SigningScheme.ETHSIGN,\n}\n\ninterface ProviderRpcError extends Error {\n message: string\n code: number\n data?: unknown\n}\n\ntype PayloadParams =\n | Pick<SignOrderParams, 'order' & 'chainId'>\n | Pick<SignOrderCancellationParams, 'chainId' & 'orderId'>\n | Pick<SignOrderCancellationsParams, 'chainId' & 'orderUids'>\n\nfunction isProviderRpcError(error: unknown): error is ProviderRpcError {\n return (error as ProviderRpcError).code !== undefined || (error as ProviderRpcError).message !== undefined\n}\n\nasync function _signOrder(params: SignOrderParams): Promise<Signature> {\n const { chainId, signer, order, signingScheme } = params\n\n const domain = getDomain(chainId)\n\n return signOrderGp(domain, order as OrderFromContract, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellation(params: SignOrderCancellationParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUid } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationGp(domain, orderUid, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellations(params: SignOrderCancellationsParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUids } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationsGp(domain, orderUids, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signPayload(\n payload: PayloadParams,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n signFn: (params: any) => Promise<Signature>,\n signer: Signer,\n signingMethod: 'default' | 'v4' | 'int_v4' | 'v3' | 'eth_sign' = 'v4'\n): Promise<SigningResult> {\n const signingScheme: EcdsaSigningScheme =\n signingMethod === 'eth_sign' ? EcdsaSigningScheme.ETHSIGN : EcdsaSigningScheme.EIP712\n let signature: Signature | null = null\n\n let _signer\n try {\n switch (signingMethod) {\n case 'default':\n case 'v3':\n _signer = new TypedDataVersionedSigner(signer)\n break\n case 'int_v4':\n _signer = new IntChainIdTypedDataV4Signer(signer)\n break\n default:\n _signer = signer\n }\n } catch (e) {\n console.error('Wallet not supported:', e)\n throw new CowError('Wallet not supported')\n }\n\n try {\n signature = (await signFn({ ...payload, signer: _signer, signingScheme })) as EcdsaSignature // Only ECDSA signing supported for now\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (!isProviderRpcError(e)) {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n\n const regexErrorCheck = [METHOD_NOT_FOUND_ERROR_MSG_REGEX, RPC_REQUEST_FAILED_REGEX].some((regex) =>\n // for example 1Inch error doesn't have e.message so we will check the output of toString()\n [e.message, e.toString()].some((msg) => regex.test(msg))\n )\n\n if (e.code === METHOD_NOT_FOUND_ERROR_CODE || regexErrorCheck) {\n // Maybe the wallet returns the proper error code? We can only hope 🤞\n // OR it failed with a generic message, there's no error code set, and we also hope it'll work\n // with other methods...\n switch (signingMethod) {\n case 'v4':\n return _signPayload(payload, signFn, signer, 'default')\n case 'default':\n return _signPayload(payload, signFn, signer, 'v3')\n case 'v3':\n return _signPayload(payload, signFn, signer, 'eth_sign')\n default:\n throw e\n }\n } else if (METAMASK_STRING_CHAINID_REGEX.test(e.message)) {\n // Metamask now enforces chainId to be an integer\n return _signPayload(payload, signFn, signer, 'int_v4')\n } else if (e.code === METAMASK_SIGNATURE_ERROR_CODE) {\n // We tried to sign order the nice way.\n // That works fine for regular MM addresses. Does not work for Hardware wallets, though.\n // See https://github.com/MetaMask/metamask-extension/issues/10240#issuecomment-810552020\n // So, when that specific error occurs, we know this is a problem with MM + HW.\n // Then, we fallback to ETHSIGN.\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else if (V4_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v4`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'v3')\n } else if (V3_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v3`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n }\n\n const data: unknown = signature?.data\n\n return { signature: data?.toString() || '', signingScheme }\n}\n\n/**\n * Returns the signature for the specified order with the signing scheme encoded\n * into the signature.\n * @param {UnsignedOrder} order The order to sign.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrder(\n order: UnsignedOrder,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ order, chainId }, _signOrder, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellation with the signing scheme encoded\n * into the signature.\n * @param {string} orderUid The unique identifier of the order being cancelled.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellation(\n orderUid: string,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUid, chainId }, _signOrderCancellation, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellations with the signing scheme encoded\n * into the signature.\n *\n * @param {string[]} orderUids The unique identifiers of the orders being cancelled.\n * @param {SupportedChainId} chainId The CoW Protocol protocol `chainId` context that's being used.\n * @param {Signer} signer The owner that had placed the orders used to sign.\n * @returns {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellations(\n orderUids: string[],\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUids, chainId }, _signOrderCancellations, signer)\n}\n\n/**\n * Returns the TypedDataDomain used for signing for the specified chainId.\n * @param {SupportedChainId} chainId The chain Id\n * @return {*} The TypedDataDomain for the specified chainId.\n * @throws {CowError} If the chainId is not supported.\n */\nexport function getDomain(chainId: SupportedChainId): TypedDataDomain {\n // Get settlement contract address\n const settlementContract = COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS[chainId]\n\n if (!settlementContract) {\n throw new CowError('Unsupported network. Settlement contract is not deployed')\n }\n\n return domainGp(chainId, settlementContract)\n}\n"],"names":["signOrderCancellations","orderUids","chainId","signer","_signPayload","_signOrderCancellations","signOrderCancellation","orderUid","_signOrderCancellation","signOrder","order","_signOrder","payload","signFn","signingMethod","_exit","_temp2","_result","data","signature","toString","signingScheme","EcdsaSigningScheme","ETHSIGN","EIP712","_signer","TypedDataVersionedSigner","IntChainIdTypedDataV4Signer","e","console","error","CowError","_temp","Promise","resolve","then","_signFn","_catch","undefined","code","message","regexErrorCheck","METHOD_NOT_FOUND_ERROR_MSG_REGEX","RPC_REQUEST_FAILED_REGEX","some","regex","msg","test","METHOD_NOT_FOUND_ERROR_CODE","METAMASK_STRING_CHAINID_REGEX","_signPayload5","METAMASK_SIGNATURE_ERROR_CODE","_signPayload6","V4_ERROR_MSG_REGEX","_signPayload7","V3_ERROR_MSG_REGEX","_signPayload8","_signPayload2","_signPayload3","_signPayload4","reject","params","domain","getDomain","signOrderCancellationsGp","mapSigningSchema","signOrderCancellationGp","signOrderGp","SigningScheme","settlementContract","COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS","domainGp"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
1
  var e=require("@cowprotocol/contracts"),r=require("./index.js");require("cross-fetch/polyfill"),require("limiter"),require("exponential-backoff"),require("graphql-request"),require("ethers"),require("@openzeppelin/merkle-tree");const n=function(t,i,o,l="v4"){try{let f;function m(e){if(f)return e;const r=v?.data;return{signature:r?.toString()||"",signingScheme:S}}const S="eth_sign"===l?r.EcdsaSigningScheme.ETHSIGN:r.EcdsaSigningScheme.EIP712;let p,v=null;try{switch(l){case"default":case"v3":p=new e.TypedDataVersionedSigner(o);break;case"int_v4":p=new e.IntChainIdTypedDataV4Signer(o);break;default:p=o}}catch(w){throw console.error("Wallet not supported:",w),new r.CowError("Wallet not supported")}const E=function(e,r){try{var n=Promise.resolve(i({...t,signer:p,signingScheme:S})).then(function(e){v=e})}catch(e){return r(e)}return n&&n.then?n.then(void 0,r):n}(0,function(e){if(void 0===(r=e).code&&void 0===r.message)throw console.error(e),e;var r;const m=[a,g].some(r=>[e.message,e.toString()].some(e=>r.test(e)));if(e.code!==c&&!m){if(h.test(e.message)){const e=n(t,i,o,"int_v4");return f=1,e}if(e.code===s){const e=n(t,i,o,"eth_sign");return f=1,e}if(d.test(e.message)){const e=n(t,i,o,"v3");return f=1,e}if(u.test(e.message)){const e=n(t,i,o,"eth_sign");return f=1,e}throw console.error(e),e}switch(l){case"v4":const r=n(t,i,o,"default");return f=1,r;case"default":const s=n(t,i,o,"v3");return f=1,s;case"v3":const c=n(t,i,o,"eth_sign");return f=1,c;default:throw e}});return Promise.resolve(E&&E.then?E.then(m):m(E))}catch(I){return Promise.reject(I)}},t=function(r){try{const{chainId:n,signer:t,signingScheme:i,orderUids:o}=r,s=m(n);return Promise.resolve(e.signOrderCancellations(s,o,t,l[i]))}catch(e){return Promise.reject(e)}},i=function(r){try{const{chainId:n,signer:t,signingScheme:i,orderUid:o}=r,s=m(n);return Promise.resolve(e.signOrderCancellation(s,o,t,l[i]))}catch(e){return Promise.reject(e)}},o=function(r){try{const{chainId:n,signer:t,order:i,signingScheme:o}=r,s=m(n);return Promise.resolve(e.signOrder(s,i,t,l[o]))}catch(e){return Promise.reject(e)}},s=-32603,c=-32601,a=/Method not found/i,d=/eth_signTypedData_v4 does not exist/i,u=/eth_signTypedData_v3 does not exist/i,g=/RPC request failed/i,h=/provided chainid .* must match the active chainid/i,l={[r.EcdsaSigningScheme.EIP712]:e.SigningScheme.EIP712,[r.EcdsaSigningScheme.ETHSIGN]:e.SigningScheme.ETHSIGN};function m(n){const t=r.COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS[n];if(!t)throw new r.CowError("Unsupported network. Settlement contract is not deployed");return e.domain(n,t)}exports.getDomain=m,exports.signOrder=function(e,r,t){return n({order:e,chainId:r},o,t)},exports.signOrderCancellation=function(e,r,t){return n({orderUid:e,chainId:r},i,t)},exports.signOrderCancellations=function(e,r,i){return n({orderUids:e,chainId:r},t,i)};
2
- //# sourceMappingURL=utils-55de8409.js.map
2
+ //# sourceMappingURL=utils-e6a32f94.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils-55de8409.js","sources":["../src/order-signing/utils.ts"],"sourcesContent":["import type {\n Order as OrderFromContract,\n Signature,\n TypedDataDomain,\n EcdsaSigningScheme as EcdsaSigningSchemeContract,\n} from '@cowprotocol/contracts'\nimport {\n domain as domainGp,\n EcdsaSignature,\n IntChainIdTypedDataV4Signer,\n SigningScheme,\n signOrder as signOrderGp,\n signOrderCancellation as signOrderCancellationGp,\n signOrderCancellations as signOrderCancellationsGp,\n TypedDataVersionedSigner,\n} from '@cowprotocol/contracts'\nimport type { Signer } from '@ethersproject/abstract-signer'\nimport type { SigningResult, SignOrderParams, SignOrderCancellationParams, UnsignedOrder } from './types'\n\nimport { COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS } from '../common/consts'\nimport { CowError, SupportedChainId } from '../common'\nimport { EcdsaSigningScheme } from '../order-book'\nimport { SignOrderCancellationsParams } from './types'\n\n// For error codes, see:\n// - https://eth.wiki/json-rpc/json-rpc-error-codes-improvement-proposal\n// - https://www.jsonrpc.org/specification#error_object\nconst METAMASK_SIGNATURE_ERROR_CODE = -32603\nconst METHOD_NOT_FOUND_ERROR_CODE = -32601\n// Added the following because of 1Inch wallet who doesn't send the error code\n// So we will check the actual error text\nconst METHOD_NOT_FOUND_ERROR_MSG_REGEX = /Method not found/i\nconst V4_ERROR_MSG_REGEX = /eth_signTypedData_v4 does not exist/i\nconst V3_ERROR_MSG_REGEX = /eth_signTypedData_v3 does not exist/i\nconst RPC_REQUEST_FAILED_REGEX = /RPC request failed/i\nconst METAMASK_STRING_CHAINID_REGEX = /provided chainid .* must match the active chainid/i\n\nconst mapSigningSchema: Record<EcdsaSigningScheme, EcdsaSigningSchemeContract> = {\n [EcdsaSigningScheme.EIP712]: SigningScheme.EIP712,\n [EcdsaSigningScheme.ETHSIGN]: SigningScheme.ETHSIGN,\n}\n\ninterface ProviderRpcError extends Error {\n message: string\n code: number\n data?: unknown\n}\n\ntype PayloadParams =\n | Pick<SignOrderParams, 'order' & 'chainId'>\n | Pick<SignOrderCancellationParams, 'chainId' & 'orderId'>\n | Pick<SignOrderCancellationsParams, 'chainId' & 'orderUids'>\n\nfunction isProviderRpcError(error: unknown): error is ProviderRpcError {\n return (error as ProviderRpcError).code !== undefined || (error as ProviderRpcError).message !== undefined\n}\n\nasync function _signOrder(params: SignOrderParams): Promise<Signature> {\n const { chainId, signer, order, signingScheme } = params\n\n const domain = getDomain(chainId)\n\n return signOrderGp(domain, order as OrderFromContract, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellation(params: SignOrderCancellationParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUid } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationGp(domain, orderUid, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellations(params: SignOrderCancellationsParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUids } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationsGp(domain, orderUids, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signPayload(\n payload: PayloadParams,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n signFn: (params: any) => Promise<Signature>,\n signer: Signer,\n signingMethod: 'default' | 'v4' | 'int_v4' | 'v3' | 'eth_sign' = 'v4'\n): Promise<SigningResult> {\n const signingScheme: EcdsaSigningScheme =\n signingMethod === 'eth_sign' ? EcdsaSigningScheme.ETHSIGN : EcdsaSigningScheme.EIP712\n let signature: Signature | null = null\n\n let _signer\n try {\n switch (signingMethod) {\n case 'default':\n case 'v3':\n _signer = new TypedDataVersionedSigner(signer)\n break\n case 'int_v4':\n _signer = new IntChainIdTypedDataV4Signer(signer)\n break\n default:\n _signer = signer\n }\n } catch (e) {\n console.error('Wallet not supported:', e)\n throw new CowError('Wallet not supported')\n }\n\n try {\n signature = (await signFn({ ...payload, signer: _signer, signingScheme })) as EcdsaSignature // Only ECDSA signing supported for now\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (!isProviderRpcError(e)) {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n\n const regexErrorCheck = [METHOD_NOT_FOUND_ERROR_MSG_REGEX, RPC_REQUEST_FAILED_REGEX].some((regex) =>\n // for example 1Inch error doesn't have e.message so we will check the output of toString()\n [e.message, e.toString()].some((msg) => regex.test(msg))\n )\n\n if (e.code === METHOD_NOT_FOUND_ERROR_CODE || regexErrorCheck) {\n // Maybe the wallet returns the proper error code? We can only hope 🤞\n // OR it failed with a generic message, there's no error code set, and we also hope it'll work\n // with other methods...\n switch (signingMethod) {\n case 'v4':\n return _signPayload(payload, signFn, signer, 'default')\n case 'default':\n return _signPayload(payload, signFn, signer, 'v3')\n case 'v3':\n return _signPayload(payload, signFn, signer, 'eth_sign')\n default:\n throw e\n }\n } else if (METAMASK_STRING_CHAINID_REGEX.test(e.message)) {\n // Metamask now enforces chainId to be an integer\n return _signPayload(payload, signFn, signer, 'int_v4')\n } else if (e.code === METAMASK_SIGNATURE_ERROR_CODE) {\n // We tried to sign order the nice way.\n // That works fine for regular MM addresses. Does not work for Hardware wallets, though.\n // See https://github.com/MetaMask/metamask-extension/issues/10240#issuecomment-810552020\n // So, when that specific error occurs, we know this is a problem with MM + HW.\n // Then, we fallback to ETHSIGN.\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else if (V4_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v4`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'v3')\n } else if (V3_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v3`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n }\n\n const data: unknown = signature?.data\n\n return { signature: data?.toString() || '', signingScheme }\n}\n\n/**\n * Returns the signature for the specified order with the signing scheme encoded\n * into the signature.\n * @param {UnsignedOrder} order The order to sign.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrder(\n order: UnsignedOrder,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ order, chainId }, _signOrder, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellation with the signing scheme encoded\n * into the signature.\n * @param {string} orderUid The unique identifier of the order being cancelled.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellation(\n orderUid: string,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUid, chainId }, _signOrderCancellation, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellations with the signing scheme encoded\n * into the signature.\n *\n * @param {string[]} orderUids The unique identifiers of the orders being cancelled.\n * @param {SupportedChainId} chainId The CoW Protocol protocol `chainId` context that's being used.\n * @param {Signer} signer The owner that had placed the orders used to sign.\n * @returns {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellations(\n orderUids: string[],\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUids, chainId }, _signOrderCancellations, signer)\n}\n\n/**\n * Returns the TypedDataDomain used for signing for the specified chainId.\n * @param {SupportedChainId} chainId The chain Id\n * @return {*} The TypedDataDomain for the specified chainId.\n * @throws {CowError} If the chainId is not supported.\n */\nexport function getDomain(chainId: SupportedChainId): TypedDataDomain {\n // Get settlement contract address\n const settlementContract = COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS[chainId]\n\n if (!settlementContract) {\n throw new CowError('Unsupported network. Settlement contract is not deployed')\n }\n\n return domainGp(chainId, settlementContract)\n}\n"],"names":["_signPayload","payload","signFn","signer","signingMethod","_exit","_temp2","_result","data","signature","toString","signingScheme","EcdsaSigningScheme","ETHSIGN","EIP712","_signer","TypedDataVersionedSigner","IntChainIdTypedDataV4Signer","e","console","error","CowError","_temp","Promise","resolve","then","_signFn","_catch","undefined","code","message","regexErrorCheck","METHOD_NOT_FOUND_ERROR_MSG_REGEX","RPC_REQUEST_FAILED_REGEX","some","regex","msg","test","METHOD_NOT_FOUND_ERROR_CODE","METAMASK_STRING_CHAINID_REGEX","_signPayload5","METAMASK_SIGNATURE_ERROR_CODE","_signPayload6","V4_ERROR_MSG_REGEX","_signPayload7","V3_ERROR_MSG_REGEX","_signPayload8","_signPayload2","_signPayload3","_signPayload4","reject","_signOrderCancellations","params","chainId","orderUids","domain","getDomain","signOrderCancellationsGp","signOrderCancellations","mapSigningSchema","_signOrderCancellation","orderUid","signOrderCancellationGp","_signOrder","order","signOrderGp","signOrder","SigningScheme","settlementContract","COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS","domainGp"],"mappings":"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"}
1
+ {"version":3,"file":"utils-e6a32f94.js","sources":["../src/order-signing/utils.ts"],"sourcesContent":["import type {\n Order as OrderFromContract,\n Signature,\n TypedDataDomain,\n EcdsaSigningScheme as EcdsaSigningSchemeContract,\n} from '@cowprotocol/contracts'\nimport {\n domain as domainGp,\n EcdsaSignature,\n IntChainIdTypedDataV4Signer,\n SigningScheme,\n signOrder as signOrderGp,\n signOrderCancellation as signOrderCancellationGp,\n signOrderCancellations as signOrderCancellationsGp,\n TypedDataVersionedSigner,\n} from '@cowprotocol/contracts'\nimport type { Signer } from '@ethersproject/abstract-signer'\nimport type { SigningResult, SignOrderParams, SignOrderCancellationParams, UnsignedOrder } from './types'\n\nimport { COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS } from '../common/consts'\nimport { CowError, SupportedChainId } from '../common'\nimport { EcdsaSigningScheme } from '../order-book'\nimport { SignOrderCancellationsParams } from './types'\n\n// For error codes, see:\n// - https://eth.wiki/json-rpc/json-rpc-error-codes-improvement-proposal\n// - https://www.jsonrpc.org/specification#error_object\nconst METAMASK_SIGNATURE_ERROR_CODE = -32603\nconst METHOD_NOT_FOUND_ERROR_CODE = -32601\n// Added the following because of 1Inch wallet who doesn't send the error code\n// So we will check the actual error text\nconst METHOD_NOT_FOUND_ERROR_MSG_REGEX = /Method not found/i\nconst V4_ERROR_MSG_REGEX = /eth_signTypedData_v4 does not exist/i\nconst V3_ERROR_MSG_REGEX = /eth_signTypedData_v3 does not exist/i\nconst RPC_REQUEST_FAILED_REGEX = /RPC request failed/i\nconst METAMASK_STRING_CHAINID_REGEX = /provided chainid .* must match the active chainid/i\n\nconst mapSigningSchema: Record<EcdsaSigningScheme, EcdsaSigningSchemeContract> = {\n [EcdsaSigningScheme.EIP712]: SigningScheme.EIP712,\n [EcdsaSigningScheme.ETHSIGN]: SigningScheme.ETHSIGN,\n}\n\ninterface ProviderRpcError extends Error {\n message: string\n code: number\n data?: unknown\n}\n\ntype PayloadParams =\n | Pick<SignOrderParams, 'order' & 'chainId'>\n | Pick<SignOrderCancellationParams, 'chainId' & 'orderId'>\n | Pick<SignOrderCancellationsParams, 'chainId' & 'orderUids'>\n\nfunction isProviderRpcError(error: unknown): error is ProviderRpcError {\n return (error as ProviderRpcError).code !== undefined || (error as ProviderRpcError).message !== undefined\n}\n\nasync function _signOrder(params: SignOrderParams): Promise<Signature> {\n const { chainId, signer, order, signingScheme } = params\n\n const domain = getDomain(chainId)\n\n return signOrderGp(domain, order as OrderFromContract, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellation(params: SignOrderCancellationParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUid } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationGp(domain, orderUid, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signOrderCancellations(params: SignOrderCancellationsParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderUids } = params\n\n const domain = getDomain(chainId)\n\n return signOrderCancellationsGp(domain, orderUids, signer, mapSigningSchema[signingScheme])\n}\n\nasync function _signPayload(\n payload: PayloadParams,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n signFn: (params: any) => Promise<Signature>,\n signer: Signer,\n signingMethod: 'default' | 'v4' | 'int_v4' | 'v3' | 'eth_sign' = 'v4'\n): Promise<SigningResult> {\n const signingScheme: EcdsaSigningScheme =\n signingMethod === 'eth_sign' ? EcdsaSigningScheme.ETHSIGN : EcdsaSigningScheme.EIP712\n let signature: Signature | null = null\n\n let _signer\n try {\n switch (signingMethod) {\n case 'default':\n case 'v3':\n _signer = new TypedDataVersionedSigner(signer)\n break\n case 'int_v4':\n _signer = new IntChainIdTypedDataV4Signer(signer)\n break\n default:\n _signer = signer\n }\n } catch (e) {\n console.error('Wallet not supported:', e)\n throw new CowError('Wallet not supported')\n }\n\n try {\n signature = (await signFn({ ...payload, signer: _signer, signingScheme })) as EcdsaSignature // Only ECDSA signing supported for now\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (!isProviderRpcError(e)) {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n\n const regexErrorCheck = [METHOD_NOT_FOUND_ERROR_MSG_REGEX, RPC_REQUEST_FAILED_REGEX].some((regex) =>\n // for example 1Inch error doesn't have e.message so we will check the output of toString()\n [e.message, e.toString()].some((msg) => regex.test(msg))\n )\n\n if (e.code === METHOD_NOT_FOUND_ERROR_CODE || regexErrorCheck) {\n // Maybe the wallet returns the proper error code? We can only hope 🤞\n // OR it failed with a generic message, there's no error code set, and we also hope it'll work\n // with other methods...\n switch (signingMethod) {\n case 'v4':\n return _signPayload(payload, signFn, signer, 'default')\n case 'default':\n return _signPayload(payload, signFn, signer, 'v3')\n case 'v3':\n return _signPayload(payload, signFn, signer, 'eth_sign')\n default:\n throw e\n }\n } else if (METAMASK_STRING_CHAINID_REGEX.test(e.message)) {\n // Metamask now enforces chainId to be an integer\n return _signPayload(payload, signFn, signer, 'int_v4')\n } else if (e.code === METAMASK_SIGNATURE_ERROR_CODE) {\n // We tried to sign order the nice way.\n // That works fine for regular MM addresses. Does not work for Hardware wallets, though.\n // See https://github.com/MetaMask/metamask-extension/issues/10240#issuecomment-810552020\n // So, when that specific error occurs, we know this is a problem with MM + HW.\n // Then, we fallback to ETHSIGN.\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else if (V4_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v4`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'v3')\n } else if (V3_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v3`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else {\n // Some other error signing. Let it bubble up.\n console.error(e)\n throw e\n }\n }\n\n const data: unknown = signature?.data\n\n return { signature: data?.toString() || '', signingScheme }\n}\n\n/**\n * Returns the signature for the specified order with the signing scheme encoded\n * into the signature.\n * @param {UnsignedOrder} order The order to sign.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrder(\n order: UnsignedOrder,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ order, chainId }, _signOrder, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellation with the signing scheme encoded\n * into the signature.\n * @param {string} orderUid The unique identifier of the order being cancelled.\n * @param {SupportedChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellation(\n orderUid: string,\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUid, chainId }, _signOrderCancellation, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellations with the signing scheme encoded\n * into the signature.\n *\n * @param {string[]} orderUids The unique identifiers of the orders being cancelled.\n * @param {SupportedChainId} chainId The CoW Protocol protocol `chainId` context that's being used.\n * @param {Signer} signer The owner that had placed the orders used to sign.\n * @returns {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellations(\n orderUids: string[],\n chainId: SupportedChainId,\n signer: Signer\n): Promise<SigningResult> {\n return _signPayload({ orderUids, chainId }, _signOrderCancellations, signer)\n}\n\n/**\n * Returns the TypedDataDomain used for signing for the specified chainId.\n * @param {SupportedChainId} chainId The chain Id\n * @return {*} The TypedDataDomain for the specified chainId.\n * @throws {CowError} If the chainId is not supported.\n */\nexport function getDomain(chainId: SupportedChainId): TypedDataDomain {\n // Get settlement contract address\n const settlementContract = COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS[chainId]\n\n if (!settlementContract) {\n throw new CowError('Unsupported network. Settlement contract is not deployed')\n }\n\n return domainGp(chainId, settlementContract)\n}\n"],"names":["_signPayload","payload","signFn","signer","signingMethod","_exit","_temp2","_result","data","signature","toString","signingScheme","EcdsaSigningScheme","ETHSIGN","EIP712","_signer","TypedDataVersionedSigner","IntChainIdTypedDataV4Signer","e","console","error","CowError","_temp","Promise","resolve","then","_signFn","_catch","undefined","code","message","regexErrorCheck","METHOD_NOT_FOUND_ERROR_MSG_REGEX","RPC_REQUEST_FAILED_REGEX","some","regex","msg","test","METHOD_NOT_FOUND_ERROR_CODE","METAMASK_STRING_CHAINID_REGEX","_signPayload5","METAMASK_SIGNATURE_ERROR_CODE","_signPayload6","V4_ERROR_MSG_REGEX","_signPayload7","V3_ERROR_MSG_REGEX","_signPayload8","_signPayload2","_signPayload3","_signPayload4","reject","_signOrderCancellations","params","chainId","orderUids","domain","getDomain","signOrderCancellationsGp","signOrderCancellations","mapSigningSchema","_signOrderCancellation","orderUid","signOrderCancellationGp","_signOrder","order","signOrderGp","signOrder","SigningScheme","settlementContract","COW_PROTOCOL_SETTLEMENT_CONTRACT_ADDRESS","domainGp"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cowprotocol/cow-sdk",
3
- "version": "4.0.5",
3
+ "version": "4.0.7",
4
4
  "license": "(MIT OR Apache-2.0)",
5
5
  "files": [
6
6
  "/dist"
@@ -1,29 +0,0 @@
1
- import"cross-fetch/polyfill";import{RateLimiter as e}from"limiter";import{backOff as t}from"exponential-backoff";import{gql as n,request as r}from"graphql-request";import{utils as a,Contract as s,ethers as i,constants as o,BigNumber as p}from"ethers";import{OrderBalance as d,OrderKind as u}from"@cowprotocol/contracts";import{StandardMerkleTree as l}from"@openzeppelin/merkle-tree";var y;!function(e){e[e.MAINNET=1]="MAINNET",e[e.GOERLI=5]="GOERLI",e[e.GNOSIS_CHAIN=100]="GNOSIS_CHAIN",e[e.SEPOLIA=11155111]="SEPOLIA"}(y||(y={}));const c=["prod","staging"],T={env:"prod",chainId:y.MAINNET};class m extends Error{constructor(e,t){super(e),this.error_code=void 0,this.error_code=t}}const f="cow-sdk:",h="https://gnosis.mypinata.cloud/ipfs",b="https://api.pinata.cloud";function I(){return I=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},I.apply(this,arguments)}function E(e,t){if(null==e)return{};var n,r,a={},s=Object.keys(e);for(r=0;r<s.length;r++)t.indexOf(n=s[r])>=0||(a[n]=e[n]);return a}const O="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",A="0x2f55e8b20D0B9FEFA187AA7d00B6Cbe563605bF5",S="0xfdaFc9d1902f4e0b84f65F49f244b32b31013b74",N=[y.MAINNET,y.GOERLI,y.GNOSIS_CHAIN,y.SEPOLIA];function _(e){return N.reduce((t,n)=>I({},t,{[n]:"function"==typeof e?e(n):e}),{})}function g(e){return _(e)}const v=g("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"),w=g("0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"),R=g(A),P=g(S);function C(e){return function(e){const{ethflowData:t}=e;if(!t)return e;const{userValidTo:n}=t;return I({},e,{validTo:n,owner:e.onchainUser||e.owner,sellToken:O})}(function(e){const{executedFeeAmount:t,executedSurplusFee:n}=e;return I({},e,{totalFee:null!=n?n:t})}(e))}class D extends Error{constructor(e,t){super("string"==typeof t?t:e.statusText),this.response=void 0,this.body=void 0,this.response=e,this.body=t}}const U=[408,425,429,500,502,503,504],L={numOfAttempts:10,maxDelay:Infinity,jitter:"none",retry:e=>!(e instanceof D)||U.includes(e.response.status)},x={tokensPerInterval:5,interval:"second"},M=async e=>{if(204!==e.status)try{const t=e.headers.get("Content-Type");if(t)return t.toLowerCase().startsWith("application/json")?await e.json():await e.text()}catch(e){console.error(e)}};async function k(e,{path:n,query:r,method:a,body:s},i,o){const p=`${e}${n}${r?"?"+r:""}`,d={method:a,body:(()=>{if(s)return"string"==typeof s?s:JSON.stringify(s)})(),headers:{Accept:"application/json","Content-Type":"application/json"}};return t(async()=>{await i.removeTokens(1);const e=await fetch(p,d),t=await M(e);return e.status>=200&&e.status<300?t:Promise.reject(new D(e,t))},o)}const F={[y.MAINNET]:"https://api.cow.fi/mainnet",[y.GNOSIS_CHAIN]:"https://api.cow.fi/xdai",[y.GOERLI]:"https://api.cow.fi/goerli",[y.SEPOLIA]:"https://api.cow.fi/sepolia"},G={[y.MAINNET]:"https://barn.api.cow.fi/mainnet",[y.GNOSIS_CHAIN]:"https://barn.api.cow.fi/xdai",[y.GOERLI]:"https://barn.api.cow.fi/goerli",[y.SEPOLIA]:"https://barn.api.cow.fi/sepolia"};function V(e){return Object.keys(e).reduce((t,n)=>{const r=e[n];return void 0!==r&&(t[n]=r),t},{})}class ${constructor(t={}){this.context=void 0,this.rateLimiter=void 0,this.context=I({},T,t),this.rateLimiter=new e(t.limiterOpts||x)}getVersion(e={}){return this.fetch({path:"/api/v1/version",method:"GET"},e)}getTrades(e,t={}){if(e.owner&&e.orderUid)return Promise.reject(new m("Cannot specify both owner and orderId"));if(!e.owner&&!e.orderUid)return Promise.reject(new m("Must specify either owner or orderId"));const n=new URLSearchParams(V(e));return this.fetch({path:"/api/v1/trades",method:"GET",query:n},t)}getOrders({owner:e,offset:t=0,limit:n=1e3},r={}){const a=new URLSearchParams(V({offset:t.toString(),limit:n.toString()}));return this.fetch({path:`/api/v1/account/${e}/orders`,method:"GET",query:a},r).then(e=>e.map(C))}getTxOrders(e,t={}){return this.fetch({path:`/api/v1/transactions/${e}/orders`,method:"GET"},t).then(e=>e.map(C))}getOrder(e,t={}){return this.fetch({path:`/api/v1/orders/${e}`,method:"GET"},t).then(e=>C(e))}getOrderMultiEnv(e,t={}){const{env:n}=this.getContextWithOverride(t),r=c.filter(e=>e!==n);let a=0;const s=n=>{const i=r[a];return n instanceof D&&404===n.response.status&&i?(a++,this.getOrder(e,I({},t,{env:i})).catch(s)):Promise.reject(n)};return this.getOrder(e,I({},t,{env:n})).catch(s)}getQuote(e,t={}){return this.fetch({path:"/api/v1/quote",method:"POST",body:e},t)}sendSignedOrderCancellations(e,t={}){return this.fetch({path:"/api/v1/orders",method:"DELETE",body:e},t)}sendOrder(e,t={}){return this.fetch({path:"/api/v1/orders",method:"POST",body:e},t)}getNativePrice(e,t={}){return this.fetch({path:`/api/v1/token/${e}/native_price`,method:"GET"},t)}getTotalSurplus(e,t={}){return this.fetch({path:`/api/v1/users/${e}/total_surplus`,method:"GET"},t)}getAppData(e,t={}){return this.fetch({path:`/api/v1/app_data/${e}`,method:"GET"},t)}uploadAppData(e,t,n={}){return this.fetch({path:`/api/v1/app_data/${e}`,method:"PUT",body:{fullAppData:t}},n)}getSolverCompetition(e,t={}){return this.fetch({path:`/api/v1/solver_competition${"string"==typeof e?"/by_tx_hash":""}/${e}`,method:"GET"},t)}getOrderLink(e,t){const{chainId:n,env:r}=this.getContextWithOverride(t);return this.getApiBaseUrls(r)[n]+`/api/v1/orders/${e}`}getContextWithOverride(e={}){return I({},this.context,e)}getApiBaseUrls(e){return this.context.baseUrls?this.context.baseUrls:"prod"===e?F:G}fetch(e,t={}){const{chainId:n,env:r}=this.getContextWithOverride(t);return k(this.getApiBaseUrls(r)[n],e,this.rateLimiter,this.context.backoffOpts||L)}}var B,W,H,Y,j,K,Z,X,q,z,J,Q,ee,te,ne;!function(e){e.ERC20="erc20",e.INTERNAL="internal"}(B||(B={})),function(e){e.EIP712="eip712",e.ETHSIGN="ethsign"}(W||(W={})),function(e){var t;(t=e.placementError||(e.placementError={})).QUOTE_NOT_FOUND="QuoteNotFound",t.VALID_TO_TOO_FAR_IN_FUTURE="ValidToTooFarInFuture",t.PRE_VALIDATION_ERROR="PreValidationError"}(H||(H={})),function(e){var t;(t=e.errorType||(e.errorType={})).INVALID_SIGNATURE="InvalidSignature",t.WRONG_OWNER="WrongOwner",t.ORDER_NOT_FOUND="OrderNotFound",t.ALREADY_CANCELLED="AlreadyCancelled",t.ORDER_FULLY_EXECUTED="OrderFullyExecuted",t.ORDER_EXPIRED="OrderExpired",t.ON_CHAIN_ORDER="OnChainOrder"}(Y||(Y={})),function(e){e.MARKET="market",e.LIMIT="limit",e.LIQUIDITY="liquidity"}(j||(j={})),function(e){e.BUY="buy",e.SELL="sell"}(K||(K={})),function(e){var t;(t=e.errorType||(e.errorType={})).DUPLICATED_ORDER="DuplicatedOrder",t.QUOTE_NOT_FOUND="QuoteNotFound",t.INVALID_QUOTE="InvalidQuote",t.MISSING_FROM="MissingFrom",t.WRONG_OWNER="WrongOwner",t.INVALID_EIP1271SIGNATURE="InvalidEip1271Signature",t.INSUFFICIENT_BALANCE="InsufficientBalance",t.INSUFFICIENT_ALLOWANCE="InsufficientAllowance",t.INVALID_SIGNATURE="InvalidSignature",t.INSUFFICIENT_FEE="InsufficientFee",t.SELL_AMOUNT_OVERFLOW="SellAmountOverflow",t.TRANSFER_SIMULATION_FAILED="TransferSimulationFailed",t.ZERO_AMOUNT="ZeroAmount",t.INCOMPATIBLE_SIGNING_SCHEME="IncompatibleSigningScheme",t.TOO_MANY_LIMIT_ORDERS_UNSUPPORTED_BUY_TOKEN_DESTINATION="TooManyLimitOrders UnsupportedBuyTokenDestination",t.UNSUPPORTED_SELL_TOKEN_SOURCE="UnsupportedSellTokenSource",t.UNSUPPORTED_ORDER_TYPE="UnsupportedOrderType",t.INSUFFICIENT_VALID_TO="InsufficientValidTo",t.EXCESSIVE_VALID_TO="ExcessiveValidTo",t.TRANSFER_ETH_TO_CONTRACT="TransferEthToContract",t.INVALID_NATIVE_SELL_TOKEN_SAME_BUY_AND_SELL_TOKEN="InvalidNativeSellToken SameBuyAndSellToken",t.UNSUPPORTED_SIGNATURE="UnsupportedSignature",t.UNSUPPORTED_TOKEN="UnsupportedToken",t.UNSUPPORTED_CUSTOM_INTERACTION_INVALID_APP_DATA="UnsupportedCustomInteraction InvalidAppData",t.APP_DATA_HASH_MISMATCH="AppDataHashMismatch"}(Z||(Z={})),function(e){e.BUY="buy"}(X||(X={})),function(e){e.SELL="sell"}(q||(q={})),function(e){e.PRESIGNATURE_PENDING="presignaturePending",e.OPEN="open",e.FULFILLED="fulfilled",e.CANCELLED="cancelled",e.EXPIRED="expired"}(z||(z={})),function(e){var t;(t=e.errorType||(e.errorType={})).UNSUPPORTED_TOKEN="UnsupportedToken",t.ZERO_AMOUNT="ZeroAmount",t.UNSUPPORTED_ORDER_TYPE="UnsupportedOrderType"}(J||(J={})),function(e){e.FAST="fast",e.OPTIMAL="optimal",e.VERIFIED="verified"}(Q||(Q={})),function(e){var t;(t=e.errorType||(e.errorType={})).ALREADY_CANCELLED="AlreadyCancelled",t.ORDER_FULLY_EXECUTED="OrderFullyExecuted",t.ORDER_EXPIRED="OrderExpired",t.ON_CHAIN_ORDER="OnChainOrder",t.DUPLICATED_ORDER="DuplicatedOrder",t.INSUFFICIENT_FEE="InsufficientFee",t.INSUFFICIENT_ALLOWANCE="InsufficientAllowance",t.INSUFFICIENT_BALANCE="InsufficientBalance",t.INSUFFICIENT_VALID_TO="InsufficientValidTo",t.EXCESSIVE_VALID_TO="ExcessiveValidTo",t.INVALID_SIGNATURE="InvalidSignature",t.TRANSFER_ETH_TO_CONTRACT="TransferEthToContract",t.TRANSFER_SIMULATION_FAILED="TransferSimulationFailed",t.UNSUPPORTED_TOKEN="UnsupportedToken",t.WRONG_OWNER="WrongOwner",t.SAME_BUY_AND_SELL_TOKEN="SameBuyAndSellToken",t.ZERO_AMOUNT="ZeroAmount",t.UNSUPPORTED_BUY_TOKEN_DESTINATION="UnsupportedBuyTokenDestination",t.UNSUPPORTED_SELL_TOKEN_SOURCE="UnsupportedSellTokenSource",t.UNSUPPORTED_ORDER_TYPE="UnsupportedOrderType",t.UNSUPPORTED_SIGNATURE="UnsupportedSignature"}(ee||(ee={})),function(e){e.ERC20="erc20",e.INTERNAL="internal",e.EXTERNAL="external"}(te||(te={})),function(e){e.EIP712="eip712",e.ETHSIGN="ethsign",e.PRESIGN="presign",e.EIP1271="eip1271"}(ne||(ne={}));let re,ae,se,ie=e=>e;const oe=n(re||(re=ie`
2
- query Totals {
3
- totals {
4
- tokens
5
- orders
6
- traders
7
- settlements
8
- volumeUsd
9
- volumeEth
10
- feesUsd
11
- feesEth
12
- }
13
- }
14
- `)),pe=n(ae||(ae=ie`
15
- query LastDaysVolume($days: Int!) {
16
- dailyTotals(orderBy: timestamp, orderDirection: desc, first: $days) {
17
- timestamp
18
- volumeUsd
19
- }
20
- }
21
- `)),de=n(se||(se=ie`
22
- query LastHoursVolume($hours: Int!) {
23
- hourlyTotals(orderBy: timestamp, orderDirection: desc, first: $hours) {
24
- timestamp
25
- volumeUsd
26
- }
27
- }
28
- `)),ue="https://api.thegraph.com/subgraphs/name/cowprotocol",le={[y.MAINNET]:ue+"/cow",[y.GNOSIS_CHAIN]:ue+"/cow-gc",[y.GOERLI]:ue+"/cow-goerli",[y.SEPOLIA]:""},ye={[y.MAINNET]:ue+"/cow-staging",[y.GNOSIS_CHAIN]:ue+"/cow-gc-staging",[y.GOERLI]:"",[y.SEPOLIA]:""};class ce{constructor(e={}){this.API_NAME="CoW Protocol Subgraph",this.context=void 0,this.context=I({},T,e)}async getTotals(e={}){return(await this.runQuery(oe,void 0,e)).totals[0]}async getLastDaysVolume(e,t={}){return this.runQuery(pe,{days:e},t)}async getLastHoursVolume(e,t={}){return this.runQuery(de,{hours:e},t)}async runQuery(e,t=undefined,n={}){const{chainId:a,env:s}=this.getContextWithOverride(n),i=this.getEnvConfigs(s)[a];try{return await r(i,e,t)}catch(n){throw console.error(`[subgraph:${this.API_NAME}]`,n),new m(`Error running query: ${e}. Variables: ${JSON.stringify(t)}. API: ${i}. Inner Error: ${n}`)}}getContextWithOverride(e={}){return I({},this.context,e)}getEnvConfigs(e){return this.context.baseUrls?this.context.baseUrls:"prod"===e?le:ye}}const Te=()=>import("./utils-e89042f2.js");class me{static async signOrder(e,t,n){const{signOrder:r}=await Te();return r(e,t,n)}static async signOrderCancellation(e,t,n){const{signOrderCancellation:r}=await Te();return r(e,t,n)}static async signOrderCancellations(e,t,n){const{signOrderCancellations:r}=await Te();return r(e,t,n)}static async getDomain(e){const{getDomain:t}=await Te();return t(e)}static async getDomainSeparator(e){const{getDomain:t}=await Te(),{_TypedDataEncoder:n}=await import("ethers/lib/utils");return n.hashDomain(t(e))}static getEIP712Types(){return{Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}}}var fe,he;!function(e){e[e.PRIVATE=0]="PRIVATE",e[e.EMITTED=1]="EMITTED",e[e.SWARM=2]="SWARM",e[e.WAKU=3]="WAKU",e[e.RESERVED=4]="RESERVED",e[e.IPFS=5]="IPFS"}(fe||(fe={})),function(e){e.SUCCESS="SUCCESS",e.UNEXPECTED_ERROR="UNEXPECTED_ERROR",e.TRY_NEXT_BLOCK="TRY_NEXT_BLOCK",e.TRY_ON_BLOCK="TRY_ON_BLOCK",e.TRY_AT_EPOCH="TRY_AT_EPOCH",e.DONT_TRY_AGAIN="DONT_TRY_AGAIN"}(he||(he={}));const be=[{inputs:[{internalType:"address",name:"_settlement",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"InterfaceNotSupported",type:"error"},{inputs:[],name:"InvalidHandler",type:"error"},{inputs:[],name:"ProofNotAuthed",type:"error"},{inputs:[],name:"SingleOrderNotAuthed",type:"error"},{inputs:[],name:"SwapGuardRestricted",type:"error"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{components:[{internalType:"contract IConditionalOrder",name:"handler",type:"address"},{internalType:"bytes32",name:"salt",type:"bytes32"},{internalType:"bytes",name:"staticInput",type:"bytes"}],indexed:!1,internalType:"struct IConditionalOrder.ConditionalOrderParams",name:"params",type:"tuple"}],name:"ConditionalOrderCreated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!1,internalType:"bytes32",name:"root",type:"bytes32"},{components:[{internalType:"uint256",name:"location",type:"uint256"},{internalType:"bytes",name:"data",type:"bytes"}],indexed:!1,internalType:"struct ComposableCoW.Proof",name:"proof",type:"tuple"}],name:"MerkleRootSet",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!1,internalType:"contract ISwapGuard",name:"swapGuard",type:"address"}],name:"SwapGuardSet",type:"event"},{inputs:[{internalType:"address",name:"",type:"address"},{internalType:"bytes32",name:"",type:"bytes32"}],name:"cabinet",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{components:[{internalType:"contract IConditionalOrder",name:"handler",type:"address"},{internalType:"bytes32",name:"salt",type:"bytes32"},{internalType:"bytes",name:"staticInput",type:"bytes"}],internalType:"struct IConditionalOrder.ConditionalOrderParams",name:"params",type:"tuple"},{internalType:"bool",name:"dispatch",type:"bool"}],name:"create",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{components:[{internalType:"contract IConditionalOrder",name:"handler",type:"address"},{internalType:"bytes32",name:"salt",type:"bytes32"},{internalType:"bytes",name:"staticInput",type:"bytes"}],internalType:"struct IConditionalOrder.ConditionalOrderParams",name:"params",type:"tuple"},{internalType:"contract IValueFactory",name:"factory",type:"address"},{internalType:"bytes",name:"data",type:"bytes"},{internalType:"bool",name:"dispatch",type:"bool"}],name:"createWithContext",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"domainSeparator",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"},{components:[{internalType:"contract IConditionalOrder",name:"handler",type:"address"},{internalType:"bytes32",name:"salt",type:"bytes32"},{internalType:"bytes",name:"staticInput",type:"bytes"}],internalType:"struct IConditionalOrder.ConditionalOrderParams",name:"params",type:"tuple"},{internalType:"bytes",name:"offchainInput",type:"bytes"},{internalType:"bytes32[]",name:"proof",type:"bytes32[]"}],name:"getTradeableOrderWithSignature",outputs:[{components:[{internalType:"contract IERC20",name:"sellToken",type:"address"},{internalType:"contract IERC20",name:"buyToken",type:"address"},{internalType:"address",name:"receiver",type:"address"},{internalType:"uint256",name:"sellAmount",type:"uint256"},{internalType:"uint256",name:"buyAmount",type:"uint256"},{internalType:"uint32",name:"validTo",type:"uint32"},{internalType:"bytes32",name:"appData",type:"bytes32"},{internalType:"uint256",name:"feeAmount",type:"uint256"},{internalType:"bytes32",name:"kind",type:"bytes32"},{internalType:"bool",name:"partiallyFillable",type:"bool"},{internalType:"bytes32",name:"sellTokenBalance",type:"bytes32"},{internalType:"bytes32",name:"buyTokenBalance",type:"bytes32"}],internalType:"struct GPv2Order.Data",name:"order",type:"tuple"},{internalType:"bytes",name:"signature",type:"bytes"}],stateMutability:"view",type:"function"},{inputs:[{components:[{internalType:"contract IConditionalOrder",name:"handler",type:"address"},{internalType:"bytes32",name:"salt",type:"bytes32"},{internalType:"bytes",name:"staticInput",type:"bytes"}],internalType:"struct IConditionalOrder.ConditionalOrderParams",name:"params",type:"tuple"}],name:"hash",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract Safe",name:"safe",type:"address"},{internalType:"address",name:"sender",type:"address"},{internalType:"bytes32",name:"_hash",type:"bytes32"},{internalType:"bytes32",name:"_domainSeparator",type:"bytes32"},{internalType:"bytes32",name:"",type:"bytes32"},{internalType:"bytes",name:"encodeData",type:"bytes"},{internalType:"bytes",name:"payload",type:"bytes"}],name:"isValidSafeSignature",outputs:[{internalType:"bytes4",name:"magic",type:"bytes4"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"singleOrderHash",type:"bytes32"}],name:"remove",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"}],name:"roots",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"root",type:"bytes32"},{components:[{internalType:"uint256",name:"location",type:"uint256"},{internalType:"bytes",name:"data",type:"bytes"}],internalType:"struct ComposableCoW.Proof",name:"proof",type:"tuple"}],name:"setRoot",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"root",type:"bytes32"},{components:[{internalType:"uint256",name:"location",type:"uint256"},{internalType:"bytes",name:"data",type:"bytes"}],internalType:"struct ComposableCoW.Proof",name:"proof",type:"tuple"},{internalType:"contract IValueFactory",name:"factory",type:"address"},{internalType:"bytes",name:"data",type:"bytes"}],name:"setRootWithContext",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract ISwapGuard",name:"swapGuard",type:"address"}],name:"setSwapGuard",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"},{internalType:"bytes32",name:"",type:"bytes32"}],name:"singleOrders",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"}],name:"swapGuards",outputs:[{internalType:"contract ISwapGuard",name:"",type:"address"}],stateMutability:"view",type:"function"}];class Ie{static createInterface(){return new a.Interface(be)}static connect(e,t){return new s(e,be,t)}}Ie.abi=be;const Ee=[{anonymous:!1,inputs:[{indexed:!0,internalType:"contract Safe",name:"safe",type:"address"},{indexed:!1,internalType:"bytes32",name:"domainSeparator",type:"bytes32"},{indexed:!1,internalType:"contract ISafeSignatureVerifier",name:"verifier",type:"address"}],name:"AddedDomainVerifier",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"contract Safe",name:"safe",type:"address"},{indexed:!1,internalType:"bytes4",name:"interfaceId",type:"bytes4"}],name:"AddedInterface",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"contract Safe",name:"safe",type:"address"},{indexed:!1,internalType:"bytes4",name:"selector",type:"bytes4"},{indexed:!1,internalType:"bytes32",name:"method",type:"bytes32"}],name:"AddedSafeMethod",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"contract Safe",name:"safe",type:"address"},{indexed:!1,internalType:"bytes32",name:"domainSeparator",type:"bytes32"},{indexed:!1,internalType:"contract ISafeSignatureVerifier",name:"oldVerifier",type:"address"},{indexed:!1,internalType:"contract ISafeSignatureVerifier",name:"newVerifier",type:"address"}],name:"ChangedDomainVerifier",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"contract Safe",name:"safe",type:"address"},{indexed:!1,internalType:"bytes4",name:"selector",type:"bytes4"},{indexed:!1,internalType:"bytes32",name:"oldMethod",type:"bytes32"},{indexed:!1,internalType:"bytes32",name:"newMethod",type:"bytes32"}],name:"ChangedSafeMethod",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"contract Safe",name:"safe",type:"address"},{indexed:!1,internalType:"bytes32",name:"domainSeparator",type:"bytes32"}],name:"RemovedDomainVerifier",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"contract Safe",name:"safe",type:"address"},{indexed:!1,internalType:"bytes4",name:"interfaceId",type:"bytes4"}],name:"RemovedInterface",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"contract Safe",name:"safe",type:"address"},{indexed:!1,internalType:"bytes4",name:"selector",type:"bytes4"}],name:"RemovedSafeMethod",type:"event"},{stateMutability:"nonpayable",type:"fallback"},{inputs:[{internalType:"contract Safe",name:"",type:"address"},{internalType:"bytes32",name:"",type:"bytes32"}],name:"domainVerifiers",outputs:[{internalType:"contract ISafeSignatureVerifier",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"_hash",type:"bytes32"},{internalType:"bytes",name:"signature",type:"bytes"}],name:"isValidSignature",outputs:[{internalType:"bytes4",name:"magic",type:"bytes4"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"},{internalType:"address",name:"",type:"address"},{internalType:"uint256[]",name:"",type:"uint256[]"},{internalType:"uint256[]",name:"",type:"uint256[]"},{internalType:"bytes",name:"",type:"bytes"}],name:"onERC1155BatchReceived",outputs:[{internalType:"bytes4",name:"",type:"bytes4"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"},{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint256",name:"",type:"uint256"},{internalType:"bytes",name:"",type:"bytes"}],name:"onERC1155Received",outputs:[{internalType:"bytes4",name:"",type:"bytes4"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"},{internalType:"address",name:"",type:"address"},{internalType:"uint256",name:"",type:"uint256"},{internalType:"bytes",name:"",type:"bytes"}],name:"onERC721Received",outputs:[{internalType:"bytes4",name:"",type:"bytes4"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"contract Safe",name:"",type:"address"},{internalType:"bytes4",name:"",type:"bytes4"}],name:"safeInterfaces",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract Safe",name:"",type:"address"},{internalType:"bytes4",name:"",type:"bytes4"}],name:"safeMethods",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"domainSeparator",type:"bytes32"},{internalType:"contract ISafeSignatureVerifier",name:"newVerifier",type:"address"}],name:"setDomainVerifier",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes4",name:"selector",type:"bytes4"},{internalType:"bytes32",name:"newMethod",type:"bytes32"}],name:"setSafeMethod",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes4",name:"interfaceId",type:"bytes4"},{internalType:"bool",name:"supported",type:"bool"}],name:"setSupportedInterface",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes4",name:"_interfaceId",type:"bytes4"},{internalType:"bytes32[]",name:"handlerWithSelectors",type:"bytes32[]"}],name:"setSupportedInterfaceBatch",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes4",name:"interfaceId",type:"bytes4"}],name:"supportsInterface",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"}];class Oe{static createInterface(){return new a.Interface(Ee)}static connect(e,t){return new s(e,Ee,t)}}Oe.abi=Ee;const Ae=["erc20","0x5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc9"],Se=["external","0xabee3b73373acd583a130924aad6dc38cfdc44ba0555ba94ce2ff63980ea0632"],Ne=["internal","0x4ac99ace14ee0a5ef932dc609df0943ab7ac16b7583634612f8dc35a4289a6ce"],_e=["sell","0xf3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee346775"],ge=["buy","0x6ed88e868af0a1983e3886d5f3e95a2fafbd6c3450bc229e27342283dc429ccc"],ve=["tuple(address handler, bytes32 salt, bytes staticInput)"],we=(e,t)=>`${t}@${e}`;function Re(e,t){return e===R[t]}function Pe(e,t){return e===P[t]}async function Ce(e,t,n,r){const a=Oe.connect(R[n],r);return await a.callStatic.domainVerifiers(e,t)}function De(e,t){return Oe.createInterface().encodeFunctionData("setDomainVerifier",[e,t])}function Ue(e){return a.defaultAbiCoder.encode(ve,[e])}function Le(e){const{handler:t,salt:n,staticInput:r}=a.defaultAbiCoder.decode(ve,e)[0];return{handler:t,salt:n,staticInput:r}}function xe(e,t){try{a.defaultAbiCoder.encode(e,t)}catch(e){return!1}return!0}async function Me(e){const t=await e.getBlock("latest");return{blockNumber:t.number,blockTimestamp:t.timestamp}}function ke(e){return new Date(1e3*e).toISOString()}function Fe(e){if(Ae.includes(e))return d.ERC20;if(Se.includes(e))return d.EXTERNAL;if(Ne.includes(e))return d.INTERNAL;throw new Error(`Unknown balance type: ${e}`)}function Ge(e){if(_e.includes(e))return u.SELL;if(ge.includes(e))return u.BUY;throw new Error(`Unknown kind: ${e}`)}function Ve(e){const{sellToken:t,sellAmount:n,buyToken:r,buyAmount:a,buyTokenBalance:s,sellTokenBalance:i,feeAmount:o,kind:p,receiver:d,validTo:u,partiallyFillable:l,appData:y}=e;return{sellToken:t,sellAmount:n,buyToken:r,buyAmount:a,feeAmount:o,receiver:d,partiallyFillable:l,appData:y,validTo:Number(u),kind:Ge(p.toString()),sellTokenBalance:Fe(i.toString()),buyTokenBalance:Fe(s.toString())}}let $e,Be;function We(){return $e||($e=Ie.createInterface()),$e}function He(e,t){return Be||(Be=Ie.connect(P[e],t)),Be}const Ye={};class je{constructor(e){this.handler=void 0,this.salt=void 0,this.data=void 0,this.staticInput=void 0,this.hasOffChainInput=void 0;const{handler:t,salt:n=a.keccak256(a.randomBytes(32)),data:r,hasOffChainInput:s=!1}=e;if(!i.utils.isAddress(t))throw new Error(`Invalid handler: ${t}`);if(!i.utils.isHexString(n)||32!==i.utils.hexDataLength(n))throw new Error(`Invalid salt: ${n}`);this.handler=t,this.salt=n,this.data=r,this.staticInput=this.transformDataToStruct(r),this.hasOffChainInput=s}get context(){}assertIsValid(){const e=this.isValid();if(!e.isValid)throw new Error(`Invalid order: ${e.reason}`)}get createCalldata(){this.assertIsValid();const e=this.context,t=We(),n={handler:this.handler,salt:this.salt,staticInput:this.encodeStaticInput()};if(e){const r=e.factoryArgs?a.defaultAbiCoder.encode(e.factoryArgs.argsType,e.factoryArgs.args):"0x";return t.encodeFunctionData("createWithContext",[n,e.address,r,!0])}return t.encodeFunctionData("create",[n,!0])}get removeCalldata(){return this.assertIsValid(),We().encodeFunctionData("remove",[this.id])}get id(){return a.keccak256(this.serialize())}get ctx(){return this.isSingleOrder?this.id:o.HashZero}get leaf(){return{handler:this.handler,salt:this.salt,staticInput:this.encodeStaticInput()}}static leafToId(e){return a.keccak256(Ue(e))}get offChainInput(){return"0x"}encodeStaticInputHelper(e,t){return a.defaultAbiCoder.encode(e,[t])}async poll(e){const{chainId:t,owner:n,provider:r,orderbookApiConfig:a}=e,s=He(t,r);try{const r=this.isValid();if(!r.isValid)return{result:he.DONT_TRY_AGAIN,reason:`InvalidConditionalOrder. Reason: ${r.reason}`};const i=await this.pollValidate(e);if(i)return i;if(!await this.isAuthorized(e))return{result:he.DONT_TRY_AGAIN,reason:`NotAuthorized: Order ${this.id} is not authorized for ${n} on chain ${t}`};const[o,p]=await s.getTradeableOrderWithSignature(n,this.leaf,this.offChainInput,[]);let d=Ye[t];d||(d=new $(I({},a,{chainId:t})),Ye[t]=d);const u=await async function(e,t,n){const{computeOrderUid:r}=await import("@cowprotocol/contracts");return r(await me.getDomain(e),n,t)}(t,n,Ve(o));return await d.getOrder(u).then(()=>!0).catch(()=>!1)?await this.handlePollFailedAlreadyPresent(u,o,e)||{result:he.TRY_NEXT_BLOCK,reason:"Order already in orderbook"}:{result:he.SUCCESS,order:o,signature:p}}catch(e){return{result:he.UNEXPECTED_ERROR,error:e}}}isAuthorized(e){const{chainId:t,owner:n,provider:r}=e;return He(t,r).callStatic.singleOrders(n,this.id)}cabinet(e){const{chainId:t,owner:n,provider:r}=e;return He(t,r).callStatic.cabinet(n,this.ctx)}static deserializeHelper(e,t,n,r){try{const{handler:s,salt:i,staticInput:o}=Le(e);if(s!=t)throw new Error("HandlerMismatch");const[p]=a.defaultAbiCoder.decode(n,o);return r(p,i)}catch(e){throw"HandlerMismatch"===e.message?e:new Error("InvalidSerializedConditionalOrder")}}}const Ke=["orderType"],Ze=["address","bytes32","bytes"],Xe=["tuple(bytes32[] proof, tuple(address handler, bytes32 salt, bytes staticInput) params)[]"];class qe{constructor(e,t,n,r=fe.PRIVATE){if(this.chain=void 0,this.location=void 0,this.orders={},this.tree=void 0,this.ctx=void 0,this.chain=e,this.location=r,t&&0===Object.keys(t).length)throw new Error("orders must have non-zero length");if(t&&!n||!t&&n)throw new Error("orders cannot have undefined root");for(const e in t)if(t.hasOwnProperty(e)){const n=t[e];if(!qe.orderTypeRegistry.hasOwnProperty(n.orderType))throw new Error(`Unknown order type: ${n.orderType}`)}if(t&&(this.orders=t,this.getOrGenerateTree().root!==n))throw new Error("root mismatch")}static fromJSON(e){const{chain:t,orders:n,root:r,location:a}=JSON.parse(e,(e,t)=>{if("orders"===e&&"object"==typeof t&&null!==t){const e={};for(const n in t)if(t.hasOwnProperty(n)){const r=t[n],{orderType:a}=r,s=E(r,Ke);if(!qe.orderTypeRegistry.hasOwnProperty(a))throw new Error(`Unknown order type: ${a}`);e[n]=new(0,qe.orderTypeRegistry[a])(s)}return e}return"object"==typeof t&&null!==t&&t.hasOwnProperty("type")&&t.hasOwnProperty("hex")&&"BigNumber"===t.type?p.from(t):t}),s=new qe(t,n,r);return s.location=a,s}toJSON(){const e=this.getOrGenerateTree().root;return JSON.stringify(I({},this,{root:e}),(e,t)=>{if("tree"!==e)return"object"==typeof t&&null!==t&&"orderType"in t?I({},t,{orderType:t.orderType}):t})}add(e){e.assertIsValid(),this.orders[e.id]=e,this.reset()}remove(e){delete this.orders[e],this.reset()}update(e,t){const n=t(this.orders[e],this.ctx);delete this.orders[e],this.orders[n.id]=n,this.reset()}getById(e){return this.orders[e]}getByIndex(e){return this.orders[this.orderIds[e]]}get orderIds(){return Object.keys(this.orders)}get root(){return this.getOrGenerateTree().root}getOrGenerateTree(){return this.tree||(this.tree=l.of(Object.values(this.orders).map(e=>[...Object.values(e.leaf)]),Ze)),this.tree}static decodeFromJSON(e){return JSON.parse(e)}async prepareProofStruct(e=this.location,t,n){var r=this;return await async function(){switch(e){case fe.PRIVATE:return"0x";case fe.EMITTED:return r.encodeToABI(t);case fe.SWARM:case fe.WAKU:case fe.IPFS:if(!n)throw new Error("Must provide an uploader function");try{return await n(r.encodeToJSON(t))}catch(t){throw new Error(`Error uploading to decentralized storage ${e}: ${t}`)}default:throw new Error("Unsupported location")}}().then(t=>{try{return a.hexlify(a.arrayify(t)),this.location=e,{location:e,data:t}}catch(e){throw new Error("data returned by uploader is invalid")}}).catch(e=>{throw new Error(`Error preparing proof struct: ${e}`)})}static async poll(e,t,n,r,a){const s=He(n,r),i=a?await a(e,t.params):"0x";return await s.getTradeableOrderWithSignature(e,t.params,i,t.proof)}dumpProofs(e){return this.encodeToJSON(e)}dumpProofsAndParams(e){return this.getProofs(e)}getProofs(e){return[...this.getOrGenerateTree().entries()].map(([t,n])=>e&&e(n)||void 0===e?{idx:t,value:n}:void 0).reduce((e,t)=>{if(t){const n={handler:t.value[0],salt:t.value[1],staticInput:t.value[2]};e.push({proof:this.getOrGenerateTree().getProof(t.idx),params:n})}return e},[])}encodeToABI(e){return a.defaultAbiCoder.encode(Xe,[this.getProofs(e)])}encodeToJSON(e){return JSON.stringify(this.getProofs(e))}reset(){this.tree=void 0}static registerOrderType(e,t){qe.orderTypeRegistry[e]=t}static resetOrderTypeRegistry(){qe.orderTypeRegistry={}}}qe.orderTypeRegistry={};class ze{constructor(e){this.knownOrderTypes=void 0,this.knownOrderTypes=e}fromParams(e){const{handler:t}=e,n=this.knownOrderTypes[t];if(n)return n(e)}}const Je=["sellAmount","buyAmount","numberOfParts","startTime","timeBetweenParts","durationOfPart"],Qe=["n","partSellAmount","minPartLimit","t","t0","span"],et="0x6cF1e9cA41f7611dEf408122793c358a3d11E5a5",tt="0x52eD56Da04309Aca4c3FECC595298d80C2f16BAc",nt=p.from(2).pow(32).sub(1),rt=p.from(31536e3),at=["tuple(address sellToken, address buyToken, address receiver, uint256 partSellAmount, uint256 minPartLimit, uint256 t0, uint256 n, uint256 t, uint256 span, bytes32 appData)"];var st,it;!function(e){e.AUTO="AUTO",e.LIMIT_DURATION="LIMIT_DURATION"}(st||(st={})),function(e){e.AT_MINING_TIME="AT_MINING_TIME",e.AT_EPOCH="AT_EPOCH"}(it||(it={}));const ot={startType:it.AT_MINING_TIME},pt={durationType:st.AUTO};class dt extends je{constructor(e){const{handler:t,salt:n,data:r,hasOffChainInput:a}=e;if(t!==et)throw new Error(`InvalidHandler: Expected: ${et}, provided: ${t}`);super({handler:et,salt:n,data:r,hasOffChainInput:a}),this.isSingleOrder=!0}static fromData(e,t){return new dt({handler:et,data:e,salt:t})}static fromParams(e){return dt.deserialize(Ue(e))}get context(){return this.staticInput.t0.gt(0)?super.context:{address:tt,factoryArgs:void 0}}get orderType(){return"twap"}isValid(){const e=(()=>{const{sellToken:e,sellAmount:t,buyToken:n,buyAmount:r,startTime:a=ot,numberOfParts:s,timeBetweenParts:i,durationOfPart:p=pt}=this.data;if(e==n)return"InvalidSameToken";if(e==o.AddressZero||n==o.AddressZero)return"InvalidToken";if(!t.gt(o.Zero))return"InvalidSellAmount";if(!r.gt(o.Zero))return"InvalidMinBuyAmount";if(a.startType===it.AT_EPOCH){const e=a.epoch;if(!e.gte(o.Zero)||!e.lt(nt))return"InvalidStartTime"}return s.gt(o.One)&&s.lte(nt)?i.gt(o.Zero)&&i.lte(rt)?p.durationType!==st.LIMIT_DURATION||p.duration.lte(i)?xe(at,[this.staticInput])?void 0:"InvalidData":"InvalidSpan":"InvalidFrequency":"InvalidNumParts"})();return e?{isValid:!1,reason:e}:{isValid:!0}}async startTimestamp(e){const{startTime:t}=this.data;if((null==t?void 0:t.startType)===it.AT_EPOCH)return t.epoch.toNumber();const n=await this.cabinet(e),r=a.defaultAbiCoder.decode(["uint256"],n)[0];if(r.gt(nt))throw new Error(`Cabinet epoch out of range: ${r.toString()}`);const s=r.toNumber();if(0===s)throw new Error("Cabinet is not set. Required for TWAP orders that start at mining time.");return s}endTimestamp(e){const{numberOfParts:t,timeBetweenParts:n,durationOfPart:r}=this.data;return r&&r.durationType===st.LIMIT_DURATION?e+t.sub(1).mul(n).add(r.duration).toNumber():e+t.mul(n).toNumber()}async pollValidate(e){const{blockInfo:t=await Me(e.provider)}=e,{blockTimestamp:n}=t;try{const t=await this.startTimestamp(e);if(t>n)return{result:he.TRY_AT_EPOCH,epoch:t,reason:`TWAP hasn't started yet. Starts at ${t} (${ke(t)})`};const r=this.endTimestamp(t);return n>=r?{result:he.DONT_TRY_AGAIN,reason:`TWAP has expired. Expired at ${r} (${ke(r)})`}:void 0}catch(e){var r,a;return null!=e&&null!=(r=e.message)&&r.includes("Cabinet is not set")?{result:he.DONT_TRY_AGAIN,reason:`${null==e?void 0:e.message}. User likely removed the order.`}:null!=e&&null!=(a=e.message)&&a.includes("Cabinet epoch out of range")?{result:he.DONT_TRY_AGAIN,reason:`${null==e?void 0:e.message}`}:{result:he.UNEXPECTED_ERROR,reason:`Unexpected error: ${e.message}`,error:e}}}async handlePollFailedAlreadyPresent(e,t,n){const{blockInfo:r=await Me(n.provider)}=n,{blockTimestamp:a}=r,s=this.data.timeBetweenParts.toNumber(),{numberOfParts:i}=this.data,o=await this.startTimestamp(n);if(a<o)return{result:he.UNEXPECTED_ERROR,reason:`TWAP part hash't started. First TWAP part start at ${o} (${ke(o)})`,error:void 0};const p=i.mul(s).add(o).toNumber();if(a>=p)return{result:he.UNEXPECTED_ERROR,reason:`TWAP is expired. Expired at ${p} (${ke(p)})`,error:void 0};const d=Math.floor((a-o)/s);if(d===i.toNumber()-1)return{result:he.DONT_TRY_AGAIN,reason:`Current active TWAP part (${d+1}/${i}) is already in the Order Book. This was the last TWAP part, no more orders need to be placed`};const u=o+(d+1)*s;return{result:he.TRY_AT_EPOCH,epoch:u,reason:`Current active TWAP part (${d+1}/${i}) is already in the Order Book. TWAP part ${d+2} doesn't start until ${u} (${ke(u)})`}}serialize(){return Ue(this.leaf)}encodeStaticInput(){return super.encodeStaticInputHelper(at,this.staticInput)}static deserialize(e){return super.deserializeHelper(e,et,at,(e,t)=>new dt({handler:et,salt:t,data:lt(e)}))}toString(){const{sellAmount:e,sellToken:t,buyAmount:n,buyToken:r,numberOfParts:a,startTime:s=ot,timeBetweenParts:i,durationOfPart:o=pt,receiver:p,appData:d}=this.data,u=s.startType===it.AT_MINING_TIME?"AT_MINING_TIME":s.epoch.toNumber(),l=o.durationType===st.AUTO?"AUTO":o.duration.toNumber(),y={sellAmount:e.toString(),sellToken:t,buyAmount:n.toString(),buyToken:r,numberOfParts:a.toString(),startTime:u,timeBetweenParts:i.toNumber(),durationOfPart:l,receiver:p,appData:d};return`${this.orderType} (${this.id}): ${JSON.stringify(y)}`}transformDataToStruct(e){return ut(e)}transformStructToData(e){return lt(e)}}function ut(e){const{sellAmount:t,buyAmount:n,numberOfParts:r,startTime:a=ot,timeBetweenParts:s,durationOfPart:i=pt}=e,p=E(e,Je),{partSellAmount:d,minPartLimit:u}=r&&!r.isZero()?{partSellAmount:t.div(r),minPartLimit:n.div(r)}:{partSellAmount:o.Zero,minPartLimit:o.Zero};return I({partSellAmount:d,minPartLimit:u,t0:a.startType===it.AT_MINING_TIME?o.Zero:a.epoch,n:r,t:s,span:i.durationType===st.AUTO?o.Zero:i.duration},p)}function lt(e){const{n:t,partSellAmount:n,minPartLimit:r,t:a,t0:s,span:i}=e,o=E(e,Qe),p=i.isZero()?{durationType:st.AUTO}:{durationType:st.LIMIT_DURATION,duration:i},d=i.isZero()?{startType:it.AT_MINING_TIME}:{startType:it.AT_EPOCH,epoch:s};return I({sellAmount:n.mul(t),buyAmount:r.mul(t),startTime:d,numberOfParts:t,timeBetweenParts:a,durationOfPart:p},o)}const yt={[et]:e=>dt.fromParams(e)};export{Le as $,N as A,O as B,m as C,T as D,W as E,D as F,L as G,x as H,k as I,le as J,ye as K,ce as L,me as M,fe as N,F as O,J as P,he as Q,ee as R,y as S,ve as T,we as U,Re as V,Pe as W,Ce as X,De as Y,Ue as Z,I as _,v as a,xe as a0,Me as a1,ke as a2,Ve as a3,je as a4,qe as a5,ze as a6,yt as a7,et as a8,tt as a9,nt as aa,rt as ab,st as ac,it as ad,dt as ae,ut as af,lt as ag,c as b,h as c,b as d,A as e,S as f,g,w as h,R as i,P as j,G as k,f as l,_ as m,$ as n,B as o,H as p,Y as q,j as r,K as s,Z as t,X as u,q as v,z as w,Q as x,te as y,ne as z};
29
- //# sourceMappingURL=index-623f3ae6.js.map