From 49ad272268968996bdf3f4f9ad1bd2595d751ae4 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Mon, 8 Jul 2019 22:45:10 +0100 Subject: [PATCH 01/15] Added #195 fixed compatibility issue on new rxjs version --- src/infrastructure/AccountHttp.ts | 220 +++++++++++------- src/infrastructure/BlockHttp.ts | 159 +++++++------ src/infrastructure/ChainHttp.ts | 31 ++- src/infrastructure/DiagnosticHttp.ts | 35 +-- src/infrastructure/Http.ts | 8 + src/infrastructure/MosaicHttp.ts | 152 ++++++------ src/infrastructure/NamespaceHttp.ts | 97 +++++--- src/infrastructure/NetworkHttp.ts | 23 +- src/infrastructure/NodeHttp.ts | 42 ++-- src/infrastructure/TransactionHttp.ts | 69 ++++-- src/infrastructure/api/accountRoutesApi.ts | 84 ++----- src/infrastructure/api/blockRoutesApi.ts | 42 +--- src/infrastructure/api/chainRoutesApi.ts | 14 +- src/infrastructure/api/diagnosticRoutesApi.ts | 14 +- src/infrastructure/api/mosaicRoutesApi.ts | 21 +- src/infrastructure/api/namespaceRoutesApi.ts | 28 +-- src/infrastructure/api/networkRoutesApi.ts | 7 +- src/infrastructure/api/nodeRoutesApi.ts | 14 +- .../api/transactionRoutesApi.ts | 49 ++-- .../templates/api-single.mustache | 7 +- 20 files changed, 580 insertions(+), 536 deletions(-) diff --git a/src/infrastructure/AccountHttp.ts b/src/infrastructure/AccountHttp.ts index 6ef6ba3fae..aed431fd19 100644 --- a/src/infrastructure/AccountHttp.ts +++ b/src/infrastructure/AccountHttp.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import {from as observableFrom, Observable} from 'rxjs'; -import {map, mergeMap} from 'rxjs/operators'; +import { ClientResponse } from 'http'; +import {from as observableFrom, Observable, throwError} from 'rxjs'; +import {catchError, map, mergeMap} from 'rxjs/operators'; import { DtoMapping } from '../core/utils/DtoMapping'; import {AccountInfo} from '../model/account/AccountInfo'; import { AccountNames } from '../model/account/AccountNames'; @@ -34,7 +35,6 @@ import {UInt64} from '../model/UInt64'; import {AccountRepository} from './AccountRepository'; import { AccountInfoDTO, AccountNamesDTO, - AccountRestrictionsDTO, AccountRestrictionsInfoDTO, AccountRoutesApi, MosaicDTO, @@ -75,21 +75,25 @@ export class AccountHttp extends Http implements AccountRepository { * @returns Observable */ public getAccountInfo(address: Address): Observable { - return observableFrom(this.accountRoutesApi.getAccountInfo(address.plain())).pipe(map((accountInfoDTO: AccountInfoDTO) => { - return new AccountInfo( - accountInfoDTO.meta, - Address.createFromEncoded(accountInfoDTO.account.address), - new UInt64(accountInfoDTO.account.addressHeight), - accountInfoDTO.account.publicKey, - new UInt64(accountInfoDTO.account.publicKeyHeight), - accountInfoDTO.account.mosaics.map((mosaicDTO) => new Mosaic( - new MosaicId(mosaicDTO.id), - new UInt64(mosaicDTO.amount), - )), - new UInt64(accountInfoDTO.account.importance), - new UInt64(accountInfoDTO.account.importanceHeight), - ); - })); + return observableFrom(this.accountRoutesApi.getAccountInfo(address.plain())).pipe( + map((response: { response: ClientResponse; body: AccountInfoDTO; }) => { + const accountInfoDTO = response.body; + return new AccountInfo( + accountInfoDTO.meta, + Address.createFromEncoded(accountInfoDTO.account.address), + new UInt64(accountInfoDTO.account.addressHeight), + accountInfoDTO.account.publicKey, + new UInt64(accountInfoDTO.account.publicKeyHeight), + accountInfoDTO.account.mosaics.map((mosaicDTO) => new Mosaic( + new MosaicId(mosaicDTO.id), + new UInt64(mosaicDTO.amount), + )), + new UInt64(accountInfoDTO.account.importance), + new UInt64(accountInfoDTO.account.importanceHeight), + ); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } /** @@ -99,9 +103,12 @@ export class AccountHttp extends Http implements AccountRepository { */ public getAccountRestrictions(address: Address): Observable { return observableFrom(this.accountRoutesApi.getAccountRestrictions(address.plain())) - .pipe(map((accountRestrictions: AccountRestrictionsInfoDTO) => { - return DtoMapping.extractAccountRestrictionFromDto(accountRestrictions); - })); + .pipe(map((response: { response: ClientResponse; body: AccountRestrictionsInfoDTO; }) => { + const accountRestrictions = response.body; + return DtoMapping.extractAccountRestrictionFromDto(accountRestrictions); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } /** @@ -115,11 +122,14 @@ export class AccountHttp extends Http implements AccountRepository { }; return observableFrom( this.accountRoutesApi.getAccountRestrictionsFromAccounts(accountIds)) - .pipe(map((accountRestrictions: AccountRestrictionsDTO[]) => { - return accountRestrictions.map((restriction) => { - return DtoMapping.extractAccountRestrictionFromDto(restriction); - }); - })); + .pipe(map((response: { response: ClientResponse; body: AccountRestrictionsInfoDTO[]; }) => { + const accountRestrictions = response.body; + return accountRestrictions.map((restriction) => { + return DtoMapping.extractAccountRestrictionFromDto(restriction); + }); + }), + catchError((error) => throwError(error)), + ); } /** @@ -132,21 +142,25 @@ export class AccountHttp extends Http implements AccountRepository { addresses: addresses.map((address) => address.plain()), }; return observableFrom( - this.accountRoutesApi.getAccountsInfo(accountIdsBody)).pipe(map((accountsInfoMetaDataDTO: AccountInfoDTO[]) => { - return accountsInfoMetaDataDTO.map((accountInfoDTO: AccountInfoDTO) => { - return new AccountInfo( - accountInfoDTO.meta, - Address.createFromEncoded(accountInfoDTO.account.address), - new UInt64(accountInfoDTO.account.addressHeight), - accountInfoDTO.account.publicKey, - new UInt64(accountInfoDTO.account.publicKeyHeight), - accountInfoDTO.account.mosaics.map((mosaicDTO: MosaicDTO) => - new Mosaic(new MosaicId(mosaicDTO.id), new UInt64(mosaicDTO.amount))), - new UInt64(accountInfoDTO.account.importance), - new UInt64(accountInfoDTO.account.importanceHeight), - ); - }); - })); + this.accountRoutesApi.getAccountsInfo(accountIdsBody)).pipe( + map((response: { response: ClientResponse; body: AccountInfoDTO[]; }) => { + const accountsInfoMetaDataDTO = response.body; + return accountsInfoMetaDataDTO.map((accountInfoDTO: AccountInfoDTO) => { + return new AccountInfo( + accountInfoDTO.meta, + Address.createFromEncoded(accountInfoDTO.account.address), + new UInt64(accountInfoDTO.account.addressHeight), + accountInfoDTO.account.publicKey, + new UInt64(accountInfoDTO.account.publicKeyHeight), + accountInfoDTO.account.mosaics.map((mosaicDTO: MosaicDTO) => + new Mosaic(new MosaicId(mosaicDTO.id), new UInt64(mosaicDTO.amount))), + new UInt64(accountInfoDTO.account.importance), + new UInt64(accountInfoDTO.account.importanceHeight), + ); + }); + }), + catchError((error) => throwError(error)), + ); } public getAccountsNames(addresses: Address[]): Observable { @@ -154,16 +168,20 @@ export class AccountHttp extends Http implements AccountRepository { addresses: addresses.map((address) => address.plain()), }; return observableFrom( - this.accountRoutesApi.getAccountsNames(accountIdsBody)).pipe(map((accountNames: AccountNamesDTO[]) => { - return accountNames.map((accountName) => { - return new AccountNames( - Address.createFromEncoded(accountName.address), - accountName.names.map((name) => { - return new NamespaceName(new NamespaceId(name), name); - }), - ); - }); - })); + this.accountRoutesApi.getAccountsNames(accountIdsBody)).pipe( + map((response: { response: ClientResponse; body: AccountNamesDTO[]; }) => { + const accountNames = response.body; + return accountNames.map((accountName) => { + return new AccountNames( + Address.createFromEncoded(accountName.address), + accountName.names.map((name) => { + return new NamespaceName(new NamespaceId(name), name); + }), + ); + }); + }), + catchError((error) => throwError(error)), + ); } /** * Gets a MultisigAccountInfo for an account. @@ -174,17 +192,20 @@ export class AccountHttp extends Http implements AccountRepository { return this.getNetworkTypeObservable().pipe( mergeMap((networkType) => observableFrom( this.accountRoutesApi.getAccountMultisig(address.plain())) - .pipe(map((multisigAccountInfoDTO: MultisigAccountInfoDTO) => { - return new MultisigAccountInfo( - PublicAccount.createFromPublicKey(multisigAccountInfoDTO.multisig.account, networkType), - multisigAccountInfoDTO.multisig.minApproval, - multisigAccountInfoDTO.multisig.minRemoval, - multisigAccountInfoDTO.multisig.cosignatories - .map((cosigner) => PublicAccount.createFromPublicKey(cosigner, networkType)), - multisigAccountInfoDTO.multisig.multisigAccounts - .map((multisigAccount) => PublicAccount.createFromPublicKey(multisigAccount, networkType)), - ); - })))); + .pipe(map((response: { response: ClientResponse; body: MultisigAccountInfoDTO; }) => { + const multisigAccountInfoDTO = response.body; + return new MultisigAccountInfo( + PublicAccount.createFromPublicKey(multisigAccountInfoDTO.multisig.account, networkType), + multisigAccountInfoDTO.multisig.minApproval, + multisigAccountInfoDTO.multisig.minRemoval, + multisigAccountInfoDTO.multisig.cosignatories + .map((cosigner) => PublicAccount.createFromPublicKey(cosigner, networkType)), + multisigAccountInfoDTO.multisig.multisigAccounts + .map((multisigAccount) => PublicAccount.createFromPublicKey(multisigAccount, networkType)), + ); + }), + catchError((error) => throwError(error)), + ))); } /** @@ -196,24 +217,28 @@ export class AccountHttp extends Http implements AccountRepository { return this.getNetworkTypeObservable().pipe( mergeMap((networkType) => observableFrom( this.accountRoutesApi.getAccountMultisigGraph(address.plain())) - .pipe(map((multisigAccountGraphInfosDTO: MultisigAccountGraphInfoDTO[]) => { - const multisigAccounts = new Map(); - multisigAccountGraphInfosDTO.map((multisigAccountGraphInfoDTO) => { - multisigAccounts.set(multisigAccountGraphInfoDTO.level, - multisigAccountGraphInfoDTO.multisigEntries.map((multisigAccountInfoDTO) => { - return new MultisigAccountInfo( - PublicAccount.createFromPublicKey(multisigAccountInfoDTO.multisig.account, networkType), - multisigAccountInfoDTO.multisig.minApproval, - multisigAccountInfoDTO.multisig.minRemoval, - multisigAccountInfoDTO.multisig.cosignatories - .map((cosigner) => PublicAccount.createFromPublicKey(cosigner, networkType)), - multisigAccountInfoDTO.multisig.multisigAccounts - .map((multisigAccountDTO) => PublicAccount.createFromPublicKey(multisigAccountDTO, networkType))); - }), - ); - }); - return new MultisigAccountGraphInfo(multisigAccounts); - })))); + .pipe(map((response: { response: ClientResponse; body: MultisigAccountGraphInfoDTO[]; }) => { + const multisigAccountGraphInfosDTO = response.body; + const multisigAccounts = new Map(); + multisigAccountGraphInfosDTO.map((multisigAccountGraphInfoDTO) => { + multisigAccounts.set(multisigAccountGraphInfoDTO.level, + multisigAccountGraphInfoDTO.multisigEntries.map((multisigAccountInfoDTO) => { + return new MultisigAccountInfo( + PublicAccount.createFromPublicKey(multisigAccountInfoDTO.multisig.account, networkType), + multisigAccountInfoDTO.multisig.minApproval, + multisigAccountInfoDTO.multisig.minRemoval, + multisigAccountInfoDTO.multisig.cosignatories + .map((cosigner) => PublicAccount.createFromPublicKey(cosigner, networkType)), + multisigAccountInfoDTO.multisig.multisigAccounts + .map((multisigAccountDTO) => + PublicAccount.createFromPublicKey(multisigAccountDTO, networkType))); + }), + ); + }); + return new MultisigAccountGraphInfo(multisigAccounts); + }), + catchError((error) => throwError(error)), + ))); } /** @@ -228,11 +253,14 @@ export class AccountHttp extends Http implements AccountRepository { this.queryParams(queryParams).pageSize, this.queryParams(queryParams).id, this.queryParams(queryParams).order)).pipe( - map((transactionsDTO: TransactionInfoDTO[]) => { + map((response: { response: ClientResponse; body: TransactionInfoDTO[]; }) => { + const transactionsDTO = response.body; return transactionsDTO.map((transactionDTO) => { return CreateTransactionFromDTO(transactionDTO); }); - })); + }), + catchError((error) => throwError(error)), + ); } /** @@ -248,11 +276,14 @@ export class AccountHttp extends Http implements AccountRepository { this.queryParams(queryParams).pageSize, this.queryParams(queryParams).id, this.queryParams(queryParams).order)).pipe( - map((transactionsDTO: TransactionInfoDTO[]) => { + map((response: { response: ClientResponse; body: TransactionInfoDTO[]; }) => { + const transactionsDTO = response.body; return transactionsDTO.map((transactionDTO) => { return CreateTransactionFromDTO(transactionDTO); }); - })); + }), + catchError((error) => throwError(error)), + ); } /** @@ -268,11 +299,14 @@ export class AccountHttp extends Http implements AccountRepository { this.queryParams(queryParams).pageSize, this.queryParams(queryParams).id, this.queryParams(queryParams).order)).pipe( - map((transactionsDTO: TransactionInfoDTO[]) => { + map((response: { response: ClientResponse; body: TransactionInfoDTO[]; }) => { + const transactionsDTO = response.body; return transactionsDTO.map((transactionDTO) => { return CreateTransactionFromDTO(transactionDTO); }); - })); + }), + catchError((error) => throwError(error)), + ); } /** @@ -289,11 +323,14 @@ export class AccountHttp extends Http implements AccountRepository { this.queryParams(queryParams).pageSize, this.queryParams(queryParams).id, this.queryParams(queryParams).order)).pipe( - map((transactionsDTO: TransactionInfoDTO[]) => { + map((response: { response: ClientResponse; body: TransactionInfoDTO[]; }) => { + const transactionsDTO = response.body; return transactionsDTO.map((transactionDTO) => { return CreateTransactionFromDTO(transactionDTO); }); - })); + }), + catchError((error) => throwError(error)), + ); } /** @@ -309,10 +346,13 @@ export class AccountHttp extends Http implements AccountRepository { this.queryParams(queryParams).pageSize, this.queryParams(queryParams).id, this.queryParams(queryParams).order)).pipe( - map((transactionsDTO: TransactionInfoDTO[]) => { + map((response: { response: ClientResponse; body: TransactionInfoDTO[]; }) => { + const transactionsDTO = response.body; return transactionsDTO.map((transactionDTO) => { return CreateTransactionFromDTO(transactionDTO) as AggregateTransaction; }); - })); + }), + catchError((error) => throwError(error)), + ); } } diff --git a/src/infrastructure/BlockHttp.ts b/src/infrastructure/BlockHttp.ts index f04089fb52..a6f4ce9bb8 100644 --- a/src/infrastructure/BlockHttp.ts +++ b/src/infrastructure/BlockHttp.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import {from as observableFrom, Observable} from 'rxjs'; -import {map, mergeMap} from 'rxjs/operators'; +import { ClientResponse } from 'http'; +import {from as observableFrom, Observable, throwError} from 'rxjs'; +import {catchError, map, mergeMap} from 'rxjs/operators'; import {PublicAccount} from '../model/account/PublicAccount'; import {BlockInfo} from '../model/blockchain/BlockInfo'; import { MerklePathItem } from '../model/blockchain/MerklePathItem'; @@ -79,29 +80,33 @@ export class BlockHttp extends Http implements BlockRepository { * @returns Observable */ public getBlockByHeight(height: number): Observable { - return observableFrom(this.blockRoutesApi.getBlockByHeight(height)).pipe(map((blockDTO: BlockInfoDTO) => { - const networkType = parseInt((blockDTO.block.version as number).toString(16).substr(0, 2), 16); - return new BlockInfo( - blockDTO.meta.hash, - blockDTO.meta.generationHash, - new UInt64(blockDTO.meta.totalFee), - blockDTO.meta.numTransactions, - blockDTO.block.signature, - PublicAccount.createFromPublicKey(blockDTO.block.signer, networkType), - networkType, - parseInt((blockDTO.block.version as number).toString(16).substr(2, 2), 16), // Tx version - blockDTO.block.type, - new UInt64(blockDTO.block.height), - new UInt64(blockDTO.block.timestamp), - new UInt64(blockDTO.block.difficulty), - blockDTO.block.feeMultiplier, - blockDTO.block.previousBlockHash, - blockDTO.block.blockTransactionsHash, - blockDTO.block.blockReceiptsHash, - blockDTO.block.stateHash, - extractBeneficiary(blockDTO, networkType), - ); - })); + return observableFrom(this.blockRoutesApi.getBlockByHeight(height)).pipe( + map((response: { response: ClientResponse; body: BlockInfoDTO; } ) => { + const blockDTO = response.body; + const networkType = parseInt((blockDTO.block.version as number).toString(16).substr(0, 2), 16); + return new BlockInfo( + blockDTO.meta.hash, + blockDTO.meta.generationHash, + new UInt64(blockDTO.meta.totalFee), + blockDTO.meta.numTransactions, + blockDTO.block.signature, + PublicAccount.createFromPublicKey(blockDTO.block.signer, networkType), + networkType, + parseInt((blockDTO.block.version as number).toString(16).substr(2, 2), 16), // Tx version + blockDTO.block.type, + new UInt64(blockDTO.block.height), + new UInt64(blockDTO.block.timestamp), + new UInt64(blockDTO.block.difficulty), + blockDTO.block.feeMultiplier, + blockDTO.block.previousBlockHash, + blockDTO.block.blockTransactionsHash, + blockDTO.block.blockReceiptsHash, + blockDTO.block.stateHash, + extractBeneficiary(blockDTO, networkType), + ); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } /** @@ -117,11 +122,14 @@ export class BlockHttp extends Http implements BlockRepository { this.queryParams(queryParams).pageSize, this.queryParams(queryParams).id, this.queryParams(queryParams).order)) - .pipe(map((transactionsDTO: TransactionInfoDTO[]) => { + .pipe(map((response: { response: ClientResponse; body: TransactionInfoDTO[]; }) => { + const transactionsDTO = response.body; return transactionsDTO.map((transactionDTO) => { return CreateTransactionFromDTO(transactionDTO); }); - })); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } /** @@ -132,31 +140,35 @@ export class BlockHttp extends Http implements BlockRepository { */ public getBlocksByHeightWithLimit(height: number, limit: LimitType = LimitType.N_25): Observable { return observableFrom( - this.blockRoutesApi.getBlocksByHeightWithLimit(height, limit)).pipe(map((blocksDTO: BlockInfoDTO[]) => { - return blocksDTO.map((blockDTO) => { - const networkType = parseInt((blockDTO.block.version as number).toString(16).substr(0, 2), 16); - return new BlockInfo( - blockDTO.meta.hash, - blockDTO.meta.generationHash, - new UInt64(blockDTO.meta.totalFee), - blockDTO.meta.numTransactions, - blockDTO.block.signature, - PublicAccount.createFromPublicKey(blockDTO.block.signer, networkType), - networkType, - parseInt((blockDTO.block.version as number).toString(16).substr(2, 2), 16), // Tx version - blockDTO.block.type, - new UInt64(blockDTO.block.height), - new UInt64(blockDTO.block.timestamp), - new UInt64(blockDTO.block.difficulty), - blockDTO.block.feeMultiplier, - blockDTO.block.previousBlockHash, - blockDTO.block.blockTransactionsHash, - blockDTO.block.blockReceiptsHash, - blockDTO.block.stateHash, - extractBeneficiary(blockDTO, networkType), - ); - }); - })); + this.blockRoutesApi.getBlocksByHeightWithLimit(height, limit)).pipe( + map((response: { response: ClientResponse; body: BlockInfoDTO[]; }) => { + const blocksDTO = response.body; + return blocksDTO.map((blockDTO) => { + const networkType = parseInt((blockDTO.block.version as number).toString(16).substr(0, 2), 16); + return new BlockInfo( + blockDTO.meta.hash, + blockDTO.meta.generationHash, + new UInt64(blockDTO.meta.totalFee), + blockDTO.meta.numTransactions, + blockDTO.block.signature, + PublicAccount.createFromPublicKey(blockDTO.block.signer, networkType), + networkType, + parseInt((blockDTO.block.version as number).toString(16).substr(2, 2), 16), // Tx version + blockDTO.block.type, + new UInt64(blockDTO.block.height), + new UInt64(blockDTO.block.timestamp), + new UInt64(blockDTO.block.difficulty), + blockDTO.block.feeMultiplier, + blockDTO.block.previousBlockHash, + blockDTO.block.blockTransactionsHash, + blockDTO.block.blockReceiptsHash, + blockDTO.block.stateHash, + extractBeneficiary(blockDTO, networkType), + ); + }); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } /** @@ -171,14 +183,18 @@ export class BlockHttp extends Http implements BlockRepository { */ public getMerkleReceipts(height: number, hash: string): Observable { return observableFrom( - this.blockRoutesApi.getMerkleReceipts(height, hash)).pipe(map((merkleProofReceipt: MerkleProofInfoDTO) => { - return new MerkleProofInfo( - new MerkleProofInfoPayload( - merkleProofReceipt.payload.merklePath!.map( - (payload) => new MerklePathItem(payload.position, payload.hash))), - merkleProofReceipt.type, - ); - })); + this.blockRoutesApi.getMerkleReceipts(height, hash)).pipe( + map((response: { response: ClientResponse; body: MerkleProofInfoDTO; } ) => { + const merkleProofReceipt = response.body; + return new MerkleProofInfo( + new MerkleProofInfoPayload( + merkleProofReceipt.payload.merklePath!.map( + (payload) => new MerklePathItem(payload.position, payload.hash))), + merkleProofReceipt.type, + ); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } /** @@ -193,13 +209,18 @@ export class BlockHttp extends Http implements BlockRepository { */ public getMerkleTransaction(height: number, hash: string): Observable { return observableFrom( - this.blockRoutesApi.getMerkleReceipts(height, hash)).pipe(map((merkleProofTransaction: MerkleProofInfoDTO) => { - return new MerkleProofInfo( - new MerkleProofInfoPayload( - merkleProofTransaction.payload.merklePath!.map((payload) => new MerklePathItem(payload.position, payload.hash))), - merkleProofTransaction.type, - ); - })); + this.blockRoutesApi.getMerkleReceipts(height, hash)).pipe( + map((response: { response: ClientResponse; body: MerkleProofInfoDTO; } ) => { + const merkleProofTransaction = response.body; + return new MerkleProofInfo( + new MerkleProofInfoPayload( + merkleProofTransaction.payload.merklePath!.map((payload) => + new MerklePathItem(payload.position, payload.hash))), + merkleProofTransaction.type, + ); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } /** @@ -212,9 +233,11 @@ export class BlockHttp extends Http implements BlockRepository { return this.getNetworkTypeObservable().pipe( mergeMap((networkType) => observableFrom( this.blockRoutesApi.getBlockReceipts(height)).pipe( - map((receiptDTO: StatementsDTO) => { + map((response: { response: ClientResponse; body: StatementsDTO; }) => { + const receiptDTO = response.body; return CreateStatementFromDTO(receiptDTO, networkType); }), + catchError((error) => throwError(this.errorHandling(error))), ), ), ); diff --git a/src/infrastructure/ChainHttp.ts b/src/infrastructure/ChainHttp.ts index c791b69297..5b32953b6f 100644 --- a/src/infrastructure/ChainHttp.ts +++ b/src/infrastructure/ChainHttp.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import {from as observableFrom, Observable} from 'rxjs'; -import {map} from 'rxjs/operators'; +import { ClientResponse } from 'http'; +import {from as observableFrom, Observable, throwError} from 'rxjs'; +import {catchError, map} from 'rxjs/operators'; import {BlockchainScore} from '../model/blockchain/BlockchainScore'; import {UInt64} from '../model/UInt64'; import { BlockchainScoreDTO, @@ -50,9 +51,13 @@ export class ChainHttp extends Http implements ChainRepository { * @returns Observable */ public getBlockchainHeight(): Observable { - return observableFrom(this.chainRoutesApi.getBlockchainHeight()).pipe(map((heightDTO: HeightInfoDTO) => { - return new UInt64(heightDTO.height); - })); + return observableFrom(this.chainRoutesApi.getBlockchainHeight()).pipe( + map((response: { response: ClientResponse; body: HeightInfoDTO; } ) => { + const heightDTO = response.body; + return new UInt64(heightDTO.height); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } /** @@ -60,11 +65,15 @@ export class ChainHttp extends Http implements ChainRepository { * @returns Observable */ public getBlockchainScore(): Observable { - return observableFrom(this.chainRoutesApi.getBlockchainScore()).pipe(map((blockchainScoreDTO: BlockchainScoreDTO) => { - return new BlockchainScore( - new UInt64(blockchainScoreDTO.scoreLow), - new UInt64(blockchainScoreDTO.scoreHigh), - ); - })); + return observableFrom(this.chainRoutesApi.getBlockchainScore()).pipe( + map((response: { response: ClientResponse; body: BlockchainScoreDTO; } ) => { + const blockchainScoreDTO = response.body; + return new BlockchainScore( + new UInt64(blockchainScoreDTO.scoreLow), + new UInt64(blockchainScoreDTO.scoreHigh), + ); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } } diff --git a/src/infrastructure/DiagnosticHttp.ts b/src/infrastructure/DiagnosticHttp.ts index be17dbcf5e..0af049602a 100644 --- a/src/infrastructure/DiagnosticHttp.ts +++ b/src/infrastructure/DiagnosticHttp.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import {from as observableFrom, Observable} from 'rxjs'; -import {map} from 'rxjs/operators'; +import { ClientResponse } from 'http'; +import {from as observableFrom, Observable, throwError} from 'rxjs'; +import {catchError, map} from 'rxjs/operators'; import {BlockchainStorageInfo} from '../model/blockchain/BlockchainStorageInfo'; import { ServerInfo } from '../model/diagnostic/ServerInfo'; import { DiagnosticRoutesApi, ServerDTO, StorageInfoDTO } from './api'; @@ -49,13 +50,17 @@ export class DiagnosticHttp extends Http implements DiagnosticRepository { */ public getDiagnosticStorage(): Observable { return observableFrom( - this.diagnosticRoutesApi.getDiagnosticStorage()).pipe(map((blockchainStorageInfoDTO: StorageInfoDTO) => { - return new BlockchainStorageInfo( - blockchainStorageInfoDTO.numBlocks, - blockchainStorageInfoDTO.numTransactions, - blockchainStorageInfoDTO.numAccounts, - ); - })); + this.diagnosticRoutesApi.getDiagnosticStorage()).pipe( + map((response: { response: ClientResponse; body: StorageInfoDTO; } ) => { + const blockchainStorageInfoDTO = response.body; + return new BlockchainStorageInfo( + blockchainStorageInfoDTO.numBlocks, + blockchainStorageInfoDTO.numTransactions, + blockchainStorageInfoDTO.numAccounts, + ); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } /** @@ -64,9 +69,13 @@ export class DiagnosticHttp extends Http implements DiagnosticRepository { */ public getServerInfo(): Observable { return observableFrom( - this.diagnosticRoutesApi.getServerInfo()).pipe(map((serverDTO: ServerDTO) => { - return new ServerInfo(serverDTO.serverInfo.restVersion, - serverDTO.serverInfo.sdkVersion); - })); + this.diagnosticRoutesApi.getServerInfo()).pipe( + map((response: { response: ClientResponse; body: ServerDTO; } ) => { + const serverDTO = response.body; + return new ServerInfo(serverDTO.serverInfo.restVersion, + serverDTO.serverInfo.sdkVersion); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } } diff --git a/src/infrastructure/Http.ts b/src/infrastructure/Http.ts index 7185797d17..2a94ac1a66 100644 --- a/src/infrastructure/Http.ts +++ b/src/infrastructure/Http.ts @@ -57,4 +57,12 @@ export abstract class Http { order: queryParams ? queryParams.order : undefined, }; } + + errorHandling(error: any): Error { + const formattedError = { + statusCode: error.response.statusCode, + errorDetails: error.response.body, + }; + return new Error(JSON.stringify(formattedError)); + } } diff --git a/src/infrastructure/MosaicHttp.ts b/src/infrastructure/MosaicHttp.ts index 1d56765c0b..104aee210b 100644 --- a/src/infrastructure/MosaicHttp.ts +++ b/src/infrastructure/MosaicHttp.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import {from as observableFrom, Observable} from 'rxjs'; -import {map, mergeMap} from 'rxjs/operators'; +import { ClientResponse } from 'http'; +import {from as observableFrom, Observable, throwError} from 'rxjs'; +import {catchError, map, mergeMap} from 'rxjs/operators'; import {PublicAccount} from '../model/account/PublicAccount'; import {MosaicId} from '../model/mosaic/MosaicId'; import {MosaicInfo} from '../model/mosaic/MosaicInfo'; @@ -61,33 +62,38 @@ export class MosaicHttp extends Http implements MosaicRepository { public getMosaic(mosaicId: MosaicId): Observable { return this.getNetworkTypeObservable().pipe( mergeMap((networkType) => observableFrom( - this.mosaicRoutesApi.getMosaic(mosaicId.toHex())).pipe(map((mosaicInfoDTO: MosaicInfoDTO) => { - let mosaicFlag; - let divisibility; - let duration; - if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.MosaicFlags].value) { - mosaicFlag = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.MosaicFlags].value; - } - if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value) { - divisibility = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value; - } - if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Duration].value) { - duration = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value; - } - return new MosaicInfo( - mosaicInfoDTO.meta.id, - new MosaicId(mosaicInfoDTO.mosaic.mosaicId), - new UInt64(mosaicInfoDTO.mosaic.supply), - new UInt64(mosaicInfoDTO.mosaic.height), - PublicAccount.createFromPublicKey(mosaicInfoDTO.mosaic.owner, networkType), - mosaicInfoDTO.mosaic.revision, - new MosaicProperties( - mosaicFlag ? new UInt64(mosaicFlag) : UInt64.fromUint(0), - (divisibility ? new UInt64(divisibility) : UInt64.fromUint(0)).compact(), - duration ? new UInt64(duration) : undefined, - ), - ); - })))); + this.mosaicRoutesApi.getMosaic(mosaicId.toHex())).pipe( + map((response: { response: ClientResponse; body: MosaicInfoDTO; } ) => { + const mosaicInfoDTO = response.body; + let mosaicFlag; + let divisibility; + let duration; + if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.MosaicFlags].value) { + mosaicFlag = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.MosaicFlags].value; + } + if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value) { + divisibility = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value; + } + if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Duration].value) { + duration = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value; + } + return new MosaicInfo( + mosaicInfoDTO.meta.id, + new MosaicId(mosaicInfoDTO.mosaic.mosaicId), + new UInt64(mosaicInfoDTO.mosaic.supply), + new UInt64(mosaicInfoDTO.mosaic.height), + PublicAccount.createFromPublicKey(mosaicInfoDTO.mosaic.owner, networkType), + mosaicInfoDTO.mosaic.revision, + new MosaicProperties( + mosaicFlag ? new UInt64(mosaicFlag) : UInt64.fromUint(0), + (divisibility ? new UInt64(divisibility) : UInt64.fromUint(0)).compact(), + duration ? new UInt64(duration) : undefined, + ), + ); + }), + catchError((error) => throwError(this.errorHandling(error))), + )), + ); } /** @@ -101,35 +107,41 @@ export class MosaicHttp extends Http implements MosaicRepository { }; return this.getNetworkTypeObservable().pipe( mergeMap((networkType) => observableFrom( - this.mosaicRoutesApi.getMosaics(mosaicIdsBody)).pipe(map((mosaicInfosDTO: MosaicInfoDTO[]) => { - return mosaicInfosDTO.map((mosaicInfoDTO) => { - let mosaicFlag; - let divisibility; - let duration; - if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.MosaicFlags].value) { - mosaicFlag = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.MosaicFlags].value; - } - if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value) { - divisibility = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value; - } - if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Duration].value) { - duration = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Duration].value; - } - return new MosaicInfo( - mosaicInfoDTO.meta.id, - new MosaicId(mosaicInfoDTO.mosaic.mosaicId), - new UInt64(mosaicInfoDTO.mosaic.supply), - new UInt64(mosaicInfoDTO.mosaic.height), - PublicAccount.createFromPublicKey(mosaicInfoDTO.mosaic.owner, networkType), - mosaicInfoDTO.mosaic.revision, - new MosaicProperties( - mosaicFlag ? new UInt64(mosaicFlag) : UInt64.fromUint(0), - (divisibility ? new UInt64(divisibility) : UInt64.fromUint(0)).compact(), - duration ? new UInt64(duration) : undefined, - ), - ); - }); - })))); + this.mosaicRoutesApi.getMosaics(mosaicIdsBody)).pipe( + map((response: { response: ClientResponse; body: MosaicInfoDTO[]; }) => { + const mosaicInfosDTO = response.body; + return mosaicInfosDTO.map((mosaicInfoDTO) => { + let mosaicFlag; + let divisibility; + let duration; + if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.MosaicFlags].value) { + mosaicFlag = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.MosaicFlags].value; + } + if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value) { + divisibility = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value; + } + if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Duration].value) { + duration = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Duration].value; + } + return new MosaicInfo( + mosaicInfoDTO.meta.id, + new MosaicId(mosaicInfoDTO.mosaic.mosaicId), + new UInt64(mosaicInfoDTO.mosaic.supply), + new UInt64(mosaicInfoDTO.mosaic.height), + PublicAccount.createFromPublicKey(mosaicInfoDTO.mosaic.owner, networkType), + mosaicInfoDTO.mosaic.revision, + new MosaicProperties( + mosaicFlag ? new UInt64(mosaicFlag) : UInt64.fromUint(0), + (divisibility ? new UInt64(divisibility) : UInt64.fromUint(0)).compact(), + duration ? new UInt64(duration) : undefined, + ), + ); + }); + }), + catchError((error) => throwError(this.errorHandling(error))), + ), + ), + ); } /** @@ -143,15 +155,19 @@ export class MosaicHttp extends Http implements MosaicRepository { mosaicIds: mosaicIds.map((id) => id.toHex()), }; return observableFrom( - this.mosaicRoutesApi.getMosaicsNames(mosaicIdsBody)).pipe(map((mosaics: MosaicNamesDTO[]) => { - return mosaics.map((mosaic) => { - return new MosaicNames( - new MosaicId(mosaic.mosaicId), - mosaic.names.map((name) => { - return new NamespaceName(new NamespaceId(name), name); - }), - ); - }); - })); + this.mosaicRoutesApi.getMosaicsNames(mosaicIdsBody)).pipe( + map((response: { response: ClientResponse; body: MosaicNamesDTO[]; }) => { + const mosaics = response.body; + return mosaics.map((mosaic) => { + return new MosaicNames( + new MosaicId(mosaic.mosaicId), + mosaic.names.map((name) => { + return new NamespaceName(new NamespaceId(name), name); + }), + ); + }); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } } diff --git a/src/infrastructure/NamespaceHttp.ts b/src/infrastructure/NamespaceHttp.ts index 64ad0e94af..4d695f44bc 100644 --- a/src/infrastructure/NamespaceHttp.ts +++ b/src/infrastructure/NamespaceHttp.ts @@ -13,8 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {from as observableFrom, Observable} from 'rxjs'; -import {map, mergeMap} from 'rxjs/operators'; +import { ClientResponse } from 'http'; +import {from as observableFrom, Observable, throwError} from 'rxjs'; +import {catchError, map, mergeMap} from 'rxjs/operators'; import {Convert as convert, RawAddress as AddressLibrary} from '../core/format'; import {Address} from '../model/account/Address'; import {PublicAccount} from '../model/account/PublicAccount'; @@ -65,21 +66,27 @@ export class NamespaceHttp extends Http implements NamespaceRepository { public getNamespace(namespaceId: NamespaceId): Observable { return this.getNetworkTypeObservable().pipe( mergeMap((networkType) => observableFrom( - this.namespaceRoutesApi.getNamespace(namespaceId.toHex())).pipe(map((namespaceInfoDTO: NamespaceInfoDTO) => { - return new NamespaceInfo( - namespaceInfoDTO.meta.active, - namespaceInfoDTO.meta.index, - namespaceInfoDTO.meta.id, - namespaceInfoDTO.namespace.type as number, - namespaceInfoDTO.namespace.depth, - this.extractLevels(namespaceInfoDTO.namespace), - new NamespaceId(namespaceInfoDTO.namespace.parentId), - PublicAccount.createFromPublicKey(namespaceInfoDTO.namespace.owner, networkType), - new UInt64(namespaceInfoDTO.namespace.startHeight), - new UInt64(namespaceInfoDTO.namespace.endHeight), - this.extractAlias(namespaceInfoDTO.namespace), - ); - })))); + this.namespaceRoutesApi.getNamespace(namespaceId.toHex())).pipe( + map((response: { response: ClientResponse; body: NamespaceInfoDTO; } ) => { + const namespaceInfoDTO = response.body; + return new NamespaceInfo( + namespaceInfoDTO.meta.active, + namespaceInfoDTO.meta.index, + namespaceInfoDTO.meta.id, + namespaceInfoDTO.namespace.type as number, + namespaceInfoDTO.namespace.depth, + this.extractLevels(namespaceInfoDTO.namespace), + new NamespaceId(namespaceInfoDTO.namespace.parentId), + PublicAccount.createFromPublicKey(namespaceInfoDTO.namespace.owner, networkType), + new UInt64(namespaceInfoDTO.namespace.startHeight), + new UInt64(namespaceInfoDTO.namespace.endHeight), + this.extractAlias(namespaceInfoDTO.namespace), + ); + }), + catchError((error) => throwError(this.errorHandling(error))), + ), + ), + ); } /** @@ -96,7 +103,8 @@ export class NamespaceHttp extends Http implements NamespaceRepository { this.queryParams(queryParams).pageSize, this.queryParams(queryParams).id, this.queryParams(queryParams).order)).pipe( - map((namespaceInfosDTO: NamespaceInfoDTO[]) => { + map((response: { response: ClientResponse; body: NamespaceInfoDTO[]; }) => { + const namespaceInfosDTO = response.body; return namespaceInfosDTO.map((namespaceInfoDTO) => { return new NamespaceInfo( namespaceInfoDTO.meta.active, @@ -112,7 +120,10 @@ export class NamespaceHttp extends Http implements NamespaceRepository { this.extractAlias(namespaceInfoDTO.namespace), ); }); - })))); + }), + catchError((error) => throwError(this.errorHandling(error))), + ), + )); } /** @@ -132,7 +143,8 @@ export class NamespaceHttp extends Http implements NamespaceRepository { this.queryParams(queryParams).pageSize, this.queryParams(queryParams).id, this.queryParams(queryParams).order)).pipe( - map((namespaceInfosDTO: NamespaceInfoDTO[]) => { + map((response: { response: ClientResponse; body: NamespaceInfoDTO[]; }) => { + const namespaceInfosDTO = response.body; return namespaceInfosDTO.map((namespaceInfoDTO) => { return new NamespaceInfo( namespaceInfoDTO.meta.active, @@ -148,7 +160,10 @@ export class NamespaceHttp extends Http implements NamespaceRepository { this.extractAlias(namespaceInfoDTO.namespace), ); }); - })))); + }), + catchError((error) => throwError(this.errorHandling(error))), + ), + )); } /** @@ -161,15 +176,19 @@ export class NamespaceHttp extends Http implements NamespaceRepository { namespaceIds: namespaceIds.map((id) => id.toHex()), }; return observableFrom( - this.namespaceRoutesApi.getNamespacesNames(namespaceIdsBody)).pipe(map((namespaceNamesDTO: NamespaceNameDTO[]) => { - return namespaceNamesDTO.map((namespaceNameDTO) => { - return new NamespaceName( - new NamespaceId(namespaceNameDTO.namespaceId), - namespaceNameDTO.name, - namespaceNameDTO.parentId ? new NamespaceId(namespaceNameDTO.parentId) : undefined, - ); - }); - })); + this.namespaceRoutesApi.getNamespacesNames(namespaceIdsBody)).pipe( + map((response: { response: ClientResponse; body: NamespaceNameDTO[]; } ) => { + const namespaceNamesDTO = response.body; + return namespaceNamesDTO.map((namespaceNameDTO) => { + return new NamespaceName( + new NamespaceId(namespaceNameDTO.namespaceId), + namespaceNameDTO.name, + namespaceNameDTO.parentId ? new NamespaceId(namespaceNameDTO.parentId) : undefined, + ); + }); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } /** @@ -181,8 +200,8 @@ export class NamespaceHttp extends Http implements NamespaceRepository { return this.getNetworkTypeObservable().pipe( mergeMap((networkType) => observableFrom( this.namespaceRoutesApi.getNamespace(namespaceId.toHex())).pipe( - map((namespaceInfoDTO: NamespaceInfoDTO) => { - + map((response: { response: ClientResponse; body: NamespaceInfoDTO; } ) => { + const namespaceInfoDTO = response.body; if (namespaceInfoDTO.namespace === undefined) { // forward catapult-rest error throw namespaceInfoDTO; @@ -194,7 +213,10 @@ export class NamespaceHttp extends Http implements NamespaceRepository { throw new Error('No mosaicId is linked to namespace \'' + namespaceInfoDTO.namespace.level0 + '\''); } return new MosaicId(namespaceInfoDTO.namespace.alias.mosaicId); - })))); + }), + catchError((error) => throwError(this.errorHandling(error))), + ), + )); } /** @@ -206,8 +228,8 @@ export class NamespaceHttp extends Http implements NamespaceRepository { return this.getNetworkTypeObservable().pipe( mergeMap((networkType) => observableFrom( this.namespaceRoutesApi.getNamespace(namespaceId.toHex())).pipe( - map((namespaceInfoDTO: NamespaceInfoDTO) => { - + map((response: { response: ClientResponse; body: NamespaceInfoDTO; } ) => { + const namespaceInfoDTO = response.body; if (namespaceInfoDTO.namespace === undefined) { // forward catapult-rest error throw namespaceInfoDTO; @@ -222,7 +244,10 @@ export class NamespaceHttp extends Http implements NamespaceRepository { const addressDecoded = namespaceInfoDTO.namespace.alias.address; const address = AddressLibrary.addressToString(convert.hexToUint8(addressDecoded)); return Address.createFromRawAddress(address); - })))); + }), + catchError((error) => throwError(this.errorHandling(error))), + ), + )); } private extractLevels(namespace: any): NamespaceId[] { diff --git a/src/infrastructure/NetworkHttp.ts b/src/infrastructure/NetworkHttp.ts index cbdc53ee9a..a635710304 100644 --- a/src/infrastructure/NetworkHttp.ts +++ b/src/infrastructure/NetworkHttp.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import {from as observableFrom, Observable} from 'rxjs'; -import {map} from 'rxjs/operators'; +import { ClientResponse } from 'http'; +import {from as observableFrom, Observable, throwError} from 'rxjs'; +import {catchError, map} from 'rxjs/operators'; import {NetworkType} from '../model/blockchain/NetworkType'; import { NetworkRoutesApi, NetworkTypeDTO } from './api'; import {Http} from './Http'; @@ -49,12 +50,16 @@ export class NetworkHttp extends Http implements NetworkRepository { * @return network type enum. */ public getNetworkType(): Observable { - return observableFrom(this.networkRoutesApi.getNetworkType()).pipe(map((networkTypeDTO: NetworkTypeDTO) => { - if (networkTypeDTO.name === 'mijinTest') { - return NetworkType.MIJIN_TEST; - } else { - throw new Error('network ' + networkTypeDTO.name + ' is not supported yet by the sdk'); - } - })); + return observableFrom(this.networkRoutesApi.getNetworkType()).pipe( + map((response: { response: ClientResponse; body: NetworkTypeDTO; } ) => { + const networkTypeDTO = response.body; + if (networkTypeDTO.name === 'mijinTest') { + return NetworkType.MIJIN_TEST; + } else { + throw new Error('network ' + networkTypeDTO.name + ' is not supported yet by the sdk'); + } + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } } diff --git a/src/infrastructure/NodeHttp.ts b/src/infrastructure/NodeHttp.ts index 7a29ea3388..81f81a8d25 100644 --- a/src/infrastructure/NodeHttp.ts +++ b/src/infrastructure/NodeHttp.ts @@ -14,8 +14,9 @@ * limitations under the License. */ -import {from as observableFrom, Observable} from 'rxjs'; -import {map} from 'rxjs/operators'; +import { ClientResponse } from 'http'; +import {from as observableFrom, Observable, throwError} from 'rxjs'; +import {catchError, map} from 'rxjs/operators'; import { NodeInfo } from '../model/node/NodeInfo'; import { NodeTime } from '../model/node/NodeTime'; import { NodeInfoDTO, NodeRoutesApi, NodeTimeDTO } from './api'; @@ -49,17 +50,21 @@ export class NodeHttp extends Http implements NodeRepository { * @summary Get the node information */ public getNodeInfo(): Observable { - return observableFrom(this.nodeRoutesApi.getNodeInfo()).pipe(map((nodeInfoDTO: NodeInfoDTO) => { - return new NodeInfo( - nodeInfoDTO.publicKey, - nodeInfoDTO.port, - nodeInfoDTO.networkIdentifier, - nodeInfoDTO.version, - nodeInfoDTO.roles as number, - nodeInfoDTO.host, - nodeInfoDTO.friendlyName, - ); - })); + return observableFrom(this.nodeRoutesApi.getNodeInfo()).pipe( + map((response: { response: ClientResponse; body: NodeInfoDTO; } ) => { + const nodeInfoDTO = response.body; + return new NodeInfo( + nodeInfoDTO.publicKey, + nodeInfoDTO.port, + nodeInfoDTO.networkIdentifier, + nodeInfoDTO.version, + nodeInfoDTO.roles as number, + nodeInfoDTO.host, + nodeInfoDTO.friendlyName, + ); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } /** @@ -67,8 +72,13 @@ export class NodeHttp extends Http implements NodeRepository { * @summary Get the node time */ public getNodeTime(): Observable { - return observableFrom(this.nodeRoutesApi.getNodeTime()).pipe(map((nodeTimeDTO: NodeTimeDTO) => { - return new NodeTime(nodeTimeDTO.communicationTimestamps.sendTimestamp, nodeTimeDTO.communicationTimestamps.receiveTimestamp); - })); + return observableFrom(this.nodeRoutesApi.getNodeTime()).pipe( + map((response: { response: ClientResponse; body: NodeTimeDTO; } ) => { + const nodeTimeDTO = response.body; + return new NodeTime(nodeTimeDTO.communicationTimestamps.sendTimestamp, + nodeTimeDTO.communicationTimestamps.receiveTimestamp); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } } diff --git a/src/infrastructure/TransactionHttp.ts b/src/infrastructure/TransactionHttp.ts index 332ada1e85..8c6455f6f9 100644 --- a/src/infrastructure/TransactionHttp.ts +++ b/src/infrastructure/TransactionHttp.ts @@ -14,8 +14,9 @@ * limitations under the License. */ +import { ClientResponse } from 'http'; import * as requestPromise from 'request-promise-native'; -import {from as observableFrom, Observable, throwError as observableThrowError} from 'rxjs'; +import {from as observableFrom, Observable, throwError} from 'rxjs'; import {catchError, map, mergeMap} from 'rxjs/operators'; import {PublicAccount} from '../model/account/PublicAccount'; import {CosignatureSignedTransaction} from '../model/transaction/CosignatureSignedTransaction'; @@ -86,11 +87,15 @@ export class TransactionHttp extends Http implements TransactionRepository { transactionIds, }; return observableFrom( - this.transactionRoutesApi.getTransactions(transactionIdsBody)).pipe(map((transactionsDTO: TransactionInfoDTO[]) => { - return transactionsDTO.map((transactionDTO) => { - return CreateTransactionFromDTO(transactionDTO); - }); - })); + this.transactionRoutesApi.getTransactions(transactionIdsBody)).pipe( + map((response: { response: ClientResponse; body: TransactionInfoDTO[]; } ) => { + const transactionsDTO = response.body; + return transactionsDTO.map((transactionDTO) => { + return CreateTransactionFromDTO(transactionDTO); + }); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } /** @@ -100,14 +105,17 @@ export class TransactionHttp extends Http implements TransactionRepository { */ public getTransactionStatus(transactionHash: string): Observable { return observableFrom(this.transactionRoutesApi.getTransactionStatus(transactionHash)).pipe( - map((transactionStatusDTO: TransactionStatusDTO) => { + map((response: { response: ClientResponse; body: TransactionStatusDTO; } ) => { + const transactionStatusDTO = response.body; return new TransactionStatus( transactionStatusDTO.status, transactionStatusDTO.group, transactionStatusDTO.hash, transactionStatusDTO.deadline ? Deadline.createFromDTO(transactionStatusDTO.deadline) : undefined, transactionStatusDTO.height ? new UInt64(transactionStatusDTO.height) : undefined); - })); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } /** @@ -121,7 +129,8 @@ export class TransactionHttp extends Http implements TransactionRepository { }; return observableFrom( this.transactionRoutesApi.getTransactionsStatuses(transactionHashesBody)).pipe( - map((transactionStatusesDTO: TransactionStatusDTO[]) => { + map((response: { response: ClientResponse; body: TransactionStatusDTO[]; }) => { + const transactionStatusesDTO = response.body; return transactionStatusesDTO.map((transactionStatusDTO) => { return new TransactionStatus( transactionStatusDTO.status, @@ -130,7 +139,9 @@ export class TransactionHttp extends Http implements TransactionRepository { transactionStatusDTO.deadline ? Deadline.createFromDTO(transactionStatusDTO.deadline) : undefined, transactionStatusDTO.height ? new UInt64(transactionStatusDTO.height) : undefined); }); - })); + }), + catchError((error) => throwError(error.error.errorMessage)), + ); } /** @@ -140,9 +151,12 @@ export class TransactionHttp extends Http implements TransactionRepository { */ public announce(signedTransaction: SignedTransaction): Observable { return observableFrom(this.transactionRoutesApi.announceTransaction(signedTransaction)).pipe( - map((transactionAnnounceResponseDTO: AnnounceTransactionInfoDTO) => { + map((response: { response: ClientResponse; body: AnnounceTransactionInfoDTO; } ) => { + const transactionAnnounceResponseDTO = response.body; return new TransactionAnnounceResponse(transactionAnnounceResponseDTO.message); - })); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } /** @@ -152,14 +166,15 @@ export class TransactionHttp extends Http implements TransactionRepository { */ public announceAggregateBonded(signedTransaction: SignedTransaction): Observable { if (signedTransaction.type !== TransactionType.AGGREGATE_BONDED) { - return observableFrom(new Promise((resolve, reject) => { - reject('Only Transaction Type 0x4241 is allowed for announce aggregate bonded'); - })); + throwError('Only Transaction Type 0x4241 is allowed for announce aggregate bonded'); } return observableFrom(this.transactionRoutesApi.announcePartialTransaction(signedTransaction)).pipe( - map((transactionAnnounceResponseDTO: AnnounceTransactionInfoDTO) => { + map((response: { response: ClientResponse; body: AnnounceTransactionInfoDTO; } ) => { + const transactionAnnounceResponseDTO = response.body; return new TransactionAnnounceResponse(transactionAnnounceResponseDTO.message); - })); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } /** @@ -170,9 +185,12 @@ export class TransactionHttp extends Http implements TransactionRepository { public announceAggregateBondedCosignature( cosignatureSignedTransaction: CosignatureSignedTransaction): Observable { return observableFrom(this.transactionRoutesApi.announceCosignatureTransaction(cosignatureSignedTransaction)).pipe( - map((transactionAnnounceResponseDTO: AnnounceTransactionInfoDTO) => { + map((response: { response: ClientResponse; body: AnnounceTransactionInfoDTO; } ) => { + const transactionAnnounceResponseDTO = response.body; return new TransactionAnnounceResponse(transactionAnnounceResponseDTO.message); - })); + }), + catchError((error) => throwError(this.errorHandling(error))), + ); } public announceSync(signedTx: SignedTransaction): Observable { @@ -198,9 +216,9 @@ export class TransactionHttp extends Http implements TransactionRepository { } }), catchError((err) => { if (err.statusCode === 405) { - return observableThrowError('non sync server'); + return throwError('non sync server'); } - return observableThrowError(err); + return throwError(err); })); } @@ -218,14 +236,15 @@ export class TransactionHttp extends Http implements TransactionRepository { // now read block details return observableFrom(this.blockRoutesApi.getBlockByHeight(uintHeight.compact())).pipe( - map((blockDTO: BlockInfoDTO) => { - + map((response: { response: ClientResponse; body: BlockInfoDTO; } ) => { + const blockDTO = response.body; // @see https://nemtech.github.io/concepts/transaction.html#fees // effective_fee = feeMultiplier x transaction::size return blockDTO.block.feeMultiplier * transaction.size; - })); + }), + catchError((error) => throwError(this.errorHandling(error)))); }), catchError((err) => { - return observableThrowError(err); + return throwError(err); })); } } diff --git a/src/infrastructure/api/accountRoutesApi.ts b/src/infrastructure/api/accountRoutesApi.ts index 529245b7a5..a4c378b15f 100644 --- a/src/infrastructure/api/accountRoutesApi.ts +++ b/src/infrastructure/api/accountRoutesApi.ts @@ -136,12 +136,9 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "AccountInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -193,12 +190,9 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "MultisigAccountInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -250,12 +244,9 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -307,12 +298,9 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "AccountRestrictionsInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -364,12 +352,9 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -421,12 +406,9 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -478,12 +460,9 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -550,12 +529,9 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -622,12 +598,9 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -694,12 +667,9 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -766,12 +736,9 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -838,12 +805,9 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); diff --git a/src/infrastructure/api/blockRoutesApi.ts b/src/infrastructure/api/blockRoutesApi.ts index 881fb16997..eafea7acf8 100644 --- a/src/infrastructure/api/blockRoutesApi.ts +++ b/src/infrastructure/api/blockRoutesApi.ts @@ -133,12 +133,9 @@ export class BlockRoutesApi { } else { body = ObjectSerializer.deserialize(body, "BlockInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -190,12 +187,9 @@ export class BlockRoutesApi { } else { body = ObjectSerializer.deserialize(body, "StatementsDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -257,12 +251,9 @@ export class BlockRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -321,12 +312,9 @@ export class BlockRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -385,12 +373,9 @@ export class BlockRoutesApi { } else { body = ObjectSerializer.deserialize(body, "MerkleProofInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -449,12 +434,9 @@ export class BlockRoutesApi { } else { body = ObjectSerializer.deserialize(body, "MerkleProofInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); diff --git a/src/infrastructure/api/chainRoutesApi.ts b/src/infrastructure/api/chainRoutesApi.ts index 4e0706620c..e2697992b4 100644 --- a/src/infrastructure/api/chainRoutesApi.ts +++ b/src/infrastructure/api/chainRoutesApi.ts @@ -124,12 +124,9 @@ export class ChainRoutesApi { } else { body = ObjectSerializer.deserialize(body, "HeightInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -174,12 +171,9 @@ export class ChainRoutesApi { } else { body = ObjectSerializer.deserialize(body, "BlockchainScoreDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); diff --git a/src/infrastructure/api/diagnosticRoutesApi.ts b/src/infrastructure/api/diagnosticRoutesApi.ts index e70a25623f..01daa002d8 100644 --- a/src/infrastructure/api/diagnosticRoutesApi.ts +++ b/src/infrastructure/api/diagnosticRoutesApi.ts @@ -124,12 +124,9 @@ export class DiagnosticRoutesApi { } else { body = ObjectSerializer.deserialize(body, "StorageInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -174,12 +171,9 @@ export class DiagnosticRoutesApi { } else { body = ObjectSerializer.deserialize(body, "ServerDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); diff --git a/src/infrastructure/api/mosaicRoutesApi.ts b/src/infrastructure/api/mosaicRoutesApi.ts index dfb0e36a8b..00e398b6b6 100644 --- a/src/infrastructure/api/mosaicRoutesApi.ts +++ b/src/infrastructure/api/mosaicRoutesApi.ts @@ -132,12 +132,9 @@ export class MosaicRoutesApi { } else { body = ObjectSerializer.deserialize(body, "MosaicInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -189,12 +186,9 @@ export class MosaicRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -246,12 +240,9 @@ export class MosaicRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); diff --git a/src/infrastructure/api/namespaceRoutesApi.ts b/src/infrastructure/api/namespaceRoutesApi.ts index 7ce0824c7b..9559ef2f13 100644 --- a/src/infrastructure/api/namespaceRoutesApi.ts +++ b/src/infrastructure/api/namespaceRoutesApi.ts @@ -133,12 +133,9 @@ export class NamespaceRoutesApi { } else { body = ObjectSerializer.deserialize(body, "NamespaceInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -200,12 +197,9 @@ export class NamespaceRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -267,12 +261,9 @@ export class NamespaceRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -324,12 +315,9 @@ export class NamespaceRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); diff --git a/src/infrastructure/api/networkRoutesApi.ts b/src/infrastructure/api/networkRoutesApi.ts index 1e9fa0422c..3c574d8c46 100644 --- a/src/infrastructure/api/networkRoutesApi.ts +++ b/src/infrastructure/api/networkRoutesApi.ts @@ -123,12 +123,9 @@ export class NetworkRoutesApi { } else { body = ObjectSerializer.deserialize(body, "NetworkTypeDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); diff --git a/src/infrastructure/api/nodeRoutesApi.ts b/src/infrastructure/api/nodeRoutesApi.ts index cd2b0ca19b..456a05ad64 100644 --- a/src/infrastructure/api/nodeRoutesApi.ts +++ b/src/infrastructure/api/nodeRoutesApi.ts @@ -124,12 +124,9 @@ export class NodeRoutesApi { } else { body = ObjectSerializer.deserialize(body, "NodeInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -174,12 +171,9 @@ export class NodeRoutesApi { } else { body = ObjectSerializer.deserialize(body, "NodeTimeDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); diff --git a/src/infrastructure/api/transactionRoutesApi.ts b/src/infrastructure/api/transactionRoutesApi.ts index 39618d7377..0a3abdd119 100644 --- a/src/infrastructure/api/transactionRoutesApi.ts +++ b/src/infrastructure/api/transactionRoutesApi.ts @@ -136,12 +136,9 @@ export class TransactionRoutesApi { } else { body = ObjectSerializer.deserialize(body, "AnnounceTransactionInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -193,12 +190,9 @@ export class TransactionRoutesApi { } else { body = ObjectSerializer.deserialize(body, "AnnounceTransactionInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -250,12 +244,9 @@ export class TransactionRoutesApi { } else { body = ObjectSerializer.deserialize(body, "AnnounceTransactionInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -307,12 +298,9 @@ export class TransactionRoutesApi { } else { body = ObjectSerializer.deserialize(body, "TransactionInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -364,12 +352,9 @@ export class TransactionRoutesApi { } else { body = ObjectSerializer.deserialize(body, "TransactionStatusDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -421,12 +406,9 @@ export class TransactionRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); @@ -478,12 +460,9 @@ export class TransactionRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); diff --git a/src/infrastructure/templates/api-single.mustache b/src/infrastructure/templates/api-single.mustache index c90274237c..9dd163676f 100755 --- a/src/infrastructure/templates/api-single.mustache +++ b/src/infrastructure/templates/api-single.mustache @@ -219,12 +219,9 @@ export class {{classname}} { body = ObjectSerializer.deserialize(body, "{{{returnType}}}"); {{/returnType}} if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve(body); + resolve({ response, body }); } else { - reject({ - statusCode: response.statusCode, - statusMessage: response.statusMessage - }); + reject({ response, body }); } } }); From 2e076db8742a6cd4b16d4d50650fa87850f8ae15 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Tue, 9 Jul 2019 09:56:52 +0100 Subject: [PATCH 02/15] Fixed error handling --- src/infrastructure/Http.ts | 13 ++++++++----- test/infrastructure/TransactionHttp.spec.ts | 1 - 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/infrastructure/Http.ts b/src/infrastructure/Http.ts index 2a94ac1a66..7df9e615ae 100644 --- a/src/infrastructure/Http.ts +++ b/src/infrastructure/Http.ts @@ -59,10 +59,13 @@ export abstract class Http { } errorHandling(error: any): Error { - const formattedError = { - statusCode: error.response.statusCode, - errorDetails: error.response.body, - }; - return new Error(JSON.stringify(formattedError)); + if (error.response && error.response.statusCode && error.response.body) { + const formattedError = { + statusCode: error.response.statusCode, + errorDetails: error.response.body, + }; + return new Error(JSON.stringify(formattedError)); + } + return new Error(error); } } diff --git a/test/infrastructure/TransactionHttp.spec.ts b/test/infrastructure/TransactionHttp.spec.ts index 5a45c7d440..d7ab93c3b3 100644 --- a/test/infrastructure/TransactionHttp.spec.ts +++ b/test/infrastructure/TransactionHttp.spec.ts @@ -49,7 +49,6 @@ describe('TransactionHttp', () => { return trnsHttp.announceAggregateBonded(signedTx) .toPromise() .then(() => { - throw new Error('Should be called'); }) .catch((reason) => { expect(reason.toString()).to.be.equal('Only Transaction Type 0x4241 is allowed for announce aggregate bonded'); From f75746e17a5ef30105e9e13a2237acbb2cf12808 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Wed, 10 Jul 2019 09:56:29 +0100 Subject: [PATCH 03/15] Fixed transactionHttp unit test --- src/infrastructure/TransactionHttp.ts | 2 +- test/infrastructure/TransactionHttp.spec.ts | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/infrastructure/TransactionHttp.ts b/src/infrastructure/TransactionHttp.ts index 8c6455f6f9..c96c863910 100644 --- a/src/infrastructure/TransactionHttp.ts +++ b/src/infrastructure/TransactionHttp.ts @@ -166,7 +166,7 @@ export class TransactionHttp extends Http implements TransactionRepository { */ public announceAggregateBonded(signedTransaction: SignedTransaction): Observable { if (signedTransaction.type !== TransactionType.AGGREGATE_BONDED) { - throwError('Only Transaction Type 0x4241 is allowed for announce aggregate bonded'); + throw new Error('Only Transaction Type 0x4241 is allowed for announce aggregate bonded'); } return observableFrom(this.transactionRoutesApi.announcePartialTransaction(signedTransaction)).pipe( map((response: { response: ClientResponse; body: AnnounceTransactionInfoDTO; } ) => { diff --git a/test/infrastructure/TransactionHttp.spec.ts b/test/infrastructure/TransactionHttp.spec.ts index d7ab93c3b3..40107dae10 100644 --- a/test/infrastructure/TransactionHttp.spec.ts +++ b/test/infrastructure/TransactionHttp.spec.ts @@ -46,12 +46,10 @@ describe('TransactionHttp', () => { const signedTx = account.sign(aggTx, generationHash); const trnsHttp = new TransactionHttp(NIS2_URL); - return trnsHttp.announceAggregateBonded(signedTx) + expect(() => { + trnsHttp.announceAggregateBonded(signedTx) .toPromise() - .then(() => { - }) - .catch((reason) => { - expect(reason.toString()).to.be.equal('Only Transaction Type 0x4241 is allowed for announce aggregate bonded'); - }); + .then(); + }).to.throw(Error, 'Only Transaction Type 0x4241 is allowed for announce aggregate bonded'); }); }); From 91227d7436f6b325848fb5098b265dadd2093f7a Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Fri, 12 Jul 2019 14:35:45 +0100 Subject: [PATCH 04/15] Added #166 Mosaic Restriction - Added `restrictable` in MosaicProperties - Added MosaicGlobalRestriction and MosaicAddressRestriction transactions - Added unit tests and e2e tests for the 2 new txs - Added serialization handlers - Fixed couple of serialization bugs with MosaicId --- e2e/infrastructure/TransactionHttp.spec.ts | 121 ++++ ...saicAddressRestrictionTransactionBuffer.ts | 625 +++++++++++++++++ ...osaicGlobalRestrictionTransactionBuffer.ts | 657 ++++++++++++++++++ .../MosaicAddressRestrictionTransaction.ts | 146 ++++ .../builders/MosaicCreationTransaction.ts | 4 +- .../MosaicGlobalRestrictionTransaction.ts | 159 +++++ ...saicAddressRestrictionTransactionSchema.ts | 46 ++ ...osaicGlobalRestrictionTransactionSchema.ts | 49 ++ .../transaction/CreateTransactionFromDTO.ts | 48 +- .../CreateTransactionFromPayload.ts | 50 +- .../transaction/SerializeTransactionToJSON.ts | 27 +- src/model/mosaic/MosaicId.ts | 4 +- src/model/mosaic/MosaicInfo.ts | 8 + src/model/mosaic/MosaicProperties.ts | 20 +- src/model/mosaic/MosaicRestrictionType.ts | 51 ++ .../MosaicAddressRestrictionTransaction.ts | 153 ++++ .../MosaicDefinitionTransaction.ts | 4 + .../MosaicGlobalRestrictionTransaction.ts | 176 +++++ src/model/transaction/TransactionType.ts | 12 + src/model/transaction/TransactionVersion.ts | 12 + src/service/MosaicService.ts | 2 +- test/core/utils/TransactionMapping.spec.ts | 114 ++- .../receipt/CreateReceiptFromDTO.spec.ts | 2 +- test/model/mosaic/MosaicAmountView.spec.ts | 1 + test/model/mosaic/MosaicInfo.spec.ts | 38 + test/model/mosaic/MosaicProperties.spec.ts | 2 + test/model/mosaic/MosaicView.spec.ts | 4 +- test/model/receipt/Receipt.spec.ts | 16 +- .../transaction/AggregateTransaction.spec.ts | 5 +- ...osaicAddressRestrictionTransaction.spec.ts | 59 ++ .../MosaicDefinitionTransaction.spec.ts | 8 +- ...MosaicGlobalRestrictionTransaction.spec.ts | 65 ++ 32 files changed, 2649 insertions(+), 39 deletions(-) create mode 100644 src/infrastructure/buffers/MosaicAddressRestrictionTransactionBuffer.ts create mode 100644 src/infrastructure/buffers/MosaicGlobalRestrictionTransactionBuffer.ts create mode 100644 src/infrastructure/builders/MosaicAddressRestrictionTransaction.ts create mode 100644 src/infrastructure/builders/MosaicGlobalRestrictionTransaction.ts create mode 100644 src/infrastructure/schemas/MosaicAddressRestrictionTransactionSchema.ts create mode 100644 src/infrastructure/schemas/MosaicGlobalRestrictionTransactionSchema.ts create mode 100644 src/model/mosaic/MosaicRestrictionType.ts create mode 100644 src/model/transaction/MosaicAddressRestrictionTransaction.ts create mode 100644 src/model/transaction/MosaicGlobalRestrictionTransaction.ts create mode 100644 test/model/transaction/MosaicAddressRestrictionTransaction.spec.ts create mode 100644 test/model/transaction/MosaicGlobalRestrictionTransaction.spec.ts diff --git a/e2e/infrastructure/TransactionHttp.spec.ts b/e2e/infrastructure/TransactionHttp.spec.ts index dbee30b256..a8a10f6596 100644 --- a/e2e/infrastructure/TransactionHttp.spec.ts +++ b/e2e/infrastructure/TransactionHttp.spec.ts @@ -31,6 +31,7 @@ import { Mosaic } from '../../src/model/mosaic/Mosaic'; import {MosaicId} from '../../src/model/mosaic/MosaicId'; import {MosaicNonce} from '../../src/model/mosaic/MosaicNonce'; import {MosaicProperties} from '../../src/model/mosaic/MosaicProperties'; +import { MosaicRestrictionType } from '../../src/model/mosaic/MosaicRestrictionType'; import {MosaicSupplyType} from '../../src/model/mosaic/MosaicSupplyType'; import {NetworkCurrencyMosaic} from '../../src/model/mosaic/NetworkCurrencyMosaic'; import { AliasActionType } from '../../src/model/namespace/AliasActionType'; @@ -49,13 +50,16 @@ import { HashLockTransaction } from '../../src/model/transaction/HashLockTransac import {HashType} from '../../src/model/transaction/HashType'; import { LinkAction } from '../../src/model/transaction/LinkAction'; import {LockFundsTransaction} from '../../src/model/transaction/LockFundsTransaction'; +import { MosaicAddressRestrictionTransaction } from '../../src/model/transaction/MosaicAddressRestrictionTransaction'; import { MosaicAliasTransaction } from '../../src/model/transaction/MosaicAliasTransaction'; import {MosaicDefinitionTransaction} from '../../src/model/transaction/MosaicDefinitionTransaction'; +import { MosaicGlobalRestrictionTransaction } from '../../src/model/transaction/MosaicGlobalRestrictionTransaction'; import {MosaicSupplyChangeTransaction} from '../../src/model/transaction/MosaicSupplyChangeTransaction'; import { PlainMessage } from '../../src/model/transaction/PlainMessage'; import {RegisterNamespaceTransaction} from '../../src/model/transaction/RegisterNamespaceTransaction'; import {SecretLockTransaction} from '../../src/model/transaction/SecretLockTransaction'; import {SecretProofTransaction} from '../../src/model/transaction/SecretProofTransaction'; +import { SignedTransaction } from '../../src/model/transaction/SignedTransaction'; import {Transaction} from '../../src/model/transaction/Transaction'; import {TransactionType} from '../../src/model/transaction/TransactionType'; import {TransferTransaction} from '../../src/model/transaction/TransferTransaction'; @@ -117,6 +121,7 @@ describe('TransactionHttp', () => { }); }); }); + describe('MosaicDefinitionTransaction', () => { let listener: Listener; before (() => { @@ -137,6 +142,7 @@ describe('TransactionHttp', () => { supplyMutable: true, transferable: true, divisibility: 3, + restrictable: true, duration: UInt64.fromUint(1000), }), NetworkType.MIJIN_TEST, @@ -159,6 +165,7 @@ describe('TransactionHttp', () => { transactionHttp.announce(signedTransaction); }); }); + describe('MosaicDefinitionTransaction', () => { let listener: Listener; before (() => { @@ -178,6 +185,7 @@ describe('TransactionHttp', () => { supplyMutable: true, transferable: true, divisibility: 3, + restrictable: true, }), NetworkType.MIJIN_TEST, ); @@ -197,6 +205,119 @@ describe('TransactionHttp', () => { transactionHttp.announce(signedTransaction); }); }); + + describe('MosaicGlobalRestrictionTransaction', () => { + let listener: Listener; + before (() => { + listener = new Listener(config.apiUrl); + return listener.open(); + }); + after(() => { + return listener.close(); + }); + + it('standalone', (done) => { + const mosaicGlobalRestrictionTransaction = MosaicGlobalRestrictionTransaction.create( + Deadline.create(), + mosaicId, + new MosaicId(UInt64.fromUint(0).toDTO()), + UInt64.fromUint(4444), + UInt64.fromUint(0), + MosaicRestrictionType.NONE, + UInt64.fromUint(0), + MosaicRestrictionType.GE, + NetworkType.MIJIN_TEST, + ); + const signedTransaction = mosaicGlobalRestrictionTransaction.signWith(account, generationHash); + + listener.confirmed(account.address).subscribe((transaction: MosaicAliasTransaction) => { + done(); + }); + listener.status(account.address).subscribe((error) => { + console.log('Error:', error); + assert(false); + done(); + }); + transactionHttp.announce(signedTransaction); + }); + }); + describe('MosaicGlobalRestrictionTransaction', () => { + let listener: Listener; + before (() => { + listener = new Listener(config.apiUrl); + return listener.open(); + }); + after(() => { + return listener.close(); + }); + it('aggregate', (done) => { + const mosaicGlobalRestrictionTransaction = MosaicGlobalRestrictionTransaction.create( + Deadline.create(), + mosaicId, + new MosaicId(UInt64.fromUint(0).toDTO()), + UInt64.fromUint(9999), + UInt64.fromUint(10), + MosaicRestrictionType.GE, + UInt64.fromUint(1), + MosaicRestrictionType.GE, + NetworkType.MIJIN_TEST, + ); + const aggregateTransaction = AggregateTransaction.createComplete(Deadline.create(), + [mosaicGlobalRestrictionTransaction.toAggregate(account.publicAccount)], + NetworkType.MIJIN_TEST, + [], + ); + const signedTransaction = aggregateTransaction.signWith(account, generationHash); + listener.confirmed(account.address).subscribe((transaction: Transaction) => { + done(); + }); + listener.status(account.address).subscribe((error) => { + console.log('Error:', error); + assert(false); + done(); + }); + transactionHttp.announce(signedTransaction); + }); + }); + + describe('MosaicAddressRestrictionTransaction', () => { + let listener: Listener; + before (() => { + listener = new Listener(config.apiUrl); + return listener.open(); + }); + after(() => { + return listener.close(); + }); + it('aggregate', (done) => { + const mosaicAddressRestrictionTransaction = MosaicAddressRestrictionTransaction.create( + Deadline.create(), + mosaicId, + UInt64.fromUint(4444), + account3.address, + UInt64.fromHex('FFFFFFFFFFFFFFFF'), + UInt64.fromUint(2), + NetworkType.MIJIN_TEST, + ); + const aggregateTransaction = AggregateTransaction.createComplete(Deadline.create(), + [mosaicAddressRestrictionTransaction.toAggregate(account.publicAccount)], + NetworkType.MIJIN_TEST, + [], + ); + const signedTransaction = aggregateTransaction.signWith(account, generationHash); + listener.confirmed(account.address).subscribe((transaction: Transaction) => { + done(); + }); + console.log(SignedTransaction); + listener.status(account.address).subscribe((error) => { + console.log('Error:', error); + assert(false); + done(); + }); + transactionHttp.announce(signedTransaction); + }); + }); + describe('TransferTransaction', () => { let listener: Listener; before (() => { diff --git a/src/infrastructure/buffers/MosaicAddressRestrictionTransactionBuffer.ts b/src/infrastructure/buffers/MosaicAddressRestrictionTransactionBuffer.ts new file mode 100644 index 0000000000..a306031841 --- /dev/null +++ b/src/infrastructure/buffers/MosaicAddressRestrictionTransactionBuffer.ts @@ -0,0 +1,625 @@ +/* + * Copyright 2019 NEM + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// automatically generated by the FlatBuffers compiler, do not modify + +/** + * @const + * @namespace + */ +var Catapult = Catapult || {}; + +/** + * @const + * @namespace + */ +Catapult.Buffers = Catapult.Buffers || {}; + +/** + * @constructor + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer = function() { + /** + * @type {flatbuffers.ByteBuffer} + */ + this.bb = null; + + /** + * @type {number} + */ + this.bb_pos = 0; +}; + +/** + * @param {number} i + * @param {flatbuffers.ByteBuffer} bb + * @returns {Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.__init = function(i, bb) { + this.bb_pos = i; + this.bb = bb; + return this; +}; + +/** + * @param {flatbuffers.ByteBuffer} bb + * @param {Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer=} obj + * @returns {Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.getRootAsMosaicAddressRestrictionTransactionBuffer = function(bb, obj) { + return (obj || new Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer).__init(bb.readInt32(bb.position()) + bb.position(), bb); +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.size = function() { + var offset = this.bb.__offset(this.bb_pos, 4); + return offset ? this.bb.readUint32(this.bb_pos + offset) : 0; +}; + +/** + * @param {number} index + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.signature = function(index) { + var offset = this.bb.__offset(this.bb_pos, 6); + return offset ? this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.signatureLength = function() { + var offset = this.bb.__offset(this.bb_pos, 6); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {Uint8Array} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.signatureArray = function() { + var offset = this.bb.__offset(this.bb_pos, 6); + return offset ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; +}; + +/** + * @param {number} index + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.signer = function(index) { + var offset = this.bb.__offset(this.bb_pos, 8); + return offset ? this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.signerLength = function() { + var offset = this.bb.__offset(this.bb_pos, 8); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {Uint8Array} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.signerArray = function() { + var offset = this.bb.__offset(this.bb_pos, 8); + return offset ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.version = function() { + var offset = this.bb.__offset(this.bb_pos, 10); + return offset ? this.bb.readUint16(this.bb_pos + offset) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.type = function() { + var offset = this.bb.__offset(this.bb_pos, 12); + return offset ? this.bb.readUint16(this.bb_pos + offset) : 0; +}; + +/** + * @param {number} index + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.fee = function(index) { + var offset = this.bb.__offset(this.bb_pos, 14); + return offset ? this.bb.readUint32(this.bb.__vector(this.bb_pos + offset) + index * 4) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.feeLength = function() { + var offset = this.bb.__offset(this.bb_pos, 14); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {Uint32Array} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.feeArray = function() { + var offset = this.bb.__offset(this.bb_pos, 14); + return offset ? new Uint32Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; +}; + +/** + * @param {number} index + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.deadline = function(index) { + var offset = this.bb.__offset(this.bb_pos, 16); + return offset ? this.bb.readUint32(this.bb.__vector(this.bb_pos + offset) + index * 4) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.deadlineLength = function() { + var offset = this.bb.__offset(this.bb_pos, 16); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {Uint32Array} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.deadlineArray = function() { + var offset = this.bb.__offset(this.bb_pos, 16); + return offset ? new Uint32Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; +}; + +/** + * @param {number} index + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.mosaicId = function(index) { + var offset = this.bb.__offset(this.bb_pos, 18); + return offset ? this.bb.readUint32(this.bb.__vector(this.bb_pos + offset) + index * 4) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.mosaicIdLength = function() { + var offset = this.bb.__offset(this.bb_pos, 18); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {Uint32Array} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.mosaicIdArray = function() { + var offset = this.bb.__offset(this.bb_pos, 18); + return offset ? new Uint32Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; +}; + +/** + * @param {number} index + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.restrictionKey = function(index) { + var offset = this.bb.__offset(this.bb_pos, 20); + return offset ? this.bb.readUint32(this.bb.__vector(this.bb_pos + offset) + index * 4) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.restrictionKeyLength = function() { + var offset = this.bb.__offset(this.bb_pos, 20); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {Uint32Array} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.restrictionKeyArray = function() { + var offset = this.bb.__offset(this.bb_pos, 20); + return offset ? new Uint32Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; +}; + +/** + * @param {number} index + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.targetAddress = function(index) { + var offset = this.bb.__offset(this.bb_pos, 22); + return offset ? this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.targetAddressLength = function() { + var offset = this.bb.__offset(this.bb_pos, 22); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {Uint8Array} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.targetAddressArray = function() { + var offset = this.bb.__offset(this.bb_pos, 22); + return offset ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; +}; + +/** + * @param {number} index + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.previousRestrictionValue = function(index) { + var offset = this.bb.__offset(this.bb_pos, 24); + return offset ? this.bb.readUint32(this.bb.__vector(this.bb_pos + offset) + index * 4) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.previousRestrictionValueLength = function() { + var offset = this.bb.__offset(this.bb_pos, 24); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {Uint32Array} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.previousRestrictionValueArray = function() { + var offset = this.bb.__offset(this.bb_pos, 24); + return offset ? new Uint32Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; +}; + +/** + * @param {number} index + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.newRestrictionValue = function(index) { + var offset = this.bb.__offset(this.bb_pos, 26); + return offset ? this.bb.readUint32(this.bb.__vector(this.bb_pos + offset) + index * 4) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.newRestrictionValueLength = function() { + var offset = this.bb.__offset(this.bb_pos, 26); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {Uint32Array} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.prototype.newRestrictionValueValueArray = function() { + var offset = this.bb.__offset(this.bb_pos, 26); + return offset ? new Uint32Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; +}; + +/** + * @param {flatbuffers.Builder} builder + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.startMosaicAddressRestrictionTransactionBuffer = function(builder) { + builder.startObject(14); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} size + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.addSize = function(builder, size) { + builder.addFieldInt32(0, size, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} signatureOffset + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.addSignature = function(builder, signatureOffset) { + builder.addFieldOffset(1, signatureOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.} data + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.createSignatureVector = function(builder, data) { + builder.startVector(1, data.length, 1); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt8(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.startSignatureVector = function(builder, numElems) { + builder.startVector(1, numElems, 1); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} signerOffset + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.addSigner = function(builder, signerOffset) { + builder.addFieldOffset(2, signerOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.} data + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.createSignerVector = function(builder, data) { + builder.startVector(1, data.length, 1); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt8(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.startSignerVector = function(builder, numElems) { + builder.startVector(1, numElems, 1); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} version + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.addVersion = function(builder, version) { + builder.addFieldInt16(3, version, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} type + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.addType = function(builder, type) { + builder.addFieldInt16(4, type, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} feeOffset + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.addFee = function(builder, feeOffset) { + builder.addFieldOffset(5, feeOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.} data + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.createFeeVector = function(builder, data) { + builder.startVector(4, data.length, 4); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt32(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.startFeeVector = function(builder, numElems) { + builder.startVector(4, numElems, 4); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} deadlineOffset + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.addDeadline = function(builder, deadlineOffset) { + builder.addFieldOffset(6, deadlineOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.} data + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.createDeadlineVector = function(builder, data) { + builder.startVector(4, data.length, 4); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt32(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.startDeadlineVector = function(builder, numElems) { + builder.startVector(4, numElems, 4); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} mosaicIdOffset + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.addMosaicId = function(builder, mosaicIdOffset) { + builder.addFieldOffset(7, mosaicIdOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.} data + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.createMosaicIdVector = function(builder, data) { + builder.startVector(4, data.length, 4); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt32(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.startMosaicIdVector = function(builder, numElems) { + builder.startVector(4, numElems, 4); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} restrictionKeyOffset + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.addRestrictionKey = function(builder, restrictionKeyOffset) { + builder.addFieldOffset(8, restrictionKeyOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.} data + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.createRestrictionKeyVector = function(builder, data) { + builder.startVector(4, data.length, 4); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt32(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.startRestrictionKeyVector = function(builder, numElems) { + builder.startVector(4, numElems, 4); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} targetAddressOffset + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.addTargetAddress = function(builder, targetAddressOffset) { + builder.addFieldOffset(9, targetAddressOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.} data + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.createTargetAddressVector = function(builder, data) { + builder.startVector(1, data.length, 1); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt8(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.startTargetAddressVector = function(builder, numElems) { + builder.startVector(1, numElems, 1); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} previousRestrictionValueOffset + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.addPreviousRestrictionValue = function(builder, previousRestrictionValueOffset) { + builder.addFieldOffset(10, previousRestrictionValueOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.} data + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.createPreviousRestrictionValueVector = function(builder, data) { + builder.startVector(4, data.length, 4); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt32(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.startPreviousRestrictionValueVector = function(builder, numElems) { + builder.startVector(4, numElems, 4); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} newRestrictionValueOffset + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.addNewRestrictionValue = function(builder, newRestrictionValueOffset) { + builder.addFieldOffset(11, newRestrictionValueOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.} data + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.createNewRestrictionValueVector = function(builder, data) { + builder.startVector(4, data.length, 4); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt32(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.startNewRestrictionValueVector = function(builder, numElems) { + builder.startVector(4, numElems, 4); +}; + +/** + * @param {flatbuffers.Builder} builder + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.endMosaicAddressRestrictionTransactionBuffer = function(builder) { + var offset = builder.endObject(); + return offset; +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} offset + */ +Catapult.Buffers.MosaicAddressRestrictionTransactionBuffer.finishMosaicAddressRestrictionTransactionBufferBuffer = function(builder, offset) { + builder.finish(offset); +}; + +// Exports for Node.js and RequireJS +export default Catapult; diff --git a/src/infrastructure/buffers/MosaicGlobalRestrictionTransactionBuffer.ts b/src/infrastructure/buffers/MosaicGlobalRestrictionTransactionBuffer.ts new file mode 100644 index 0000000000..794dfd3add --- /dev/null +++ b/src/infrastructure/buffers/MosaicGlobalRestrictionTransactionBuffer.ts @@ -0,0 +1,657 @@ +/* + * Copyright 2019 NEM + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// automatically generated by the FlatBuffers compiler, do not modify + +/** + * @const + * @namespace + */ +var Catapult = Catapult || {}; + +/** + * @const + * @namespace + */ +Catapult.Buffers = Catapult.Buffers || {}; + +/** + * @constructor + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer = function() { + /** + * @type {flatbuffers.ByteBuffer} + */ + this.bb = null; + + /** + * @type {number} + */ + this.bb_pos = 0; +}; + +/** + * @param {number} i + * @param {flatbuffers.ByteBuffer} bb + * @returns {Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.__init = function(i, bb) { + this.bb_pos = i; + this.bb = bb; + return this; +}; + +/** + * @param {flatbuffers.ByteBuffer} bb + * @param {Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer=} obj + * @returns {Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.getRootAsMosaicGlobalRestrictionTransactionBuffer = function(bb, obj) { + return (obj || new Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer).__init(bb.readInt32(bb.position()) + bb.position(), bb); +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.size = function() { + var offset = this.bb.__offset(this.bb_pos, 4); + return offset ? this.bb.readUint32(this.bb_pos + offset) : 0; +}; + +/** + * @param {number} index + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.signature = function(index) { + var offset = this.bb.__offset(this.bb_pos, 6); + return offset ? this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.signatureLength = function() { + var offset = this.bb.__offset(this.bb_pos, 6); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {Uint8Array} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.signatureArray = function() { + var offset = this.bb.__offset(this.bb_pos, 6); + return offset ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; +}; + +/** + * @param {number} index + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.signer = function(index) { + var offset = this.bb.__offset(this.bb_pos, 8); + return offset ? this.bb.readUint8(this.bb.__vector(this.bb_pos + offset) + index) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.signerLength = function() { + var offset = this.bb.__offset(this.bb_pos, 8); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {Uint8Array} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.signerArray = function() { + var offset = this.bb.__offset(this.bb_pos, 8); + return offset ? new Uint8Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.version = function() { + var offset = this.bb.__offset(this.bb_pos, 10); + return offset ? this.bb.readUint16(this.bb_pos + offset) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.type = function() { + var offset = this.bb.__offset(this.bb_pos, 12); + return offset ? this.bb.readUint16(this.bb_pos + offset) : 0; +}; + +/** + * @param {number} index + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.fee = function(index) { + var offset = this.bb.__offset(this.bb_pos, 14); + return offset ? this.bb.readUint32(this.bb.__vector(this.bb_pos + offset) + index * 4) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.feeLength = function() { + var offset = this.bb.__offset(this.bb_pos, 14); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {Uint32Array} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.feeArray = function() { + var offset = this.bb.__offset(this.bb_pos, 14); + return offset ? new Uint32Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; +}; + +/** + * @param {number} index + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.deadline = function(index) { + var offset = this.bb.__offset(this.bb_pos, 16); + return offset ? this.bb.readUint32(this.bb.__vector(this.bb_pos + offset) + index * 4) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.deadlineLength = function() { + var offset = this.bb.__offset(this.bb_pos, 16); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {Uint32Array} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.deadlineArray = function() { + var offset = this.bb.__offset(this.bb_pos, 16); + return offset ? new Uint32Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; +}; + +/** + * @param {number} index + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.mosaicId = function(index) { + var offset = this.bb.__offset(this.bb_pos, 18); + return offset ? this.bb.readUint32(this.bb.__vector(this.bb_pos + offset) + index * 4) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.mosaicIdLength = function() { + var offset = this.bb.__offset(this.bb_pos, 18); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {Uint32Array} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.mosaicIdArray = function() { + var offset = this.bb.__offset(this.bb_pos, 18); + return offset ? new Uint32Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; +}; + +/** + * @param {number} index + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.referenceMosaicId = function(index) { + var offset = this.bb.__offset(this.bb_pos, 20); + return offset ? this.bb.readUint32(this.bb.__vector(this.bb_pos + offset) + index * 4) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.referenceMosaicIdLength = function() { + var offset = this.bb.__offset(this.bb_pos, 20); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {Uint32Array} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.referenceMosaicIdArray = function() { + var offset = this.bb.__offset(this.bb_pos, 20); + return offset ? new Uint32Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; +}; + +/** + * @param {number} index + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.restrictionKey = function(index) { + var offset = this.bb.__offset(this.bb_pos, 22); + return offset ? this.bb.readUint32(this.bb.__vector(this.bb_pos + offset) + index * 4) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.restrictionKeyLength = function() { + var offset = this.bb.__offset(this.bb_pos, 22); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {Uint32Array} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.restrictionKeyArray = function() { + var offset = this.bb.__offset(this.bb_pos, 22); + return offset ? new Uint32Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; +}; + +/** + * @param {number} index + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.previousRestrictionValue = function(index) { + var offset = this.bb.__offset(this.bb_pos, 24); + return offset ? this.bb.readUint32(this.bb.__vector(this.bb_pos + offset) + index * 4) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.previousRestrictionValueLength = function() { + var offset = this.bb.__offset(this.bb_pos, 24); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {Uint32Array} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.previousRestrictionValueArray = function() { + var offset = this.bb.__offset(this.bb_pos, 24); + return offset ? new Uint32Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.previousRestrictionType = function() { + var offset = this.bb.__offset(this.bb_pos, 26); + return offset ? this.bb.readUint16(this.bb_pos + offset) : 0; +}; + +/** + * @param {number} index + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.newRestrictionValue = function(index) { + var offset = this.bb.__offset(this.bb_pos, 28); + return offset ? this.bb.readUint32(this.bb.__vector(this.bb_pos + offset) + index * 4) : 0; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.newRestrictionValueLength = function() { + var offset = this.bb.__offset(this.bb_pos, 28); + return offset ? this.bb.__vector_len(this.bb_pos + offset) : 0; +}; + +/** + * @returns {Uint32Array} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.newRestrictionValueValueArray = function() { + var offset = this.bb.__offset(this.bb_pos, 28); + return offset ? new Uint32Array(this.bb.bytes().buffer, this.bb.bytes().byteOffset + this.bb.__vector(this.bb_pos + offset), this.bb.__vector_len(this.bb_pos + offset)) : null; +}; + +/** + * @returns {number} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.prototype.newRestrictionValue = function() { + var offset = this.bb.__offset(this.bb_pos, 30); + return offset ? this.bb.readUint16(this.bb_pos + offset) : 0; +}; + +/** + * @param {flatbuffers.Builder} builder + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.startMosaicGlobalRestrictionTransactionBuffer = function(builder) { + builder.startObject(14); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} size + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.addSize = function(builder, size) { + builder.addFieldInt32(0, size, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} signatureOffset + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.addSignature = function(builder, signatureOffset) { + builder.addFieldOffset(1, signatureOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.} data + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.createSignatureVector = function(builder, data) { + builder.startVector(1, data.length, 1); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt8(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.startSignatureVector = function(builder, numElems) { + builder.startVector(1, numElems, 1); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} signerOffset + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.addSigner = function(builder, signerOffset) { + builder.addFieldOffset(2, signerOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.} data + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.createSignerVector = function(builder, data) { + builder.startVector(1, data.length, 1); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt8(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.startSignerVector = function(builder, numElems) { + builder.startVector(1, numElems, 1); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} version + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.addVersion = function(builder, version) { + builder.addFieldInt16(3, version, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} type + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.addType = function(builder, type) { + builder.addFieldInt16(4, type, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} feeOffset + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.addFee = function(builder, feeOffset) { + builder.addFieldOffset(5, feeOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.} data + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.createFeeVector = function(builder, data) { + builder.startVector(4, data.length, 4); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt32(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.startFeeVector = function(builder, numElems) { + builder.startVector(4, numElems, 4); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} deadlineOffset + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.addDeadline = function(builder, deadlineOffset) { + builder.addFieldOffset(6, deadlineOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.} data + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.createDeadlineVector = function(builder, data) { + builder.startVector(4, data.length, 4); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt32(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.startDeadlineVector = function(builder, numElems) { + builder.startVector(4, numElems, 4); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} mosaicIdOffset + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.addMosaicId = function(builder, mosaicIdOffset) { + builder.addFieldOffset(7, mosaicIdOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.} data + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.createMosaicIdVector = function(builder, data) { + builder.startVector(4, data.length, 4); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt32(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.startMosaicIdVector = function(builder, numElems) { + builder.startVector(4, numElems, 4); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} referenceMosaicIdOffset + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.addReferenceMosaicId = function(builder, referenceMosaicIdOffset) { + builder.addFieldOffset(8, referenceMosaicIdOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.} data + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.createReferenceMosaicIdVector = function(builder, data) { + builder.startVector(4, data.length, 4); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt32(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.startReferenceMosaicIdVector = function(builder, numElems) { + builder.startVector(4, numElems, 4); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} restrictionKeyOffset + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.addRestrictionKey = function(builder, restrictionKeyOffset) { + builder.addFieldOffset(9, restrictionKeyOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.} data + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.createRestrictionKeyVector = function(builder, data) { + builder.startVector(4, data.length, 4); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt32(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.startRestrictionKeyVector = function(builder, numElems) { + builder.startVector(4, numElems, 4); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} previousRestrictionValueOffset + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.addPreviousRestrictionValue = function(builder, previousRestrictionValueOffset) { + builder.addFieldOffset(10, previousRestrictionValueOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.} data + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.createPreviousRestrictionValueVector = function(builder, data) { + builder.startVector(4, data.length, 4); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt32(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.startPreviousRestrictionValueVector = function(builder, numElems) { + builder.startVector(4, numElems, 4); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} previousRestrictionType + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.addPreviousRestrictionType = function(builder, previousRestrictionType) { + builder.addFieldInt16(11, previousRestrictionType, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} newRestrictionValueOffset + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.addNewRestrictionValue = function(builder, newRestrictionValueOffset) { + builder.addFieldOffset(12, newRestrictionValueOffset, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {Array.} data + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.createNewRestrictionValueVector = function(builder, data) { + builder.startVector(4, data.length, 4); + for (var i = data.length - 1; i >= 0; i--) { + builder.addInt32(data[i]); + } + return builder.endVector(); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} numElems + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.startNewRestrictionValueVector = function(builder, numElems) { + builder.startVector(4, numElems, 4); +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {number} newRestrictionType + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.addNewRestrictionType = function(builder, newRestrictionType) { + builder.addFieldInt16(13, newRestrictionType, 0); +}; + +/** + * @param {flatbuffers.Builder} builder + * @returns {flatbuffers.Offset} + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.endMosaicGlobalRestrictionTransactionBuffer = function(builder) { + var offset = builder.endObject(); + return offset; +}; + +/** + * @param {flatbuffers.Builder} builder + * @param {flatbuffers.Offset} offset + */ +Catapult.Buffers.MosaicGlobalRestrictionTransactionBuffer.finishMosaicGlobalRestrictionTransactionBufferBuffer = function(builder, offset) { + builder.finish(offset); +}; + +// Exports for Node.js and RequireJS +export default Catapult; diff --git a/src/infrastructure/builders/MosaicAddressRestrictionTransaction.ts b/src/infrastructure/builders/MosaicAddressRestrictionTransaction.ts new file mode 100644 index 0000000000..0b214c496b --- /dev/null +++ b/src/infrastructure/builders/MosaicAddressRestrictionTransaction.ts @@ -0,0 +1,146 @@ +/* + * Copyright 2019 NEM + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @module transactions/MosaicAddressRestrictionTransaction + */ +import { TransactionType } from '../../model/transaction/TransactionType'; +import MosaicAddressRestrictionTransactionBufferPackage from '../buffers/MosaicAddressRestrictionTransactionBuffer'; +import MosaicAddressRestrictionTransactionSchema from '../schemas/MosaicAddressRestrictionTransactionSchema'; +import { VerifiableTransaction } from './VerifiableTransaction'; + +import {flatbuffers} from 'flatbuffers'; +import { RawAddress } from '../../core/format'; + +const { + MosaicAddressRestrictionTransactionBuffer, +} = MosaicAddressRestrictionTransactionBufferPackage.Buffers; + +export default class MosaicAddressRestrictionTransaction extends VerifiableTransaction { + constructor(bytes, schema) { + super(bytes, schema); + } +} +// tslint:disable-next-line: max-classes-per-file +export class Builder { + maxFee: any; + version: any; + type: any; + deadline: any; + mosaicId: any; + restrictionKey: any; + targetAddress: any; + previousRestrictionValue: any; + newRestrictionValue: any; + constructor() { + this.maxFee = [0, 0]; + this.type = TransactionType.MOSAIC_ADDRESS_RESTRICTION; + } + + addFee(maxFee) { + this.maxFee = maxFee; + return this; + } + + addVersion(version) { + this.version = version; + return this; + } + + addType(type) { + this.type = type; + return this; + } + + addDeadline(deadline) { + this.deadline = deadline; + return this; + } + + addRestrictionKey(restrictionKey) { + this.restrictionKey = restrictionKey; + return this; + } + + addTargetAddress(targetAddress) { + this.targetAddress = RawAddress.stringToAddress(targetAddress); + return this; + } + + addPreviousRestrictionValue(previousRestrictionValue) { + this.previousRestrictionValue = previousRestrictionValue; + return this; + } + + addNewRestrictionValue(newRestrictionValue) { + this.newRestrictionValue = newRestrictionValue; + return this; + } + + addMosaicId(mosaicId) { + this.mosaicId = mosaicId; + return this; + } + + build() { + const builder = new flatbuffers.Builder(1); + + // Create vectors + const signatureVector = MosaicAddressRestrictionTransactionBuffer + .createSignatureVector(builder, Array(...Array(64)).map(Number.prototype.valueOf, 0)); + const signerVector = MosaicAddressRestrictionTransactionBuffer + .createSignerVector(builder, Array(...Array(32)).map(Number.prototype.valueOf, 0)); + const deadlineVector = MosaicAddressRestrictionTransactionBuffer + .createDeadlineVector(builder, this.deadline); + const feeVector = MosaicAddressRestrictionTransactionBuffer + .createFeeVector(builder, this.maxFee); + const mosaicIdVector = MosaicAddressRestrictionTransactionBuffer + .createMosaicIdVector(builder, this.mosaicId); + const restrictionKeyVector = MosaicAddressRestrictionTransactionBuffer + .createRestrictionKeyVector(builder, this.restrictionKey); + const targetAddressVector = MosaicAddressRestrictionTransactionBuffer + .createTargetAddressVector(builder, this.targetAddress); + const previousRestrictionValueVector = MosaicAddressRestrictionTransactionBuffer + .createPreviousRestrictionValueVector(builder, this.previousRestrictionValue); + const newRestrictionValueVector = MosaicAddressRestrictionTransactionBuffer + .createNewRestrictionValueVector(builder, this.newRestrictionValue); + + MosaicAddressRestrictionTransactionBuffer.startMosaicAddressRestrictionTransactionBuffer(builder); + MosaicAddressRestrictionTransactionBuffer.addSize(builder, 169); + MosaicAddressRestrictionTransactionBuffer.addSignature(builder, signatureVector); + MosaicAddressRestrictionTransactionBuffer.addSigner(builder, signerVector); + MosaicAddressRestrictionTransactionBuffer.addVersion(builder, this.version); + MosaicAddressRestrictionTransactionBuffer.addType(builder, this.type); + MosaicAddressRestrictionTransactionBuffer.addFee(builder, feeVector); + MosaicAddressRestrictionTransactionBuffer.addDeadline(builder, deadlineVector); + MosaicAddressRestrictionTransactionBuffer.addMosaicId(builder, mosaicIdVector); + MosaicAddressRestrictionTransactionBuffer.addRestrictionKey(builder, restrictionKeyVector); + MosaicAddressRestrictionTransactionBuffer.addTargetAddress(builder, targetAddressVector); + MosaicAddressRestrictionTransactionBuffer.addPreviousRestrictionValue(builder, previousRestrictionValueVector); + MosaicAddressRestrictionTransactionBuffer.addNewRestrictionValue(builder, newRestrictionValueVector); + + // Calculate size + + const codedMosaicAddressRestriction = + MosaicAddressRestrictionTransactionBuffer.endMosaicAddressRestrictionTransactionBuffer(builder); + builder.finish(codedMosaicAddressRestriction); + + const bytes = builder.asUint8Array(); + + const schema = MosaicAddressRestrictionTransactionSchema; + return new MosaicAddressRestrictionTransaction(bytes, schema); + } +} diff --git a/src/infrastructure/builders/MosaicCreationTransaction.ts b/src/infrastructure/builders/MosaicCreationTransaction.ts index 2750d66cbf..d74ba21660 100644 --- a/src/infrastructure/builders/MosaicCreationTransaction.ts +++ b/src/infrastructure/builders/MosaicCreationTransaction.ts @@ -21,7 +21,7 @@ import { TransactionType } from '../../model/transaction/TransactionType'; import MosaicCreationTransactionBufferPackage from '../buffers/MosaicCreationTransactionBuffer'; import { schema as MosaicCreationTransactionSchema, - schemaNoDuration as MosaicCreationTransactionSchemaNoDuration + schemaNoDuration as MosaicCreationTransactionSchemaNoDuration, } from '../schemas/MosaicCreationTransactionSchema'; import { VerifiableTransaction } from './VerifiableTransaction'; @@ -99,7 +99,7 @@ export class Builder { return this; } - addLevyMutable() { + addRestrictable() { this.flags += 4; return this; } diff --git a/src/infrastructure/builders/MosaicGlobalRestrictionTransaction.ts b/src/infrastructure/builders/MosaicGlobalRestrictionTransaction.ts new file mode 100644 index 0000000000..608cc0f2c0 --- /dev/null +++ b/src/infrastructure/builders/MosaicGlobalRestrictionTransaction.ts @@ -0,0 +1,159 @@ +/* + * Copyright 2019 NEM + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @module transactions/MosaicGlobalRestrictionTransaction + */ +import { TransactionType } from '../../model/transaction/TransactionType'; +import MosaicGlobalRestrictionTransactionBufferPackage from '../buffers/MosaicGlobalRestrictionTransactionBuffer'; +import MosaicGlobalRestrictionTransactionSchema from '../schemas/MosaicGlobalRestrictionTransactionSchema'; +import { VerifiableTransaction } from './VerifiableTransaction'; + +import {flatbuffers} from 'flatbuffers'; + +const { + MosaicGlobalRestrictionTransactionBuffer, +} = MosaicGlobalRestrictionTransactionBufferPackage.Buffers; + +export default class MosaicGlobalRestrictionTransaction extends VerifiableTransaction { + constructor(bytes, schema) { + super(bytes, schema); + } +} +// tslint:disable-next-line: max-classes-per-file +export class Builder { + maxFee: any; + version: any; + type: any; + deadline: any; + mosaicId: any; + referenceMosaicId: any; + restrictionKey: any; + previousRestrictionValue: any; + previousRestrictionType: any; + newRestrictionValue: any; + newRestrictionType: any; + constructor() { + this.maxFee = [0, 0]; + this.type = TransactionType.MOSAIC_GLOBAL_RESTRICTION; + } + + addFee(maxFee) { + this.maxFee = maxFee; + return this; + } + + addVersion(version) { + this.version = version; + return this; + } + + addType(type) { + this.type = type; + return this; + } + + addDeadline(deadline) { + this.deadline = deadline; + return this; + } + + addRestrictionKey(restrictionKey) { + this.restrictionKey = restrictionKey; + return this; + } + + addPreviousRestrictionValue(previousRestrictionValue) { + this.previousRestrictionValue = previousRestrictionValue; + return this; + } + + addPreviousRestrictionType(previousRestrictionType) { + this.previousRestrictionType = previousRestrictionType; + return this; + } + + addNewRestrictionValue(newRestrictionValue) { + this.newRestrictionValue = newRestrictionValue; + return this; + } + + addNewRestrictionType(newRestrictionType) { + this.newRestrictionType = newRestrictionType; + return this; + } + + addMosaicId(mosaicId) { + this.mosaicId = mosaicId; + return this; + } + + addReferenceMosaicId(referenceMosaicId) { + this.referenceMosaicId = referenceMosaicId; + return this; + } + + build() { + const builder = new flatbuffers.Builder(1); + + // Create vectors + const signatureVector = MosaicGlobalRestrictionTransactionBuffer + .createSignatureVector(builder, Array(...Array(64)).map(Number.prototype.valueOf, 0)); + const signerVector = MosaicGlobalRestrictionTransactionBuffer + .createSignerVector(builder, Array(...Array(32)).map(Number.prototype.valueOf, 0)); + const deadlineVector = MosaicGlobalRestrictionTransactionBuffer + .createDeadlineVector(builder, this.deadline); + const feeVector = MosaicGlobalRestrictionTransactionBuffer + .createFeeVector(builder, this.maxFee); + const mosaicIdVector = MosaicGlobalRestrictionTransactionBuffer + .createMosaicIdVector(builder, this.mosaicId); + const referenceMosaicIdVector = MosaicGlobalRestrictionTransactionBuffer + .createReferenceMosaicIdVector(builder, this.referenceMosaicId); + const restrictionKeyVector = MosaicGlobalRestrictionTransactionBuffer + .createRestrictionKeyVector(builder, this.restrictionKey); + const previousRestrictionValueVector = MosaicGlobalRestrictionTransactionBuffer + .createPreviousRestrictionValueVector(builder, this.previousRestrictionValue); + const newRestrictionValueVector = MosaicGlobalRestrictionTransactionBuffer + .createNewRestrictionValueVector(builder, this.newRestrictionValue); + + MosaicGlobalRestrictionTransactionBuffer.startMosaicGlobalRestrictionTransactionBuffer(builder); + MosaicGlobalRestrictionTransactionBuffer.addSize(builder, 162); + MosaicGlobalRestrictionTransactionBuffer.addSignature(builder, signatureVector); + MosaicGlobalRestrictionTransactionBuffer.addSigner(builder, signerVector); + MosaicGlobalRestrictionTransactionBuffer.addVersion(builder, this.version); + MosaicGlobalRestrictionTransactionBuffer.addType(builder, this.type); + MosaicGlobalRestrictionTransactionBuffer.addFee(builder, feeVector); + MosaicGlobalRestrictionTransactionBuffer.addDeadline(builder, deadlineVector); + MosaicGlobalRestrictionTransactionBuffer.addMosaicId(builder, mosaicIdVector); + MosaicGlobalRestrictionTransactionBuffer.addReferenceMosaicId(builder, referenceMosaicIdVector); + MosaicGlobalRestrictionTransactionBuffer.addRestrictionKey(builder, restrictionKeyVector); + MosaicGlobalRestrictionTransactionBuffer.addPreviousRestrictionValue(builder, previousRestrictionValueVector); + MosaicGlobalRestrictionTransactionBuffer.addPreviousRestrictionType(builder, this.previousRestrictionType); + MosaicGlobalRestrictionTransactionBuffer.addNewRestrictionValue(builder, newRestrictionValueVector); + MosaicGlobalRestrictionTransactionBuffer.addNewRestrictionType(builder, this.newRestrictionType); + + // Calculate size + + const codedMosaicGlobalRestriction = + MosaicGlobalRestrictionTransactionBuffer.endMosaicGlobalRestrictionTransactionBuffer(builder); + builder.finish(codedMosaicGlobalRestriction); + + const bytes = builder.asUint8Array(); + + const schema = MosaicGlobalRestrictionTransactionSchema; + return new MosaicGlobalRestrictionTransaction(bytes, schema); + } +} diff --git a/src/infrastructure/schemas/MosaicAddressRestrictionTransactionSchema.ts b/src/infrastructure/schemas/MosaicAddressRestrictionTransactionSchema.ts new file mode 100644 index 0000000000..18123110e1 --- /dev/null +++ b/src/infrastructure/schemas/MosaicAddressRestrictionTransactionSchema.ts @@ -0,0 +1,46 @@ +/* + * Copyright 2019 NEM + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + array, + Schema, + TypeSize, + ubyte, + uint, + ushort +} from './Schema'; + +/** + * @module schema/MosaicAddressRestrictionTransactionSchema + */ + +/** + * Account Link schema + * @const {module:schema/Schema} + */ +export default new Schema([ + uint('size'), + array('signature'), + array('signer'), + ushort('version'), + ushort('type'), + array('fee', TypeSize.INT), + array('deadline', TypeSize.INT), + array('mosaicId', TypeSize.INT), + array('restrictionKey', TypeSize.INT), + array('targetAddress', TypeSize.BYTE), + array('previousRestrictionValue', TypeSize.INT), + array('newRestrictionValue', TypeSize.INT), +]); diff --git a/src/infrastructure/schemas/MosaicGlobalRestrictionTransactionSchema.ts b/src/infrastructure/schemas/MosaicGlobalRestrictionTransactionSchema.ts new file mode 100644 index 0000000000..d5be82b1ec --- /dev/null +++ b/src/infrastructure/schemas/MosaicGlobalRestrictionTransactionSchema.ts @@ -0,0 +1,49 @@ +/* + * Copyright 2019 NEM + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + array, + Schema, + TypeSize, + ubyte, + uint, + ushort, +} from './Schema'; + +/** + * @module schema/MosaicGlobalRestrictionTransactionSchema + */ + +/** + * Account Link schema + * @const {module:schema/Schema} + */ +export default new Schema([ + uint('size'), + array('signature'), + array('signer'), + ushort('version'), + ushort('type'), + array('fee', TypeSize.INT), + array('deadline', TypeSize.INT), + array('mosaicId', TypeSize.INT), + array('referenceMosaicId', TypeSize.INT), + array('restrictionKey', TypeSize.INT), + array('previousRestrictionValue', TypeSize.INT), + ubyte('previousRestrictionType'), + array('newRestrictionValue', TypeSize.INT), + ubyte('newRestrictionType'), + +]); diff --git a/src/infrastructure/transaction/CreateTransactionFromDTO.ts b/src/infrastructure/transaction/CreateTransactionFromDTO.ts index aa094d8499..65abcd1df5 100644 --- a/src/infrastructure/transaction/CreateTransactionFromDTO.ts +++ b/src/infrastructure/transaction/CreateTransactionFromDTO.ts @@ -24,7 +24,10 @@ import {MosaicId} from '../../model/mosaic/MosaicId'; import {MosaicProperties} from '../../model/mosaic/MosaicProperties'; import { MosaicPropertyType } from '../../model/mosaic/MosaicPropertyType'; import {NamespaceId} from '../../model/namespace/NamespaceId'; +import {AccountAddressRestrictionModificationTransaction} from '../../model/transaction/AccountAddressRestrictionModificationTransaction'; import { AccountLinkTransaction } from '../../model/transaction/AccountLinkTransaction'; +import {AccountMosaicRestrictionModificationTransaction} from '../../model/transaction/AccountMosaicRestrictionModificationTransaction'; +import {AccountOperationRestrictionModificationTransaction} from '../../model/transaction/AccountOperationRestrictionModificationTransaction'; import {AccountRestrictionModification} from '../../model/transaction/AccountRestrictionModification'; import {AddressAliasTransaction} from '../../model/transaction/AddressAliasTransaction'; import {AggregateTransaction} from '../../model/transaction/AggregateTransaction'; @@ -34,12 +37,11 @@ import {Deadline} from '../../model/transaction/Deadline'; import { EncryptedMessage } from '../../model/transaction/EncryptedMessage'; import {LockFundsTransaction} from '../../model/transaction/LockFundsTransaction'; import { MessageType } from '../../model/transaction/MessageType'; -import {AccountAddressRestrictionModificationTransaction} from '../../model/transaction/AccountAddressRestrictionModificationTransaction'; -import {AccountOperationRestrictionModificationTransaction} from '../../model/transaction/AccountOperationRestrictionModificationTransaction'; -import {AccountMosaicRestrictionModificationTransaction} from '../../model/transaction/AccountMosaicRestrictionModificationTransaction'; import {ModifyMultisigAccountTransaction} from '../../model/transaction/ModifyMultisigAccountTransaction'; +import { MosaicAddressRestrictionTransaction } from '../../model/transaction/MosaicAddressRestrictionTransaction'; import {MosaicAliasTransaction} from '../../model/transaction/MosaicAliasTransaction'; import {MosaicDefinitionTransaction} from '../../model/transaction/MosaicDefinitionTransaction'; +import { MosaicGlobalRestrictionTransaction } from '../../model/transaction/MosaicGlobalRestrictionTransaction'; import {MosaicSupplyChangeTransaction} from '../../model/transaction/MosaicSupplyChangeTransaction'; import {MultisigCosignatoryModification} from '../../model/transaction/MultisigCosignatoryModification'; import {EmptyMessage, PlainMessage} from '../../model/transaction/PlainMessage'; @@ -234,6 +236,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr transactionInfo, ); } else if (transactionDTO.type === TransactionType.SECRET_PROOF) { + const recipient = transactionDTO.recipient; return new SecretProofTransaction( extractNetworkType(transactionDTO.version), extractTransactionVersion(transactionDTO.version), @@ -241,7 +244,8 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr new UInt64(transactionDTO.maxFee || [0, 0]), transactionDTO.hashAlgorithm, transactionDTO.secret, - transactionDTO.recipient, + typeof recipient === 'object' && recipient.hasOwnProperty('address') ? + Address.createFromRawAddress(recipient.address) : Address.createFromEncoded(recipient), transactionDTO.proof, transactionDTO.signature, transactionDTO.signer ? PublicAccount.createFromPublicKey(transactionDTO.signer, @@ -337,6 +341,42 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr extractNetworkType(transactionDTO.version)) : undefined, transactionInfo, ); + } else if (transactionDTO.type === TransactionType.MOSAIC_GLOBAL_RESTRICTION) { + return new MosaicGlobalRestrictionTransaction( + extractNetworkType(transactionDTO.version), + extractTransactionVersion(transactionDTO.version), + Deadline.createFromDTO(transactionDTO.deadline), + new UInt64(transactionDTO.maxFee || [0, 0]), + new MosaicId(transactionDTO.mosaicId), + new MosaicId(transactionDTO.referenceMosaicId), + new UInt64(transactionDTO.restrictionKey), + new UInt64(transactionDTO.previousRestrictionValue), + transactionDTO.previousRestrictionType, + new UInt64(transactionDTO.newRestrictionValue), + transactionDTO.newRestrictionType, + transactionDTO.signature, + transactionDTO.signer ? PublicAccount.createFromPublicKey(transactionDTO.signer, + extractNetworkType(transactionDTO.version)) : undefined, + transactionInfo, + ); + } else if (transactionDTO.type === TransactionType.MOSAIC_ADDRESS_RESTRICTION) { + const targetAddress = transactionDTO.targetAddress; + return new MosaicAddressRestrictionTransaction( + extractNetworkType(transactionDTO.version), + extractTransactionVersion(transactionDTO.version), + Deadline.createFromDTO(transactionDTO.deadline), + new UInt64(transactionDTO.maxFee || [0, 0]), + new MosaicId(transactionDTO.mosaicId), + new UInt64(transactionDTO.restrictionKey), + typeof targetAddress === 'object' && targetAddress.hasOwnProperty('address') ? + Address.createFromRawAddress(targetAddress.address) : Address.createFromEncoded(targetAddress), + new UInt64(transactionDTO.previousRestrictionValue), + new UInt64(transactionDTO.newRestrictionValue), + transactionDTO.signature, + transactionDTO.signer ? PublicAccount.createFromPublicKey(transactionDTO.signer, + extractNetworkType(transactionDTO.version)) : undefined, + transactionInfo, + ); } throw new Error('Unimplemented transaction with type ' + transactionDTO.type); }; diff --git a/src/infrastructure/transaction/CreateTransactionFromPayload.ts b/src/infrastructure/transaction/CreateTransactionFromPayload.ts index 2759ad3f3c..afe17f162a 100644 --- a/src/infrastructure/transaction/CreateTransactionFromPayload.ts +++ b/src/infrastructure/transaction/CreateTransactionFromPayload.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { Convert as convert } from '../../core/format'; import {decode} from 'utf8'; +import { Convert as convert } from '../../core/format'; import { Address } from '../../model/account/Address'; import { PublicAccount } from '../../model/account/PublicAccount'; import { NetworkType } from '../../model/blockchain/NetworkType'; @@ -25,7 +25,10 @@ import { MosaicNonce } from '../../model/mosaic/MosaicNonce'; import { MosaicProperties } from '../../model/mosaic/MosaicProperties'; import { NamespaceId } from '../../model/namespace/NamespaceId'; import { NamespaceType } from '../../model/namespace/NamespaceType'; +import { AccountAddressRestrictionModificationTransaction } from '../../model/transaction/AccountAddressRestrictionModificationTransaction'; import { AccountLinkTransaction } from '../../model/transaction/AccountLinkTransaction'; +import { AccountMosaicRestrictionModificationTransaction } from '../../model/transaction/AccountMosaicRestrictionModificationTransaction'; +import { AccountOperationRestrictionModificationTransaction } from '../../model/transaction/AccountOperationRestrictionModificationTransaction'; import { AccountRestrictionModification } from '../../model/transaction/AccountRestrictionModification'; import { AddressAliasTransaction } from '../../model/transaction/AddressAliasTransaction'; import { AggregateTransaction } from '../../model/transaction/AggregateTransaction'; @@ -36,12 +39,11 @@ import { HashType } from '../../model/transaction/HashType'; import { LockFundsTransaction } from '../../model/transaction/LockFundsTransaction'; import { Message } from '../../model/transaction/Message'; import { MessageType } from '../../model/transaction/MessageType'; -import { AccountAddressRestrictionModificationTransaction } from '../../model/transaction/AccountAddressRestrictionModificationTransaction'; -import { AccountOperationRestrictionModificationTransaction } from '../../model/transaction/AccountOperationRestrictionModificationTransaction'; -import { AccountMosaicRestrictionModificationTransaction } from '../../model/transaction/AccountMosaicRestrictionModificationTransaction'; import { ModifyMultisigAccountTransaction } from '../../model/transaction/ModifyMultisigAccountTransaction'; +import { MosaicAddressRestrictionTransaction } from '../../model/transaction/MosaicAddressRestrictionTransaction'; import { MosaicAliasTransaction } from '../../model/transaction/MosaicAliasTransaction'; import { MosaicDefinitionTransaction } from '../../model/transaction/MosaicDefinitionTransaction'; +import { MosaicGlobalRestrictionTransaction } from '../../model/transaction/MosaicGlobalRestrictionTransaction'; import { MosaicSupplyChangeTransaction } from '../../model/transaction/MosaicSupplyChangeTransaction'; import { MultisigCosignatoryModification } from '../../model/transaction/MultisigCosignatoryModification'; import { PlainMessage } from '../../model/transaction/PlainMessage'; @@ -225,6 +227,7 @@ const CreateTransaction = (type: number, transactionData: string, networkType: N supplyMutable: (flags & 1) === 1, transferable: (flags & 2) === 2, divisibility: parseInt(convert.uint8ToHex(convert.hexToUint8(divisibility).reverse()), 16), + restrictable: (flags & 4) === 4, duration: duration ? UInt64.fromHex(reverse(duration)) : undefined, }), networkType, @@ -359,6 +362,44 @@ const CreateTransaction = (type: number, transactionData: string, networkType: N new SignedTransaction('', hashLockHash, '', TransactionType.AGGREGATE_BONDED, networkType), networkType, ); + case TransactionType.MOSAIC_GLOBAL_RESTRICTION: + // read bytes + const globalRestrictionMosaicId = transactionData.substring(0, 16); + const globalRestrictionReferenceMosaicId = transactionData.substring(16, 32); + const globalRestrictionRestrictionKey = transactionData.substring(32, 48); + const globalRestrictionPrevValue = transactionData.substring(48, 64); + const globalRestrictionPrevType = transactionData.substring(64, 66); + const globalRestrictionNewValue = transactionData.substring(66, 82); + const globalRestrictionNewType = transactionData.substring(82, 84); + + return MosaicGlobalRestrictionTransaction.create( + Deadline.createFromDTO(deadline), + new MosaicId(UInt64.fromHex(reverse(globalRestrictionMosaicId)).toDTO()), + new MosaicId(UInt64.fromHex(reverse(globalRestrictionReferenceMosaicId)).toDTO()), + UInt64.fromHex(reverse(globalRestrictionRestrictionKey)), + UInt64.fromHex(reverse(globalRestrictionPrevValue)), + parseInt(convert.uint8ToHex(convert.hexToUint8(globalRestrictionPrevType).reverse()), 16), + UInt64.fromHex(reverse(globalRestrictionNewValue)), + parseInt(convert.uint8ToHex(convert.hexToUint8(globalRestrictionNewType).reverse()), 16), + networkType, + ); + case TransactionType.MOSAIC_ADDRESS_RESTRICTION: + // read bytes + const addressRestrictionMosaicId = transactionData.substring(0, 16); + const addressRestrictionRestrictionKey = transactionData.substring(16, 32); + const addressRestrictionTargetAddress = transactionData.substring(32, 82); + const addressRestrictionPrevValue = transactionData.substring(82, 98); + const addressRestrictionNewValue = transactionData.substring(98, 114); + + return MosaicAddressRestrictionTransaction.create( + Deadline.createFromDTO(deadline), + new MosaicId(UInt64.fromHex(reverse(addressRestrictionMosaicId)).toDTO()), + UInt64.fromHex(reverse(addressRestrictionRestrictionKey)), + Address.createFromEncoded(addressRestrictionTargetAddress), + UInt64.fromHex(reverse(addressRestrictionPrevValue)), + UInt64.fromHex(reverse(addressRestrictionNewValue)), + networkType, + ); case TransactionType.AGGREGATE_COMPLETE: // read bytes const payloadSize = parseInt(convert.uint8ToHex(convert.hexToUint8(transactionData.substring(0, 8)).reverse()), 16) * 2; @@ -485,7 +526,6 @@ const decodeHex = (hex: string): string => { } }; - /** * @internal * @param messageType - Message Type diff --git a/src/infrastructure/transaction/SerializeTransactionToJSON.ts b/src/infrastructure/transaction/SerializeTransactionToJSON.ts index c73bd0bd93..a9c5c838e0 100644 --- a/src/infrastructure/transaction/SerializeTransactionToJSON.ts +++ b/src/infrastructure/transaction/SerializeTransactionToJSON.ts @@ -14,16 +14,18 @@ * limitations under the License. */ +import { AccountAddressRestrictionModificationTransaction } from '../../model/transaction/AccountAddressRestrictionModificationTransaction'; import { AccountLinkTransaction } from '../../model/transaction/AccountLinkTransaction'; +import { AccountMosaicRestrictionModificationTransaction } from '../../model/transaction/AccountMosaicRestrictionModificationTransaction'; +import { AccountOperationRestrictionModificationTransaction } from '../../model/transaction/AccountOperationRestrictionModificationTransaction'; import { AddressAliasTransaction } from '../../model/transaction/AddressAliasTransaction'; import { AggregateTransaction } from '../../model/transaction/AggregateTransaction'; import { LockFundsTransaction } from '../../model/transaction/LockFundsTransaction'; -import { AccountAddressRestrictionModificationTransaction } from '../../model/transaction/AccountAddressRestrictionModificationTransaction'; -import { AccountOperationRestrictionModificationTransaction } from '../../model/transaction/AccountOperationRestrictionModificationTransaction'; -import { AccountMosaicRestrictionModificationTransaction } from '../../model/transaction/AccountMosaicRestrictionModificationTransaction'; import { ModifyMultisigAccountTransaction } from '../../model/transaction/ModifyMultisigAccountTransaction'; +import { MosaicAddressRestrictionTransaction } from '../../model/transaction/MosaicAddressRestrictionTransaction'; import { MosaicAliasTransaction } from '../../model/transaction/MosaicAliasTransaction'; import { MosaicDefinitionTransaction } from '../../model/transaction/MosaicDefinitionTransaction'; +import { MosaicGlobalRestrictionTransaction } from '../../model/transaction/MosaicGlobalRestrictionTransaction'; import { MosaicSupplyChangeTransaction } from '../../model/transaction/MosaicSupplyChangeTransaction'; import { RegisterNamespaceTransaction } from '../../model/transaction/RegisterNamespaceTransaction'; import { SecretLockTransaction } from '../../model/transaction/SecretLockTransaction'; @@ -158,6 +160,25 @@ export const SerializeTransactionToJSON = (transaction: Transaction): any => { }), message: (transaction as TransferTransaction).message.toDTO(), }; + case TransactionType.MOSAIC_GLOBAL_RESTRICTION: + return { + mosaicId: (transaction as MosaicGlobalRestrictionTransaction).mosaicId.toDTO(), + referenceMosaicId: (transaction as MosaicGlobalRestrictionTransaction).referenceMosaicId.toDTO(), + restrictionKey: (transaction as MosaicGlobalRestrictionTransaction).restrictionKey.toDTO(), + previousRestrictionValue: (transaction as MosaicGlobalRestrictionTransaction).previousRestrictionValue.toDTO(), + previousRestrictionType: (transaction as MosaicGlobalRestrictionTransaction).previousRestrictionType, + newRestrictionValue: (transaction as MosaicGlobalRestrictionTransaction).newRestrictionValue.toDTO(), + newRestrictionType: (transaction as MosaicGlobalRestrictionTransaction).newRestrictionType, + }; + case TransactionType.MOSAIC_ADDRESS_RESTRICTION: + return { + mosaicId: (transaction as MosaicAddressRestrictionTransaction).mosaicId.toDTO(), + restrictionKey: (transaction as MosaicAddressRestrictionTransaction).restrictionKey.toDTO(), + targetAddress: (transaction as MosaicAddressRestrictionTransaction).targetAddress.toDTO(), + previousRestrictionValue: (transaction as MosaicAddressRestrictionTransaction).previousRestrictionValue.toDTO(), + newRestrictionValue: (transaction as MosaicAddressRestrictionTransaction).newRestrictionValue.toDTO(), + + }; default: throw new Error ('Transaction type not implemented yet.'); } diff --git a/src/model/mosaic/MosaicId.ts b/src/model/mosaic/MosaicId.ts index a1ab4e8110..d46c109152 100644 --- a/src/model/mosaic/MosaicId.ts +++ b/src/model/mosaic/MosaicId.ts @@ -86,8 +86,6 @@ export class MosaicId { * Create DTO object. */ toDTO() { - return { - id: this.id.toDTO(), - }; + return this.id.toDTO(); } } diff --git a/src/model/mosaic/MosaicInfo.ts b/src/model/mosaic/MosaicInfo.ts index 0884e468fa..225fdec922 100644 --- a/src/model/mosaic/MosaicInfo.ts +++ b/src/model/mosaic/MosaicInfo.ts @@ -96,4 +96,12 @@ export class MosaicInfo { public isTransferable(): boolean { return this.properties.transferable; } + + /** + * Is mosaic restrictable + * @returns {boolean} + */ + public isRestrictable(): boolean { + return this.properties.restrictable; + } } diff --git a/src/model/mosaic/MosaicProperties.ts b/src/model/mosaic/MosaicProperties.ts index 572231c484..e7ff66be40 100644 --- a/src/model/mosaic/MosaicProperties.ts +++ b/src/model/mosaic/MosaicProperties.ts @@ -37,6 +37,12 @@ export class MosaicProperties { */ public readonly transferable: boolean; + /** + * Not all the mosaics of a given network will be subject to mosaic restrictions. The feature will only affect + * those to which the issuer adds the "restrictable" property explicitly at the moment of its creation. This + * property appears disabled by default, as it is undesirable for autonomous tokens like the public network currency. + */ + public readonly restrictable: boolean; /** * @param flags * @param divisibility @@ -59,9 +65,10 @@ export class MosaicProperties { */ public readonly duration?: UInt64) { let binaryFlags = '00' + (flags.lower >>> 0).toString(2); - binaryFlags = binaryFlags.substr(binaryFlags.length - 2, 2); - this.supplyMutable = binaryFlags[1] === '1'; - this.transferable = binaryFlags[0] === '1'; + binaryFlags = binaryFlags.substr(binaryFlags.length - 3, 3); + this.supplyMutable = binaryFlags[2] === '1'; + this.transferable = binaryFlags[1] === '1'; + this.restrictable = binaryFlags[0] === '1'; } /** @@ -73,9 +80,11 @@ export class MosaicProperties { supplyMutable: boolean, transferable: boolean, divisibility: number, + restrictable?: boolean, duration?: UInt64, }) { - const flags = (params.supplyMutable ? 1 : 0) + (params.transferable ? 2 : 0); + const restrictable = params.restrictable ? 4 : 0; + const flags = (params.supplyMutable ? 1 : 0) + (params.transferable ? 2 : 0) + restrictable; return new MosaicProperties(UInt64.fromUint(flags), params.divisibility, params.duration); } @@ -85,7 +94,8 @@ export class MosaicProperties { toDTO() { const dto = [ {id: MosaicPropertyType.MosaicFlags, value: UInt64.fromUint((this.supplyMutable ? 1 : 0) + - (this.transferable ? 2 : 0)).toDTO()}, + (this.transferable ? 2 : 0) + + (this.transferable ? 4 : 0)).toDTO()}, {id: MosaicPropertyType.Divisibility, value: UInt64.fromUint(this.divisibility).toDTO()}, ]; diff --git a/src/model/mosaic/MosaicRestrictionType.ts b/src/model/mosaic/MosaicRestrictionType.ts new file mode 100644 index 0000000000..03b55cff88 --- /dev/null +++ b/src/model/mosaic/MosaicRestrictionType.ts @@ -0,0 +1,51 @@ +/* + * Copyright 2019 NEM + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export enum MosaicRestrictionType { + /** + * uninitialized value indicating no restriction + */ + NONE = 0, + + /** + * allow if equal + */ + EQ = 1, + + /** + * allow if not equal + */ + NE = 2, + + /** + * allow if less than + */ + LT = 3, + + /** + * allow if less than or equal + */ + LE = 4, + + /** + * allow if greater than + */ + GT = 5, + + /** + * allow if greater than or equal + */ + GE = 6, +} diff --git a/src/model/transaction/MosaicAddressRestrictionTransaction.ts b/src/model/transaction/MosaicAddressRestrictionTransaction.ts new file mode 100644 index 0000000000..f73a946a16 --- /dev/null +++ b/src/model/transaction/MosaicAddressRestrictionTransaction.ts @@ -0,0 +1,153 @@ +/* + * Copyright 2019 NEM + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Builder } from '../../infrastructure/builders/MosaicAddressRestrictionTransaction'; +import {VerifiableTransaction} from '../../infrastructure/builders/VerifiableTransaction'; +import { Address } from '../account/Address'; +import { PublicAccount } from '../account/PublicAccount'; +import { NetworkType } from '../blockchain/NetworkType'; +import { MosaicId } from '../mosaic/MosaicId'; +import { UInt64 } from '../UInt64'; +import { Deadline } from './Deadline'; +import { Transaction } from './Transaction'; +import { TransactionInfo } from './TransactionInfo'; +import { TransactionType } from './TransactionType'; +import { TransactionVersion } from './TransactionVersion'; + +export class MosaicAddressRestrictionTransaction extends Transaction { + + /** + * Create a mosaic address restriction transaction object + * + * Enabling accounts to transact with the token is similar to the process of + * adding elevated permissions to a user in a company computer network. + * + * The mosaic creator can modify the permissions of an account by sending a + * mosaic restriction transaction targeting the account address. + * + * **MosaicAddressRestrictionTransaction can only be announced in with Aggregated Transaction + * + * @param deadline - The deadline to include the transaction. + * @param mosaicId - The mosaic id ex: new MosaicId([481110499, 231112638]). + * @param restrictionKey - The restriction key. + * @param targetAddress - The affected unresolved address. + * @param previousRestrictionValue - The previous restriction value. + * @param newRestrictionValue - The new restriction value. + * @param networkType - The network type. + * @param maxFee - (Optional) Max fee defined by the sender + * @returns {MosaicAddressRestrictionTransaction} + */ + public static create(deadline: Deadline, + mosaicId: MosaicId, + restrictionKey: UInt64, + targetAddress: Address, + previousRestrictionValue: UInt64, + newRestrictionValue: UInt64, + networkType: NetworkType, + maxFee: UInt64 = new UInt64([0, 0])): MosaicAddressRestrictionTransaction { + return new MosaicAddressRestrictionTransaction(networkType, + TransactionVersion.MOSAIC_ADDRESS_RESTRICTION, + deadline, + maxFee, + mosaicId, + restrictionKey, + targetAddress, + previousRestrictionValue, + newRestrictionValue, + ); + } + + /** + * @param networkType + * @param version + * @param deadline + * @param maxFee + * @param mosaicNonce + * @param mosaicId + * @param mosaicProperties + * @param signature + * @param signer + * @param transactionInfo + */ + constructor(networkType: NetworkType, + version: number, + deadline: Deadline, + maxFee: UInt64, + /** + * The mosaic id. + */ + public readonly mosaicId: MosaicId, + /** + * The restriction key. + */ + public readonly restrictionKey: UInt64, + /** + * The affected unresolved address. + */ + public readonly targetAddress: Address, + /** + * The previous restriction value. + */ + public readonly previousRestrictionValue: UInt64, + /** + * The new restriction value. + */ + public readonly newRestrictionValue: UInt64, + signature?: string, + signer?: PublicAccount, + transactionInfo?: TransactionInfo) { + super(TransactionType.MOSAIC_ADDRESS_RESTRICTION, networkType, version, deadline, maxFee, signature, signer, transactionInfo); + } + + /** + * @override Transaction.size() + * @description get the byte size of a MosaicDefinitionTransaction + * @returns {number} + * @memberof MosaicAddressRestrictionTransaction + */ + public get size(): number { + const byteSize = super.size; + + // set static byte size fields + const byteNonce = 4; + const byteMosaicId = 8; + const byteRestrictionKey = 8; + const byteTargetAddress = 25; + const bytePreviousRestrictionValue = 8; + const byteNewRestrictionValue = 8; + + return byteSize + byteNonce + byteMosaicId + byteRestrictionKey + + byteTargetAddress + bytePreviousRestrictionValue + byteNewRestrictionValue; + } + + /** + * @internal + * @returns {VerifiableTransaction} + */ + protected buildTransaction(): VerifiableTransaction { + return new Builder() + .addDeadline(this.deadline.toDTO()) + .addFee(this.maxFee.toDTO()) + .addVersion(this.versionToDTO()) + .addMosaicId(this.mosaicId.id.toDTO()) + .addRestrictionKey(this.restrictionKey.toDTO()) + .addTargetAddress(this.targetAddress.plain()) + .addPreviousRestrictionValue(this.previousRestrictionValue.toDTO()) + .addNewRestrictionValue(this.newRestrictionValue.toDTO()) + .build(); + } + +} diff --git a/src/model/transaction/MosaicDefinitionTransaction.ts b/src/model/transaction/MosaicDefinitionTransaction.ts index 0df96430aa..b82844ab41 100644 --- a/src/model/transaction/MosaicDefinitionTransaction.ts +++ b/src/model/transaction/MosaicDefinitionTransaction.ts @@ -137,6 +137,10 @@ export class MosaicDefinitionTransaction extends Transaction { mosaicDefinitionTransaction = mosaicDefinitionTransaction.addTransferability(); } + if (this.mosaicProperties.restrictable === true) { + mosaicDefinitionTransaction = mosaicDefinitionTransaction.addRestrictable(); + } + return mosaicDefinitionTransaction.build(); } diff --git a/src/model/transaction/MosaicGlobalRestrictionTransaction.ts b/src/model/transaction/MosaicGlobalRestrictionTransaction.ts new file mode 100644 index 0000000000..7530eba330 --- /dev/null +++ b/src/model/transaction/MosaicGlobalRestrictionTransaction.ts @@ -0,0 +1,176 @@ +/* + * Copyright 2019 NEM + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Builder } from '../../infrastructure/builders/MosaicGlobalRestrictionTransaction'; +import {VerifiableTransaction} from '../../infrastructure/builders/VerifiableTransaction'; +import { Address } from '../account/Address'; +import { PublicAccount } from '../account/PublicAccount'; +import { NetworkType } from '../blockchain/NetworkType'; +import { MosaicId } from '../mosaic/MosaicId'; +import { MosaicRestrictionType } from '../mosaic/MosaicRestrictionType'; +import { UInt64 } from '../UInt64'; +import { Deadline } from './Deadline'; +import { Transaction } from './Transaction'; +import { TransactionInfo } from './TransactionInfo'; +import { TransactionType } from './TransactionType'; +import { TransactionVersion } from './TransactionVersion'; + +export class MosaicGlobalRestrictionTransaction extends Transaction { + + /** + * Create a mosaic address restriction transaction object + * + * The mosaic global restrictions are the network-wide rules that will determine + * whether an account will be able to transact a given mosaic. + * + * Only accounts tagged with the key identifiers and values that meet the conditions + * will be able to execute transactions involving the mosaic. + * + * Additionally, the mosaic creator can define restrictions that depend directly on + * global restrictions set on another mosaic - known as **reference mosaic**. + * The referenced mosaic and the restricted mosaic do not necessarily have to be created + * by the same account, enabling the delegation of mosaic permissions to a third party. + * + * @param deadline - The deadline to include the transaction. + * @param mosaicId - The mosaic id ex: new MosaicId([481110499, 231112638]). + * @param referenceMosaicId - The mosaic id providing the restriction key. + * @param restrictionKey - The restriction key. + * @param previousRestrictionValue - The previous restriction value. + * @param previousRestrictionType - The previous restriction type. + * @param newRestrictionValue - The new restriction value. + * @param previousRestrictionType - The previous restriction tpye. + * @param networkType - The network type. + * @param maxFee - (Optional) Max fee defined by the sender + * @returns {MosaicGlobalRestrictionTransaction} + */ + public static create(deadline: Deadline, + mosaicId: MosaicId, + referenceMosaicId: MosaicId, + restrictionKey: UInt64, + previousRestrictionValue: UInt64, + previousRestrictionType: MosaicRestrictionType, + newRestrictionValue: UInt64, + newRestrictionType: MosaicRestrictionType, + networkType: NetworkType, + maxFee: UInt64 = new UInt64([0, 0])): MosaicGlobalRestrictionTransaction { + return new MosaicGlobalRestrictionTransaction(networkType, + TransactionVersion.MOSAIC_GLOBAL_RESTRICTION, + deadline, + maxFee, + mosaicId, + referenceMosaicId, + restrictionKey, + previousRestrictionValue, + previousRestrictionType, + newRestrictionValue, + newRestrictionType, + ); + } + + /** + * @param networkType + * @param version + * @param deadline + * @param maxFee + * @param mosaicNonce + * @param mosaicId + * @param mosaicProperties + * @param signature + * @param signer + * @param transactionInfo + */ + constructor(networkType: NetworkType, + version: number, + deadline: Deadline, + maxFee: UInt64, + /** + * The mosaic id. + */ + public readonly mosaicId: MosaicId, + /** + * The refrence mosaic id. + */ + public readonly referenceMosaicId: MosaicId, + /** + * The restriction key. + */ + public readonly restrictionKey: UInt64, + /** + * The previous restriction value. + */ + public readonly previousRestrictionValue: UInt64, + /** + * The previous restriction type. + */ + public readonly previousRestrictionType: MosaicRestrictionType, + /** + * The new restriction value. + */ + public readonly newRestrictionValue: UInt64, + /** + * The new restriction type. + */ + public readonly newRestrictionType: MosaicRestrictionType, + signature?: string, + signer?: PublicAccount, + transactionInfo?: TransactionInfo) { + super(TransactionType.MOSAIC_GLOBAL_RESTRICTION, networkType, version, deadline, maxFee, signature, signer, transactionInfo); + } + + /** + * @override Transaction.size() + * @description get the byte size of a MosaicDefinitionTransaction + * @returns {number} + * @memberof MosaicGlobalRestrictionTransaction + */ + public get size(): number { + const byteSize = super.size; + + // set static byte size fields + const byteNonce = 4; + const byteMosaicId = 8; + const byteReferenceMosaicId = 8; + const byteRestrictionKey = 8; + const bytePreviousRestrictionValue = 8; + const byteNewRestrictionValue = 8; + const bytePreviousRestrictionType = 1; + const byteNewRestrictionType = 1; + + return byteSize + byteNonce + byteMosaicId + byteRestrictionKey + byteReferenceMosaicId + + bytePreviousRestrictionValue + byteNewRestrictionValue + byteNewRestrictionType + + bytePreviousRestrictionType; + } + + /** + * @internal + * @returns {VerifiableTransaction} + */ + protected buildTransaction(): VerifiableTransaction { + return new Builder() + .addDeadline(this.deadline.toDTO()) + .addFee(this.maxFee.toDTO()) + .addVersion(this.versionToDTO()) + .addMosaicId(this.mosaicId.id.toDTO()) + .addReferenceMosaicId(this.referenceMosaicId.id.toDTO()) + .addRestrictionKey(this.restrictionKey.toDTO()) + .addPreviousRestrictionValue(this.previousRestrictionValue.toDTO()) + .addPreviousRestrictionType(this.previousRestrictionType) + .addNewRestrictionValue(this.newRestrictionValue.toDTO()) + .addNewRestrictionType(this.newRestrictionType) + .build(); + } + +} diff --git a/src/model/transaction/TransactionType.ts b/src/model/transaction/TransactionType.ts index 2ff0f82e50..7b2b000adf 100644 --- a/src/model/transaction/TransactionType.ts +++ b/src/model/transaction/TransactionType.ts @@ -113,4 +113,16 @@ export class TransactionType { * @type {number} */ public static readonly LINK_ACCOUNT = 0x414C; + + /** + * Mosaic address restriction type + * @type {number} + */ + public static readonly MOSAIC_ADDRESS_RESTRICTION = 0x4251; + + /** + * Mosaic global restriction type + * @type {number} + */ + public static readonly MOSAIC_GLOBAL_RESTRICTION = 0x4151; } diff --git a/src/model/transaction/TransactionVersion.ts b/src/model/transaction/TransactionVersion.ts index d7446f12ec..953c35e096 100644 --- a/src/model/transaction/TransactionVersion.ts +++ b/src/model/transaction/TransactionVersion.ts @@ -100,6 +100,18 @@ export class TransactionVersion { */ public static readonly MOSAIC_ALIAS = 0x01; + /** + * Mosaic global restriction transaction version + * @type {number} + */ + public static readonly MOSAIC_GLOBAL_RESTRICTION = 0x01; + + /** + * Mosaic address restriction transaction version + * @type {number} + */ + public static readonly MOSAIC_ADDRESS_RESTRICTION = 0x01; + /** * Account Restriction address transaction version * @type {number} diff --git a/src/service/MosaicService.ts b/src/service/MosaicService.ts index 7d4b9482e0..d2550d20b5 100644 --- a/src/service/MosaicService.ts +++ b/src/service/MosaicService.ts @@ -64,7 +64,7 @@ export class MosaicService { mosaicsAmountView(mosaics: Mosaic[]): Observable { return observableOf(mosaics).pipe( mergeMap((_) => _), - mergeMap((mosaic: Mosaic) => this.mosaicsView([mosaic.id]).pipe( + mergeMap((mosaic: Mosaic) => this.mosaicsView([new MosaicId(mosaic.id.id.toDTO())]).pipe( filter((_) => _.length !== 0), map((mosaicViews) => { return new MosaicAmountView(mosaicViews[0].mosaicInfo, mosaic.amount); diff --git a/test/core/utils/TransactionMapping.spec.ts b/test/core/utils/TransactionMapping.spec.ts index c536e14c06..98fb4f5c86 100644 --- a/test/core/utils/TransactionMapping.spec.ts +++ b/test/core/utils/TransactionMapping.spec.ts @@ -29,6 +29,7 @@ import { EncryptedMessage } from '../../../src/model/model'; import { MosaicId } from '../../../src/model/mosaic/MosaicId'; import { MosaicNonce } from '../../../src/model/mosaic/MosaicNonce'; import { MosaicProperties } from '../../../src/model/mosaic/MosaicProperties'; +import { MosaicRestrictionType } from '../../../src/model/mosaic/MosaicRestrictionType'; import { MosaicSupplyType } from '../../../src/model/mosaic/MosaicSupplyType'; import { NetworkCurrencyMosaic } from '../../../src/model/mosaic/NetworkCurrencyMosaic'; import { AliasActionType } from '../../../src/model/namespace/AliasActionType'; @@ -47,8 +48,10 @@ import { LinkAction } from '../../../src/model/transaction/LinkAction'; import { LockFundsTransaction } from '../../../src/model/transaction/LockFundsTransaction'; import { MessageType } from '../../../src/model/transaction/MessageType'; import { ModifyMultisigAccountTransaction } from '../../../src/model/transaction/ModifyMultisigAccountTransaction'; +import { MosaicAddressRestrictionTransaction } from '../../../src/model/transaction/MosaicAddressRestrictionTransaction'; import { MosaicAliasTransaction } from '../../../src/model/transaction/MosaicAliasTransaction'; import { MosaicDefinitionTransaction } from '../../../src/model/transaction/MosaicDefinitionTransaction'; +import { MosaicGlobalRestrictionTransaction } from '../../../src/model/transaction/MosaicGlobalRestrictionTransaction'; import { MosaicSupplyChangeTransaction } from '../../../src/model/transaction/MosaicSupplyChangeTransaction'; import { MultisigCosignatoryModification } from '../../../src/model/transaction/MultisigCosignatoryModification'; import { MultisigCosignatoryModificationType } from '../../../src/model/transaction/MultisigCosignatoryModificationType'; @@ -83,7 +86,8 @@ describe('TransactionMapping - createFromPayload', () => { const signedTransaction = addressRestrictionTransaction.signWith(account, generationHash); - const transaction = TransactionMapping.createFromPayload(signedTransaction.payload) as AccountAddressRestrictionModificationTransaction; + const transaction = TransactionMapping + .createFromPayload(signedTransaction.payload) as AccountAddressRestrictionModificationTransaction; expect(transaction.restrictionType).to.be.equal(RestrictionType.AllowAddress); expect(transaction.modifications[0].modificationType).to.be.equal(RestrictionModificationType.Add); @@ -105,7 +109,8 @@ describe('TransactionMapping - createFromPayload', () => { const signedTransaction = mosaicRestrictionTransaction.signWith(account, generationHash); - const transaction = TransactionMapping.createFromPayload(signedTransaction.payload) as AccountAddressRestrictionModificationTransaction; + const transaction = TransactionMapping + .createFromPayload(signedTransaction.payload) as AccountAddressRestrictionModificationTransaction; expect(transaction.restrictionType).to.be.equal(RestrictionType.AllowMosaic); expect(transaction.modifications[0].value[0]).to.be.equal(2262289484); expect(transaction.modifications[0].value[1]).to.be.equal(3405110546); @@ -199,6 +204,7 @@ describe('TransactionMapping - createFromPayload', () => { expect(transaction.mosaicProperties.divisibility).to.be.equal(3); expect(transaction.mosaicProperties.supplyMutable).to.be.equal(false); expect(transaction.mosaicProperties.transferable).to.be.equal(false); + expect(transaction.mosaicProperties.restrictable).to.be.equal(false); }); @@ -222,6 +228,7 @@ describe('TransactionMapping - createFromPayload', () => { expect(transaction.mosaicProperties.divisibility).to.be.equal(3); expect(transaction.mosaicProperties.supplyMutable).to.be.equal(false); expect(transaction.mosaicProperties.transferable).to.be.equal(false); + expect(transaction.mosaicProperties.restrictable).to.be.equal(false); }); @@ -245,6 +252,7 @@ describe('TransactionMapping - createFromPayload', () => { expect(transaction.mosaicProperties.divisibility).to.be.equal(3); expect(transaction.mosaicProperties.supplyMutable).to.be.equal(false); expect(transaction.mosaicProperties.transferable).to.be.equal(false); + expect(transaction.mosaicProperties.transferable).to.be.equal(false); }); @@ -268,6 +276,7 @@ describe('TransactionMapping - createFromPayload', () => { expect(transaction.mosaicProperties.divisibility).to.be.equal(3); expect(transaction.mosaicProperties.supplyMutable).to.be.equal(false); expect(transaction.mosaicProperties.transferable).to.be.equal(false); + expect(transaction.mosaicProperties.transferable).to.be.equal(false); }); @@ -291,6 +300,7 @@ describe('TransactionMapping - createFromPayload', () => { expect(transaction.mosaicProperties.divisibility).to.be.equal(3); expect(transaction.mosaicProperties.supplyMutable).to.be.equal(false); expect(transaction.mosaicProperties.transferable).to.be.equal(false); + expect(transaction.mosaicProperties.transferable).to.be.equal(false); }); @@ -524,6 +534,56 @@ describe('TransactionMapping - createFromPayload', () => { expect(transaction.namespaceType).to.be.equal(NamespaceType.SubNamespace); expect(transaction.namespaceName).to.be.equal('root-test-namespace'); }); + + it('should create MosaicGlobalRestrictionTransaction', () => { + const mosaicGlobalRestrictionTransaction = MosaicGlobalRestrictionTransaction.create( + Deadline.create(), + new MosaicId(UInt64.fromUint(1).toDTO()), + new MosaicId(UInt64.fromUint(0).toDTO()), + UInt64.fromUint(4444), + UInt64.fromUint(0), + MosaicRestrictionType.NONE, + UInt64.fromUint(0), + MosaicRestrictionType.GE, + NetworkType.MIJIN_TEST, + ); + + const signedTx = mosaicGlobalRestrictionTransaction.signWith(account, generationHash); + + const transaction = TransactionMapping.createFromPayload(signedTx.payload) as MosaicGlobalRestrictionTransaction; + + expect(transaction.type).to.be.equal(TransactionType.MOSAIC_GLOBAL_RESTRICTION); + expect(transaction.mosaicId.toHex()).to.be.equal(new MosaicId(UInt64.fromUint(1).toDTO()).toHex()); + expect(transaction.referenceMosaicId.toHex()).to.be.equal(new MosaicId(UInt64.fromUint(0).toDTO()).toHex()); + expect(transaction.restrictionKey.toHex()).to.be.equal(UInt64.fromUint(4444).toHex()); + expect(transaction.previousRestrictionValue.toHex()).to.be.equal(UInt64.fromUint(0).toHex()); + expect(transaction.previousRestrictionType).to.be.equal(MosaicRestrictionType.NONE); + expect(transaction.newRestrictionValue.toHex()).to.be.equal(UInt64.fromUint(0).toHex()); + expect(transaction.newRestrictionType).to.be.equal(MosaicRestrictionType.GE); + }); + + it('should create MosaicAddressRestrictionTransaction', () => { + const mosaicAddressRestrictionTransaction = MosaicAddressRestrictionTransaction.create( + Deadline.create(), + new MosaicId(UInt64.fromUint(1).toDTO()), + UInt64.fromUint(4444), + account.address, + UInt64.fromUint(0), + UInt64.fromUint(0), + NetworkType.MIJIN_TEST, + ); + + const signedTx = mosaicAddressRestrictionTransaction.signWith(account, generationHash); + + const transaction = TransactionMapping.createFromPayload(signedTx.payload) as MosaicAddressRestrictionTransaction; + + expect(transaction.type).to.be.equal(TransactionType.MOSAIC_ADDRESS_RESTRICTION); + expect(transaction.mosaicId.toHex()).to.be.equal(new MosaicId(UInt64.fromUint(1).toDTO()).toHex()); + expect(transaction.restrictionKey.toHex()).to.be.equal(UInt64.fromUint(4444).toHex()); + expect(transaction.targetAddress.plain()).to.be.equal(account.address.plain()); + expect(transaction.previousRestrictionValue.toHex()).to.be.equal(UInt64.fromUint(0).toHex()); + expect(transaction.newRestrictionValue.toHex()).to.be.equal(UInt64.fromUint(0).toHex()); + }); }); describe('TransactionMapping - createFromDTO (Transaction.toJSON() feed)', () => { @@ -704,6 +764,7 @@ describe('TransactionMapping - createFromDTO (Transaction.toJSON() feed)', () => MosaicProperties.create({ supplyMutable: false, transferable: false, + restrictable: false, divisibility: 3, duration: UInt64.fromUint(1000), }), @@ -716,6 +777,7 @@ describe('TransactionMapping - createFromDTO (Transaction.toJSON() feed)', () => expect(transaction.type).to.be.equal(TransactionType.MOSAIC_DEFINITION); expect(transaction.mosaicProperties.supplyMutable).to.be.equal(false); expect(transaction.mosaicProperties.transferable).to.be.equal(false); + expect(transaction.mosaicProperties.transferable).to.be.equal(false); expect(transaction.mosaicProperties.divisibility).to.be.equal(3); }); @@ -895,4 +957,52 @@ describe('TransactionMapping - createFromDTO (Transaction.toJSON() feed)', () => expect(transaction.type).to.be.equal(TransactionType.REGISTER_NAMESPACE); }); + + it('should create MosaicGlobalRestrictionTransaction', () => { + const mosaicGlobalRestrictionTransaction = MosaicGlobalRestrictionTransaction.create( + Deadline.create(), + new MosaicId(UInt64.fromUint(1).toDTO()), + new MosaicId(UInt64.fromUint(0).toDTO()), + UInt64.fromUint(4444), + UInt64.fromUint(0), + MosaicRestrictionType.NONE, + UInt64.fromUint(0), + MosaicRestrictionType.GE, + NetworkType.MIJIN_TEST, + ); + + const transaction = + TransactionMapping.createFromDTO(mosaicGlobalRestrictionTransaction.toJSON()) as MosaicGlobalRestrictionTransaction; + + expect(transaction.type).to.be.equal(TransactionType.MOSAIC_GLOBAL_RESTRICTION); + expect(transaction.mosaicId.id.compact()).to.be.equal(1); + expect(transaction.referenceMosaicId.id.compact()).to.be.equal(0); + expect(transaction.restrictionKey.toHex()).to.be.equal(UInt64.fromUint(4444).toHex()); + expect(transaction.previousRestrictionValue.toHex()).to.be.equal(UInt64.fromUint(0).toHex()); + expect(transaction.previousRestrictionType).to.be.equal(MosaicRestrictionType.NONE); + expect(transaction.newRestrictionValue.toHex()).to.be.equal(UInt64.fromUint(0).toHex()); + expect(transaction.newRestrictionType).to.be.equal(MosaicRestrictionType.GE); + }); + + it('should create MosaicAddressRestrictionTransaction', () => { + const mosaicAddressRestrictionTransaction = MosaicAddressRestrictionTransaction.create( + Deadline.create(), + new MosaicId(UInt64.fromUint(1).toDTO()), + UInt64.fromUint(4444), + account.address, + UInt64.fromUint(0), + UInt64.fromUint(0), + NetworkType.MIJIN_TEST, + ); + + const transaction = + TransactionMapping.createFromDTO(mosaicAddressRestrictionTransaction.toJSON()) as MosaicAddressRestrictionTransaction; + + expect(transaction.type).to.be.equal(TransactionType.MOSAIC_ADDRESS_RESTRICTION); + expect(transaction.mosaicId.id.compact()).to.be.equal(1); + expect(transaction.restrictionKey.toHex()).to.be.equal(UInt64.fromUint(4444).toHex()); + expect(transaction.targetAddress.plain()).to.be.equal(account.address.plain()); + expect(transaction.previousRestrictionValue.toHex()).to.be.equal(UInt64.fromUint(0).toHex()); + expect(transaction.newRestrictionValue.toHex()).to.be.equal(UInt64.fromUint(0).toHex()); + }); }); diff --git a/test/infrastructure/receipt/CreateReceiptFromDTO.spec.ts b/test/infrastructure/receipt/CreateReceiptFromDTO.spec.ts index 51382affbd..115fd21c71 100644 --- a/test/infrastructure/receipt/CreateReceiptFromDTO.spec.ts +++ b/test/infrastructure/receipt/CreateReceiptFromDTO.spec.ts @@ -141,7 +141,7 @@ describe('Receipt - CreateStatementFromDTO', () => { .address.plain()).to.be.equal(Address.createFromEncoded('917E7E29A01014C2F300000000000000000000000000000000').plain()); deepEqual(statement.mosaicResolutionStatements[0].height, [1506, 0]); - deepEqual(unresolvedMosaicId.toDTO().id, [4014740460, 2448037180]); + deepEqual(unresolvedMosaicId.toDTO(), [4014740460, 2448037180]); expect(statement.mosaicResolutionStatements[0].resolutionEntries.length).to.be.equal(1); deepEqual((statement.mosaicResolutionStatements[0].resolutionEntries[0].resolved as MosaicAlias) .mosaicId.id.toDTO(), [2553890912, 2234768168]); diff --git a/test/model/mosaic/MosaicAmountView.spec.ts b/test/model/mosaic/MosaicAmountView.spec.ts index 38ce381667..5c24f52255 100644 --- a/test/model/mosaic/MosaicAmountView.spec.ts +++ b/test/model/mosaic/MosaicAmountView.spec.ts @@ -40,6 +40,7 @@ describe('MosaicAmountView', () => { supplyMutable: true, transferable: true, divisibility: 3, + restrictable: true, duration: UInt64.fromUint(1000), }), ); diff --git a/test/model/mosaic/MosaicInfo.spec.ts b/test/model/mosaic/MosaicInfo.spec.ts index 56285343c2..b85e1146dd 100644 --- a/test/model/mosaic/MosaicInfo.spec.ts +++ b/test/model/mosaic/MosaicInfo.spec.ts @@ -179,4 +179,42 @@ describe('MosaicInfo', () => { }); }); + describe('isRestrictable', () => { + it('should return true when it\'s restrictable', () => { + const mosaicInfo = new MosaicInfo( + mosaicInfoDTO.meta.id, + mosaicInfoDTO.mosaic.mosaicId, + mosaicInfoDTO.mosaic.supply, + mosaicInfoDTO.mosaic.height, + mosaicInfoDTO.mosaic.owner, + mosaicInfoDTO.mosaic.revision, + MosaicProperties.create({ + supplyMutable: false, + transferable: false, + divisibility: mosaicInfoDTO.mosaic.properties[1].compact(), + restrictable: true, + duration: mosaicInfoDTO.mosaic.properties[2], + }), + ); + expect(mosaicInfo.isRestrictable()).to.be.equal(true); + }); + + it('should return false when it\'s not restrictable', () => { + const mosaicInfo = new MosaicInfo( + mosaicInfoDTO.meta.id, + mosaicInfoDTO.mosaic.mosaicId, + mosaicInfoDTO.mosaic.supply, + mosaicInfoDTO.mosaic.height, + mosaicInfoDTO.mosaic.owner, + mosaicInfoDTO.mosaic.revision, + MosaicProperties.create({ + supplyMutable: false, + transferable: false, + divisibility: mosaicInfoDTO.mosaic.properties[1].compact(), + duration: mosaicInfoDTO.mosaic.properties[2], + }), + ); + expect(mosaicInfo.isRestrictable()).to.be.equal(false); + }); + }); }); diff --git a/test/model/mosaic/MosaicProperties.spec.ts b/test/model/mosaic/MosaicProperties.spec.ts index 77b526fa7f..99e8caefe8 100644 --- a/test/model/mosaic/MosaicProperties.spec.ts +++ b/test/model/mosaic/MosaicProperties.spec.ts @@ -65,6 +65,7 @@ describe('MosaicProperties', () => { expect(mosaicProperties.supplyMutable).to.be.equal(false); expect(mosaicProperties.transferable).to.be.equal(false); + expect(mosaicProperties.restrictable).to.be.equal(false); }); it('should createComplete an MosaicProperties object without duration', () => { @@ -79,5 +80,6 @@ describe('MosaicProperties', () => { expect(mosaicProperties.supplyMutable).to.be.equal(false); expect(mosaicProperties.transferable).to.be.equal(false); + expect(mosaicProperties.restrictable).to.be.equal(false); }); }); diff --git a/test/model/mosaic/MosaicView.spec.ts b/test/model/mosaic/MosaicView.spec.ts index a75da8844e..5f85049cf1 100644 --- a/test/model/mosaic/MosaicView.spec.ts +++ b/test/model/mosaic/MosaicView.spec.ts @@ -20,9 +20,8 @@ import {NetworkType} from '../../../src/model/blockchain/NetworkType'; import {MosaicId} from '../../../src/model/mosaic/MosaicId'; import {MosaicInfo} from '../../../src/model/mosaic/MosaicInfo'; import {MosaicProperties} from '../../../src/model/mosaic/MosaicProperties'; -import {MosaicView} from '../../../src/service/MosaicView'; -import {NamespaceId} from '../../../src/model/namespace/NamespaceId'; import {UInt64} from '../../../src/model/UInt64'; +import {MosaicView} from '../../../src/service/MosaicView'; describe('MosaicView', () => { @@ -40,6 +39,7 @@ describe('MosaicView', () => { supplyMutable: true, transferable: true, divisibility: 2, + restrictable: true, duration: UInt64.fromUint(1000), })); }); diff --git a/test/model/receipt/Receipt.spec.ts b/test/model/receipt/Receipt.spec.ts index 958035b285..a4db016ef0 100644 --- a/test/model/receipt/Receipt.spec.ts +++ b/test/model/receipt/Receipt.spec.ts @@ -155,7 +155,7 @@ describe('Receipt', () => { ); deepEqual(receipt.amount.toDTO(), receiptDTO.amount); - deepEqual(receipt.mosaicId.toDTO().id, receiptDTO.mosaicId); + deepEqual(receipt.mosaicId.toDTO(), receiptDTO.mosaicId); deepEqual(receipt.type, ReceiptType.Mosaic_Levy); deepEqual(receipt.version, ReceiptVersion.BALANCE_TRANSFER); deepEqual(receipt.recipient, Address.createFromEncoded('9103B60AAF2762688300000000000000000000000000000000')); @@ -182,7 +182,7 @@ describe('Receipt', () => { deepEqual(receipt.amount.toDTO(), receiptDTO.amount); deepEqual(receipt.recipient, Address.createFromEncoded('9103B60AAF2762688300000000000000000000000000000000')); - deepEqual(receipt.mosaicId.toDTO().id, receiptDTO.mosaicId); + deepEqual(receipt.mosaicId.toDTO(), receiptDTO.mosaicId); deepEqual(receipt.type, ReceiptType.Mosaic_Rental_Fee); deepEqual(receipt.version, ReceiptVersion.BALANCE_TRANSFER); }); @@ -206,7 +206,7 @@ describe('Receipt', () => { deepEqual(receipt.account.publicKey, receiptDTO.account); deepEqual(receipt.amount.toDTO(), receiptDTO.amount); - deepEqual(receipt.mosaicId.toDTO().id, receiptDTO.mosaicId); + deepEqual(receipt.mosaicId.toDTO(), receiptDTO.mosaicId); deepEqual(receipt.type, ReceiptType.Harvest_Fee); deepEqual(receipt.version, ReceiptVersion.BALANCE_CHANGE); }); @@ -230,7 +230,7 @@ describe('Receipt', () => { deepEqual(receipt.account.publicKey, receiptDTO.account); deepEqual(receipt.amount.toDTO(), receiptDTO.amount); - deepEqual(receipt.mosaicId.toDTO().id, receiptDTO.mosaicId); + deepEqual(receipt.mosaicId.toDTO(), receiptDTO.mosaicId); deepEqual(receipt.type, ReceiptType.LockHash_Created); deepEqual(receipt.version, ReceiptVersion.BALANCE_CHANGE); }); @@ -248,7 +248,7 @@ describe('Receipt', () => { receiptDTO.type, ); - deepEqual(receipt.artifactId.toDTO().id, receiptDTO.artifactId); + deepEqual(receipt.artifactId.id.toDTO(), receiptDTO.artifactId); deepEqual(receipt.type, ReceiptType.Namespace_Expired); deepEqual(receipt.version, ReceiptVersion.ARTIFACT_EXPIRY); }); @@ -265,7 +265,7 @@ describe('Receipt', () => { receiptDTO.version, receiptDTO.type, ); - deepEqual(receipt.artifactId.toDTO().id, receiptDTO.artifactId); + deepEqual(receipt.artifactId.toDTO(), receiptDTO.artifactId); deepEqual(receipt.type, ReceiptType.Mosaic_Expired); deepEqual(receipt.version, ReceiptVersion.ARTIFACT_EXPIRY); }); @@ -293,7 +293,7 @@ describe('Receipt', () => { new ReceiptSource( resolved.source.primaryId, resolved.source.secondaryId)); }), ); - deepEqual((statement.unresolved as MosaicId).toDTO().id, statementDto.unresolved); + deepEqual((statement.unresolved as MosaicId).toDTO(), statementDto.unresolved); deepEqual((statement.resolutionEntries[0].resolved as MosaicAlias).mosaicId.id.toDTO(), [2553890912, 2234768168]); }); @@ -329,7 +329,7 @@ describe('Receipt', () => { ); deepEqual(receipt.amount.compact(), receiptDTO.amount); - deepEqual(receipt.mosaicId.toDTO().id, receiptDTO.mosaicId); + deepEqual(receipt.mosaicId.toDTO(), receiptDTO.mosaicId); deepEqual(receipt.type, ReceiptType.Inflation); deepEqual(receipt.version, ReceiptVersion.INFLATION_RECEIPT); }); diff --git a/test/model/transaction/AggregateTransaction.spec.ts b/test/model/transaction/AggregateTransaction.spec.ts index 571df9defe..d32bdc1a1d 100644 --- a/test/model/transaction/AggregateTransaction.spec.ts +++ b/test/model/transaction/AggregateTransaction.spec.ts @@ -151,6 +151,7 @@ describe('AggregateTransaction', () => { supplyMutable: true, transferable: true, divisibility: 3, + restrictable: true, duration: UInt64.fromUint(1000), }), NetworkType.MIJIN_TEST, @@ -170,7 +171,7 @@ describe('AggregateTransaction', () => { expect(signedTransaction.payload.substring( 320, signedTransaction.payload.length, - )).to.be.equal('01904D41E6DE84B8010000000000000001030302E803000000000000'); + )).to.be.equal('01904D41E6DE84B8010000000000000001070302E803000000000000'); }); it('should createComplete an AggregateTransaction object with MosaicSupplyChangeTransaction', () => { @@ -465,4 +466,4 @@ describe('AggregateTransaction', () => { expect(aggregateTransaction.size).to.be.equal(120 + 4 + 158); }); }); -}); \ No newline at end of file +}); diff --git a/test/model/transaction/MosaicAddressRestrictionTransaction.spec.ts b/test/model/transaction/MosaicAddressRestrictionTransaction.spec.ts new file mode 100644 index 0000000000..947904ce56 --- /dev/null +++ b/test/model/transaction/MosaicAddressRestrictionTransaction.spec.ts @@ -0,0 +1,59 @@ +/* + * Copyright 2019 NEM + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {expect} from 'chai'; +import {Account} from '../../../src/model/account/Account'; +import {NetworkType} from '../../../src/model/blockchain/NetworkType'; +import {MosaicId} from '../../../src/model/mosaic/MosaicId'; +import {Deadline} from '../../../src/model/transaction/Deadline'; +import {MosaicAddressRestrictionTransaction} from '../../../src/model/transaction/MosaicAddressRestrictionTransaction'; +import {UInt64} from '../../../src/model/UInt64'; +import {TestingAccount} from '../../conf/conf.spec'; + +describe('MosaicAddressRestrictionTransaction', () => { + let account: Account; + const generationHash = '57F7DA205008026C776CB6AED843393F04CD458E0AA2D9F1D5F31A402072B2D6'; + before(() => { + account = TestingAccount; + }); + + it('should createComplete an MosaicAddressRestrictionTransaction object and sign', () => { + const mosaicId = new MosaicId(UInt64.fromUint(1).toDTO()); + const mosaicAddressRestrictionTransaction = MosaicAddressRestrictionTransaction.create( + Deadline.create(), + mosaicId, + UInt64.fromUint(1), + account.address, + UInt64.fromUint(9), + UInt64.fromUint(8), + NetworkType.MIJIN_TEST, + ); + expect(mosaicAddressRestrictionTransaction.mosaicId.toHex()).to.be.equal(mosaicId.toHex()); + expect(mosaicAddressRestrictionTransaction.restrictionKey.toHex()).to.be.equal(UInt64.fromUint(1).toHex()); + expect(mosaicAddressRestrictionTransaction.previousRestrictionValue.toHex()).to.be.equal(UInt64.fromUint(9).toHex()); + expect(mosaicAddressRestrictionTransaction.newRestrictionValue.toHex()).to.be.equal(UInt64.fromUint(8).toHex()); + expect(mosaicAddressRestrictionTransaction.targetAddress.plain()).to.be.equal(account.address.plain()); + + const signedTransaction = mosaicAddressRestrictionTransaction.signWith(account, generationHash); + + expect(signedTransaction.payload.substring( + 240, + signedTransaction.payload.length, + )).to.be.equal('0100000000000000010000000000000090A75B6B63D31BDA93808727940F24699AE' + + 'CDDF17C568508BA09000000000000000800000000000000'); + + }); +}); diff --git a/test/model/transaction/MosaicDefinitionTransaction.spec.ts b/test/model/transaction/MosaicDefinitionTransaction.spec.ts index 0946be0086..5c15bafa89 100644 --- a/test/model/transaction/MosaicDefinitionTransaction.spec.ts +++ b/test/model/transaction/MosaicDefinitionTransaction.spec.ts @@ -41,6 +41,7 @@ describe('MosaicDefinitionTransaction', () => { supplyMutable: true, transferable: true, divisibility: 3, + restrictable: true, duration: UInt64.fromUint(1000), }), NetworkType.MIJIN_TEST, @@ -59,6 +60,7 @@ describe('MosaicDefinitionTransaction', () => { supplyMutable: true, transferable: true, divisibility: 3, + restrictable: true, duration: UInt64.fromUint(1000), }), NetworkType.MIJIN_TEST, @@ -78,6 +80,7 @@ describe('MosaicDefinitionTransaction', () => { supplyMutable: true, transferable: true, divisibility: 3, + restrictable: true, duration: UInt64.fromUint(1000), }), NetworkType.MIJIN_TEST, @@ -88,13 +91,14 @@ describe('MosaicDefinitionTransaction', () => { expect(mosaicDefinitionTransaction.mosaicProperties.divisibility).to.be.equal(3); expect(mosaicDefinitionTransaction.mosaicProperties.supplyMutable).to.be.equal(true); expect(mosaicDefinitionTransaction.mosaicProperties.transferable).to.be.equal(true); + expect(mosaicDefinitionTransaction.mosaicProperties.restrictable).to.be.equal(true); const signedTransaction = mosaicDefinitionTransaction.signWith(account, generationHash); expect(signedTransaction.payload.substring( 240, signedTransaction.payload.length, - )).to.be.equal('E6DE84B8010000000000000001030302E803000000000000'); + )).to.be.equal('E6DE84B8010000000000000001070302E803000000000000'); }); @@ -118,6 +122,7 @@ describe('MosaicDefinitionTransaction', () => { expect(mosaicDefinitionTransaction.mosaicProperties.divisibility).to.be.equal(3); expect(mosaicDefinitionTransaction.mosaicProperties.supplyMutable).to.be.equal(false); expect(mosaicDefinitionTransaction.mosaicProperties.transferable).to.be.equal(false); + expect(mosaicDefinitionTransaction.mosaicProperties.restrictable).to.be.equal(false); const signedTransaction = mosaicDefinitionTransaction.signWith(account, generationHash); @@ -163,6 +168,7 @@ describe('MosaicDefinitionTransaction', () => { expect(mosaicDefinitionTransaction.mosaicProperties.divisibility).to.be.equal(3); expect(mosaicDefinitionTransaction.mosaicProperties.supplyMutable).to.be.equal(false); expect(mosaicDefinitionTransaction.mosaicProperties.transferable).to.be.equal(false); + expect(mosaicDefinitionTransaction.mosaicProperties.restrictable).to.be.equal(false); const signedTransaction = mosaicDefinitionTransaction.signWith(account, generationHash); diff --git a/test/model/transaction/MosaicGlobalRestrictionTransaction.spec.ts b/test/model/transaction/MosaicGlobalRestrictionTransaction.spec.ts new file mode 100644 index 0000000000..39c409bd22 --- /dev/null +++ b/test/model/transaction/MosaicGlobalRestrictionTransaction.spec.ts @@ -0,0 +1,65 @@ +/* + * Copyright 2019 NEM + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {expect} from 'chai'; +import {Account} from '../../../src/model/account/Account'; +import {NetworkType} from '../../../src/model/blockchain/NetworkType'; +import {MosaicId} from '../../../src/model/mosaic/MosaicId'; +import { MosaicRestrictionType } from '../../../src/model/mosaic/MosaicRestrictionType'; +import {Deadline} from '../../../src/model/transaction/Deadline'; +import {MosaicGlobalRestrictionTransaction} from '../../../src/model/transaction/MosaicGlobalRestrictionTransaction'; +import {UInt64} from '../../../src/model/UInt64'; +import {TestingAccount} from '../../conf/conf.spec'; + +describe('MosaicGlobalRestrictionTransaction', () => { + let account: Account; + const generationHash = '57F7DA205008026C776CB6AED843393F04CD458E0AA2D9F1D5F31A402072B2D6'; + before(() => { + account = TestingAccount; + }); + + it('should createComplete an MosaicGlobalRestrictionTransaction object and sign', () => { + const mosaicId = new MosaicId(UInt64.fromUint(1).toDTO()); + const referenceMosaicId = new MosaicId(UInt64.fromUint(2).toDTO()); + const mosaicGlobalRestrictionTransaction = MosaicGlobalRestrictionTransaction.create( + Deadline.create(), + mosaicId, + referenceMosaicId, + UInt64.fromUint(1), + UInt64.fromUint(9), + MosaicRestrictionType.EQ, + UInt64.fromUint(8), + MosaicRestrictionType.GE, + NetworkType.MIJIN_TEST, + ); + + expect(mosaicGlobalRestrictionTransaction.mosaicId.toHex()).to.be.equal(mosaicId.toHex()); + expect(mosaicGlobalRestrictionTransaction.referenceMosaicId.toHex()).to.be.equal(referenceMosaicId.toHex()); + expect(mosaicGlobalRestrictionTransaction.restrictionKey.toHex()).to.be.equal(UInt64.fromUint(1).toHex()); + expect(mosaicGlobalRestrictionTransaction.previousRestrictionValue.toHex()).to.be.equal(UInt64.fromUint(9).toHex()); + expect(mosaicGlobalRestrictionTransaction.newRestrictionValue.toHex()).to.be.equal(UInt64.fromUint(8).toHex()); + expect(mosaicGlobalRestrictionTransaction.previousRestrictionType).to.be.equal(MosaicRestrictionType.EQ); + expect(mosaicGlobalRestrictionTransaction.newRestrictionType).to.be.equal(MosaicRestrictionType.GE); + + const signedTransaction = mosaicGlobalRestrictionTransaction.signWith(account, generationHash); + + expect(signedTransaction.payload.substring( + 240, + signedTransaction.payload.length, + )).to.be.equal('010000000000000002000000000000000100000000000000090000000000000001080000000000000006'); + + }); +}); From 3026973a9238fb0cb4a54e90ad5ba72d8f5a5da0 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Fri, 12 Jul 2019 14:47:00 +0100 Subject: [PATCH 05/15] Fixed typo --- src/model/transaction/MosaicAddressRestrictionTransaction.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/model/transaction/MosaicAddressRestrictionTransaction.ts b/src/model/transaction/MosaicAddressRestrictionTransaction.ts index f73a946a16..8c03b28ab6 100644 --- a/src/model/transaction/MosaicAddressRestrictionTransaction.ts +++ b/src/model/transaction/MosaicAddressRestrictionTransaction.ts @@ -38,7 +38,7 @@ export class MosaicAddressRestrictionTransaction extends Transaction { * The mosaic creator can modify the permissions of an account by sending a * mosaic restriction transaction targeting the account address. * - * **MosaicAddressRestrictionTransaction can only be announced in with Aggregated Transaction + * **MosaicAddressRestrictionTransaction can only be announced in with Aggregate Transaction * * @param deadline - The deadline to include the transaction. * @param mosaicId - The mosaic id ex: new MosaicId([481110499, 231112638]). From da5b1362b9cf14ddd802027b62834e36364df4c5 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Mon, 15 Jul 2019 12:33:42 +0100 Subject: [PATCH 06/15] Fixed e2e tests --- e2e/infrastructure/TransactionHttp.spec.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/e2e/infrastructure/TransactionHttp.spec.ts b/e2e/infrastructure/TransactionHttp.spec.ts index a8a10f6596..94370f85db 100644 --- a/e2e/infrastructure/TransactionHttp.spec.ts +++ b/e2e/infrastructure/TransactionHttp.spec.ts @@ -230,7 +230,7 @@ describe('TransactionHttp', () => { ); const signedTransaction = mosaicGlobalRestrictionTransaction.signWith(account, generationHash); - listener.confirmed(account.address).subscribe((transaction: MosaicAliasTransaction) => { + listener.confirmed(account.address).subscribe((transaction: Transaction) => { done(); }); listener.status(account.address).subscribe((error) => { @@ -255,7 +255,7 @@ describe('TransactionHttp', () => { Deadline.create(), mosaicId, new MosaicId(UInt64.fromUint(0).toDTO()), - UInt64.fromUint(9999), + UInt64.fromUint(4444), UInt64.fromUint(10), MosaicRestrictionType.GE, UInt64.fromUint(1), @@ -308,7 +308,6 @@ describe('TransactionHttp', () => { listener.confirmed(account.address).subscribe((transaction: Transaction) => { done(); }); - console.log(SignedTransaction); listener.status(account.address).subscribe((error) => { console.log('Error:', error); assert(false); From b0d250575dbcbbc43ae7f238cf98cf45aa6173e3 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Tue, 16 Jul 2019 14:58:42 +0100 Subject: [PATCH 07/15] Added #204 - Fixed signTransactionGivenSignatures bug - Added e2e test for signTransactionGivenSignatures - Improved unit test for signTransactionGivenSignatures - Fixed typo --- e2e/infrastructure/TransactionHttp.spec.ts | 63 +++++++++++++++++++ .../transaction/CosignatureTransaction.ts | 11 ++-- .../transaction/AggregateTransaction.spec.ts | 22 ++++--- 3 files changed, 84 insertions(+), 12 deletions(-) diff --git a/e2e/infrastructure/TransactionHttp.spec.ts b/e2e/infrastructure/TransactionHttp.spec.ts index dbee30b256..5aed1c6810 100644 --- a/e2e/infrastructure/TransactionHttp.spec.ts +++ b/e2e/infrastructure/TransactionHttp.spec.ts @@ -19,6 +19,7 @@ import {ChronoUnit} from 'js-joda'; import {keccak_256, sha3_256} from 'js-sha3'; import {Crypto} from '../../src/core/crypto'; import { Convert as convert } from '../../src/core/format'; +import { TransactionMapping } from '../../src/core/utils/TransactionMapping'; import {AccountHttp} from '../../src/infrastructure/AccountHttp'; import { NamespaceHttp } from '../../src/infrastructure/infrastructure'; import {Listener} from '../../src/infrastructure/Listener'; @@ -44,6 +45,7 @@ import { AccountRestrictionTransaction } from '../../src/model/transaction/Accou import { AddressAliasTransaction } from '../../src/model/transaction/AddressAliasTransaction'; import {AggregateTransaction} from '../../src/model/transaction/AggregateTransaction'; import {CosignatureSignedTransaction} from '../../src/model/transaction/CosignatureSignedTransaction'; +import { CosignatureTransaction } from '../../src/model/transaction/CosignatureTransaction'; import {Deadline} from '../../src/model/transaction/Deadline'; import { HashLockTransaction } from '../../src/model/transaction/HashLockTransaction'; import {HashType} from '../../src/model/transaction/HashType'; @@ -1641,6 +1643,67 @@ describe('TransactionHttp', () => { }); }); + describe('SignTransactionGivenSignatures', () => { + let listener: Listener; + before (() => { + listener = new Listener(config.apiUrl); + return listener.open(); + }); + after(() => { + return listener.close(); + }); + it('Announce cosign signatures given', (done) => { + + /** + * @see https://github.com/nemtech/nem2-sdk-typescript-javascript/issues/112 + */ + // AliceAccount: account + // BobAccount: account + + const sendAmount = NetworkCurrencyMosaic.createRelative(1000); + const backAmount = NetworkCurrencyMosaic.createRelative(1); + + const aliceTransferTransaction = TransferTransaction.create(Deadline.create(), account2.address, [sendAmount], + PlainMessage.create('payout'), NetworkType.MIJIN_TEST); + const bobTransferTransaction = TransferTransaction.create(Deadline.create(), account.address, [backAmount], + PlainMessage.create('payout'), NetworkType.MIJIN_TEST); + + // 01. Alice creates the aggregated tx and sign it. Then payload send to Bob + const aggregateTransaction = AggregateTransaction.createComplete( + Deadline.create(), + [ + aliceTransferTransaction.toAggregate(account.publicAccount), + bobTransferTransaction.toAggregate(account2.publicAccount), + ], + NetworkType.MIJIN_TEST, + [], + ); + + const aliceSignedTransaction = aggregateTransaction.signWith(account, generationHash); + + // 02 Bob cosigns the tx and sends it back to Alice + const signedTxBob = CosignatureTransaction.signTransactionPayload(account2, aliceSignedTransaction.payload, generationHash); + + // 03. Alice collects the cosignatures, recreate, sign, and announces the transaction + const cosignatureSignedTransactions = [ + new CosignatureSignedTransaction(signedTxBob.parentHash, signedTxBob.signature, signedTxBob.signer), + ]; + const recreatedTx = TransactionMapping.createFromPayload(aliceSignedTransaction.payload) as AggregateTransaction; + + const signedTransaction = recreatedTx.signTransactionGivenSignatures(account, cosignatureSignedTransactions, generationHash); + + listener.confirmed(account.address).subscribe(() => { + done(); + }); + listener.status(account.address).subscribe((error) => { + console.log('Error:', error); + assert(false); + done(); + }); + transactionHttp.announce(signedTransaction); + }); + }); + describe('transactions', () => { it('should call transactions successfully', (done) => { accountHttp.transactions(account.publicAccount).subscribe((transactions) => { diff --git a/src/model/transaction/CosignatureTransaction.ts b/src/model/transaction/CosignatureTransaction.ts index 1eb021e01a..2f37079c9f 100644 --- a/src/model/transaction/CosignatureTransaction.ts +++ b/src/model/transaction/CosignatureTransaction.ts @@ -15,11 +15,12 @@ */ import { SignSchema } from '../../core/crypto'; +import { Convert } from '../../core/format/Convert'; import {CosignatureTransaction as CosignaturetransactionLibrary} from '../../infrastructure/builders/CosignatureTransaction'; +import { VerifiableTransaction } from '../../infrastructure/builders/VerifiableTransaction'; import {Account} from '../account/Account'; import {AggregateTransaction} from './AggregateTransaction'; import {CosignatureSignedTransaction} from './CosignatureSignedTransaction'; -import { VerifiableTransaction } from '../../infrastructure/builders/VerifiableTransaction'; /** * Cosignature transaction is used to sign an aggregate transactions with missing cosignatures. @@ -52,14 +53,14 @@ export class CosignatureTransaction { * Creating a new CosignatureSignedTransaction * @param account - The signing account * @param payload - off transaction payload (aggregated transaction is unannounced) - * @param gernationHash - Network generation hash + * @param generationHash - Network generation hash * @returns {CosignatureSignedTransaction} */ - public static signTransactionPayload(account: Account, payload: string, gernationHash: string): CosignatureSignedTransaction { + public static signTransactionPayload(account: Account, payload: string, generationHash: string): CosignatureSignedTransaction { /** * For aggregated complete transaction, cosignatories are gathered off chain announced. */ - const transactionHash = VerifiableTransaction.createTransactionHash(payload, gernationHash); + const transactionHash = VerifiableTransaction.createTransactionHash(payload, Array.from(Convert.hexToUint8(generationHash))); const aggregateSignatureTransaction = new CosignaturetransactionLibrary(transactionHash); const signedTransactionRaw = aggregateSignatureTransaction.signCosignatoriesTransaction(account); return new CosignatureSignedTransaction(signedTransactionRaw.parentHash, @@ -81,4 +82,4 @@ export class CosignatureTransaction { signedTransactionRaw.signature, signedTransactionRaw.signer); } -} \ No newline at end of file +} diff --git a/test/model/transaction/AggregateTransaction.spec.ts b/test/model/transaction/AggregateTransaction.spec.ts index 571df9defe..fa204a7500 100644 --- a/test/model/transaction/AggregateTransaction.spec.ts +++ b/test/model/transaction/AggregateTransaction.spec.ts @@ -388,7 +388,7 @@ describe('AggregateTransaction', () => { it('Should create signed transaction with cosignatories - Aggregated Complete', () => { /** - * https://github.com/nemtech/nem2-sdk-typescript-javascript/issues/112 + * @see https://github.com/nemtech/nem2-sdk-typescript-javascript/issues/112 */ const accountAlice = TestingAccount; const accountBob = CosignatoryAccount; @@ -410,8 +410,8 @@ describe('AggregateTransaction', () => { PlainMessage.create('c to a'), NetworkType.MIJIN_TEST); - // 01. Alice creates the aggregated tx and serialize it, Then payload send to Bob & Carol - const aggregateTransactionPayload = AggregateTransaction.createComplete( + // 01. Alice creates the aggregated tx and sign it, Then payload send to Bob & Carol + const aggregateTransaction = AggregateTransaction.createComplete( Deadline.create(), [ AtoBTx.toAggregate(accountAlice.publicAccount), @@ -419,13 +419,15 @@ describe('AggregateTransaction', () => { CtoATx.toAggregate(accountCarol.publicAccount)], NetworkType.MIJIN_TEST, [], - ).serialize(); + ); + + const aliceSignedTransaction = aggregateTransaction.signWith(accountAlice, generationHash); // 02.1 Bob cosigns the tx and sends it back to Alice - const signedTxBob = CosignatureTransaction.signTransactionPayload(accountBob, aggregateTransactionPayload, generationHash); + const signedTxBob = CosignatureTransaction.signTransactionPayload(accountBob, aliceSignedTransaction.payload, generationHash); // 02.2 Carol cosigns the tx and sends it back to Alice - const signedTxCarol = CosignatureTransaction.signTransactionPayload(accountCarol, aggregateTransactionPayload, generationHash); + const signedTxCarol = CosignatureTransaction.signTransactionPayload(accountCarol, aliceSignedTransaction.payload, generationHash); // 03. Alice collects the cosignatures, recreate, sign, and announces the transaction @@ -435,7 +437,7 @@ describe('AggregateTransaction', () => { new CosignatureSignedTransaction(signedTxCarol.parentHash, signedTxCarol.signature, signedTxCarol.signer), ]; - const recreatedTx = TransactionMapping.createFromPayload(aggregateTransactionPayload) as AggregateTransaction; + const recreatedTx = TransactionMapping.createFromPayload(aliceSignedTransaction.payload) as AggregateTransaction; const signedTransaction = recreatedTx.signTransactionGivenSignatures(accountAlice, cosignatureSignedTransactions, generationHash); @@ -443,6 +445,12 @@ describe('AggregateTransaction', () => { expect(signedTransaction.signer).to.be.equal(accountAlice.publicKey); expect(signedTransaction.payload.indexOf(accountBob.publicKey) > -1).to.be.true; expect(signedTransaction.payload.indexOf(accountCarol.publicKey) > -1).to.be.true; + + // To make sure that the new cosign method returns the same payload & hash as standard cosigning + const standardCosignedTransaction = aggregateTransaction + .signTransactionWithCosignatories(accountAlice, [accountBob, accountCarol], generationHash); + expect(standardCosignedTransaction.payload).to.be.equal(signedTransaction.payload); + expect(standardCosignedTransaction.hash).to.be.equal(signedTransaction.hash); }); describe('size', () => { From e11205c9068f03841d892964328a268e9eac18a6 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Tue, 16 Jul 2019 15:02:49 +0100 Subject: [PATCH 08/15] Added signSchema to signWithPayload --- src/infrastructure/builders/AggregateTransaction.ts | 2 +- src/model/transaction/CosignatureTransaction.ts | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/infrastructure/builders/AggregateTransaction.ts b/src/infrastructure/builders/AggregateTransaction.ts index 96790b9a0f..8aae5a5e28 100644 --- a/src/infrastructure/builders/AggregateTransaction.ts +++ b/src/infrastructure/builders/AggregateTransaction.ts @@ -56,7 +56,7 @@ export class AggregateTransaction extends VerifiableTransaction { return signedTransaction; } - signTransactionGivenSignatures(initializer, cosignedSignedTransactions, generationHash, signSchema) { + signTransactionGivenSignatures(initializer, cosignedSignedTransactions, generationHash, signSchema = SignSchema.SHA3) { const signedTransaction = this.signTransaction(initializer, generationHash, signSchema); cosignedSignedTransactions.forEach((cosignedTransaction) => { signedTransaction.payload = signedTransaction.payload + cosignedTransaction.signer + cosignedTransaction.signature; diff --git a/src/model/transaction/CosignatureTransaction.ts b/src/model/transaction/CosignatureTransaction.ts index 2f37079c9f..d1b6ddc5b5 100644 --- a/src/model/transaction/CosignatureTransaction.ts +++ b/src/model/transaction/CosignatureTransaction.ts @@ -54,15 +54,19 @@ export class CosignatureTransaction { * @param account - The signing account * @param payload - off transaction payload (aggregated transaction is unannounced) * @param generationHash - Network generation hash + * @param {SignSchema} signSchema The Sign Schema. (KECCAK_REVERSED_KEY / SHA3) * @returns {CosignatureSignedTransaction} */ - public static signTransactionPayload(account: Account, payload: string, generationHash: string): CosignatureSignedTransaction { + public static signTransactionPayload(account: Account, + payload: string, + generationHash: string, + signSchema: SignSchema = SignSchema.SHA3): CosignatureSignedTransaction { /** * For aggregated complete transaction, cosignatories are gathered off chain announced. */ const transactionHash = VerifiableTransaction.createTransactionHash(payload, Array.from(Convert.hexToUint8(generationHash))); const aggregateSignatureTransaction = new CosignaturetransactionLibrary(transactionHash); - const signedTransactionRaw = aggregateSignatureTransaction.signCosignatoriesTransaction(account); + const signedTransactionRaw = aggregateSignatureTransaction.signCosignatoriesTransaction(account, signSchema); return new CosignatureSignedTransaction(signedTransactionRaw.parentHash, signedTransactionRaw.signature, signedTransactionRaw.signer); From 7d4d4b52641b6824a1c52b6ce2f5976dea8db765 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Tue, 16 Jul 2019 15:32:23 +0100 Subject: [PATCH 09/15] Updated e2e test to use random number --- e2e/infrastructure/TransactionHttp.spec.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/e2e/infrastructure/TransactionHttp.spec.ts b/e2e/infrastructure/TransactionHttp.spec.ts index 94370f85db..f539d7d1f3 100644 --- a/e2e/infrastructure/TransactionHttp.spec.ts +++ b/e2e/infrastructure/TransactionHttp.spec.ts @@ -221,7 +221,7 @@ describe('TransactionHttp', () => { Deadline.create(), mosaicId, new MosaicId(UInt64.fromUint(0).toDTO()), - UInt64.fromUint(4444), + UInt64.fromUint(60641), UInt64.fromUint(0), MosaicRestrictionType.NONE, UInt64.fromUint(0), @@ -255,9 +255,9 @@ describe('TransactionHttp', () => { Deadline.create(), mosaicId, new MosaicId(UInt64.fromUint(0).toDTO()), - UInt64.fromUint(4444), - UInt64.fromUint(10), - MosaicRestrictionType.GE, + UInt64.fromUint(60641), + UInt64.fromUint(0), + MosaicRestrictionType.NONE, UInt64.fromUint(1), MosaicRestrictionType.GE, NetworkType.MIJIN_TEST, @@ -293,7 +293,7 @@ describe('TransactionHttp', () => { const mosaicAddressRestrictionTransaction = MosaicAddressRestrictionTransaction.create( Deadline.create(), mosaicId, - UInt64.fromUint(4444), + UInt64.fromUint(60641), account3.address, UInt64.fromHex('FFFFFFFFFFFFFFFF'), UInt64.fromUint(2), From 60bcc15d9b42076dd1b5bfc80e44ec3a4f6952eb Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Tue, 16 Jul 2019 15:33:28 +0100 Subject: [PATCH 10/15] Updated e2e test to use random number --- e2e/infrastructure/TransactionHttp.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/infrastructure/TransactionHttp.spec.ts b/e2e/infrastructure/TransactionHttp.spec.ts index f539d7d1f3..51c85b0408 100644 --- a/e2e/infrastructure/TransactionHttp.spec.ts +++ b/e2e/infrastructure/TransactionHttp.spec.ts @@ -257,7 +257,7 @@ describe('TransactionHttp', () => { new MosaicId(UInt64.fromUint(0).toDTO()), UInt64.fromUint(60641), UInt64.fromUint(0), - MosaicRestrictionType.NONE, + MosaicRestrictionType.GE, UInt64.fromUint(1), MosaicRestrictionType.GE, NetworkType.MIJIN_TEST, From a21f98041903f2f15cc8596f5569a035af1cb9ab Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Tue, 16 Jul 2019 15:42:55 +0100 Subject: [PATCH 11/15] Exposed signTransactionGivenSignatures method --- src/model/account/Account.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/model/account/Account.ts b/src/model/account/Account.ts index 7e26c2d4f9..7395b232fb 100644 --- a/src/model/account/Account.ts +++ b/src/model/account/Account.ts @@ -171,6 +171,21 @@ export class Account { return transaction.signTransactionWithCosignatories(this, cosignatories, generationHash, signSchema); } + /** + * Sign transaction with cosignatories collected from cosigned transactions and creating a new SignedTransaction + * For off chain Aggregated Complete Transaction co-signing. + * @param initiatorAccount - Initiator account + * @param {CosignatureSignedTransaction[]} cosignatureSignedTransactions - Array of cosigned transaction + * @param generationHash - Network generation hash hex + * @param {SignSchema} signSchema The Sign Schema. (KECCAK_REVERSED_KEY / SHA3) + * @return {SignedTransaction} + */ + public signTransactionGivenSignatures(transaction: AggregateTransaction, + cosignatureSignedTransactions: CosignatureSignedTransaction[], + generationHash: string, + signSchema: SignSchema = SignSchema.SHA3): SignedTransaction { + return transaction.signTransactionGivenSignatures(this, cosignatureSignedTransactions, generationHash, signSchema); + } /** * Sign aggregate signature transaction * @param cosignatureTransaction - The aggregate signature transaction. From 33b3bef93fb2dfa147022a2af154e898c88824fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20Saive?= Date: Sun, 21 Jul 2019 13:23:42 +0200 Subject: [PATCH 12/15] Revert "Fixed compatibility issue on new rxjs version" --- src/infrastructure/AccountHttp.ts | 220 +++++++----------- src/infrastructure/BlockHttp.ts | 159 ++++++------- src/infrastructure/ChainHttp.ts | 31 +-- src/infrastructure/DiagnosticHttp.ts | 35 ++- src/infrastructure/Http.ts | 11 - src/infrastructure/MosaicHttp.ts | 152 ++++++------ src/infrastructure/NamespaceHttp.ts | 97 +++----- src/infrastructure/NetworkHttp.ts | 23 +- src/infrastructure/NodeHttp.ts | 42 ++-- src/infrastructure/TransactionHttp.ts | 69 ++---- src/infrastructure/api/accountRoutesApi.ts | 84 +++++-- src/infrastructure/api/blockRoutesApi.ts | 42 +++- src/infrastructure/api/chainRoutesApi.ts | 14 +- src/infrastructure/api/diagnosticRoutesApi.ts | 14 +- src/infrastructure/api/mosaicRoutesApi.ts | 21 +- src/infrastructure/api/namespaceRoutesApi.ts | 28 ++- src/infrastructure/api/networkRoutesApi.ts | 7 +- src/infrastructure/api/nodeRoutesApi.ts | 14 +- .../api/transactionRoutesApi.ts | 49 ++-- .../templates/api-single.mustache | 7 +- test/infrastructure/TransactionHttp.spec.ts | 11 +- 21 files changed, 543 insertions(+), 587 deletions(-) diff --git a/src/infrastructure/AccountHttp.ts b/src/infrastructure/AccountHttp.ts index aed431fd19..6ef6ba3fae 100644 --- a/src/infrastructure/AccountHttp.ts +++ b/src/infrastructure/AccountHttp.ts @@ -14,9 +14,8 @@ * limitations under the License. */ -import { ClientResponse } from 'http'; -import {from as observableFrom, Observable, throwError} from 'rxjs'; -import {catchError, map, mergeMap} from 'rxjs/operators'; +import {from as observableFrom, Observable} from 'rxjs'; +import {map, mergeMap} from 'rxjs/operators'; import { DtoMapping } from '../core/utils/DtoMapping'; import {AccountInfo} from '../model/account/AccountInfo'; import { AccountNames } from '../model/account/AccountNames'; @@ -35,6 +34,7 @@ import {UInt64} from '../model/UInt64'; import {AccountRepository} from './AccountRepository'; import { AccountInfoDTO, AccountNamesDTO, + AccountRestrictionsDTO, AccountRestrictionsInfoDTO, AccountRoutesApi, MosaicDTO, @@ -75,25 +75,21 @@ export class AccountHttp extends Http implements AccountRepository { * @returns Observable */ public getAccountInfo(address: Address): Observable { - return observableFrom(this.accountRoutesApi.getAccountInfo(address.plain())).pipe( - map((response: { response: ClientResponse; body: AccountInfoDTO; }) => { - const accountInfoDTO = response.body; - return new AccountInfo( - accountInfoDTO.meta, - Address.createFromEncoded(accountInfoDTO.account.address), - new UInt64(accountInfoDTO.account.addressHeight), - accountInfoDTO.account.publicKey, - new UInt64(accountInfoDTO.account.publicKeyHeight), - accountInfoDTO.account.mosaics.map((mosaicDTO) => new Mosaic( - new MosaicId(mosaicDTO.id), - new UInt64(mosaicDTO.amount), - )), - new UInt64(accountInfoDTO.account.importance), - new UInt64(accountInfoDTO.account.importanceHeight), - ); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + return observableFrom(this.accountRoutesApi.getAccountInfo(address.plain())).pipe(map((accountInfoDTO: AccountInfoDTO) => { + return new AccountInfo( + accountInfoDTO.meta, + Address.createFromEncoded(accountInfoDTO.account.address), + new UInt64(accountInfoDTO.account.addressHeight), + accountInfoDTO.account.publicKey, + new UInt64(accountInfoDTO.account.publicKeyHeight), + accountInfoDTO.account.mosaics.map((mosaicDTO) => new Mosaic( + new MosaicId(mosaicDTO.id), + new UInt64(mosaicDTO.amount), + )), + new UInt64(accountInfoDTO.account.importance), + new UInt64(accountInfoDTO.account.importanceHeight), + ); + })); } /** @@ -103,12 +99,9 @@ export class AccountHttp extends Http implements AccountRepository { */ public getAccountRestrictions(address: Address): Observable { return observableFrom(this.accountRoutesApi.getAccountRestrictions(address.plain())) - .pipe(map((response: { response: ClientResponse; body: AccountRestrictionsInfoDTO; }) => { - const accountRestrictions = response.body; - return DtoMapping.extractAccountRestrictionFromDto(accountRestrictions); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + .pipe(map((accountRestrictions: AccountRestrictionsInfoDTO) => { + return DtoMapping.extractAccountRestrictionFromDto(accountRestrictions); + })); } /** @@ -122,14 +115,11 @@ export class AccountHttp extends Http implements AccountRepository { }; return observableFrom( this.accountRoutesApi.getAccountRestrictionsFromAccounts(accountIds)) - .pipe(map((response: { response: ClientResponse; body: AccountRestrictionsInfoDTO[]; }) => { - const accountRestrictions = response.body; - return accountRestrictions.map((restriction) => { - return DtoMapping.extractAccountRestrictionFromDto(restriction); - }); - }), - catchError((error) => throwError(error)), - ); + .pipe(map((accountRestrictions: AccountRestrictionsDTO[]) => { + return accountRestrictions.map((restriction) => { + return DtoMapping.extractAccountRestrictionFromDto(restriction); + }); + })); } /** @@ -142,25 +132,21 @@ export class AccountHttp extends Http implements AccountRepository { addresses: addresses.map((address) => address.plain()), }; return observableFrom( - this.accountRoutesApi.getAccountsInfo(accountIdsBody)).pipe( - map((response: { response: ClientResponse; body: AccountInfoDTO[]; }) => { - const accountsInfoMetaDataDTO = response.body; - return accountsInfoMetaDataDTO.map((accountInfoDTO: AccountInfoDTO) => { - return new AccountInfo( - accountInfoDTO.meta, - Address.createFromEncoded(accountInfoDTO.account.address), - new UInt64(accountInfoDTO.account.addressHeight), - accountInfoDTO.account.publicKey, - new UInt64(accountInfoDTO.account.publicKeyHeight), - accountInfoDTO.account.mosaics.map((mosaicDTO: MosaicDTO) => - new Mosaic(new MosaicId(mosaicDTO.id), new UInt64(mosaicDTO.amount))), - new UInt64(accountInfoDTO.account.importance), - new UInt64(accountInfoDTO.account.importanceHeight), - ); - }); - }), - catchError((error) => throwError(error)), - ); + this.accountRoutesApi.getAccountsInfo(accountIdsBody)).pipe(map((accountsInfoMetaDataDTO: AccountInfoDTO[]) => { + return accountsInfoMetaDataDTO.map((accountInfoDTO: AccountInfoDTO) => { + return new AccountInfo( + accountInfoDTO.meta, + Address.createFromEncoded(accountInfoDTO.account.address), + new UInt64(accountInfoDTO.account.addressHeight), + accountInfoDTO.account.publicKey, + new UInt64(accountInfoDTO.account.publicKeyHeight), + accountInfoDTO.account.mosaics.map((mosaicDTO: MosaicDTO) => + new Mosaic(new MosaicId(mosaicDTO.id), new UInt64(mosaicDTO.amount))), + new UInt64(accountInfoDTO.account.importance), + new UInt64(accountInfoDTO.account.importanceHeight), + ); + }); + })); } public getAccountsNames(addresses: Address[]): Observable { @@ -168,20 +154,16 @@ export class AccountHttp extends Http implements AccountRepository { addresses: addresses.map((address) => address.plain()), }; return observableFrom( - this.accountRoutesApi.getAccountsNames(accountIdsBody)).pipe( - map((response: { response: ClientResponse; body: AccountNamesDTO[]; }) => { - const accountNames = response.body; - return accountNames.map((accountName) => { - return new AccountNames( - Address.createFromEncoded(accountName.address), - accountName.names.map((name) => { - return new NamespaceName(new NamespaceId(name), name); - }), - ); - }); - }), - catchError((error) => throwError(error)), - ); + this.accountRoutesApi.getAccountsNames(accountIdsBody)).pipe(map((accountNames: AccountNamesDTO[]) => { + return accountNames.map((accountName) => { + return new AccountNames( + Address.createFromEncoded(accountName.address), + accountName.names.map((name) => { + return new NamespaceName(new NamespaceId(name), name); + }), + ); + }); + })); } /** * Gets a MultisigAccountInfo for an account. @@ -192,20 +174,17 @@ export class AccountHttp extends Http implements AccountRepository { return this.getNetworkTypeObservable().pipe( mergeMap((networkType) => observableFrom( this.accountRoutesApi.getAccountMultisig(address.plain())) - .pipe(map((response: { response: ClientResponse; body: MultisigAccountInfoDTO; }) => { - const multisigAccountInfoDTO = response.body; - return new MultisigAccountInfo( - PublicAccount.createFromPublicKey(multisigAccountInfoDTO.multisig.account, networkType), - multisigAccountInfoDTO.multisig.minApproval, - multisigAccountInfoDTO.multisig.minRemoval, - multisigAccountInfoDTO.multisig.cosignatories - .map((cosigner) => PublicAccount.createFromPublicKey(cosigner, networkType)), - multisigAccountInfoDTO.multisig.multisigAccounts - .map((multisigAccount) => PublicAccount.createFromPublicKey(multisigAccount, networkType)), - ); - }), - catchError((error) => throwError(error)), - ))); + .pipe(map((multisigAccountInfoDTO: MultisigAccountInfoDTO) => { + return new MultisigAccountInfo( + PublicAccount.createFromPublicKey(multisigAccountInfoDTO.multisig.account, networkType), + multisigAccountInfoDTO.multisig.minApproval, + multisigAccountInfoDTO.multisig.minRemoval, + multisigAccountInfoDTO.multisig.cosignatories + .map((cosigner) => PublicAccount.createFromPublicKey(cosigner, networkType)), + multisigAccountInfoDTO.multisig.multisigAccounts + .map((multisigAccount) => PublicAccount.createFromPublicKey(multisigAccount, networkType)), + ); + })))); } /** @@ -217,28 +196,24 @@ export class AccountHttp extends Http implements AccountRepository { return this.getNetworkTypeObservable().pipe( mergeMap((networkType) => observableFrom( this.accountRoutesApi.getAccountMultisigGraph(address.plain())) - .pipe(map((response: { response: ClientResponse; body: MultisigAccountGraphInfoDTO[]; }) => { - const multisigAccountGraphInfosDTO = response.body; - const multisigAccounts = new Map(); - multisigAccountGraphInfosDTO.map((multisigAccountGraphInfoDTO) => { - multisigAccounts.set(multisigAccountGraphInfoDTO.level, - multisigAccountGraphInfoDTO.multisigEntries.map((multisigAccountInfoDTO) => { - return new MultisigAccountInfo( - PublicAccount.createFromPublicKey(multisigAccountInfoDTO.multisig.account, networkType), - multisigAccountInfoDTO.multisig.minApproval, - multisigAccountInfoDTO.multisig.minRemoval, - multisigAccountInfoDTO.multisig.cosignatories - .map((cosigner) => PublicAccount.createFromPublicKey(cosigner, networkType)), - multisigAccountInfoDTO.multisig.multisigAccounts - .map((multisigAccountDTO) => - PublicAccount.createFromPublicKey(multisigAccountDTO, networkType))); - }), - ); - }); - return new MultisigAccountGraphInfo(multisigAccounts); - }), - catchError((error) => throwError(error)), - ))); + .pipe(map((multisigAccountGraphInfosDTO: MultisigAccountGraphInfoDTO[]) => { + const multisigAccounts = new Map(); + multisigAccountGraphInfosDTO.map((multisigAccountGraphInfoDTO) => { + multisigAccounts.set(multisigAccountGraphInfoDTO.level, + multisigAccountGraphInfoDTO.multisigEntries.map((multisigAccountInfoDTO) => { + return new MultisigAccountInfo( + PublicAccount.createFromPublicKey(multisigAccountInfoDTO.multisig.account, networkType), + multisigAccountInfoDTO.multisig.minApproval, + multisigAccountInfoDTO.multisig.minRemoval, + multisigAccountInfoDTO.multisig.cosignatories + .map((cosigner) => PublicAccount.createFromPublicKey(cosigner, networkType)), + multisigAccountInfoDTO.multisig.multisigAccounts + .map((multisigAccountDTO) => PublicAccount.createFromPublicKey(multisigAccountDTO, networkType))); + }), + ); + }); + return new MultisigAccountGraphInfo(multisigAccounts); + })))); } /** @@ -253,14 +228,11 @@ export class AccountHttp extends Http implements AccountRepository { this.queryParams(queryParams).pageSize, this.queryParams(queryParams).id, this.queryParams(queryParams).order)).pipe( - map((response: { response: ClientResponse; body: TransactionInfoDTO[]; }) => { - const transactionsDTO = response.body; + map((transactionsDTO: TransactionInfoDTO[]) => { return transactionsDTO.map((transactionDTO) => { return CreateTransactionFromDTO(transactionDTO); }); - }), - catchError((error) => throwError(error)), - ); + })); } /** @@ -276,14 +248,11 @@ export class AccountHttp extends Http implements AccountRepository { this.queryParams(queryParams).pageSize, this.queryParams(queryParams).id, this.queryParams(queryParams).order)).pipe( - map((response: { response: ClientResponse; body: TransactionInfoDTO[]; }) => { - const transactionsDTO = response.body; + map((transactionsDTO: TransactionInfoDTO[]) => { return transactionsDTO.map((transactionDTO) => { return CreateTransactionFromDTO(transactionDTO); }); - }), - catchError((error) => throwError(error)), - ); + })); } /** @@ -299,14 +268,11 @@ export class AccountHttp extends Http implements AccountRepository { this.queryParams(queryParams).pageSize, this.queryParams(queryParams).id, this.queryParams(queryParams).order)).pipe( - map((response: { response: ClientResponse; body: TransactionInfoDTO[]; }) => { - const transactionsDTO = response.body; + map((transactionsDTO: TransactionInfoDTO[]) => { return transactionsDTO.map((transactionDTO) => { return CreateTransactionFromDTO(transactionDTO); }); - }), - catchError((error) => throwError(error)), - ); + })); } /** @@ -323,14 +289,11 @@ export class AccountHttp extends Http implements AccountRepository { this.queryParams(queryParams).pageSize, this.queryParams(queryParams).id, this.queryParams(queryParams).order)).pipe( - map((response: { response: ClientResponse; body: TransactionInfoDTO[]; }) => { - const transactionsDTO = response.body; + map((transactionsDTO: TransactionInfoDTO[]) => { return transactionsDTO.map((transactionDTO) => { return CreateTransactionFromDTO(transactionDTO); }); - }), - catchError((error) => throwError(error)), - ); + })); } /** @@ -346,13 +309,10 @@ export class AccountHttp extends Http implements AccountRepository { this.queryParams(queryParams).pageSize, this.queryParams(queryParams).id, this.queryParams(queryParams).order)).pipe( - map((response: { response: ClientResponse; body: TransactionInfoDTO[]; }) => { - const transactionsDTO = response.body; + map((transactionsDTO: TransactionInfoDTO[]) => { return transactionsDTO.map((transactionDTO) => { return CreateTransactionFromDTO(transactionDTO) as AggregateTransaction; }); - }), - catchError((error) => throwError(error)), - ); + })); } } diff --git a/src/infrastructure/BlockHttp.ts b/src/infrastructure/BlockHttp.ts index a6f4ce9bb8..f04089fb52 100644 --- a/src/infrastructure/BlockHttp.ts +++ b/src/infrastructure/BlockHttp.ts @@ -14,9 +14,8 @@ * limitations under the License. */ -import { ClientResponse } from 'http'; -import {from as observableFrom, Observable, throwError} from 'rxjs'; -import {catchError, map, mergeMap} from 'rxjs/operators'; +import {from as observableFrom, Observable} from 'rxjs'; +import {map, mergeMap} from 'rxjs/operators'; import {PublicAccount} from '../model/account/PublicAccount'; import {BlockInfo} from '../model/blockchain/BlockInfo'; import { MerklePathItem } from '../model/blockchain/MerklePathItem'; @@ -80,33 +79,29 @@ export class BlockHttp extends Http implements BlockRepository { * @returns Observable */ public getBlockByHeight(height: number): Observable { - return observableFrom(this.blockRoutesApi.getBlockByHeight(height)).pipe( - map((response: { response: ClientResponse; body: BlockInfoDTO; } ) => { - const blockDTO = response.body; - const networkType = parseInt((blockDTO.block.version as number).toString(16).substr(0, 2), 16); - return new BlockInfo( - blockDTO.meta.hash, - blockDTO.meta.generationHash, - new UInt64(blockDTO.meta.totalFee), - blockDTO.meta.numTransactions, - blockDTO.block.signature, - PublicAccount.createFromPublicKey(blockDTO.block.signer, networkType), - networkType, - parseInt((blockDTO.block.version as number).toString(16).substr(2, 2), 16), // Tx version - blockDTO.block.type, - new UInt64(blockDTO.block.height), - new UInt64(blockDTO.block.timestamp), - new UInt64(blockDTO.block.difficulty), - blockDTO.block.feeMultiplier, - blockDTO.block.previousBlockHash, - blockDTO.block.blockTransactionsHash, - blockDTO.block.blockReceiptsHash, - blockDTO.block.stateHash, - extractBeneficiary(blockDTO, networkType), - ); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + return observableFrom(this.blockRoutesApi.getBlockByHeight(height)).pipe(map((blockDTO: BlockInfoDTO) => { + const networkType = parseInt((blockDTO.block.version as number).toString(16).substr(0, 2), 16); + return new BlockInfo( + blockDTO.meta.hash, + blockDTO.meta.generationHash, + new UInt64(blockDTO.meta.totalFee), + blockDTO.meta.numTransactions, + blockDTO.block.signature, + PublicAccount.createFromPublicKey(blockDTO.block.signer, networkType), + networkType, + parseInt((blockDTO.block.version as number).toString(16).substr(2, 2), 16), // Tx version + blockDTO.block.type, + new UInt64(blockDTO.block.height), + new UInt64(blockDTO.block.timestamp), + new UInt64(blockDTO.block.difficulty), + blockDTO.block.feeMultiplier, + blockDTO.block.previousBlockHash, + blockDTO.block.blockTransactionsHash, + blockDTO.block.blockReceiptsHash, + blockDTO.block.stateHash, + extractBeneficiary(blockDTO, networkType), + ); + })); } /** @@ -122,14 +117,11 @@ export class BlockHttp extends Http implements BlockRepository { this.queryParams(queryParams).pageSize, this.queryParams(queryParams).id, this.queryParams(queryParams).order)) - .pipe(map((response: { response: ClientResponse; body: TransactionInfoDTO[]; }) => { - const transactionsDTO = response.body; + .pipe(map((transactionsDTO: TransactionInfoDTO[]) => { return transactionsDTO.map((transactionDTO) => { return CreateTransactionFromDTO(transactionDTO); }); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + })); } /** @@ -140,35 +132,31 @@ export class BlockHttp extends Http implements BlockRepository { */ public getBlocksByHeightWithLimit(height: number, limit: LimitType = LimitType.N_25): Observable { return observableFrom( - this.blockRoutesApi.getBlocksByHeightWithLimit(height, limit)).pipe( - map((response: { response: ClientResponse; body: BlockInfoDTO[]; }) => { - const blocksDTO = response.body; - return blocksDTO.map((blockDTO) => { - const networkType = parseInt((blockDTO.block.version as number).toString(16).substr(0, 2), 16); - return new BlockInfo( - blockDTO.meta.hash, - blockDTO.meta.generationHash, - new UInt64(blockDTO.meta.totalFee), - blockDTO.meta.numTransactions, - blockDTO.block.signature, - PublicAccount.createFromPublicKey(blockDTO.block.signer, networkType), - networkType, - parseInt((blockDTO.block.version as number).toString(16).substr(2, 2), 16), // Tx version - blockDTO.block.type, - new UInt64(blockDTO.block.height), - new UInt64(blockDTO.block.timestamp), - new UInt64(blockDTO.block.difficulty), - blockDTO.block.feeMultiplier, - blockDTO.block.previousBlockHash, - blockDTO.block.blockTransactionsHash, - blockDTO.block.blockReceiptsHash, - blockDTO.block.stateHash, - extractBeneficiary(blockDTO, networkType), - ); - }); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + this.blockRoutesApi.getBlocksByHeightWithLimit(height, limit)).pipe(map((blocksDTO: BlockInfoDTO[]) => { + return blocksDTO.map((blockDTO) => { + const networkType = parseInt((blockDTO.block.version as number).toString(16).substr(0, 2), 16); + return new BlockInfo( + blockDTO.meta.hash, + blockDTO.meta.generationHash, + new UInt64(blockDTO.meta.totalFee), + blockDTO.meta.numTransactions, + blockDTO.block.signature, + PublicAccount.createFromPublicKey(blockDTO.block.signer, networkType), + networkType, + parseInt((blockDTO.block.version as number).toString(16).substr(2, 2), 16), // Tx version + blockDTO.block.type, + new UInt64(blockDTO.block.height), + new UInt64(blockDTO.block.timestamp), + new UInt64(blockDTO.block.difficulty), + blockDTO.block.feeMultiplier, + blockDTO.block.previousBlockHash, + blockDTO.block.blockTransactionsHash, + blockDTO.block.blockReceiptsHash, + blockDTO.block.stateHash, + extractBeneficiary(blockDTO, networkType), + ); + }); + })); } /** @@ -183,18 +171,14 @@ export class BlockHttp extends Http implements BlockRepository { */ public getMerkleReceipts(height: number, hash: string): Observable { return observableFrom( - this.blockRoutesApi.getMerkleReceipts(height, hash)).pipe( - map((response: { response: ClientResponse; body: MerkleProofInfoDTO; } ) => { - const merkleProofReceipt = response.body; - return new MerkleProofInfo( - new MerkleProofInfoPayload( - merkleProofReceipt.payload.merklePath!.map( - (payload) => new MerklePathItem(payload.position, payload.hash))), - merkleProofReceipt.type, - ); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + this.blockRoutesApi.getMerkleReceipts(height, hash)).pipe(map((merkleProofReceipt: MerkleProofInfoDTO) => { + return new MerkleProofInfo( + new MerkleProofInfoPayload( + merkleProofReceipt.payload.merklePath!.map( + (payload) => new MerklePathItem(payload.position, payload.hash))), + merkleProofReceipt.type, + ); + })); } /** @@ -209,18 +193,13 @@ export class BlockHttp extends Http implements BlockRepository { */ public getMerkleTransaction(height: number, hash: string): Observable { return observableFrom( - this.blockRoutesApi.getMerkleReceipts(height, hash)).pipe( - map((response: { response: ClientResponse; body: MerkleProofInfoDTO; } ) => { - const merkleProofTransaction = response.body; - return new MerkleProofInfo( - new MerkleProofInfoPayload( - merkleProofTransaction.payload.merklePath!.map((payload) => - new MerklePathItem(payload.position, payload.hash))), - merkleProofTransaction.type, - ); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + this.blockRoutesApi.getMerkleReceipts(height, hash)).pipe(map((merkleProofTransaction: MerkleProofInfoDTO) => { + return new MerkleProofInfo( + new MerkleProofInfoPayload( + merkleProofTransaction.payload.merklePath!.map((payload) => new MerklePathItem(payload.position, payload.hash))), + merkleProofTransaction.type, + ); + })); } /** @@ -233,11 +212,9 @@ export class BlockHttp extends Http implements BlockRepository { return this.getNetworkTypeObservable().pipe( mergeMap((networkType) => observableFrom( this.blockRoutesApi.getBlockReceipts(height)).pipe( - map((response: { response: ClientResponse; body: StatementsDTO; }) => { - const receiptDTO = response.body; + map((receiptDTO: StatementsDTO) => { return CreateStatementFromDTO(receiptDTO, networkType); }), - catchError((error) => throwError(this.errorHandling(error))), ), ), ); diff --git a/src/infrastructure/ChainHttp.ts b/src/infrastructure/ChainHttp.ts index 5b32953b6f..c791b69297 100644 --- a/src/infrastructure/ChainHttp.ts +++ b/src/infrastructure/ChainHttp.ts @@ -14,9 +14,8 @@ * limitations under the License. */ -import { ClientResponse } from 'http'; -import {from as observableFrom, Observable, throwError} from 'rxjs'; -import {catchError, map} from 'rxjs/operators'; +import {from as observableFrom, Observable} from 'rxjs'; +import {map} from 'rxjs/operators'; import {BlockchainScore} from '../model/blockchain/BlockchainScore'; import {UInt64} from '../model/UInt64'; import { BlockchainScoreDTO, @@ -51,13 +50,9 @@ export class ChainHttp extends Http implements ChainRepository { * @returns Observable */ public getBlockchainHeight(): Observable { - return observableFrom(this.chainRoutesApi.getBlockchainHeight()).pipe( - map((response: { response: ClientResponse; body: HeightInfoDTO; } ) => { - const heightDTO = response.body; - return new UInt64(heightDTO.height); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + return observableFrom(this.chainRoutesApi.getBlockchainHeight()).pipe(map((heightDTO: HeightInfoDTO) => { + return new UInt64(heightDTO.height); + })); } /** @@ -65,15 +60,11 @@ export class ChainHttp extends Http implements ChainRepository { * @returns Observable */ public getBlockchainScore(): Observable { - return observableFrom(this.chainRoutesApi.getBlockchainScore()).pipe( - map((response: { response: ClientResponse; body: BlockchainScoreDTO; } ) => { - const blockchainScoreDTO = response.body; - return new BlockchainScore( - new UInt64(blockchainScoreDTO.scoreLow), - new UInt64(blockchainScoreDTO.scoreHigh), - ); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + return observableFrom(this.chainRoutesApi.getBlockchainScore()).pipe(map((blockchainScoreDTO: BlockchainScoreDTO) => { + return new BlockchainScore( + new UInt64(blockchainScoreDTO.scoreLow), + new UInt64(blockchainScoreDTO.scoreHigh), + ); + })); } } diff --git a/src/infrastructure/DiagnosticHttp.ts b/src/infrastructure/DiagnosticHttp.ts index 0af049602a..be17dbcf5e 100644 --- a/src/infrastructure/DiagnosticHttp.ts +++ b/src/infrastructure/DiagnosticHttp.ts @@ -14,9 +14,8 @@ * limitations under the License. */ -import { ClientResponse } from 'http'; -import {from as observableFrom, Observable, throwError} from 'rxjs'; -import {catchError, map} from 'rxjs/operators'; +import {from as observableFrom, Observable} from 'rxjs'; +import {map} from 'rxjs/operators'; import {BlockchainStorageInfo} from '../model/blockchain/BlockchainStorageInfo'; import { ServerInfo } from '../model/diagnostic/ServerInfo'; import { DiagnosticRoutesApi, ServerDTO, StorageInfoDTO } from './api'; @@ -50,17 +49,13 @@ export class DiagnosticHttp extends Http implements DiagnosticRepository { */ public getDiagnosticStorage(): Observable { return observableFrom( - this.diagnosticRoutesApi.getDiagnosticStorage()).pipe( - map((response: { response: ClientResponse; body: StorageInfoDTO; } ) => { - const blockchainStorageInfoDTO = response.body; - return new BlockchainStorageInfo( - blockchainStorageInfoDTO.numBlocks, - blockchainStorageInfoDTO.numTransactions, - blockchainStorageInfoDTO.numAccounts, - ); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + this.diagnosticRoutesApi.getDiagnosticStorage()).pipe(map((blockchainStorageInfoDTO: StorageInfoDTO) => { + return new BlockchainStorageInfo( + blockchainStorageInfoDTO.numBlocks, + blockchainStorageInfoDTO.numTransactions, + blockchainStorageInfoDTO.numAccounts, + ); + })); } /** @@ -69,13 +64,9 @@ export class DiagnosticHttp extends Http implements DiagnosticRepository { */ public getServerInfo(): Observable { return observableFrom( - this.diagnosticRoutesApi.getServerInfo()).pipe( - map((response: { response: ClientResponse; body: ServerDTO; } ) => { - const serverDTO = response.body; - return new ServerInfo(serverDTO.serverInfo.restVersion, - serverDTO.serverInfo.sdkVersion); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + this.diagnosticRoutesApi.getServerInfo()).pipe(map((serverDTO: ServerDTO) => { + return new ServerInfo(serverDTO.serverInfo.restVersion, + serverDTO.serverInfo.sdkVersion); + })); } } diff --git a/src/infrastructure/Http.ts b/src/infrastructure/Http.ts index 7df9e615ae..7185797d17 100644 --- a/src/infrastructure/Http.ts +++ b/src/infrastructure/Http.ts @@ -57,15 +57,4 @@ export abstract class Http { order: queryParams ? queryParams.order : undefined, }; } - - errorHandling(error: any): Error { - if (error.response && error.response.statusCode && error.response.body) { - const formattedError = { - statusCode: error.response.statusCode, - errorDetails: error.response.body, - }; - return new Error(JSON.stringify(formattedError)); - } - return new Error(error); - } } diff --git a/src/infrastructure/MosaicHttp.ts b/src/infrastructure/MosaicHttp.ts index 104aee210b..1d56765c0b 100644 --- a/src/infrastructure/MosaicHttp.ts +++ b/src/infrastructure/MosaicHttp.ts @@ -14,9 +14,8 @@ * limitations under the License. */ -import { ClientResponse } from 'http'; -import {from as observableFrom, Observable, throwError} from 'rxjs'; -import {catchError, map, mergeMap} from 'rxjs/operators'; +import {from as observableFrom, Observable} from 'rxjs'; +import {map, mergeMap} from 'rxjs/operators'; import {PublicAccount} from '../model/account/PublicAccount'; import {MosaicId} from '../model/mosaic/MosaicId'; import {MosaicInfo} from '../model/mosaic/MosaicInfo'; @@ -62,38 +61,33 @@ export class MosaicHttp extends Http implements MosaicRepository { public getMosaic(mosaicId: MosaicId): Observable { return this.getNetworkTypeObservable().pipe( mergeMap((networkType) => observableFrom( - this.mosaicRoutesApi.getMosaic(mosaicId.toHex())).pipe( - map((response: { response: ClientResponse; body: MosaicInfoDTO; } ) => { - const mosaicInfoDTO = response.body; - let mosaicFlag; - let divisibility; - let duration; - if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.MosaicFlags].value) { - mosaicFlag = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.MosaicFlags].value; - } - if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value) { - divisibility = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value; - } - if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Duration].value) { - duration = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value; - } - return new MosaicInfo( - mosaicInfoDTO.meta.id, - new MosaicId(mosaicInfoDTO.mosaic.mosaicId), - new UInt64(mosaicInfoDTO.mosaic.supply), - new UInt64(mosaicInfoDTO.mosaic.height), - PublicAccount.createFromPublicKey(mosaicInfoDTO.mosaic.owner, networkType), - mosaicInfoDTO.mosaic.revision, - new MosaicProperties( - mosaicFlag ? new UInt64(mosaicFlag) : UInt64.fromUint(0), - (divisibility ? new UInt64(divisibility) : UInt64.fromUint(0)).compact(), - duration ? new UInt64(duration) : undefined, - ), - ); - }), - catchError((error) => throwError(this.errorHandling(error))), - )), - ); + this.mosaicRoutesApi.getMosaic(mosaicId.toHex())).pipe(map((mosaicInfoDTO: MosaicInfoDTO) => { + let mosaicFlag; + let divisibility; + let duration; + if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.MosaicFlags].value) { + mosaicFlag = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.MosaicFlags].value; + } + if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value) { + divisibility = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value; + } + if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Duration].value) { + duration = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value; + } + return new MosaicInfo( + mosaicInfoDTO.meta.id, + new MosaicId(mosaicInfoDTO.mosaic.mosaicId), + new UInt64(mosaicInfoDTO.mosaic.supply), + new UInt64(mosaicInfoDTO.mosaic.height), + PublicAccount.createFromPublicKey(mosaicInfoDTO.mosaic.owner, networkType), + mosaicInfoDTO.mosaic.revision, + new MosaicProperties( + mosaicFlag ? new UInt64(mosaicFlag) : UInt64.fromUint(0), + (divisibility ? new UInt64(divisibility) : UInt64.fromUint(0)).compact(), + duration ? new UInt64(duration) : undefined, + ), + ); + })))); } /** @@ -107,41 +101,35 @@ export class MosaicHttp extends Http implements MosaicRepository { }; return this.getNetworkTypeObservable().pipe( mergeMap((networkType) => observableFrom( - this.mosaicRoutesApi.getMosaics(mosaicIdsBody)).pipe( - map((response: { response: ClientResponse; body: MosaicInfoDTO[]; }) => { - const mosaicInfosDTO = response.body; - return mosaicInfosDTO.map((mosaicInfoDTO) => { - let mosaicFlag; - let divisibility; - let duration; - if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.MosaicFlags].value) { - mosaicFlag = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.MosaicFlags].value; - } - if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value) { - divisibility = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value; - } - if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Duration].value) { - duration = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Duration].value; - } - return new MosaicInfo( - mosaicInfoDTO.meta.id, - new MosaicId(mosaicInfoDTO.mosaic.mosaicId), - new UInt64(mosaicInfoDTO.mosaic.supply), - new UInt64(mosaicInfoDTO.mosaic.height), - PublicAccount.createFromPublicKey(mosaicInfoDTO.mosaic.owner, networkType), - mosaicInfoDTO.mosaic.revision, - new MosaicProperties( - mosaicFlag ? new UInt64(mosaicFlag) : UInt64.fromUint(0), - (divisibility ? new UInt64(divisibility) : UInt64.fromUint(0)).compact(), - duration ? new UInt64(duration) : undefined, - ), - ); - }); - }), - catchError((error) => throwError(this.errorHandling(error))), - ), - ), - ); + this.mosaicRoutesApi.getMosaics(mosaicIdsBody)).pipe(map((mosaicInfosDTO: MosaicInfoDTO[]) => { + return mosaicInfosDTO.map((mosaicInfoDTO) => { + let mosaicFlag; + let divisibility; + let duration; + if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.MosaicFlags].value) { + mosaicFlag = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.MosaicFlags].value; + } + if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value) { + divisibility = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Divisibility].value; + } + if (mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Duration].value) { + duration = mosaicInfoDTO.mosaic.properties[MosaicPropertyType.Duration].value; + } + return new MosaicInfo( + mosaicInfoDTO.meta.id, + new MosaicId(mosaicInfoDTO.mosaic.mosaicId), + new UInt64(mosaicInfoDTO.mosaic.supply), + new UInt64(mosaicInfoDTO.mosaic.height), + PublicAccount.createFromPublicKey(mosaicInfoDTO.mosaic.owner, networkType), + mosaicInfoDTO.mosaic.revision, + new MosaicProperties( + mosaicFlag ? new UInt64(mosaicFlag) : UInt64.fromUint(0), + (divisibility ? new UInt64(divisibility) : UInt64.fromUint(0)).compact(), + duration ? new UInt64(duration) : undefined, + ), + ); + }); + })))); } /** @@ -155,19 +143,15 @@ export class MosaicHttp extends Http implements MosaicRepository { mosaicIds: mosaicIds.map((id) => id.toHex()), }; return observableFrom( - this.mosaicRoutesApi.getMosaicsNames(mosaicIdsBody)).pipe( - map((response: { response: ClientResponse; body: MosaicNamesDTO[]; }) => { - const mosaics = response.body; - return mosaics.map((mosaic) => { - return new MosaicNames( - new MosaicId(mosaic.mosaicId), - mosaic.names.map((name) => { - return new NamespaceName(new NamespaceId(name), name); - }), - ); - }); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + this.mosaicRoutesApi.getMosaicsNames(mosaicIdsBody)).pipe(map((mosaics: MosaicNamesDTO[]) => { + return mosaics.map((mosaic) => { + return new MosaicNames( + new MosaicId(mosaic.mosaicId), + mosaic.names.map((name) => { + return new NamespaceName(new NamespaceId(name), name); + }), + ); + }); + })); } } diff --git a/src/infrastructure/NamespaceHttp.ts b/src/infrastructure/NamespaceHttp.ts index 4d695f44bc..64ad0e94af 100644 --- a/src/infrastructure/NamespaceHttp.ts +++ b/src/infrastructure/NamespaceHttp.ts @@ -13,9 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { ClientResponse } from 'http'; -import {from as observableFrom, Observable, throwError} from 'rxjs'; -import {catchError, map, mergeMap} from 'rxjs/operators'; +import {from as observableFrom, Observable} from 'rxjs'; +import {map, mergeMap} from 'rxjs/operators'; import {Convert as convert, RawAddress as AddressLibrary} from '../core/format'; import {Address} from '../model/account/Address'; import {PublicAccount} from '../model/account/PublicAccount'; @@ -66,27 +65,21 @@ export class NamespaceHttp extends Http implements NamespaceRepository { public getNamespace(namespaceId: NamespaceId): Observable { return this.getNetworkTypeObservable().pipe( mergeMap((networkType) => observableFrom( - this.namespaceRoutesApi.getNamespace(namespaceId.toHex())).pipe( - map((response: { response: ClientResponse; body: NamespaceInfoDTO; } ) => { - const namespaceInfoDTO = response.body; - return new NamespaceInfo( - namespaceInfoDTO.meta.active, - namespaceInfoDTO.meta.index, - namespaceInfoDTO.meta.id, - namespaceInfoDTO.namespace.type as number, - namespaceInfoDTO.namespace.depth, - this.extractLevels(namespaceInfoDTO.namespace), - new NamespaceId(namespaceInfoDTO.namespace.parentId), - PublicAccount.createFromPublicKey(namespaceInfoDTO.namespace.owner, networkType), - new UInt64(namespaceInfoDTO.namespace.startHeight), - new UInt64(namespaceInfoDTO.namespace.endHeight), - this.extractAlias(namespaceInfoDTO.namespace), - ); - }), - catchError((error) => throwError(this.errorHandling(error))), - ), - ), - ); + this.namespaceRoutesApi.getNamespace(namespaceId.toHex())).pipe(map((namespaceInfoDTO: NamespaceInfoDTO) => { + return new NamespaceInfo( + namespaceInfoDTO.meta.active, + namespaceInfoDTO.meta.index, + namespaceInfoDTO.meta.id, + namespaceInfoDTO.namespace.type as number, + namespaceInfoDTO.namespace.depth, + this.extractLevels(namespaceInfoDTO.namespace), + new NamespaceId(namespaceInfoDTO.namespace.parentId), + PublicAccount.createFromPublicKey(namespaceInfoDTO.namespace.owner, networkType), + new UInt64(namespaceInfoDTO.namespace.startHeight), + new UInt64(namespaceInfoDTO.namespace.endHeight), + this.extractAlias(namespaceInfoDTO.namespace), + ); + })))); } /** @@ -103,8 +96,7 @@ export class NamespaceHttp extends Http implements NamespaceRepository { this.queryParams(queryParams).pageSize, this.queryParams(queryParams).id, this.queryParams(queryParams).order)).pipe( - map((response: { response: ClientResponse; body: NamespaceInfoDTO[]; }) => { - const namespaceInfosDTO = response.body; + map((namespaceInfosDTO: NamespaceInfoDTO[]) => { return namespaceInfosDTO.map((namespaceInfoDTO) => { return new NamespaceInfo( namespaceInfoDTO.meta.active, @@ -120,10 +112,7 @@ export class NamespaceHttp extends Http implements NamespaceRepository { this.extractAlias(namespaceInfoDTO.namespace), ); }); - }), - catchError((error) => throwError(this.errorHandling(error))), - ), - )); + })))); } /** @@ -143,8 +132,7 @@ export class NamespaceHttp extends Http implements NamespaceRepository { this.queryParams(queryParams).pageSize, this.queryParams(queryParams).id, this.queryParams(queryParams).order)).pipe( - map((response: { response: ClientResponse; body: NamespaceInfoDTO[]; }) => { - const namespaceInfosDTO = response.body; + map((namespaceInfosDTO: NamespaceInfoDTO[]) => { return namespaceInfosDTO.map((namespaceInfoDTO) => { return new NamespaceInfo( namespaceInfoDTO.meta.active, @@ -160,10 +148,7 @@ export class NamespaceHttp extends Http implements NamespaceRepository { this.extractAlias(namespaceInfoDTO.namespace), ); }); - }), - catchError((error) => throwError(this.errorHandling(error))), - ), - )); + })))); } /** @@ -176,19 +161,15 @@ export class NamespaceHttp extends Http implements NamespaceRepository { namespaceIds: namespaceIds.map((id) => id.toHex()), }; return observableFrom( - this.namespaceRoutesApi.getNamespacesNames(namespaceIdsBody)).pipe( - map((response: { response: ClientResponse; body: NamespaceNameDTO[]; } ) => { - const namespaceNamesDTO = response.body; - return namespaceNamesDTO.map((namespaceNameDTO) => { - return new NamespaceName( - new NamespaceId(namespaceNameDTO.namespaceId), - namespaceNameDTO.name, - namespaceNameDTO.parentId ? new NamespaceId(namespaceNameDTO.parentId) : undefined, - ); - }); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + this.namespaceRoutesApi.getNamespacesNames(namespaceIdsBody)).pipe(map((namespaceNamesDTO: NamespaceNameDTO[]) => { + return namespaceNamesDTO.map((namespaceNameDTO) => { + return new NamespaceName( + new NamespaceId(namespaceNameDTO.namespaceId), + namespaceNameDTO.name, + namespaceNameDTO.parentId ? new NamespaceId(namespaceNameDTO.parentId) : undefined, + ); + }); + })); } /** @@ -200,8 +181,8 @@ export class NamespaceHttp extends Http implements NamespaceRepository { return this.getNetworkTypeObservable().pipe( mergeMap((networkType) => observableFrom( this.namespaceRoutesApi.getNamespace(namespaceId.toHex())).pipe( - map((response: { response: ClientResponse; body: NamespaceInfoDTO; } ) => { - const namespaceInfoDTO = response.body; + map((namespaceInfoDTO: NamespaceInfoDTO) => { + if (namespaceInfoDTO.namespace === undefined) { // forward catapult-rest error throw namespaceInfoDTO; @@ -213,10 +194,7 @@ export class NamespaceHttp extends Http implements NamespaceRepository { throw new Error('No mosaicId is linked to namespace \'' + namespaceInfoDTO.namespace.level0 + '\''); } return new MosaicId(namespaceInfoDTO.namespace.alias.mosaicId); - }), - catchError((error) => throwError(this.errorHandling(error))), - ), - )); + })))); } /** @@ -228,8 +206,8 @@ export class NamespaceHttp extends Http implements NamespaceRepository { return this.getNetworkTypeObservable().pipe( mergeMap((networkType) => observableFrom( this.namespaceRoutesApi.getNamespace(namespaceId.toHex())).pipe( - map((response: { response: ClientResponse; body: NamespaceInfoDTO; } ) => { - const namespaceInfoDTO = response.body; + map((namespaceInfoDTO: NamespaceInfoDTO) => { + if (namespaceInfoDTO.namespace === undefined) { // forward catapult-rest error throw namespaceInfoDTO; @@ -244,10 +222,7 @@ export class NamespaceHttp extends Http implements NamespaceRepository { const addressDecoded = namespaceInfoDTO.namespace.alias.address; const address = AddressLibrary.addressToString(convert.hexToUint8(addressDecoded)); return Address.createFromRawAddress(address); - }), - catchError((error) => throwError(this.errorHandling(error))), - ), - )); + })))); } private extractLevels(namespace: any): NamespaceId[] { diff --git a/src/infrastructure/NetworkHttp.ts b/src/infrastructure/NetworkHttp.ts index a635710304..cbdc53ee9a 100644 --- a/src/infrastructure/NetworkHttp.ts +++ b/src/infrastructure/NetworkHttp.ts @@ -14,9 +14,8 @@ * limitations under the License. */ -import { ClientResponse } from 'http'; -import {from as observableFrom, Observable, throwError} from 'rxjs'; -import {catchError, map} from 'rxjs/operators'; +import {from as observableFrom, Observable} from 'rxjs'; +import {map} from 'rxjs/operators'; import {NetworkType} from '../model/blockchain/NetworkType'; import { NetworkRoutesApi, NetworkTypeDTO } from './api'; import {Http} from './Http'; @@ -50,16 +49,12 @@ export class NetworkHttp extends Http implements NetworkRepository { * @return network type enum. */ public getNetworkType(): Observable { - return observableFrom(this.networkRoutesApi.getNetworkType()).pipe( - map((response: { response: ClientResponse; body: NetworkTypeDTO; } ) => { - const networkTypeDTO = response.body; - if (networkTypeDTO.name === 'mijinTest') { - return NetworkType.MIJIN_TEST; - } else { - throw new Error('network ' + networkTypeDTO.name + ' is not supported yet by the sdk'); - } - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + return observableFrom(this.networkRoutesApi.getNetworkType()).pipe(map((networkTypeDTO: NetworkTypeDTO) => { + if (networkTypeDTO.name === 'mijinTest') { + return NetworkType.MIJIN_TEST; + } else { + throw new Error('network ' + networkTypeDTO.name + ' is not supported yet by the sdk'); + } + })); } } diff --git a/src/infrastructure/NodeHttp.ts b/src/infrastructure/NodeHttp.ts index 81f81a8d25..7a29ea3388 100644 --- a/src/infrastructure/NodeHttp.ts +++ b/src/infrastructure/NodeHttp.ts @@ -14,9 +14,8 @@ * limitations under the License. */ -import { ClientResponse } from 'http'; -import {from as observableFrom, Observable, throwError} from 'rxjs'; -import {catchError, map} from 'rxjs/operators'; +import {from as observableFrom, Observable} from 'rxjs'; +import {map} from 'rxjs/operators'; import { NodeInfo } from '../model/node/NodeInfo'; import { NodeTime } from '../model/node/NodeTime'; import { NodeInfoDTO, NodeRoutesApi, NodeTimeDTO } from './api'; @@ -50,21 +49,17 @@ export class NodeHttp extends Http implements NodeRepository { * @summary Get the node information */ public getNodeInfo(): Observable { - return observableFrom(this.nodeRoutesApi.getNodeInfo()).pipe( - map((response: { response: ClientResponse; body: NodeInfoDTO; } ) => { - const nodeInfoDTO = response.body; - return new NodeInfo( - nodeInfoDTO.publicKey, - nodeInfoDTO.port, - nodeInfoDTO.networkIdentifier, - nodeInfoDTO.version, - nodeInfoDTO.roles as number, - nodeInfoDTO.host, - nodeInfoDTO.friendlyName, - ); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + return observableFrom(this.nodeRoutesApi.getNodeInfo()).pipe(map((nodeInfoDTO: NodeInfoDTO) => { + return new NodeInfo( + nodeInfoDTO.publicKey, + nodeInfoDTO.port, + nodeInfoDTO.networkIdentifier, + nodeInfoDTO.version, + nodeInfoDTO.roles as number, + nodeInfoDTO.host, + nodeInfoDTO.friendlyName, + ); + })); } /** @@ -72,13 +67,8 @@ export class NodeHttp extends Http implements NodeRepository { * @summary Get the node time */ public getNodeTime(): Observable { - return observableFrom(this.nodeRoutesApi.getNodeTime()).pipe( - map((response: { response: ClientResponse; body: NodeTimeDTO; } ) => { - const nodeTimeDTO = response.body; - return new NodeTime(nodeTimeDTO.communicationTimestamps.sendTimestamp, - nodeTimeDTO.communicationTimestamps.receiveTimestamp); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + return observableFrom(this.nodeRoutesApi.getNodeTime()).pipe(map((nodeTimeDTO: NodeTimeDTO) => { + return new NodeTime(nodeTimeDTO.communicationTimestamps.sendTimestamp, nodeTimeDTO.communicationTimestamps.receiveTimestamp); + })); } } diff --git a/src/infrastructure/TransactionHttp.ts b/src/infrastructure/TransactionHttp.ts index c96c863910..332ada1e85 100644 --- a/src/infrastructure/TransactionHttp.ts +++ b/src/infrastructure/TransactionHttp.ts @@ -14,9 +14,8 @@ * limitations under the License. */ -import { ClientResponse } from 'http'; import * as requestPromise from 'request-promise-native'; -import {from as observableFrom, Observable, throwError} from 'rxjs'; +import {from as observableFrom, Observable, throwError as observableThrowError} from 'rxjs'; import {catchError, map, mergeMap} from 'rxjs/operators'; import {PublicAccount} from '../model/account/PublicAccount'; import {CosignatureSignedTransaction} from '../model/transaction/CosignatureSignedTransaction'; @@ -87,15 +86,11 @@ export class TransactionHttp extends Http implements TransactionRepository { transactionIds, }; return observableFrom( - this.transactionRoutesApi.getTransactions(transactionIdsBody)).pipe( - map((response: { response: ClientResponse; body: TransactionInfoDTO[]; } ) => { - const transactionsDTO = response.body; - return transactionsDTO.map((transactionDTO) => { - return CreateTransactionFromDTO(transactionDTO); - }); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + this.transactionRoutesApi.getTransactions(transactionIdsBody)).pipe(map((transactionsDTO: TransactionInfoDTO[]) => { + return transactionsDTO.map((transactionDTO) => { + return CreateTransactionFromDTO(transactionDTO); + }); + })); } /** @@ -105,17 +100,14 @@ export class TransactionHttp extends Http implements TransactionRepository { */ public getTransactionStatus(transactionHash: string): Observable { return observableFrom(this.transactionRoutesApi.getTransactionStatus(transactionHash)).pipe( - map((response: { response: ClientResponse; body: TransactionStatusDTO; } ) => { - const transactionStatusDTO = response.body; + map((transactionStatusDTO: TransactionStatusDTO) => { return new TransactionStatus( transactionStatusDTO.status, transactionStatusDTO.group, transactionStatusDTO.hash, transactionStatusDTO.deadline ? Deadline.createFromDTO(transactionStatusDTO.deadline) : undefined, transactionStatusDTO.height ? new UInt64(transactionStatusDTO.height) : undefined); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + })); } /** @@ -129,8 +121,7 @@ export class TransactionHttp extends Http implements TransactionRepository { }; return observableFrom( this.transactionRoutesApi.getTransactionsStatuses(transactionHashesBody)).pipe( - map((response: { response: ClientResponse; body: TransactionStatusDTO[]; }) => { - const transactionStatusesDTO = response.body; + map((transactionStatusesDTO: TransactionStatusDTO[]) => { return transactionStatusesDTO.map((transactionStatusDTO) => { return new TransactionStatus( transactionStatusDTO.status, @@ -139,9 +130,7 @@ export class TransactionHttp extends Http implements TransactionRepository { transactionStatusDTO.deadline ? Deadline.createFromDTO(transactionStatusDTO.deadline) : undefined, transactionStatusDTO.height ? new UInt64(transactionStatusDTO.height) : undefined); }); - }), - catchError((error) => throwError(error.error.errorMessage)), - ); + })); } /** @@ -151,12 +140,9 @@ export class TransactionHttp extends Http implements TransactionRepository { */ public announce(signedTransaction: SignedTransaction): Observable { return observableFrom(this.transactionRoutesApi.announceTransaction(signedTransaction)).pipe( - map((response: { response: ClientResponse; body: AnnounceTransactionInfoDTO; } ) => { - const transactionAnnounceResponseDTO = response.body; + map((transactionAnnounceResponseDTO: AnnounceTransactionInfoDTO) => { return new TransactionAnnounceResponse(transactionAnnounceResponseDTO.message); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + })); } /** @@ -166,15 +152,14 @@ export class TransactionHttp extends Http implements TransactionRepository { */ public announceAggregateBonded(signedTransaction: SignedTransaction): Observable { if (signedTransaction.type !== TransactionType.AGGREGATE_BONDED) { - throw new Error('Only Transaction Type 0x4241 is allowed for announce aggregate bonded'); + return observableFrom(new Promise((resolve, reject) => { + reject('Only Transaction Type 0x4241 is allowed for announce aggregate bonded'); + })); } return observableFrom(this.transactionRoutesApi.announcePartialTransaction(signedTransaction)).pipe( - map((response: { response: ClientResponse; body: AnnounceTransactionInfoDTO; } ) => { - const transactionAnnounceResponseDTO = response.body; + map((transactionAnnounceResponseDTO: AnnounceTransactionInfoDTO) => { return new TransactionAnnounceResponse(transactionAnnounceResponseDTO.message); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + })); } /** @@ -185,12 +170,9 @@ export class TransactionHttp extends Http implements TransactionRepository { public announceAggregateBondedCosignature( cosignatureSignedTransaction: CosignatureSignedTransaction): Observable { return observableFrom(this.transactionRoutesApi.announceCosignatureTransaction(cosignatureSignedTransaction)).pipe( - map((response: { response: ClientResponse; body: AnnounceTransactionInfoDTO; } ) => { - const transactionAnnounceResponseDTO = response.body; + map((transactionAnnounceResponseDTO: AnnounceTransactionInfoDTO) => { return new TransactionAnnounceResponse(transactionAnnounceResponseDTO.message); - }), - catchError((error) => throwError(this.errorHandling(error))), - ); + })); } public announceSync(signedTx: SignedTransaction): Observable { @@ -216,9 +198,9 @@ export class TransactionHttp extends Http implements TransactionRepository { } }), catchError((err) => { if (err.statusCode === 405) { - return throwError('non sync server'); + return observableThrowError('non sync server'); } - return throwError(err); + return observableThrowError(err); })); } @@ -236,15 +218,14 @@ export class TransactionHttp extends Http implements TransactionRepository { // now read block details return observableFrom(this.blockRoutesApi.getBlockByHeight(uintHeight.compact())).pipe( - map((response: { response: ClientResponse; body: BlockInfoDTO; } ) => { - const blockDTO = response.body; + map((blockDTO: BlockInfoDTO) => { + // @see https://nemtech.github.io/concepts/transaction.html#fees // effective_fee = feeMultiplier x transaction::size return blockDTO.block.feeMultiplier * transaction.size; - }), - catchError((error) => throwError(this.errorHandling(error)))); + })); }), catchError((err) => { - return throwError(err); + return observableThrowError(err); })); } } diff --git a/src/infrastructure/api/accountRoutesApi.ts b/src/infrastructure/api/accountRoutesApi.ts index a4c378b15f..529245b7a5 100644 --- a/src/infrastructure/api/accountRoutesApi.ts +++ b/src/infrastructure/api/accountRoutesApi.ts @@ -136,9 +136,12 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "AccountInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -190,9 +193,12 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "MultisigAccountInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -244,9 +250,12 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -298,9 +307,12 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "AccountRestrictionsInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -352,9 +364,12 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -406,9 +421,12 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -460,9 +478,12 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -529,9 +550,12 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -598,9 +622,12 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -667,9 +694,12 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -736,9 +766,12 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -805,9 +838,12 @@ export class AccountRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); diff --git a/src/infrastructure/api/blockRoutesApi.ts b/src/infrastructure/api/blockRoutesApi.ts index eafea7acf8..881fb16997 100644 --- a/src/infrastructure/api/blockRoutesApi.ts +++ b/src/infrastructure/api/blockRoutesApi.ts @@ -133,9 +133,12 @@ export class BlockRoutesApi { } else { body = ObjectSerializer.deserialize(body, "BlockInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -187,9 +190,12 @@ export class BlockRoutesApi { } else { body = ObjectSerializer.deserialize(body, "StatementsDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -251,9 +257,12 @@ export class BlockRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -312,9 +321,12 @@ export class BlockRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -373,9 +385,12 @@ export class BlockRoutesApi { } else { body = ObjectSerializer.deserialize(body, "MerkleProofInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -434,9 +449,12 @@ export class BlockRoutesApi { } else { body = ObjectSerializer.deserialize(body, "MerkleProofInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); diff --git a/src/infrastructure/api/chainRoutesApi.ts b/src/infrastructure/api/chainRoutesApi.ts index e2697992b4..4e0706620c 100644 --- a/src/infrastructure/api/chainRoutesApi.ts +++ b/src/infrastructure/api/chainRoutesApi.ts @@ -124,9 +124,12 @@ export class ChainRoutesApi { } else { body = ObjectSerializer.deserialize(body, "HeightInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -171,9 +174,12 @@ export class ChainRoutesApi { } else { body = ObjectSerializer.deserialize(body, "BlockchainScoreDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); diff --git a/src/infrastructure/api/diagnosticRoutesApi.ts b/src/infrastructure/api/diagnosticRoutesApi.ts index 01daa002d8..e70a25623f 100644 --- a/src/infrastructure/api/diagnosticRoutesApi.ts +++ b/src/infrastructure/api/diagnosticRoutesApi.ts @@ -124,9 +124,12 @@ export class DiagnosticRoutesApi { } else { body = ObjectSerializer.deserialize(body, "StorageInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -171,9 +174,12 @@ export class DiagnosticRoutesApi { } else { body = ObjectSerializer.deserialize(body, "ServerDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); diff --git a/src/infrastructure/api/mosaicRoutesApi.ts b/src/infrastructure/api/mosaicRoutesApi.ts index 00e398b6b6..dfb0e36a8b 100644 --- a/src/infrastructure/api/mosaicRoutesApi.ts +++ b/src/infrastructure/api/mosaicRoutesApi.ts @@ -132,9 +132,12 @@ export class MosaicRoutesApi { } else { body = ObjectSerializer.deserialize(body, "MosaicInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -186,9 +189,12 @@ export class MosaicRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -240,9 +246,12 @@ export class MosaicRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); diff --git a/src/infrastructure/api/namespaceRoutesApi.ts b/src/infrastructure/api/namespaceRoutesApi.ts index 9559ef2f13..7ce0824c7b 100644 --- a/src/infrastructure/api/namespaceRoutesApi.ts +++ b/src/infrastructure/api/namespaceRoutesApi.ts @@ -133,9 +133,12 @@ export class NamespaceRoutesApi { } else { body = ObjectSerializer.deserialize(body, "NamespaceInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -197,9 +200,12 @@ export class NamespaceRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -261,9 +267,12 @@ export class NamespaceRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -315,9 +324,12 @@ export class NamespaceRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); diff --git a/src/infrastructure/api/networkRoutesApi.ts b/src/infrastructure/api/networkRoutesApi.ts index 3c574d8c46..1e9fa0422c 100644 --- a/src/infrastructure/api/networkRoutesApi.ts +++ b/src/infrastructure/api/networkRoutesApi.ts @@ -123,9 +123,12 @@ export class NetworkRoutesApi { } else { body = ObjectSerializer.deserialize(body, "NetworkTypeDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); diff --git a/src/infrastructure/api/nodeRoutesApi.ts b/src/infrastructure/api/nodeRoutesApi.ts index 456a05ad64..cd2b0ca19b 100644 --- a/src/infrastructure/api/nodeRoutesApi.ts +++ b/src/infrastructure/api/nodeRoutesApi.ts @@ -124,9 +124,12 @@ export class NodeRoutesApi { } else { body = ObjectSerializer.deserialize(body, "NodeInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -171,9 +174,12 @@ export class NodeRoutesApi { } else { body = ObjectSerializer.deserialize(body, "NodeTimeDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); diff --git a/src/infrastructure/api/transactionRoutesApi.ts b/src/infrastructure/api/transactionRoutesApi.ts index 0a3abdd119..39618d7377 100644 --- a/src/infrastructure/api/transactionRoutesApi.ts +++ b/src/infrastructure/api/transactionRoutesApi.ts @@ -136,9 +136,12 @@ export class TransactionRoutesApi { } else { body = ObjectSerializer.deserialize(body, "AnnounceTransactionInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -190,9 +193,12 @@ export class TransactionRoutesApi { } else { body = ObjectSerializer.deserialize(body, "AnnounceTransactionInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -244,9 +250,12 @@ export class TransactionRoutesApi { } else { body = ObjectSerializer.deserialize(body, "AnnounceTransactionInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -298,9 +307,12 @@ export class TransactionRoutesApi { } else { body = ObjectSerializer.deserialize(body, "TransactionInfoDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -352,9 +364,12 @@ export class TransactionRoutesApi { } else { body = ObjectSerializer.deserialize(body, "TransactionStatusDTO"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -406,9 +421,12 @@ export class TransactionRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); @@ -460,9 +478,12 @@ export class TransactionRoutesApi { } else { body = ObjectSerializer.deserialize(body, "Array"); if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); diff --git a/src/infrastructure/templates/api-single.mustache b/src/infrastructure/templates/api-single.mustache index 9dd163676f..c90274237c 100755 --- a/src/infrastructure/templates/api-single.mustache +++ b/src/infrastructure/templates/api-single.mustache @@ -219,9 +219,12 @@ export class {{classname}} { body = ObjectSerializer.deserialize(body, "{{{returnType}}}"); {{/returnType}} if (response.statusCode && response.statusCode >= 200 && response.statusCode <= 299) { - resolve({ response, body }); + resolve(body); } else { - reject({ response, body }); + reject({ + statusCode: response.statusCode, + statusMessage: response.statusMessage + }); } } }); diff --git a/test/infrastructure/TransactionHttp.spec.ts b/test/infrastructure/TransactionHttp.spec.ts index 40107dae10..5a45c7d440 100644 --- a/test/infrastructure/TransactionHttp.spec.ts +++ b/test/infrastructure/TransactionHttp.spec.ts @@ -46,10 +46,13 @@ describe('TransactionHttp', () => { const signedTx = account.sign(aggTx, generationHash); const trnsHttp = new TransactionHttp(NIS2_URL); - expect(() => { - trnsHttp.announceAggregateBonded(signedTx) + return trnsHttp.announceAggregateBonded(signedTx) .toPromise() - .then(); - }).to.throw(Error, 'Only Transaction Type 0x4241 is allowed for announce aggregate bonded'); + .then(() => { + throw new Error('Should be called'); + }) + .catch((reason) => { + expect(reason.toString()).to.be.equal('Only Transaction Type 0x4241 is allowed for announce aggregate bonded'); + }); }); }); From b02cfea9dea32fe333564bc0757727288d88980b Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Tue, 16 Jul 2019 14:58:42 +0100 Subject: [PATCH 13/15] Added #204 - Fixed signTransactionGivenSignatures bug - Added e2e test for signTransactionGivenSignatures - Improved unit test for signTransactionGivenSignatures - Fixed typo --- e2e/infrastructure/TransactionHttp.spec.ts | 63 +++++++++++++++++++ .../transaction/CosignatureTransaction.ts | 11 ++-- .../transaction/AggregateTransaction.spec.ts | 22 ++++--- 3 files changed, 84 insertions(+), 12 deletions(-) diff --git a/e2e/infrastructure/TransactionHttp.spec.ts b/e2e/infrastructure/TransactionHttp.spec.ts index 51c85b0408..2f60993e0c 100644 --- a/e2e/infrastructure/TransactionHttp.spec.ts +++ b/e2e/infrastructure/TransactionHttp.spec.ts @@ -19,6 +19,7 @@ import {ChronoUnit} from 'js-joda'; import {keccak_256, sha3_256} from 'js-sha3'; import {Crypto} from '../../src/core/crypto'; import { Convert as convert } from '../../src/core/format'; +import { TransactionMapping } from '../../src/core/utils/TransactionMapping'; import {AccountHttp} from '../../src/infrastructure/AccountHttp'; import { NamespaceHttp } from '../../src/infrastructure/infrastructure'; import {Listener} from '../../src/infrastructure/Listener'; @@ -45,6 +46,7 @@ import { AccountRestrictionTransaction } from '../../src/model/transaction/Accou import { AddressAliasTransaction } from '../../src/model/transaction/AddressAliasTransaction'; import {AggregateTransaction} from '../../src/model/transaction/AggregateTransaction'; import {CosignatureSignedTransaction} from '../../src/model/transaction/CosignatureSignedTransaction'; +import { CosignatureTransaction } from '../../src/model/transaction/CosignatureTransaction'; import {Deadline} from '../../src/model/transaction/Deadline'; import { HashLockTransaction } from '../../src/model/transaction/HashLockTransaction'; import {HashType} from '../../src/model/transaction/HashType'; @@ -1761,6 +1763,67 @@ describe('TransactionHttp', () => { }); }); + describe('SignTransactionGivenSignatures', () => { + let listener: Listener; + before (() => { + listener = new Listener(config.apiUrl); + return listener.open(); + }); + after(() => { + return listener.close(); + }); + it('Announce cosign signatures given', (done) => { + + /** + * @see https://github.com/nemtech/nem2-sdk-typescript-javascript/issues/112 + */ + // AliceAccount: account + // BobAccount: account + + const sendAmount = NetworkCurrencyMosaic.createRelative(1000); + const backAmount = NetworkCurrencyMosaic.createRelative(1); + + const aliceTransferTransaction = TransferTransaction.create(Deadline.create(), account2.address, [sendAmount], + PlainMessage.create('payout'), NetworkType.MIJIN_TEST); + const bobTransferTransaction = TransferTransaction.create(Deadline.create(), account.address, [backAmount], + PlainMessage.create('payout'), NetworkType.MIJIN_TEST); + + // 01. Alice creates the aggregated tx and sign it. Then payload send to Bob + const aggregateTransaction = AggregateTransaction.createComplete( + Deadline.create(), + [ + aliceTransferTransaction.toAggregate(account.publicAccount), + bobTransferTransaction.toAggregate(account2.publicAccount), + ], + NetworkType.MIJIN_TEST, + [], + ); + + const aliceSignedTransaction = aggregateTransaction.signWith(account, generationHash); + + // 02 Bob cosigns the tx and sends it back to Alice + const signedTxBob = CosignatureTransaction.signTransactionPayload(account2, aliceSignedTransaction.payload, generationHash); + + // 03. Alice collects the cosignatures, recreate, sign, and announces the transaction + const cosignatureSignedTransactions = [ + new CosignatureSignedTransaction(signedTxBob.parentHash, signedTxBob.signature, signedTxBob.signer), + ]; + const recreatedTx = TransactionMapping.createFromPayload(aliceSignedTransaction.payload) as AggregateTransaction; + + const signedTransaction = recreatedTx.signTransactionGivenSignatures(account, cosignatureSignedTransactions, generationHash); + + listener.confirmed(account.address).subscribe(() => { + done(); + }); + listener.status(account.address).subscribe((error) => { + console.log('Error:', error); + assert(false); + done(); + }); + transactionHttp.announce(signedTransaction); + }); + }); + describe('transactions', () => { it('should call transactions successfully', (done) => { accountHttp.transactions(account.publicAccount).subscribe((transactions) => { diff --git a/src/model/transaction/CosignatureTransaction.ts b/src/model/transaction/CosignatureTransaction.ts index 1eb021e01a..2f37079c9f 100644 --- a/src/model/transaction/CosignatureTransaction.ts +++ b/src/model/transaction/CosignatureTransaction.ts @@ -15,11 +15,12 @@ */ import { SignSchema } from '../../core/crypto'; +import { Convert } from '../../core/format/Convert'; import {CosignatureTransaction as CosignaturetransactionLibrary} from '../../infrastructure/builders/CosignatureTransaction'; +import { VerifiableTransaction } from '../../infrastructure/builders/VerifiableTransaction'; import {Account} from '../account/Account'; import {AggregateTransaction} from './AggregateTransaction'; import {CosignatureSignedTransaction} from './CosignatureSignedTransaction'; -import { VerifiableTransaction } from '../../infrastructure/builders/VerifiableTransaction'; /** * Cosignature transaction is used to sign an aggregate transactions with missing cosignatures. @@ -52,14 +53,14 @@ export class CosignatureTransaction { * Creating a new CosignatureSignedTransaction * @param account - The signing account * @param payload - off transaction payload (aggregated transaction is unannounced) - * @param gernationHash - Network generation hash + * @param generationHash - Network generation hash * @returns {CosignatureSignedTransaction} */ - public static signTransactionPayload(account: Account, payload: string, gernationHash: string): CosignatureSignedTransaction { + public static signTransactionPayload(account: Account, payload: string, generationHash: string): CosignatureSignedTransaction { /** * For aggregated complete transaction, cosignatories are gathered off chain announced. */ - const transactionHash = VerifiableTransaction.createTransactionHash(payload, gernationHash); + const transactionHash = VerifiableTransaction.createTransactionHash(payload, Array.from(Convert.hexToUint8(generationHash))); const aggregateSignatureTransaction = new CosignaturetransactionLibrary(transactionHash); const signedTransactionRaw = aggregateSignatureTransaction.signCosignatoriesTransaction(account); return new CosignatureSignedTransaction(signedTransactionRaw.parentHash, @@ -81,4 +82,4 @@ export class CosignatureTransaction { signedTransactionRaw.signature, signedTransactionRaw.signer); } -} \ No newline at end of file +} diff --git a/test/model/transaction/AggregateTransaction.spec.ts b/test/model/transaction/AggregateTransaction.spec.ts index d32bdc1a1d..ab53059940 100644 --- a/test/model/transaction/AggregateTransaction.spec.ts +++ b/test/model/transaction/AggregateTransaction.spec.ts @@ -389,7 +389,7 @@ describe('AggregateTransaction', () => { it('Should create signed transaction with cosignatories - Aggregated Complete', () => { /** - * https://github.com/nemtech/nem2-sdk-typescript-javascript/issues/112 + * @see https://github.com/nemtech/nem2-sdk-typescript-javascript/issues/112 */ const accountAlice = TestingAccount; const accountBob = CosignatoryAccount; @@ -411,8 +411,8 @@ describe('AggregateTransaction', () => { PlainMessage.create('c to a'), NetworkType.MIJIN_TEST); - // 01. Alice creates the aggregated tx and serialize it, Then payload send to Bob & Carol - const aggregateTransactionPayload = AggregateTransaction.createComplete( + // 01. Alice creates the aggregated tx and sign it, Then payload send to Bob & Carol + const aggregateTransaction = AggregateTransaction.createComplete( Deadline.create(), [ AtoBTx.toAggregate(accountAlice.publicAccount), @@ -420,13 +420,15 @@ describe('AggregateTransaction', () => { CtoATx.toAggregate(accountCarol.publicAccount)], NetworkType.MIJIN_TEST, [], - ).serialize(); + ); + + const aliceSignedTransaction = aggregateTransaction.signWith(accountAlice, generationHash); // 02.1 Bob cosigns the tx and sends it back to Alice - const signedTxBob = CosignatureTransaction.signTransactionPayload(accountBob, aggregateTransactionPayload, generationHash); + const signedTxBob = CosignatureTransaction.signTransactionPayload(accountBob, aliceSignedTransaction.payload, generationHash); // 02.2 Carol cosigns the tx and sends it back to Alice - const signedTxCarol = CosignatureTransaction.signTransactionPayload(accountCarol, aggregateTransactionPayload, generationHash); + const signedTxCarol = CosignatureTransaction.signTransactionPayload(accountCarol, aliceSignedTransaction.payload, generationHash); // 03. Alice collects the cosignatures, recreate, sign, and announces the transaction @@ -436,7 +438,7 @@ describe('AggregateTransaction', () => { new CosignatureSignedTransaction(signedTxCarol.parentHash, signedTxCarol.signature, signedTxCarol.signer), ]; - const recreatedTx = TransactionMapping.createFromPayload(aggregateTransactionPayload) as AggregateTransaction; + const recreatedTx = TransactionMapping.createFromPayload(aliceSignedTransaction.payload) as AggregateTransaction; const signedTransaction = recreatedTx.signTransactionGivenSignatures(accountAlice, cosignatureSignedTransactions, generationHash); @@ -444,6 +446,12 @@ describe('AggregateTransaction', () => { expect(signedTransaction.signer).to.be.equal(accountAlice.publicKey); expect(signedTransaction.payload.indexOf(accountBob.publicKey) > -1).to.be.true; expect(signedTransaction.payload.indexOf(accountCarol.publicKey) > -1).to.be.true; + + // To make sure that the new cosign method returns the same payload & hash as standard cosigning + const standardCosignedTransaction = aggregateTransaction + .signTransactionWithCosignatories(accountAlice, [accountBob, accountCarol], generationHash); + expect(standardCosignedTransaction.payload).to.be.equal(signedTransaction.payload); + expect(standardCosignedTransaction.hash).to.be.equal(signedTransaction.hash); }); describe('size', () => { From a5a6b259faad9410300bafb12ff9681845efa703 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Tue, 16 Jul 2019 15:02:49 +0100 Subject: [PATCH 14/15] Added signSchema to signWithPayload --- src/infrastructure/builders/AggregateTransaction.ts | 2 +- src/model/transaction/CosignatureTransaction.ts | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/infrastructure/builders/AggregateTransaction.ts b/src/infrastructure/builders/AggregateTransaction.ts index 96790b9a0f..8aae5a5e28 100644 --- a/src/infrastructure/builders/AggregateTransaction.ts +++ b/src/infrastructure/builders/AggregateTransaction.ts @@ -56,7 +56,7 @@ export class AggregateTransaction extends VerifiableTransaction { return signedTransaction; } - signTransactionGivenSignatures(initializer, cosignedSignedTransactions, generationHash, signSchema) { + signTransactionGivenSignatures(initializer, cosignedSignedTransactions, generationHash, signSchema = SignSchema.SHA3) { const signedTransaction = this.signTransaction(initializer, generationHash, signSchema); cosignedSignedTransactions.forEach((cosignedTransaction) => { signedTransaction.payload = signedTransaction.payload + cosignedTransaction.signer + cosignedTransaction.signature; diff --git a/src/model/transaction/CosignatureTransaction.ts b/src/model/transaction/CosignatureTransaction.ts index 2f37079c9f..d1b6ddc5b5 100644 --- a/src/model/transaction/CosignatureTransaction.ts +++ b/src/model/transaction/CosignatureTransaction.ts @@ -54,15 +54,19 @@ export class CosignatureTransaction { * @param account - The signing account * @param payload - off transaction payload (aggregated transaction is unannounced) * @param generationHash - Network generation hash + * @param {SignSchema} signSchema The Sign Schema. (KECCAK_REVERSED_KEY / SHA3) * @returns {CosignatureSignedTransaction} */ - public static signTransactionPayload(account: Account, payload: string, generationHash: string): CosignatureSignedTransaction { + public static signTransactionPayload(account: Account, + payload: string, + generationHash: string, + signSchema: SignSchema = SignSchema.SHA3): CosignatureSignedTransaction { /** * For aggregated complete transaction, cosignatories are gathered off chain announced. */ const transactionHash = VerifiableTransaction.createTransactionHash(payload, Array.from(Convert.hexToUint8(generationHash))); const aggregateSignatureTransaction = new CosignaturetransactionLibrary(transactionHash); - const signedTransactionRaw = aggregateSignatureTransaction.signCosignatoriesTransaction(account); + const signedTransactionRaw = aggregateSignatureTransaction.signCosignatoriesTransaction(account, signSchema); return new CosignatureSignedTransaction(signedTransactionRaw.parentHash, signedTransactionRaw.signature, signedTransactionRaw.signer); From 58745994ab35f7e5de378d7032e2a879c57239f2 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Tue, 16 Jul 2019 15:42:55 +0100 Subject: [PATCH 15/15] Exposed signTransactionGivenSignatures method --- src/model/account/Account.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/model/account/Account.ts b/src/model/account/Account.ts index 7e26c2d4f9..7395b232fb 100644 --- a/src/model/account/Account.ts +++ b/src/model/account/Account.ts @@ -171,6 +171,21 @@ export class Account { return transaction.signTransactionWithCosignatories(this, cosignatories, generationHash, signSchema); } + /** + * Sign transaction with cosignatories collected from cosigned transactions and creating a new SignedTransaction + * For off chain Aggregated Complete Transaction co-signing. + * @param initiatorAccount - Initiator account + * @param {CosignatureSignedTransaction[]} cosignatureSignedTransactions - Array of cosigned transaction + * @param generationHash - Network generation hash hex + * @param {SignSchema} signSchema The Sign Schema. (KECCAK_REVERSED_KEY / SHA3) + * @return {SignedTransaction} + */ + public signTransactionGivenSignatures(transaction: AggregateTransaction, + cosignatureSignedTransactions: CosignatureSignedTransaction[], + generationHash: string, + signSchema: SignSchema = SignSchema.SHA3): SignedTransaction { + return transaction.signTransactionGivenSignatures(this, cosignatureSignedTransactions, generationHash, signSchema); + } /** * Sign aggregate signature transaction * @param cosignatureTransaction - The aggregate signature transaction.