Firstly, a server-side secret is hashed to provide H1. H1 is fed into the same hash function to provide H2. This goes on until H1000. The hashes are fed into the roll function in reverse order (H1000 first). After the round is done, the hash that was used that round is published. This means that the hash of the current round's seed is the previous round's seed. This makes it impossible to reverse but easy to audit fairness.

Below is the code of the crash roll function:
const INSTANT_CRASH_PERCENTAGE = 6.66;
function rollCrash(seed) {
	const hash = crypto.createHmac('sha256', seed).digest('hex');
	const h = parseInt(hash.slice(0, 52 / 4), 16);
	const e = Math.pow(2, 52);
	const result = (100 * e - h) / (e - h);
	const houseEdgeModifier = 1 - INSTANT_CRASH_PERCENTAGE / 100;
	const endResult = Math.max(100, result * houseEdgeModifier);
	return Math.floor(endResult) / 100;
}