mirror of
https://github.com/benjamin-wilson/public-pool.git
synced 2026-09-29 09:05:06 -07:00
dependency updates
This commit is contained in:
Generated
+7540
-8167
File diff suppressed because it is too large
Load Diff
+42
-41
@@ -21,60 +21,61 @@
|
||||
"test:e2e": "jest --config ./test/jest-e2e.json"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nestjs/axios": "^3.0.0",
|
||||
"@nestjs/cache-manager": "^2.0.1",
|
||||
"@nestjs/common": "^9.0.0",
|
||||
"@nestjs/config": "^2.3.2",
|
||||
"@nestjs/core": "^9.0.0",
|
||||
"@nestjs/platform-fastify": "^9.4.2",
|
||||
"@nestjs/schedule": "^3.0.1",
|
||||
"@nestjs/typeorm": "^10.0.0",
|
||||
"axios": "^1.4.0",
|
||||
"bitcoin-address-validation": "^2.2.1",
|
||||
"bitcoinjs-lib": "^6.1.3",
|
||||
"bitcoinjs-message": "^2.2.0",
|
||||
"@nestjs/axios": "^4.0.1",
|
||||
"@nestjs/cache-manager": "^3.1.2",
|
||||
"@nestjs/common": "^11.1.19",
|
||||
"@nestjs/config": "^4.0.4",
|
||||
"@nestjs/core": "^11.1.19",
|
||||
"@nestjs/platform-fastify": "^11.1.19",
|
||||
"@nestjs/schedule": "^6.1.3",
|
||||
"@nestjs/typeorm": "^11.0.1",
|
||||
"axios": "^1.16.0",
|
||||
"better-sqlite3": "^12.9.0",
|
||||
"bitcoin-address-validation": "^2.2.3",
|
||||
"bitcoinjs-lib": "^6.1.7",
|
||||
"bs58": "^5.0.0",
|
||||
"cache-manager": "^5.2.3",
|
||||
"cache-manager": "^7.2.8",
|
||||
"class-transformer": "^0.5.1",
|
||||
"class-validator": "^0.14.0",
|
||||
"discord.js": "^14.11.0",
|
||||
"class-validator": "^0.14.4",
|
||||
"discord.js": "^14.26.4",
|
||||
"merkle-lib": "^2.0.10",
|
||||
"node-telegram-bot-api": "^0.61.0",
|
||||
"pg": "^8.11.3",
|
||||
"pg": "^8.20.0",
|
||||
"pg-pubsub": "^0.8.1",
|
||||
"reflect-metadata": "^0.1.13",
|
||||
"rpc-bitcoin": "^2.0.0",
|
||||
"rxjs": "^7.2.0",
|
||||
"sqlite3": "^5.1.6",
|
||||
"tiny-secp256k1": "^2.2.3",
|
||||
"typeorm": "^0.3.17",
|
||||
"reflect-metadata": "^0.2.2",
|
||||
"rxjs": "^7.8.2",
|
||||
"tiny-secp256k1": "^2.2.4",
|
||||
"typeorm": "^0.3.28",
|
||||
"zeromq": "6.0.0-beta.19"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@nestjs/cli": "^9.0.0",
|
||||
"@nestjs/schematics": "^9.0.0",
|
||||
"@nestjs/testing": "^9.0.0",
|
||||
"@nestjs/cli": "^11.0.21",
|
||||
"@nestjs/schematics": "^11.1.0",
|
||||
"@nestjs/testing": "^11.1.19",
|
||||
"@types/cron": "^2.0.1",
|
||||
"@types/express": "^4.17.13",
|
||||
"@types/jest": "29.5.1",
|
||||
"@types/node": "^18.16.12",
|
||||
"@types/node-telegram-bot-api": "^0.61.6",
|
||||
"@types/supertest": "^2.0.11",
|
||||
"@types/express": "^4.17.25",
|
||||
"@types/jest": "^29.5.14",
|
||||
"@types/node": "^18.19.130",
|
||||
"@types/supertest": "^7.2.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.0.0",
|
||||
"@typescript-eslint/parser": "^5.0.0",
|
||||
"eslint": "^8.0.1",
|
||||
"eslint-config-prettier": "^8.3.0",
|
||||
"eslint-plugin-prettier": "^4.0.0",
|
||||
"jest": "29.5.0",
|
||||
"patch-package": "8.0.0",
|
||||
"prettier": "^2.3.2",
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"eslint-plugin-prettier": "^5.5.5",
|
||||
"jest": "^29.7.0",
|
||||
"patch-package": "^8.0.1",
|
||||
"prettier": "^3.8.3",
|
||||
"source-map-support": "^0.5.20",
|
||||
"supertest": "^6.1.3",
|
||||
"ts-jest": "29.1.0",
|
||||
"ts-loader": "^9.2.3",
|
||||
"ts-node": "^10.0.0",
|
||||
"supertest": "^7.2.2",
|
||||
"ts-jest": "^29.4.9",
|
||||
"ts-loader": "^9.5.7",
|
||||
"ts-node": "^10.9.2",
|
||||
"tsconfig-paths": "4.2.0",
|
||||
"typescript": "^5.0.0"
|
||||
"typescript": "^5.9.3"
|
||||
},
|
||||
"overrides": {
|
||||
"@fastify/middie": "^9.3.2",
|
||||
"fastify": "^5.8.5",
|
||||
"path-to-regexp": "^8.4.2"
|
||||
},
|
||||
"jest": {
|
||||
"moduleFileExtensions": [
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
diff --git a/node_modules/rpc-bitcoin/build/src/rpc.d.ts b/node_modules/rpc-bitcoin/build/src/rpc.d.ts
|
||||
index d25d732..ce4eb22 100644
|
||||
--- a/node_modules/rpc-bitcoin/build/src/rpc.d.ts
|
||||
+++ b/node_modules/rpc-bitcoin/build/src/rpc.d.ts
|
||||
@@ -6,7 +6,7 @@ export declare type RPCIniOptions = RESTIniOptions & {
|
||||
fullResponse?: boolean;
|
||||
};
|
||||
export declare type JSONRPC = {
|
||||
- jsonrpc?: string | number;
|
||||
+ jsonrpc?: string;
|
||||
id?: string | number;
|
||||
method: string;
|
||||
params?: object;
|
||||
diff --git a/node_modules/rpc-bitcoin/build/src/rpc.js b/node_modules/rpc-bitcoin/build/src/rpc.js
|
||||
index 7fec7aa..3bee5fc 100644
|
||||
--- a/node_modules/rpc-bitcoin/build/src/rpc.js
|
||||
+++ b/node_modules/rpc-bitcoin/build/src/rpc.js
|
||||
@@ -12,7 +12,7 @@ class RPCClient extends rest_1.RESTClient {
|
||||
}
|
||||
async rpc(method, params = {}, wallet) {
|
||||
const uri = typeof wallet === "undefined" ? "/" : "wallet/" + wallet;
|
||||
- const body = { method, params, jsonrpc: 1.0, id: "rpc-bitcoin" };
|
||||
+ const body = { method, params, jsonrpc: "1.0", id: "rpc-bitcoin" };
|
||||
try {
|
||||
const response = await this.batch(body, uri);
|
||||
return this.fullResponse ? response : response.result;
|
||||
@@ -67,10 +67,14 @@ export class AddressSettingsService {
|
||||
// }
|
||||
|
||||
public async resetBestDifficultyAndShares() {
|
||||
return await this.addressSettingsRepository.update({}, {
|
||||
shares: 0,
|
||||
bestDifficulty: 0
|
||||
});
|
||||
return await this.addressSettingsRepository
|
||||
.createQueryBuilder()
|
||||
.update(AddressSettingsEntity)
|
||||
.set({
|
||||
shares: 0,
|
||||
bestDifficulty: 0
|
||||
})
|
||||
.execute();
|
||||
}
|
||||
|
||||
public async getHighScores() {
|
||||
|
||||
@@ -259,6 +259,6 @@ export class ClientStatisticsService {
|
||||
}
|
||||
|
||||
public async deleteAll() {
|
||||
return await this.clientStatisticsRepository.delete({})
|
||||
return await this.clientStatisticsRepository.clear()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,7 +184,10 @@ export class ClientService {
|
||||
}
|
||||
|
||||
public async deleteAll() {
|
||||
return await this.clientRepository.softDelete({})
|
||||
return await this.clientRepository
|
||||
.createQueryBuilder()
|
||||
.softDelete()
|
||||
.execute();
|
||||
}
|
||||
|
||||
// public async getUserAgents() {
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import { Controller, Patch } from '@nestjs/common';
|
||||
import * as bitcoinMessage from 'bitcoinjs-message';
|
||||
|
||||
|
||||
@Controller('address')
|
||||
@@ -7,16 +6,6 @@ export class AddressController {
|
||||
|
||||
@Patch('settings')
|
||||
async settings() {
|
||||
|
||||
const publicKey = '...'; // Public key corresponding to the private key used for signing
|
||||
const message = '...'; // The message that was signed
|
||||
const signature = '...'; // The signature of the message
|
||||
|
||||
const isValid: boolean = bitcoinMessage.verify(message, publicKey, signature);
|
||||
if (isValid) {
|
||||
console.log('Signature is valid!');
|
||||
} else {
|
||||
console.log('Signature is not valid!');
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ describe('ClientController', () => {
|
||||
const module: TestingModule = await Test.createTestingModule({
|
||||
imports: [
|
||||
TypeOrmModule.forRoot({
|
||||
type: 'sqlite',
|
||||
type: 'better-sqlite3',
|
||||
database: ':memory:',
|
||||
synchronize: true,
|
||||
autoLoadEntities: true,
|
||||
|
||||
@@ -66,7 +66,7 @@ describe('StratumV1Client', () => {
|
||||
moduleRef = await Test.createTestingModule({
|
||||
imports: [
|
||||
TypeOrmModule.forRoot({
|
||||
type: 'sqlite',
|
||||
type: 'better-sqlite3',
|
||||
database: ':memory:',
|
||||
synchronize: true,
|
||||
autoLoadEntities: true,
|
||||
@@ -112,9 +112,9 @@ describe('StratumV1Client', () => {
|
||||
|
||||
const dataSource = moduleRef.get<DataSource>(DataSource);
|
||||
|
||||
await dataSource.getRepository(ClientStatisticsEntity).delete({});
|
||||
await dataSource.getRepository(ClientEntity).delete({});
|
||||
await dataSource.getRepository(BlocksEntity).delete({});
|
||||
await dataSource.getRepository(ClientStatisticsEntity).clear();
|
||||
await dataSource.getRepository(ClientEntity).clear();
|
||||
await dataSource.getRepository(BlocksEntity).clear();
|
||||
|
||||
|
||||
clientStatisticsService = moduleRef.get<ClientStatisticsService>(ClientStatisticsService);
|
||||
|
||||
@@ -53,7 +53,7 @@ export class StratumV1Client {
|
||||
private clientAuthorization: AuthorizationMessage;
|
||||
private clientSuggestedDifficulty: SuggestDifficulty;
|
||||
private stratumSubscription: Subscription;
|
||||
private backgroundWork: NodeJS.Timer[] = [];
|
||||
private backgroundWork: NodeJS.Timeout[] = [];
|
||||
|
||||
private statistics: StratumV1ClientStatistics;
|
||||
private stratumInitialized = false;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Injectable, OnModuleInit } from '@nestjs/common';
|
||||
import { ConfigService } from '@nestjs/config';
|
||||
import { RPCClient } from 'rpc-bitcoin';
|
||||
import axios, { AxiosInstance } from 'axios';
|
||||
import { asyncScheduler, BehaviorSubject, delay, filter, from, interval, scheduled, shareReplay, startWith, Subject, switchMap } from 'rxjs';
|
||||
import { RpcBlockService } from '../ORM/rpc-block/rpc-block.service';
|
||||
import * as zmq from 'zeromq';
|
||||
@@ -14,10 +14,11 @@ import * as fs from 'node:fs';
|
||||
export class BitcoinRpcService implements OnModuleInit {
|
||||
|
||||
|
||||
private client: RPCClient;
|
||||
private client: AxiosInstance;
|
||||
private _newBlockTemplate$: BehaviorSubject<IBlockTemplate> = new BehaviorSubject(undefined);
|
||||
private pubsubInstance: PGPubsub;
|
||||
private resetTemplateInterval$ = new Subject<void>();
|
||||
private rpcRequestId = 0;
|
||||
|
||||
public miningInfo: IMiningInfo;
|
||||
public newBlockTemplate$ = this._newBlockTemplate$.pipe(filter(block => block != null), shareReplay({ refCount: true, bufferSize: 1 }));
|
||||
@@ -47,9 +48,17 @@ export class BitcoinRpcService implements OnModuleInit {
|
||||
pass = cookiePass;
|
||||
}
|
||||
|
||||
this.client = new RPCClient({ url, port, timeout, user, pass });
|
||||
const baseURL = this.buildRpcUrl(url, port);
|
||||
this.client = axios.create({
|
||||
baseURL,
|
||||
timeout,
|
||||
auth: {
|
||||
username: user,
|
||||
password: pass
|
||||
}
|
||||
});
|
||||
|
||||
this.client.getrpcinfo().then((res) => {
|
||||
this.callRpc('getrpcinfo').then((res) => {
|
||||
console.log('Bitcoin RPC connected');
|
||||
}, () => {
|
||||
console.error('Could not reach RPC host');
|
||||
@@ -117,13 +126,13 @@ export class BitcoinRpcService implements OnModuleInit {
|
||||
|
||||
let blockTemplate: IBlockTemplate;
|
||||
while (blockTemplate == null) {
|
||||
blockTemplate = await this.client.getblocktemplate({
|
||||
template_request: {
|
||||
blockTemplate = await this.callRpc<IBlockTemplate>('getblocktemplate', [
|
||||
{
|
||||
rules: ['segwit'],
|
||||
mode: 'template',
|
||||
capabilities: ['serverlist', 'proposal']
|
||||
}
|
||||
});
|
||||
]);
|
||||
}
|
||||
|
||||
try {
|
||||
@@ -139,7 +148,7 @@ export class BitcoinRpcService implements OnModuleInit {
|
||||
|
||||
public async getMiningInfo(): Promise<IMiningInfo> {
|
||||
try {
|
||||
return await this.client.getmininginfo();
|
||||
return await this.callRpc<IMiningInfo>('getmininginfo');
|
||||
} catch (e) {
|
||||
console.error('Error getmininginfo', e.message);
|
||||
return null;
|
||||
@@ -150,9 +159,7 @@ export class BitcoinRpcService implements OnModuleInit {
|
||||
public async SUBMIT_BLOCK(hexdata: string): Promise<string> {
|
||||
let response: string = 'unknown';
|
||||
try {
|
||||
response = await this.client.submitblock({
|
||||
hexdata
|
||||
});
|
||||
response = await this.callRpc<string>('submitblock', [hexdata]);
|
||||
if (response == null) {
|
||||
response = 'SUCCESS!';
|
||||
}
|
||||
@@ -166,4 +173,28 @@ export class BitcoinRpcService implements OnModuleInit {
|
||||
return response;
|
||||
|
||||
}
|
||||
|
||||
private async callRpc<T>(method: string, params: unknown[] = []): Promise<T> {
|
||||
const response = await this.client.post('', {
|
||||
jsonrpc: '1.0',
|
||||
id: ++this.rpcRequestId,
|
||||
method,
|
||||
params
|
||||
});
|
||||
|
||||
if (response.data.error != null) {
|
||||
throw response.data.error;
|
||||
}
|
||||
|
||||
return response.data.result;
|
||||
}
|
||||
|
||||
private buildRpcUrl(url: string, port: number): string {
|
||||
const normalizedUrl = /^https?:\/\//i.test(url) ? url : `http://${url}`;
|
||||
const rpcUrl = new URL(normalizedUrl);
|
||||
if (Number.isFinite(port) && port > 0) {
|
||||
rpcUrl.port = port.toString();
|
||||
}
|
||||
return rpcUrl.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { Injectable, OnModuleInit } from '@nestjs/common';
|
||||
import { ConfigService } from '@nestjs/config';
|
||||
import axios, { AxiosInstance } from 'axios';
|
||||
import { validate } from 'bitcoin-address-validation';
|
||||
import { Block } from 'bitcoinjs-lib';
|
||||
import * as TelegramBot from 'node-telegram-bot-api';
|
||||
|
||||
import { TelegramSubscriptionsService } from '../ORM/telegram-subscriptions/telegram-subscriptions.service';
|
||||
|
||||
@@ -10,7 +10,9 @@ import { TelegramSubscriptionsService } from '../ORM/telegram-subscriptions/tele
|
||||
@Injectable()
|
||||
export class TelegramService implements OnModuleInit {
|
||||
|
||||
private bot: TelegramBot;
|
||||
private bot: AxiosInstance;
|
||||
private updateOffset = 0;
|
||||
private pollingTimer: NodeJS.Timeout;
|
||||
|
||||
constructor(
|
||||
private readonly configService: ConfigService,
|
||||
@@ -20,7 +22,10 @@ export class TelegramService implements OnModuleInit {
|
||||
if (token == null || token.length < 1) {
|
||||
return;
|
||||
}
|
||||
this.bot = new TelegramBot(token, { polling: true });
|
||||
this.bot = axios.create({
|
||||
baseURL: `https://api.telegram.org/bot${token}/`,
|
||||
timeout: 10000
|
||||
});
|
||||
console.log('Telegram bot init');
|
||||
|
||||
|
||||
@@ -32,23 +37,10 @@ export class TelegramService implements OnModuleInit {
|
||||
return;
|
||||
}
|
||||
|
||||
this.bot.onText(/\/subscribe/, async (msg) => {
|
||||
const address = msg.text.split('/subscribe ')[1];
|
||||
if (validate(address) == false) {
|
||||
this.bot.sendMessage(msg.chat.id, "Invalid address.");
|
||||
return;
|
||||
}
|
||||
await this.telegramSubscriptionsService.saveSubscription(msg.chat.id, address);
|
||||
this.bot.sendMessage(msg.chat.id, "Subscribed!");
|
||||
});
|
||||
|
||||
this.bot.onText(/\/start/, (msg) => {
|
||||
this.bot.sendMessage(msg.chat.id, "Welcome to the public-pool bot. /subscribe <address> to get notified.");
|
||||
});
|
||||
|
||||
this.bot.on('message', (msg) => {
|
||||
console.log(msg);
|
||||
});
|
||||
await this.pollUpdates();
|
||||
this.pollingTimer = setInterval(async () => {
|
||||
await this.pollUpdates();
|
||||
}, 2000);
|
||||
}
|
||||
|
||||
public async notifySubscribersBlockFound(address: string, height: number, block: Block, message: string) {
|
||||
@@ -57,8 +49,57 @@ export class TelegramService implements OnModuleInit {
|
||||
}
|
||||
|
||||
const subscribers = await this.telegramSubscriptionsService.getSubscriptions(address);
|
||||
subscribers.forEach(subscriber => {
|
||||
this.bot.sendMessage(subscriber.telegramChatId, `Block Found! Result: ${message}, Height: ${height}`);
|
||||
await Promise.all(subscribers.map(subscriber => {
|
||||
return this.sendMessage(subscriber.telegramChatId, `Block Found! Result: ${message}, Height: ${height}`);
|
||||
}));
|
||||
}
|
||||
|
||||
private async pollUpdates() {
|
||||
try {
|
||||
const response = await this.bot.get('getUpdates', {
|
||||
params: {
|
||||
offset: this.updateOffset,
|
||||
timeout: 0
|
||||
}
|
||||
});
|
||||
|
||||
for (const update of response.data.result ?? []) {
|
||||
this.updateOffset = update.update_id + 1;
|
||||
await this.handleMessage(update.message);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Telegram polling failed', e.message);
|
||||
}
|
||||
}
|
||||
|
||||
private async handleMessage(msg: any) {
|
||||
if (msg?.text == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (msg.text.startsWith('/subscribe')) {
|
||||
const address = msg.text.split('/subscribe ')[1];
|
||||
if (validate(address) == false) {
|
||||
await this.sendMessage(msg.chat.id, 'Invalid address.');
|
||||
return;
|
||||
}
|
||||
await this.telegramSubscriptionsService.saveSubscription(msg.chat.id, address);
|
||||
await this.sendMessage(msg.chat.id, 'Subscribed!');
|
||||
return;
|
||||
}
|
||||
|
||||
if (msg.text.startsWith('/start')) {
|
||||
await this.sendMessage(msg.chat.id, 'Welcome to the public-pool bot. /subscribe <address> to get notified.');
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(msg);
|
||||
}
|
||||
|
||||
private async sendMessage(chatId: number | string, text: string) {
|
||||
await this.bot.post('sendMessage', {
|
||||
chat_id: chatId,
|
||||
text
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user