UNPKG

@keyper/specs

Version:

keyper specifications

103 lines (102 loc) 4.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.scriptToAddress = exports.addressToScript = void 0; var bech32 = require("bech32"); function addressToScript(address, systemCodeHash) { if (systemCodeHash === void 0) { systemCodeHash = { SECP256K1_BLAKE160_SIGHASH_ALL_TYPE_HASH: "0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8", SECP256K1_BLAKE160_MULTISIG_ALL_TYPE_HASH: "0x5c5069eb0857efc65e1bca0c07df34c31663b3622fd3876c876320fc9634e2a8" }; } if (address.length !== 46 && address.length !== 95) { throw new Error("Invalid address: " + address); } var payload = bech32.decode(address, 95); if (payload.prefix !== "ckb" && payload.prefix !== "ckt") { throw new Error("Invalid address: " + address); } var data = bech32.fromWords(payload.words); if (data[0] === 1) { // short address if (data[1] === 0) { // SECP256K1 + blake160 return { hashType: "type", codeHash: systemCodeHash.SECP256K1_BLAKE160_SIGHASH_ALL_TYPE_HASH, args: "0x" + Buffer.from(data.slice(2)).toString("hex") }; } else if (data[1] === 1) { // SECP256K1 + multisig return { hashType: "type", codeHash: systemCodeHash.SECP256K1_BLAKE160_MULTISIG_ALL_TYPE_HASH, args: "0x" + Buffer.from(data.slice(2)).toString("hex") }; } else { throw new Error("Invalid address: " + address); } } else if (data[0] === 2) { // long hash_type: data return { hashType: "data", codeHash: "0x" + Buffer.from(data.slice(1, 33)).toString("hex"), args: "0x" + Buffer.from(data.slice(33)).toString("hex") }; } else if (data[0] === 4) { // long hash_type: type return { hashType: "type", codeHash: "0x" + Buffer.from(data.slice(1, 33)).toString("hex"), args: "0x" + Buffer.from(data.slice(33)).toString("hex") }; } else { throw new Error("Invalid address: " + address); } } exports.addressToScript = addressToScript; function scriptToAddress(script, config) { if (config === void 0) { config = { networkPrefix: "ckb", short: true, SECP256K1_BLAKE160_SIGHASH_ALL_TYPE_HASH: "0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8", SECP256K1_BLAKE160_MULTISIG_ALL_TYPE_HASH: "0x5c5069eb0857efc65e1bca0c07df34c31663b3622fd3876c876320fc9634e2a8" }; } if (!config.networkPrefix) { config.networkPrefix = "ckb"; } if (!config.SECP256K1_BLAKE160_SIGHASH_ALL_TYPE_HASH) { config.SECP256K1_BLAKE160_SIGHASH_ALL_TYPE_HASH = "0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8"; } if (!config.SECP256K1_BLAKE160_MULTISIG_ALL_TYPE_HASH) { config.SECP256K1_BLAKE160_MULTISIG_ALL_TYPE_HASH = "0x5c5069eb0857efc65e1bca0c07df34c31663b3622fd3876c876320fc9634e2a8"; } var payload = ""; if (config.short) { if (script.codeHash === config.SECP256K1_BLAKE160_SIGHASH_ALL_TYPE_HASH) { payload = "0100" + script.args.slice(2); } else if (script.codeHash === config.SECP256K1_BLAKE160_MULTISIG_ALL_TYPE_HASH) { payload = "0101" + script.args.slice(2); } else { config.short = false; } } if (!config.short) { if (script.hashType === "data") { payload = "02" + script.codeHash.slice(2) + script.args.slice(2); } else if (script.hashType === "type") { payload = "04" + script.codeHash.slice(2) + script.args.slice(2); } else { throw new Error("Invalid script: " + JSON.stringify(script)); } } return bech32.encode(config.networkPrefix, bech32.toWords(Buffer.from(payload, "hex")), 95); } exports.scriptToAddress = scriptToAddress;