@r3l/app
Version:
272 lines (213 loc) • 9.17 kB
JavaScript
;
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