PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-icp/dist/src/lib
Просмотр файла: unsignedTransactionBuilder.js
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.UnsignedTransactionBuilder = void 0;
const iface_1 = require("./iface");
const utils_1 = __importDefault(require("./utils"));
class UnsignedTransactionBuilder {
constructor(icpTransactionPayload) {
this._icpTransactionPayload = icpTransactionPayload;
}
async getUnsignedTransaction() {
// interval value can be altered here to change the count of ingressExpiries which eventually changes the number of interval value can be altered here to change the count of ingressExpiries which eventually changes the number of payloads that needs to be signed
const interval = Number(this._icpTransactionPayload.metadata.ingress_end) -
Number(this._icpTransactionPayload.metadata.ingress_start); // 300s in nanoseconds
const ingressExpiries = this.getIngressExpiries(this._icpTransactionPayload.metadata.ingress_start, this._icpTransactionPayload.metadata.ingress_end, interval);
const sendArgs = this.getSendArgs(this._icpTransactionPayload.metadata.memo, this._icpTransactionPayload.metadata.created_at_time, this._icpTransactionPayload.operations[1].amount.value, this._icpTransactionPayload.operations[2].amount.value, this._icpTransactionPayload.operations[1].account.address);
const update = await this.getUpdate(sendArgs, this._icpTransactionPayload.public_keys[0].hex_bytes);
const updates = [];
updates.push([iface_1.OperationType.TRANSACTION, update]);
const txn = { updates: updates, ingress_expiries: ingressExpiries };
const unsignedTransaction = utils_1.default.cborEncode(txn);
const payloads = [];
this.getPayloads(payloads, ingressExpiries, this._icpTransactionPayload.operations[0].account.address, update);
const payloadsData = {
payloads: payloads,
unsigned_transaction: unsignedTransaction,
};
return payloadsData;
}
getPayloads(payloads, ingressExpiries, accountAddress, update) {
if (ingressExpiries.length != 1) {
throw new Error('ingress expiry can have only one entry');
}
const ingressExpiry = ingressExpiries[0];
const clonedUpdate = {
canister_id: Buffer.from(update.canister_id),
method_name: update.method_name,
arg: update.arg,
sender: update.sender,
ingress_expiry: ingressExpiry,
};
const representationIndependentHash = utils_1.default.HttpCanisterUpdateRepresentationIndependentHash(clonedUpdate);
const transactionPayload = {
hex_bytes: utils_1.default.blobToHex(utils_1.default.makeSignatureData(representationIndependentHash)),
account_identifier: { address: accountAddress },
signature_type: iface_1.SignatureType.ECDSA,
};
payloads.push(transactionPayload);
return payloads;
}
getIngressExpiries(ingressStartTime, ingressEndTime, interval) {
const ingressExpiries = [];
for (let now = Number(ingressStartTime); now < Number(ingressEndTime); now += interval) {
const ingressExpiry = BigInt(now + (iface_1.MAX_INGRESS_TTL - iface_1.PERMITTED_DRIFT));
ingressExpiries.push(ingressExpiry);
}
return ingressExpiries;
}
getSendArgs(memo, created_at_time, amount, fee, receiver) {
const sendArgs = {
payment: { receiverGets: { e8s: Number(amount) } },
maxFee: { e8s: -Number(fee) },
to: { hash: Buffer.from(receiver, 'hex') },
createdAtTime: { timestampNanos: Number(created_at_time) },
memo: { memo: memo },
};
return sendArgs;
}
async getUpdate(sendArgs, publicKeyHex) {
const principalId = utils_1.default.getPrincipalIdFromPublicKey(publicKeyHex).toUint8Array();
const senderBlob = Buffer.from(principalId);
const canisterIdBuffer = Buffer.from(iface_1.LEDGER_CANISTER_ID);
const args = await utils_1.default.toArg(sendArgs);
const update = {
canister_id: canisterIdBuffer,
method_name: iface_1.MethodName.SEND_PB,
arg: args,
sender: senderBlob,
ingress_expiry: 0n,
};
return update;
}
}
exports.UnsignedTransactionBuilder = UnsignedTransactionBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zaWduZWRUcmFuc2FjdGlvbkJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Vuc2lnbmVkVHJhbnNhY3Rpb25CdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1DQVlpQjtBQUNqQixvREFBNEI7QUFFNUIsTUFBYSwwQkFBMEI7SUFFckMsWUFBWSxxQkFBcUM7UUFDL0MsSUFBSSxDQUFDLHNCQUFzQixHQUFHLHFCQUFxQixDQUFDO0lBQ3RELENBQUM7SUFFRCxLQUFLLENBQUMsc0JBQXNCO1FBQzFCLHFRQUFxUTtRQUNyUSxNQUFNLFFBQVEsR0FDWixNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7WUFDeEQsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxzQkFBc0I7UUFDcEYsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUM3QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLGFBQWMsRUFDbkQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxXQUFZLEVBQ2pELFFBQVEsQ0FDVCxDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FDL0IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQ3pDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUNwRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQ3RELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFDdEQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENB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bixcbiAgU2VuZEFyZ3MsXG4gIEh0dHBDYW5pc3RlclVwZGF0ZSxcbiAgU2lnbmluZ1BheWxvYWQsXG4gIFBheWxvYWRzRGF0YSxcbiAgU2lnbmF0dXJlVHlwZSxcbiAgT3BlcmF0aW9uVHlwZSxcbiAgTWV0aG9kTmFtZSxcbiAgTUFYX0lOR1JFU1NfVFRMLFxuICBQRVJNSVRURURfRFJJRlQsXG4gIExFREdFUl9DQU5JU1RFUl9JRCxcbn0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBVbnNpZ25lZFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByaXZhdGUgX2ljcFRyYW5zYWN0aW9uUGF5bG9hZDogSWNwVHJhbnNhY3Rpb247XG4gIGNvbnN0cnVjdG9yKGljcFRyYW5zYWN0aW9uUGF5bG9hZDogSWNwVHJhbnNhY3Rpb24pIHtcbiAgICB0aGlzLl9pY3BUcmFuc2FjdGlvblBheWxvYWQgPSBpY3BUcmFuc2FjdGlvblBheWxvYWQ7XG4gIH1cblxuICBhc3luYyBnZXRVbnNpZ25lZFRyYW5zYWN0aW9uKCk6IFByb21pc2U8UGF5bG9hZHNEYXRhPiB7XG4gICAgLy8gaW50ZXJ2YWwgdmFsdWUgY2FuIGJlIGFsdGVyZWQgaGVyZSB0byBjaGFuZ2UgdGhlIGNvdW50IG9mIGluZ3Jlc3NFeHBpcmllcyB3aGljaCBldmVudHVhbGx5IGNoYW5nZXMgdGhlIG51bWJlciBvZiBpbnRlcnZhbCB2YWx1ZSBjYW4gYmUgYWx0ZXJlZCBoZXJlIHRvIGNoYW5nZSB0aGUgY291bnQgb2YgaW5ncmVzc0V4cGlyaWVzIHdoaWNoIGV2ZW50dWFsbHkgY2hhbmdlcyB0aGUgbnVtYmVyIG9mIHBheWxvYWRzIHRoYXQgbmVlZHMgdG8gYmUgc2lnbmVkXG4gICAgY29uc3QgaW50ZXJ2YWwgPVxuICAgICAgTnVtYmVyKHRoaXMuX2ljcFRyYW5zYWN0aW9uUGF5bG9hZC5tZXRhZGF0YS5pbmdyZXNzX2VuZCkgLVxuICAgICAgTnVtYmVyKHRoaXMuX2ljcFRyYW5zYWN0aW9uUGF5bG9hZC5tZXRhZGF0YS5pbmdyZXNzX3N0YXJ0KTsgLy8gMzAwcyBpbiBuYW5vc2Vjb25kc1xuICAgIGNvbnN0IGluZ3Jlc3NFeHBpcmllcyA9IHRoaXMuZ2V0SW5ncmVzc0V4cGlyaWVzKFxuICAgICAgdGhpcy5faWNwVHJhbnNhY3Rpb25QYXlsb2FkLm1ldGFkYXRhLmluZ3Jlc3Nfc3RhcnQhLFxuICAgICAgdGhpcy5faWNwVHJhbnNhY3Rpb25QYXlsb2FkLm1ldGFkYXRhLmluZ3Jlc3NfZW5kISxcbiAgICAgIGludGVydmFsXG4gICAgKTtcbiAgICBjb25zdCBzZW5kQXJncyA9IHRoaXMuZ2V0U2VuZEFyZ3MoXG4gICAgICB0aGlzLl9pY3BUcmFuc2FjdGlvblBheWxvYWQubWV0YWRhdGEubWVtbyxcbiAgICAgIHRoaXMuX2ljcFRyYW5zYWN0aW9uUGF5bG9hZC5tZXRhZGF0YS5jcmVhdGVkX2F0X3RpbWUsXG4gICAgICB0aGlzLl9pY3BUcmFuc2FjdGlvblBheWxvYWQub3BlcmF0aW9uc1sxXS5hbW91bnQudmFsdWUsXG4gICAgICB0aGlzLl9pY3BUcmFuc2FjdGlvblBheWxvYWQub3BlcmF0aW9uc1syXS5hbW91bnQudmFsdWUsXG4gICAgICB0aGlzLl9pY3BUcmFuc2FjdGlvblBheWxvYWQub3BlcmF0aW9uc1sxXS5hY2NvdW50LmFkZHJlc3NcbiAgICApO1xuICAgIGNvbnN0IHVwZGF0ZSA9IGF3YWl0IHRoaXMuZ2V0VXBkYXRlKHNlbmRBcmdzLCB0aGlzLl9pY3BUcmFuc2FjdGlvblBheWxvYWQucHVibGljX2tleXNbMF0uaGV4X2J5dGVzKTtcbiAgICBjb25zdCB1cGRhdGVzOiBbc3RyaW5nLCBIdHRwQ2FuaXN0ZXJVcGRhdGVdW10gPSBbXTtcbiAgICB1cGRhdGVzLnB1c2goW09wZXJhdGlvblR5cGUuVFJBTlNBQ1RJT04sIHVwZGF0ZV0pO1xuICAgIGNvbnN0IHR4biA9IHsgdXBkYXRlczogdXBkYXRlcywgaW5ncmVzc19leHBpcmllczogaW5ncmVzc0V4cGlyaWVzIH07XG4gICAgY29uc3QgdW5zaWduZWRUcmFuc2FjdGlvbiA9IHV0aWxzLmNib3JFbmNvZGUodHhuKTtcbiAgICBjb25zdCBwYXlsb2FkczogU2lnbmluZ1BheWxvYWRbXSA9IFtdO1xuICAgIHRoaXMuZ2V0UGF5bG9hZHMocGF5bG9hZHMsIGluZ3Jlc3NFeHBpcmllcywgdGhpcy5faWNwVHJhbnNhY3Rpb25QYXlsb2FkLm9wZXJhdGlvbnNbMF0uYWNjb3VudC5hZGRyZXNzLCB1cGRhdGUpO1xuICAgIGNvbnN0IHBheWxvYWRzRGF0YSA9IHtcbiAgICAgIHBheWxvYWRzOiBwYXlsb2FkcyxcbiAgICAgIHVuc2lnbmVkX3RyYW5zYWN0aW9uOiB1bnNpZ25lZFRyYW5zYWN0aW9uLFxuICAgIH07XG4gICAgcmV0dXJuIHBheWxvYWRzRGF0YTtcbiAgfVxuXG4gIGdldFBheWxvYWRzKFxuICAgIHBheWxvYWRzOiBTaWduaW5nUGF5bG9hZFtdLFxuICAgIGluZ3Jlc3NFeHBpcmllczogYmlnaW50W10sXG4gICAgYWNjb3VudEFkZHJlc3M6IHN0cmluZyxcbiAgICB1cGRhdGU6IEh0dHBDYW5pc3RlclVwZGF0ZVxuICApOiBTaWduaW5nUGF5bG9hZFtdIHtcbiAgICBpZiAoaW5ncmVzc0V4cGlyaWVzLmxlbmd0aCAhPSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2luZ3Jlc3MgZXhwaXJ5IGNhbiBoYXZlIG9ubHkgb25lIGVudHJ5Jyk7XG4gICAgfVxuICAgIGNvbnN0IGluZ3Jlc3NFeHBpcnkgPSBpbmdyZXNzRXhwaXJpZXNbMF07XG4gICAgY29uc3QgY2xvbmVkVXBkYXRlOiBIdHRwQ2FuaXN0ZXJVcGRhdGUgPSB7XG4gICAgICBjYW5pc3Rlcl9pZDogQnVmZmVyLmZyb20odXBkYXRlLmNhbmlzdGVyX2lkKSxcbiAgICAgIG1ldGhvZF9uYW1lOiB1cGRhdGUubWV0aG9kX25hbWUsXG4gICAgICBhcmc6IHVwZGF0ZS5hcmcsXG4gICAgICBzZW5kZXI6IHVwZGF0ZS5zZW5kZXIsXG4gICAgICBpbmdyZXNzX2V4cGlyeTogaW5ncmVzc0V4cGlyeSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVwcmVzZW50YXRpb25JbmRlcGVuZGVudEhhc2ggPSB1dGlscy5IdHRwQ2FuaXN0ZXJVcGRhdGVSZXByZXNlbnRhdGlvbkluZGVwZW5kZW50SGFzaChjbG9uZWRVcGRhdGUpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uUGF5bG9hZDogU2lnbmluZ1BheWxvYWQgPSB7XG4gICAgICBoZXhfYnl0ZXM6IHV0aWxzLmJsb2JUb0hleCh1dGlscy5tYWtlU2lnbmF0dXJlRGF0YShyZXByZXNlbnRhdGlvbkluZGVwZW5kZW50SGFzaCkpLFxuICAgICAgYWNjb3VudF9pZGVudGlmaWVyOiB7IGFkZHJlc3M6IGFjY291bnRBZGRyZXNzIH0sXG4gICAgICBzaWduYXR1cmVfdHlwZTogU2lnbmF0dXJlVHlwZS5FQ0RTQSxcbiAgICB9O1xuICAgIHBheWxvYWRzLnB1c2godHJhbnNhY3Rpb25QYXlsb2FkKTtcbiAgICByZXR1cm4gcGF5bG9hZHM7XG4gIH1cblxuICBnZXRJbmdyZXNzRXhwaXJpZXMoaW5ncmVzc1N0YXJ0VGltZTogbnVtYmVyIHwgQmlnSW50LCBpbmdyZXNzRW5kVGltZTogbnVtYmVyIHwgQmlnSW50LCBpbnRlcnZhbDogbnVtYmVyKTogYmlnaW50W10ge1xuICAgIGNvbnN0IGluZ3Jlc3NFeHBpcmllczogYmlnaW50W10gPSBbXTtcblxuICAgIGZvciAobGV0IG5vdyA9IE51bWJlcihpbmdyZXNzU3RhcnRUaW1lKTsgbm93IDwgTnVtYmVyKGluZ3Jlc3NFbmRUaW1lKTsgbm93ICs9IGludGVydmFsKSB7XG4gICAgICBjb25zdCBpbmdyZXNzRXhwaXJ5ID0gQmlnSW50KG5vdyArIChNQVhfSU5HUkVTU19UVEwgLSBQRVJNSVRURURfRFJJRlQpKTtcbiAgICAgIGluZ3Jlc3NFeHBpcmllcy5wdXNoKGluZ3Jlc3NFeHBpcnkpO1xuICAgIH1cblxuICAgIHJldHVybiBpbmdyZXNzRXhwaXJpZXM7XG4gIH1cblxuICBnZXRTZW5kQXJncyhtZW1vOiBudW1iZXIgfCBCaWdJbnQsIGNyZWF0ZWRfYXRfdGltZTogbnVtYmVyLCBhbW91bnQ6IHN0cmluZywgZmVlOiBzdHJpbmcsIHJlY2VpdmVyOiBzdHJpbmcpOiBTZW5kQXJncyB7XG4gICAgY29uc3Qgc2VuZEFyZ3M6IFNlbmRBcmdzID0ge1xuICAgICAgcGF5bWVudDogeyByZWNlaXZlckdldHM6IHsgZThzOiBOdW1iZXIoYW1vdW50KSB9IH0sXG4gICAgICBtYXhGZWU6IHsgZThzOiAtTnVtYmVyKGZlZSkgfSxcbiAgICAgIHRvOiB7IGhhc2g6IEJ1ZmZlci5mcm9tKHJlY2VpdmVyLCAnaGV4JykgfSxcbiAgICAgIGNyZWF0ZWRBdFRpbWU6IHsgdGltZXN0YW1wTmFub3M6IE51bWJlcihjcmVhdGVkX2F0X3RpbWUpIH0sXG4gICAgICBtZW1vOiB7IG1lbW86IG1lbW8gfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHNlbmRBcmdzO1xuICB9XG5cbiAgYXN5bmMgZ2V0VXBkYXRlKHNlbmRBcmdzOiBTZW5kQXJncywgcHVibGljS2V5SGV4OiBzdHJpbmcpOiBQcm9taXNlPEh0dHBDYW5pc3RlclVwZGF0ZT4ge1xuICAgIGNvbnN0IHByaW5jaXBhbElkID0gdXRpbHMuZ2V0UHJpbmNpcGFsSWRGcm9tUHVibGljS2V5KHB1YmxpY0tleUhleCkudG9VaW50OEFycmF5KCk7XG4gICAgY29uc3Qgc2VuZGVyQmxvYiA9IEJ1ZmZlci5mcm9tKHByaW5jaXBhbElkKTtcbiAgICBjb25zdCBjYW5pc3RlcklkQnVmZmVyID0gQnVmZmVyLmZyb20oTEVER0VSX0NBTklTVEVSX0lEKTtcbiAgICBjb25zdCBhcmdzID0gYXdhaXQgdXRpbHMudG9Bcmcoc2VuZEFyZ3MpO1xuICAgIGNvbnN0IHVwZGF0ZTogSHR0cENhbmlzdGVyVXBkYXRlID0ge1xuICAgICAgY2FuaXN0ZXJfaWQ6IGNhbmlzdGVySWRCdWZmZXIsXG4gICAgICBtZXRob2RfbmFtZTogTWV0aG9kTmFtZS5TRU5EX1BCLFxuICAgICAgYXJnOiBhcmdzLFxuICAgICAgc2VuZGVyOiBzZW5kZXJCbG9iLFxuICAgICAgaW5ncmVzc19leHBpcnk6IDBuLFxuICAgIH07XG4gICAgcmV0dXJuIHVwZGF0ZTtcbiAgfVxufVxuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!