Veyla
VEYLA
Docs
Protocol

Veyla Protocol Docs

Complete technical documentation for Veyla Protocol — automated yield accounting and XCM routing infrastructure built natively on Polkadot Hub using PVM smart contracts and Polkadot-native cross-chain messaging.

Passet Hub TestnetPVM Smart ContractsXCM PrecompileChain ID: 420420417
What is Veyla Protocol?
Veyla Protocol is an on-chain yield accounting and XCM routing protocol on Polkadot Hub. Users deposit DOT or USDT into a single vault. The contract tracks principal + accrued yield per user, and routes liquidity to the highest-APY parachain via Polkadot-native XCM precompiles — no bridges, no wrapped tokens. In the current MVP, APY rates and routing execution are owner-configured; keeper-based automation is planned for Phase 2.
Deposit Once
Deposit DOT or USDT into the Veyla Protocol vault on Polkadot Hub. That's it.
Auto-Route
Vault routes via XCM precompile to the highest-APY parachain. Routing is owner-triggered in the MVP — keeper automation in Phase 2.
Earn & Compound
Yield accrues automatically. Withdraw anytime, principal + earned.

Architecture

Veyla Protocol is built entirely on Polkadot Hub (Passet Hub Testnet). The frontend talks to a single deployed Solidity contract via standard EVM JSON-RPC, while the contract uses Polkadot-native precompiles for cross-chain operations.

User Wallet
MetaMask · Rabby · Coinbase Wallet
EVM JSON-RPC · Chain 420420417
POLKADOT HUB
VeylaVault.sol
deposit(token, amount)payable
withdraw(token, amount)nonpayable
balanceOf / earned / currentApyview
routeAssets(token, xcmMsg)→ XCM
sendCrossChain(dest, msg)→ XCM
XCM Precompile
0x...000a0000
execute(msg, weight)
send(dest, msg)
weighMessage(msg)
Polkadot Hub native
XCM Message
Hydration
Omnipool · DOT
14.2%
APY
ACTIVE
Moonbeam
Stellaswap · USDT
9.8%
APY
STANDBY
Astar
ArthSwap · DOT
8.1%
APY
STANDBY
LayerTechnologyPurpose
FrontendNext.js 16 + React 19User interface & blockchain interaction
Blockchain SDKwagmi v3 + viem v2EVM wallet connection & contract calls
State/CacheTanStack Query v5Data fetching, caching, invalidation
Smart ContractSolidity 0.8.28 (PolkaVM)Core vault logic + XCM routing
NetworkPolkadot Hub Passet Hub TestnetChain ID: 420420417
XCM RoutingXCM Precompile 0x...000a0000Cross-chain asset movement
USDTpallet-assets ERC-20 PrecompileERC-20 interface for Asset ID 1984

XCM Integration

XCM (Cross-Consensus Messaging) is Polkadot's native language for cross-chain communication. Veyla uses two XCM precompile functions to route assets between parachains — without any bridge, relayer, or wrapped token.

Why XCM matters
Veyla Protocol utilizes Polkadot-native functionality via precompiles to securely route assets and instruction payloads natively. Veyla Protocol calls both execute() (local XCM) and send() (cross-chain XCM) from within the smart contract, demonstrating deep integration with Polkadot's core messaging primitives.
solidity
// XCM Precompile address on Polkadot Hub
address constant XCM_PRECOMPILE = 0x00000000000000000000000000000000000a0000;

interface IXcm {
    struct Weight { uint64 refTime; uint64 proofSize; }

    // Execute an XCM message locally (same chain context)
    function execute(bytes calldata message, Weight calldata weight) external;

    // Send an XCM message to another parachain or chain
    function send(bytes calldata destination, bytes calldata message) external;

    // Estimate execution weight for a given XCM message
    function weighMessage(bytes calldata message) external view returns (Weight memory);
}
FunctionDirectionUsed For
execute(message, weight)Local (same chain)Execute XCM within Polkadot Hub context — local asset management
send(dest, message)Cross-chainSend XCM to Hydration, Moonbeam, Astar, Bifrost for yield deployment
weighMessage(message)Read-onlyEstimate weight before calling execute — prevents out-of-weight errors

Route Destinations

ChainProtocolAssetAPYStatus
HydrationOmnipoolDOT14.2%ACTIVE
MoonbeamStellaswapUSDT9.8%STANDBY
AstarArthSwapDOT/USDT8.1%STANDBY
BifrostBifrost LPDOT7.4%PAUSED
MVP vs Phase 2
In the current MVP, XCM routing execution is triggered by the contract owner (demonstrable via the deployed contract on Passet Hub). APY rates are set on-chain via setApy() and currently reflect real parachain yields manually curated. Phase 2 will introduce keeper-based automation: off-chain agents monitor live APY feeds and call routeAssets() permissionlessly when better routes are detected.

Smart Contract

VeylaVault.sol is deployed on Passet Hub Testnet and verified on Blockscout. It handles deposits, withdrawals, yield accounting, and XCM routing — all in one contract.

FieldValue
ContractVeylaVault.sol
NetworkPasset Hub Testnet (Chain ID: 420420417)
Address0xc66ee6f7CA593fbbccEd23d8c50417C058F1EF77
CompilerSolidity 0.8.28 (PolkaVM)
Optimizer200 runs
BlockscoutView on Blockscout

Supported Assets

AssetTypeAddress / SentinelDecimalsNotes
DOTNative (PAS on testnet)address(0)18 (PolkaVM)Deposited via msg.value, no ERC-20 precompile needed
USDTpallet-assets ERC-20 precompile0x000007c0...012000006Asset ID 1984 on Polkadot Hub

Yield Accounting

Veyla uses a snapshot-based yield accumulation pattern to ensure accuracy across multiple deposits.

solidity
// Yield formula (per-block accrual):
// pending = principal × apyBps × elapsed / (365 days × 10_000)

function earned(address user, address token) external view returns (uint256) {
    return _accruedYield[user][token] + _pendingYield(user, token);
}

// _accrueYield() is called before every deposit/withdraw to snapshot pending yield
// This prevents dilution when new deposits are made mid-period
function _accrueYield(address user, address token) internal {
    _accruedYield[user][token] += _pendingYield(user, token);
    _depositTimestamps[user][token] = block.timestamp;
}

Test Coverage

82/82 Tests Passing
Full unit + fuzz test suite (4 fuzz tests, 256 runs each). Coverage includes: deposit (DOT + USDT), withdraw, yield accrual, multi-deposit accuracy, XCM routing calls, XCM destination whitelist, 2-step treasury transfer, access control (onlyOwner), pause mechanism, 2-step ownership transfer, principal protection when yield pool is empty, and all custom error paths.

Technical Deep Dive

Architecture decisions, security patterns, and what makes this project uniquely possible on Polkadot.

Precompile Architecture

PolkaVM is Polkadot's smart contract VM that compiles Solidity to PolkaVM bytecode (not EVM bytecode). This gives Solidity contracts native access to Substrate runtime functions via precompiles — special addresses that map directly to Rust runtime logic. No bridges, no oracles, no middleware.

solidity
// XCM Precompile — Polkadot Hub native (0x...000a0000)
interface IXcm {
    struct Weight { uint64 refTime; uint64 proofSize; }

    // Execute XCM locally with caller's origin
    function execute(bytes calldata message, Weight calldata weight) external;

    // Send XCM to another parachain
    function send(bytes calldata destination, bytes calldata message) external;

    // Estimate weight for execution
    function weighMessage(bytes calldata message) external view returns (Weight memory);
}

// pallet-assets ERC-20 Precompile — native USDT (Asset ID 1984)
interface IERC20Precompile {
    function transfer(address to, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
    function balanceOf(address account) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
}
Solidity → Rust — Zero Overhead
When VeylaVault calls IXcm(0x...000a0000).execute(), PolkaVM routes the call directly to Polkadot's Rust XCM pallet. There is no EVM compatibility layer, no translation overhead. The precompile IS the runtime function. This is fundamentally different from bridges or cross-chain messaging on other ecosystems.

Security Architecture

VeylaVault implements multiple layers of safety by design:

PatternImplementationPurpose
2-Step OwnershiptransferOwnership() → acceptOwnership()Prevents accidental lockout from address typos
2-Step TreasuryproposeTreasury() → acceptTreasury()Prevents fees routing to wrong address
APY CapMAX_APY_BPS = 10,000 (100%)Prevents catastrophic drain attack
Fee CapMAX_PROTOCOL_FEE_BPS = 500 (5%)Limits owner fee extraction
XCM Size CapMAX_XCM_MESSAGE_SIZE = 1024Prevents calldata griefing
Destination WhitelisttrustedDestinations[keccak256(dest)]XCM only routes to approved parachains
CEI PatternState updates before external callsPrevents reentrancy on withdrawals
Principal ProtectionYield capped at available poolUsers always withdraw at least their principal
Pause MechanismnotPaused modifierEmergency stop for all deposits/withdrawals

Yield Accounting Deep Dive

The yield formula uses a snapshot-based accumulation pattern. Before every balance-changing operation (deposit, withdraw), _accrueYield() snapshots all pending yield into storage. This ensures multi-deposit accuracy — depositing twice doesn't dilute the yield from the first deposit.

text
Yield Formula:
  pending = principal × APY_bps × elapsed_seconds / (365 days × 10,000)

Example (DOT @ 14.20% APY):
  1 DOT deposited → after 30 days:
  pending = 1e18 × 1420 × 2,592,000 / (31,536,000 × 10,000)
  pending = 0.01167 DOT ≈ 0.0117 DOT

Withdrawal Payout:
  totalPayout = principal + earnedYield - protocolFee
  protocolFee = earnedYield × protocolFeeBps / 10,000  (default 0.5%)

Safety Cap:
  actualYield = min(earnedYield, yieldPoolBalance)
  → Principal is NEVER locked, even if yield pool is empty
  → Unclaimed yield persists in _accruedYield for future claimYield() calls

Why Only on Polkadot

Veyla's architecture is fundamentally dependent on four Polkadot-specific primitives that do not exist in any other ecosystem:

1. XCM Native Messaging

Cross-chain messages are processed by the relay chain validators — no external bridges, relayers, or trust assumptions. Assets move natively between parachains with finality guaranteed by Polkadot's shared security.

2. PolkaVM Precompiles

Solidity contracts on PolkaVM can call Substrate runtime functions directly. IXcm.execute() is not a wrapper — it's the actual XCM executor. No other VM gives Solidity this level of runtime access.

3. Shared Security

Every parachain (Hydration, Moonbeam, Astar) is secured by the same Polkadot relay chain validators. When Veyla routes assets cross-chain, the security guarantee is identical to a local transaction.

4. Native Asset Precompiles

USDT on Polkadot Hub is a pallet-assets native asset (ID 1984), exposed to Solidity via an auto-generated ERC-20 precompile. No wrapped tokens, no canonical bridge — it's the real asset from Polkadot's runtime.

Not a Fork — A New Category
Veyla is not a port of an Ethereum yield aggregator. It's a new category of protocol that can only exist where: (a) smart contracts can call cross-chain messaging natively, (b) assets exist as runtime primitives accessible from Solidity, and (c) all destination chains share the same security model. Today, that's only Polkadot.

Frontend

A full-featured React application built with Next.js 16 App Router, deployed on Vercel. All blockchain interactions use wagmi v3 + viem v2 connected to Passet Hub Testnet.

Page / RouteDescription
/Landing page — Navbar, Hero, ProofBar, ProblemTeaser, HowItWorks, UnderTheHood, CTA, Footer
/appDashboard — stat cards, positions table, route visualization, activity feed
/app/vaultVault — deposit & withdraw with live APY, balance, USD values
/app/routesRoutes — animated hub-and-spoke XCM route map + APY comparison table
/app/historyHistory — full on-chain transaction log with filter tabs & Blockscout links
/docsThis page — comprehensive protocol documentation

Blockchain Hooks

HookWhat it does
useDeposit()Full deposit lifecycle — approve (USDT only) → deposit → wait confirmation → invalidate cache
useWithdraw()Withdraw lifecycle — write → wait → invalidate
useUserPositions()Single multicall: all user positions (balance, earned, APY) for DOT + USDT
useVaultHistory()Fetch Deposited/Withdrawn events, decode logs, fetch timestamps, localStorage cache
useTokenPrices()CoinGecko DOT + USDT price feed with 60s refetch interval
useTokenApys()Multicall currentApy(DOT) + currentApy(USDT) from contract
useERC20Balance()Read ERC-20 balanceOf for any token + address

Transaction State Machine

text
DOT deposit:
  idle → awaiting-signature → pending → success
                 ▲ (MetaMask: approve sending PAS/DOT native)

USDT deposit:
  idle → awaiting-approval → approving → awaiting-signature → pending → success
              ▲ (approve TX)                  ▲ (deposit TX)

Withdrawal (DOT or USDT):
  idle → awaiting-signature → pending → success

Quick Start

Get Veyla running locally in under 5 minutes. You need Node.js 18+, a browser wallet (MetaMask or Rabby), and testnet PAS tokens from the Paseo faucet.

1
Clone the repository
bash
git clone https://github.com/veyla-alliance/veyla
cd veyla/frontend
2
Install dependencies
bash
npm install
3
Configure environment variables
Create .env.local in the frontend/ folder:
bash
NEXT_PUBLIC_CHAIN_ID=420420417
NEXT_PUBLIC_RPC_URL=https://eth-rpc-testnet.polkadot.io
NEXT_PUBLIC_BLOCK_EXPLORER_URL=https://blockscout-testnet.polkadot.io
NEXT_PUBLIC_VAULT_ADDRESS=0xc66ee6f7CA593fbbccEd23d8c50417C058F1EF77
NEXT_PUBLIC_DOT_TOKEN_ADDRESS=0x0000000000000000000000000000000000000000
NEXT_PUBLIC_USDT_TOKEN_ADDRESS=0x000007c000000000000000000000000001200000
4
Start the development server
bash
npm run dev
# → http://localhost:3000
5
Get testnet PAS tokens
Visit the Paseo faucet to get PAS (testnet DOT equivalent):
6
Connect wallet & switch network
Open localhost:3000/app, connect MetaMask or Rabby, then click Switch Network. Veyla will automatically add Passet Hub with the correct PAS nativeCurrency config.
Deploying the contract yourself
If you want to deploy your own instance: install Foundry, copy contract/, set your PRIVATE_KEY in contract/.env, then run forge script script/Deploy.s.sol --rpc-url passet_hub --broadcast --verify. Update NEXT_PUBLIC_VAULT_ADDRESS with your deployed address.

Contract API Reference

Complete function reference for VeylaVault.sol.

Write Functions

solidity
// Deposit DOT (native) or USDT into the vault.
// For DOT:  send msg.value, set token = address(0), amount is ignored.
// For USDT: approve vault first, set token = USDT precompile address, amount = wei.
function deposit(address token, uint256 amount) external payable;

// Withdraw deposited principal + available yield back to caller.
// Principal is always returnable even if yield pool is empty.
function withdraw(address token, uint256 amount) external;

// Harvest accrued yield without closing the position.
function claimYield(address token) external;

// [Owner only] Execute an XCM message locally via precompile.
function routeAssets(address token, bytes calldata xcmMessage) external;

// [Owner only] Send XCM cross-chain to target parachain.
function sendCrossChain(address token, bytes calldata destination, bytes calldata xcmMessage) external;

// [Owner only] Update APY for an asset (basis points, capped at 10_000 = 100%).
function setApy(address token, uint256 apyBps) external;

// [Owner only] Pause or unpause deposits and withdrawals.
function setPaused(bool _paused) external;

// [Owner only] Seed the yield pool (called by owner or via XCM receive()).
function fundYieldPool() external payable;

// [Owner only] Step 1 of 2-step ownership transfer — nominate new owner.
function transferOwnership(address newOwner) external;

// [Pending owner only] Step 2 — accept and finalise ownership transfer.
function acceptOwnership() external;

// [Owner only] Step 1 of 2-step treasury (fee recipient) transfer.
function proposeTreasury(address newTreasury) external;

// [Pending treasury only] Step 2 — accept and activate new treasury address.
function acceptTreasury() external;

// [Owner only] Whitelist a cross-chain XCM destination (raw bytes encoding).
function addTrustedDestination(bytes calldata destination) external;

// [Owner only] Remove a previously whitelisted XCM destination.
function removeTrustedDestination(bytes calldata destination) external;

// [Owner only] Update protocol fee (basis points, capped at MAX_FEE_BPS).
function setProtocolFee(uint256 feeBps) external;

// [Owner only] Update the minimum rebalance interval in seconds.
function setRebalanceInterval(uint256 interval) external;

// [Owner only] Update the human-readable route label for a token.
function setTokenRoute(address token, string calldata route) external;

Read Functions

solidity
// User's deposited principal for a given token.
function balanceOf(address user, address token) external view returns (uint256);

// User's total earned yield (snapshotted + pending since last deposit).
function earned(address user, address token) external view returns (uint256);

// Current APY for a token, in basis points (divide by 100 for %).
function currentApy(address token) external view returns (uint256);

// Total combined TVL across all assets (raw units).
function tvl() external view returns (uint256);

// TVL for a specific token.
function tvlOf(address token) external view returns (uint256);

// Timestamp of the user's last deposit for a given token.
function depositTimestampOf(address user, address token) external view returns (uint256);

// Human-readable route label for a token (e.g. "Hydration").
function tokenRoute(address token) external view returns (string memory);

// Public state
address public owner;
address public pendingOwner;
address public treasury;
address public pendingTreasury;
bool public paused;

Events

solidity
event Deposited(address indexed user, address indexed token, uint256 amount);
event Withdrawn(address indexed user, address indexed token, uint256 amount);
event YieldClaimed(address indexed user, address indexed token, uint256 amount);
event RoutedLocally(address indexed token, uint256 amount);
event RoutedCrossChain(address indexed token, bytes destination, uint256 amount);
event YieldPoolFunded(address indexed from, uint256 amount);
event ApyUpdated(address indexed token, uint256 newApyBps);
event Paused(bool isPaused);
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
event TreasuryProposed(address indexed newTreasury);
event TreasuryUpdated(address indexed newTreasury);
event TrustedDestinationAdded(bytes destination);
event TrustedDestinationRemoved(bytes destination);
event ProtocolFeeUpdated(uint256 newFeeBps);
event RebalanceIntervalUpdated(uint256 newInterval);
event TokenRouteUpdated(address indexed token, string route);

Custom Errors

ErrorTriggered when
ZeroAmount()Deposit or withdraw with amount = 0
InsufficientBalance()Withdraw more than deposited
NotOwner()Non-owner calls admin function
TransferFailed()Native DOT transfer or ERC-20 transfer returns false
UnsupportedToken()Token address is neither DOT sentinel nor USDT precompile
ContractPaused()Deposit or withdraw while paused = true
MsgValueMismatch()USDT deposit sent with msg.value > 0
ApyExceedsCap()setApy() called with value above MAX_APY_BPS (10,000 = 100%)
ZeroAddress()transferOwnership() called with address(0)
NoPendingOwner()acceptOwnership() called when no transfer is pending
UntrustedDestination()sendCrossChain() called with a non-whitelisted destination
XcmMessageTooLarge()XCM message exceeds MAX_XCM_MESSAGE_SIZE (1024 bytes)
NotPendingTreasury()acceptTreasury() called by non-pending treasury address
FeeExceedsCap()setProtocolFee() called with value above the fee cap
InvalidInterval()setRebalanceInterval() called with zero interval
RouteTooLong()setTokenRoute() called with a route string exceeding max length
YieldPoolEmpty()claimYield() called but yield pool has insufficient funds

Roadmap

Below is what is currently live today for Veyla Protocol and our plans for the future.

Hackathon MVPLIVE
  • VeylaVault.sol deployed & verified on Passet Hub Testnet
  • Full frontend: Dashboard, Vault, Routes, History pages
  • DOT (native) + USDT (pallet-assets precompile) deposits & withdrawals
  • XCM precompile integration (execute + send)
  • Automated yield accounting (snapshot pattern)
  • 82/82 tests passing (4 fuzz tests, 256 runs each)
  • Security audit completed — Critical, High, Medium, Low all fixed
  • Live deployment on Vercel
Phase 2 — Automated Rebalancing (Q2 2026)PLANNED
  • On-chain APY oracle that reads from Hydration + Moonbeam
  • Keeper bot (off-chain) triggers routeAssets when APY delta > threshold
  • Real routing to Hydration Omnipool via XCM send()
  • Multi-asset positions tracking with real USD price feeds
Phase 3 — Protocol Expansion (Q3 2026)PLANNED
  • Add Astar (ArthSwap) and Bifrost LP as routing destinations
  • Governance token + fee distribution to stakers
  • Strategy marketplace (user selects risk profile)
  • Mainnet deployment (DOT mainnet, real USDT)
  • Audit by reputable security firm
Phase 4 — Ecosystem (Q4 2026)PLANNED
  • Support for additional Polkadot native assets (USDC, HDX, GLMR)
  • Cross-parachain yield aggregation dashboard
  • Mobile app with push notifications for yield events
  • Partnership with Hydration, Moonbeam, Astar liquidity programs

FAQ

Common questions about Veyla Protocol.

What are the risks of using Veyla?
Several risk factors to be aware of: (1) Smart contract risk — the contract has 82 passing tests and an internal security audit, but has not yet been audited by a professional third-party firm. A formal audit is planned before mainnet. (2) Testnet only — Veyla currently runs on Passet Hub Testnet (PAS tokens, not real DOT). No real funds are at risk. (3) APY is owner-set — yield rates are configured by the contract owner, not sourced from a live oracle. Rates reflect real parachain yields but are manually curated. (4) Routing is owner-triggered in the MVP — assets are not automatically moved between chains without an owner action. (5) Yield pool dependency — yield is paid from a funded pool; if the pool is empty, withdrawals still return full principal but yield reverts to zero. Never deposit more than you're comfortable with on a testnet protocol.
Why does MetaMask show PAS instead of DOT?
Passet Hub Testnet uses PAS (Paseo) as its native token — the testnet equivalent of DOT. They are functionally identical in this context. When you deposit 'DOT' on Veyla Protocol, MetaMask shows PAS because that's the actual testnet currency. On mainnet, this will be DOT.
Is there a withdrawal fee?
No. Veyla Protocol charges zero withdrawal fees. The protocol earns a 0.5% performance fee on yield generated (not on principal). You always get back what you put in, plus earned yield.
How does yield get generated?
The protocol routes assets to liquidity pools on connected parachains (Hydration Omnipool for DOT, Stellaswap on Moonbeam for USDT) via XCM. These pools generate trading fees and liquidity mining rewards, which accrue as yield tracked by the VeylaVault contract.
How often does rebalancing happen?
Currently, the APY is set by the owner and routing is triggered manually for the hackathon demo. Phase 2 (Q2 2026) introduces automated rebalancing via keeper bots that monitor on-chain APY oracles.
How are APY rates determined?
APY rates are set by the protocol owner based on observed yields from destination chains (e.g., Hydration Omnipool for DOT at 14.2%, Stellaswap for USDT at 9.8%). In the current MVP, APY is set via setApy(token, bps) — owner-only, capped at 100% (10,000 bps) by smart contract. Rates reflect real DeFi yields on destination parachains. Yield accrues on-chain using the formula: principal × APY × elapsed / (365 days × 10,000). Production roadmap includes oracle integration (Acurast/DIA) for real-time APY feeds from destination chains, keeper automation for periodic rate updates, and governance-controlled rate bounds.
Do you use bridges?
No. Veyla Protocol uses Polkadot's native XCM (Cross-Consensus Messaging) protocol, which is built into the relay chain. There are no external bridges, wrapped tokens, or third-party relayers. Assets move natively between parachains.
Is the contract audited?
Yes — a full internal security audit was completed (Critical through Low severity), covering APY drain prevention, 2-step ownership transfer, principal protection, and event traceability. The contract has 82 passing tests including 4 fuzz tests (256 runs each), covering XCM destination whitelist, 2-step treasury transfer, and all new security paths. It is verified on Blockscout. A professional third-party audit is planned before mainnet deployment.
Which wallets are supported?
Any EVM-compatible wallet that supports custom networks: MetaMask, Rabby, SubWallet, Talisman, Coinbase Wallet, and any injected browser wallet. We detect installed wallets automatically at connection time. SubWallet and Talisman are especially recommended for Polkadot users.
Can I see the source code?
Yes. Veyla Protocol is fully open source. Frontend, smart contract, tests, and deploy scripts are all available on GitHub.

Team

Veyla Protocol is built by Veyla Alliance for the Polkadot Solidity Hackathon 2026.

On-Chain Identity
F
fdaniall✓ Verified · Reasonable

Full-stack developer & protocol designer. Builder of Veyla Protocol — on-chain yield accounting & XCM routing on Polkadot Hub.

Polkadot SS58 Address
5HBz4tNpNnbpwnYjERnEjebTiDeEgeRjMytapvFr7V8sKchY
Network
Polkadot People Chain
Judgment
Reasonable
Registrar
W3F
VEYLA PROTOCOL
Built by Veyla Alliance for Polkadot Solidity Hackathon 2026