Smart Contracts for Buyback-and-Burn: Deflation and MEV Protection
DeFi protocols face token inflation: mined tokens drive down price, and the community demands supply reduction. Buyback-and-burn is a classic deflationary mechanism used by BNB (quarterly burns), MKR (sale of governance tokens), and GMX (30% of fees for buybacks). Its essence: the protocol allocates part of its revenue to purchase its own token on a DEX and then destroy it. According to CoinGecko, tokens with a buyback mechanism show 25% lower volatility. We develop such smart contracts turnkey—from design to audit and deployment, with security guarantees and 10+ years of experience in DeFi development. Request a consultation to evaluate your project.
How Buyback-and-Burn Works
The basic scheme: protocol fee → buyback contract → swap on DEX → burn. Key decisions:
- Source of funds: protocol fees (trading, lending, mint fees). The contract accumulates a stablecoin (USDC/USDT) or ETH. The buyback is triggered by schedule or threshold (e.g., every 24 hours or upon accumulating $5,000).
- DEX for swap: on Ethereum/L2—Uniswap V3 via Universal Router or Swap Router 02 (greatest liquidity). On BSC—PancakeSwap, on Polygon—Quickswap. For large orders, multi-hop routing through several pools is used, reducing slippage to 1–2%.
- Burn mechanism:
token.transfer(address(0xdead))—pseudo-burning, does not reduce totalSupply. Real burn via_burn()reduces totalSupply and improves tokenomics metrics.
Protecting Buyback from Sandwich Attacks
Sandwich attacks are the main threat to buyback transactions. MEV bots monitor the mempool, inserting their swap before the purchase (driving up the price) and immediately after (selling at the inflated price). Protection is built on three levels:
- amountOutMinimum: never set to 0. Calculated via Uniswap V3 Quoter with a 1–2% buffer. This parameter is mandatory in the contract.
- Private mempool: sending via Flashbots Protect or MEV Blocker by CoW Protocol. In 95% of cases, this excludes sandwich attacks.
- TWAP check: compare swap price with the 30-minute TWAP from the Uniswap V3 oracle. Deviation >3% triggers a revert.
- Splitting: a single large buyback is split into 5–10 parts with 1–2 minute intervals. Reduces impact and makes attack unprofitable.
Code fragment implementing TWAP check:
// check deviation from TWAP
function checkPriceDeviation(uint256 amountIn, uint256 amountOut) internal view {
uint32[] memory secondsAgo = new uint32[](2);
secondsAgo[0] = 1800; // 30 min ago
secondsAgo[1] = 0; // now
(int56[] memory tickCumulatives,) = IUniswapV3Pool(pool).observe(secondsAgo);
int56 tickDelta = tickCumulatives[1] - tickCumulatives[0];
int24 twapTick = int24(tickDelta / 1800);
uint256 expectedAmountOut = getAmountFromTick(twapTick, amountIn);
require(amountOut >= (expectedAmountOut * 97) / 100, "Price deviation too high");
}
Full BuybackAndBurn Contract Code
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/access/Ownable2Step.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
interface IBurnable is IERC20 {
function burn(uint256 amount) external;
}
contract BuybackAndBurn is Ownable2Step, ReentrancyGuard {
using SafeERC20 for IERC20;
ISwapRouter public immutable swapRouter;
IERC20 public immutable paymentToken; // USDC/ETH/WETH
IBurnable public immutable projectToken;
address public immutable BURN_ADDRESS = address(0xdead);
uint24 public poolFee = 3000; // 0.3% pool, configurable
uint256 public maxSlippageBps = 200; // 2% max slippage
uint256 public minBuybackAmount; // minimum threshold for trigger
event BuybackExecuted(
uint256 paymentAmount,
uint256 tokensBought,
uint256 tokensBurned
);
constructor(
address _router,
address _paymentToken,
address _projectToken,
uint256 _minBuybackAmount
) Ownable(msg.sender) {
swapRouter = ISwapRouter(_router);
paymentToken = IERC20(_paymentToken);
projectToken = IBurnable(_projectToken);
minBuybackAmount = _minBuybackAmount;
}
function executeBuyback(uint256 amountIn, uint256 amountOutMinimum)
external
nonReentrant
onlyOwner
{
require(amountIn >= minBuybackAmount, "Below minimum buyback amount");
require(
paymentToken.balanceOf(address(this)) >= amountIn,
"Insufficient balance"
);
paymentToken.approve(address(swapRouter), amountIn);
ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({
tokenIn: address(paymentToken),
tokenOut: address(projectToken),
fee: poolFee,
recipient: address(this),
deadline: block.timestamp + 300, // 5 minutes
amountIn: amountIn,
amountOutMinimum: amountOutMinimum, // protection against sandwich
sqrtPriceLimitX96: 0
});
uint256 amountOut = swapRouter.exactInputSingle(params);
// Burn purchased tokens
projectToken.burn(amountOut);
emit BuybackExecuted(amountIn, amountOut, amountOut);
}
// Calculate minAmountOut off-chain via Uniswap SDK before calling
function getMinAmountOut(uint256 amountIn)
external
view
returns (uint256)
{
// This is a view-helper for front-end, real calculation via quoter
// quoter.quoteExactInputSingle() outside the contract
revert("Use Quoter contract off-chain");
}
}
DEX Selection and Swap Routing
DEX selection depends on the blockchain and pool liquidity. On Ethereum/L2, Uniswap V3 is optimal due to concentrated liquidity: for a token with high volatility, choose a 0.3% pool; for stable pairs, 0.05%. On BNB Chain—PancakeSwap V3, on Solana—Raydium. For cross-chain projects, we consider routing via 1inch or LI.FI.
A critical parameter is slippage. For buyback volume up to 1% of pool liquidity, slippage usually does not exceed 0.5%. For large amounts (>5% liquidity), we use TWAP orders or splitting into parts.
Automation and Triggers
Two approaches:
Keeper-based (recommended): Chainlink Automation or Gelato Network. The smart contract implements checkUpkeep—if the balance of the payment token exceeds the threshold, the keeper calls performUpkeep. This is a decentralized solution that does not require a trusted server. Chainlink Automation is better than cron jobs: 99.99% reliability vs 95%. In 80% of projects, this option is chosen. For example, for a project with a $500k buyback volume, we reduced gas costs by $3,000 per month using Chainlink Automation instead of manual calls.
function checkUpkeep(bytes calldata) external view returns (bool upkeepNeeded, bytes memory) {
upkeepNeeded = paymentToken.balanceOf(address(this)) >= minBuybackAmount;
}
function performUpkeep(bytes calldata) external {
require(paymentToken.balanceOf(address(this)) >= minBuybackAmount, "Condition not met");
uint256 balance = paymentToken.balanceOf(address(this));
uint256 minOut = _calculateMinOut(balance);
executeBuyback(balance, minOut);
}
Schedule-based: buyback on a fixed schedule (daily, weekly). Simpler for community communication but less capital efficient: funds may sit idle.
Transparency and Reporting
All buyback transactions are recorded in the BuybackExecuted event. Based on these, a dashboard with metrics can be built:
| Metric | Description |
|---|---|
| Total burned | Amount of tokens destroyed |
| Buyback frequency | Frequency of operations |
| Average purchase price | Weighted average price |
| Protocol revenue allocated | Revenue directed to buyback |
| Burn rate | Percentage of total supply |
Data updates in real time—just index events via The Graph or Etherscan API.
What’s Included in Development?
| Component | Description |
|---|---|
| Smart contract | Full code with comments, modular tests on Foundry (>95% coverage) |
| Audit | Slither, Mythril, Echidna checks; formal verification for critical paths |
| Deployment | Mainnet deployment, keeper setup, parameter configuration |
| Documentation | Architecture, launch and management instructions |
| Training | Session for your team on contract operation and parameter adjustment |
| Support | 1 month post-deployment—monitoring and parameter updates |
Process of Work
- Analytics: discuss tokenomics, funding sources, DEX, and triggers.
- Design: contract architecture, stack selection (Uniswap V3, Chainlink, Gelato).
- Implementation: writing code with gas optimization and reentrancy protection.
- Testing: unit tests, fuzzing (Echidna), sandwich attack simulation.
- Audit: external audit + internal code review.
- Deployment and configuration: deploy, set keeper conditions.
- Support: monitoring, parameter updates on request.
Estimated Timeline and Cost
- Basic system: 2 to 4 weeks, starting from $10,000.
- Extended (multiple DEXs, TWAP, advanced MEV protection): 4 to 6 weeks, starting from $25,000.
- Custom configuration (cross-chain bridge, custom automation): discussed individually.
Cost is calculated individually based on complexity. Through gas optimization, fee savings of up to 30% can be achieved—for a project with $500k buyback volume, that's $3,000 per month. Get a detailed cost estimate for your project—contact us for a consultation.
Token burn - Wikipedia — basic definition of the mechanism.







