diff --git a/.gitignore b/.gitignore
index 85198aa..35b1fcb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,5 @@
+node_modules/
+
# Compiler files
cache/
out/
diff --git a/README.md b/README.md
index a688e5f..71cc916 100644
--- a/README.md
+++ b/README.md
@@ -1,25 +1,16 @@
# exp-0001
-### Build
+## Contracts
```shell
-$ forge build
+$ forge build # Build
+$ forge test # Test
+$ forge fmt # Format
+$ forge snapshot # Gas Snapshots
```
-### Test
+## Examples
```shell
-$ forge test
-```
-
-### Format
-
-```shell
-$ forge fmt
-```
-
-### Gas Snapshots
-
-```shell
-$ forge snapshot
-```
+$ pnpm dev # Run
+```
\ No newline at end of file
diff --git a/biome.json b/biome.json
new file mode 100644
index 0000000..abf02c6
--- /dev/null
+++ b/biome.json
@@ -0,0 +1,49 @@
+{
+ "$schema": "https://biomejs.dev/schemas/1.9.2/schema.json",
+ "files": {
+ "ignore": [
+ "tsconfig.json",
+ "tsconfig.*.json"
+ ]
+ },
+ "organizeImports": {
+ "enabled": true
+ },
+ "formatter": {
+ "enabled": true,
+ "indentStyle": "space",
+ "indentWidth": 2
+ },
+ "linter": {
+ "enabled": true,
+ "rules": {
+ "recommended": true,
+ "complexity": {
+ "noBannedTypes": "off"
+ },
+ "performance": {
+ "noDelete": "off"
+ },
+ "style": {
+ "noNonNullAssertion": "off",
+ "useTemplate": "off"
+ },
+ "suspicious": {
+ "noAssignInExpressions": "off",
+ "noExplicitAny": "off"
+ }
+ }
+ },
+ "javascript": {
+ "formatter": {
+ "quoteStyle": "single",
+ "trailingCommas": "all",
+ "semicolons": "asNeeded"
+ }
+ },
+ "vcs": {
+ "enabled": true,
+ "clientKind": "git",
+ "useIgnoreFile": true
+ }
+}
diff --git a/contracts/src/utils/WebAuthnP256.sol b/contracts/src/utils/WebAuthnP256.sol
index 49a04bc..927e384 100644
--- a/contracts/src/utils/WebAuthnP256.sol
+++ b/contracts/src/utils/WebAuthnP256.sol
@@ -12,8 +12,8 @@ library WebAuthnP256 {
struct Metadata {
bytes authenticatorData;
string clientDataJSON;
- uint256 challengeIndex;
- uint256 typeIndex;
+ uint16 challengeIndex;
+ uint16 typeIndex;
bool userVerificationRequired;
}
diff --git a/examples/webauthn/.gitignore b/examples/webauthn/.gitignore
new file mode 100644
index 0000000..a547bf3
--- /dev/null
+++ b/examples/webauthn/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/examples/webauthn/README.md b/examples/webauthn/README.md
new file mode 100644
index 0000000..74872fd
--- /dev/null
+++ b/examples/webauthn/README.md
@@ -0,0 +1,50 @@
+# React + TypeScript + Vite
+
+This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
+
+Currently, two official plugins are available:
+
+- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
+- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
+
+## Expanding the ESLint configuration
+
+If you are developing a production application, we recommend updating the configuration to enable type aware lint rules:
+
+- Configure the top-level `parserOptions` property like this:
+
+```js
+export default tseslint.config({
+ languageOptions: {
+ // other options...
+ parserOptions: {
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
+ tsconfigRootDir: import.meta.dirname,
+ },
+ },
+})
+```
+
+- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked`
+- Optionally add `...tseslint.configs.stylisticTypeChecked`
+- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config:
+
+```js
+// eslint.config.js
+import react from 'eslint-plugin-react'
+
+export default tseslint.config({
+ // Set the react version
+ settings: { react: { version: '18.3' } },
+ plugins: {
+ // Add the react plugin
+ react,
+ },
+ rules: {
+ // other rules...
+ // Enable its recommended rules
+ ...react.configs.recommended.rules,
+ ...react.configs['jsx-runtime'].rules,
+ },
+})
+```
diff --git a/examples/webauthn/index.html b/examples/webauthn/index.html
new file mode 100644
index 0000000..d4fcce8
--- /dev/null
+++ b/examples/webauthn/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ WebAuthn Batch Delegation
+
+
+
+
+
+
diff --git a/examples/webauthn/package.json b/examples/webauthn/package.json
new file mode 100644
index 0000000..430eda8
--- /dev/null
+++ b/examples/webauthn/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "example-webauthn",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "ox": "0.0.0-canary-20240923043550",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "viem": "^2.21.14"
+ },
+ "devDependencies": {
+ "@types/react": "^18.3.3",
+ "@types/react-dom": "^18.3.0",
+ "@vitejs/plugin-react": "^4.3.1",
+ "globals": "^15.9.0",
+ "vite": "^5.4.1"
+ }
+}
diff --git a/examples/webauthn/src/App.tsx b/examples/webauthn/src/App.tsx
new file mode 100644
index 0000000..cd49caa
--- /dev/null
+++ b/examples/webauthn/src/App.tsx
@@ -0,0 +1,300 @@
+// Warning: this needs a cleanup – just playin' around :-)
+
+import { WebAuthnP256 } from 'ox'
+import { useEffect, useState } from 'react'
+import {
+ type Address,
+ concat,
+ encodePacked,
+ formatEther,
+ keccak256,
+ parseEther,
+ size,
+} from 'viem'
+import { P256BatchDelegation } from './contracts'
+import { account, client, p256BatchDelegationContract } from './viem.config'
+
+export function App() {
+ const [step, setStep] = useState(0)
+
+ useEffect(() => {
+ const interval = setInterval(async () => {
+ try {
+ await client.getBlockNumber()
+ if (step === 0) setStep(1)
+ } catch {
+ setStep(0)
+ }
+ }, 2000)
+ return () => clearInterval(interval)
+ }, [step])
+
+ ////////////////////////////////////////////////////////////////////
+
+ const [contractAddress, setContractAddress] = useState()
+
+ ////////////////////////////////////////////////////////////////////
+
+ const [credential, setCredential] = useState()
+
+ ////////////////////////////////////////////////////////////////////
+
+ return (
+ <>
+ WebAuthn Batch Delegation
+ 0} />
+ {step >= 1 && (
+ {
+ setStep(2)
+ setContractAddress(contractAddress)
+ }}
+ />
+ )}
+ {step >= 2 && (
+ {
+ setStep(3)
+ setCredential(credential)
+ }}
+ />
+ )}
+ {step >= 3 && (
+ {
+ setStep(4)
+ }}
+ />
+ )}
+ {step >= 4 && }
+ >
+ )
+}
+
+function StartAnvil({ online }: { online: boolean }) {
+ const [accounts, setAccounts] = useState<
+ {
+ address: Address
+ balance: bigint
+ label: string
+ }[]
+ >([])
+
+ useEffect(() => {
+ const interval = setInterval(async () => {
+ const balances = await Promise.all([
+ client.getBalance({ address: account.authority.address }),
+ client.getBalance({ address: account.alice.address }),
+ client.getBalance({ address: account.bob.address }),
+ client.getBalance({ address: account.delegate.address }),
+ ])
+ setAccounts([
+ {
+ address: account.authority.address,
+ balance: balances[0],
+ label: 'Authority',
+ },
+ {
+ address: account.alice.address,
+ balance: balances[1],
+ label: 'Alice',
+ },
+ { address: account.bob.address, balance: balances[2], label: 'Bob' },
+ {
+ address: account.delegate.address,
+ balance: balances[3],
+ label: 'Delegate',
+ },
+ ])
+ }, 1000)
+ return () => clearInterval(interval)
+ }, [])
+
+ return (
+ <>
+ Step 0: Start Anvil
+ Start Anvil with the following command:
+
+ curl -L https://foundry.paradigm.xyz | bash
+
+ anvil --alphanet
+
+ {online ? 🟢 Online
: Waiting...}
+ {online && (
+
+
+
+
+ Label
+ |
+ Address |
+
+ Balance
+ |
+
+
+
+ {accounts.map(({ address, balance, label }) => (
+
+ {label} |
+ {address} |
+
+ {formatEther(balance)} ETH
+ |
+
+ ))}
+
+
+ )}
+ >
+ )
+}
+
+function Deploy({
+ onDeployed,
+}: {
+ onDeployed: ({ contractAddress }: { contractAddress: Address }) => void
+}) {
+ async function deploy() {
+ const hash = await client.deployContract({
+ account: account.deployer,
+ abi: P256BatchDelegation.abi,
+ bytecode: P256BatchDelegation.bytecode,
+ })
+ const receipt = await client.waitForTransactionReceipt({ hash })
+ if (receipt.status !== 'success') throw new Error('Failed to deploy')
+ console.log(
+ 'Deployed P256BatchDelegation.sol to: ',
+ receipt.contractAddress,
+ )
+ onDeployed({ contractAddress: receipt.contractAddress! })
+ }
+
+ return (
+ <>
+
+ Step 1: Deploy P256BatchDelegation.sol
+
+
+ >
+ )
+}
+
+function CreateKeyPair({
+ onCreated,
+}: {
+ onCreated: ({
+ credential,
+ }: { credential: WebAuthnP256.P256Credential }) => void
+}) {
+ async function createKeyPair() {
+ const credential = await WebAuthnP256.createCredential({
+ name: 'P256 Batch Delegation',
+ })
+ console.log('P256 Public Key:')
+ console.table(credential.publicKey)
+ console.log('')
+ onCreated({ credential })
+ }
+
+ return (
+ <>
+ Step 2: Create WebAuthn Credential
+
+ >
+ )
+}
+
+function Authorize({
+ contractAddress,
+ credential,
+ onAuthorized,
+}: {
+ contractAddress: Address
+ credential: WebAuthnP256.P256Credential
+ onAuthorized: () => void
+}) {
+ async function authorize() {
+ const authorization = await client.signAuthorization({
+ contractAddress,
+ })
+ const hash = await p256BatchDelegationContract.write.authorize(
+ [credential.publicKey],
+ {
+ authorizationList: [authorization],
+ },
+ )
+ const receipt = await client.waitForTransactionReceipt({ hash })
+ if (receipt.status !== 'success') throw new Error('Failed to authorize')
+ console.log('EIP-7702 Authorization Receipt:')
+ console.table(receipt)
+ console.log('')
+ onAuthorized()
+ }
+
+ return (
+ <>
+ Step 3: Authorize Delegate
+
+ >
+ )
+}
+
+function Send({ credential }: { credential: WebAuthnP256.P256Credential }) {
+ async function send() {
+ const nonce = await p256BatchDelegationContract.read.nonce()
+ const calls = [
+ {
+ data: '0x',
+ to: account.alice.address,
+ value: parseEther('1'),
+ },
+ {
+ data: '0x',
+ to: account.bob.address,
+ value: parseEther('2'),
+ },
+ ] as const
+ const calls_encoded = concat(
+ calls.map((call) =>
+ encodePacked(
+ ['uint8', 'address', 'uint256', 'uint256', 'bytes'],
+ [0, call.to, call.value, BigInt(size(call.data)), call.data],
+ ),
+ ),
+ )
+ const challenge = keccak256(
+ encodePacked(['uint256', 'bytes'], [nonce, calls_encoded]),
+ )
+ const { metadata, signature } = await WebAuthnP256.sign({
+ challenge,
+ credentialId: credential.id,
+ })
+ const hash = await p256BatchDelegationContract.write.executeWebAuthn(
+ [calls_encoded, signature, metadata, 0],
+ { account: account.delegate },
+ )
+ const receipt = await client.waitForTransactionReceipt({ hash })
+ if (receipt.status !== 'success') throw new Error('Failed to send')
+ console.log('Batch Calls Receipt:')
+ console.table(receipt)
+ console.log('')
+ }
+
+ return (
+ <>
+ Step 4: Send Batch Calls
+
+ >
+ )
+}
diff --git a/examples/webauthn/src/contracts.ts b/examples/webauthn/src/contracts.ts
new file mode 100644
index 0000000..66c00e7
--- /dev/null
+++ b/examples/webauthn/src/contracts.ts
@@ -0,0 +1,112 @@
+export const P256BatchDelegation = {
+ abi: [
+ {
+ type: 'function',
+ name: 'authorize',
+ inputs: [
+ {
+ name: 'publicKey',
+ type: 'tuple',
+ internalType: 'struct P256.PublicKey',
+ components: [
+ { name: 'x', type: 'uint256', internalType: 'uint256' },
+ { name: 'y', type: 'uint256', internalType: 'uint256' },
+ ],
+ },
+ ],
+ outputs: [],
+ stateMutability: 'nonpayable',
+ },
+ {
+ type: 'function',
+ name: 'delegates',
+ inputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],
+ outputs: [
+ { name: 'x', type: 'uint256', internalType: 'uint256' },
+ { name: 'y', type: 'uint256', internalType: 'uint256' },
+ ],
+ stateMutability: 'view',
+ },
+ {
+ type: 'function',
+ name: 'execute',
+ inputs: [
+ { name: 'calls', type: 'bytes', internalType: 'bytes' },
+ {
+ name: 'signature',
+ type: 'tuple',
+ internalType: 'struct P256.Signature',
+ components: [
+ { name: 'r', type: 'uint256', internalType: 'uint256' },
+ { name: 's', type: 'uint256', internalType: 'uint256' },
+ ],
+ },
+ { name: 'delegateIndex', type: 'uint32', internalType: 'uint32' },
+ ],
+ outputs: [],
+ stateMutability: 'nonpayable',
+ },
+ {
+ type: 'function',
+ name: 'executeWebAuthn',
+ inputs: [
+ { name: 'calls', type: 'bytes', internalType: 'bytes' },
+ {
+ name: 'signature',
+ type: 'tuple',
+ internalType: 'struct P256.Signature',
+ components: [
+ { name: 'r', type: 'uint256', internalType: 'uint256' },
+ { name: 's', type: 'uint256', internalType: 'uint256' },
+ ],
+ },
+ {
+ name: 'metadata',
+ type: 'tuple',
+ internalType: 'struct WebAuthnP256.Metadata',
+ components: [
+ { name: 'authenticatorData', type: 'bytes', internalType: 'bytes' },
+ { name: 'clientDataJSON', type: 'string', internalType: 'string' },
+ { name: 'challengeIndex', type: 'uint16', internalType: 'uint16' },
+ { name: 'typeIndex', type: 'uint16', internalType: 'uint16' },
+ {
+ name: 'userVerificationRequired',
+ type: 'bool',
+ internalType: 'bool',
+ },
+ ],
+ },
+ { name: 'delegateIndex', type: 'uint32', internalType: 'uint32' },
+ ],
+ outputs: [],
+ stateMutability: 'nonpayable',
+ },
+ {
+ type: 'function',
+ name: 'multiSend',
+ inputs: [{ name: 'transactions', type: 'bytes', internalType: 'bytes' }],
+ outputs: [],
+ stateMutability: 'payable',
+ },
+ {
+ type: 'function',
+ name: 'nonce',
+ inputs: [],
+ outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],
+ stateMutability: 'view',
+ },
+ {
+ type: 'function',
+ name: 'revoke',
+ inputs: [
+ { name: 'delegateIndex', type: 'uint32', internalType: 'uint32' },
+ ],
+ outputs: [],
+ stateMutability: 'nonpayable',
+ },
+ { type: 'error', name: 'InvalidAuthority', inputs: [] },
+ { type: 'error', name: 'InvalidSignature', inputs: [] },
+ ],
+ bytecode:
+ '0x60808060405234601557610dcd908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80633b2b33d7146100845780635fce19271461007f57806380d72ffc1461007a5780638d80ff0a14610075578063affed0e014610070578063b1548afc1461006b5763fa28224114610066575f80fd5b610484565b61042c565b6103be565b61038a565b6102d2565b610127565b346100ea5760403660031901126100ea573033036100db575f54680100000000000000008110156100d6578060016100be92015f556103ef565b6100d15760043581556001602435910155005b610592565b6101cc565b636f6a1b8760e11b5f5260045ffd5b5f80fd5b6004359063ffffffff821682036100ea57565b6064359063ffffffff821682036100ea57565b6084359063ffffffff821682036100ea57565b346100ea5760203660031901126100ea576101406100ee565b3033036100db575f545f1981019081116101c757610160610167916103ef565b50916103ef565b9190916100d1578082036101b3575b50505f54801561019f575f190161018c816103ef565b6100d1576001815f80935501555f555f80f35b634e487b7160e01b5f52603160045260245ffd5b600181819254845501549101555f80610176565b6105a5565b634e487b7160e01b5f52604160045260245ffd5b6040810190811067ffffffffffffffff8211176100d657604052565b60a0810190811067ffffffffffffffff8211176100d657604052565b90601f8019910116810190811067ffffffffffffffff8211176100d657604052565b67ffffffffffffffff81116100d657601f01601f191660200190565b9291926102628261023a565b916102706040519384610218565b8294818452818301116100ea578281602093845f960137010152565b9080601f830112156100ea578160206102a793359101610256565b90565b60409060231901126100ea57604051906102c3826101e0565b60243582526044356020830152565b346100ea5760803660031901126100ea5760043567ffffffffffffffff81116100ea5761030390369060040161028c565b61036b61030f366102aa565b610317610101565b9061036561035f60015461032a816105e3565b6001556040516020810191825261035681610348604082018b6105f1565b03601f198101835282610218565b519020936103ef565b50610603565b9161075c565b1561037b5761037990610621565b005b638baa579f60e01b5f5260045ffd5b60203660031901126100ea5760043567ffffffffffffffff81116100ea576103b961037991369060040161028c565b610621565b346100ea575f3660031901126100ea576020600154604051908152f35b634e487b7160e01b5f52603260045260245ffd5b5f54811015610427575f80805260019190911b7f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630191565b6103db565b346100ea5760203660031901126100ea576004355f548110156100ea576104546040916103ef565b506001815491015482519182526020820152f35b359061ffff821682036100ea57565b359081151582036100ea57565b346100ea5760a03660031901126100ea5760043567ffffffffffffffff81116100ea576104b590369060040161028c565b6104be366102aa565b906064359167ffffffffffffffff83116100ea5760a060031984360301126100ea57604051906104ed826101fc565b836004013567ffffffffffffffff81116100ea57610511906004369187010161028c565b8252602484013567ffffffffffffffff81116100ea57840193366023860112156100ea57608461057f91610552610379973690602460048201359101610256565b602086015261056360448201610468565b604086015261057460648201610468565b606086015201610477565b608083015261058c610114565b92610693565b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001198101919082116101c757565b5f198101919082116101c757565b919082039182116101c757565b5f1981146101c75760010190565b805191908290602001825e015f815290565b90604051610610816101e0565b602060018294805484520154910152565b80519060205b82811061063357505050565b808201805160f81c600182015160601c91601581015160358201519384915f9493845f1461067d57505050506001146100ea575b156106755701605501610627565b3d5f803e3d5ffd5b5f95508594506055019130811502175af1610667565b92906106d8926106d261035f6001546106ab816105e3565b600155604051602081019182526106c981610348604082018c6105f1565b519020946103ef565b92610891565b1561037b576106e690610621565b565b604051906106f7602083610218565b5f8252565b3d15610726573d9061070d8261023a565b9161071b6040519384610218565b82523d5f602084013e565b606090565b8051601f101561042757603f0190565b8051602010156104275760400190565b908151811015610427570160200190565b5f9291839260208251920151906020815191015191604051936020850195865260408501526060840152608083015260a082015260a0815261079f60c082610218565b519060145afa6107ad6106fc565b816107ed575b816107bc575090565b600160f81b91506001600160f81b0319906107e8906107da9061072b565b516001600160f81b03191690565b161490565b805160201491506107b3565b60405190610808604083610218565b6015825274113a3cb832911d113bb2b130baba34371733b2ba1160591b6020830152565b906106e6600161085c936040519485916c1131b430b63632b733b2911d1160991b6020840152602d8301906105f1565b601160f91b815203601e19810185520183610218565b6040513d5f823e3d90fd5b61088a90602093926105f1565b9081520190565b929192815160258151109081156109a3575b50610992576108b06107f9565b906108e16108dd602085019384516108d76108d0606089015161ffff1690565b61ffff1690565b91610a42565b1590565b61099a576108dd61091561091061034861090b610929956040519283916020830160209181520190565b610aeb565b61082c565b83516108d76108d0604088015161ffff1690565b610992575f61094160209251604051918280926105f1565b039060025afa1561098d575f61097760209261096b8351915161034860405193849288840161087d565b604051918280926105f1565b039060025afa1561098d576102a7915f5161075c565b610872565b505050505f90565b50505050505f90565b6109c491506109b76107da6108dd9261073b565b60808501511515906109ca565b5f6108a3565b906001600160f81b0319600160f81b831601610a2e5780610a1e575b610a1957601f60fb1b600160fb1b821601610a02575b50600190565b600160fc1b90811614610a15575f6109fc565b5f90565b505f90565b50600160fa1b81811614156109e6565b50505f90565b90600282018092116101c757565b80519282515f5b858110610a5b57505050505050600190565b8083018084116101c75782811015610aae57610a8c6001600160f81b0319610a83848861074b565b5116918761074b565b516001600160f81b03191603610aa457600101610a49565b5050505050505f90565b505050505050505f90565b90610ac38261023a565b610ad06040519182610218565b8281528092610ae1601f199161023a565b0190602036910137565b610af490610c37565b5f8151600281119081610c0d575b5015610bb95750610b1660025b82516105d6565b610b1f81610ab9565b915f5b828110610b2f5750505090565b600190602b60f81b610b54610b476107da848761074b565b6001600160f81b03191690565b03610b6d57602d610b65828761074b565b535b01610b22565b602f60f81b6001600160f81b0319610b886107da848761074b565b1603610ba057605f610b9a828761074b565b53610b67565b610bad6107da828561074b565b5f1a610b9a828761074b565b8151600181119081610bdd575b50610bd5575b610b1690610b0f565b506001610bcc565b603d60f81b91506001600160f81b031990610c05906107da90610bff906105c8565b8661074b565b16145f610bc6565b603d60f81b91506001600160f81b031990610c2f906107da90610bff906105b9565b16145f610b02565b6040516102a791610c49606083610218565b604082527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208301527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040830152610cb6565b600281901b91906001600160fe1b038116036101c757565b919091805115610d8c57610ce4610cdf610cda610cd38451610a34565b6003900490565b610c9e565b610ab9565b90602082019080815182019560208701908151925f83525b888110610d3e5750506003939495965052510680600114610d2c57600214610d22575090565b603d905f19015390565b50603d90815f19820153600119015390565b600360049199969901986001603f8b5182828260121c16870101518453828282600c1c16870101518385015382828260061c1687010151600285015316840101516003820153019497610cfc565b5090506102a76106e856fea26469706673582212205f7bd09b3cb82726693529fd63c47c43a7c31e42f576050e0d0aedbb97377a8e64736f6c634300081a0033',
+} as const
diff --git a/examples/webauthn/src/main.tsx b/examples/webauthn/src/main.tsx
new file mode 100644
index 0000000..c9ad119
--- /dev/null
+++ b/examples/webauthn/src/main.tsx
@@ -0,0 +1,4 @@
+import { createRoot } from 'react-dom/client'
+import { App } from './App.tsx'
+
+createRoot(document.getElementById('root')!).render()
diff --git a/examples/webauthn/src/viem.config.ts b/examples/webauthn/src/viem.config.ts
new file mode 100644
index 0000000..feb5bd0
--- /dev/null
+++ b/examples/webauthn/src/viem.config.ts
@@ -0,0 +1,40 @@
+import {
+ http,
+ createClient,
+ getContract,
+ publicActions,
+ walletActions,
+} from 'viem'
+import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'
+import { anvil } from 'viem/chains'
+import { eip7702Actions } from 'viem/experimental'
+import { P256BatchDelegation } from './contracts'
+
+export const account = {
+ authority: privateKeyToAccount(
+ '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',
+ ),
+ delegate: privateKeyToAccount(
+ '0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d',
+ ),
+ deployer: privateKeyToAccount(
+ '0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a',
+ ),
+ alice: privateKeyToAccount(generatePrivateKey()),
+ bob: privateKeyToAccount(generatePrivateKey()),
+} as const
+
+export const client = createClient({
+ account: account.authority,
+ chain: anvil,
+ transport: http(),
+})
+ .extend(publicActions)
+ .extend(walletActions)
+ .extend(eip7702Actions())
+
+export const p256BatchDelegationContract = getContract({
+ address: client.account.address,
+ abi: P256BatchDelegation.abi,
+ client,
+})
diff --git a/examples/webauthn/src/vite-env.d.ts b/examples/webauthn/src/vite-env.d.ts
new file mode 100644
index 0000000..11f02fe
--- /dev/null
+++ b/examples/webauthn/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/examples/webauthn/vite.config.ts b/examples/webauthn/vite.config.ts
new file mode 100644
index 0000000..36f7f4e
--- /dev/null
+++ b/examples/webauthn/vite.config.ts
@@ -0,0 +1,7 @@
+import react from '@vitejs/plugin-react'
+import { defineConfig } from 'vite'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [react()],
+})
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..1f3ce2a
--- /dev/null
+++ b/package.json
@@ -0,0 +1,14 @@
+{
+ "name": "exp-0001",
+ "private": true,
+ "scripts": {
+ "dev": "pnpm --filter example-webauthn dev",
+ "check": "biome check examples/ --write",
+ "check:types": "tsc --noEmit"
+ },
+ "license": "MIT",
+ "devDependencies": {
+ "@biomejs/biome": "1.9.2",
+ "typescript": "^5.5.3"
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..b8fb68d
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,1350 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ devDependencies:
+ '@biomejs/biome':
+ specifier: 1.9.2
+ version: 1.9.2
+ typescript:
+ specifier: ^5.5.3
+ version: 5.6.2
+
+ examples/webauthn:
+ dependencies:
+ ox:
+ specifier: 0.0.0-canary-20240923043550
+ version: 0.0.0-canary-20240923043550(typescript@5.6.2)
+ react:
+ specifier: ^18.3.1
+ version: 18.3.1
+ react-dom:
+ specifier: ^18.3.1
+ version: 18.3.1(react@18.3.1)
+ viem:
+ specifier: ^2.21.14
+ version: 2.21.14(typescript@5.6.2)
+ devDependencies:
+ '@types/react':
+ specifier: ^18.3.3
+ version: 18.3.8
+ '@types/react-dom':
+ specifier: ^18.3.0
+ version: 18.3.0
+ '@vitejs/plugin-react':
+ specifier: ^4.3.1
+ version: 4.3.1(vite@5.4.7)
+ globals:
+ specifier: ^15.9.0
+ version: 15.9.0
+ vite:
+ specifier: ^5.4.1
+ version: 5.4.7
+
+packages:
+
+ '@adraffy/ens-normalize@1.10.0':
+ resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==}
+
+ '@adraffy/ens-normalize@1.11.0':
+ resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==}
+
+ '@ampproject/remapping@2.3.0':
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+ engines: {node: '>=6.0.0'}
+
+ '@babel/code-frame@7.24.7':
+ resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.25.4':
+ resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.25.2':
+ resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.25.6':
+ resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.25.2':
+ resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.24.7':
+ resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.25.2':
+ resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-plugin-utils@7.24.8':
+ resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-simple-access@7.24.7':
+ resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.24.8':
+ resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.24.7':
+ resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.24.8':
+ resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.25.6':
+ resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/highlight@7.24.7':
+ resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.25.6':
+ resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-transform-react-jsx-self@7.24.7':
+ resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-source@7.24.7':
+ resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/template@7.25.0':
+ resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.25.6':
+ resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.25.6':
+ resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==}
+ engines: {node: '>=6.9.0'}
+
+ '@biomejs/biome@1.9.2':
+ resolution: {integrity: sha512-4j2Gfwft8Jqp1X0qLYvK4TEy4xhTo4o6rlvJPsjPeEame8gsmbGQfOPBkw7ur+7/Z/f0HZmCZKqbMvR7vTXQYQ==}
+ engines: {node: '>=14.21.3'}
+ hasBin: true
+
+ '@biomejs/cli-darwin-arm64@1.9.2':
+ resolution: {integrity: sha512-rbs9uJHFmhqB3Td0Ro+1wmeZOHhAPTL3WHr8NtaVczUmDhXkRDWScaxicG9+vhSLj1iLrW47itiK6xiIJy6vaA==}
+ engines: {node: '>=14.21.3'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@biomejs/cli-darwin-x64@1.9.2':
+ resolution: {integrity: sha512-BlfULKijNaMigQ9GH9fqJVt+3JTDOSiZeWOQtG/1S1sa8Lp046JHG3wRJVOvekTPL9q/CNFW1NVG8J0JN+L1OA==}
+ engines: {node: '>=14.21.3'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@biomejs/cli-linux-arm64-musl@1.9.2':
+ resolution: {integrity: sha512-ZATvbUWhNxegSALUnCKWqetTZqrK72r2RsFD19OK5jXDj/7o1hzI1KzDNG78LloZxftrwr3uI9SqCLh06shSZw==}
+ engines: {node: '>=14.21.3'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@biomejs/cli-linux-arm64@1.9.2':
+ resolution: {integrity: sha512-T8TJuSxuBDeQCQzxZu2o3OU4eyLumTofhCxxFd3+aH2AEWVMnH7Z/c3QP1lHI5RRMBP9xIJeMORqDQ5j+gVZzw==}
+ engines: {node: '>=14.21.3'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@biomejs/cli-linux-x64-musl@1.9.2':
+ resolution: {integrity: sha512-CjPM6jT1miV5pry9C7qv8YJk0FIZvZd86QRD3atvDgfgeh9WQU0k2Aoo0xUcPdTnoz0WNwRtDicHxwik63MmSg==}
+ engines: {node: '>=14.21.3'}
+ cpu: [x64]
+ os: [linux]
+
+ '@biomejs/cli-linux-x64@1.9.2':
+ resolution: {integrity: sha512-T0cPk3C3Jr2pVlsuQVTBqk2qPjTm8cYcTD9p/wmR9MeVqui1C/xTVfOIwd3miRODFMrJaVQ8MYSXnVIhV9jTjg==}
+ engines: {node: '>=14.21.3'}
+ cpu: [x64]
+ os: [linux]
+
+ '@biomejs/cli-win32-arm64@1.9.2':
+ resolution: {integrity: sha512-2x7gSty75bNIeD23ZRPXyox6Z/V0M71ObeJtvQBhi1fgrvPdtkEuw7/0wEHg6buNCubzOFuN9WYJm6FKoUHfhg==}
+ engines: {node: '>=14.21.3'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@biomejs/cli-win32-x64@1.9.2':
+ resolution: {integrity: sha512-JC3XvdYcjmu1FmAehVwVV0SebLpeNTnO2ZaMdGCSOdS7f8O9Fq14T2P1gTG1Q29Q8Dt1S03hh0IdVpIZykOL8g==}
+ engines: {node: '>=14.21.3'}
+ cpu: [x64]
+ os: [win32]
+
+ '@esbuild/aix-ppc64@0.21.5':
+ resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.21.5':
+ resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.21.5':
+ resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.21.5':
+ resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.21.5':
+ resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.21.5':
+ resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.21.5':
+ resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.21.5':
+ resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.21.5':
+ resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.21.5':
+ resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.21.5':
+ resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.21.5':
+ resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.21.5':
+ resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.21.5':
+ resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.21.5':
+ resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.21.5':
+ resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.21.5':
+ resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-x64@0.21.5':
+ resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-x64@0.21.5':
+ resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/sunos-x64@0.21.5':
+ resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.21.5':
+ resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.21.5':
+ resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.21.5':
+ resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+
+ '@jridgewell/gen-mapping@0.3.5':
+ resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/set-array@1.2.1':
+ resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/sourcemap-codec@1.5.0':
+ resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
+ '@jridgewell/trace-mapping@0.3.25':
+ resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+
+ '@noble/curves@1.4.0':
+ resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==}
+
+ '@noble/curves@1.6.0':
+ resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==}
+ engines: {node: ^14.21.3 || >=16}
+
+ '@noble/hashes@1.4.0':
+ resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==}
+ engines: {node: '>= 16'}
+
+ '@noble/hashes@1.5.0':
+ resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==}
+ engines: {node: ^14.21.3 || >=16}
+
+ '@rollup/rollup-android-arm-eabi@4.22.4':
+ resolution: {integrity: sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.22.4':
+ resolution: {integrity: sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.22.4':
+ resolution: {integrity: sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.22.4':
+ resolution: {integrity: sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.22.4':
+ resolution: {integrity: sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.22.4':
+ resolution: {integrity: sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-gnu@4.22.4':
+ resolution: {integrity: sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-musl@4.22.4':
+ resolution: {integrity: sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.22.4':
+ resolution: {integrity: sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.22.4':
+ resolution: {integrity: sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-s390x-gnu@4.22.4':
+ resolution: {integrity: sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-gnu@4.22.4':
+ resolution: {integrity: sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-musl@4.22.4':
+ resolution: {integrity: sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-win32-arm64-msvc@4.22.4':
+ resolution: {integrity: sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.22.4':
+ resolution: {integrity: sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.22.4':
+ resolution: {integrity: sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==}
+ cpu: [x64]
+ os: [win32]
+
+ '@scure/base@1.1.9':
+ resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==}
+
+ '@scure/bip32@1.4.0':
+ resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==}
+
+ '@scure/bip32@1.5.0':
+ resolution: {integrity: sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==}
+
+ '@scure/bip39@1.4.0':
+ resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==}
+
+ '@types/babel__core@7.20.5':
+ resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+
+ '@types/babel__generator@7.6.8':
+ resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
+
+ '@types/babel__template@7.4.4':
+ resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+
+ '@types/babel__traverse@7.20.6':
+ resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==}
+
+ '@types/estree@1.0.5':
+ resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
+
+ '@types/prop-types@15.7.13':
+ resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==}
+
+ '@types/react-dom@18.3.0':
+ resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==}
+
+ '@types/react@18.3.8':
+ resolution: {integrity: sha512-syBUrW3/XpnW4WJ41Pft+I+aPoDVbrBVQGEnbD7NijDGlVC+8gV/XKRY+7vMDlfPpbwYt0l1vd/Sj8bJGMbs9Q==}
+
+ '@vitejs/plugin-react@4.3.1':
+ resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ vite: ^4.2.0 || ^5.0.0
+
+ abitype@1.0.5:
+ resolution: {integrity: sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==}
+ peerDependencies:
+ typescript: '>=5.0.4'
+ zod: ^3 >=3.22.0
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ zod:
+ optional: true
+
+ abitype@1.0.6:
+ resolution: {integrity: sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==}
+ peerDependencies:
+ typescript: '>=5.0.4'
+ zod: ^3 >=3.22.0
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ zod:
+ optional: true
+
+ ansi-styles@3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+
+ browserslist@4.23.3:
+ resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ caniuse-lite@1.0.30001663:
+ resolution: {integrity: sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA==}
+
+ chalk@2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+
+ color-convert@1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+
+ color-name@1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ debug@4.3.7:
+ resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ electron-to-chromium@1.5.27:
+ resolution: {integrity: sha512-o37j1vZqCoEgBuWWXLHQgTN/KDKe7zwpiY5CPeq2RvUqOyJw9xnrULzZAEVQ5p4h+zjMk7hgtOoPdnLxr7m/jw==}
+
+ esbuild@0.21.5:
+ resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
+ engines: {node: '>=12'}
+ hasBin: true
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+
+ eventemitter3@5.0.1:
+ resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ globals@11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+
+ globals@15.9.0:
+ resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==}
+ engines: {node: '>=18'}
+
+ has-flag@3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+
+ isows@1.0.4:
+ resolution: {integrity: sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ==}
+ peerDependencies:
+ ws: '*'
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ jsesc@2.5.2:
+ resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ nanoid@3.3.7:
+ resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ node-releases@2.0.18:
+ resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
+
+ ox@0.0.0-canary-20240923043550:
+ resolution: {integrity: sha512-omVQbzT/M7t42vPr8RCpOfGkSNmV6oHOxIamNZwjZeKsUC0JeOiLvAu07vWW+scQI/+8EkxtRyLnSf8R6bBGzg==}
+ peerDependencies:
+ typescript: '>=5.4.0'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ picocolors@1.1.0:
+ resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==}
+
+ postcss@8.4.47:
+ resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ react-dom@18.3.1:
+ resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
+ peerDependencies:
+ react: ^18.3.1
+
+ react-refresh@0.14.2:
+ resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==}
+ engines: {node: '>=0.10.0'}
+
+ react@18.3.1:
+ resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
+ engines: {node: '>=0.10.0'}
+
+ rollup@4.22.4:
+ resolution: {integrity: sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ scheduler@0.23.2:
+ resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ supports-color@5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+
+ to-fast-properties@2.0.0:
+ resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+ engines: {node: '>=4'}
+
+ typescript@5.6.2:
+ resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ update-browserslist-db@1.1.0:
+ resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ viem@2.21.14:
+ resolution: {integrity: sha512-uM6XmY9Q/kJRVSopJAGsakmtNDpk/EswqXUzwOp9DzhGuwgpWtw2MgwpfFdIyqBDFIw+TTypCIUTcwJSgEYSzA==}
+ peerDependencies:
+ typescript: '>=5.0.4'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ vite@5.4.7:
+ resolution: {integrity: sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || >=20.0.0
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ sass-embedded: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+
+ webauthn-p256@0.0.5:
+ resolution: {integrity: sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg==}
+
+ ws@8.17.1:
+ resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==}
+ 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
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+snapshots:
+
+ '@adraffy/ens-normalize@1.10.0': {}
+
+ '@adraffy/ens-normalize@1.11.0': {}
+
+ '@ampproject/remapping@2.3.0':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@babel/code-frame@7.24.7':
+ dependencies:
+ '@babel/highlight': 7.24.7
+ picocolors: 1.1.0
+
+ '@babel/compat-data@7.25.4': {}
+
+ '@babel/core@7.25.2':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.24.7
+ '@babel/generator': 7.25.6
+ '@babel/helper-compilation-targets': 7.25.2
+ '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2)
+ '@babel/helpers': 7.25.6
+ '@babel/parser': 7.25.6
+ '@babel/template': 7.25.0
+ '@babel/traverse': 7.25.6
+ '@babel/types': 7.25.6
+ convert-source-map: 2.0.0
+ debug: 4.3.7
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.25.6':
+ dependencies:
+ '@babel/types': 7.25.6
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+ jsesc: 2.5.2
+
+ '@babel/helper-compilation-targets@7.25.2':
+ dependencies:
+ '@babel/compat-data': 7.25.4
+ '@babel/helper-validator-option': 7.24.8
+ browserslist: 4.23.3
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-module-imports@7.24.7':
+ dependencies:
+ '@babel/traverse': 7.25.6
+ '@babel/types': 7.25.6
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)':
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-module-imports': 7.24.7
+ '@babel/helper-simple-access': 7.24.7
+ '@babel/helper-validator-identifier': 7.24.7
+ '@babel/traverse': 7.25.6
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-plugin-utils@7.24.8': {}
+
+ '@babel/helper-simple-access@7.24.7':
+ dependencies:
+ '@babel/traverse': 7.25.6
+ '@babel/types': 7.25.6
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-string-parser@7.24.8': {}
+
+ '@babel/helper-validator-identifier@7.24.7': {}
+
+ '@babel/helper-validator-option@7.24.8': {}
+
+ '@babel/helpers@7.25.6':
+ dependencies:
+ '@babel/template': 7.25.0
+ '@babel/types': 7.25.6
+
+ '@babel/highlight@7.24.7':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.24.7
+ chalk: 2.4.2
+ js-tokens: 4.0.0
+ picocolors: 1.1.0
+
+ '@babel/parser@7.25.6':
+ dependencies:
+ '@babel/types': 7.25.6
+
+ '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2)':
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+
+ '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.25.2)':
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+
+ '@babel/template@7.25.0':
+ dependencies:
+ '@babel/code-frame': 7.24.7
+ '@babel/parser': 7.25.6
+ '@babel/types': 7.25.6
+
+ '@babel/traverse@7.25.6':
+ dependencies:
+ '@babel/code-frame': 7.24.7
+ '@babel/generator': 7.25.6
+ '@babel/parser': 7.25.6
+ '@babel/template': 7.25.0
+ '@babel/types': 7.25.6
+ debug: 4.3.7
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.25.6':
+ dependencies:
+ '@babel/helper-string-parser': 7.24.8
+ '@babel/helper-validator-identifier': 7.24.7
+ to-fast-properties: 2.0.0
+
+ '@biomejs/biome@1.9.2':
+ optionalDependencies:
+ '@biomejs/cli-darwin-arm64': 1.9.2
+ '@biomejs/cli-darwin-x64': 1.9.2
+ '@biomejs/cli-linux-arm64': 1.9.2
+ '@biomejs/cli-linux-arm64-musl': 1.9.2
+ '@biomejs/cli-linux-x64': 1.9.2
+ '@biomejs/cli-linux-x64-musl': 1.9.2
+ '@biomejs/cli-win32-arm64': 1.9.2
+ '@biomejs/cli-win32-x64': 1.9.2
+
+ '@biomejs/cli-darwin-arm64@1.9.2':
+ optional: true
+
+ '@biomejs/cli-darwin-x64@1.9.2':
+ optional: true
+
+ '@biomejs/cli-linux-arm64-musl@1.9.2':
+ optional: true
+
+ '@biomejs/cli-linux-arm64@1.9.2':
+ optional: true
+
+ '@biomejs/cli-linux-x64-musl@1.9.2':
+ optional: true
+
+ '@biomejs/cli-linux-x64@1.9.2':
+ optional: true
+
+ '@biomejs/cli-win32-arm64@1.9.2':
+ optional: true
+
+ '@biomejs/cli-win32-x64@1.9.2':
+ optional: true
+
+ '@esbuild/aix-ppc64@0.21.5':
+ optional: true
+
+ '@esbuild/android-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/android-arm@0.21.5':
+ optional: true
+
+ '@esbuild/android-x64@0.21.5':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/darwin-x64@0.21.5':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-arm@0.21.5':
+ optional: true
+
+ '@esbuild/linux-ia32@0.21.5':
+ optional: true
+
+ '@esbuild/linux-loong64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.21.5':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-s390x@0.21.5':
+ optional: true
+
+ '@esbuild/linux-x64@0.21.5':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.21.5':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.21.5':
+ optional: true
+
+ '@esbuild/sunos-x64@0.21.5':
+ optional: true
+
+ '@esbuild/win32-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/win32-ia32@0.21.5':
+ optional: true
+
+ '@esbuild/win32-x64@0.21.5':
+ optional: true
+
+ '@jridgewell/gen-mapping@0.3.5':
+ dependencies:
+ '@jridgewell/set-array': 1.2.1
+ '@jridgewell/sourcemap-codec': 1.5.0
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/set-array@1.2.1': {}
+
+ '@jridgewell/sourcemap-codec@1.5.0': {}
+
+ '@jridgewell/trace-mapping@0.3.25':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ '@noble/curves@1.4.0':
+ dependencies:
+ '@noble/hashes': 1.4.0
+
+ '@noble/curves@1.6.0':
+ dependencies:
+ '@noble/hashes': 1.5.0
+
+ '@noble/hashes@1.4.0': {}
+
+ '@noble/hashes@1.5.0': {}
+
+ '@rollup/rollup-android-arm-eabi@4.22.4':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.22.4':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.22.4':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.22.4':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.22.4':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.22.4':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.22.4':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.22.4':
+ optional: true
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.22.4':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.22.4':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.22.4':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.22.4':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.22.4':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.22.4':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.22.4':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.22.4':
+ optional: true
+
+ '@scure/base@1.1.9': {}
+
+ '@scure/bip32@1.4.0':
+ dependencies:
+ '@noble/curves': 1.4.0
+ '@noble/hashes': 1.4.0
+ '@scure/base': 1.1.9
+
+ '@scure/bip32@1.5.0':
+ dependencies:
+ '@noble/curves': 1.6.0
+ '@noble/hashes': 1.5.0
+ '@scure/base': 1.1.9
+
+ '@scure/bip39@1.4.0':
+ dependencies:
+ '@noble/hashes': 1.5.0
+ '@scure/base': 1.1.9
+
+ '@types/babel__core@7.20.5':
+ dependencies:
+ '@babel/parser': 7.25.6
+ '@babel/types': 7.25.6
+ '@types/babel__generator': 7.6.8
+ '@types/babel__template': 7.4.4
+ '@types/babel__traverse': 7.20.6
+
+ '@types/babel__generator@7.6.8':
+ dependencies:
+ '@babel/types': 7.25.6
+
+ '@types/babel__template@7.4.4':
+ dependencies:
+ '@babel/parser': 7.25.6
+ '@babel/types': 7.25.6
+
+ '@types/babel__traverse@7.20.6':
+ dependencies:
+ '@babel/types': 7.25.6
+
+ '@types/estree@1.0.5': {}
+
+ '@types/prop-types@15.7.13': {}
+
+ '@types/react-dom@18.3.0':
+ dependencies:
+ '@types/react': 18.3.8
+
+ '@types/react@18.3.8':
+ dependencies:
+ '@types/prop-types': 15.7.13
+ csstype: 3.1.3
+
+ '@vitejs/plugin-react@4.3.1(vite@5.4.7)':
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2)
+ '@types/babel__core': 7.20.5
+ react-refresh: 0.14.2
+ vite: 5.4.7
+ transitivePeerDependencies:
+ - supports-color
+
+ abitype@1.0.5(typescript@5.6.2):
+ optionalDependencies:
+ typescript: 5.6.2
+
+ abitype@1.0.6(typescript@5.6.2):
+ optionalDependencies:
+ typescript: 5.6.2
+
+ ansi-styles@3.2.1:
+ dependencies:
+ color-convert: 1.9.3
+
+ browserslist@4.23.3:
+ dependencies:
+ caniuse-lite: 1.0.30001663
+ electron-to-chromium: 1.5.27
+ node-releases: 2.0.18
+ update-browserslist-db: 1.1.0(browserslist@4.23.3)
+
+ caniuse-lite@1.0.30001663: {}
+
+ chalk@2.4.2:
+ dependencies:
+ ansi-styles: 3.2.1
+ escape-string-regexp: 1.0.5
+ supports-color: 5.5.0
+
+ color-convert@1.9.3:
+ dependencies:
+ color-name: 1.1.3
+
+ color-name@1.1.3: {}
+
+ convert-source-map@2.0.0: {}
+
+ csstype@3.1.3: {}
+
+ debug@4.3.7:
+ dependencies:
+ ms: 2.1.3
+
+ electron-to-chromium@1.5.27: {}
+
+ esbuild@0.21.5:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.21.5
+ '@esbuild/android-arm': 0.21.5
+ '@esbuild/android-arm64': 0.21.5
+ '@esbuild/android-x64': 0.21.5
+ '@esbuild/darwin-arm64': 0.21.5
+ '@esbuild/darwin-x64': 0.21.5
+ '@esbuild/freebsd-arm64': 0.21.5
+ '@esbuild/freebsd-x64': 0.21.5
+ '@esbuild/linux-arm': 0.21.5
+ '@esbuild/linux-arm64': 0.21.5
+ '@esbuild/linux-ia32': 0.21.5
+ '@esbuild/linux-loong64': 0.21.5
+ '@esbuild/linux-mips64el': 0.21.5
+ '@esbuild/linux-ppc64': 0.21.5
+ '@esbuild/linux-riscv64': 0.21.5
+ '@esbuild/linux-s390x': 0.21.5
+ '@esbuild/linux-x64': 0.21.5
+ '@esbuild/netbsd-x64': 0.21.5
+ '@esbuild/openbsd-x64': 0.21.5
+ '@esbuild/sunos-x64': 0.21.5
+ '@esbuild/win32-arm64': 0.21.5
+ '@esbuild/win32-ia32': 0.21.5
+ '@esbuild/win32-x64': 0.21.5
+
+ escalade@3.2.0: {}
+
+ escape-string-regexp@1.0.5: {}
+
+ eventemitter3@5.0.1: {}
+
+ fsevents@2.3.3:
+ optional: true
+
+ gensync@1.0.0-beta.2: {}
+
+ globals@11.12.0: {}
+
+ globals@15.9.0: {}
+
+ has-flag@3.0.0: {}
+
+ isows@1.0.4(ws@8.17.1):
+ dependencies:
+ ws: 8.17.1
+
+ js-tokens@4.0.0: {}
+
+ jsesc@2.5.2: {}
+
+ json5@2.2.3: {}
+
+ loose-envify@1.4.0:
+ dependencies:
+ js-tokens: 4.0.0
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ ms@2.1.3: {}
+
+ nanoid@3.3.7: {}
+
+ node-releases@2.0.18: {}
+
+ ox@0.0.0-canary-20240923043550(typescript@5.6.2):
+ dependencies:
+ '@adraffy/ens-normalize': 1.11.0
+ '@noble/curves': 1.6.0
+ '@noble/hashes': 1.5.0
+ '@scure/bip32': 1.5.0
+ '@scure/bip39': 1.4.0
+ abitype: 1.0.6(typescript@5.6.2)
+ eventemitter3: 5.0.1
+ optionalDependencies:
+ typescript: 5.6.2
+ transitivePeerDependencies:
+ - zod
+
+ picocolors@1.1.0: {}
+
+ postcss@8.4.47:
+ dependencies:
+ nanoid: 3.3.7
+ picocolors: 1.1.0
+ source-map-js: 1.2.1
+
+ react-dom@18.3.1(react@18.3.1):
+ dependencies:
+ loose-envify: 1.4.0
+ react: 18.3.1
+ scheduler: 0.23.2
+
+ react-refresh@0.14.2: {}
+
+ react@18.3.1:
+ dependencies:
+ loose-envify: 1.4.0
+
+ rollup@4.22.4:
+ dependencies:
+ '@types/estree': 1.0.5
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.22.4
+ '@rollup/rollup-android-arm64': 4.22.4
+ '@rollup/rollup-darwin-arm64': 4.22.4
+ '@rollup/rollup-darwin-x64': 4.22.4
+ '@rollup/rollup-linux-arm-gnueabihf': 4.22.4
+ '@rollup/rollup-linux-arm-musleabihf': 4.22.4
+ '@rollup/rollup-linux-arm64-gnu': 4.22.4
+ '@rollup/rollup-linux-arm64-musl': 4.22.4
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.22.4
+ '@rollup/rollup-linux-riscv64-gnu': 4.22.4
+ '@rollup/rollup-linux-s390x-gnu': 4.22.4
+ '@rollup/rollup-linux-x64-gnu': 4.22.4
+ '@rollup/rollup-linux-x64-musl': 4.22.4
+ '@rollup/rollup-win32-arm64-msvc': 4.22.4
+ '@rollup/rollup-win32-ia32-msvc': 4.22.4
+ '@rollup/rollup-win32-x64-msvc': 4.22.4
+ fsevents: 2.3.3
+
+ scheduler@0.23.2:
+ dependencies:
+ loose-envify: 1.4.0
+
+ semver@6.3.1: {}
+
+ source-map-js@1.2.1: {}
+
+ supports-color@5.5.0:
+ dependencies:
+ has-flag: 3.0.0
+
+ to-fast-properties@2.0.0: {}
+
+ typescript@5.6.2: {}
+
+ update-browserslist-db@1.1.0(browserslist@4.23.3):
+ dependencies:
+ browserslist: 4.23.3
+ escalade: 3.2.0
+ picocolors: 1.1.0
+
+ viem@2.21.14(typescript@5.6.2):
+ dependencies:
+ '@adraffy/ens-normalize': 1.10.0
+ '@noble/curves': 1.4.0
+ '@noble/hashes': 1.4.0
+ '@scure/bip32': 1.4.0
+ '@scure/bip39': 1.4.0
+ abitype: 1.0.5(typescript@5.6.2)
+ isows: 1.0.4(ws@8.17.1)
+ webauthn-p256: 0.0.5
+ ws: 8.17.1
+ optionalDependencies:
+ typescript: 5.6.2
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ - zod
+
+ vite@5.4.7:
+ dependencies:
+ esbuild: 0.21.5
+ postcss: 8.4.47
+ rollup: 4.22.4
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ webauthn-p256@0.0.5:
+ dependencies:
+ '@noble/curves': 1.6.0
+ '@noble/hashes': 1.5.0
+
+ ws@8.17.1: {}
+
+ yallist@3.1.1: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
new file mode 100644
index 0000000..e1fec93
--- /dev/null
+++ b/pnpm-workspace.yaml
@@ -0,0 +1,2 @@
+packages:
+ - 'examples/*'
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..688f34e
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,24 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["apps"]
+}