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
DOT
HDX
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
Verified on Blockscout// 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);
}
}Ready to put your assets to work?
Built on PolkadotXCM NativeOpen Source