UNPKG

@r3l/app

Version:
272 lines (213 loc) 9.17 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.useTx = useTx; exports.estimateGas = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = require("react"); var _web = require("./web3"); var _utils = require("../utils"); var _alert = require("../../utils/alert"); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var PENDING = _utils.TX_STATUS.PENDING, CONFIRMED = _utils.TX_STATUS.CONFIRMED, FAILED = _utils.TX_STATUS.FAILED; function useTx() { var _useState = (0, _react.useState)(null), _useState2 = (0, _slicedToArray2.default)(_useState, 2), error = _useState2[0], setError = _useState2[1]; var _useState3 = (0, _react.useState)(null), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), txStatus = _useState4[0], setTxStatus = _useState4[1]; var _useState5 = (0, _react.useState)({}), _useState6 = (0, _slicedToArray2.default)(_useState5, 2), txMeta = _useState6[0], setTxMeta = _useState6[1]; var _useWeb3React = (0, _web.useWeb3React)(), active = _useWeb3React.active, account = _useWeb3React.account, library = _useWeb3React.library; var _sendTx = /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(contract, action, args) { var options, dryRun, _contract$estimateGas, gasLimit, tx, result, revertMsg, errorMsg, _args = arguments; return _regenerator.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: options = _args.length > 3 && _args[3] !== undefined ? _args[3] : {}; dryRun = _args.length > 4 ? _args[4] : undefined; _context.prev = 2; if (active) { _context.next = 5; break; } throw new Error('Web3 wallet is not connected'); case 5: if (account) { _context.next = 7; break; } throw new Error('Missing web3 account'); case 7: // depending on povider type - we may have start with AWAITING_USER_ACTION // or go straight to PENDING setTxStatus(PENDING); setTxMeta({}); setError(null); console.log('send tx', error, txStatus); // NOTE this will fail if the call fails if (!options.gasLimit) { _context.next = 15; break; } _context.t0 = options.gasLimit; _context.next = 20; break; case 15: _context.t1 = _utils.calculateGasMargin; _context.next = 18; return (_contract$estimateGas = contract.estimateGas)[action].apply(_contract$estimateGas, (0, _toConsumableArray2.default)(args)); case 18: _context.t2 = _context.sent; _context.t0 = (0, _context.t1)(_context.t2); case 20: gasLimit = _context.t0; if (!dryRun) { _context.next = 24; break; } setError(null); return _context.abrupt("return", setTxStatus(CONFIRMED)); case 24: console.log(options); _context.next = 27; return contract[action].apply(contract, (0, _toConsumableArray2.default)(args).concat([_objectSpread(_objectSpread({}, options), {}, { gasLimit: gasLimit // gasPrice, })])); case 27: tx = _context.sent; setTxStatus(PENDING); setTxMeta({ transactionHash: tx.hash }); _context.next = 32; return tx.wait(); case 32: result = _context.sent; if (!(result.status === 0)) { _context.next = 35; break; } throw new Error('Transaction Failed'); case 35: setTxMeta(result); setError(null); setTxStatus(result.status === 1 ? CONFIRMED : FAILED); _context.next = 57; break; case 40: _context.prev = 40; _context.t3 = _context["catch"](2); console.error(_context.t3); // check if we can get a revert msg for a failing tx _context.prev = 43; _context.next = 46; return (0, _utils.logRevert)({ contract: contract, action: action, args: args, library: library, account: account }); case 46: revertMsg = _context.sent; _context.next = 51; break; case 49: _context.prev = 49; _context.t4 = _context["catch"](43); case 51: setTxMeta({}); // @ts-ignore errorMsg = revertMsg || _context.t3.data && _context.t3.data.message || _context.t3.message; console.error(errorMsg); _alert.browserAlerts.alert(errorMsg, 'error'); // Important to set error first before FAILED because we might // navigate away from the error/status listener before the error is set setError(errorMsg); setTxStatus(FAILED); case 57: case "end": return _context.stop(); } } }, _callee, null, [[2, 40], [43, 49]]); })); return function _sendTx(_x, _x2, _x3) { return _ref.apply(this, arguments); }; }(); var sendTx = (0, _react.useCallback)(_sendTx, [active, account, setError]); return { sendTx: sendTx, error: error, txStatus: txStatus, txMeta: txMeta }; } var estimateGas = /*#__PURE__*/function () { var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(contract, action, args, from) { var _contract$estimateGas2, gas, revertMsg, errorMsg; return _regenerator.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.prev = 0; _context2.next = 3; return (_contract$estimateGas2 = contract.estimateGas)[action].apply(_contract$estimateGas2, (0, _toConsumableArray2.default)(args)); case 3: gas = _context2.sent; return _context2.abrupt("return", [gas, null]); case 7: _context2.prev = 7; _context2.t0 = _context2["catch"](0); _context2.next = 11; return (0, _utils.logRevert)({ contract: contract, action: action, args: args, library: contract.provider, account: from }); case 11: revertMsg = _context2.sent; // @ts-ignore errorMsg = revertMsg || _context2.t0.data && _context2.t0.data.message || _context2.t0.message; console.error(errorMsg); return _context2.abrupt("return", [null, errorMsg]); case 15: case "end": return _context2.stop(); } } }, _callee2, null, [[0, 7]]); })); return function estimateGas(_x4, _x5, _x6, _x7) { return _ref2.apply(this, arguments); }; }(); exports.estimateGas = estimateGas; //# sourceMappingURL=useTx.js.map