send-crypto
Version:
A minimal JavaScript library / wallet for sending crypto assets
121 lines • 12.4 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ERC20Handler = void 0;
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const ethers_1 = require("ethers");
const promiEvent_1 = require("../../lib/promiEvent");
const ethUtils_1 = require("../ETH/ethUtils");
const ERC20ABI_1 = require("./ERC20ABI");
const ERC20s_1 = require("./ERC20s");
const resolveAsset = (network, assetIn) => {
if (typeof assetIn !== "object") {
throw new Error("");
}
const asset = assetIn;
if (asset.address) {
return Object.assign(Object.assign({}, asset), { address: asset.address });
}
else {
const address = (ERC20s_1.ERC20s[network] || {})[asset.name || ""];
if (!address) {
throw new Error(`Unknown ERC20 token ${asset.name || JSON.stringify(asset)}`);
}
return Object.assign(Object.assign({}, asset), { address });
}
};
class ERC20Handler {
constructor(_privateKey, network, _options, sharedState) {
this._decimals = {};
// Returns whether or not this can handle the asset
this.handlesAsset = (asset) => {
return (typeof asset === "object" &&
asset.hasOwnProperty("type") &&
asset.type === "ERC20" &&
(asset.hasOwnProperty("address") || asset.hasOwnProperty("name")));
};
// Address
this.address = async (asset, options, deferHandler) => deferHandler.address("ETH", options);
// Balance
this.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_js_1.default(10).exponentiatedBy(decimals));
};
this.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_js_1.default((await this.getContract(asset).balanceOf(address)).toString());
};
// Transfer
// This is re-implemented instead of calling sendSats so that a PromiEvent
// can be returned.
this.send = (to, valueIn, assetIn, options, deferHandler) => {
const asset = resolveAsset(this.network, assetIn);
const promiEvent = (0, promiEvent_1.newPromiEvent)();
(async () => {
const value = valueIn.times(new bignumber_js_1.default(10).exponentiatedBy(await this.decimals(asset)));
const contract = this.getContract(asset);
const config = Object.assign({ from: await deferHandler.address("ETH") }, (0, ethUtils_1.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;
};
this.sendSats = (to, valueIn, assetIn, options, deferHandler) => {
const asset = resolveAsset(this.network, assetIn);
const promiEvent = (0, promiEvent_1.newPromiEvent)();
(async () => {
const contract = this.getContract(asset);
const config = Object.assign({ from: await deferHandler.address("ETH") }, (0, ethUtils_1.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;
};
this.getContract = (asset) => {
return new ethers_1.ethers.Contract(resolveAsset(this.network, asset).address, ERC20ABI_1.ERC20ABI, this.sharedState.ethSigner);
};
this.decimals = async (asset) => {
const address = resolveAsset(this.network, asset).address;
if (this._decimals[address]) {
return this._decimals[address];
}
return new bignumber_js_1.default((await this.getContract(asset).decimals()).toString()).toNumber();
};
this.network = (0, ethUtils_1.getNetwork)(network);
this.sharedState = sharedState;
}
}
exports.ERC20Handler = ERC20Handler;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRVJDMjBIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2hhbmRsZXJzL0VSQzIwL0VSQzIwSGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxnRUFBcUM7QUFDckMsbUNBQTJDO0FBRTNDLHFEQUFpRTtBQUVqRSw4Q0FBbUU7QUFDbkUseUNBQXNDO0FBQ3RDLHFDQUFrQztBQVdsQyxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQWUsRUFBRSxPQUFjLEVBQXVCLEVBQUU7SUFDMUUsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUU7UUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUN2QjtJQUNELE1BQU0sS0FBSyxHQUFHLE9BQThDLENBQUM7SUFDN0QsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO1FBQ2YsdUNBQVksS0FBSyxLQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxJQUFHO0tBQy9DO1NBQU07UUFDSCxNQUFNLE9BQU8sR0FBRyxDQUFFLGVBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDVixNQUFNLElBQUksS0FBSyxDQUNYLHVCQUF1QixLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDL0QsQ0FBQztTQUNMO1FBQ0QsdUNBQVksS0FBSyxLQUFFLE9BQU8sSUFBRztLQUNoQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQWEsWUFBWTtJQVVyQixZQUNJLFdBQW1CLEVBQ25CLE9BQWUsRUFDZixRQUE2QixFQUM3QixXQUFpQjtRQU5iLGNBQVMsR0FBa0MsRUFBRSxDQUFDO1FBWXRELG1EQUFtRDtRQUNuQyxpQkFBWSxHQUFHLENBQUMsS0FBWSxFQUFXLEVB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