
Join the KibokoDAO Revolution: Limited NFTs to Shape the Future of Web3 in the African Savannah.
Welcome to Web3, a world where digital assets thrive, ownership is decentralized, and the power of community drives progress. In this brave new ecosystem, NFTs are more than just collectibles—they're your gateway to influence and innovation. At the heart of this evolution lies KibokoDAO NFTs, a Decentralized Autonomous Organization powered by membership NFTs on the Lisk blockchain and hosted on Rarible.Why Lisk?Lisk is redefining blockchain development with its modular approach, empowering de...

Payout Models for Content Creators: A Sustainable Future
Farcaster 2026 writing contest

Africa, We’re About to Get BaD: 7 Countries, One Mission, Infinite Vibes
In a world where DAOs are the new black and Web3 is more than just a buzzword you pretend to understand in front of your tech friends, BuildaDAO (BaD) is taking things to a whole new level of decentralized chaos and creativity. And guess what? We’re going BaD across SEVEN African countries. That’s right—seven places where jollof, nyama choma, bunny chow, and chapati are as essential as block explorers. Kenyans, you can store chapatis on decentralized nodes, your chapatis won't get messed with...

Join the KibokoDAO Revolution: Limited NFTs to Shape the Future of Web3 in the African Savannah.
Welcome to Web3, a world where digital assets thrive, ownership is decentralized, and the power of community drives progress. In this brave new ecosystem, NFTs are more than just collectibles—they're your gateway to influence and innovation. At the heart of this evolution lies KibokoDAO NFTs, a Decentralized Autonomous Organization powered by membership NFTs on the Lisk blockchain and hosted on Rarible.Why Lisk?Lisk is redefining blockchain development with its modular approach, empowering de...

Payout Models for Content Creators: A Sustainable Future
Farcaster 2026 writing contest

Africa, We’re About to Get BaD: 7 Countries, One Mission, Infinite Vibes
In a world where DAOs are the new black and Web3 is more than just a buzzword you pretend to understand in front of your tech friends, BuildaDAO (BaD) is taking things to a whole new level of decentralized chaos and creativity. And guess what? We’re going BaD across SEVEN African countries. That’s right—seven places where jollof, nyama choma, bunny chow, and chapati are as essential as block explorers. Kenyans, you can store chapatis on decentralized nodes, your chapatis won't get messed with...
Subscribe to fabian
Subscribe to fabian
Share Dialog
Share Dialog


<100 subscribers
<100 subscribers
Before you hit "deploy" like you’re launching a new tender for roads, ask yourself these vital survival questions:
Who can mint?
Is it you, the DAO, or everyone and their shosho?
Is there a limit?
Ama ni free-for-all like campaign season promises?
Can someone sneakily mint again?
Maybe a secret door somewhere — like a Nairobi plot with 7 title deeds?
Any logic or gas traps?
You don’t want a mint function that costs more than cooking gas after subsidy removal.
Is the code hiding secrets?
If your mint function is named doMagic() or xyz().
function mint(address to, uint256 amount) public {
_mint(to, amount);
}
No access control! Anyone can call this and mint as many tokens as they want. That’s like giving everyone keys to Central Bank of Kenya.
Expected fix: Add onlyOwner, onlyMinter, or a controlled mechanism.
uint256 public totalSupply;
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
No maxSupply limit. This lets the contract owner print tokens like campaign posters in August.
Expected fix: Add a require(totalSupply + amount <= maxSupply) check.
function mintReward() public {
uint256 reward = calculateReward(msg.sender);
_mint(msg.sender, reward);
(bool sent, ) = msg.sender.call{value: reward}("");
require(sent, "Failed to send Ether");
}
Calling external code (call) after minting = 🍭 for reentrancy attacks.
Expected fix: Use checks-effects-interactions pattern or reentrancy guard.
constructor() {
_mint(msg.sender, 1000000 * 10**18);
}
While this looks okay, if the constructor is not private and uses delegatecall, or the deployer is unclear, someone might mint again or deploy with altered logic.
Expected fix: Ensure constructor is clean and can't be reused.
function mint() public {
uint256 amount = totalSupply * 2;
_mint(msg.sender, amount);
}
This doubles supply every time someone mints. One click and… "We are all billionaires now!"
Expected fix: Stick to logical, tested inflation/minting rules.
function xyz(address a, uint256 b) public {
if (msg.sender == tx.origin && b == 1) {
_mint(a, 999999999999 * 10**18);
}
}
Looks harmless unless you're sharp. But this is a backdoor to mint unlimited tokens under specific conditions.
Expected fix: Audit all strange if logic or conditions thoroughly.
Bonus: Strange Naming / Function Aliases
function mintIt(address _to, uint256 _val) public onlyMinter {
__MINT(_to, _val);
}
Weird naming like mintIt, __MINT, or magicPower() could hide minting logic, making the code less transparent. Especially if the function is called in unexpected ways (e.g., through proxies or external contracts).
Before you hit "deploy" like you’re launching a new tender for roads, ask yourself these vital survival questions:
Who can mint?
Is it you, the DAO, or everyone and their shosho?
Is there a limit?
Ama ni free-for-all like campaign season promises?
Can someone sneakily mint again?
Maybe a secret door somewhere — like a Nairobi plot with 7 title deeds?
Any logic or gas traps?
You don’t want a mint function that costs more than cooking gas after subsidy removal.
Is the code hiding secrets?
If your mint function is named doMagic() or xyz().
function mint(address to, uint256 amount) public {
_mint(to, amount);
}
No access control! Anyone can call this and mint as many tokens as they want. That’s like giving everyone keys to Central Bank of Kenya.
Expected fix: Add onlyOwner, onlyMinter, or a controlled mechanism.
uint256 public totalSupply;
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
No maxSupply limit. This lets the contract owner print tokens like campaign posters in August.
Expected fix: Add a require(totalSupply + amount <= maxSupply) check.
function mintReward() public {
uint256 reward = calculateReward(msg.sender);
_mint(msg.sender, reward);
(bool sent, ) = msg.sender.call{value: reward}("");
require(sent, "Failed to send Ether");
}
Calling external code (call) after minting = 🍭 for reentrancy attacks.
Expected fix: Use checks-effects-interactions pattern or reentrancy guard.
constructor() {
_mint(msg.sender, 1000000 * 10**18);
}
While this looks okay, if the constructor is not private and uses delegatecall, or the deployer is unclear, someone might mint again or deploy with altered logic.
Expected fix: Ensure constructor is clean and can't be reused.
function mint() public {
uint256 amount = totalSupply * 2;
_mint(msg.sender, amount);
}
This doubles supply every time someone mints. One click and… "We are all billionaires now!"
Expected fix: Stick to logical, tested inflation/minting rules.
function xyz(address a, uint256 b) public {
if (msg.sender == tx.origin && b == 1) {
_mint(a, 999999999999 * 10**18);
}
}
Looks harmless unless you're sharp. But this is a backdoor to mint unlimited tokens under specific conditions.
Expected fix: Audit all strange if logic or conditions thoroughly.
Bonus: Strange Naming / Function Aliases
function mintIt(address _to, uint256 _val) public onlyMinter {
__MINT(_to, _val);
}
Weird naming like mintIt, __MINT, or magicPower() could hide minting logic, making the code less transparent. Especially if the function is called in unexpected ways (e.g., through proxies or external contracts).
Fabian Owuor
Fabian Owuor
No activity yet