Network
Flare has four networks, each serving different purposes, so choosing the right one is crucial. All of these networks operate on a permissionless basis:
-
Flare Mainnet. The production network where all the action happens. Transactions cost real money here.
-
Flare Testnet Coston2. Test your applications without spending real money. This should be your first choice when developing applications.
-
Songbird Canary-Network. Experimental proving ground for Flare.
-
Songbird Testnet Coston. The testnet for Songbird Canary-Network.
The most common development tracks are:
-
Flare Testnet Coston2 → Flare Mainnet: Recommended track for application developers.
-
Songbird Testnet Coston → Songbird Canary-Network → Flare Mainnet: Required track for all protocol level changes.
Configuration
Configuration for all Flare networks, along with public and private RPCs, blockchain explorers, and faucets.
- Flare Mainnet
- Flare Testnet Coston2
- Songbird Canary-Network
- Songbird Testnet Coston
Network name | Flare Mainnet |
---|---|
RPC (HTTPS) | https://flare-api.flare.network/ext/C/rpc |
RPC (WSS) | wss://flare-api.flare.network/ext/bc/C/ws |
Chain ID | 14 |
Currency symbol | FLR |
Currency decimals | 18 |
Blockchain Explorers | https://flarescan.com https://flare-explorer.flare.network |
Private RPCs | API Portal |
Faucets | - |
Bootstrapping nodes | https://flare-bootstrap.flare.network https://flare-bootstrap-1.staking.production.figment.io https://flare.senseinode.com |
- curl
- web3.js
- web3.py
- go-ethereum
- alloy-rs
curl https://flare-api.flare.network/ext/C/rpc -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
import { Web3 } from "web3";
const web3 = new Web3("https://flare-api.flare.network/ext/C/rpc");
web3.eth.getBlockNumber().then(console.log);
from web3 import Web3
w3 = Web3("https://flare-api.flare.network/ext/C/rpc")
print(w3.eth.block_number)
package flare
import (
"context"
"fmt"
"github.com/ethereum/go-ethereum/ethclient"
)
func BlockNumber() {
cl, _ := ethclient.Dial("https://flare-api.flare.network/ext/C/rpc")
blockNumber, _ := cl.BlockNumber(context.Background())
fmt.Println(blockNumber)
}
use alloy::providers::{Provider, ProviderBuilder};
use eyre::Result;
#[tokio::main]
async fn main() -> Result<()> {
let provider =
ProviderBuilder::new().on_http("https://flare-api.flare.network/ext/C/rpc".parse()?);
println!("{}", provider.get_block_number().await?);
Ok(())
}
Network name | Flare Testnet Coston2 |
---|---|
RPC (HTTPS) | https://coston2-api.flare.network/ext/C/rpc |
RPC (WSS) | wss://coston2-api.flare.network/ext/bc/C/ws |
Chain ID | 114 |
Currency symbol | C2FLR |
Currency decimals | 18 |
Blockchain Explorers | https://coston2.testnet.flarescan.com https://coston2-explorer.flare.network |
Private RPCs | API Portal |
Faucets | Coston2 Faucet |
Bootstrapping nodes | https://coston2-bootstrap.flare.network |
- curl
- web3.js
- web3.py
- go-ethereum
- alloy-rs
curl https://coston2-api.flare.network/ext/C/rpc -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
import { Web3 } from "web3";
const web3 = new Web3("https://coston2-api.flare.network/ext/C/rpc");
web3.eth.getBlockNumber().then(console.log);
from web3 import Web3
w3 = Web3("https://coston2-api.flare.network/ext/C/rpc")
print(w3.eth.block_number)
package coston2
import (
"context"
"fmt"
"github.com/ethereum/go-ethereum/ethclient"
)
func BlockNumber() {
cl, _ := ethclient.Dial("https://coston2-api.flare.network/ext/C/rpc")
blockNumber, _ := cl.BlockNumber(context.Background())
fmt.Println(blockNumber)
}
use alloy::providers::{Provider, ProviderBuilder};
use eyre::Result;
#[tokio::main]
async fn main() -> Result<()> {
let provider =
ProviderBuilder::new().on_http("https://coston2-api.flare.network/ext/C/rpc".parse()?);
println!("{}", provider.get_block_number().await?);
Ok(())
}
Network name | Songbird Canary-Network |
---|---|
RPC (HTTPS) | https://songbird-api.flare.network/ext/C/rpc |
RPC (WSS) | wss://songbird-api.flare.network/ext/bc/C/ws |
Chain ID | 19 |
Currency symbol | SGB |
Currency decimals | 18 |
Blockchain Explorers | https://songbird.flarescan.com https://songbird-explorer.flare.network |
Private RPCs | API Portal |
Faucets | - |
Bootstrapping nodes | https://songbird.flare.network |
- curl
- web3.js
- web3.py
- go-ethereum
- alloy-rs
curl https://songbird-api.flare.network/ext/C/rpc -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
import { Web3 } from "web3";
const web3 = new Web3("https://songbird-api.flare.network/ext/C/rpc");
web3.eth.getBlockNumber().then(console.log);
from web3 import Web3
w3 = Web3("https://songbird-api.flare.network/ext/C/rpc")
print(w3.eth.block_number)
package songbird
import (
"context"
"fmt"
"github.com/ethereum/go-ethereum/ethclient"
)
func BlockNumber() {
cl, _ := ethclient.Dial("https://songbird-api.flare.network/ext/C/rpc")
blockNumber, _ := cl.BlockNumber(context.Background())
fmt.Println(blockNumber)
}
use alloy::providers::{Provider, ProviderBuilder};
use eyre::Result;
#[tokio::main]
async fn main() -> Result<()> {
let provider =
ProviderBuilder::new().on_http("https://songbird-api.flare.network/ext/C/rpc".parse()?);
println!("{}", provider.get_block_number().await?);
Ok(())
}
Network name | Songbird Testnet Coston |
---|---|
RPC (HTTPS) | https://coston-api.flare.network/ext/C/rpc |
RPC (WSS) | wss://coston-api.flare.network/ext/bc/C/ws |
Chain ID | 16 |
Currency symbol | CFLR |
Currency decimals | 18 |
Blockchain Explorers | https://coston.testnet.flarescan.com https://coston-explorer.flare.network |
Private RPCs | API Portal |
Faucets | Coston Faucet |
Bootstrapping nodes | https://coston-bootstrap.flare.network |
- curl
- web3.js
- web3.py
- go-ethereum
- alloy-rs
curl https://coston-api.flare.network/ext/C/rpc -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
import { Web3 } from "web3";
const web3 = new Web3("https://coston-api.flare.network/ext/C/rpc");
web3.eth.getBlockNumber().then(console.log);
from web3 import Web3
w3 = Web3("https://coston-api.flare.network/ext/C/rpc")
print(w3.eth.block_number)
package coston
import (
"context"
"fmt"
"github.com/ethereum/go-ethereum/ethclient"
)
func BlockNumber() {
cl, _ := ethclient.Dial("https://coston-api.flare.network/ext/C/rpc")
blockNumber, _ := cl.BlockNumber(context.Background())
fmt.Println(blockNumber)
}
use alloy::providers::{Provider, ProviderBuilder};
use eyre::Result;
#[tokio::main]
async fn main() -> Result<()> {
let provider =
ProviderBuilder::new().on_http("https://coston-api.flare.network/ext/C/rpc".parse()?);
println!("{}", provider.get_block_number().await?);
Ok(())
}
Community tools
Developer tools for Flare built by the community including RPCs, bridges, indexers, account abstraction, wallet SDKs, and more.
- Flare Mainnet
- Flare Testnet Coston2
- Songbird Canary-Network
- Songbird Testnet Coston
RPCs | Ankr, Thirdweb, ChainList |
---|---|
Bridging | LayerZero V2, Stargate V2 (OFTs), zkBridge |
Indexers | SubQuery, Subsquid |
OAuth Login | Web3Auth |
Account Abstraction | Etherspot Prime SDK |
Wallet SDK | Wagmi, RainbowKit |
RPCs | Ankr, Thirdweb, ChainList |
---|---|
Bridging | LayerZero V2 |
Indexers | - |
OAuth Login | Web3Auth |
Account Abstraction | Etherspot Prime SDK |
Wallet SDK | Wagmi, RainbowKit |
Supported wallets
Several desktop, browser and mobile app based wallets support Flare. Discover suitable options for your needs on the Flare Wallets page.
Transaction format
-
Address space: Matches Ethereum, 20-byte addresses using ECDSA.
-
Transaction format: Matches Ethereum, complies with EIP-2718, encoded with RLP.
-
Transaction fees:
-
Type0 (Legacy) - Fee is calculated as
gasUsed * gasPrice
. -
Type2 (EIP-1559) - Fee is calculated as
(baseFee + priorityFee) * gas
. Both the base and priority fees are burned.
-
Smart contracts
-
RPC-API: Ethereum RPC API
-
Supported opcodes: All opcodes up to the London hard fork are supported.
Block verification
-
Header: Verifying block header in Go.
-
Body: Validating block body in Go.
-
Verify transaction in block: Merkle Patricia Trie verification against the receipt root.
Consensus
-
Sybil resistance mechanism: Proof-of-Stake (PoS)
-
Delegation: In-protocol
-
Block time: ≈1.8 seconds
-
Finality: Single-slot. Once a block is validated through the gossip protocol, it is finalized.
-
Transaction ordering: Leaders' discretion, default behaviour is priority gas auction.
-
Consensus mechanism: Snowman++ (from Avalanche) offers a high-throughput, totally ordered consensus mechanism alongside a leader protocol to minimize MEV.
-
Consensus participants: Validators vote on block proposals and serve as leaders. To serve as a validator, a node must meet a governance defined minimum self-bond. Validators are randomly selected as leaders to propose new blocks. The probability of being elected leader is proportional to the validator's stake.
-
Enshrined protocols: In addition to consensus, Flare validators are also data providers for FTSO and attestation providers for FDC.
-
Stake distribution: Network comprises over 90 validators with a median stake of ≈0.7% and a maximum stake of ≈3.3%. This includes both self-bonded and delegated stakes.
Flare is just like Ethereum. To add it to your exchange:
- Set up an RPC node
- Use the appropriate network configuration for Flare Mainnet
Additional info: Media & Branding, Flare source code