Overview
Viction is fully compatible with Ethereum’s Web3 ecosystem. You can use popular Web3 libraries like Web3.js, ethers.js, and Web3.py to interact with the Viction blockchain.Network Configuration
Mainnet
const VICTION_MAINNET = {
chainId: 88,
chainName: 'Viction',
rpcUrls: ['https://rpc.viction.xyz'],
nativeCurrency: {
name: 'Viction',
symbol: 'VIC',
decimals: 18
},
blockExplorerUrls: ['https://vicscan.xyz']
};
Testnet
const VICTION_TESTNET = {
chainId: 89,
chainName: 'Viction Testnet',
rpcUrls: ['https://rpc-testnet.viction.xyz'],
nativeCurrency: {
name: 'Viction',
symbol: 'VIC',
decimals: 18
},
blockExplorerUrls: ['https://testnet.vicscan.xyz']
};
Web3.js Integration
Installation
npm install web3
Basic Setup
const Web3 = require('web3');
// HTTP Provider
const web3 = new Web3('https://rpc.viction.xyz');
// WebSocket Provider (for subscriptions)
const web3ws = new Web3('wss://ws.viction.xyz');
// Local node
const web3local = new Web3('http://localhost:8545');
Common Operations
Get Account Balance
async function getBalance(address) {
const balance = await web3.eth.getBalance(address);
console.log('Balance:', web3.utils.fromWei(balance, 'ether'), 'VIC');
}
getBalance('0x...');
Send Transaction
async function sendTransaction() {
const account = web3.eth.accounts.privateKeyToAccount('0x...');
web3.eth.accounts.wallet.add(account);
const tx = {
from: account.address,
to: '0x...',
value: web3.utils.toWei('1', 'ether'),
gas: 21000,
gasPrice: await web3.eth.getGasPrice()
};
const receipt = await web3.eth.sendTransaction(tx);
console.log('Transaction hash:', receipt.transactionHash);
}
Interact with Smart Contract
const contractABI = [...];
const contractAddress = '0x...';
const contract = new web3.eth.Contract(contractABI, contractAddress);
// Read contract data
async function readContract() {
const result = await contract.methods.getValue().call();
console.log('Value:', result);
}
// Write to contract
async function writeContract() {
const account = web3.eth.accounts.privateKeyToAccount('0x...');
web3.eth.accounts.wallet.add(account);
const tx = contract.methods.setValue(123);
const gas = await tx.estimateGas({ from: account.address });
const receipt = await tx.send({
from: account.address,
gas: gas
});
console.log('Transaction:', receipt.transactionHash);
}
Subscribe to Events
// Subscribe to new blocks
web3ws.eth.subscribe('newBlockHeaders', (error, blockHeader) => {
if (!error) {
console.log('New block #', blockHeader.number);
}
});
// Subscribe to contract events
const subscription = contract.events.Transfer({
filter: { from: '0x...' },
fromBlock: 'latest'
}, (error, event) => {
if (!error) {
console.log('Transfer event:', event.returnValues);
}
});
Ethers.js Integration
Installation
npm install ethers
Basic Setup
const { ethers } = require('ethers');
// Connect to Viction
const provider = new ethers.JsonRpcProvider('https://rpc.viction.xyz');
// WebSocket provider
const wsProvider = new ethers.WebSocketProvider('wss://ws.viction.xyz');
// With custom network
const customProvider = new ethers.JsonRpcProvider('https://rpc.viction.xyz', {
chainId: 88,
name: 'viction'
});
Common Operations
Get Account Balance
async function getBalance(address) {
const balance = await provider.getBalance(address);
console.log('Balance:', ethers.formatEther(balance), 'VIC');
}
Create Wallet and Send Transaction
async function sendTransaction() {
const wallet = new ethers.Wallet('0x...', provider);
const tx = {
to: '0x...',
value: ethers.parseEther('1.0')
};
const transaction = await wallet.sendTransaction(tx);
console.log('Transaction hash:', transaction.hash);
const receipt = await transaction.wait();
console.log('Confirmed in block:', receipt.blockNumber);
}
Interact with Smart Contract
const contractABI = [...];
const contractAddress = '0x...';
const contract = new ethers.Contract(contractAddress, contractABI, provider);
// Read contract
async function readContract() {
const value = await contract.getValue();
console.log('Value:', value.toString());
}
// Write to contract
async function writeContract() {
const wallet = new ethers.Wallet('0x...', provider);
const contractWithSigner = contract.connect(wallet);
const tx = await contractWithSigner.setValue(123);
await tx.wait();
console.log('Transaction confirmed:', tx.hash);
}
Listen to Events
// Listen to contract events
contract.on('Transfer', (from, to, amount, event) => {
console.log(`Transfer: ${from} -> ${to}, Amount: ${amount.toString()}`);
});
// Listen to new blocks
provider.on('block', (blockNumber) => {
console.log('New block:', blockNumber);
});
Go Client Integration
Using ethclient Package
import (
"context"
"fmt"
"math/big"
"github.com/tomochain/tomochain/ethclient"
"github.com/tomochain/tomochain/common"
)
func main() {
// Connect to Viction node
client, err := ethclient.Dial("https://rpc.viction.xyz")
if err != nil {
panic(err)
}
// Get latest block number
blockNumber, err := client.BlockNumber(context.Background())
if err != nil {
panic(err)
}
fmt.Println("Latest block:", blockNumber)
// Get balance
address := common.HexToAddress("0x...")
balance, err := client.BalanceAt(context.Background(), address, nil)
if err != nil {
panic(err)
}
fmt.Println("Balance:", balance)
}
Send Transaction
import (
"github.com/tomochain/tomochain/core/types"
"github.com/tomochain/tomochain/crypto"
)
func sendTransaction(client *ethclient.Client) error {
privateKey, err := crypto.HexToECDSA("...")
if err != nil {
return err
}
fromAddress := crypto.PubkeyToAddress(privateKey.PublicKey)
nonce, err := client.PendingNonceAt(context.Background(), fromAddress)
if err != nil {
return err
}
toAddress := common.HexToAddress("0x...")
value := big.NewInt(1000000000000000000) // 1 VIC
gasLimit := uint64(21000)
gasPrice, err := client.SuggestGasPrice(context.Background())
if err != nil {
return err
}
tx := types.NewTransaction(nonce, toAddress, value, gasLimit, gasPrice, nil)
chainID, err := client.NetworkID(context.Background())
if err != nil {
return err
}
signedTx, err := types.SignTx(tx, types.NewEIP155Signer(chainID), privateKey)
if err != nil {
return err
}
err = client.SendTransaction(context.Background(), signedTx)
if err != nil {
return err
}
fmt.Println("Transaction hash:", signedTx.Hash().Hex())
return nil
}
Python Web3.py Integration
Installation
pip install web3
Basic Setup
from web3 import Web3
# Connect to Viction
w3 = Web3(Web3.HTTPProvider('https://rpc.viction.xyz'))
# Check connection
if w3.is_connected():
print('Connected to Viction')
print('Chain ID:', w3.eth.chain_id)
Common Operations
# Get balance
address = '0x...'
balance = w3.eth.get_balance(address)
print(f'Balance: {w3.from_wei(balance, "ether")} VIC')
# Send transaction
account = w3.eth.account.from_key('0x...')
tx = {
'from': account.address,
'to': '0x...',
'value': w3.to_wei(1, 'ether'),
'gas': 21000,
'gasPrice': w3.eth.gas_price,
'nonce': w3.eth.get_transaction_count(account.address),
'chainId': 88
}
signed_tx = w3.eth.account.sign_transaction(tx, account.key)
tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction)
print(f'Transaction hash: {tx_hash.hex()}')
# Wait for receipt
receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
print(f'Transaction confirmed in block {receipt.blockNumber}')
MetaMask Integration
Add Viction Network to MetaMask
async function addVictionNetwork() {
try {
await window.ethereum.request({
method: 'wallet_addEthereumChain',
params: [{
chainId: '0x58', // 88 in hex
chainName: 'Viction',
nativeCurrency: {
name: 'Viction',
symbol: 'VIC',
decimals: 18
},
rpcUrls: ['https://rpc.viction.xyz'],
blockExplorerUrls: ['https://vicscan.xyz']
}]
});
} catch (error) {
console.error('Error adding network:', error);
}
}
Connect Wallet
async function connectWallet() {
if (typeof window.ethereum !== 'undefined') {
const accounts = await window.ethereum.request({
method: 'eth_requestAccounts'
});
console.log('Connected account:', accounts[0]);
return accounts[0];
} else {
alert('Please install MetaMask!');
}
}
Send Transaction with MetaMask
async function sendTransactionWithMetaMask() {
const accounts = await connectWallet();
const transactionParameters = {
from: accounts[0],
to: '0x...',
value: '0x' + (1e18).toString(16), // 1 VIC in wei
gas: '0x5208', // 21000 in hex
};
try {
const txHash = await window.ethereum.request({
method: 'eth_sendTransaction',
params: [transactionParameters],
});
console.log('Transaction hash:', txHash);
} catch (error) {
console.error('Transaction failed:', error);
}
}
Best Practices
Error Handling
async function robustTransaction() {
try {
const tx = await web3.eth.sendTransaction({
from: '0x...',
to: '0x...',
value: web3.utils.toWei('1', 'ether')
});
return tx;
} catch (error) {
if (error.code === 4001) {
console.log('User rejected transaction');
} else if (error.message.includes('insufficient funds')) {
console.log('Insufficient balance');
} else {
console.error('Transaction error:', error);
}
throw error;
}
}
Gas Estimation
async function estimateGas() {
const tx = {
from: '0x...',
to: '0x...',
value: web3.utils.toWei('1', 'ether')
};
const estimatedGas = await web3.eth.estimateGas(tx);
const gasPrice = await web3.eth.getGasPrice();
// Add 20% buffer
const gasLimit = Math.floor(estimatedGas * 1.2);
console.log('Estimated gas:', estimatedGas);
console.log('Gas price:', web3.utils.fromWei(gasPrice, 'gwei'), 'Gwei');
console.log('Recommended gas limit:', gasLimit);
}
Connection Management
class VictionConnection {
constructor(rpcUrl) {
this.web3 = new Web3(rpcUrl);
}
async ensureConnection() {
try {
await this.web3.eth.getBlockNumber();
return true;
} catch (error) {
console.error('Connection failed:', error);
return false;
}
}
async reconnect(newRpcUrl) {
this.web3.setProvider(new Web3.providers.HttpProvider(newRpcUrl));
return this.ensureConnection();
}
}
Development Tools
Hardhat Configuration
// hardhat.config.js
module.exports = {
networks: {
viction: {
url: 'https://rpc.viction.xyz',
chainId: 88,
accounts: [process.env.PRIVATE_KEY]
},
victionTestnet: {
url: 'https://rpc-testnet.viction.xyz',
chainId: 89,
accounts: [process.env.PRIVATE_KEY]
}
},
solidity: '0.8.19'
};
Truffle Configuration
// truffle-config.js
module.exports = {
networks: {
viction: {
provider: () => new HDWalletProvider(
process.env.MNEMONIC,
'https://rpc.viction.xyz'
),
network_id: 88,
gas: 8000000
}
},
compilers: {
solc: {
version: '0.8.19'
}
}
};