FounderVesting (Archived)
Archived standalone vesting contract for founder PRIV token allocation. Superseded by TokenDistributionV2.
ARCHIVED (Feb 2026): FounderVesting.sol has been superseded by TokenDistributionV2.sol, which manages all token allocations (founder, treasury, ecosystem, investor). FounderVesting.sol will NOT be deployed to mainnet. This page is preserved for historical reference only.
ARCHIVED CONTRACT -- FounderVesting.sol is a standalone legacy contract that has been superseded by TokenDistributionV2, which manages all token allocations (Founder, Treasury, and Ecosystem) in a single contract with a 2-day beneficiary change timelock. New integrations should use TokenDistributionV2 exclusively. Deploying FounderVesting.sol alongside TokenDistributionV2 would result in double-allocation of the founder's 30M PRIV tokens. The values documented below reflect the current on-chain contract code.
FounderVesting
The FounderVesting contract manages the founder's PRIV token allocation with an immediate TGE unlock and linear vesting over 24 months.
Overview
Vesting Schedule
| Parameter | Value | Description |
|---|---|---|
| Total Allocation | 30,000,000 PRIV | 30% of 100M total supply |
| TGE Unlock | 3,000,000 PRIV | Immediately claimable (10% of allocation) |
| Vesting Amount | 27,000,000 PRIV | Vested over 24 months |
| Vesting Duration | 730 days (~24 months) | Linear vesting |
Vesting Timeline
TGE 24 months
| |
v v
[3M TGE]---[========= 27M LINEAR ============]
At TGE: 3M unlocked (immediately claimable)
Month 1: 3M + 1.125M = 4.125M
Month 6: 3M + 6.75M = 9.75M
Month 12: 3M + 13.5M = 16.5M
Month 18: 3M + 20.25M = 23.25M
Month 24: 30M (fully vested)The founder address is immutable and cannot be changed after deployment for maximum security.
Constants
| Constant | Value | Description |
|---|---|---|
TOTAL_ALLOCATION | 30,000,000 PRIV | Total founder allocation |
TGE_UNLOCK | 3,000,000 PRIV | Immediately claimable (10%) |
VESTING_AMOUNT | 27,000,000 PRIV | Amount to vest linearly |
VESTING_DURATION | 730 days | ~24 months |
PRECISION | 10000 | Percentage precision (100% = 10000) |
State Variables
// The PRIV token contract
IERC20 public immutable privToken;
// The founder wallet address (immutable - cannot be changed)
address public immutable founder;
// Timestamp when vesting started (contract deployment)
uint256 public immutable vestingStart;
// Total amount already claimed
uint256 public totalClaimed;Functions
Claiming
claim
Claims all currently claimable tokens.
function claim() external nonReentrantRequirements:
- Caller must be the founder
- Must have claimable tokens (claimable > 0)
- Contract must have sufficient balance
Events:
event TokensClaimed(
address indexed founder,
uint256 amount,
uint256 totalClaimed
);View Functions
claimable
Returns the amount currently claimable.
function claimable() public view returns (uint256)Returns: totalVested() - totalClaimed
totalVested
Returns the total amount vested to date.
function totalVested() public view returns (uint256)Calculation:
- TGE unlock (3M) is immediately available
- Plus linear portion of 27M based on elapsed time
vestingProgress
Returns vesting progress as a percentage.
function vestingProgress() public view returns (uint256)Returns: Percentage in basis points (10000 = 100%)
vestingEnd
Returns the timestamp when vesting completes.
function vestingEnd() public view returns (uint256)Returns: vestingStart + VESTING_DURATION
timeUntilFullyVested
Returns seconds until fully vested.
function timeUntilFullyVested() public view returns (uint256)Returns: 0 if already fully vested
lockedAmount
Returns the amount still locked.
function lockedAmount() public view returns (uint256)Returns: TOTAL_ALLOCATION - totalVested()
monthlyVestingAmount
Returns the approximate monthly vesting amount.
function monthlyVestingAmount() public pure returns (uint256)Returns: ~1,125,000 PRIV per month (27M / 24 months)
Integration Example
import { ethers } from 'ethers';
const vesting = new ethers.Contract(
vestingAddress,
vestingABI,
signer
);
// Check vesting status
const totalVested = await vesting.totalVested();
const claimed = await vesting.totalClaimed();
const claimable = await vesting.claimable();
const progress = await vesting.vestingProgress();
const locked = await vesting.lockedAmount();
const timeRemaining = await vesting.timeUntilFullyVested();
console.log('Vesting Status:');
console.log(' Total Vested:', ethers.formatEther(totalVested), 'PRIV');
console.log(' Already Claimed:', ethers.formatEther(claimed), 'PRIV');
console.log(' Claimable Now:', ethers.formatEther(claimable), 'PRIV');
console.log(' Progress:', Number(progress) / 100, '%');
console.log(' Still Locked:', ethers.formatEther(locked), 'PRIV');
console.log(' Time Remaining:', Math.floor(Number(timeRemaining) / 86400), 'days');
// Claim tokens (founder only)
if (claimable > 0) {
const tx = await vesting.claim();
const receipt = await tx.wait();
const event = receipt.logs.find(log =>
log.topics[0] === vesting.interface.getEvent('TokensClaimed').topicHash
);
console.log('Claimed:', ethers.formatEther(event.args.amount), 'PRIV');
}Monthly Claim Schedule
Assuming TGE occurs on January 1st:
| Month | Cumulative Vested | Monthly Unlock | Example Claim |
|---|---|---|---|
| TGE | 3,000,000 | 3,000,000 | 3M PRIV |
| 1 | 4,125,000 | 1,125,000 | 1.125M PRIV |
| 2 | 5,250,000 | 1,125,000 | 1.125M PRIV |
| 3 | 6,375,000 | 1,125,000 | 1.125M PRIV |
| 6 | 9,750,000 | 1,125,000 | 1.125M PRIV |
| 12 | 16,500,000 | 1,125,000 | 1.125M PRIV |
| 18 | 23,250,000 | 1,125,000 | 1.125M PRIV |
| 24 | 30,000,000 | 1,125,000 | 1.125M PRIV |
Security Features
| Feature | Description |
|---|---|
| Immutable Founder | Founder address cannot be changed |
| Immutable Token | Token address cannot be changed |
| ReentrancyGuard | Protection against reentrancy attacks |
| Balance Check | Verifies contract has sufficient tokens |
| SafeERC20 | Safe token transfer handling |
The founder address is set at deployment and cannot be changed. Ensure the correct address is used.
Deployment
After deployment, tokens must be transferred to the contract:
// Deploy the contract
const vesting = await FounderVesting.deploy(
privTokenAddress,
founderWalletAddress
);
// Transfer 30M PRIV to the vesting contract
const priv = new ethers.Contract(privTokenAddress, erc20ABI, deployer);
await priv.transfer(
vesting.address,
ethers.parseEther('30000000')
);
// Founder can now claim 3M TGE unlock immediately
await vesting.connect(founder).claim();Events Reference
| Event | Description |
|---|---|
TokensClaimed | Emitted when founder claims tokens |
Event Parameters:
founder- The founder addressamount- Amount claimed in this transactiontotalClaimed- Cumulative amount claimed to date