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