PHP WebShell
Текущая директория: /opt/BitGoJS/modules/bitgo/dist/test/v2/unit/coins/utxo/recovery
Просмотр файла: mock.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MockCrossChainRecoveryProvider = exports.MockRecoveryProvider = void 0;
/**
* @prettier
*/
const utxo_lib_1 = require("@bitgo/utxo-lib");
const utxolib = require("@bitgo/utxo-lib");
const sdk_coin_bch_1 = require("@bitgo/sdk-coin-bch");
const sdk_coin_bsv_1 = require("@bitgo/sdk-coin-bsv");
class MockRecoveryProvider {
constructor(unspents) {
this.unspents = unspents;
this.prevTxCache = {};
this.unspents.forEach((u) => {
if (utxolib.bitgo.isUnspentWithPrevTx(u)) {
const { txid } = utxo_lib_1.bitgo.parseOutputId(u.id);
this.prevTxCache[txid] = u.prevTx.toString('hex');
}
});
}
async getAddressInfo(address) {
const u = this.unspents.find((u) => u.address === address);
return {
txCount: u ? 1 : 0,
balance: u ? Number(u.value) : 0,
};
}
async getUnspentsForAddresses(addresses) {
return this.unspents
.filter((u) => addresses.includes(u.address))
.map((u) => ({
id: u.id,
address: u.address,
value: Number(u.value),
}));
}
async getTransactionHex(txid) {
return this.prevTxCache[txid];
}
getTransactionInputs(txid) {
throw new Error(`not implemented`);
}
getTransactionIO(txid) {
throw new Error(`not implemented`);
}
}
exports.MockRecoveryProvider = MockRecoveryProvider;
class MockCrossChainRecoveryProvider {
constructor(coin, unspents, tx) {
this.coin = coin;
this.unspents = unspents;
this.tx = tx;
// this is how blockchair will return the data, as a cashaddr for BCH like coins
// BSV supports cashaddr, but at the time of writing the SDK does not support cashaddr for bsv
this.addressFormat = this.coin instanceof sdk_coin_bch_1.Bch && !(this.coin instanceof sdk_coin_bsv_1.Bsv) ? 'cashaddr' : 'default';
this.addressVersion = this.coin instanceof sdk_coin_bch_1.Bch && !(this.coin instanceof sdk_coin_bsv_1.Bsv) ? 'cashaddr' : 'base58';
}
async getUnspentsForAddresses(addresses) {
return this.tx.outs.map((o, vout) => {
let address = utxolib.addressFormat.fromOutputScriptWithFormat(o.script, this.addressFormat, this.coin.network);
if (address.includes(':')) {
[, address] = address.split(':');
}
return {
id: `${this.tx?.getId()}:${vout}`,
address,
value: Number(o.value),
valueString: this.coin.amountType === 'bigint' ? o.value.toString() : undefined,
};
});
}
async getTransactionIO(txid) {
const payload = {
inputs: this.unspents.map((u) => {
// imitate how blockchair returns data
let address = this.coin.canonicalAddress(u.address, this.addressVersion);
if (address.includes(':')) {
[, address] = address.split(':');
}
return {
address,
};
}),
outputs: this.tx.outs.map((o) => {
let address = utxolib.addressFormat.fromOutputScriptWithFormat(o.script, this.addressFormat, this.coin.network);
if (address.includes(':')) {
[, address] = address.split(':');
}
return {
address,
};
}),
};
return payload;
}
async getAddressInfo(address) {
throw new Error(`not implemented`);
}
async getTransactionHex(txid) {
throw new Error(`not implemented`);
}
getTransactionInputs(txid) {
throw new Error(`not implemented`);
}
}
exports.MockCrossChainRecoveryProvider = MockCrossChainRecoveryProvider;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Rlc3QvdjIvdW5pdC9jb2lucy91dHhvL3JlY292ZXJ5L21vY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCw4Q0FBd0M7QUFHeEMsMkNBQTJDO0FBQzNDLHNEQUEwQztBQUMxQyxzREFBMEM7QUFHMUMsTUFBYSxvQkFBb0I7SUFFL0IsWUFBbUIsUUFBMkI7UUFBM0IsYUFBUSxHQUFSLFFBQVEsQ0FBbUI7UUFEdEMsZ0JBQVcsR0FBMkIsRUFBRSxDQUFDO1FBRS9DLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxnQkFBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBZTtRQUNsQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsQ0FBQztRQUMzRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxD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QUFDLElBQVk7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxJQUFZO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0NBQ0Y7QUFqRUQsd0VBaUVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IHsgYml0Z28gfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgQWRkcmVzc0luZm8sIFRyYW5zYWN0aW9uSU8gfSBmcm9tICdAYml0Z28vYmxvY2thcGlzJztcbmltcG9ydCB7IEFic3RyYWN0VXR4b0NvaW4sIFJlY292ZXJ5UHJvdmlkZXIgfSBmcm9tICdAYml0Z28vYWJzdHJhY3QtdXR4byc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBCY2ggfSBmcm9tICdAYml0Z28vc2RrLWNvaW4tYmNoJztcbmltcG9ydCB7IEJzdiB9IGZyb20gJ0BiaXRnby9zZGstY29pbi1ic3YnO1xuXG50eXBlIFVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gPSBiaXRnby5VbnNwZW50PFROdW1iZXI+O1xuZXhwb3J0IGNsYXNzIE1vY2tSZWNvdmVyeVByb3ZpZGVyIGltcGxlbWVudHMgUmVjb3ZlcnlQcm92aWRlciB7XG4gIHByaXZhdGUgcHJldlR4Q2FjaGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3RydWN0b3IocHVibGljIHVuc3BlbnRzOiBVbnNwZW50PGJpZ2ludD5bXSkge1xuICAgIHRoaXMudW5zcGVudHMuZm9yRWFjaCgodSkgPT4ge1xuICAgICAgaWYgKHV0eG9saWIuYml0Z28uaXNVbnNwZW50V2l0aFByZXZUeCh1KSkge1xuICAgICAgICBjb25zdCB7IHR4aWQgfSA9IGJpdGdvLnBhcnNlT3V0cHV0SWQodS5pZCk7XG4gICAgICAgIHRoaXMucHJldlR4Q2FjaGVbdHhpZF0gPSB1LnByZXZUeC50b1N0cmluZygnaGV4Jyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgYXN5bmMgZ2V0QWRkcmVzc0luZm8oYWRkcmVzczogc3RyaW5nKTogUHJvbWlzZTxBZGRyZXNzSW5mbz4ge1xuICAgIGNvbnN0IHUgPSB0aGlzLnVuc3BlbnRzLmZpbmQoKHUpID0+IHUuYWRkcmVzcyA9PT0gYWRkcmVzcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR4Q291bnQ6IHUgPyAxIDogMCxcbiAgICAgIGJhbGFuY2U6IHUgPyBOdW1iZXIodS52YWx1ZSkgOiAwLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBnZXRVbnNwZW50c0ZvckFkZHJlc3NlcyhhZGRyZXNzZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxVbnNwZW50W10+IHtcbiAgICByZXR1cm4gdGhpcy51bnNwZW50c1xuICAgICAgLmZpbHRlcigodSkgPT4gYWRkcmVzc2VzLmluY2x1ZGVzKHUuYWRkcmVzcykpXG4gICAgICAubWFwKCh1KSA9PiAoe1xuICAgICAgICBpZDogdS5pZCxcbiAgICAgICAgYWRkcmVzczogdS5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogTnVtYmVyKHUudmFsdWUpLFxuICAgICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgZ2V0VHJhbnNhY3Rpb25IZXgodHhpZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5wcmV2VHhDYWNoZVt0eGlkXTtcbiAgfVxuXG4gIGdldFRyYW5zYWN0aW9uSW5wdXRzKHR4aWQ6IHN0cmluZyk6IFByb21pc2U8VW5zcGVudFtdPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxuXG4gIGdldFRyYW5zYWN0aW9uSU8odHhpZDogc3RyaW5nKTogUHJvbWlzZTxUcmFuc2FjdGlvbklPPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIE1vY2tDcm9zc0NoYWluUmVjb3ZlcnlQcm92aWRlcjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PiBpbXBsZW1lbnRzIFJlY292ZXJ5UHJvdmlkZXIge1xuICBwcml2YXRlIGFkZHJlc3NWZXJzaW9uOiAnY2FzaGFkZHInIHwgJ2Jhc2U1OCc7XG4gIHByaXZhdGUgYWRkcmVzc0Zvcm1hdDogdXR4b2xpYi5hZGRyZXNzRm9ybWF0LkFkZHJlc3NGb3JtYXQ7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICAgIHB1YmxpYyB1bnNwZW50czogVW5zcGVudDxUTnVtYmVyPltdLFxuICAgIHB1YmxpYyB0eDogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248VE51bWJlcj5cbiAgKSB7XG4gICAgLy8gdGhpcyBpcyBob3cgYmxvY2tjaGFpciB3aWxsIHJldHVybiB0aGUgZGF0YSwgYXMgYSBjYXNoYWRkciBmb3IgQkNIIGxpa2UgY29pbnNcbiAgICAvLyBCU1Ygc3VwcG9ydHMgY2FzaGFkZHIsIGJ1dCBhdCB0aGUgdGltZSBvZiB3cml0aW5nIHRoZSBTREsgZG9lcyBub3Qgc3VwcG9ydCBjYXNoYWRkciBmb3IgYnN2XG4gICAgdGhpcy5hZGRyZXNzRm9ybWF0ID0gdGhpcy5jb2luIGluc3RhbmNlb2YgQmNoICYmICEodGhpcy5jb2luIGluc3RhbmNlb2YgQnN2KSA/ICdjYXNoYWRkcicgOiAnZGVmYXVsdCc7XG4gICAgdGhpcy5hZGRyZXNzVmVyc2lvbiA9IHRoaXMuY29pbiBpbnN0YW5jZW9mIEJjaCAmJiAhKHRoaXMuY29pbiBpbnN0YW5jZW9mIEJzdikgPyAnY2FzaGFkZHInIDogJ2Jhc2U1OCc7XG4gIH1cblxuICBhc3luYyBnZXRVbnNwZW50c0ZvckFkZHJlc3NlcyhhZGRyZXNzZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxVbnNwZW50W10+IHtcbiAgICByZXR1cm4gdGhpcy50eC5vdXRzLm1hcCgobywgdm91dDogbnVtYmVyKSA9PiB7XG4gICAgICBsZXQgYWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzc0Zvcm1hdC5mcm9tT3V0cHV0U2NyaXB0V2l0aEZvcm1hdChvLnNjcmlwdCwgdGhpcy5hZGRyZXNzRm9ybWF0LCB0aGlzLmNvaW4ubmV0d29yayk7XG4gICAgICBpZiAoYWRkcmVzcy5pbmNsdWRlcygnOicpKSB7XG4gICAgICAgIFssIGFkZHJlc3NdID0gYWRkcmVzcy5zcGxpdCgnOicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGAke3RoaXMudHg/LmdldElkKCl9OiR7dm91dH1gLFxuICAgICAgICBhZGRyZXNzLFxuICAgICAgICB2YWx1ZTogTnVtYmVyKG8udmFsdWUpLFxuICAgICAgICB2YWx1ZVN0cmluZzogdGhpcy5jb2luLmFtb3VudFR5cGUgPT09ICdiaWdpbnQnID8gby52YWx1ZS50b1N0cmluZygpIDogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGdldFRyYW5zYWN0aW9uSU8odHhpZDogc3RyaW5nKTogUHJvbWlzZTxUcmFuc2FjdGlvbklPPiB7XG4gICAgY29uc3QgcGF5bG9hZDogVHJhbnNhY3Rpb25JTyA9IHtcbiAgICAgIGlucHV0czogdGhpcy51bnNwZW50cy5tYXAoKHUpID0+IHtcbiAgICAgICAgLy8gaW1pdGF0ZSBob3cgYmxvY2tjaGFpciByZXR1cm5zIGRhdGFcbiAgICAgICAgbGV0IGFkZHJlc3MgPSB0aGlzLmNvaW4uY2Fub25pY2FsQWRkcmVzcyh1LmFkZHJlc3MsIHRoaXMuYWRkcmVzc1ZlcnNpb24pO1xuICAgICAgICBpZiAoYWRkcmVzcy5pbmNsdWRlcygnOicpKSB7XG4gICAgICAgICAgWywgYWRkcmVzc10gPSBhZGRyZXNzLnNwbGl0KCc6Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhZGRyZXNzLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgICBvdXRwdXRzOiB0aGlzLnR4Lm91dHMubWFwKChvKSA9PiB7XG4gICAgICAgIGxldCBhZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzRm9ybWF0LmZyb21PdXRwdXRTY3JpcHRXaXRoRm9ybWF0KG8uc2NyaXB0LCB0aGlzLmFkZHJlc3NGb3JtYXQsIHRoaXMuY29pbi5uZXR3b3JrKTtcbiAgICAgICAgaWYgKGFkZHJlc3MuaW5jbHVkZXMoJzonKSkge1xuICAgICAgICAgIFssIGFkZHJlc3NdID0gYWRkcmVzcy5zcGxpdCgnOicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWRkcmVzcyxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgIH07XG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICBhc3luYyBnZXRBZGRyZXNzSW5mbyhhZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPEFkZHJlc3NJbmZvPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxuXG4gIGFzeW5jIGdldFRyYW5zYWN0aW9uSGV4KHR4aWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxuXG4gIGdldFRyYW5zYWN0aW9uSW5wdXRzKHR4aWQ6IHN0cmluZyk6IFByb21pc2U8VW5zcGVudDxUTnVtYmVyPltdPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxufVxuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!