1
- import { TransactionReceipt , TransactionRequest , TransactionResponse } from 'ethers6' ;
1
+ import { FeeData , TransactionReceipt , TransactionRequest , TransactionResponse } from 'ethers6' ;
2
2
import { MessagePort } from 'worker_threads' ;
3
- import { WalletTransactionOptions , WalletTransactionRequestMessage , WalletTransactionRequestResponse } from './wallet.types' ;
4
- import { WALLET_WORKER_CRASHED_MESSAGE_ID } from './wallet.service' ;
3
+ import { WALLET_WORKER_CRASHED_MESSAGE_ID , WalletFeeDataMessage , WalletGetFeeDataMessage , WalletMessageType , WalletPortData , WalletTransactionOptions , WalletTransactionRequestMessage , WalletTransactionRequestResponseMessage } from './wallet.types' ;
5
4
6
5
export interface TransactionResult < T = any > {
7
6
txRequest : TransactionRequest ;
@@ -22,6 +21,7 @@ export class WalletInterface {
22
21
}
23
22
24
23
async submitTransaction < T > (
24
+ chainId : string ,
25
25
transaction : TransactionRequest ,
26
26
metadata ?: T ,
27
27
options ?: WalletTransactionOptions
@@ -30,22 +30,25 @@ export class WalletInterface {
30
30
const messageId = this . getNextPortMessageId ( ) ;
31
31
32
32
const resultPromise = new Promise < TransactionResult < T > > ( resolve => {
33
- const listener = ( data : any ) => {
33
+ const listener = ( data : WalletPortData ) => {
34
34
if ( data . messageId === messageId ) {
35
35
this . port . off ( "message" , listener ) ;
36
36
37
- const walletResponse = data as WalletTransactionRequestResponse < T > ;
37
+ const walletResponse = data . message as WalletTransactionRequestResponseMessage < T > ;
38
38
39
39
const result = {
40
40
txRequest : walletResponse . txRequest ,
41
41
metadata : walletResponse . metadata ,
42
42
tx : walletResponse . tx ,
43
43
txReceipt : walletResponse . txReceipt ,
44
- submissionError : data . submissionError ,
45
- confirmationError : data . confirmationError
44
+ submissionError : walletResponse . submissionError ,
45
+ confirmationError : walletResponse . confirmationError
46
46
} ;
47
47
resolve ( result ) ;
48
- } else if ( data . messageId === WALLET_WORKER_CRASHED_MESSAGE_ID ) {
48
+ } else if (
49
+ data . messageId === WALLET_WORKER_CRASHED_MESSAGE_ID
50
+ && data . chainId == chainId
51
+ ) {
49
52
this . port . off ( "message" , listener ) ;
50
53
51
54
const result = {
@@ -59,13 +62,67 @@ export class WalletInterface {
59
62
} ;
60
63
this . port . on ( "message" , listener ) ;
61
64
62
- const request : WalletTransactionRequestMessage = {
63
- messageId ,
65
+ const message : WalletTransactionRequestMessage = {
66
+ type : WalletMessageType . TransactionRequest ,
64
67
txRequest : transaction ,
65
68
metadata,
66
69
options
67
70
} ;
68
- this . port . postMessage ( request ) ;
71
+
72
+ const portData : WalletPortData = {
73
+ chainId,
74
+ messageId,
75
+ message,
76
+ }
77
+ this . port . postMessage ( portData ) ;
78
+ } ) ;
79
+
80
+ return resultPromise ;
81
+ }
82
+
83
+ async getFeeData (
84
+ chainId : string ,
85
+ priority ?: boolean ,
86
+ ) : Promise < FeeData > {
87
+
88
+ const messageId = this . getNextPortMessageId ( ) ;
89
+
90
+ const resultPromise = new Promise < FeeData > ( resolve => {
91
+ const listener = ( data : WalletPortData ) => {
92
+ if ( data . messageId === messageId ) {
93
+ this . port . off ( "message" , listener ) ;
94
+
95
+ const walletResponse = data . message as WalletFeeDataMessage ;
96
+
97
+ const result = {
98
+ gasPrice : walletResponse . gasPrice ,
99
+ maxFeePerGas : walletResponse . maxFeePerGas ,
100
+ maxPriorityFeePerGas : walletResponse . maxPriorityFeePerGas ,
101
+ } as FeeData ;
102
+ resolve ( result ) ;
103
+ } else if (
104
+ data . messageId === WALLET_WORKER_CRASHED_MESSAGE_ID
105
+ && data . chainId == chainId
106
+ ) {
107
+ this . port . off ( "message" , listener ) ;
108
+
109
+ const result = { } as FeeData ;
110
+ resolve ( result ) ;
111
+ }
112
+ } ;
113
+ this . port . on ( "message" , listener ) ;
114
+
115
+ const message : WalletGetFeeDataMessage = {
116
+ type : WalletMessageType . GetFeeData ,
117
+ priority : priority ?? false ,
118
+ } ;
119
+
120
+ const portData : WalletPortData = {
121
+ chainId,
122
+ messageId,
123
+ message,
124
+ }
125
+ this . port . postMessage ( portData ) ;
69
126
} ) ;
70
127
71
128
return resultPromise ;
0 commit comments