UNPKG

send-crypto

Version:

A minimal JavaScript library / wallet for sending crypto assets

122 lines 11.8 kB
import BigNumber from "bignumber.js"; import { ethers } from "ethers"; import { newPromiEvent } from "../../lib/promiEvent"; import { getNetwork, getTransactionConfig } from "../ETH/ethUtils"; import { ERC20ABI } from "./ERC20ABI"; import { ERC20s } from "./ERC20s"; const resolveAsset = (network, assetIn) => { if (typeof assetIn !== "object") { throw new Error(""); } const asset = assetIn; if (asset.address) { return { ...asset, address: asset.address }; } else { const address = (ERC20s[network] || {})[asset.name || ""]; if (!address) { throw new Error(`Unknown ERC20 token ${asset.name || JSON.stringify(asset)}`); } return { ...asset, address }; } }; export class ERC20Handler { network; sharedState; _decimals = {}; constructor(_privateKey, network, _options, sharedState) { this.network = getNetwork(network); this.sharedState = sharedState; } // Returns whether or not this can handle the asset handlesAsset = (asset) => { return (typeof asset === "object" && asset.hasOwnProperty("type") && asset.type === "ERC20" && (asset.hasOwnProperty("address") || asset.hasOwnProperty("name"))); }; // Address address = async (asset, options, deferHandler) => deferHandler.address("ETH", options); // Balance getBalance = async (assetIn, options, deferHandler) => { const asset = resolveAsset(this.network, assetIn); const decimals = await this.decimals(asset); return (await this.getBalanceInSats(asset, options, deferHandler)).dividedBy(new BigNumber(10).exponentiatedBy(decimals)); }; getBalanceInSats = async (assetIn, options, deferHandler) => { const asset = resolveAsset(this.network, assetIn); const address = (options && options.address) || (deferHandler && (await deferHandler.address("ETH", options))) || ""; return new BigNumber((await this.getContract(asset).balanceOf(address)).toString()); }; // Transfer // This is re-implemented instead of calling sendSats so that a PromiEvent // can be returned. send = (to, valueIn, assetIn, options, deferHandler) => { const asset = resolveAsset(this.network, assetIn); const promiEvent = newPromiEvent(); (async () => { const value = valueIn.times(new BigNumber(10).exponentiatedBy(await this.decimals(asset))); const contract = this.getContract(asset); const config = { from: await deferHandler.address("ETH"), ...getTransactionConfig(options), }; let tx; // tslint:disable: prefer-conditional-expression if (options.approve) { // config.gasLimit = contract.estimateGas.approve(to, valueIn.toFixed()); tx = await contract.approve(to, value.toFixed(), config); } else { // config.gasLimit = contract.estimateGas.transfer(to, valueIn.toFixed()); tx = await contract.transfer(to, value.toFixed(), config); } promiEvent.emit("transactionHash", tx.hash); await tx.wait(); promiEvent.resolve(tx.hash); })().catch((error) => { promiEvent.reject(error); }); return promiEvent; }; sendSats = (to, valueIn, assetIn, options, deferHandler) => { const asset = resolveAsset(this.network, assetIn); const promiEvent = newPromiEvent(); (async () => { const contract = this.getContract(asset); const config = { from: await deferHandler.address("ETH"), ...getTransactionConfig(options), }; // tslint:disable: prefer-conditional-expression let tx; if (options.approve) { // config.gasLimit = contract.estimateGas.approve(to, valueIn.toFixed()); tx = await contract.approve(to, valueIn.toFixed(), config); } else { // config.gasLimit = contract.estimateGas.transfer(to, valueIn.toFixed()); tx = await contract.transfer(to, valueIn.toFixed(), config); } promiEvent.emit("transactionHash", tx.hash); await tx.wait(); promiEvent.resolve(tx.hash); })().catch((error) => { promiEvent.reject(error); }); return promiEvent; }; getContract = (asset) => { return new ethers.Contract(resolveAsset(this.network, asset).address, ERC20ABI, this.sharedState.ethSigner); }; decimals = async (asset) => { const address = resolveAsset(this.network, asset).address; if (this._decimals[address]) { return this._decimals[address]; } return new BigNumber((await this.getContract(asset).decimals()).toString()).toNumber(); }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRVJDMjBIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2hhbmRsZXJzL0VSQzIwL0VSQzIwSGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFNBQVMsTUFBTSxjQUFjLENBQUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBYSxNQUFNLFFBQVEsQ0FBQztBQUUzQyxPQUFPLEVBQUUsYUFBYSxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFFakUsT0FBTyxFQUFFLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQVdsQyxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQWUsRUFBRSxPQUFjLEVBQXVCLEVBQUU7SUFDMUUsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUU7UUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUN2QjtJQUNELE1BQU0sS0FBSyxHQUFHLE9BQThDLENBQUM7SUFDN0QsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO1FBQ2YsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDL0M7U0FBTTtRQUNILE1BQU0sT0FBTyxHQUFHLENBQUUsTUFBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNWLE1BQU0sSUFBSSxLQUFLLENBQ1gsdUJBQXVCLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUMvRCxDQUFDO1NBQ0w7UUFDRCxPQUFP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