Fyora is a creator money page for chain-abstracted payments. A creator shares one link, supporters pay from a Universal Balance, and Particle Universal Accounts routes value to the creator's chosen settlement chain.
- Live app: fyora.app
- Example creator: fyora.app/nikhil
- Demo video: YouTube walkthrough
- Pitch deck: Google Slides
- Cross-chain proof: UniversalX transaction 0x0656d36c12e739
Creator payments are still too chain-aware. A supporter may have USDC on Base, a creator may want to receive on Arbitrum, and both sides are usually forced to think about bridges, gas, RPC networks, wallet setup, and token locations before a simple payment can happen.
That friction is especially bad for consumer creators. A creator money page should feel like sharing a normal profile link, not like explaining cross-chain infrastructure to every supporter.
Fyora turns creator payments into a single-link experience:
- creators share one Fyora page
- supporters pay from their Universal Balance
- Particle Universal Accounts handles chain abstraction and routing
- Magic embedded wallets provide email-based onboarding and EIP-7702 signing
- creators receive on their configured settlement chain/token
- Supabase records confirmed payments for public stats and dashboard metrics
Fyora is built for the Particle Network Universal Accounts Track.
- Uses Particle Universal Accounts SDK in EIP-7702 mode.
- Uses a Magic embedded wallet as the user-owned EOA and EIP-7702 signer.
- Shows one Universal Balance across supported assets.
- Uses
getPrimaryAssets(),createTransferTransaction(), andsendTransaction(). - Produces a real UniversalX proof link after payment execution.
Fyora also applies to the Magic Labs Bonus Challenge because onboarding and signing are powered by Magic embedded wallets. Users do not install MetaMask or manage seed phrases for the core Fyora flow.
- A creator signs in with Magic email OTP.
- Magic creates and owns the user's embedded EOA.
- Particle Universal Accounts upgrades that EOA with EIP-7702 behavior.
- The creator claims
fyora.app/{handle}. - The creator chooses a settlement chain and token, such as Base USDC or Arbitrum USDC.
- Supporters open the creator link and pay from their Universal Balance.
- Particle routes the value and returns a UniversalX transaction id.
- Fyora records the payment in Supabase and updates public profile/dashboard metrics after confirmation.
flowchart TD
Creator["Creator<br/>claims fyora.app/handle"]:::person
Supporter["Supporter<br/>opens creator link"]:::person
Magic["Magic embedded wallet<br/>email OTP + EOA signer"]:::magic
EOA["User-owned EOA<br/>same receive/signing address"]:::wallet
ParticleUA["Particle Universal Account<br/>EIP-7702 mode"]:::particle
Balance["Universal Balance<br/>getPrimaryAssets()"]:::money
Quote["Payment route<br/>createTransferTransaction()"]:::route
Sign["EIP-7702 authorization<br/>root hash signature"]:::magic
Execute["Particle execution<br/>sendTransaction()"]:::particle
UniversalX["UniversalX proof link"]:::proof
Supabase["Supabase<br/>profiles, settlement, payments, avatars"]:::db
Cards["Dynamic PNG share cards<br/>/api/public/og/handle.png"]:::media
Dashboard["Creator dashboard<br/>confirmed-only metrics"]:::ui
Creator --> Magic --> EOA --> ParticleUA
Supporter --> Magic
ParticleUA --> Balance --> Quote --> Sign --> Execute --> UniversalX
Creator --> Supabase
Quote --> Supabase
Execute --> Supabase --> Dashboard
Supabase --> Cards
classDef person fill:#fff7d6,stroke:#141313,stroke-width:3px,color:#141313;
classDef magic fill:#c6f24e,stroke:#141313,stroke-width:3px,color:#141313;
classDef wallet fill:#f7efe2,stroke:#141313,stroke-width:3px,color:#141313;
classDef particle fill:#d9ccff,stroke:#141313,stroke-width:3px,color:#141313;
classDef money fill:#d7fff1,stroke:#141313,stroke-width:3px,color:#141313;
classDef route fill:#ffd166,stroke:#141313,stroke-width:3px,color:#141313;
classDef proof fill:#ff7a59,stroke:#141313,stroke-width:3px,color:#141313;
classDef db fill:#cce7ff,stroke:#141313,stroke-width:3px,color:#141313;
classDef media fill:#ffe1f0,stroke:#141313,stroke-width:3px,color:#141313;
classDef ui fill:#ffffff,stroke:#141313,stroke-width:3px,color:#141313;
sequenceDiagram
participant S as Supporter
participant F as Fyora app
participant M as Magic wallet
participant P as Particle UA
participant X as UniversalX
participant DB as Supabase
participant C as Creator
S->>F: Open fyora.app/{handle}
F->>DB: Load creator settlement config
S->>F: Choose amount and confirm
F->>P: Load Universal Balance
F->>P: createTransferTransaction()
P-->>F: UserOps, route, rootHash
F->>M: Sign EIP-7702 auths and rootHash
F->>P: sendTransaction(transaction, signature, authorizations)
P->>X: Execute route and publish activity
X-->>F: UniversalX transaction id
F->>DB: Record submitted payment
F->>DB: Verify status and mark confirmed
DB-->>C: Dashboard + public metrics update
Fyora keeps the wallet model simple for users:
- Magic embedded wallet: handles passwordless email login and owns the EOA.
- EIP-7702 signer: Magic signs EIP-7702 authorizations and the Particle transaction root hash.
- Particle Universal Account: turns the EOA into a chain-abstracted account without creating a new visible wallet address.
- Universal receive address: the wallet address shown on
/wallet; users can deposit assets like Base USDC here. - Universal Balance: loaded from Particle
getPrimaryAssets(). - Payments and sends: built with Particle transfer quotes, with a
createUniversalTransaction()stablecoin fallback for small cross-chain creator payouts, then executed withsendTransaction().
The working cross-chain demo transaction is UniversalX transaction 0x0656d36c12e739.
It shows:
- status:
Success - asset:
USDC - route: Base USDC -> Arbitrum One USDC
- transaction id:
0x0656d36c12e739 - from wallet:
0xea...ee3d - to wallet:
0xA6...CD9c - source chain: Base
- target chain: Arbitrum One
- source tx: BaseScan
0xd769f645d3fc253100176261279ba06cabc0fdfb77fcafbe280f5660aa09af07 - target tx: Arbiscan
0xa4a8ff6d21aee32a1360b9dc26731a97a14b0b97a8593153cc8a43216e072391
That proof is the main demo artifact for the Universal Accounts Track because it demonstrates real value moving from Base to Arbitrum through Particle Universal Accounts.
Each creator gets:
- public page at
fyora.app/{handle} - payment card with preset and custom amounts
- chosen settlement chain/token
- avatar/photo upload
- QR code for sharing
- dynamic social preview image
- dashboard metrics from confirmed payments only
- recent supporters list
Every public profile has absolute, versioned social metadata:
https://www.fyora.app/api/public/og/{handle}.png?v={updatedAt}
The generated card uses Supabase profile data, creator avatar/photo, handle, name, gradient, bundled fonts, and a real 1200x630 PNG renderer for social previews.
Supabase stores production app data:
- creator profile, handle, bio, socials, gradient, avatar/photo
- Magic owner metadata and EVM address
- settlement chain, token, decimals, and receiver address
- payment intents and idempotency keys
- Particle transaction id and UniversalX URL
- confirmation status used for metrics
Public profile metrics count only confirmed payments. Pending or failed attempts do not inflate totals.
- TanStack Start, React, TypeScript, Vite
- Magic embedded wallets for email OTP and EIP-7702 signing
- Particle Universal Accounts SDK for balances, routing, and execution
- Supabase Postgres and Storage
- Satori + resvg WASM for PNG social cards
- qrcode.react for profile and receive QR codes
- Vercel deployment and analytics
VITE_FYORA_PUBLIC_URL=https://www.fyora.app
VITE_MAGIC_PUBLISHABLE_KEY=
MAGIC_SECRET_KEY=
VITE_PARTICLE_PROJECT_ID=
VITE_PARTICLE_CLIENT_KEY=
VITE_PARTICLE_APP_ID=
PARTICLE_SERVER_KEY=
PARTICLE_RPC_URL=https://universal-rpc-proxy.particle.network
SUPABASE_URL=
SUPABASE_SECRET_KEY=
VITE_ETHEREUM_RPC_URL=
VITE_BNB_RPC_URL=
VITE_BASE_RPC_URL=
VITE_ARBITRUM_RPC_URL=
VITE_XLAYER_RPC_URL=
VITE_SOLANA_RPC_URL=Server-only secrets must not use the VITE_ prefix.
npm install
copy .env.example .env.local
npm run dev -- --port 3000Safe checks:
npx tsc --noEmit
npm run lint
git diff --check- Fyora live app
- Example Fyora creator page
- Demo video
- Pitch deck
- UniversalX cross-chain demo proof
- Particle Developer Docs
- Particle Universal Accounts Overview
- Particle Universal Accounts Web Quickstart
- Particle transfer reference
- Magic Embedded Wallets
MIT License. Copyright (c) 2026 Nikhil Raikwar.
Fyora is built around one simple idea: creators should be able to share one page and receive support without asking supporters to understand chains, bridges, or gas. Particle Universal Accounts handles the chain abstraction, Magic keeps onboarding familiar, and Fyora turns that into a consumer payment experience.
