@@ -676,4 +676,180 @@ describe("IndexerStorage", () => {
676676 expect ( tokens [ 2 ] ) . toBeGreaterThan ( now ) ;
677677 } ) ;
678678 } ) ;
679+
680+ it ( "getMultipleSuiGqlCursors should return cursors for multiple setups" , async ( ) => {
681+ await db
682+ . prepare (
683+ "INSERT INTO indexer_state (setup_id, nbtc_cursor, updated_at) VALUES (?, ?, ?)" ,
684+ )
685+ . bind ( 1 , "cursor1" , Date . now ( ) )
686+ . run ( ) ;
687+ const cursors = await storage . getMultipleSuiGqlCursors ( [ 1 ] ) ;
688+ expect ( cursors [ 1 ] ) . toBe ( "cursor1" ) ;
689+ } ) ;
690+
691+ it ( "saveMultipleSuiGqlCursors should save cursors" , async ( ) => {
692+ await storage . saveMultipleSuiGqlCursors ( [ { setupId : 1 , cursor : "newCursor" } ] ) ;
693+ const cursor = await storage . getSuiGqlCursor ( 1 ) ;
694+ expect ( cursor ) . toBe ( "newCursor" ) ;
695+ } ) ;
696+
697+ it ( "hasRedeemRequest should check if redeem exists" , async ( ) => {
698+ await insertRedeemRequest ( storage , 1 , "redeemer1" , recipientScript , 3000 , 1000 , "0xSuiTx1" ) ;
699+ const exists = await storage . hasRedeemRequest ( 1 ) ;
700+ const notExists = await storage . hasRedeemRequest ( 999 ) ;
701+ expect ( exists ) . toBe ( true ) ;
702+ expect ( notExists ) . toBe ( false ) ;
703+ } ) ;
704+
705+ it ( "getRedeemUtxosWithDetails should return utxos with input_index" , async ( ) => {
706+ await insertRedeemRequest ( storage , 1 , "redeemer1" , recipientScript , 3000 , 1000 , "0xSuiTx1" ) ;
707+ await insertUtxo (
708+ storage ,
709+ 1 ,
710+ scriptPubkey1 ,
711+ "dwallet1" ,
712+ "tx1" ,
713+ 0 ,
714+ 2000 ,
715+ UtxoStatus . Available ,
716+ null ,
717+ ) ;
718+ await storage . saveRedeemInputs ( [
719+ {
720+ redeem_id : 1 ,
721+ utxo_id : 1 ,
722+ input_index : 0 ,
723+ dwallet_id : "dwallet1" ,
724+ created_at : Date . now ( ) ,
725+ } ,
726+ ] ) ;
727+ const utxos = await storage . getRedeemUtxosWithDetails ( 1 ) ;
728+ expect ( utxos . length ) . toBe ( 1 ) ;
729+ expect ( utxos [ 0 ] ! . input_index ) . toBe ( 0 ) ;
730+ } ) ;
731+
732+ it ( "getRedeemRequestData should return recipient_script and amount" , async ( ) => {
733+ await insertRedeemRequest ( storage , 1 , "redeemer1" , recipientScript , 3000 , 1000 , "0xSuiTx1" ) ;
734+ const data = await storage . getRedeemRequestData ( 1 ) ;
735+ expect ( data ) . not . toBeNull ( ) ;
736+ expect ( data ! . amount ) . toBe ( 3000 ) ;
737+ } ) ;
738+
739+ it ( "getSignedRedeems should return signed redeems" , async ( ) => {
740+ await insertRedeemRequest ( storage , 1 , "redeemer1" , recipientScript , 3000 , 1000 , "0xSuiTx1" ) ;
741+ await storage . updateRedeemStatus ( 1 , RedeemRequestStatus . Signed ) ;
742+ const redeems = await storage . getSignedRedeems ( ) ;
743+ expect ( redeems . length ) . toBe ( 1 ) ;
744+ expect ( redeems [ 0 ] ! . status ) . toBe ( RedeemRequestStatus . Signed ) ;
745+ } ) ;
746+
747+ it ( "getRedeemWithSetup should return redeem with setup info" , async ( ) => {
748+ await insertRedeemRequest ( storage , 1 , "redeemer1" , recipientScript , 3000 , 1000 , "0xSuiTx1" ) ;
749+ const redeem = await storage . getRedeemWithSetup ( 1 ) ;
750+ expect ( redeem ) . not . toBeNull ( ) ;
751+ expect ( redeem ! . nbtc_pkg ) . toBe ( "0xPkg1" ) ;
752+ } ) ;
753+
754+ it ( "clearRedeemInputSignId should clear sign_id" , async ( ) => {
755+ await insertRedeemRequest ( storage , 1 , "redeemer1" , recipientScript , 3000 , 1000 , "0xSuiTx1" ) ;
756+ await insertUtxo (
757+ storage ,
758+ 1 ,
759+ scriptPubkey1 ,
760+ "dwallet1" ,
761+ "tx1" ,
762+ 0 ,
763+ 2000 ,
764+ UtxoStatus . Available ,
765+ null ,
766+ ) ;
767+ await storage . saveRedeemInputs ( [
768+ {
769+ redeem_id : 1 ,
770+ utxo_id : 1 ,
771+ input_index : 0 ,
772+ dwallet_id : "dwallet1" ,
773+ created_at : Date . now ( ) ,
774+ } ,
775+ ] ) ;
776+ await storage . updateRedeemInputSig ( 1 , 1 , "signId123" ) ;
777+ await storage . clearRedeemInputSignId ( 1 , 1 ) ;
778+ const inputs = await storage . getRedeemInputs ( 1 ) ;
779+ expect ( inputs [ 0 ] ! . sign_id ) . toBeNull ( ) ;
780+ } ) ;
781+
782+ it ( "getRedeemInfoBySignId should return redeem info" , async ( ) => {
783+ await insertRedeemRequest ( storage , 1 , "redeemer1" , recipientScript , 3000 , 1000 , "0xSuiTx1" ) ;
784+ await insertUtxo (
785+ storage ,
786+ 1 ,
787+ scriptPubkey1 ,
788+ "dwallet1" ,
789+ "tx1" ,
790+ 0 ,
791+ 2000 ,
792+ UtxoStatus . Available ,
793+ null ,
794+ ) ;
795+ await storage . saveRedeemInputs ( [
796+ {
797+ redeem_id : 1 ,
798+ utxo_id : 1 ,
799+ input_index : 0 ,
800+ dwallet_id : "dwallet1" ,
801+ created_at : Date . now ( ) ,
802+ } ,
803+ ] ) ;
804+ await storage . updateRedeemInputSig ( 1 , 1 , "signId123" ) ;
805+ const info = await storage . getRedeemInfoBySignId ( "signId123" ) ;
806+ expect ( info ) . not . toBeNull ( ) ;
807+ expect ( info ! . redeem_id ) . toBe ( 1 ) ;
808+ } ) ;
809+
810+ it ( "markRedeemBroadcasted should update status and btc_tx" , async ( ) => {
811+ await insertRedeemRequest ( storage , 1 , "redeemer1" , recipientScript , 3000 , 1000 , "0xSuiTx1" ) ;
812+ await storage . markRedeemBroadcasted ( 1 , "btcTxId123" ) ;
813+ const redeem = await db
814+ . prepare ( "SELECT status, btc_tx FROM nbtc_redeem_requests WHERE redeem_id = ?" )
815+ . bind ( 1 )
816+ . first < { status : string ; btc_tx : string } > ( ) ;
817+ expect ( redeem ! . status ) . toBe ( RedeemRequestStatus . Broadcasting ) ;
818+ expect ( redeem ! . btc_tx ) . toBe ( "btcTxId123" ) ;
819+ } ) ;
820+
821+ it ( "setRedeemFinalized should update status and mark utxos as spent" , async ( ) => {
822+ await insertRedeemRequest ( storage , 1 , "redeemer1" , recipientScript , 3000 , 1000 , "0xSuiTx1" ) ;
823+ await insertUtxo (
824+ storage ,
825+ 1 ,
826+ scriptPubkey1 ,
827+ "dwallet1" ,
828+ "tx1" ,
829+ 0 ,
830+ 2000 ,
831+ UtxoStatus . Available ,
832+ null ,
833+ ) ;
834+ await storage . saveRedeemInputs ( [
835+ {
836+ redeem_id : 1 ,
837+ utxo_id : 1 ,
838+ input_index : 0 ,
839+ dwallet_id : "dwallet1" ,
840+ created_at : Date . now ( ) ,
841+ } ,
842+ ] ) ;
843+ await storage . setRedeemFinalized ( 1 ) ;
844+ const redeem = await db
845+ . prepare ( "SELECT status FROM nbtc_redeem_requests WHERE redeem_id = ?" )
846+ . bind ( 1 )
847+ . first < { status : string } > ( ) ;
848+ const utxo = await db
849+ . prepare ( "SELECT status FROM nbtc_utxos WHERE nbtc_utxo_id = ?" )
850+ . bind ( 1 )
851+ . first < { status : string } > ( ) ;
852+ expect ( redeem ! . status ) . toBe ( RedeemRequestStatus . Finalized ) ;
853+ expect ( utxo ! . status ) . toBe ( UtxoStatus . Spent ) ;
854+ } ) ;
679855} ) ;
0 commit comments