PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-hbar/dist/src/lib

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

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
    var ownKeys = function(o) {
        ownKeys = Object.getOwnPropertyNames || function (o) {
            var ar = [];
            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
            return ar;
        };
        return ownKeys(o);
    };
    return function (mod) {
        if (mod && mod.__esModule) return mod;
        var result = {};
        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
        __setModuleDefault(result, mod);
        return result;
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.TokenTransferBuilder = void 0;
const Long = __importStar(require("long"));
const sdk_core_1 = require("@bitgo/sdk-core");
const transferBuilder_1 = require("./transferBuilder");
const utils_1 = require("./utils");
const bignumber_js_1 = require("bignumber.js");
class TokenTransferBuilder extends transferBuilder_1.TransferBuilder {
    constructor(_coinConfig) {
        super(_coinConfig);
    }
    /** @inheritdoc */
    async buildImplementation() {
        this._txBodyData.tokenTransfers = this.buildTokenTransferData(); // set to list by the contract
        return await super.buildImplementation();
    }
    buildTokenTransferData() {
        let tokenTransferAmount = new bignumber_js_1.BigNumber(0); // total send amount for each token
        const tokenId = (0, utils_1.getHederaTokenIdFromName)(this._tokenName);
        const tokenTransferData = [
            {
                accountID: (0, utils_1.buildHederaAccountID)(this._source.address),
                amount: Long.fromInt(0),
            },
        ];
        this._recipients.forEach((recipient) => {
            tokenTransferAmount = tokenTransferAmount.plus(recipient.amount);
            tokenTransferData.push({ accountID: (0, utils_1.buildHederaAccountID)(recipient.address), amount: Long.fromString(recipient.amount) } // recipient
            );
        });
        tokenTransferData[0].amount = Long.fromString(tokenTransferAmount.toString()).negate(); // update sender send amount
        return [
            {
                token: (0, utils_1.buildHederaTokenID)(tokenId),
                transfers: tokenTransferData,
            },
        ];
    }
    /** @inheritdoc */
    initBuilder(tx) {
        super.initBuilder(tx);
        const transferData = tx.txBody.cryptoTransfer;
        if ((0, utils_1.isTokenTransfer)(transferData)) {
            this.initTokenTransfers(transferData.tokenTransfers);
        }
    }
    /**
     * Initialize the transfer specific data, getting the recipient account
     * represented by the element with a positive amount on the transfer element.
     * The negative amount represents the source account so it's ignored.
     *
     * @param {proto.IAccountAmount[]} transfers array of objects which contains accountID and transferred amount
     */
    initTokenTransfers(tokenTransfers) {
        tokenTransfers.forEach((tokenTransfer) => {
            if (!tokenTransfer.token) {
                throw new sdk_core_1.BuildTransactionError('Invalid transaction: missing token id');
            }
            if (!tokenTransfer.transfers) {
                throw new sdk_core_1.BuildTransactionError('Invalid transaction: missing transfer data');
            }
            const token = (0, utils_1.getHederaTokenNameFromId)((0, utils_1.stringifyTokenId)(tokenTransfer.token));
            if (!token) {
                throw new sdk_core_1.BuildTransactionError('Invalid transaction: invalid token id');
            }
            tokenTransfer.transfers.forEach((transferData) => {
                const amount = Long.fromValue(transferData.amount);
                if (amount.isPositive()) {
                    this.send({
                        address: (0, utils_1.stringifyAccountId)(transferData.accountID),
                        amount: amount.toString(),
                        tokenName: token.name,
                    });
                }
            });
        });
    }
    // region Transfer fields
    /** @inheritdoc */
    send(recipient) {
        if (!recipient.tokenName) {
            throw new sdk_core_1.InvalidParameterValueError('Invalid missing token name');
        }
        const tokenId = (0, utils_1.getHederaTokenIdFromName)(recipient.tokenName);
        if (!tokenId) {
            throw new sdk_core_1.InvalidParameterValueError(`Invalid token name: ${recipient.tokenName}`);
        }
        if (this._tokenName && this._tokenName !== recipient.tokenName) {
            throw new sdk_core_1.InvalidParameterValueError(`Invalid token: received ${recipient.tokenName} for ${this._tokenName} tx`);
        }
        this._tokenName = recipient.tokenName;
        return super.send(recipient);
    }
}
exports.TokenTransferBuilder = TokenTransferBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5UcmFuc2ZlckJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Rva2VuVHJhbnNmZXJCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLDJDQUE2QjtBQUU3Qiw4Q0FBb0Y7QUFFcEYsdURBQW9EO0FBRXBELG1DQVFpQjtBQUNqQiwrQ0FBeUM7QUFFekMsTUFBYSxvQkFBcUIsU0FBUSxpQ0FBZTtJQUd2RCxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsa0JBQWtCO0lBQ1IsS0FBSyxDQUFDLG1CQUFtQjtRQUNqQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDLDhCQUE4QjtRQUMvRixPQUFPLE1BQU0sS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixJQUFJLG1CQUFtQixHQUFHLElBQUksd0JBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1DQUFtQztRQUMvRSxNQUFNLE9BQU8sR0FBRyxJQUFBLGdDQUF3QixFQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxRCxNQUFNLGlCQUFpQixHQUEyQjtZQUNoRDtnQkFDRSxTQUFTLEVBQUUsSUFBQSw0QkFBb0IsRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztnQkFDckQsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQ3hCO1NBQ0YsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDckMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENB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QUFDLENBQUM7UUFDckYsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMvRCxNQUFNLElBQUkscUNBQTBCLENBQUMsMkJBQTJCLFNBQVMsQ0FBQyxTQUFTLFFBQVEsSUFBSSxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUM7UUFDbkgsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQztRQUN0QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0IsQ0FBQztDQUVGO0FBbEdELG9EQWtHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgKiBhcyBMb25nIGZyb20gJ2xvbmcnO1xuaW1wb3J0IHsgcHJvdG8gfSBmcm9tICdAaGFzaGdyYXBoL3Byb3RvJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgSW52YWxpZFBhcmFtZXRlclZhbHVlRXJyb3IgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgUmVjaXBpZW50IH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBUcmFuc2ZlckJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zZmVyQnVpbGRlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHtcbiAgYnVpbGRIZWRlcmFBY2NvdW50SUQsXG4gIGJ1aWxkSGVkZXJhVG9rZW5JRCxcbiAgZ2V0SGVkZXJhVG9rZW5JZEZyb21OYW1lLFxuICBnZXRIZWRlcmFUb2tlbk5hbWVGcm9tSWQsXG4gIGlzVG9rZW5UcmFuc2ZlcixcbiAgc3RyaW5naWZ5QWNjb3VudElkLFxuICBzdHJpbmdpZnlUb2tlbklkLFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEJpZ051bWJlciB9IGZyb20gJ2JpZ251bWJlci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUb2tlblRyYW5zZmVyQnVpbGRlciBleHRlbmRzIFRyYW5zZmVyQnVpbGRlciB7XG4gIHByaXZhdGUgX3Rva2VuTmFtZTsgLy8gY3VycmVudGx5IG9ubHkgc3VwcG9ydCAxIHRva2VuL3RyYW5zZmVyXG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICB0aGlzLl90eEJvZHlEYXRhLnRva2VuVHJhbnNmZXJzID0gdGhpcy5idWlsZFRva2VuVHJhbnNmZXJEYXRhKCk7IC8vIHNldCB0byBsaXN0IGJ5IHRoZSBjb250cmFjdFxuICAgIHJldHVybiBhd2FpdCBzdXBlci5idWlsZEltcGxlbWVudGF0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVG9rZW5UcmFuc2ZlckRhdGEoKTogcHJvdG8uSVRva2VuVHJhbnNmZXJMaXN0W10ge1xuICAgIGxldCB0b2tlblRyYW5zZmVyQW1vdW50ID0gbmV3IEJpZ051bWJlcigwKTsgLy8gdG90YWwgc2VuZCBhbW91bnQgZm9yIGVhY2ggdG9rZW5cbiAgICBjb25zdCB0b2tlbklkID0gZ2V0SGVkZXJhVG9rZW5JZEZyb21OYW1lKHRoaXMuX3Rva2VuTmFtZSk7XG4gICAgY29uc3QgdG9rZW5UcmFuc2ZlckRhdGE6IHByb3RvLklBY2NvdW50QW1vdW50W10gPSBbXG4gICAgICB7XG4gICAgICAgIGFjY291bnRJRDogYnVpbGRIZWRlcmFBY2NvdW50SUQodGhpcy5fc291cmNlLmFkZHJlc3MpLFxuICAgICAgICBhbW91bnQ6IExvbmcuZnJvbUludCgwKSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHRoaXMuX3JlY2lwaWVudHMuZm9yRWFjaCgocmVjaXBpZW50KSA9PiB7XG4gICAgICB0b2tlblRyYW5zZmVyQW1vdW50ID0gdG9rZW5UcmFuc2ZlckFtb3VudC5wbHVzKHJlY2lwaWVudC5hbW91bnQpO1xuICAgICAgdG9rZW5UcmFuc2ZlckRhdGEucHVzaChcbiAgICAgICAgeyBhY2NvdW50SUQ6IGJ1aWxkSGVkZXJhQWNjb3VudElEKHJlY2lwaWVudC5hZGRyZXNzKSwgYW1vdW50OiBMb25nLmZyb21TdHJpbmcocmVjaXBpZW50LmFtb3VudCkgfSAvLyByZWNpcGllbnRcbiAgICAgICk7XG4gICAgfSk7XG4gICAgdG9rZW5UcmFuc2ZlckRhdGFbMF0uYW1vdW50ID0gTG9uZy5mcm9tU3RyaW5nKHRva2VuVHJhbnNmZXJBbW91bnQudG9TdHJpbmcoKSkubmVnYXRlKCk7IC8vIHVwZGF0ZSBzZW5kZXIgc2VuZCBhbW91bnRcblxuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRva2VuOiBidWlsZEhlZGVyYVRva2VuSUQodG9rZW5JZCEpLFxuICAgICAgICB0cmFuc2ZlcnM6IHRva2VuVHJhbnNmZXJEYXRhLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGluaXRCdWlsZGVyKHR4OiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHN1cGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICBjb25zdCB0cmFuc2ZlckRhdGEgPSB0eC50eEJvZHkuY3J5cHRvVHJhbnNmZXIhO1xuICAgIGlmIChpc1Rva2VuVHJhbnNmZXIodHJhbnNmZXJEYXRhKSkge1xuICAgICAgdGhpcy5pbml0VG9rZW5UcmFuc2ZlcnModHJhbnNmZXJEYXRhLnRva2VuVHJhbnNmZXJzISk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIHRyYW5zZmVyIHNwZWNpZmljIGRhdGEsIGdldHRpbmcgdGhlIHJlY2lwaWVudCBhY2NvdW50XG4gICAqIHJlcHJlc2VudGVkIGJ5IHRoZSBlbGVtZW50IHdpdGggYSBwb3NpdGl2ZSBhbW91bnQgb24gdGhlIHRyYW5zZmVyIGVsZW1lbnQuXG4gICAqIFRoZSBuZWdhdGl2ZSBhbW91bnQgcmVwcmVzZW50cyB0aGUgc291cmNlIGFjY291bnQgc28gaXQncyBpZ25vcmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3Byb3RvLklBY2NvdW50QW1vdW50W119IHRyYW5zZmVycyBhcnJheSBvZiBvYmplY3RzIHdoaWNoIGNvbnRhaW5zIGFjY291bnRJRCBhbmQgdHJhbnNmZXJyZWQgYW1vdW50XG4gICAqL1xuICBwcm90ZWN0ZWQgaW5pdFRva2VuVHJhbnNmZXJzKHRva2VuVHJhbnNmZXJzOiBwcm90by5JVG9rZW5UcmFuc2Zlckxpc3RbXSk6IHZvaWQge1xuICAgIHRva2VuVHJhbnNmZXJzLmZvckVhY2goKHRva2VuVHJhbnNmZXI6IHByb3RvLklUb2tlblRyYW5zZmVyTGlzdCkgPT4ge1xuICAgICAgaWYgKCF0b2tlblRyYW5zZmVyLnRva2VuKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3NpbmcgdG9rZW4gaWQnKTtcbiAgICAgIH1cbiAgICAgIGlmICghdG9rZW5UcmFuc2Zlci50cmFuc2ZlcnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyB0cmFuc2ZlciBkYXRhJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRva2VuID0gZ2V0SGVkZXJhVG9rZW5OYW1lRnJvbUlkKHN0cmluZ2lmeVRva2VuSWQodG9rZW5UcmFuc2Zlci50b2tlbiEpKTtcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogaW52YWxpZCB0b2tlbiBpZCcpO1xuICAgICAgfVxuICAgICAgdG9rZW5UcmFuc2Zlci50cmFuc2ZlcnMuZm9yRWFjaCgodHJhbnNmZXJEYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IGFtb3VudCA9IExvbmcuZnJvbVZhbHVlKHRyYW5zZmVyRGF0YS5hbW91bnQhKTtcbiAgICAgICAgaWYgKGFtb3VudC5pc1Bvc2l0aXZlKCkpIHtcbiAgICAgICAgICB0aGlzLnNlbmQoe1xuICAgICAgICAgICAgYWRkcmVzczogc3RyaW5naWZ5QWNjb3VudElkKHRyYW5zZmVyRGF0YS5hY2NvdW50SUQhKSxcbiAgICAgICAgICAgIGFtb3VudDogYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbk5hbWU6IHRva2VuLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gcmVnaW9uIFRyYW5zZmVyIGZpZWxkc1xuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgc2VuZChyZWNpcGllbnQ6IFJlY2lwaWVudCk6IHRoaXMge1xuICAgIGlmICghcmVjaXBpZW50LnRva2VuTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJWYWx1ZUVycm9yKCdJbnZhbGlkIG1pc3NpbmcgdG9rZW4gbmFtZScpO1xuICAgIH1cbiAgICBjb25zdCB0b2tlbklkID0gZ2V0SGVkZXJhVG9rZW5JZEZyb21OYW1lKHJlY2lwaWVudC50b2tlbk5hbWUpO1xuICAgIGlmICghdG9rZW5JZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJWYWx1ZUVycm9yKGBJbnZhbGlkIHRva2VuIG5hbWU6ICR7cmVjaXBpZW50LnRva2VuTmFtZX1gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3Rva2VuTmFtZSAmJiB0aGlzLl90b2tlbk5hbWUgIT09IHJlY2lwaWVudC50b2tlbk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyVmFsdWVFcnJvcihgSW52YWxpZCB0b2tlbjogcmVjZWl2ZWQgJHtyZWNpcGllbnQudG9rZW5OYW1lfSBmb3IgJHt0aGlzLl90b2tlbk5hbWV9IHR4YCk7XG4gICAgfVxuICAgIHRoaXMuX3Rva2VuTmFtZSA9IHJlY2lwaWVudC50b2tlbk5hbWU7XG4gICAgcmV0dXJuIHN1cGVyLnNlbmQocmVjaXBpZW50KTtcbiAgfVxuICAvLyBlbmRyZWdpb25cbn1cbiJdfQ==

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


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