send-crypto
Version:
A minimal JavaScript library / wallet for sending crypto assets
73 lines • 8.13 kB
JavaScript
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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