Skip to content

Commit 77b43b3

Browse files
author
Grégory Saive
authored
Merge branch 'master' into task/g4_check_act_has_all_sosignatories
2 parents c37da2d + 8f36562 commit 77b43b3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1381
-153
lines changed

e2e/infrastructure/TransactionHttp.spec.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -874,4 +874,15 @@ describe('TransactionHttp', () => {
874874
});
875875
});
876876
});
877+
878+
describe('getTransactionEffectiveFee', () => {
879+
it('should return effective paid fee given transactionHash', (done) => {
880+
transactionHttp.getTransactionEffectiveFee(transactionHash)
881+
.subscribe((effectiveFee) => {
882+
expect(effectiveFee).to.not.be.undefined;
883+
expect(effectiveFee).to.be.equal(0);
884+
done();
885+
});
886+
});
887+
});
877888
});

e2e/infrastructure/TransactionUtils.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { MultisigCosignatoryModification } from '../../src/model/transaction/Mul
2828
import { MultisigCosignatoryModificationType } from '../../src/model/transaction/MultisigCosignatoryModificationType';
2929
import {PlainMessage} from '../../src/model/transaction/PlainMessage';
3030
import {TransferTransaction} from '../../src/model/transaction/TransferTransaction';
31+
import {UInt64} from '../../src/model/UInt64';
3132
import {CosignatoryAccount, MultisigAccount, NIS2_URL, TestingAccount} from '../../test/conf/conf.spec';
3233

3334
export class TransactionUtils {

src/infrastructure/BlockchainHttp.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import {UInt64} from '../model/UInt64';
2626
import {BlockchainRepository} from './BlockchainRepository';
2727
import {Http} from './Http';
2828
import {QueryParams} from './QueryParams';
29-
import {CreateTransactionFromDTO} from './transaction/CreateTransactionFromDTO';
29+
import {CreateTransactionFromDTO, extractBeneficiary} from './transaction/CreateTransactionFromDTO';
3030

3131
/**
3232
* Blockchain http repository.
@@ -70,8 +70,12 @@ export class BlockchainHttp extends Http implements BlockchainRepository {
7070
new UInt64(blockDTO.block.height),
7171
new UInt64(blockDTO.block.timestamp),
7272
new UInt64(blockDTO.block.difficulty),
73+
blockDTO.block.feeMultiplier,
7374
blockDTO.block.previousBlockHash,
7475
blockDTO.block.blockTransactionsHash,
76+
blockDTO.block.blockReceiptsHash,
77+
blockDTO.block.stateHash,
78+
extractBeneficiary(blockDTO, networkType),
7579
);
7680
}));
7781
}
@@ -116,8 +120,12 @@ export class BlockchainHttp extends Http implements BlockchainRepository {
116120
new UInt64(blockDTO.block.height),
117121
new UInt64(blockDTO.block.timestamp),
118122
new UInt64(blockDTO.block.difficulty),
123+
blockDTO.block.feeMultiplier,
119124
blockDTO.block.previousBlockHash,
120125
blockDTO.block.blockTransactionsHash,
126+
blockDTO.block.blockReceiptsHash,
127+
blockDTO.block.stateHash,
128+
extractBeneficiary(blockDTO, networkType),
121129
);
122130
});
123131
}));

src/infrastructure/Listener.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import * as WebSocket from 'ws';
2020
import {Address} from '../model/account/Address';
2121
import {PublicAccount} from '../model/account/PublicAccount';
2222
import {BlockInfo} from '../model/blockchain/BlockInfo';
23+
import {NetworkType} from '../model/blockchain/NetworkType';
2324
import {NamespaceId} from '../model/namespace/NamespaceId';
2425
import {AggregateTransaction} from '../model/transaction/AggregateTransaction';
2526
import {AggregateTransactionCosignature} from '../model/transaction/AggregateTransactionCosignature';
@@ -33,7 +34,7 @@ import {Transaction} from '../model/transaction/Transaction';
3334
import {TransactionStatusError} from '../model/transaction/TransactionStatusError';
3435
import {TransferTransaction} from '../model/transaction/TransferTransaction';
3536
import {UInt64} from '../model/UInt64';
36-
import {CreateTransactionFromDTO} from './transaction/CreateTransactionFromDTO';
37+
import {CreateTransactionFromDTO, extractBeneficiary} from './transaction/CreateTransactionFromDTO';
3738

3839
enum ListenerChannelName {
3940
block = 'block',
@@ -135,8 +136,12 @@ export class Listener {
135136
new UInt64(message.block.height),
136137
new UInt64(message.block.timestamp),
137138
new UInt64(message.block.difficulty),
139+
message.block.feeMultiplier,
138140
message.block.previousBlockHash,
139141
message.block.blockTransactionsHash,
142+
message.block.blockReceiptsHash,
143+
message.block.stateHash,
144+
extractBeneficiary(message, networkType), // passing `message` as `blockDTO`
140145
),
141146
});
142147
} else if (message.status) {

src/infrastructure/TransactionHttp.ts

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,18 @@
1414
* limitations under the License.
1515
*/
1616

17-
import {TransactionRoutesApi} from 'nem2-library';
17+
import {BlockchainRoutesApi, TransactionRoutesApi} from 'nem2-library';
1818
import * as requestPromise from 'request-promise-native';
1919
import {from as observableFrom, Observable, throwError as observableThrowError} from 'rxjs';
20-
import {catchError, map} from 'rxjs/operators';
20+
import {catchError, map, mergeMap} from 'rxjs/operators';
2121
import {PublicAccount} from '../model/account/PublicAccount';
2222
import {CosignatureSignedTransaction} from '../model/transaction/CosignatureSignedTransaction';
2323
import {Deadline} from '../model/transaction/Deadline';
2424
import {SignedTransaction} from '../model/transaction/SignedTransaction';
2525
import { SyncAnnounce } from '../model/transaction/SyncAnnounce';
2626
import {Transaction} from '../model/transaction/Transaction';
2727
import {TransactionAnnounceResponse} from '../model/transaction/TransactionAnnounceResponse';
28+
import {TransactionInfo} from '../model/transaction/TransactionInfo';
2829
import {TransactionStatus} from '../model/transaction/TransactionStatus';
2930
import {TransactionType} from '../model/transaction/TransactionType';
3031
import {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
}

src/infrastructure/TransactionRepository.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,13 @@ export interface TransactionRepository {
5656
*/
5757
getTransactionsStatuses(transactionHashes: string[]): Observable<TransactionStatus[]>;
5858

59+
/**
60+
* Gets a transaction's effective paid fee
61+
* @param transactionId - Transaction id or hash.
62+
* @returns Observable<number>
63+
*/
64+
getTransactionEffectiveFee(transactionId: string): Observable<number>;
65+
5966
/**
6067
* Send a signed transaction
6168
* @param signedTransaction - Signed transaction

0 commit comments

Comments
 (0)