@bcpros/crypto-wallet-core
Version:
A multi-currency support library for address derivation, private key creation, and transaction creation
128 lines • 6.16 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ETHTxProvider = void 0;
var ethers_1 = require("ethers");
var web3_1 = __importDefault(require("web3"));
var web3_utils_1 = require("web3-utils");
var constants_1 = require("../../constants");
var chains_1 = require("../../constants/chains");
var abi_1 = require("../erc20/abi");
var ETHTxProvider = (function () {
function ETHTxProvider(chain) {
if (chain === void 0) { chain = 'ETH'; }
this.chain = chain;
}
ETHTxProvider.prototype.create = function (params) {
var recipients = params.recipients, nonce = params.nonce, gasPrice = params.gasPrice, gasLimit = params.gasLimit, network = params.network, contractAddress = params.contractAddress, maxGasFee = params.maxGasFee, priorityGasFee = params.priorityGasFee;
var data = params.data;
var to;
var amount;
if (recipients.length > 1) {
if (!contractAddress) {
throw new Error('Multiple recipients requires use of multi-send contract, please specify contractAddress');
}
var addresses = [];
var amounts = [];
amount = (0, web3_utils_1.toBN)(0);
for (var _i = 0, recipients_1 = recipients; _i < recipients_1.length; _i++) {
var recipient = recipients_1[_i];
addresses.push(recipient.address);
amounts.push((0, web3_utils_1.toBN)(recipient.amount));
amount = amount.add((0, web3_utils_1.toBN)(recipient.amount));
}
var multisendContract = this.getMultiSendContract(contractAddress);
data = data || multisendContract.methods.sendEth(addresses, amounts).encodeABI();
to = contractAddress;
}
else {
to = recipients[0].address;
amount = recipients[0].amount;
}
var chainId = params.chainId;
chainId = chainId || this.getChainId(network);
var txData = {
nonce: (0, web3_utils_1.toHex)(nonce),
gasLimit: (0, web3_utils_1.toHex)(gasLimit),
to: to,
data: data,
value: (0, web3_utils_1.toHex)(amount),
chainId: chainId
};
if (maxGasFee) {
txData.maxFeePerGas = (0, web3_utils_1.toHex)(maxGasFee);
txData.maxPriorityFeePerGas = (0, web3_utils_1.toHex)(priorityGasFee || this.getPriorityFeeMinimum(chainId));
txData.type = 2;
}
else {
txData.gasPrice = (0, web3_utils_1.toHex)(gasPrice);
}
return ethers_1.ethers.utils.serializeTransaction(txData);
};
ETHTxProvider.prototype.getMultiSendContract = function (tokenContractAddress) {
var web3 = new web3_1.default();
return new web3.eth.Contract(abi_1.MULTISENDAbi, tokenContractAddress);
};
ETHTxProvider.prototype.getPriorityFeeMinimum = function (chainId) {
var _a;
var chain = constants_1.Constants.EVM_CHAIN_ID_TO_CHAIN[chainId];
return ((_a = constants_1.Constants.FEE_MINIMUMS[chain]) === null || _a === void 0 ? void 0 : _a.priority) || 0;
};
ETHTxProvider.prototype.getChainId = function (network) {
if (network === 'testnet') {
network = chains_1.EVM_CHAIN_DEFAULT_TESTNET[this.chain];
}
return chains_1.EVM_CHAIN_NETWORK_TO_CHAIN_ID["".concat(this.chain, "_").concat(network)] || chains_1.EVM_CHAIN_NETWORK_TO_CHAIN_ID["".concat(this.chain, "_mainnet")];
};
ETHTxProvider.prototype.getSignatureObject = function (params) {
var tx = params.tx, key = params.key;
var k = key.privKey;
if (k.substr(0, 2) != '0x') {
k = '0x' + k;
}
var signingKey = new ethers_1.ethers.utils.SigningKey(k);
var signDigest = signingKey.signDigest.bind(signingKey);
return signDigest(ethers_1.ethers.utils.keccak256(tx));
};
ETHTxProvider.prototype.getSignature = function (params) {
var signatureHex = ethers_1.ethers.utils.joinSignature(this.getSignatureObject(params));
return signatureHex;
};
ETHTxProvider.prototype.getHash = function (params) {
var tx = params.tx;
return ethers_1.ethers.utils.parseTransaction(tx).hash;
};
ETHTxProvider.prototype.applySignature = function (params) {
var tx = params.tx, signature = params.signature;
var parsedTx = ethers_1.ethers.utils.parseTransaction(tx);
var nonce = parsedTx.nonce, gasPrice = parsedTx.gasPrice, gasLimit = parsedTx.gasLimit, to = parsedTx.to, value = parsedTx.value, data = parsedTx.data, chainId = parsedTx.chainId, maxFeePerGas = parsedTx.maxFeePerGas, maxPriorityFeePerGas = parsedTx.maxPriorityFeePerGas;
var txData = { nonce: nonce, gasPrice: gasPrice, gasLimit: gasLimit, to: to, value: value, data: data, chainId: chainId };
if (maxFeePerGas) {
txData.maxFeePerGas = maxFeePerGas;
txData.maxPriorityFeePerGas = maxPriorityFeePerGas;
txData.type = 2;
}
else if (!gasPrice || !gasPrice.toNumber()) {
throw new Error('either gasPrice or maxFeePerGas is required');
}
if (typeof signature == 'string') {
signature = ethers_1.ethers.utils.splitSignature(signature);
}
var signedTx = ethers_1.ethers.utils.serializeTransaction(txData, signature);
var parsedTxSigned = ethers_1.ethers.utils.parseTransaction(signedTx);
if (!parsedTxSigned.hash) {
throw new Error('Signature invalid');
}
return signedTx;
};
ETHTxProvider.prototype.sign = function (params) {
var tx = params.tx, key = params.key;
var signature = this.getSignatureObject({ tx: tx, key: key });
return this.applySignature({ tx: tx, signature: signature });
};
return ETHTxProvider;
}());
exports.ETHTxProvider = ETHTxProvider;
//# sourceMappingURL=index.js.map