Burn gas for points, claim everyone's refund. Wait longer to claim more. Live on Blast testnet at https://blastgasking.xyz/.
Earn points and become the King of the Hill by burning gas. The game is played in rounds on various Hills.
The King can claim a refund for all gas burned during the round after a certain delay (claimDelay
). Keep earning points during this time to maintain your lead. If someone else takes the lead, the wait time resets.
According to Blast's rules refunds grow over time, from 50% to 100%.
Player Strategies:
- First Player: If no one challenges you, wait until 100% refund to get all your fees back.
- Second Player: Overtake the leader and you're guaranteed to earn more than what you spent, thanks to a minimum 50% fee claim.
- Beyond Two Players: More competition means profit for the winner is guaranteed.
GasKingGame
contract is used to createHill
s (game servers) which differ only byclaimDelay
. There's 3 default hills (1 minutes, 1 hour, 1 day).- The
Hill
is where the game is played. Each player competes for points by burning gas viaburnForPoints
. - The player with the most points can claim all the contract's (
Hill
's) gas fees usingclaimWinnings
if they have been "king" longer thanclaimDelay
. - After a successful claim, a new round of the game starts.
- Historical data is saved for previous plays and accessible via
getRound
. - Claimable amount off-chain is accessible via
claimableSimulate
.
Mainnet on https://blastscan.io/:
GasKingGame
(w. 3 default hills): https://blastscan.io/address/0x0958f342bd16c243e500ebb20ec7593e19e77245#code. FirstHill
: https://blastscan.io/address/0x5e1038026368279e95179d693716c6bda6fdd25e#code.
Testnet: https://testnet.blastscan.io/:
GasKingGame
(w. 3 default hills): https://testnet.blastscan.io/address/0x0958f342bd16c243e500Ebb20ec7593e19e77245. FirstHill
: https://testnet.blastscan.io/address/0x5E1038026368279E95179D693716c6BDA6FDd25e.
interface GasKingGame {
// mutative
function createHill(uint claimDelay) external returns (address hill);
// views
function hillAddresses(uint) external view returns (address);
function lastHillIndex() external view returns (uint);
event HillCreated(uint claimDelay, address hill);
}
interface Hill {
// mutative
function burnForPoints() external;
function claimWinnings() external returns (uint amount);
receive() external payable;
// mutative but should be used as view (via simulation)
function claimableSimulate() external returns (uint claimable);
// views
function claimDelay() external view returns (uint);
function lastRoundIndex() external view returns (uint);
function getRound(uint roundIndex) external view returns (Round memory);
function players(address) external view returns (uint points, uint lastRoundPlayed);
// view structs
struct PlayHistory {
address player;
uint points;
uint timestamp;
}
struct Round {
uint lastCoronationTimestamp;
address currentKing;
uint totalPoints;
uint winnings;
PlayHistory[] plays;
}
// events
event Burned(
address indexed sender, uint indexed roundIndex, bool indexed isWinning, uint amount, uint gas
);
event GasFeesClaimed(uint amount);
event NewRound(uint roundIndex);
event RoundWon(address indexed winner, uint roundIndex, uint amount, uint winnerPoints, uint totalPoints);
}
If this is your first time with Foundry, check out the installation instructions.
This template builds upon the frameworks and libraries mentioned above, so please consult their respective documentation for details about their specific features.
For example, if you're interested in exploring Foundry in more detail, you should look at the Foundry Book. In particular, you may be interested in reading the Writing Tests tutorial.
This template comes with a set of sensible default configurations for you to use. These defaults can be found in the following files:
├── .editorconfig
├── .gitignore
├── .prettierignore
├── .prettierrc.yml
├── .solhint.json
├── foundry.toml
└── remappings.txt
This template is IDE agnostic, but for the best user experience, you may want to use it in VSCode alongside Nomic Foundation's Solidity extension.
For guidance on how to integrate a Foundry project in VSCode, please refer to this guide.
This template comes with GitHub Actions pre-configured. Your contracts will be linted and tested on every push and pull
request made to the main
branch.
You can edit the CI script in .github/workflows/ci.yml.
Foundry typically uses git submodules to manage dependencies, but this template uses Node.js packages because submodules don't scale.
This is how to install dependencies:
- Install the dependency using your preferred package manager, e.g.
bun install dependency-name
- Use this syntax to install from GitHub:
bun install github:username/repo-name
- Use this syntax to install from GitHub:
- Add a remapping for the dependency in remappings.txt, e.g.
dependency-name=node_modules/dependency-name
Note that OpenZeppelin Contracts is pre-installed, so you can follow that as an example.
To write a new test contract, you start by importing PRBTest and inherit from
it in your test contract. PRBTest comes with a pre-instantiated cheatcodes
environment accessible via the vm
property. If you would like to view the logs in the terminal output you can add the
-vvv
flag and use console.log.
This template comes with an example test contract Foo.t.sol
This is a list of the most frequently needed commands.
Build the contracts:
$ forge build
Delete the build artifacts and cache directories:
$ forge clean
Compile the contracts:
$ forge build
Get a test coverage report:
$ forge coverage
Deploy to Anvil:
$ forge script script/Deploy.s.sol --broadcast --fork-url http://localhost:8545
For this script to work, you need to have a MNEMONIC
environment variable set to a valid
BIP39 mnemonic.
For instructions on how to deploy to a testnet or mainnet, check out the Solidity Scripting tutorial.
Format the contracts:
$ forge fmt
Get a gas report:
$ forge test --gas-report
Lint the contracts:
$ bun run lint
Run the tests:
$ forge test
Generate test coverage and output result to the terminal:
$ bun run test:coverage
Generate test coverage with lcov report (you'll have to open the ./coverage/index.html
file in your browser, to do so
simply copy paste the path):
$ bun run test:coverage:report
- abigger87/femplate
- cleanunicorn/ethereum-smartcontract-template
- foundry-rs/forge-template
- FrankieIsLost/forge-template
This project is licensed under MIT.