diff --git a/.circleci/config.yml b/.circleci/config.yml
index 09db89978..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
@@ -1017,4 +1029,10 @@ workflows:
- build-particle:
<<: *deploy_production_filters
- build-staging-particle:
- <<: *deploy_staging_filters
\ No newline at end of file
+ <<: *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 32b423256..b7c764d97 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 7560658b0..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',
@@ -269,6 +284,7 @@
blocto,
venly,
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..c342a8260
--- /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",
+ "@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",
+ "@types/crypto-js": "^4.2.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..4ce260cbb
--- /dev/null
+++ b/packages/passport/src/index.ts
@@ -0,0 +1,301 @@
+import type { WalletInit } from '@web3-onboard/common'
+import type { AuthenticatedHeaders } from '@0xpass/passport/dist/types'
+import type { PassportOptions } from './types'
+import { Network } from '@0xpass/passport'
+
+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..e65c69a6a
--- /dev/null
+++ b/packages/passport/src/types.ts
@@ -0,0 +1,24 @@
+import type { Network, SignerWithOptionalCreator } from '@0xpass/passport'
+import type { 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"