PRIV ProtocolPRIV Docs
Contracts

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

ParameterValueDescription
Total Allocation30,000,000 PRIV30% of 100M total supply
TGE Unlock3,000,000 PRIVImmediately claimable (10% of allocation)
Vesting Amount27,000,000 PRIVVested over 24 months
Vesting Duration730 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

ConstantValueDescription
TOTAL_ALLOCATION30,000,000 PRIVTotal founder allocation
TGE_UNLOCK3,000,000 PRIVImmediately claimable (10%)
VESTING_AMOUNT27,000,000 PRIVAmount to vest linearly
VESTING_DURATION730 days~24 months
PRECISION10000Percentage 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 nonReentrant

Requirements:

  • 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:

MonthCumulative VestedMonthly UnlockExample Claim
TGE3,000,0003,000,0003M PRIV
14,125,0001,125,0001.125M PRIV
25,250,0001,125,0001.125M PRIV
36,375,0001,125,0001.125M PRIV
69,750,0001,125,0001.125M PRIV
1216,500,0001,125,0001.125M PRIV
1823,250,0001,125,0001.125M PRIV
2430,000,0001,125,0001.125M PRIV

Security Features

FeatureDescription
Immutable FounderFounder address cannot be changed
Immutable TokenToken address cannot be changed
ReentrancyGuardProtection against reentrancy attacks
Balance CheckVerifies contract has sufficient tokens
SafeERC20Safe 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

EventDescription
TokensClaimedEmitted when founder claims tokens

Event Parameters:

  • founder - The founder address
  • amount - Amount claimed in this transaction
  • totalClaimed - Cumulative amount claimed to date