import { expect, describe, beforeAll, it } from 'vitest'; import { DistributionSecret, parseDistributionSecret, serializeDistributionSecret, } from './distribution-secrets'; import { hexToBase64 } from './base64'; import { concat, Hex, size, toHex, zeroHash } from 'viem'; const SIG = '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef01' as Hex; const SECRET = '0x34567890abcdef1234567890abcdef1234567890abcdef000000000000000000' as Hex; describe('distribution-secrets', () => { beforeAll(() => { expect(size(SIG)).toBe(65); expect(size(SECRET)).toBe(32); }); describe('parseDistributionSecret', () => { it('should parse secret with subSig and subSecret', () => { const secret = 'EjRWeJCrze8SNFZ4kKvN7xI0VniQq83vEjRWeJCrze8SNFZ4kKvN7xI0VniQq83vEjRWeJCrze8SNFZ4kKvN7wE0VniQq83vEjRWeJCrze8SNFZ4kKvN7wAAAAAAAAAAAA'; const result = parseDistributionSecret(secret); expect(result).toEqual({ type: 'pre_generated', subSig: SIG, subSecret: SECRET, }); }); it('should parse secret with secret only', () => { const secret = hexToBase64(SECRET); const result = parseDistributionSecret(secret); expect(result).toEqual({ type: 'secret', secret: SECRET, }); }); it('should parse secret with realtime', () => { const secret = hexToBase64( concat([SIG, toHex(123n, { size: 32 }), zeroHash]) ); const result = parseDistributionSecret(secret); expect(result).toEqual({ type: 'real_time', sig: SIG, nonce: 123n, coordinate: zeroHash, }); }); }); describe('serializeDistributionSecret', () => { it('should serialize secret with subSig and subSecret', () => { const params = { type: 'pre_generated', subSig: SIG, subSecret: SECRET, }; const result = serializeDistributionSecret(params as DistributionSecret); expect(result).toBe( 'EjRWeJCrze8SNFZ4kKvN7xI0VniQq83vEjRWeJCrze8SNFZ4kKvN7xI0VniQq83vEjRWeJCrze8SNFZ4kKvN7wE0VniQq83vEjRWeJCrze8SNFZ4kKvN7wAAAAAAAAAAAA' ); }); it('should serialize secret with secret only', () => { const params = { type: 'secret', secret: SECRET as Hex, }; const result = serializeDistributionSecret(params as DistributionSecret); expect(result).toBe(hexToBase64(params.secret)); }); it('should serialize secret with sig only', () => { const params = { type: 'real_time', sig: SIG as Hex, nonce: 123n, coordinate: zeroHash, }; const result = serializeDistributionSecret(params as DistributionSecret); expect(result).toBe( hexToBase64( concat([params.sig, toHex(params.nonce, { size: 32 }), zeroHash]) ) ); }); }); });