feat(finance): BTC basket flows, client scoping, and jewelry-box store

- Finance API: baskets, holdings, rebalances, deposits, bridge withdrawals, vault checks.
- Schemas: btc-basket; api-client finance types; workspace lockfile update.
- Vitest config for finance service; expanded tests.

Made-with: Cursor
This commit is contained in:
defiQUG
2026-04-07 22:59:32 -07:00
parent 923b703d97
commit 3f7cc0f854
18 changed files with 1825 additions and 494 deletions

View File

@@ -6,11 +6,13 @@
import fetch from 'node-fetch';
import { createVerify, createPublicKey } from 'crypto';
import { decode as multibaseDecode } from 'multibase';
import base58 from 'base58-universal';
import { importJWK } from 'jose';
import forge from 'node-forge';
import { verify as ed25519Verify } from '@noble/ed25519';
// eslint-disable-next-line @typescript-eslint/no-require-imports
const { decode: base58Decode }: { decode: (value: string) => Uint8Array } = require('base58-universal');
export interface DIDDocument {
id: string;
'@context': string[];
@@ -89,7 +91,7 @@ export class DIDResolver {
if (multibaseKey.startsWith('z')) {
try {
const base58Encoded = multibaseKey.slice(1);
const decoded = base58.decode(base58Encoded);
const decoded = base58Decode(base58Encoded);
return Buffer.from(decoded);
} catch {
throw new Error('Failed to decode multibase key');
@@ -296,4 +298,3 @@ export class DIDResolver {
}
}
}

View File

@@ -122,6 +122,9 @@ export async function prepareCredentialImage(
if (imageData.startsWith('data:')) {
// Extract base64 data
const base64Data = imageData.split(',')[1];
if (!base64Data) {
throw new Error('Invalid image data URL: missing base64 payload');
}
imageBuffer = Buffer.from(base64Data, 'base64');
} else {
imageBuffer = Buffer.from(imageData);
@@ -180,4 +183,3 @@ export function getRecommendedImageSpecs(): {
maxSizeKB: 100, // Max 100KB recommended
};
}