pli-pay
Version:
Crypto PLI payment gateway
794 lines (747 loc) • 22.3 kB
JavaScript
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var React = require('react');
var React__default = _interopDefault(React);
var Web3Modal = _interopDefault(require('web3modal'));
var WalletConnect = _interopDefault(require('@walletconnect/web3-provider'));
var ethers = require('ethers');
var xdcpayWeb3modal = require('xdcpay-web3modal');
var detectEthereumProvider = _interopDefault(require('@metamask/detect-provider'));
// A type of promise-like that resolves synchronously and supports only one observer
const _Pact = /*#__PURE__*/(function() {
function _Pact() {}
_Pact.prototype.then = function(onFulfilled, onRejected) {
const result = new _Pact();
const state = this.s;
if (state) {
const callback = state & 1 ? onFulfilled : onRejected;
if (callback) {
try {
_settle(result, 1, callback(this.v));
} catch (e) {
_settle(result, 2, e);
}
return result;
} else {
return this;
}
}
this.o = function(_this) {
try {
const value = _this.v;
if (_this.s & 1) {
_settle(result, 1, onFulfilled ? onFulfilled(value) : value);
} else if (onRejected) {
_settle(result, 1, onRejected(value));
} else {
_settle(result, 2, value);
}
} catch (e) {
_settle(result, 2, e);
}
};
return result;
};
return _Pact;
})();
// Settles a pact synchronously
function _settle(pact, state, value) {
if (!pact.s) {
if (value instanceof _Pact) {
if (value.s) {
if (state & 1) {
state = value.s;
}
value = value.v;
} else {
value.o = _settle.bind(null, pact, state);
return;
}
}
if (value && value.then) {
value.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));
return;
}
pact.s = state;
pact.v = value;
const observer = pact.o;
if (observer) {
observer(pact);
}
}
}
function _isSettledPact(thenable) {
return thenable instanceof _Pact && thenable.s & 1;
}
const _iteratorSymbol = /*#__PURE__*/ typeof Symbol !== "undefined" ? (Symbol.iterator || (Symbol.iterator = Symbol("Symbol.iterator"))) : "@@iterator";
const _asyncIteratorSymbol = /*#__PURE__*/ typeof Symbol !== "undefined" ? (Symbol.asyncIterator || (Symbol.asyncIterator = Symbol("Symbol.asyncIterator"))) : "@@asyncIterator";
// Asynchronously implement a generic for loop
function _for(test, update, body) {
var stage;
for (;;) {
var shouldContinue = test();
if (_isSettledPact(shouldContinue)) {
shouldContinue = shouldContinue.v;
}
if (!shouldContinue) {
return result;
}
if (shouldContinue.then) {
stage = 0;
break;
}
var result = body();
if (result && result.then) {
if (_isSettledPact(result)) {
result = result.s;
} else {
stage = 1;
break;
}
}
if (update) {
var updateValue = update();
if (updateValue && updateValue.then && !_isSettledPact(updateValue)) {
stage = 2;
break;
}
}
}
var pact = new _Pact();
var reject = _settle.bind(null, pact, 2);
(stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);
return pact;
function _resumeAfterBody(value) {
result = value;
do {
if (update) {
updateValue = update();
if (updateValue && updateValue.then && !_isSettledPact(updateValue)) {
updateValue.then(_resumeAfterUpdate).then(void 0, reject);
return;
}
}
shouldContinue = test();
if (!shouldContinue || (_isSettledPact(shouldContinue) && !shouldContinue.v)) {
_settle(pact, 1, result);
return;
}
if (shouldContinue.then) {
shouldContinue.then(_resumeAfterTest).then(void 0, reject);
return;
}
result = body();
if (_isSettledPact(result)) {
result = result.v;
}
} while (!result || !result.then);
result.then(_resumeAfterBody).then(void 0, reject);
}
function _resumeAfterTest(shouldContinue) {
if (shouldContinue) {
result = body();
if (result && result.then) {
result.then(_resumeAfterBody).then(void 0, reject);
} else {
_resumeAfterBody(result);
}
} else {
_settle(pact, 1, result);
}
}
function _resumeAfterUpdate() {
if (shouldContinue = test()) {
if (shouldContinue.then) {
shouldContinue.then(_resumeAfterTest).then(void 0, reject);
} else {
_resumeAfterTest(shouldContinue);
}
} else {
_settle(pact, 1, result);
}
}
}
// Asynchronously call a function and send errors to recovery continuation
function _catch(body, recover) {
try {
var result = body();
} catch(e) {
return recover(e);
}
if (result && result.then) {
return result.then(void 0, recover);
}
return result;
}
var styles = {"apple_pay_button":"_3_Q3-","apple_pay_button_black":"_2BsBO","apple_pay_button_white":"_2Y-yd","apple_pay_button_white_with_line":"_QS2QA","apple_pay_button-white_with_line":"_1XKIR","btn-disabled":"_3zhgE"};
var contractData = {
PLI: {
51: {
ADDRESS: "0xb3db178db835b4dfcb4149b2161644058393267d",
ABI: [{
"constant": !1,
"inputs": [{
"name": "spender",
"type": "address"
}, {
"name": "value",
"type": "uint256"
}],
"name": "approve",
"outputs": [{
"name": "",
"type": "bool"
}],
"payable": !1,
"type": "function",
"stateMutability": "nonpayable"
}, {
"constant": !0,
"inputs": [],
"name": "totalSupply",
"outputs": [{
"name": "",
"type": "uint256"
}],
"payable": !1,
"type": "function",
"stateMutability": "view"
}, {
"constant": !1,
"inputs": [{
"name": "from",
"type": "address"
}, {
"name": "to",
"type": "address"
}, {
"name": "value",
"type": "uint256"
}],
"name": "transferFrom",
"outputs": [{
"name": "",
"type": "bool"
}],
"payable": !1,
"type": "function",
"stateMutability": "nonpayable"
}, {
"constant": !1,
"inputs": [{
"name": "to",
"type": "address"
}, {
"name": "value",
"type": "uint256"
}, {
"name": "data",
"type": "bytes"
}],
"name": "transferAndCall",
"outputs": [{
"name": "success",
"type": "bool"
}],
"payable": !1,
"type": "function",
"stateMutability": "nonpayable"
}, {
"constant": !0,
"inputs": [{
"name": "who",
"type": "address"
}],
"name": "balanceOf",
"outputs": [{
"name": "",
"type": "uint256"
}],
"payable": !1,
"type": "function",
"stateMutability": "view"
}, {
"constant": !1,
"inputs": [{
"name": "to",
"type": "address"
}, {
"name": "value",
"type": "uint256"
}],
"name": "transfer",
"outputs": [{
"name": "",
"type": "bool"
}],
"payable": !1,
"type": "function",
"stateMutability": "nonpayable"
}, {
"constant": !0,
"inputs": [{
"name": "owner",
"type": "address"
}, {
"name": "spender",
"type": "address"
}],
"name": "allowance",
"outputs": [{
"name": "",
"type": "uint256"
}],
"payable": !1,
"type": "function",
"stateMutability": "view"
}, {
"anonymous": !1,
"inputs": [{
"indexed": !0,
"name": "from",
"type": "address"
}, {
"indexed": !0,
"name": "to",
"type": "address"
}, {
"indexed": !1,
"name": "value",
"type": "uint256"
}, {
"indexed": !1,
"name": "data",
"type": "bytes"
}],
"name": "Transfer",
"type": "event"
}, {
"anonymous": !1,
"inputs": [{
"indexed": !0,
"name": "owner",
"type": "address"
}, {
"indexed": !0,
"name": "spender",
"type": "address"
}, {
"indexed": !1,
"name": "value",
"type": "uint256"
}],
"name": "Approval",
"type": "event"
}]
},
50: {
ADDRESS: "0xff7412ea7c8445c46a8254dfb557ac1e48094391",
ABI: [{
"constant": !1,
"inputs": [{
"name": "spender",
"type": "address"
}, {
"name": "value",
"type": "uint256"
}],
"name": "approve",
"outputs": [{
"name": "",
"type": "bool"
}],
"payable": !1,
"type": "function",
"stateMutability": "nonpayable"
}, {
"constant": !0,
"inputs": [],
"name": "totalSupply",
"outputs": [{
"name": "",
"type": "uint256"
}],
"payable": !1,
"type": "function",
"stateMutability": "view"
}, {
"constant": !1,
"inputs": [{
"name": "from",
"type": "address"
}, {
"name": "to",
"type": "address"
}, {
"name": "value",
"type": "uint256"
}],
"name": "transferFrom",
"outputs": [{
"name": "",
"type": "bool"
}],
"payable": !1,
"type": "function",
"stateMutability": "nonpayable"
}, {
"constant": !1,
"inputs": [{
"name": "to",
"type": "address"
}, {
"name": "value",
"type": "uint256"
}, {
"name": "data",
"type": "bytes"
}],
"name": "transferAndCall",
"outputs": [{
"name": "success",
"type": "bool"
}],
"payable": !1,
"type": "function",
"stateMutability": "nonpayable"
}, {
"constant": !0,
"inputs": [{
"name": "who",
"type": "address"
}],
"name": "balanceOf",
"outputs": [{
"name": "",
"type": "uint256"
}],
"payable": !1,
"type": "function",
"stateMutability": "view"
}, {
"constant": !1,
"inputs": [{
"name": "to",
"type": "address"
}, {
"name": "value",
"type": "uint256"
}],
"name": "transfer",
"outputs": [{
"name": "",
"type": "bool"
}],
"payable": !1,
"type": "function",
"stateMutability": "nonpayable"
}, {
"constant": !0,
"inputs": [{
"name": "owner",
"type": "address"
}, {
"name": "spender",
"type": "address"
}],
"name": "allowance",
"outputs": [{
"name": "",
"type": "uint256"
}],
"payable": !1,
"type": "function",
"stateMutability": "view"
}, {
"anonymous": !1,
"inputs": [{
"indexed": !0,
"name": "from",
"type": "address"
}, {
"indexed": !0,
"name": "to",
"type": "address"
}, {
"indexed": !1,
"name": "value",
"type": "uint256"
}, {
"indexed": !1,
"name": "data",
"type": "bytes"
}],
"name": "Transfer",
"type": "event"
}, {
"anonymous": !1,
"inputs": [{
"indexed": !0,
"name": "owner",
"type": "address"
}, {
"indexed": !0,
"name": "spender",
"type": "address"
}, {
"indexed": !1,
"name": "value",
"type": "uint256"
}],
"name": "Approval",
"type": "event"
}]
}
}
};
var coingekoIds = {
XDC: "xdce-crowd-sale",
PLI: "plugin"
};
function Paypli(props) {
var _useState = React.useState(false),
disable = _useState[0],
setDisable = _useState[1];
var _useState2 = React.useState(),
btnLabel = _useState2[0],
setbtnLabel = _useState2[1];
var _useState3 = React.useState({}),
setprovider = _useState3[1];
var _useState4 = React.useState({}),
setcoingekoID = _useState4[1];
var _useState5 = React.useState("0"),
amount = _useState5[0],
setamount = _useState5[1];
var _useState6 = React.useState(0),
basePrice = _useState6[0],
setbasePrice = _useState6[1];
React.useEffect(function () {
if (!props.amount || props.amount === "") {
errorResponse.amount = errorMsg["amount"];
return null;
}
var findIds = coingekoIds[props.paymethod];
console.log("Find IDS", findIds);
if (findIds) {
setcoingekoID(findIds);
fetch("https://api.coingecko.com/api/v3/simple/price?ids=" + findIds + "&vs_currencies=" + props.fiatcurrency).then(function (response) {
return response.json();
}).then(function (data) {
console.log(data);
var resAmount = data[findIds][props.fiatcurrency];
setbasePrice(resAmount);
var calculate = parseFloat(props.amount) * parseFloat(resAmount).toFixed(4);
setamount(calculate.toString());
setbtnLabel("Pay " + calculate + " " + props.paymethod);
})["catch"](function (err) {
return console.log(err);
});
} else {
props.onError({
paymethod: "Pay Method Not Available"
});
return null;
}
}, []);
detectEthereumProvider().then(function (res) {
if (!res) {
setDisable(true);
}
});
var errorMsg = {
chainId: "Chain ID is required",
receiverAddress: "Receiver Address is required",
amount: "Amount is required"
};
var errorResponse = {};
var web3Modal = new Web3Modal({
cacheProvider: true,
disableInjectedProvider: true,
providerOptions: {
walletconnect: {
"package": WalletConnect,
options: {
infuraId: "27e484dcd9e3efcfd25a83a78777cdf1",
rpc: {
50: "https://xdcpayrpc.blocksscan.io/",
51: "https://apothemxdcpayrpc.blocksscan.io/"
}
}
},
'custom-xdc': xdcpayWeb3modal.getXdcModal
}
});
var onConnect = function onConnect() {
try {
if (!props.chainId || props.chainId === "") {
errorResponse.chainId = errorMsg["chainId"];
}
if (!props.receiverAddress || props.receiverAddress === "") {
errorResponse.receiverAddress = errorMsg["receiverAddress"];
}
if (!props.amount || props.amount === "") {
errorResponse.amount = errorMsg["amount"];
}
if (!props.paymethod || props.paymethod === "") {
errorResponse.paymethod = errorMsg["paymethod"];
}
if (parseFloat(amount) === 0) {
props.onError({
amount: "Amount must be greater than 0"
});
}
return Promise.resolve(_catch(function () {
if (Object.keys(errorResponse).length > 0) {
props.onError(errorResponse);
return;
}
return Promise.resolve(web3Modal.connect()).then(function (instance) {
var providerConnect = new ethers.ethers.providers.Web3Provider(instance);
setprovider(providerConnect);
return Promise.resolve(providerConnect.getNetwork()).then(function (_ref) {
var chainId = _ref.chainId;
if (props.chainId != chainId) {
errorResponse.chainId = "Network Mismatched";
props.onError(errorResponse);
return;
}
return Promise.resolve(providerConnect.listAccounts()).then(function (accounts) {
if (accounts.length === 0) {
errorResponse.msg = "Xdc Pay Not LoggedIn";
props.onError(errorResponse);
return;
}
var signer = providerConnect.getSigner();
return Promise.resolve(signer.getAddress()).then(function (address) {
var _exit = false;
function _temp4(_result2) {
return _exit ? _result2 : Promise.resolve(getTxnStatus(transactionHash, providerConnect)).then(function (_ref2) {
var txhash = _ref2[0],
status = _ref2[1];
if (!status) {
props.onFailure({
hash: transactionHash,
success: false,
msg: "Error Occured on Blockchain"
});
return;
}
props.onSuccess({
hash: transactionHash,
success: true,
fiatcurrency: props.fiatcurrency,
amount: props.amount,
paymethod: props.paymethod,
receiverAddress: props.receiverAddress
});
setbtnLabel("Pay " + amount + " " + props.paymethod);
});
}
setbtnLabel("Processing...");
var transactionHash;
var _temp3 = function () {
if (props.paymethod === "XDC") {
var params = [{
from: address,
to: props.receiverAddress,
value: ethers.ethers.utils.parseUnits(amount, 'ether').toHexString()
}];
return Promise.resolve(providerConnect.send('eth_sendTransaction', params)).then(function (_providerConnect$send) {
transactionHash = _providerConnect$send;
});
} else return function () {
if (props.paymethod != "XDC") {
var temppaymethod = props.paymethod;
var findpay = contractData[temppaymethod];
if (!findpay) {
props.onError({
paymethod: "Pay Method Not Available"
});
setbtnLabel("Pay " + amount + " " + props.paymethod);
var _temp5 = null;
_exit = true;
return _temp5;
}
var ADDRESS = findpay[chainId].ADDRESS;
var ABI = findpay[chainId].ABI;
var paymentTokenInstance = new ethers.ethers.Contract(ADDRESS, ABI, signer);
return Promise.resolve(paymentTokenInstance.balanceOf(address)).then(function (tokenbalance) {
var tokenValue = ethers.ethers.utils.formatEther(tokenbalance);
if (parseFloat(tokenValue) < parseFloat(amount)) {
props.onError({
msg: "Low Token Balance"
});
setbtnLabel("Pay " + amount + " " + props.paymethod);
_exit = true;
return;
}
var amountInWei = ethers.ethers.utils.parseUnits(amount, 18);
return Promise.resolve(paymentTokenInstance.transfer(props.receiverAddress, amountInWei)).then(function (_paymentTokenInstance) {
transactionHash = _paymentTokenInstance;
transactionHash = transactionHash.hash;
});
});
} else {
props.onError({
paymethod: "Pay Method Not Available"
});
setbtnLabel("Pay " + amount + " " + props.paymethod);
var _temp6 = null;
_exit = true;
return _temp6;
}
}();
}();
return _temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3);
});
});
});
});
}, function (err) {
console.log("err", err);
props.onError(err);
setbtnLabel("Pay " + amount + " " + props.paymethod);
}));
} catch (e) {
return Promise.reject(e);
}
};
var sleep = function sleep(milliseconds) {
return new Promise(function (resolve) {
return setTimeout(resolve, milliseconds);
});
};
var getTxnStatus = function getTxnStatus(txHash, provider) {
try {
var _temp9 = function _temp9() {
if (transactionReceipt.status) {
return [txHash, true];
} else {
return [txHash, false];
}
};
var transactionReceipt = null;
var _temp10 = _for(function () {
return transactionReceipt == null;
}, void 0, function () {
return Promise.resolve(provider.getTransactionReceipt(txHash)).then(function (_provider$getTransact) {
transactionReceipt = _provider$getTransact;
return Promise.resolve(sleep(3000)).then(function () {});
});
});
return Promise.resolve(_temp10 && _temp10.then ? _temp10.then(_temp9) : _temp9(_temp10));
} catch (e) {
return Promise.reject(e);
}
};
return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("button", {
onClick: onConnect,
disabled: disable,
className: props.style + " " + (disable && styles.btn_disabled)
}, btnLabel), /*#__PURE__*/React__default.createElement("br", null), /*#__PURE__*/React__default.createElement("small", {
style: {
fontSize: 10
}
}, "1 ", props.fiatcurrency, " = ", basePrice, " ", props.paymethod));
}
module.exports = Paypli;
//# sourceMappingURL=index.js.map