primitives.spec.ts 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. // SPDX-License-Identifier: Apache-2.0
  2. import expect from 'expect';
  3. import { createConnection, deploy, aliceKeypair, daveKeypair, query, } from './index';
  4. import { ContractPromise } from '@polkadot/api-contract';
  5. import { ApiPromise } from '@polkadot/api';
  6. describe('Deploy primitives contract and test', () => {
  7. let conn: ApiPromise;
  8. before(async function () {
  9. conn = await createConnection();
  10. });
  11. after(async function () {
  12. await conn.disconnect();
  13. });
  14. it('primitives', async function () {
  15. this.timeout(100000);
  16. const alice = aliceKeypair();
  17. const dave = daveKeypair();
  18. let deployed_contract = await deploy(conn, alice, 'primitives.contract', BigInt(0));
  19. let contract = new ContractPromise(conn, deployed_contract.abi, deployed_contract.address);
  20. // TEST Basic enums
  21. // in ethereum, an enum is described as an uint8 so can't use the enum
  22. // names programmatically. 0 = add, 1 = sub, 2 = mul, 3 = div, 4 = mod, 5 = pow, 6 = shl, 7 = shr
  23. let res = await query(conn, alice, contract, "isMul", [2]);
  24. expect(res.output?.toJSON()).toEqual(true);
  25. res = await query(conn, alice, contract, "returnDiv");
  26. expect(res.output?.toJSON()).toEqual("div");
  27. // TEST uint and int types, and arithmetic/bitwise ops
  28. res = await query(conn, alice, contract, "opI64", [0, 1000, 4100]);
  29. expect(res.output?.toJSON()).toEqual(5100);
  30. res = await query(conn, alice, contract, "opI64", [1, 1000, 4100]);
  31. expect(res.output?.toJSON()).toEqual(-3100);
  32. res = await query(conn, alice, contract, "opI64", [2, 1000, 4100]);
  33. expect(res.output?.toJSON()).toEqual(4100000);
  34. res = await query(conn, alice, contract, "opI64", [3, 1000, 10]);
  35. expect(res.output?.toJSON()).toEqual(100);
  36. res = await query(conn, alice, contract, "opI64", [4, 1000, 99]);
  37. expect(res.output?.toJSON()).toEqual(10);
  38. res = await query(conn, alice, contract, "opI64", [6, - 1000, 8]);
  39. expect(res.output?.toJSON()).toEqual(-256000);
  40. res = await query(conn, alice, contract, "opI64", [7, - 1000, 8]);
  41. expect(res.output?.toJSON()).toEqual(-4);
  42. res = await query(conn, alice, contract, "opU64", [0, 1000, 4100]);
  43. expect(res.output?.toJSON()).toEqual(5100);
  44. res = await query(conn, alice, contract, "opU64", [1, 1000, 4100]);
  45. expect(res.output?.toString()).toEqual("18446744073709548516"); // (2^64)-18446744073709548516 = 3100
  46. res = await query(conn, alice, contract, "opU64", [2, 123456789, 123456789]);
  47. expect(res.output?.toString()).toEqual("15241578750190521");
  48. res = await query(conn, alice, contract, "opU64", [3, 123456789, 100]);
  49. expect(res.output?.toJSON()).toEqual(1234567);
  50. res = await query(conn, alice, contract, "opU64", [4, 123456789, 100]);
  51. expect(res.output?.toJSON()).toEqual(89);
  52. res = await query(conn, alice, contract, "opU64", [5, 3, 7]);
  53. expect(res.output?.toJSON()).toEqual(2187);
  54. res = await query(conn, alice, contract, "opI64", [6, 1000, 8]);
  55. expect(res.output?.toJSON()).toEqual(256000);
  56. res = await query(conn, alice, contract, "opI64", [7, 1000, 8]);
  57. expect(res.output?.toJSON()).toEqual(3);
  58. // // now for 256 bit operations
  59. res = await query(conn, alice, contract, "opI256", [0, 1000, 4100]);
  60. expect(BigInt(res.output?.toString() ?? "")).toEqual(5100n);
  61. res = await query(conn, alice, contract, "opI256", [1, 1000, 4100]);
  62. expect(BigInt(res.output?.toString() ?? "")).toEqual(-3100n);
  63. res = await query(conn, alice, contract, "opI256", [2, 1000, 4100]);
  64. expect(BigInt(res.output?.toString() ?? "")).toEqual(4100000n);
  65. res = await query(conn, alice, contract, "opI256", [3, 1000, 10]);
  66. expect(BigInt(res.output?.toString() ?? "")).toEqual(100n);
  67. res = await query(conn, alice, contract, "opI256", [4, 1000, 99]);
  68. expect(BigInt(res.output?.toString() ?? "")).toEqual(10n);
  69. res = await query(conn, alice, contract, "opI256", [6, - 10000000000000, 8]);
  70. expect(BigInt(res.output?.toString() ?? "")).toEqual(-2560000000000000n);
  71. res = await query(conn, alice, contract, "opI256", [7, - 10000000000000, 8]);
  72. expect(BigInt(res.output?.toString() ?? "")).toEqual(-39062500000n);
  73. res = await query(conn, alice, contract, "opU256", [0, 1000, 4100]);
  74. expect(BigInt(res.output?.toString() ?? "")).toEqual(5100n);
  75. res = await query(conn, alice, contract, "opU256", [1, 1000, 4100]);
  76. expect(res.output?.toString()).toEqual('115792089237316195423570985008687907853269984665640564039457584007913129636836'); // (2^64)-18446744073709548516 = 3100
  77. res = await query(conn, alice, contract, "opU256", [2, 123456789, 123456789]);
  78. expect(res.output?.toString()).toEqual('15241578750190521');
  79. res = await query(conn, alice, contract, "opU256", [3, 123456789, 100]);
  80. expect(BigInt(res.output?.toString() ?? "")).toEqual(1234567n);
  81. res = await query(conn, alice, contract, "opU256", [4, 123456789, 100]);
  82. expect(BigInt(res.output?.toString() ?? "")).toEqual(89n);
  83. res = await query(conn, alice, contract, "opU256", [5, 123456789, 9]);
  84. expect(res.output?.toString()).toEqual('6662462759719942007440037531362779472290810125440036903063319585255179509');
  85. res = await query(conn, alice, contract, "opI256", [6, 10000000000000, 8]);
  86. expect(BigInt(res.output?.toString() ?? "")).toEqual(2560000000000000n);
  87. res = await query(conn, alice, contract, "opI256", [7, 10000000000000, 8]);
  88. expect(BigInt(res.output?.toString() ?? "")).toEqual(39062500000n);
  89. // TEST bytesN
  90. res = await query(conn, alice, contract, "returnU86");
  91. expect(res.output?.toJSON()).toEqual('0x414243444546');
  92. // TEST bytes5
  93. res = await query(conn, alice, contract, "opU85Shift", [6, '0xdeadcafe59', 8]);
  94. expect(res.output?.toJSON()).toEqual('0xadcafe5900');
  95. res = await query(conn, alice, contract, "opU85Shift", [7, '0xdeadcafe59', 8]);
  96. expect(res.output?.toJSON()).toEqual('0x00deadcafe');
  97. res = await query(conn, alice, contract, "opU85", [8, '0xdeadcafe59', '0x0000000006']);
  98. expect(res.output?.toJSON()).toEqual('0xdeadcafe5f');
  99. res = await query(conn, alice, contract, "opU85", [9, '0xdeadcafe59', '0x00000000ff']);
  100. expect(res.output?.toJSON()).toEqual('0x0000000059');
  101. res = await query(conn, alice, contract, "opU85", [10, '0xdeadcafe59', '0x00000000ff']);
  102. expect(res.output?.toJSON()).toEqual('0xdeadcafea6');
  103. // TEST bytes14
  104. res = await query(conn, alice, contract, "opU814Shift", [6, '0xdeadcafe123456789abcdefbeef7', 9]);
  105. expect(res.output?.toJSON()).toEqual('0x5b95fc2468acf13579bdf7ddee00');
  106. res = await query(conn, alice, contract, "opU814Shift", [7, '0xdeadcafe123456789abcdefbeef7', 9]);
  107. expect(res.output?.toJSON()).toEqual('0x006f56e57f091a2b3c4d5e6f7df7');
  108. res = await query(conn, alice, contract, "opU814", [8, '0xdeadcafe123456789abcdefbeef7', '0x0000060000000000000000000000']);
  109. expect(res.output?.toJSON()).toEqual('0xdeadcefe123456789abcdefbeef7');
  110. res = await query(conn, alice, contract, "opU814", [9, '0xdeadcafe123456789abcdefbeef7', '0x000000000000000000ff00000000']);
  111. expect(res.output?.toJSON()).toEqual('0x000000000000000000bc00000000');
  112. res = await query(conn, alice, contract, "opU814", [10, '0xdeadcafe123456789abcdefbeef7', '0xff00000000000000000000000000']);
  113. expect(res.output?.toJSON()).toEqual('0x21adcafe123456789abcdefbeef7');
  114. // TEST address type.
  115. const default_account = '5GBWmgdFAMqm8ZgAHGobqDqX6tjLxJhv53ygjNtaaAn3sjeZ';
  116. res = await query(conn, alice, contract, "addressPassthrough", [default_account]);
  117. expect(res.output?.toJSON()).toEqual(default_account);
  118. res = await query(conn, alice, contract, "addressPassthrough", [dave.address]);
  119. expect(res.output?.toJSON()).toEqual(dave.address);
  120. res = await query(conn, alice, contract, "addressPassthrough", [alice.address]);
  121. expect(res.output?.toJSON()).toEqual(alice.address);
  122. });
  123. });