Proof of Work Distribution

Distributing sFUEL through Proof-of-Work is a two-step process where the first step is optional depending on your SKALE Chain.

Step 1 | Deploy sFUEL Distribution Contract

If you are building on a SKALE Hub or Chaos Testnet, checkout the deployed contracts and skip to Step II.

If you are on a dedicated SKALE Chain and have not deployed a sFUEL Distribution smart contract, yet, proceed with Step I.

The following will use the sFUEL Distribution Contract by Dirt Road Dev. This contract is based on the example found here in the docs.

Setup the Project

Start by cloning (and optionally forking) the GitHub repository:

git clone https://github.com/Dirt-Road-Develompent/sfuel-distribution-contract && cd sfuel-distribution-contract

After entering into the root of the directory run the setup script:

chmod +x ./setup.sh && ./setup.sh

This will install npm packages, add the Open Zeppelin smart contracts package, and create a .env file in the root of project.

Setup Environment

The next step is to setup the environment. Open the .env file which looks like this:

# Private Key - DO NOT SHARE - Should NOT start with 0x
DEPLOYER_PRIVATE_KEY=

# SKALE Chain RPC
RPC_URL=

# Decimal Form
CHAIN_ID=

# Blockscout -> Browser Url + /api
API_URL=

# Blockscout
BROWSER_URL=

and fill in the all the values. The final result should look like this:

# Private Key - DO NOT SHARE - Should NOT start with 0x
DEPLOYER_PRIVATE_KEY=0000000000000000000000000000000000000000000000000000000000000000

# SKALE Chain RPC
RPC_URL=https://mainnet.skalenodes.com/v1/some-amazing-schain-name

# Decimal Form
CHAIN_ID=11111111111

# Blockscout -> Browser Url + /api
API_URL=https://some-amazing-schain-name.explorer.mainnet.skalenodes.com/api

# Blockscout
BROWSER_URL=https://some-amazing-schain-name.explorer.mainnet.skalenodes.com
The private key added is linked to an Ethereum Address. That Ethereum Address must have Deployer Role — see SKALE Chain Access Control — and at least as much sFUEL as defined in the deployment config here. Deployment will fail without confirming these.
If the deployer address does not have DEPLOYER_ROLE, the transaction will fail with an error on the explorer that says:

Error: Out of Gas

Deploy the Contract

With everything setup, you can deploy the contract by running:

chmod +x ./deploy_secure.sh && ./deploy_secure.sh

The contract should deploy in a few seconds. Once deployed, the contract will automatically begin to verify itself on the block explorer. Do not interrupt this process if you want the contract verified. Make sure to save this contract address, you will need it for Step II of this recipe.

Step 2 | Setup dApp

Step 2 of this recipe uses Next.Js, Wagmi, Rainbowkit, and Proof of Work to distribute sFUEL to new users of your dApp.

Project Setup

Start by cloning the recipe to your local machine by running:

git clone -b starter-pow-distribution-frontend https://github.com/skalenetwork/recipes.git && cd recipes/next.js

Once cloned and in the next.js directory, run:

npm install

to install the necessary packages.

Run the Project

Now, to run the project on the Calypso NFT Hub testnet you can run:

npm run dev

in your terminal and navigate to localhost on port 3000. Connecting a wallet and clicking Fill Up& will trigger the Proof of Work script.

Proof of Work can run on any SKALE Chain without requiring an active wallet connection. This means that you do not need to setup Wagmi with your SKALE Chain. If you want to add your SKALE Chain, explore the available supported SKALE Chains or add your own.

Add your deployed contract

The final step is to add your SKALE Chain and contract information. Go to the useSKALEFuel React Hook file.

In production, you may split your configuration and hooks. To simplify the code, the configuration variables have been added to this file.

Update lines 7-9 as needed:

  • CONTRACT_ADDRESS should be changed to the value of your deployed contract or the address taken from the hub list

  • Function_HASH should only be changed if you changed the pay function here

  • RPC_URL should be changed to match the SKALE Chain you are using.

After updating the values, the dApp should now be conncted to and distribute sFUEL for users on your SKALE Chain.

You now have a fully decentralized and nearly invisible onboarding experience. For a fully invisisble distribution, remove the button and automatically fill up users behind the scenes.