PHP WebShell

Текущая директория: /opt/BitGoJS/node_modules/tonweb/src/contract/token/nft

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

const {Address} = require("../../../utils");
const {Cell} = require("../../../boc");

const SNAKE_DATA_PREFIX = 0x00;
const CHUNK_DATA_PREFIX = 0x01;
const ONCHAIN_CONTENT_PREFIX = 0x00;
const OFFCHAIN_CONTENT_PREFIX = 0x01;

/**
 * @param uri   {string}
 * @returns {Uint8Array}
 */
const serializeUri = (uri) => {
    return new TextEncoder().encode(encodeURI(uri));
}

/**
 * @param bytes {Uint8Array}
 * @return {string}
 */
const parseUri = (bytes) => {
    return new TextDecoder().decode(bytes);
}

/**
 * @param uri {string}
 * @return {Cell}
 */
const createOffchainUriCell = (uri) => {
    const cell = new Cell();
    cell.bits.writeUint(OFFCHAIN_CONTENT_PREFIX, 8);
    cell.bits.writeBytes(serializeUri(uri));
    return cell;
}

/**
 * @param cell {Cell}
 * @returns {string}
 */
const parseOffchainUriCell = (cell) => {
    if (cell.bits.array[0] !== OFFCHAIN_CONTENT_PREFIX) {
        throw new Error('no OFFCHAIN_CONTENT_PREFIX');
    }

    let length = 0;
    let c = cell;
    while (c) {
        length += c.bits.array.length;
        c = c.refs[0];
    }

    const bytes = new Uint8Array(length);
    length = 0;
    c = cell;
    while (c) {
        bytes.set(c.bits.array, length)
        length += c.bits.array.length;
        c = c.refs[0];
    }
    return parseUri(bytes.slice(1)); // slice OFFCHAIN_CONTENT_PREFIX
}

/**
 * @param bs    {BitString}
 * @param cursor    {number}
 * @param bits  {number}
 * @return {BigInt}
 */
const readIntFromBitString = (bs, cursor, bits) => {
    let n = BigInt(0);
    for (let i = 0; i < bits; i++) {
        n *= BigInt(2);
        n += BigInt(bs.get(cursor + i));
    }
    return n;
}

/**
 * @param cell  {Cell}
 * @return {Address|null}
 */
const parseAddress = cell => {
    let n = readIntFromBitString(cell.bits, 3, 8);
    if (n > BigInt(127)) {
        n = n - BigInt(256);
    }
    const hashPart = readIntFromBitString(cell.bits, 3 + 8, 256);
    if (n.toString(10) + ":" + hashPart.toString(16) === '0:0') return null;
    const s = n.toString(10) + ":" + hashPart.toString(16).padStart(64, '0');
    return new Address(s);
};

/**
 * @param provider {HttpProvider}
 * @param address {string}
 * @return {Promise<{royalty: number, royaltyFactor: number, royaltyBase: number, royaltyAddress: Address}>}
 */
const getRoyaltyParams = async (provider, address) => {
    const result = await provider.call2(address, 'royalty_params');

    const royaltyFactor = result[0].toNumber();
    const royaltyBase = result[1].toNumber();
    const royalty = royaltyFactor / royaltyBase;
    const royaltyAddress = parseAddress(result[2]);

    return {royalty, royaltyBase, royaltyFactor, royaltyAddress};
}

module.exports = {
    SNAKE_DATA_PREFIX,
    CHUNK_DATA_PREFIX,
    ONCHAIN_CONTENT_PREFIX,
    OFFCHAIN_CONTENT_PREFIX,
    parseAddress,
    serializeUri,
    parseUri,
    createOffchainUriCell,
    parseOffchainUriCell,
    getRoyaltyParams
};

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


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