sarga-cardano-wallet-js-dist/models/multisig-transaction.js

194 lines
10 KiB
JavaScript
Raw Permalink Normal View History

2023-08-07 23:20:23 +00:00
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MultisigTransaction = void 0;
var cardano_serialization_lib_nodejs_1 = require("@emurgo/cardano-serialization-lib-nodejs");
var utils_1 = require("../utils");
var MultisigTransaction = /** @class */ (function () {
function MultisigTransaction() {
this.vkeyWitnesses = cardano_serialization_lib_nodejs_1.Vkeywitnesses.new();
this.nativeScripts = cardano_serialization_lib_nodejs_1.NativeScripts.new();
}
MultisigTransaction.new = function (coinSelection, txBody, scripts, privateKeys, numberOfWitnesses, config, encoding, metadata, tokens) {
var multisig = new MultisigTransaction();
multisig.metadata = metadata;
scripts.forEach(function (s) {
multisig.nativeScripts.add(s);
});
multisig.txBody = multisig.adjustFee(txBody, coinSelection, tokens, numberOfWitnesses, config, encoding);
multisig.txHash = cardano_serialization_lib_nodejs_1.hash_transaction(multisig.txBody);
privateKeys.forEach(function (prvKey) {
// add keyhash witnesses
var vkeyWitness = cardano_serialization_lib_nodejs_1.make_vkey_witness(multisig.txHash, prvKey);
multisig.vkeyWitnesses.add(vkeyWitness);
});
return multisig;
};
MultisigTransaction.prototype.addKeyWitnesses = function () {
var _this = this;
var privateKeys = [];
for (var _i = 0; _i < arguments.length; _i++) {
privateKeys[_i] = arguments[_i];
}
privateKeys.forEach(function (prvKey) {
// add keyhash witnesses
var vkeyWitness = cardano_serialization_lib_nodejs_1.make_vkey_witness(_this.txHash, prvKey);
_this.vkeyWitnesses.add(vkeyWitness);
});
};
MultisigTransaction.prototype.adjustFee = function (txBody, coinSelection, tokens, numberOfWitnesses, config, encoding) {
var bodyFee = parseInt(txBody.fee().to_str());
var tx = this.fakeTx(txBody, numberOfWitnesses);
var txFee = this.txFee(tx, config);
console.log("Fees: initial = " + bodyFee + ", adjusted = " + txFee);
if (txFee < bodyFee) {
var feeDiff = bodyFee - txFee;
var feeDiffPerChange_1 = Math.ceil(feeDiff / coinSelection.change.length);
var change = coinSelection.change.map(function (c) {
c.amount.quantity += feeDiffPerChange_1;
return c;
});
var outputs = coinSelection.outputs.map(function (output) {
var address = cardano_serialization_lib_nodejs_1.Address.from_bech32(output.address);
var amount = cardano_serialization_lib_nodejs_1.Value.new(cardano_serialization_lib_nodejs_1.BigNum.from_str(output.amount.quantity.toString()));
// add tx assets
if (output.assets && output.assets.length > 0) {
var multiAsset = utils_1.Seed.buildMultiAssets(output.assets, encoding);
amount.set_multiasset(multiAsset);
}
return cardano_serialization_lib_nodejs_1.TransactionOutput.new(address, amount);
});
outputs.push.apply(outputs, change.map(function (ch) {
var address = cardano_serialization_lib_nodejs_1.Address.from_bech32(ch.address);
var amount = cardano_serialization_lib_nodejs_1.Value.new(cardano_serialization_lib_nodejs_1.BigNum.from_str(ch.amount.quantity.toString()));
// add tx assets
if (ch.assets && ch.assets.length > 0) {
var multiAsset = utils_1.Seed.buildMultiAssets(ch.assets, encoding);
amount.set_multiasset(multiAsset);
}
return cardano_serialization_lib_nodejs_1.TransactionOutput.new(address, amount);
}));
var txOutputs_1 = cardano_serialization_lib_nodejs_1.TransactionOutputs.new();
outputs.forEach(function (txout) { return txOutputs_1.add(txout); });
console.log("Final change:", change);
var body = cardano_serialization_lib_nodejs_1.TransactionBody.new(txBody.inputs(), txOutputs_1, cardano_serialization_lib_nodejs_1.BigNum.from_str(txFee.toString()), txBody.ttl());
// metadata
if (this.metadata) {
var dataHash = cardano_serialization_lib_nodejs_1.hash_auxiliary_data(this.metadata);
body.set_auxiliary_data_hash(dataHash);
}
// mint tokens
if (tokens) {
var mint = utils_1.Seed.buildTransactionMint(tokens, encoding);
body.set_mint(mint);
}
// set tx validity start interval
body.set_validity_start_interval(txBody.validity_start_interval());
return body;
}
else {
return txBody;
}
};
MultisigTransaction.prototype.build = function () {
var witnesses = cardano_serialization_lib_nodejs_1.TransactionWitnessSet.new();
witnesses.set_vkeys(this.vkeyWitnesses);
if (this.nativeScripts.len() > 0) {
witnesses.set_native_scripts(this.nativeScripts);
}
var tx = cardano_serialization_lib_nodejs_1.Transaction.new(this.txBody, witnesses, this.metadata);
return Buffer.from(tx.to_bytes()).toString("hex");
};
MultisigTransaction.prototype.toBytes = function () {
var _this = this;
var encoder = new TextEncoder();
var keys = Array.from(Array(this.vkeyWitnesses.len()).keys())
.map(function (i) { return _this.vkeyWitnesses.get(i).to_bytes(); })
.map(function (k) { return MultisigTransaction.buff2hex(k); });
var scripts = Array.from(Array(this.nativeScripts.len()).keys())
.map(function (i) { return _this.nativeScripts.get(i).to_bytes(); })
.map(function (s) { return MultisigTransaction.buff2hex(s); });
var data = {
body: MultisigTransaction.buff2hex(this.txBody.to_bytes()),
keys: keys,
scripts: scripts,
metadata: this.metadata
? MultisigTransaction.buff2hex(this.metadata.to_bytes())
: null,
};
return encoder.encode(JSON.stringify(data));
};
MultisigTransaction.fromBytes = function (bytes) {
var decoder = new TextDecoder();
var _a = JSON.parse(decoder.decode(bytes)), body = _a.body, keys = _a.keys, scripts = _a.scripts, metadata = _a.metadata;
var multisig = new MultisigTransaction();
multisig.txBody = cardano_serialization_lib_nodejs_1.TransactionBody.from_bytes(MultisigTransaction.hexToBuff(body));
multisig.txHash = cardano_serialization_lib_nodejs_1.hash_transaction(multisig.txBody);
multisig.metadata = metadata
? cardano_serialization_lib_nodejs_1.AuxiliaryData.from_bytes(MultisigTransaction.hexToBuff(metadata))
: null;
var vKyes = keys.map(function (k) {
return cardano_serialization_lib_nodejs_1.Vkeywitness.from_bytes(MultisigTransaction.hexToBuff(k));
});
for (var _i = 0, vKyes_1 = vKyes; _i < vKyes_1.length; _i++) {
var key = vKyes_1[_i];
multisig.vkeyWitnesses.add(key);
}
var nScripts = scripts.map(function (k) {
return cardano_serialization_lib_nodejs_1.NativeScript.from_bytes(MultisigTransaction.hexToBuff(k));
});
for (var _b = 0, nScripts_1 = nScripts; _b < nScripts_1.length; _b++) {
var script = nScripts_1[_b];
multisig.nativeScripts.add(script);
}
return multisig;
};
MultisigTransaction.buff2hex = function (buffer) {
// buffer is an ArrayBuffer
return Array.from(buffer.values())
.map(function (x) { return x.toString(16).padStart(2, "0"); })
.join("");
};
MultisigTransaction.hexToBuff = function (hexString) {
return new Uint8Array(hexString.match(/.{1,2}/g).map(function (byte) { return parseInt(byte, 16); }));
};
MultisigTransaction.prototype.txFee = function (tx, config) {
return parseInt(cardano_serialization_lib_nodejs_1.min_fee(tx, cardano_serialization_lib_nodejs_1.LinearFee.new(cardano_serialization_lib_nodejs_1.BigNum.from_str(config.protocolParams.txFeePerByte.toString()), cardano_serialization_lib_nodejs_1.BigNum.from_str(config.protocolParams.txFeeFixed.toString()))).to_str());
};
MultisigTransaction.prototype.fakeTx = function (txBody, numberOfWitnesses) {
var fakeWitnesses = cardano_serialization_lib_nodejs_1.Vkeywitnesses.new();
var fakeKey = this.fakePrivateKey();
var rawKey = fakeKey.to_raw_key();
// const txHash = hash_transaction(txBody);
var fakeVkeyWitness = cardano_serialization_lib_nodejs_1.Vkeywitness.new(cardano_serialization_lib_nodejs_1.Vkey.new(rawKey.to_public()),
// rawKey.sign(txHash.to_bytes())
rawKey.sign(Buffer.from(Array.from(Array(100).keys()))));
for (var i = 0; i < numberOfWitnesses; i++) {
fakeWitnesses.add(fakeVkeyWitness);
}
var witnessSet = cardano_serialization_lib_nodejs_1.TransactionWitnessSet.new();
witnessSet.set_vkeys(fakeWitnesses);
if (this.nativeScripts.len() > 0) {
witnessSet.set_native_scripts(this.nativeScripts);
}
var cloneMetadata = this.metadata
? cardano_serialization_lib_nodejs_1.AuxiliaryData.from_bytes(this.metadata.to_bytes())
: null;
var tx = cardano_serialization_lib_nodejs_1.Transaction.new(txBody, witnessSet, cloneMetadata);
return tx;
};
MultisigTransaction.prototype.fakePrivateKey = function () {
return cardano_serialization_lib_nodejs_1.Bip32PrivateKey.from_bytes(Buffer.from([
0xb8, 0xf2, 0xbe, 0xce, 0x9b, 0xdf, 0xe2, 0xb0, 0x28, 0x2f, 0x5b, 0xad,
0x70, 0x55, 0x62, 0xac, 0x99, 0x6e, 0xfb, 0x6a, 0xf9, 0x6b, 0x64, 0x8f,
0x44, 0x45, 0xec, 0x44, 0xf4, 0x7a, 0xd9, 0x5c, 0x10, 0xe3, 0xd7, 0x2f,
0x26, 0xed, 0x07, 0x54, 0x22, 0xa3, 0x6e, 0xd8, 0x58, 0x5c, 0x74, 0x5a,
0x0e, 0x11, 0x50, 0xbc, 0xce, 0xba, 0x23, 0x57, 0xd0, 0x58, 0x63, 0x69,
0x91, 0xf3, 0x8a, 0x37, 0x91, 0xe2, 0x48, 0xde, 0x50, 0x9c, 0x07, 0x0d,
0x81, 0x2a, 0xb2, 0xfd, 0xa5, 0x78, 0x60, 0xac, 0x87, 0x6b, 0xc4, 0x89,
0x19, 0x2c, 0x1e, 0xf4, 0xce, 0x25, 0x3c, 0x19, 0x7e, 0xe2, 0x19, 0xa4,
]));
};
return MultisigTransaction;
}());
exports.MultisigTransaction = MultisigTransaction;
//# sourceMappingURL=multisig-transaction.js.map