import test from 'node:test'; import assert from 'node:assert/strict'; import { assertCustodyDbActionAllowedOnNetwork, assertMainnetSchemaMigrationAcknowledged, assertMainnetCustodyOperationAcknowledged, parseCustodyDbArguments } from '../server/market/custody-db-args.ts'; test('custody database CLI parses two-argument deposit operations without shifting arguments', () => { assert.deepEqual(parseCustodyDbArguments(['deposit-prepare-credit', 'a'.repeat(64), `${'b'.repeat(64)}:${'c'.repeat(64)}`]), { action: 'deposit-prepare-credit', argument: 'a'.repeat(64), extraArgument: `${'b'.repeat(64)}:${'c'.repeat(64)}`, }); assert.deepEqual(parseCustodyDbArguments(['deposit-prepare-resolve-hold', 'credit-id', 'hold-id']), { action: 'deposit-prepare-resolve-hold', argument: 'credit-id', extraArgument: 'hold-id', }); assert.deepEqual(parseCustodyDbArguments(['grant-monero-observer-runtime', 'monero_observer']), { action: 'grant-monero-observer-runtime', argument: 'monero_observer', extraArgument: undefined, }); assert.deepEqual(parseCustodyDbArguments(['grant-monero-deposit-allocator-runtime', 'monero_allocator']), { action: 'grant-monero-deposit-allocator-runtime', argument: 'monero_allocator', extraArgument: undefined, }); assert.deepEqual(parseCustodyDbArguments(['grant-monero-withdrawal-runtime', 'monero_withdrawal']), { action: 'grant-monero-withdrawal-runtime', argument: 'monero_withdrawal', extraArgument: undefined, }); }); test('mainnet custody CLI permits only scoped Monero infrastructure grants and schema migration', () => { assert.doesNotThrow(() => assertCustodyDbActionAllowedOnNetwork('grant-monero-observer-runtime', true)); assert.doesNotThrow(() => assertCustodyDbActionAllowedOnNetwork('grant-monero-deposit-allocator-runtime', true)); assert.doesNotThrow(() => assertCustodyDbActionAllowedOnNetwork('grant-monero-withdrawal-runtime', true)); assert.doesNotThrow(() => assertCustodyDbActionAllowedOnNetwork('migrate-mainnet-schema', true)); assert.throws(() => assertCustodyDbActionAllowedOnNetwork('migrate-mainnet-schema', false), /requires the mainnet profile/); assert.doesNotThrow(() => assertCustodyDbActionAllowedOnNetwork('initialize-mainnet-custody-identity', true)); assert.doesNotThrow(() => assertCustodyDbActionAllowedOnNetwork('deposit-stage-credit', true)); assert.throws(() => assertCustodyDbActionAllowedOnNetwork('initialize-mainnet-custody-identity', false), /requires the mainnet profile/); assert.throws(() => assertMainnetSchemaMigrationAcknowledged('migrate-mainnet-schema', undefined), /acknowledgement/); assert.throws(() => assertMainnetSchemaMigrationAcknowledged('migrate-mainnet-schema', 'yes'), /acknowledgement/); assert.doesNotThrow(() => assertMainnetSchemaMigrationAcknowledged('migrate-mainnet-schema', 'explicit-schema-migration-only')); assert.doesNotThrow(() => assertMainnetSchemaMigrationAcknowledged('grant-monero-observer-runtime', undefined)); for (const action of ['migrate', 'grant-runtime', 'audit'] as const) { assert.throws(() => assertCustodyDbActionAllowedOnNetwork(action, true), /only scoped/i); assert.doesNotThrow(() => assertCustodyDbActionAllowedOnNetwork(action, false)); } }); test('mainnet reviewed deposit operations require exact credit-only acknowledgement', () => { for (const action of ['initialize-mainnet-custody-identity', 'grant-monero-credit-runtime', 'deposit-prepare-credit', 'deposit-stage-credit', 'deposit-prepare-release', 'deposit-release', 'deposit-reconcile-holds', 'deposit-prepare-resolve-hold', 'deposit-resolve-hold'] as const) { assert.throws(() => assertMainnetCustodyOperationAcknowledged(action, undefined), /reviewed-credit-only/); assert.throws(() => assertMainnetCustodyOperationAcknowledged(action, 'yes'), /reviewed-credit-only/); assert.doesNotThrow(() => assertMainnetCustodyOperationAcknowledged(action, 'reviewed-credit-only')); } assert.doesNotThrow(() => assertMainnetCustodyOperationAcknowledged('grant-monero-observer-runtime', undefined)); assert.doesNotThrow(() => assertMainnetCustodyOperationAcknowledged('grant-monero-deposit-allocator-runtime', undefined)); assert.doesNotThrow(() => assertMainnetCustodyOperationAcknowledged('grant-monero-withdrawal-runtime', undefined)); }); test('custody database CLI rejects unknown, missing, empty, and excess arguments', () => { for (const args of [[], ['unknown'], ['audit', 'extra'], ['deposit-prepare-credit', 'wallet'], ['deposit-prepare-credit', 'wallet', 'observation', 'extra'], ['deposit-release', '']]) { assert.throws(() => parseCustodyDbArguments(args)); } });