@cowprotocol/cow-sdk 0.0.6 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +119 -7
  2. package/dist/CowSdk.d.ts +23 -0
  3. package/dist/{src/src/api → api}/cow/errors/OperatorError.d.ts +1 -1
  4. package/dist/{src/src/api → api}/cow/errors/QuoteError.d.ts +1 -1
  5. package/dist/{src/src/api → api}/cow/index.d.ts +8 -8
  6. package/dist/{src/src/api → api}/cow/types.d.ts +3 -2
  7. package/dist/api/cow-subgraph/graphql.d.ts +2603 -0
  8. package/dist/api/cow-subgraph/index.d.ts +17 -0
  9. package/dist/api/cow-subgraph/queries.d.ts +3 -0
  10. package/dist/api/index.d.ts +3 -0
  11. package/dist/api/metadata/index.d.ts +11 -0
  12. package/dist/api/metadata/types.d.ts +15 -0
  13. package/dist/{src/appData.schema-d44994e0.js → appData.schema-d44994e0.js} +0 -0
  14. package/dist/{src/appData.schema-d44994e0.js.map → appData.schema-d44994e0.js.map} +0 -0
  15. package/dist/{src/appData.schema-fb2df827.js → appData.schema-fb2df827.js} +0 -0
  16. package/dist/{src/appData.schema-fb2df827.js.map → appData.schema-fb2df827.js.map} +0 -0
  17. package/dist/{src/src/constants → constants}/chains.d.ts +0 -0
  18. package/dist/{src/src/constants → constants}/index.d.ts +1 -0
  19. package/dist/{src/src/constants → constants}/tokens.d.ts +2 -2
  20. package/dist/index.d.ts +5 -0
  21. package/dist/index.js +29 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/index.modern.js +29 -0
  24. package/dist/index.modern.js.map +1 -0
  25. package/dist/index.module.js +29 -0
  26. package/dist/index.module.js.map +1 -0
  27. package/dist/{src/src/types → types}/index.d.ts +2 -1
  28. package/dist/utils/appData.d.ts +10 -0
  29. package/dist/{src/src/utils → utils}/common.d.ts +2 -0
  30. package/dist/utils/context.d.ts +39 -0
  31. package/dist/utils/ipfs.d.ts +8 -0
  32. package/dist/{src/src/utils → utils}/sign.d.ts +1 -1
  33. package/dist/{src/src/utils → utils}/tokens.d.ts +1 -1
  34. package/package.json +48 -26
  35. package/.eslintrc.json +0 -15
  36. package/.github/workflows/publish.yml +0 -23
  37. package/.nvmrc +0 -1
  38. package/.prettierignore +0 -1
  39. package/.prettierrc +0 -5
  40. package/COPYRIGHT.md +0 -13
  41. package/LICENSE-APACHE +0 -201
  42. package/LICENSE-MIT +0 -21
  43. package/babel.config.js +0 -6
  44. package/dist/src/cow-sdk.esm.js +0 -2
  45. package/dist/src/cow-sdk.esm.js.map +0 -1
  46. package/dist/src/cow-sdk.js +0 -2
  47. package/dist/src/cow-sdk.js.map +0 -1
  48. package/dist/src/cow-sdk.modern.js +0 -2
  49. package/dist/src/cow-sdk.modern.js.map +0 -1
  50. package/dist/src/src/CowSdk.d.ts +0 -16
  51. package/dist/src/src/api/index.d.ts +0 -1
  52. package/dist/src/src/index.d.ts +0 -4
  53. package/dist/src/src/utils/appData.d.ts +0 -7
  54. package/dist/src/src/utils/context.d.ts +0 -24
  55. package/docs/images/CoW.png +0 -0
  56. package/src/CowSdk.ts +0 -31
  57. package/src/api/cow/errors/OperatorError.ts +0 -140
  58. package/src/api/cow/errors/QuoteError.ts +0 -114
  59. package/src/api/cow/index.ts +0 -343
  60. package/src/api/cow/types.ts +0 -82
  61. package/src/api/index.ts +0 -1
  62. package/src/constants/chains.ts +0 -11
  63. package/src/constants/index.ts +0 -14
  64. package/src/constants/tokens.ts +0 -16
  65. package/src/index.ts +0 -4
  66. package/src/schemas/appData.schema.json +0 -70
  67. package/src/types/index.ts +0 -5
  68. package/src/utils/appData.spec.ts +0 -66
  69. package/src/utils/appData.ts +0 -32
  70. package/src/utils/common.ts +0 -27
  71. package/src/utils/context.ts +0 -42
  72. package/src/utils/price.ts +0 -44
  73. package/src/utils/sign.ts +0 -224
  74. package/src/utils/tokens.ts +0 -12
  75. package/src/workflows/publish.sh +0 -77
  76. package/tsconfig.json +0 -18
@@ -1,2 +0,0 @@
1
- var e=require("@gnosis.pm/gp-v2-contracts"),r=require("loglevel"),t=require("cross-fetch"),n=require("@gnosis.pm/gp-v2-contracts/networks.json"),o=require("ajv");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s,a=/*#__PURE__*/i(r),c=/*#__PURE__*/i(t),u=/*#__PURE__*/i(n),d=/*#__PURE__*/i(o);class l extends Error{constructor(e,r){super(e),this.error_code=void 0,this.error_code=r}}function h(e){if(!e)return"";const r=new URLSearchParams;for(const t of Object.keys(e)){const n=e[t];n&&r.append(t,n)}const t=r.toString();return t?`?${t}`:""}!function(e){e[e.MAINNET=1]="MAINNET",e[e.RINKEBY=4]="RINKEBY",e[e.GNOSIS_CHAIN=100]="GNOSIS_CHAIN"}(s||(s={}));const f=[s.MAINNET,s.RINKEBY,s.GNOSIS_CHAIN];class p{constructor(e,r){this.symbol=void 0,this.address=void 0,this.symbol=e,this.address=r}}const{GPv2Settlement:E}=u.default,g={[s.MAINNET]:E[s.MAINNET].address,[s.RINKEBY]:E[s.RINKEBY].address,[s.GNOSIS_CHAIN]:E[s.GNOSIS_CHAIN].address},m=function(r,t,n,o="v4"){try{let s;function i(e){return s?e:{signature:d.data.toString(),signingScheme:c}}const c="eth_sign"===o?e.SigningScheme.ETHSIGN:e.SigningScheme.EIP712;let u,d=null;try{switch(o){case"v3":u=new e.TypedDataV3Signer(n);break;case"int_v4":u=new e.IntChainIdTypedDataV4Signer(n);break;default:u=n}}catch(e){throw a.default.error("Wallet not supported:",e),new l("Wallet not supported")}const h=function(e,n){try{var o=Promise.resolve(t({...r,signer:u,signingScheme:c})).then(function(e){d=e})}catch(e){return n(e)}return o&&o.then?o.then(void 0,n):o}(0,function(e){if(void 0===(i=e).code&&void 0===i.message)throw a.default.error(e),e;var i;if(e.code===A||P.test(e.message))switch(o){case"v4":const o=m(r,t,n,"v3");return s=1,o;case"v3":const i=m(r,t,n,"eth_sign");return s=1,i;default:throw e}else{if(w.test(e.message)){const e=m(r,t,n,"int_v4");return s=1,e}if(e.code===v){const e=m(r,t,n,"eth_sign");return s=1,e}if(I.test(e.message)){const e=m(r,t,n,"v3");return s=1,e}if(T.test(e.message)){const e=m(r,t,n,"eth_sign");return s=1,e}}});return Promise.resolve(h&&h.then?h.then(i):i(h))}catch(e){return Promise.reject(e)}},N=function(r){try{const{chainId:t,signer:n,signingScheme:o,orderId:i}=r,s=O(t);return Promise.resolve(e.signOrderCancellation(s,i,n,_(o)))}catch(e){return Promise.reject(e)}},y=function(r){try{const{chainId:t,signer:n,order:o,signingScheme:i}=r,s=O(t);return Promise.resolve(e.signOrder(s,o,n,_(i)))}catch(e){return Promise.reject(e)}},v=-32603,A=-32601,I=/eth_signTypedData_v4 does not exist/i,T=/eth_signTypedData_v3 does not exist/i,P=/RPC request failed/i,w=/provided chainid .* must match the active chainid/i,D=new Map([[e.SigningScheme.EIP712,{libraryValue:0,apiValue:"eip712"}],[e.SigningScheme.ETHSIGN,{libraryValue:1,apiValue:"ethsign"}],[e.SigningScheme.EIP1271,{libraryValue:2,apiValue:"eip1271"}],[e.SigningScheme.PRESIGN,{libraryValue:3,apiValue:"presign"}]]);function R(e){const r=D.get(e);if(void 0===r)throw new l("Unknown schema "+e);return r}function S(e){return R(e).apiValue}function _(e){return R(e).libraryValue}function O(r){const t=g[r];if(!t)throw new l("Unsupported network. Settlement contract is not deployed");return e.domain(r,t)}var k,b,L,U;!function(e){e.DuplicateOrder="DuplicateOrder",e.InvalidSignature="InvalidSignature",e.MissingOrderData="MissingOrderData",e.InsufficientValidTo="InsufficientValidTo",e.InsufficientAllowance="InsufficientAllowance",e.InsufficientBalance="InsufficientBalance",e.InsufficientFee="InsufficientFee",e.WrongOwner="WrongOwner",e.NotFound="NotFound",e.OrderNotFound="OrderNotFound",e.AlreadyCancelled="AlreadyCancelled",e.OrderFullyExecuted="OrderFullyExecuted",e.OrderExpired="OrderExpired",e.NoLiquidity="NoLiquidity",e.UnsupportedToken="UnsupportedToken",e.AmountIsZero="AmountIsZero",e.SellAmountDoesNotCoverFee="SellAmountDoesNotCoverFee",e.TransferEthToContract="TransferEthToContract",e.UNHANDLED_GET_ERROR="UNHANDLED_GET_ERROR",e.UNHANDLED_CREATE_ERROR="UNHANDLED_CREATE_ERROR",e.UNHANDLED_DELETE_ERROR="UNHANDLED_DELETE_ERROR"}(k||(k={})),function(e){e.DuplicateOrder="There was another identical order already submitted. Please try again.",e.InsufficientFee="The signed fee is insufficient. It's possible that is higher now due to a change in the gas price, ether price, or the sell token price. Please try again to get an updated fee quote.",e.InvalidSignature="The order signature is invalid. Check whether your Wallet app supports off-chain signing.",e.MissingOrderData="The order has missing information",e.InsufficientValidTo="The order you are signing is already expired. This can happen if you set a short expiration in the settings and waited too long before signing the transaction. Please try again.",e.InsufficientAllowance="The account doesn't have enough funds",e.InsufficientBalance="The account needs to approve the selling token in order to trade",e.WrongOwner="The signature is invalid.\n\nIt's likely that the signing method provided by your wallet doesn't comply with the standards required by CowSwap.\n\nCheck whether your Wallet app supports off-chain signing (EIP-712 or ETHSIGN).",e.NotFound="Token pair selected has insufficient liquidity",e.OrderNotFound="The order you are trying to cancel does not exist",e.AlreadyCancelled="Order is already cancelled",e.OrderFullyExecuted="Order is already filled",e.OrderExpired="Order is expired",e.NoLiquidity="Token pair selected has insufficient liquidity",e.UnsupportedToken="One of the tokens you are trading is unsupported. Please read the FAQ for more info.",e.AmountIsZero="Amount is zero",e.SellAmountDoesNotCoverFee="Sell amount does not sufficiently cover the current fee",e.TransferEthToContract="Sending the native currency to smart contract wallets is not currently supported",e.UNHANDLED_GET_ERROR="Order fetch failed. This may be due to a server or network connectivity issue. Please try again later.",e.UNHANDLED_CREATE_ERROR="The order was not accepted by the network",e.UNHANDLED_DELETE_ERROR="The order cancellation was not accepted by the network"}(b||(b={}));class x extends l{static getErrorMessage(e,r){try{return Promise.resolve(function(r,t){try{var n=Promise.resolve(e.json()).then(function(e){return e.errorType?x.apiErrorDetails[e.errorType]||e.errorType:(a.default.error("Unknown reason for bad order submission",e),e.description)})}catch(e){return t()}return n&&n.then?n.then(void 0,t):n}(0,function(){return a.default.error("Error handling a 400 error. Likely a problem deserialising the JSON response"),function(e){switch(e){case"get":return b.UNHANDLED_GET_ERROR;case"create":return b.UNHANDLED_CREATE_ERROR;case"delete":return b.UNHANDLED_DELETE_ERROR;default:return a.default.error("[OperatorError::_mapActionToErrorDetails] Uncaught error mapping error action type to server error. Please try again later."),"Something failed. Please try again later."}}(r)}))}catch(e){return Promise.reject(e)}}static getErrorFromStatusCode(e,r){try{const t=this;switch(e.status){case 400:case 404:return Promise.resolve(t.getErrorMessage(e,r));case 403:return Promise.resolve(`The order cannot be ${"create"===r?"accepted":"cancelled"}. Your account is deny-listed.`);case 429:return Promise.resolve(`The order cannot be ${"create"===r?"accepted. Too many order placements":"cancelled. Too many order cancellations"}. Please, retry in a minute`);default:return a.default.error(`[OperatorError::getErrorFromStatusCode] Error ${"create"===r?"creating":"cancelling"} the order, status code:`,e.status||"unknown"),Promise.resolve(`Error ${"create"===r?"creating":"cancelling"} the order`)}return Promise.resolve()}catch(e){return Promise.reject(e)}}constructor(e){super(e.description,e.errorType),this.name="OperatorError",this.description=void 0,this.description=e.description,this.message=b[e.errorType]}}x.apiErrorDetails=b,function(e){e.UnsupportedToken="UnsupportedToken",e.InsufficientLiquidity="InsufficientLiquidity",e.FeeExceedsFrom="FeeExceedsFrom",e.ZeroPrice="ZeroPrice",e.UNHANDLED_ERROR="UNHANDLED_ERROR"}(L||(L={})),function(e){e.UnsupportedToken="One of the tokens you are trading is unsupported. Please read the FAQ for more info.",e.InsufficientLiquidity="Token pair selected has insufficient liquidity",e.FeeExceedsFrom='Current fee exceeds entered "from" amount',e.ZeroPrice="Quoted price is zero. This is likely due to a significant price difference between the two tokens. Please try increasing amounts.",e.UNHANDLED_ERROR="Quote fetch failed. This may be due to a server or network connectivity issue. Please try again later."}(U||(U={}));class C extends l{static getErrorMessage(e){try{return Promise.resolve(function(r,t){try{var n=Promise.resolve(e.json()).then(function(e){return e.errorType?C.quoteErrorDetails[e.errorType]||e.errorType:(a.default.error("Unknown reason for bad quote fetch",e),e.description)})}catch(e){return t()}return n&&n.then?n.then(void 0,t):n}(0,function(){return a.default.error("Error handling 400/404 error. Likely a problem deserialising the JSON response"),C.quoteErrorDetails.UNHANDLED_ERROR}))}catch(e){return Promise.reject(e)}}static getErrorFromStatusCode(e){try{const r=this;switch(e.status){case 400:case 404:return Promise.resolve(r.getErrorMessage(e));default:return a.default.error("[QuoteError::getErrorFromStatusCode] Error fetching quote, status code:",e.status||"unknown"),Promise.resolve("Error fetching quote")}return Promise.resolve()}catch(e){return Promise.reject(e)}}constructor(e){super(e.description,e.errorType),this.name="QuoteErrorObject",this.description=void 0,this.data=void 0,this.description=e.description,this.message=C.quoteErrorDetails[e.errorType],this.data=e?.data}}C.quoteErrorDetails=U;const F={[s.MAINNET]:new p("WETH","0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"),[s.RINKEBY]:new p("WETH","0xc778417E063141139Fce010982780140Aa0cD5Ab"),[s.GNOSIS_CHAIN]:new p("WXDAI","0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d")},H={[s.MAINNET]:"ETH",[s.RINKEBY]:"ETH",[s.GNOSIS_CHAIN]:"XDAI"};function j(e,r){let t=e;return e===H[r]&&(t=F[r].address),t}function q(e,r){try{var t=e()}catch(e){return r(e)}return t&&t.then?t.then(void 0,r):t}const M=function(e,r){try{return e.ok?Promise.resolve(e.json()):Promise.resolve(e.json()).then(function(e){const t=function(e){switch(e?.errorType){case k.NotFound:case k.NoLiquidity:return{errorType:L.InsufficientLiquidity,description:U.InsufficientLiquidity};case k.SellAmountDoesNotCoverFee:return{errorType:L.FeeExceedsFrom,description:U.FeeExceedsFrom,data:e?.data};case k.UnsupportedToken:return{errorType:L.UnsupportedToken,description:e.description};case k.SellAmountDoesNotCoverFee:return{errorType:L.FeeExceedsFrom,description:e.description};default:return{errorType:L.UNHANDLED_ERROR,description:U.UNHANDLED_ERROR}}}(e),n=new C(t);if(r){const{sellToken:e,buyToken:t}=r;a.default.error(`Error querying fee from API - sellToken: ${e}, buyToken: ${t}`)}throw n})}catch(e){return Promise.reject(e)}},$={errorType:L.UNHANDLED_ERROR,description:U.UNHANDLED_ERROR},G={errorType:k.UNHANDLED_CREATE_ERROR,description:b.UNHANDLED_CREATE_ERROR};class B{constructor(e,r){this.chainId=void 0,this.context=void 0,this.API_NAME="CoW Protocol",this.chainId=e,this.context=r}get DEFAULT_HEADERS(){return{"Content-Type":"application/json","X-AppId":this.context.appDataHash}}get API_BASE_URL(){return this.context.isDevEnvironment?{[s.MAINNET]:"https://barn.api.cow.fi/mainnet/api",[s.RINKEBY]:"https://barn.api.cow.fi/rinkeby/api",[s.GNOSIS_CHAIN]:"https://barn.api.cow.fi/xdai/api"}:{[s.MAINNET]:"https://api.cow.fi/mainnet/api",[s.RINKEBY]:"https://api.cow.fi/rinkeby/api",[s.GNOSIS_CHAIN]:"https://api.cow.fi/xdai/api"}}get PROFILE_API_BASE_URL(){return this.context.isDevEnvironment?{[s.MAINNET]:"https://barn.api.cow.fi/affiliate/api"}:{[s.MAINNET]:"https://api.cow.fi/affiliate/api"}}getProfileData(e){try{const r=this;return a.default.debug(`[api:${r.API_NAME}] Get profile data for`,r.chainId,e),r.chainId!==s.MAINNET?(a.default.info("Profile data is only available for mainnet"),Promise.resolve(null)):Promise.resolve(r.getProfile(`/profile/${e}`)).then(function(e){return e.ok?e.json():Promise.resolve(e.json()).then(function(e){throw a.default.error(e),new l(e?.description)})})}catch(e){return Promise.reject(e)}}getTrades(e){try{const r=this,{owner:t,limit:n,offset:o}=e,i=h({owner:t,limit:n,offset:o});return a.default.debug("[util:operator] Get trades for",r.chainId,t,{limit:n,offset:o}),Promise.resolve(q(function(){return Promise.resolve(r.get(`/trades${i}`)).then(function(e){return e.ok?e.json():Promise.resolve(e.json()).then(function(e){throw new l(e)})})},function(e){throw a.default.error("Error getting trades:",e),new l("Error getting trades: "+e)}))}catch(e){return Promise.reject(e)}}getOrders(e){try{const r=this,{owner:t,limit:n=1e3,offset:o=0}=e,i=h({limit:n,offset:o});return a.default.debug(`[api:${r.API_NAME}] Get orders for `,r.chainId,t,n,o),Promise.resolve(q(function(){return Promise.resolve(r.get(`/account/${t}/orders/${i}`)).then(function(e){return e.ok?e.json():Promise.resolve(e.json()).then(function(e){throw new x(e)})})},function(e){throw a.default.error("Error getting orders information:",e),new x(G)}))}catch(e){return Promise.reject(e)}}getOrder(e){try{const r=this;return a.default.debug(`[api:${r.API_NAME}] Get order for `,r.chainId,e),Promise.resolve(q(function(){return Promise.resolve(r.get(`/orders/${e}`)).then(function(e){return e.ok?e.json():Promise.resolve(e.json()).then(function(e){throw new x(e)})})},function(e){throw a.default.error("Error getting order information:",e),new x(G)}))}catch(e){return Promise.reject(e)}}getPriceQuoteLegacy(e){try{const r=this,{baseToken:t,quoteToken:n,amount:o,kind:i}=e;return a.default.debug(`[api:${r.API_NAME}] Get price from API`,e),Promise.resolve(r.get(`/markets/${j(t,r.chainId)}-${j(n,r.chainId)}/${i}/${o}`).catch(e=>{throw a.default.error("Error getting price quote:",e),new C($)})).then(M)}catch(e){return Promise.reject(e)}}getQuote(e){try{const r=this,t=r.mapNewToLegacyParams(e,r.chainId);return Promise.resolve(r.post("/quote",t)).then(M)}catch(e){return Promise.reject(e)}}sendSignedOrderCancellation(e){try{const r=this,{cancellation:t,owner:n}=e;return a.default.debug(`[api:${r.API_NAME}] Delete signed order for network`,r.chainId,t),Promise.resolve(r.delete(`/orders/${t.orderUid}`,{signature:t.signature,signingScheme:S(t.signingScheme),from:n})).then(function(e){function n(e){a.default.debug(`[api:${r.API_NAME}] Cancelled order`,t.orderUid,r.chainId)}const o=function(){if(!e.ok)return Promise.resolve(x.getErrorFromStatusCode(e,"delete")).then(function(e){throw new l(e)})}();return o&&o.then?o.then(n):n()})}catch(e){return Promise.reject(e)}}sendOrder(e){try{const r=this,t={...e.order,appData:r.context.appDataHash},{owner:n}=e;return a.default.debug(`[api:${r.API_NAME}] Post signed order for network`,r.chainId,t),Promise.resolve(r.post("/orders",{...t,signingScheme:S(t.signingScheme),from:n})).then(function(e){function t(t){return Promise.resolve(e.json()).then(function(e){return a.default.debug(`[api:${r.API_NAME}] Success posting the signed order`,e),e})}const n=function(){if(!e.ok)return Promise.resolve(x.getErrorFromStatusCode(e,"create")).then(function(e){throw new l(e)})}();return n&&n.then?n.then(t):t()})}catch(e){return Promise.reject(e)}}getOrderLink(e){return this.getApiBaseUrl()+`/orders/${e}`}mapNewToLegacyParams(r,t){const{amount:n,kind:o,userAddress:i,receiver:s,validTo:a,sellToken:c,buyToken:u}=r,d=i||"0x0000000000000000000000000000000000000000",l={sellToken:j(c,t),buyToken:j(u,t),from:d,receiver:s||d,appData:this.context.appDataHash,validTo:a,partiallyFillable:!1};return o===e.OrderKind.SELL?{kind:e.OrderKind.SELL,sellAmountBeforeFee:n,...l}:{kind:e.OrderKind.BUY,buyAmountAfterFee:n,...l}}getApiBaseUrl(){const e=this.API_BASE_URL[this.chainId];if(e)return e+"/v1";throw new l(`Unsupported Network. The ${this.API_NAME} API is not deployed in the Network `+this.chainId)}getProfileApiBaseUrl(){const e=this.PROFILE_API_BASE_URL[this.chainId];if(e)return e+"/v1";throw new l(`Unsupported Network. The ${this.API_NAME} API is not deployed in the Network `+this.chainId)}fetch(e,r,t){const n=this.getApiBaseUrl();return c.default(n+e,{headers:this.DEFAULT_HEADERS,method:r,body:void 0!==t?JSON.stringify(t):t})}fetchProfile(e,r,t){const n=this.getProfileApiBaseUrl();return c.default(n+e,{headers:this.DEFAULT_HEADERS,method:r,body:void 0!==t?JSON.stringify(t):t})}post(e,r){return this.fetch(e,"POST",r)}get(e){return this.fetch(e,"GET")}getProfile(e){return this.fetchProfile(e,"GET")}delete(e,r){return this.fetch(e,"DELETE",r)}}const V=function(e){try{return Promise.resolve(K()).then(function({ajv:r,validate:t}){return Promise.resolve(t(e)).then(function(e){return{result:!!e,errors:r.errors??void 0}})})}catch(e){return Promise.reject(e)}},K=function(){try{function e(){return{ajv:Y,validate:W}}Y||(Y=new d.default);const r=function(){if(!W)return Promise.resolve(Promise.resolve().then(function(){return require("./appData.schema-d44994e0.js")})).then(function(e){W=Y.compile(e)})}();return Promise.resolve(r&&r.then?r.then(e):e())}catch(e){return Promise.reject(e)}};let W,Y;const Q={appDataHash:"0x0000000000000000000000000000000000000000000000000000000000000000",isDevEnvironment:!1};class Z{constructor(e){this.context=void 0,this.context={...Q,...e}}get appDataHash(){return this.context.appDataHash??Q.appDataHash}get isDevEnvironment(){return this.context.isDevEnvironment??Q.isDevEnvironment}get signer(){if(this.context.signer)return this.context.signer;throw new l("No signer was provided")}}class J{constructor(e,r={}){this.chainId=void 0,this.context=void 0,this.cowApi=void 0,this.validateAppDataDocument=V,this.chainId=e,this.context=new Z(r),this.cowApi=new B(e,this.context)}signOrder(e){return function(e,r,t){return m({order:e,chainId:r},y,t)}({...e,appData:this.context.appDataHash},this.chainId,this.context.signer)}signOrderCancellation(e){return function(e,r,t){return m({orderId:e,chainId:r},N,t)}(e,this.chainId,this.context.signer)}}J.version="0.0.6",Object.defineProperty(exports,"OrderKind",{enumerable:!0,get:function(){return e.OrderKind}}),exports.ALL_SUPPORTED_CHAIN_IDS=f,exports.CowError=l,exports.CowSdk=J,exports.Token=p;
2
- //# sourceMappingURL=cow-sdk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cow-sdk.js","sources":["../../src/constants/chains.ts","../../src/utils/common.ts","../../src/types/index.ts","../../src/constants/index.ts","../../src/utils/sign.ts","../../src/api/cow/errors/OperatorError.ts","../../src/api/cow/errors/QuoteError.ts","../../src/constants/tokens.ts","../../src/utils/tokens.ts","../../src/api/cow/index.ts","../../src/utils/appData.ts","../../src/utils/context.ts","../../src/CowSdk.ts"],"sourcesContent":["export enum SupportedChainId {\n MAINNET = 1,\n RINKEBY = 4,\n GNOSIS_CHAIN = 100,\n}\n\nexport const ALL_SUPPORTED_CHAIN_IDS: SupportedChainId[] = [\n SupportedChainId.MAINNET,\n SupportedChainId.RINKEBY,\n SupportedChainId.GNOSIS_CHAIN,\n]\n","export class CowError extends Error {\n error_code?: string\n\n constructor(message: string, error_code?: string) {\n super(message)\n this.error_code = error_code\n }\n}\n\nexport function objectToQueryString(o: any): string {\n if (!o) {\n return ''\n }\n\n const qs = new URLSearchParams()\n\n for (const key of Object.keys(o)) {\n const value = o[key]\n if (value) {\n qs.append(key, value)\n }\n }\n\n const qsResult = qs.toString()\n\n return qsResult ? `?${qsResult}` : ''\n}\n","export * from '/api/cow/types'\nexport { OrderKind } from '@gnosis.pm/gp-v2-contracts'\nexport class Token {\n constructor(public symbol: string, public address: string) {}\n}\n","import contractNetworks from '@gnosis.pm/gp-v2-contracts/networks.json'\nimport { SupportedChainId as ChainId } from './chains'\n\nconst { GPv2Settlement } = contractNetworks\n\nexport const GP_SETTLEMENT_CONTRACT_ADDRESS: Partial<Record<number, string>> = {\n [ChainId.MAINNET]: GPv2Settlement[ChainId.MAINNET].address,\n [ChainId.RINKEBY]: GPv2Settlement[ChainId.RINKEBY].address,\n [ChainId.GNOSIS_CHAIN]: GPv2Settlement[ChainId.GNOSIS_CHAIN].address,\n}\n\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'\n\nexport const DEFAULT_APP_DATA_HASH = '0x0000000000000000000000000000000000000000000000000000000000000000'\n","import {\n domain as domainGp,\n signOrder as signOrderGp,\n signOrderCancellation as signOrderCancellationGp,\n EcdsaSignature,\n Order,\n OrderCancellation as OrderCancellationGp,\n Signature,\n TypedDataV3Signer,\n IntChainIdTypedDataV4Signer,\n SigningScheme,\n} from '@gnosis.pm/gp-v2-contracts'\nimport log from 'loglevel'\n\nimport { SupportedChainId as ChainId } from '/constants/chains'\nimport { GP_SETTLEMENT_CONTRACT_ADDRESS } from '/constants'\nimport { TypedDataDomain, Signer } from '@ethersproject/abstract-signer'\nimport { CowError } from './common'\n\n// For error codes, see:\n// - https://eth.wiki/json-rpc/json-rpc-error-codes-improvement-proposal\n// - https://www.jsonrpc.org/specification#error_object\nconst METAMASK_SIGNATURE_ERROR_CODE = -32603\nconst METHOD_NOT_FOUND_ERROR_CODE = -32601\nconst V4_ERROR_MSG_REGEX = /eth_signTypedData_v4 does not exist/i\nconst V3_ERROR_MSG_REGEX = /eth_signTypedData_v3 does not exist/i\nconst RPC_REQUEST_FAILED_REGEX = /RPC request failed/i\nconst METAMASK_STRING_CHAINID_REGEX = /provided chainid .* must match the active chainid/i\n\nexport type UnsignedOrder = Omit<Order, 'receiver'> & { receiver: string }\n\nexport interface SignOrderParams {\n chainId: ChainId\n signer: Signer\n order: UnsignedOrder\n signingScheme: SigningScheme\n}\n\n// posted to /api/v1/orders on Order creation\n// serializable, so no BigNumbers\n// See https://protocol-rinkeby.dev.gnosisdev.com/api/\nexport interface OrderCreation extends UnsignedOrder {\n signingScheme: SigningScheme // signed method\n\n // Signature is used for:\n // - Signature: EIP-712,ETHSIGN\n // - Owner address: for PRESIGN\n signature: string // 65 bytes encoded as hex without `0x` prefix. r + s + v from the spec\n}\n\nexport interface SingOrderCancellationParams {\n chainId: ChainId\n signer: Signer\n orderId: string\n signingScheme: SigningScheme\n}\n\nexport interface OrderCancellation extends OrderCancellationGp {\n signature: string\n signingScheme: SigningScheme\n}\n\nexport type SigningSchemeValue = 'eip712' | 'ethsign' | 'eip1271' | 'presign'\n\ninterface SchemaInfo {\n libraryValue: number\n apiValue: SigningSchemeValue\n}\nconst mapSigningSchema: Map<SigningScheme, SchemaInfo> = new Map([\n [SigningScheme.EIP712, { libraryValue: 0, apiValue: 'eip712' }],\n [SigningScheme.ETHSIGN, { libraryValue: 1, apiValue: 'ethsign' }],\n [SigningScheme.EIP1271, { libraryValue: 2, apiValue: 'eip1271' }],\n [SigningScheme.PRESIGN, { libraryValue: 3, apiValue: 'presign' }],\n])\n\nfunction _getSigningSchemeInfo(ecdaSigningScheme: SigningScheme): SchemaInfo {\n const value = mapSigningSchema.get(ecdaSigningScheme)\n if (value === undefined) {\n throw new CowError('Unknown schema ' + ecdaSigningScheme)\n }\n\n return value\n}\n\ninterface ProviderRpcError extends Error {\n message: string\n code: number\n data?: unknown\n}\n\nfunction isProviderRpcError(error: unknown): error is ProviderRpcError {\n return (error as ProviderRpcError).code !== undefined || (error as ProviderRpcError).message !== undefined\n}\n\nexport function getSigningSchemeApiValue(ecdaSigningScheme: SigningScheme): string {\n return _getSigningSchemeInfo(ecdaSigningScheme).apiValue\n}\n\nexport function getSigningSchemeLibValue(ecdaSigningScheme: SigningScheme): number {\n return _getSigningSchemeInfo(ecdaSigningScheme).libraryValue\n}\n\nfunction _getDomain(chainId: ChainId): TypedDataDomain {\n // Get settlement contract address\n const settlementContract = GP_SETTLEMENT_CONTRACT_ADDRESS[chainId]\n\n if (!settlementContract) {\n throw new CowError('Unsupported network. Settlement contract is not deployed')\n }\n\n return domainGp(chainId, settlementContract)\n}\n\nasync function _signOrder(params: SignOrderParams): Promise<Signature> {\n const { chainId, signer, order, signingScheme } = params\n\n const domain = _getDomain(chainId)\n\n return signOrderGp(domain, order, signer, getSigningSchemeLibValue(signingScheme))\n}\n\nasync function _signOrderCancellation(params: SingOrderCancellationParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderId } = params\n\n const domain = _getDomain(chainId)\n\n return signOrderCancellationGp(domain, orderId, signer, getSigningSchemeLibValue(signingScheme))\n}\n\nexport type SigningResult = { signature: string; signingScheme: SigningScheme }\n\nasync function _signPayload(\n payload: any,\n signFn: typeof _signOrder | typeof _signOrderCancellation,\n signer: Signer,\n signingMethod: 'v4' | 'int_v4' | 'v3' | 'eth_sign' = 'v4'\n): Promise<SigningResult> {\n const signingScheme = signingMethod === 'eth_sign' ? SigningScheme.ETHSIGN : SigningScheme.EIP712\n let signature: Signature | null = null\n\n let _signer\n try {\n switch (signingMethod) {\n case 'v3':\n _signer = new TypedDataV3Signer(signer)\n break\n case 'int_v4':\n _signer = new IntChainIdTypedDataV4Signer(signer)\n break\n default:\n _signer = signer\n }\n } catch (e) {\n log.error('Wallet not supported:', e)\n throw new CowError('Wallet not supported')\n }\n\n try {\n signature = (await signFn({ ...payload, signer: _signer, signingScheme })) as EcdsaSignature // Only ECDSA signing supported for now\n } catch (e) {\n if (!isProviderRpcError(e)) {\n // Some other error signing. Let it bubble up.\n log.error(e)\n throw e\n }\n\n if (e.code === METHOD_NOT_FOUND_ERROR_CODE || RPC_REQUEST_FAILED_REGEX.test(e.message)) {\n // Maybe the wallet returns the proper error code? We can only hope 🤞\n // OR it failed with a generic message, there's no error code set, and we also hope it'll work\n // with other methods...\n switch (signingMethod) {\n case 'v4':\n return _signPayload(payload, signFn, signer, 'v3')\n case 'v3':\n return _signPayload(payload, signFn, signer, 'eth_sign')\n default:\n throw e\n }\n } else if (METAMASK_STRING_CHAINID_REGEX.test(e.message)) {\n // Metamask now enforces chainId to be an integer\n return _signPayload(payload, signFn, signer, 'int_v4')\n } else if (e.code === METAMASK_SIGNATURE_ERROR_CODE) {\n // We tried to sign order the nice way.\n // That works fine for regular MM addresses. Does not work for Hardware wallets, though.\n // See https://github.com/MetaMask/metamask-extension/issues/10240#issuecomment-810552020\n // So, when that specific error occurs, we know this is a problem with MM + HW.\n // Then, we fallback to ETHSIGN.\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else if (V4_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v4`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'v3')\n } else if (V3_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v3`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'eth_sign')\n }\n }\n return { signature: signature!.data.toString(), signingScheme }\n}\n/**\n * Returns the signature for the specified order with the signing scheme encoded\n * into the signature.\n * @export\n * @param {UnsignedOrder} order The order to sign.\n * @param {ChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrder(order: UnsignedOrder, chainId: ChainId, signer: Signer): Promise<SigningResult> {\n return _signPayload({ order, chainId }, _signOrder, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellation with the signing scheme encoded\n * into the signature.\n *\n * @export\n * @param {string} orderId The unique identifier of the order being cancelled.\n * @param {ChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellation(orderId: string, chainId: ChainId, signer: Signer): Promise<SigningResult> {\n return _signPayload({ orderId, chainId }, _signOrderCancellation, signer)\n}\n","import log from 'loglevel'\nimport { CowError } from '/utils/common'\n\ntype ApiActionType = 'get' | 'create' | 'delete'\n\nexport interface ApiErrorObject {\n errorType: ApiErrorCodes\n description: string\n data?: any\n}\n\n// Conforms to backend API\n// https://github.com/gnosis/gp-v2-services/blob/d932e11c9a2125fdba239530be7684799f694909/crates/orderbook/openapi.yml#L801\n// and\n// https://github.com/gnosis/gp-v2-services/blob/d932e11c9a2125fdba239530be7684799f694909/crates/orderbook/openapi.yml#L740\nexport enum ApiErrorCodes {\n DuplicateOrder = 'DuplicateOrder',\n InvalidSignature = 'InvalidSignature',\n MissingOrderData = 'MissingOrderData',\n InsufficientValidTo = 'InsufficientValidTo',\n InsufficientAllowance = 'InsufficientAllowance',\n InsufficientBalance = 'InsufficientBalance',\n InsufficientFee = 'InsufficientFee',\n WrongOwner = 'WrongOwner',\n NotFound = 'NotFound',\n OrderNotFound = 'OrderNotFound',\n AlreadyCancelled = 'AlreadyCancelled',\n OrderFullyExecuted = 'OrderFullyExecuted',\n OrderExpired = 'OrderExpired',\n NoLiquidity = 'NoLiquidity',\n UnsupportedToken = 'UnsupportedToken',\n AmountIsZero = 'AmountIsZero',\n SellAmountDoesNotCoverFee = 'SellAmountDoesNotCoverFee',\n TransferEthToContract = 'TransferEthToContract',\n UNHANDLED_GET_ERROR = 'UNHANDLED_GET_ERROR',\n UNHANDLED_CREATE_ERROR = 'UNHANDLED_CREATE_ERROR',\n UNHANDLED_DELETE_ERROR = 'UNHANDLED_DELETE_ERROR',\n}\n\nexport enum ApiErrorCodeDetails {\n DuplicateOrder = 'There was another identical order already submitted. Please try again.',\n InsufficientFee = \"The signed fee is insufficient. It's possible that is higher now due to a change in the gas price, ether price, or the sell token price. Please try again to get an updated fee quote.\",\n InvalidSignature = 'The order signature is invalid. Check whether your Wallet app supports off-chain signing.',\n MissingOrderData = 'The order has missing information',\n InsufficientValidTo = 'The order you are signing is already expired. This can happen if you set a short expiration in the settings and waited too long before signing the transaction. Please try again.',\n InsufficientAllowance = \"The account doesn't have enough funds\",\n InsufficientBalance = 'The account needs to approve the selling token in order to trade',\n WrongOwner = \"The signature is invalid.\\n\\nIt's likely that the signing method provided by your wallet doesn't comply with the standards required by CowSwap.\\n\\nCheck whether your Wallet app supports off-chain signing (EIP-712 or ETHSIGN).\",\n NotFound = 'Token pair selected has insufficient liquidity',\n OrderNotFound = 'The order you are trying to cancel does not exist',\n AlreadyCancelled = 'Order is already cancelled',\n OrderFullyExecuted = 'Order is already filled',\n OrderExpired = 'Order is expired',\n NoLiquidity = 'Token pair selected has insufficient liquidity',\n UnsupportedToken = 'One of the tokens you are trading is unsupported. Please read the FAQ for more info.',\n AmountIsZero = 'Amount is zero',\n SellAmountDoesNotCoverFee = 'Sell amount does not sufficiently cover the current fee',\n TransferEthToContract = 'Sending the native currency to smart contract wallets is not currently supported',\n UNHANDLED_GET_ERROR = 'Order fetch failed. This may be due to a server or network connectivity issue. Please try again later.',\n UNHANDLED_CREATE_ERROR = 'The order was not accepted by the network',\n UNHANDLED_DELETE_ERROR = 'The order cancellation was not accepted by the network',\n}\n\nfunction _mapActionToErrorDetail(action?: ApiActionType) {\n switch (action) {\n case 'get':\n return ApiErrorCodeDetails.UNHANDLED_GET_ERROR\n case 'create':\n return ApiErrorCodeDetails.UNHANDLED_CREATE_ERROR\n case 'delete':\n return ApiErrorCodeDetails.UNHANDLED_DELETE_ERROR\n default:\n log.error(\n '[OperatorError::_mapActionToErrorDetails] Uncaught error mapping error action type to server error. Please try again later.'\n )\n return 'Something failed. Please try again later.'\n }\n}\n\nexport default class OperatorError extends CowError {\n name = 'OperatorError'\n description: ApiErrorObject['description']\n\n // Status 400 errors\n // https://github.com/gnosis/gp-v2-services/blob/9014ae55412a356e46343e051aefeb683cc69c41/orderbook/openapi.yml#L563\n static apiErrorDetails = ApiErrorCodeDetails\n\n public static async getErrorMessage(response: Response, action: ApiActionType) {\n try {\n const orderPostError: ApiErrorObject = await response.json()\n\n if (orderPostError.errorType) {\n const errorMessage = OperatorError.apiErrorDetails[orderPostError.errorType]\n // shouldn't fall through as this error constructor expects the error code to exist but just in case\n return errorMessage || orderPostError.errorType\n } else {\n log.error('Unknown reason for bad order submission', orderPostError)\n return orderPostError.description\n }\n } catch (error) {\n log.error('Error handling a 400 error. Likely a problem deserialising the JSON response')\n return _mapActionToErrorDetail(action)\n }\n }\n static async getErrorFromStatusCode(response: Response, action: 'create' | 'delete') {\n switch (response.status) {\n case 400:\n case 404:\n return this.getErrorMessage(response, action)\n\n case 403:\n return `The order cannot be ${action === 'create' ? 'accepted' : 'cancelled'}. Your account is deny-listed.`\n\n case 429:\n return `The order cannot be ${\n action === 'create' ? 'accepted. Too many order placements' : 'cancelled. Too many order cancellations'\n }. Please, retry in a minute`\n\n case 500:\n default:\n log.error(\n `[OperatorError::getErrorFromStatusCode] Error ${\n action === 'create' ? 'creating' : 'cancelling'\n } the order, status code:`,\n response.status || 'unknown'\n )\n return `Error ${action === 'create' ? 'creating' : 'cancelling'} the order`\n }\n }\n constructor(apiError: ApiErrorObject) {\n super(apiError.description, apiError.errorType)\n\n this.description = apiError.description\n this.message = ApiErrorCodeDetails[apiError.errorType]\n }\n}\n\nexport function isValidOperatorError(error: any): error is OperatorError {\n return error instanceof OperatorError\n}\n","import log from 'loglevel'\nimport { CowError } from '/utils/common'\nimport { ApiErrorCodes, ApiErrorObject } from './OperatorError'\n\nexport interface GpQuoteErrorObject {\n errorType: GpQuoteErrorCodes\n description: string\n data?: any\n}\n\n// Conforms to backend API\n// https://github.com/gnosis/gp-v2-services/blob/0bd5f7743bebaa5acd3be13e35ede2326a096f14/orderbook/openapi.yml#L562\nexport enum GpQuoteErrorCodes {\n UnsupportedToken = 'UnsupportedToken',\n InsufficientLiquidity = 'InsufficientLiquidity',\n FeeExceedsFrom = 'FeeExceedsFrom',\n ZeroPrice = 'ZeroPrice',\n UNHANDLED_ERROR = 'UNHANDLED_ERROR',\n}\n\nexport enum GpQuoteErrorDetails {\n UnsupportedToken = 'One of the tokens you are trading is unsupported. Please read the FAQ for more info.',\n InsufficientLiquidity = 'Token pair selected has insufficient liquidity',\n FeeExceedsFrom = 'Current fee exceeds entered \"from\" amount',\n ZeroPrice = 'Quoted price is zero. This is likely due to a significant price difference between the two tokens. Please try increasing amounts.',\n UNHANDLED_ERROR = 'Quote fetch failed. This may be due to a server or network connectivity issue. Please try again later.',\n}\n\nexport function mapOperatorErrorToQuoteError(error?: ApiErrorObject): GpQuoteErrorObject {\n switch (error?.errorType) {\n case ApiErrorCodes.NotFound:\n case ApiErrorCodes.NoLiquidity:\n return {\n errorType: GpQuoteErrorCodes.InsufficientLiquidity,\n description: GpQuoteErrorDetails.InsufficientLiquidity,\n }\n\n case ApiErrorCodes.SellAmountDoesNotCoverFee:\n return {\n errorType: GpQuoteErrorCodes.FeeExceedsFrom,\n description: GpQuoteErrorDetails.FeeExceedsFrom,\n data: error?.data,\n }\n\n case ApiErrorCodes.UnsupportedToken:\n return {\n errorType: GpQuoteErrorCodes.UnsupportedToken,\n description: error.description,\n }\n case ApiErrorCodes.SellAmountDoesNotCoverFee:\n return {\n errorType: GpQuoteErrorCodes.FeeExceedsFrom,\n description: error.description,\n }\n default:\n return { errorType: GpQuoteErrorCodes.UNHANDLED_ERROR, description: GpQuoteErrorDetails.UNHANDLED_ERROR }\n }\n}\n\nexport default class GpQuoteError extends CowError {\n name = 'QuoteErrorObject'\n description: string\n // any data attached\n data?: any\n\n // Status 400 errors\n // https://github.com/gnosis/gp-v2-services/blob/9014ae55412a356e46343e051aefeb683cc69c41/orderbook/openapi.yml#L563\n static quoteErrorDetails = GpQuoteErrorDetails\n\n public static async getErrorMessage(response: Response) {\n try {\n const orderPostError: GpQuoteErrorObject = await response.json()\n\n if (orderPostError.errorType) {\n const errorMessage = GpQuoteError.quoteErrorDetails[orderPostError.errorType]\n // shouldn't fall through as this error constructor expects the error code to exist but just in case\n return errorMessage || orderPostError.errorType\n } else {\n log.error('Unknown reason for bad quote fetch', orderPostError)\n return orderPostError.description\n }\n } catch (error) {\n log.error('Error handling 400/404 error. Likely a problem deserialising the JSON response')\n return GpQuoteError.quoteErrorDetails.UNHANDLED_ERROR\n }\n }\n\n static async getErrorFromStatusCode(response: Response) {\n switch (response.status) {\n case 400:\n case 404:\n return this.getErrorMessage(response)\n\n case 500:\n default:\n log.error(\n '[QuoteError::getErrorFromStatusCode] Error fetching quote, status code:',\n response.status || 'unknown'\n )\n return 'Error fetching quote'\n }\n }\n constructor(quoteError: GpQuoteErrorObject) {\n super(quoteError.description, quoteError.errorType)\n\n this.description = quoteError.description\n this.message = GpQuoteError.quoteErrorDetails[quoteError.errorType]\n this.data = quoteError?.data\n }\n}\n\nexport function isValidQuoteError(error: any): error is GpQuoteError {\n return error instanceof GpQuoteError\n}\n","import { SupportedChainId as ChainId } from '/constants/chains'\nimport { Token } from '/types'\n\nexport const XDAI_SYMBOL = 'XDAI'\n\nexport const WRAPPED_NATIVE_TOKEN: Record<ChainId, Token> = {\n [ChainId.MAINNET]: new Token('WETH', '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'),\n [ChainId.RINKEBY]: new Token('WETH', '0xc778417E063141139Fce010982780140Aa0cD5Ab'),\n [ChainId.GNOSIS_CHAIN]: new Token('WXDAI', '0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d'),\n}\n\nexport const NATIVE: Record<ChainId, string> = {\n [ChainId.MAINNET]: 'ETH',\n [ChainId.RINKEBY]: 'ETH',\n [ChainId.GNOSIS_CHAIN]: XDAI_SYMBOL,\n}\n","import { SupportedChainId as ChainId } from '/constants/chains'\nimport { NATIVE, WRAPPED_NATIVE_TOKEN } from '/constants/tokens'\n\nexport function toErc20Address(tokenAddress: string, chainId: ChainId): string {\n let checkedAddress = tokenAddress\n\n if (tokenAddress === NATIVE[chainId]) {\n checkedAddress = WRAPPED_NATIVE_TOKEN[chainId].address\n }\n\n return checkedAddress\n}\n","import log from 'loglevel'\nimport fetch from 'cross-fetch'\nimport { OrderKind, QuoteQuery } from '@gnosis.pm/gp-v2-contracts'\nimport { SupportedChainId as ChainId } from '/constants/chains'\nimport { getSigningSchemeApiValue, OrderCreation } from '/utils/sign'\nimport OperatorError, { ApiErrorCodeDetails, ApiErrorCodes, ApiErrorObject } from './errors/OperatorError'\nimport QuoteError, {\n GpQuoteErrorCodes,\n GpQuoteErrorObject,\n mapOperatorErrorToQuoteError,\n GpQuoteErrorDetails,\n} from './errors/QuoteError'\nimport { toErc20Address } from '/utils/tokens'\nimport { FeeQuoteParams, PriceInformation, PriceQuoteParams, SimpleGetQuoteResponse } from '/utils/price'\n\nimport { ZERO_ADDRESS } from '/constants'\nimport {\n GetOrdersParams,\n GetTradesParams,\n OrderCancellationParams,\n OrderID,\n OrderMetaData,\n ProfileData,\n TradeMetaData,\n} from '/api/cow/types'\nimport { CowError, objectToQueryString } from '/utils/common'\nimport { Context } from '/utils/context'\n\nfunction getGnosisProtocolUrl(isDev: boolean): Partial<Record<ChainId, string>> {\n if (isDev) {\n return {\n [ChainId.MAINNET]: 'https://barn.api.cow.fi/mainnet/api',\n [ChainId.RINKEBY]: 'https://barn.api.cow.fi/rinkeby/api',\n [ChainId.GNOSIS_CHAIN]: 'https://barn.api.cow.fi/xdai/api',\n }\n }\n\n return {\n [ChainId.MAINNET]: 'https://api.cow.fi/mainnet/api',\n [ChainId.RINKEBY]: 'https://api.cow.fi/rinkeby/api',\n [ChainId.GNOSIS_CHAIN]: 'https://api.cow.fi/xdai/api',\n }\n}\n\nfunction getProfileUrl(isDev: boolean): Partial<Record<ChainId, string>> {\n if (isDev) {\n return {\n [ChainId.MAINNET]: 'https://barn.api.cow.fi/affiliate/api',\n }\n }\n\n return {\n [ChainId.MAINNET]: 'https://api.cow.fi/affiliate/api',\n }\n}\n\nconst UNHANDLED_QUOTE_ERROR: GpQuoteErrorObject = {\n errorType: GpQuoteErrorCodes.UNHANDLED_ERROR,\n description: GpQuoteErrorDetails.UNHANDLED_ERROR,\n}\n\nconst UNHANDLED_ORDER_ERROR: ApiErrorObject = {\n errorType: ApiErrorCodes.UNHANDLED_CREATE_ERROR,\n description: ApiErrorCodeDetails.UNHANDLED_CREATE_ERROR,\n}\n\nasync function _handleQuoteResponse<T = any, P extends QuoteQuery = QuoteQuery>(\n response: Response,\n params?: P\n): Promise<T> {\n if (!response.ok) {\n const errorObj: ApiErrorObject = await response.json()\n\n // we need to map the backend error codes to match our own for quotes\n const mappedError = mapOperatorErrorToQuoteError(errorObj)\n const quoteError = new QuoteError(mappedError)\n\n if (params) {\n const { sellToken, buyToken } = params\n log.error(`Error querying fee from API - sellToken: ${sellToken}, buyToken: ${buyToken}`)\n }\n\n throw quoteError\n } else {\n return response.json()\n }\n}\n\nexport class CowApi<T extends ChainId> {\n chainId: T\n context: Context\n\n API_NAME = 'CoW Protocol'\n\n constructor(chainId: T, context: Context) {\n this.chainId = chainId\n this.context = context\n }\n\n get DEFAULT_HEADERS() {\n return { 'Content-Type': 'application/json', 'X-AppId': this.context.appDataHash }\n }\n\n get API_BASE_URL() {\n return getGnosisProtocolUrl(this.context.isDevEnvironment)\n }\n\n get PROFILE_API_BASE_URL(): Partial<Record<ChainId, string>> {\n return getProfileUrl(this.context.isDevEnvironment)\n }\n\n async getProfileData(address: string): Promise<ProfileData | null> {\n log.debug(`[api:${this.API_NAME}] Get profile data for`, this.chainId, address)\n if (this.chainId !== ChainId.MAINNET) {\n log.info('Profile data is only available for mainnet')\n return null\n }\n\n const response = await this.getProfile(`/profile/${address}`)\n\n if (!response.ok) {\n const errorResponse = await response.json()\n log.error(errorResponse)\n throw new CowError(errorResponse?.description)\n } else {\n return response.json()\n }\n }\n\n async getTrades(params: GetTradesParams): Promise<TradeMetaData[]> {\n const { owner, limit, offset } = params\n const qsParams = objectToQueryString({ owner, limit, offset })\n log.debug('[util:operator] Get trades for', this.chainId, owner, { limit, offset })\n try {\n const response = await this.get(`/trades${qsParams}`)\n\n if (!response.ok) {\n const errorResponse = await response.json()\n throw new CowError(errorResponse)\n } else {\n return response.json()\n }\n } catch (error) {\n log.error('Error getting trades:', error)\n throw new CowError('Error getting trades: ' + error)\n }\n }\n\n async getOrders(params: GetOrdersParams): Promise<OrderMetaData[]> {\n const { owner, limit = 1000, offset = 0 } = params\n const queryString = objectToQueryString({ limit, offset })\n log.debug(`[api:${this.API_NAME}] Get orders for `, this.chainId, owner, limit, offset)\n\n try {\n const response = await this.get(`/account/${owner}/orders/${queryString}`)\n\n if (!response.ok) {\n const errorResponse: ApiErrorObject = await response.json()\n throw new OperatorError(errorResponse)\n } else {\n return response.json()\n }\n } catch (error) {\n log.error('Error getting orders information:', error)\n throw new OperatorError(UNHANDLED_ORDER_ERROR)\n }\n }\n\n async getOrder(orderId: string): Promise<OrderMetaData | null> {\n log.debug(`[api:${this.API_NAME}] Get order for `, this.chainId, orderId)\n try {\n const response = await this.get(`/orders/${orderId}`)\n\n if (!response.ok) {\n const errorResponse: ApiErrorObject = await response.json()\n throw new OperatorError(errorResponse)\n } else {\n return response.json()\n }\n } catch (error) {\n log.error('Error getting order information:', error)\n throw new OperatorError(UNHANDLED_ORDER_ERROR)\n }\n }\n\n async getPriceQuoteLegacy(params: PriceQuoteParams): Promise<PriceInformation | null> {\n const { baseToken, quoteToken, amount, kind } = params\n log.debug(`[api:${this.API_NAME}] Get price from API`, params)\n\n const response = await this.get(\n `/markets/${toErc20Address(baseToken, this.chainId)}-${toErc20Address(\n quoteToken,\n this.chainId\n )}/${kind}/${amount}`\n ).catch((error) => {\n log.error('Error getting price quote:', error)\n throw new QuoteError(UNHANDLED_QUOTE_ERROR)\n })\n\n return _handleQuoteResponse<PriceInformation | null>(response)\n }\n\n async getQuote(params: FeeQuoteParams): Promise<SimpleGetQuoteResponse> {\n const quoteParams = this.mapNewToLegacyParams(params, this.chainId)\n const response = await this.post('/quote', quoteParams)\n\n return _handleQuoteResponse<SimpleGetQuoteResponse>(response)\n }\n\n async sendSignedOrderCancellation(params: OrderCancellationParams): Promise<void> {\n const { cancellation, owner: from } = params\n\n log.debug(`[api:${this.API_NAME}] Delete signed order for network`, this.chainId, cancellation)\n\n const response = await this.delete(`/orders/${cancellation.orderUid}`, {\n signature: cancellation.signature,\n signingScheme: getSigningSchemeApiValue(cancellation.signingScheme),\n from,\n })\n\n if (!response.ok) {\n // Raise an exception\n const errorMessage = await OperatorError.getErrorFromStatusCode(response, 'delete')\n throw new CowError(errorMessage)\n }\n\n log.debug(`[api:${this.API_NAME}] Cancelled order`, cancellation.orderUid, this.chainId)\n }\n\n async sendOrder(params: { order: Omit<OrderCreation, 'appData'>; owner: string }): Promise<OrderID> {\n const fullOrder: OrderCreation = { ...params.order, appData: this.context.appDataHash }\n const { owner } = params\n log.debug(`[api:${this.API_NAME}] Post signed order for network`, this.chainId, fullOrder)\n\n // Call API\n const response = await this.post(`/orders`, {\n ...fullOrder,\n signingScheme: getSigningSchemeApiValue(fullOrder.signingScheme),\n from: owner,\n })\n\n // Handle response\n if (!response.ok) {\n // Raise an exception\n const errorMessage = await OperatorError.getErrorFromStatusCode(response, 'create')\n throw new CowError(errorMessage)\n }\n\n const uid = (await response.json()) as string\n log.debug(`[api:${this.API_NAME}] Success posting the signed order`, uid)\n return uid\n }\n\n getOrderLink(orderId: OrderID): string {\n const baseUrl = this.getApiBaseUrl()\n\n return baseUrl + `/orders/${orderId}`\n }\n\n private mapNewToLegacyParams(params: FeeQuoteParams, chainId: ChainId): QuoteQuery {\n const { amount, kind, userAddress, receiver, validTo, sellToken, buyToken } = params\n const fallbackAddress = userAddress || ZERO_ADDRESS\n\n const baseParams = {\n sellToken: toErc20Address(sellToken, chainId),\n buyToken: toErc20Address(buyToken, chainId),\n from: fallbackAddress,\n receiver: receiver || fallbackAddress,\n appData: this.context.appDataHash,\n validTo,\n partiallyFillable: false,\n }\n\n const finalParams: QuoteQuery =\n kind === OrderKind.SELL\n ? {\n kind: OrderKind.SELL,\n sellAmountBeforeFee: amount,\n ...baseParams,\n }\n : {\n kind: OrderKind.BUY,\n buyAmountAfterFee: amount,\n ...baseParams,\n }\n\n return finalParams\n }\n\n private getApiBaseUrl(): string {\n const baseUrl = this.API_BASE_URL[this.chainId]\n\n if (!baseUrl) {\n throw new CowError(`Unsupported Network. The ${this.API_NAME} API is not deployed in the Network ` + this.chainId)\n } else {\n return baseUrl + '/v1'\n }\n }\n\n private getProfileApiBaseUrl(): string {\n const baseUrl = this.PROFILE_API_BASE_URL[this.chainId]\n\n if (!baseUrl) {\n throw new CowError(`Unsupported Network. The ${this.API_NAME} API is not deployed in the Network ` + this.chainId)\n } else {\n return baseUrl + '/v1'\n }\n }\n\n private fetch(url: string, method: 'GET' | 'POST' | 'DELETE', data?: any): Promise<Response> {\n const baseUrl = this.getApiBaseUrl()\n return fetch(baseUrl + url, {\n headers: this.DEFAULT_HEADERS,\n method,\n body: data !== undefined ? JSON.stringify(data) : data,\n })\n }\n\n private fetchProfile(url: string, method: 'GET' | 'POST' | 'DELETE', data?: any): Promise<Response> {\n const baseUrl = this.getProfileApiBaseUrl()\n return fetch(baseUrl + url, {\n headers: this.DEFAULT_HEADERS,\n method,\n body: data !== undefined ? JSON.stringify(data) : data,\n })\n }\n\n private post(url: string, data: any): Promise<Response> {\n return this.fetch(url, 'POST', data)\n }\n\n private get(url: string): Promise<Response> {\n return this.fetch(url, 'GET')\n }\n\n private getProfile(url: string): Promise<Response> {\n return this.fetchProfile(url, 'GET')\n }\n\n private delete(url: string, data: any): Promise<Response> {\n return this.fetch(url, 'DELETE', data)\n }\n}\n","import Ajv, { ErrorObject, ValidateFunction } from 'ajv'\n\nlet validate: ValidateFunction | undefined\nlet ajv: Ajv\n\ninterface ValidationResult {\n result: boolean\n errors?: ErrorObject[]\n}\n\nasync function getValidator(): Promise<{ ajv: Ajv; validate: ValidateFunction }> {\n if (!ajv) {\n ajv = new Ajv()\n }\n\n if (!validate) {\n const appDataSchema = await import('../schemas/appData.schema.json')\n validate = ajv.compile(appDataSchema)\n }\n\n return { ajv, validate }\n}\n\nexport async function validateAppDataDocument(appDataDocument: any): Promise<ValidationResult> {\n const { ajv, validate } = await getValidator()\n const result = !!(await validate(appDataDocument))\n\n return {\n result,\n errors: ajv.errors ?? undefined,\n }\n}\n","import { Signer } from 'ethers'\nimport { CowError } from './common'\nimport { DEFAULT_APP_DATA_HASH } from '/constants'\n\nexport interface CowContext {\n appDataHash?: string\n isDevEnvironment?: boolean\n signer?: Signer\n}\n\nexport const DefaultCowContext = { appDataHash: DEFAULT_APP_DATA_HASH, isDevEnvironment: false }\n\n/**\n *\n *\n * @export\n * @class Context\n * @implements {Required<CowContext>}\n */\nexport class Context implements Required<CowContext> {\n private context: CowContext\n\n constructor(context: CowContext) {\n this.context = { ...DefaultCowContext, ...context }\n }\n\n get appDataHash(): string {\n return this.context.appDataHash ?? DefaultCowContext.appDataHash\n }\n\n get isDevEnvironment(): boolean {\n return this.context.isDevEnvironment ?? DefaultCowContext.isDevEnvironment\n }\n\n get signer(): Signer {\n if (this.context.signer) {\n return this.context.signer\n }\n\n throw new CowError('No signer was provided')\n }\n}\n","import { version as SDK_VERSION } from '../package.json'\nimport { CowApi } from './api'\nimport { SupportedChainId as ChainId } from '/constants/chains'\nimport { validateAppDataDocument } from '/utils/appData'\nimport { Context, CowContext } from '/utils/context'\nimport { signOrder, signOrderCancellation, UnsignedOrder } from '/utils/sign'\n\nexport class CowSdk<T extends ChainId> {\n static version = SDK_VERSION\n chainId: T\n context: Context\n cowApi: CowApi<T>\n\n constructor(chainId: T, cowContext: CowContext = {}) {\n this.chainId = chainId\n this.context = new Context(cowContext)\n this.cowApi = new CowApi(chainId, this.context)\n }\n\n validateAppDataDocument = validateAppDataDocument\n\n signOrder(order: Omit<UnsignedOrder, 'appData'>) {\n return signOrder({ ...order, appData: this.context.appDataHash }, this.chainId, this.context.signer)\n }\n\n signOrderCancellation(orderId: string) {\n return signOrderCancellation(orderId, this.chainId, this.context.signer)\n }\n}\n\nexport default CowSdk\n"],"names":["SupportedChainId","CowError","Error","constructor","message","error_code","super","this","objectToQueryString","o","qs","URLSearchParams","key","Object","keys","value","append","qsResult","toString","ALL_SUPPORTED_CHAIN_IDS","MAINNET","RINKEBY","GNOSIS_CHAIN","Token","symbol","address","GPv2Settlement","contractNetworks","GP_SETTLEMENT_CONTRACT_ADDRESS","ChainId","_signPayload","payload","signFn","signer","signingMethod","signature","data","signingScheme","SigningScheme","ETHSIGN","EIP712","_signer","TypedDataV3Signer","IntChainIdTypedDataV4Signer","e","log","error","undefined","code","METHOD_NOT_FOUND_ERROR_CODE","RPC_REQUEST_FAILED_REGEX","test","METAMASK_STRING_CHAINID_REGEX","METAMASK_SIGNATURE_ERROR_CODE","V4_ERROR_MSG_REGEX","V3_ERROR_MSG_REGEX","_signOrderCancellation","params","chainId","orderId","domain","_getDomain","signOrderCancellationGp","getSigningSchemeLibValue","_signOrder","order","signOrderGp","mapSigningSchema","Map","libraryValue","apiValue","EIP1271","PRESIGN","_getSigningSchemeInfo","ecdaSigningScheme","get","getSigningSchemeApiValue","settlementContract","domainGp","ApiErrorCodes","ApiErrorCodeDetails","GpQuoteErrorCodes","GpQuoteErrorDetails","OperatorError","static","response","action","json","orderPostError","errorType","apiErrorDetails","description","UNHANDLED_GET_ERROR","UNHANDLED_CREATE_ERROR","UNHANDLED_DELETE_ERROR","_mapActionToErrorDetail","status","_this","getErrorMessage","apiError","name","GpQuoteError","quoteErrorDetails","UNHANDLED_ERROR","quoteError","WRAPPED_NATIVE_TOKEN","NATIVE","toErc20Address","tokenAddress","checkedAddress","_handleQuoteResponse","ok","errorObj","mappedError","NotFound","NoLiquidity","InsufficientLiquidity","SellAmountDoesNotCoverFee","FeeExceedsFrom","UnsupportedToken","mapOperatorErrorToQuoteError","QuoteError","sellToken","buyToken","UNHANDLED_QUOTE_ERROR","UNHANDLED_ORDER_ERROR","CowApi","context","API_NAME","DEFAULT_HEADERS","appDataHash","API_BASE_URL","isDevEnvironment","PROFILE_API_BASE_URL","getProfileData","debug","info","getProfile","errorResponse","getTrades","owner","limit","offset","qsParams","_this2","getOrders","queryString","_this3","getOrder","_this4","getPriceQuoteLegacy","baseToken","quoteToken","amount","kind","_this5","catch","getQuote","quoteParams","_this6","mapNewToLegacyParams","post","sendSignedOrderCancellation","cancellation","from","_this7","delete","orderUid","getErrorFromStatusCode","errorMessage","sendOrder","fullOrder","appData","_this8","uid","getOrderLink","getApiBaseUrl","userAddress","receiver","validTo","fallbackAddress","baseParams","partiallyFillable","OrderKind","SELL","sellAmountBeforeFee","BUY","buyAmountAfterFee","baseUrl","getProfileApiBaseUrl","fetch","url","method","headers","body","JSON","stringify","fetchProfile","validateAppDataDocument","appDataDocument","getValidator","ajv","validate","result","errors","Ajv","Promise","appDataSchema","compile","DefaultCowContext","Context","CowSdk","cowContext","cowApi","signOrder","signOrderCancellation","version"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{IntChainIdTypedDataV4Signer as e,TypedDataV3Signer as t,SigningScheme as r,domain as n,signOrder as i,signOrderCancellation as o,OrderKind as s}from"@gnosis.pm/gp-v2-contracts";export{OrderKind}from"@gnosis.pm/gp-v2-contracts";import a from"loglevel";import c from"cross-fetch";import d from"@gnosis.pm/gp-v2-contracts/networks.json";import u from"ajv";class h extends Error{constructor(e,t){super(e),this.error_code=void 0,this.error_code=t}}function l(e){if(!e)return"";const t=new URLSearchParams;for(const r of Object.keys(e)){const n=e[r];n&&t.append(r,n)}const r=t.toString();return r?`?${r}`:""}var p;!function(e){e[e.MAINNET=1]="MAINNET",e[e.RINKEBY=4]="RINKEBY",e[e.GNOSIS_CHAIN=100]="GNOSIS_CHAIN"}(p||(p={}));const f=[p.MAINNET,p.RINKEBY,p.GNOSIS_CHAIN];class E{constructor(e,t){this.symbol=void 0,this.address=void 0,this.symbol=e,this.address=t}}function g(){return g=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},g.apply(this,arguments)}const{GPv2Settlement:y}=d,N={[p.MAINNET]:y[p.MAINNET].address,[p.RINKEBY]:y[p.RINKEBY].address,[p.GNOSIS_CHAIN]:y[p.GNOSIS_CHAIN].address},w=/eth_signTypedData_v4 does not exist/i,A=/eth_signTypedData_v3 does not exist/i,I=/RPC request failed/i,m=/provided chainid .* must match the active chainid/i,T=new Map([[r.EIP712,{libraryValue:0,apiValue:"eip712"}],[r.ETHSIGN,{libraryValue:1,apiValue:"ethsign"}],[r.EIP1271,{libraryValue:2,apiValue:"eip1271"}],[r.PRESIGN,{libraryValue:3,apiValue:"presign"}]]);function D(e){const t=T.get(e);if(void 0===t)throw new h("Unknown schema "+e);return t}function v(e){return D(e).apiValue}function R(e){return D(e).libraryValue}function _(e){const t=N[e];if(!t)throw new h("Unsupported network. Settlement contract is not deployed");return n(e,t)}async function O(e){const{chainId:t,signer:r,order:n,signingScheme:o}=e,s=_(t);return i(s,n,r,R(o))}async function S(e){const{chainId:t,signer:r,signingScheme:n,orderId:i}=e,s=_(t);return o(s,i,r,R(n))}async function k(n,i,o,s="v4"){const c="eth_sign"===s?r.ETHSIGN:r.EIP712;let d,u=null;try{switch(s){case"v3":d=new t(o);break;case"int_v4":d=new e(o);break;default:d=o}}catch(e){throw a.error("Wallet not supported:",e),new h("Wallet not supported")}try{u=await i(g({},n,{signer:d,signingScheme:c}))}catch(e){if(void 0===(l=e).code&&void 0===l.message)throw a.error(e),e;if(-32601===e.code||I.test(e.message))switch(s){case"v4":return k(n,i,o,"v3");case"v3":return k(n,i,o,"eth_sign");default:throw e}else{if(m.test(e.message))return k(n,i,o,"int_v4");if(-32603===e.code)return k(n,i,o,"eth_sign");if(w.test(e.message))return k(n,i,o,"v3");if(A.test(e.message))return k(n,i,o,"eth_sign")}}var l;return{signature:u.data.toString(),signingScheme:c}}var b,P,L,U;!function(e){e.DuplicateOrder="DuplicateOrder",e.InvalidSignature="InvalidSignature",e.MissingOrderData="MissingOrderData",e.InsufficientValidTo="InsufficientValidTo",e.InsufficientAllowance="InsufficientAllowance",e.InsufficientBalance="InsufficientBalance",e.InsufficientFee="InsufficientFee",e.WrongOwner="WrongOwner",e.NotFound="NotFound",e.OrderNotFound="OrderNotFound",e.AlreadyCancelled="AlreadyCancelled",e.OrderFullyExecuted="OrderFullyExecuted",e.OrderExpired="OrderExpired",e.NoLiquidity="NoLiquidity",e.UnsupportedToken="UnsupportedToken",e.AmountIsZero="AmountIsZero",e.SellAmountDoesNotCoverFee="SellAmountDoesNotCoverFee",e.TransferEthToContract="TransferEthToContract",e.UNHANDLED_GET_ERROR="UNHANDLED_GET_ERROR",e.UNHANDLED_CREATE_ERROR="UNHANDLED_CREATE_ERROR",e.UNHANDLED_DELETE_ERROR="UNHANDLED_DELETE_ERROR"}(b||(b={})),function(e){e.DuplicateOrder="There was another identical order already submitted. Please try again.",e.InsufficientFee="The signed fee is insufficient. It's possible that is higher now due to a change in the gas price, ether price, or the sell token price. Please try again to get an updated fee quote.",e.InvalidSignature="The order signature is invalid. Check whether your Wallet app supports off-chain signing.",e.MissingOrderData="The order has missing information",e.InsufficientValidTo="The order you are signing is already expired. This can happen if you set a short expiration in the settings and waited too long before signing the transaction. Please try again.",e.InsufficientAllowance="The account doesn't have enough funds",e.InsufficientBalance="The account needs to approve the selling token in order to trade",e.WrongOwner="The signature is invalid.\n\nIt's likely that the signing method provided by your wallet doesn't comply with the standards required by CowSwap.\n\nCheck whether your Wallet app supports off-chain signing (EIP-712 or ETHSIGN).",e.NotFound="Token pair selected has insufficient liquidity",e.OrderNotFound="The order you are trying to cancel does not exist",e.AlreadyCancelled="Order is already cancelled",e.OrderFullyExecuted="Order is already filled",e.OrderExpired="Order is expired",e.NoLiquidity="Token pair selected has insufficient liquidity",e.UnsupportedToken="One of the tokens you are trading is unsupported. Please read the FAQ for more info.",e.AmountIsZero="Amount is zero",e.SellAmountDoesNotCoverFee="Sell amount does not sufficiently cover the current fee",e.TransferEthToContract="Sending the native currency to smart contract wallets is not currently supported",e.UNHANDLED_GET_ERROR="Order fetch failed. This may be due to a server or network connectivity issue. Please try again later.",e.UNHANDLED_CREATE_ERROR="The order was not accepted by the network",e.UNHANDLED_DELETE_ERROR="The order cancellation was not accepted by the network"}(P||(P={}));class x extends h{static async getErrorMessage(e,t){try{const t=await e.json();return t.errorType?x.apiErrorDetails[t.errorType]||t.errorType:(a.error("Unknown reason for bad order submission",t),t.description)}catch(e){return a.error("Error handling a 400 error. Likely a problem deserialising the JSON response"),function(e){switch(e){case"get":return P.UNHANDLED_GET_ERROR;case"create":return P.UNHANDLED_CREATE_ERROR;case"delete":return P.UNHANDLED_DELETE_ERROR;default:return a.error("[OperatorError::_mapActionToErrorDetails] Uncaught error mapping error action type to server error. Please try again later."),"Something failed. Please try again later."}}(t)}}static async getErrorFromStatusCode(e,t){switch(e.status){case 400:case 404:return this.getErrorMessage(e,t);case 403:return`The order cannot be ${"create"===t?"accepted":"cancelled"}. Your account is deny-listed.`;case 429:return`The order cannot be ${"create"===t?"accepted. Too many order placements":"cancelled. Too many order cancellations"}. Please, retry in a minute`;default:return a.error(`[OperatorError::getErrorFromStatusCode] Error ${"create"===t?"creating":"cancelling"} the order, status code:`,e.status||"unknown"),`Error ${"create"===t?"creating":"cancelling"} the order`}}constructor(e){super(e.description,e.errorType),this.name="OperatorError",this.description=void 0,this.description=e.description,this.message=P[e.errorType]}}x.apiErrorDetails=P,function(e){e.UnsupportedToken="UnsupportedToken",e.InsufficientLiquidity="InsufficientLiquidity",e.FeeExceedsFrom="FeeExceedsFrom",e.ZeroPrice="ZeroPrice",e.UNHANDLED_ERROR="UNHANDLED_ERROR"}(L||(L={})),function(e){e.UnsupportedToken="One of the tokens you are trading is unsupported. Please read the FAQ for more info.",e.InsufficientLiquidity="Token pair selected has insufficient liquidity",e.FeeExceedsFrom='Current fee exceeds entered "from" amount',e.ZeroPrice="Quoted price is zero. This is likely due to a significant price difference between the two tokens. Please try increasing amounts.",e.UNHANDLED_ERROR="Quote fetch failed. This may be due to a server or network connectivity issue. Please try again later."}(U||(U={}));class F extends h{static async getErrorMessage(e){try{const t=await e.json();return t.errorType?F.quoteErrorDetails[t.errorType]||t.errorType:(a.error("Unknown reason for bad quote fetch",t),t.description)}catch(e){return a.error("Error handling 400/404 error. Likely a problem deserialising the JSON response"),F.quoteErrorDetails.UNHANDLED_ERROR}}static async getErrorFromStatusCode(e){switch(e.status){case 400:case 404:return this.getErrorMessage(e);default:return a.error("[QuoteError::getErrorFromStatusCode] Error fetching quote, status code:",e.status||"unknown"),"Error fetching quote"}}constructor(e){super(e.description,e.errorType),this.name="QuoteErrorObject",this.description=void 0,this.data=void 0,this.description=e.description,this.message=F.quoteErrorDetails[e.errorType],this.data=null==e?void 0:e.data}}F.quoteErrorDetails=U;const H={[p.MAINNET]:new E("WETH","0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"),[p.RINKEBY]:new E("WETH","0xc778417E063141139Fce010982780140Aa0cD5Ab"),[p.GNOSIS_CHAIN]:new E("WXDAI","0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d")},C={[p.MAINNET]:"ETH",[p.RINKEBY]:"ETH",[p.GNOSIS_CHAIN]:"XDAI"};function M(e,t){let r=e;return e===C[t]&&(r=H[t].address),r}const $={errorType:L.UNHANDLED_ERROR,description:U.UNHANDLED_ERROR},q={errorType:b.UNHANDLED_CREATE_ERROR,description:P.UNHANDLED_CREATE_ERROR};async function G(e,t){if(e.ok)return e.json();{const r=function(e){switch(null==e?void 0:e.errorType){case b.NotFound:case b.NoLiquidity:return{errorType:L.InsufficientLiquidity,description:U.InsufficientLiquidity};case b.SellAmountDoesNotCoverFee:return{errorType:L.FeeExceedsFrom,description:U.FeeExceedsFrom,data:null==e?void 0:e.data};case b.UnsupportedToken:return{errorType:L.UnsupportedToken,description:e.description};case b.SellAmountDoesNotCoverFee:return{errorType:L.FeeExceedsFrom,description:e.description};default:return{errorType:L.UNHANDLED_ERROR,description:U.UNHANDLED_ERROR}}}(await e.json()),n=new F(r);if(t){const{sellToken:e,buyToken:r}=t;a.error(`Error querying fee from API - sellToken: ${e}, buyToken: ${r}`)}throw n}}class j{constructor(e,t){this.chainId=void 0,this.context=void 0,this.API_NAME="CoW Protocol",this.chainId=e,this.context=t}get DEFAULT_HEADERS(){return{"Content-Type":"application/json","X-AppId":this.context.appDataHash}}get API_BASE_URL(){return this.context.isDevEnvironment?{[p.MAINNET]:"https://barn.api.cow.fi/mainnet/api",[p.RINKEBY]:"https://barn.api.cow.fi/rinkeby/api",[p.GNOSIS_CHAIN]:"https://barn.api.cow.fi/xdai/api"}:{[p.MAINNET]:"https://api.cow.fi/mainnet/api",[p.RINKEBY]:"https://api.cow.fi/rinkeby/api",[p.GNOSIS_CHAIN]:"https://api.cow.fi/xdai/api"}}get PROFILE_API_BASE_URL(){return this.context.isDevEnvironment?{[p.MAINNET]:"https://barn.api.cow.fi/affiliate/api"}:{[p.MAINNET]:"https://api.cow.fi/affiliate/api"}}async getProfileData(e){if(a.debug(`[api:${this.API_NAME}] Get profile data for`,this.chainId,e),this.chainId!==p.MAINNET)return a.info("Profile data is only available for mainnet"),null;const t=await this.getProfile(`/profile/${e}`);if(t.ok)return t.json();{const e=await t.json();throw a.error(e),new h(null==e?void 0:e.description)}}async getTrades(e){const{owner:t,limit:r,offset:n}=e,i=l({owner:t,limit:r,offset:n});a.debug("[util:operator] Get trades for",this.chainId,t,{limit:r,offset:n});try{const e=await this.get(`/trades${i}`);if(e.ok)return e.json();{const t=await e.json();throw new h(t)}}catch(e){throw a.error("Error getting trades:",e),new h("Error getting trades: "+e)}}async getOrders(e){const{owner:t,limit:r=1e3,offset:n=0}=e,i=l({limit:r,offset:n});a.debug(`[api:${this.API_NAME}] Get orders for `,this.chainId,t,r,n);try{const e=await this.get(`/account/${t}/orders/${i}`);if(e.ok)return e.json();{const t=await e.json();throw new x(t)}}catch(e){throw a.error("Error getting orders information:",e),new x(q)}}async getOrder(e){a.debug(`[api:${this.API_NAME}] Get order for `,this.chainId,e);try{const t=await this.get(`/orders/${e}`);if(t.ok)return t.json();{const e=await t.json();throw new x(e)}}catch(e){throw a.error("Error getting order information:",e),new x(q)}}async getPriceQuoteLegacy(e){const{baseToken:t,quoteToken:r,amount:n,kind:i}=e;return a.debug(`[api:${this.API_NAME}] Get price from API`,e),G(await this.get(`/markets/${M(t,this.chainId)}-${M(r,this.chainId)}/${i}/${n}`).catch(e=>{throw a.error("Error getting price quote:",e),new F($)}))}async getQuote(e){const t=this.mapNewToLegacyParams(e,this.chainId);return G(await this.post("/quote",t))}async sendSignedOrderCancellation(e){const{cancellation:t,owner:r}=e;a.debug(`[api:${this.API_NAME}] Delete signed order for network`,this.chainId,t);const n=await this.delete(`/orders/${t.orderUid}`,{signature:t.signature,signingScheme:v(t.signingScheme),from:r});if(!n.ok){const e=await x.getErrorFromStatusCode(n,"delete");throw new h(e)}a.debug(`[api:${this.API_NAME}] Cancelled order`,t.orderUid,this.chainId)}async sendOrder(e){const t=g({},e.order,{appData:this.context.appDataHash}),{owner:r}=e;a.debug(`[api:${this.API_NAME}] Post signed order for network`,this.chainId,t);const n=await this.post("/orders",g({},t,{signingScheme:v(t.signingScheme),from:r}));if(!n.ok){const e=await x.getErrorFromStatusCode(n,"create");throw new h(e)}const i=await n.json();return a.debug(`[api:${this.API_NAME}] Success posting the signed order`,i),i}getOrderLink(e){return this.getApiBaseUrl()+`/orders/${e}`}mapNewToLegacyParams(e,t){const{amount:r,kind:n,userAddress:i,receiver:o,validTo:a,sellToken:c,buyToken:d}=e,u=i||"0x0000000000000000000000000000000000000000",h={sellToken:M(c,t),buyToken:M(d,t),from:u,receiver:o||u,appData:this.context.appDataHash,validTo:a,partiallyFillable:!1};return g(n===s.SELL?{kind:s.SELL,sellAmountBeforeFee:r}:{kind:s.BUY,buyAmountAfterFee:r},h)}getApiBaseUrl(){const e=this.API_BASE_URL[this.chainId];if(e)return e+"/v1";throw new h(`Unsupported Network. The ${this.API_NAME} API is not deployed in the Network `+this.chainId)}getProfileApiBaseUrl(){const e=this.PROFILE_API_BASE_URL[this.chainId];if(e)return e+"/v1";throw new h(`Unsupported Network. The ${this.API_NAME} API is not deployed in the Network `+this.chainId)}fetch(e,t,r){const n=this.getApiBaseUrl();return c(n+e,{headers:this.DEFAULT_HEADERS,method:t,body:void 0!==r?JSON.stringify(r):r})}fetchProfile(e,t,r){const n=this.getProfileApiBaseUrl();return c(n+e,{headers:this.DEFAULT_HEADERS,method:t,body:void 0!==r?JSON.stringify(r):r})}post(e,t){return this.fetch(e,"POST",t)}get(e){return this.fetch(e,"GET")}getProfile(e){return this.fetchProfile(e,"GET")}delete(e,t){return this.fetch(e,"DELETE",t)}}let B,V;async function W(){if(V||(V=new u),!B){const e=await import("./appData.schema-fb2df827.js");B=V.compile(e)}return{ajv:V,validate:B}}async function Y(e){var t;const{ajv:r,validate:n}=await W();return{result:!!await n(e),errors:null!=(t=r.errors)?t:void 0}}const K={appDataHash:"0x0000000000000000000000000000000000000000000000000000000000000000",isDevEnvironment:!1};class Q{constructor(e){this.context=void 0,this.context=g({},K,e)}get appDataHash(){var e;return null!=(e=this.context.appDataHash)?e:K.appDataHash}get isDevEnvironment(){var e;return null!=(e=this.context.isDevEnvironment)?e:K.isDevEnvironment}get signer(){if(this.context.signer)return this.context.signer;throw new h("No signer was provided")}}class Z{constructor(e,t={}){this.chainId=void 0,this.context=void 0,this.cowApi=void 0,this.validateAppDataDocument=Y,this.chainId=e,this.context=new Q(t),this.cowApi=new j(e,this.context)}signOrder(e){return async function(e,t,r){return k({order:e,chainId:t},O,r)}(g({},e,{appData:this.context.appDataHash}),this.chainId,this.context.signer)}signOrderCancellation(e){return async function(e,t,r){return k({orderId:e,chainId:t},S,r)}(e,this.chainId,this.context.signer)}}Z.version="0.0.6";export{f as ALL_SUPPORTED_CHAIN_IDS,h as CowError,Z as CowSdk,E as Token};
2
- //# sourceMappingURL=cow-sdk.modern.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cow-sdk.modern.js","sources":["../../src/utils/common.ts","../../src/constants/chains.ts","../../src/types/index.ts","../../src/constants/index.ts","../../src/utils/sign.ts","../../src/api/cow/errors/OperatorError.ts","../../src/api/cow/errors/QuoteError.ts","../../src/constants/tokens.ts","../../src/utils/tokens.ts","../../src/api/cow/index.ts","../../src/utils/appData.ts","../../src/utils/context.ts","../../src/CowSdk.ts"],"sourcesContent":["export class CowError extends Error {\n error_code?: string\n\n constructor(message: string, error_code?: string) {\n super(message)\n this.error_code = error_code\n }\n}\n\nexport function objectToQueryString(o: any): string {\n if (!o) {\n return ''\n }\n\n const qs = new URLSearchParams()\n\n for (const key of Object.keys(o)) {\n const value = o[key]\n if (value) {\n qs.append(key, value)\n }\n }\n\n const qsResult = qs.toString()\n\n return qsResult ? `?${qsResult}` : ''\n}\n","export enum SupportedChainId {\n MAINNET = 1,\n RINKEBY = 4,\n GNOSIS_CHAIN = 100,\n}\n\nexport const ALL_SUPPORTED_CHAIN_IDS: SupportedChainId[] = [\n SupportedChainId.MAINNET,\n SupportedChainId.RINKEBY,\n SupportedChainId.GNOSIS_CHAIN,\n]\n","export * from '/api/cow/types'\nexport { OrderKind } from '@gnosis.pm/gp-v2-contracts'\nexport class Token {\n constructor(public symbol: string, public address: string) {}\n}\n","import contractNetworks from '@gnosis.pm/gp-v2-contracts/networks.json'\nimport { SupportedChainId as ChainId } from './chains'\n\nconst { GPv2Settlement } = contractNetworks\n\nexport const GP_SETTLEMENT_CONTRACT_ADDRESS: Partial<Record<number, string>> = {\n [ChainId.MAINNET]: GPv2Settlement[ChainId.MAINNET].address,\n [ChainId.RINKEBY]: GPv2Settlement[ChainId.RINKEBY].address,\n [ChainId.GNOSIS_CHAIN]: GPv2Settlement[ChainId.GNOSIS_CHAIN].address,\n}\n\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'\n\nexport const DEFAULT_APP_DATA_HASH = '0x0000000000000000000000000000000000000000000000000000000000000000'\n","import {\n domain as domainGp,\n signOrder as signOrderGp,\n signOrderCancellation as signOrderCancellationGp,\n EcdsaSignature,\n Order,\n OrderCancellation as OrderCancellationGp,\n Signature,\n TypedDataV3Signer,\n IntChainIdTypedDataV4Signer,\n SigningScheme,\n} from '@gnosis.pm/gp-v2-contracts'\nimport log from 'loglevel'\n\nimport { SupportedChainId as ChainId } from '/constants/chains'\nimport { GP_SETTLEMENT_CONTRACT_ADDRESS } from '/constants'\nimport { TypedDataDomain, Signer } from '@ethersproject/abstract-signer'\nimport { CowError } from './common'\n\n// For error codes, see:\n// - https://eth.wiki/json-rpc/json-rpc-error-codes-improvement-proposal\n// - https://www.jsonrpc.org/specification#error_object\nconst METAMASK_SIGNATURE_ERROR_CODE = -32603\nconst METHOD_NOT_FOUND_ERROR_CODE = -32601\nconst V4_ERROR_MSG_REGEX = /eth_signTypedData_v4 does not exist/i\nconst V3_ERROR_MSG_REGEX = /eth_signTypedData_v3 does not exist/i\nconst RPC_REQUEST_FAILED_REGEX = /RPC request failed/i\nconst METAMASK_STRING_CHAINID_REGEX = /provided chainid .* must match the active chainid/i\n\nexport type UnsignedOrder = Omit<Order, 'receiver'> & { receiver: string }\n\nexport interface SignOrderParams {\n chainId: ChainId\n signer: Signer\n order: UnsignedOrder\n signingScheme: SigningScheme\n}\n\n// posted to /api/v1/orders on Order creation\n// serializable, so no BigNumbers\n// See https://protocol-rinkeby.dev.gnosisdev.com/api/\nexport interface OrderCreation extends UnsignedOrder {\n signingScheme: SigningScheme // signed method\n\n // Signature is used for:\n // - Signature: EIP-712,ETHSIGN\n // - Owner address: for PRESIGN\n signature: string // 65 bytes encoded as hex without `0x` prefix. r + s + v from the spec\n}\n\nexport interface SingOrderCancellationParams {\n chainId: ChainId\n signer: Signer\n orderId: string\n signingScheme: SigningScheme\n}\n\nexport interface OrderCancellation extends OrderCancellationGp {\n signature: string\n signingScheme: SigningScheme\n}\n\nexport type SigningSchemeValue = 'eip712' | 'ethsign' | 'eip1271' | 'presign'\n\ninterface SchemaInfo {\n libraryValue: number\n apiValue: SigningSchemeValue\n}\nconst mapSigningSchema: Map<SigningScheme, SchemaInfo> = new Map([\n [SigningScheme.EIP712, { libraryValue: 0, apiValue: 'eip712' }],\n [SigningScheme.ETHSIGN, { libraryValue: 1, apiValue: 'ethsign' }],\n [SigningScheme.EIP1271, { libraryValue: 2, apiValue: 'eip1271' }],\n [SigningScheme.PRESIGN, { libraryValue: 3, apiValue: 'presign' }],\n])\n\nfunction _getSigningSchemeInfo(ecdaSigningScheme: SigningScheme): SchemaInfo {\n const value = mapSigningSchema.get(ecdaSigningScheme)\n if (value === undefined) {\n throw new CowError('Unknown schema ' + ecdaSigningScheme)\n }\n\n return value\n}\n\ninterface ProviderRpcError extends Error {\n message: string\n code: number\n data?: unknown\n}\n\nfunction isProviderRpcError(error: unknown): error is ProviderRpcError {\n return (error as ProviderRpcError).code !== undefined || (error as ProviderRpcError).message !== undefined\n}\n\nexport function getSigningSchemeApiValue(ecdaSigningScheme: SigningScheme): string {\n return _getSigningSchemeInfo(ecdaSigningScheme).apiValue\n}\n\nexport function getSigningSchemeLibValue(ecdaSigningScheme: SigningScheme): number {\n return _getSigningSchemeInfo(ecdaSigningScheme).libraryValue\n}\n\nfunction _getDomain(chainId: ChainId): TypedDataDomain {\n // Get settlement contract address\n const settlementContract = GP_SETTLEMENT_CONTRACT_ADDRESS[chainId]\n\n if (!settlementContract) {\n throw new CowError('Unsupported network. Settlement contract is not deployed')\n }\n\n return domainGp(chainId, settlementContract)\n}\n\nasync function _signOrder(params: SignOrderParams): Promise<Signature> {\n const { chainId, signer, order, signingScheme } = params\n\n const domain = _getDomain(chainId)\n\n return signOrderGp(domain, order, signer, getSigningSchemeLibValue(signingScheme))\n}\n\nasync function _signOrderCancellation(params: SingOrderCancellationParams): Promise<Signature> {\n const { chainId, signer, signingScheme, orderId } = params\n\n const domain = _getDomain(chainId)\n\n return signOrderCancellationGp(domain, orderId, signer, getSigningSchemeLibValue(signingScheme))\n}\n\nexport type SigningResult = { signature: string; signingScheme: SigningScheme }\n\nasync function _signPayload(\n payload: any,\n signFn: typeof _signOrder | typeof _signOrderCancellation,\n signer: Signer,\n signingMethod: 'v4' | 'int_v4' | 'v3' | 'eth_sign' = 'v4'\n): Promise<SigningResult> {\n const signingScheme = signingMethod === 'eth_sign' ? SigningScheme.ETHSIGN : SigningScheme.EIP712\n let signature: Signature | null = null\n\n let _signer\n try {\n switch (signingMethod) {\n case 'v3':\n _signer = new TypedDataV3Signer(signer)\n break\n case 'int_v4':\n _signer = new IntChainIdTypedDataV4Signer(signer)\n break\n default:\n _signer = signer\n }\n } catch (e) {\n log.error('Wallet not supported:', e)\n throw new CowError('Wallet not supported')\n }\n\n try {\n signature = (await signFn({ ...payload, signer: _signer, signingScheme })) as EcdsaSignature // Only ECDSA signing supported for now\n } catch (e) {\n if (!isProviderRpcError(e)) {\n // Some other error signing. Let it bubble up.\n log.error(e)\n throw e\n }\n\n if (e.code === METHOD_NOT_FOUND_ERROR_CODE || RPC_REQUEST_FAILED_REGEX.test(e.message)) {\n // Maybe the wallet returns the proper error code? We can only hope 🤞\n // OR it failed with a generic message, there's no error code set, and we also hope it'll work\n // with other methods...\n switch (signingMethod) {\n case 'v4':\n return _signPayload(payload, signFn, signer, 'v3')\n case 'v3':\n return _signPayload(payload, signFn, signer, 'eth_sign')\n default:\n throw e\n }\n } else if (METAMASK_STRING_CHAINID_REGEX.test(e.message)) {\n // Metamask now enforces chainId to be an integer\n return _signPayload(payload, signFn, signer, 'int_v4')\n } else if (e.code === METAMASK_SIGNATURE_ERROR_CODE) {\n // We tried to sign order the nice way.\n // That works fine for regular MM addresses. Does not work for Hardware wallets, though.\n // See https://github.com/MetaMask/metamask-extension/issues/10240#issuecomment-810552020\n // So, when that specific error occurs, we know this is a problem with MM + HW.\n // Then, we fallback to ETHSIGN.\n return _signPayload(payload, signFn, signer, 'eth_sign')\n } else if (V4_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v4`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'v3')\n } else if (V3_ERROR_MSG_REGEX.test(e.message)) {\n // Failed with `v3`, and the wallet does not set the proper error code\n return _signPayload(payload, signFn, signer, 'eth_sign')\n }\n }\n return { signature: signature!.data.toString(), signingScheme }\n}\n/**\n * Returns the signature for the specified order with the signing scheme encoded\n * into the signature.\n * @export\n * @param {UnsignedOrder} order The order to sign.\n * @param {ChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrder(order: UnsignedOrder, chainId: ChainId, signer: Signer): Promise<SigningResult> {\n return _signPayload({ order, chainId }, _signOrder, signer)\n}\n\n/**\n * Returns the signature for the Order Cancellation with the signing scheme encoded\n * into the signature.\n *\n * @export\n * @param {string} orderId The unique identifier of the order being cancelled.\n * @param {ChainId} chainId The chain Id\n * @param {Signer} signer The owner for the order used to sign.\n * @return {*} Encoded signature including signing scheme for the order.\n */\nexport async function signOrderCancellation(orderId: string, chainId: ChainId, signer: Signer): Promise<SigningResult> {\n return _signPayload({ orderId, chainId }, _signOrderCancellation, signer)\n}\n","import log from 'loglevel'\nimport { CowError } from '/utils/common'\n\ntype ApiActionType = 'get' | 'create' | 'delete'\n\nexport interface ApiErrorObject {\n errorType: ApiErrorCodes\n description: string\n data?: any\n}\n\n// Conforms to backend API\n// https://github.com/gnosis/gp-v2-services/blob/d932e11c9a2125fdba239530be7684799f694909/crates/orderbook/openapi.yml#L801\n// and\n// https://github.com/gnosis/gp-v2-services/blob/d932e11c9a2125fdba239530be7684799f694909/crates/orderbook/openapi.yml#L740\nexport enum ApiErrorCodes {\n DuplicateOrder = 'DuplicateOrder',\n InvalidSignature = 'InvalidSignature',\n MissingOrderData = 'MissingOrderData',\n InsufficientValidTo = 'InsufficientValidTo',\n InsufficientAllowance = 'InsufficientAllowance',\n InsufficientBalance = 'InsufficientBalance',\n InsufficientFee = 'InsufficientFee',\n WrongOwner = 'WrongOwner',\n NotFound = 'NotFound',\n OrderNotFound = 'OrderNotFound',\n AlreadyCancelled = 'AlreadyCancelled',\n OrderFullyExecuted = 'OrderFullyExecuted',\n OrderExpired = 'OrderExpired',\n NoLiquidity = 'NoLiquidity',\n UnsupportedToken = 'UnsupportedToken',\n AmountIsZero = 'AmountIsZero',\n SellAmountDoesNotCoverFee = 'SellAmountDoesNotCoverFee',\n TransferEthToContract = 'TransferEthToContract',\n UNHANDLED_GET_ERROR = 'UNHANDLED_GET_ERROR',\n UNHANDLED_CREATE_ERROR = 'UNHANDLED_CREATE_ERROR',\n UNHANDLED_DELETE_ERROR = 'UNHANDLED_DELETE_ERROR',\n}\n\nexport enum ApiErrorCodeDetails {\n DuplicateOrder = 'There was another identical order already submitted. Please try again.',\n InsufficientFee = \"The signed fee is insufficient. It's possible that is higher now due to a change in the gas price, ether price, or the sell token price. Please try again to get an updated fee quote.\",\n InvalidSignature = 'The order signature is invalid. Check whether your Wallet app supports off-chain signing.',\n MissingOrderData = 'The order has missing information',\n InsufficientValidTo = 'The order you are signing is already expired. This can happen if you set a short expiration in the settings and waited too long before signing the transaction. Please try again.',\n InsufficientAllowance = \"The account doesn't have enough funds\",\n InsufficientBalance = 'The account needs to approve the selling token in order to trade',\n WrongOwner = \"The signature is invalid.\\n\\nIt's likely that the signing method provided by your wallet doesn't comply with the standards required by CowSwap.\\n\\nCheck whether your Wallet app supports off-chain signing (EIP-712 or ETHSIGN).\",\n NotFound = 'Token pair selected has insufficient liquidity',\n OrderNotFound = 'The order you are trying to cancel does not exist',\n AlreadyCancelled = 'Order is already cancelled',\n OrderFullyExecuted = 'Order is already filled',\n OrderExpired = 'Order is expired',\n NoLiquidity = 'Token pair selected has insufficient liquidity',\n UnsupportedToken = 'One of the tokens you are trading is unsupported. Please read the FAQ for more info.',\n AmountIsZero = 'Amount is zero',\n SellAmountDoesNotCoverFee = 'Sell amount does not sufficiently cover the current fee',\n TransferEthToContract = 'Sending the native currency to smart contract wallets is not currently supported',\n UNHANDLED_GET_ERROR = 'Order fetch failed. This may be due to a server or network connectivity issue. Please try again later.',\n UNHANDLED_CREATE_ERROR = 'The order was not accepted by the network',\n UNHANDLED_DELETE_ERROR = 'The order cancellation was not accepted by the network',\n}\n\nfunction _mapActionToErrorDetail(action?: ApiActionType) {\n switch (action) {\n case 'get':\n return ApiErrorCodeDetails.UNHANDLED_GET_ERROR\n case 'create':\n return ApiErrorCodeDetails.UNHANDLED_CREATE_ERROR\n case 'delete':\n return ApiErrorCodeDetails.UNHANDLED_DELETE_ERROR\n default:\n log.error(\n '[OperatorError::_mapActionToErrorDetails] Uncaught error mapping error action type to server error. Please try again later.'\n )\n return 'Something failed. Please try again later.'\n }\n}\n\nexport default class OperatorError extends CowError {\n name = 'OperatorError'\n description: ApiErrorObject['description']\n\n // Status 400 errors\n // https://github.com/gnosis/gp-v2-services/blob/9014ae55412a356e46343e051aefeb683cc69c41/orderbook/openapi.yml#L563\n static apiErrorDetails = ApiErrorCodeDetails\n\n public static async getErrorMessage(response: Response, action: ApiActionType) {\n try {\n const orderPostError: ApiErrorObject = await response.json()\n\n if (orderPostError.errorType) {\n const errorMessage = OperatorError.apiErrorDetails[orderPostError.errorType]\n // shouldn't fall through as this error constructor expects the error code to exist but just in case\n return errorMessage || orderPostError.errorType\n } else {\n log.error('Unknown reason for bad order submission', orderPostError)\n return orderPostError.description\n }\n } catch (error) {\n log.error('Error handling a 400 error. Likely a problem deserialising the JSON response')\n return _mapActionToErrorDetail(action)\n }\n }\n static async getErrorFromStatusCode(response: Response, action: 'create' | 'delete') {\n switch (response.status) {\n case 400:\n case 404:\n return this.getErrorMessage(response, action)\n\n case 403:\n return `The order cannot be ${action === 'create' ? 'accepted' : 'cancelled'}. Your account is deny-listed.`\n\n case 429:\n return `The order cannot be ${\n action === 'create' ? 'accepted. Too many order placements' : 'cancelled. Too many order cancellations'\n }. Please, retry in a minute`\n\n case 500:\n default:\n log.error(\n `[OperatorError::getErrorFromStatusCode] Error ${\n action === 'create' ? 'creating' : 'cancelling'\n } the order, status code:`,\n response.status || 'unknown'\n )\n return `Error ${action === 'create' ? 'creating' : 'cancelling'} the order`\n }\n }\n constructor(apiError: ApiErrorObject) {\n super(apiError.description, apiError.errorType)\n\n this.description = apiError.description\n this.message = ApiErrorCodeDetails[apiError.errorType]\n }\n}\n\nexport function isValidOperatorError(error: any): error is OperatorError {\n return error instanceof OperatorError\n}\n","import log from 'loglevel'\nimport { CowError } from '/utils/common'\nimport { ApiErrorCodes, ApiErrorObject } from './OperatorError'\n\nexport interface GpQuoteErrorObject {\n errorType: GpQuoteErrorCodes\n description: string\n data?: any\n}\n\n// Conforms to backend API\n// https://github.com/gnosis/gp-v2-services/blob/0bd5f7743bebaa5acd3be13e35ede2326a096f14/orderbook/openapi.yml#L562\nexport enum GpQuoteErrorCodes {\n UnsupportedToken = 'UnsupportedToken',\n InsufficientLiquidity = 'InsufficientLiquidity',\n FeeExceedsFrom = 'FeeExceedsFrom',\n ZeroPrice = 'ZeroPrice',\n UNHANDLED_ERROR = 'UNHANDLED_ERROR',\n}\n\nexport enum GpQuoteErrorDetails {\n UnsupportedToken = 'One of the tokens you are trading is unsupported. Please read the FAQ for more info.',\n InsufficientLiquidity = 'Token pair selected has insufficient liquidity',\n FeeExceedsFrom = 'Current fee exceeds entered \"from\" amount',\n ZeroPrice = 'Quoted price is zero. This is likely due to a significant price difference between the two tokens. Please try increasing amounts.',\n UNHANDLED_ERROR = 'Quote fetch failed. This may be due to a server or network connectivity issue. Please try again later.',\n}\n\nexport function mapOperatorErrorToQuoteError(error?: ApiErrorObject): GpQuoteErrorObject {\n switch (error?.errorType) {\n case ApiErrorCodes.NotFound:\n case ApiErrorCodes.NoLiquidity:\n return {\n errorType: GpQuoteErrorCodes.InsufficientLiquidity,\n description: GpQuoteErrorDetails.InsufficientLiquidity,\n }\n\n case ApiErrorCodes.SellAmountDoesNotCoverFee:\n return {\n errorType: GpQuoteErrorCodes.FeeExceedsFrom,\n description: GpQuoteErrorDetails.FeeExceedsFrom,\n data: error?.data,\n }\n\n case ApiErrorCodes.UnsupportedToken:\n return {\n errorType: GpQuoteErrorCodes.UnsupportedToken,\n description: error.description,\n }\n case ApiErrorCodes.SellAmountDoesNotCoverFee:\n return {\n errorType: GpQuoteErrorCodes.FeeExceedsFrom,\n description: error.description,\n }\n default:\n return { errorType: GpQuoteErrorCodes.UNHANDLED_ERROR, description: GpQuoteErrorDetails.UNHANDLED_ERROR }\n }\n}\n\nexport default class GpQuoteError extends CowError {\n name = 'QuoteErrorObject'\n description: string\n // any data attached\n data?: any\n\n // Status 400 errors\n // https://github.com/gnosis/gp-v2-services/blob/9014ae55412a356e46343e051aefeb683cc69c41/orderbook/openapi.yml#L563\n static quoteErrorDetails = GpQuoteErrorDetails\n\n public static async getErrorMessage(response: Response) {\n try {\n const orderPostError: GpQuoteErrorObject = await response.json()\n\n if (orderPostError.errorType) {\n const errorMessage = GpQuoteError.quoteErrorDetails[orderPostError.errorType]\n // shouldn't fall through as this error constructor expects the error code to exist but just in case\n return errorMessage || orderPostError.errorType\n } else {\n log.error('Unknown reason for bad quote fetch', orderPostError)\n return orderPostError.description\n }\n } catch (error) {\n log.error('Error handling 400/404 error. Likely a problem deserialising the JSON response')\n return GpQuoteError.quoteErrorDetails.UNHANDLED_ERROR\n }\n }\n\n static async getErrorFromStatusCode(response: Response) {\n switch (response.status) {\n case 400:\n case 404:\n return this.getErrorMessage(response)\n\n case 500:\n default:\n log.error(\n '[QuoteError::getErrorFromStatusCode] Error fetching quote, status code:',\n response.status || 'unknown'\n )\n return 'Error fetching quote'\n }\n }\n constructor(quoteError: GpQuoteErrorObject) {\n super(quoteError.description, quoteError.errorType)\n\n this.description = quoteError.description\n this.message = GpQuoteError.quoteErrorDetails[quoteError.errorType]\n this.data = quoteError?.data\n }\n}\n\nexport function isValidQuoteError(error: any): error is GpQuoteError {\n return error instanceof GpQuoteError\n}\n","import { SupportedChainId as ChainId } from '/constants/chains'\nimport { Token } from '/types'\n\nexport const XDAI_SYMBOL = 'XDAI'\n\nexport const WRAPPED_NATIVE_TOKEN: Record<ChainId, Token> = {\n [ChainId.MAINNET]: new Token('WETH', '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'),\n [ChainId.RINKEBY]: new Token('WETH', '0xc778417E063141139Fce010982780140Aa0cD5Ab'),\n [ChainId.GNOSIS_CHAIN]: new Token('WXDAI', '0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d'),\n}\n\nexport const NATIVE: Record<ChainId, string> = {\n [ChainId.MAINNET]: 'ETH',\n [ChainId.RINKEBY]: 'ETH',\n [ChainId.GNOSIS_CHAIN]: XDAI_SYMBOL,\n}\n","import { SupportedChainId as ChainId } from '/constants/chains'\nimport { NATIVE, WRAPPED_NATIVE_TOKEN } from '/constants/tokens'\n\nexport function toErc20Address(tokenAddress: string, chainId: ChainId): string {\n let checkedAddress = tokenAddress\n\n if (tokenAddress === NATIVE[chainId]) {\n checkedAddress = WRAPPED_NATIVE_TOKEN[chainId].address\n }\n\n return checkedAddress\n}\n","import log from 'loglevel'\nimport fetch from 'cross-fetch'\nimport { OrderKind, QuoteQuery } from '@gnosis.pm/gp-v2-contracts'\nimport { SupportedChainId as ChainId } from '/constants/chains'\nimport { getSigningSchemeApiValue, OrderCreation } from '/utils/sign'\nimport OperatorError, { ApiErrorCodeDetails, ApiErrorCodes, ApiErrorObject } from './errors/OperatorError'\nimport QuoteError, {\n GpQuoteErrorCodes,\n GpQuoteErrorObject,\n mapOperatorErrorToQuoteError,\n GpQuoteErrorDetails,\n} from './errors/QuoteError'\nimport { toErc20Address } from '/utils/tokens'\nimport { FeeQuoteParams, PriceInformation, PriceQuoteParams, SimpleGetQuoteResponse } from '/utils/price'\n\nimport { ZERO_ADDRESS } from '/constants'\nimport {\n GetOrdersParams,\n GetTradesParams,\n OrderCancellationParams,\n OrderID,\n OrderMetaData,\n ProfileData,\n TradeMetaData,\n} from '/api/cow/types'\nimport { CowError, objectToQueryString } from '/utils/common'\nimport { Context } from '/utils/context'\n\nfunction getGnosisProtocolUrl(isDev: boolean): Partial<Record<ChainId, string>> {\n if (isDev) {\n return {\n [ChainId.MAINNET]: 'https://barn.api.cow.fi/mainnet/api',\n [ChainId.RINKEBY]: 'https://barn.api.cow.fi/rinkeby/api',\n [ChainId.GNOSIS_CHAIN]: 'https://barn.api.cow.fi/xdai/api',\n }\n }\n\n return {\n [ChainId.MAINNET]: 'https://api.cow.fi/mainnet/api',\n [ChainId.RINKEBY]: 'https://api.cow.fi/rinkeby/api',\n [ChainId.GNOSIS_CHAIN]: 'https://api.cow.fi/xdai/api',\n }\n}\n\nfunction getProfileUrl(isDev: boolean): Partial<Record<ChainId, string>> {\n if (isDev) {\n return {\n [ChainId.MAINNET]: 'https://barn.api.cow.fi/affiliate/api',\n }\n }\n\n return {\n [ChainId.MAINNET]: 'https://api.cow.fi/affiliate/api',\n }\n}\n\nconst UNHANDLED_QUOTE_ERROR: GpQuoteErrorObject = {\n errorType: GpQuoteErrorCodes.UNHANDLED_ERROR,\n description: GpQuoteErrorDetails.UNHANDLED_ERROR,\n}\n\nconst UNHANDLED_ORDER_ERROR: ApiErrorObject = {\n errorType: ApiErrorCodes.UNHANDLED_CREATE_ERROR,\n description: ApiErrorCodeDetails.UNHANDLED_CREATE_ERROR,\n}\n\nasync function _handleQuoteResponse<T = any, P extends QuoteQuery = QuoteQuery>(\n response: Response,\n params?: P\n): Promise<T> {\n if (!response.ok) {\n const errorObj: ApiErrorObject = await response.json()\n\n // we need to map the backend error codes to match our own for quotes\n const mappedError = mapOperatorErrorToQuoteError(errorObj)\n const quoteError = new QuoteError(mappedError)\n\n if (params) {\n const { sellToken, buyToken } = params\n log.error(`Error querying fee from API - sellToken: ${sellToken}, buyToken: ${buyToken}`)\n }\n\n throw quoteError\n } else {\n return response.json()\n }\n}\n\nexport class CowApi<T extends ChainId> {\n chainId: T\n context: Context\n\n API_NAME = 'CoW Protocol'\n\n constructor(chainId: T, context: Context) {\n this.chainId = chainId\n this.context = context\n }\n\n get DEFAULT_HEADERS() {\n return { 'Content-Type': 'application/json', 'X-AppId': this.context.appDataHash }\n }\n\n get API_BASE_URL() {\n return getGnosisProtocolUrl(this.context.isDevEnvironment)\n }\n\n get PROFILE_API_BASE_URL(): Partial<Record<ChainId, string>> {\n return getProfileUrl(this.context.isDevEnvironment)\n }\n\n async getProfileData(address: string): Promise<ProfileData | null> {\n log.debug(`[api:${this.API_NAME}] Get profile data for`, this.chainId, address)\n if (this.chainId !== ChainId.MAINNET) {\n log.info('Profile data is only available for mainnet')\n return null\n }\n\n const response = await this.getProfile(`/profile/${address}`)\n\n if (!response.ok) {\n const errorResponse = await response.json()\n log.error(errorResponse)\n throw new CowError(errorResponse?.description)\n } else {\n return response.json()\n }\n }\n\n async getTrades(params: GetTradesParams): Promise<TradeMetaData[]> {\n const { owner, limit, offset } = params\n const qsParams = objectToQueryString({ owner, limit, offset })\n log.debug('[util:operator] Get trades for', this.chainId, owner, { limit, offset })\n try {\n const response = await this.get(`/trades${qsParams}`)\n\n if (!response.ok) {\n const errorResponse = await response.json()\n throw new CowError(errorResponse)\n } else {\n return response.json()\n }\n } catch (error) {\n log.error('Error getting trades:', error)\n throw new CowError('Error getting trades: ' + error)\n }\n }\n\n async getOrders(params: GetOrdersParams): Promise<OrderMetaData[]> {\n const { owner, limit = 1000, offset = 0 } = params\n const queryString = objectToQueryString({ limit, offset })\n log.debug(`[api:${this.API_NAME}] Get orders for `, this.chainId, owner, limit, offset)\n\n try {\n const response = await this.get(`/account/${owner}/orders/${queryString}`)\n\n if (!response.ok) {\n const errorResponse: ApiErrorObject = await response.json()\n throw new OperatorError(errorResponse)\n } else {\n return response.json()\n }\n } catch (error) {\n log.error('Error getting orders information:', error)\n throw new OperatorError(UNHANDLED_ORDER_ERROR)\n }\n }\n\n async getOrder(orderId: string): Promise<OrderMetaData | null> {\n log.debug(`[api:${this.API_NAME}] Get order for `, this.chainId, orderId)\n try {\n const response = await this.get(`/orders/${orderId}`)\n\n if (!response.ok) {\n const errorResponse: ApiErrorObject = await response.json()\n throw new OperatorError(errorResponse)\n } else {\n return response.json()\n }\n } catch (error) {\n log.error('Error getting order information:', error)\n throw new OperatorError(UNHANDLED_ORDER_ERROR)\n }\n }\n\n async getPriceQuoteLegacy(params: PriceQuoteParams): Promise<PriceInformation | null> {\n const { baseToken, quoteToken, amount, kind } = params\n log.debug(`[api:${this.API_NAME}] Get price from API`, params)\n\n const response = await this.get(\n `/markets/${toErc20Address(baseToken, this.chainId)}-${toErc20Address(\n quoteToken,\n this.chainId\n )}/${kind}/${amount}`\n ).catch((error) => {\n log.error('Error getting price quote:', error)\n throw new QuoteError(UNHANDLED_QUOTE_ERROR)\n })\n\n return _handleQuoteResponse<PriceInformation | null>(response)\n }\n\n async getQuote(params: FeeQuoteParams): Promise<SimpleGetQuoteResponse> {\n const quoteParams = this.mapNewToLegacyParams(params, this.chainId)\n const response = await this.post('/quote', quoteParams)\n\n return _handleQuoteResponse<SimpleGetQuoteResponse>(response)\n }\n\n async sendSignedOrderCancellation(params: OrderCancellationParams): Promise<void> {\n const { cancellation, owner: from } = params\n\n log.debug(`[api:${this.API_NAME}] Delete signed order for network`, this.chainId, cancellation)\n\n const response = await this.delete(`/orders/${cancellation.orderUid}`, {\n signature: cancellation.signature,\n signingScheme: getSigningSchemeApiValue(cancellation.signingScheme),\n from,\n })\n\n if (!response.ok) {\n // Raise an exception\n const errorMessage = await OperatorError.getErrorFromStatusCode(response, 'delete')\n throw new CowError(errorMessage)\n }\n\n log.debug(`[api:${this.API_NAME}] Cancelled order`, cancellation.orderUid, this.chainId)\n }\n\n async sendOrder(params: { order: Omit<OrderCreation, 'appData'>; owner: string }): Promise<OrderID> {\n const fullOrder: OrderCreation = { ...params.order, appData: this.context.appDataHash }\n const { owner } = params\n log.debug(`[api:${this.API_NAME}] Post signed order for network`, this.chainId, fullOrder)\n\n // Call API\n const response = await this.post(`/orders`, {\n ...fullOrder,\n signingScheme: getSigningSchemeApiValue(fullOrder.signingScheme),\n from: owner,\n })\n\n // Handle response\n if (!response.ok) {\n // Raise an exception\n const errorMessage = await OperatorError.getErrorFromStatusCode(response, 'create')\n throw new CowError(errorMessage)\n }\n\n const uid = (await response.json()) as string\n log.debug(`[api:${this.API_NAME}] Success posting the signed order`, uid)\n return uid\n }\n\n getOrderLink(orderId: OrderID): string {\n const baseUrl = this.getApiBaseUrl()\n\n return baseUrl + `/orders/${orderId}`\n }\n\n private mapNewToLegacyParams(params: FeeQuoteParams, chainId: ChainId): QuoteQuery {\n const { amount, kind, userAddress, receiver, validTo, sellToken, buyToken } = params\n const fallbackAddress = userAddress || ZERO_ADDRESS\n\n const baseParams = {\n sellToken: toErc20Address(sellToken, chainId),\n buyToken: toErc20Address(buyToken, chainId),\n from: fallbackAddress,\n receiver: receiver || fallbackAddress,\n appData: this.context.appDataHash,\n validTo,\n partiallyFillable: false,\n }\n\n const finalParams: QuoteQuery =\n kind === OrderKind.SELL\n ? {\n kind: OrderKind.SELL,\n sellAmountBeforeFee: amount,\n ...baseParams,\n }\n : {\n kind: OrderKind.BUY,\n buyAmountAfterFee: amount,\n ...baseParams,\n }\n\n return finalParams\n }\n\n private getApiBaseUrl(): string {\n const baseUrl = this.API_BASE_URL[this.chainId]\n\n if (!baseUrl) {\n throw new CowError(`Unsupported Network. The ${this.API_NAME} API is not deployed in the Network ` + this.chainId)\n } else {\n return baseUrl + '/v1'\n }\n }\n\n private getProfileApiBaseUrl(): string {\n const baseUrl = this.PROFILE_API_BASE_URL[this.chainId]\n\n if (!baseUrl) {\n throw new CowError(`Unsupported Network. The ${this.API_NAME} API is not deployed in the Network ` + this.chainId)\n } else {\n return baseUrl + '/v1'\n }\n }\n\n private fetch(url: string, method: 'GET' | 'POST' | 'DELETE', data?: any): Promise<Response> {\n const baseUrl = this.getApiBaseUrl()\n return fetch(baseUrl + url, {\n headers: this.DEFAULT_HEADERS,\n method,\n body: data !== undefined ? JSON.stringify(data) : data,\n })\n }\n\n private fetchProfile(url: string, method: 'GET' | 'POST' | 'DELETE', data?: any): Promise<Response> {\n const baseUrl = this.getProfileApiBaseUrl()\n return fetch(baseUrl + url, {\n headers: this.DEFAULT_HEADERS,\n method,\n body: data !== undefined ? JSON.stringify(data) : data,\n })\n }\n\n private post(url: string, data: any): Promise<Response> {\n return this.fetch(url, 'POST', data)\n }\n\n private get(url: string): Promise<Response> {\n return this.fetch(url, 'GET')\n }\n\n private getProfile(url: string): Promise<Response> {\n return this.fetchProfile(url, 'GET')\n }\n\n private delete(url: string, data: any): Promise<Response> {\n return this.fetch(url, 'DELETE', data)\n }\n}\n","import Ajv, { ErrorObject, ValidateFunction } from 'ajv'\n\nlet validate: ValidateFunction | undefined\nlet ajv: Ajv\n\ninterface ValidationResult {\n result: boolean\n errors?: ErrorObject[]\n}\n\nasync function getValidator(): Promise<{ ajv: Ajv; validate: ValidateFunction }> {\n if (!ajv) {\n ajv = new Ajv()\n }\n\n if (!validate) {\n const appDataSchema = await import('../schemas/appData.schema.json')\n validate = ajv.compile(appDataSchema)\n }\n\n return { ajv, validate }\n}\n\nexport async function validateAppDataDocument(appDataDocument: any): Promise<ValidationResult> {\n const { ajv, validate } = await getValidator()\n const result = !!(await validate(appDataDocument))\n\n return {\n result,\n errors: ajv.errors ?? undefined,\n }\n}\n","import { Signer } from 'ethers'\nimport { CowError } from './common'\nimport { DEFAULT_APP_DATA_HASH } from '/constants'\n\nexport interface CowContext {\n appDataHash?: string\n isDevEnvironment?: boolean\n signer?: Signer\n}\n\nexport const DefaultCowContext = { appDataHash: DEFAULT_APP_DATA_HASH, isDevEnvironment: false }\n\n/**\n *\n *\n * @export\n * @class Context\n * @implements {Required<CowContext>}\n */\nexport class Context implements Required<CowContext> {\n private context: CowContext\n\n constructor(context: CowContext) {\n this.context = { ...DefaultCowContext, ...context }\n }\n\n get appDataHash(): string {\n return this.context.appDataHash ?? DefaultCowContext.appDataHash\n }\n\n get isDevEnvironment(): boolean {\n return this.context.isDevEnvironment ?? DefaultCowContext.isDevEnvironment\n }\n\n get signer(): Signer {\n if (this.context.signer) {\n return this.context.signer\n }\n\n throw new CowError('No signer was provided')\n }\n}\n","import { version as SDK_VERSION } from '../package.json'\nimport { CowApi } from './api'\nimport { SupportedChainId as ChainId } from '/constants/chains'\nimport { validateAppDataDocument } from '/utils/appData'\nimport { Context, CowContext } from '/utils/context'\nimport { signOrder, signOrderCancellation, UnsignedOrder } from '/utils/sign'\n\nexport class CowSdk<T extends ChainId> {\n static version = SDK_VERSION\n chainId: T\n context: Context\n cowApi: CowApi<T>\n\n constructor(chainId: T, cowContext: CowContext = {}) {\n this.chainId = chainId\n this.context = new Context(cowContext)\n this.cowApi = new CowApi(chainId, this.context)\n }\n\n validateAppDataDocument = validateAppDataDocument\n\n signOrder(order: Omit<UnsignedOrder, 'appData'>) {\n return signOrder({ ...order, appData: this.context.appDataHash }, this.chainId, this.context.signer)\n }\n\n signOrderCancellation(orderId: string) {\n return signOrderCancellation(orderId, this.chainId, this.context.signer)\n }\n}\n\nexport default CowSdk\n"],"names":["CowError","Error","constructor","message","error_code","super","this","objectToQueryString","o","qs","URLSearchParams","key","Object","keys","value","append","qsResult","toString","SupportedChainId","ALL_SUPPORTED_CHAIN_IDS","MAINNET","RINKEBY","GNOSIS_CHAIN","Token","symbol","address","GPv2Settlement","contractNetworks","GP_SETTLEMENT_CONTRACT_ADDRESS","ChainId","V4_ERROR_MSG_REGEX","V3_ERROR_MSG_REGEX","RPC_REQUEST_FAILED_REGEX","METAMASK_STRING_CHAINID_REGEX","mapSigningSchema","Map","SigningScheme","EIP712","libraryValue","apiValue","ETHSIGN","EIP1271","PRESIGN","_getSigningSchemeInfo","ecdaSigningScheme","get","undefined","getSigningSchemeApiValue","getSigningSchemeLibValue","_getDomain","chainId","settlementContract","domainGp","async","_signOrder","params","signer","order","signingScheme","domain","signOrderGp","_signOrderCancellation","orderId","signOrderCancellationGp","_signPayload","payload","signFn","signingMethod","_signer","signature","TypedDataV3Signer","IntChainIdTypedDataV4Signer","e","log","error","code","test","data","ApiErrorCodes","ApiErrorCodeDetails","GpQuoteErrorCodes","GpQuoteErrorDetails","OperatorError","static","response","action","orderPostError","json","errorType","apiErrorDetails","description","UNHANDLED_GET_ERROR","UNHANDLED_CREATE_ERROR","UNHANDLED_DELETE_ERROR","_mapActionToErrorDetail","status","getErrorMessage","apiError","name","GpQuoteError","quoteErrorDetails","UNHANDLED_ERROR","quoteError","WRAPPED_NATIVE_TOKEN","NATIVE","toErc20Address","tokenAddress","checkedAddress","UNHANDLED_QUOTE_ERROR","UNHANDLED_ORDER_ERROR","_handleQuoteResponse","ok","mappedError","NotFound","NoLiquidity","InsufficientLiquidity","SellAmountDoesNotCoverFee","FeeExceedsFrom","UnsupportedToken","mapOperatorErrorToQuoteError","QuoteError","sellToken","buyToken","CowApi","context","API_NAME","DEFAULT_HEADERS","appDataHash","API_BASE_URL","isDevEnvironment","PROFILE_API_BASE_URL","debug","info","getProfile","errorResponse","owner","limit","offset","qsParams","queryString","baseToken","quoteToken","amount","kind","catch","quoteParams","mapNewToLegacyParams","post","cancellation","from","delete","orderUid","errorMessage","getErrorFromStatusCode","fullOrder","appData","uid","getOrderLink","getApiBaseUrl","userAddress","receiver","validTo","fallbackAddress","baseParams","partiallyFillable","OrderKind","SELL","sellAmountBeforeFee","BUY","buyAmountAfterFee","baseUrl","getProfileApiBaseUrl","fetch","url","method","headers","body","JSON","stringify","fetchProfile","validate","ajv","getValidator","Ajv","appDataSchema","compile","validateAppDataDocument","appDataDocument","result","errors","DefaultCowContext","Context","CowSdk","cowContext","cowApi","signOrder","signOrderCancellation","version"],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- import { CowApi } from './api';
2
- import { SupportedChainId as ChainId } from '/constants/chains';
3
- import { validateAppDataDocument } from '/utils/appData';
4
- import { Context, CowContext } from '/utils/context';
5
- import { UnsignedOrder } from '/utils/sign';
6
- export declare class CowSdk<T extends ChainId> {
7
- static version: string;
8
- chainId: T;
9
- context: Context;
10
- cowApi: CowApi<T>;
11
- constructor(chainId: T, cowContext?: CowContext);
12
- validateAppDataDocument: typeof validateAppDataDocument;
13
- signOrder(order: Omit<UnsignedOrder, 'appData'>): Promise<import("/utils/sign").SigningResult>;
14
- signOrderCancellation(orderId: string): Promise<import("/utils/sign").SigningResult>;
15
- }
16
- export default CowSdk;
@@ -1 +0,0 @@
1
- export * from './cow';
@@ -1,4 +0,0 @@
1
- export { CowError } from '/utils/common';
2
- export { ALL_SUPPORTED_CHAIN_IDS } from '/constants/chains';
3
- export * from '/types';
4
- export * from '/CowSdk';
@@ -1,7 +0,0 @@
1
- import { ErrorObject } from 'ajv';
2
- interface ValidationResult {
3
- result: boolean;
4
- errors?: ErrorObject[];
5
- }
6
- export declare function validateAppDataDocument(appDataDocument: any): Promise<ValidationResult>;
7
- export {};
@@ -1,24 +0,0 @@
1
- import { Signer } from 'ethers';
2
- export interface CowContext {
3
- appDataHash?: string;
4
- isDevEnvironment?: boolean;
5
- signer?: Signer;
6
- }
7
- export declare const DefaultCowContext: {
8
- appDataHash: string;
9
- isDevEnvironment: boolean;
10
- };
11
- /**
12
- *
13
- *
14
- * @export
15
- * @class Context
16
- * @implements {Required<CowContext>}
17
- */
18
- export declare class Context implements Required<CowContext> {
19
- private context;
20
- constructor(context: CowContext);
21
- get appDataHash(): string;
22
- get isDevEnvironment(): boolean;
23
- get signer(): Signer;
24
- }
Binary file
package/src/CowSdk.ts DELETED
@@ -1,31 +0,0 @@
1
- import { version as SDK_VERSION } from '../package.json'
2
- import { CowApi } from './api'
3
- import { SupportedChainId as ChainId } from '/constants/chains'
4
- import { validateAppDataDocument } from '/utils/appData'
5
- import { Context, CowContext } from '/utils/context'
6
- import { signOrder, signOrderCancellation, UnsignedOrder } from '/utils/sign'
7
-
8
- export class CowSdk<T extends ChainId> {
9
- static version = SDK_VERSION
10
- chainId: T
11
- context: Context
12
- cowApi: CowApi<T>
13
-
14
- constructor(chainId: T, cowContext: CowContext = {}) {
15
- this.chainId = chainId
16
- this.context = new Context(cowContext)
17
- this.cowApi = new CowApi(chainId, this.context)
18
- }
19
-
20
- validateAppDataDocument = validateAppDataDocument
21
-
22
- signOrder(order: Omit<UnsignedOrder, 'appData'>) {
23
- return signOrder({ ...order, appData: this.context.appDataHash }, this.chainId, this.context.signer)
24
- }
25
-
26
- signOrderCancellation(orderId: string) {
27
- return signOrderCancellation(orderId, this.chainId, this.context.signer)
28
- }
29
- }
30
-
31
- export default CowSdk
@@ -1,140 +0,0 @@
1
- import log from 'loglevel'
2
- import { CowError } from '/utils/common'
3
-
4
- type ApiActionType = 'get' | 'create' | 'delete'
5
-
6
- export interface ApiErrorObject {
7
- errorType: ApiErrorCodes
8
- description: string
9
- data?: any
10
- }
11
-
12
- // Conforms to backend API
13
- // https://github.com/gnosis/gp-v2-services/blob/d932e11c9a2125fdba239530be7684799f694909/crates/orderbook/openapi.yml#L801
14
- // and
15
- // https://github.com/gnosis/gp-v2-services/blob/d932e11c9a2125fdba239530be7684799f694909/crates/orderbook/openapi.yml#L740
16
- export enum ApiErrorCodes {
17
- DuplicateOrder = 'DuplicateOrder',
18
- InvalidSignature = 'InvalidSignature',
19
- MissingOrderData = 'MissingOrderData',
20
- InsufficientValidTo = 'InsufficientValidTo',
21
- InsufficientAllowance = 'InsufficientAllowance',
22
- InsufficientBalance = 'InsufficientBalance',
23
- InsufficientFee = 'InsufficientFee',
24
- WrongOwner = 'WrongOwner',
25
- NotFound = 'NotFound',
26
- OrderNotFound = 'OrderNotFound',
27
- AlreadyCancelled = 'AlreadyCancelled',
28
- OrderFullyExecuted = 'OrderFullyExecuted',
29
- OrderExpired = 'OrderExpired',
30
- NoLiquidity = 'NoLiquidity',
31
- UnsupportedToken = 'UnsupportedToken',
32
- AmountIsZero = 'AmountIsZero',
33
- SellAmountDoesNotCoverFee = 'SellAmountDoesNotCoverFee',
34
- TransferEthToContract = 'TransferEthToContract',
35
- UNHANDLED_GET_ERROR = 'UNHANDLED_GET_ERROR',
36
- UNHANDLED_CREATE_ERROR = 'UNHANDLED_CREATE_ERROR',
37
- UNHANDLED_DELETE_ERROR = 'UNHANDLED_DELETE_ERROR',
38
- }
39
-
40
- export enum ApiErrorCodeDetails {
41
- DuplicateOrder = 'There was another identical order already submitted. Please try again.',
42
- InsufficientFee = "The signed fee is insufficient. It's possible that is higher now due to a change in the gas price, ether price, or the sell token price. Please try again to get an updated fee quote.",
43
- InvalidSignature = 'The order signature is invalid. Check whether your Wallet app supports off-chain signing.',
44
- MissingOrderData = 'The order has missing information',
45
- InsufficientValidTo = 'The order you are signing is already expired. This can happen if you set a short expiration in the settings and waited too long before signing the transaction. Please try again.',
46
- InsufficientAllowance = "The account doesn't have enough funds",
47
- InsufficientBalance = 'The account needs to approve the selling token in order to trade',
48
- WrongOwner = "The signature is invalid.\n\nIt's likely that the signing method provided by your wallet doesn't comply with the standards required by CowSwap.\n\nCheck whether your Wallet app supports off-chain signing (EIP-712 or ETHSIGN).",
49
- NotFound = 'Token pair selected has insufficient liquidity',
50
- OrderNotFound = 'The order you are trying to cancel does not exist',
51
- AlreadyCancelled = 'Order is already cancelled',
52
- OrderFullyExecuted = 'Order is already filled',
53
- OrderExpired = 'Order is expired',
54
- NoLiquidity = 'Token pair selected has insufficient liquidity',
55
- UnsupportedToken = 'One of the tokens you are trading is unsupported. Please read the FAQ for more info.',
56
- AmountIsZero = 'Amount is zero',
57
- SellAmountDoesNotCoverFee = 'Sell amount does not sufficiently cover the current fee',
58
- TransferEthToContract = 'Sending the native currency to smart contract wallets is not currently supported',
59
- UNHANDLED_GET_ERROR = 'Order fetch failed. This may be due to a server or network connectivity issue. Please try again later.',
60
- UNHANDLED_CREATE_ERROR = 'The order was not accepted by the network',
61
- UNHANDLED_DELETE_ERROR = 'The order cancellation was not accepted by the network',
62
- }
63
-
64
- function _mapActionToErrorDetail(action?: ApiActionType) {
65
- switch (action) {
66
- case 'get':
67
- return ApiErrorCodeDetails.UNHANDLED_GET_ERROR
68
- case 'create':
69
- return ApiErrorCodeDetails.UNHANDLED_CREATE_ERROR
70
- case 'delete':
71
- return ApiErrorCodeDetails.UNHANDLED_DELETE_ERROR
72
- default:
73
- log.error(
74
- '[OperatorError::_mapActionToErrorDetails] Uncaught error mapping error action type to server error. Please try again later.'
75
- )
76
- return 'Something failed. Please try again later.'
77
- }
78
- }
79
-
80
- export default class OperatorError extends CowError {
81
- name = 'OperatorError'
82
- description: ApiErrorObject['description']
83
-
84
- // Status 400 errors
85
- // https://github.com/gnosis/gp-v2-services/blob/9014ae55412a356e46343e051aefeb683cc69c41/orderbook/openapi.yml#L563
86
- static apiErrorDetails = ApiErrorCodeDetails
87
-
88
- public static async getErrorMessage(response: Response, action: ApiActionType) {
89
- try {
90
- const orderPostError: ApiErrorObject = await response.json()
91
-
92
- if (orderPostError.errorType) {
93
- const errorMessage = OperatorError.apiErrorDetails[orderPostError.errorType]
94
- // shouldn't fall through as this error constructor expects the error code to exist but just in case
95
- return errorMessage || orderPostError.errorType
96
- } else {
97
- log.error('Unknown reason for bad order submission', orderPostError)
98
- return orderPostError.description
99
- }
100
- } catch (error) {
101
- log.error('Error handling a 400 error. Likely a problem deserialising the JSON response')
102
- return _mapActionToErrorDetail(action)
103
- }
104
- }
105
- static async getErrorFromStatusCode(response: Response, action: 'create' | 'delete') {
106
- switch (response.status) {
107
- case 400:
108
- case 404:
109
- return this.getErrorMessage(response, action)
110
-
111
- case 403:
112
- return `The order cannot be ${action === 'create' ? 'accepted' : 'cancelled'}. Your account is deny-listed.`
113
-
114
- case 429:
115
- return `The order cannot be ${
116
- action === 'create' ? 'accepted. Too many order placements' : 'cancelled. Too many order cancellations'
117
- }. Please, retry in a minute`
118
-
119
- case 500:
120
- default:
121
- log.error(
122
- `[OperatorError::getErrorFromStatusCode] Error ${
123
- action === 'create' ? 'creating' : 'cancelling'
124
- } the order, status code:`,
125
- response.status || 'unknown'
126
- )
127
- return `Error ${action === 'create' ? 'creating' : 'cancelling'} the order`
128
- }
129
- }
130
- constructor(apiError: ApiErrorObject) {
131
- super(apiError.description, apiError.errorType)
132
-
133
- this.description = apiError.description
134
- this.message = ApiErrorCodeDetails[apiError.errorType]
135
- }
136
- }
137
-
138
- export function isValidOperatorError(error: any): error is OperatorError {
139
- return error instanceof OperatorError
140
- }