Skip to content
This repository has been archived by the owner on Jul 7, 2021. It is now read-only.

Commit

Permalink
refactor: expose more information through SignedTransactionData (#659)
Browse files Browse the repository at this point in the history
  • Loading branch information
faustbrian committed Aug 19, 2020
1 parent 3abd323 commit 00b48ba
Show file tree
Hide file tree
Showing 61 changed files with 632 additions and 220 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Expand Up @@ -47,10 +47,14 @@ dist

# Microsoft Visual Studio settings
.vs
.vscode

# Databases
*.sqlite

# Environment
.env
env.json

# Yarn
.yarn/sdks/**
1 change: 1 addition & 0 deletions 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";
39 changes: 39 additions & 0 deletions 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);
});
});
22 changes: 22 additions & 0 deletions 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);
}
}
4 changes: 2 additions & 2 deletions packages/platform-sdk-ark/src/services/client.ts
Expand Up @@ -102,10 +102,10 @@ export class ClientService implements Contracts.ClientService {
return body.data.syncing;
}

public async broadcast(transactions: DTO.SignedTransactionData[]): Promise<Contracts.BroadcastResponse> {
public async broadcast(transactions: Contracts.SignedTransactionData[]): Promise<Contracts.BroadcastResponse> {
const { data, errors } = await this.post("transactions", {
body: {
transactions: transactions.map((transaction: DTO.SignedTransactionData) => transaction.data()),
transactions: transactions.map((transaction: Contracts.SignedTransactionData) => transaction.data()),
},
});

Expand Down
40 changes: 21 additions & 19 deletions packages/platform-sdk-ark/src/services/transaction.ts
Expand Up @@ -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);
Expand Down Expand Up @@ -61,7 +62,7 @@ export class TransactionService implements Contracts.TransactionService {
public async transfer(
input: Contracts.TransferInput,
options?: Contracts.TransactionOptions,
): Promise<DTO.SignedTransactionData> {
): Promise<Contracts.SignedTransactionData> {
return this.createFromData("transfer", input, options, ({ transaction, data }) => {
transaction.recipientId(data.to);

Expand All @@ -74,7 +75,7 @@ export class TransactionService implements Contracts.TransactionService {
public async secondSignature(
input: Contracts.SecondSignatureInput,
options?: Contracts.TransactionOptions,
): Promise<DTO.SignedTransactionData> {
): Promise<Contracts.SignedTransactionData> {
return this.createFromData("secondSignature", input, options, ({ transaction, data }) =>
transaction.signatureAsset(BIP39.normalize(data.mnemonic)),
);
Expand All @@ -83,7 +84,7 @@ export class TransactionService implements Contracts.TransactionService {
public async delegateRegistration(
input: Contracts.DelegateRegistrationInput,
options?: Contracts.TransactionOptions,
): Promise<DTO.SignedTransactionData> {
): Promise<Contracts.SignedTransactionData> {
return this.createFromData("delegateRegistration", input, options, ({ transaction, data }) =>
transaction.usernameAsset(data.username),
);
Expand All @@ -92,7 +93,7 @@ export class TransactionService implements Contracts.TransactionService {
public async vote(
input: Contracts.VoteInput,
options?: Contracts.TransactionOptions,
): Promise<DTO.SignedTransactionData> {
): Promise<Contracts.SignedTransactionData> {
return this.createFromData("vote", input, options, ({ transaction, data }) =>
transaction.votesAsset([data.vote]),
);
Expand All @@ -101,7 +102,7 @@ export class TransactionService implements Contracts.TransactionService {
public async multiSignature(
input: Contracts.MultiSignatureInput,
options?: Contracts.TransactionOptions,
): Promise<DTO.SignedTransactionData> {
): Promise<Contracts.SignedTransactionData> {
return this.createFromData("multiSignature", input, options, ({ transaction, data }) => {
transaction.multiSignatureAsset({
publicKeys: data.publicKeys,
Expand All @@ -115,14 +116,14 @@ export class TransactionService implements Contracts.TransactionService {
public async ipfs(
input: Contracts.IpfsInput,
options?: Contracts.TransactionOptions,
): Promise<DTO.SignedTransactionData> {
): Promise<Contracts.SignedTransactionData> {
return this.createFromData("ipfs", input, options, ({ transaction, data }) => transaction.ipfsAsset(data.hash));
}

public async multiPayment(
input: Contracts.MultiPaymentInput,
options?: Contracts.TransactionOptions,
): Promise<DTO.SignedTransactionData> {
): Promise<Contracts.SignedTransactionData> {
return this.createFromData("multiPayment", input, options, ({ transaction, data }) => {
for (const payment of data.payments) {
transaction.addPayment(payment.to, payment.amount);
Expand All @@ -133,14 +134,14 @@ export class TransactionService implements Contracts.TransactionService {
public async delegateResignation(
input: Contracts.DelegateResignationInput,
options?: Contracts.TransactionOptions,
): Promise<DTO.SignedTransactionData> {
): Promise<Contracts.SignedTransactionData> {
return this.createFromData("delegateResignation", input, options);
}

public async htlcLock(
input: Contracts.HtlcLockInput,
options?: Contracts.TransactionOptions,
): Promise<DTO.SignedTransactionData> {
): Promise<Contracts.SignedTransactionData> {
return this.createFromData("htlcLock", input, options, ({ transaction, data }) => {
transaction.amount(data.amount);

Expand All @@ -156,7 +157,7 @@ export class TransactionService implements Contracts.TransactionService {
public async htlcClaim(
input: Contracts.HtlcClaimInput,
options?: Contracts.TransactionOptions,
): Promise<DTO.SignedTransactionData> {
): Promise<Contracts.SignedTransactionData> {
return this.createFromData("htlcClaim", input, options, ({ transaction, data }) =>
transaction.htlcClaimAsset({
lockTransactionId: data.lockTransactionId,
Expand All @@ -168,7 +169,7 @@ export class TransactionService implements Contracts.TransactionService {
public async htlcRefund(
input: Contracts.HtlcRefundInput,
options?: Contracts.TransactionOptions,
): Promise<DTO.SignedTransactionData> {
): Promise<Contracts.SignedTransactionData> {
return this.createFromData("htlcRefund", input, options, ({ transaction, data }) =>
transaction.htlcRefundAsset({
lockTransactionId: data.lockTransactionId,
Expand All @@ -179,7 +180,7 @@ export class TransactionService implements Contracts.TransactionService {
public async entityRegistration(
input: Contracts.EntityRegistrationInput,
options?: Contracts.TransactionOptions,
): Promise<DTO.SignedTransactionData> {
): Promise<Contracts.SignedTransactionData> {
return this.createFromData("entityRegistration", input, options, ({ transaction, data }) =>
transaction.asset({
type: Enums.EntityType[ucfirst(data.type)],
Expand All @@ -193,7 +194,7 @@ export class TransactionService implements Contracts.TransactionService {
public async entityResignation(
input: Contracts.EntityResignationInput,
options?: Contracts.TransactionOptions,
): Promise<DTO.SignedTransactionData> {
): Promise<Contracts.SignedTransactionData> {
return this.createFromData("entityResignation", input, options, ({ transaction, data }) => {
transaction.asset({
type: Enums.EntityType[ucfirst(data.type)],
Expand All @@ -208,7 +209,7 @@ export class TransactionService implements Contracts.TransactionService {
public async entityUpdate(
input: Contracts.EntityUpdateInput,
options?: Contracts.TransactionOptions,
): Promise<DTO.SignedTransactionData> {
): Promise<Contracts.SignedTransactionData> {
return this.createFromData("entityUpdate", input, options, ({ transaction, data }) =>
transaction.asset({
type: Enums.EntityType[ucfirst(data.type)],
Expand All @@ -225,7 +226,7 @@ export class TransactionService implements Contracts.TransactionService {
input: Contracts.KeyValuePair,
options?: Contracts.TransactionOptions,
callback?: Function,
): Promise<DTO.SignedTransactionData> {
): Promise<Contracts.SignedTransactionData> {
let address: string | undefined;

if (input.sign.mnemonic) {
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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);
}
}
1 change: 1 addition & 0 deletions 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";
21 changes: 21 additions & 0 deletions 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");
}
}
5 changes: 2 additions & 3 deletions 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;
Expand Down Expand Up @@ -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",
Expand Down
2 changes: 1 addition & 1 deletion packages/platform-sdk-atom/src/services/client.ts
Expand Up @@ -118,7 +118,7 @@ export class ClientService implements Contracts.ClientService {
return syncing;
}

public async broadcast(transactions: DTO.SignedTransactionData[]): Promise<Contracts.BroadcastResponse> {
public async broadcast(transactions: Contracts.SignedTransactionData[]): Promise<Contracts.BroadcastResponse> {
const result: Contracts.BroadcastResponse = {
accepted: [],
rejected: [],
Expand Down

0 comments on commit 00b48ba

Please sign in to comment.