Precompiles
Native Minter
Manage the minting and burning of native tokens on your Avalanche L1 blockchain.
Overview
The Native Minter precompile allows authorized addresses to mint additional tokens after network launch. This is useful for:
- Implementing programmatic token emission schedules
- Providing validator rewards
- Supporting ecosystem growth initiatives
- Implementing monetary policy
| Property | Value |
|---|---|
| Address | 0x0200000000000000000000000000000000000001 |
| ConfigKey | contractNativeMinterConfig |
Configuration
You can activate this precompile in your genesis file:
{
"config": {
"contractNativeMinterConfig": {
"blockTimestamp": 0,
"adminAddresses": ["0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC"]
}
}
}Interface
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
interface INativeMinter {
event NativeCoinMinted(address indexed sender, address indexed recipient, uint256 amount);
// Mint [amount] number of native coins and send to [addr]
function mintNativeCoin(address addr, uint256 amount) external;
// IAllowList
event RoleSet(uint256 indexed role, address indexed account, address indexed sender, uint256 oldRole);
// Set [addr] to have the admin role over the precompile contract.
function setAdmin(address addr) external;
// Set [addr] to be enabled on the precompile contract.
function setEnabled(address addr) external;
// Set [addr] to have the manager role over the precompile contract.
function setManager(address addr) external;
// Set [addr] to have no role for the precompile contract.
function setNone(address addr) external;
// Read the status of [addr].
function readAllowList(address addr) external view returns (uint256 role);
}The Native Minter precompile uses the AllowList interface to restrict access to its functionality.
Best Practices
-
Minting Policy:
- Define clear minting guidelines
- Use multi-sig for admin control
- Implement transparent emission schedules
- Monitor total supply changes
-
Supply Management:
- Balance minting with burning mechanisms
- Consider implementing supply caps
- Monitor token velocity and distribution
- Plan for long-term sustainability
-
Security Considerations:
- Use multi-sig wallets for admin addresses
- Implement time-locks for large mints
- Regular audits of minting activity
- Monitor for unusual minting patterns
-
Validator Incentives:
- Design sustainable reward mechanisms
- Balance inflation with network security
- Consider validator stake requirements
- Plan for long-term validator participation
Example Implementations
Programmatic Emission Schedule
contract EmissionSchedule {
INativeMinter public constant NATIVE_MINTER = INativeMinter(0x0200000000000000000000000000000000000001);
uint256 public constant EMISSION_RATE = 1000 * 1e18; // 1000 tokens per day
uint256 public constant EMISSION_DURATION = 365 days;
uint256 public immutable startTime;
constructor() {
startTime = block.timestamp;
}
function mintDailyEmission() external {
require(block.timestamp < startTime + EMISSION_DURATION, "Emission ended");
NATIVE_MINTER.mintNativeCoin(address(this), EMISSION_RATE);
// Distribution logic here
}
}Validator Reward Contract
contract ValidatorRewards {
INativeMinter public constant NATIVE_MINTER = INativeMinter(0x0200000000000000000000000000000000000001);
uint256 public constant REWARD_RATE = 10 * 1e18; // 10 tokens per block
function distributeRewards(address[] calldata validators) external {
uint256 reward = REWARD_RATE / validators.length;
for (uint i = 0; i < validators.length; i++) {
NATIVE_MINTER.mintNativeCoin(validators[i], reward);
}
}
}Implementation
You can find the Native Minter implementation in the subnet-evm repository.
Interacting with the Precompile
For information on how to interact with this precompile, see:
Is this guide helpful?