@@ -26,6 +26,9 @@ import {AggregateTransactionCosignature} from '../model/transaction/AggregateTra
26
26
import { CosignatureSignedTransaction } from '../model/transaction/CosignatureSignedTransaction' ;
27
27
import { Deadline } from '../model/transaction/Deadline' ;
28
28
import { InnerTransaction } from '../model/transaction/InnerTransaction' ;
29
+ import { ModifyMultisigAccountTransaction } from '../model/transaction/ModifyMultisigAccountTransaction' ;
30
+ import { MultisigCosignatoryModification } from '../model/transaction/MultisigCosignatoryModification' ;
31
+ import { MultisigCosignatoryModificationType } from '../model/transaction/MultisigCosignatoryModificationType' ;
29
32
import { Transaction } from '../model/transaction/Transaction' ;
30
33
import { TransactionStatusError } from '../model/transaction/TransactionStatusError' ;
31
34
import { TransferTransaction } from '../model/transaction/TransferTransaction' ;
@@ -40,6 +43,7 @@ enum ListenerChannelName {
40
43
aggregateBondedAdded = 'partialAdded' ,
41
44
aggregateBondedRemoved = 'partialRemoved' ,
42
45
cosignature = 'cosignature' ,
46
+ modifyMultisigAccount = 'modifyMultisigAccount' ,
43
47
status = 'status' ,
44
48
}
45
49
@@ -288,6 +292,24 @@ export class Listener {
288
292
map ( ( _ ) => _ . message as string ) ) ;
289
293
}
290
294
295
+ /**
296
+ * Return an observable of {@link ModifyMultisigAccountTransaction} for specific address which has been added to multi signatories.
297
+ * Each time an modify multi signatures transaction is announced,
298
+ * it emits a new {@link ModifyMultisigAccountTransaction} in the event stream.
299
+ *
300
+ * @param address address we listen when a transaction with missing signatures state
301
+ * @return an observable stream of ModifyMultisigAccountTransaction with missing signatures state
302
+ */
303
+ public multisigAccountAdded ( address : Address ) : Observable < ModifyMultisigAccountTransaction > {
304
+ this . subscribeTo ( `modifyMultisigAccount/${ address . plain ( ) } ` ) ;
305
+ return this . messageSubject . asObservable ( ) . pipe (
306
+ filter ( ( _ ) => _ . channelName === ListenerChannelName . modifyMultisigAccount ) ,
307
+ filter ( ( _ ) => _ . message instanceof ModifyMultisigAccountTransaction ) ,
308
+ map ( ( _ ) => _ . message as ModifyMultisigAccountTransaction ) ,
309
+ filter ( ( _ ) => this . accountAddedToMultiSig ( _ , address ) ) ,
310
+ ) ;
311
+ }
312
+
291
313
/**
292
314
* Returns an observable stream of {@link TransactionStatusError} for specific address.
293
315
* Each time a transaction contains an error,
@@ -388,4 +410,23 @@ export class Listener {
388
410
&& ( transaction . recipient as Address ) . equals ( address )
389
411
) ;
390
412
}
413
+
414
+ /**
415
+ * @internal
416
+ * Filters if an account has been added to multi signatories
417
+ * @param transaction - Transaction object
418
+ * @param address - Address
419
+ * @returns boolean
420
+ */
421
+ // tslint:disable-next-line:adjacent-overload-signatures
422
+ private accountAddedToMultiSig ( transaction : Transaction , address : Address ) : boolean {
423
+ if ( transaction instanceof ModifyMultisigAccountTransaction ) {
424
+ transaction . modifications . map ( ( _ : MultisigCosignatoryModification ) => {
425
+ if ( _ . type === MultisigCosignatoryModificationType . Add && _ . cosignatoryPublicAccount . address . equals ( address ) ) {
426
+ return true ;
427
+ }
428
+ } ) ;
429
+ }
430
+ return false ;
431
+ }
391
432
}
0 commit comments