diff --git a/src/index.ts b/src/index.ts index 034d736..e0eaf7e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,7 @@ import { Elysia, t } from 'elysia'; import config from './config'; import serverConfig from './config-server'; import { databaseService } from './database-service'; -import { createInvoiceForSparkAddress, initializeSparkWallet } from './spark-service'; +import { createInvoiceForSparkAddress, initializeSparkWallet, isSparkAddress } from './spark-service'; const pckg = require('../package.json'); @@ -87,13 +87,19 @@ const app = new Elysia(serverConfig.elysia) } = query; // Validate required parameters - if (!amount) { + if (!amount || !username) { throw new Error('Missing required parameters'); } - const sparkAddress = databaseService.getSparkAddressByUsername(username); - if (!sparkAddress) { - return { status: 'ERROR', reason: 'Username not found' }; + let sparkAddress = username; + + if (!isSparkAddress(username)) { + const sparkFromDatabase = databaseService.getSparkAddressByUsername(username); + if (!sparkFromDatabase) { + return { status: 'ERROR', reason: 'Username not found' }; + } + + sparkAddress = sparkFromDatabase; } // FIXME: use the username to get the spark address diff --git a/src/spark-service.ts b/src/spark-service.ts index e1b1970..a33396f 100644 --- a/src/spark-service.ts +++ b/src/spark-service.ts @@ -52,6 +52,15 @@ export async function createInvoiceForSparkAddress(sparkAddress: string, amountS return invoice.invoice.encodedInvoice; } +export function isSparkAddress(address: string): boolean { + try { + bech32m.decode(address); + return address.startsWith('spark1'); + } catch (_) { + return false; + } +} + function convert5BitArrayToHex(words: number[]) { let bits = 0; let value = 0; diff --git a/test/spark-service.test.ts b/test/spark-service.test.ts new file mode 100644 index 0000000..edbed06 --- /dev/null +++ b/test/spark-service.test.ts @@ -0,0 +1,17 @@ +import { describe, expect, it } from 'bun:test' +import { isSparkAddress } from '../src/spark-service' + +describe('SparkService', () => { + describe('isSparkAddress', () => { + it('returns true for valid bech32m addresses', () => { + expect(isSparkAddress('bc1pm6lqlel3qxefsx0v39nshtghasvvp6ghn3e5hd5q280j5m9h7csqrkzssu')).toBe(false); + expect(isSparkAddress('spark1qw2e3r4t5y6u7i8o9p0')).toBe(false); + expect(isSparkAddress('invalid-address')).toBe(false) + expect(isSparkAddress('')).toBe(false) + expect(isSparkAddress('123456')).toBe(false) + + expect(isSparkAddress('spark1pgssxlr63wd3gyt99uzn9nwmjdncg6lfw6vamkuqf3u7aafuyzds9ny3u9ftwa')).toBe(true); + }) + }) +}) +