UNPKG

@bcpros/crypto-wallet-core

Version:

A multi-currency support library for address derivation, private key creation, and transaction creation

128 lines 6.16 kB
"use strict"; 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