FeeGrant module for blobs submission
Overview
This guide provides developers with the knowledge to use the FeeGrant module on the Celestia's Mocha testnet chain for granting a data availability node's account to submit blobs without constantly funding it, enabling a third-party account to cover the transaction fees.
Pre-requisites
- celestia-node binary (
celestia
) installed - Access to a Mocha node (e.g.,
https://rpc.celestia-mocha.com:443
) - Running DA Light node on Mocha testnet
- One account with sufficient funds, the "granter"
- One account with no funds, the "grantee"
Introduction
Each DA node contains a Celestia account that is used to pay for blobs submissions. To unify the fee payment process, the FeeGrant module allows a third-party account (granter) to pay for the fees incurred by a DA node's (grantee) account. You will need one account that will contain the funds, the granter, and another account that will be in the DA node you run to post blobs, the grantee. You will see the DA node's account once you initialize the node. Learn more about managing accounts with cel-key
in create a wallet with celestia-node.
Granting fee allowances using celestia-node
To get started granting the fee allowance, you will need two separate keys to run the light node with. One to begin the FeeGrant as the granter and another to use the FeeGrant as the grantee.
Set some variables for your accounts for the remainder of the guide:
export GRANTER_ADDRESS=<your-granter-account-address>
export GRANTEE_ADDRESS=<your-grantee-account-address>
export RPC_URL=rpc.celestia-mocha.com
export GRANTER_ADDRESS=<your-granter-account-address>
export GRANTEE_ADDRESS=<your-grantee-account-address>
export RPC_URL=rpc.celestia-mocha.com
FeeGrant module implementation in celestia-node
Using celestia-node, you now can easily give permission for other nodes to submit transactions on your behalf. It is also possible to revoke the grant.
The node that receives the grant has to run a node with the --granter.address=$GRANTER_ADDRESS>
flag to use FeeGrant functionality.
The granter address will be stored until the next run of your local node. So, in case the granter revokes permission, you will have to restart the node without this flag.
TIP
Transactions paid for by the the FeeGrant module will consume more gas than regular PayForBlobs
transactions.
Fee and transaction type | Transaction 1 | Transaction 2 |
---|---|---|
0.000176 fee with feegrant on Mocha testnet | Link | Link |
0.00016 fee without feegrant on Mocha testnet | Link | Link |
Grant permission for an allowance as a granter
First, your node will need to be running with a command similar to:
celestia light start --p2p.network mocha --core.ip $RPC_URL \
--keyring.keyname granter_key
celestia light start --p2p.network mocha --core.ip $RPC_URL \
--keyring.keyname granter_key
Then, grant the fee to the grantee:
celestia state grant-fee $GRANTEE_ADDRESS 2000 1000000
celestia state grant-fee $GRANTEE_ADDRESS 2000 1000000
Note that the --amount uint
flag specifies the spend limit (in utia) for the grantee. The default value is 0 which means the grantee does not have a spend limit.
To set a limit of 42069 utia, use the following command:
celestia state grant-fee $GRANTEE_ADDRESS 2000 1000000 \
--amount 42069
celestia state grant-fee $GRANTEE_ADDRESS 2000 1000000 \
--amount 42069
Find the example transaction on Celenium.
Using a FeeGrant allowance as a grantee in celestia-node
First, start your node with the grantee account:
celestia light start --core.ip $RPC_URL --p2p.network=mocha
--granter.address=$GRANTER_ADDRESS
celestia light start --core.ip $RPC_URL --p2p.network=mocha
--granter.address=$GRANTER_ADDRESS
To check the balance of a light node, use the following command:
celestia state balance
celestia state balance
Example response when the account balance does not exist:
{
"result": {
"denom": "utia",
"amount": "0"
}
}
{
"result": {
"denom": "utia",
"amount": "0"
}
}
This indicates that the light node currently does not have any funds.
Now submit a blob:
celestia blob submit 0x42690c204d39600fddd3 0x6665656772616e74
celestia blob submit 0x42690c204d39600fddd3 0x6665656772616e74
You'll see the height and the commitment of your blob:
{
"result": {
"height": 1639397,
"commitments": [
"19L/C4iBEsqXGzC5ZxJ3vtuGBiAdQAMIEnbYjKEGcac="
]
}
}
{
"result": {
"height": 1639397,
"commitments": [
"19L/C4iBEsqXGzC5ZxJ3vtuGBiAdQAMIEnbYjKEGcac="
]
}
}
After the transactions made making this guide, see that the account balance is still 0 utia.
Checking account balances after submission
Light node account: After submitting a blob, you can check the light node account's balance to verify that the fees have been deducted:
celestia state balance
celestia state balance
Example output showing fees are not deducted:
{
"result": {
"denom": "utia",
"amount": "0"
}
}
{
"result": {
"denom": "utia",
"amount": "0"
}
}
Optional: Revoke permission for a FeeGrant allowance as a granter
To revoke the feegrant, run your light node as the granter and run:
celestia state revoke-grant-fee $GRANTEE_ADDRESS 2000 1000000
celestia state revoke-grant-fee $GRANTEE_ADDRESS 2000 1000000
There is also a specific error for the case when you run your node as a grantee, but the granter revokes their permission. In this case, your transaction will fail with the error: granter has revoked the grant
This will mean that you have to restart the node without the granter.address
flag.
Optional: Submitting a blob from file input
To submit a blob from file input:
celestia blob submit --input-file blob.json
celestia blob submit --input-file blob.json
Optional: Granting fee allowances using celestia-appd
To grant fee allowances, allowing a third-party (granter) account to pay for the fees incurred by a Celestia data availability node (grantee) account, use the following commands.
Set your account addresses for grantee and granter, and the RPC URL:
export GRANTER_ADDRESS=<your-granter-account-address>
export GRANTEE_ADDRESS=<your-grantee-account-address>
export RPC_URL=https://rpc.celestia-mocha.com:443
export GRANTER_ADDRESS=<your-granter-account-address>
export GRANTEE_ADDRESS=<your-grantee-account-address>
export RPC_URL=https://rpc.celestia-mocha.com:443
Then, send the feegrant transaction:
celestia-appd tx feegrant grant \
$GRANTER_ADDRESS $GRANTEE_ADDRESS \
--node $RPC_URL \
--spend-limit 1000000utia \
--allowed-messages "/cosmos.bank.v1beta1.MsgSend,/celestia.blob.v1.MsgPayForBlobs" \
--chain-id mocha-4 \
--keyring-backend test \
--fees 20000utia \
--broadcast-mode block \
--yes
celestia-appd tx feegrant grant \
$GRANTER_ADDRESS $GRANTEE_ADDRESS \
--node $RPC_URL \
--spend-limit 1000000utia \
--allowed-messages "/cosmos.bank.v1beta1.MsgSend,/celestia.blob.v1.MsgPayForBlobs" \
--chain-id mocha-4 \
--keyring-backend test \
--fees 20000utia \
--broadcast-mode block \
--yes
Example: FeeGrant transaction on Mocha
Optional: Checking the granter's account
To confirm that the fees have been deducted from the granter's account that granted the fee allowance, run:
celestia-appd query bank balances $GRANTER_ADDRESS \
--node https://rpc.celestia-mocha.com:443 --denom utia
celestia-appd query bank balances $GRANTER_ADDRESS \
--node https://rpc.celestia-mocha.com:443 --denom utia
This output will show the remaining balance after fees have been deducted, confirming that the FeeGrant module is working as intended.