1
1
import type { Chain , Network } from "@wormhole-foundation/sdk-base" ;
2
2
import type {
3
3
ChainContext ,
4
+ SignAndSendSigner ,
4
5
Signer ,
5
6
TransactionId ,
6
7
TxHash ,
7
8
UnsignedTransaction ,
8
9
} from "@wormhole-foundation/sdk-definitions" ;
9
10
import { isSignAndSendSigner , isSigner } from "@wormhole-foundation/sdk-definitions" ;
10
11
12
+ type SignSend < N extends Network , C extends Chain > = (
13
+ txns : UnsignedTransaction < N , C > [ ] ,
14
+ ) => Promise < TxHash [ ] > ;
15
+
11
16
export async function signSendWait < N extends Network , C extends Chain > (
12
17
chain : ChainContext < N , C > ,
13
18
xfer : AsyncGenerator < UnsignedTransaction < N , C > > ,
14
19
signer : Signer < N , C > ,
15
20
) : Promise < TransactionId [ ] > {
16
- const txHashes : TxHash [ ] = [ ] ;
17
-
18
21
if ( ! isSigner ( signer ) ) throw new Error ( "Invalid signer, not SignAndSendSigner or SignOnlySigner" ) ;
19
22
20
23
const signSend = async ( txns : UnsignedTransaction < N , C > [ ] ) : Promise < TxHash [ ] > =>
21
24
isSignAndSendSigner ( signer )
22
25
? signer . signAndSend ( txns )
23
26
: chain . sendWait ( await signer . sign ( txns ) ) ;
24
27
28
+ const txHashes = await ssw ( xfer , signSend ) ;
29
+ return txHashes . map ( ( txid ) => ( { chain : chain . chain , txid } ) ) ;
30
+ }
31
+
32
+ export async function signAndSendWait < N extends Network , C extends Chain > (
33
+ xfer : AsyncGenerator < UnsignedTransaction < N , C > > ,
34
+ signer : SignAndSendSigner < N , C > ,
35
+ ) : Promise < TransactionId [ ] > {
36
+ if ( ! isSignAndSendSigner ( signer ) )
37
+ throw new Error ( "Invalid signer, only SignAndSendSigner may call this method" ) ;
38
+
39
+ const txHashes = await ssw ( xfer , signer . signAndSend ) ;
40
+ return txHashes . map ( ( txid ) => ( { chain : signer . chain ( ) , txid } ) ) ;
41
+ }
42
+
43
+ async function ssw < N extends Network , C extends Chain > (
44
+ xfer : AsyncGenerator < UnsignedTransaction < N , C > > ,
45
+ signSend : SignSend < N , C > ,
46
+ ) : Promise < TxHash [ ] > {
47
+ const txids : TxHash [ ] = [ ] ;
25
48
let txbuff : UnsignedTransaction < N , C > [ ] = [ ] ;
26
49
for await ( const tx of xfer ) {
27
50
// buffer transactions as long as they are
@@ -33,20 +56,20 @@ export async function signSendWait<N extends Network, C extends Chain>(
33
56
// flush the buffer then sign and send the
34
57
// current tx
35
58
if ( txbuff . length > 0 ) {
36
- txHashes . push ( ...( await signSend ( txbuff ) ) ) ;
59
+ txids . push ( ...( await signSend ( txbuff ) ) ) ;
37
60
txbuff = [ ] ;
38
61
}
39
62
// Note: it may be possible to group this tx with
40
63
// those in the buffer if there are any but
41
64
// the parallelizable flag alone is not enough to signal
42
65
// if this is safe
43
- txHashes . push ( ...( await signSend ( [ tx ] ) ) ) ;
66
+ txids . push ( ...( await signSend ( [ tx ] ) ) ) ;
44
67
}
45
68
}
46
69
47
70
if ( txbuff . length > 0 ) {
48
- txHashes . push ( ...( await signSend ( txbuff ) ) ) ;
71
+ txids . push ( ...( await signSend ( txbuff ) ) ) ;
49
72
}
50
73
51
- return txHashes . map ( ( txid ) => ( { chain : chain . chain , txid } ) ) ;
74
+ return txids ;
52
75
}
0 commit comments