import { describe, expect, it } from 'vitest'; import { JewelryBoxStore } from '../src/jewelry-box-store'; describe('JewelryBoxStore', () => { it('creates queued rebalance work only for non-cBTC allocations', () => { const store = new JewelryBoxStore(); const basket = store.createBasket({ clientId: 'client-1', mandateName: 'Multi-asset jewelry box', chain138VaultAddress: '0x4444444444444444444444444444444444444444', allocations: [ { symbol: 'cBTC', targetWeightBps: 2500 }, { symbol: 'cUSDC', targetWeightBps: 5000 }, { symbol: 'cXAUC', targetWeightBps: 2500 }, ], baseAssetSymbol: 'cBTC', }); const rebalances = store.listRebalances({ basketId: basket.id }); expect(rebalances).toHaveLength(1); expect(rebalances[0]).toMatchObject({ sourceSymbol: 'cBTC', targetSymbols: ['cUSDC', 'cXAUC'], status: 'planned', }); }); it('promotes rebalance plans once a deposit is marked minted', () => { const store = new JewelryBoxStore(); const { basket, deposit } = store.createDeposit({ clientId: 'client-2', chain138VaultAddress: '0x5555555555555555555555555555555555555555', allocations: [ { symbol: 'cBTC', targetWeightBps: 3000 }, { symbol: 'cUSDT', targetWeightBps: 7000 }, ], expectedAmountSats: 300000000, }); store.markDepositObserved(deposit.id, 'btc-tx-1', 6, 300000000); store.markDepositMinted(deposit.id); const updatedDeposit = store.getDeposit(deposit.id); expect(updatedDeposit?.status).toBe('minted'); const holdings = store.listHoldings({ basketId: basket.id }); expect(holdings[1]).toMatchObject({ symbol: 'cUSDT', bookValueSats: 210000000, status: 'funded', }); const rebalances = store.listRebalances({ basketId: basket.id }); expect(rebalances[0]?.status).toBe('queued'); }); });