update postgresql branch

This commit is contained in:
Ben
2026-05-07 23:45:07 -04:00
parent cc0ca3979e
commit 327be48ade
23 changed files with 8817 additions and 8406 deletions
@@ -0,0 +1,40 @@
import { plainToInstance } from 'class-transformer';
import { AuthorizationMessage } from './AuthorizationMessage';
describe('AuthorizationMessage', () => {
it('should parse address, worker, and starting difficulty', () => {
const message = plainToInstance(
AuthorizationMessage,
JSON.parse('{"id":3,"method":"mining.authorize","params":["tb1qumezefzdeqqwn5zfvgdrhxjzc5ylr39uhuxcz4.worker1","x,d=2048"]}')
);
expect(message.address).toBe('tb1qumezefzdeqqwn5zfvgdrhxjzc5ylr39uhuxcz4');
expect(message.worker).toBe('worker1');
expect(message.password).toBe('x,d=2048');
expect(message.startingDiff).toBe(2048);
});
it('should default worker name when one is not provided', () => {
const message = plainToInstance(
AuthorizationMessage,
JSON.parse('{"id":3,"method":"mining.authorize","params":["tb1qumezefzdeqqwn5zfvgdrhxjzc5ylr39uhuxcz4","x"]}')
);
expect(message.worker).toBe('worker');
expect(message.startingDiff).toBeNull();
});
it('should build successful authorization responses', () => {
const message = plainToInstance(
AuthorizationMessage,
JSON.parse('{"id":3,"method":"mining.authorize","params":["tb1qumezefzdeqqwn5zfvgdrhxjzc5ylr39uhuxcz4.worker1","x"]}')
);
expect(message.response()).toEqual({
id: 3,
error: null,
result: true
});
});
});
@@ -1,4 +1,5 @@
import { plainToInstance } from 'class-transformer';
import { validate } from 'class-validator';
import { MiningSubmitMessage } from './MiningSubmitMessage';
@@ -29,6 +30,34 @@ describe('MiningSubmitMessage', () => {
expect(message.nonce).toEqual('2402812d');
expect(message.versionMask).toEqual('00006000');
});
it('should validate 8-byte extranonce2 submissions', async () => {
const errors = await validate(message);
expect(errors).toEqual([]);
});
it('should reject short extranonce2 submissions', async () => {
const shortMessage = plainToInstance(
MiningSubmitMessage,
JSON.parse(' {"id": 5, "method": "mining.submit", "params": ["tb1qumezefzdeqqwn5zfvgdrhxjzc5ylr39uhuxcz4.bitaxe3", "1", "99020000", "64b1f10f", "2402812d", "00006000"]}'),
);
const errors = await validate(shortMessage);
expect(errors.some(error => error.property === 'extraNonce2')).toBe(true);
});
it('should reject long extranonce2 submissions', async () => {
const longMessage = plainToInstance(
MiningSubmitMessage,
JSON.parse(' {"id": 5, "method": "mining.submit", "params": ["tb1qumezefzdeqqwn5zfvgdrhxjzc5ylr39uhuxcz4.bitaxe3", "1", "990200000000000000", "64b1f10f", "2402812d", "00006000"]}'),
);
const errors = await validate(longMessage);
expect(errors.some(error => error.property === 'extraNonce2')).toBe(true);
});
});
@@ -0,0 +1,45 @@
import { plainToInstance } from 'class-transformer';
import { SubscriptionMessage } from './SubscriptionMessage';
describe('SubscriptionMessage', () => {
it('should parse and refine known user agents', () => {
const bosminer = plainToInstance(
SubscriptionMessage,
JSON.parse('{"id":1,"method":"mining.subscribe","params":["bosminer/23.08"]}')
);
const cpuminer = plainToInstance(
SubscriptionMessage,
JSON.parse('{"id":1,"method":"mining.subscribe","params":["cpuminer-opt/1.0"]}')
);
expect(bosminer.userAgent).toBe('Braiins OS');
expect(cpuminer.userAgent).toBe('cpuminer');
});
it('should default missing user agents to unknown', () => {
const message = plainToInstance(
SubscriptionMessage,
JSON.parse('{"id":1,"method":"mining.subscribe","params":[]}')
);
expect(message.userAgent).toBe('unknown');
});
it('should respond with extranonce2 size of 8 bytes', () => {
const message = plainToInstance(
SubscriptionMessage,
JSON.parse('{"id":1,"method":"mining.subscribe","params":["bitaxe v2.2"]}')
);
expect(message.response('57a6f098')).toEqual({
id: 1,
error: null,
result: [
[['mining.notify', '57a6f098']],
'57a6f098',
8
]
});
});
});