Network fees
The gas model ensures that a simple native transaction on Redbelly costs US$0.01. A simple native transaction on Redbelly costs 21000 gas, thus fixing the unit gas price at US$0.000000476190476190.
Note that different opcodes on the Redbelly SEVM cost different amounts of gas to execute (in line with EVM compatibility), but the unit price of gas remains fixed in US$ terms.
This means that the same transaction executed at different times may cost you different amount of native RBNT coins in fees, but the cost in US dollar terms will remain the same independent from the market price of RBNT.
This makes smart contract execution costs predictable in US$ terms ahead of runtime, because the amount of gas required to execute a smart contract function is known. As a smart contract developer, you can calculate the $US cost of deploying and running your smart contract by calculating the amount of gas your smart contract requires to deploy or execute a specific function and multiplying that amount by the unit gas price.
Price oracle
To achieve this, Redbelly implements an on chain, distributed oracle solution that feeds an accurate USD/RBNT exchange rate to the blockchain without relying on external partners and can tolerate the presence of up to t Byzantine data sources.
By having an on chain price oracle that is read by the network nodes at block execution time, the nodes are able deduct the required number of RBNT coins to meet the gas requirements of the specific opcode execution in US$ terms.
When constructing transactions, as a wallet developer for example, the price feed oracle contract and the gas fees contract need to be called. The developer will use the eth_gasEstimate and eth_gasPrice methods which will return values for how much gas units this transaction will require and the unit price of gas in gwei.
You can query the current RBNT price on chain by querying the state of the price feed oracle contract using the script provided below. The script is written in TypeScript and should run in a NodeJS environment. The script uses functions from the ethers library, so you'll need to ensure it is installed by running:
npm i ethers
You will also need to set the following environment variables:
RPC_URL
This is the RPC url of the blockchain node that will be used to fetch the RBNT price.
Environment |
URL |
DevNet |
https://rbn-gcp-australia-southeast2-a-0-rh-v2.devnet.redbelly.network:8545 |
Testnet |
https://governors.testnet.redbelly.network/ |
Mainnet |
https://governors.mainnet.redbelly.network/ |
Bootstrap registry contract address
This is the DevNet contract address of the registry smart contract that the script will use to fetch the price oracle contract address:
Environment |
URL |
DevNet |
0xDAFEA492D9c6733ae3d56b7Ed1ADB60692c98Bc5 |
Testnet |
0xDAFEA492D9c6733ae3d56b7Ed1ADB60692c98Bc5
|
Mainnet |
0xDAFEA492D9c6733ae3d56b7Ed1ADB60692c98Bc5
|
The script
import { ethers } from "ethers";
// Ethereum smart contract ABIs
const priceFeedABI = [
{
inputs: [],
name: "getLatestPrice",
outputs: [
{
internalType: "uint256",
name: "",
type: "uint256",
},
{
internalType: "uint256",
name: "",
type: "uint256",
},
],
stateMutability: "view",
type: "function",
},
];
const bootstrapRegistryABI = [
{
inputs: [
{
internalType: "string",
name: "contractName",
type: "string",
},
],
name: "getContractAddress",
outputs: [
{
internalType: "address",
name: "",
type: "address",
},
],
stateMutability: "view",
type: "function",
},
];
// Function to get the contract address from a bootstrap registry
const getGasPriceContractAddress = async (provider) => {
const bootstrapRegistryContract = new ethers.Contract(
process.env.BOOTSTRAP_REGISTRY_CONTRACT || "",
bootstrapRegistryABI,
provider
);
return await bootstrapRegistryContract.getContractAddress("pricefeed");
};
// Function to fetch the latest price from the smart contract
const fetchLatestPrice = async () => {
const provider = new ethers.JsonRpcProvider(process.env.RPC_URL);
const priceFeedContractAddr = await getGasPriceContractAddress(provider);
const priceFeedContract = new ethers.Contract(
priceFeedContractAddr,
priceFeedABI,
provider
);
try {
// Returns the latest price (6 Decimal Places) and the timestamp when it was updated
return await priceFeedContract.getLatestPrice();
} catch (error) {
console.error("Error calling contract function:", error);
}
};
// Calling fetchLatestPrice and logging the result
fetchLatestPrice().then(console.log);
Transaction fee distribution
To learn more about how transaction fees are portioned and distributed based on activity, review the transaction fees distribution policy.