UNPKG

send-crypto

Version:

A minimal JavaScript library / wallet for sending crypto assets

121 lines 12.4 kB
"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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