diff --git a/README.md b/README.md index 4557951..9f6c43e 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/source/contracts.ts b/source/contracts.ts index d42d4ea..3de550f 100644 --- a/source/contracts.ts +++ b/source/contracts.ts @@ -1,5 +1,11 @@ import { Methods } from "./enums"; +interface SignedMessage { + signatory: string; + message: string; + signature: string; +} + type BaseOptions = { coin?: string; nethash?: string; @@ -14,6 +20,8 @@ type MessageSignOptions = { address?: string; } & BaseOptions; +type MessageVerifyOptions = {} & BaseOptions; + type GenerateTransferOptions = { recipient?: string; method?: Methods.Transfer; @@ -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, +}; diff --git a/source/enums.ts b/source/enums.ts index 05508be..80321d8 100644 --- a/source/enums.ts +++ b/source/enums.ts @@ -1,6 +1,7 @@ enum Methods { "Transfer" = "transfer", "Sign" = "sign", + "Verify" = "verify", } enum Networks { diff --git a/source/url-builder.test.ts b/source/url-builder.test.ts index 9d06fea..fca9cfc 100644 --- a/source/url-builder.test.ts +++ b/source/url-builder.test.ts @@ -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"), + ); + }); }); diff --git a/source/url-builder.ts b/source/url-builder.ts index d26a3c1..2973ffd 100644 --- a/source/url-builder.ts +++ b/source/url-builder.ts @@ -1,7 +1,9 @@ import { GenerateMessageSignOptions, + GenerateMessageVerifyOptions, GenerateTransferOptions, MessageSignOptions, + SignedMessage, TransferOptions, } from "./contracts.js"; import { Methods, Networks } from "./enums.js"; @@ -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"); }