From d14d987689745629ff7eb8cb5e7081e642368de9 Mon Sep 17 00:00:00 2001 From: k-xo Date: Wed, 15 May 2024 20:58:35 +0100 Subject: [PATCH 1/3] fix: add passport wallet --- .circleci/config.yml | 18 ++ .../[...4]wallets/[...36]passport/+page.md | 69 ++++ packages/demo/package.json | 2 + packages/demo/src/App.svelte | 18 +- packages/passport/README.md | 84 +++++ packages/passport/package.json | 76 +++++ packages/passport/src/icon.ts | 48 +++ packages/passport/src/index.ts | 300 ++++++++++++++++++ packages/passport/src/passportlogo.svg.ts | 47 +++ packages/passport/src/types.ts | 24 ++ packages/passport/tsconfig.json | 22 ++ yarn.lock | 70 +++- 12 files changed, 776 insertions(+), 2 deletions(-) create mode 100644 docs/src/routes/docs/[...4]wallets/[...36]passport/+page.md create mode 100644 packages/passport/README.md create mode 100644 packages/passport/package.json create mode 100644 packages/passport/src/icon.ts create mode 100644 packages/passport/src/index.ts create mode 100644 packages/passport/src/passportlogo.svg.ts create mode 100644 packages/passport/src/types.ts create mode 100644 packages/passport/tsconfig.json diff --git a/.circleci/config.yml b/.circleci/config.yml index fb0f777e1..34af55e64 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -448,6 +448,12 @@ jobs: working_directory: ~/web3-onboard-monorepo/packages/particle-network steps: - node-build-steps + build-passport: + docker: + - image: cimg/node:18.0.0 + working_directory: ~/web3-onboard-monorepo/packages/passport + steps: + - node-build-steps # Build staging/Alpha releases build-staging-core: @@ -732,6 +738,12 @@ jobs: working_directory: ~/web3-onboard-monorepo/packages/particle-network steps: - node-staging-build-steps + build-staging-passport: + docker: + - image: cimg/node:18.0.0 + working_directory: ~/web3-onboard-monorepo/packages/passport + steps: + - node-staging-build-steps workflows: version: 2 @@ -1018,3 +1030,9 @@ workflows: <<: *deploy_production_filters - build-staging-particle: <<: *deploy_staging_filters + passport: + jobs: + - build-passport: + <<: *deploy_production_filters + - build-staging-passport: + <<: *deploy_staging_filters diff --git a/docs/src/routes/docs/[...4]wallets/[...36]passport/+page.md b/docs/src/routes/docs/[...4]wallets/[...36]passport/+page.md new file mode 100644 index 000000000..f22fa9f29 --- /dev/null +++ b/docs/src/routes/docs/[...4]wallets/[...36]passport/+page.md @@ -0,0 +1,69 @@ +--- +title: Passport Protocol +--- + +# {$frontmatter.title} + +Wallet module for connecting Passport Protocol to Web3 Onboard. + +See [Passport Protocol Docs](https://docs.0xpass.io/) for details. + +## Install + + + + +```sh copy +yarn add @web3-onboard/core @web3-onboard/passport @0xpass/webauthn-signer +``` + + + + +```sh copy +npm install @web3-onboard/core @web3-onboard/passport @0xpass/webauthn-signer +``` + + + + +## Usage + +```typescript +import Onboard from '@web3-onboard/core' +import passportModule, { Network } from '@web3-onboard/passport' +import { WebauthnSigner } from '@0xpass/webauthn-signer' + +// Firstly you set up your passkey / webauthn signer +// The rpId and rpName are the same as the ones you set up in your passport application scope. They follow the webauthn standard, of the following values +// rpId: the domain of where the passkey is generated +// rpName: human readable name for the domain +// You can read more on this here https://docs.0xpass.io/authentication/configuring-your-scope#scope-configuration +const webauthnSigner = new WebauthnSigner({ + rpId: 'localhost', + rpName: '0xPass' +}) + +const passport = passportModule({ + network: Network.TESTNET, + scopeId: 'd8ae4424-c1f6-42b0-ab5e-2688bdaa0ff2', // replace this with your scope id + signer: webauthnSigner, + fallbackProvider: 'https://eth-mainnet.g.alchemy.com/v2/xxx' // insert your alchemy / infura url here + // encryptionSecret: '' // encryption secret is optional, but advised to securely store values in browser storage +}) + +const onboard = Onboard({ + // ... other Onboard options + wallets: [ + passport + //... other wallets + ] +}) + +const connectedWallets = await onboard.connectWallet() +console.log(connectedWallets) +``` + +## Build Environments + +For build env configurations and setups please see the Build Env section [here](/docs/modules/core#build-environments) diff --git a/packages/demo/package.json b/packages/demo/package.json index 12767ad9a..504e71605 100644 --- a/packages/demo/package.json +++ b/packages/demo/package.json @@ -64,6 +64,8 @@ "@web3-onboard/xdefi": "^2.0.5", "@web3-onboard/zeal": "^2.0.3", "@web3-onboard/particle-network": "^2.0.1", + "@web3-onboard/passport": "^2.0.0-alpha.1", + "@0xpass/webauthn-signer": "2.0.0", "vconsole": "^3.15.1" }, "license": "MIT", diff --git a/packages/demo/src/App.svelte b/packages/demo/src/App.svelte index 53896bfc4..aba37c12d 100644 --- a/packages/demo/src/App.svelte +++ b/packages/demo/src/App.svelte @@ -51,6 +51,8 @@ import VConsole from 'vconsole' import blocknativeIcon from './blocknative-icon.js' import DappAuth from '@blocto/dappauth' + import passportModule, { Network } from '@web3-onboard/passport' + import { WebauthnSigner } from '@0xpass/webauthn-signer' if (window.innerWidth < 700) { new VConsole() @@ -176,6 +178,19 @@ const blocto = bloctoModule() const tallyho = tallyHoModule() + const webauthnSigner = new WebauthnSigner({ + rpId: 'localhost', + rpName: '0xPass' + }) + + const passport = passportModule({ + network: Network.TESTNET, + scopeId: 'd8ae4424-c1f6-42b0-ab5e-2688bdaa0ff2', + signer: webauthnSigner, + fallbackProvider: '' // insert your alchemy / infura url here + // encryptionSecret: '' // encryption secret is optional, but advised to securely store values in browser storage + }) + const trezorOptions = { email: 'test@test.com', appUrl: 'https://www.blocknative.com', @@ -268,7 +283,8 @@ arcanaAuth, blocto, venly, - particle + particle, + passport ], // transactionPreview, gas, diff --git a/packages/passport/README.md b/packages/passport/README.md new file mode 100644 index 000000000..79e6c12e7 --- /dev/null +++ b/packages/passport/README.md @@ -0,0 +1,84 @@ +# @web3-onboard/passport + +## Wallet module for connecting Passport Wallets to web3-onboard + +[Passport](https://0xpass.io/) is an MPC-based programmable, distributed, and non-custodial key management system, that allows users to generate wallets, scoped to their application, either via user Passkeys, our signer allows you to sign messages and transactions with a Passport Network account. + +To learn more, check out the [Passpor Developer Docs](https://docs.0xpass.io/) + +### Install + +```bash +pnpm install @web3-onboard/passport @0xpass/webauthn-signer +# OR +yarn add @web3-onboard/passport @0xpass/webauthn-signer +# OR +npm install @web3-onboard/passport @0xpass/webauthn-signer +``` + +## Setup + +To use Passport with web3-onboard, you'll first need to make sure you have configured a scope for your application. For this you can follow the guides below: + +- Refer to the [Passport documentation](https://docs.0xpass.io/) for instructions on setting up your application with Passport. +- For a primer on setting up your scope you can check [here](https://docs.0xpass.io/authentication/configuring-your-scope). + +```typescript +/** + * Options for initializing the Passport environment. + * + * @property {string} iconPath - Path to the icon image. + * @property {string} scopeId - Identifier for the scope. + * @property {SignerWithOptionalCreator} signer - This will be the WebauthnSigner you pass + * @property {string} [fallbackProvider] - fallback provider URL e.g an alchemy or infura endpoint. + * @property {Chain} [chain] - Optional blockchain chain configuration, defaults to mainnet. + * @property {Network} [network] - Optional passport network configuration, defaults to Passport testnet. + * @property {string} [encryptionSecret] - Optional encryption secret for securing data. + */ +type PassportOptions = { + iconPath: string + scopeId: string + signer: SignerWithOptionalCreator + fallbackProvider: string + chain?: Chain + network?: Network + encryptionSecret?: string +} +``` + +## Usage + +```typescript +import Onboard from '@web3-onboard/core' +import passportModule, { Network } from '@web3-onboard/passport' +import { WebauthnSigner } from '@0xpass/webauthn-signer' + +// Firstly you set up your passkey / webauthn signer +// The rpId and rpName are the same as the ones you set up in your passport application scope. They follow the webauthn standard, of the following values +// rpId: the domain of where the passkey is generated +// rpName: human readable name for the domain +// You can read more on this here https://docs.0xpass.io/authentication/configuring-your-scope#scope-configuration +const webauthnSigner = new WebauthnSigner({ + rpId: 'localhost', + rpName: '0xPass' +}) + +const passport = passportModule({ + network: Network.TESTNET, + scopeId: 'd8ae4424-c1f6-42b0-ab5e-2688bdaa0ff2', // replace this with your scope id + signer: webauthnSigner, + fallbackProvider: 'https://eth-mainnet.g.alchemy.com/v2/xxx' // insert your alchemy / infura url here + // encryptionSecret: '' // encryption secret is optional, but advised to securely store values in browser storage +}) + +const onboard = Onboard({ + // ... other Onboard options + wallets: [ + passport + //... other wallets + ] +}) + +const connectedWallets = await onboard.connectWallet() +console.log(connectedWallets) +``` diff --git a/packages/passport/package.json b/packages/passport/package.json new file mode 100644 index 000000000..56d38e894 --- /dev/null +++ b/packages/passport/package.json @@ -0,0 +1,76 @@ +{ + "name": "@web3-onboard/passport", + "version": "2.0.0-alpha.1", + "description": "passport", + "module": "dist/index.js", + "browser": "dist/index.js", + "main": "dist/index.js", + "type": "module", + "typings": "dist/index.d.ts", + "files": [ + "dist" + ], + "homepage": "https://onboard.blocknative.com", + "bugs": "https://github.com/blocknative/web3-onboard/issues", + "repository": { + "type": "git", + "url": "https://github.com/blocknative/web3-onboard.git", + "directory": "packages/passport" + }, + "scripts": { + "build": "tsc", + "dev": "tsc -w", + "type-check": "tsc --noEmit" + }, + "license": "MIT", + "keywords": [ + "Ethereum", + "Web3", + "EVM", + "dapp", + "Multichain", + "Wallet", + "Transaction", + "Provider", + "Hardware Wallet", + "Notifications", + "React", + "Svelte", + "Vue", + "Next", + "Nuxt", + "MetaMask", + "Coinbase", + "WalletConnect", + "Ledger", + "Trezor", + "Connect Wallet", + "Ethereum Hooks", + "Blocknative", + "Mempool", + "pending", + "confirmed", + "Injected Wallet", + "Crypto", + "Crypto Wallet", + "Passport Protocol", + "0xPass" + ], + "dependencies": { + "@0xpass/passport": "2.1.1", + "@0xpass/passport-viem": "2.0.1", + "@types/crypto-js": "^4.2.2", + "@web3-onboard/common": "^2.3.3", + "crypto-js": "^4.2.0", + "react-dom": "^18.2.0", + "viem": "^2.9.4" + }, + "peerDependencies": { + "react": ">=18.2" + }, + "devDependencies": { + "@types/react": "^18.0.2", + "react": "^18.2.0", + "typescript": "^5.2.2" + } +} diff --git a/packages/passport/src/icon.ts b/packages/passport/src/icon.ts new file mode 100644 index 000000000..eaa17e3f9 --- /dev/null +++ b/packages/passport/src/icon.ts @@ -0,0 +1,48 @@ +export default ` + + + + + + + +` diff --git a/packages/passport/src/index.ts b/packages/passport/src/index.ts new file mode 100644 index 000000000..c88cdec3a --- /dev/null +++ b/packages/passport/src/index.ts @@ -0,0 +1,300 @@ +import type { WalletInit } from '@web3-onboard/common' +import type { AuthenticatedHeaders, Network } from '@0xpass/passport/dist/types' +import type { PassportOptions } from 'types' + +async function createUsernameModal( + passport: any, + iconPath: string, + encryptionSecret: string = '', + setSession: (headers: AuthenticatedHeaders, secret: string) => void +): Promise { + const passportLogo = (await import('./passportlogo.svg')).default + + return new Promise((resolve, reject) => { + const modal = document.createElement('div') + const modalContent = document.createElement('div') + const closeButton = document.createElement('button') + const header = document.createElement('h1') + const image = document.createElement('img') + const input = document.createElement('input') + const submitButton = document.createElement('button') + const signInUpHeader = document.createElement('h2') + + modal.style.position = 'fixed' + modal.style.left = '0' + modal.style.top = '0' + modal.style.width = '100%' + modal.style.height = '100%' + modal.style.backgroundColor = 'rgba(0, 0, 0, 0.75)' + modal.style.display = 'flex' + modal.style.justifyContent = 'center' + modal.style.alignItems = 'center' + modal.style.zIndex = '1000' + + modalContent.style.backgroundColor = '#000' + modalContent.style.width = '400px' + modalContent.style.padding = '20px' + modalContent.style.borderRadius = '10px' + modalContent.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.1)' + modalContent.style.display = 'flex' + modalContent.style.flexDirection = 'column' + modalContent.style.alignItems = 'center' + modalContent.style.position = 'relative' + + closeButton.style.position = 'absolute' + closeButton.style.top = '10px' + closeButton.style.right = '10px' + closeButton.style.background = '#333' + closeButton.style.border = 'none' + closeButton.style.cursor = 'pointer' + closeButton.style.borderRadius = '50%' + closeButton.style.width = '30px' + closeButton.style.height = '30px' + closeButton.style.display = 'flex' + closeButton.style.alignItems = 'center' + closeButton.style.justifyContent = 'center' + closeButton.innerHTML = ` + + + ` + closeButton.onclick = () => { + document.body.removeChild(modal) + reject(new Error('Passport modal closed.')) + } + + header.innerHTML = + 'Passkeys (by Passport Protocol)' + header.style.color = '#FFF' + header.style.marginTop = '20px' + header.style.marginBottom = '20px' + header.style.fontSize = '18px' + + signInUpHeader.textContent = 'Sign In / Up' + signInUpHeader.style.color = '#FFF' + signInUpHeader.style.marginTop = '5px' + signInUpHeader.style.marginBottom = '20px' + signInUpHeader.style.fontSize = '22px' + signInUpHeader.style.fontWeight = 'bold' + signInUpHeader.style.textAlign = 'center' + + if (iconPath) { + image.src = iconPath + } else { + image.src = `data:image/svg+xml;base64,${btoa(passportLogo)}` + } + image.style.width = '100px' + image.style.height = '100px' + image.style.marginBottom = '40px' + + input.type = 'text' + input.placeholder = 'Enter your username' + input.style.fontSize = '14px' + input.style.padding = '14px' + input.style.marginBottom = '16px' + input.style.border = '1px solid rgb(75, 85, 99)' + input.style.borderRadius = '6px' + input.style.backgroundColor = '#161618' + input.style.color = '#FFF' + input.style.width = 'calc(100% - 24px)' + input.style.textAlign = 'center' + input.style.outline = '1px solid black' + + submitButton.textContent = 'Continue' + submitButton.style.padding = '14px 20px' + submitButton.style.border = '1px solid #FFF' + submitButton.style.borderRadius = '6px' + submitButton.style.backgroundColor = 'black' + submitButton.style.color = '#FFF' + submitButton.style.fontSize = '14px' + submitButton.style.cursor = 'pointer' + submitButton.style.marginTop = '8px' + submitButton.style.width = 'calc(100% - 24px)' + + submitButton.onmouseover = () => { + submitButton.style.backgroundColor = '#161618' + } + + submitButton.onmouseout = () => { + submitButton.style.backgroundColor = 'black' + } + + submitButton.onclick = async () => { + const username = input.value.trim() + if (username) { + input.disabled = true + submitButton.disabled = true + submitButton.textContent = 'Loading...' + + try { + let authenticatedHeaders + try { + // Attempt to authenticate the user + ;[authenticatedHeaders] = await passport.authenticate({ + username: username, + userDisplayName: username + }) + setSession(authenticatedHeaders, encryptionSecret) + } catch (error) { + // If authentication fails due to user not being registered + // attempt to register the user. + const errorMessage: string = (error as Error).message + if ( + errorMessage.includes( + 'Account credential lookup yielded no results' + ) + ) { + const register = await passport.register({ + username: username, + userDisplayName: username + }) + + if (!register.result) { + throw new Error('Unable to register user') + } + + ;[authenticatedHeaders] = await passport.authenticate({ + username: username, + userDisplayName: username + }) + setSession(authenticatedHeaders, encryptionSecret) + } else { + input.style.border = '1px solid #ff6666' + } + } + resolve(authenticatedHeaders) + document.body.removeChild(modal) + } catch (error) { + reject(error) + } finally { + submitButton.textContent = 'Continue' + input.disabled = false + submitButton.disabled = false + } + } else { + input.style.border = '1px solid #ff6666' + } + } + + modalContent.appendChild(closeButton) + modalContent.appendChild(header) + modalContent.appendChild(signInUpHeader) + modalContent.appendChild(image) + modalContent.appendChild(input) + modalContent.appendChild(submitButton) + modal.appendChild(modalContent) + document.body.appendChild(modal) + + input.focus() + + // Close modal when clicking outside the modal content + modal.addEventListener('click', function (event) { + if (event.target === modal) { + reject(new Error('Passport modal closed.')) + document.body.removeChild(modal) + } + }) + }) +} + +function passport(options: PassportOptions): WalletInit { + return () => { + return { + label: 'Passport', + getIcon: async () => (await import('./icon')).default, + getInterface: async () => { + const { Passport, Network } = await import('@0xpass/passport') + const { createPassportClient } = await import('@0xpass/passport-viem') + const { http } = await import('viem') + const { mainnet } = await import('viem/chains') + const { createEIP1193Provider } = await import('@web3-onboard/common') + const CryptoJS = await import('crypto-js') + + function encrypt(data: string, secret: string): string { + return CryptoJS.AES.encrypt(data, secret).toString() + } + + function decrypt(data: string, secret: string): string { + const bytes = CryptoJS.AES.decrypt(data, secret) + return bytes.toString(CryptoJS.enc.Utf8) + } + + function setSession( + authenticatedHeaders: AuthenticatedHeaders, + encryptionSecret: string = '' + ) { + const expirySeconds = 60 * 60 + const sessionData = { + authenticatedHeaders, + expiry: new Date().getTime() + expirySeconds * 1000 + } + const sessionString = JSON.stringify(sessionData) + const encryptedSession = encrypt(sessionString, encryptionSecret) + + window.localStorage.setItem('passport-onboard', encryptedSession) + } + + function checkAuthenticated(encryptionSecret: string = '') { + const session = window?.localStorage.getItem('passport-onboard') + if (!session) { + return false + } + + let sessionString + try { + sessionString = decrypt(session, encryptionSecret) + } catch (error) { + // If decryption fails, assume the encryption secret has changed or is removed + window.localStorage.removeItem('passport-onboard') + return false + } + + const sessionData = JSON.parse(sessionString) + + if (new Date().getTime() > sessionData.expiry) { + window.localStorage.removeItem('passport-onboard') + return false + } + + return sessionData.authenticatedHeaders + } + + const passport = new Passport({ + signer: options.signer, + scopeId: options.scopeId, + network: options.network || Network.TESTNET + }) + + await passport.setupEncryption() + + let authenticatedHeaders = checkAuthenticated(options.encryptionSecret) + + if (!authenticatedHeaders) { + authenticatedHeaders = await createUsernameModal( + passport, + options.iconPath, + options.encryptionSecret, + setSession + ) + } + + // At this point, authenticatedHeaders should be defined + const client = await createPassportClient( + authenticatedHeaders, + http(options.fallbackProvider), + options.chain ?? mainnet, + options.network ?? Network.TESTNET + ) + + const provider = createEIP1193Provider(client) + + return { + instance: passport, + provider: provider + } + } + } + } +} + +export default passport +export { Network } diff --git a/packages/passport/src/passportlogo.svg.ts b/packages/passport/src/passportlogo.svg.ts new file mode 100644 index 000000000..de8162da2 --- /dev/null +++ b/packages/passport/src/passportlogo.svg.ts @@ -0,0 +1,47 @@ +export default ` + + + + + + + +` diff --git a/packages/passport/src/types.ts b/packages/passport/src/types.ts new file mode 100644 index 000000000..4eae0ac44 --- /dev/null +++ b/packages/passport/src/types.ts @@ -0,0 +1,24 @@ +import { Network, SignerWithOptionalCreator } from '@0xpass/passport' +import { Chain } from 'viem' + +/** + * Options for initializing the Passport environment. + * + * @property {string} iconPath - Path to the icon image. + * @property {string} scopeId - Identifier for the scope. + * @property {SignerWithOptionalCreator} signer - Signer object with optional creator. + * @property {string} [fallbackProvider] - fallback provider URL e.g an alchemy or infura endpoint. + * @property {Chain} [chain] - Optional blockchain chain configuration, defaults to mainnet. + * @property {Network} [network] - Optional passport network configuration, defaults to Passport testnet. + * @property {string} [encryptionSecret] - Optional encryption secret for securing data. + */ + +export type PassportOptions = { + iconPath: string + scopeId: string + signer: SignerWithOptionalCreator + fallbackProvider: string + chain?: Chain + network?: Network + encryptionSecret?: string +} diff --git a/packages/passport/tsconfig.json b/packages/passport/tsconfig.json new file mode 100644 index 000000000..e30436cbd --- /dev/null +++ b/packages/passport/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "../../tsconfig.json", + "include": [ + "src/**/*" + ], + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "declaration": true, + "declarationDir": "dist", + "allowSyntheticDefaultImports": true, + "paths": { + "*": [ + "./src/*", + "./node_modules/*" + ] + }, + "typeRoots": [ + "node_modules/@types" + ] + } +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index c8491e22d..574aca1c9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22,6 +22,40 @@ "@0xsequence/utils" "^0.43.1" "@0xsequence/wallet" "^0.43.1" +"@0xpass/models@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@0xpass/models/-/models-2.0.0.tgz#8067ec6de6b4948a1489d3574cdfcd23f172f8ca" + integrity sha512-VwKhhNnCbOvoE3j0NoPNVtrxxM/6J09M2qHvavV3pAz5ClZ0JilydIkjuSXLcDtnBmoubofy/laxD9/OEB5Ugg== + +"@0xpass/passport-viem@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@0xpass/passport-viem/-/passport-viem-2.0.1.tgz#880e228b01de6b5e95c9620f5386d1eabd6fe0cd" + integrity sha512-zYtV90otySU9vuW6HMx1I75w45eym6WTcB/MuSEXqNUPwUQtiJz9u437TkAAOvgJ9bIGWZU0G+7WGadVnhHGLQ== + dependencies: + axios "^1.5.0" + node-forge "^1.3.1" + viem "^2.9.4" + +"@0xpass/passport@2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@0xpass/passport/-/passport-2.1.1.tgz#df15de1b7e8d481dd03e4035f39648c0ae574fe0" + integrity sha512-aDnOIRu6CA6HRZu8yIbgGy1qtFBnKdsmQsIwhR3fZ5F8X//Dm4MZprFVz83Ib92vUfLLyXEo2I9u7dfIE3CQcQ== + dependencies: + "@0xpass/models" "2.0.0" + axios "^1.5.0" + elliptic "6.5.4" + js-sha3 "0.9.3" + node-forge "^1.3.1" + +"@0xpass/webauthn-signer@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@0xpass/webauthn-signer/-/webauthn-signer-2.0.0.tgz#00d69ae5c12a32b1c7a2e8b68ba2414049276512" + integrity sha512-4yZvURGxlMBnbfEGPg7jjIFIxwpS6mNaBtDaVtH2YdYVKM6glkprCFdn8kdDEADo3dIJfzG0sL51cARzzrI50w== + dependencies: + "@0xpass/models" "2.0.0" + "@github/webauthn-json" "^2.1.1" + buffer "^6.0.3" + "@0xsequence/abi@^0.43.1": version "0.43.1" resolved "https://registry.yarnpkg.com/@0xsequence/abi/-/abi-0.43.1.tgz#7232b255cbbc46fb78db1b4805cf9c5732fc2154" @@ -1896,6 +1930,11 @@ dependencies: tslib "^2.1.0" +"@github/webauthn-json@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@github/webauthn-json/-/webauthn-json-2.1.1.tgz#648e63fc28050917d2882cc2b27817a88cb420fc" + integrity sha512-XrftRn4z75SnaJOmZQbt7Mk+IIjqVHw+glDGOxuHwXkZBZh/MBoRS7MHjSZMDaLhT4RjN2VqiEU7EOYleuJWSQ== + "@gsap/react@^2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@gsap/react/-/react-2.1.0.tgz#fe65901d64c00d2eea4e3e8b571ae293d781622f" @@ -4100,6 +4139,11 @@ dependencies: "@types/node" "*" +"@types/crypto-js@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.2.2.tgz#771c4a768d94eb5922cc202a3009558204df0cea" + integrity sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ== + "@types/debug@^4.1.7": version "4.1.7" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" @@ -6395,7 +6439,7 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -axios@0.21.1, axios@^0.18.0, axios@^0.21.0, axios@^0.21.2, axios@^1.3.6, axios@^1.6.3: +axios@0.21.1, axios@^0.18.0, axios@^0.21.0, axios@^0.21.2, axios@^1.3.6, axios@^1.5.0, axios@^1.6.3: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== @@ -7703,6 +7747,11 @@ crypto-js@^4.0.0, crypto-js@^4.1.1: resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== +crypto-js@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" + integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== + css-color-keywords@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" @@ -10848,6 +10897,11 @@ js-sha3@0.8.0, js-sha3@^0.8.0: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== +js-sha3@0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.9.3.tgz#f0209432b23a66a0f6c7af592c26802291a75c2a" + integrity sha512-BcJPCQeLg6WjEx3FE591wVAevlli8lxsxm9/FzV4HXkV49TmBH38Yvrpce6fjbADGMKFrBMGTqrVz3qPIZ88Gg== + js-sha3@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" @@ -15443,6 +15497,20 @@ viem@^2.9.15: isows "1.0.3" ws "8.13.0" +viem@^2.9.4: + version "2.10.5" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.10.5.tgz#97e53421e20886b34e4e5e03d01f8b6e320d216f" + integrity sha512-rzU2y6poYgXu7axcQmwddaJ/nGP3tjtslXdUCu+PvryeXACuuqoyP3chjTEHciG84a663gYbrVGbxNUFA3aURQ== + dependencies: + "@adraffy/ens-normalize" "1.10.0" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@scure/bip32" "1.3.2" + "@scure/bip39" "1.2.1" + abitype "1.0.0" + isows "1.0.3" + ws "8.13.0" + void-elements@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" From 20821a9fbb0bed61127cd905d446e4a0a3002785 Mon Sep 17 00:00:00 2001 From: k-xo Date: Wed, 15 May 2024 21:26:01 +0100 Subject: [PATCH 2/3] fix: export network --- packages/passport/src/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/passport/src/index.ts b/packages/passport/src/index.ts index c88cdec3a..7dc842b52 100644 --- a/packages/passport/src/index.ts +++ b/packages/passport/src/index.ts @@ -1,6 +1,7 @@ import type { WalletInit } from '@web3-onboard/common' -import type { AuthenticatedHeaders, Network } from '@0xpass/passport/dist/types' +import type { AuthenticatedHeaders } from '@0xpass/passport/dist/types' import type { PassportOptions } from 'types' +import { Network } from '@0xpass/passport' async function createUsernameModal( passport: any, From 9010fb91a0e007f95e97602665b8df23f65362d7 Mon Sep 17 00:00:00 2001 From: k-xo Date: Fri, 17 May 2024 12:23:39 +0100 Subject: [PATCH 3/3] fix: review tweaks --- packages/passport/package.json | 2 +- packages/passport/src/index.ts | 2 +- packages/passport/src/types.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/passport/package.json b/packages/passport/package.json index 56d38e894..c342a8260 100644 --- a/packages/passport/package.json +++ b/packages/passport/package.json @@ -59,7 +59,6 @@ "dependencies": { "@0xpass/passport": "2.1.1", "@0xpass/passport-viem": "2.0.1", - "@types/crypto-js": "^4.2.2", "@web3-onboard/common": "^2.3.3", "crypto-js": "^4.2.0", "react-dom": "^18.2.0", @@ -70,6 +69,7 @@ }, "devDependencies": { "@types/react": "^18.0.2", + "@types/crypto-js": "^4.2.2", "react": "^18.2.0", "typescript": "^5.2.2" } diff --git a/packages/passport/src/index.ts b/packages/passport/src/index.ts index 7dc842b52..4ce260cbb 100644 --- a/packages/passport/src/index.ts +++ b/packages/passport/src/index.ts @@ -1,6 +1,6 @@ import type { WalletInit } from '@web3-onboard/common' import type { AuthenticatedHeaders } from '@0xpass/passport/dist/types' -import type { PassportOptions } from 'types' +import type { PassportOptions } from './types' import { Network } from '@0xpass/passport' async function createUsernameModal( diff --git a/packages/passport/src/types.ts b/packages/passport/src/types.ts index 4eae0ac44..e65c69a6a 100644 --- a/packages/passport/src/types.ts +++ b/packages/passport/src/types.ts @@ -1,5 +1,5 @@ -import { Network, SignerWithOptionalCreator } from '@0xpass/passport' -import { Chain } from 'viem' +import type { Network, SignerWithOptionalCreator } from '@0xpass/passport' +import type { Chain } from 'viem' /** * Options for initializing the Passport environment.