UNPKG

send-crypto

Version:

A minimal JavaScript library / wallet for sending crypto assets

73 lines 8.13 kB
import BigNumber from "bignumber.js"; import { newPromiEvent } from "../../lib/promiEvent"; import { getEndpoint, getEthersSigner, getNetwork, getTransactionConfig, } from "./ethUtils"; export class ETHHandler { privateKey; network; decimals = 18; unlockedAddress; sharedState; constructor(privateKey, network, options, sharedState) { this.network = getNetwork(network); this.privateKey = privateKey; const [ethSigner, address] = getEthersSigner(this.privateKey, getEndpoint(this.network, options && options.ethereumNode, options && options.infuraKey)); this.unlockedAddress = address; sharedState.ethSigner = ethSigner; this.sharedState = sharedState; } // Returns whether or not this can handle the asset handlesAsset = (asset) => typeof asset === "string" && ["ETH", "ETHER", "ETHEREUM"].indexOf(asset.toUpperCase()) !== -1; address = async (asset, options) => this.unlockedAddress; // Balance getBalance = async (asset, options) => (await this.getBalanceInSats(asset, options)).dividedBy(new BigNumber(10).exponentiatedBy(this.decimals)); getBalanceInSats = async (asset, options) => { let atBlock; if (options && options.confirmations && options.confirmations > 0) { const currentBlock = new BigNumber(await this.sharedState.ethSigner.provider.getBlockNumber()); atBlock = currentBlock .minus(options.confirmations) .plus(1) .toNumber(); } const address = (options && options.address) || (await this.address(asset)); return new BigNumber((await this.sharedState.ethSigner.provider.getBalance(address, atBlock)).toString()); }; // Transfer send = (to, value, asset, options) => this.sendSats(to, value.times(new BigNumber(10).exponentiatedBy(this.decimals)), asset, options); sendSats = (to, valueIn, asset, optionsIn) => { const promiEvent = newPromiEvent(); (async () => { const options = optionsIn || {}; let value = valueIn; const txOptions = getTransactionConfig(options); if (options.subtractFee) { const gasPrice = txOptions.gasPrice || (await this.sharedState.ethSigner.provider.getGasPrice()); const gasPriceBN = new BigNumber(gasPrice.toString()); const gasLimit = txOptions.gasLimit || 21000; const gasLimitBN = new BigNumber(gasLimit.toString()); const fee = gasPriceBN.times(gasLimitBN); if (fee.gt(value)) { throw new Error(`Unable to include fee in value, fee exceeds value (${fee.toFixed()} > ${value.toFixed()})`); } value = value.minus(fee); } const from = await this.address(asset); const tx = await this.sharedState.ethSigner.sendTransaction({ from, gasLimit: 21000, ...txOptions, to, value: value.toFixed(), }); promiEvent.emit("transactionHash", tx.hash); await tx.wait(); promiEvent.resolve(tx.hash); })().catch((error) => { promiEvent.reject(error); }); return promiEvent; }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRVRISGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9oYW5kbGVycy9FVEgvRVRISGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFNBQVMsTUFBTSxjQUFjLENBQUM7QUFHckMsT0FBTyxFQUFFLGFBQWEsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBRWpFLE9BQU8sRUFDSCxXQUFXLEVBQ1gsZUFBZSxFQUNmLFVBQVUsRUFDVixvQkFBb0IsR0FFdkIsTUFBTSxZQUFZLENBQUM7QUFrQnBCLE1BQU0sT0FBTyxVQUFVO0lBSUYsVUFBVSxDQUFTO0lBQ25CLE9BQU8sQ0FBVTtJQUVqQixRQUFRLEdBQUcsRUFBRSxDQUFDO0lBRWQsZUFBZSxDQUFTO0lBRXhCLFdBQVcsQ0FFMUI7SUFFRixZQUNJLFVBQWtCLEVBQ2xCLE9BQWUsRUFDZixPQUE0QixFQUM1QixXQUFpQjtRQUVqQixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLGVBQWUsQ0FDeEMsSUFBSSxDQUFDLFVBQVUsRUFDZixXQUFXLENBQ1AsSUFBSSxDQUFDLE9BQU8sRUFDWixPQUFPLElBQUksT0FBTyxDQUFDLFlBQVksRUFDL0IsT0FBTyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQy9CLENBQ0osQ0FBQztRQUNGLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDO1FBQy9CLFdBQVcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ25DLENBQUM7SUFFRCxtREFBbUQ7SUFDbkMsWUFBWSxHQUFHLENBQUMsS0FBWSxFQUFXLEVBQUUsQ0FDckQsT0FBTyxLQUFLLEtBQUssUUFBUTtRQUN6QixD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