diff --git a/.gitignore b/.gitignore index d7a5372b66..aba656ecf1 100644 --- a/.gitignore +++ b/.gitignore @@ -47,6 +47,7 @@ dist # Microsoft Visual Studio settings .vs +.vscode # Databases *.sqlite @@ -54,3 +55,6 @@ dist # Environment .env env.json + +# Yarn +.yarn/sdks/** diff --git a/packages/platform-sdk-ark/src/dto/index.ts b/packages/platform-sdk-ark/src/dto/index.ts index 09f6e26885..39a8132192 100644 --- a/packages/platform-sdk-ark/src/dto/index.ts +++ b/packages/platform-sdk-ark/src/dto/index.ts @@ -1,4 +1,5 @@ export * from "./peer"; +export * from "./signed-transaction"; export * from "./transaction"; export * from "./transactions"; export * from "./wallet"; diff --git a/packages/platform-sdk-ark/src/dto/signed-transaction.test.ts b/packages/platform-sdk-ark/src/dto/signed-transaction.test.ts new file mode 100644 index 0000000000..a1fc19f6ae --- /dev/null +++ b/packages/platform-sdk-ark/src/dto/signed-transaction.test.ts @@ -0,0 +1,39 @@ +import "jest-extended"; + +import { BigNumber } from "@arkecosystem/platform-sdk-support"; + +import { SignedTransactionData } from "./signed-transaction"; + +let subject: SignedTransactionData; + +beforeEach(() => { + subject = new SignedTransactionData("3e3817fd0c35bc36674f3874c2953fa3e35877cbcdb44a08bdc6083dbd39d572", { + id: "3e3817fd0c35bc36674f3874c2953fa3e35877cbcdb44a08bdc6083dbd39d572", + amount: "12500000000000000", + fee: "0", + senderPublicKey: "0208e6835a8f020cfad439c059b89addc1ce21f8cab0af6e6957e22d3720bff8a4", + recipientId: "D6Z26L69gdk9qYmTv5uzk3uGepigtHY4ax", + }); +}); + +describe("SignedTransactionData", function () { + test("#id", () => { + expect(subject.id()).toBe("3e3817fd0c35bc36674f3874c2953fa3e35877cbcdb44a08bdc6083dbd39d572"); + }); + + test("#sender", () => { + expect(subject.sender()).toBe("DLK7ts2DpkbeBjFamuFtHLoDAq5upDhCmf"); + }); + + test("#recipient", () => { + expect(subject.recipient()).toBe("D6Z26L69gdk9qYmTv5uzk3uGepigtHY4ax"); + }); + + test("#amount", () => { + expect(subject.amount()).toEqual(BigNumber.make("12500000000000000")); + }); + + test("#fee", () => { + expect(subject.fee()).toEqual(BigNumber.ZERO); + }); +}); diff --git a/packages/platform-sdk-ark/src/dto/signed-transaction.ts b/packages/platform-sdk-ark/src/dto/signed-transaction.ts new file mode 100644 index 0000000000..fe7877d607 --- /dev/null +++ b/packages/platform-sdk-ark/src/dto/signed-transaction.ts @@ -0,0 +1,22 @@ +import { Identities } from "@arkecosystem/crypto"; +import { Contracts, DTO } from "@arkecosystem/platform-sdk"; +import { BigNumber } from "@arkecosystem/platform-sdk-support"; + +export class SignedTransactionData extends DTO.AbstractSignedTransactionData + implements Contracts.SignedTransactionData { + public sender(): string { + return Identities.Address.fromPublicKey(this.signedData.senderPublicKey); + } + + public recipient(): string { + return this.signedData.recipientId; + } + + public amount(): BigNumber { + return BigNumber.make(this.signedData.amount); + } + + public fee(): BigNumber { + return BigNumber.make(this.signedData.fee); + } +} diff --git a/packages/platform-sdk-ark/src/services/client.ts b/packages/platform-sdk-ark/src/services/client.ts index 8702d22c55..777357ff32 100644 --- a/packages/platform-sdk-ark/src/services/client.ts +++ b/packages/platform-sdk-ark/src/services/client.ts @@ -102,10 +102,10 @@ export class ClientService implements Contracts.ClientService { return body.data.syncing; } - public async broadcast(transactions: DTO.SignedTransactionData[]): Promise { + public async broadcast(transactions: Contracts.SignedTransactionData[]): Promise { const { data, errors } = await this.post("transactions", { body: { - transactions: transactions.map((transaction: DTO.SignedTransactionData) => transaction.data()), + transactions: transactions.map((transaction: Contracts.SignedTransactionData) => transaction.data()), }, }); diff --git a/packages/platform-sdk-ark/src/services/transaction.ts b/packages/platform-sdk-ark/src/services/transaction.ts index f92e499a7c..504970d497 100644 --- a/packages/platform-sdk-ark/src/services/transaction.ts +++ b/packages/platform-sdk-ark/src/services/transaction.ts @@ -4,10 +4,11 @@ import { } from "@arkecosystem/core-magistrate-crypto"; import { Enums } from "@arkecosystem/core-magistrate-crypto"; import { Managers, Transactions } from "@arkecosystem/crypto"; -import { Coins, Contracts, DTO } from "@arkecosystem/platform-sdk"; +import { Coins, Contracts } from "@arkecosystem/platform-sdk"; import { BIP39 } from "@arkecosystem/platform-sdk-crypto"; import { Arr, BigNumber } from "@arkecosystem/platform-sdk-support"; +import { SignedTransactionData } from "../dto/signed-transaction"; import { IdentityService } from "./identity"; Transactions.TransactionRegistry.registerTransactionType(MagistrateTransactions.EntityTransaction); @@ -61,7 +62,7 @@ export class TransactionService implements Contracts.TransactionService { public async transfer( input: Contracts.TransferInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { return this.createFromData("transfer", input, options, ({ transaction, data }) => { transaction.recipientId(data.to); @@ -74,7 +75,7 @@ export class TransactionService implements Contracts.TransactionService { public async secondSignature( input: Contracts.SecondSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { return this.createFromData("secondSignature", input, options, ({ transaction, data }) => transaction.signatureAsset(BIP39.normalize(data.mnemonic)), ); @@ -83,7 +84,7 @@ export class TransactionService implements Contracts.TransactionService { public async delegateRegistration( input: Contracts.DelegateRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { return this.createFromData("delegateRegistration", input, options, ({ transaction, data }) => transaction.usernameAsset(data.username), ); @@ -92,7 +93,7 @@ export class TransactionService implements Contracts.TransactionService { public async vote( input: Contracts.VoteInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { return this.createFromData("vote", input, options, ({ transaction, data }) => transaction.votesAsset([data.vote]), ); @@ -101,7 +102,7 @@ export class TransactionService implements Contracts.TransactionService { public async multiSignature( input: Contracts.MultiSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { return this.createFromData("multiSignature", input, options, ({ transaction, data }) => { transaction.multiSignatureAsset({ publicKeys: data.publicKeys, @@ -115,14 +116,14 @@ export class TransactionService implements Contracts.TransactionService { public async ipfs( input: Contracts.IpfsInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { return this.createFromData("ipfs", input, options, ({ transaction, data }) => transaction.ipfsAsset(data.hash)); } public async multiPayment( input: Contracts.MultiPaymentInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { return this.createFromData("multiPayment", input, options, ({ transaction, data }) => { for (const payment of data.payments) { transaction.addPayment(payment.to, payment.amount); @@ -133,14 +134,14 @@ export class TransactionService implements Contracts.TransactionService { public async delegateResignation( input: Contracts.DelegateResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { return this.createFromData("delegateResignation", input, options); } public async htlcLock( input: Contracts.HtlcLockInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { return this.createFromData("htlcLock", input, options, ({ transaction, data }) => { transaction.amount(data.amount); @@ -156,7 +157,7 @@ export class TransactionService implements Contracts.TransactionService { public async htlcClaim( input: Contracts.HtlcClaimInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { return this.createFromData("htlcClaim", input, options, ({ transaction, data }) => transaction.htlcClaimAsset({ lockTransactionId: data.lockTransactionId, @@ -168,7 +169,7 @@ export class TransactionService implements Contracts.TransactionService { public async htlcRefund( input: Contracts.HtlcRefundInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { return this.createFromData("htlcRefund", input, options, ({ transaction, data }) => transaction.htlcRefundAsset({ lockTransactionId: data.lockTransactionId, @@ -179,7 +180,7 @@ export class TransactionService implements Contracts.TransactionService { public async entityRegistration( input: Contracts.EntityRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { return this.createFromData("entityRegistration", input, options, ({ transaction, data }) => transaction.asset({ type: Enums.EntityType[ucfirst(data.type)], @@ -193,7 +194,7 @@ export class TransactionService implements Contracts.TransactionService { public async entityResignation( input: Contracts.EntityResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { return this.createFromData("entityResignation", input, options, ({ transaction, data }) => { transaction.asset({ type: Enums.EntityType[ucfirst(data.type)], @@ -208,7 +209,7 @@ export class TransactionService implements Contracts.TransactionService { public async entityUpdate( input: Contracts.EntityUpdateInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { return this.createFromData("entityUpdate", input, options, ({ transaction, data }) => transaction.asset({ type: Enums.EntityType[ucfirst(data.type)], @@ -225,7 +226,7 @@ export class TransactionService implements Contracts.TransactionService { input: Contracts.KeyValuePair, options?: Contracts.TransactionOptions, callback?: Function, - ): Promise { + ): Promise { let address: string | undefined; if (input.sign.mnemonic) { @@ -281,8 +282,9 @@ export class TransactionService implements Contracts.TransactionService { } if (options && options.unsignedBytes === true) { - return new DTO.SignedTransactionData( - "dummy-id", + return new SignedTransactionData( + // TODO: compute ID + "dummy", Transactions.Serializer.getBytes(transaction, { excludeSignature: true, excludeSecondSignature: true, @@ -314,6 +316,6 @@ export class TransactionService implements Contracts.TransactionService { const signedTransaction = transaction.build().toJson(); - return new DTO.SignedTransactionData(signedTransaction.id, signedTransaction); + return new SignedTransactionData(signedTransaction.Id, signedTransaction); } } diff --git a/packages/platform-sdk-atom/src/dto/index.ts b/packages/platform-sdk-atom/src/dto/index.ts index 09f6e26885..39a8132192 100644 --- a/packages/platform-sdk-atom/src/dto/index.ts +++ b/packages/platform-sdk-atom/src/dto/index.ts @@ -1,4 +1,5 @@ export * from "./peer"; +export * from "./signed-transaction"; export * from "./transaction"; export * from "./transactions"; export * from "./wallet"; diff --git a/packages/platform-sdk-atom/src/dto/signed-transaction.ts b/packages/platform-sdk-atom/src/dto/signed-transaction.ts new file mode 100644 index 0000000000..0852539d45 --- /dev/null +++ b/packages/platform-sdk-atom/src/dto/signed-transaction.ts @@ -0,0 +1,21 @@ +import { Contracts, DTO, Exceptions } from "@arkecosystem/platform-sdk"; +import { BigNumber } from "@arkecosystem/platform-sdk-support"; + +export class SignedTransactionData extends DTO.AbstractSignedTransactionData + implements Contracts.SignedTransactionData { + public sender(): string { + throw new Exceptions.NotImplemented(this.constructor.name, "sender"); + } + + public recipient(): string { + throw new Exceptions.NotImplemented(this.constructor.name, "recipient"); + } + + public amount(): BigNumber { + throw new Exceptions.NotImplemented(this.constructor.name, "amount"); + } + + public fee(): BigNumber { + throw new Exceptions.NotImplemented(this.constructor.name, "fee"); + } +} diff --git a/packages/platform-sdk-atom/src/services/client.test.ts b/packages/platform-sdk-atom/src/services/client.test.ts index 3722e96042..97fd339b5c 100644 --- a/packages/platform-sdk-atom/src/services/client.test.ts +++ b/packages/platform-sdk-atom/src/services/client.test.ts @@ -1,12 +1,11 @@ import "jest-extended"; -import { DTO } from "@arkecosystem/platform-sdk"; import { DateTime } from "@arkecosystem/platform-sdk-intl"; import { BigNumber } from "@arkecosystem/platform-sdk-support"; import nock from "nock"; import { createConfig } from "../../test/helpers"; -import { TransactionData, WalletData } from "../dto"; +import { SignedTransactionData, TransactionData, WalletData } from "../dto"; import { ClientService } from "./client"; let subject: ClientService; @@ -92,7 +91,7 @@ describe("ClientService", function () { }); describe("#broadcast", () => { - const transactionPayload = new DTO.SignedTransactionData("id", { + const transactionPayload = new SignedTransactionData("id", { msg: [ { type: "cosmos-sdk/MsgSend", diff --git a/packages/platform-sdk-atom/src/services/client.ts b/packages/platform-sdk-atom/src/services/client.ts index f0aac191a2..94406d89a2 100644 --- a/packages/platform-sdk-atom/src/services/client.ts +++ b/packages/platform-sdk-atom/src/services/client.ts @@ -118,7 +118,7 @@ export class ClientService implements Contracts.ClientService { return syncing; } - public async broadcast(transactions: DTO.SignedTransactionData[]): Promise { + public async broadcast(transactions: Contracts.SignedTransactionData[]): Promise { const result: Contracts.BroadcastResponse = { accepted: [], rejected: [], diff --git a/packages/platform-sdk-atom/src/services/transaction.ts b/packages/platform-sdk-atom/src/services/transaction.ts index 97ac797e62..a29e9f1551 100644 --- a/packages/platform-sdk-atom/src/services/transaction.ts +++ b/packages/platform-sdk-atom/src/services/transaction.ts @@ -3,6 +3,7 @@ import { Coins, Contracts, DTO, Exceptions } from "@arkecosystem/platform-sdk"; import { createSignedTransactionData } from "../utils/crypto"; import { ClientService } from "./client"; import { IdentityService } from "./identity"; +import { SignedTransactionData } from "../dto"; export class TransactionService implements Contracts.TransactionService { readonly #client; @@ -30,15 +31,15 @@ export class TransactionService implements Contracts.TransactionService { public async transfer( input: Contracts.TransferInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { const senderAddress: string = await this.#identity.address().fromMnemonic(input.sign.mnemonic); const keyPair = await this.#identity.keys().fromMnemonic(input.sign.mnemonic); const { account_number, sequence } = (await this.#client.wallet(senderAddress)).raw(); - return new DTO.SignedTransactionData( + return new SignedTransactionData( // TODO: compute the ID - "dummy", + 'dummy', createSignedTransactionData( { msgs: [ @@ -78,91 +79,91 @@ export class TransactionService implements Contracts.TransactionService { public async secondSignature( input: Contracts.SecondSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "secondSignature"); } public async delegateRegistration( input: Contracts.DelegateRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "delegateRegistration"); } public async vote( input: Contracts.VoteInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "vote"); } public async multiSignature( input: Contracts.MultiSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "multiSignature"); } public async ipfs( input: Contracts.IpfsInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "ipfs"); } public async multiPayment( input: Contracts.MultiPaymentInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "multiPayment"); } public async delegateResignation( input: Contracts.DelegateResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "delegateResignation"); } public async htlcLock( input: Contracts.HtlcLockInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcLock"); } public async htlcClaim( input: Contracts.HtlcClaimInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcClaim"); } public async htlcRefund( input: Contracts.HtlcRefundInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcRefund"); } public async entityRegistration( input: Contracts.EntityRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityRegistration"); } public async entityResignation( input: Contracts.EntityResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityResignation"); } public async entityUpdate( input: Contracts.EntityUpdateInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityUpdate"); } } diff --git a/packages/platform-sdk-btc/src/dto/index.ts b/packages/platform-sdk-btc/src/dto/index.ts index 09f6e26885..39a8132192 100644 --- a/packages/platform-sdk-btc/src/dto/index.ts +++ b/packages/platform-sdk-btc/src/dto/index.ts @@ -1,4 +1,5 @@ export * from "./peer"; +export * from "./signed-transaction"; export * from "./transaction"; export * from "./transactions"; export * from "./wallet"; diff --git a/packages/platform-sdk-btc/src/dto/signed-transaction.ts b/packages/platform-sdk-btc/src/dto/signed-transaction.ts new file mode 100644 index 0000000000..0852539d45 --- /dev/null +++ b/packages/platform-sdk-btc/src/dto/signed-transaction.ts @@ -0,0 +1,21 @@ +import { Contracts, DTO, Exceptions } from "@arkecosystem/platform-sdk"; +import { BigNumber } from "@arkecosystem/platform-sdk-support"; + +export class SignedTransactionData extends DTO.AbstractSignedTransactionData + implements Contracts.SignedTransactionData { + public sender(): string { + throw new Exceptions.NotImplemented(this.constructor.name, "sender"); + } + + public recipient(): string { + throw new Exceptions.NotImplemented(this.constructor.name, "recipient"); + } + + public amount(): BigNumber { + throw new Exceptions.NotImplemented(this.constructor.name, "amount"); + } + + public fee(): BigNumber { + throw new Exceptions.NotImplemented(this.constructor.name, "fee"); + } +} diff --git a/packages/platform-sdk-btc/src/services/client.test.ts b/packages/platform-sdk-btc/src/services/client.test.ts index c633fd2714..62beefcd97 100644 --- a/packages/platform-sdk-btc/src/services/client.test.ts +++ b/packages/platform-sdk-btc/src/services/client.test.ts @@ -6,7 +6,7 @@ import { BigNumber } from "@arkecosystem/platform-sdk-support"; import nock from "nock"; import { createConfig } from "../../test/helpers"; -import { TransactionData, WalletData } from "../dto"; +import { TransactionData, WalletData, SignedTransactionData } from "../dto"; import { ClientService } from "./client"; let subject: ClientService; @@ -62,7 +62,7 @@ describe("ClientService", function () { .post("/api/btc/transactions") .reply(200, require(`${__dirname}/../../test/fixtures/client/broadcast.json`)); - const result = await subject.broadcast([new DTO.SignedTransactionData("id", "transactionPayload")]); + const result = await subject.broadcast([new SignedTransactionData("id", "transactionPayload")]); expect(result).toEqual({ accepted: ["id"], @@ -76,7 +76,7 @@ describe("ClientService", function () { .post("/api/btc/transactions") .reply(200, require(`${__dirname}/../../test/fixtures/client/broadcast-failure.json`)); - const result = await subject.broadcast([new DTO.SignedTransactionData("id", "transactionPayload")]); + const result = await subject.broadcast([new SignedTransactionData("id", "transactionPayload")]); expect(result).toEqual({ accepted: [], diff --git a/packages/platform-sdk-btc/src/services/client.ts b/packages/platform-sdk-btc/src/services/client.ts index defcc3c6e9..fd4936cf3f 100644 --- a/packages/platform-sdk-btc/src/services/client.ts +++ b/packages/platform-sdk-btc/src/services/client.ts @@ -74,7 +74,7 @@ export class ClientService implements Contracts.ClientService { throw new Exceptions.NotImplemented(this.constructor.name, "syncing"); } - public async broadcast(transactions: DTO.SignedTransactionData[]): Promise { + public async broadcast(transactions: Contracts.SignedTransactionData[]): Promise { const result: Contracts.BroadcastResponse = { accepted: [], rejected: [], diff --git a/packages/platform-sdk-btc/src/services/transaction.ts b/packages/platform-sdk-btc/src/services/transaction.ts index 8247610a90..39d04e3a72 100644 --- a/packages/platform-sdk-btc/src/services/transaction.ts +++ b/packages/platform-sdk-btc/src/services/transaction.ts @@ -44,7 +44,7 @@ export class TransactionService implements Contracts.TransactionService { public async transfer( input: Contracts.TransferInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { // NOTE: this is a WIF/PrivateKey - should probably be passed in as wif instead of mnemonic const mnemonic: string = BIP39.normalize(input.sign.mnemonic); @@ -72,91 +72,91 @@ export class TransactionService implements Contracts.TransactionService { public async secondSignature( input: Contracts.SecondSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "secondSignature"); } public async delegateRegistration( input: Contracts.DelegateRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "delegateRegistration"); } public async vote( input: Contracts.VoteInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "vote"); } public async multiSignature( input: Contracts.MultiSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "multiSignature"); } public async ipfs( input: Contracts.IpfsInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "ipfs"); } public async multiPayment( input: Contracts.MultiPaymentInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "multiPayment"); } public async delegateResignation( input: Contracts.DelegateResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "delegateResignation"); } public async htlcLock( input: Contracts.HtlcLockInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcLock"); } public async htlcClaim( input: Contracts.HtlcClaimInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcClaim"); } public async htlcRefund( input: Contracts.HtlcRefundInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcRefund"); } public async entityRegistration( input: Contracts.EntityRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityRegistration"); } public async entityResignation( input: Contracts.EntityResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityResignation"); } public async entityUpdate( input: Contracts.EntityUpdateInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityUpdate"); } } diff --git a/packages/platform-sdk-eos/src/dto/index.ts b/packages/platform-sdk-eos/src/dto/index.ts index 09f6e26885..39a8132192 100644 --- a/packages/platform-sdk-eos/src/dto/index.ts +++ b/packages/platform-sdk-eos/src/dto/index.ts @@ -1,4 +1,5 @@ export * from "./peer"; +export * from "./signed-transaction"; export * from "./transaction"; export * from "./transactions"; export * from "./wallet"; diff --git a/packages/platform-sdk-eos/src/dto/signed-transaction.ts b/packages/platform-sdk-eos/src/dto/signed-transaction.ts new file mode 100644 index 0000000000..0852539d45 --- /dev/null +++ b/packages/platform-sdk-eos/src/dto/signed-transaction.ts @@ -0,0 +1,21 @@ +import { Contracts, DTO, Exceptions } from "@arkecosystem/platform-sdk"; +import { BigNumber } from "@arkecosystem/platform-sdk-support"; + +export class SignedTransactionData extends DTO.AbstractSignedTransactionData + implements Contracts.SignedTransactionData { + public sender(): string { + throw new Exceptions.NotImplemented(this.constructor.name, "sender"); + } + + public recipient(): string { + throw new Exceptions.NotImplemented(this.constructor.name, "recipient"); + } + + public amount(): BigNumber { + throw new Exceptions.NotImplemented(this.constructor.name, "amount"); + } + + public fee(): BigNumber { + throw new Exceptions.NotImplemented(this.constructor.name, "fee"); + } +} diff --git a/packages/platform-sdk-eos/src/services/client.ts b/packages/platform-sdk-eos/src/services/client.ts index ac9d515b6b..5d2aa42574 100644 --- a/packages/platform-sdk-eos/src/services/client.ts +++ b/packages/platform-sdk-eos/src/services/client.ts @@ -75,7 +75,7 @@ export class ClientService implements Contracts.ClientService { } // https://developers.eos.io/manuals/eosjs/latest/how-to-guides/how-to-transfer-an-eosio-token - public async broadcast(transactions: DTO.SignedTransactionData[]): Promise { + public async broadcast(transactions: Contracts.SignedTransactionData[]): Promise { const result = await this.#api.transact( { actions: [ diff --git a/packages/platform-sdk-eos/src/services/transaction.ts b/packages/platform-sdk-eos/src/services/transaction.ts index ffc05ad3cf..a2ee230578 100644 --- a/packages/platform-sdk-eos/src/services/transaction.ts +++ b/packages/platform-sdk-eos/src/services/transaction.ts @@ -5,6 +5,7 @@ import { Api, JsonRpc } from "eosjs"; import { JsSignatureProvider } from "eosjs/dist/eosjs-jssig"; import fetch from "node-fetch"; import { TextDecoder, TextEncoder } from "util"; +import { SignedTransactionData } from "../dto"; export class TransactionService implements Contracts.TransactionService { readonly #networkId: string; @@ -36,7 +37,7 @@ export class TransactionService implements Contracts.TransactionService { public async transfer( input: Contracts.TransferInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { const { client, signatureProvider } = this.getClient(input.sign.mnemonic); const transfer = await client.transact( @@ -79,7 +80,7 @@ export class TransactionService implements Contracts.TransactionService { transaction.signatures = transaction.signatures.concat(signatures); } - return new DTO.SignedTransactionData( + return new SignedTransactionData( createHash("sha256").update(transaction.serializedTransaction).digest("hex"), transaction, ); @@ -88,91 +89,91 @@ export class TransactionService implements Contracts.TransactionService { public async secondSignature( input: Contracts.SecondSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "secondSignature"); } public async delegateRegistration( input: Contracts.DelegateRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "delegateRegistration"); } public async vote( input: Contracts.VoteInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "vote"); } public async multiSignature( input: Contracts.MultiSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "multiSignature"); } public async ipfs( input: Contracts.IpfsInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "ipfs"); } public async multiPayment( input: Contracts.MultiPaymentInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "multiPayment"); } public async delegateResignation( input: Contracts.DelegateResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "delegateResignation"); } public async htlcLock( input: Contracts.HtlcLockInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcLock"); } public async htlcClaim( input: Contracts.HtlcClaimInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcClaim"); } public async htlcRefund( input: Contracts.HtlcRefundInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcRefund"); } public async entityRegistration( input: Contracts.EntityRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityRegistration"); } public async entityResignation( input: Contracts.EntityResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityResignation"); } public async entityUpdate( input: Contracts.EntityUpdateInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityUpdate"); } diff --git a/packages/platform-sdk-eth/src/dto/index.ts b/packages/platform-sdk-eth/src/dto/index.ts index 09f6e26885..39a8132192 100644 --- a/packages/platform-sdk-eth/src/dto/index.ts +++ b/packages/platform-sdk-eth/src/dto/index.ts @@ -1,4 +1,5 @@ export * from "./peer"; +export * from "./signed-transaction"; export * from "./transaction"; export * from "./transactions"; export * from "./wallet"; diff --git a/packages/platform-sdk-eth/src/dto/signed-transaction.ts b/packages/platform-sdk-eth/src/dto/signed-transaction.ts new file mode 100644 index 0000000000..0852539d45 --- /dev/null +++ b/packages/platform-sdk-eth/src/dto/signed-transaction.ts @@ -0,0 +1,21 @@ +import { Contracts, DTO, Exceptions } from "@arkecosystem/platform-sdk"; +import { BigNumber } from "@arkecosystem/platform-sdk-support"; + +export class SignedTransactionData extends DTO.AbstractSignedTransactionData + implements Contracts.SignedTransactionData { + public sender(): string { + throw new Exceptions.NotImplemented(this.constructor.name, "sender"); + } + + public recipient(): string { + throw new Exceptions.NotImplemented(this.constructor.name, "recipient"); + } + + public amount(): BigNumber { + throw new Exceptions.NotImplemented(this.constructor.name, "amount"); + } + + public fee(): BigNumber { + throw new Exceptions.NotImplemented(this.constructor.name, "fee"); + } +} diff --git a/packages/platform-sdk-eth/src/services/client.test.ts b/packages/platform-sdk-eth/src/services/client.test.ts index 19d0ae73f7..a5eb202189 100644 --- a/packages/platform-sdk-eth/src/services/client.test.ts +++ b/packages/platform-sdk-eth/src/services/client.test.ts @@ -5,7 +5,7 @@ import { BigNumber } from "@arkecosystem/platform-sdk-support"; import nock from "nock"; import { createConfig } from "../../test/helpers"; -import { TransactionData, WalletData } from "../dto"; +import { TransactionData, WalletData, SignedTransactionData } from "../dto"; import { ClientService } from "./client"; let subject: ClientService; @@ -92,7 +92,7 @@ describe("ClientService", function () { .post("/transactions") .reply(200, require(`${__dirname}/../../test/fixtures/client/broadcast.json`)); - const result = await subject.broadcast([new DTO.SignedTransactionData("id", "transactionPayload")]); + const result = await subject.broadcast([new SignedTransactionData("id", "transactionPayload")]); expect(result).toEqual({ accepted: ["0x227cff6fc8990fecd43cc9c7768f2c98cc5ee8e7c98c67c11161e008cce2b172"], @@ -106,7 +106,7 @@ describe("ClientService", function () { .post("/transactions") .reply(200, require(`${__dirname}/../../test/fixtures/client/broadcast-failure.json`)); - const result = await subject.broadcast([new DTO.SignedTransactionData("id", "transactionPayload")]); + const result = await subject.broadcast([new SignedTransactionData("id", "transactionPayload")]); expect(result).toEqual({ accepted: [], diff --git a/packages/platform-sdk-eth/src/services/client.ts b/packages/platform-sdk-eth/src/services/client.ts index 54d5129c78..8746580caa 100644 --- a/packages/platform-sdk-eth/src/services/client.ts +++ b/packages/platform-sdk-eth/src/services/client.ts @@ -108,7 +108,7 @@ export class ClientService implements Contracts.ClientService { return (await this.get("status")).syncing === false; } - public async broadcast(transactions: DTO.SignedTransactionData[]): Promise { + public async broadcast(transactions: Contracts.SignedTransactionData[]): Promise { const result: Contracts.BroadcastResponse = { accepted: [], rejected: [], diff --git a/packages/platform-sdk-eth/src/services/transaction.ts b/packages/platform-sdk-eth/src/services/transaction.ts index e8e3be80ec..39d5a6d4dc 100644 --- a/packages/platform-sdk-eth/src/services/transaction.ts +++ b/packages/platform-sdk-eth/src/services/transaction.ts @@ -4,6 +4,7 @@ import { Transaction } from "ethereumjs-tx"; import Web3 from "web3"; import { IdentityService } from "./identity"; +import { SignedTransactionData } from "../dto"; export class TransactionService implements Contracts.TransactionService { readonly #http: Contracts.HttpClient; @@ -34,7 +35,7 @@ export class TransactionService implements Contracts.TransactionService { public async transfer( input: Contracts.TransferInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { const senderAddress: string = await this.#identity.address().fromMnemonic(input.sign.mnemonic); const privateKey: string = input.sign.privateKey || (await this.#identity.privateKey().fromMnemonic(input.sign.mnemonic)); @@ -69,7 +70,7 @@ export class TransactionService implements Contracts.TransactionService { transaction.sign(Buffoon.fromHex(privateKey)); - return new DTO.SignedTransactionData( + return new SignedTransactionData( transaction.hash().toString("hex"), "0x" + transaction.serialize().toString("hex"), ); @@ -78,91 +79,91 @@ export class TransactionService implements Contracts.TransactionService { public async secondSignature( input: Contracts.SecondSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "secondSignature"); } public async delegateRegistration( input: Contracts.DelegateRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "delegateRegistration"); } public async vote( input: Contracts.VoteInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "vote"); } public async multiSignature( input: Contracts.MultiSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "multiSignature"); } public async ipfs( input: Contracts.IpfsInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "ipfs"); } public async multiPayment( input: Contracts.MultiPaymentInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "multiPayment"); } public async delegateResignation( input: Contracts.DelegateResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "delegateResignation"); } public async htlcLock( input: Contracts.HtlcLockInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcLock"); } public async htlcClaim( input: Contracts.HtlcClaimInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcClaim"); } public async htlcRefund( input: Contracts.HtlcRefundInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcRefund"); } public async entityRegistration( input: Contracts.EntityRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityRegistration"); } public async entityResignation( input: Contracts.EntityResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityResignation"); } public async entityUpdate( input: Contracts.EntityUpdateInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityUpdate"); } diff --git a/packages/platform-sdk-lsk/src/dto/index.ts b/packages/platform-sdk-lsk/src/dto/index.ts index 09f6e26885..39a8132192 100644 --- a/packages/platform-sdk-lsk/src/dto/index.ts +++ b/packages/platform-sdk-lsk/src/dto/index.ts @@ -1,4 +1,5 @@ export * from "./peer"; +export * from "./signed-transaction"; export * from "./transaction"; export * from "./transactions"; export * from "./wallet"; diff --git a/packages/platform-sdk-lsk/src/dto/signed-transaction.test.ts b/packages/platform-sdk-lsk/src/dto/signed-transaction.test.ts new file mode 100644 index 0000000000..c3f6598bf2 --- /dev/null +++ b/packages/platform-sdk-lsk/src/dto/signed-transaction.test.ts @@ -0,0 +1,53 @@ +import "jest-extended"; + +import { BigNumber } from "@arkecosystem/platform-sdk-support"; + +import { SignedTransactionData } from "./signed-transaction"; + +let subject: SignedTransactionData; + +beforeEach(() => { + subject = new SignedTransactionData("12385936261751136908", { + id: "12385936261751136908", + blockId: undefined, + height: undefined, + relays: undefined, + confirmations: undefined, + amount: "1", + type: 0, + timestamp: 133697283, + senderPublicKey: "ceb7bb7475a14b729eba069dfb27715331727a910acf5773a950ed4f863c89ed", + senderId: "15957226662510576840L", + recipientId: "15957226662510576840L", + recipientPublicKey: undefined, + fee: "10000000", + signature: + "e5224b561952cd798edb930c35a352b741ceb5b712cedaa3b51bfefd25f1e81208fdb0c10e32f0f98110aebfb657012c6f8269c968672893769187e7eb681d08", + signSignature: undefined, + signatures: [], + asset: {}, + receivedAt: undefined, + }); +}); + +describe("SignedTransactionData", function () { + test("#id", () => { + expect(subject.id()).toBe("12385936261751136908"); + }); + + test("#sender", () => { + expect(subject.sender()).toBe("15957226662510576840L"); + }); + + test("#recipient", () => { + expect(subject.recipient()).toBe("15957226662510576840L"); + }); + + test("#amount", () => { + expect(subject.amount()).toEqual(BigNumber.make(1)); + }); + + test("#fee", () => { + expect(subject.fee()).toEqual(BigNumber.make("10000000")); + }); +}); diff --git a/packages/platform-sdk-lsk/src/dto/signed-transaction.ts b/packages/platform-sdk-lsk/src/dto/signed-transaction.ts new file mode 100644 index 0000000000..28f0719fc4 --- /dev/null +++ b/packages/platform-sdk-lsk/src/dto/signed-transaction.ts @@ -0,0 +1,21 @@ +import { Contracts, DTO } from "@arkecosystem/platform-sdk"; +import { BigNumber } from "@arkecosystem/platform-sdk-support"; + +export class SignedTransactionData extends DTO.AbstractSignedTransactionData + implements Contracts.SignedTransactionData { + public sender(): string { + return this.signedData.senderId; + } + + public recipient(): string { + return this.signedData.recipientId; + } + + public amount(): BigNumber { + return BigNumber.make(this.signedData.amount); + } + + public fee(): BigNumber { + return BigNumber.make(this.signedData.fee); + } +} diff --git a/packages/platform-sdk-lsk/src/services/client.test.ts b/packages/platform-sdk-lsk/src/services/client.test.ts index c715d304b3..57b4d8d948 100644 --- a/packages/platform-sdk-lsk/src/services/client.test.ts +++ b/packages/platform-sdk-lsk/src/services/client.test.ts @@ -4,7 +4,7 @@ import { DTO } from "@arkecosystem/platform-sdk"; import nock from "nock"; import { createConfig } from "../../test/helpers"; -import { TransactionData, WalletData } from "../dto"; +import { TransactionData, WalletData, SignedTransactionData } from "../dto"; import { ClientService } from "./client"; let subject: ClientService; @@ -90,7 +90,7 @@ describe("ClientService", function () { }); describe("#broadcast", () => { - const transactionPayload = new DTO.SignedTransactionData("5961193224963457718", { + const transactionPayload = new SignedTransactionData("5961193224963457718", { id: "5961193224963457718", amount: "1", type: 0, diff --git a/packages/platform-sdk-lsk/src/services/client.ts b/packages/platform-sdk-lsk/src/services/client.ts index eaefbe0580..fa03bdfb90 100644 --- a/packages/platform-sdk-lsk/src/services/client.ts +++ b/packages/platform-sdk-lsk/src/services/client.ts @@ -109,7 +109,7 @@ export class ClientService implements Contracts.ClientService { throw new Exceptions.NotImplemented(this.constructor.name, "syncing"); } - public async broadcast(transactions: DTO.SignedTransactionData[]): Promise { + public async broadcast(transactions: Contracts.SignedTransactionData[]): Promise { const result: Contracts.BroadcastResponse = { accepted: [], rejected: [], diff --git a/packages/platform-sdk-lsk/src/services/transaction.test.ts b/packages/platform-sdk-lsk/src/services/transaction.test.ts index b6970fffc8..9cf49284f2 100644 --- a/packages/platform-sdk-lsk/src/services/transaction.test.ts +++ b/packages/platform-sdk-lsk/src/services/transaction.test.ts @@ -24,6 +24,8 @@ describe("TransactionService", () => { }, }); + console.log(result); + expect(result).toBeObject(); }); }); diff --git a/packages/platform-sdk-lsk/src/services/transaction.ts b/packages/platform-sdk-lsk/src/services/transaction.ts index aa723e83cc..e3ebbf0297 100644 --- a/packages/platform-sdk-lsk/src/services/transaction.ts +++ b/packages/platform-sdk-lsk/src/services/transaction.ts @@ -23,7 +23,7 @@ export class TransactionService implements Contracts.TransactionService { public async transfer( input: Contracts.TransferInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { return this.createFromData("transfer", { ...input, ...{ @@ -39,7 +39,7 @@ export class TransactionService implements Contracts.TransactionService { public async secondSignature( input: Contracts.SecondSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { return this.createFromData("registerSecondPassphrase", { ...input, ...{ @@ -53,21 +53,21 @@ export class TransactionService implements Contracts.TransactionService { public async delegateRegistration( input: Contracts.DelegateRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { return this.createFromData("registerDelegate", input); } public async vote( input: Contracts.VoteInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { return this.createFromData("castVotes", input); } public async multiSignature( input: Contracts.MultiSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { return this.createFromData("registerMultisignature", { ...input, ...{ @@ -83,63 +83,63 @@ export class TransactionService implements Contracts.TransactionService { public async ipfs( input: Contracts.IpfsInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "ipfs"); } public async multiPayment( input: Contracts.MultiPaymentInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "multiPayment"); } public async delegateResignation( input: Contracts.DelegateResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "delegateResignation"); } public async htlcLock( input: Contracts.HtlcLockInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcLock"); } public async htlcClaim( input: Contracts.HtlcClaimInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcClaim"); } public async htlcRefund( input: Contracts.HtlcRefundInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcRefund"); } public async entityRegistration( input: Contracts.EntityRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityRegistration"); } public async entityResignation( input: Contracts.EntityResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityResignation"); } public async entityUpdate( input: Contracts.EntityUpdateInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityUpdate"); } @@ -148,7 +148,7 @@ export class TransactionService implements Contracts.TransactionService { input: Contracts.KeyValuePair, options?: Contracts.TransactionOptions, callback?: Function, - ): Promise { + ): Promise { const struct: Contracts.KeyValuePair = { ...input.data }; struct.networkIdentifier = this.#network; diff --git a/packages/platform-sdk-neo/src/dto/index.ts b/packages/platform-sdk-neo/src/dto/index.ts index 09f6e26885..39a8132192 100644 --- a/packages/platform-sdk-neo/src/dto/index.ts +++ b/packages/platform-sdk-neo/src/dto/index.ts @@ -1,4 +1,5 @@ export * from "./peer"; +export * from "./signed-transaction"; export * from "./transaction"; export * from "./transactions"; export * from "./wallet"; diff --git a/packages/platform-sdk-neo/src/dto/signed-transaction.ts b/packages/platform-sdk-neo/src/dto/signed-transaction.ts new file mode 100644 index 0000000000..0852539d45 --- /dev/null +++ b/packages/platform-sdk-neo/src/dto/signed-transaction.ts @@ -0,0 +1,21 @@ +import { Contracts, DTO, Exceptions } from "@arkecosystem/platform-sdk"; +import { BigNumber } from "@arkecosystem/platform-sdk-support"; + +export class SignedTransactionData extends DTO.AbstractSignedTransactionData + implements Contracts.SignedTransactionData { + public sender(): string { + throw new Exceptions.NotImplemented(this.constructor.name, "sender"); + } + + public recipient(): string { + throw new Exceptions.NotImplemented(this.constructor.name, "recipient"); + } + + public amount(): BigNumber { + throw new Exceptions.NotImplemented(this.constructor.name, "amount"); + } + + public fee(): BigNumber { + throw new Exceptions.NotImplemented(this.constructor.name, "fee"); + } +} diff --git a/packages/platform-sdk-neo/src/services/client.test.ts b/packages/platform-sdk-neo/src/services/client.test.ts index 2bae027739..8648d89392 100644 --- a/packages/platform-sdk-neo/src/services/client.test.ts +++ b/packages/platform-sdk-neo/src/services/client.test.ts @@ -8,6 +8,7 @@ import nock from "nock"; import { createConfig } from "../../test/helpers"; import { TransactionData } from "../dto/transaction"; import { ClientService } from "./client"; +import { SignedTransactionData } from "../dto"; let subject: ClientService; @@ -62,7 +63,7 @@ describe("ClientService", function () { .post("/api/transactions") .reply(200, require(`${__dirname}/../../test/fixtures/client/broadcast.json`)); - const result = await subject.broadcast([new DTO.SignedTransactionData("id", "transactionPayload")]); + const result = await subject.broadcast([new SignedTransactionData("id", "transactionPayload")]); expect(result).toEqual({ accepted: ["0cb2e1fc8caa83cfb204e5cd2f66a58f3954a3b7bcc8958aaba38b582376e652"], @@ -76,7 +77,7 @@ describe("ClientService", function () { .post("/api/transactions") .reply(200, require(`${__dirname}/../../test/fixtures/client/broadcast-failure.json`)); - const result = await subject.broadcast([new DTO.SignedTransactionData("id", "transactionPayload")]); + const result = await subject.broadcast([new SignedTransactionData("id", "transactionPayload")]); expect(result).toEqual({ accepted: [], diff --git a/packages/platform-sdk-neo/src/services/client.ts b/packages/platform-sdk-neo/src/services/client.ts index ad94269418..bc974915b2 100644 --- a/packages/platform-sdk-neo/src/services/client.ts +++ b/packages/platform-sdk-neo/src/services/client.ts @@ -99,7 +99,7 @@ export class ClientService implements Contracts.ClientService { throw new Exceptions.NotImplemented(this.constructor.name, "syncing"); } - public async broadcast(transactions: DTO.SignedTransactionData[]): Promise { + public async broadcast(transactions: Contracts.SignedTransactionData[]): Promise { const result: Contracts.BroadcastResponse = { accepted: [], rejected: [], diff --git a/packages/platform-sdk-neo/src/services/transaction.ts b/packages/platform-sdk-neo/src/services/transaction.ts index 3e8f4aaabb..d94a95716c 100644 --- a/packages/platform-sdk-neo/src/services/transaction.ts +++ b/packages/platform-sdk-neo/src/services/transaction.ts @@ -1,5 +1,6 @@ import { Coins, Contracts, DTO, Exceptions } from "@arkecosystem/platform-sdk"; import { api, wallet } from "@cityofzion/neon-js"; +import { SignedTransactionData } from "../dto"; export class TransactionService implements Contracts.TransactionService { public static async construct(config: Coins.Config): Promise { @@ -13,9 +14,9 @@ export class TransactionService implements Contracts.TransactionService { public async transfer( input: Contracts.TransferInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { // TODO: compute the ID - return new DTO.SignedTransactionData("dummy", { + return new SignedTransactionData("dummy", { account: new wallet.Account(input.sign.privateKey), intents: api.makeIntent({ NEO: input.data.amount, GAS: input.fee }, input.data.to), }); @@ -24,91 +25,91 @@ export class TransactionService implements Contracts.TransactionService { public async secondSignature( input: Contracts.SecondSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "secondSignature"); } public async delegateRegistration( input: Contracts.DelegateRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "delegateRegistration"); } public async vote( input: Contracts.VoteInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "vote"); } public async multiSignature( input: Contracts.MultiSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "multiSignature"); } public async ipfs( input: Contracts.IpfsInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "ipfs"); } public async multiPayment( input: Contracts.MultiPaymentInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "multiPayment"); } public async delegateResignation( input: Contracts.DelegateResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "delegateResignation"); } public async htlcLock( input: Contracts.HtlcLockInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcLock"); } public async htlcClaim( input: Contracts.HtlcClaimInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcClaim"); } public async htlcRefund( input: Contracts.HtlcRefundInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcRefund"); } public async entityRegistration( input: Contracts.EntityRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityRegistration"); } public async entityResignation( input: Contracts.EntityResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityResignation"); } public async entityUpdate( input: Contracts.EntityUpdateInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityUpdate"); } } diff --git a/packages/platform-sdk-profiles/src/wallets/dto/signed-transaction.ts b/packages/platform-sdk-profiles/src/wallets/dto/signed-transaction.ts new file mode 100644 index 0000000000..3cf698d0ec --- /dev/null +++ b/packages/platform-sdk-profiles/src/wallets/dto/signed-transaction.ts @@ -0,0 +1,21 @@ +import { Contracts, DTO } from "@arkecosystem/platform-sdk"; +import { BigNumber } from "@arkecosystem/platform-sdk-support"; + +export class SignedTransactionData extends DTO.AbstractSignedTransactionData + implements Contracts.SignedTransactionData { + public sender(): string { + return this.signedData.sender; + } + + public recipient(): string { + return this.signedData.recipient; + } + + public amount(): BigNumber { + return BigNumber.make(this.signedData.amount); + } + + public fee(): BigNumber { + return BigNumber.make(this.signedData.fee); + } +} diff --git a/packages/platform-sdk-profiles/src/wallets/wallet-transaction-service.ts b/packages/platform-sdk-profiles/src/wallets/wallet-transaction-service.ts index d8f91b490d..116e786289 100644 --- a/packages/platform-sdk-profiles/src/wallets/wallet-transaction-service.ts +++ b/packages/platform-sdk-profiles/src/wallets/wallet-transaction-service.ts @@ -1,8 +1,9 @@ import { Contracts, DTO } from "@arkecosystem/platform-sdk"; +import { SignedTransactionData } from "./dto/signed-transaction"; import { WalletData } from "./wallet.models"; -type SignedTransactionDataDictionary = Record; +type SignedTransactionDataDictionary = Record; /** * @TODO @@ -111,7 +112,7 @@ export class TransactionService { return this.signTransaction("entityUpdate", input, options); } - public transaction(id: string): DTO.SignedTransactionData { + public transaction(id: string): Contracts.SignedTransactionData { if (this.hasBeenSigned(id)) { return this.#signed[id]; } @@ -140,7 +141,7 @@ export class TransactionService { } public async broadcast(ids: string[]): Promise { - const broadcasting: DTO.SignedTransactionData[] = ids.map((id: string) => this.#signed[id]); + const broadcasting: Contracts.SignedTransactionData[] = ids.map((id: string) => this.#signed[id]); const response: Contracts.BroadcastResponse = await this.#wallet.client().broadcast(broadcasting); @@ -205,7 +206,15 @@ export class TransactionService { const transactions = this.#wallet.data().get(storageKey, {}); for (const [id, transaction] of Object.entries(transactions)) { - storage[id] = new DTO.SignedTransactionData(id, transaction); + /** + * @TODO + * + * Implement a SignedTransactionFactory which will allow us to restore + * the transactions into their original coin-specific format. + * + * Not super urgent because the way it is consumed it's not an issue yet. + */ + storage[id] = new SignedTransactionData(id, transaction); } }; @@ -215,7 +224,7 @@ export class TransactionService { } private async signTransaction(type: string, input: any, options?: Contracts.TransactionOptions): Promise { - const transaction: DTO.SignedTransactionData = await this.getService()[type](input, options); + const transaction: Contracts.SignedTransactionData = await this.getService()[type](input, options); if (this.#signed[transaction.id()] !== undefined) { throw new Error( diff --git a/packages/platform-sdk-trx/src/dto/index.ts b/packages/platform-sdk-trx/src/dto/index.ts index 09f6e26885..39a8132192 100644 --- a/packages/platform-sdk-trx/src/dto/index.ts +++ b/packages/platform-sdk-trx/src/dto/index.ts @@ -1,4 +1,5 @@ export * from "./peer"; +export * from "./signed-transaction"; export * from "./transaction"; export * from "./transactions"; export * from "./wallet"; diff --git a/packages/platform-sdk-trx/src/dto/signed-transaction.ts b/packages/platform-sdk-trx/src/dto/signed-transaction.ts new file mode 100644 index 0000000000..0852539d45 --- /dev/null +++ b/packages/platform-sdk-trx/src/dto/signed-transaction.ts @@ -0,0 +1,21 @@ +import { Contracts, DTO, Exceptions } from "@arkecosystem/platform-sdk"; +import { BigNumber } from "@arkecosystem/platform-sdk-support"; + +export class SignedTransactionData extends DTO.AbstractSignedTransactionData + implements Contracts.SignedTransactionData { + public sender(): string { + throw new Exceptions.NotImplemented(this.constructor.name, "sender"); + } + + public recipient(): string { + throw new Exceptions.NotImplemented(this.constructor.name, "recipient"); + } + + public amount(): BigNumber { + throw new Exceptions.NotImplemented(this.constructor.name, "amount"); + } + + public fee(): BigNumber { + throw new Exceptions.NotImplemented(this.constructor.name, "fee"); + } +} diff --git a/packages/platform-sdk-trx/src/services/client.test.ts b/packages/platform-sdk-trx/src/services/client.test.ts index 01d5f1c294..a74e45698c 100644 --- a/packages/platform-sdk-trx/src/services/client.test.ts +++ b/packages/platform-sdk-trx/src/services/client.test.ts @@ -4,7 +4,7 @@ import { DTO } from "@arkecosystem/platform-sdk"; import nock from "nock"; import { createConfig } from "../../test/helpers"; -import { TransactionData, WalletData } from "../dto"; +import { TransactionData, WalletData, SignedTransactionData } from "../dto"; import { ClientService } from "./client"; let subject: ClientService; @@ -47,7 +47,7 @@ describe("ClientService", function () { .reply(200, require(`${__dirname}/../../test/fixtures/client/broadcast.json`)); const result = await subject.broadcast([ - new DTO.SignedTransactionData( + new SignedTransactionData( require(`${__dirname}/../../test/fixtures/crypto/transferSigned.json`).txID, require(`${__dirname}/../../test/fixtures/crypto/transferSigned.json`), ), @@ -66,7 +66,7 @@ describe("ClientService", function () { .reply(200, require(`${__dirname}/../../test/fixtures/client/broadcast-failure.json`)); const result = await subject.broadcast([ - new DTO.SignedTransactionData( + new SignedTransactionData( require(`${__dirname}/../../test/fixtures/crypto/transferSigned.json`).txID, require(`${__dirname}/../../test/fixtures/crypto/transferSigned.json`), ), diff --git a/packages/platform-sdk-trx/src/services/client.ts b/packages/platform-sdk-trx/src/services/client.ts index b876a0452e..7430f40613 100644 --- a/packages/platform-sdk-trx/src/services/client.ts +++ b/packages/platform-sdk-trx/src/services/client.ts @@ -81,7 +81,7 @@ export class ClientService implements Contracts.ClientService { throw new Exceptions.NotImplemented(this.constructor.name, "syncing"); } - public async broadcast(transactions: DTO.SignedTransactionData[]): Promise { + public async broadcast(transactions: Contracts.SignedTransactionData[]): Promise { const result: Contracts.BroadcastResponse = { accepted: [], rejected: [], diff --git a/packages/platform-sdk-trx/src/services/transaction.ts b/packages/platform-sdk-trx/src/services/transaction.ts index 1e3b4ed641..be16c048c6 100644 --- a/packages/platform-sdk-trx/src/services/transaction.ts +++ b/packages/platform-sdk-trx/src/services/transaction.ts @@ -3,6 +3,8 @@ import { BIP39 } from "@arkecosystem/platform-sdk-crypto"; import { Arr } from "@arkecosystem/platform-sdk-support"; import TronWeb from "tronweb"; +import { SignedTransactionData } from "../dto"; + export class TransactionService implements Contracts.TransactionService { readonly #connection: TronWeb; @@ -27,7 +29,7 @@ export class TransactionService implements Contracts.TransactionService { public async transfer( input: Contracts.TransferInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { const transaction = await this.#connection.transactionBuilder.sendTrx( input.data.to, input.data.amount, @@ -37,97 +39,97 @@ export class TransactionService implements Contracts.TransactionService { const response = await this.#connection.trx.sign(transaction, BIP39.normalize(input.sign.mnemonic)); - return new DTO.SignedTransactionData(response.txId, response); + return new SignedTransactionData(response.txId, response); } public async secondSignature( input: Contracts.SecondSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "secondSignature"); } public async delegateRegistration( input: Contracts.DelegateRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "delegateRegistration"); } public async vote( input: Contracts.VoteInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "vote"); } public async multiSignature( input: Contracts.MultiSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "multiSignature"); } public async ipfs( input: Contracts.IpfsInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "ipfs"); } public async multiPayment( input: Contracts.MultiPaymentInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "multiPayment"); } public async delegateResignation( input: Contracts.DelegateResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "delegateResignation"); } public async htlcLock( input: Contracts.HtlcLockInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcLock"); } public async htlcClaim( input: Contracts.HtlcClaimInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcClaim"); } public async htlcRefund( input: Contracts.HtlcRefundInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcRefund"); } public async entityRegistration( input: Contracts.EntityRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityRegistration"); } public async entityResignation( input: Contracts.EntityResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityResignation"); } public async entityUpdate( input: Contracts.EntityUpdateInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityUpdate"); } } diff --git a/packages/platform-sdk-xlm/src/dto/index.ts b/packages/platform-sdk-xlm/src/dto/index.ts index 09f6e26885..39a8132192 100644 --- a/packages/platform-sdk-xlm/src/dto/index.ts +++ b/packages/platform-sdk-xlm/src/dto/index.ts @@ -1,4 +1,5 @@ export * from "./peer"; +export * from "./signed-transaction"; export * from "./transaction"; export * from "./transactions"; export * from "./wallet"; diff --git a/packages/platform-sdk-xlm/src/dto/signed-transaction.ts b/packages/platform-sdk-xlm/src/dto/signed-transaction.ts new file mode 100644 index 0000000000..0852539d45 --- /dev/null +++ b/packages/platform-sdk-xlm/src/dto/signed-transaction.ts @@ -0,0 +1,21 @@ +import { Contracts, DTO, Exceptions } from "@arkecosystem/platform-sdk"; +import { BigNumber } from "@arkecosystem/platform-sdk-support"; + +export class SignedTransactionData extends DTO.AbstractSignedTransactionData + implements Contracts.SignedTransactionData { + public sender(): string { + throw new Exceptions.NotImplemented(this.constructor.name, "sender"); + } + + public recipient(): string { + throw new Exceptions.NotImplemented(this.constructor.name, "recipient"); + } + + public amount(): BigNumber { + throw new Exceptions.NotImplemented(this.constructor.name, "amount"); + } + + public fee(): BigNumber { + throw new Exceptions.NotImplemented(this.constructor.name, "fee"); + } +} diff --git a/packages/platform-sdk-xlm/src/services/client.ts b/packages/platform-sdk-xlm/src/services/client.ts index 0987df449c..20337b0a11 100644 --- a/packages/platform-sdk-xlm/src/services/client.ts +++ b/packages/platform-sdk-xlm/src/services/client.ts @@ -84,7 +84,7 @@ export class ClientService implements Contracts.ClientService { throw new Exceptions.NotImplemented(this.constructor.name, "syncing"); } - public async broadcast(transactions: DTO.SignedTransactionData[]): Promise { + public async broadcast(transactions: Contracts.SignedTransactionData[]): Promise { const result: Contracts.BroadcastResponse = { accepted: [], rejected: [], diff --git a/packages/platform-sdk-xlm/src/services/transaction.ts b/packages/platform-sdk-xlm/src/services/transaction.ts index 453837d773..3a31eeb3bc 100644 --- a/packages/platform-sdk-xlm/src/services/transaction.ts +++ b/packages/platform-sdk-xlm/src/services/transaction.ts @@ -41,7 +41,7 @@ export class TransactionService implements Contracts.TransactionService { public async transfer( input: Contracts.TransferInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { const { publicKey, privateKey } = input.sign.privateKey ? await this.#identity.keys().fromPrivateKey(input.sign.privateKey) : await this.#identity.keys().fromMnemonic(input.sign.mnemonic); @@ -70,91 +70,91 @@ export class TransactionService implements Contracts.TransactionService { public async secondSignature( input: Contracts.SecondSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "secondSignature"); } public async delegateRegistration( input: Contracts.DelegateRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "delegateRegistration"); } public async vote( input: Contracts.VoteInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "vote"); } public async multiSignature( input: Contracts.MultiSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "multiSignature"); } public async ipfs( input: Contracts.IpfsInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "ipfs"); } public async multiPayment( input: Contracts.MultiPaymentInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "multiPayment"); } public async delegateResignation( input: Contracts.DelegateResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "delegateResignation"); } public async htlcLock( input: Contracts.HtlcLockInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcLock"); } public async htlcClaim( input: Contracts.HtlcClaimInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcClaim"); } public async htlcRefund( input: Contracts.HtlcRefundInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcRefund"); } public async entityRegistration( input: Contracts.EntityRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityRegistration"); } public async entityResignation( input: Contracts.EntityResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityResignation"); } public async entityUpdate( input: Contracts.EntityUpdateInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityUpdate"); } } diff --git a/packages/platform-sdk-xmr/src/dto/index.ts b/packages/platform-sdk-xmr/src/dto/index.ts index 09f6e26885..39a8132192 100644 --- a/packages/platform-sdk-xmr/src/dto/index.ts +++ b/packages/platform-sdk-xmr/src/dto/index.ts @@ -1,4 +1,5 @@ export * from "./peer"; +export * from "./signed-transaction"; export * from "./transaction"; export * from "./transactions"; export * from "./wallet"; diff --git a/packages/platform-sdk-xmr/src/dto/signed-transaction.ts b/packages/platform-sdk-xmr/src/dto/signed-transaction.ts new file mode 100644 index 0000000000..0852539d45 --- /dev/null +++ b/packages/platform-sdk-xmr/src/dto/signed-transaction.ts @@ -0,0 +1,21 @@ +import { Contracts, DTO, Exceptions } from "@arkecosystem/platform-sdk"; +import { BigNumber } from "@arkecosystem/platform-sdk-support"; + +export class SignedTransactionData extends DTO.AbstractSignedTransactionData + implements Contracts.SignedTransactionData { + public sender(): string { + throw new Exceptions.NotImplemented(this.constructor.name, "sender"); + } + + public recipient(): string { + throw new Exceptions.NotImplemented(this.constructor.name, "recipient"); + } + + public amount(): BigNumber { + throw new Exceptions.NotImplemented(this.constructor.name, "amount"); + } + + public fee(): BigNumber { + throw new Exceptions.NotImplemented(this.constructor.name, "fee"); + } +} diff --git a/packages/platform-sdk-xmr/src/services/client.ts b/packages/platform-sdk-xmr/src/services/client.ts index c68bc3e1e3..1cb56759e3 100644 --- a/packages/platform-sdk-xmr/src/services/client.ts +++ b/packages/platform-sdk-xmr/src/services/client.ts @@ -64,7 +64,7 @@ export class ClientService implements Contracts.ClientService { throw new Exceptions.NotImplemented(this.constructor.name, "syncing"); } - public async broadcast(transactions: DTO.SignedTransactionData[]): Promise { + public async broadcast(transactions: Contracts.SignedTransactionData[]): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "broadcast"); } diff --git a/packages/platform-sdk-xmr/src/services/transaction.ts b/packages/platform-sdk-xmr/src/services/transaction.ts index 8caf4779dc..6c20c726f2 100644 --- a/packages/platform-sdk-xmr/src/services/transaction.ts +++ b/packages/platform-sdk-xmr/src/services/transaction.ts @@ -12,98 +12,98 @@ export class TransactionService implements Contracts.TransactionService { public async transfer( input: Contracts.TransferInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "transfer"); } public async secondSignature( input: Contracts.SecondSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "secondSignature"); } public async delegateRegistration( input: Contracts.DelegateRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "delegateRegistration"); } public async vote( input: Contracts.VoteInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "vote"); } public async multiSignature( input: Contracts.MultiSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "multiSignature"); } public async ipfs( input: Contracts.IpfsInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "ipfs"); } public async multiPayment( input: Contracts.MultiPaymentInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "multiPayment"); } public async delegateResignation( input: Contracts.DelegateResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "delegateResignation"); } public async htlcLock( input: Contracts.HtlcLockInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcLock"); } public async htlcClaim( input: Contracts.HtlcClaimInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcClaim"); } public async htlcRefund( input: Contracts.HtlcRefundInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcRefund"); } public async entityRegistration( input: Contracts.EntityRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityRegistration"); } public async entityResignation( input: Contracts.EntityResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityResignation"); } public async entityUpdate( input: Contracts.EntityUpdateInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityUpdate"); } } diff --git a/packages/platform-sdk-xrp/src/dto/index.ts b/packages/platform-sdk-xrp/src/dto/index.ts index 09f6e26885..39a8132192 100644 --- a/packages/platform-sdk-xrp/src/dto/index.ts +++ b/packages/platform-sdk-xrp/src/dto/index.ts @@ -1,4 +1,5 @@ export * from "./peer"; +export * from "./signed-transaction"; export * from "./transaction"; export * from "./transactions"; export * from "./wallet"; diff --git a/packages/platform-sdk-xrp/src/dto/signed-transaction.ts b/packages/platform-sdk-xrp/src/dto/signed-transaction.ts new file mode 100644 index 0000000000..0852539d45 --- /dev/null +++ b/packages/platform-sdk-xrp/src/dto/signed-transaction.ts @@ -0,0 +1,21 @@ +import { Contracts, DTO, Exceptions } from "@arkecosystem/platform-sdk"; +import { BigNumber } from "@arkecosystem/platform-sdk-support"; + +export class SignedTransactionData extends DTO.AbstractSignedTransactionData + implements Contracts.SignedTransactionData { + public sender(): string { + throw new Exceptions.NotImplemented(this.constructor.name, "sender"); + } + + public recipient(): string { + throw new Exceptions.NotImplemented(this.constructor.name, "recipient"); + } + + public amount(): BigNumber { + throw new Exceptions.NotImplemented(this.constructor.name, "amount"); + } + + public fee(): BigNumber { + throw new Exceptions.NotImplemented(this.constructor.name, "fee"); + } +} diff --git a/packages/platform-sdk-xrp/src/services/client.test.ts b/packages/platform-sdk-xrp/src/services/client.test.ts index 4705c968c5..b6d5f7d02e 100644 --- a/packages/platform-sdk-xrp/src/services/client.test.ts +++ b/packages/platform-sdk-xrp/src/services/client.test.ts @@ -7,7 +7,7 @@ import WebSocket from "ws"; import fixtures from "../../test/fixtures/services/rippled"; import { createConfig } from "../../test/helpers"; -import { TransactionData, WalletData } from "../dto"; +import { SignedTransactionData, TransactionData, WalletData } from "../dto"; import { ClientService } from "./client"; let subject: ClientService; @@ -140,7 +140,7 @@ describe("ClientService", function () { }); describe("#broadcast", () => { - const transactionPayload = new DTO.SignedTransactionData( + const transactionPayload = new SignedTransactionData( "id", "12000322000000002400000017201B0086955468400000000000000C732102F89EAEC7667B30F33D0687BBA86C3FE2A08CCA40A9186C5BDE2DAA6FA97A37D87446304402207660BDEF67105CE1EBA9AD35DC7156BAB43FF1D47633199EE257D70B6B9AAFBF02207F5517BC8AEF2ADC1325897ECDBA8C673838048BCA62F4E98B252F19BE88796D770A726970706C652E636F6D81144FBFF73DA4ECF9B701940F27341FA8020C313443", ); diff --git a/packages/platform-sdk-xrp/src/services/client.ts b/packages/platform-sdk-xrp/src/services/client.ts index 266f997243..49a947bb43 100644 --- a/packages/platform-sdk-xrp/src/services/client.ts +++ b/packages/platform-sdk-xrp/src/services/client.ts @@ -209,7 +209,7 @@ export class ClientService implements Contracts.ClientService { throw new Exceptions.NotImplemented(this.constructor.name, "syncing"); } - public async broadcast(transactions: DTO.SignedTransactionData[]): Promise { + public async broadcast(transactions: Contracts.SignedTransactionData[]): Promise { const result: Contracts.BroadcastResponse = { accepted: [], rejected: [], diff --git a/packages/platform-sdk-xrp/src/services/transaction.ts b/packages/platform-sdk-xrp/src/services/transaction.ts index 5cad076d14..75ba7e6830 100644 --- a/packages/platform-sdk-xrp/src/services/transaction.ts +++ b/packages/platform-sdk-xrp/src/services/transaction.ts @@ -4,6 +4,7 @@ import { Arr } from "@arkecosystem/platform-sdk-support"; import { RippleAPI } from "ripple-lib"; import { IdentityService } from "./identity"; +import { SignedTransactionData } from "../dto"; export class TransactionService implements Contracts.TransactionService { readonly #connection: RippleAPI; @@ -34,7 +35,7 @@ export class TransactionService implements Contracts.TransactionService { public async transfer( input: Contracts.TransferInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { const sender: string = await new IdentityService().address().fromMnemonic(input.sign.mnemonic); const prepared = await this.#connection.preparePayment( @@ -60,97 +61,97 @@ export class TransactionService implements Contracts.TransactionService { const { id, signedTransaction } = this.#connection.sign(prepared.txJSON, BIP39.normalize(input.sign.mnemonic)); - return new DTO.SignedTransactionData(id, signedTransaction); + return new SignedTransactionData(id, signedTransaction); } public async secondSignature( input: Contracts.SecondSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "secondSignature"); } public async delegateRegistration( input: Contracts.DelegateRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "delegateRegistration"); } public async vote( input: Contracts.VoteInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "vote"); } public async multiSignature( input: Contracts.MultiSignatureInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "multiSignature"); } public async ipfs( input: Contracts.IpfsInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "ipfs"); } public async multiPayment( input: Contracts.MultiPaymentInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "multiPayment"); } public async delegateResignation( input: Contracts.DelegateResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "delegateResignation"); } public async htlcLock( input: Contracts.HtlcLockInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcLock"); } public async htlcClaim( input: Contracts.HtlcClaimInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcClaim"); } public async htlcRefund( input: Contracts.HtlcRefundInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "htlcRefund"); } public async entityRegistration( input: Contracts.EntityRegistrationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityRegistration"); } public async entityResignation( input: Contracts.EntityResignationInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityResignation"); } public async entityUpdate( input: Contracts.EntityUpdateInput, options?: Contracts.TransactionOptions, - ): Promise { + ): Promise { throw new Exceptions.NotImplemented(this.constructor.name, "entityUpdate"); } } diff --git a/packages/platform-sdk/src/contracts/coins/client.ts b/packages/platform-sdk/src/contracts/coins/client.ts index bff566f0b7..fd827fbff5 100644 --- a/packages/platform-sdk/src/contracts/coins/client.ts +++ b/packages/platform-sdk/src/contracts/coins/client.ts @@ -1,7 +1,6 @@ import { TransactionDataCollection, WalletDataCollection } from "../../coins"; -import { SignedTransactionData } from "../../dto"; import { KeyValuePair } from "../types"; -import { TransactionData, WalletData } from "./data"; +import { SignedTransactionData, TransactionData, WalletData } from "./data"; export type ClientPaginatorCursor = string | number | undefined; diff --git a/packages/platform-sdk/src/contracts/coins/data.ts b/packages/platform-sdk/src/contracts/coins/data.ts index 73391433c8..b953bb3d98 100644 --- a/packages/platform-sdk/src/contracts/coins/data.ts +++ b/packages/platform-sdk/src/contracts/coins/data.ts @@ -333,3 +333,18 @@ export type TransactionDataType = | VoteData; export type TransactionDataTypeCollection = TransactionDataType[]; + +export interface SignedTransactionData { + id(): string; + data(): any; + + sender(): string; + recipient(): string; + amount(): BigNumber; + fee(): BigNumber; + + get(key: string): T; + + toString(): string; + toObject(): { id: string; sender: string; recipient: string; amount: string; data: any }; +} diff --git a/packages/platform-sdk/src/contracts/coins/transaction.ts b/packages/platform-sdk/src/contracts/coins/transaction.ts index 71581e71b3..c781e6f0fc 100644 --- a/packages/platform-sdk/src/contracts/coins/transaction.ts +++ b/packages/platform-sdk/src/contracts/coins/transaction.ts @@ -1,4 +1,4 @@ -import { SignedTransactionData } from "../../dto"; +import { SignedTransactionData } from "./data"; export interface TransactionService { destruct(): Promise; diff --git a/packages/platform-sdk/src/dto/signed-transaction.ts b/packages/platform-sdk/src/dto/signed-transaction.ts index 672409dcd4..9548973544 100644 --- a/packages/platform-sdk/src/dto/signed-transaction.ts +++ b/packages/platform-sdk/src/dto/signed-transaction.ts @@ -1,33 +1,51 @@ -export class SignedTransactionData { - readonly #id: string; - readonly #data: any; +import { BigNumber } from "@arkecosystem/platform-sdk-support"; - public constructor(id: string, data: any) { - this.#id = id; - this.#data = data; - } +export abstract class AbstractSignedTransactionData { + public constructor(protected readonly identifier: string, protected readonly signedData: any) {} public id(): string { - return this.#id; + return this.identifier; } public data(): any { - return this.#data; + return this.signedData; } + abstract sender(): string; + + abstract recipient(): string; + + abstract amount(): BigNumber; + + abstract fee(): BigNumber; + public get(key: string): T { - return this.#data[key]; + return this.signedData[key]; } public toString(): string { - if (typeof this.#data === "string") { - return this.#data; + if (typeof this.signedData === "string") { + return this.signedData; } - return JSON.stringify(this.#data); + return JSON.stringify(this.signedData); } - public toObject(): { id: string; data: any } { - return { id: this.#id, data: this.#data }; + public toObject(): { + id: string; + sender: string; + recipient: string; + amount: string; + fee: string; + data: any; + } { + return { + id: this.id(), + sender: this.sender(), + recipient: this.recipient(), + amount: this.amount().toFixed(), + fee: this.fee().toFixed(), + data: this.signedData, + }; } }