194 lines
10 KiB
JavaScript
194 lines
10 KiB
JavaScript
|
"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
|