Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: generate message verify url #24

Merged
merged 5 commits into from
Aug 17, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,18 @@ builder.generateMessageSign("hello world");
> https://app.arkvault.io/#/?method=sign&message=hello+world&coin=ARK&nethash=6e84d08bd299ed97c212c886c98a57e36545c8f5d645ca7eeae63a8bd62d8988"
```

#### Verify Message

```js
builder.generateMessageVerify({
message: "hello world",
signatory: "025f81956d5826bad7d30daed2b5c8c98e72046c1ec8323da336445476183fb7ca",
signature: "22f8ef55e8120fbf51e2407c808a1cc98d7ef961646226a3d3fad606437f8ba49ab68dc33c6d4a478f954c72e9bac2b4a4fe48baa70121a311a875dba1527d9d",
});

> https://app.arkvault.io/#/?method=verify&message=hello+world&signatory=025f81956d5826bad7d30daed2b5c8c98e72046c1ec8323da336445476183fb7ca&signature=22f8ef55e8120fbf51e2407c808a1cc98d7ef961646226a3d3fad606437f8ba49ab68dc33c6d4a478f954c72e9bac2b4a4fe48baa70121a311a875dba1527d9d&coin=ARK&nethash=6e84d08bd299ed97c212c886c98a57e36545c8f5d645ca7eeae63a8bd62d8988"
```

> More detailed docs will follow soon

## Development
Expand Down
26 changes: 25 additions & 1 deletion source/contracts.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
import { Methods } from "./enums";

interface SignedMessage {
signatory: string;
message: string;
signature: string;
}

type BaseOptions = {
coin?: string;
nethash?: string;
Expand All @@ -14,6 +20,8 @@ type MessageSignOptions = {
address?: string;
} & BaseOptions;

type MessageVerifyOptions = {} & BaseOptions;

type GenerateTransferOptions = {
recipient?: string;
method?: Methods.Transfer;
Expand All @@ -24,4 +32,20 @@ type GenerateMessageSignOptions = {
method?: Methods.Sign;
} & MessageSignOptions;

export type { BaseOptions, GenerateMessageSignOptions, GenerateTransferOptions, MessageSignOptions, TransferOptions };
type GenerateMessageVerifyOptions = {
message?: string;
signatory?: string;
signature?: string;
method?: Methods.Verify;
} & MessageVerifyOptions;

export type {
BaseOptions,
GenerateMessageSignOptions,
GenerateMessageVerifyOptions,
GenerateTransferOptions,
MessageSignOptions,
MessageVerifyOptions,
SignedMessage,
TransferOptions,
};
1 change: 1 addition & 0 deletions source/enums.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
enum Methods {
"Transfer" = "transfer",
"Sign" = "sign",
"Verify" = "verify",
}

enum Networks {
Expand Down
53 changes: 53 additions & 0 deletions source/url-builder.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -158,4 +158,57 @@ describe("URLBuilder", ({ assert, it }) => {
//@ts-ignore
assert.throws(() => builder.generateMessageSign(undefined), "message is required");
});

it("should generate verify message url", () => {
const builder = new URLBuilder("baseUrl");

assert.is(
builder.generateMessageVerify({
message: "hello world",
signatory: "025f81956d5826bad7d30daed2b5c8c98e72046c1ec8323da336445476183fb7ca",
signature:
"22f8ef55e8120fbf51e2407c808a1cc98d7ef961646226a3d3fad606437f8ba49ab68dc33c6d4a478f954c72e9bac2b4a4fe48baa70121a311a875dba1527d9d",
}),
"baseUrl?message=hello+world&method=verify&signatory=025f81956d5826bad7d30daed2b5c8c98e72046c1ec8323da336445476183fb7ca&signature=22f8ef55e8120fbf51e2407c808a1cc98d7ef961646226a3d3fad606437f8ba49ab68dc33c6d4a478f954c72e9bac2b4a4fe48baa70121a311a875dba1527d9d&coin=ARK&nethash=6e84d08bd299ed97c212c886c98a57e36545c8f5d645ca7eeae63a8bd62d8988",
);
});

it("should require all properties of signed message when generating verify message url", () => {
const builder = new URLBuilder("baseUrl");

assert.throws(
() =>
builder.generateMessageVerify({
//@ts-ignore
message: undefined,
signatory: "025f81956d5826bad7d30daed2b5c8c98e72046c1ec8323da336445476183fb7ca",
signature:
"22f8ef55e8120fbf51e2407c808a1cc98d7ef961646226a3d3fad606437f8ba49ab68dc33c6d4a478f954c72e9bac2b4a4fe48baa70121a311a875dba1527d9d",
}),
new Error("signed message is invalid"),
);

assert.throws(
() =>
builder.generateMessageVerify({
message: "hello world",
//@ts-ignore
signatory: undefined,
signature:
"22f8ef55e8120fbf51e2407c808a1cc98d7ef961646226a3d3fad606437f8ba49ab68dc33c6d4a478f954c72e9bac2b4a4fe48baa70121a311a875dba1527d9d",
}),
new Error("signed message is invalid"),
);

assert.throws(
() =>
builder.generateMessageVerify({
message: "hello world",
signatory: "025f81956d5826bad7d30daed2b5c8c98e72046c1ec8323da336445476183fb7ca",
//@ts-ignore
signature: undefined,
}),
new Error("signed message is invalid"),
);
});
});
17 changes: 16 additions & 1 deletion source/url-builder.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import {
GenerateMessageSignOptions,
GenerateMessageVerifyOptions,
GenerateTransferOptions,
MessageSignOptions,
SignedMessage,
TransferOptions,
} from "./contracts.js";
import { Methods, Networks } from "./enums.js";
Expand Down Expand Up @@ -71,7 +73,20 @@ export class URLBuilder {
});
}

#generate(options: GenerateTransferOptions | GenerateMessageSignOptions): string {
public generateMessageVerify({ message, signatory, signature }: SignedMessage) {
if (!message || !signatory || !signature) {
throw new Error("signed message is invalid");
}

return this.#generate({
message,
method: Methods.Verify,
signatory,
signature,
});
}

#generate(options: GenerateTransferOptions | GenerateMessageSignOptions | GenerateMessageVerifyOptions): string {
if (!this.#coin) {
throw new Error("coin has to be set");
}
Expand Down