@@ -26,6 +26,9 @@ import {AggregateTransactionCosignature} from '../model/transaction/AggregateTra
2626import { CosignatureSignedTransaction } from '../model/transaction/CosignatureSignedTransaction' ;
2727import { Deadline } from '../model/transaction/Deadline' ;
2828import { 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' ;
2932import { Transaction } from '../model/transaction/Transaction' ;
3033import { TransactionStatusError } from '../model/transaction/TransactionStatusError' ;
3134import { TransferTransaction } from '../model/transaction/TransferTransaction' ;
@@ -40,6 +43,7 @@ enum ListenerChannelName {
4043 aggregateBondedAdded = 'partialAdded' ,
4144 aggregateBondedRemoved = 'partialRemoved' ,
4245 cosignature = 'cosignature' ,
46+ modifyMultisigAccount = 'modifyMultisigAccount' ,
4347 status = 'status' ,
4448}
4549
@@ -288,6 +292,24 @@ export class Listener {
288292 map ( ( _ ) => _ . message as string ) ) ;
289293 }
290294
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+
291313 /**
292314 * Returns an observable stream of {@link TransactionStatusError} for specific address.
293315 * Each time a transaction contains an error,
@@ -388,4 +410,23 @@ export class Listener {
388410 && ( transaction . recipient as Address ) . equals ( address )
389411 ) ;
390412 }
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+ }
391432}
0 commit comments