From 626f2ea4f07847d4fc84f058db064acf32770e27 Mon Sep 17 00:00:00 2001 From: nobswebdev Date: Mon, 7 Sep 2026 01:35:57 +0200 Subject: [PATCH] add bitcoin withdraw max fee validation config --- .env.example | 2 ++ backend/src/config/index.ts | 3 ++- backend/src/config/validate.ts | 6 ++++++ .../modules/bitcoinWallet/dto/BitcoinWalletWithdrawDto.ts | 7 ++++++- backend/src/types/Config.ts | 1 + cms/src/config/index.ts | 3 ++- cms/src/vite-env.d.ts | 1 + docker-compose.prod.yml | 1 + nginx/Dockerfile.prod | 2 ++ 9 files changed, 23 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index 4d6887d..972d3f9 100644 --- a/.env.example +++ b/.env.example @@ -53,6 +53,7 @@ VALIDATION_DIGITAL_STOCK_ATTACHMENTS_MAX=5 VALIDATION_SHIPPING_NOTE_MIN_LENGTH=20 VALIDATION_SHIPPING_NOTE_MAX_LENGTH=4000 VALIDATION_ORDER_MESSAGE_MAX_LENGTH=2000 +VALIDATION_BITCOIN_WITHDRAW_MAX_FEE_RATE_SAT_VBYTE=500 SIGNED_COOKIE_JWT_SECRET=change-me-in-production @@ -146,4 +147,5 @@ VITE_VALIDATION_DIGITAL_STOCK_ATTACHMENTS_MAX=5 VITE_VALIDATION_SHIPPING_NOTE_MIN_LENGTH=20 VITE_VALIDATION_SHIPPING_NOTE_MAX_LENGTH=4000 VITE_VALIDATION_ORDER_MESSAGE_MAX_LENGTH=2000 +VITE_VALIDATION_BITCOIN_WITHDRAW_MAX_FEE_RATE_SAT_VBYTE=500 VITE_ORDERS_DETAIL_POLL_INTERVAL_MS=5000 diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index d1bbc0c..ae81352 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -103,7 +103,8 @@ export const getAppConfig = (): AppConfig => { digitalStockAttachmentsMax: envInt('VALIDATION_DIGITAL_STOCK_ATTACHMENTS_MAX'), shippingNoteMinLength: envInt('VALIDATION_SHIPPING_NOTE_MIN_LENGTH'), shippingNoteMaxLength: envInt('VALIDATION_SHIPPING_NOTE_MAX_LENGTH'), - orderMessageMaxLength: envInt('VALIDATION_ORDER_MESSAGE_MAX_LENGTH') + orderMessageMaxLength: envInt('VALIDATION_ORDER_MESSAGE_MAX_LENGTH'), + bitcoinWithdrawMaxFeeRateSatVbyte: envInt('VALIDATION_BITCOIN_WITHDRAW_MAX_FEE_RATE_SAT_VBYTE') } }; }; diff --git a/backend/src/config/validate.ts b/backend/src/config/validate.ts index ee06c0c..87ae559 100644 --- a/backend/src/config/validate.ts +++ b/backend/src/config/validate.ts @@ -153,6 +153,12 @@ class EnvironmentVariables { @Max(10000) VALIDATION_ORDER_MESSAGE_MAX_LENGTH: number; + @IsNotEmpty() + @IsNumber() + @Min(1) + @Max(1000) + VALIDATION_BITCOIN_WITHDRAW_MAX_FEE_RATE_SAT_VBYTE: number; + @IsNotEmpty() @IsNumber() @Min(4) diff --git a/backend/src/modules/bitcoinWallet/dto/BitcoinWalletWithdrawDto.ts b/backend/src/modules/bitcoinWallet/dto/BitcoinWalletWithdrawDto.ts index 1ed6136..a7cbc89 100644 --- a/backend/src/modules/bitcoinWallet/dto/BitcoinWalletWithdrawDto.ts +++ b/backend/src/modules/bitcoinWallet/dto/BitcoinWalletWithdrawDto.ts @@ -1,7 +1,12 @@ import { Transform } from 'class-transformer'; import { IsInt, IsNotEmpty, IsString, Max, Min } from 'class-validator'; +import { getAppConfig } from '../../../config'; import { IsBitcoinAddress } from '../../../validation/decorators/isBitcoinAddress'; +const { + validation: { bitcoinWithdrawMaxFeeRateSatVbyte } +} = getAppConfig(); + export class BitcoinWalletWithdrawDto { @Transform(({ value }: { value: unknown }) => (typeof value === 'string' ? value.trim() : value)) @IsString() @@ -11,7 +16,7 @@ export class BitcoinWalletWithdrawDto { @IsInt() @Min(1) - @Max(100) + @Max(bitcoinWithdrawMaxFeeRateSatVbyte) feeRateSatVbyte: number; @IsString() diff --git a/backend/src/types/Config.ts b/backend/src/types/Config.ts index 485891c..b63259b 100644 --- a/backend/src/types/Config.ts +++ b/backend/src/types/Config.ts @@ -49,6 +49,7 @@ export interface AppConfig { shippingNoteMinLength: number; shippingNoteMaxLength: number; orderMessageMaxLength: number; + bitcoinWithdrawMaxFeeRateSatVbyte: number; }; } diff --git a/cms/src/config/index.ts b/cms/src/config/index.ts index 12e7788..619db67 100644 --- a/cms/src/config/index.ts +++ b/cms/src/config/index.ts @@ -42,7 +42,8 @@ export const config = { digitalStockAttachmentsMax: parseInt(env('VITE_VALIDATION_DIGITAL_STOCK_ATTACHMENTS_MAX'), 10), shippingNoteMinLength: parseInt(env('VITE_VALIDATION_SHIPPING_NOTE_MIN_LENGTH'), 10), shippingNoteMaxLength: parseInt(env('VITE_VALIDATION_SHIPPING_NOTE_MAX_LENGTH'), 10), - orderMessageMaxLength: parseInt(env('VITE_VALIDATION_ORDER_MESSAGE_MAX_LENGTH'), 10) + orderMessageMaxLength: parseInt(env('VITE_VALIDATION_ORDER_MESSAGE_MAX_LENGTH'), 10), + bitcoinWithdrawMaxFeeRateSatVbyte: parseInt(env('VITE_VALIDATION_BITCOIN_WITHDRAW_MAX_FEE_RATE_SAT_VBYTE'), 10) }, orders: { diff --git a/cms/src/vite-env.d.ts b/cms/src/vite-env.d.ts index e1552b8..a9827d8 100644 --- a/cms/src/vite-env.d.ts +++ b/cms/src/vite-env.d.ts @@ -29,6 +29,7 @@ interface ImportMetaEnv { readonly VITE_VALIDATION_SHIPPING_NOTE_MIN_LENGTH?: string; readonly VITE_VALIDATION_SHIPPING_NOTE_MAX_LENGTH?: string; readonly VITE_VALIDATION_ORDER_MESSAGE_MAX_LENGTH?: string; + readonly VITE_VALIDATION_BITCOIN_WITHDRAW_MAX_FEE_RATE_SAT_VBYTE?: string; readonly VITE_SHOP_FIAT_CURRENCY?: string; } diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index c549a5a..620bf65 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -140,6 +140,7 @@ services: VITE_VALIDATION_SHIPPING_NOTE_MIN_LENGTH: ${VITE_VALIDATION_SHIPPING_NOTE_MIN_LENGTH} VITE_VALIDATION_SHIPPING_NOTE_MAX_LENGTH: ${VITE_VALIDATION_SHIPPING_NOTE_MAX_LENGTH} VITE_VALIDATION_ORDER_MESSAGE_MAX_LENGTH: ${VITE_VALIDATION_ORDER_MESSAGE_MAX_LENGTH} + VITE_VALIDATION_BITCOIN_WITHDRAW_MAX_FEE_RATE_SAT_VBYTE: ${VITE_VALIDATION_BITCOIN_WITHDRAW_MAX_FEE_RATE_SAT_VBYTE} VITE_ORDERS_DETAIL_POLL_INTERVAL_MS: ${VITE_ORDERS_DETAIL_POLL_INTERVAL_MS} container_name: ${COMPOSE_PROJECT_NAME}_nginx restart: unless-stopped diff --git a/nginx/Dockerfile.prod b/nginx/Dockerfile.prod index cdae92e..518cd06 100644 --- a/nginx/Dockerfile.prod +++ b/nginx/Dockerfile.prod @@ -25,6 +25,7 @@ ARG VITE_VALIDATION_DIGITAL_STOCK_ATTACHMENTS_MAX ARG VITE_VALIDATION_SHIPPING_NOTE_MIN_LENGTH ARG VITE_VALIDATION_SHIPPING_NOTE_MAX_LENGTH ARG VITE_VALIDATION_ORDER_MESSAGE_MAX_LENGTH +ARG VITE_VALIDATION_BITCOIN_WITHDRAW_MAX_FEE_RATE_SAT_VBYTE ARG VITE_ORDERS_DETAIL_POLL_INTERVAL_MS ENV VITE_API_BASE_URL=$VITE_API_BASE_URL \ @@ -45,6 +46,7 @@ ENV VITE_API_BASE_URL=$VITE_API_BASE_URL \ VITE_VALIDATION_SHIPPING_NOTE_MIN_LENGTH=$VITE_VALIDATION_SHIPPING_NOTE_MIN_LENGTH \ VITE_VALIDATION_SHIPPING_NOTE_MAX_LENGTH=$VITE_VALIDATION_SHIPPING_NOTE_MAX_LENGTH \ VITE_VALIDATION_ORDER_MESSAGE_MAX_LENGTH=$VITE_VALIDATION_ORDER_MESSAGE_MAX_LENGTH \ + VITE_VALIDATION_BITCOIN_WITHDRAW_MAX_FEE_RATE_SAT_VBYTE=$VITE_VALIDATION_BITCOIN_WITHDRAW_MAX_FEE_RATE_SAT_VBYTE \ VITE_ORDERS_DETAIL_POLL_INTERVAL_MS=$VITE_ORDERS_DETAIL_POLL_INTERVAL_MS RUN npm run build