diff --git a/package.json b/package.json index f3650c4b..b61209d0 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,9 @@ "typecheck": "tsc --noEmit" }, "dependencies": { + "@cowprotocol/cow-sdk": "^7.2.9", + "@cowprotocol/sdk-bridging": "^1.2.0", + "@cowprotocol/sdk-viem-adapter": "^0.3.0", "@heroicons/react": "^2.2.0", "@internationalized/date": "^3.8.2", "@merkl/api": "^1.7.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 39e6066a..7cceb0d6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,15 @@ importers: .: dependencies: + '@cowprotocol/cow-sdk': + specifier: ^7.2.9 + version: 7.2.9(ajv@8.17.1)(cross-fetch@4.1.0)(ipfs-only-hash@4.0.0)(multiformats@9.9.0) + '@cowprotocol/sdk-bridging': + specifier: ^1.2.0 + version: 1.2.0(ajv@8.17.1)(cross-fetch@4.1.0)(ipfs-only-hash@4.0.0)(multiformats@9.9.0) + '@cowprotocol/sdk-viem-adapter': + specifier: ^0.3.0 + version: 0.3.0(viem@2.40.2(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) '@heroicons/react': specifier: ^2.2.0 version: 2.2.0(react@18.3.1) @@ -257,6 +266,9 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@assemblyscript/loader@0.9.4': + resolution: {integrity: sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==} + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -877,6 +889,61 @@ packages: '@coinbase/wallet-sdk@4.3.7': resolution: {integrity: sha512-z6e5XDw6EF06RqkeyEa+qD0dZ2ZbLci99vx3zwDY//XO8X7166tqKJrR2XlQnzVmtcUuJtCd5fCvr9Cu6zzX7w==} + '@cowprotocol/cow-sdk@7.2.9': + resolution: {integrity: sha512-rAy7cG2xz+1z/jUU6avKNmViJWNE//JYxUojPz44kzwkMlrfistFHqO3J6CWyzrfoKdLcN1ZI5PiBX+sgxb1og==} + peerDependencies: + '@openzeppelin/merkle-tree': ^1.x + cross-fetch: ^3.x + ipfs-only-hash: ^4.x + multiformats: ^9.x + peerDependenciesMeta: + '@openzeppelin/merkle-tree': + optional: true + ipfs-only-hash: + optional: true + multiformats: + optional: true + + '@cowprotocol/sdk-app-data@4.5.0': + resolution: {integrity: sha512-+MDjZei/Seb724fyU6UgIDkXfAD9DDVMH1PmgQc8W/Z4Cq4k3PPL8abYBMl2IWP8RvdipMxUnDdAx8rlQp0FXw==} + peerDependencies: + ajv: ^8.x + cross-fetch: ^3.x + ipfs-only-hash: ^4.x + multiformats: ^9.x + + '@cowprotocol/sdk-bridging@1.2.0': + resolution: {integrity: sha512-tt2MOEIO2+Wg/u0vEgAkKpp130yI/vpAkESsp1mWBEndtWsXjrK4/2UloKtM8wW6+47zYZHTRfIrhGIF5YtfRg==} + + '@cowprotocol/sdk-common@0.4.0': + resolution: {integrity: sha512-ciXiHzTzj7LKZqMKssgyNooZp1nS/mvRE9oO/6DlMQcxVA7/4ajPmk/XzseX/rjdRbSbYyXIEF1oY5w0tcbVjQ==} + + '@cowprotocol/sdk-config@0.6.2': + resolution: {integrity: sha512-L6cPT3pQCrHChRUjWffuYielUlw7TXPbI0o3IvimF/DSpPiGuW+A1g7XSLEGUhNcoKNfQf5YUZPaoenAKl9MNg==} + + '@cowprotocol/sdk-contracts-ts@1.0.0': + resolution: {integrity: sha512-i5clnrOZlixHiWUGrSJXlckx5gHXnQu7hcwiL4ut9PpwmqBpFXitS5mYbFr8Py5UAJZ86QHmiXUodL/392QAAA==} + + '@cowprotocol/sdk-cow-shed@0.2.9': + resolution: {integrity: sha512-nv+/ALXU0ur3NSKmislq0e+2zl2XCyXqylJil7XfXlbcrzn7AaF1SkTJHgmwZ3P3R4nCYGS/nWfYkgRyBdoaug==} + + '@cowprotocol/sdk-order-book@0.5.0': + resolution: {integrity: sha512-teFVH9FILYGPOpj5v539ogeqAk97kxMxeIG93Dj5G7Qfp+V97/gOKcE8/8Rw0quKt2KQYtyUspspQFhYF4g6SQ==} + + '@cowprotocol/sdk-order-signing@0.1.23': + resolution: {integrity: sha512-TnmGElnPlaUvp5GV+aaJrwXY/csyJZWETeIg56AxBj5xKXC555uamOVCTFO4rM9sHfCVLwS71JZR3WrQcOgfkw==} + + '@cowprotocol/sdk-trading@0.8.0': + resolution: {integrity: sha512-aNxnUBkbxXEkcQyCiL+WZQAFptORtOmQFH7cZq+dDNgOzFIy7xErtQ7PVnDZP497We3+EcJVq50Q7D6b6Gc+BA==} + + '@cowprotocol/sdk-viem-adapter@0.3.0': + resolution: {integrity: sha512-IDCrdSBKaLJsgJR8kPFb5wjIt8Hk3dw4hqZg7nIkHAz36N+feHA2DYucgGOC0r1iuAy0EC+F/XXiemqGMb+nXg==} + peerDependencies: + viem: ^2.28.4 + + '@cowprotocol/sdk-weiroll@0.1.11': + resolution: {integrity: sha512-l1lNaN46VnQrPsCqLPiD4yxOSBhRUDT1Am8lWsUN8U6xD8NPdTJWE/UbpkrHxBd0nvpW246zWlLm31FJcz5XXA==} + '@csstools/css-parser-algorithms@3.0.5': resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} engines: {node: '>=18'} @@ -903,6 +970,10 @@ packages: '@date-fns/tz@1.4.1': resolution: {integrity: sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==} + '@defuse-protocol/one-click-sdk-typescript@0.1.1-0.2': + resolution: {integrity: sha512-Jgt8uZlB5hQAo3UpyHH9XcXKNT6Vsqd7TTPy/vLEwuOvQ88Pag9qUxpU9Z2jYMD8SqOpxzaJrtgx+FSDb4lQ9A==} + engines: {node: '>=16', pnpm: '>=8'} + '@dual-bundle/import-meta-resolve@4.1.0': resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} @@ -1494,6 +1565,9 @@ packages: resolution: {integrity: sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==} engines: {node: '>= 18'} + '@multiformats/base-x@4.0.1': + resolution: {integrity: sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==} + '@next/env@15.5.7': resolution: {integrity: sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==} @@ -1607,6 +1681,36 @@ packages: '@phosphor-icons/webcomponents@2.1.5': resolution: {integrity: sha512-JcvQkZxvcX2jK+QCclm8+e8HXqtdFW9xV4/kk2aL9Y3dJA2oQVt+pzbv1orkumz3rfx4K9mn9fDoMr1He1yr7Q==} + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@radix-ui/number@1.1.1': resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} @@ -2679,6 +2783,12 @@ packages: '@types/lodash@4.17.20': resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} + '@types/long@4.0.2': + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -2688,6 +2798,9 @@ packages: '@types/node@22.17.2': resolution: {integrity: sha512-gL6z5N9Jm9mhY+U2KXZpteb+09zyffliRkZyZOHODGATyC5B1Jt/7TzuuiLkFsSUMLbS1OLmlj/E+/3KF4Q/4w==} + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} @@ -2975,6 +3088,10 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -3038,6 +3155,9 @@ packages: big.js@6.2.2: resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} + bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + blakejs@1.2.1: resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} @@ -3091,6 +3211,10 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -3113,6 +3237,11 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + cids@1.1.9: + resolution: {integrity: sha512-l11hWRfugIcbGuTZwAM5PwpjPPjyb6UZOGwlHSnOBV5o07XhQ4gNpBN67FbODvpjyHtd+0Xs6KNvUcGBiDRsdg==} + engines: {node: '>=4.0.0', npm: '>=3.0.0'} + deprecated: This module has been superseded by the multiformats module + citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} @@ -3333,6 +3462,10 @@ packages: supports-color: optional: true + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -3464,6 +3597,9 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + err-code@3.0.1: + resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -3542,6 +3678,9 @@ packages: '@sinclair/typebox': optional: true + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + exsolve@1.0.8: resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} @@ -3731,6 +3870,14 @@ packages: h3@1.15.4: resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} + hamt-sharding@2.0.1: + resolution: {integrity: sha512-vnjrmdXG9dDs1m/H4iJ6z0JFI2NtgsW5keRkTcM85NGak69Mkf5PHUqBz+Xs0T4sg0ppvj9O5EGAJo40FTxmmA==} + engines: {node: '>=10.0.0', npm: '>=6.0.0'} + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + harmony-reflect@1.6.2: resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} @@ -3767,6 +3914,13 @@ packages: hookified@1.11.0: resolution: {integrity: sha512-aDdIN3GyU5I6wextPplYdfmWCo+aLmjjVbntmX6HLD5RCi/xKsivYEBhnRD+d9224zFf008ZpLMPlWF0ZodYZw==} + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + html-tags@3.3.1: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} @@ -3803,12 +3957,20 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + interface-ipld-format@1.0.1: + resolution: {integrity: sha512-WV/ar+KQJVoQpqRDYdo7YPGYIUHJxCuOEhdvsRpzLqoOIVCqPKdMMYmsLL1nCRsF3yYNio+PAJbCKiv6drrEAg==} + deprecated: This module has been superseded by the multiformats module + internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} @@ -3820,6 +3982,23 @@ packages: intl-messageformat@10.7.16: resolution: {integrity: sha512-UmdmHUmp5CIKKjSoE10la5yfU+AYJAaiYLsodbjL4lji83JNvgOQUjGaGhGrpFCb0Uh7sl7qfP1IyILa8Z40ug==} + ipfs-only-hash@4.0.0: + resolution: {integrity: sha512-TE1DZCvfw8i3gcsTq3P4TFx3cKFJ3sluu/J3XINkJhIN9OwJgNMqKA+WnKx6ByCb1IoPXsTp1KM7tupElb6SyA==} + hasBin: true + + ipfs-unixfs-importer@7.0.3: + resolution: {integrity: sha512-qeFOlD3AQtGzr90sr5Tq1Bi8pT5Nr2tSI8z310m7R4JDYgZc6J1PEZO3XZQ8l1kuGoqlAppBZuOYmPEqaHcVQQ==} + engines: {node: '>=14.0.0', npm: '>=7.0.0'} + + ipfs-unixfs@4.0.3: + resolution: {integrity: sha512-hzJ3X4vlKT8FQ3Xc4M1szaFVjsc1ZydN+E4VQ91aXxfpjFn9G2wsMo1EFdAXNq/BUnN5dgqIOMP5zRYr3DTsAw==} + engines: {node: '>=14.0.0', npm: '>=7.0.0'} + + ipld-dag-pb@0.22.3: + resolution: {integrity: sha512-dfG5C5OVAR4FEP7Al2CrHWvAyIM7UhAQrjnOYOIxXGQz5NlEj6wGX0XQf6Ru6or1na6upvV3NQfstapQG8X2rg==} + engines: {node: '>=6.0.0', npm: '>=3.0.0'} + deprecated: This module has been superseded by @ipld/dag-pb and multiformats + iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} @@ -3888,6 +4067,14 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -3960,6 +4147,18 @@ packages: peerDependencies: ws: '*' + it-all@1.0.6: + resolution: {integrity: sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==} + + it-batch@1.0.9: + resolution: {integrity: sha512-7Q7HXewMhNFltTsAMdSz6luNhyhkhEtGGbYek/8Xb/GiqYMtwUmopE1ocPSiJKKp3rM4Dt045sNFoUu+KZGNyA==} + + it-first@1.0.7: + resolution: {integrity: sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g==} + + it-parallel-batch@1.0.11: + resolution: {integrity: sha512-UWsWHv/kqBpMRmyZJzlmZeoAMA0F3SZr08FBdbhtbe+MtoEBgr/ZUAKrnenhXCBrsopy76QjRH2K/V8kNdupbQ==} + jayson@4.2.0: resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} engines: {node: '>=8'} @@ -3976,6 +4175,9 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3999,6 +4201,14 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify@1.3.0: + resolution: {integrity: sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==} + engines: {node: '>= 0.4'} + + json-stringify-deterministic@1.0.12: + resolution: {integrity: sha512-q3PN0lbUdv0pmurkBNdJH3pfFvOTL/Zp0lquqpvcjfKzt6Y0j49EPHAmVHCAS4Ceq/Y+PejWTzyiVpoY71+D6g==} + engines: {node: '>= 4'} + json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -4010,6 +4220,12 @@ packages: jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + jsonify@0.0.1: + resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} + + just-performance@4.3.0: + resolution: {integrity: sha512-L7RjvtJsL0QO8xFs5wEoDDzzJwoiowRw6Rn/GnvldlchS2JQr9wFYPiwZcDfrbbujEKqKN0tvENdbjXdYhDp5Q==} + keyv@5.5.0: resolution: {integrity: sha512-QG7qR2tijh1ftOvClut4YKKg1iW6cx3GZsKoGyJPxHkGWK9oJhG9P3j5deP0QQOGDowBMVQFaP+Vm4NpGYvmIQ==} @@ -4093,6 +4309,12 @@ packages: resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} engines: {node: '>= 12.0.0'} + limiter@2.1.0: + resolution: {integrity: sha512-361TYz6iay6n+9KvUUImqdLuFigK+K79qrUtBsXhJTLdH4rIt/r1y8r1iozwh8KbZNpujbFTSh74mJ7bwbAMOw==} + + limiter@3.0.0: + resolution: {integrity: sha512-hev7DuXojsTFl2YwyzUJMDnZ/qBDd3yZQLSH3aD4tdL1cqfc3TMnoecEJtWFaQFdErZsKoFMBTxF/FBSkgDbEg==} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -4130,6 +4352,9 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -4144,6 +4369,10 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -4151,6 +4380,14 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -4168,6 +4405,14 @@ packages: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} engines: {node: '>=18'} + meow@9.0.0: + resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} + engines: {node: '>=10'} + + merge-options@3.0.4: + resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} + engines: {node: '>=10'} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -4187,10 +4432,18 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + minimatch@10.1.1: resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -4221,9 +4474,30 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + multibase@4.0.6: + resolution: {integrity: sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==} + engines: {node: '>=12.0.0', npm: '>=6.0.0'} + deprecated: This module has been superseded by the multiformats module + + multicodec@3.2.1: + resolution: {integrity: sha512-+expTPftro8VAW8kfvcuNNNBgb9gPeNYV9dn+z1kJRWF2vih+/S79f2RVeIwmrJBUJ6NT9IUPWnZDQvegEh5pw==} + deprecated: This module has been superseded by the multiformats module + multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + multihashes@4.0.3: + resolution: {integrity: sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==} + engines: {node: '>=12.0.0', npm: '>=6.0.0'} + + multihashing-async@2.1.4: + resolution: {integrity: sha512-sB1MiQXPSBTNRVSJc2zM157PXgDtud2nMFUEIvBrsq5Wv96sUclMRK/ecjoP1T/W61UJBqt4tCTwMkUpt2Gbzg==} + engines: {node: '>=12.0.0', npm: '>=6.0.0'} + + murmurhash3js-revisited@3.0.0: + resolution: {integrity: sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==} + engines: {node: '>=8.0.0'} + nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -4278,6 +4552,13 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -4543,6 +4824,10 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + protobufjs@6.11.4: + resolution: {integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==} + hasBin: true + proxy-compare@2.6.0: resolution: {integrity: sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==} @@ -4570,6 +4855,14 @@ packages: quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + rabin-wasm@0.1.5: + resolution: {integrity: sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==} + hasBin: true + radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} @@ -4668,6 +4961,14 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -4701,6 +5002,10 @@ packages: react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + regenerate-unicode-properties@10.2.0: resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} engines: {node: '>=4'} @@ -4780,6 +5085,10 @@ packages: secure-json-parse@4.1.0: resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -4863,6 +5172,21 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + sparse-array@1.3.2: + resolution: {integrity: sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + split-on-first@1.1.0: resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} engines: {node: '>=6'} @@ -4871,6 +5195,10 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -4902,6 +5230,10 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + strip-json-comments@5.0.3: resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} engines: {node: '>=14.16'} @@ -5021,6 +5353,10 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} @@ -5060,6 +5396,18 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -5072,6 +5420,9 @@ packages: resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} engines: {node: '>=18'} + uint8arrays@2.1.10: + resolution: {integrity: sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A==} + uint8arrays@3.1.0: resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} @@ -5226,6 +5577,9 @@ packages: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + valtio@1.13.2: resolution: {integrity: sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==} engines: {node: '>=12.20.0'} @@ -5250,6 +5604,12 @@ packages: react: optional: true + varint@5.0.2: + resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} + + varint@6.0.0: + resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} + vfile-message@4.0.3: resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} @@ -5386,10 +5746,17 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} @@ -5450,6 +5817,8 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.30 + '@assemblyscript/loader@0.9.4': {} + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -6289,6 +6658,115 @@ snapshots: - zod optional: true + '@cowprotocol/cow-sdk@7.2.9(ajv@8.17.1)(cross-fetch@4.1.0)(ipfs-only-hash@4.0.0)(multiformats@9.9.0)': + dependencies: + '@cowprotocol/sdk-app-data': 4.5.0(ajv@8.17.1)(cross-fetch@4.1.0)(ipfs-only-hash@4.0.0)(multiformats@9.9.0) + '@cowprotocol/sdk-common': 0.4.0 + '@cowprotocol/sdk-config': 0.6.2 + '@cowprotocol/sdk-contracts-ts': 1.0.0 + '@cowprotocol/sdk-order-book': 0.5.0 + '@cowprotocol/sdk-order-signing': 0.1.23 + '@cowprotocol/sdk-trading': 0.8.0(ajv@8.17.1)(cross-fetch@4.1.0)(ipfs-only-hash@4.0.0)(multiformats@9.9.0) + cross-fetch: 4.1.0 + optionalDependencies: + ipfs-only-hash: 4.0.0 + multiformats: 9.9.0 + transitivePeerDependencies: + - ajv + - encoding + + '@cowprotocol/sdk-app-data@4.5.0(ajv@8.17.1)(cross-fetch@4.1.0)(ipfs-only-hash@4.0.0)(multiformats@9.9.0)': + dependencies: + '@cowprotocol/sdk-common': 0.4.0 + ajv: 8.17.1 + cross-fetch: 4.1.0 + ipfs-only-hash: 4.0.0 + json-stringify-deterministic: 1.0.12 + multiformats: 9.9.0 + + '@cowprotocol/sdk-bridging@1.2.0(ajv@8.17.1)(cross-fetch@4.1.0)(ipfs-only-hash@4.0.0)(multiformats@9.9.0)': + dependencies: + '@cowprotocol/sdk-app-data': 4.5.0(ajv@8.17.1)(cross-fetch@4.1.0)(ipfs-only-hash@4.0.0)(multiformats@9.9.0) + '@cowprotocol/sdk-common': 0.4.0 + '@cowprotocol/sdk-config': 0.6.2 + '@cowprotocol/sdk-contracts-ts': 1.0.0 + '@cowprotocol/sdk-cow-shed': 0.2.9 + '@cowprotocol/sdk-order-book': 0.5.0 + '@cowprotocol/sdk-trading': 0.8.0(ajv@8.17.1)(cross-fetch@4.1.0)(ipfs-only-hash@4.0.0)(multiformats@9.9.0) + '@cowprotocol/sdk-weiroll': 0.1.11 + '@defuse-protocol/one-click-sdk-typescript': 0.1.1-0.2 + json-stable-stringify: 1.3.0 + transitivePeerDependencies: + - ajv + - cross-fetch + - debug + - encoding + - ipfs-only-hash + - multiformats + + '@cowprotocol/sdk-common@0.4.0': {} + + '@cowprotocol/sdk-config@0.6.2': + dependencies: + exponential-backoff: 3.1.3 + limiter: 2.1.0 + + '@cowprotocol/sdk-contracts-ts@1.0.0': + dependencies: + '@cowprotocol/sdk-common': 0.4.0 + '@cowprotocol/sdk-config': 0.6.2 + + '@cowprotocol/sdk-cow-shed@0.2.9': + dependencies: + '@cowprotocol/sdk-common': 0.4.0 + '@cowprotocol/sdk-config': 0.6.2 + '@cowprotocol/sdk-contracts-ts': 1.0.0 + + '@cowprotocol/sdk-order-book@0.5.0': + dependencies: + '@cowprotocol/sdk-common': 0.4.0 + '@cowprotocol/sdk-config': 0.6.2 + cross-fetch: 3.2.0 + exponential-backoff: 3.1.3 + limiter: 3.0.0 + transitivePeerDependencies: + - encoding + + '@cowprotocol/sdk-order-signing@0.1.23': + dependencies: + '@cowprotocol/sdk-common': 0.4.0 + '@cowprotocol/sdk-config': 0.6.2 + '@cowprotocol/sdk-contracts-ts': 1.0.0 + '@cowprotocol/sdk-order-book': 0.5.0 + transitivePeerDependencies: + - encoding + + '@cowprotocol/sdk-trading@0.8.0(ajv@8.17.1)(cross-fetch@4.1.0)(ipfs-only-hash@4.0.0)(multiformats@9.9.0)': + dependencies: + '@cowprotocol/sdk-app-data': 4.5.0(ajv@8.17.1)(cross-fetch@4.1.0)(ipfs-only-hash@4.0.0)(multiformats@9.9.0) + '@cowprotocol/sdk-common': 0.4.0 + '@cowprotocol/sdk-config': 0.6.2 + '@cowprotocol/sdk-contracts-ts': 1.0.0 + '@cowprotocol/sdk-order-book': 0.5.0 + '@cowprotocol/sdk-order-signing': 0.1.23 + deepmerge: 4.3.1 + transitivePeerDependencies: + - ajv + - cross-fetch + - encoding + - ipfs-only-hash + - multiformats + + '@cowprotocol/sdk-viem-adapter@0.3.0(viem@2.40.2(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + '@cowprotocol/sdk-common': 0.4.0 + viem: 2.40.2(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + + '@cowprotocol/sdk-weiroll@0.1.11': + dependencies: + '@cowprotocol/sdk-common': 0.4.0 + '@cowprotocol/sdk-config': 0.6.2 + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': dependencies: '@csstools/css-tokenizer': 3.0.4 @@ -6306,6 +6784,13 @@ snapshots: '@date-fns/tz@1.4.1': {} + '@defuse-protocol/one-click-sdk-typescript@0.1.1-0.2': + dependencies: + axios: 1.13.2 + form-data: 4.0.4 + transitivePeerDependencies: + - debug + '@dual-bundle/import-meta-resolve@4.1.0': {} '@ecies/ciphers@0.2.4(@noble/ciphers@1.3.0)': @@ -6894,6 +7379,8 @@ snapshots: '@msgpack/msgpack@3.1.2': {} + '@multiformats/base-x@4.0.1': {} + '@next/env@15.5.7': {} '@next/swc-darwin-arm64@15.5.7': @@ -6976,6 +7463,29 @@ snapshots: dependencies: lit: 3.3.0 + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + '@radix-ui/number@1.1.1': {} '@radix-ui/primitive@1.1.3': {} @@ -8836,6 +9346,10 @@ snapshots: '@types/lodash@4.17.20': {} + '@types/long@4.0.2': {} + + '@types/minimist@1.2.5': {} + '@types/ms@2.1.0': optional: true @@ -8846,6 +9360,8 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/normalize-package-data@2.4.4': {} + '@types/prop-types@15.7.15': {} '@types/react-dom@18.3.7(@types/react@18.3.23)': @@ -9727,10 +10243,11 @@ snapshots: array-union@2.1.0: {} + arrify@1.0.1: {} + astral-regex@2.0.0: {} - asynckit@0.4.0: - optional: true + asynckit@0.4.0: {} atomic-sleep@1.0.0: {} @@ -9761,7 +10278,6 @@ snapshots: proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - optional: true babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.3): dependencies: @@ -9802,6 +10318,12 @@ snapshots: big.js@6.2.2: {} + bl@5.1.0: + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 + blakejs@1.2.1: {} bn.js@5.2.2: @@ -9871,6 +10393,12 @@ snapshots: callsites@3.1.0: {} + camelcase-keys@6.2.2: + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + camelcase@5.3.1: {} caniuse-lite@1.0.30001735: {} @@ -9890,6 +10418,13 @@ snapshots: dependencies: readdirp: 4.1.2 + cids@1.1.9: + dependencies: + multibase: 4.0.6 + multicodec: 3.2.1 + multihashes: 4.0.3 + uint8arrays: 3.1.1 + citty@0.1.6: dependencies: consola: 3.4.2 @@ -9934,7 +10469,6 @@ snapshots: combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - optional: true commander@14.0.0: optional: true @@ -9986,7 +10520,6 @@ snapshots: node-fetch: 2.7.0 transitivePeerDependencies: - encoding - optional: true crossws@0.3.5: dependencies: @@ -10075,6 +10608,11 @@ snapshots: dependencies: ms: 2.1.3 + decamelize-keys@1.1.1: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + decamelize@1.2.0: {} decimal.js-light@2.5.1: {} @@ -10124,8 +10662,7 @@ snapshots: delay@5.0.0: optional: true - delayed-stream@1.0.0: - optional: true + delayed-stream@1.0.0: {} dequal@2.0.3: {} @@ -10237,6 +10774,8 @@ snapshots: env-paths@2.2.1: {} + err-code@3.0.1: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -10267,7 +10806,6 @@ snapshots: get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 - optional: true es-toolkit@1.33.0: optional: true @@ -10344,6 +10882,8 @@ snapshots: optionalDependencies: '@sinclair/typebox': 0.34.41 + exponential-backoff@3.1.3: {} + exsolve@1.0.8: {} extend@3.0.2: {} @@ -10425,8 +10965,7 @@ snapshots: flatted@3.3.3: {} - follow-redirects@1.15.11: - optional: true + follow-redirects@1.15.11: {} for-each@0.3.5: dependencies: @@ -10439,7 +10978,6 @@ snapshots: es-set-tostringtag: 2.1.0 hasown: 2.0.2 mime-types: 2.1.35 - optional: true fraction.js@4.3.7: {} @@ -10544,6 +11082,13 @@ snapshots: ufo: 1.6.1 uncrypto: 0.1.3 + hamt-sharding@2.0.1: + dependencies: + sparse-array: 1.3.2 + uint8arrays: 3.1.1 + + hard-rejection@2.1.0: {} + harmony-reflect@1.6.2: {} has-bigints@1.1.0: {} @@ -10571,6 +11116,12 @@ snapshots: hookified@1.11.0: {} + hosted-git-info@2.8.9: {} + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + html-tags@3.3.1: {} humanize-ms@1.2.1: @@ -10600,11 +11151,18 @@ snapshots: imurmurhash@0.1.4: {} - inherits@2.0.4: - optional: true + indent-string@4.0.0: {} + + inherits@2.0.4: {} ini@1.3.8: {} + interface-ipld-format@1.0.1: + dependencies: + cids: 1.1.9 + multicodec: 3.2.1 + multihashes: 4.0.3 + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 @@ -10620,6 +11178,49 @@ snapshots: '@formatjs/icu-messageformat-parser': 2.11.2 tslib: 2.8.1 + ipfs-only-hash@4.0.0: + dependencies: + ipfs-unixfs-importer: 7.0.3 + meow: 9.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + ipfs-unixfs-importer@7.0.3: + dependencies: + bl: 5.1.0 + cids: 1.1.9 + err-code: 3.0.1 + hamt-sharding: 2.0.1 + ipfs-unixfs: 4.0.3 + ipld-dag-pb: 0.22.3 + it-all: 1.0.6 + it-batch: 1.0.9 + it-first: 1.0.7 + it-parallel-batch: 1.0.11 + merge-options: 3.0.4 + multihashing-async: 2.1.4 + rabin-wasm: 0.1.5 + uint8arrays: 2.1.10 + transitivePeerDependencies: + - encoding + - supports-color + + ipfs-unixfs@4.0.3: + dependencies: + err-code: 3.0.1 + protobufjs: 6.11.4 + + ipld-dag-pb@0.22.3: + dependencies: + cids: 1.1.9 + interface-ipld-format: 1.0.1 + multicodec: 3.2.1 + multihashing-async: 2.1.4 + protobufjs: 6.11.4 + stable: 0.1.8 + uint8arrays: 2.1.10 + iron-webcrypto@1.2.1: {} is-arguments@1.2.0: @@ -10685,6 +11286,10 @@ snapshots: is-number@7.0.0: {} + is-plain-obj@1.1.0: {} + + is-plain-obj@2.1.0: {} + is-plain-obj@4.1.0: {} is-plain-object@5.0.0: {} @@ -10752,6 +11357,16 @@ snapshots: dependencies: ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + it-all@1.0.6: {} + + it-batch@1.0.9: {} + + it-first@1.0.7: {} + + it-parallel-batch@1.0.11: + dependencies: + it-batch: 1.0.9 + jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@types/connect': 3.4.38 @@ -10778,6 +11393,8 @@ snapshots: joycon@3.1.1: {} + js-sha3@0.8.0: {} + js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -10792,6 +11409,16 @@ snapshots: json-schema-traverse@1.0.0: {} + json-stable-stringify@1.3.0: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + isarray: 2.0.5 + jsonify: 0.0.1 + object-keys: 1.1.1 + + json-stringify-deterministic@1.0.12: {} + json-stringify-safe@5.0.1: optional: true @@ -10799,6 +11426,10 @@ snapshots: jsonc-parser@3.3.1: {} + jsonify@0.0.1: {} + + just-performance@4.3.0: {} + keyv@5.5.0: dependencies: '@keyv/serialize': 1.1.0 @@ -10858,6 +11489,12 @@ snapshots: lightningcss-win32-arm64-msvc: 1.30.2 lightningcss-win32-x64-msvc: 1.30.2 + limiter@2.1.0: + dependencies: + just-performance: 4.3.0 + + limiter@3.0.0: {} + lines-and-columns@1.2.4: {} lit-element@4.2.1: @@ -10897,6 +11534,8 @@ snapshots: lodash@4.17.21: {} + long@4.0.0: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -10909,12 +11548,20 @@ snapshots: dependencies: yallist: 3.1.1 + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + lz-string@1.5.0: {} magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + map-obj@1.0.1: {} + + map-obj@4.3.0: {} + math-intrinsics@1.1.0: {} mathml-tag-names@2.1.3: {} @@ -10930,6 +11577,25 @@ snapshots: meow@13.2.0: {} + meow@9.0.0: + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize: 1.2.0 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + + merge-options@3.0.4: + dependencies: + is-plain-obj: 2.1.0 + merge2@1.4.1: {} micro-ftch@0.3.1: @@ -10940,18 +11606,24 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mime-db@1.52.0: - optional: true + mime-db@1.52.0: {} mime-types@2.1.35: dependencies: mime-db: 1.52.0 - optional: true + + min-indent@1.0.1: {} minimatch@10.1.1: dependencies: '@isaacs/brace-expansion': 5.0.0 + minimist-options@4.1.0: + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + minimist@1.2.8: {} minipass@7.1.2: {} @@ -10973,8 +11645,34 @@ snapshots: ms@2.1.3: {} + multibase@4.0.6: + dependencies: + '@multiformats/base-x': 4.0.1 + + multicodec@3.2.1: + dependencies: + uint8arrays: 3.1.1 + varint: 6.0.0 + multiformats@9.9.0: {} + multihashes@4.0.3: + dependencies: + multibase: 4.0.6 + uint8arrays: 3.1.1 + varint: 5.0.2 + + multihashing-async@2.1.4: + dependencies: + blakejs: 1.2.1 + err-code: 3.0.1 + js-sha3: 0.8.0 + multihashes: 4.0.3 + murmurhash3js-revisited: 3.0.0 + uint8arrays: 3.1.1 + + murmurhash3js-revisited@3.0.0: {} + nanoid@3.3.11: {} next-themes@0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -11018,6 +11716,20 @@ snapshots: node-releases@2.0.19: {} + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.10 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-package-data@3.0.3: + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.16.1 + semver: 7.7.2 + validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} normalize-range@0.1.2: {} @@ -11369,13 +12081,28 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + protobufjs@6.11.4: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/long': 4.0.2 + '@types/node': 22.17.2 + long: 4.0.0 + proxy-compare@2.6.0: optional: true proxy-compare@3.0.1: {} - proxy-from-env@1.1.0: - optional: true + proxy-from-env@1.1.0: {} pump@3.0.3: dependencies: @@ -11401,6 +12128,20 @@ snapshots: quick-format-unescaped@4.0.4: {} + quick-lru@4.0.1: {} + + rabin-wasm@0.1.5: + dependencies: + '@assemblyscript/loader': 0.9.4 + bl: 5.1.0 + debug: 4.4.3 + minimist: 1.2.8 + node-fetch: 2.7.0 + readable-stream: 3.6.2 + transitivePeerDependencies: + - encoding + - supports-color + radix3@1.1.2: {} react-day-picker@9.13.0(react@18.3.1): @@ -11495,6 +12236,19 @@ snapshots: dependencies: loose-envify: 1.4.0 + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -11511,7 +12265,6 @@ snapshots: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - optional: true readable-stream@4.7.0: dependencies: @@ -11546,6 +12299,11 @@ snapshots: tiny-invariant: 1.3.3 victory-vendor: 36.9.2 + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + regenerate-unicode-properties@10.2.0: dependencies: regenerate: 1.4.2 @@ -11617,8 +12375,7 @@ snapshots: safe-buffer@5.1.2: optional: true - safe-buffer@5.2.1: - optional: true + safe-buffer@5.2.1: {} safe-regex-test@1.1.0: dependencies: @@ -11634,6 +12391,8 @@ snapshots: secure-json-parse@4.1.0: {} + semver@5.7.2: {} + semver@6.3.1: {} semver@7.7.2: {} @@ -11789,11 +12548,29 @@ snapshots: source-map-js@1.2.1: {} + sparse-array@1.3.2: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.22 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.22 + + spdx-license-ids@3.0.22: {} + split-on-first@1.1.0: optional: true split2@4.2.0: {} + stable@0.1.8: {} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -11827,12 +12604,15 @@ snapshots: string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - optional: true strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + strip-json-comments@5.0.3: {} strtok3@10.3.4: @@ -11974,6 +12754,8 @@ snapshots: tr46@0.0.3: {} + trim-newlines@3.0.1: {} + trough@2.2.0: {} trpc-cli@0.12.1(@trpc/server@11.7.2(typescript@5.9.3))(zod@4.1.13): @@ -11994,12 +12776,22 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + type-fest@0.18.1: {} + + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + typescript@5.9.3: {} ufo@1.6.1: {} uint8array-extras@1.5.0: {} + uint8arrays@2.1.10: + dependencies: + multiformats: 9.9.0 + uint8arrays@3.1.0: dependencies: multiformats: 9.9.0 @@ -12123,6 +12915,11 @@ snapshots: uuid@9.0.1: optional: true + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + valtio@1.13.2(@types/react@18.3.23)(react@18.3.1): dependencies: derive-valtio: 0.1.0(valtio@1.13.2(@types/react@18.3.23)(react@18.3.1)) @@ -12140,6 +12937,10 @@ snapshots: '@types/react': 18.3.23 react: 18.3.1 + varint@5.0.2: {} + + varint@6.0.0: {} + vfile-message@4.0.3: dependencies: '@types/unist': 3.0.3 @@ -12327,11 +13128,15 @@ snapshots: yallist@3.1.1: {} + yallist@4.0.0: {} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 decamelize: 1.2.0 + yargs-parser@20.2.9: {} + yargs@15.4.1: dependencies: cliui: 6.0.0 diff --git a/src/features/swap/components/BridgeSwapModal.tsx b/src/features/swap/components/BridgeSwapModal.tsx new file mode 100644 index 00000000..417a4e9b --- /dev/null +++ b/src/features/swap/components/BridgeSwapModal.tsx @@ -0,0 +1,315 @@ +import { useCallback, useMemo, useState } from 'react'; +import { ArrowDownIcon, ExternalLinkIcon } from '@radix-ui/react-icons'; +import { formatUnits, parseUnits } from 'viem'; +import { useAccount } from 'wagmi'; +import { motion } from 'framer-motion'; +import { Modal, ModalBody, ModalFooter, ModalHeader } from '@/components/common/Modal'; +import { Button } from '@/components/ui/button'; +import { ExecuteTransactionButton } from '@/components/ui/ExecuteTransactionButton'; +import { useUserBalances } from '@/hooks/useUserBalances'; +import { useAllowance } from '@/hooks/useAllowance'; +import { formatBalance } from '@/utils/balance'; +import { useCowBridge } from '../hooks/useCowBridge'; +import { TokenNetworkDropdown } from './TokenNetworkDropdown'; +import { COW_BRIDGE_CHAINS, COW_VAULT_RELAYER, type SwapToken } from '../types'; +import { DEFAULT_SLIPPAGE_PERCENT } from '../constants'; + +type BridgeSwapModalProps = { + isOpen: boolean; + onClose: () => void; + targetToken: SwapToken; +}; + +export function BridgeSwapModal({ isOpen, onClose, targetToken }: BridgeSwapModalProps) { + const { address: account } = useAccount(); + const [sourceToken, setSourceToken] = useState(null); + const [inputAmount, setInputAmount] = useState('0'); + const [amount, setAmount] = useState(BigInt(0)); + const [slippage, _setSlippage] = useState(DEFAULT_SLIPPAGE_PERCENT); + + // Fetch user balances from CoW-supported chains + const { balances, loading: balancesLoading } = useUserBalances({ + networkIds: COW_BRIDGE_CHAINS as unknown as number[], + }); + + // Handle approval for source token + const { allowance, approveInfinite, approvePending } = useAllowance({ + token: (sourceToken?.address ?? '0x0000000000000000000000000000000000000000') as `0x${string}`, + chainId: sourceToken?.chainId, + user: account, + spender: COW_VAULT_RELAYER, + tokenSymbol: sourceToken?.symbol, + }); + + // Convert balances to SwapTokens (support cross-chain) + const availableTokens = useMemo(() => { + return balances + .filter((b) => BigInt(b.balance) > BigInt(0)) // Only show tokens with balance + .filter( + // Not the same token as target + (b) => !(b.chainId === targetToken.chainId && b.address.toLowerCase() === targetToken.address.toLowerCase()), + ) + .map((b) => ({ + address: b.address, + symbol: b.symbol, + chainId: b.chainId, + decimals: b.decimals, + balance: BigInt(b.balance), + })) + .sort((a, b) => { + // Sort by balance (descending) + const aValue = Number(formatUnits(a.balance ?? BigInt(0), a.decimals)); + const bValue = Number(formatUnits(b.balance ?? BigInt(0), b.decimals)); + return bValue - aValue; + }); + }, [balances, targetToken.chainId, targetToken.address]); + + // CoW Bridge hook + const { quote, isQuoting, isExecuting, error, orderUid, executeSwap, reset } = useCowBridge({ + sourceToken, + targetToken, + amount, + slippageBps: Math.round(slippage * 100), + }); + + // Check if approval is needed + const needsApproval = allowance < amount && amount > BigInt(0); + + const handleSourceTokenSelect = (token: SwapToken) => { + setSourceToken(token); + setAmount(BigInt(0)); + setInputAmount('0'); + }; + + const handleInputChange = (e: React.ChangeEvent) => { + const value = e.target.value; + setInputAmount(value); + + if (!sourceToken) return; + + try { + const parsed = parseUnits(value, sourceToken.decimals); + setAmount(parsed); + } catch { + // Invalid input, keep previous amount + } + }; + + const handleMaxClick = () => { + if (sourceToken?.balance) { + setAmount(sourceToken.balance); + setInputAmount(formatBalance(sourceToken.balance, sourceToken.decimals).toString()); + } + }; + + const handleClose = () => { + reset(); + setSourceToken(null); + setAmount(BigInt(0)); + setInputAmount('0'); + onClose(); + }; + + // Unified execution handler - handles approve + swap automatically + const handleSwap = useCallback(async () => { + if (needsApproval) { + await approveInfinite(); + } + await executeSwap(); + }, [needsApproval, approveInfinite, executeSwap]); + + const isLoading = isQuoting || approvePending || isExecuting; + + // Format error messages to be user-friendly + const formatErrorMessage = (errorMsg: string): string => { + if (errorMsg.includes('BUILD_TX_ERROR')) return 'Failed to build transaction. Please try again.'; + if (errorMsg.includes('same from and to token')) return 'Cannot swap to the same token. Try selecting a different source token.'; + if (errorMsg.toLowerCase().includes('insufficient')) return errorMsg; + return errorMsg; + }; + + // Determine output display text + const getOutputDisplay = () => { + if (!sourceToken) return 'Select token above'; + if (amount === BigInt(0)) return '0'; + if (isQuoting) return 'Loading...'; + if (error) return {formatErrorMessage(error)}; + if (quote) return {Number(formatUnits(quote.buyAmount, targetToken.decimals)).toFixed(6)}; + return '0'; + }; + + // Truncate order hash for display (e.g., "0x1234...5678") + const _truncateHash = (hash: string) => { + if (hash.length <= 16) return hash; + return `${hash.slice(0, 8)}...${hash.slice(-6)}`; + }; + + return ( + !open && handleClose()} + size="lg" + > + + + +
+ {/* From Section - Always visible */} +
+
+ From + {sourceToken && ( + + )} +
+
+ + +
+
+ + {/* Arrow */} +
+ +
+ + {/* To Section - Always visible */} +
+
To
+
+
{getOutputDisplay()}
+ {}} + disabled + /> +
+
+ {quote && sourceToken && !error && ( + + 1 {sourceToken.symbol} ≈{' '} + {( + Number(formatUnits(quote.buyAmount, targetToken.decimals)) / Number(formatUnits(quote.sellAmount, sourceToken.decimals)) + ).toFixed(6)}{' '} + {targetToken.symbol} + + )} +
+
+ + {/* Error Display */} + {error && ( + + {formatErrorMessage(error)} + + )} + + {/* Quote Details */} + {quote && sourceToken && !error && quote.type === 'cross-chain' && ( +
+ {quote.bridgeProvider && ( +
+ Bridge + {quote.bridgeProvider} +
+ )} + {quote.estimatedTimeSeconds && ( +
+ Estimated time + ~{Math.ceil(quote.estimatedTimeSeconds / 60)} min +
+ )} + {quote.bridgeFee && ( +
+ Bridge fee + + {Number(formatUnits(quote.bridgeFee, sourceToken.decimals)).toFixed(6)} {sourceToken.symbol} + +
+ )} +
+ )} + + {/* Success Message */} + {orderUid && ( + +
+ Order Created 🎉 + + View in CoW Explorer + + +
+
+ )} + + {/* Empty State */} + {!balancesLoading && availableTokens.length === 0 && !sourceToken && ( +
+

No tokens found on supported chains

+

Supported: Ethereum, Base, Polygon, Arbitrum

+
+ )} +
+
+ + + + {!orderUid && ( + void handleSwap()} + isLoading={isLoading} + disabled={!quote || amount === BigInt(0) || !!error} + variant="primary" + > + {needsApproval ? 'Approve & Swap' : 'Swap'} + + )} + +
+ ); +} diff --git a/src/features/swap/components/TokenNetworkDropdown.tsx b/src/features/swap/components/TokenNetworkDropdown.tsx new file mode 100644 index 00000000..76f110e8 --- /dev/null +++ b/src/features/swap/components/TokenNetworkDropdown.tsx @@ -0,0 +1,119 @@ +import { useState } from 'react'; +import { ChevronDownIcon } from '@radix-ui/react-icons'; +import { formatUnits } from 'viem'; +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu'; +import { TokenIcon } from '@/components/shared/token-icon'; +import { NetworkIcon } from '@/components/shared/network-icon'; +import { getNetworkName } from '@/utils/networks'; +import type { SwapToken } from '../types'; + +type TokenNetworkDropdownProps = { + selectedToken: SwapToken | null; + tokens: SwapToken[]; + onSelect: (token: SwapToken) => void; + placeholder?: string; + disabled?: boolean; +}; + +/** + * Compact inline token + network selector for swap interface + * Displays token icon with small network icon, opens searchable dropdown + */ +export function TokenNetworkDropdown({ selectedToken, tokens, onSelect, placeholder = 'Select', disabled }: TokenNetworkDropdownProps) { + const [query, setQuery] = useState(''); + + // Filter tokens by search query + const filteredTokens = tokens.filter( + (token) => + token.symbol.toLowerCase().includes(query.toLowerCase()) || + (getNetworkName(token.chainId)?.toLowerCase() ?? '').includes(query.toLowerCase()), + ); + + return ( + + + + + + + {/* Search input */} +
+ setQuery(e.target.value)} + className="w-full bg-transparent px-2 py-1 text-sm outline-none placeholder:opacity-50" + onKeyDown={(e) => e.stopPropagation()} + /> +
+ + {/* Token list */} +
+ {filteredTokens.length === 0 ? ( +
No tokens found
+ ) : ( + filteredTokens.map((token) => ( + { + onSelect(token); + setQuery(''); + }} + className="cursor-pointer" + startContent={ + + } + endContent={ + token.balance !== undefined ? ( + {Number(formatUnits(token.balance, token.decimals)).toFixed(4)} + ) : null + } + > +
+ {token.symbol} +
+ + {getNetworkName(token.chainId)} +
+
+
+ )) + )} +
+
+
+ ); +} diff --git a/src/features/swap/constants.ts b/src/features/swap/constants.ts new file mode 100644 index 00000000..6f085496 --- /dev/null +++ b/src/features/swap/constants.ts @@ -0,0 +1,13 @@ +/** + * CoW Protocol swap configuration constants + */ + +/** + * Application identifier for CoW Protocol integration + */ +export const SWAP_APP_CODE = 'monarch-swap'; + +/** + * Default slippage tolerance as a percentage (0.5 = 0.5%) + */ +export const DEFAULT_SLIPPAGE_PERCENT = 0.5; diff --git a/src/features/swap/cowBridgingSdk.ts b/src/features/swap/cowBridgingSdk.ts new file mode 100644 index 00000000..839a4d11 --- /dev/null +++ b/src/features/swap/cowBridgingSdk.ts @@ -0,0 +1,37 @@ +import { TradingSdk } from '@cowprotocol/cow-sdk'; +import { BridgingSdk, BungeeBridgeProvider } from '@cowprotocol/sdk-bridging'; +import { SWAP_APP_CODE } from './constants'; + +/** + * Trading SDK for approvals and allowances + */ +export const tradingSdk = new TradingSdk( + { + chainId: 1, // Default, will be updated by adapter + appCode: SWAP_APP_CODE, + }, + {}, +); + +/** + * Bungee bridge provider configuration + * Supports Across and CCTP bridges for fast, reliable cross-chain swaps + */ +export const bungeeBridgeProvider = new BungeeBridgeProvider({ + apiOptions: { + includeBridges: ['across', 'cctp'], + }, +}); + +/** + * CoW Protocol BridgingSDK instance + * Handles both same-chain swaps and cross-chain bridging automatically + */ +export const bridgingSdk = new BridgingSdk( + { + providers: [bungeeBridgeProvider], + tradingSdk, // Pass TradingSdk for approvals + enableLogging: false, // Set to true for debugging + }, + undefined, +); diff --git a/src/features/swap/hooks/useCowBridge.ts b/src/features/swap/hooks/useCowBridge.ts new file mode 100644 index 00000000..f0e66ee8 --- /dev/null +++ b/src/features/swap/hooks/useCowBridge.ts @@ -0,0 +1,214 @@ +import { useCallback, useEffect, useState } from 'react'; +import { useAccount, usePublicClient, useWalletClient } from 'wagmi'; +import { OrderKind, setGlobalAdapter } from '@cowprotocol/cow-sdk'; +import { + isBridgeQuoteAndPost, + type BridgeQuoteAndPost, + type CrossChainQuoteAndPost, + type QuoteBridgeRequest, +} from '@cowprotocol/sdk-bridging'; +import { ViemAdapter } from '@cowprotocol/sdk-viem-adapter'; +import { bridgingSdk, tradingSdk } from '../cowBridgingSdk'; +import type { SwapQuoteDisplay, SwapToken } from '../types'; +import { SWAP_APP_CODE } from '../constants'; + +type UseCowBridgeParams = { + sourceToken: SwapToken | null; + targetToken: SwapToken; + amount: bigint; + slippageBps: number; +}; + +type UseCowBridgeReturn = { + quote: SwapQuoteDisplay | null; + isQuoting: boolean; + isExecuting: boolean; + error: string | null; + orderUid: string | null; + + executeSwap: () => Promise; + reset: () => void; +}; + +/** + * Hook for managing CoW Protocol swaps and cross-chain bridges + */ +export function useCowBridge({ sourceToken, targetToken, amount, slippageBps }: UseCowBridgeParams): UseCowBridgeReturn { + const { address: account, chainId } = useAccount(); + const { data: walletClient } = useWalletClient(); + const publicClient = usePublicClient(); + + const [quote, setQuote] = useState(null); + const [rawQuote, setRawQuote] = useState(null); + const [isQuoting, setIsQuoting] = useState(false); + const [isExecuting, setIsExecuting] = useState(false); + const [error, setError] = useState(null); + const [orderUid, setOrderUid] = useState(null); + + // Bind SDK to wagmi + useEffect(() => { + if (!walletClient || !chainId || !publicClient) return; + + try { + setGlobalAdapter( + new ViemAdapter({ + provider: publicClient, + walletClient, + }), + ); + + tradingSdk.setTraderParams({ chainId }); + } catch (err) { + console.error('Failed to bind SDK to wagmi:', err); + } + }, [publicClient, walletClient, chainId]); + + /** + * Parse error to extract description from CoW Protocol API errors + * Format: { errorType: string, description: string } + */ + const parseErrorDescription = (err: unknown): string => { + if (err && typeof err === 'object' && 'description' in err && typeof err.description === 'string') { + return err.description; + } + if (err instanceof Error) { + return err.message; + } + return 'An unknown error occurred'; + }; + + /** + * Get quote for swap/bridge + */ + const getQuote = useCallback(async () => { + if (!sourceToken || !account || amount === BigInt(0)) { + setQuote(null); + setRawQuote(null); + return; + } + + setIsQuoting(true); + setError(null); + + try { + const quoteBridgeRequest: QuoteBridgeRequest = { + sellTokenChainId: sourceToken.chainId, + sellTokenAddress: sourceToken.address, + sellTokenDecimals: sourceToken.decimals, + buyTokenChainId: targetToken.chainId, + buyTokenAddress: targetToken.address, + buyTokenDecimals: targetToken.decimals, + kind: OrderKind.SELL, + amount, + account, + receiver: account, + signer: walletClient as any, // Viem WalletClient as signer + appCode: SWAP_APP_CODE, + }; + + const quoteResult = await bridgingSdk.getQuote(quoteBridgeRequest); + + setRawQuote(quoteResult); + + // Parse quote result + if (isBridgeQuoteAndPost(quoteResult)) { + // Cross-chain quote + const bridgeQuote = quoteResult as BridgeQuoteAndPost; + setQuote({ + type: 'cross-chain', + buyAmount: bridgeQuote.swap.amountsAndCosts.afterNetworkCosts.buyAmount, + sellAmount: amount, + bridgeProvider: bridgeQuote.bridge.providerInfo.name, + bridgeFee: bridgeQuote.bridge.fees.bridgeFee, + estimatedTimeSeconds: bridgeQuote.bridge.expectedFillTimeSeconds, + destinationGasFee: bridgeQuote.bridge.fees.destinationGasFee, + }); + } else { + // Same-chain quote (QuoteAndPost) + setQuote({ + type: 'same-chain', + buyAmount: quoteResult.quoteResults.amountsAndCosts.afterNetworkCosts.buyAmount, + sellAmount: amount, + }); + } + } catch (err) { + setError(parseErrorDescription(err)); + setQuote(null); + setRawQuote(null); + } finally { + setIsQuoting(false); + } + }, [sourceToken, targetToken, account, amount, slippageBps, walletClient]); + + /** + * Execute the swap/bridge + */ + const executeSwap = useCallback(async () => { + if (!rawQuote) return; + + setIsExecuting(true); + setError(null); + + try { + const result = await rawQuote.postSwapOrderFromQuote({ + appData: { + metadata: { + quote: { + slippageBips: slippageBps, + }, + }, + }, + }); + + if (!result) { + throw new Error('No response from order posting'); + } + + setOrderUid(result.orderId); + } catch (err) { + setError(parseErrorDescription(err)); + } finally { + setIsExecuting(false); + } + }, [rawQuote, slippageBps]); + + /** + * Reset state + */ + const reset = useCallback(() => { + setQuote(null); + setRawQuote(null); + setError(null); + setOrderUid(null); + }, []); + + // Auto-fetch quote when parameters change + useEffect(() => { + if (!sourceToken || amount === BigInt(0)) { + setQuote(null); + setRawQuote(null); + return; + } + + // Reset state + setOrderUid(null); + setError(null); + + // Debounce quote fetching + const timeoutId = setTimeout(() => { + void getQuote(); + }, 800); + + return () => clearTimeout(timeoutId); + }, [sourceToken, amount, slippageBps, getQuote]); + + return { + quote, + isQuoting, + isExecuting, + error, + orderUid, + executeSwap, + reset, + }; +} diff --git a/src/features/swap/index.ts b/src/features/swap/index.ts new file mode 100644 index 00000000..d642cf0e --- /dev/null +++ b/src/features/swap/index.ts @@ -0,0 +1,13 @@ +/** + * CoW Protocol Swap & Bridge Feature + * + * Provides same-chain and cross-chain token swaps via CoW Protocol + */ + +export { BridgeSwapModal } from './components/BridgeSwapModal'; +export { TokenNetworkDropdown } from './components/TokenNetworkDropdown'; +export { useCowBridge } from './hooks/useCowBridge'; +export { bridgingSdk, bungeeBridgeProvider } from './cowBridgingSdk'; +export type { SwapToken, SwapQuoteDisplay, CowBridgeChainId } from './types'; +export { COW_BRIDGE_CHAINS, COW_VAULT_RELAYER, isCowBridgeChain } from './types'; +export { SWAP_APP_CODE, DEFAULT_SLIPPAGE_PERCENT } from './constants'; diff --git a/src/features/swap/types.ts b/src/features/swap/types.ts new file mode 100644 index 00000000..937277ed --- /dev/null +++ b/src/features/swap/types.ts @@ -0,0 +1,50 @@ +/** + * Token information with optional balance + */ +export type SwapToken = { + address: string; + symbol: string; + chainId: number; + decimals: number; + balance?: bigint; +}; + +/** + * Quote display information + */ +export type SwapQuoteDisplay = { + type: 'same-chain' | 'cross-chain'; + buyAmount: bigint; + sellAmount: bigint; + + // Cross-chain specific fields + bridgeProvider?: string; + bridgeFee?: bigint; + estimatedTimeSeconds?: number; + destinationGasFee?: bigint; +}; + +/** + * CoW Protocol supported chains for bridging + * Only chains supported by our API: Mainnet (1), Base (8453), Polygon (137), Arbitrum (42161) + * Note: Gnosis (100) removed - not supported by balance API + */ +export const COW_BRIDGE_CHAINS = [1, 8453, 137, 42_161] as const; + +/** + * CoW Protocol VaultRelayer address (same across all chains) + * This is the address that needs to be approved to spend tokens + */ +export const COW_VAULT_RELAYER = '0xC92E8bdf79f0507f65a392b0ab4667716BFE0110' as const; + +/** + * Type for CoW bridge supported chain IDs + */ +export type CowBridgeChainId = (typeof COW_BRIDGE_CHAINS)[number]; + +/** + * Check if a chain ID is supported by CoW Bridge + */ +export function isCowBridgeChain(chainId: number): chainId is CowBridgeChainId { + return COW_BRIDGE_CHAINS.includes(chainId as CowBridgeChainId); +} diff --git a/src/hooks/useUserBalances.ts b/src/hooks/useUserBalances.ts index ae3555d5..46535bc3 100644 --- a/src/hooks/useUserBalances.ts +++ b/src/hooks/useUserBalances.ts @@ -50,7 +50,7 @@ export function useUserBalances(options: UseUserBalancesOptions = {}) { const data = (await response.json()) as TokenResponse; return data.tokens; } catch (err) { - console.error(`Error fetching balances for chain ${chainId}:`, err); + console.warn(`Failed to fetch balances for chain ${chainId}:`, err); throw err instanceof Error ? err : new Error('Unknown error occurred'); } }, @@ -121,10 +121,12 @@ export function useUserBalances(options: UseUserBalancesOptions = {}) { } }); + // Always set balances, even if some/all networks failed setBalances(processedBalances); - if (failedChainIds.length > 0) { - const fallbackMessage = `Failed to fetch balances for chains: ${failedChainIds.join(', ')}`; + // Only set error if ALL networks failed + if (failedChainIds.length > 0 && failedChainIds.length === networksToFetch.length) { + const fallbackMessage = 'All networks failed to fetch balances'; const aggregatedMessage = errorMessages.length > 0 ? [...new Set(errorMessages)].join(' | ') : fallbackMessage; setError(new Error(aggregatedMessage)); } diff --git a/src/modals/supply/supply-modal-content.tsx b/src/modals/supply/supply-modal-content.tsx index 34e0e5be..2fd8efbb 100644 --- a/src/modals/supply/supply-modal-content.tsx +++ b/src/modals/supply/supply-modal-content.tsx @@ -1,4 +1,4 @@ -import { useCallback } from 'react'; +import { useCallback, useState } from 'react'; import { IconSwitch } from '@/components/ui/icon-switch'; import { ReloadIcon } from '@radix-ui/react-icons'; import Input from '@/components/Input/Input'; @@ -10,6 +10,8 @@ import { isWrappedNativeToken } from '@/utils/tokens'; import type { Market } from '@/utils/types'; import { ExecuteTransactionButton } from '@/components/ui/ExecuteTransactionButton'; import { SupplyProcessModal } from './supply-process-modal'; +import { BridgeSwapModal } from '@/features/swap/components/BridgeSwapModal'; +import type { SwapToken } from '@/features/swap/types'; type SupplyModalContentProps = { market: Market; @@ -22,6 +24,7 @@ type SupplyModalContentProps = { export function SupplyModalContent({ onClose, market, refetch, onAmountChange }: SupplyModalContentProps): JSX.Element { const [usePermit2Setting] = useLocalStorage('usePermit2', true); + const [swapTarget, setSwapTarget] = useState(null); const onSuccess = useCallback(() => { onClose(); @@ -70,6 +73,13 @@ export function SupplyModalContent({ onClose, market, refetch, onAmountChange }: return ( <> + {swapTarget && ( + setSwapTarget(null)} + targetToken={swapTarget} + /> + )} {showProcessModal && (
Supply amount -
+

Balance:{' '} {useEth @@ -119,6 +129,22 @@ export function SupplyModalContent({ onClose, market, refetch, onAmountChange }: > + {((useEth && (ethBalance ?? BigInt(0)) === BigInt(0)) || (!useEth && (tokenBalance ?? BigInt(0)) === BigInt(0))) && ( + + )}

diff --git a/src/utils/tokens.ts b/src/utils/tokens.ts index 190dc433..4ba507e9 100644 --- a/src/utils/tokens.ts +++ b/src/utils/tokens.ts @@ -293,7 +293,10 @@ const supportedTokens = [ symbol: 'DAI', img: require('../imgs/tokens/dai.webp') as string, decimals: 18, - networks: [{ chain: mainnet, address: '0x6B175474E89094C44Da98b954EedeAC495271d0F' }], + networks: [ + { chain: mainnet, address: '0x6B175474E89094C44Da98b954EedeAC495271d0F' }, + { chain: base, address: '0x50c5725949a6f0c72e6c4a641f24049a917db0cb' }, + ], peg: TokenPeg.USD, }, {