/** * Position profit calculations for Harberger staking. * * Positions earn profit through their proportional share of new token issuance. * This aligns with the Harberger tax economic model where stakers earn from protocol growth. */ /** * Calculate profit for an active position. * * Active positions earn their proportional share of all new tokens minted * since the position was created. * * @param totalSupplyInit - Total token supply when position was created * @param currentTotalSupply - Current total token supply * @param positionShare - Position's proportional share (0-1) * @returns Profit in token units (not wei) */ export function calculateActivePositionProfit(totalSupplyInit: bigint, currentTotalSupply: bigint, positionShare: number): number { if (totalSupplyInit < 0n || currentTotalSupply < 0n) { throw new Error('Supply values must be non-negative'); } if (positionShare < 0 || positionShare > 1) { throw new Error('Position share must be between 0 and 1'); } if (currentTotalSupply < totalSupplyInit) { // If supply decreased (shouldn't happen in normal operation), return 0 return 0; } // Convert to token units (assuming 18 decimals) const initSupply = Number(totalSupplyInit) / 1e18; const currentSupply = Number(currentTotalSupply) / 1e18; // Calculate new issuance since position creation const newIssuance = currentSupply - initSupply; // Position earns its share of new issuance return newIssuance * positionShare; } /** * Calculate profit for a closed position. * * Closed positions earned their proportional share of all new tokens minted * during the position's lifetime (from creation to closure). * * @param totalSupplyInit - Total token supply when position was created * @param totalSupplyEnd - Total token supply when position was closed * @param positionShare - Position's proportional share (0-1) * @returns Profit in token units (not wei) */ export function calculateClosedPositionProfit(totalSupplyInit: bigint, totalSupplyEnd: bigint, positionShare: number): number { if (totalSupplyInit < 0n || totalSupplyEnd < 0n) { throw new Error('Supply values must be non-negative'); } if (positionShare < 0 || positionShare > 1) { throw new Error('Position share must be between 0 and 1'); } if (totalSupplyEnd < totalSupplyInit) { // If supply decreased during position lifetime, return 0 return 0; } // Convert to token units (assuming 18 decimals) const initSupply = Number(totalSupplyInit) / 1e18; const endSupply = Number(totalSupplyEnd) / 1e18; // Calculate new issuance during position lifetime const newIssuance = endSupply - initSupply; // Position earned its share of new issuance return newIssuance * positionShare; }