sbv2-solana/javascript/solana.js/test/priority-fees.spec.ts

86 lines
3.0 KiB
TypeScript

/* eslint-disable no-unused-vars */
import "mocha";
import { AggregatorAccount, types } from "../src/index.js";
import { BN } from "@switchboard-xyz/common";
import assert from "assert";
describe("Priority Fees Tests", () => {
const defaultState = AggregatorAccount.default();
const startingTimestamp = 100;
const basePriorityFee = 1000; // always bump fee by 1000 lamports
const priorityFeeBump = 500; // bump fee by 500 lamports for every period the feed is stale
const priorityFeeBumpPeriod = 30; // bump fee by priorityFeeBump every 30s
const maxPriorityFeeMultiplier = 10; // the max fee multiplier is 10 * 500 lamports
const aggregatorFields: types.AggregatorAccountDataFields = {
...defaultState,
basePriorityFee: basePriorityFee,
priorityFeeBump: priorityFeeBump,
priorityFeeBumpPeriod: priorityFeeBumpPeriod,
maxPriorityFeeMultiplier: maxPriorityFeeMultiplier,
latestConfirmedRound: {
...defaultState.latestConfirmedRound,
roundOpenTimestamp: new BN(startingTimestamp),
},
};
const aggregator = new types.AggregatorAccountData(aggregatorFields);
it("Calculates the priority fee with no staleness", async () => {
// no staleness
const noStalenessFee = AggregatorAccount.calculatePriorityFee(
aggregator,
startingTimestamp
);
const expectedNoStalenessFee = Math.round(basePriorityFee);
assert(
expectedNoStalenessFee === noStalenessFee,
`priorityFee mismatch with no staleness, expected ${expectedNoStalenessFee}, received ${noStalenessFee}`
);
});
it("Calculates the priority fee with staleness multiplier", async () => {
// with staleness
const multipliers = [0.5, 1, 1.33333, 1.8323232, 2, 5, 10];
for (const multiplier of multipliers) {
const priorityFee = AggregatorAccount.calculatePriorityFee(
aggregator,
startingTimestamp + multiplier * priorityFeeBumpPeriod
);
const expectedPriorityFee = Math.round(
basePriorityFee + multiplier * priorityFeeBump
);
assert(
expectedPriorityFee === priorityFee,
`priorityFee mismatch for multiplier ${multiplier}, expected ${expectedPriorityFee}, received ${priorityFee}`
);
}
});
it("Calculates the priority fee with max multiplier", async () => {
// with max multiplier
const expectedPriorityFee = Math.round(
basePriorityFee + maxPriorityFeeMultiplier * priorityFeeBump
); // should never exceed this
const multipliers = [
maxPriorityFeeMultiplier + 1,
maxPriorityFeeMultiplier * 2,
maxPriorityFeeMultiplier * 10,
];
for (const multiplier of multipliers) {
const priorityFee = AggregatorAccount.calculatePriorityFee(
aggregator,
startingTimestamp + multiplier * priorityFeeBumpPeriod
);
assert(
expectedPriorityFee === priorityFee,
`priorityFee mismatch for max multiplier, expected ${expectedPriorityFee}, received ${priorityFee}`
);
}
});
});