@@ -37,31 +37,56 @@ export const TX_MODE_IN_BLOCK = "in-block";
3737export const TX_MODE_FINALIZED_BLOCK = "finalized-block" ;
3838export const TX_MODE_IN_POOL = "in-tx-pool" ;
3939
40- function waitForTransaction ( tx , signer , txName , txMode = TX_MODE_IN_BLOCK ) {
40+ const DEFAULT_TX_TIMEOUT_MS = 120_000 ; // 2 minutes default timeout
41+
42+ function waitForTransaction ( tx , signer , txName , txMode = TX_MODE_IN_BLOCK , timeoutMs = DEFAULT_TX_TIMEOUT_MS ) {
4143 return new Promise ( ( resolve , reject ) => {
42- const sub = tx . signSubmitAndWatch ( signer ) . subscribe ( {
44+ let sub ;
45+ let resolved = false ;
46+
47+ const timeoutId = setTimeout ( ( ) => {
48+ if ( ! resolved ) {
49+ resolved = true ;
50+ if ( sub ) sub . unsubscribe ( ) ;
51+ reject ( new Error ( `${ txName } transaction timed out after ${ timeoutMs } ms waiting for ${ txMode } ` ) ) ;
52+ }
53+ } , timeoutMs ) ;
54+
55+ sub = tx . signSubmitAndWatch ( signer ) . subscribe ( {
4356 next : ( ev ) => {
4457 console . log ( `✅ ${ txName } event:` , ev . type ) ;
4558 switch ( txMode ) {
4659 case TX_MODE_IN_BLOCK :
4760 if ( ev . type === "txBestBlocksState" && ev . found ) {
4861 console . log ( `📦 ${ txName } included in block:` , ev . block . hash ) ;
49- sub . unsubscribe ( ) ;
50- resolve ( ev ) ;
62+ if ( ! resolved ) {
63+ resolved = true ;
64+ clearTimeout ( timeoutId ) ;
65+ sub . unsubscribe ( ) ;
66+ resolve ( ev ) ;
67+ }
5168 }
5269 break ;
5370 case TX_MODE_IN_POOL :
5471 if ( ev . type === "broadcasted" ) {
5572 console . log ( `📦 ${ txName } broadcasted with txHash:` , ev . txHash ) ;
56- sub . unsubscribe ( ) ;
57- resolve ( ev ) ;
73+ if ( ! resolved ) {
74+ resolved = true ;
75+ clearTimeout ( timeoutId ) ;
76+ sub . unsubscribe ( ) ;
77+ resolve ( ev ) ;
78+ }
5879 }
5980 break ;
6081 case TX_MODE_FINALIZED_BLOCK :
6182 if ( ev . type === "finalized" ) {
6283 console . log ( `📦 ${ txName } included in finalized block:` , ev . block . hash ) ;
63- sub . unsubscribe ( ) ;
64- resolve ( ev ) ;
84+ if ( ! resolved ) {
85+ resolved = true ;
86+ clearTimeout ( timeoutId ) ;
87+ sub . unsubscribe ( ) ;
88+ resolve ( ev ) ;
89+ }
6590 }
6691 break ;
6792
@@ -71,8 +96,12 @@ function waitForTransaction(tx, signer, txName, txMode = TX_MODE_IN_BLOCK) {
7196 } ,
7297 error : ( err ) => {
7398 console . error ( `❌ ${ txName } error:` , err ) ;
74- sub . unsubscribe ( ) ;
75- reject ( err ) ;
99+ if ( ! resolved ) {
100+ resolved = true ;
101+ clearTimeout ( timeoutId ) ;
102+ sub . unsubscribe ( ) ;
103+ reject ( err ) ;
104+ }
76105 } ,
77106 complete : ( ) => {
78107 console . log ( `✅ ${ txName } complete!` ) ;
0 commit comments