#
Verus-Ethereum Bridge Guide 🌉
How to bridge funds from Ethereum to Verus — enabling agents to bootstrap with ETH.
#
Overview
The Verus-Ethereum bridge allows trustless transfers between Ethereum and Verus:
- ETH → VRSC: Send ETH, receive VRSC (or convert to VRSC via bridge)
- ERC20 → Verus: Bridge DAI, MKR, and other supported tokens
- VRSC → ETH: Reverse direction also supported
This solves the agent bootstrap problem: If an agent has ETH, it can bridge to VRSC and create a VerusID autonomously.
#
Quick Start (Web UI)
#
For Humans (Manual)
- Go to https://eth.verusbridge.io/
- Connect MetaMask (or other Web3 wallet)
- Select token to send (ETH, DAI, MKR, etc.)
- Enter Verus destination address (R-address or VerusID)
- Enter amount
- Confirm transaction in MetaMask
- Wait for confirmations (~20 minutes for finality)
#
For Agents (Programmatic)
#
Prerequisites
- Ethereum wallet with private key
- ETH for gas + amount to bridge
- ethers.js or web3.js library
- Verus R-address to receive funds
#
Contract Addresses
#
Mainnet (Ethereum → VRSC)
#
Testnet (Sepolia → VRSCTEST)
#
Verus Currency IDs
#
How the Bridge Works
┌──────────────────────────────────────────────────────────────┐
│ │
│ ETHEREUM VERUS │
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Agent │ │ Agent │ │
│ │ Wallet │ │ R-address │ │
│ └──────┬──────┘ └──────▲──────┘ │
│ │ │ │
│ │ 1. Send ETH │ 4. Receive │
│ │ + destination │ VRSC │
│ ▼ │ │
│ ┌─────────────┐ ┌──────┴──────┐ │
│ │ Delegator │ ──────────────→ │ Bridge │ │
│ │ Contract │ 2. Notarize │ vETH │ │
│ └─────────────┘ 3. Process └─────────────┘ │
│ │
└──────────────────────────────────────────────────────────────┘
#
Steps:
- Send Transaction: Agent sends ETH to Delegator contract with destination info
- Notarization: Bridge notaries observe and validate the Ethereum transaction
- Processing: Verus processes the import via Bridge.vETH currency basket
- Receive: Funds arrive at destination R-address or VerusID on Verus
#
Programmatic Transfer (JavaScript)
#
Using ethers.js
const { ethers } = require('ethers');
// Delegator ABI (simplified - get full from bridge repo)
const DELEGATOR_ABI = [
"function sendTransfer(tuple(uint8 version, tuple(address currency, uint64 amount) currencyvalue, uint32 flags, address feecurrencyid, uint64 fees, tuple(uint8 destinationtype, bytes destinationaddress) destination, address destcurrencyid, address destsystemid, address secondreserveid) _transfer) payable"
];
async function bridgeETHtoVerus(
privateKey,
verusDestination, // R-address or i-address
amountETH,
delegatorAddress,
rpcUrl
) {
const provider = new ethers.providers.JsonRpcProvider(rpcUrl);
const wallet = new ethers.Wallet(privateKey, provider);
const delegator = new ethers.Contract(
delegatorAddress,
DELEGATOR_ABI,
wallet
);
// Convert destination to bytes
// (Requires proper encoding - see bridge website source)
const destinationBytes = encodeVerusAddress(verusDestination);
// ETH currency address on the bridge
const ETH_CURRENCY = "0x67460C2f56774eD27EeB8685f29f6CEC0B090B00"; // testnet
const VRSC_CURRENCY = "0xA6ef9ea235635E328124Ff3429dB9F9E91b64e2d"; // testnet
const amountSats = ethers.utils.parseUnits(amountETH, 8); // 8 decimals for sats
const transfer = {
version: 1,
currencyvalue: {
currency: ETH_CURRENCY,
amount: amountSats
},
flags: 0, // Direct transfer
feecurrencyid: VRSC_CURRENCY,
fees: 2000000, // 0.02 VRSC fee
destination: {
destinationtype: 2, // R-address type
destinationaddress: destinationBytes
},
destcurrencyid: VRSC_CURRENCY,
destsystemid: ethers.constants.AddressZero,
secondreserveid: ethers.constants.AddressZero
};
// Calculate value to send (amount + bridge fee)
const bridgeFee = ethers.utils.parseEther("0.003");
const totalValue = ethers.utils.parseEther(amountETH).add(bridgeFee);
const tx = await delegator.sendTransfer(transfer, {
value: totalValue,
gasLimit: 1000000
});
console.log("Transaction sent:", tx.hash);
await tx.wait();
console.log("Transaction confirmed!");
return tx.hash;
}
#
Using the VerusBridgeTool (Shell)
For simpler scripting, use the community tool:
# Clone the tool
git clone https://github.com/jbarnes-dev/VerusBridgeTool.git
cd VerusBridgeTool
# Configure (edit bridgetool.conf)
cat > bridgetool.conf << EOF
verus="$HOME/verus-cli/verus"
address="YOUR_R_ADDRESS"
target_rate=60
allowed_currencies="VRSC vETH MKR.vETH bridge.vETH DAI.vETH"
EOF
# Estimate conversion
./verusBridgeTool.sh -i vETH -o VRSC -a 0.1 -e
# Execute conversion (from Verus side)
./verusBridgeTool.sh -i vETH -o VRSC -a 0.1 -c
#
Fees
#
Timing
#
Agent Bootstrap Flow
For an agent with only ETH:
1. Agent has ETH wallet with funds
│
▼
2. Agent installs Verus CLI
Creates R-address
│
▼
3. Agent bridges ETH → VRSC
(via eth.verusbridge.io or programmatic)
│
▼
4. Wait ~30-45 min for funds
│
▼
5. Agent creates VerusID
(registernamecommitment + registeridentity)
│
▼
6. Agent is now on Verus network!
#
Minimum Requirements
- ~0.05 ETH for bridge (0.003 fee + gas + amount to convert)
- Need ~100 VRSC for identity creation
- At current rates, budget ~0.1 ETH to be safe
#
Supported Tokens
#
From Ethereum to Verus
#
Conversion Options
Once on Verus, use the Bridge.vETH basket to convert between:
- vETH ↔ VRSC
- DAI.vETH ↔ VRSC
- MKR.vETH ↔ VRSC
- Any combination via the basket
#
Troubleshooting
#
Verify Bridge Status
# On Verus CLI
verus getcurrency "bridge.vETH"
# Check "bestcurrencystate" for current reserves and activity
#
Security Notes
- Trustless: Bridge uses notarization, not central custody
- Finality: Wait for Ethereum finality before considering done
- Test first: Use testnet (Sepolia → VRSCTEST) before mainnet
- Verify addresses: Double-check destination addresses
#
Resources
- Bridge UI: https://eth.verusbridge.io/
- Bridge Keeper (notary software): https://github.com/monkins1010/Verusbridgekeeper
- Bridge Tool (CLI): https://github.com/jbarnes-dev/VerusBridgeTool
- Bridge Website Source: https://github.com/monkins1010/VerusBridgeWebsite
#
For Agent Developers
The key insight: An agent with ETH can bootstrap onto Verus without human intervention.
Flow:
- Use ethers.js to interact with Delegator contract
- Send ETH with encoded Verus destination
- Wait for bridge processing
- Create VerusID with received VRSC
This closes the autonomous bootstrap loop.