PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/cashaddress/src

Просмотр файла: index.js

'use strict'
/** global: Buffer */

let base32 = require('./base32')

let P2SH = "scripthash";
let P2PKH = "pubkeyhash";

let hashBitMap = {};
hashBitMap[160] = 0;
hashBitMap[192] = 1;
hashBitMap[224] = 2;
hashBitMap[256] = 3;
hashBitMap[320] = 4;
hashBitMap[384] = 5;
hashBitMap[448] = 6;
hashBitMap[512] = 7;

let versionBitMap = {};
versionBitMap[P2PKH] = 0;
versionBitMap[P2SH] = 1;

function checkMap(mapObj, value) {
    let keys = Object.keys(mapObj);
    for (let i = 0; i < keys.length; i++) {
        if (mapObj[keys[i]] === value) {
            return keys[i];
        }
    }

    return null;
}

function createVersion(scriptType, hashLengthBits) {
    if ((scriptType === P2PKH || scriptType === P2SH) && hashLengthBits !== 160) {
        throw new Error("Invalid hash length for scriptType");
    }

    return (versionBitMap[scriptType] << 3) | hashBitMap[hashLengthBits];
}

function encodePayload(scriptType, hash) {
    let hashLength = hash.length
    let version = createVersion(scriptType, hashLength * 8)
    let payload = Buffer.allocUnsafe(1 + hash.length)
    payload.writeUInt8(version, 0)
    hash.copy(payload, 1)
    return payload
}

function decodeVersion (version) {
    let last = (version >>> 7);
    if (last & 1 || last > 0) {
        throw new Error("Invalid version, most significant bit is reserved");
    }

    let scriptType = checkMap(versionBitMap, (version >> 3) & 0x0f)
    if (scriptType === null) {
        throw new Error("Invalid script type");
    }
    // all possible values return
    let hashSize = parseInt(checkMap(hashBitMap, version & 0x07), 10);
    if ((scriptType === P2PKH || scriptType === P2SH) && hashSize !== 160) {
        throw new Error("Mismatch between script type and hash length");
    }

    return {scriptType, hashSize}
}

function encode (prefix, scriptType, hash) {
    if (!(hash instanceof Buffer)) {
        throw new Error("Hash should be passed as a Buffer")
    }

    if (!(scriptType in versionBitMap)) {
        throw new Error("Unsupported script type")
    }

    return base32.encode(
        prefix,
        base32.toWords(encodePayload(scriptType, hash))
    )
}

function decode(address) {
    let result = base32.decode(address)
    let data = base32.fromWords(result.words)
    if (data.length < 1) {
        throw new Error("Empty payload in address")
    }

    let versionInfo = decodeVersion(data[0])
    if (1 + (versionInfo.hashSize / 8) !== data.length) {
        throw new Error('Hash length does not match version')
    }

    return {
        version: versionInfo.scriptType,
        prefix: result.prefix,
        hash: Buffer.from(data.slice(1))
    }
}

module.exports = { decode: decode, encode: encode };

Выполнить команду


Для локальной разработки. Не используйте в интернете!