@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,48 @@
1
+ import fixture from "@tests/fixtures/transactions/validator-resignation.json";
2
+ import identityFixture from "@tests/fixtures/identity.json";
3
+
4
+ import { ValidatorResignationBuilder } from "@/transactions/builders/ValidatorResignationBuilder";
5
+
6
+ it("should build a transaction", async () => {
7
+ const transaction = (
8
+ await ValidatorResignationBuilder.new()
9
+ .nonce(fixture.data.nonce)
10
+ .gasPrice(fixture.data.gasPrice)
11
+ .gasLimit(fixture.data.gasLimit)
12
+ .network(fixture.data.network)
13
+ .sign(identityFixture.passphrase)
14
+ ).transaction;
15
+
16
+ expect(transaction.data.gasPrice).toBe(fixture.data.gasPrice);
17
+ expect(transaction.data.nonce).toBe(fixture.data.nonce);
18
+ expect(transaction.data.network).toBe(fixture.data.network);
19
+ expect(transaction.data.gasLimit).toBe(fixture.data.gasLimit);
20
+ expect(transaction.data.recipientAddress).toBe(fixture.data.recipientAddress);
21
+ expect(transaction.data.value).toBe(fixture.data.value);
22
+ expect(transaction.data.v).toBe(fixture.data.v);
23
+ expect(transaction.data.r).toBe(fixture.data.r);
24
+ expect(transaction.data.s).toBe(fixture.data.s);
25
+ expect(transaction.data.id).toBe(fixture.data.id);
26
+
27
+ expect(transaction.serialize().toString("binary")).toEqual(fixture.serialized);
28
+ expect(transaction.verify()).toBe(true);
29
+ });
30
+
31
+ it("should sign a transaction", async () => {
32
+ const transaction = (await ValidatorResignationBuilder.new(fixture.data).sign(identityFixture.passphrase))
33
+ .transaction;
34
+
35
+ expect(transaction.data.gasPrice).toBe(fixture.data.gasPrice);
36
+ expect(transaction.data.nonce).toBe(fixture.data.nonce);
37
+ expect(transaction.data.network).toBe(fixture.data.network);
38
+ expect(transaction.data.gasLimit).toBe(fixture.data.gasLimit);
39
+ expect(transaction.data.recipientAddress).toBe(fixture.data.recipientAddress);
40
+ expect(transaction.data.value).toBe(fixture.data.value);
41
+ expect(transaction.data.v).toBe(fixture.data.v);
42
+ expect(transaction.data.r).toBe(fixture.data.r);
43
+ expect(transaction.data.s).toBe(fixture.data.s);
44
+ expect(transaction.data.id).toBe(fixture.data.id);
45
+
46
+ expect(transaction.serialize().toString("binary")).toEqual(fixture.serialized);
47
+ expect(transaction.verify()).toBe(true);
48
+ });
@@ -0,0 +1,48 @@
1
+ import fixture from "@tests/fixtures/transactions/vote.json";
2
+ import identityFixture from "@tests/fixtures/identity.json";
3
+
4
+ import { VoteBuilder } from "@/transactions/builders/VoteBuilder";
5
+
6
+ it("should build a transaction", async () => {
7
+ const transaction = (
8
+ await VoteBuilder.new()
9
+ .vote("0xc3bbe9b1cee1ff85ad72b87414b0e9b7f2366763")
10
+ .nonce(fixture.data.nonce)
11
+ .gasPrice(fixture.data.gasPrice)
12
+ .gasLimit(fixture.data.gasLimit)
13
+ .network(fixture.data.network)
14
+ .sign(identityFixture.passphrase)
15
+ ).transaction;
16
+
17
+ expect(transaction.data.gasPrice).toBe(fixture.data.gasPrice);
18
+ expect(transaction.data.nonce).toBe(fixture.data.nonce);
19
+ expect(transaction.data.network).toBe(fixture.data.network);
20
+ expect(transaction.data.gasLimit).toBe(fixture.data.gasLimit);
21
+ expect(transaction.data.recipientAddress).toBe(fixture.data.recipientAddress);
22
+ expect(transaction.data.value).toBe(fixture.data.value);
23
+ expect(transaction.data.v).toBe(fixture.data.v);
24
+ expect(transaction.data.r).toBe(fixture.data.r);
25
+ expect(transaction.data.s).toBe(fixture.data.s);
26
+ expect(transaction.data.id).toBe(fixture.data.id);
27
+
28
+ expect(transaction.serialize().toString("binary")).toEqual(fixture.serialized);
29
+ expect(transaction.verify()).toBe(true);
30
+ });
31
+
32
+ it("should sign a transaction", async () => {
33
+ const transaction = (await VoteBuilder.new(fixture.data).sign(identityFixture.passphrase)).transaction;
34
+
35
+ expect(transaction.data.gasPrice).toBe(fixture.data.gasPrice);
36
+ expect(transaction.data.nonce).toBe(fixture.data.nonce);
37
+ expect(transaction.data.network).toBe(fixture.data.network);
38
+ expect(transaction.data.gasLimit).toBe(fixture.data.gasLimit);
39
+ expect(transaction.data.recipientAddress).toBe(fixture.data.recipientAddress);
40
+ expect(transaction.data.value).toBe(fixture.data.value);
41
+ expect(transaction.data.v).toBe(fixture.data.v);
42
+ expect(transaction.data.r).toBe(fixture.data.r);
43
+ expect(transaction.data.s).toBe(fixture.data.s);
44
+ expect(transaction.data.id).toBe(fixture.data.id);
45
+
46
+ expect(transaction.serialize().toString("binary")).toEqual(fixture.serialized);
47
+ expect(transaction.verify()).toBe(true);
48
+ });
@@ -0,0 +1,145 @@
1
+ import fixture from "@tests/fixtures/transactions/transfer.json";
2
+ import fixtureGlobal from "@tests/fixtures/global.json";
3
+ import fixtureVote from "@tests/fixtures/transactions/vote.json";
4
+
5
+ import { AbstractTransaction } from "@/transactions/types/AbstractTransaction";
6
+ import { PrivateKey } from "@/identities/PrivateKey";
7
+ import { TransactionData } from "@/types";
8
+ import { Transfer } from "@/transactions/types/Transfer";
9
+
10
+ class DecoderTransaction extends AbstractTransaction {
11
+ constructor(data: TransactionData) {
12
+ super(data);
13
+
14
+ this.decodePayload(data);
15
+
16
+ this.refreshPayloadData();
17
+ }
18
+
19
+ getPayload(): string {
20
+ return "7061796C6F6164";
21
+ }
22
+ }
23
+
24
+ class Transaction extends AbstractTransaction {
25
+ getPayload(): string {
26
+ return "7061796C6F6164";
27
+ }
28
+ }
29
+
30
+ it("should create a new instance", () => {
31
+ const transaction = new Transaction({});
32
+
33
+ expect(transaction).toBeInstanceOf(Transaction);
34
+ expect(transaction).toBeInstanceOf(AbstractTransaction);
35
+
36
+ expect(transaction.data).toEqual({
37
+ data: "7061796C6F6164",
38
+ });
39
+ });
40
+
41
+ it("should get payload", () => {
42
+ const transaction = new Transaction({});
43
+
44
+ expect(transaction.getPayload()).toEqual("7061796C6F6164");
45
+ });
46
+
47
+ it("should refresh the payload", () => {
48
+ const transaction = new Transaction({});
49
+ transaction.getPayload = () => "updated-payload";
50
+
51
+ expect(transaction.data.data).toEqual("7061796C6F6164");
52
+
53
+ transaction.refreshPayloadData();
54
+
55
+ expect(transaction.data.data).toEqual("updated-payload");
56
+ });
57
+
58
+ it("should get the id", () => {
59
+ const transaction = new Transfer(fixture.data);
60
+
61
+ expect(transaction.getId()).toEqual(fixture.data.id);
62
+ });
63
+
64
+ it("should sign a transaction", () => {
65
+ const privateKey = PrivateKey.fromPassphrase(fixtureGlobal.passphrase);
66
+ const transaction = new Transfer(fixture.data);
67
+
68
+ transaction.sign(privateKey);
69
+
70
+ expect(transaction.data.v).toEqual(fixture.data.v);
71
+ expect(transaction.data.r).toEqual(fixture.data.r);
72
+ expect(transaction.data.s).toEqual(fixture.data.s);
73
+ });
74
+
75
+ it("should recover the sender", () => {
76
+ const transaction = new Transfer(fixture.data);
77
+
78
+ transaction.recoverSender();
79
+
80
+ expect(transaction.data.senderPublicKey).toEqual(fixture.data.senderPublicKey);
81
+ expect(transaction.data.senderAddress).toEqual(fixture.data.senderAddress);
82
+ });
83
+
84
+ it("should verify the transaction", () => {
85
+ const transaction = new Transfer(fixture.data);
86
+
87
+ expect(transaction.verify()).toBe(true);
88
+ });
89
+
90
+ it("should convert the transaction to json", () => {
91
+ const transaction = new Transaction(fixture.data);
92
+
93
+ expect(transaction.toJson()).toEqual(
94
+ JSON.stringify({
95
+ gasPrice: fixture.data["gasPrice"],
96
+ network: fixture.data["network"],
97
+ id: fixture.data["id"],
98
+ gasLimit: fixture.data["gasLimit"],
99
+ nonce: fixture.data["nonce"],
100
+ senderPublicKey: fixture.data["senderPublicKey"],
101
+ recipientAddress: fixture.data["recipientAddress"],
102
+ value: fixture.data["value"],
103
+ data: "7061796C6F6164",
104
+ r: fixture.data["r"],
105
+ s: fixture.data["s"],
106
+ v: fixture.data["v"],
107
+ }),
108
+ );
109
+ });
110
+
111
+ it("should generate a hash for the transaction with signature", () => {
112
+ const transaction = new Transfer(fixture.data);
113
+
114
+ expect(transaction.hash()).toEqual(fixture.data.id);
115
+ });
116
+
117
+ it("should generate a hash for the transaction without signature", () => {
118
+ const transaction = new Transfer(fixture.data);
119
+
120
+ const hash = transaction.hash(true);
121
+
122
+ expect(typeof hash).toBe("string");
123
+ expect(hash).toHaveLength(64);
124
+ });
125
+
126
+ it("should serialize the transaction with signature", () => {
127
+ const transaction = new Transfer(fixture.data);
128
+
129
+ expect(transaction.serialize().toString("binary")).toBe(fixture.serialized);
130
+ });
131
+
132
+ it("should serialize the transaction without signature", () => {
133
+ const transaction = new Transfer(fixture.data);
134
+
135
+ const serialized = transaction.serialize(true).toString("binary");
136
+
137
+ expect(serialized).toHaveLength(88);
138
+
139
+ // We don't store serialized without the signature in the fixtures so we do a partial check
140
+ expect(fixture.serialized).toContain(serialized.substring(4));
141
+ });
142
+
143
+ it("should decode the payload", () => {
144
+ expect(() => new DecoderTransaction(fixtureVote.data)).toThrow("Method not implemented");
145
+ });
@@ -0,0 +1,55 @@
1
+ import { ArgumentDecoder } from "@/utils/Abi/ArgumentDecoder";
2
+
3
+ it('should decode string', () => {
4
+ const payload = '0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000D48656C6C6F2C20776F726C642100000000000000000000000000000000000000';
5
+ const expected = 'Hello, world!';
6
+
7
+ const decoder = new ArgumentDecoder(payload);
8
+
9
+ expect(decoder.decodeString()).toEqual(expected);
10
+ });
11
+
12
+ it('should decode address', () => {
13
+ const payload = '000000000000000000000000512F366D524157BcF734546eB29a6d687B762255';
14
+ const expected = '0x512F366D524157BcF734546eB29a6d687B762255';
15
+
16
+ const decoder = new ArgumentDecoder(payload);
17
+
18
+ expect(decoder.decodeAddress()).toEqual(expected);
19
+ });
20
+
21
+ it('should decode unsigned int', () => {
22
+ const payload = '000000000000000000000000000000000000000000000000016345785d8a0000';
23
+ const expected = '100000000000000000';
24
+
25
+ const decoder = new ArgumentDecoder(payload);
26
+
27
+ expect(decoder.decodeUnsignedInt()).toEqual(expected);
28
+ });
29
+
30
+ it('should decode signed int', () => {
31
+ const payload = '000000000000000000000000000000000000000000000000016345785d8a0000';
32
+ const expected = '100000000000000000';
33
+
34
+ const decoder = new ArgumentDecoder(payload);
35
+
36
+ expect(decoder.decodeSignedInt()).toEqual(expected);
37
+ });
38
+
39
+ it('should decode bool as true', () => {
40
+ const payload = '0000000000000000000000000000000000000000000000000000000000000001';
41
+ const expected = true;
42
+
43
+ const decoder = new ArgumentDecoder(payload);
44
+
45
+ expect(decoder.decodeBool()).toEqual(expected);
46
+ });
47
+
48
+ it('should decode bool as false', () => {
49
+ const payload = '0000000000000000000000000000000000000000000000000000000000000000';
50
+ const expected = false;
51
+
52
+ const decoder = new ArgumentDecoder(payload);
53
+
54
+ expect(decoder.decodeBool()).toEqual(expected);
55
+ });
@@ -0,0 +1,44 @@
1
+ import { AbiDecoder } from "@/utils/AbiDecoder";
2
+ import { ContractAbiType } from "@/enums/ContractAbiType";
3
+
4
+ it("should decode a vote function call", () => {
5
+ const decoder = new AbiDecoder();
6
+
7
+ const args = ["0x512F366D524157BcF734546eB29a6d687B762255"];
8
+ const data = "6dd7d8ea000000000000000000000000512f366d524157bcf734546eb29a6d687b762255";
9
+
10
+ const decodedData = decoder.decodeFunctionData(data);
11
+
12
+ expect(decodedData.args[0]).toBe(args[0]);
13
+ });
14
+
15
+ it("should decode an unvote function call", () => {
16
+ const decoder = new AbiDecoder();
17
+
18
+ const data = "3174b689";
19
+
20
+ const decodedData = decoder.decodeFunctionData(data);
21
+
22
+ expect(decodedData.functionName).toEqual("unvote");
23
+ expect(decodedData.args).toEqual([]);
24
+ });
25
+
26
+ it("should decode a multipayment function call", () => {
27
+ const decoder = new AbiDecoder(ContractAbiType.MULTIPAYMENT);
28
+
29
+ const args = [
30
+ ["0xb693449AdDa7EFc015D87944EAE8b7C37EB1690A", "0xb693449AdDa7EFc015D87944EAE8b7C37EB1690A"],
31
+ ["100000000", "200000000"],
32
+ ];
33
+ const data =
34
+ "084ce708000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000b693449adda7efc015d87944eae8b7c37eb1690a000000000000000000000000b693449adda7efc015d87944eae8b7c37eb1690a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000000000000000bebc200";
35
+
36
+ const decodedData = decoder.decodeFunctionData(data);
37
+
38
+ expect(decodedData.args[0]).toEqual(args[0]);
39
+ expect(decodedData.args[1].map((value: BigInt) => value.toString())).toEqual(args[1]);
40
+ });
41
+
42
+ it("should throw an error if custom abi is not passed", () => {
43
+ expect(() => new AbiDecoder(ContractAbiType.CUSTOM)).toThrow("Invalid contract type");
44
+ });
@@ -0,0 +1,30 @@
1
+ import { AbiEncoder } from "@/utils/AbiEncoder";
2
+ import { ContractAbiType } from "@/enums/ContractAbiType";
3
+
4
+ it("should encode a vote function call", () => {
5
+ const encoder = new AbiEncoder();
6
+
7
+ const functionName = "vote";
8
+ const args = ["0x512F366D524157BcF734546eB29a6d687B762255"];
9
+ const expectedEncodedData = "0x6dd7d8ea000000000000000000000000512f366d524157bcf734546eb29a6d687b762255";
10
+
11
+ const encodedData = encoder.encodeFunctionCall(functionName, args);
12
+
13
+ expect(encodedData).toBe(expectedEncodedData);
14
+ });
15
+
16
+ it("should encode a multipayment function call", () => {
17
+ const encoder = new AbiEncoder(ContractAbiType.MULTIPAYMENT);
18
+
19
+ const functionName = "pay";
20
+ const args = [
21
+ ["0xb693449AdDa7EFc015D87944EAE8b7C37EB1690A", "0xb693449AdDa7EFc015D87944EAE8b7C37EB1690A"],
22
+ ["100000000", "200000000"],
23
+ ];
24
+ const expectedEncodedData =
25
+ "0x084ce708000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000b693449adda7efc015d87944eae8b7c37eb1690a000000000000000000000000b693449adda7efc015d87944eae8b7c37eb1690a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000000000000000bebc200";
26
+
27
+ const encodedData = encoder.encodeFunctionCall(functionName, args);
28
+
29
+ expect(encodedData).toBe(expectedEncodedData);
30
+ });
@@ -0,0 +1,120 @@
1
+ import { Helpers } from "@/utils/Helpers";
2
+ import { InvalidUsernameException } from "@/exceptions/InvalidUsernameException";
3
+
4
+ describe("Helpers", () => {
5
+ describe("isValidUsername", () => {
6
+ it("should return true for valid usernames", () => {
7
+ const validUsernames = [
8
+ "username",
9
+ "user123",
10
+ "user_name",
11
+ "a",
12
+ "user_name_123",
13
+ "123456789012345678", // 18 chars
14
+ "abcdefghijklmnopqrst", // 20 chars
15
+ ];
16
+
17
+ validUsernames.forEach((username) => {
18
+ expect(Helpers.isValidUsername(username)).toBe(true);
19
+ });
20
+ });
21
+
22
+ it("should throw exception for usernames that are too short", () => {
23
+ expect(() => {
24
+ Helpers.isValidUsername("");
25
+ }).toThrow(InvalidUsernameException);
26
+
27
+ expect(() => {
28
+ Helpers.isValidUsername("");
29
+ }).toThrow("Username must be between 1 and 20 characters long. Got 0 characters.");
30
+ });
31
+
32
+ it("should throw exception for usernames that are too long", () => {
33
+ const tooLongUsername = "abcdefghijklmnopqrstu"; // 21 chars
34
+
35
+ expect(() => {
36
+ Helpers.isValidUsername(tooLongUsername);
37
+ }).toThrow(InvalidUsernameException);
38
+
39
+ expect(() => {
40
+ Helpers.isValidUsername(tooLongUsername);
41
+ }).toThrow("Username must be between 1 and 20 characters long. Got 21 characters.");
42
+ });
43
+
44
+ it("should throw exception for usernames with invalid characters", () => {
45
+ const invalidUsernames = [
46
+ "User", // uppercase
47
+ "user-name", // hyphen
48
+ "user.name", // period
49
+ "user name", // space
50
+ "user@name", // special char
51
+ "useñame", // non-ASCII
52
+ ];
53
+
54
+ invalidUsernames.forEach((username) => {
55
+ expect(() => {
56
+ Helpers.isValidUsername(username);
57
+ }).toThrow(InvalidUsernameException);
58
+
59
+ expect(() => {
60
+ Helpers.isValidUsername(username);
61
+ }).toThrow("Username can only contain lowercase letters, numbers and underscores.");
62
+ });
63
+ });
64
+
65
+ it("should throw exception for usernames starting with underscore", () => {
66
+ expect(() => {
67
+ Helpers.isValidUsername("_username");
68
+ }).toThrow(InvalidUsernameException);
69
+
70
+ expect(() => {
71
+ Helpers.isValidUsername("_username");
72
+ }).toThrow("Username cannot start or end with an underscore.");
73
+ });
74
+
75
+ it("should throw exception for usernames ending with underscore", () => {
76
+ expect(() => {
77
+ Helpers.isValidUsername("username_");
78
+ }).toThrow(InvalidUsernameException);
79
+
80
+ expect(() => {
81
+ Helpers.isValidUsername("username_");
82
+ }).toThrow("Username cannot start or end with an underscore.");
83
+ });
84
+
85
+ it("should throw exception for usernames with consecutive underscores", () => {
86
+ expect(() => {
87
+ Helpers.isValidUsername("user__name");
88
+ }).toThrow(InvalidUsernameException);
89
+
90
+ expect(() => {
91
+ Helpers.isValidUsername("user__name");
92
+ }).toThrow("Username cannot contain consecutive underscores.");
93
+ });
94
+ });
95
+
96
+ describe("removeLeadingHexZero", () => {
97
+ it("should remove the 0x prefix from hex strings", () => {
98
+ expect(Helpers.removeLeadingHexZero("0x1234")).toBe("1234");
99
+ expect(Helpers.removeLeadingHexZero("0x0123")).toBe("0123");
100
+ expect(Helpers.removeLeadingHexZero("0xabcdef")).toBe("abcdef");
101
+ });
102
+
103
+ it("should return the original string if no 0x prefix is present", () => {
104
+ expect(Helpers.removeLeadingHexZero("1234")).toBe("1234");
105
+ expect(Helpers.removeLeadingHexZero("0123")).toBe("0123");
106
+ expect(Helpers.removeLeadingHexZero("")).toBe("");
107
+ });
108
+
109
+ it("should only remove the prefix, not leading zeros", () => {
110
+ expect(Helpers.removeLeadingHexZero("0x0000")).toBe("0000");
111
+ expect(Helpers.removeLeadingHexZero("0x0001")).toBe("0001");
112
+ });
113
+
114
+ it("should handle edge cases", () => {
115
+ expect(Helpers.removeLeadingHexZero("0x")).toBe("");
116
+ expect(Helpers.removeLeadingHexZero("x0x1234")).toBe("x0x1234");
117
+ expect(Helpers.removeLeadingHexZero("0X1234")).toBe("0X1234"); // case sensitive
118
+ });
119
+ });
120
+ });
@@ -0,0 +1,104 @@
1
+ import { Message } from "@/utils/Message";
2
+
3
+ describe("Message", () => {
4
+ const getFixture = async (name: string) => {
5
+ return (await import(`@tests/fixtures/${name}.json`)).default;
6
+ };
7
+
8
+ describe("sign", () => {
9
+ it("should sign a valid message", async () => {
10
+ const fixture = await getFixture("message-sign");
11
+ const passphrase = (await getFixture("global")).passphrase;
12
+
13
+ const message = await Message.sign(fixture.message, passphrase);
14
+
15
+ expect(message.publicKey).toBe(fixture.publicKey);
16
+ expect(message.signature).toBe(fixture.signature);
17
+ expect(message.message).toBe(fixture.message);
18
+ });
19
+
20
+ it("should sign a message", async () => {
21
+ const message = await Message.sign("Hello World", "passphrase");
22
+
23
+ expect(message).toBeInstanceOf(Message);
24
+ });
25
+ });
26
+
27
+ describe("new", () => {
28
+ it("should create a message from an object", async () => {
29
+ const fixture = await getFixture("message-sign");
30
+
31
+ const message = Message.new(fixture);
32
+
33
+ expect(message.publicKey).toBe(fixture.publicKey);
34
+ expect(message.signature).toBe(fixture.signature);
35
+ expect(message.message).toBe(fixture.message);
36
+ });
37
+
38
+ it("should create a message from a string", async () => {
39
+ const fixture = await getFixture("message-sign");
40
+ const jsonString = JSON.stringify(fixture);
41
+
42
+ const message = Message.new(JSON.parse(jsonString));
43
+
44
+ expect(message.publicKey).toBe(fixture.publicKey);
45
+ expect(message.signature).toBe(fixture.signature);
46
+ expect(message.message).toBe(fixture.message);
47
+ });
48
+ });
49
+
50
+ describe("verify", () => {
51
+ it("should verify a signed message", async () => {
52
+ const message = await Message.sign("Hello World", "passphrase");
53
+
54
+ expect(message.verify()).toBe(true);
55
+ });
56
+
57
+ it("should verify a message", async () => {
58
+ const message = Message.new(await getFixture("message-sign"));
59
+
60
+ expect(message.verify()).toBe(true);
61
+ });
62
+
63
+ it("should not verify an invalid message", async () => {
64
+ const message = Message.new(await getFixture("message-sign"));
65
+ message.publicKey = "034151a3ec46b5670a682b0a63394f863587d1bc97483b1b6c70eb58e7f0aed192";
66
+
67
+ expect(message.verify()).toBe(false);
68
+ });
69
+ });
70
+
71
+ describe("serialization", () => {
72
+ it("should turn a message into an array", async () => {
73
+ const message = Message.new(await getFixture("message-sign"));
74
+ const array = message.toArray();
75
+
76
+ expect(Array.isArray(array)).toBe(true);
77
+ expect(array.length).toBe(3);
78
+ expect(array[0]).toBe(message.publicKey);
79
+ expect(array[1]).toBe(message.signature);
80
+ expect(array[2]).toBe(message.message);
81
+ });
82
+
83
+ it("should turn a message into JSON", async () => {
84
+ const message = Message.new(await getFixture("message-sign"));
85
+ const json = message.toJson();
86
+
87
+ expect(typeof json).toBe("object");
88
+ expect(json.publicKey).toBe(message.publicKey);
89
+ expect(json.signature).toBe(message.signature);
90
+ expect(json.message).toBe(message.message);
91
+ });
92
+
93
+ it("should turn a message into a string", async () => {
94
+ const message = Message.new(await getFixture("message-sign"));
95
+ const str = message.toString();
96
+
97
+ expect(typeof str).toBe("string");
98
+ const parsed = JSON.parse(str);
99
+ expect(parsed.publicKey).toBe(message.publicKey);
100
+ expect(parsed.signature).toBe(message.signature);
101
+ expect(parsed.message).toBe(message.message);
102
+ });
103
+ });
104
+ });
@@ -0,0 +1,69 @@
1
+ import { Network } from "@/configuration/Network";
2
+ import { Slot } from "@/utils/Slot";
3
+ import { Testnet } from "@/networks/Testnet";
4
+ import { jest } from "@jest/globals";
5
+
6
+ // Mock date implementation to have consistent tests
7
+ const mockDate = new Date("2023-01-01T12:00:00.000Z");
8
+
9
+ describe("Slot", () => {
10
+ beforeAll(() => {
11
+ jest.spyOn(Network, "get").mockReturnValue(new Testnet());
12
+ jest.spyOn(Date, "now").mockImplementation(() => mockDate.getTime());
13
+ });
14
+
15
+ afterAll(() => {
16
+ jest.restoreAllMocks();
17
+ });
18
+
19
+ describe("epoch", () => {
20
+ it("should return the epoch timestamp in seconds", () => {
21
+ // Testnet epoch is "2017-03-21T13:00:00.000Z"
22
+ const epochTimestamp = Math.floor(new Date("2017-03-21T13:00:00.000Z").getTime() / 1000);
23
+
24
+ expect(Slot.epoch()).toBe(epochTimestamp);
25
+ });
26
+ });
27
+
28
+ describe("time", () => {
29
+ it("should return the number of seconds that have passed since network epoch", () => {
30
+ // Calculate expected time: current timestamp minus epoch timestamp (in seconds)
31
+ const currentTimestamp = Math.floor(mockDate.getTime() / 1000);
32
+ const epochTimestamp = Math.floor(new Date("2017-03-21T13:00:00.000Z").getTime() / 1000);
33
+ const expectedTime = currentTimestamp - epochTimestamp;
34
+
35
+ expect(Slot.time()).toBe(expectedTime);
36
+ });
37
+
38
+ it("should update when time changes", () => {
39
+ const time1 = Slot.time();
40
+
41
+ // Change the mocked current time (+1 hour)
42
+ const newMockDate = new Date(mockDate);
43
+ newMockDate.setHours(newMockDate.getHours() + 1);
44
+ jest.spyOn(Date, "now").mockImplementation(() => newMockDate.getTime());
45
+
46
+ // Second call with new time
47
+ const time2 = Slot.time();
48
+
49
+ // Difference should be 3600 seconds (1 hour)
50
+ expect(time2 - time1).toBe(3600);
51
+
52
+ // Reset the mock
53
+ jest.spyOn(Date, "now").mockImplementation(() => mockDate.getTime());
54
+ });
55
+
56
+ it("should calculate correct time with Testnet configuration", () => {
57
+ expect(Network.get().chainId()).toBe(10000);
58
+
59
+ const actualEpochTime = Slot.epoch();
60
+ const actualSlotTime = Slot.time();
61
+
62
+ const currentTimestamp = Math.floor(mockDate.getTime() / 1000);
63
+ expect(actualSlotTime).toBe(currentTimestamp - actualEpochTime);
64
+
65
+ const testnetEpochTimestamp = Math.floor(new Date("2017-03-21T13:00:00.000Z").getTime() / 1000);
66
+ expect(actualEpochTime).toBe(testnetEpochTimestamp);
67
+ });
68
+ });
69
+ });