diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index de9797f..1b8fd93 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -184,7 +184,7 @@ jobs:
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
- version: 11
+ version: 10
- name: Install Nargo (for hasher circuit)
run: |
@@ -220,7 +220,7 @@ jobs:
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
- version: 11
+ version: 10
- name: Install Nargo (for hasher circuit)
run: |
@@ -277,7 +277,7 @@ jobs:
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
- version: 11
+ version: 10
- name: Install Stellar CLI
run: |
diff --git a/README.md b/README.md
index 61e47fc..7f352ec 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,6 @@
-# DShield
+> ⚠️ **Plaintext localStorage — Notes stored unencrypted.** The current implementation stores bearer-spendable notes and KYC preimages as plaintext JSON in your browser's localStorage. **Any XSS vulnerability, malicious browser extension, or brief physical access to your device can allow someone to read and spend your notes.** Only use DShield on a personal, secure device. Never use it on shared or public computers. For production use, export and securely back up your notes. See [SECURITY.md](SECURITY.md#plaintext-localstorage-for-notes-and-kyc) for full details and longer-term roadmap (passphrase-derived encryption).
+
+> ⚠️ **Rate limiter — single-instance only.** The API rate limiter (`frontend/src/lib/rateLimit.ts`) is in-memory and per-process: each server instance has its own counters, and they reset on every redeploy. This is fine for the current single-instance testnet setup, but provides no real protection in a multi-instance deployment (e.g. behind a load balancer). If you scale horizontally, replace it with a distributed limiter backed by a shared store such as [Upstash Redis](https://upstash.com/) or Vercel KV. See [SECURITY.md](SECURITY.md#rate-limiter--single-instance-only) for the full upgrade path.
> **Private by Default. Compliant by Choice.**
@@ -6,443 +8,4 @@ DShield is a consumer-grade shielded stablecoin wallet built on Stellar that ena
Users can send and receive funds without publicly exposing transaction amounts, balances, or payment history while retaining the ability to selectively disclose information when required for compliance, auditing, or regulatory reporting.
-Built for **Stellar Hacks: Real-World ZK**, DShield demonstrates how privacy and compliance can coexist in modern financial systems.
-
----
-
-## New to ZK or Stellar?
-
-See **[GLOSSARY.md](GLOSSARY.md)** for plain-English definitions of terms like _nullifier_, _commitment_, _Merkle root_, _UltraHonk_, _Poseidon2_, _selective disclosure_, _relayer_, and more — everything you need to navigate the codebase without a cryptography background.
-
----
-
-## Vision
-
-Today's digital payments force users to choose between:
-
-- Complete transparency (traditional blockchains)
-- Complete anonymity (privacy-focused networks)
-
-Neither option works for real-world finance.
-
-DShield introduces a third model:
-
-> Prove what's true. Reveal nothing else.
-
-Using Zero-Knowledge Proofs, users can prove ownership, authorization, compliance, and transaction validity without exposing sensitive financial information.
-
----
-
-## Problem
-
-Public blockchains expose:
-
-- Wallet balances
-- Transaction history
-- Payment amounts
-- Financial relationships
-
-Anyone can analyze a user's entire financial activity.
-
-For stablecoins intended for everyday payments, payroll, remittances, and commerce, this level of transparency creates serious privacy concerns.
-
-At the same time, regulators and institutions require mechanisms for compliance and accountability.
-
-Current privacy solutions often sacrifice one for the other.
-
----
-
-## Solution
-
-DShield combines:
-
-- Shielded transactions
-- Zero-Knowledge Proofs
-- Selective disclosure
-- Compliance-aware architecture
-
-to create a private payments experience that feels like traditional banking while maintaining blockchain security and verifiability.
-
-Users can:
-
-✅ Send private USDC payments
-
-✅ Hide transaction amounts
-
-✅ Hide wallet balances
-
-✅ Prevent transaction graph analysis
-
-✅ Prove compliance without exposing personal data
-
-✅ Reveal information only when necessary
-
----
-
-## How It Works
-
-### 1. Deposit
-
-Users deposit USDC into a shielded pool.
-
-The deposit creates a cryptographic commitment that represents ownership of funds without revealing balances publicly.
-
----
-
-### 2. Private Transfer
-
-When sending funds:
-
-- A Zero-Knowledge Proof is generated client-side
-- The proof demonstrates:
- - Ownership of funds
- - Valid transaction construction
- - No double-spending
- - Balance preservation
-
-without revealing:
-
-- Sender
-- Receiver
-- Amount
-
----
-
-### 3. On-Chain Verification
-
-A Soroban smart contract verifies the proof using Stellar's native ZK primitives.
-
-Only the proof validity is revealed.
-
-No private transaction data becomes public.
-
----
-
-### 4. Selective Disclosure
-
-Users can generate specialized proofs for:
-
-#### Compliance Proof
-
-Prove:
-
-- KYC completed
-- Wallet authorized
-- Jurisdiction approved
-
-without revealing identity information.
-
-#### Audit Proof
-
-Prove:
-
-- Source of funds
-- Transaction legitimacy
-- Ownership of assets
-
-without exposing unrelated transactions.
-
-#### Regulatory Reporting
-
-Reveal only the specific information required by regulators while preserving overall financial privacy.
-
----
-
-## Implementation Status
-
-What is **built and verified on-chain today** (testnet), versus the broader vision above:
-
-| Capability | Status |
-| --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| Shielded deposit (USDC → commitment in a Merkle tree) | ✅ Working on testnet |
-| Client-side ZK proof (Noir + UltraHonk, keccak transform) | ✅ |
-| On-chain proof verification (Soroban + BN254/Poseidon2) | ✅ |
-| Shielded withdrawal to any recipient | ✅ |
-| Double-spend prevention (nullifiers) | ✅ |
-| Recipient binding (anti front-running) | ✅ |
-| **Relayer** — withdrawer's account never appears on-chain | ✅ |
-| Compliance: KYC registry + compliance proof verification | ✅ Verified on testnet via CLI (`just demo-compliance`); not yet wired into the web app UI. `disclosed_amount` is cross-checked against the real pool's fixed `deposit_amount` on-chain, not self-asserted by the prover |
-| Selective disclosure: threshold proofs (balance ≥ X) | ✅ Circuit + contract implemented and CLI-verified; no web UI yet. `threshold` is likewise checked against the pool's real `deposit_amount` on-chain |
-| Arbitrary-amount private _transfers_ between users | 🚧 Future (today: fixed-denomination pools) |
-
-DShield is currently a **fixed-denomination shielded pool** (Tornado-style: deposit a tier amount, withdraw it to any address). Privacy comes from breaking the on-chain link between depositor and recipient — not from hiding the tier amount. Relayed withdrawals mean the withdrawer never signs or pays a fee from their own account.
-
----
-
-## Live on Testnet
-
-Deployed to Stellar **testnet** (`Test SDF Network ; September 2015`). View on [Stellar Expert](https://stellar.expert/explorer/testnet):
-
-| Contract | ID |
-| ---------------------------- | ---------------------------------------------------------- |
-| Shielded pool (10 USDC tier) | `CBQ3EPNIMGLS53U4HHLT4V3HAGJJCLONVXAN2QEREGQZMFQOLK7VF6C7` |
-| UltraHonk verifier | `CA64EBZWHEXVBJRQ3U76MRDVZUMIOL6TYTGG6427URU3OV5D3ZLXNKCM` |
-| Compliance | `CDU7ARSZFXBGXHLUFO6AF3MDPVJNWBBOEGDI57FP3E2OR4I4M6DCVPDR` |
-| Test USDC (SAC) | `CDYZE3XQZA2UYUTYEEVLOKSYDD44CQZ6LYJIKQEDIUYBXNVSNXEQVGEG` |
-
-A full **deposit → relayed withdraw** loop has been executed on testnet: the pool paid the recipient, the nullifier was consumed, and re-submitting the same proof failed with `NullifierUsed`.
-
----
-
-## Build, Run & Verify
-
-**Prerequisites:** Rust + `wasm32v1-none`, [`stellar` CLI](https://developers.stellar.org/docs/tools/cli), [Noir (`nargo`)](https://noir-lang.org/docs) + Barretenberg (`bb`), Node + `pnpm`, [`just`](https://github.com/casey/just). Run `just setup` to check.
-
-```bash
-# Run all tests (Rust contracts + frontend) — 85 contract + 50 frontend tests
-just test
-
-# Local: start a quickstart network, fund accounts, deploy everything,
-# and write frontend/.env.local
-just start && just deploy
-
-# Testnet: deploy all contracts and point the app at testnet
-just deploy testnet
-
-# Copy environment variables (if not using just deploy)
-cp frontend/.env.local.example frontend/.env.local
-
-# Run the wallet UI
-cd frontend && pnpm install && pnpm dev # http://localhost:3000
-```
-
-`just deploy` provisions the verifier, three pool tiers (10/100/1000 USDC), a test-USDC asset, a compliance contract, plus a **faucet issuer** and a **relayer** account, and writes the matching `frontend/.env.local`.
-
----
-
-## One-Command Demo
-
-```bash
-just demo # privacy loop: deposit -> ZK proof -> relayed withdraw
-just demo-compliance # compliant disclosure: register KYC -> ZK proof -> verify
-```
-
-`just demo` runs the whole privacy loop on-chain and prints each step: it deposits into the pool, generates a real ZK proof bound to the recipient, submits the withdrawal **through the relayer** (so your account never appears on-chain), and verifies the recipient was paid and the nullifier consumed.
-
-`just demo-compliance` runs the compliant-disclosure loop: an admin registers a KYC hash, a real compliance proof (KYC ownership + note ownership + selective amount disclosure, bound to an auditor key) is generated, and the contract verifies it on-chain — plus a negative check proving an unregistered KYC hash is rejected. Both demos take the network as an argument (e.g. `just demo-compliance testnet`).
-
----
-
-## Security Model
-
-Three properties hold the system together (each enforced on-chain and covered by tests):
-
-1. **Hash consistency** — the contract's Poseidon2 (`soroban_poseidon`) produces byte-identical output to the Noir circuit and the frontend, so the on-chain Merkle root always matches the root the proof is generated against. Locked by `test_recipient_hash_matches_frontend`, `test_single_leaf_root_matches_circuit`.
-2. **Recipient binding** — the withdrawal proof commits to a recipient hash, and the contract recomputes that hash from the actual payout address (`recipient_hash_from_address`) and rejects a mismatch. Without this, anyone could front-run a pending withdrawal and redirect the funds. This is also what makes the relayer trustless: it can submit or refuse, but never steal. Locked by `test_withdraw_to_different_recipient_than_proof_rejected` (a proof bound to recipient A submitted with payout address B is rejected with `RecipientMismatch`) and `test_withdraw_recipient_mismatch_rejected`; `test_withdraw_correct_recipient_passes_binding` confirms a correctly-bound recipient is not rejected by this check.
-3. **Double-spend prevention** — each withdrawal consumes a nullifier stored in persistent storage; replaying a proof fails with `NullifierUsed`. Locked by `test_replaying_consumed_nullifier_returns_nullifier_used`, which replays a proof whose nullifier has already been consumed and asserts `NullifierUsed`.
-4. **Trustless tree reconstruction** — clients rebuild the withdrawal Merkle tree from the pool contract's own commitment storage, not by scanning deposit events (which depend on RPC event retention and can go missing). `get_commitments_page(start, limit)` returns leaves in order for a bounded range (capped on-chain at `MAX_PAGE_SIZE = 100` leaves per call regardless of the requested `limit`), and the frontend (`fetchCommitmentsFromChain`) pages through it until a short page signals the end. The older `get_commitments()` (no pagination) still exists for small/local pools, but reads every leaf in one call and will hit Soroban's per-transaction CPU/footprint limits well before a pool nears `MAX_LEAVES = 2^20` — prefer the paginated view for anything beyond a demo pool.
-
-Unbounded data (commitments, nullifiers) lives in **persistent storage** with TTL extension, so the size-capped instance entry doesn't grow with usage.
-
-> ⚠️ Testnet demo only — unaudited. `frontend/.env.local` holds throwaway dev/faucet/relayer secrets and is gitignored; do not reuse them or carry this to mainnet without an audit. The relayer takes no fee (eats gas) and is a single point of censorship (not theft).
-
-> ⚠️ **Rate limiter — single-instance only.** The API rate limiter (`frontend/src/lib/rateLimit.ts`) is in-memory and per-process: each server instance has its own counters, and they reset on every redeploy. This is fine for the current single-instance testnet setup, but provides no real protection in a multi-instance deployment (e.g. behind a load balancer). If you scale horizontally, replace it with a distributed limiter backed by a shared store such as [Upstash Redis](https://upstash.com/) or Vercel KV. See [SECURITY.md](SECURITY.md#rate-limiter--single-instance-only) for the full upgrade path.
-
----
-
-## Why Stellar
-
-Stellar has recently introduced native support for modern ZK verification through Protocol 25 and Protocol 26.
-
-These upgrades provide:
-
-- BN254 elliptic curve operations
-- Pairing checks
-- Poseidon hashing
-- Multi-scalar multiplication
-- Efficient zkSNARK verification
-
-This allows DShield to verify proofs on-chain efficiently and affordably.
-
----
-
-## Architecture
-
-````
-+-----------------------+
-| DShield App |
-+-----------------------+
- |
- v
-+-----------------------+
-| Client-side Prover |
-| (Noir / zkSNARKs) |
-+-----------------------+
- |
- v
-+-----------------------+
-| Shielded Pool |
-| Commitments |
-| Nullifiers |
-+-----------------------+
- |
- v
-+-----------------------+
-| Soroban Verifier |
-| BN254 Verification |
-+-----------------------+
- |
- v
-+-----------------------+
-| Stellar Network |
-+-----------------------+
-```mermaid
-flowchart TD
- A["DShield App"] --> B["Client-side Prover\n(Noir / zkSNARKs)"]
- B --> C["Shielded Pool\nCommitments · Nullifiers"]
- C --> D["Soroban Verifier\nBN254 Verification"]
- D --> E["Stellar Network"]
-````
-
-## Tech Stack
-
-### Blockchain
-
-- Stellar
-- Soroban
-
-### Zero-Knowledge
-
-- Noir
-- UltraHonk
-- zkSNARKs
-- BN254
-
-### Cryptography
-
-- Poseidon Hash
-- Poseidon2 Hash
-- Merkle Trees
-
-### Frontend
-
-- Next.js
-- TypeScript
-- TailwindCSS
-
-### Wallet Integration
-
-- Freighter Wallet
-
-### Storage
-
-- Encrypted local notes
-- Optional decentralized backup
-
----
-
-## Core Features
-
-### Private Payments
-
-Send stablecoins privately.
-
-### Shielded Balances
-
-Wallet balances remain hidden.
-
-### Client-Side Proof Generation
-
-Sensitive data never leaves the user's device.
-
-### Compliance Proofs
-
-Generate proofs without revealing personal information.
-
-### Selective Disclosure
-
-Reveal only what is necessary.
-
-### Consumer-Grade UX
-
-Designed for ordinary users, not cryptography experts.
-
----
-
-## Future Roadmap
-
-### Phase 1
-
-- Shielded deposits
-- Shielded transfers
-- Proof verification
-
-### Phase 2
-
-- Compliance credentials
-- Selective disclosure
-- Auditor access proofs
-
-### Phase 3
-
-- Private payroll
-- Private merchant payments
-- Confidential business treasury management
-
-### Phase 4
-
-- Cross-border remittances
-- Confidential RWA settlements
-- Institutional privacy infrastructure
-
----
-
-## Example Use Cases
-
-### Payroll
-
-Employees receive salaries without exposing compensation publicly.
-
-### Business Payments
-
-Companies protect supplier relationships and payment amounts.
-
-### Remittances
-
-Families receive funds privately.
-
-### Personal Finance
-
-Users maintain financial confidentiality while using stablecoins.
-
-### Institutional Settlement
-
-Organizations can transact confidentially while remaining compliant.
-
----
-
-## Competitive Advantage
-
-| Feature | Traditional Blockchain | Privacy Coins | DShield |
-| -------------------- | ---------------------- | ------------- | ------- |
-| Private Payments | ❌ | ✅ | ✅ |
-| Compliance Friendly | ✅ | ❌ | ✅ |
-| Selective Disclosure | ❌ | ❌ | ✅ |
-| Stablecoin Focus | ✅ | ❌ | ✅ |
-| Consumer UX | ⚠️ | ⚠️ | ✅ |
-
----
-
-## Hackathon Track
-
-**Stellar Hacks: Real-World ZK**
-
-DShield showcases how Zero-Knowledge technology can unlock practical privacy for stablecoin payments without sacrificing compliance, usability, or trust.
-
----
-
-## Team
-
-Built with the belief that privacy should be a default right, not a premium feature.
-
----
-
-## Contributing
-
-Contributions are welcome — see [CONTRIBUTING.md](CONTRIBUTING.md) for setup, testing, and PR guidelines. If you're new to ZK cryptography or Soroban, check [GLOSSARY.md](GLOSSARY.md) for plain-English definitions of the key terms used throughout this codebase. Please review the [Code of Conduct](CODE_OF_CONDUCT.md) before participating, and report security vulnerabilities per [SECURITY.md](SECURITY.md) rather than opening a public issue.
-
----
-
-## License
-
-MIT License
+Built for **Stellar Hacks: Real-World ZK**, DShield demonstrates how privacy and compliance can coexist in modern financial systems.
\ No newline at end of file
diff --git a/SECURITY.md b/SECURITY.md
index ca9d7e6..655f872 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -5,6 +5,51 @@ pool of funds (currently testnet USDC), so security issues are taken
seriously even at this stage — please report them responsibly rather than
opening a public issue.
+## Known Limitations
+
+### Plaintext localStorage for Notes and KYC
+
+**⚠️ CRITICAL: Notes and KYC data are stored unencrypted in browser localStorage**
+
+The current implementation stores bearer-spendable notes and KYC preimages
+as plaintext JSON in your browser's localStorage. This means:
+
+- **Any XSS vulnerability** in the DShield app or a compromised dependency
+ can read your notes and spend them
+- **Malicious browser extensions** with localStorage access can steal your
+ notes
+- **Physical device access** — anyone with brief access to your device (even
+ locked but with the browser still running, depending on OS security) can
+ open DevTools and read your notes
+- **Shared/public computers** — never use DShield on a library computer,
+ internet café, or any shared device
+
+**Each note is equivalent to cash.** If someone obtains your note string,
+they can withdraw those funds to their own address. There is no way to
+revoke or recover a stolen note.
+
+**Mitigation:**
+
+- Only use DShield on a **personal, secure device** with full-disk encryption
+- Keep your browser and OS up to date
+- Be cautious about which browser extensions you install
+- For production use, export your notes (copy the note string from the UI)
+ and store them in a password manager or encrypted backup
+- Consider the **Longer-term roadmap** below for passphrase-based encryption
+
+**Longer-term roadmap:** A future version may add optional
+passphrase-derived encryption for the note store (similar to MetaMask's
+approach), where notes are encrypted with a key derived from a user
+passphrase and only decrypted in memory when needed. This would protect
+against casual device access and malicious extensions (though not against
+XSS while the wallet is unlocked). Until then, treat your device's security
+as the only protection for your notes.
+
+**Cross-tab write protection:** As of this update, concurrent writes
+from multiple tabs/windows no longer silently clobber each other — an
+advisory lock serializes updates. However, this does not address the
+plaintext storage issue.
+
## Scope
Anything that could let someone:
diff --git a/frontend/.npmrc b/frontend/.npmrc
new file mode 100644
index 0000000..c8007c7
--- /dev/null
+++ b/frontend/.npmrc
@@ -0,0 +1,2 @@
+resolution-mode=lowest-direct
+strict-peer-dependencies=false
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index 2b22eec..58f314c 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -6,12 +6,15 @@ settings:
overrides:
protobufjs: ^7.6.5
- postcss: ^8.5.10
+ postcss: ^8.5.18
uuid: ^11.1.1
ws: ^8.21.0
axios: ^1.18.1
next: ^16.2.11
sharp: ^0.35.3
+ acorn: 8.17.0
+ minimatch: 10.0.1
+ electron-to-chromium: 1.5.396
importers:
@@ -40,7 +43,7 @@ importers:
version: 0.8.3
next:
specifier: ^16.2.11
- version: 16.2.11(@babel/core@7.29.7)(@types/node@20.19.43)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ version: 16.2.12(@babel/core@7.29.7)(@types/node@20.19.43)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
react:
specifier: 19.2.4
version: 19.2.4
@@ -267,8 +270,8 @@ packages:
'@emnapi/runtime@1.11.1':
resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==}
- '@emnapi/runtime@1.11.2':
- resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==}
+ '@emnapi/runtime@1.11.3':
+ resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==}
'@emnapi/wasi-threads@1.2.1':
resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==}
@@ -665,60 +668,60 @@ packages:
'@next/bundle-analyzer@16.2.12':
resolution: {integrity: sha512-0dYhmCYsTMFYUFaoEUx+VKw/oYP6b3XiGgq47EujXTE2UGgwVWAaur2tbko2pxfUka3WRZ9YWxa3PlSv3luWNQ==}
- '@next/env@16.2.11':
- resolution: {integrity: sha512-0do5A3BJ2gxWr0ZCMcD6BhW+e595jyxdTl3rXTS6lOtD8ektMiW6CO+EPwt1Eca1DBnm90r/7GdiKWBKxH++DA==}
+ '@next/env@16.2.12':
+ resolution: {integrity: sha512-d0Z5Bc13Fa4nR8pFAKx2jay2yhJM16vlfHbTzYnUQAxlNb6B6lmn4hjt69lYNt4kRtyYP6gEM49lPRHNbIyneg==}
'@next/eslint-plugin-next@16.2.11':
resolution: {integrity: sha512-vMEf/aXOpzFFdtIvFYOnIDPKb0xBbrXONsz83CcKdRrekfxNdL8PNkq5qHqAHSXVlIifnX68LOMaxr3z5PkeLQ==}
- '@next/swc-darwin-arm64@16.2.11':
- resolution: {integrity: sha512-wryL4pjKmDwGv2ox6+GZDFxvmtSRLqApBR8kL1j4+vhB7Z5vJC/zAnXpiR9Xkfzl0AS8WLMnsuGV/UKI67/rrw==}
+ '@next/swc-darwin-arm64@16.2.12':
+ resolution: {integrity: sha512-0W1R0teHWJrqKX0FH20IzzIWAOuGtBxPGuObrxy1lE8hQvCFj49KE8a3WUg0D7sq6rn6zkM4c7YGUnhudBS6oA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@next/swc-darwin-x64@16.2.11':
- resolution: {integrity: sha512-aZl2j4f/fLyjQvOhv0Oe9UaMAQHolYpKhctsoYzplSumKJKPUmgjcf6545aBtysLTcu994TREd0+pSgNE4ohmg==}
+ '@next/swc-darwin-x64@16.2.12':
+ resolution: {integrity: sha512-Hy5Ls099+aFUmOLmIgPfLqNi6iCwhL3uQCssz5rWk+5Nkc6TUKCE83DY5BbNylfm3+mfwcSFnLRfrZDJhVxdtw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@next/swc-linux-arm64-gnu@16.2.11':
- resolution: {integrity: sha512-5jEriyEnH/LWFy27L2ZG0XaLlyEJIjhsImEsiS9P563PKEVp2BVups/xfOucIrsvVntp11oNcZwjHvaDPYVB5g==}
+ '@next/swc-linux-arm64-gnu@16.2.12':
+ resolution: {integrity: sha512-+YqU2h1cQkHsGfvjAsrSmst8UIFBibBGm5x3Xgel8NLMiDQtNOM4sM2GOEMvG5YiOBNeN/Ykk8cQC2S0Xrqljg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@next/swc-linux-arm64-musl@16.2.11':
- resolution: {integrity: sha512-eIjcpx2fnnFSSkZDbTxy74KnokUXDjfoLClpWelfgHLf621aTqswhwXQ7GkD5K5rplrS6LZ/Bj+mVuvzluBOEg==}
+ '@next/swc-linux-arm64-musl@16.2.12':
+ resolution: {integrity: sha512-0qjhiYBaKAqF63LA1ZWAAnKTzFUguAaZiRa5etMLGGPj/B6uEVjtIZldIzFEp3wHlB0koK6aTzqPtSdplTCjoA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@next/swc-linux-x64-gnu@16.2.11':
- resolution: {integrity: sha512-8WgzpaWMs46qJT9kiV47cje86L0x/Mu9t8/Gwj+pnbgW3rETVfCnaScPjlYUwNScpOozdcIMHWmAvuZJUonR2w==}
+ '@next/swc-linux-x64-gnu@16.2.12':
+ resolution: {integrity: sha512-7A3q26W+h7gnA15uqBToNuDqBEFZZcqh0mW2mn4AJh/G5pdg2RVE3n4slzLEliASZFG3NmsbEzng/x2Sh09mBg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@next/swc-linux-x64-musl@16.2.11':
- resolution: {integrity: sha512-I3UgPds7G4ZYnTb/H+5GBGuUT2DhAk6j0mL6A4s63RjFs74wB2hOWP0vaxsK+3NJraExt3eYEPQ/UtT0x/64Nw==}
+ '@next/swc-linux-x64-musl@16.2.12':
+ resolution: {integrity: sha512-qSjL/uppm+cbh21s72Ss8gkiOhQ4dExWHNGOWy6eZV7STj5WsKehgxT61beSsOj+YYQuTplL376lOCdMQU5T8w==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [musl]
- '@next/swc-win32-arm64-msvc@16.2.11':
- resolution: {integrity: sha512-n89CjtcThnjrwgJMAiI5xbqwLY51zvwC9tSlArmVndAJLYVl9T9UAdlkXTmZvE++idoXe8KdglQlhNRdUp1c6g==}
+ '@next/swc-win32-arm64-msvc@16.2.12':
+ resolution: {integrity: sha512-X6hzsOUJac/e7AWSbn9gQ9nzHld1xWP5iyjHpYWvud8pufB679O1xg4JDyKr8Xd69Jvd+kM2Der6uftiZCmjYA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- '@next/swc-win32-x64-msvc@16.2.11':
- resolution: {integrity: sha512-md8CLNggS1Dx9pUgApzps5uAf+N8GN9xywzmNx9vHAWo94HtBwCCqkSnhIrdfQe83Dhz8Lfo/20Nb1Zxal092w==}
+ '@next/swc-win32-x64-msvc@16.2.12':
+ resolution: {integrity: sha512-F6fakeHuFTLOPt0bslQJdf+xtT+WIP9DVn/m4y1w1mRnVPyh3D/cNvzlRkxM444xfm+IvvYNSOrKiA2CDJ0Uxw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@@ -2367,7 +2370,7 @@ packages:
acorn-jsx@5.3.2:
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
- acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ acorn: 8.17.0
acorn-walk@8.3.5:
resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==}
@@ -2511,10 +2514,6 @@ packages:
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
- balanced-match@4.0.4:
- resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
- engines: {node: 18 || 20 || >=22}
-
base-x@3.0.11:
resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==}
@@ -2528,8 +2527,8 @@ packages:
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
- baseline-browser-mapping@2.11.1:
- resolution: {integrity: sha512-HYXq73DDpCtNzOmrFsm9eSwCvWCql0RzqjpDzXN9EadiLJ4DNat0nsZ/Bzmy+Ud12mb4/zKDY0cQ805ZzN+i0A==}
+ baseline-browser-mapping@2.11.5:
+ resolution: {integrity: sha512-xJo6a6YZnwZfnyGmQKWMbVOcii7XRibjOskRh+WJ9UHQoX16xrQrcIgAMQOzfvs8XiLMx6ih/fsLPF73iY2D1A==}
engines: {node: '>=6.0.0'}
hasBin: true
@@ -2586,12 +2585,8 @@ packages:
borsh@2.0.0:
resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==}
- brace-expansion@1.1.16:
- resolution: {integrity: sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==}
-
- brace-expansion@5.0.8:
- resolution: {integrity: sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==}
- engines: {node: 20 || >=22}
+ brace-expansion@2.1.3:
+ resolution: {integrity: sha512-DRdx5neNsG/QXbniLFWi2YmC/68oeOOmKz6zOjVk6ZS1ZLXgLIKqVEc6hWsmkjBbgii0SwaBTcJ5XKj5gzY/4A==}
braces@3.0.3:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
@@ -2762,9 +2757,6 @@ packages:
resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
engines: {node: '>= 10'}
- concat-map@0.0.1:
- resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
-
convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
@@ -2935,8 +2927,8 @@ packages:
ecdsa-sig-formatter@1.0.11:
resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
- electron-to-chromium@1.5.395:
- resolution: {integrity: sha512-7zt9Aw+SrmxLWLN0zhaTWZQiCdryLVrYTq5R7iZakLvi2UQPYMMsROYV/2qVCzMeCiSXHwKOU+sZ4zOVVlrtKA==}
+ electron-to-chromium@1.5.396:
+ resolution: {integrity: sha512-yHiw2Y3C3H9U6TMbOfoWK/BPreiOPXRfTWPBwQBoZG6/8TB6eOPnsy5oaRYuatR7Fw2SJ4kKforgufeo7fq0EQ==}
elliptic@6.6.1:
resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==}
@@ -3480,8 +3472,8 @@ packages:
resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
engines: {node: '>= 0.4'}
- ip-address@10.2.0:
- resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==}
+ ip-address@10.3.1:
+ resolution: {integrity: sha512-1e9d3kb97NHJTIJDZW9rKqW2h6+dFa50Dy0fpPSMQp2ADje5gvKsXmdiK6dwY5t76TaTt5+P5N1Y/LoToIxP6g==}
engines: {node: '>= 12'}
iron-webcrypto@1.2.1:
@@ -4032,12 +4024,9 @@ packages:
minimalistic-crypto-utils@1.0.1:
resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==}
- minimatch@10.2.5:
- resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==}
- engines: {node: 18 || 20 || >=22}
-
- minimatch@3.1.5:
- resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==}
+ minimatch@10.0.1:
+ resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==}
+ engines: {node: 20 || >=22}
minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
@@ -4086,8 +4075,8 @@ packages:
near-api-js@5.1.1:
resolution: {integrity: sha512-h23BGSKxNv8ph+zU6snicstsVK1/CTXsQz4LuGGwoRE24Hj424nSe4+/1tzoiC285Ljf60kPAqRCmsfv9etF2g==}
- next@16.2.11:
- resolution: {integrity: sha512-B339zaqbyK8cmxhoAvLrcwoabwCP1wz21zSzfqxqXAemTu2BXnH7tQnfcglKv1vnMUIDBc+Hth7XODQriTZiRQ==}
+ next@16.2.12:
+ resolution: {integrity: sha512-iD59eYQWmbFcEbX7v/acG5DRym9iw1DdaPoD0WTA920naWsE25wShzJW4+UvAs8MK9EC2kBfIH6vtto1H1PHGw==}
engines: {node: '>=20.9.0'}
hasBin: true
peerDependencies:
@@ -4235,8 +4224,8 @@ packages:
resolution: {integrity: sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==}
engines: {node: '>= 0.4'}
- ox@0.14.32:
- resolution: {integrity: sha512-EPB214GvtsP2TtAYZXkNdizLzGp6PXtfaHcRrD4pcBk/D0Y7ZCNv71QgwrjeCsZ+82moVeMlZZG+NDEIUfxMpw==}
+ ox@0.14.33:
+ resolution: {integrity: sha512-rooA/4o7bBof4Ge2VH/eovfNPb/AEEYyrNj03wggc55g5HZD8Pjs/OeWhttgjic3dDcqn0r29bDuvQEdTiUemQ==}
peerDependencies:
typescript: '>=5.4.0'
peerDependenciesMeta:
@@ -4349,8 +4338,8 @@ packages:
resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
engines: {node: '>= 0.4'}
- postcss@8.5.22:
- resolution: {integrity: sha512-KBDEIpLrvpv16pp3K0Fw+UCoZfopFjjgeB+0tA/aaThfEE74kKDLrgg603YvOWJyg3+WYtyq3xYsQWsIyZlPqQ==}
+ postcss@8.5.23:
+ resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==}
engines: {node: ^10 || ^12 || >=14}
preact@10.24.2:
@@ -4676,8 +4665,8 @@ packages:
resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
- smol-toml@1.7.0:
- resolution: {integrity: sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==}
+ smol-toml@1.7.1:
+ resolution: {integrity: sha512-PPlsspAZ4jbMBu5DMFhfUGDQLu/vrL4SyBROVS37x8ynnVmFIs1VPBz1Co8Xks3TvpIaZXmU85y4DrQ+UyVFoQ==}
engines: {node: '>= 18'}
socks-proxy-agent@8.0.5:
@@ -4979,8 +4968,8 @@ packages:
undici-types@6.21.0:
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
- undici-types@7.28.0:
- resolution: {integrity: sha512-LJAfY+2w6HGeT8d8J1wNQsUGUEGio6NWWpwdwurQe4f6oojzCFuGLizl1KSve4irsTxyLly1QhEeE6iapdaIvQ==}
+ undici-types@7.29.0:
+ resolution: {integrity: sha512-vamA8dGlzMwhpyYpQp9d8vka3o4D/yn5I7ez7Or+msDA4bZ8Uh+Zy91WvWf3I73gDAkFha9JcYRqm2li0Npfgg==}
unrs-resolver@1.12.2:
resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==}
@@ -5092,8 +5081,8 @@ packages:
varuint-bitcoin@2.0.0:
resolution: {integrity: sha512-6QZbU/rHO2ZQYpWFDALCDSRsXbAs1VOEmXAxtbtjLtKuMJ/FQ8YbhfxlaiKv5nklci0M6lZtlZyxo9Q+qNnyog==}
- viem@2.55.8:
- resolution: {integrity: sha512-BHqtsmK4iMLuLnRyrPIB1jVrmFVliRIP/K0dnFT7gBOpfo8Ko4ozhkzUCRNfR+Z/ZZdnlnVrh04fAOuIm5Svkg==}
+ viem@2.55.10:
+ resolution: {integrity: sha512-Q9Ba+/ma81U2M5o5P2AQ7Ux8rTIwmCZvUcr8rKdQ22bV0IBFHllM2m5gWDP8hFaUN2nH2oW3QG44amRazflYNQ==}
peerDependencies:
typescript: '>=5.0.4'
peerDependenciesMeta:
@@ -5482,7 +5471,7 @@ snapshots:
idb-keyval: 6.2.1
ox: 0.6.9(typescript@5.9.3)(zod@3.25.76)
preact: 10.24.2
- viem: 2.55.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
+ viem: 2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
zustand: 5.0.3(@types/react@19.2.17)(react@19.2.4)
transitivePeerDependencies:
- '@types/react'
@@ -5516,7 +5505,7 @@ snapshots:
jose: 6.2.4
md5: 2.3.0
uncrypto: 0.1.3
- viem: 2.55.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
+ viem: 2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
zod: 3.25.76
transitivePeerDependencies:
- bufferutil
@@ -5535,7 +5524,7 @@ snapshots:
idb-keyval: 6.2.1
ox: 0.6.9(typescript@5.9.3)(zod@3.25.76)
preact: 10.24.2
- viem: 2.55.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
+ viem: 2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
zustand: 5.0.3(@types/react@19.2.17)(react@19.2.4)
transitivePeerDependencies:
- '@types/react'
@@ -5656,12 +5645,12 @@ snapshots:
tslib: 2.8.1
optional: true
- '@emnapi/wasi-threads@1.2.1':
+ '@emnapi/runtime@1.11.1':
dependencies:
tslib: 2.8.1
optional: true
- '@emnapi/runtime@1.11.2':
+ '@emnapi/runtime@1.11.3':
dependencies:
tslib: 2.8.1
optional: true
@@ -5691,7 +5680,7 @@ snapshots:
dependencies:
'@eslint/object-schema': 2.1.7
debug: 4.4.3
- minimatch: 3.1.5
+ minimatch: 10.0.1
transitivePeerDependencies:
- supports-color
@@ -5712,7 +5701,7 @@ snapshots:
ignore: 5.3.2
import-fresh: 3.3.1
js-yaml: 4.3.0
- minimatch: 3.1.5
+ minimatch: 10.0.1
strip-json-comments: 3.1.1
transitivePeerDependencies:
- supports-color
@@ -5876,7 +5865,7 @@ snapshots:
'@img/sharp-wasm32@0.35.3':
dependencies:
- '@emnapi/runtime': 1.11.2
+ '@emnapi/runtime': 1.11.3
optional: true
'@img/sharp-webcontainers-wasm32@0.35.3':
@@ -6104,34 +6093,34 @@ snapshots:
- bufferutil
- utf-8-validate
- '@next/env@16.2.11': {}
+ '@next/env@16.2.12': {}
'@next/eslint-plugin-next@16.2.11':
dependencies:
fast-glob: 3.3.1
- '@next/swc-darwin-arm64@16.2.11':
+ '@next/swc-darwin-arm64@16.2.12':
optional: true
- '@next/swc-darwin-x64@16.2.11':
+ '@next/swc-darwin-x64@16.2.12':
optional: true
- '@next/swc-linux-arm64-gnu@16.2.11':
+ '@next/swc-linux-arm64-gnu@16.2.12':
optional: true
- '@next/swc-linux-arm64-musl@16.2.11':
+ '@next/swc-linux-arm64-musl@16.2.12':
optional: true
- '@next/swc-linux-x64-gnu@16.2.11':
+ '@next/swc-linux-x64-gnu@16.2.12':
optional: true
- '@next/swc-linux-x64-musl@16.2.11':
+ '@next/swc-linux-x64-musl@16.2.12':
optional: true
- '@next/swc-win32-arm64-msvc@16.2.11':
+ '@next/swc-win32-arm64-msvc@16.2.12':
optional: true
- '@next/swc-win32-x64-msvc@16.2.11':
+ '@next/swc-win32-x64-msvc@16.2.12':
optional: true
'@noble/ciphers@1.3.0': {}
@@ -6239,7 +6228,7 @@ snapshots:
dependencies:
big.js: 6.2.2
dayjs: 1.11.13
- viem: 2.55.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4)
+ viem: 2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4)
transitivePeerDependencies:
- bufferutil
- typescript
@@ -6250,7 +6239,7 @@ snapshots:
dependencies:
big.js: 6.2.2
dayjs: 1.11.13
- viem: 2.55.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
+ viem: 2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
transitivePeerDependencies:
- bufferutil
- typescript
@@ -6263,7 +6252,7 @@ snapshots:
'@reown/appkit-wallet': 1.8.21(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)
'@walletconnect/universal-provider': 2.23.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
valtio: 2.1.7(@types/react@19.2.17)(react@19.2.4)
- viem: 2.55.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
+ viem: 2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
@@ -6434,7 +6423,7 @@ snapshots:
'@walletconnect/logger': 3.0.2
'@walletconnect/universal-provider': 2.23.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
valtio: 2.1.7(@types/react@19.2.17)(react@19.2.4)
- viem: 2.55.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
+ viem: 2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
optionalDependencies:
'@base-org/account': 2.4.0(@types/react@19.2.17)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
'@coinbase/wallet-sdk': 4.3.6(@types/react@19.2.17)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
@@ -6502,7 +6491,7 @@ snapshots:
bs58: 6.0.0
semver: 7.7.2
valtio: 2.1.7(@types/react@19.2.17)(react@19.2.4)
- viem: 2.55.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
+ viem: 2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
optionalDependencies:
'@lit/react': 1.0.8(@types/react@19.2.17)
transitivePeerDependencies:
@@ -6609,7 +6598,7 @@ snapshots:
'@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)':
dependencies:
'@safe-global/safe-gateway-typescript-sdk': 3.23.1
- viem: 2.55.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
+ viem: 2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)
transitivePeerDependencies:
- bufferutil
- typescript
@@ -6626,7 +6615,7 @@ snapshots:
'@scure/bip32@1.7.0':
dependencies:
- '@noble/curves': 1.9.7
+ '@noble/curves': 1.9.1
'@noble/hashes': 1.8.0
'@scure/base': 1.2.6
@@ -7237,14 +7226,14 @@ snapshots:
'@solana/rpc-spec': 2.3.0(typescript@5.9.3)
'@solana/rpc-spec-types': 2.3.0(typescript@5.9.3)
typescript: 5.9.3
- undici-types: 7.28.0
+ undici-types: 7.29.0
'@solana/rpc-transport-http@5.5.1(typescript@5.9.3)':
dependencies:
'@solana/errors': 5.5.1(typescript@5.9.3)
'@solana/rpc-spec': 5.5.1(typescript@5.9.3)
'@solana/rpc-spec-types': 5.5.1(typescript@5.9.3)
- undici-types: 7.28.0
+ undici-types: 7.29.0
optionalDependencies:
typescript: 5.9.3
optional: true
@@ -7559,7 +7548,7 @@ snapshots:
commander: 14.0.3
eventsource: 4.1.0
feaxios: 0.0.23
- smol-toml: 1.7.0
+ smol-toml: 1.7.1
uint8array-extras: 1.5.0
transitivePeerDependencies:
- debug
@@ -7639,7 +7628,7 @@ snapshots:
'@alloc/quick-lru': 5.2.0
'@tailwindcss/node': 4.3.3
'@tailwindcss/oxide': 4.3.3
- postcss: 8.5.22
+ postcss: 8.5.23
tailwindcss: 4.3.3
'@testing-library/dom@10.4.1':
@@ -8097,7 +8086,7 @@ snapshots:
'@typescript-eslint/types': 8.65.0
'@typescript-eslint/visitor-keys': 8.65.0
debug: 4.4.3
- minimatch: 10.2.5
+ minimatch: 10.0.1
semver: 7.8.5
tinyglobby: 0.2.17
ts-api-utils: 2.5.0(typescript@5.9.3)
@@ -8940,8 +8929,6 @@ snapshots:
balanced-match@1.0.2: {}
- balanced-match@4.0.4: {}
-
base-x@3.0.11:
dependencies:
safe-buffer: 5.2.1
@@ -8952,7 +8939,7 @@ snapshots:
base64-js@1.5.1: {}
- baseline-browser-mapping@2.11.1: {}
+ baseline-browser-mapping@2.11.5: {}
bech32@2.0.0: {}
@@ -8998,14 +8985,9 @@ snapshots:
borsh@2.0.0: {}
- brace-expansion@1.1.16:
+ brace-expansion@2.1.3:
dependencies:
balanced-match: 1.0.2
- concat-map: 0.0.1
-
- brace-expansion@5.0.8:
- dependencies:
- balanced-match: 4.0.4
braces@3.0.3:
dependencies:
@@ -9055,9 +9037,9 @@ snapshots:
browserslist@4.28.7:
dependencies:
- baseline-browser-mapping: 2.11.1
+ baseline-browser-mapping: 2.11.5
caniuse-lite: 1.0.30001806
- electron-to-chromium: 1.5.395
+ electron-to-chromium: 1.5.396
node-releases: 2.0.51
update-browserslist-db: 1.2.3(browserslist@4.28.7)
@@ -9192,8 +9174,6 @@ snapshots:
commander@7.2.0: {}
- concat-map@0.0.1: {}
-
convert-source-map@2.0.0: {}
cookie-es@1.2.3: {}
@@ -9375,7 +9355,7 @@ snapshots:
dependencies:
safe-buffer: 5.2.1
- electron-to-chromium@1.5.395: {}
+ electron-to-chromium@1.5.396: {}
elliptic@6.6.1:
dependencies:
@@ -9600,7 +9580,7 @@ snapshots:
hasown: 2.0.4
is-core-module: 2.16.2
is-glob: 4.0.3
- minimatch: 3.1.5
+ minimatch: 10.0.1
object.fromentries: 2.0.8
object.groupby: 1.0.3
object.values: 1.2.1
@@ -9628,7 +9608,7 @@ snapshots:
hasown: 2.0.4
jsx-ast-utils: 3.3.5
language-tags: 1.0.9
- minimatch: 3.1.5
+ minimatch: 10.0.1
object.fromentries: 2.0.8
safe-regex-test: 1.1.0
string.prototype.includes: 2.0.1
@@ -9656,7 +9636,7 @@ snapshots:
estraverse: 5.3.0
hasown: 2.0.4
jsx-ast-utils: 3.3.5
- minimatch: 3.1.5
+ minimatch: 10.0.1
object.entries: 1.1.9
object.fromentries: 2.0.8
object.values: 1.2.1
@@ -9710,7 +9690,7 @@ snapshots:
is-glob: 4.0.3
json-stable-stringify-without-jsonify: 1.0.1
lodash.merge: 4.6.2
- minimatch: 3.1.5
+ minimatch: 10.0.1
natural-compare: 1.4.0
optionator: 0.9.4
optionalDependencies:
@@ -10077,7 +10057,7 @@ snapshots:
hasown: 2.0.4
side-channel: 1.1.1
- ip-address@10.2.0: {}
+ ip-address@10.3.1: {}
iron-webcrypto@1.2.1: {}
@@ -10618,13 +10598,9 @@ snapshots:
minimalistic-crypto-utils@1.0.1: {}
- minimatch@10.2.5:
- dependencies:
- brace-expansion: 5.0.8
-
- minimatch@3.1.5:
+ minimatch@10.0.1:
dependencies:
- brace-expansion: 1.1.16
+ brace-expansion: 2.1.3
minimist@1.2.8: {}
@@ -10686,25 +10662,25 @@ snapshots:
transitivePeerDependencies:
- encoding
- next@16.2.11(@babel/core@7.29.7)(@types/node@20.19.43)(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
+ next@16.2.12(@babel/core@7.29.7)(@types/node@20.19.43)(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
dependencies:
- '@next/env': 16.2.11
+ '@next/env': 16.2.12
'@swc/helpers': 0.5.15
- baseline-browser-mapping: 2.11.1
+ baseline-browser-mapping: 2.11.5
caniuse-lite: 1.0.30001806
- postcss: 8.5.22
+ postcss: 8.5.23
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.2.4)
optionalDependencies:
- '@next/swc-darwin-arm64': 16.2.11
- '@next/swc-darwin-x64': 16.2.11
- '@next/swc-linux-arm64-gnu': 16.2.11
- '@next/swc-linux-arm64-musl': 16.2.11
- '@next/swc-linux-x64-gnu': 16.2.11
- '@next/swc-linux-x64-musl': 16.2.11
- '@next/swc-win32-arm64-msvc': 16.2.11
- '@next/swc-win32-x64-msvc': 16.2.11
+ '@next/swc-darwin-arm64': 16.2.12
+ '@next/swc-darwin-x64': 16.2.12
+ '@next/swc-linux-arm64-gnu': 16.2.12
+ '@next/swc-linux-arm64-musl': 16.2.12
+ '@next/swc-linux-x64-gnu': 16.2.12
+ '@next/swc-linux-x64-musl': 16.2.12
+ '@next/swc-win32-arm64-msvc': 16.2.12
+ '@next/swc-win32-x64-msvc': 16.2.12
sharp: 0.35.3(@types/node@20.19.43)
transitivePeerDependencies:
- '@babel/core'
@@ -10833,7 +10809,7 @@ snapshots:
object-keys: 1.1.1
safe-push-apply: 1.0.0
- ox@0.14.32(typescript@5.9.3)(zod@3.22.4):
+ ox@0.14.33(typescript@5.9.3)(zod@3.22.4):
dependencies:
'@adraffy/ens-normalize': 1.11.1
'@noble/ciphers': 1.3.0
@@ -10848,7 +10824,7 @@ snapshots:
transitivePeerDependencies:
- zod
- ox@0.14.32(typescript@5.9.3)(zod@3.25.76):
+ ox@0.14.33(typescript@5.9.3)(zod@3.25.76):
dependencies:
'@adraffy/ens-normalize': 1.11.1
'@noble/ciphers': 1.3.0
@@ -10980,7 +10956,7 @@ snapshots:
possible-typed-array-names@1.1.0: {}
- postcss@8.5.22:
+ postcss@8.5.23:
dependencies:
nanoid: 3.3.16
picocolors: 1.1.1
@@ -11406,7 +11382,7 @@ snapshots:
smart-buffer@4.2.0: {}
- smol-toml@1.7.0: {}
+ smol-toml@1.7.1: {}
socks-proxy-agent@8.0.5:
dependencies:
@@ -11418,7 +11394,7 @@ snapshots:
socks@2.8.9:
dependencies:
- ip-address: 10.2.0
+ ip-address: 10.3.1
smart-buffer: 4.2.0
sonic-boom@4.2.1:
@@ -11724,7 +11700,7 @@ snapshots:
undici-types@6.21.0: {}
- undici-types@7.28.0: {}
+ undici-types@7.29.0: {}
unrs-resolver@1.12.2:
dependencies:
@@ -11806,7 +11782,7 @@ snapshots:
dependencies:
uint8array-tools: 0.0.8
- viem@2.55.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4):
+ viem@2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.22.4):
dependencies:
'@noble/curves': 1.9.1
'@noble/hashes': 1.8.0
@@ -11814,7 +11790,7 @@ snapshots:
'@scure/bip39': 1.6.0
abitype: 1.2.3(typescript@5.9.3)(zod@3.22.4)
isows: 1.0.7(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))
- ox: 0.14.32(typescript@5.9.3)(zod@3.22.4)
+ ox: 0.14.33(typescript@5.9.3)(zod@3.22.4)
ws: 8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)
optionalDependencies:
typescript: 5.9.3
@@ -11823,7 +11799,7 @@ snapshots:
- utf-8-validate
- zod
- viem@2.55.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76):
+ viem@2.55.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76):
dependencies:
'@noble/curves': 1.9.1
'@noble/hashes': 1.8.0
@@ -11831,7 +11807,7 @@ snapshots:
'@scure/bip39': 1.6.0
abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76)
isows: 1.0.7(ws@8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))
- ox: 0.14.32(typescript@5.9.3)(zod@3.25.76)
+ ox: 0.14.33(typescript@5.9.3)(zod@3.25.76)
ws: 8.21.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)
optionalDependencies:
typescript: 5.9.3
@@ -11844,7 +11820,7 @@ snapshots:
dependencies:
lightningcss: 1.33.0
picomatch: 4.0.5
- postcss: 8.5.22
+ postcss: 8.5.23
rolldown: 1.1.5
tinyglobby: 0.2.17
optionalDependencies:
diff --git a/frontend/pnpm-workspace.yaml b/frontend/pnpm-workspace.yaml
index 85d8e21..53a83a1 100644
--- a/frontend/pnpm-workspace.yaml
+++ b/frontend/pnpm-workspace.yaml
@@ -14,7 +14,7 @@ overrides:
# to pin to. Re-check periodically; `pnpm audit --prod` will surface it
# again once a fix ships.
protobufjs: "^7.6.5"
- postcss: "^8.5.10"
+ postcss: "^8.5.18"
uuid: "^11.1.1"
ws: "^8.21.0"
axios: "^1.18.1"
@@ -25,6 +25,10 @@ overrides:
# range to the patched line; Next only exercises a small resize/format
# subset of sharp's API for image optimization, low regression surface.
sharp: "^0.35.3"
+ acorn: "8.17.0"
+ minimatch: "10.0.1"
+ electron-to-chromium: "1.5.396"
+
allowBuilds:
'@reown/appkit': true
'@stellar/stellar-sdk': true
@@ -38,6 +42,7 @@ allowBuilds:
unrs-resolver: true
usb: true
utf-8-validate: true
+
ignoredBuiltDependencies:
- sharp
- - unrs-resolver
+ - unrs-resolver
\ No newline at end of file
diff --git a/frontend/src/app/deposit/page.tsx b/frontend/src/app/deposit/page.tsx
index f6fe40a..4eef339 100644
--- a/frontend/src/app/deposit/page.tsx
+++ b/frontend/src/app/deposit/page.tsx
@@ -1,6 +1,6 @@
"use client";
-import { useRef, useState } from "react";
+import { useState } from "react";
import { useWallet } from "@/components/WalletProvider";
import {
buildContractCall,
@@ -37,63 +37,6 @@ import {
import { useToast } from "@/components/ui/Toast";
import * as StellarSdk from "@stellar/stellar-sdk";
-/**
- * Deposit confirmation modal. Defined at module scope rather than inside
- * DepositPage so its component type is stable across renders — a component
- * created during render is remounted on every parent update.
- */
-function ConfirmDeposit({
- tierLabel,
- noteCount,
- tierAmount,
- estimatedFee,
- isLoading,
- onCancel,
- onConfirm,
-}: {
- tierLabel?: string;
- noteCount: number;
- tierAmount: number;
- estimatedFee: string;
- isLoading: boolean;
- onCancel: () => void;
- onConfirm: () => void;
-}) {
- return (
-
- Tier: {tierLabel}
-
- Total {TOKEN_SYMBOL}:{" "}
-
- {(noteCount * tierAmount) / 10 ** TOKEN_DECIMALS} {TOKEN_SYMBOL}
- {noteCount > 1 && ` (${noteCount} notes)`}
-
-
- Estimated fee:{" "}
-
- {formatStroops(Number(estimatedFee))} XLM
-
-
- Confirm Deposit
-
- How it works
-
- This note is the only way - to withdraw these funds. It's saved in this browser, but if - you clear site data or switch devices it's gone for good. - Copy it or download the backup and keep it somewhere safe and - private — anyone with the note can spend it. + This note is the only way to + withdraw these funds. It's saved in this browser, but if you + clear site data or switch devices it's gone for good. Copy it + or download the backup and keep it somewhere safe and private — + anyone with the note can spend it.
@@ -439,8 +328,7 @@ export default function DepositPage() { const shareLink = generateNoteLink(note); const shareOpen = shareOpenKey === note.commitment; const xText = encodeURIComponent( - "Claim your DShield payment — open this link to withdraw:\n" + - shareLink, + "Claim your DShield payment — open this link to withdraw:\n" + shareLink, ); const tgUrl = "https://t.me/share/url?url=" + @@ -466,9 +354,7 @@ export default function DepositPage() { onClick={() => copyText(serialized, note.commitment)} className="text-xs font-medium text-brand-400 hover:text-brand-300" > - {copiedKey === note.commitment - ? "Copied!" - : "Copy note"} + {copiedKey === note.commitment ? "Copied!" : "Copy note"}