@@ -597,4 +597,180 @@ describe("IndexerStorage", () => {
597597 expect ( inputs [ 0 ] ! . input_index ) . toBe ( 0 ) ;
598598 expect ( inputs [ 1 ] ! . input_index ) . toBe ( 1 ) ;
599599 } ) ;
600+
601+ it ( "getMultipleSuiGqlCursors should return cursors for multiple setups" , async ( ) => {
602+ await db
603+ . prepare (
604+ "INSERT INTO indexer_state (setup_id, nbtc_cursor, updated_at) VALUES (?, ?, ?)" ,
605+ )
606+ . bind ( 1 , "cursor1" , Date . now ( ) )
607+ . run ( ) ;
608+ const cursors = await storage . getMultipleSuiGqlCursors ( [ 1 ] ) ;
609+ expect ( cursors [ 1 ] ) . toBe ( "cursor1" ) ;
610+ } ) ;
611+
612+ it ( "saveMultipleSuiGqlCursors should save cursors" , async ( ) => {
613+ await storage . saveMultipleSuiGqlCursors ( [ { setupId : 1 , cursor : "newCursor" } ] ) ;
614+ const cursor = await storage . getSuiGqlCursor ( 1 ) ;
615+ expect ( cursor ) . toBe ( "newCursor" ) ;
616+ } ) ;
617+
618+ it ( "hasRedeemRequest should check if redeem exists" , async ( ) => {
619+ await insertRedeemRequest ( storage , 1 , "redeemer1" , recipientScript , 3000 , 1000 , "0xSuiTx1" ) ;
620+ const exists = await storage . hasRedeemRequest ( 1 ) ;
621+ const notExists = await storage . hasRedeemRequest ( 999 ) ;
622+ expect ( exists ) . toBe ( true ) ;
623+ expect ( notExists ) . toBe ( false ) ;
624+ } ) ;
625+
626+ it ( "getRedeemUtxosWithDetails should return utxos with input_index" , async ( ) => {
627+ await insertRedeemRequest ( storage , 1 , "redeemer1" , recipientScript , 3000 , 1000 , "0xSuiTx1" ) ;
628+ await insertUtxo (
629+ storage ,
630+ 1 ,
631+ scriptPubkey1 ,
632+ "dwallet1" ,
633+ "tx1" ,
634+ 0 ,
635+ 2000 ,
636+ UtxoStatus . Available ,
637+ null ,
638+ ) ;
639+ await storage . saveRedeemInputs ( [
640+ {
641+ redeem_id : 1 ,
642+ utxo_id : 1 ,
643+ input_index : 0 ,
644+ dwallet_id : "dwallet1" ,
645+ created_at : Date . now ( ) ,
646+ } ,
647+ ] ) ;
648+ const utxos = await storage . getRedeemUtxosWithDetails ( 1 ) ;
649+ expect ( utxos . length ) . toBe ( 1 ) ;
650+ expect ( utxos [ 0 ] ! . input_index ) . toBe ( 0 ) ;
651+ } ) ;
652+
653+ it ( "getRedeemRequestData should return recipient_script and amount" , async ( ) => {
654+ await insertRedeemRequest ( storage , 1 , "redeemer1" , recipientScript , 3000 , 1000 , "0xSuiTx1" ) ;
655+ const data = await storage . getRedeemRequestData ( 1 ) ;
656+ expect ( data ) . not . toBeNull ( ) ;
657+ expect ( data ! . amount ) . toBe ( 3000 ) ;
658+ } ) ;
659+
660+ it ( "getSignedRedeems should return signed redeems" , async ( ) => {
661+ await insertRedeemRequest ( storage , 1 , "redeemer1" , recipientScript , 3000 , 1000 , "0xSuiTx1" ) ;
662+ await storage . updateRedeemStatus ( 1 , RedeemRequestStatus . Signed ) ;
663+ const redeems = await storage . getSignedRedeems ( ) ;
664+ expect ( redeems . length ) . toBe ( 1 ) ;
665+ expect ( redeems [ 0 ] ! . status ) . toBe ( RedeemRequestStatus . Signed ) ;
666+ } ) ;
667+
668+ it ( "getRedeemWithSetup should return redeem with setup info" , async ( ) => {
669+ await insertRedeemRequest ( storage , 1 , "redeemer1" , recipientScript , 3000 , 1000 , "0xSuiTx1" ) ;
670+ const redeem = await storage . getRedeemWithSetup ( 1 ) ;
671+ expect ( redeem ) . not . toBeNull ( ) ;
672+ expect ( redeem ! . nbtc_pkg ) . toBe ( "0xPkg1" ) ;
673+ } ) ;
674+
675+ it ( "clearRedeemInputSignId should clear sign_id" , async ( ) => {
676+ await insertRedeemRequest ( storage , 1 , "redeemer1" , recipientScript , 3000 , 1000 , "0xSuiTx1" ) ;
677+ await insertUtxo (
678+ storage ,
679+ 1 ,
680+ scriptPubkey1 ,
681+ "dwallet1" ,
682+ "tx1" ,
683+ 0 ,
684+ 2000 ,
685+ UtxoStatus . Available ,
686+ null ,
687+ ) ;
688+ await storage . saveRedeemInputs ( [
689+ {
690+ redeem_id : 1 ,
691+ utxo_id : 1 ,
692+ input_index : 0 ,
693+ dwallet_id : "dwallet1" ,
694+ created_at : Date . now ( ) ,
695+ } ,
696+ ] ) ;
697+ await storage . updateRedeemInputSig ( 1 , 1 , "signId123" ) ;
698+ await storage . clearRedeemInputSignId ( 1 , 1 ) ;
699+ const inputs = await storage . getRedeemInputs ( 1 ) ;
700+ expect ( inputs [ 0 ] ! . sign_id ) . toBeNull ( ) ;
701+ } ) ;
702+
703+ it ( "getRedeemInfoBySignId should return redeem info" , async ( ) => {
704+ await insertRedeemRequest ( storage , 1 , "redeemer1" , recipientScript , 3000 , 1000 , "0xSuiTx1" ) ;
705+ await insertUtxo (
706+ storage ,
707+ 1 ,
708+ scriptPubkey1 ,
709+ "dwallet1" ,
710+ "tx1" ,
711+ 0 ,
712+ 2000 ,
713+ UtxoStatus . Available ,
714+ null ,
715+ ) ;
716+ await storage . saveRedeemInputs ( [
717+ {
718+ redeem_id : 1 ,
719+ utxo_id : 1 ,
720+ input_index : 0 ,
721+ dwallet_id : "dwallet1" ,
722+ created_at : Date . now ( ) ,
723+ } ,
724+ ] ) ;
725+ await storage . updateRedeemInputSig ( 1 , 1 , "signId123" ) ;
726+ const info = await storage . getRedeemInfoBySignId ( "signId123" ) ;
727+ expect ( info ) . not . toBeNull ( ) ;
728+ expect ( info ! . redeem_id ) . toBe ( 1 ) ;
729+ } ) ;
730+
731+ it ( "markRedeemBroadcasted should update status and btc_tx" , async ( ) => {
732+ await insertRedeemRequest ( storage , 1 , "redeemer1" , recipientScript , 3000 , 1000 , "0xSuiTx1" ) ;
733+ await storage . markRedeemBroadcasted ( 1 , "btcTxId123" ) ;
734+ const redeem = await db
735+ . prepare ( "SELECT status, btc_tx FROM nbtc_redeem_requests WHERE redeem_id = ?" )
736+ . bind ( 1 )
737+ . first < { status : string ; btc_tx : string } > ( ) ;
738+ expect ( redeem ! . status ) . toBe ( RedeemRequestStatus . Broadcasting ) ;
739+ expect ( redeem ! . btc_tx ) . toBe ( "btcTxId123" ) ;
740+ } ) ;
741+
742+ it ( "setRedeemFinalized should update status and mark utxos as spent" , async ( ) => {
743+ await insertRedeemRequest ( storage , 1 , "redeemer1" , recipientScript , 3000 , 1000 , "0xSuiTx1" ) ;
744+ await insertUtxo (
745+ storage ,
746+ 1 ,
747+ scriptPubkey1 ,
748+ "dwallet1" ,
749+ "tx1" ,
750+ 0 ,
751+ 2000 ,
752+ UtxoStatus . Available ,
753+ null ,
754+ ) ;
755+ await storage . saveRedeemInputs ( [
756+ {
757+ redeem_id : 1 ,
758+ utxo_id : 1 ,
759+ input_index : 0 ,
760+ dwallet_id : "dwallet1" ,
761+ created_at : Date . now ( ) ,
762+ } ,
763+ ] ) ;
764+ await storage . setRedeemFinalized ( 1 ) ;
765+ const redeem = await db
766+ . prepare ( "SELECT status FROM nbtc_redeem_requests WHERE redeem_id = ?" )
767+ . bind ( 1 )
768+ . first < { status : string } > ( ) ;
769+ const utxo = await db
770+ . prepare ( "SELECT status FROM nbtc_utxos WHERE nbtc_utxo_id = ?" )
771+ . bind ( 1 )
772+ . first < { status : string } > ( ) ;
773+ expect ( redeem ! . status ) . toBe ( RedeemRequestStatus . Finalized ) ;
774+ expect ( utxo ! . status ) . toBe ( UtxoStatus . Spent ) ;
775+ } ) ;
600776} ) ;
0 commit comments