diff --git a/package-lock.json b/package-lock.json index 46c9348..cc8658b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@cosmos-kit/react": "2.20.0", "@esbuild-plugins/node-globals-polyfill": "0.2.3", "@interchain-ui/react": "1.25.3", + "@provenanceio/walletconnect-js": "3.10.2", "@provlabs/provenancejs": "0.0.6", "@reduxjs/toolkit": "1.8.1", "@reown/appkit": "1.0.7", @@ -5932,6 +5933,94 @@ "node": ">=14.0.0" } }, + "node_modules/@provenanceio/walletconnect-js": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@provenanceio/walletconnect-js/-/walletconnect-js-3.10.2.tgz", + "integrity": "sha512-3zUOmC3R5Q5UhcotYv27PJEQe5dugEJqBA9Z4NHW41pEzZdDBUr1fG9vyyUHvDmDz0VdiLlTY+xijNSBaLRs1A==", + "dependencies": { + "@walletconnect/client": "1.8.0", + "@walletconnect/utils": "1.8.0", + "base64url": "3.0.1", + "buffer": "npm:buffer@6.0.3", + "crypto": "npm:crypto-browserify@3.12.0", + "qrcode": "^1.5.3", + "secp256k1": "5.0.0", + "stream": "npm:stream-browserify@3.0.0", + "util": "npm:util@0.12.5" + } + }, + "node_modules/@provenanceio/walletconnect-js/node_modules/@walletconnect/types": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-1.8.0.tgz", + "integrity": "sha512-Cn+3I0V0vT9ghMuzh1KzZvCkiAxTq+1TR2eSqw5E5AVWfmCtECFkVZBP6uUJZ8YjwLqXheI+rnjqPy7sVM4Fyg==", + "deprecated": "WalletConnect's v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/" + }, + "node_modules/@provenanceio/walletconnect-js/node_modules/@walletconnect/utils": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-1.8.0.tgz", + "integrity": "sha512-zExzp8Mj1YiAIBfKNm5u622oNw44WOESzo6hj+Q3apSMIb0Jph9X3GDIdbZmvVZsNPxWDL7uodKgZcCInZv2vA==", + "dependencies": { + "@walletconnect/browser-utils": "^1.8.0", + "@walletconnect/encoding": "^1.0.1", + "@walletconnect/jsonrpc-utils": "^1.0.3", + "@walletconnect/types": "^1.8.0", + "bn.js": "4.11.8", + "js-sha3": "0.8.0", + "query-string": "6.13.5" + } + }, + "node_modules/@provenanceio/walletconnect-js/node_modules/bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "node_modules/@provenanceio/walletconnect-js/node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, + "node_modules/@provenanceio/walletconnect-js/node_modules/query-string": { + "version": "6.13.5", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.5.tgz", + "integrity": "sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q==", + "dependencies": { + "decode-uri-component": "^0.2.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@provenanceio/walletconnect-js/node_modules/secp256k1": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-5.0.0.tgz", + "integrity": "sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==", + "hasInstallScript": true, + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^5.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@provenanceio/walletconnect-js/node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/@provlabs/provenancejs": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@provlabs/provenancejs/-/provenancejs-0.0.6.tgz", @@ -9829,6 +9918,110 @@ } } }, + "node_modules/@walletconnect/browser-utils": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/browser-utils/-/browser-utils-1.8.0.tgz", + "integrity": "sha512-Wcqqx+wjxIo9fv6eBUFHPsW1y/bGWWRboni5dfD8PtOmrihrEpOCmvRJe4rfl7xgJW8Ea9UqKEaq0bIRLHlK4A==", + "dependencies": { + "@walletconnect/safe-json": "1.0.0", + "@walletconnect/types": "^1.8.0", + "@walletconnect/window-getters": "1.0.0", + "@walletconnect/window-metadata": "1.0.0", + "detect-browser": "5.2.0" + } + }, + "node_modules/@walletconnect/browser-utils/node_modules/@walletconnect/safe-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.0.tgz", + "integrity": "sha512-QJzp/S/86sUAgWY6eh5MKYmSfZaRpIlmCJdi5uG4DJlKkZrHEF7ye7gA+VtbVzvTtpM/gRwO2plQuiooIeXjfg==" + }, + "node_modules/@walletconnect/browser-utils/node_modules/@walletconnect/types": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-1.8.0.tgz", + "integrity": "sha512-Cn+3I0V0vT9ghMuzh1KzZvCkiAxTq+1TR2eSqw5E5AVWfmCtECFkVZBP6uUJZ8YjwLqXheI+rnjqPy7sVM4Fyg==", + "deprecated": "WalletConnect's v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/" + }, + "node_modules/@walletconnect/browser-utils/node_modules/@walletconnect/window-getters": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.0.tgz", + "integrity": "sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA==" + }, + "node_modules/@walletconnect/browser-utils/node_modules/@walletconnect/window-metadata": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz", + "integrity": "sha512-9eFvmJxIKCC3YWOL97SgRkKhlyGXkrHwamfechmqszbypFspaSk+t2jQXAEU7YClHF6Qjw5eYOmy1//zFi9/GA==", + "dependencies": { + "@walletconnect/window-getters": "^1.0.0" + } + }, + "node_modules/@walletconnect/browser-utils/node_modules/detect-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.2.0.tgz", + "integrity": "sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA==" + }, + "node_modules/@walletconnect/client": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/client/-/client-1.8.0.tgz", + "integrity": "sha512-svyBQ14NHx6Cs2j4TpkQaBI/2AF4+LXz64FojTjMtV4VMMhl81jSO1vNeg+yYhQzvjcGH/GpSwixjyCW0xFBOQ==", + "deprecated": "WalletConnect's v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/", + "dependencies": { + "@walletconnect/core": "^1.8.0", + "@walletconnect/iso-crypto": "^1.8.0", + "@walletconnect/types": "^1.8.0", + "@walletconnect/utils": "^1.8.0" + } + }, + "node_modules/@walletconnect/client/node_modules/@walletconnect/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-1.8.0.tgz", + "integrity": "sha512-aFTHvEEbXcZ8XdWBw6rpQDte41Rxwnuk3SgTD8/iKGSRTni50gI9S3YEzMj05jozSiOBxQci4pJDMVhIUMtarw==", + "dependencies": { + "@walletconnect/socket-transport": "^1.8.0", + "@walletconnect/types": "^1.8.0", + "@walletconnect/utils": "^1.8.0" + } + }, + "node_modules/@walletconnect/client/node_modules/@walletconnect/types": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-1.8.0.tgz", + "integrity": "sha512-Cn+3I0V0vT9ghMuzh1KzZvCkiAxTq+1TR2eSqw5E5AVWfmCtECFkVZBP6uUJZ8YjwLqXheI+rnjqPy7sVM4Fyg==", + "deprecated": "WalletConnect's v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/" + }, + "node_modules/@walletconnect/client/node_modules/@walletconnect/utils": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-1.8.0.tgz", + "integrity": "sha512-zExzp8Mj1YiAIBfKNm5u622oNw44WOESzo6hj+Q3apSMIb0Jph9X3GDIdbZmvVZsNPxWDL7uodKgZcCInZv2vA==", + "dependencies": { + "@walletconnect/browser-utils": "^1.8.0", + "@walletconnect/encoding": "^1.0.1", + "@walletconnect/jsonrpc-utils": "^1.0.3", + "@walletconnect/types": "^1.8.0", + "bn.js": "4.11.8", + "js-sha3": "0.8.0", + "query-string": "6.13.5" + } + }, + "node_modules/@walletconnect/client/node_modules/bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "node_modules/@walletconnect/client/node_modules/query-string": { + "version": "6.13.5", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.5.tgz", + "integrity": "sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q==", + "dependencies": { + "decode-uri-component": "^0.2.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@walletconnect/core": { "version": "2.17.1", "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.17.1.tgz", @@ -9888,6 +10081,44 @@ "events": "3.3.0" } }, + "node_modules/@walletconnect/crypto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@walletconnect/crypto/-/crypto-1.0.3.tgz", + "integrity": "sha512-+2jdORD7XQs76I2Odgr3wwrtyuLUXD/kprNVsjWRhhhdO9Mt6WqVzOPu0/t7OHSmgal8k7SoBQzUc5hu/8zL/g==", + "dependencies": { + "@walletconnect/encoding": "^1.0.2", + "@walletconnect/environment": "^1.0.1", + "@walletconnect/randombytes": "^1.0.3", + "aes-js": "^3.1.2", + "hash.js": "^1.1.7", + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/crypto/node_modules/aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" + }, + "node_modules/@walletconnect/crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/encoding": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@walletconnect/encoding/-/encoding-1.0.2.tgz", + "integrity": "sha512-CrwSBrjqJ7rpGQcTL3kU+Ief+Bcuu9PH6JLOb+wM6NITX1GTxR/MfNwnQfhLKK6xpRAyj2/nM04OOH6wS8Imag==", + "dependencies": { + "is-typedarray": "1.0.0", + "tslib": "1.14.1", + "typedarray-to-buffer": "3.1.5" + } + }, + "node_modules/@walletconnect/encoding/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@walletconnect/environment": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.1.tgz", @@ -10077,6 +10308,57 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "node_modules/@walletconnect/iso-crypto": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/iso-crypto/-/iso-crypto-1.8.0.tgz", + "integrity": "sha512-pWy19KCyitpfXb70hA73r9FcvklS+FvO9QUIttp3c2mfW8frxgYeRXfxLRCIQTkaYueRKvdqPjbyhPLam508XQ==", + "dependencies": { + "@walletconnect/crypto": "^1.0.2", + "@walletconnect/types": "^1.8.0", + "@walletconnect/utils": "^1.8.0" + } + }, + "node_modules/@walletconnect/iso-crypto/node_modules/@walletconnect/types": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-1.8.0.tgz", + "integrity": "sha512-Cn+3I0V0vT9ghMuzh1KzZvCkiAxTq+1TR2eSqw5E5AVWfmCtECFkVZBP6uUJZ8YjwLqXheI+rnjqPy7sVM4Fyg==", + "deprecated": "WalletConnect's v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/" + }, + "node_modules/@walletconnect/iso-crypto/node_modules/@walletconnect/utils": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-1.8.0.tgz", + "integrity": "sha512-zExzp8Mj1YiAIBfKNm5u622oNw44WOESzo6hj+Q3apSMIb0Jph9X3GDIdbZmvVZsNPxWDL7uodKgZcCInZv2vA==", + "dependencies": { + "@walletconnect/browser-utils": "^1.8.0", + "@walletconnect/encoding": "^1.0.1", + "@walletconnect/jsonrpc-utils": "^1.0.3", + "@walletconnect/types": "^1.8.0", + "bn.js": "4.11.8", + "js-sha3": "0.8.0", + "query-string": "6.13.5" + } + }, + "node_modules/@walletconnect/iso-crypto/node_modules/bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "node_modules/@walletconnect/iso-crypto/node_modules/query-string": { + "version": "6.13.5", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.5.tgz", + "integrity": "sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q==", + "dependencies": { + "decode-uri-component": "^0.2.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@walletconnect/jsonrpc-http-connection": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.8.tgz", @@ -10229,6 +10511,22 @@ "@types/trusted-types": "^2.0.2" } }, + "node_modules/@walletconnect/randombytes": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@walletconnect/randombytes/-/randombytes-1.0.3.tgz", + "integrity": "sha512-35lpzxcHFbTN3ABefC9W+uBpNZl1GC4Wpx0ed30gibfO/y9oLdy1NznbV96HARQKSBV9J9M/rrtIvf6a23jfYw==", + "dependencies": { + "@walletconnect/encoding": "^1.0.2", + "@walletconnect/environment": "^1.0.1", + "randombytes": "^2.1.0", + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/randombytes/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@walletconnect/relay-api": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@walletconnect/relay-api/-/relay-api-1.0.11.tgz", @@ -10316,6 +10614,77 @@ "events": "3.3.0" } }, + "node_modules/@walletconnect/socket-transport": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/socket-transport/-/socket-transport-1.8.0.tgz", + "integrity": "sha512-5DyIyWrzHXTcVp0Vd93zJ5XMW61iDM6bcWT4p8DTRfFsOtW46JquruMhxOLeCOieM4D73kcr3U7WtyR4JUsGuQ==", + "dependencies": { + "@walletconnect/types": "^1.8.0", + "@walletconnect/utils": "^1.8.0", + "ws": "7.5.3" + } + }, + "node_modules/@walletconnect/socket-transport/node_modules/@walletconnect/types": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-1.8.0.tgz", + "integrity": "sha512-Cn+3I0V0vT9ghMuzh1KzZvCkiAxTq+1TR2eSqw5E5AVWfmCtECFkVZBP6uUJZ8YjwLqXheI+rnjqPy7sVM4Fyg==", + "deprecated": "WalletConnect's v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/" + }, + "node_modules/@walletconnect/socket-transport/node_modules/@walletconnect/utils": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-1.8.0.tgz", + "integrity": "sha512-zExzp8Mj1YiAIBfKNm5u622oNw44WOESzo6hj+Q3apSMIb0Jph9X3GDIdbZmvVZsNPxWDL7uodKgZcCInZv2vA==", + "dependencies": { + "@walletconnect/browser-utils": "^1.8.0", + "@walletconnect/encoding": "^1.0.1", + "@walletconnect/jsonrpc-utils": "^1.0.3", + "@walletconnect/types": "^1.8.0", + "bn.js": "4.11.8", + "js-sha3": "0.8.0", + "query-string": "6.13.5" + } + }, + "node_modules/@walletconnect/socket-transport/node_modules/bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "node_modules/@walletconnect/socket-transport/node_modules/query-string": { + "version": "6.13.5", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.5.tgz", + "integrity": "sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q==", + "dependencies": { + "decode-uri-component": "^0.2.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@walletconnect/socket-transport/node_modules/ws": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", + "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", + "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/@walletconnect/time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@walletconnect/time/-/time-1.0.2.tgz", @@ -12579,6 +12948,28 @@ "uncrypto": "^0.1.3" } }, + "node_modules/crypto": { + "name": "crypto-browserify", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, "node_modules/crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -16368,8 +16759,7 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "node_modules/is-unicode-supported": { "version": "0.1.0", @@ -21794,6 +22184,16 @@ "node": ">= 0.4" } }, + "node_modules/stream": { + "name": "stream-browserify", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, "node_modules/stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", @@ -21862,6 +22262,19 @@ "readable-stream": "^2.0.2" } }, + "node_modules/stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", @@ -22701,7 +23114,6 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, "dependencies": { "is-typedarray": "^1.0.0" } diff --git a/package.json b/package.json index 69d29f4..df8befc 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "@cosmos-kit/react": "2.20.0", "@esbuild-plugins/node-globals-polyfill": "0.2.3", "@interchain-ui/react": "1.25.3", + "@provenanceio/walletconnect-js": "3.10.2", "@provlabs/provenancejs": "0.0.6", "@reduxjs/toolkit": "1.8.1", "@reown/appkit": "1.0.7", diff --git a/src/App.js b/src/App.js index c4ef725..8eee4b4 100644 --- a/src/App.js +++ b/src/App.js @@ -1,7 +1,8 @@ import { useEffect } from 'react'; import { ThemeProvider } from 'styled-components'; import { BrowserRouter, Route, Switch, Redirect } from 'react-router-dom'; -import { useAssets, useColorScheme } from '../src/redux/hooks'; +import { useWalletConnect } from '@provenanceio/walletconnect-js'; +import { useAssets, useColorScheme, useApp } from '../src/redux/hooks'; import { Navigation, Footer, SpriteSheet, BaseStyle } from '../src/Components'; import { GlobalStyle } from '../src/theme'; import { isProd } from '../src/consts'; @@ -42,6 +43,12 @@ import { const App = () => { const { activeTheme } = useColorScheme(); + const { setAuthToken } = useApp(); + + const { + walletConnectState: { signedJWT }, + } = useWalletConnect(); + const { assetMetadata, assetMetadataLoading, getAssetMetadata, assetMetadataFailed } = useAssets(); @@ -51,6 +58,12 @@ const App = () => { } }, [assetMetadata, assetMetadataLoading, getAssetMetadata, assetMetadataFailed]); + useEffect(() => { + if (signedJWT) { + setAuthToken(signedJWT); + } + }, [setAuthToken, signedJWT]); + return ( diff --git a/src/Components/UserAccount/UserAccount.tsx b/src/Components/UserAccount/UserAccount.tsx index 6aa340a..6757dd5 100644 --- a/src/Components/UserAccount/UserAccount.tsx +++ b/src/Components/UserAccount/UserAccount.tsx @@ -1,5 +1,8 @@ import { useEffect, useState } from 'react'; import styled, { useTheme } from 'styled-components'; +import { wallets } from '@cosmos-kit/leap-extension'; +import { QRCodeModal, useWalletConnect } from '@provenanceio/walletconnect-js'; +import { Link as BaseLink } from 'react-router-dom'; // @ts-ignore import useOnClickOutside from 'react-tiny-hooks/use-on-click-outside'; // @ts-ignore @@ -8,13 +11,16 @@ import useOnEscape from 'react-tiny-hooks/use-on-escape'; import useToggle from 'react-tiny-hooks/use-toggle'; import { useChain } from '@cosmos-kit/react'; import { cosmos } from '@provlabs/provenancejs'; +import { maxLength } from '../../utils'; import { signJWT } from '../../utils/jwt'; import { CHAIN_NAME } from '../../config'; -import { ICON_NAMES } from '../../consts'; +import { breakpoints, ICON_NAMES, isProd } from '../../consts'; import { useApp } from '../../redux/hooks'; import { PopupNote } from '../../Components/PopupNote'; import Button from '../Button'; import Sprite from '../Sprite'; +import Modal from '../../Components/Modal'; +import figureWallet from '../../assets/figureMobileWalletIcon.png'; const Container = styled.div` position: relative; @@ -30,59 +36,128 @@ const AccountBtn = styled(Button)<{ isLoggedIn?: boolean }>` animation-iteration-count: ${({ isLoggedIn }) => (isLoggedIn ? 0 : 2)}; `; +const PopupTxt = styled.p` + text-align: center; + @media ${breakpoints.up('md')} { + white-space: nowrap; + } +`; + +const LogoutButton = styled(Button)` + float: right; +`; + +const Link = styled(BaseLink)` + &&& { + :hover { + opacity: 1; + text-decoration: underline; + } + :visited { + color: ${({ theme }) => theme.FONT_NAV_VISITED}; + } + color: ${({ theme }) => theme.FONT_NAV}; + } +`; + +const ModalContent = styled.div` + display: grid; + grid-template-columns: 1fr; + justify-content: center; + justify-items: center; + grid-auto-columns: max-content; + @media ${breakpoints.up('md')} { + grid-template-columns: 1fr 1fr; + } +`; + +const ModalTitle = styled.div` + font-weight: ${({ theme }) => theme.FONT_WEIGHT_BOLD}; + margin: 5px 0 10px 0; + font-size: 1.063rem; +`; + +const ModalWalletButton = styled.div` + padding: 0 20px 20px 20px; + border-radius: 8px; + font-size: 1rem; + width: 100%; + font-weight: ${({ theme }) => theme.FONT_WEIGHT_BOLD}; + display: flex; + flex-direction: column; + text-align: center; + justify-items: center; + justify-content: center; + max-width: 200px; + cursor: pointer; + :hover { + background-color: ${({ theme }) => theme.BACKGROUND_LIGHT}; + } +`; + +const WalletTitle = styled.p` + margin-bottom: 4px; +`; + const UserAccount = ({ isMobile }: { isMobile: boolean }) => { - const { isLoggedIn, setIsLoggedIn, setWalletAddress } = useApp(); + const { isLoggedIn, setIsLoggedIn, setWalletAddress, setAuthToken, authToken, setWalletUrl } = useApp(); const theme = useTheme(); const position = isMobile ? 'above' : 'left'; const [visible, setVisible] = useState(false); - const [, , , deactivateShowPopup] = useToggle(); + const [showPopup, toggleShowPopup, , deactivateShowPopup] = useToggle(); const containerRef = useOnClickOutside(deactivateShowPopup); useOnEscape(deactivateShowPopup); - - const { status, connect, address, signArbitrary, getSigningStargateClient, getAccount, wallet } = - useChain(CHAIN_NAME); - const { setAuthToken, authToken } = useApp(); + // This is the old Figure Wallet stuff + const { walletConnectService: wcs, walletConnectState } = useWalletConnect(); + // This is Leap + const { + status, + connect, + address, + signArbitrary, + isWalletDisconnected, + wallet, + getSigningStargateClient, + getAccount, + } = useChain(CHAIN_NAME); const provJWT = localStorage.getItem('provenanceJWT'); const jwtInfo = provJWT ? JSON.parse(provJWT) : ''; const signedJWT = jwtInfo.expires < Date.now() / 1000 ? '' : jwtInfo.jwt; useEffect(() => { - if (status === 'Disconnected') { + if (isWalletDisconnected && !walletConnectState.connected) { localStorage.removeItem('provenanceJWT'); setIsLoggedIn(false); - setAuthToken(''); setWalletAddress(''); } - }, [setAuthToken, setWalletAddress, status, setIsLoggedIn]); + }, [setAuthToken, setWalletAddress, status, isWalletDisconnected, setIsLoggedIn, walletConnectState]); useEffect(() => { if (jwtInfo && jwtInfo.expires < Date.now() / 1000) { localStorage.removeItem('provenanceJWT'); - setIsLoggedIn(false); - setAuthToken(''); setWalletAddress(''); + setIsLoggedIn(false); } - }, [jwtInfo, setAuthToken, setIsLoggedIn, setWalletAddress]); + }, [jwtInfo, setIsLoggedIn, setWalletAddress]); useEffect(() => { - if (signedJWT) { + if (signedJWT && status === 'Connected') { setAuthToken(signedJWT); } - }, [setAuthToken, signedJWT]); + }, [setAuthToken, signedJWT, status]); useEffect(() => { - setIsLoggedIn(status === 'Connected'); - if (address) { - setWalletAddress(address); + setIsLoggedIn(status === 'Connected' || walletConnectState.status === 'connected'); + if (address || walletConnectState.address) { + setWalletAddress(address || walletConnectState.address); } - }, [status, address, setIsLoggedIn, setWalletAddress]); + }, [status, address, setIsLoggedIn, setWalletAddress, walletConnectState]); - // This is the effect that signs the local JWT to access the explorer service + // This only occurs when connecting to Leap wallets useEffect(() => { const initialSigningEvent = async () => { if ( - !authToken && status === 'Connected' && address && wallet && @@ -161,9 +236,24 @@ const UserAccount = ({ isMobile }: { isMobile: boolean }) => { ]); const handleLoginClick = () => { - connect(); + if (wallet?.name.includes('leap')) { + connect() + } else { + toggleShowPopup(); + wcs.connect(); + } }; + const handleLogoutFigureWallet = () => { + setWalletAddress('') + setWalletUrl('') + setIsLoggedIn(false) + wcs.disconnect(); + setVisible(false); + } + + const [openSelectWalletModal, setOpenSelectWalletModal] = useState(false); + return ( { Login - + setOpenSelectWalletModal(true)} + isLoggedIn={isLoggedIn} + > + {isLoggedIn && ( + + You are currently logged in as + + + {isMobile ? maxLength(walletConnectState.address, 11, '3') : walletConnectState.address} + + + + Sign Out + + + )} + setOpenSelectWalletModal(false)}> +
+ Select a Wallet Provider + + { + setOpenSelectWalletModal(false); + connect(); + }} + > + Leap Wallet + Leap Wallet + + { + setOpenSelectWalletModal(false); + wcs.connect(); + }} + > + Figure Wallet + Figure Wallet + + +
+
+
); }; diff --git a/src/Pages/Validators/Components/ManageStakingModal.tsx b/src/Pages/Validators/Components/ManageStakingModal.tsx index de3e539..81ee9be 100644 --- a/src/Pages/Validators/Components/ManageStakingModal.tsx +++ b/src/Pages/Validators/Components/ManageStakingModal.tsx @@ -9,9 +9,15 @@ import { WithdrawRewardsProps, } from 'redux/features/staking/stakingSlice'; import Big from 'big.js'; -import { useChain } from '@cosmos-kit/react'; +import { useWalletConnect } from '@provenanceio/walletconnect-js'; import { CHAIN_NAME } from '../../../config'; -import { CurrentValidator, useAccounts, useStaking, useValidators } from '../../../redux/hooks'; +import { + CurrentValidator, + useAccounts, + useApp, + useStaking, + useValidators, +} from '../../../redux/hooks'; import { Button, DropdownBtn, @@ -134,7 +140,6 @@ interface StakingModalProps { modalOpen: boolean; onClose: () => void; validator: CurrentValidator; - validatorPower?: number; } interface DelegationFormProps { @@ -147,10 +152,10 @@ export const ManageStakingModal = ({ modalOpen, onClose, validator, - validatorPower, }: StakingModalProps) => { // Hooks const { tx } = useTx(CHAIN_NAME); + const { walletConnectService: wcs, walletConnectState } = useWalletConnect(); const { allValidators, getValidatorSpotlight, @@ -162,7 +167,7 @@ export const ManageStakingModal = ({ const { accountAssets } = useAccounts(); const { delegateAction, redelegateAction, undelegateAction, withdrawRewardsAction } = useStaking(); - const { address: delegatorAddress } = useChain(CHAIN_NAME); + const { walletAddress: delegatorAddress } = useApp(); // State variables const [isOpen, setIsOpen] = useState(false); // Is the modal open const [stakingType, setStakingType] = useState(''); // Sets staking type for managing delegations @@ -227,21 +232,29 @@ export const ManageStakingModal = ({ const typeUrl = data.json.messages[0]['@type']; delete data.json.messages[0]['@type']; const value = data.json.messages[0]; - const response = await tx([ - { - typeUrl, - value, - }, - ]); - if (response.isSuccess) { - // Wait a few seconds until refreshing the validators list - setTimeout(() => { - getAllValidators({ - page: 1, - count: 100, - status: 'all', - }); - }, 3000); + // If we are connected with Figure Wallet, then just send that one + if (walletConnectState.connected) { + wcs.sendMessage({ + description: 'Submit Delegation', + message: data.base64, + }); + } else { + const response = await tx([ + { + typeUrl, + value, + }, + ]); + if (response.isSuccess) { + // Wait a few seconds until refreshing the validators list + setTimeout(() => { + getAllValidators({ + page: 1, + count: 100, + status: 'all', + }); + }, 3000); + } } }; // Close Modal diff --git a/src/Pages/Validators/Components/ValidatorList.js b/src/Pages/Validators/Components/ValidatorList.js index 1693638..7db8e82 100644 --- a/src/Pages/Validators/Components/ValidatorList.js +++ b/src/Pages/Validators/Components/ValidatorList.js @@ -203,6 +203,7 @@ const ValidatorList = () => { modalOpen={modalFns.modalOpen} onClose={modalFns.deactivateModalOpen} validator={validator || {}} + validatorPower={validatorPower} /> {isActive &&

*Maximum voting power is currently {validatorPower}

} diff --git a/src/Providers/CosmosProvider.tsx b/src/Providers/CosmosProvider.tsx index dc10ffe..780ef77 100644 --- a/src/Providers/CosmosProvider.tsx +++ b/src/Providers/CosmosProvider.tsx @@ -6,7 +6,7 @@ import { assets, chains } from 'chain-registry'; import { Chain } from '@chain-registry/types'; import { GasPrice } from '@cosmjs/stargate'; import { QueryClientProvider, QueryClient } from '@tanstack/react-query'; -import { ThemeProvider } from '@interchain-ui/react'; +import { ThemeProvider, ConnectModal } from '@interchain-ui/react'; import { CHAIN_NAME, RPC_ENDPOINT, @@ -76,7 +76,6 @@ export const CosmosProvider = ({ children }: { children: React.ReactNode }) => { chains={[...chains, CHAIN_CONFIG]} assetLists={[...assets, CHAIN_ASSETS]} wallets={[...extension, ...mobile]} - walletModal={undefined} endpointOptions={{ isLazy: true, endpoints: { diff --git a/src/assets/figureMobileWalletIcon.png b/src/assets/figureMobileWalletIcon.png new file mode 100644 index 0000000..881d5c5 Binary files /dev/null and b/src/assets/figureMobileWalletIcon.png differ diff --git a/src/index.tsx b/src/index.tsx index 64cc086..5506cb1 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -4,6 +4,7 @@ import ReactGA from 'react-ga4'; import TagManager from 'react-gtm-module'; // eslint-disable-next-line import { Maintenance } from 'Pages'; +import { WalletConnectContextProvider } from '@provenanceio/walletconnect-js'; import { store } from '../src/redux/app/store'; import { isProd } from '../src/consts'; import App from './App'; @@ -24,8 +25,10 @@ if (gtmId) TagManager.initialize({ gtmId }); ReactDOM.render( + {/* */} + , document.getElementById('root') diff --git a/src/redux/hooks/useStaking.tsx b/src/redux/hooks/useStaking.tsx index 3a835da..a29a9cf 100644 --- a/src/redux/hooks/useStaking.tsx +++ b/src/redux/hooks/useStaking.tsx @@ -3,8 +3,6 @@ import { bindActionCreators } from 'redux'; import styled from 'styled-components'; // @ts-ignore import useToggle from 'react-tiny-hooks/use-toggle'; -import { useChain } from '@cosmos-kit/react'; -import { CHAIN_NAME } from '../../config'; import { useAppDispatch, useAppSelector } from '../app/hooks'; import { selectStaking as selector, @@ -78,7 +76,7 @@ export const useStaking = () => { const [isDelegate, setIsDelegate] = useState(false); const [validator, setValidator] = useState(); // const { walletConnectService: wcs } = useWalletConnect(); - const { address: delegatorAddress } = useChain(CHAIN_NAME); + const { walletAddress: delegatorAddress } = useApp(); const { getAccountDelegations, getAccountAssets,