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"
   }