diff --git a/apps/connect/package-lock.json b/apps/connect/package-lock.json index e04760c23..ef8250d1f 100644 --- a/apps/connect/package-lock.json +++ b/apps/connect/package-lock.json @@ -14,7 +14,9 @@ "@mui/icons-material": "^5.14.11", "@mui/material": "^5.12.1", "@tanstack/react-query": "^5.14.2", - "@wormhole-foundation/wormhole-connect": "^0.3.18", + "@wormhole-foundation/wormhole-connect": "^0.3.19-beta.7-development", + "aptos": "^1.21.0", + "bech32": "^2.0.0", "dompurify": "^3.0.6", "mixpanel-browser": "^2.53.0", "react": "^18.2.0", @@ -25,6 +27,7 @@ "@testing-library/dom": "^10.3.1", "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^16.0.0", + "@types/bs58": "^4.0.4", "@types/dompurify": "^3.0.5", "@types/jest": "^29.5.12", "@types/mixpanel-browser": "^2.49.0", @@ -2271,9 +2274,9 @@ "peer": true }, "node_modules/@babel/runtime": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", - "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2414,6 +2417,56 @@ "undici-types": "~5.26.4" } }, + "node_modules/@certusone/wormhole-sdk/node_modules/@noble/hashes": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.3.tgz", + "integrity": "sha512-CE0FCR57H2acVI5UOzIGSSIYxZ6v/HOhDR0Ro9VLyhnzLwx0o8W1mmgaqlEUx4049qJDlIBRztv5k+MM8vbO3A==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@certusone/wormhole-sdk/node_modules/@scure/bip39": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz", + "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.1.1", + "@scure/base": "~1.1.0" + } + }, + "node_modules/@certusone/wormhole-sdk/node_modules/aptos": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/aptos/-/aptos-1.5.0.tgz", + "integrity": "sha512-N7OuRtU7IYHkDkNx+4QS3g/QQGCp+36KzYn3oXPmT7Kttfuv+UKliQVdjy3cLmwd/DCQSh9ObTovwdxnHjUn0g==", + "dependencies": { + "@noble/hashes": "1.1.3", + "@scure/bip39": "1.1.0", + "axios": "0.27.2", + "form-data": "4.0.0", + "tweetnacl": "1.0.3" + }, + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/@certusone/wormhole-sdk/node_modules/aptos/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, "node_modules/@classic-terra/terra.proto": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@classic-terra/terra.proto/-/terra.proto-1.1.0.tgz", @@ -8646,9 +8699,9 @@ } }, "node_modules/@noble/curves": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", - "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dependencies": { "@noble/hashes": "1.4.0" }, @@ -10519,47 +10572,96 @@ "node": ">= 10" } }, + "node_modules/@solana/codecs": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-preview.2.tgz", + "integrity": "sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-data-structures": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2", + "@solana/codecs-strings": "2.0.0-preview.2", + "@solana/options": "2.0.0-preview.2" + } + }, "node_modules/@solana/codecs-core": { - "version": "2.0.0-experimental.8618508", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-experimental.8618508.tgz", - "integrity": "sha512-JCz7mKjVKtfZxkuDtwMAUgA7YvJcA2BwpZaA1NOLcted4OMC4Prwa3DUe3f3181ixPYaRyptbF0Ikq2MbDkYEA==" + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-preview.2.tgz", + "integrity": "sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==", + "dependencies": { + "@solana/errors": "2.0.0-preview.2" + } }, "node_modules/@solana/codecs-data-structures": { - "version": "2.0.0-experimental.8618508", - "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-experimental.8618508.tgz", - "integrity": "sha512-sLpjL9sqzaDdkloBPV61Rht1tgaKq98BCtIKRuyscIrmVPu3wu0Bavk2n/QekmUzaTsj7K1pVSniM0YqCdnEBw==", + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-preview.2.tgz", + "integrity": "sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg==", "dependencies": { - "@solana/codecs-core": "2.0.0-experimental.8618508", - "@solana/codecs-numbers": "2.0.0-experimental.8618508" + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2", + "@solana/errors": "2.0.0-preview.2" } }, "node_modules/@solana/codecs-numbers": { - "version": "2.0.0-experimental.8618508", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-experimental.8618508.tgz", - "integrity": "sha512-EXQKfzFr3CkKKNzKSZPOOOzchXsFe90TVONWsSnVkonO9z+nGKALE0/L9uBmIFGgdzhhU9QQVFvxBMclIDJo2Q==", + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-preview.2.tgz", + "integrity": "sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw==", "dependencies": { - "@solana/codecs-core": "2.0.0-experimental.8618508" + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/errors": "2.0.0-preview.2" } }, "node_modules/@solana/codecs-strings": { - "version": "2.0.0-experimental.8618508", - "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-experimental.8618508.tgz", - "integrity": "sha512-b2yhinr1+oe+JDmnnsV0641KQqqDG8AQ16Z/x7GVWO+AWHMpRlHWVXOq8U1yhPMA4VXxl7i+D+C6ql0VGFp0GA==", + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-preview.2.tgz", + "integrity": "sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g==", "dependencies": { - "@solana/codecs-core": "2.0.0-experimental.8618508", - "@solana/codecs-numbers": "2.0.0-experimental.8618508" + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2", + "@solana/errors": "2.0.0-preview.2" }, "peerDependencies": { "fastestsmallesttextencoderdecoder": "^1.0.22" } }, + "node_modules/@solana/errors": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-preview.2.tgz", + "integrity": "sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==", + "dependencies": { + "chalk": "^5.3.0", + "commander": "^12.0.0" + }, + "bin": { + "errors": "bin/cli.js" + } + }, + "node_modules/@solana/errors/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@solana/errors/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "engines": { + "node": ">=18" + } + }, "node_modules/@solana/options": { - "version": "2.0.0-experimental.8618508", - "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-experimental.8618508.tgz", - "integrity": "sha512-fy/nIRAMC3QHvnKi63KEd86Xr/zFBVxNW4nEpVEU2OT0gCEKwHY4Z55YHf7XujhyuM3PNpiBKg/YYw5QlRU4vg==", + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-preview.2.tgz", + "integrity": "sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w==", "dependencies": { - "@solana/codecs-core": "2.0.0-experimental.8618508", - "@solana/codecs-numbers": "2.0.0-experimental.8618508" + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2" } }, "node_modules/@solana/spl-token": { @@ -10580,22 +10682,18 @@ } }, "node_modules/@solana/spl-token-metadata": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.2.tgz", - "integrity": "sha512-hJYnAJNkDrtkE2Q41YZhCpeOGU/0JgRFXbtrtOuGGeKc3pkEUHB9DDoxZAxx+XRno13GozUleyBi0qypz4c3bw==", - "dependencies": { - "@solana/codecs-core": "2.0.0-experimental.8618508", - "@solana/codecs-data-structures": "2.0.0-experimental.8618508", - "@solana/codecs-numbers": "2.0.0-experimental.8618508", - "@solana/codecs-strings": "2.0.0-experimental.8618508", - "@solana/options": "2.0.0-experimental.8618508", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.4.tgz", + "integrity": "sha512-N3gZ8DlW6NWDV28+vCCDJoTqaCZiF/jDUnk3o8GRkAFzHObiR60Bs1gXHBa8zCPdvOwiG6Z3dg5pg7+RW6XNsQ==", + "dependencies": { + "@solana/codecs": "2.0.0-preview.2", "@solana/spl-type-length-value": "0.1.0" }, "engines": { "node": ">=16" }, "peerDependencies": { - "@solana/web3.js": "^1.87.6" + "@solana/web3.js": "^1.91.6" } }, "node_modules/@solana/spl-type-length-value": { @@ -11731,6 +11829,14 @@ "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", "dev": true }, + "node_modules/@swc/helpers": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.12.tgz", + "integrity": "sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@swc/types": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.6.tgz", @@ -12837,6 +12943,16 @@ "@types/node": "*" } }, + "node_modules/@types/bs58": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/bs58/-/bs58-4.0.4.tgz", + "integrity": "sha512-0IEpMFXXQi2zXaXl9GJ3sRwQo0uEkD+yFOv+FnAU5lkPtcu6h61xb7jc2CFPEZ5BUOaiP13ThuGc9HD4R8lR5g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "base-x": "^3.0.6" + } + }, "node_modules/@types/cacheable-request": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", @@ -12869,6 +12985,11 @@ "@types/ms": "*" } }, + "node_modules/@types/dom-webcodecs": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.11.tgz", + "integrity": "sha512-yPEZ3z7EohrmOxbk/QTAa0yonMFkNkjnVXqbGb7D4rMr+F1dGQ8ZUFxXkyLLJuiICPejZ0AZE9Rrk9wUCczx4A==" + }, "node_modules/@types/dompurify": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz", @@ -12878,6 +12999,11 @@ "@types/trusted-types": "*" } }, + "node_modules/@types/emscripten": { + "version": "1.39.13", + "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.13.tgz", + "integrity": "sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==" + }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -15167,50 +15293,6 @@ "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-aptos/node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@wormhole-foundation/sdk-aptos/node_modules/@scure/bip39": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", - "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", - "dependencies": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@wormhole-foundation/sdk-aptos/node_modules/aptos": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/aptos/-/aptos-1.21.0.tgz", - "integrity": "sha512-PRKjoFgL8tVEc9+oS7eJUv8GNxx8n3+0byH2+m7CP3raYOD6yFKOecuwjVMIJmgfpjp6xH0P0HDMGZAXmSyU0Q==", - "dependencies": { - "@aptos-labs/aptos-client": "^0.1.0", - "@noble/hashes": "1.3.3", - "@scure/bip39": "1.2.1", - "eventemitter3": "^5.0.1", - "form-data": "4.0.0", - "tweetnacl": "1.0.3" - }, - "engines": { - "node": ">=11.0.0" - } - }, - "node_modules/@wormhole-foundation/sdk-aptos/node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" - }, "node_modules/@wormhole-foundation/sdk-base": { "version": "0.7.0-beta.5", "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.7.0-beta.5.tgz", @@ -17362,9 +17444,9 @@ } }, "node_modules/@wormhole-foundation/wormhole-connect": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/wormhole-connect/-/wormhole-connect-0.3.18.tgz", - "integrity": "sha512-twvpVYDySNCHb02EWKoY0zDDqtkyM4+AbnOAV1P/ezsJBsHrrRoXqp+4ZYgiB7ZtxXDPSwkFAdVJR3K+hdUm9Q==", + "version": "0.3.19-beta.7-development", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/wormhole-connect/-/wormhole-connect-0.3.19-beta.7-development.tgz", + "integrity": "sha512-lCbA3hYbtG5gEWjE7i0Xuoy/Vq/E0m50/9J8m+c5nlsW8+n6CvN/ilj1CnxWgXycXJJaLfhJlNS8owMCkB2a+g==", "dependencies": { "@certusone/wormhole-sdk": "^0.10.10", "@coral-xyz/anchor": "^0.29.0", @@ -17385,6 +17467,7 @@ "@mui/material": "^5.11.4", "@mysten/sui.js": "^0.32.2", "@reduxjs/toolkit": "^1.9.1", + "@solana/spl-token": "^0.4.6", "@solana/wallet-adapter-wallets": "^0.19.25", "@solana/web3.js": "^1.73.0", "@wormhole-foundation/sdk": "^0.7.0-beta.3", @@ -17399,6 +17482,7 @@ "@xlabs-libs/wallet-aggregator-sei": "^0.0.1-alpha.14", "@xlabs-libs/wallet-aggregator-solana": "^0.0.1-alpha.15", "@xlabs-libs/wallet-aggregator-sui": "^0.0.1-alpha.10", + "@yudiel/react-qr-scanner": "^2.0.4", "aptos": "1.5.0", "axios": "^1.2.4", "cosmjs-types": "^0.9.0", @@ -17593,6 +17677,225 @@ "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.10.2.tgz", "integrity": "sha512-iMfEJPWaan8QaZw87WMUnFFRJqveE3FpU2ObTE0ydTJLPJNOUJjjurGBklqdWM/j5BIQvpi3byGKFChfNg8CaQ==" }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/@noble/hashes": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.3.tgz", + "integrity": "sha512-CE0FCR57H2acVI5UOzIGSSIYxZ6v/HOhDR0Ro9VLyhnzLwx0o8W1mmgaqlEUx4049qJDlIBRztv5k+MM8vbO3A==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/@scure/bip39": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz", + "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.1.1", + "@scure/base": "~1.1.0" + } + }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/@solana/codecs": { + "version": "2.0.0-preview.4", + "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-preview.4.tgz", + "integrity": "sha512-gLMupqI4i+G4uPi2SGF/Tc1aXcviZF2ybC81x7Q/fARamNSgNOCUUoSCg9nWu1Gid6+UhA7LH80sWI8XjKaRog==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.4", + "@solana/codecs-data-structures": "2.0.0-preview.4", + "@solana/codecs-numbers": "2.0.0-preview.4", + "@solana/codecs-strings": "2.0.0-preview.4", + "@solana/options": "2.0.0-preview.4" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/@solana/codecs-core": { + "version": "2.0.0-preview.4", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-preview.4.tgz", + "integrity": "sha512-A0VVuDDA5kNKZUinOqHxJQK32aKTucaVbvn31YenGzHX1gPqq+SOnFwgaEY6pq4XEopSmaK16w938ZQS8IvCnw==", + "dependencies": { + "@solana/errors": "2.0.0-preview.4" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/@solana/codecs-data-structures": { + "version": "2.0.0-preview.4", + "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-preview.4.tgz", + "integrity": "sha512-nt2k2eTeyzlI/ccutPcG36M/J8NAYfxBPI9h/nQjgJ+M+IgOKi31JV8StDDlG/1XvY0zyqugV3I0r3KAbZRJpA==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.4", + "@solana/codecs-numbers": "2.0.0-preview.4", + "@solana/errors": "2.0.0-preview.4" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/@solana/codecs-numbers": { + "version": "2.0.0-preview.4", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-preview.4.tgz", + "integrity": "sha512-Q061rLtMadsO7uxpguT+Z7G4UHnjQ6moVIxAQxR58nLxDPCC7MB1Pk106/Z7NDhDLHTcd18uO6DZ7ajHZEn2XQ==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.4", + "@solana/errors": "2.0.0-preview.4" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/@solana/codecs-strings": { + "version": "2.0.0-preview.4", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-preview.4.tgz", + "integrity": "sha512-YDbsQePRWm+xnrfS64losSGRg8Wb76cjK1K6qfR8LPmdwIC3787x9uW5/E4icl/k+9nwgbIRXZ65lpF+ucZUnw==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.4", + "@solana/codecs-numbers": "2.0.0-preview.4", + "@solana/errors": "2.0.0-preview.4" + }, + "peerDependencies": { + "fastestsmallesttextencoderdecoder": "^1.0.22", + "typescript": ">=5" + } + }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/@solana/errors": { + "version": "2.0.0-preview.4", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-preview.4.tgz", + "integrity": "sha512-kadtlbRv2LCWr8A9V22On15Us7Nn8BvqNaOB4hXsTB3O0fU40D1ru2l+cReqLcRPij4znqlRzW9Xi0m6J5DIhA==", + "dependencies": { + "chalk": "^5.3.0", + "commander": "^12.1.0" + }, + "bin": { + "errors": "bin/cli.mjs" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/@solana/options": { + "version": "2.0.0-preview.4", + "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-preview.4.tgz", + "integrity": "sha512-tv2O/Frxql/wSe3jbzi5nVicIWIus/BftH+5ZR+r9r3FO0/htEllZS5Q9XdbmSboHu+St87584JXeDx3xm4jaA==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.4", + "@solana/codecs-data-structures": "2.0.0-preview.4", + "@solana/codecs-numbers": "2.0.0-preview.4", + "@solana/codecs-strings": "2.0.0-preview.4", + "@solana/errors": "2.0.0-preview.4" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/@solana/spl-token": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.8.tgz", + "integrity": "sha512-RO0JD9vPRi4LsAbMUdNbDJ5/cv2z11MGhtAvFeRzT4+hAGE/FUzRi0tkkWtuCfSIU3twC6CtmAihRp/+XXjWsA==", + "dependencies": { + "@solana/buffer-layout": "^4.0.0", + "@solana/buffer-layout-utils": "^0.2.0", + "@solana/spl-token-group": "^0.0.5", + "@solana/spl-token-metadata": "^0.1.3", + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.94.0" + } + }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/@solana/spl-token-group": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.5.tgz", + "integrity": "sha512-CLJnWEcdoUBpQJfx9WEbX3h6nTdNiUzswfFdkABUik7HVwSNA98u5AYvBVK2H93d9PGMOHAak2lHW9xr+zAJGQ==", + "dependencies": { + "@solana/codecs": "2.0.0-preview.4", + "@solana/spl-type-length-value": "0.1.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.94.0" + } + }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/@solana/web3.js": { + "version": "1.95.2", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.95.2.tgz", + "integrity": "sha512-SjlHp0G4qhuhkQQc+YXdGkI8EerCqwxvgytMgBpzMUQTafrkNant3e7pgilBGgjy/iM40ICvWBLgASTPMrQU7w==", + "dependencies": { + "@babel/runtime": "^7.24.8", + "@noble/curves": "^1.4.2", + "@noble/hashes": "^1.4.0", + "@solana/buffer-layout": "^4.0.1", + "agentkeepalive": "^4.5.0", + "bigint-buffer": "^1.1.5", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.1", + "node-fetch": "^2.7.0", + "rpc-websockets": "^9.0.2", + "superstruct": "^2.0.2" + } + }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/@solana/web3.js/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/@types/ws": { + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/aptos": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/aptos/-/aptos-1.5.0.tgz", + "integrity": "sha512-N7OuRtU7IYHkDkNx+4QS3g/QQGCp+36KzYn3oXPmT7Kttfuv+UKliQVdjy3cLmwd/DCQSh9ObTovwdxnHjUn0g==", + "dependencies": { + "@noble/hashes": "1.1.3", + "@scure/bip39": "1.1.0", + "axios": "0.27.2", + "form-data": "4.0.0", + "tweetnacl": "1.0.3" + }, + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/aptos/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, "node_modules/@wormhole-foundation/wormhole-connect/node_modules/axios": { "version": "1.6.8", "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", @@ -17608,11 +17911,35 @@ "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "engines": { + "node": ">=18" + } + }, "node_modules/@wormhole-foundation/wormhole-connect/node_modules/cosmjs-types": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz", "integrity": "sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==" }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, "node_modules/@wormhole-foundation/wormhole-connect/node_modules/protobufjs": { "version": "6.11.4", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", @@ -17638,6 +17965,56 @@ "pbts": "bin/pbts" } }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/rpc-websockets": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-9.0.2.tgz", + "integrity": "sha512-YzggvfItxMY3Lwuax5rC18inhbjJv9Py7JXRHxTIi94JOLrqBsSsUUc5bbl5W6c11tXhdfpDPK0KzBhoGe8jjw==", + "dependencies": { + "@swc/helpers": "^0.5.11", + "@types/uuid": "^8.3.4", + "@types/ws": "^8.2.2", + "buffer": "^6.0.3", + "eventemitter3": "^5.0.1", + "uuid": "^8.3.2", + "ws": "^8.5.0" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/kozjak" + }, + "optionalDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + } + }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/rpc-websockets/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@wormhole-foundation/wormhole-connect/node_modules/superstruct": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", + "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@wry/caches": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@wry/caches/-/caches-1.0.1.tgz", @@ -17948,6 +18325,36 @@ "resolved": "https://registry.npmjs.org/@xstate/fsm/-/fsm-1.6.5.tgz", "integrity": "sha512-b5o1I6aLNeYlU/3CPlj/Z91ybk1gUsKT+5NAJI+2W4UjvS5KLG28K9v5UvNoFVjHV8PajVZ00RH3vnjyQO7ZAw==" }, + "node_modules/@yudiel/react-qr-scanner": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@yudiel/react-qr-scanner/-/react-qr-scanner-2.0.4.tgz", + "integrity": "sha512-ZVSyT6F2S8mdURUCy2Oz9/khZ3DfzsbU8OO5lXYzLzJLVwfhLX+jo2Gd80FyBMqBxM0fbwNNvAawTajcJ3hb8w==", + "dependencies": { + "barcode-detector": "^2.2.7", + "webrtc-adapter": "9.0.1" + }, + "peerDependencies": { + "react": "^17 || ^18", + "react-dom": "^17 || ^18" + } + }, + "node_modules/@yudiel/react-qr-scanner/node_modules/sdp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/sdp/-/sdp-3.2.0.tgz", + "integrity": "sha512-d7wDPgDV3DDiqulJjKiV2865wKsJ34YI+NDREbm+FySq6WuKOikwyNQcm+doLAZ1O6ltdO0SeKle2xMpN3Brgw==" + }, + "node_modules/@yudiel/react-qr-scanner/node_modules/webrtc-adapter": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/webrtc-adapter/-/webrtc-adapter-9.0.1.tgz", + "integrity": "sha512-1AQO+d4ElfVSXyzNVTOewgGT/tAomwwztX/6e3totvyyzXPvXIIuUUjAmyZGbKBKbZOXauuJooZm3g6IuFuiNQ==", + "dependencies": { + "sdp": "^3.2.0" + }, + "engines": { + "node": ">=6.0.0", + "npm": ">=3.10.0" + } + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -18189,13 +18596,14 @@ "peer": true }, "node_modules/aptos": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/aptos/-/aptos-1.5.0.tgz", - "integrity": "sha512-N7OuRtU7IYHkDkNx+4QS3g/QQGCp+36KzYn3oXPmT7Kttfuv+UKliQVdjy3cLmwd/DCQSh9ObTovwdxnHjUn0g==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/aptos/-/aptos-1.21.0.tgz", + "integrity": "sha512-PRKjoFgL8tVEc9+oS7eJUv8GNxx8n3+0byH2+m7CP3raYOD6yFKOecuwjVMIJmgfpjp6xH0P0HDMGZAXmSyU0Q==", "dependencies": { - "@noble/hashes": "1.1.3", - "@scure/bip39": "1.1.0", - "axios": "0.27.2", + "@aptos-labs/aptos-client": "^0.1.0", + "@noble/hashes": "1.3.3", + "@scure/bip39": "1.2.1", + "eventemitter3": "^5.0.1", "form-data": "4.0.0", "tweetnacl": "1.0.3" }, @@ -18204,39 +18612,32 @@ } }, "node_modules/aptos/node_modules/@noble/hashes": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.3.tgz", - "integrity": "sha512-CE0FCR57H2acVI5UOzIGSSIYxZ6v/HOhDR0Ro9VLyhnzLwx0o8W1mmgaqlEUx4049qJDlIBRztv5k+MM8vbO3A==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } }, "node_modules/aptos/node_modules/@scure/bip39": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz", - "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", + "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", "dependencies": { - "@noble/hashes": "~1.1.1", + "@noble/hashes": "~1.3.0", "@scure/base": "~1.1.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/aptos/node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } + "node_modules/aptos/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, "node_modules/arg": { "version": "5.0.2", @@ -18838,6 +19239,15 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/barcode-detector": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/barcode-detector/-/barcode-detector-2.2.7.tgz", + "integrity": "sha512-+6PJNcMtdVehX5i2LQUE9L+mS6C3cG00Vsuc4Ynj3Mls5GNKIAFkE0IFGtw4s6vu8SXeogrzTj4btm44oD+gNw==", + "dependencies": { + "@types/dom-webcodecs": "^0.1.11", + "zxing-wasm": "1.2.11" + } + }, "node_modules/base-x": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", @@ -24619,9 +25029,9 @@ } }, "node_modules/jayson": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.0.tgz", - "integrity": "sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.1.tgz", + "integrity": "sha512-5ZWm4Q/0DHPyeMfAsrwViwUS2DMVsQgWh8bEEIVTkfb3DzHZ2L3G5WUnF+AKmGjjM9r1uAv73SaqC1/U4RL45w==", "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", @@ -24634,7 +25044,7 @@ "json-stringify-safe": "^5.0.1", "JSONStream": "^1.3.5", "uuid": "^8.3.2", - "ws": "^7.4.5" + "ws": "^7.5.10" }, "bin": { "jayson": "bin/jayson.js" @@ -24653,6 +25063,26 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "node_modules/jayson/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", @@ -33483,6 +33913,14 @@ "optional": true } } + }, + "node_modules/zxing-wasm": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/zxing-wasm/-/zxing-wasm-1.2.11.tgz", + "integrity": "sha512-rNSMkIU310sK5cCPSjZA58FEhGZUtNx+f0CmtZ3SZzpdwZE6IzzKFdkbFkl8CFnxiUrx1VMVl/2WULDnwwJbfg==", + "dependencies": { + "@types/emscripten": "^1.39.13" + } } } } diff --git a/apps/connect/package.json b/apps/connect/package.json index 8779d2940..b2d065590 100644 --- a/apps/connect/package.json +++ b/apps/connect/package.json @@ -30,7 +30,9 @@ "@mui/icons-material": "^5.14.11", "@mui/material": "^5.12.1", "@tanstack/react-query": "^5.14.2", - "@wormhole-foundation/wormhole-connect": "^0.3.18", + "@wormhole-foundation/wormhole-connect": "^0.3.19-beta.7-development", + "aptos": "^1.21.0", + "bech32": "^2.0.0", "dompurify": "^3.0.6", "mixpanel-browser": "^2.53.0", "react": "^18.2.0", @@ -41,6 +43,7 @@ "@testing-library/dom": "^10.3.1", "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^16.0.0", + "@types/bs58": "^4.0.4", "@types/dompurify": "^3.0.5", "@types/jest": "^29.5.12", "@types/mixpanel-browser": "^2.49.0", diff --git a/apps/connect/src/App.tsx b/apps/connect/src/App.tsx index bb6eae302..6cd7ff58c 100644 --- a/apps/connect/src/App.tsx +++ b/apps/connect/src/App.tsx @@ -14,7 +14,8 @@ import { PrivacyPolicyPath, isPreview, isProduction } from "./utils/constants"; import Banner from "./components/atoms/Banner"; import { ENV } from "@env"; import { clearUrl, pushResumeUrl } from "./navs/navs"; -import { validateTransferHandler } from "./providers/sanctions"; +import { validateTransfer } from "./utils/transferVerification"; +//import { validateTransferHandler } from "./providers/sanctions"; // TO DO: Use this function const defaultConfig: WormholeConnectConfig = { ...ENV.wormholeConnectConfig, @@ -29,6 +30,8 @@ const defaultConfig: WormholeConnectConfig = { // Clear the URL when a transfer is successful clearUrl(e); }, + // validateTransfer + validateTransferHandler: validateTransfer, isRouteSupportedHandler: async (td: any) => { // Disable manual NTT for Lido wstETH if ( @@ -52,7 +55,7 @@ export default function Root() { const config: ComponentProps["config"] = useMemo( () => ({ ...defaultConfig, - validateTransferHandler, + //validateTransferHandler, searchTx: { ...(txHash && { txHash }), ...(sourceChain && { chainName: sourceChain }), diff --git a/apps/connect/src/env/common.ts b/apps/connect/src/env/common.ts index b94cda1f3..ae0463cf8 100644 --- a/apps/connect/src/env/common.ts +++ b/apps/connect/src/env/common.ts @@ -47,16 +47,16 @@ export const versions: Env["versions"] = [ version: `v${packageJson.dependencies["@wormhole-foundation/wormhole-connect"]}`, }, ]; - +export const CLUSTER = envVars.VITE_APP_CLUSTER || "testnet"; export const wormholeConnectConfigCommon: Partial = { walletConnectProjectId: envVars.VITE_APP_WALLET_CONNECT_PROJECT_ID || "", - - env: envVars.VITE_APP_CLUSTER || "testnet", + env: CLUSTER, rpcs: {}, showHamburgerMenu: false, explorer: { - href: `https://wormholescan.io/#/txs?address={:address}&network=${envVars.VITE_APP_CLUSTER || "testnet"}`, + href: `https://wormholescan.io/#/txs?address={:address}&network=${CLUSTER}`, }, + manualTargetAddress: true, menu: [ { label: "Advanced Tools", diff --git a/apps/connect/src/env/token-bridge.mainnet.ts b/apps/connect/src/env/token-bridge.mainnet.ts index f377c8243..b2cb9fbd2 100644 --- a/apps/connect/src/env/token-bridge.mainnet.ts +++ b/apps/connect/src/env/token-bridge.mainnet.ts @@ -13,9 +13,9 @@ export const ENV: Env = { networks: [ALGORAND, ACALA, SEI, MORE], } as WormholeConnectConfig["moreNetworks"], tokensConfig: { - WIF: { - key: "WIF", - symbol: "WIF", + $WIF: { + key: "$WIF", + symbol: "$WIF", nativeChain: "solana", tokenId: { chain: "solana", diff --git a/apps/connect/src/hooks/useQueryParams.ts b/apps/connect/src/hooks/useQueryParams.ts index d6d6f063c..fa6b9f096 100644 --- a/apps/connect/src/hooks/useQueryParams.ts +++ b/apps/connect/src/hooks/useQueryParams.ts @@ -1,4 +1,5 @@ -import { ChainName, coalesceChainName, isChain } from "@certusone/wormhole-sdk"; +import { coalesceChainName, isChain } from "@certusone/wormhole-sdk"; +import { ChainName } from "@wormhole-foundation/wormhole-connect"; import { useMemo } from "react"; const getChainValue = ( @@ -8,12 +9,12 @@ const getChainValue = ( const sourceChain = query.get(key); if (sourceChain) { if (isChain(sourceChain)) { - return coalesceChainName(sourceChain); + return coalesceChainName(sourceChain) as ChainName; } const chainId = Number(sourceChain); if (isChain(chainId)) { - return coalesceChainName(chainId); + return coalesceChainName(chainId) as ChainName; } } return null; diff --git a/apps/connect/src/providers/sanctions.test.ts b/apps/connect/src/providers/sanctions.test.ts index 8df96fc90..9bc92f53a 100644 --- a/apps/connect/src/providers/sanctions.test.ts +++ b/apps/connect/src/providers/sanctions.test.ts @@ -4,18 +4,19 @@ import { RISK_LEVEL_SANCTION, SanctionResponse, TRM_URL, - validateTransferHandler, + getTrmChainName, + isSanctionedAddress, } from "./sanctions"; describe("sanctions", () => { - let transferDetails: Parameters[0]; + let transferDetails: Parameters[0]; let validResponse: SanctionResponse; beforeEach(() => { global.fetch = jest.fn().mockResolvedValue({ json: jest.fn() }); transferDetails = { - fromChain: "fromChain", + fromChain: "ethereum", fromWalletAddress: "fromWalletAddress", - toChain: "toChain", + toChain: "avalanche", toWalletAddress: "toWalletAddress", } as any; validResponse = { @@ -33,9 +34,7 @@ describe("sanctions", () => { global.fetch = jest.fn().mockResolvedValue({ json: jest.fn().mockResolvedValue([validResponse]), }); - expect(await validateTransferHandler(transferDetails)).toEqual({ - isValid: true, - }); + expect(await isSanctionedAddress(transferDetails)).toEqual(false); expect(global.fetch).toHaveBeenNthCalledWith( 1, TRM_URL, @@ -43,7 +42,7 @@ describe("sanctions", () => { body: JSON.stringify([ { address: transferDetails.fromWalletAddress, - chain: transferDetails.fromChain, + chain: getTrmChainName(transferDetails.fromChain), accountExternalId: ACCOUNT_ID, }, ]), @@ -56,7 +55,7 @@ describe("sanctions", () => { body: JSON.stringify([ { address: transferDetails.toWalletAddress, - chain: transferDetails.toChain, + chain: getTrmChainName(transferDetails.toChain), accountExternalId: ACCOUNT_ID, }, ]), @@ -67,9 +66,7 @@ describe("sanctions", () => { it("should be valid when api fails", async () => { console.error = jest.fn(); global.fetch = jest.fn().mockRejectedValue({}); - expect(await validateTransferHandler(transferDetails)).toEqual({ - isValid: true, - }); + expect(await isSanctionedAddress(transferDetails)).toEqual(false); }); it("should be valid when api returns unexpected data", async () => { @@ -78,9 +75,7 @@ describe("sanctions", () => { json: jest.fn().mockResolvedValue({ random: true }), }); - expect(await validateTransferHandler(transferDetails)).toEqual({ - isValid: true, - }); + expect(await isSanctionedAddress(transferDetails)).toEqual(false); }); it("should NOT be valid when one address is NOT valid because of the address risk level", async () => { @@ -101,9 +96,7 @@ describe("sanctions", () => { ]); global.fetch = jest.fn().mockResolvedValue({ json }); - expect(await validateTransferHandler(transferDetails)).toEqual({ - isValid: false, - }); + expect(await isSanctionedAddress(transferDetails)).toEqual(true); }); it("should NOT be valid when one address is NOT valid because of the entity risk level", async () => { @@ -121,8 +114,6 @@ describe("sanctions", () => { ]); global.fetch = jest.fn().mockResolvedValue({ json }); - expect(await validateTransferHandler(transferDetails)).toEqual({ - isValid: false, - }); + expect(await isSanctionedAddress(transferDetails)).toEqual(true); }); }); diff --git a/apps/connect/src/providers/sanctions.ts b/apps/connect/src/providers/sanctions.ts index 2d8ae4c9c..0aa6ba31f 100644 --- a/apps/connect/src/providers/sanctions.ts +++ b/apps/connect/src/providers/sanctions.ts @@ -1,4 +1,21 @@ -import { WormholeConnectConfig } from "@wormhole-foundation/wormhole-connect"; +import { + CHAIN_ID_ALGORAND, + CHAIN_ID_ARBITRUM, + CHAIN_ID_AVAX, + CHAIN_ID_BSC, + CHAIN_ID_BTC, + CHAIN_ID_CELO, + CHAIN_ID_OPTIMISM, + CHAIN_ID_POLYGON, + CHAIN_ID_SOLANA, + CHAIN_ID_KLAYTN, + ChainId, + isEVMChain, + ChainName, + toChainId, + isCosmWasmChain, +} from "@certusone/wormhole-sdk"; +import { ExtendedTransferDetails } from "node_modules/@wormhole-foundation/wormhole-connect/lib/src/config/types"; export interface SanctionResponse { addressRiskIndicators: { categoryRiskScoreLevel: number; riskType: string }[]; @@ -11,6 +28,29 @@ export const ACCOUNT_ID = "PortalBridge"; export const RISK_LEVEL_SANCTION: number = 10; export const RISK_ADDRESS_INDICATOR_TYPE = "OWNERSHIP"; +// TRM screening chain names map with wormhole chain ids +// https://documentation.trmlabs.com/tag/Supported-Blockchain-List +export const getTrmChainName = (chain: ChainName | ChainId) => { + const id = toChainId(chain as ChainName); + const trmChainNames: any = { + [CHAIN_ID_ALGORAND]: "algorand", + [CHAIN_ID_ARBITRUM]: "arbitrum", + [CHAIN_ID_AVAX]: "avalanche_c_chain", + [CHAIN_ID_BSC]: "binance_smart_chain", + [CHAIN_ID_BTC]: "bitcoin", + [CHAIN_ID_CELO]: "celo", + [CHAIN_ID_KLAYTN]: "klaytn", + [CHAIN_ID_OPTIMISM]: "optimism", + [CHAIN_ID_POLYGON]: "polygon", + [CHAIN_ID_SOLANA]: "solana", + }; + + if (trmChainNames[id]) return trmChainNames[id]; + if (isCosmWasmChain(id)) return "cosmos"; + if (isEVMChain(id)) return "ethereum"; + + return ""; +}; const isSanctioned = async ({ chain, address, @@ -41,19 +81,29 @@ const isSanctioned = async ({ } }; -export const validateTransferHandler: NonNullable< - WormholeConnectConfig["validateTransferHandler"] -> = async (transferDetails) => { - const [isOriginSanctioned, isTargetSanctioned] = await Promise.all([ - isSanctioned({ - chain: transferDetails.fromChain, - address: transferDetails.fromWalletAddress, - }), - isSanctioned({ - chain: transferDetails.toChain, - address: transferDetails.toWalletAddress, - }), - ]); - - return { isValid: !isOriginSanctioned && !isTargetSanctioned }; +export const isSanctionedAddress = async ( + transferDetails: ExtendedTransferDetails +) => { + const [isOriginSanctioned, isTargetSanctioned, isTargetSanctionedEth] = + await Promise.all([ + isSanctioned({ + chain: getTrmChainName(transferDetails.fromChain as ChainName), + address: transferDetails.fromWalletAddress, + }), + isSanctioned({ + chain: getTrmChainName(transferDetails.toChain as ChainName), + address: transferDetails.toWalletAddress, + }), + ...(transferDetails.toChain !== "ethereum" && + isEVMChain(transferDetails.toChain) + ? [ + isSanctioned({ + chain: "ethereum", + address: transferDetails.toWalletAddress, + }), + ] + : []), + ]); + + return isOriginSanctioned || isTargetSanctioned || isTargetSanctionedEth; }; diff --git a/apps/connect/src/providers/telemetry.ts b/apps/connect/src/providers/telemetry.ts index 015434cb5..8d0ec945a 100644 --- a/apps/connect/src/providers/telemetry.ts +++ b/apps/connect/src/providers/telemetry.ts @@ -74,6 +74,7 @@ export const eventHandler = (e: WormholeConnectEvent) => { toTokenAddress: getTokenAddress(e.details.toToken), txId: e.details.txId, USDAmount: e.details.USDAmount, + amount: e.details.amount, route: { bridge: "Manual Bridge", diff --git a/apps/connect/src/utils/transferVerification.ts b/apps/connect/src/utils/transferVerification.ts new file mode 100644 index 000000000..9557775bd --- /dev/null +++ b/apps/connect/src/utils/transferVerification.ts @@ -0,0 +1,35 @@ +import { + ExtendedTransferDetails, + ValidateTransferResult, +} from "node_modules/@wormhole-foundation/wormhole-connect/lib/src/config/types"; +import { ChainName } from "@certusone/wormhole-sdk"; +import { isValidAddress } from "./validAddress"; +import { isSanctionedAddress } from "../../src/providers/sanctions"; + +export const validateTransfer = async ( + tx: ExtendedTransferDetails +): Promise => { + tx.toChain; + tx.toWalletAddress; + tx.route; + try { + // Check OFAC (sanctioned) + const isSanctioned = await isSanctionedAddress(tx); + if (isSanctioned) { + return { isValid: false, error: "Sanctioned target address" }; + } + } catch (error) { + console.error(error); + } + + // Correct Address Validation (based on chain selected) + const isValid = await isValidAddress( + tx.toWalletAddress, + tx.toChain as ChainName + ); + if (!isValid) { + return { isValid: false, error: "Not valid target address" }; + } + + return { isValid: true }; +}; diff --git a/apps/connect/src/utils/validAddress.ts b/apps/connect/src/utils/validAddress.ts new file mode 100644 index 000000000..bf9886ab3 --- /dev/null +++ b/apps/connect/src/utils/validAddress.ts @@ -0,0 +1,105 @@ +import base58 from "bs58"; +import * as ethers from "ethers"; +import { + ChainName, + isCosmWasmChain, + isEVMChain, +} from "@certusone/wormhole-sdk"; +import { AptosClient } from "aptos"; +import { bech32 } from "bech32"; + +export const isValidAddress = async ( + address: string, + chain: ChainName +): Promise => { + if (isEVMChain(chain)) { + return isValidEthereumAddress(address); + } else if (chain === "solana") { + return isValidSolanaAddress(address); + } else if (chain === "aptos") { + return isValidAptosAddress(address); + } else if (chain === "sui") { + return isValidSuiAddress(address); + } else if (isCosmWasmChain(chain)) { + return isValidCosmosAddress(address, chain); + } + return false; +}; + +// Ethereum Validation +const getEthereumAddressWithChecksum = (address: string): string => { + return ethers.utils.getAddress(address); +}; +const isValidEthereumAddress = (address: string, strict = false): boolean => { + // We need to ensure the address contains the checksum + try { + const addressWithChecksum = getEthereumAddressWithChecksum(address); + if (strict) { + return address === addressWithChecksum; + } + return address.toLowerCase() === addressWithChecksum.toLocaleLowerCase(); + } catch (e) { + const typedError = e as { reason?: string }; + if ( + typedError.reason === "invalid address" || + typedError.reason === "bad address checksum" || + typedError.reason === "bad icap checksum" + ) { + return false; + } + } + return false; +}; + +// Solana Validation +const isValidSolanaAddress = (address: string): boolean => { + try { + const decoded = base58.decode(address); + return decoded.length === 32; + } catch (e) { + return false; + } +}; + +// Aptos Validation +const aptosClient = new AptosClient("https://api.mainnet.aptoslabs.com/v1"); +const isValidAptosAddress = async (address: string) => { + try { + return !!(await aptosClient.getAccount(address)); + } catch { + return false; + } +}; + +// Cosmos Validation +const isValidCosmosAddress = (address: string, chain: ChainName) => { + const PREFIXES: Record = { + osmosis: "osmo", + evmos: "evmos", + kujira: "kujira", + injective: "inj", + }; + if (chain === "evmos" && address.startsWith("0x")) { + // For Evmos hex address case https://docs.evmos.org/protocol/concepts/accounts#address-formats-for-clients + return isValidEthereumAddress(address); + } else { + // For Beach32 encode case https://docs.cosmos.network/v0.47/build/spec/addresses/bech32 + try { + const decoded = bech32.decode(address); + return PREFIXES[chain] === decoded.prefix && !!decoded.words?.length; + } catch { + return false; + } + } +}; + +// Sui Validation +const isHex = (value: string) => { + return /^(0x|0X)?[a-fA-F0-9]+$/.test(value) && value.length % 2 === 0; +}; +const getHexByteLength = (value: string) => { + return /^(0x|0X)/.test(value) ? (value.length - 2) / 2 : value.length / 2; +}; +const isValidSuiAddress = (address: string) => { + return isHex(address) && getHexByteLength(address) === 32; +};