ptokens-prvn
Version:
repo holding the code for interacting with pRVN
266 lines (260 loc) • 11.9 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var _asyncToGenerator = _interopDefault(require('@babel/runtime/helpers/asyncToGenerator'));
var _classCallCheck = _interopDefault(require('@babel/runtime/helpers/classCallCheck'));
var _createClass = _interopDefault(require('@babel/runtime/helpers/createClass'));
var _inherits = _interopDefault(require('@babel/runtime/helpers/inherits'));
var _possibleConstructorReturn = _interopDefault(require('@babel/runtime/helpers/possibleConstructorReturn'));
var _getPrototypeOf = _interopDefault(require('@babel/runtime/helpers/getPrototypeOf'));
var _regeneratorRuntime = _interopDefault(require('@babel/runtime/regenerator'));
var Web3 = _interopDefault(require('web3'));
var Web3PromiEvent = _interopDefault(require('web3-core-promievent'));
var ptokensNodeSelector = require('ptokens-node-selector');
var ptokensUtils = require('ptokens-utils');
var ptokensDepositAddress = require('ptokens-deposit-address');
var Web3Utils = _interopDefault(require('web3-utils'));
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
var MINIMUM_RVN_REDEEMABLE = 0.00005;
var pRVN = function (_NodeSelector) {
_inherits(pRVN, _NodeSelector);
var _super = _createSuper(pRVN);
function pRVN(_configs) {
var _this;
_classCallCheck(this, pRVN);
var _helpers$parseParams = ptokensUtils.helpers.parseParams(_configs, ptokensUtils.constants.blockchains.Ravencoin),
hostBlockchain = _helpers$parseParams.hostBlockchain,
hostNetwork = _helpers$parseParams.hostNetwork,
nativeBlockchain = _helpers$parseParams.nativeBlockchain,
nativeNetwork = _helpers$parseParams.nativeNetwork;
_this = _super.call(this, {
pToken: ptokensUtils.constants.pTokens.pRVN,
hostBlockchain: hostBlockchain,
hostNetwork: hostNetwork,
nativeBlockchain: nativeBlockchain,
nativeNetwork: nativeNetwork,
defaultNode: _configs.defaultNode
});
var bscPrivateKey = _configs.bscPrivateKey,
bscProvider = _configs.bscProvider;
if (bscProvider) _this.hostApi = new Web3(bscProvider);
if (bscPrivateKey) {
var account = _this.hostApi.eth.accounts.privateKeyToAccount(ptokensUtils.eth.addHexPrefix(bscPrivateKey));
_this.hostApi.eth.defaultAccount = account.address;
_this.hostPrivateKey = ptokensUtils.eth.addHexPrefix(bscPrivateKey);
} else {
_this.hostPrivateKey = null;
}
_this.contractAddress = null;
_this.decimals = null;
return _this;
}
_createClass(pRVN, [{
key: "getDepositAddress",
value: function () {
var _getDepositAddress = _asyncToGenerator( _regeneratorRuntime.mark(function _callee(_hostAddress) {
var selectedNode, depositAddress;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!(this.hostBlockchain === ptokensUtils.constants.blockchains.BinanceSmartChain && !Web3Utils.isAddress(_hostAddress))) {
_context.next = 2;
break;
}
throw new Error('Invalid Binance Smart Chain Address');
case 2:
if (!this.selectedNode) {
_context.next = 6;
break;
}
_context.t0 = this.selectedNode;
_context.next = 9;
break;
case 6:
_context.next = 8;
return this.select();
case 8:
_context.t0 = _context.sent;
case 9:
selectedNode = _context.t0;
if (selectedNode) {
_context.next = 12;
break;
}
throw new Error('No node selected. Impossible to generate a RVN deposit Address.');
case 12:
depositAddress = new ptokensDepositAddress.DepositAddress({
node: selectedNode,
nativeBlockchain: this.nativeBlockchain,
nativeNetwork: this.nativeNetwork,
hostBlockchain: this.hostBlockchain,
hostNetwork: this.hostNetwork,
hostApi: this.hostApi
});
_context.next = 15;
return depositAddress.generate(_hostAddress);
case 15:
if (depositAddress.verify()) {
_context.next = 17;
break;
}
throw new Error('Node deposit address does not match expected address');
case 17:
return _context.abrupt("return", depositAddress);
case 18:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
function getDepositAddress(_x) {
return _getDepositAddress.apply(this, arguments);
}
return getDepositAddress;
}()
}, {
key: "redeem",
value: function redeem(_amount, _rvnAddress) {
var _this2 = this;
var _options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var promiEvent = Web3PromiEvent();
var start = function () {
var _ref = _asyncToGenerator( _regeneratorRuntime.mark(function _callee2() {
var gas, gasPrice, contractAddress, redeemFromEvmCompatible, hostTxHash, bscTxReceipt, broadcastedRvnTxReport, broadcastedRvnTxReceipt;
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.prev = 0;
gas = _options.gas, gasPrice = _options.gasPrice;
if (!(_amount < MINIMUM_RVN_REDEEMABLE)) {
_context2.next = 5;
break;
}
promiEvent.reject("Impossible to burn less than ".concat(MINIMUM_RVN_REDEEMABLE, " pRVN"));
return _context2.abrupt("return");
case 5:
if (ptokensUtils.rvn.isValidAddress(_rvnAddress)) {
_context2.next = 8;
break;
}
promiEvent.reject('Invalid Ravecoin Address');
return _context2.abrupt("return");
case 8:
if (_this2.selectedNode) {
_context2.next = 11;
break;
}
_context2.next = 11;
return _this2.select();
case 11:
_context2.next = 13;
return _this2._getContractAddress();
case 13:
contractAddress = _context2.sent;
redeemFromEvmCompatible = ptokensUtils.redeemFrom.redeemFromEvmCompatible;
hostTxHash = null;
if (!(_this2.hostBlockchain === ptokensUtils.constants.blockchains.BinanceSmartChain)) {
_context2.next = 22;
break;
}
_context2.next = 19;
return redeemFromEvmCompatible(_this2.hostApi, {
privateKey: _this2.hostPrivateKey,
gas: gas,
gasPrice: gasPrice,
contractAddress: contractAddress,
value: 0
}, [_amount, _rvnAddress], promiEvent, 'hostTxBroadcasted');
case 19:
bscTxReceipt = _context2.sent;
promiEvent.eventEmitter.emit('hostTxConfirmed', bscTxReceipt);
hostTxHash = bscTxReceipt.transactionHash;
case 22:
_context2.next = 24;
return _this2.selectedNode.monitorIncomingTransaction(hostTxHash, promiEvent.eventEmitter);
case 24:
broadcastedRvnTxReport = _context2.sent;
_context2.next = 27;
return ptokensUtils.rvn.waitForTransactionConfirmation(_this2.nativeNetwork, broadcastedRvnTxReport.broadcast_tx_hash);
case 27:
broadcastedRvnTxReceipt = _context2.sent;
promiEvent.eventEmitter.emit('nativeTxConfirmed', broadcastedRvnTxReceipt);
promiEvent.resolve({
amount: _amount,
hostTx: hostTxHash,
nativeTx: broadcastedRvnTxReport.broadcast_tx_hash,
to: _rvnAddress
});
_context2.next = 35;
break;
case 32:
_context2.prev = 32;
_context2.t0 = _context2["catch"](0);
promiEvent.reject(_context2.t0);
case 35:
case "end":
return _context2.stop();
}
}
}, _callee2, null, [[0, 32]]);
}));
return function start() {
return _ref.apply(this, arguments);
};
}();
start();
return promiEvent.eventEmitter;
}
}, {
key: "_getContractAddress",
value: function () {
var _getContractAddress2 = _asyncToGenerator( _regeneratorRuntime.mark(function _callee3() {
var _yield$this$selectedN, smart_contract_address;
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
_context3.prev = 0;
if (this.contractAddress) {
_context3.next = 10;
break;
}
if (this.selectedNode) {
_context3.next = 5;
break;
}
_context3.next = 5;
return this.select();
case 5:
_context3.next = 7;
return this.selectedNode.getInfo();
case 7:
_yield$this$selectedN = _context3.sent;
smart_contract_address = _yield$this$selectedN.smart_contract_address;
this.contractAddress = smart_contract_address;
case 10:
return _context3.abrupt("return", this.contractAddress);
case 13:
_context3.prev = 13;
_context3.t0 = _context3["catch"](0);
throw new Error("Error during getting contract address: ".concat(_context3.t0.message));
case 16:
case "end":
return _context3.stop();
}
}
}, _callee3, this, [[0, 13]]);
}));
function _getContractAddress() {
return _getContractAddress2.apply(this, arguments);
}
return _getContractAddress;
}()
}]);
return pRVN;
}(ptokensNodeSelector.NodeSelector);
exports.pRVN = pRVN;