diff --git a/backend/src/__tests__/api/difficulty-adjustment.test.ts b/backend/src/__tests__/api/difficulty-adjustment.test.ts index 5ef1936e0..da1ac0d2c 100644 --- a/backend/src/__tests__/api/difficulty-adjustment.test.ts +++ b/backend/src/__tests__/api/difficulty-adjustment.test.ts @@ -14,11 +14,11 @@ describe('Mempool Difficulty Adjustment', () => { 750134, // Current block height 0.6280047707459726, // Previous retarget % (Passed through) 'mainnet', // Network (if testnet, next value is non-zero) - 0, // If not testnet, not used + 0, // Latest block timestamp in seconds (only used if difficulty already locked in) ], { // Expected Result progressPercent: 9.027777777777777, - difficultyChange: 12.562233927411782, + difficultyChange: 13.180707740199772, estimatedRetargetDate: 1661895424692, remainingBlocks: 1834, remainingTime: 977591692, @@ -41,7 +41,7 @@ describe('Mempool Difficulty Adjustment', () => { ], { // Expected Result is same other than timeOffset progressPercent: 9.027777777777777, - difficultyChange: 12.562233927411782, + difficultyChange: 13.180707740199772, estimatedRetargetDate: 1661895424692, remainingBlocks: 1834, remainingTime: 977591692, @@ -54,6 +54,29 @@ describe('Mempool Difficulty Adjustment', () => { expectedBlocks: 161.68833333333333, }, ], + [ // Vector 3 (mainnet lock-in (epoch ending 788255)) + [ // Inputs + dt('2023-04-20T09:57:33.000Z'), // Last DA time (in seconds) + dt('2023-05-04T14:54:09.000Z'), // Current time (now) (in seconds) + 788255, // Current block height + 1.7220298879531821, // Previous retarget % (Passed through) + 'mainnet', // Network (if testnet, next value is non-zero) + dt('2023-05-04T14:54:26.000Z'), // Latest block timestamp in seconds + ], + { // Expected Result + progressPercent: 99.95039682539682, + difficultyChange: -1.4512637555574193, + estimatedRetargetDate: 1683212658129, + remainingBlocks: 1, + remainingTime: 609129, + previousRetarget: 1.7220298879531821, + previousTime: 1681984653, + nextRetargetHeight: 788256, + timeAvg: 609129, + timeOffset: 0, + expectedBlocks: 2045.66, + }, + ], ] as [[number, number, number, number, string, number], DifficultyAdjustment][]; for (const vector of vectors) { diff --git a/backend/src/api/difficulty-adjustment.ts b/backend/src/api/difficulty-adjustment.ts index 3e953e4c8..1f37d8be9 100644 --- a/backend/src/api/difficulty-adjustment.ts +++ b/backend/src/api/difficulty-adjustment.ts @@ -34,11 +34,12 @@ export function calcDifficultyAdjustment( const remainingBlocks = EPOCH_BLOCK_LENGTH - blocksInEpoch; const nextRetargetHeight = (blockHeight >= 0) ? blockHeight + remainingBlocks : 0; const expectedBlocks = diffSeconds / BLOCK_SECONDS_TARGET; + const actualTimespan = (blocksInEpoch === 2015 ? latestBlockTimestamp : nowSeconds) - DATime; let difficultyChange = 0; let timeAvgSecs = blocksInEpoch ? diffSeconds / blocksInEpoch : BLOCK_SECONDS_TARGET; - difficultyChange = (BLOCK_SECONDS_TARGET / timeAvgSecs - 1) * 100; + difficultyChange = (BLOCK_SECONDS_TARGET / (actualTimespan / (blocksInEpoch + 1)) - 1) * 100; // Max increase is x4 (+300%) if (difficultyChange > 300) { difficultyChange = 300;