diff --git a/Platform/Client/httpInterface.js b/Platform/Client/httpInterface.js index 81e4a60af..d00205b88 100644 --- a/Platform/Client/httpInterface.js +++ b/Platform/Client/httpInterface.js @@ -79,6 +79,16 @@ exports.newHttpInterface = function newHttpInterface() { SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse) return } + case 'getUserWalletBalance': { + + let serverResponse = await PL.servers.WEB3_SERVER.getUserWalletBalance( + params.walletAddress, + params.contractAddress + ) + + SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse) + return + } case 'getWalletBalances': { let serverResponse = await PL.servers.WEB3_SERVER.getWalletBalances( diff --git a/Platform/Client/web3Server.js b/Platform/Client/web3Server.js index e3f7d5888..0e4624bf5 100644 --- a/Platform/Client/web3Server.js +++ b/Platform/Client/web3Server.js @@ -5,6 +5,7 @@ exports.newWeb3Server = function newWeb3Server() { let thisObject = { getNetworkClientStatus: getNetworkClientStatus, createWalletAccount: createWalletAccount, + getUserWalletBalance: getUserWalletBalance, getWalletBalances: getWalletBalances, signData: signData, hashData: hashData, @@ -82,6 +83,28 @@ exports.newWeb3Server = function newWeb3Server() { } } + async function getUserWalletBalance(walletAddress, contractAddress) { + + const bscUri = 'https://bsc-dataseed.binance.org/' + const web3 = new Web3(bscUri) + + let balance + + let ABI = [{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"amount","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"listAddress","type":"address"},{"name":"isBlackListed","type":"bool"}],"name":"blackListAddress","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_decimals","type":"uint256"},{"name":"_supply","type":"uint256"},{"name":"tokenOwner","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"burner","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"blackListed","type":"address"},{"indexed":false,"name":"value","type":"bool"}],"name":"Blacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}] + + const contractInst = new web3.eth.Contract(ABI, contractAddress) + + async function getBalance() { + balance = await contractInst.methods.balanceOf(walletAddress).call().then(result => web3.utils.fromWei(result, 'ether')) + return balance + } + + await getBalance() + + return balance + + } + async function getWalletBalances(host, port, interface, walletDefinition) { let key = 'host (' + host + ') at port (' + port + ') via interface (' + interface + ')' diff --git a/Projects/Governance/UI/Globals/SaToken.js b/Projects/Governance/UI/Globals/SaToken.js index 3b1b672ef..915cda9d4 100644 --- a/Projects/Governance/UI/Globals/SaToken.js +++ b/Projects/Governance/UI/Globals/SaToken.js @@ -8,7 +8,7 @@ function newGovernanceGlobalsSaToken() { SA_TOKEN_BSC_PANCAKE_LIQUIDITY_POOL_BNB_CONTRACT_ADDRESS: '0xd4a05523839d0d175289054022ee4e01e3dae854', SA_TOKEN_BSC_PANCAKE_LIQUIDITY_POOL_BUSD_CONTRACT_ADDRESS: '0xf9e8ce74058d872f7688665885826c3d5e1d0a27', SA_TOKEN_BSC_PANCAKE_LIQUIDITY_POOL_ETH_CONTRACT_ADDRESS: '0x4f25B8aB3f8c66Ce4C507C058B7040F6d58202b4', - SA_TOKEN_BSC_PANCAKE_LIQUIDITY_ASSETS: ['BTCB', 'BNB', 'BUSD'] + SA_TOKEN_BSC_PANCAKE_LIQUIDITY_ASSETS: ['BTCB', 'BNB', 'BUSD', 'ETH'] } return thisObject } \ No newline at end of file diff --git a/Projects/Governance/UI/Spaces/User-Profile-Space/UserProfile.js b/Projects/Governance/UI/Spaces/User-Profile-Space/UserProfile.js index 943ab4a2c..3397da39a 100644 --- a/Projects/Governance/UI/Spaces/User-Profile-Space/UserProfile.js +++ b/Projects/Governance/UI/Spaces/User-Profile-Space/UserProfile.js @@ -161,7 +161,7 @@ function newGovernanceUserProfileSpace() { if (tokenTransfers.length > 9000) { console.log('[WARN] The total amount of BSC SA Token transfers is above 9000. After 10k this method will need pagination or otherwise users will not get their reputation calculated correctly.') } else { - console.log('[INFO] ' + tokenTransfers.length + ' reputation trasactions found at the blockchain. ') + console.log('[INFO] ' + tokenTransfers.length + ' reputation transactions found at the blockchain. ') } waitingForResponses-- }).catch(function (err) { @@ -446,89 +446,81 @@ function newGovernanceUserProfileSpace() { userProfile.payload.liquidityTokens = { BTCB: 0, BNB: 0, - BUSD: 0 + BUSD: 0, + ETH: 0 } - waitingForResponses++ - waitingForResponses++ - waitingForResponses++ - waitingForResponses++ - setTimeout(getBPancakeTokens, BSC_SCAN_RATE_LIMIT_DELAY / 6 * 1, userProfile, blockchainAccount, 'BTCB', UI.projects.governance.globals.saToken.SA_TOKEN_BSC_PANCAKE_LIQUIDITY_POOL_BTCB_CONTRACT_ADDRESS) - setTimeout(getBPancakeTokens, BSC_SCAN_RATE_LIMIT_DELAY / 6 * 2, userProfile, blockchainAccount, 'BNB', UI.projects.governance.globals.saToken.SA_TOKEN_BSC_PANCAKE_LIQUIDITY_POOL_BNB_CONTRACT_ADDRESS) - setTimeout(getBPancakeTokens, BSC_SCAN_RATE_LIMIT_DELAY / 6 * 3, userProfile, blockchainAccount, 'BUSD', UI.projects.governance.globals.saToken.SA_TOKEN_BSC_PANCAKE_LIQUIDITY_POOL_BUSD_CONTRACT_ADDRESS) - setTimeout(getBPancakeTokens, BSC_SCAN_RATE_LIMIT_DELAY / 6 * 4, userProfile, blockchainAccount, 'ETH', UI.projects.governance.globals.saToken.SA_TOKEN_BSC_PANCAKE_LIQUIDITY_POOL_ETH_CONTRACT_ADDRESS) + getBPancakeTokens(userProfile, blockchainAccount, 'BTCB', UI.projects.governance.globals.saToken.SA_TOKEN_BSC_PANCAKE_LIQUIDITY_POOL_BTCB_CONTRACT_ADDRESS) + getBPancakeTokens(userProfile, blockchainAccount, 'BNB', UI.projects.governance.globals.saToken.SA_TOKEN_BSC_PANCAKE_LIQUIDITY_POOL_BNB_CONTRACT_ADDRESS) + getBPancakeTokens(userProfile, blockchainAccount, 'BUSD', UI.projects.governance.globals.saToken.SA_TOKEN_BSC_PANCAKE_LIQUIDITY_POOL_BUSD_CONTRACT_ADDRESS) + getBPancakeTokens(userProfile, blockchainAccount, 'ETH', UI.projects.governance.globals.saToken.SA_TOKEN_BSC_PANCAKE_LIQUIDITY_POOL_ETH_CONTRACT_ADDRESS) /* Now we get the SA Tokens Balance. */ - waitingForResponses++ - setTimeout(getBlockchainTokens, BSC_SCAN_RATE_LIMIT_DELAY / 6 * 5, userProfile, blockchainAccount) + getBlockchainTokens(userProfile, blockchainAccount) } } } function getBlockchainTokens(userProfile, blockchainAccount) { - console.log('[INFO] Loading Blockachain Balance for User Profile: ', userProfile.name, 'blockchainAccount: ', blockchainAccount) - const url = "https://api.bscscan.com/api?module=account&action=tokenbalance&contractaddress=" + UI.projects.governance.globals.saToken.SA_TOKEN_BSC_CONTRACT_ADDRESS + "&address=" + blockchainAccount + "&tag=latest&apikey=YourApiKeyToken" + console.log('[INFO] Loading Blockchain Balance for User Profile: ', userProfile.name, 'blockchainAccount: ', blockchainAccount) - fetch(url).then(function (response) { - return response.json(); - }).then(function (data) { + let request = { + url: 'WEB3', + params: { + method: "getUserWalletBalance", + walletAddress: blockchainAccount, + contractAddress: UI.projects.governance.globals.saToken.SA_TOKEN_BSC_CONTRACT_ADDRESS + } + } + + httpRequest(JSON.stringify(request.params), request.url, onResponse) + + function onResponse(err, data) { userProfile.payload.bloackchainBalancesLoading = false userProfile.payload.isLoading = false - if (data.result === "Max rate limit reached, please use API Key for higher rate limit") { + if (err.result === GLOBAL.DEFAULT_FAIL_RESPONSE) { + console.log('[WARN] Error fetching blockchain tokens of user profile ' + userProfile.name) userProfile.payload.blockchainTokens = undefined } else { - userProfile.payload.uiObject.setInfoMessage('Blockchan Balance Succesfully Loaded.', + userProfile.payload.uiObject.setInfoMessage('Blockchain Balance Successfully Loaded.', UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR ) - userProfile.payload.blockchainTokens = Number(data.result) / 1000000000000000000 + userProfile.payload.blockchainTokens = Number(data) console.log('[INFO] SA Balance of ' + userProfile.name + ' is ', userProfile.payload.blockchainTokens) userProfile.payload.reputation = Math.min(reputationByAddress.get(blockchainAccount.toLowerCase()) | 0, userProfile.payload.blockchainTokens) console.log('[INFO] Reputation of ' + userProfile.name + ' is ', userProfile.payload.reputation) } - waitingForResponses-- - }).catch(function (err) { - const message = err.message + ' - ' + 'Can not access BSC SCAN servers.' - console.log(message) - if (userProfile.payload !== undefined) { - userProfile.payload.uiObject.setErrorMessage(message, - UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR - ) - } - waitingForResponses-- - }); + } } function getBPancakeTokens(userProfile, blockchainAccount, asset, marketContract) { console.log('[INFO] Loading Pancake Balance for User Profile: ', userProfile.name, 'blockchainAccount: ', blockchainAccount, 'asset: ', asset) - const url = "https://api.bscscan.com/api?module=account&action=tokenbalance&contractaddress=" + marketContract + "&address=" + blockchainAccount + "&tag=latest&apikey=YourApiKeyToken" - fetch(url).then(function (response) { - return response.json(); - }).then(function (data) { - //console.log(data) - if (data.result === "Max rate limit reached, please use API Key for higher rate limit") { - console.log('[WARN] Rate Limit Reached fetching liquidity tokens for asset ' + asset + ' of user profile ' + userProfile.name) + let request = { + url: 'WEB3', + params: { + method: "getUserWalletBalance", + walletAddress: blockchainAccount, + contractAddress: marketContract + } + } + + httpRequest(JSON.stringify(request.params), request.url, onResponse) + + function onResponse(err, data) { + if (err.result === GLOBAL.DEFAULT_FAIL_RESPONSE) { + console.log('[WARN] Error fetching liquidity tokens for asset ' + asset + ' of user profile ' + userProfile.name) userProfile.payload.blockchainTokens = undefined } else { - userProfile.payload.uiObject.setInfoMessage('Pancake Balance Succesfully Loaded for asset ' + asset, + userProfile.payload.uiObject.setInfoMessage('Pancake Balance Successfully Loaded for asset ' + asset, UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR ) - userProfile.payload.liquidityTokens[asset] = Number(data.result) / 1000000000000000000 + userProfile.payload.liquidityTokens[asset] = Number(data) console.log('[INFO] Liquidity of ' + userProfile.name + ' for asset ' + asset + ' is ', userProfile.payload.liquidityTokens[asset]) } - waitingForResponses-- - }).catch(function (err) { - const message = err.message + ' - ' + 'Can not access BSC SCAN servers.' - console.log(message) - if (userProfile.payload !== undefined) { - userProfile.payload.uiObject.setErrorMessage(message, - UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR - ) - } - waitingForResponses-- - }); + } } }