UNPKG

sirius-explorer

Version:

An open-source front-end for the Insight API.

369 lines (267 loc) 10.1 kB
'use strict'; angular.module('insight.token').controller('TokenController', function($routeParams, $rootScope, $location, ERC20ContractInfo, ERC20Transfers, ERC20AddressBalances, ERC20Holders, ContractsRepository, SolidityCoder, Web3Utils, Contracts, BigNumber) { if (!Web3Utils.isAddress($routeParams.address) && !Contracts.isValidSiriusAddress($routeParams.address)) { $rootScope.flashMessage = 'Invalid Address: ' + $routeParams.address; $location.path('e404').replace(); return false; } var contractEthAddress = $routeParams.address; if (!Web3Utils.isAddress(contractEthAddress)) { contractEthAddress = Contracts.getEthAddressFromBitAddress($routeParams.address); $location.path('token/' + contractEthAddress).replace(); return false; } var contractBase58Address = Contracts.getBitAddressFromContractAddress($routeParams.address); var self = this; var BALANCE_OF_METHOD_HASH = '70a08231'; var ALLOWANCE_METHOD_HASH = 'dd62ed3e'; self.tokenInfo = {}; self.transfers = {}; self.holders = {}; self.filterByAddress = null; if ($routeParams.a) { if (Web3Utils.isAddress($routeParams.a)) { self.filterByAddress = Contracts.getBitAddressFromContractAddress($routeParams.a); } if (Contracts.isValidSiriusAddress($routeParams.a)) { self.filterByAddress = $routeParams.a; } } self.addressBalance = null; self.readSmartContractTab = { balanceOf: { owner_address: '', inProcess: false, owner_error: '', balance: 0, requested_address: '', process_address: '' }, allowance: { owner_address: '', spender_address: '', inProcess: false, owner_error: '', spender_error: '', owner_requested_address: '', owner_process_address: '', spender_requested_address: '', spender_process_address: '' } }; self.contractAddress = $routeParams.address; self.tab = $routeParams.tab && ['transfers', 'holders', 'read-smart-contract'].indexOf($routeParams.tab) !== -1 ? $routeParams.tab : 'transfers'; var _loadTabContent = function(offset) { switch(self.tab){ case 'transfers': { _getTransfers(offset ? offset : 0); break; } case 'holders': { _getHolders(offset ? offset : 0); break; } case 'read-smart-contract': { break; } } }; self.getPercent = function (total, amount) { var amountBN = new BigNumber(amount); return amountBN.dividedBy(total).mul(100).toString(10); }; var _getTransfers = function(offset) { ERC20Transfers.get({ address: contractEthAddress, offset: offset, 'addresses[]': (self.filterByAddress) ? self.filterByAddress: null }).$promise.then(function (trList) { self.transfers = trList; self.transfers.pages = self.transfers.count && self.transfers.limit ? Math.ceil(self.transfers.count / self.transfers.limit) : 0; }); }; var _getHolders = function(offset) { return ERC20Holders.get({ address: contractEthAddress, offset: offset }).$promise.then(function (holderList) { self.holders = holderList; self.holders.pages = self.holders.count && self.holders.limit ? Math.ceil(self.holders.count / self.holders.limit) : 0; }); }; var _loadTokenInfo = function() { ERC20ContractInfo.get({ contractAddress: contractEthAddress, address: self.filterByAddress ? self.filterByAddress : null }, function (info) { if (info) { self.tokenInfo = info; try { self.tokenInfo.contract_address_base = Contracts.getBitAddressFromContractAddress(self.tokenInfo.contract_address); } catch (e) { console.log('Error convert', self.tokenInfo); } } }); if (self.filterByAddress) { ERC20AddressBalances.get({ contractAddress: contractEthAddress, balanceAddress: self.filterByAddress }).$promise.then(function (balance) { self.addressBalance = balance; }).catch(function (err) { console.log(err); }) } }; self.init = function() { _loadTokenInfo(); _loadTabContent(); }; self.paginate = function(offset) { if (self[self.tab].limit && self[self.tab].pages > offset / self[self.tab].limit && offset >= 0 && self[self.tab].offset !== offset) { _loadTabContent(offset); } }; self.setTab = function(tabName) { if (self.tab === tabName) { return; } self.tab = tabName; $location.path('token/' + $routeParams.address + '/' + tabName, false); _loadTabContent(); }; var getEthConvertedAddress = function (address) { try { if (Contracts.isValidSiriusAddress(address)) { var ethAddress = Contracts.getEthAddressFromBitAddress(address); if (ethAddress) { return ethAddress; } } address = address.toLowerCase(); if (Web3Utils.isAddress(address)) { return address; } } catch (e) { console.log(e); } return null; }; /** * BalanceOf row */ self.getAddressBalance = function () { var balanceOfData = self.readSmartContractTab.balanceOf; if (balanceOfData.inProcess) { return false; } var userAddress = balanceOfData.owner_address; var processAddress = getEthConvertedAddress(userAddress); if (!processAddress) { balanceOfData.owner_error = "Invalid address"; return false; } balanceOfData.owner_error = ""; balanceOfData.inProcess = true; return ContractsRepository.call.get({ address: contractEthAddress, hash: BALANCE_OF_METHOD_HASH + SolidityCoder.encodeParam('address', Web3Utils.toAddress(processAddress)) }).$promise.then(function (info) { balanceOfData.requested_address = userAddress; balanceOfData.process_address = processAddress; balanceOfData.owner_address = ''; balanceOfData.inProcess = false; if (info && info.executionResult) { try { var decodedBalance = SolidityCoder.decodeParam("uint256", info.executionResult.output); balanceOfData.balance = decodedBalance.toString(10); } catch (e) { balanceOfData.balance = 0; } } }); }; /** * Allowance row */ self.getAllowanceAmount = function () { var allowanceData = self.readSmartContractTab.allowance; if (allowanceData.inProcess) { return false; } var userOwnerAddress = allowanceData.owner_address; var processOwnerAddress = getEthConvertedAddress(userOwnerAddress); if (!processOwnerAddress) { allowanceData.owner_error = "Invalid address"; return false; } else { allowanceData.owner_error = ""; } var userSpenderAddress = allowanceData.spender_address; var processSpenderAddress = getEthConvertedAddress(userSpenderAddress); if (!processSpenderAddress) { allowanceData.spender_error = "Invalid address"; return false; } else { allowanceData.spender_error = ""; } allowanceData.inProcess = false; return ContractsRepository.call.get({ address: contractEthAddress, hash: ALLOWANCE_METHOD_HASH + SolidityCoder.encodeParam('address', Web3Utils.toAddress(processOwnerAddress)) + SolidityCoder.encodeParam('address', Web3Utils.toAddress(processSpenderAddress)) }).$promise.then(function (info) { allowanceData.owner_requested_address = allowanceData.owner_address; allowanceData.owner_process_address = processOwnerAddress; allowanceData.spender_requested_address = allowanceData.spender_address; allowanceData.spender_process_address = processSpenderAddress; allowanceData.owner_address = ''; allowanceData.spender_address = ''; allowanceData.inProcess = false; if (info.executionResult) { try { var decodedBalance = SolidityCoder.decodeParam("uint256", info.executionResult.output); allowanceData.balance = decodedBalance.toString(10) } catch (e) { allowanceData.balance = 0; } } }); }; /** * Paginate input * */ self.paginateData = { transfers: { paginate_has_error: false, paginate_page: '' }, holders: { paginate_has_error: false, paginate_page: '' } }; self.setPaginateError = function (hasError) { self.paginateData[self.tab].paginate_has_error = hasError; }; self.resetPaginate = function () { self.paginateData[self.tab].paginate_has_error = false; self.paginateData[self.tab].paginate_page = ''; }; self.changePage = function (e) { var countPages = self[self.tab].count && self[self.tab].limit ? Math.ceil(self[self.tab].count / self[self.tab].limit) : 0, value = e.target.value; if (!/^\d+$/.test(value)) { return self.setPaginateError(true); } value = parseInt(e.target.value, 10); if (value && !isNaN(value) && countPages >= value) { self.paginate(self[self.tab].limit * (value - 1)); this.resetPaginate(); } else { self.setPaginateError(true); } }; });