Home Reference Source

packages/oo7-substrate/src/utils.js

  1. function stringToSeed(s) {
  2. if (s.match(/^0x[0-9a-fA-F]{64}$/)) {
  3. return hexToBytes(s)
  4. }
  5. var data = new Uint8Array(32);
  6. data.fill(32);
  7. for (var i = 0; i < s.length; i++){
  8. data[i] = s.charCodeAt(i);
  9. }
  10. return data;
  11. }
  12. function stringToBytes(s) {
  13. var data = new Uint8Array(s.length);
  14. for (var i = 0; i < s.length; i++){
  15. data[i] = s.charCodeAt(i);
  16. }
  17. return data;
  18. }
  19. function hexToBytes(str) {
  20. if (!str) {
  21. return new Uint8Array();
  22. }
  23. var a = [];
  24. for (var i = str.startsWith('0x') ? 2 : 0, len = str.length; i < len; i += 2) {
  25. a.push(parseInt(str.substr(i, 2), 16));
  26. }
  27.  
  28. return new Uint8Array(a);
  29. }
  30. function bytesToHex(uint8arr) {
  31. if (!uint8arr) {
  32. return '';
  33. }
  34. var hexStr = '';
  35. for (var i = 0; i < uint8arr.length; i++) {
  36. var hex = (uint8arr[i] & 0xff).toString(16);
  37. hex = (hex.length === 1) ? '0' + hex : hex;
  38. hexStr += hex;
  39. }
  40.  
  41. return hexStr.toLowerCase();
  42. }
  43. function toLEHex(val, bytes) {
  44. let be = ('00'.repeat(bytes) + val.toString(16)).slice(-bytes * 2);
  45. var le = '';
  46. for (var i = 0; i < be.length; i += 2) {
  47. le = be.substr(i, 2) + le;
  48. }
  49. return le;
  50. }
  51. function leHexToNumber(le) {
  52. var be = '';
  53. for (var i = le.startsWith('0x') ? 2 : 0; i < le.length; i += 2) {
  54. be = le.substr(i, 2) + be;
  55. }
  56. return Number.parseInt(be, 16);
  57. }
  58.  
  59. function toLE(val, bytes) {
  60. let flip = false;
  61. if (val < 0) {
  62. val = -val - 1;
  63. flip = true;
  64. }
  65.  
  66. let r = new Uint8Array(bytes);
  67. for (var o = 0; o < bytes; ++o) {
  68. r[o] = val % 256;
  69. if (flip) {
  70. r[o] = ~r[o] & 0xff;
  71. }
  72. val /= 256;
  73. }
  74. return r;
  75. }
  76.  
  77. function leToNumber(le) {
  78. let r = 0;
  79. let a = 1;
  80. le.forEach(x => { r += x * a; a *= 256; });
  81. return r;
  82. }
  83.  
  84. function leToSigned(_le) {
  85. let le = _le.slice();
  86. let sign = 1;
  87. let r = 0;
  88. if ((le[le.length - 1] & 128) === 128) {
  89. // biggest bit of biggest byte is on - we're negative - invert and add one
  90. le = le.map(n => ~n & 0xff);
  91. r = 1;
  92. sign = -1;
  93. }
  94. let a = 1;
  95. le.forEach(x => { r += x * a; a *= 256; });
  96. return r * sign;
  97. }
  98.  
  99. function injectChunkUtils() {
  100. String.prototype.chunks = function(size) {
  101. var r = [];
  102. var count = this.length / size;
  103. for (var i = 0; i < count; ++i) {
  104. r.push(this.substr(i * size, size));
  105. }
  106. return r;
  107. }
  108.  
  109. String.prototype.mapChunks = function(sizes, f) {
  110. var r = [];
  111. var count = this.length / sizes.reduce((a, b) => a + b, 0);
  112. var offset = 0;
  113. for (var i = 0; i < count; ++i) {
  114. r.push(f(sizes.map(s => {
  115. let r = this.substr(offset, s);
  116. offset += s;
  117. return r;
  118. })));
  119. }
  120. return r;
  121. }
  122.  
  123. Uint8Array.prototype.mapChunks = function(sizes, f) {
  124. var r = [];
  125. var count = this.length / sizes.reduce((a, b) => a + b, 0);
  126. var offset = 0;
  127. for (var i = 0; i < count; ++i) {
  128. r.push(f(sizes.map(s => {
  129. offset += s;
  130. return this.slice(offset - s, offset);
  131. })));
  132. }
  133. return r;
  134. }
  135. }
  136.  
  137. function siPrefix(pot) {
  138. switch (pot) {
  139. case -24: return 'y'
  140. case -21: return 'z'
  141. case -18: return 'a'
  142. case -15: return 'f'
  143. case -12: return 'p'
  144. case -9: return 'n'
  145. case -6: return 'ยต'
  146. case -3: return 'm'
  147. case 0: return ''
  148. case 3: return 'k'
  149. case 6: return 'M'
  150. case 9: return 'G'
  151. case 12: return 'T'
  152. case 15: return 'P'
  153. case 18: return 'E'
  154. case 21: return 'Z'
  155. case 24: return 'Y'
  156. }
  157. }
  158.  
  159. module.exports = { stringToSeed, stringToBytes, hexToBytes, bytesToHex, toLEHex, leHexToNumber, toLE, leToNumber, leToSigned, injectChunkUtils, siPrefix }