1414 * limitations under the License.
1515 */
1616
17- import { TransactionRoutesApi } from 'nem2-library' ;
17+ import { BlockchainRoutesApi , TransactionRoutesApi } from 'nem2-library' ;
1818import * as requestPromise from 'request-promise-native' ;
1919import { from as observableFrom , Observable , throwError as observableThrowError } from 'rxjs' ;
20- import { catchError , map } from 'rxjs/operators' ;
20+ import { catchError , map , mergeMap } from 'rxjs/operators' ;
2121import { PublicAccount } from '../model/account/PublicAccount' ;
2222import { CosignatureSignedTransaction } from '../model/transaction/CosignatureSignedTransaction' ;
2323import { Deadline } from '../model/transaction/Deadline' ;
2424import { SignedTransaction } from '../model/transaction/SignedTransaction' ;
2525import { SyncAnnounce } from '../model/transaction/SyncAnnounce' ;
2626import { Transaction } from '../model/transaction/Transaction' ;
2727import { TransactionAnnounceResponse } from '../model/transaction/TransactionAnnounceResponse' ;
28+ import { TransactionInfo } from '../model/transaction/TransactionInfo' ;
2829import { TransactionStatus } from '../model/transaction/TransactionStatus' ;
2930import { TransactionType } from '../model/transaction/TransactionType' ;
3031import { UInt64 } from '../model/UInt64' ;
@@ -44,13 +45,20 @@ export class TransactionHttp extends Http implements TransactionRepository {
4445 */
4546 private transactionRoutesApi : TransactionRoutesApi ;
4647
48+ /**
49+ * @internal
50+ * Nem2 Library blockchain routes api
51+ */
52+ private blockchainRoutesApi : BlockchainRoutesApi ;
53+
4754 /**
4855 * Constructor
4956 * @param url
5057 */
5158 constructor ( private readonly url : string ) {
5259 super ( url ) ;
5360 this . transactionRoutesApi = new TransactionRoutesApi ( this . apiClient ) ;
61+ this . blockchainRoutesApi = new BlockchainRoutesApi ( this . apiClient ) ;
5462 }
5563
5664 /**
@@ -190,4 +198,29 @@ export class TransactionHttp extends Http implements TransactionRepository {
190198 return observableThrowError ( err ) ;
191199 } ) ) ;
192200 }
201+
202+ /**
203+ * Gets a transaction's effective paid fee
204+ * @param transactionId - Transaction id or hash.
205+ * @returns Observable<number>
206+ */
207+ public getTransactionEffectiveFee ( transactionId : string ) : Observable < number > {
208+ return observableFrom ( this . transactionRoutesApi . getTransaction ( transactionId ) ) . pipe (
209+ mergeMap ( ( transactionDTO ) => {
210+ // parse transaction to take advantage of `size` getter overload
211+ const transaction = CreateTransactionFromDTO ( transactionDTO ) ;
212+ const uintHeight = ( transaction . transactionInfo as TransactionInfo ) . height ;
213+
214+ // now read block details
215+ return observableFrom ( this . blockchainRoutesApi . getBlockByHeight ( uintHeight . compact ( ) ) ) . pipe (
216+ map ( ( blockDTO ) => {
217+
218+ // @see https://nemtech.github.io/concepts/transaction.html#fees
219+ // effective_fee = feeMultiplier x transaction::size
220+ return blockDTO . block . feeMultiplier * transaction . size ;
221+ } ) ) ;
222+ } ) , catchError ( ( err ) => {
223+ return observableThrowError ( err ) ;
224+ } ) ) ;
225+ }
193226}
0 commit comments