The Fluxora Backend API now validates that all sender and recipient fields contain valid Stellar public keys.
G[A-Z2-7]{55}
- Starts with:
G - Followed by: Exactly 55 characters from the base32 alphabet
- Base32 alphabet:
A-Z(uppercase) and2-7(digits) - Total length: 56 characters
GAAZI4TCR3TY5OJHCTJC2A4QSY6CJWJH5IAJTGKIN2ER7LBNVKOCCWN7
GBDEVU63Y6NTHJQQZIKVTC23NWLQVP3WJ2RI2OTSJTNYOIGICST6DUXR
GBBD47UZQ5CYVVEUVRYNQZX3G5KRZTAYF5XSVS2UKMCCWW5LJJLXNVQX
GABC123 ❌ Too short
AAAZI4TCR3TY5OJHCTJC2A4QSY6CJWJH5IAJTGKIN2ER7LBNVKOCCWN7 ❌ Wrong prefix (A instead of G)
G1111111111111111111111111111111111111111111111111111111 ❌ Invalid character (1 not in base32)
not-a-stellar-key ❌ Not a Stellar key
❌ Empty string
curl -X POST http://localhost:3000/api/streams \
-H "Content-Type: application/json" \
-H "Idempotency-Key: unique-key-123" \
-d '{
"sender": "GAAZI4TCR3TY5OJHCTJC2A4QSY6CJWJH5IAJTGKIN2ER7LBNVKOCCWN7",
"recipient": "GBDEVU63Y6NTHJQQZIKVTC23NWLQVP3WJ2RI2OTSJTNYOIGICST6DUXR",
"depositAmount": "1000",
"ratePerSecond": "10",
"startTime": 1700000000
}'Response: 201 Created
{
"id": "stream-1234567890-abc12",
"sender": "GAAZI4TCR3TY5OJHCTJC2A4QSY6CJWJH5IAJTGKIN2ER7LBNVKOCCWN7",
"recipient": "GBDEVU63Y6NTHJQQZIKVTC23NWLQVP3WJ2RI2OTSJTNYOIGICST6DUXR",
"depositAmount": "1000",
"ratePerSecond": "10",
"startTime": 1700000000,
"endTime": 0,
"status": "active"
}curl -X POST http://localhost:3000/api/streams \
-H "Content-Type: application/json" \
-H "Idempotency-Key: unique-key-456" \
-d '{
"sender": "invalid-key",
"recipient": "GBDEVU63Y6NTHJQQZIKVTC23NWLQVP3WJ2RI2OTSJTNYOIGICST6DUXR",
"depositAmount": "1000",
"ratePerSecond": "10"
}'Response: 400 Bad Request
{
"error": "Validation failed",
"details": "sender must be a valid Stellar public key (G...)",
"status": 400
}| Scenario | Error Message |
|---|---|
| Missing sender | sender is required |
| Empty sender | sender must be a valid Stellar public key (G...) |
| Invalid format | sender must be a valid Stellar public key (G...) |
| Missing recipient | recipient is required |
| Empty recipient | recipient must be a valid Stellar public key (G...) |
| Invalid format | recipient must be a valid Stellar public key (G...) |
- Schema Definition:
src/validation/schemas.ts - Route Integration:
src/routes/streams.ts - Tests:
tests/routes/streams.test.ts - API Docs:
openapi.yaml
export const STELLAR_PUBLIC_KEY_REGEX = /^G[A-Z2-7]{55}$/;function stellarPublicKeyField(fieldName: string) {
return z
.string({
required_error: `${fieldName} is required`,
invalid_type_error: `${fieldName} must be a string`,
})
.min(1, `${fieldName} must be a non-empty string`)
.regex(STELLAR_PUBLIC_KEY_REGEX, `${fieldName} must be a valid Stellar public key (G...)`);
}// Valid keys for testing
const VALID_SENDER = 'GAAZI4TCR3TY5OJHCTJC2A4QSY6CJWJH5IAJTGKIN2ER7LBNVKOCCWN7';
const VALID_RECIPIENT = 'GBDEVU63Y6NTHJQQZIKVTC23NWLQVP3WJ2RI2OTSJTNYOIGICST6DUXR';
// Invalid keys for testing
const INVALID_SHORT = 'GABC123';
const INVALID_PREFIX = 'AAAZI4TCR3TY5OJHCTJC2A4QSY6CJWJH5IAJTGKIN2ER7LBNVKOCCWN7';
const INVALID_CHARS = 'G1111111111111111111111111111111111111111111111111111111';If you're integrating with this API:
- Verify all sender addresses are valid Stellar public keys
- Verify all recipient addresses are valid Stellar public keys
- Update error handling to catch 400 validation errors
- Test with both valid and invalid keys
- Update documentation/examples with valid keys
- Stellar Public Key Format
- Base32 Encoding
- Stellar Laboratory - Generate test keys
For issues or questions:
- Check the error message for specific validation failures
- Verify your key format matches the regex pattern
- Test with known valid keys from Stellar testnet
- Review the OpenAPI spec at
/openapi.yaml