Veyla Logo
VEYLA

VEYLA

Not a yield aggregator. A yield routing protocol.

Deposit into one vault on Polkadot Hub. Veyla routes your liquidity across parachains via native XCM — no bridges, no wrapped tokens.

Scroll
0.0%TOP APY
0CHAINS
0TESTS PASSING
0.0%PROTOCOL FEE
The Challenge

Yield is everywhere across Polkadot. The problem is capturing it.

Every parachain has its own pools, rates, and mechanics. Managing them manually means bridge risk, idle capital, and constant overhead.

XCM NativeNo bridges
PolkaVMSolidity → Rust
Shared SecurityRelay chain
Traditional Aggregator
  • ×Bridge-dependent routing
  • ×Wrapped/synthetic tokens
  • ×Off-chain keeper bots
  • ×Fork of Yearn/Beefy
Veyla Protocol
  • XCM native — zero bridge risk
  • Native assets via precompiles
  • On-chain yield accounting
  • Built from scratch on PolkaVM
How It Works

Three steps. Zero complexity.

01

Deposit

Drop your assets into the Veyla Vault on Polkadot Hub. One transaction. One entry point.

Vault deposit+$1,000.00
02

Route

Veyla routes your liquidity to the highest-yielding parachain via Polkadot's native XCM — not a bridge, not a wrapper, not a bot.

Best yield found
Polkadot
DOT
Hydration
HDX
Astar
ASTR
03

Earn

Yield accrues on-chain continuously. When better routes emerge, Veyla moves liquidity via XCM to the highest-yielding parachain. Withdraw anytime — principal plus earned.

Current APY14.2%
Under the Hood

Real code. Deployed on-chain.

// VeylaVault.sol — deployed on Passet Hub Testnet
// Solidity 0.8.28 compiled to PolkaVM bytecode

import "./interfaces/IXcm.sol";       // XCM precompile (0x...000a0000)
import "./interfaces/IERC20Precompile.sol"; // USDT pallet-assets

contract VeylaVault {
    address public constant DOT  = address(0);
    address public constant USDT = USDT_PRECOMPILE;

    // Route assets cross-chain via XCM precompile
    function sendCrossChain(
        address token,
        bytes calldata destination,
        bytes calldata xcmMessage
    ) external onlyOwner {
        if (!trustedDestinations[keccak256(destination)])
            revert UntrustedDestination();

        // Native call to Polkadot's XCM runtime
        IXcm(XCM_PRECOMPILE).send(destination, xcmMessage);

        lastRoutedAt = block.timestamp;
        emit RoutedCrossChain(token, destination, _tvl[token]);
    }

    // Yield: principal × APY × elapsed / (365d × 10_000)
    function _pendingYield(address user, address token)
        internal view returns (uint256)
    {
        uint256 principal = _balances[user][token];
        uint256 elapsed   = block.timestamp - _depositTimestamps[user][token];
        return (principal * _apyBps[token] * elapsed) / (365 days * 10_000);
    }
}
513Lines of Solidity
82Tests Passing
17Custom Errors
2Precompiles Used
View Contract on Blockscout

Ready to put your assets to work?

Built on PolkadotXCM NativeOpen Source