@arkecosystem/typescript-crypto 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. package/.editorconfig +16 -0
  2. package/.eslintrc.js +12 -0
  3. package/.github/PULL_REQUEST_TEMPLATE.md +24 -0
  4. package/.github/workflows/ci.yml +36 -0
  5. package/.github/workflows/publish.yml +56 -0
  6. package/.vscode/settings.json +2 -0
  7. package/README.md +31 -0
  8. package/dist/configuration/Network.d.ts +7 -0
  9. package/dist/configuration/Network.d.ts.map +1 -0
  10. package/dist/configuration/Network.js +12 -0
  11. package/dist/configuration/index.d.ts +2 -0
  12. package/dist/configuration/index.d.ts.map +1 -0
  13. package/dist/configuration/index.js +1 -0
  14. package/dist/enums/AbiFunction.d.ts +10 -0
  15. package/dist/enums/AbiFunction.d.ts.map +1 -0
  16. package/dist/enums/AbiFunction.js +10 -0
  17. package/dist/enums/Constants.d.ts +5 -0
  18. package/dist/enums/Constants.d.ts.map +1 -0
  19. package/dist/enums/Constants.js +5 -0
  20. package/dist/enums/ContractAbiType.d.ts +7 -0
  21. package/dist/enums/ContractAbiType.d.ts.map +1 -0
  22. package/dist/enums/ContractAbiType.js +7 -0
  23. package/dist/enums/ContractAddresses.d.ts +6 -0
  24. package/dist/enums/ContractAddresses.d.ts.map +1 -0
  25. package/dist/enums/ContractAddresses.js +6 -0
  26. package/dist/enums/index.d.ts +5 -0
  27. package/dist/enums/index.d.ts.map +1 -0
  28. package/dist/enums/index.js +4 -0
  29. package/dist/exceptions/InvalidUsernameException.d.ts +4 -0
  30. package/dist/exceptions/InvalidUsernameException.d.ts.map +1 -0
  31. package/dist/exceptions/InvalidUsernameException.js +6 -0
  32. package/dist/exceptions/index.d.ts +2 -0
  33. package/dist/exceptions/index.d.ts.map +1 -0
  34. package/dist/exceptions/index.js +1 -0
  35. package/dist/identities/Address.d.ts +7 -0
  36. package/dist/identities/Address.d.ts.map +1 -0
  37. package/dist/identities/Address.js +15 -0
  38. package/dist/identities/PrivateKey.d.ts +16 -0
  39. package/dist/identities/PrivateKey.d.ts.map +1 -0
  40. package/dist/identities/PrivateKey.js +31 -0
  41. package/dist/identities/PublicKey.d.ts +8 -0
  42. package/dist/identities/PublicKey.d.ts.map +1 -0
  43. package/dist/identities/PublicKey.js +24 -0
  44. package/dist/identities/WIF.d.ts +4 -0
  45. package/dist/identities/WIF.d.ts.map +1 -0
  46. package/dist/identities/WIF.js +13 -0
  47. package/dist/identities/index.d.ts +5 -0
  48. package/dist/identities/index.d.ts.map +1 -0
  49. package/dist/identities/index.js +4 -0
  50. package/dist/index.d.ts +8 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +24 -0
  53. package/dist/networks/AbstractNetwork.d.ts +6 -0
  54. package/dist/networks/AbstractNetwork.d.ts.map +1 -0
  55. package/dist/networks/AbstractNetwork.js +2 -0
  56. package/dist/networks/Mainnet.d.ts +7 -0
  57. package/dist/networks/Mainnet.d.ts.map +1 -0
  58. package/dist/networks/Mainnet.js +12 -0
  59. package/dist/networks/Testnet.d.ts +7 -0
  60. package/dist/networks/Testnet.d.ts.map +1 -0
  61. package/dist/networks/Testnet.js +12 -0
  62. package/dist/networks/index.d.ts +4 -0
  63. package/dist/networks/index.d.ts.map +1 -0
  64. package/dist/networks/index.js +3 -0
  65. package/dist/transactions/Deserializer.d.ts +18 -0
  66. package/dist/transactions/Deserializer.d.ts.map +1 -0
  67. package/dist/transactions/Deserializer.js +106 -0
  68. package/dist/transactions/Serializer.d.ts +9 -0
  69. package/dist/transactions/Serializer.d.ts.map +1 -0
  70. package/dist/transactions/Serializer.js +16 -0
  71. package/dist/transactions/builders/AbstractTransactionBuilder.d.ts +17 -0
  72. package/dist/transactions/builders/AbstractTransactionBuilder.d.ts.map +1 -0
  73. package/dist/transactions/builders/AbstractTransactionBuilder.js +54 -0
  74. package/dist/transactions/builders/EvmCallBuilder.d.ts +9 -0
  75. package/dist/transactions/builders/EvmCallBuilder.d.ts.map +1 -0
  76. package/dist/transactions/builders/EvmCallBuilder.js +18 -0
  77. package/dist/transactions/builders/MultipaymentBuilder.d.ts +9 -0
  78. package/dist/transactions/builders/MultipaymentBuilder.d.ts.map +1 -0
  79. package/dist/transactions/builders/MultipaymentBuilder.js +25 -0
  80. package/dist/transactions/builders/TransferBuilder.d.ts +8 -0
  81. package/dist/transactions/builders/TransferBuilder.d.ts.map +1 -0
  82. package/dist/transactions/builders/TransferBuilder.js +15 -0
  83. package/dist/transactions/builders/UnvoteBuilder.d.ts +8 -0
  84. package/dist/transactions/builders/UnvoteBuilder.d.ts.map +1 -0
  85. package/dist/transactions/builders/UnvoteBuilder.js +15 -0
  86. package/dist/transactions/builders/UsernameRegistrationBuilder.d.ts +9 -0
  87. package/dist/transactions/builders/UsernameRegistrationBuilder.d.ts.map +1 -0
  88. package/dist/transactions/builders/UsernameRegistrationBuilder.js +22 -0
  89. package/dist/transactions/builders/UsernameResignationBuilder.d.ts +8 -0
  90. package/dist/transactions/builders/UsernameResignationBuilder.d.ts.map +1 -0
  91. package/dist/transactions/builders/UsernameResignationBuilder.js +15 -0
  92. package/dist/transactions/builders/ValidatorRegistrationBuilder.d.ts +9 -0
  93. package/dist/transactions/builders/ValidatorRegistrationBuilder.d.ts.map +1 -0
  94. package/dist/transactions/builders/ValidatorRegistrationBuilder.js +20 -0
  95. package/dist/transactions/builders/ValidatorResignationBuilder.d.ts +8 -0
  96. package/dist/transactions/builders/ValidatorResignationBuilder.d.ts.map +1 -0
  97. package/dist/transactions/builders/ValidatorResignationBuilder.js +15 -0
  98. package/dist/transactions/builders/VoteBuilder.d.ts +9 -0
  99. package/dist/transactions/builders/VoteBuilder.d.ts.map +1 -0
  100. package/dist/transactions/builders/VoteBuilder.js +20 -0
  101. package/dist/transactions/builders/index.d.ts +11 -0
  102. package/dist/transactions/builders/index.d.ts.map +1 -0
  103. package/dist/transactions/builders/index.js +10 -0
  104. package/dist/transactions/index.d.ts +5 -0
  105. package/dist/transactions/index.d.ts.map +1 -0
  106. package/dist/transactions/index.js +4 -0
  107. package/dist/transactions/types/AbstractTransaction.d.ts +22 -0
  108. package/dist/transactions/types/AbstractTransaction.d.ts.map +1 -0
  109. package/dist/transactions/types/AbstractTransaction.js +79 -0
  110. package/dist/transactions/types/EvmCall.d.ts +8 -0
  111. package/dist/transactions/types/EvmCall.d.ts.map +1 -0
  112. package/dist/transactions/types/EvmCall.js +14 -0
  113. package/dist/transactions/types/Multipayment.d.ts +9 -0
  114. package/dist/transactions/types/Multipayment.d.ts.map +1 -0
  115. package/dist/transactions/types/Multipayment.js +38 -0
  116. package/dist/transactions/types/Transfer.d.ts +8 -0
  117. package/dist/transactions/types/Transfer.d.ts.map +1 -0
  118. package/dist/transactions/types/Transfer.js +14 -0
  119. package/dist/transactions/types/Unvote.d.ts +8 -0
  120. package/dist/transactions/types/Unvote.d.ts.map +1 -0
  121. package/dist/transactions/types/Unvote.js +16 -0
  122. package/dist/transactions/types/UsernameRegistration.d.ts +9 -0
  123. package/dist/transactions/types/UsernameRegistration.d.ts.map +1 -0
  124. package/dist/transactions/types/UsernameRegistration.js +33 -0
  125. package/dist/transactions/types/UsernameResignation.d.ts +8 -0
  126. package/dist/transactions/types/UsernameResignation.d.ts.map +1 -0
  127. package/dist/transactions/types/UsernameResignation.js +16 -0
  128. package/dist/transactions/types/ValidatorRegistration.d.ts +9 -0
  129. package/dist/transactions/types/ValidatorRegistration.d.ts.map +1 -0
  130. package/dist/transactions/types/ValidatorRegistration.js +33 -0
  131. package/dist/transactions/types/ValidatorResignation.d.ts +8 -0
  132. package/dist/transactions/types/ValidatorResignation.d.ts.map +1 -0
  133. package/dist/transactions/types/ValidatorResignation.js +16 -0
  134. package/dist/transactions/types/Vote.d.ts +9 -0
  135. package/dist/transactions/types/Vote.d.ts.map +1 -0
  136. package/dist/transactions/types/Vote.js +31 -0
  137. package/dist/transactions/types/index.d.ts +11 -0
  138. package/dist/transactions/types/index.d.ts.map +1 -0
  139. package/dist/transactions/types/index.js +10 -0
  140. package/dist/types.d.ts +72 -0
  141. package/dist/types.d.ts.map +1 -0
  142. package/dist/types.js +1 -0
  143. package/dist/utils/Abi/ArgumentDecoder.d.ts +10 -0
  144. package/dist/utils/Abi/ArgumentDecoder.d.ts.map +1 -0
  145. package/dist/utils/Abi/ArgumentDecoder.js +21 -0
  146. package/dist/utils/Abi/json/Abi.Consensus.json +1673 -0
  147. package/dist/utils/Abi/json/Abi.Multipayment.json +110 -0
  148. package/dist/utils/Abi/json/Abi.Usernames.json +900 -0
  149. package/dist/utils/AbiBase.d.ts +8 -0
  150. package/dist/utils/AbiBase.d.ts.map +1 -0
  151. package/dist/utils/AbiBase.js +25 -0
  152. package/dist/utils/AbiDecoder.d.ts +6 -0
  153. package/dist/utils/AbiDecoder.d.ts.map +1 -0
  154. package/dist/utils/AbiDecoder.js +14 -0
  155. package/dist/utils/AbiEncoder.d.ts +5 -0
  156. package/dist/utils/AbiEncoder.d.ts.map +1 -0
  157. package/dist/utils/AbiEncoder.js +6 -0
  158. package/dist/utils/Helpers.d.ts +19 -0
  159. package/dist/utils/Helpers.d.ts.map +1 -0
  160. package/dist/utils/Helpers.js +38 -0
  161. package/dist/utils/Message.d.ts +14 -0
  162. package/dist/utils/Message.d.ts.map +1 -0
  163. package/dist/utils/Message.js +43 -0
  164. package/dist/utils/Slot.d.ts +5 -0
  165. package/dist/utils/Slot.d.ts.map +1 -0
  166. package/dist/utils/Slot.js +9 -0
  167. package/dist/utils/TransactionUtils.d.ts +7 -0
  168. package/dist/utils/TransactionUtils.d.ts.map +1 -0
  169. package/dist/utils/TransactionUtils.js +35 -0
  170. package/dist/utils/UnitConverter.d.ts +8 -0
  171. package/dist/utils/UnitConverter.d.ts.map +1 -0
  172. package/dist/utils/UnitConverter.js +48 -0
  173. package/dist/utils/index.d.ts +9 -0
  174. package/dist/utils/index.d.ts.map +1 -0
  175. package/dist/utils/index.js +8 -0
  176. package/jest.config.ts +14 -0
  177. package/package.json +59 -0
  178. package/prettier.config.js +8 -0
  179. package/src/configuration/Network.ts +18 -0
  180. package/src/configuration/index.ts +1 -0
  181. package/src/enums/AbiFunction.ts +9 -0
  182. package/src/enums/Constants.ts +4 -0
  183. package/src/enums/ContractAbiType.ts +6 -0
  184. package/src/enums/ContractAddresses.ts +5 -0
  185. package/src/enums/index.ts +4 -0
  186. package/src/exceptions/InvalidUsernameException.ts +6 -0
  187. package/src/exceptions/index.ts +1 -0
  188. package/src/identities/Address.ts +19 -0
  189. package/src/identities/PrivateKey.ts +49 -0
  190. package/src/identities/PublicKey.ts +28 -0
  191. package/src/identities/WIF.ts +16 -0
  192. package/src/identities/index.ts +4 -0
  193. package/src/index.ts +7 -0
  194. package/src/networks/AbstractNetwork.ts +7 -0
  195. package/src/networks/Mainnet.ts +15 -0
  196. package/src/networks/Testnet.ts +15 -0
  197. package/src/networks/index.ts +3 -0
  198. package/src/transactions/Deserializer.ts +140 -0
  199. package/src/transactions/Serializer.ts +24 -0
  200. package/src/transactions/builders/AbstractTransactionBuilder.ts +81 -0
  201. package/src/transactions/builders/EvmCallBuilder.ts +24 -0
  202. package/src/transactions/builders/MultipaymentBuilder.ts +37 -0
  203. package/src/transactions/builders/TransferBuilder.ts +22 -0
  204. package/src/transactions/builders/UnvoteBuilder.ts +21 -0
  205. package/src/transactions/builders/UsernameRegistrationBuilder.ts +35 -0
  206. package/src/transactions/builders/UsernameResignationBuilder.ts +21 -0
  207. package/src/transactions/builders/ValidatorRegistrationBuilder.ts +32 -0
  208. package/src/transactions/builders/ValidatorResignationBuilder.ts +21 -0
  209. package/src/transactions/builders/VoteBuilder.ts +29 -0
  210. package/src/transactions/builders/index.ts +10 -0
  211. package/src/transactions/index.ts +4 -0
  212. package/src/transactions/types/AbstractTransaction.ts +118 -0
  213. package/src/transactions/types/EvmCall.ts +22 -0
  214. package/src/transactions/types/Multipayment.ts +51 -0
  215. package/src/transactions/types/Transfer.ts +22 -0
  216. package/src/transactions/types/Unvote.ts +24 -0
  217. package/src/transactions/types/UsernameRegistration.ts +44 -0
  218. package/src/transactions/types/UsernameResignation.ts +24 -0
  219. package/src/transactions/types/ValidatorRegistration.ts +44 -0
  220. package/src/transactions/types/ValidatorResignation.ts +24 -0
  221. package/src/transactions/types/Vote.ts +42 -0
  222. package/src/transactions/types/index.ts +10 -0
  223. package/src/types.ts +86 -0
  224. package/src/utils/Abi/ArgumentDecoder.ts +29 -0
  225. package/src/utils/Abi/json/Abi.Consensus.json +1673 -0
  226. package/src/utils/Abi/json/Abi.Multipayment.json +110 -0
  227. package/src/utils/Abi/json/Abi.Usernames.json +900 -0
  228. package/src/utils/AbiBase.ts +32 -0
  229. package/src/utils/AbiDecoder.ts +19 -0
  230. package/src/utils/AbiEncoder.ts +7 -0
  231. package/src/utils/Helpers.ts +46 -0
  232. package/src/utils/Message.ts +63 -0
  233. package/src/utils/Slot.ts +11 -0
  234. package/src/utils/TransactionUtils.ts +43 -0
  235. package/src/utils/UnitConverter.ts +57 -0
  236. package/src/utils/index.ts +8 -0
  237. package/tests/fixtures/global.json +10 -0
  238. package/tests/fixtures/identity.json +11 -0
  239. package/tests/fixtures/message-sign.json +5 -0
  240. package/tests/fixtures/sign-compact.json +10 -0
  241. package/tests/fixtures/transactions/evm-sign.json +18 -0
  242. package/tests/fixtures/transactions/multipayment-empty.json +18 -0
  243. package/tests/fixtures/transactions/multipayment-single.json +18 -0
  244. package/tests/fixtures/transactions/multipayment.json +18 -0
  245. package/tests/fixtures/transactions/transfer-0.json +18 -0
  246. package/tests/fixtures/transactions/transfer-large-amount.json +18 -0
  247. package/tests/fixtures/transactions/transfer.json +18 -0
  248. package/tests/fixtures/transactions/unvote.json +18 -0
  249. package/tests/fixtures/transactions/username-registration.json +18 -0
  250. package/tests/fixtures/transactions/username-resignation.json +18 -0
  251. package/tests/fixtures/transactions/validator-registration.json +18 -0
  252. package/tests/fixtures/transactions/validator-resignation.json +18 -0
  253. package/tests/fixtures/transactions/vote.json +18 -0
  254. package/tests/unit/identities/Address.test.ts +26 -0
  255. package/tests/unit/identities/PrivateKey.test.ts +36 -0
  256. package/tests/unit/identities/PublicKey.test.ts +39 -0
  257. package/tests/unit/identities/WIF.test.ts +8 -0
  258. package/tests/unit/transactions/Deserializer.test.ts +138 -0
  259. package/tests/unit/transactions/Serializer.test.ts +9 -0
  260. package/tests/unit/transactions/builders/EvmCallBuilder.test.ts +49 -0
  261. package/tests/unit/transactions/builders/MultipaymentBuilder.test.ts +99 -0
  262. package/tests/unit/transactions/builders/TransferBuilder.test.ts +73 -0
  263. package/tests/unit/transactions/builders/UnvoteBuilder.test.ts +47 -0
  264. package/tests/unit/transactions/builders/UsernameRegistrationBuilder.test.ts +54 -0
  265. package/tests/unit/transactions/builders/UsernameResignationBuilder.test.ts +48 -0
  266. package/tests/unit/transactions/builders/ValidatorRegistrationBuilder.test.ts +51 -0
  267. package/tests/unit/transactions/builders/ValidatorResignationBuilder.test.ts +48 -0
  268. package/tests/unit/transactions/builders/VoteBuilder.test.ts +48 -0
  269. package/tests/unit/transactions/types/AbstractTransaction.test.ts +145 -0
  270. package/tests/unit/utils/Abi/ArgumentDecoder.test.ts +55 -0
  271. package/tests/unit/utils/AbiDecoder.test.ts +44 -0
  272. package/tests/unit/utils/AbiEncoder.test.ts +30 -0
  273. package/tests/unit/utils/Helpers.test.ts +120 -0
  274. package/tests/unit/utils/Message.test.ts +104 -0
  275. package/tests/unit/utils/Slot.test.ts +69 -0
  276. package/tests/unit/utils/TransactionUtils.test.ts +31 -0
  277. package/tests/unit/utils/UnitConverter.test.ts +71 -0
  278. package/tsconfig.json +20 -0
@@ -0,0 +1,32 @@
1
+ import { ContractAbiType } from "@/enums/ContractAbiType";
2
+ import { Interface } from "ethers";
3
+ import ConsensusContract from "./Abi/json/Abi.Consensus.json";
4
+ import MultipaymentContract from "./Abi/json/Abi.Multipayment.json";
5
+ import UsernamesContract from "./Abi/json/Abi.Usernames.json";
6
+
7
+ export abstract class AbiBase {
8
+ protected interface: Interface;
9
+
10
+ constructor(type: ContractAbiType = ContractAbiType.CONSENSUS, customAbi?: string) {
11
+ const abi = this.contractAbi(type, customAbi);
12
+
13
+ this.interface = new Interface(JSON.parse(JSON.stringify(abi)).abi);
14
+ }
15
+
16
+ private contractAbi(type: ContractAbiType = ContractAbiType.CONSENSUS, customAbi?: any): object {
17
+ switch (type) {
18
+ case ContractAbiType.CONSENSUS:
19
+ return ConsensusContract;
20
+ case ContractAbiType.MULTIPAYMENT:
21
+ return MultipaymentContract;
22
+ case ContractAbiType.USERNAMES:
23
+ return UsernamesContract;
24
+ }
25
+
26
+ if (customAbi) {
27
+ return customAbi;
28
+ }
29
+
30
+ throw new Error("Invalid contract type");
31
+ }
32
+ }
@@ -0,0 +1,19 @@
1
+ import { AbiResult } from "@/types";
2
+ import { AbiBase } from "./AbiBase";
3
+ import { Result } from "ethers";
4
+
5
+ export class AbiDecoder extends AbiBase {
6
+ decodeFunctionData(data: string): AbiResult {
7
+ if (!data.startsWith("0x")) {
8
+ data = "0x" + data;
9
+ }
10
+
11
+ const functionSelector = data.slice(0, 10);
12
+ const functionFragment = this.interface.getFunction(functionSelector);
13
+
14
+ return {
15
+ functionName: functionFragment!.name,
16
+ args: this.interface.decodeFunctionData(functionFragment!, data),
17
+ };
18
+ }
19
+ }
@@ -0,0 +1,7 @@
1
+ import { AbiBase } from "./AbiBase";
2
+
3
+ export class AbiEncoder extends AbiBase {
4
+ encodeFunctionCall(functionName: string, parameters: any[]): string {
5
+ return this.interface.encodeFunctionData(functionName, parameters);
6
+ }
7
+ }
@@ -0,0 +1,46 @@
1
+ import { InvalidUsernameException } from "@/exceptions/InvalidUsernameException";
2
+
3
+ export class Helpers {
4
+ /**
5
+ * Validates a username based on specific rules.
6
+ * Based on https://github.com/ArkEcosystem/mainsail/blob/develop/contracts/src/usernames/UsernamesV1.sol#L101
7
+ *
8
+ * @param username The username to validate
9
+ * @returns true if the username is valid
10
+ * @throws InvalidUsernameException if the username is invalid
11
+ */
12
+ public static isValidUsername(username: string): boolean {
13
+ if (username.length < 1 || username.length > 20) {
14
+ throw new InvalidUsernameException(
15
+ `Username must be between 1 and 20 characters long. Got ${username.length} characters.`,
16
+ );
17
+ }
18
+
19
+ // Only lowercase letters, numbers and underscores are allowed
20
+ if (/[^a-z0-9_]/.test(username)) {
21
+ throw new InvalidUsernameException("Username can only contain lowercase letters, numbers and underscores.");
22
+ }
23
+
24
+ // Cannot start or end with underscore
25
+ if (/^_|_$/.test(username)) {
26
+ throw new InvalidUsernameException("Username cannot start or end with an underscore.");
27
+ }
28
+
29
+ // Cannot contain two or more consecutive underscores
30
+ if (/__/.test(username)) {
31
+ throw new InvalidUsernameException("Username cannot contain consecutive underscores.");
32
+ }
33
+
34
+ return true;
35
+ }
36
+
37
+ /**
38
+ * Removes the leading '0x' from a hex string.
39
+ *
40
+ * @param hex The hex string to process
41
+ * @returns The hex string without the leading '0x'
42
+ */
43
+ public static removeLeadingHexZero(hex: string): string {
44
+ return hex.replace(/^0x/, ""); // Using replace to only remove the prefix, not leading zeros
45
+ }
46
+ }
@@ -0,0 +1,63 @@
1
+ import { PrivateKey } from "@/identities/PrivateKey";
2
+ import { PublicKey } from "@/identities/PublicKey";
3
+ import { SignedMessage } from "@/types";
4
+ import { keccak256 } from "ethers";
5
+ // import { verify } from "tiny-secp256k1";
6
+ import { verify } from "@noble/secp256k1";
7
+
8
+ export class Message {
9
+ public publicKey: string;
10
+ public signature: string;
11
+ public message: string;
12
+
13
+ constructor(message: SignedMessage) {
14
+ this.publicKey = message.publicKey;
15
+ this.signature = message.signature;
16
+ this.message = message.message;
17
+ }
18
+
19
+ static new(message: SignedMessage): Message {
20
+ return new Message(message);
21
+ }
22
+
23
+ static async sign(message: string, passphrase: string): Promise<Message> {
24
+ const privateKey = PrivateKey.fromPassphrase(passphrase);
25
+ const publicKey = PublicKey.fromPassphrase(passphrase).publicKey;
26
+
27
+ const signature = await privateKey.sign(Buffer.from(message).toString("hex"));
28
+
29
+ return Message.new({
30
+ publicKey,
31
+ signature: signature.r + signature.s + Number(signature.v).toString(16),
32
+ message,
33
+ });
34
+ }
35
+
36
+ verify(): boolean {
37
+ const message = Buffer.from(keccak256(Buffer.from(this.message)).slice(2), "hex");
38
+ const signature = Buffer.from(this.signature.slice(0, 128), "hex");
39
+ const publicKey = Buffer.from(this.publicKey, "hex");
40
+
41
+ // const r = signature.subarray(0, 32).readBigInt64BE();
42
+ // const s = signature.subarray(32, 64).readBigInt64BE();
43
+ // const v = Number(signature.subarray(64, 66).toString("hex"));
44
+
45
+ return verify(signature, message, publicKey);
46
+ }
47
+
48
+ toString(): string {
49
+ return JSON.stringify(this.toJson());
50
+ }
51
+
52
+ toArray(): string[] {
53
+ return [this.publicKey, this.signature, this.message];
54
+ }
55
+
56
+ toJson(): SignedMessage {
57
+ return {
58
+ publicKey: this.publicKey,
59
+ signature: this.signature,
60
+ message: this.message,
61
+ };
62
+ }
63
+ }
@@ -0,0 +1,11 @@
1
+ import { Network } from "@/configuration/Network";
2
+
3
+ export class Slot {
4
+ static time(): number {
5
+ return Math.floor(Date.now() / 1000) - this.epoch();
6
+ }
7
+
8
+ static epoch(): number {
9
+ return Math.floor(new Date(Network.get().epoch()).getTime() / 1000);
10
+ }
11
+ }
@@ -0,0 +1,43 @@
1
+ import { encodeRlp, keccak256, toBeArray } from "ethers";
2
+ import { Constants } from "@/enums/Constants";
3
+ import { TransactionData } from "@/types";
4
+
5
+ export class TransactionUtils {
6
+ public static toBuffer(transaction: TransactionData, skipSignature: boolean = false): Buffer {
7
+ const fields = [
8
+ toBeArray(transaction['network'] ?? 0),
9
+ toBeArray(transaction['nonce'] ? transaction['nonce'] : 0),
10
+ toBeArray(0),
11
+ toBeArray(transaction['gasPrice'] ?? 0),
12
+ toBeArray(transaction['gasLimit'] ?? 0),
13
+ transaction['recipientAddress'] ?? '0x',
14
+ toBeArray(transaction['value'] ? transaction['value'] : 0),
15
+ transaction['data'] && transaction['data'].startsWith('0x')
16
+ ? transaction['data']
17
+ : ('0x' + (transaction['data'] ?? '')),
18
+ [],
19
+ ];
20
+
21
+ if (! skipSignature && transaction['v'] && transaction['r'] && transaction['s']) {
22
+ fields.push(toBeArray(transaction['v'] - Constants.ETHEREUM_RECOVERY_ID_OFFSET));
23
+ fields.push('0x' + transaction['r']);
24
+ fields.push('0x' + transaction['s']);
25
+ }
26
+
27
+ const encoded = encodeRlp(fields);
28
+
29
+ const payload = Constants.EIP_1559_PREFIX + encoded.substring(2);
30
+
31
+ return Buffer.from(payload);
32
+ }
33
+
34
+ public static toHash(transaction: TransactionData, skipSignature: boolean = false): string {
35
+ const encoding = this.toBuffer(transaction, skipSignature);
36
+
37
+ return keccak256('0x' + encoding.toString('binary')).substring(2);
38
+ }
39
+
40
+ public static getId(transaction: TransactionData): string {
41
+ return this.toHash(transaction, false);
42
+ }
43
+ }
@@ -0,0 +1,57 @@
1
+ import BigNumber from "bignumber.js";
2
+
3
+ const WEI_MULTIPLIER = 1;
4
+ const GWEI_MULTIPLIER = 1000000000; // 1e9
5
+ const ARK_MULTIPLIER = 1000000000000000000; // 1e18
6
+
7
+ export class UnitConverter {
8
+ static parseUnits(value: number|string, unit: string = 'ark'): BigNumber {
9
+ switch (unit.toLowerCase()) {
10
+ case 'wei':
11
+ return BigNumber(value).multipliedBy(WEI_MULTIPLIER);
12
+ case 'gwei':
13
+ return BigNumber(value).multipliedBy(GWEI_MULTIPLIER);
14
+ case 'ark':
15
+ return BigNumber(value).multipliedBy(ARK_MULTIPLIER);
16
+ default:
17
+ throw new Error(`Unsupported unit: ${unit}. Supported units are 'wei', 'gwei', and 'ark'.`);
18
+ }
19
+ }
20
+
21
+ static formatUnits(value: string, unit: string = 'ark'): number {
22
+ switch (unit.toLowerCase()) {
23
+ case 'wei':
24
+ return BigNumber(value).dividedBy(WEI_MULTIPLIER).toNumber();
25
+ case 'gwei':
26
+ return BigNumber(value).dividedBy(GWEI_MULTIPLIER).toNumber();
27
+ case 'ark':
28
+ return BigNumber(value).dividedBy(ARK_MULTIPLIER).toNumber();
29
+ default:
30
+ throw new Error(`Unsupported unit: ${unit}. Supported units are 'wei', 'gwei', and 'ark'.`);
31
+ }
32
+ }
33
+
34
+ static weiToArk(value: number|string, suffix?: string): string {
35
+ const convertedValue = new BigNumber(this.formatUnits(this.parseUnits(value, 'wei').toString(), 'ark'))
36
+ .decimalPlaces(18)
37
+ .toFixed();
38
+
39
+ if (suffix) {
40
+ return convertedValue + ' ' + suffix;
41
+ }
42
+
43
+ return convertedValue;
44
+ }
45
+
46
+ static gweiToArk(value: number|string, suffix?: string): string {
47
+ const convertedValue = new BigNumber(this.formatUnits(this.parseUnits(value, 'gwei').toString(), 'ark'))
48
+ .decimalPlaces(18)
49
+ .toFixed();
50
+
51
+ if (suffix) {
52
+ return convertedValue + ' ' + suffix;
53
+ }
54
+
55
+ return convertedValue;
56
+ }
57
+ }
@@ -0,0 +1,8 @@
1
+ export * from "./AbiBase";
2
+ export * from "./AbiDecoder";
3
+ export * from "./AbiEncoder";
4
+ export * from "./Helpers";
5
+ export * from "./Message";
6
+ export * from "./Slot";
7
+ export * from "./TransactionUtils";
8
+ export * from "./UnitConverter";
@@ -0,0 +1,10 @@
1
+ {
2
+ "address": "0x6f0182a0cc707b055322ccf6d4cb6a5aff1aeb22",
3
+ "passphrase": "found lobster oblige describe ready addict body brave live vacuum display salute lizard combine gift resemble race senior quality reunion proud tell adjust angle",
4
+ "secondPassphrase": "this is a top secret second passphrase",
5
+ "passphrases": [
6
+ "album pony urban cheap small blade cannon silent run reveal luxury glad predict excess fire beauty hollow reward solar egg exclude leaf sight degree",
7
+ "hen slogan retire boss upset blame rocket slender area arch broom bring elder few milk bounce execute page evoke once inmate pear marine deliver",
8
+ "top visa use bacon sun infant shrimp eye bridge fantasy chair sadness stable simple salad canoe raw hill target connect avoid promote spider category"
9
+ ]
10
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "data": {
3
+ "publicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
4
+ "privateKey": "50829dd3b7ffbe2df401d730b5e60cea7520ba3f3a18e5b1490707667fb43fae",
5
+ "address": "0x1E6747BEAa5B4076a6A98D735DF8c35a70D18Bdd",
6
+ "wif": "UZYnRZ8qpeQWTLeCNzw93guWSdKLmr2vHEWGG4sNv7TJofL7TZvy",
7
+ "validatorPublicKey": "b209f4a7454ae17c5808991dffbf204c747b851f351d2ce72a6e18903d0e2f609e0328ebbc3fb97cd4d3660b4bc156f1",
8
+ "validatorPrivateKey": "6ec4993df152b10e672567c1fdf854a4cee50708fa30986a7d9b259673099175"
9
+ },
10
+ "passphrase": "found lobster oblige describe ready addict body brave live vacuum display salute lizard combine gift resemble race senior quality reunion proud tell adjust angle"
11
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "message": "Hello, world!",
3
+ "publicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
4
+ "signature": "0e2e53409be748834cac44052817ecef569b429a0492aa6bbc0d934eb71a09547e77aeef33d45669bbcba0498149f0e2b637fe8905186e08a5410c6f2b013bb41b"
5
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "data": {
3
+ "serialized": "1c104665257d4dea61c4654e74c6c0f6cd0a398905781c3040bea67dc641a66da046d718d04b2331f3b0561808549ed3f3f0d867a284acf6b334869078df7a9136",
4
+ "message": "02ea822710018085012a05f200825208946f0182a0cc707b055322ccf6d4cb6a5aff1aeb228405f5e10080c0",
5
+ "v": 28,
6
+ "r": "104665257d4dea61c4654e74c6c0f6cd0a398905781c3040bea67dc641a66da0",
7
+ "s": "46d718d04b2331f3b0561808549ed3f3f0d867a284acf6b334869078df7a9136"
8
+ },
9
+ "passphrase": "found lobster oblige describe ready addict body brave live vacuum display salute lizard combine gift resemble race senior quality reunion proud tell adjust angle"
10
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "data": {
3
+ "network": 10000,
4
+ "nonce": "1",
5
+ "gasPrice": "5000000000",
6
+ "gasLimit": "200000",
7
+ "recipientAddress": "0xE536720791A7DaDBeBdBCD8c8546fb0791a11901",
8
+ "value": "0",
9
+ "data": "a9059cbb00000000000000000000000027fa7caffaae77ddb9ab232fdbda56d5e5af23930000000000000000000000000000000000000000000000000000000000000064",
10
+ "v": 28,
11
+ "r": "8cd7afafdfaaa6c4b6c97e49888dff89713c99f8b1324693ef4427ce88994bbe",
12
+ "s": "01c589bb8d3bc908aaee56d64ca35458f2cebf977bbc29180c574aba8bc12b0d",
13
+ "senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
14
+ "senderAddress": "0x1E6747BEAa5B4076a6A98D735DF8c35a70D18Bdd",
15
+ "id": "85cdc2ae6cd4569dd1b5b11df10fc409b3996864032d6acf87ff907286f40a03"
16
+ },
17
+ "serialized": "02f8af822710018085012a05f20083030d4094e536720791a7dadbebdbcd8c8546fb0791a1190180b844a9059cbb00000000000000000000000027fa7caffaae77ddb9ab232fdbda56d5e5af23930000000000000000000000000000000000000000000000000000000000000064c001a08cd7afafdfaaa6c4b6c97e49888dff89713c99f8b1324693ef4427ce88994bbea001c589bb8d3bc908aaee56d64ca35458f2cebf977bbc29180c574aba8bc12b0d"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "data": {
3
+ "network": 10000,
4
+ "nonce": "1",
5
+ "gasPrice": "5000000000",
6
+ "gasLimit": "200000",
7
+ "recipientAddress": "0x00EFd0D4639191C49908A7BddbB9A11A994A8527",
8
+ "value": "0",
9
+ "data": "084ce7080000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
10
+ "v": 27,
11
+ "r": "cbec73e1cba1177789adf44fcd3cea797d132563635fae211c350acd7c328046",
12
+ "s": "216eabb6cd1eb5c0000e7eb74f66595bd5b688f43dd646f15f33e3827c8c966b",
13
+ "senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
14
+ "senderAddress": "0x1E6747BEAa5B4076a6A98D735DF8c35a70D18Bdd",
15
+ "id": "555fcaca65f9319c638ebb15c5ffdee0a5e41b7dc3b171aca3707bc43f40ed57"
16
+ },
17
+ "serialized": "02f8ef822710018085012a05f20083030d409400efd0d4639191c49908a7bddbb9a11a994a852780b884084ce7080000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c080a0cbec73e1cba1177789adf44fcd3cea797d132563635fae211c350acd7c328046a0216eabb6cd1eb5c0000e7eb74f66595bd5b688f43dd646f15f33e3827c8c966b"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "data": {
3
+ "network": 10000,
4
+ "nonce": "1",
5
+ "gasPrice": "5000000000",
6
+ "gasLimit": "200000",
7
+ "recipientAddress": "0x00EFd0D4639191C49908A7BddbB9A11A994A8527",
8
+ "value": "100000",
9
+ "data": "084ce7080000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000006f0182a0cc707b055322ccf6d4cb6a5aff1aeb22000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000186a0",
10
+ "v": 28,
11
+ "r": "e381eb89f21e450009706650346e3abfaee0c91c5685c8ec923d86b8212a2427",
12
+ "s": "5b3a7bfdec8ca69469e989805e7715f5d317bf62304f868a905224e7dabe7b37",
13
+ "senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
14
+ "senderAddress": "0x1E6747BEAa5B4076a6A98D735DF8c35a70D18Bdd",
15
+ "id": "1d0e3d567ffa39defba7904202941070b224f885f9399c817a58aeb36f4f3863"
16
+ },
17
+ "serialized": "02f90132822710018085012a05f20083030d409400efd0d4639191c49908a7bddbb9a11a994a8527830186a0b8c4084ce7080000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000006f0182a0cc707b055322ccf6d4cb6a5aff1aeb22000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000186a0c001a0e381eb89f21e450009706650346e3abfaee0c91c5685c8ec923d86b8212a2427a05b3a7bfdec8ca69469e989805e7715f5d317bf62304f868a905224e7dabe7b37"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "data": {
3
+ "network": 10000,
4
+ "nonce": "1",
5
+ "gasPrice": "5000000000",
6
+ "gasLimit": "200000",
7
+ "recipientAddress": "0x00EFd0D4639191C49908A7BddbB9A11A994A8527",
8
+ "value": "300000",
9
+ "data": "084ce708000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000006f0182a0cc707b055322ccf6d4cb6a5aff1aeb22000000000000000000000000c3bbe9b1cee1ff85ad72b87414b0e9b7f2366763000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000186a00000000000000000000000000000000000000000000000000000000000030d40",
10
+ "v": 27,
11
+ "r": "0c7cfc6e77249b44385decfd49b8d4deac3c4c49147a0a8d539d82d51da81581",
12
+ "s": "6af2959905394b401c87872f78ae321cf8cfdd03fe80a815a99bdd723cc90462",
13
+ "senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
14
+ "senderAddress": "0x1E6747BEAa5B4076a6A98D735DF8c35a70D18Bdd",
15
+ "id": "d2b7d9e8730de8ab788a37905974c11f6df1a7e5bea5f9a716bffbec17b1d3a8"
16
+ },
17
+ "serialized": "02f90173822710018085012a05f20083030d409400efd0d4639191c49908a7bddbb9a11a994a8527830493e0b90104084ce708000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000006f0182a0cc707b055322ccf6d4cb6a5aff1aeb22000000000000000000000000c3bbe9b1cee1ff85ad72b87414b0e9b7f2366763000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000186a00000000000000000000000000000000000000000000000000000000000030d40c080a00c7cfc6e77249b44385decfd49b8d4deac3c4c49147a0a8d539d82d51da81581a06af2959905394b401c87872f78ae321cf8cfdd03fe80a815a99bdd723cc90462"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "data": {
3
+ "network": 10000,
4
+ "nonce": "1",
5
+ "gasPrice": "5000000000",
6
+ "gasLimit": "21000",
7
+ "recipientAddress": "0x6F0182a0cc707b055322CcF6d4CB6a5Aff1aEb22",
8
+ "value": "0",
9
+ "data": "",
10
+ "v": 27,
11
+ "r": "2c42ef45cb01b01c0a59b61a7e82d37c8566e0fc0f0f47c2a2825d1cbc8abefc",
12
+ "s": "455bb2aec9d8d038db506d5a964728c78eaa4f237e0d40666742e4d5d686f576",
13
+ "senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
14
+ "senderAddress": "0x1E6747BEAa5B4076a6A98D735DF8c35a70D18Bdd",
15
+ "id": "241ce787680623dea7b9acf2951e2f8b8afac5f92b33b9909ab2bfbadf4be92c"
16
+ },
17
+ "serialized": "02f869822710018085012a05f200825208946f0182a0cc707b055322ccf6d4cb6a5aff1aeb228080c080a02c42ef45cb01b01c0a59b61a7e82d37c8566e0fc0f0f47c2a2825d1cbc8abefca0455bb2aec9d8d038db506d5a964728c78eaa4f237e0d40666742e4d5d686f576"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "data": {
3
+ "network": 10000,
4
+ "nonce": "1",
5
+ "gasPrice": "5000000000",
6
+ "gasLimit": "21000",
7
+ "recipientAddress": "0x6F0182a0cc707b055322CcF6d4CB6a5Aff1aEb22",
8
+ "value": "10000000000000000000",
9
+ "data": "",
10
+ "v": 27,
11
+ "r": "62666b937e4c3f55c87c44ee72b5a228c1377adbdad44264dd953b3c2b878734",
12
+ "s": "2d8670a69ce09018cfac5604d59a2b74bee18c99a91cbd14ac33c3ccfe96a35a",
13
+ "senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
14
+ "senderAddress": "0x1E6747BEAa5B4076a6A98D735DF8c35a70D18Bdd",
15
+ "id": "0d22ff14b09da9c5fa975d8fe79b93086853d223000cf88ff923a57650c93e4a"
16
+ },
17
+ "serialized": "02f871822710018085012a05f200825208946f0182a0cc707b055322ccf6d4cb6a5aff1aeb22888ac7230489e8000080c080a062666b937e4c3f55c87c44ee72b5a228c1377adbdad44264dd953b3c2b878734a02d8670a69ce09018cfac5604d59a2b74bee18c99a91cbd14ac33c3ccfe96a35a"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "data": {
3
+ "network": 10000,
4
+ "nonce": "1",
5
+ "gasPrice": "5000000000",
6
+ "gasLimit": "21000",
7
+ "recipientAddress": "0x6F0182a0cc707b055322CcF6d4CB6a5Aff1aEb22",
8
+ "value": "100000000",
9
+ "data": "",
10
+ "v": 28,
11
+ "r": "104665257d4dea61c4654e74c6c0f6cd0a398905781c3040bea67dc641a66da0",
12
+ "s": "46d718d04b2331f3b0561808549ed3f3f0d867a284acf6b334869078df7a9136",
13
+ "senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
14
+ "senderAddress": "0x1E6747BEAa5B4076a6A98D735DF8c35a70D18Bdd",
15
+ "id": "b7927d90b38cd1296351f26145b3d8b0674fdc9b8721bc1a10f71a12bcbccf60"
16
+ },
17
+ "serialized": "02f86d822710018085012a05f200825208946f0182a0cc707b055322ccf6d4cb6a5aff1aeb228405f5e10080c001a0104665257d4dea61c4654e74c6c0f6cd0a398905781c3040bea67dc641a66da0a046d718d04b2331f3b0561808549ed3f3f0d867a284acf6b334869078df7a9136"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "data": {
3
+ "network": 10000,
4
+ "nonce": "1",
5
+ "gasPrice": "5000000000",
6
+ "gasLimit": "200000",
7
+ "recipientAddress": "0x535B3D7A252fa034Ed71F0C53ec0C6F784cB64E1",
8
+ "value": "0",
9
+ "data": "3174b689",
10
+ "v": 27,
11
+ "r": "bd7f932c18b49e05600cd1603808fd0a19701ee4af99035fc7b1a9159458d08d",
12
+ "s": "18a4420edfdc90fcff7c6e4d062ae11dae7a62a7ab53f6499862f3e79d67a252",
13
+ "senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
14
+ "senderAddress": "0x1E6747BEAa5B4076a6A98D735DF8c35a70D18Bdd",
15
+ "id": "ed937a96f4edc0fa89e7d6146b88f17a3de71f86fc200da49c73e7c93eabfea9"
16
+ },
17
+ "serialized": "02f86e822710018085012a05f20083030d4094535b3d7a252fa034ed71f0c53ec0c6f784cb64e180843174b689c080a0bd7f932c18b49e05600cd1603808fd0a19701ee4af99035fc7b1a9159458d08da018a4420edfdc90fcff7c6e4d062ae11dae7a62a7ab53f6499862f3e79d67a252"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "data": {
3
+ "network": 10000,
4
+ "nonce": "1",
5
+ "gasPrice": "5000000000",
6
+ "gasLimit": "200000",
7
+ "recipientAddress": "0x2c1DE3b4Dbb4aDebEbB5dcECAe825bE2a9fc6eb6",
8
+ "value": "0",
9
+ "data": "36a94134000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000076669787475726500000000000000000000000000000000000000000000000000",
10
+ "v": 28,
11
+ "r": "4564cc1adbde3e8a309bf9d3eb76b45fecfae62fbdc0604f70483197de4d66b3",
12
+ "s": "4d4573a50c9a80221c21d11ce51b9b8bd196f9e1ab1a805b7d8b8e56fcfe2003",
13
+ "senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
14
+ "senderAddress": "0x1E6747BEAa5B4076a6A98D735DF8c35a70D18Bdd",
15
+ "id": "781979a58ac75475b91a1e401b50f9cc52465b21fe83e1c30e05676aaeb6a806"
16
+ },
17
+ "serialized": "02f8cf822710018085012a05f20083030d40942c1de3b4dbb4adebebb5dcecae825be2a9fc6eb680b86436a94134000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000076669787475726500000000000000000000000000000000000000000000000000c001a04564cc1adbde3e8a309bf9d3eb76b45fecfae62fbdc0604f70483197de4d66b3a04d4573a50c9a80221c21d11ce51b9b8bd196f9e1ab1a805b7d8b8e56fcfe2003"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "data": {
3
+ "network": 10000,
4
+ "nonce": "1",
5
+ "gasPrice": "5000000000",
6
+ "gasLimit": "200000",
7
+ "recipientAddress": "0x2c1DE3b4Dbb4aDebEbB5dcECAe825bE2a9fc6eb6",
8
+ "value": "0",
9
+ "data": "ebed6dab",
10
+ "v": 27,
11
+ "r": "c786beafa03da8c6485bc15870ea8512db27427e3aa38654a7b8d534b30c48da",
12
+ "s": "78b2b4568f4d0f5d482c670001e6877b282ed6e16cdcbea6bd29195ca2bb036d",
13
+ "senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
14
+ "senderAddress": "0x1E6747BEAa5B4076a6A98D735DF8c35a70D18Bdd",
15
+ "id": "d1647fe630bcf63a23bda6015295dafe246356b0e7930cdc8a52f216fa4429a5"
16
+ },
17
+ "serialized": "02f86e822710018085012a05f20083030d40942c1de3b4dbb4adebebb5dcecae825be2a9fc6eb68084ebed6dabc080a0c786beafa03da8c6485bc15870ea8512db27427e3aa38654a7b8d534b30c48daa078b2b4568f4d0f5d482c670001e6877b282ed6e16cdcbea6bd29195ca2bb036d"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "data": {
3
+ "network": 10000,
4
+ "nonce": "1",
5
+ "gasPrice": "5000000000",
6
+ "gasLimit": "200000",
7
+ "recipientAddress": "0x535B3D7A252fa034Ed71F0C53ec0C6F784cB64E1",
8
+ "value": "0",
9
+ "data": "602a9eee0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003030954f46d6097a1d314e900e66e11e0dad0a57cd03e04ec99f0dedd1c765dcb11e6d7fa02e22cf40f9ee23d9cc1c062400000000000000000000000000000000",
10
+ "v": 28,
11
+ "r": "57216346b5252f6db63a2c78b5bc0a3697d2247377e9d9ef1b67849a87eb2413",
12
+ "s": "66ea02477fc19671b3b626e3c4d33939a8ba43004f0a56e900efc1e580739d11",
13
+ "senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
14
+ "senderAddress": "0x1E6747BEAa5B4076a6A98D735DF8c35a70D18Bdd",
15
+ "id": "5064b50091b8e5d50ec1d1eb7c5b71cdcf9c7355bba18ee0efeaeacb0b1c95d5"
16
+ },
17
+ "serialized": "02f8ef822710018085012a05f20083030d4094535b3d7a252fa034ed71f0c53ec0c6f784cb64e180b884602a9eee0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003030954f46d6097a1d314e900e66e11e0dad0a57cd03e04ec99f0dedd1c765dcb11e6d7fa02e22cf40f9ee23d9cc1c062400000000000000000000000000000000c001a057216346b5252f6db63a2c78b5bc0a3697d2247377e9d9ef1b67849a87eb2413a066ea02477fc19671b3b626e3c4d33939a8ba43004f0a56e900efc1e580739d11"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "data": {
3
+ "network": 10000,
4
+ "nonce": "1",
5
+ "gasPrice": "5000000000",
6
+ "gasLimit": "200000",
7
+ "recipientAddress": "0x535B3D7A252fa034Ed71F0C53ec0C6F784cB64E1",
8
+ "value": "0",
9
+ "data": "b85f5da2",
10
+ "v": 28,
11
+ "r": "5670e5d314906eeaf92da15b55eaeabbb92814874f2fe6c72bcbee7e13e7ff40",
12
+ "s": "32a34c8438e441d10e83180b5a8a84cf1bfb92fc0fe8b53cd23dc4105631b83d",
13
+ "senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
14
+ "senderAddress": "0x1E6747BEAa5B4076a6A98D735DF8c35a70D18Bdd",
15
+ "id": "2dc3b976d8dee25e2ecf341c1493670d9d087cc338ed63f764c0eb9e28869dc3"
16
+ },
17
+ "serialized": "02f86e822710018085012a05f20083030d4094535b3d7a252fa034ed71f0c53ec0c6f784cb64e18084b85f5da2c001a05670e5d314906eeaf92da15b55eaeabbb92814874f2fe6c72bcbee7e13e7ff40a032a34c8438e441d10e83180b5a8a84cf1bfb92fc0fe8b53cd23dc4105631b83d"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "data": {
3
+ "network": 10000,
4
+ "nonce": "1",
5
+ "gasPrice": "5000000000",
6
+ "gasLimit": "200000",
7
+ "recipientAddress": "0x535B3D7A252fa034Ed71F0C53ec0C6F784cB64E1",
8
+ "value": "0",
9
+ "data": "6dd7d8ea000000000000000000000000c3bbe9b1cee1ff85ad72b87414b0e9b7f2366763",
10
+ "v": 27,
11
+ "r": "67734fadb38bd9cd584d39fc08af836f15dd6337b05511b312add11a3586451a",
12
+ "s": "08ba89cec57c38b1e1f488d3507b9cbe1a21aa3f441482e62bd9c1eef61d3bd9",
13
+ "senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
14
+ "senderAddress": "0x1E6747BEAa5B4076a6A98D735DF8c35a70D18Bdd",
15
+ "id": "351114ee096ad8a02ddb7abee6f4fe283b8dadceff17157722d7a8153de710c1"
16
+ },
17
+ "serialized": "02f88e822710018085012a05f20083030d4094535b3d7a252fa034ed71f0c53ec0c6f784cb64e180a46dd7d8ea000000000000000000000000c3bbe9b1cee1ff85ad72b87414b0e9b7f2366763c080a067734fadb38bd9cd584d39fc08af836f15dd6337b05511b312add11a3586451aa008ba89cec57c38b1e1f488d3507b9cbe1a21aa3f441482e62bd9c1eef61d3bd9"
18
+ }
@@ -0,0 +1,26 @@
1
+ import fixture from "@tests/fixtures/identity.json";
2
+ import { Address } from "@/identities/Address";
3
+
4
+ it('should get the address from passphrase', () => {
5
+ const actual = Address.fromPassphrase(fixture.passphrase);
6
+
7
+ expect(actual).toEqual(fixture.data.address);
8
+ });
9
+
10
+ it('should get the address from public key', () => {
11
+ const actual = Address.fromPublicKey(fixture.data.publicKey);
12
+
13
+ expect(actual).toEqual(fixture.data.address);
14
+ });
15
+
16
+ it('should get the address from private key', () => {
17
+ const actual = Address.fromPrivateKey(fixture.data.privateKey);
18
+
19
+ expect(actual).toEqual(fixture.data.address);
20
+ });
21
+
22
+ it('should validate the address', () => {
23
+ const actual = Address.validate(fixture.data.address);
24
+
25
+ expect(actual).toBe(true);
26
+ });