Home Reference Source Test

test/specs/generic/Policy.spec.js

describe('Policy', () => {
    it('correctly calculates the block reward and supply', () => {
        let currentSupply = Policy.INITIAL_SUPPLY;

        for (let block = 1; block < 1000; ++block) {
            const remaining = Policy.TOTAL_SUPPLY - currentSupply;
            const remainder = remaining % Policy.EMISSION_SPEED;
            let reward = (remaining-remainder) / Policy.EMISSION_SPEED;
            if (block >= Policy.EMISSION_TAIL_START && remaining >= Policy.EMISSION_TAIL_REWARD) {
                reward = Policy.EMISSION_TAIL_REWARD;
            }

            expect(Policy._blockRewardAt(currentSupply, block)).toBe(reward, 'Wrong reward.');
            expect(Policy._supplyAfter(Policy.INITIAL_SUPPLY, block-1)).toBe(currentSupply, 'Wrong supply.');
            currentSupply += reward;
        }
    });

    it('correctly computes initial supply', () => {
        expect(Policy._supplyAfter(Policy.INITIAL_SUPPLY, -1)).toBe(Policy.INITIAL_SUPPLY, 'Wrong supply.');
        expect(Policy._supplyAfter(Policy.INITIAL_SUPPLY, 0)).toBe(Policy.INITIAL_SUPPLY, 'Wrong supply.');
    });

    it('reaches total supply after ~100 years', () => {
        // FIXME: replace initialSupply by Policy.INITIAL_SUPPLY for main net
        const initialSupply = 252e12;

        // Should reach 21mio NIM at block 52888984.
        const block = 101*365*24*60*60 / Policy.BLOCK_TIME; // 101 years
        const supply = Policy._supplyAfter(initialSupply, block-1);
        expect(supply).toBe(Policy.TOTAL_SUPPLY, 'Wrong supply.');
        expect(Policy._blockRewardAt(supply, block)).toBe(0, 'Wrong reward.');
    });

    it('correctly switches to tail emission', () => {
        // FIXME: replace initialSupply by Policy.INITIAL_SUPPLY for main net
        const initialSupply = 252e12;

        // Should reach 21mio NIM at block 52888984.
        const block = Policy.EMISSION_TAIL_START;
        const supply = Policy._supplyAfter(initialSupply, block-2);
        const previousReward = Policy._blockRewardAt(supply, block-1);
        expect(previousReward > Policy.EMISSION_TAIL_REWARD).toBe(true, 'Wrong reward before starting block.');
        expect(Policy._blockRewardAt(supply + previousReward, block)).toBe(Policy.EMISSION_TAIL_REWARD, 'Wrong reward at starting block.');
    });

    it('correctly calculates supply', () => {
        expect(Policy.supplyAfter(-1)).toBe(Policy.INITIAL_SUPPLY, 'Wrong initial supply (block -1).');
        expect(Policy.supplyAfter(0)).toBe(Policy.INITIAL_SUPPLY, 'Wrong initial supply (block 0).');
        expect(Policy.supplyAfter(1)).toBe(Policy.INITIAL_SUPPLY + Policy.blockRewardAt(1), 'Wrong initial supply (block 1).');

        for (let block = 0; block < Policy._supplyCacheInterval * 10; block += Policy._supplyCacheInterval) {
            expect(Policy.supplyAfter(block-1)).toBe(Policy._supplyAfter(Policy.INITIAL_SUPPLY, block-1), `Wrong supply for block ${block-1}.`);
            expect(Policy.supplyAfter(block)).toBe(Policy._supplyAfter(Policy.INITIAL_SUPPLY, block), `Wrong supply for block ${block}.`);
            expect(Policy.supplyAfter(block+1)).toBe(Policy._supplyAfter(Policy.INITIAL_SUPPLY, block+1), `Wrong supply for block ${block+1}.`);
        }
    });
});