diff --git a/.gitignore b/.gitignore index 5791fc8..6a54e5a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,6 @@ node_modules coverage gh-pages -/lib/ # Visual Studio Code - https://code.visualstudio.com/ .settings/ diff --git a/lib/address/address.d.ts b/lib/address/address.d.ts new file mode 100644 index 0000000..6666c67 --- /dev/null +++ b/lib/address/address.d.ts @@ -0,0 +1,31 @@ +import { H160 } from "../value/H160"; +import { H256Value } from "../value/H256"; +export type AddressValue = Address | string; +/** + * The bech32 form of account id. The human readable part(HRP) is used to + * represent the network. For address, the HRP is "ccc" for mainnet or + * "tcc" for testnet. + * + * Refer to the spec for the details about Address. + * https://github.com/CodeChain-io/codechain/blob/master/spec/CodeChain-Address.md + */ +export declare class Address { + static fromPublic(publicKey: H256Value, options: { + networkId: string; + version?: number; + }): Address; + static fromAccountId(accountId: H160 | string, options: { + networkId: string; + version?: number; + }): Address; + static fromString(address: string): Address; + static check(address: any): boolean; + static ensure(address: AddressValue): Address; + static ensureAccount(address: Address | H160 | string): H160; + private static checkString; + readonly accountId: H160; + readonly value: string; + private constructor(); + toString(): string; + getAccountId(): H160; +} diff --git a/lib/address/address.js b/lib/address/address.js new file mode 100644 index 0000000..ab3c7b4 --- /dev/null +++ b/lib/address/address.js @@ -0,0 +1,109 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Address = void 0; +const buffer_1 = require("buffer"); +const _ = require("lodash"); +const hash_1 = require("../hash"); +const utility_1 = require("../utility"); +const H160_1 = require("../value/H160"); +const H256_1 = require("../value/H256"); +const bech32_1 = require("./bech32"); +/** + * The bech32 form of account id. The human readable part(HRP) is used to + * represent the network. For address, the HRP is "ccc" for mainnet or + * "tcc" for testnet. + * + * Refer to the spec for the details about Address. + * https://github.com/CodeChain-io/codechain/blob/master/spec/CodeChain-Address.md + */ +class Address { + static fromPublic(publicKey, options) { + if (!H256_1.H256.check(publicKey)) { + throw Error(`Invalid public key for creating Address: ${publicKey}`); + } + return Address.fromAccountId(getAccountIdFromPublic(H256_1.H256.ensure(publicKey).value), options); + } + static fromAccountId(accountId, options) { + const { networkId, version = 1 } = options; + if (!H160_1.H160.check(accountId)) { + throw Error(`Invalid accountId for creating Address: "${accountId}"`); + } + if (version !== 1) { + throw Error(`Unsupported version for Address: "${version}"`); + } + if (typeof networkId !== "string" || networkId.length !== 2) { + throw Error(`Unsupported networkId for Address: "${networkId}"`); + } + const words = (0, bech32_1.toWords)(buffer_1.Buffer.from(_.padStart(version.toString(16), 2, "0") + + H160_1.H160.ensure(accountId).value, "hex")); + return new Address(H160_1.H160.ensure(accountId), (0, bech32_1.encode)(networkId + "c", words)); + } + static fromString(address) { + if (typeof address !== "string") { + throw Error(`Expected Address string but found: "${address}"`); + } + else if (address.charAt(2) !== "c") { + throw Error(`Unknown prefix for Address: ${address}`); + } + const { words } = (0, bech32_1.decode)(address, address.substr(0, 3)); + const bytes = (0, bech32_1.fromWords)(words); + const version = bytes[0]; + if (version !== 1) { + throw Error(`Unsupported version for Address: ${version}`); + } + const accountId = (0, utility_1.toHex)(buffer_1.Buffer.from(bytes.slice(1))); + return new Address(new H160_1.H160(accountId), address); + } + static check(address) { + return address instanceof Address ? true : Address.checkString(address); + } + static ensure(address) { + if (address instanceof Address) { + return address; + } + else if (typeof address === "string") { + return Address.fromString(address); + } + else { + throw Error(`Expected either Address or string but found ${address}`); + } + } + static ensureAccount(address) { + if (address instanceof Address) { + // FIXME: verify network id + return address.getAccountId(); + } + else if (address instanceof H160_1.H160) { + return address; + } + else if (address.match(`^(0x)?[a-fA-F0-9]{40}$`)) { + return new H160_1.H160(address); + } + else { + return Address.fromString(address).getAccountId(); + } + } + static checkString(value) { + // FIXME: verify checksum + return /^.{2}c[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{40}$/.test(value); + } + constructor(accountId, address) { + this.accountId = accountId; + this.value = address; + } + toString() { + return this.value; + } + getAccountId() { + return this.accountId; + } +} +exports.Address = Address; +function getAccountIdFromPublic(publicKey) { + if (typeof publicKey !== "string") { + throw Error(`Unexpected parameter for getAccountIdFromPublic: ${publicKey}`); + } + // FIXME: Check 512-bit hexstring + return (0, hash_1.blake160)(publicKey); +} +//# sourceMappingURL=address.js.map \ No newline at end of file diff --git a/lib/address/address.js.map b/lib/address/address.js.map new file mode 100644 index 0000000..a060fd4 --- /dev/null +++ b/lib/address/address.js.map @@ -0,0 +1 @@ +{"version":3,"file":"address.js","sourceRoot":"","sources":["../../src/address/address.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/address/bech32.d.ts b/lib/address/bech32.d.ts new file mode 100644 index 0000000..0d1ba6c --- /dev/null +++ b/lib/address/bech32.d.ts @@ -0,0 +1,19 @@ +/** + * @hidden + */ +export declare function encode(prefix: any, words: any, LIMIT?: any): any; +/** + * @hidden + */ +export declare function decode(str: string, prefix: string, LIMIT?: number): { + prefix: string; + words: number[]; +}; +/** + * @hidden + */ +export declare function toWords(bytes: any): number[]; +/** + * @hidden + */ +export declare function fromWords(words: any): number[]; diff --git a/lib/address/bech32.js b/lib/address/bech32.js new file mode 100644 index 0000000..a6daf94 --- /dev/null +++ b/lib/address/bech32.js @@ -0,0 +1,182 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.fromWords = exports.toWords = exports.decode = exports.encode = void 0; +/** + * @hidden + */ +const ALPHABET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"; +/* tslint:disable:prefer-for-of */ +// pre-compute lookup table +/** + * @hidden + */ +const ALPHABET_MAP = {}; +for (let z = 0; z < ALPHABET.length; z++) { + const x = ALPHABET.charAt(z); + if (ALPHABET_MAP[x] !== undefined) { + throw new TypeError(x + " is ambiguous"); + } + ALPHABET_MAP[x] = z; +} +// FIXME: any +/** + * @hidden + */ +function polymodStep(pre) { + const b = pre >> 25; + return (((pre & 0x1ffffff) << 5) ^ + (-((b >> 0) & 1) & 0x3b6a57b2) ^ + (-((b >> 1) & 1) & 0x26508e6d) ^ + (-((b >> 2) & 1) & 0x1ea119fa) ^ + (-((b >> 3) & 1) & 0x3d4233dd) ^ + (-((b >> 4) & 1) & 0x2a1462b3)); +} +// FIXME: any +/** + * @hidden + */ +function prefixChk(prefix) { + let chk = 1; + for (let i = 0; i < prefix.length; ++i) { + const c = prefix.charCodeAt(i); + if (c < 33 || c > 126) { + throw new Error("Invalid prefix (" + prefix + ")"); + } + chk = polymodStep(chk) ^ (c >> 5); + } + chk = polymodStep(chk); + for (let i = 0; i < prefix.length; ++i) { + const v = prefix.charCodeAt(i); + chk = polymodStep(chk) ^ (v & 0x1f); + } + return chk; +} +// FIXME: any +/** + * @hidden + */ +function encode(prefix, words, LIMIT) { + LIMIT = LIMIT || 90; + if (prefix.length + 7 + words.length > LIMIT) { + throw new TypeError("Exceeds length limit"); + } + prefix = prefix.toLowerCase(); + // determine chk mod + let chk = prefixChk(prefix); + let result = prefix; + for (let i = 0; i < words.length; ++i) { + const x = words[i]; + if (x >> 5 !== 0) { + throw new Error("Non 5-bit word"); + } + chk = polymodStep(chk) ^ x; + result += ALPHABET.charAt(x); + } + for (let i = 0; i < 6; ++i) { + chk = polymodStep(chk); + } + chk ^= 1; + for (let i = 0; i < 6; ++i) { + const v = (chk >> ((5 - i) * 5)) & 0x1f; + result += ALPHABET.charAt(v); + } + return result; +} +exports.encode = encode; +// FIXME: any +/** + * @hidden + */ +function decode(str, prefix, LIMIT) { + LIMIT = LIMIT || 90; + if (str.length < 8) { + throw new TypeError(str + " too short"); + } + if (str.length > LIMIT) { + throw new TypeError("Exceeds length limit"); + } + // don't allow mixed case + const lowered = str.toLowerCase(); + const uppered = str.toUpperCase(); + if (str !== lowered && str !== uppered) { + throw new Error("Mixed-case string " + str); + } + str = lowered; + if (!str.startsWith(prefix)) { + throw new Error("Missing prefix for " + str); + } + const split = prefix.length; + const wordChars = str.slice(split); + if (wordChars.length < 6) { + throw new Error("Data too short"); + } + let chk = prefixChk(prefix); + const words = []; + for (let i = 0; i < wordChars.length; ++i) { + const c = wordChars.charAt(i); + const v = ALPHABET_MAP[c]; + if (v === undefined) { + throw new Error("Unknown character " + c); + } + chk = polymodStep(chk) ^ v; + // not in the checksum? + if (i + 6 >= wordChars.length) { + continue; + } + words.push(v); + } + if (chk !== 1) { + throw new Error("Invalid checksum for " + str); + } + return { prefix, words }; +} +exports.decode = decode; +// FIXME: any +/** + * @hidden + */ +function convert(data, inBits, outBits, pad) { + let value = 0; + let bits = 0; + const maxV = (1 << outBits) - 1; + const result = []; + for (let i = 0; i < data.length; ++i) { + value = (value << inBits) | data[i]; + bits += inBits; + while (bits >= outBits) { + bits -= outBits; + result.push((value >> bits) & maxV); + } + } + if (pad) { + if (bits > 0) { + result.push((value << (outBits - bits)) & maxV); + } + } + else { + if (bits >= inBits) { + throw new Error("Excess padding"); + } + if ((value << (outBits - bits)) & maxV) { + throw new Error("Non-zero padding"); + } + } + return result; +} +// FIXME: any +/** + * @hidden + */ +function toWords(bytes) { + return convert(bytes, 8, 5, true); +} +exports.toWords = toWords; +// FIXME: any +/** + * @hidden + */ +function fromWords(words) { + return convert(words, 5, 8, false); +} +exports.fromWords = fromWords; +//# sourceMappingURL=bech32.js.map \ No newline at end of file diff --git a/lib/address/bech32.js.map b/lib/address/bech32.js.map new file mode 100644 index 0000000..b388a8f --- /dev/null +++ b/lib/address/bech32.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bech32.js","sourceRoot":"","sources":["../../src/address/bech32.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/hash.d.ts b/lib/hash.d.ts new file mode 100644 index 0000000..1e779fa --- /dev/null +++ b/lib/hash.d.ts @@ -0,0 +1,46 @@ +/// +/** + * Gets data's 256 bit blake hash. + * @param data buffer or hexadecimal string + * @returns 32 byte hexadecimal string + */ +export declare const blake256: (data: Buffer | string) => string; +/** + * Gets data's 256 bit blake hash by using the key. + * @param data buffer or hexadecimal string + * @param key + * @returns 32 byte hexadecimal string + */ +export declare const blake256WithKey: (data: Buffer | string, key: Uint8Array) => string; +/** + * Gets data's 160 bit blake hash. + * @param data buffer or hexadecimal string + * @returns 20 byte hexadecimal string + */ +export declare const blake160: (data: Buffer | string) => string; +/** + * Gets data's 160 bit blake hash by using the key. + * @param data buffer or hexadecimal string + * @param key + * @returns 20 byte hexadecimal string + */ +export declare const blake160WithKey: (data: Buffer | string, key: Uint8Array) => string; +/** + * Gets data's 128 bit blake hash. + * @param data buffer or hexadecimal string + * @returns 16 byte hexadecimal string + */ +export declare const blake128: (data: Buffer | string) => string; +/** + * Gets data's 128 bit blake hash by using the key. + * @param data buffer or hexadecimal string + * @param key + * @returns 16 byte hexadecimal string + */ +export declare const blake128WithKey: (data: Buffer | string, key: Uint8Array) => string; +/** + * Gets data's 160 bit RIPEMD hash. + * @param data buffer or hexadecimal string + * @returns 20 byte hexadecimal string + */ +export declare const ripemd160: (data: Buffer | string) => string; diff --git a/lib/hash.js b/lib/hash.js new file mode 100644 index 0000000..2f063e1 --- /dev/null +++ b/lib/hash.js @@ -0,0 +1,109 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ripemd160 = exports.blake128WithKey = exports.blake128 = exports.blake160WithKey = exports.blake160 = exports.blake256WithKey = exports.blake256 = void 0; +const crypto_js_1 = require("crypto-js"); +const utility_1 = require("./utility"); +/** + * @hidden + */ +const blake = require("blakejs"); +/** + * Gets data's 256 bit blake hash. + * @param data buffer or hexadecimal string + * @returns 32 byte hexadecimal string + */ +const blake256 = (data) => { + if (!(data instanceof Buffer)) { + data = Buffer.from(data, "hex"); + } + const context = blake.blake2bInit(32, null); + blake.blake2bUpdate(context, data); + return (0, utility_1.toHex)(blake.blake2bFinal(context)); +}; +exports.blake256 = blake256; +/** + * Gets data's 256 bit blake hash by using the key. + * @param data buffer or hexadecimal string + * @param key + * @returns 32 byte hexadecimal string + */ +const blake256WithKey = (data, key) => { + if (!(data instanceof Buffer)) { + data = Buffer.from(data, "hex"); + } + const context = blake.blake2bInit(32, key); + blake.blake2bUpdate(context, data); + return (0, utility_1.toHex)(blake.blake2bFinal(context)); +}; +exports.blake256WithKey = blake256WithKey; +/** + * Gets data's 160 bit blake hash. + * @param data buffer or hexadecimal string + * @returns 20 byte hexadecimal string + */ +const blake160 = (data) => { + if (!(data instanceof Buffer)) { + data = Buffer.from(data, "hex"); + } + const context = blake.blake2bInit(20, null); + blake.blake2bUpdate(context, data); + return (0, utility_1.toHex)(blake.blake2bFinal(context)); +}; +exports.blake160 = blake160; +/** + * Gets data's 160 bit blake hash by using the key. + * @param data buffer or hexadecimal string + * @param key + * @returns 20 byte hexadecimal string + */ +const blake160WithKey = (data, key) => { + if (!(data instanceof Buffer)) { + data = Buffer.from(data, "hex"); + } + const context = blake.blake2bInit(20, key); + blake.blake2bUpdate(context, data); + return (0, utility_1.toHex)(blake.blake2bFinal(context)); +}; +exports.blake160WithKey = blake160WithKey; +/** + * Gets data's 128 bit blake hash. + * @param data buffer or hexadecimal string + * @returns 16 byte hexadecimal string + */ +const blake128 = (data) => { + if (!(data instanceof Buffer)) { + data = Buffer.from(data, "hex"); + } + const context = blake.blake2bInit(16, null); + blake.blake2bUpdate(context, data); + return (0, utility_1.toHex)(blake.blake2bFinal(context)); +}; +exports.blake128 = blake128; +/** + * Gets data's 128 bit blake hash by using the key. + * @param data buffer or hexadecimal string + * @param key + * @returns 16 byte hexadecimal string + */ +const blake128WithKey = (data, key) => { + if (!(data instanceof Buffer)) { + data = Buffer.from(data, "hex"); + } + const context = blake.blake2bInit(16, key); + blake.blake2bUpdate(context, data); + return (0, utility_1.toHex)(blake.blake2bFinal(context)); +}; +exports.blake128WithKey = blake128WithKey; +/** + * Gets data's 160 bit RIPEMD hash. + * @param data buffer or hexadecimal string + * @returns 20 byte hexadecimal string + */ +const ripemd160 = (data) => { + if (!(data instanceof Buffer)) { + data = Buffer.from(data, "hex"); + } + return (0, crypto_js_1.RIPEMD160)(crypto_js_1.enc.Hex.parse(data.toString("hex"))).toString(); +}; +exports.ripemd160 = ripemd160; +//# sourceMappingURL=hash.js.map \ No newline at end of file diff --git a/lib/hash.js.map b/lib/hash.js.map new file mode 100644 index 0000000..d6cd33c --- /dev/null +++ b/lib/hash.js.map @@ -0,0 +1 @@ +{"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/index.d.ts b/lib/index.d.ts new file mode 100644 index 0000000..dcdd1e0 --- /dev/null +++ b/lib/index.d.ts @@ -0,0 +1,13 @@ +export { Address, AddressValue } from "./address/address"; +export { H128, H128Value } from "./value/H128"; +export { H160, H160Value } from "./value/H160"; +export { H256, H256Value } from "./value/H256"; +export { H512, H512Value } from "./value/H512"; +export { U64, U64Value } from "./value/U64"; +export { U128, U128Value } from "./value/U128"; +export { U256, U256Value } from "./value/U256"; +export { blake128, blake128WithKey, blake160, blake160WithKey, blake256, blake256WithKey, ripemd160 } from "./hash"; +export { generatePrivateKey, getPublicFromPrivate } from "./key/key"; +export { exchange, x25519GetPublicFromPrivate, X25519Private, X25519Public } from "./key/keyExchange"; +export { Ed25519Signature, signEd25519, verifyEd25519 } from "./key/ed25519"; +export { toHex, toArray, getAccountIdFromPrivate, getAccountIdFromPublic, toLocaleString } from "./utility"; diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 0000000..b6b20a8 --- /dev/null +++ b/lib/index.js @@ -0,0 +1,43 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.toLocaleString = exports.getAccountIdFromPublic = exports.getAccountIdFromPrivate = exports.toArray = exports.toHex = exports.verifyEd25519 = exports.signEd25519 = exports.x25519GetPublicFromPrivate = exports.exchange = exports.getPublicFromPrivate = exports.generatePrivateKey = exports.ripemd160 = exports.blake256WithKey = exports.blake256 = exports.blake160WithKey = exports.blake160 = exports.blake128WithKey = exports.blake128 = exports.U256 = exports.U128 = exports.U64 = exports.H512 = exports.H256 = exports.H160 = exports.H128 = exports.Address = void 0; +var address_1 = require("./address/address"); +Object.defineProperty(exports, "Address", { enumerable: true, get: function () { return address_1.Address; } }); +var H128_1 = require("./value/H128"); +Object.defineProperty(exports, "H128", { enumerable: true, get: function () { return H128_1.H128; } }); +var H160_1 = require("./value/H160"); +Object.defineProperty(exports, "H160", { enumerable: true, get: function () { return H160_1.H160; } }); +var H256_1 = require("./value/H256"); +Object.defineProperty(exports, "H256", { enumerable: true, get: function () { return H256_1.H256; } }); +var H512_1 = require("./value/H512"); +Object.defineProperty(exports, "H512", { enumerable: true, get: function () { return H512_1.H512; } }); +var U64_1 = require("./value/U64"); +Object.defineProperty(exports, "U64", { enumerable: true, get: function () { return U64_1.U64; } }); +var U128_1 = require("./value/U128"); +Object.defineProperty(exports, "U128", { enumerable: true, get: function () { return U128_1.U128; } }); +var U256_1 = require("./value/U256"); +Object.defineProperty(exports, "U256", { enumerable: true, get: function () { return U256_1.U256; } }); +var hash_1 = require("./hash"); +Object.defineProperty(exports, "blake128", { enumerable: true, get: function () { return hash_1.blake128; } }); +Object.defineProperty(exports, "blake128WithKey", { enumerable: true, get: function () { return hash_1.blake128WithKey; } }); +Object.defineProperty(exports, "blake160", { enumerable: true, get: function () { return hash_1.blake160; } }); +Object.defineProperty(exports, "blake160WithKey", { enumerable: true, get: function () { return hash_1.blake160WithKey; } }); +Object.defineProperty(exports, "blake256", { enumerable: true, get: function () { return hash_1.blake256; } }); +Object.defineProperty(exports, "blake256WithKey", { enumerable: true, get: function () { return hash_1.blake256WithKey; } }); +Object.defineProperty(exports, "ripemd160", { enumerable: true, get: function () { return hash_1.ripemd160; } }); +var key_1 = require("./key/key"); +Object.defineProperty(exports, "generatePrivateKey", { enumerable: true, get: function () { return key_1.generatePrivateKey; } }); +Object.defineProperty(exports, "getPublicFromPrivate", { enumerable: true, get: function () { return key_1.getPublicFromPrivate; } }); +var keyExchange_1 = require("./key/keyExchange"); +Object.defineProperty(exports, "exchange", { enumerable: true, get: function () { return keyExchange_1.exchange; } }); +Object.defineProperty(exports, "x25519GetPublicFromPrivate", { enumerable: true, get: function () { return keyExchange_1.x25519GetPublicFromPrivate; } }); +var ed25519_1 = require("./key/ed25519"); +Object.defineProperty(exports, "signEd25519", { enumerable: true, get: function () { return ed25519_1.signEd25519; } }); +Object.defineProperty(exports, "verifyEd25519", { enumerable: true, get: function () { return ed25519_1.verifyEd25519; } }); +var utility_1 = require("./utility"); +Object.defineProperty(exports, "toHex", { enumerable: true, get: function () { return utility_1.toHex; } }); +Object.defineProperty(exports, "toArray", { enumerable: true, get: function () { return utility_1.toArray; } }); +Object.defineProperty(exports, "getAccountIdFromPrivate", { enumerable: true, get: function () { return utility_1.getAccountIdFromPrivate; } }); +Object.defineProperty(exports, "getAccountIdFromPublic", { enumerable: true, get: function () { return utility_1.getAccountIdFromPublic; } }); +Object.defineProperty(exports, "toLocaleString", { enumerable: true, get: function () { return utility_1.toLocaleString; } }); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/lib/index.js.map b/lib/index.js.map new file mode 100644 index 0000000..ad60dca --- /dev/null +++ b/lib/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,6CAA0D;AAAjD,kGAAA,OAAO,OAAA;AAEhB,qCAA+C;AAAtC,4FAAA,IAAI,OAAA;AACb,qCAA+C;AAAtC,4FAAA,IAAI,OAAA;AACb,qCAA+C;AAAtC,4FAAA,IAAI,OAAA;AACb,qCAA+C;AAAtC,4FAAA,IAAI,OAAA;AAEb,mCAA4C;AAAnC,0FAAA,GAAG,OAAA;AACZ,qCAA+C;AAAtC,4FAAA,IAAI,OAAA;AACb,qCAA+C;AAAtC,4FAAA,IAAI,OAAA;AAEb,+BAQgB;AAPZ,gGAAA,QAAQ,OAAA;AACR,uGAAA,eAAe,OAAA;AACf,gGAAA,QAAQ,OAAA;AACR,uGAAA,eAAe,OAAA;AACf,gGAAA,QAAQ,OAAA;AACR,uGAAA,eAAe,OAAA;AACf,iGAAA,SAAS,OAAA;AAGb,iCAAqE;AAA5D,yGAAA,kBAAkB,OAAA;AAAE,2GAAA,oBAAoB,OAAA;AACjD,iDAK2B;AAJvB,uGAAA,QAAQ,OAAA;AACR,yHAAA,0BAA0B,OAAA;AAI9B,yCAA6E;AAAlD,sGAAA,WAAW,OAAA;AAAE,wGAAA,aAAa,OAAA;AAErD,qCAMmB;AALf,gGAAA,KAAK,OAAA;AACL,kGAAA,OAAO,OAAA;AACP,kHAAA,uBAAuB,OAAA;AACvB,iHAAA,sBAAsB,OAAA;AACtB,yGAAA,cAAc,OAAA"} \ No newline at end of file diff --git a/lib/key/ed25519.d.ts b/lib/key/ed25519.d.ts new file mode 100644 index 0000000..292a8dd --- /dev/null +++ b/lib/key/ed25519.d.ts @@ -0,0 +1,16 @@ +export type Ed25519Signature = string; +/** + * Gets EdDSA(Ed25519) signature for message from private key. + * @param message 32 byte hexadecimal string + * @param priv 64 byte hexadecimal string of private key + * @returns 64 byte hexadecimal string of Ed25519 signature + */ +export declare const signEd25519: (message: string, priv: string) => Ed25519Signature; +/** + * Checks if the signature from signEd25519 is valid. + * @param message 32 byte hexadecimal string + * @param signature 64 byte hexadecimal string of Ed25519 signature + * @param pub 32 byte hexadecimal string of public key + * @returns if signature is valid, true. Else false. + */ +export declare const verifyEd25519: (message: string, signature: Ed25519Signature, pub: string) => boolean; diff --git a/lib/key/ed25519.js b/lib/key/ed25519.js new file mode 100644 index 0000000..273e91c --- /dev/null +++ b/lib/key/ed25519.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.verifyEd25519 = exports.signEd25519 = void 0; +const nacl = require("tweetnacl"); +const utility_1 = require("../utility"); +/** + * Gets EdDSA(Ed25519) signature for message from private key. + * @param message 32 byte hexadecimal string + * @param priv 64 byte hexadecimal string of private key + * @returns 64 byte hexadecimal string of Ed25519 signature + */ +const signEd25519 = (message, priv) => { + return (0, utility_1.toHex)(Buffer.from(nacl.sign.detached((0, utility_1.toArray)(message), (0, utility_1.toArray)(priv)))); +}; +exports.signEd25519 = signEd25519; +/** + * Checks if the signature from signEd25519 is valid. + * @param message 32 byte hexadecimal string + * @param signature 64 byte hexadecimal string of Ed25519 signature + * @param pub 32 byte hexadecimal string of public key + * @returns if signature is valid, true. Else false. + */ +const verifyEd25519 = (message, signature, pub) => { + return nacl.sign.detached.verify((0, utility_1.toArray)(message), (0, utility_1.toArray)(signature), (0, utility_1.toArray)(pub)); +}; +exports.verifyEd25519 = verifyEd25519; +//# sourceMappingURL=ed25519.js.map \ No newline at end of file diff --git a/lib/key/ed25519.js.map b/lib/key/ed25519.js.map new file mode 100644 index 0000000..dff0e87 --- /dev/null +++ b/lib/key/ed25519.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ed25519.js","sourceRoot":"","sources":["../../src/key/ed25519.ts"],"names":[],"mappings":";;;AACA,kCAAmC;AACnC,wCAA4C;AAI5C;;;;;GAKG;AACI,MAAM,WAAW,GAAG,CACvB,OAAe,EACf,IAAY,EACI,EAAE;IAClB,OAAO,IAAA,eAAK,EACR,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAA,iBAAO,EAAC,OAAO,CAAC,EAAE,IAAA,iBAAO,EAAC,IAAI,CAAC,CAAC,CAAC,CACnE,CAAC;AACN,CAAC,CAAC;AAPW,QAAA,WAAW,eAOtB;AAEF;;;;;;GAMG;AACI,MAAM,aAAa,GAAG,CACzB,OAAe,EACf,SAA2B,EAC3B,GAAW,EACJ,EAAE;IACT,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAC5B,IAAA,iBAAO,EAAC,OAAO,CAAC,EAChB,IAAA,iBAAO,EAAC,SAAS,CAAC,EAClB,IAAA,iBAAO,EAAC,GAAG,CAAC,CACf,CAAC;AACN,CAAC,CAAC;AAVW,QAAA,aAAa,iBAUxB"} \ No newline at end of file diff --git a/lib/key/key.d.ts b/lib/key/key.d.ts new file mode 100644 index 0000000..21eba99 --- /dev/null +++ b/lib/key/key.d.ts @@ -0,0 +1,11 @@ +/** + * Generates a private key. + * @returns 64 byte hexadecimal string of private key + */ +export declare const generatePrivateKey: () => string; +/** + * Gets public key from private key. + * @param priv 64 byte hexadecimal string of private key + * @returns 32 byte hexadecimal string of public key + */ +export declare const getPublicFromPrivate: (priv: string) => string; diff --git a/lib/key/key.js b/lib/key/key.js new file mode 100644 index 0000000..6746a74 --- /dev/null +++ b/lib/key/key.js @@ -0,0 +1,23 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getPublicFromPrivate = exports.generatePrivateKey = void 0; +const nacl = require("tweetnacl"); +const utility_1 = require("../utility"); +/** + * Generates a private key. + * @returns 64 byte hexadecimal string of private key + */ +const generatePrivateKey = () => { + return (0, utility_1.toHex)(Buffer.from(nacl.sign.keyPair().secretKey)); +}; +exports.generatePrivateKey = generatePrivateKey; +/** + * Gets public key from private key. + * @param priv 64 byte hexadecimal string of private key + * @returns 32 byte hexadecimal string of public key + */ +const getPublicFromPrivate = (priv) => { + return (0, utility_1.toHex)(Buffer.from(nacl.sign.keyPair.fromSecretKey((0, utility_1.toArray)(priv)).publicKey)); +}; +exports.getPublicFromPrivate = getPublicFromPrivate; +//# sourceMappingURL=key.js.map \ No newline at end of file diff --git a/lib/key/key.js.map b/lib/key/key.js.map new file mode 100644 index 0000000..d9374a2 --- /dev/null +++ b/lib/key/key.js.map @@ -0,0 +1 @@ +{"version":3,"file":"key.js","sourceRoot":"","sources":["../../src/key/key.ts"],"names":[],"mappings":";;;AACA,kCAAmC;AACnC,wCAA4C;AAE5C;;;GAGG;AACI,MAAM,kBAAkB,GAAG,GAAW,EAAE;IAC3C,OAAO,IAAA,eAAK,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC;AAFW,QAAA,kBAAkB,sBAE7B;AAEF;;;;GAIG;AACI,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAU,EAAE;IACzD,OAAO,IAAA,eAAK,EACR,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAA,iBAAO,EAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CACxE,CAAC;AACN,CAAC,CAAC;AAJW,QAAA,oBAAoB,wBAI/B"} \ No newline at end of file diff --git a/lib/key/keyExchange.d.ts b/lib/key/keyExchange.d.ts new file mode 100644 index 0000000..5d48e14 --- /dev/null +++ b/lib/key/keyExchange.d.ts @@ -0,0 +1,15 @@ +export type X25519Public = string; +export type X25519Private = string; +/** + * Gets an ECDH session key for encryption and decryption between two parties + * @param otherPublic 32 byte hexadecimal string of the other side public key + * @param myPrivate 32 byte hexadecimal string of my side private key + * @returns 32 byte hexadecimal string of the shared secret + */ +export declare const exchange: (otherPublic: X25519Public, myPrivate: X25519Private) => string; +/** + * Gets the X25519 public key(on Curve25519) for a private key + * @param x25519Private 32 byte hexadecimal string of a secret key + * @returns 32 byte hexadecimal string of the public key + */ +export declare const x25519GetPublicFromPrivate: (x25519Private: string) => string; diff --git a/lib/key/keyExchange.js b/lib/key/keyExchange.js new file mode 100644 index 0000000..03098c9 --- /dev/null +++ b/lib/key/keyExchange.js @@ -0,0 +1,33 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.x25519GetPublicFromPrivate = exports.exchange = void 0; +const utility_1 = require("../utility"); +/** + * @hidden + */ +const nacl = require("tweetnacl"); +/** + * Gets an ECDH session key for encryption and decryption between two parties + * @param otherPublic 32 byte hexadecimal string of the other side public key + * @param myPrivate 32 byte hexadecimal string of my side private key + * @returns 32 byte hexadecimal string of the shared secret + */ +const exchange = (otherPublic, myPrivate) => { + const groupElement = (0, utility_1.toArray)(otherPublic); + const scalar = (0, utility_1.toArray)(myPrivate); + const sharedSecret = nacl.scalarMult(scalar, groupElement); + return (0, utility_1.toHex)(sharedSecret); +}; +exports.exchange = exchange; +/** + * Gets the X25519 public key(on Curve25519) for a private key + * @param x25519Private 32 byte hexadecimal string of a secret key + * @returns 32 byte hexadecimal string of the public key + */ +const x25519GetPublicFromPrivate = (x25519Private) => { + const scalar = (0, utility_1.toArray)(x25519Private); + const x25519Public = nacl.scalarMult.base(scalar); + return (0, utility_1.toHex)(x25519Public); +}; +exports.x25519GetPublicFromPrivate = x25519GetPublicFromPrivate; +//# sourceMappingURL=keyExchange.js.map \ No newline at end of file diff --git a/lib/key/keyExchange.js.map b/lib/key/keyExchange.js.map new file mode 100644 index 0000000..3fd9335 --- /dev/null +++ b/lib/key/keyExchange.js.map @@ -0,0 +1 @@ +{"version":3,"file":"keyExchange.js","sourceRoot":"","sources":["../../src/key/keyExchange.ts"],"names":[],"mappings":";;;AAAA,wCAA4C;AAE5C;;GAEG;AACH,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAKlC;;;;;GAKG;AACI,MAAM,QAAQ,GAAG,CACpB,WAAyB,EACzB,SAAwB,EAClB,EAAE;IACR,MAAM,YAAY,GAAG,IAAA,iBAAO,EAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAA,iBAAO,EAAC,SAAS,CAAC,CAAC;IAClC,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC3D,OAAO,IAAA,eAAK,EAAC,YAAY,CAAC,CAAC;AAC/B,CAAC,CAAC;AARW,QAAA,QAAQ,YAQnB;AAEF;;;;GAIG;AACI,MAAM,0BAA0B,GAAG,CAAC,aAAqB,EAAU,EAAE;IACxE,MAAM,MAAM,GAAG,IAAA,iBAAO,EAAC,aAAa,CAAC,CAAC;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,OAAO,IAAA,eAAK,EAAC,YAAY,CAAC,CAAC;AAC/B,CAAC,CAAC;AAJW,QAAA,0BAA0B,8BAIrC"} \ No newline at end of file diff --git a/lib/utility.d.ts b/lib/utility.d.ts new file mode 100644 index 0000000..b54bf68 --- /dev/null +++ b/lib/utility.d.ts @@ -0,0 +1,35 @@ +/// +import BigNumber from "bignumber.js"; +/** + * Converts buffer to hexadecimal string. + * @param buffer arbritrary length of data + * @returns hexadecimal string + */ +export declare const toHex: (buffer: Buffer) => string; +/** + * Converts hexadecimal string to Uint8Array. + * @param string arbritrary length of data + * @returns Uint8Array + */ +export declare const toArray: (hex: string) => Uint8Array; +/** + * Gets account id from private key. + * @param priv 32 byte hexadecimal string of private key + * @returns 20 byte hexadecimal string of account id + */ +export declare const getAccountIdFromPrivate: (priv: string) => string; +/** + * Gets account id from the given public key. + * @param publicKey 64 byte hexadecimal string of uncompressed public key + * @returns 20 byte hexadecimal string of account id + */ +export declare const getAccountIdFromPublic: (publicKey: string) => string; +/** + * Converts BigNumber to formatted number string + * Default decimalSeparator is point: "." + * Default groupSeparator is comma; "," + * Default groupSize is 3 + * @param num BigNumber object + * @returns formatted number string + */ +export declare const toLocaleString: (num: BigNumber) => string; diff --git a/lib/utility.js b/lib/utility.js new file mode 100644 index 0000000..8055107 --- /dev/null +++ b/lib/utility.js @@ -0,0 +1,61 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.toLocaleString = exports.getAccountIdFromPublic = exports.getAccountIdFromPrivate = exports.toArray = exports.toHex = void 0; +const hash_1 = require("./hash"); +const key_1 = require("./key/key"); +/** + * @hidden + */ +const toHexByte = (byte) => byte < 0x10 ? `0${byte.toString(16)}` : byte.toString(16); +/** + * Converts buffer to hexadecimal string. + * @param buffer arbritrary length of data + * @returns hexadecimal string + */ +const toHex = (buffer) => { + return Array.from(buffer) + .map(toHexByte) + .join(""); +}; +exports.toHex = toHex; +/** + * Converts hexadecimal string to Uint8Array. + * @param string arbritrary length of data + * @returns Uint8Array + */ +const toArray = (hex) => { + return Uint8Array.from(Buffer.from(hex, "hex")); +}; +exports.toArray = toArray; +/** + * Gets account id from private key. + * @param priv 32 byte hexadecimal string of private key + * @returns 20 byte hexadecimal string of account id + */ +const getAccountIdFromPrivate = (priv) => { + const publicKey = (0, key_1.getPublicFromPrivate)(priv); + return (0, exports.getAccountIdFromPublic)(publicKey); +}; +exports.getAccountIdFromPrivate = getAccountIdFromPrivate; +/** + * Gets account id from the given public key. + * @param publicKey 64 byte hexadecimal string of uncompressed public key + * @returns 20 byte hexadecimal string of account id + */ +const getAccountIdFromPublic = (publicKey) => { + return (0, hash_1.blake160)(publicKey); +}; +exports.getAccountIdFromPublic = getAccountIdFromPublic; +/** + * Converts BigNumber to formatted number string + * Default decimalSeparator is point: "." + * Default groupSeparator is comma; "," + * Default groupSize is 3 + * @param num BigNumber object + * @returns formatted number string + */ +const toLocaleString = (num) => { + return num.toFormat(); +}; +exports.toLocaleString = toLocaleString; +//# sourceMappingURL=utility.js.map \ No newline at end of file diff --git a/lib/utility.js.map b/lib/utility.js.map new file mode 100644 index 0000000..d1b543c --- /dev/null +++ b/lib/utility.js.map @@ -0,0 +1 @@ +{"version":3,"file":"utility.js","sourceRoot":"","sources":["../src/utility.ts"],"names":[],"mappings":";;;AACA,iCAAkC;AAClC,mCAAiD;AAEjD;;GAEG;AACH,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CAC/B,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAE9D;;;;GAIG;AACI,MAAM,KAAK,GAAG,CAAC,MAAc,EAAU,EAAE;IAC5C,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;SACpB,GAAG,CAAC,SAAS,CAAC;SACd,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC,CAAC;AAJW,QAAA,KAAK,SAIhB;AAEF;;;;GAIG;AACI,MAAM,OAAO,GAAG,CAAC,GAAW,EAAc,EAAE;IAC/C,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC;AAFW,QAAA,OAAO,WAElB;AAEF;;;;GAIG;AACI,MAAM,uBAAuB,GAAG,CAAC,IAAY,EAAU,EAAE;IAC5D,MAAM,SAAS,GAAG,IAAA,0BAAoB,EAAC,IAAI,CAAC,CAAC;IAC7C,OAAO,IAAA,8BAAsB,EAAC,SAAS,CAAC,CAAC;AAC7C,CAAC,CAAC;AAHW,QAAA,uBAAuB,2BAGlC;AAEF;;;;GAIG;AACI,MAAM,sBAAsB,GAAG,CAAC,SAAiB,EAAU,EAAE;IAChE,OAAO,IAAA,eAAQ,EAAC,SAAS,CAAC,CAAC;AAC/B,CAAC,CAAC;AAFW,QAAA,sBAAsB,0BAEjC;AAEF;;;;;;;GAOG;AACI,MAAM,cAAc,GAAG,CAAC,GAAc,EAAU,EAAE;IACrD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AAC1B,CAAC,CAAC;AAFW,QAAA,cAAc,kBAEzB"} \ No newline at end of file diff --git a/lib/value/H128.d.ts b/lib/value/H128.d.ts new file mode 100644 index 0000000..a0693f2 --- /dev/null +++ b/lib/value/H128.d.ts @@ -0,0 +1,19 @@ +/// +export type H128Value = H128 | string; +/** + * Handles 128-bit data. + */ +export declare class H128 { + static fromBytes(buffer: Buffer): H128; + static zero(): H128; + static check(param: any): boolean; + static ensure(param: H128Value): H128; + private static checkString; + value: string; + constructor(value: string); + toEncodeObject(): string; + rlpBytes(): Buffer; + isEqualTo(rhs: H128): boolean; + toString(): string; + toJSON(): string; +} diff --git a/lib/value/H128.js b/lib/value/H128.js new file mode 100644 index 0000000..9421868 --- /dev/null +++ b/lib/value/H128.js @@ -0,0 +1,61 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.H128 = void 0; +/** + * @hidden + */ +const RLP = require("rlp"); +/** + * Handles 128-bit data. + */ +class H128 { + static fromBytes(buffer) { + const bytes = Array.from(buffer.values()); + const length = bytes.shift() - 0x80; + if (length !== 16 || bytes.length !== length) { + throw Error(`Invalid RLP for H128: ${bytes}`); + } + return new H128(bytes + .map(byte => byte < 0x10 + ? `0${byte.toString(16)}` + : byte.toString(16)) + .join("")); + } + static zero() { + return new H128("00000000000000000000000000000000"); + } + static check(param) { + return param instanceof H128 ? true : H128.checkString(param); + } + static ensure(param) { + return param instanceof H128 ? param : new H128(param); + } + static checkString(value) { + return /^(0x)?[0-9a-fA-F]{32}$/.test(value); + } + constructor(value) { + if (!H128.checkString(value)) { + throw Error(`Expected 16 byte hexstring for creating H128 but found "${value}"`); + } + this.value = value.startsWith("0x") + ? value.slice(2).toLowerCase() + : value.toLowerCase(); + } + toEncodeObject() { + return `0x${this.value}`; + } + rlpBytes() { + return RLP.encode(this.toEncodeObject()); + } + isEqualTo(rhs) { + return this.value === rhs.value; + } + toString() { + return this.value; + } + toJSON() { + return `0x${this.value}`; + } +} +exports.H128 = H128; +//# sourceMappingURL=H128.js.map \ No newline at end of file diff --git a/lib/value/H128.js.map b/lib/value/H128.js.map new file mode 100644 index 0000000..12ddef9 --- /dev/null +++ b/lib/value/H128.js.map @@ -0,0 +1 @@ +{"version":3,"file":"H128.js","sourceRoot":"","sources":["../../src/value/H128.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;AAI3B;;GAEG;AACH,MAAa,IAAI;IACN,MAAM,CAAC,SAAS,CAAC,MAAc;QAClC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAG,GAAG,IAAI,CAAC;QACrC,IAAI,MAAM,KAAK,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE;YAC1C,MAAM,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;SACjD;QACD,OAAO,IAAI,IAAI,CACX,KAAK;aACA,GAAG,CACA,IAAI,CAAC,EAAE,CACH,IAAI,GAAG,IAAI;YACP,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;YACzB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAC9B;aACA,IAAI,CAAC,EAAE,CAAC,CAChB,CAAC;IACN,CAAC;IAEM,MAAM,CAAC,IAAI;QACd,OAAO,IAAI,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACxD,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,KAAU;QAC1B,OAAO,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,KAAgB;QACjC,OAAO,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,KAAa;QACpC,OAAO,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAID,YAAY,KAAa;QACrB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;YAC1B,MAAM,KAAK,CACP,2DAA2D,KAAK,GAAG,CACtE,CAAC;SACL;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;YAC/B,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;YAC9B,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC;IAEM,cAAc;QACjB,OAAO,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAEM,QAAQ;QACX,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IAC7C,CAAC;IAEM,SAAS,CAAC,GAAS;QACtB,OAAO,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC;IACpC,CAAC;IAEM,QAAQ;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAEM,MAAM;QACT,OAAO,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACJ;AAnED,oBAmEC"} \ No newline at end of file diff --git a/lib/value/H160.d.ts b/lib/value/H160.d.ts new file mode 100644 index 0000000..2efc3e5 --- /dev/null +++ b/lib/value/H160.d.ts @@ -0,0 +1,19 @@ +/// +export type H160Value = H160 | string; +/** + * Handles 160-bit data. Used to express account addresses. + */ +export declare class H160 { + static fromBytes(buffer: Buffer): H160; + static zero(): H160; + static check(param: any): boolean; + static ensure(param: H160Value): H160; + private static checkString; + value: string; + constructor(value: string); + toEncodeObject(): string; + rlpBytes(): Buffer; + isEqualTo(rhs: H160): boolean; + toString(): string; + toJSON(): string; +} diff --git a/lib/value/H160.js b/lib/value/H160.js new file mode 100644 index 0000000..3134a70 --- /dev/null +++ b/lib/value/H160.js @@ -0,0 +1,61 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.H160 = void 0; +/** + * @hidden + */ +const RLP = require("rlp"); +/** + * Handles 160-bit data. Used to express account addresses. + */ +class H160 { + static fromBytes(buffer) { + const bytes = Array.from(buffer.values()); + const length = bytes.shift() - 0x80; + if (length !== 20 || bytes.length !== length) { + throw Error(`Invalid RLP for H160: ${bytes}`); + } + return new H160(bytes + .map(byte => byte < 0x10 + ? `0${byte.toString(16)}` + : byte.toString(16)) + .join("")); + } + static zero() { + return new H160("0000000000000000000000000000000000000000"); + } + static check(param) { + return param instanceof H160 ? true : H160.checkString(param); + } + static ensure(param) { + return param instanceof H160 ? param : new H160(param); + } + static checkString(value) { + return /^(0x)?[0-9a-fA-F]{40}$/.test(value); + } + constructor(value) { + if (!H160.checkString(value)) { + throw Error(`Expected 20 byte hexstring for creating H160 but found "${value}"`); + } + this.value = value.startsWith("0x") + ? value.slice(2).toLowerCase() + : value.toLowerCase(); + } + toEncodeObject() { + return `0x${this.value}`; + } + rlpBytes() { + return RLP.encode(this.toEncodeObject()); + } + isEqualTo(rhs) { + return this.value === rhs.value; + } + toString() { + return this.value; + } + toJSON() { + return `0x${this.value}`; + } +} +exports.H160 = H160; +//# sourceMappingURL=H160.js.map \ No newline at end of file diff --git a/lib/value/H160.js.map b/lib/value/H160.js.map new file mode 100644 index 0000000..ca12ecc --- /dev/null +++ b/lib/value/H160.js.map @@ -0,0 +1 @@ +{"version":3,"file":"H160.js","sourceRoot":"","sources":["../../src/value/H160.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;AAI3B;;GAEG;AACH,MAAa,IAAI;IACN,MAAM,CAAC,SAAS,CAAC,MAAc;QAClC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAG,GAAG,IAAI,CAAC;QACrC,IAAI,MAAM,KAAK,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE;YAC1C,MAAM,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;SACjD;QACD,OAAO,IAAI,IAAI,CACX,KAAK;aACA,GAAG,CACA,IAAI,CAAC,EAAE,CACH,IAAI,GAAG,IAAI;YACP,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;YACzB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAC9B;aACA,IAAI,CAAC,EAAE,CAAC,CAChB,CAAC;IACN,CAAC;IAEM,MAAM,CAAC,IAAI;QACd,OAAO,IAAI,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAChE,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,KAAU;QAC1B,OAAO,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,KAAgB;QACjC,OAAO,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,KAAa;QACpC,OAAO,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAID,YAAY,KAAa;QACrB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;YAC1B,MAAM,KAAK,CACP,2DAA2D,KAAK,GAAG,CACtE,CAAC;SACL;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;YAC/B,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;YAC9B,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC;IAEM,cAAc;QACjB,OAAO,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAEM,QAAQ;QACX,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IAC7C,CAAC;IAEM,SAAS,CAAC,GAAS;QACtB,OAAO,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC;IACpC,CAAC;IAEM,QAAQ;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAEM,MAAM;QACT,OAAO,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACJ;AAnED,oBAmEC"} \ No newline at end of file diff --git a/lib/value/H256.d.ts b/lib/value/H256.d.ts new file mode 100644 index 0000000..44bbae5 --- /dev/null +++ b/lib/value/H256.d.ts @@ -0,0 +1,19 @@ +/// +export type H256Value = H256 | string; +/** + * Handles 256-bit data. Used to express block hash, parcel hash, transaction hash, merkle root, etc. + */ +export declare class H256 { + static fromBytes(buffer: Buffer): H256; + static zero(): H256; + static check(param: any): boolean; + static ensure(param: H256Value): H256; + private static checkString; + value: string; + constructor(value: string); + toEncodeObject(): string; + rlpBytes(): Buffer; + isEqualTo(rhs: H256): boolean; + toString(): string; + toJSON(): string; +} diff --git a/lib/value/H256.js b/lib/value/H256.js new file mode 100644 index 0000000..aa8fcd0 --- /dev/null +++ b/lib/value/H256.js @@ -0,0 +1,61 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.H256 = void 0; +/** + * @hidden + */ +const RLP = require("rlp"); +/** + * Handles 256-bit data. Used to express block hash, parcel hash, transaction hash, merkle root, etc. + */ +class H256 { + static fromBytes(buffer) { + const bytes = Array.from(buffer.values()); + const length = bytes.shift() - 0x80; + if (length !== 32 || bytes.length !== length) { + throw Error(`Invalid RLP for H256: ${bytes}`); + } + return new H256(bytes + .map(byte => byte < 0x10 + ? `0${byte.toString(16)}` + : byte.toString(16)) + .join("")); + } + static zero() { + return new H256("0000000000000000000000000000000000000000000000000000000000000000"); + } + static check(param) { + return param instanceof H256 ? true : H256.checkString(param); + } + static ensure(param) { + return param instanceof H256 ? param : new H256(param); + } + static checkString(value) { + return /^(0x)?[0-9a-fA-F]{64}$/.test(value); + } + constructor(value) { + if (!H256.checkString(value)) { + throw Error(`Expected 32 byte hexstring for creating H256 but found "${value}"`); + } + this.value = value.startsWith("0x") + ? value.slice(2).toLowerCase() + : value.toLowerCase(); + } + toEncodeObject() { + return `0x${this.value}`; + } + rlpBytes() { + return RLP.encode(this.toEncodeObject()); + } + isEqualTo(rhs) { + return this.value === rhs.value; + } + toString() { + return this.value; + } + toJSON() { + return `0x${this.value}`; + } +} +exports.H256 = H256; +//# sourceMappingURL=H256.js.map \ No newline at end of file diff --git a/lib/value/H256.js.map b/lib/value/H256.js.map new file mode 100644 index 0000000..46ffd6b --- /dev/null +++ b/lib/value/H256.js.map @@ -0,0 +1 @@ +{"version":3,"file":"H256.js","sourceRoot":"","sources":["../../src/value/H256.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;AAI3B;;GAEG;AACH,MAAa,IAAI;IACN,MAAM,CAAC,SAAS,CAAC,MAAc;QAClC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAG,GAAG,IAAI,CAAC;QACrC,IAAI,MAAM,KAAK,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE;YAC1C,MAAM,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;SACjD;QACD,OAAO,IAAI,IAAI,CACX,KAAK;aACA,GAAG,CACA,IAAI,CAAC,EAAE,CACH,IAAI,GAAG,IAAI;YACP,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;YACzB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAC9B;aACA,IAAI,CAAC,EAAE,CAAC,CAChB,CAAC;IACN,CAAC;IAEM,MAAM,CAAC,IAAI;QACd,OAAO,IAAI,IAAI,CACX,kEAAkE,CACrE,CAAC;IACN,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,KAAU;QAC1B,OAAO,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,KAAgB;QACjC,OAAO,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,KAAa;QACpC,OAAO,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAID,YAAY,KAAa;QACrB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;YAC1B,MAAM,KAAK,CACP,2DAA2D,KAAK,GAAG,CACtE,CAAC;SACL;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;YAC/B,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;YAC9B,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC;IAEM,cAAc;QACjB,OAAO,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAEM,QAAQ;QACX,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IAC7C,CAAC;IAEM,SAAS,CAAC,GAAS;QACtB,OAAO,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC;IACpC,CAAC;IAEM,QAAQ;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAEM,MAAM;QACT,OAAO,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACJ;AArED,oBAqEC"} \ No newline at end of file diff --git a/lib/value/H512.d.ts b/lib/value/H512.d.ts new file mode 100644 index 0000000..023f4ff --- /dev/null +++ b/lib/value/H512.d.ts @@ -0,0 +1,19 @@ +/// +export type H512Value = H512 | string; +/** + * Handles 512-bit data. Used to express public keys. + */ +export declare class H512 { + static fromBytes(buffer: Buffer): H512; + static zero(): H512; + static check(param: any): boolean; + static ensure(param: H512Value): H512; + private static checkString; + value: string; + constructor(value: string); + toEncodeObject(): string; + rlpBytes(): Buffer; + isEqualTo(rhs: H512): boolean; + toString(): string; + toJSON(): string; +} diff --git a/lib/value/H512.js b/lib/value/H512.js new file mode 100644 index 0000000..caee6b8 --- /dev/null +++ b/lib/value/H512.js @@ -0,0 +1,62 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.H512 = void 0; +/** + * @hidden + */ +const RLP = require("rlp"); +/** + * Handles 512-bit data. Used to express public keys. + */ +class H512 { + static fromBytes(buffer) { + const bytes = Array.from(buffer.values()); + const firstByte = bytes.shift(); + const length = bytes.shift(); + if (firstByte !== 0xb8 || length !== 64 || bytes.length !== length) { + throw Error(`Invalid RLP for H512: ${bytes}`); + } + return new H512(bytes + .map(byte => byte < 0x10 + ? `0${byte.toString(16)}` + : byte.toString(16)) + .join("")); + } + static zero() { + return new H512("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); + } + static check(param) { + return param instanceof H512 ? true : H512.checkString(param); + } + static ensure(param) { + return param instanceof H512 ? param : new H512(param); + } + static checkString(value) { + return /^(0x)?[0-9a-fA-F]{128}$/.test(value); + } + constructor(value) { + if (!H512.checkString(value)) { + throw Error(`Expected 64 byte hexstring for creating H512 but found "${value}"`); + } + this.value = value.startsWith("0x") + ? value.slice(2).toLowerCase() + : value.toLowerCase(); + } + toEncodeObject() { + return `0x${this.value}`; + } + rlpBytes() { + return RLP.encode(this.toEncodeObject()); + } + isEqualTo(rhs) { + return this.value === rhs.value; + } + toString() { + return this.value; + } + toJSON() { + return `0x${this.value}`; + } +} +exports.H512 = H512; +//# sourceMappingURL=H512.js.map \ No newline at end of file diff --git a/lib/value/H512.js.map b/lib/value/H512.js.map new file mode 100644 index 0000000..3c0ee7e --- /dev/null +++ b/lib/value/H512.js.map @@ -0,0 +1 @@ +{"version":3,"file":"H512.js","sourceRoot":"","sources":["../../src/value/H512.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;AAI3B;;GAEG;AACH,MAAa,IAAI;IACN,MAAM,CAAC,SAAS,CAAC,MAAc;QAClC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,SAAS,KAAK,IAAI,IAAI,MAAM,KAAK,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE;YAChE,MAAM,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;SACjD;QACD,OAAO,IAAI,IAAI,CACX,KAAK;aACA,GAAG,CACA,IAAI,CAAC,EAAE,CACH,IAAI,GAAG,IAAI;YACP,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;YACzB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAC9B;aACA,IAAI,CAAC,EAAE,CAAC,CAChB,CAAC;IACN,CAAC;IAEM,MAAM,CAAC,IAAI;QACd,OAAO,IAAI,IAAI,CACX,kIAAkI,CACrI,CAAC;IACN,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,KAAU;QAC1B,OAAO,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,KAAgB;QACjC,OAAO,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,KAAa;QACpC,OAAO,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IAID,YAAY,KAAa;QACrB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;YAC1B,MAAM,KAAK,CACP,2DAA2D,KAAK,GAAG,CACtE,CAAC;SACL;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;YAC/B,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;YAC9B,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC;IAEM,cAAc;QACjB,OAAO,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAEM,QAAQ;QACX,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IAC7C,CAAC;IAEM,SAAS,CAAC,GAAS;QACtB,OAAO,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC;IACpC,CAAC;IAEM,QAAQ;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAEM,MAAM;QACT,OAAO,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACJ;AAtED,oBAsEC"} \ No newline at end of file diff --git a/lib/value/U128.d.ts b/lib/value/U128.d.ts new file mode 100644 index 0000000..72a7be6 --- /dev/null +++ b/lib/value/U128.d.ts @@ -0,0 +1,41 @@ +/// +import { BigNumber } from "bignumber.js"; +import { U64, U64Value } from "./U64"; +export type U128Value = U128 | U64Value; +/** + * Handles 128-bit unsigned integers. Used to express nonce, asset amount, etc. + */ +export declare class U128 { + static MAX_VALUE: U128; + static plus(lhsValue: U128Value, rhsValue: U128Value): U128; + static minus(lhsValue: U128Value, rhsValue: U128Value): U128; + static times(lhsValue: U128Value, rhsValue: U128Value): U128; + static idiv(lhsValue: U128Value, rhsValue: U128Value): U128; + static mod(lhsValue: U128Value, rhsValue: U128Value): U128; + static fromBytes(buffer: Buffer): U128; + static check(param: any): boolean; + static ensure(param: U128Value): U128; + private static checkString; + readonly value: BigNumber; + constructor(value: number | string | BigNumber | U64); + plus(rhsValue: U128Value): U128; + minus(rhsValue: U128Value): U128; + times(rhsValue: U128Value): U128; + idiv(rhsValue: U128Value): U128; + mod(rhsValue: U128Value): U128; + toEncodeObject(): string | number; + rlpBytes(): Buffer; + isEqualTo(rhs: U128Value): boolean; + eq(rhs: U128Value): boolean; + isGreaterThan(rhs: U128Value): boolean; + gt(rhs: U128Value): boolean; + isGreaterThanOrEqualTo(rhs: U128Value): boolean; + gte(rhs: U128Value): boolean; + isLessThan(rhs: U128Value): boolean; + lt(rhs: U128Value): boolean; + isLessThanOrEqualTo(rhs: U128Value): boolean; + lte(rhs: U128Value): boolean; + toString(base?: 10 | 16): string; + toLocaleString(): string; + toJSON(): string; +} diff --git a/lib/value/U128.js b/lib/value/U128.js new file mode 100644 index 0000000..ce3afcd --- /dev/null +++ b/lib/value/U128.js @@ -0,0 +1,187 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.U128 = void 0; +const bignumber_js_1 = require("bignumber.js"); +const utility_1 = require("../utility"); +const U64_1 = require("./U64"); +/** + * @hidden + */ +const RLP = require("rlp"); +/** + * Handles 128-bit unsigned integers. Used to express nonce, asset amount, etc. + */ +class U128 { + static plus(lhsValue, rhsValue) { + const lhs = U128.ensure(lhsValue); + const rhs = U128.ensure(rhsValue); + const result = lhs.value.plus(rhs.value); + if (result.isGreaterThan(U128.MAX_VALUE.value)) { + throw Error(`Integer overflow`); + } + return new U128(result); + } + static minus(lhsValue, rhsValue) { + const lhs = U128.ensure(lhsValue); + const rhs = U128.ensure(rhsValue); + if (lhs.isLessThan(rhs)) { + throw Error(`Integer underflow`); + } + return new U128(lhs.value.minus(rhs.value)); + } + static times(lhsValue, rhsValue) { + const lhs = U128.ensure(lhsValue); + const rhs = U128.ensure(rhsValue); + const result = lhs.value.times(rhs.value); + if (result.isGreaterThan(U128.MAX_VALUE.value)) { + throw Error(`Integer overflow`); + } + return new U128(result); + } + static idiv(lhsValue, rhsValue) { + const lhs = U128.ensure(lhsValue); + const rhs = U128.ensure(rhsValue); + if (rhs.isEqualTo(0)) { + throw Error(`Divided by 0`); + } + return new U128(lhs.value.idiv(rhs.value)); + } + static mod(lhsValue, rhsValue) { + const lhs = U128.ensure(lhsValue); + const rhs = U128.ensure(rhsValue); + if (rhs.isEqualTo(0)) { + throw Error(`Divided by 0`); + } + return new U128(lhs.value.mod(rhs.value)); + } + static fromBytes(buffer) { + const bytes = Array.from(buffer.values()); + const first = bytes.shift(); + if (first < 0x80) { + return new U64_1.U64(first); + } + const length = first - 0x80; + if (bytes.length !== length) { + throw Error(`Invalid RLP for U128: ${bytes}`); + } + else if (length > 16) { + throw Error("Buffer for U128 must be less than or equal to 16"); + } + else if (length === 0) { + return new U128(0); + } + return new U128("0x" + + bytes + .map(byte => byte < 0x10 + ? `0${byte.toString(16)}` + : byte.toString(16)) + .join("")); + } + static check(param) { + if (param instanceof U128 || param instanceof U64_1.U64) { + return true; + } + else if (param instanceof bignumber_js_1.BigNumber) { + return (param.isInteger() && + !param.isNegative() && + param.isLessThanOrEqualTo(U128.MAX_VALUE.value)); + } + else if (typeof param === "number") { + return Number.isInteger(param) && param >= 0; + } + else { + return U128.checkString(param); + } + } + static ensure(param) { + return param instanceof U128 ? param : new U128(param); + } + static checkString(param) { + if (typeof param !== "string") { + return false; + } + const num = new bignumber_js_1.BigNumber(param); + return (num.isInteger() && + !num.isNegative() && + num.isLessThanOrEqualTo(U128.MAX_VALUE.value)); + } + constructor(value) { + this.value = new bignumber_js_1.BigNumber(value instanceof U64_1.U64 ? value.value : value); + if (!this.value.isInteger() || this.value.isNegative()) { + throw Error(`U128 must be a positive integer but found ${value}`); + } + else if (this.value.toString(16).length > 32) { + throw Error(`Given value is out of range for U128: ${this.value.toString(16)}`); + } + } + plus(rhsValue) { + return U128.plus(this, rhsValue); + } + minus(rhsValue) { + return U128.minus(this, rhsValue); + } + times(rhsValue) { + return U128.times(this, rhsValue); + } + idiv(rhsValue) { + return U128.idiv(this, rhsValue); + } + mod(rhsValue) { + return U128.mod(this, rhsValue); + } + toEncodeObject() { + const hex = this.value.toString(16); + // NOTE: workaround that RLP.encode("0x0") results to 00 + if (hex === "0") { + return 0; + } + else { + return hex.length % 2 === 0 ? `0x${hex}` : `0x0${hex}`; + } + } + rlpBytes() { + return RLP.encode(this.toEncodeObject()); + } + isEqualTo(rhs) { + return this.value.isEqualTo(U128.ensure(rhs).value); + } + eq(rhs) { + return this.isEqualTo(rhs); + } + isGreaterThan(rhs) { + return this.value.isGreaterThan(U128.ensure(rhs).value); + } + gt(rhs) { + return this.isGreaterThan(rhs); + } + isGreaterThanOrEqualTo(rhs) { + return this.value.isGreaterThanOrEqualTo(U128.ensure(rhs).value); + } + gte(rhs) { + return this.isGreaterThanOrEqualTo(rhs); + } + isLessThan(rhs) { + return this.value.isLessThan(U128.ensure(rhs).value); + } + lt(rhs) { + return this.isLessThan(rhs); + } + isLessThanOrEqualTo(rhs) { + return this.value.isLessThanOrEqualTo(U128.ensure(rhs).value); + } + lte(rhs) { + return this.isLessThanOrEqualTo(rhs); + } + toString(base) { + return this.value.toString(base || 10); + } + toLocaleString() { + return (0, utility_1.toLocaleString)(this.value); + } + toJSON() { + return `0x${this.value.toString(16)}`; + } +} +U128.MAX_VALUE = new U128(new bignumber_js_1.BigNumber("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF")); +exports.U128 = U128; +//# sourceMappingURL=U128.js.map \ No newline at end of file diff --git a/lib/value/U128.js.map b/lib/value/U128.js.map new file mode 100644 index 0000000..e407deb --- /dev/null +++ b/lib/value/U128.js.map @@ -0,0 +1 @@ +{"version":3,"file":"U128.js","sourceRoot":"","sources":["../../src/value/U128.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/value/U256.d.ts b/lib/value/U256.d.ts new file mode 100644 index 0000000..1ba1b83 --- /dev/null +++ b/lib/value/U256.d.ts @@ -0,0 +1,42 @@ +/// +import { BigNumber } from "bignumber.js"; +import { U128, U128Value } from "./U128"; +import { U64 } from "./U64"; +export type U256Value = U256 | U128Value; +/** + * Handles 256-bit unsigned integers. + */ +export declare class U256 { + static MAX_VALUE: U256; + static plus(lhsValue: U256Value, rhsValue: U256Value): U256; + static minus(lhsValue: U256Value, rhsValue: U256Value): U256; + static times(lhsValue: U256Value, rhsValue: U256Value): U256; + static idiv(lhsValue: U256Value, rhsValue: U256Value): U256; + static mod(lhsValue: U256Value, rhsValue: U256Value): U256; + static fromBytes(buffer: Buffer): U256; + static check(param: any): boolean; + static ensure(param: U256Value): U256; + private static checkString; + value: BigNumber; + constructor(value: number | string | BigNumber | U128 | U64); + plus(rhsValue: U256Value): U256; + minus(rhsValue: U256Value): U256; + times(rhsValue: U256Value): U256; + idiv(rhsValue: U256Value): U256; + mod(rhsValue: U256Value): U256; + toEncodeObject(): string | number; + rlpBytes(): Buffer; + isEqualTo(rhs: U256Value): boolean; + eq(rhs: U256Value): boolean; + isGreaterThan(rhs: U256Value): boolean; + gt(rhs: U256Value): boolean; + isGreaterThanOrEqualTo(rhs: U256Value): boolean; + gte(rhs: U256Value): boolean; + isLessThan(rhs: U256Value): boolean; + lt(rhs: U256Value): boolean; + isLessThanOrEqualTo(rhs: U256Value): boolean; + lte(rhs: U256Value): boolean; + toString(base?: 10 | 16): string; + toLocaleString(): string; + toJSON(): string; +} diff --git a/lib/value/U256.js b/lib/value/U256.js new file mode 100644 index 0000000..1ce8dec --- /dev/null +++ b/lib/value/U256.js @@ -0,0 +1,194 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.U256 = void 0; +const bignumber_js_1 = require("bignumber.js"); +const utility_1 = require("../utility"); +const U128_1 = require("./U128"); +const U64_1 = require("./U64"); +/** + * @hidden + */ +const RLP = require("rlp"); +/** + * Handles 256-bit unsigned integers. + */ +class U256 { + static plus(lhsValue, rhsValue) { + const lhs = U256.ensure(lhsValue); + const rhs = U256.ensure(rhsValue); + const result = lhs.value.plus(rhs.value); + if (result.isGreaterThan(U256.MAX_VALUE.value)) { + throw Error(`Integer overflow`); + } + return new U256(result); + } + static minus(lhsValue, rhsValue) { + const lhs = U256.ensure(lhsValue); + const rhs = U256.ensure(rhsValue); + if (lhs.isLessThan(rhs)) { + throw Error(`Integer underflow`); + } + return new U256(lhs.value.minus(rhs.value)); + } + static times(lhsValue, rhsValue) { + const lhs = U256.ensure(lhsValue); + const rhs = U256.ensure(rhsValue); + const result = lhs.value.times(rhs.value); + if (result.isGreaterThan(U256.MAX_VALUE.value)) { + throw Error(`Integer overflow`); + } + return new U256(result); + } + static idiv(lhsValue, rhsValue) { + const lhs = U256.ensure(lhsValue); + const rhs = U256.ensure(rhsValue); + if (rhs.isEqualTo(0)) { + throw Error(`Divided by 0`); + } + return new U256(lhs.value.idiv(rhs.value)); + } + static mod(lhsValue, rhsValue) { + const lhs = U256.ensure(lhsValue); + const rhs = U256.ensure(rhsValue); + if (rhs.isEqualTo(0)) { + throw Error(`Divided by 0`); + } + return new U256(lhs.value.mod(rhs.value)); + } + static fromBytes(buffer) { + const bytes = Array.from(buffer.values()); + const first = bytes.shift(); + if (first < 0x80) { + return new U64_1.U64(first); + } + const length = first - 0x80; + if (bytes.length !== length) { + throw Error(`Invalid RLP for U256: ${bytes}`); + } + else if (length > 32) { + throw Error("Buffer for U256 must be less than or equal to 32"); + } + else if (length === 0) { + return new U256(0); + } + return new U256("0x" + + bytes + .map(byte => byte < 0x10 + ? `0${byte.toString(16)}` + : byte.toString(16)) + .join("")); + } + static check(param) { + if (param instanceof U256 || + param instanceof U128_1.U128 || + param instanceof U64_1.U64) { + return true; + } + else if (param instanceof bignumber_js_1.BigNumber) { + return (param.isInteger() && + !param.isNegative() && + param.isLessThanOrEqualTo(U256.MAX_VALUE.value)); + } + else if (typeof param === "number") { + return Number.isInteger(param) && param >= 0; + } + else { + return U256.checkString(param); + } + } + static ensure(param) { + return param instanceof U256 + ? param + : new U256(param instanceof U128_1.U128 || param instanceof U64_1.U64 + ? param.value + : param); + } + static checkString(param) { + if (typeof param !== "string") { + return false; + } + const num = new bignumber_js_1.BigNumber(param); + return (num.isInteger() && + !num.isNegative() && + num.isLessThanOrEqualTo(U256.MAX_VALUE.value)); + } + constructor(value) { + this.value = new bignumber_js_1.BigNumber(value instanceof U128_1.U128 || value instanceof U64_1.U64 ? value.value : value); + if (!this.value.isInteger() || this.value.isNegative()) { + throw Error(`U256 must be a positive integer but found ${value}`); + } + else if (this.value.toString(16).length > 64) { + throw Error(`Given value is out of range for U256: ${this.value.toString(16)}`); + } + } + plus(rhsValue) { + return U256.plus(this, rhsValue); + } + minus(rhsValue) { + return U256.minus(this, rhsValue); + } + times(rhsValue) { + return U256.times(this, rhsValue); + } + idiv(rhsValue) { + return U256.idiv(this, rhsValue); + } + mod(rhsValue) { + return U256.mod(this, rhsValue); + } + toEncodeObject() { + const hex = this.value.toString(16); + // NOTE: workaround that RLP.encode("0x0") results to 00 + if (hex === "0") { + return 0; + } + else { + return hex.length % 2 === 0 ? `0x${hex}` : `0x0${hex}`; + } + } + rlpBytes() { + return RLP.encode(this.toEncodeObject()); + } + isEqualTo(rhs) { + return this.value.isEqualTo(U256.ensure(rhs).value); + } + eq(rhs) { + return this.isEqualTo(rhs); + } + isGreaterThan(rhs) { + return this.value.isGreaterThan(U256.ensure(rhs).value); + } + gt(rhs) { + return this.isGreaterThan(rhs); + } + isGreaterThanOrEqualTo(rhs) { + return this.value.isGreaterThanOrEqualTo(U256.ensure(rhs).value); + } + gte(rhs) { + return this.isGreaterThanOrEqualTo(rhs); + } + isLessThan(rhs) { + return this.value.isLessThan(U256.ensure(rhs).value); + } + lt(rhs) { + return this.isLessThan(rhs); + } + isLessThanOrEqualTo(rhs) { + return this.value.isLessThanOrEqualTo(U256.ensure(rhs).value); + } + lte(rhs) { + return this.isLessThanOrEqualTo(rhs); + } + toString(base) { + return this.value.toString(base || 10); + } + toLocaleString() { + return (0, utility_1.toLocaleString)(this.value); + } + toJSON() { + return `0x${this.value.toString(16)}`; + } +} +U256.MAX_VALUE = new U256(new bignumber_js_1.BigNumber("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF")); +exports.U256 = U256; +//# sourceMappingURL=U256.js.map \ No newline at end of file diff --git a/lib/value/U256.js.map b/lib/value/U256.js.map new file mode 100644 index 0000000..4564e1c --- /dev/null +++ b/lib/value/U256.js.map @@ -0,0 +1 @@ +{"version":3,"file":"U256.js","sourceRoot":"","sources":["../../src/value/U256.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/value/U64.d.ts b/lib/value/U64.d.ts new file mode 100644 index 0000000..df53ffe --- /dev/null +++ b/lib/value/U64.d.ts @@ -0,0 +1,40 @@ +/// +import { BigNumber } from "bignumber.js"; +export type U64Value = U64 | BigNumber | number | string; +/** + * Handles 64-bit unsigned integers. Used to express nonce, asset amount, etc. + */ +export declare class U64 { + static MAX_VALUE: U64; + static plus(lhsValue: U64Value, rhsValue: U64Value): U64; + static minus(lhsValue: U64Value, rhsValue: U64Value): U64; + static times(lhsValue: U64Value, rhsValue: U64Value): U64; + static idiv(lhsValue: U64Value, rhsValue: U64Value): U64; + static mod(lhsValue: U64Value, rhsValue: U64Value): U64; + static fromBytes(buffer: Buffer): U64; + static check(param: any): boolean; + static ensure(param: U64Value): U64; + private static checkString; + readonly value: BigNumber; + constructor(value: number | string | BigNumber); + plus(rhsValue: U64Value): U64; + minus(rhsValue: U64Value): U64; + times(rhsValue: U64Value): U64; + idiv(rhsValue: U64Value): U64; + mod(rhsValue: U64Value): U64; + toEncodeObject(): string | number; + rlpBytes(): Buffer; + isEqualTo(rhs: U64Value): boolean; + eq(rhs: U64Value): boolean; + isGreaterThan(rhs: U64Value): boolean; + gt(rhs: U64Value): boolean; + isGreaterThanOrEqualTo(rhs: U64Value): boolean; + gte(rhs: U64Value): boolean; + isLessThan(rhs: U64Value): boolean; + lt(rhs: U64Value): boolean; + isLessThanOrEqualTo(rhs: U64Value): boolean; + lte(rhs: U64Value): boolean; + toString(base?: 10 | 16): string; + toLocaleString(): string; + toJSON(): string; +} diff --git a/lib/value/U64.js b/lib/value/U64.js new file mode 100644 index 0000000..de72beb --- /dev/null +++ b/lib/value/U64.js @@ -0,0 +1,186 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.U64 = void 0; +const bignumber_js_1 = require("bignumber.js"); +const utility_1 = require("../utility"); +/** + * @hidden + */ +const RLP = require("rlp"); +/** + * Handles 64-bit unsigned integers. Used to express nonce, asset amount, etc. + */ +class U64 { + static plus(lhsValue, rhsValue) { + const lhs = U64.ensure(lhsValue); + const rhs = U64.ensure(rhsValue); + const result = lhs.value.plus(rhs.value); + if (result.isGreaterThan(U64.MAX_VALUE.value)) { + throw Error(`Integer overflow`); + } + return new U64(result); + } + static minus(lhsValue, rhsValue) { + const lhs = U64.ensure(lhsValue); + const rhs = U64.ensure(rhsValue); + if (lhs.isLessThan(rhs)) { + throw Error(`Integer underflow`); + } + return new U64(lhs.value.minus(rhs.value)); + } + static times(lhsValue, rhsValue) { + const lhs = U64.ensure(lhsValue); + const rhs = U64.ensure(rhsValue); + const result = lhs.value.times(rhs.value); + if (result.isGreaterThan(U64.MAX_VALUE.value)) { + throw Error(`Integer overflow`); + } + return new U64(result); + } + static idiv(lhsValue, rhsValue) { + const lhs = U64.ensure(lhsValue); + const rhs = U64.ensure(rhsValue); + if (rhs.isEqualTo(0)) { + throw Error(`Divided by 0`); + } + return new U64(lhs.value.idiv(rhs.value)); + } + static mod(lhsValue, rhsValue) { + const lhs = U64.ensure(lhsValue); + const rhs = U64.ensure(rhsValue); + if (rhs.isEqualTo(0)) { + throw Error(`Divided by 0`); + } + return new U64(lhs.value.mod(rhs.value)); + } + static fromBytes(buffer) { + const bytes = Array.from(buffer.values()); + const first = bytes.shift(); + if (first < 0x80) { + return new U64(first); + } + const length = first - 0x80; + if (bytes.length !== length) { + throw Error(`Invalid RLP for U64: ${bytes}`); + } + else if (length > 8) { + throw Error("Buffer for U64 must be less than or equal to 8"); + } + else if (length === 0) { + return new U64(0); + } + return new U64("0x" + + bytes + .map(byte => byte < 0x10 + ? `0${byte.toString(16)}` + : byte.toString(16)) + .join("")); + } + static check(param) { + if (param instanceof U64) { + return true; + } + else if (param instanceof bignumber_js_1.BigNumber) { + return (param.isInteger() && + !param.isNegative() && + param.isLessThanOrEqualTo(U64.MAX_VALUE.value)); + } + else if (typeof param === "number") { + return Number.isInteger(param) && param >= 0; + } + else { + return U64.checkString(param); + } + } + static ensure(param) { + return param instanceof U64 ? param : new U64(param); + } + static checkString(param) { + if (typeof param !== "string") { + return false; + } + const num = new bignumber_js_1.BigNumber(param); + return (num.isInteger() && + !num.isNegative() && + num.isLessThanOrEqualTo(U64.MAX_VALUE.value)); + } + constructor(value) { + this.value = new bignumber_js_1.BigNumber(value); + if (!this.value.isInteger() || this.value.isNegative()) { + throw Error(`U64 must be a positive integer but found ${value}`); + } + else if (this.value.toString(16).length > 16) { + throw Error(`Given value is out of range for U64: ${this.value.toString(16)}`); + } + } + plus(rhsValue) { + return U64.plus(this, rhsValue); + } + minus(rhsValue) { + return U64.minus(this, rhsValue); + } + times(rhsValue) { + return U64.times(this, rhsValue); + } + idiv(rhsValue) { + return U64.idiv(this, rhsValue); + } + mod(rhsValue) { + return U64.mod(this, rhsValue); + } + toEncodeObject() { + const hex = this.value.toString(16); + // NOTE: workaround that RLP.encode("0x0") results to 00 + if (hex === "0") { + return 0; + } + else { + return hex.length % 2 === 0 ? `0x${hex}` : `0x0${hex}`; + } + } + rlpBytes() { + return RLP.encode(this.toEncodeObject()); + } + isEqualTo(rhs) { + return this.value.isEqualTo(U64.ensure(rhs).value); + } + eq(rhs) { + return this.isEqualTo(rhs); + } + isGreaterThan(rhs) { + return this.value.isGreaterThan(U64.ensure(rhs).value); + } + gt(rhs) { + return this.isGreaterThan(rhs); + } + isGreaterThanOrEqualTo(rhs) { + return this.value.isGreaterThanOrEqualTo(U64.ensure(rhs).value); + } + gte(rhs) { + return this.isGreaterThanOrEqualTo(rhs); + } + isLessThan(rhs) { + return this.value.isLessThan(U64.ensure(rhs).value); + } + lt(rhs) { + return this.isLessThan(rhs); + } + isLessThanOrEqualTo(rhs) { + return this.value.isLessThanOrEqualTo(U64.ensure(rhs).value); + } + lte(rhs) { + return this.isLessThanOrEqualTo(rhs); + } + toString(base) { + return this.value.toString(base || 10); + } + toLocaleString() { + return (0, utility_1.toLocaleString)(this.value); + } + toJSON() { + return `0x${this.value.toString(16)}`; + } +} +U64.MAX_VALUE = new U64(new bignumber_js_1.BigNumber("0xFFFFFFFFFFFFFFFF")); +exports.U64 = U64; +//# sourceMappingURL=U64.js.map \ No newline at end of file diff --git a/lib/value/U64.js.map b/lib/value/U64.js.map new file mode 100644 index 0000000..43d130e --- /dev/null +++ b/lib/value/U64.js.map @@ -0,0 +1 @@ +{"version":3,"file":"U64.js","sourceRoot":"","sources":["../../src/value/U64.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index e93ab83..265bea6 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "@types/jest": "^23.3.2", "@types/lodash": "^4.14.116", "@types/node": "^10.10.0", - "@types/node-forge": "^0.7.5", + "@types/node-forge": "^1.3.2", "jest": "^23.6.0", "prettier": "1.14.2", "remap-istanbul": "^0.12.0", @@ -48,7 +48,7 @@ "tslint": "^5.11.0", "tslint-config-prettier": "^1.15.0", "typedoc": "^0.12.0", - "typescript": "^3.0.3" + "typescript": "^5.0.4" }, "dependencies": { "bignumber.js": "^7.2.1", @@ -58,8 +58,8 @@ "crypto-js": "^3.1.9-1", "elliptic": "^6.4.1", "hmac-drbg": "^1.0.1", - "lodash": "^4.17.14", - "node-forge": "^0.7.6", + "lodash": "^4.17.21", + "node-forge": "^0.10.0", "rlp": "^2.1.0", "tweetnacl": "^1.0.3" }