var vConsole = new window.VConsole() window.wallet = window.wallet = {} const DEFAULT_CHAIN_DATA = { name: 'Matic Testnet RPC', type: 'Testnet', rpc: 'https://rpc-mumbai.maticvigil.com', id: 80001, symbol: 'MATIC', explorerurl: 'https://mumbai.polygonscan.com/', } const loader = document.getElementById('loader') const WALLET_ADDRESS = '' function toHexChainId(chainId) { return '0x' + chainId.toString(16) } // 显示加载动画 function showLoading() { // add style display: block loader.style.display = 'block' } // 隐藏加载动画 function hideLoading() { // add style display: none loader.style.display = 'none' } // 加载json async function loadJson(url) { return fetch(url).then(response => response.json()) } async function initInstance(user, address, jsonUrl) { let json = await loadJson(jsonUrl) return new wallet.web3.eth.Contract(json.abi, address, { from: user }) } async function initWallet() { wallet.contract = await initInstance(wallet.account, wallet.walletAddress, '/public/abis/BEMultiSigWallet.json') } async function confirmTask() { console.log('confirm task') let ids = wallet.scheduleList showLoading() try { let gas = await wallet.contract.methods.confirmTransaction(ids).estimateGas() gas = gas | 0 await wallet.contract.methods.confirmTransaction(ids).send({ gas }) } catch (err) { console.log('error confirm task', err) } hideLoading() } async function rejectTask() { console.log('reject task') let ids = wallet.scheduleList showLoading() try { let gas = await wallet.contract.methods.revokeConfirmation(ids).estimateGas() gas = gas | 0 await wallet.contract.methods.revokeConfirmation(ids).send({ gas }) } catch (err) { console.log('error confirm task', err) } hideLoading() } function makeBatchRequest(calls, callFrom) { let batch = new wallet.web3.BatchRequest() let promises = calls.map(call => { return new Promise((resolve, reject) => { let request = call.request({ from: callFrom }, (error, data) => { if (error) { reject(error) } else { resolve(data) } }) batch.add(request) }) }) batch.execute() return Promise.all(promises) } /** * 查询定时 * @param {bytes32} id beginSchedule返回的id * @returns */ async function querySchedule(id) { let instance = wallet.contract return makeBatchRequest([ instance.methods.isOperation(id).call, instance.methods.isOperationPending(id).call, instance.methods.isOperationReady(id).call, instance.methods.isOperationDone(id).call, instance.methods.isConfirmed(id).call, instance.methods.getTimestamp(id).call, ]) } function initUIEvent() { var btnConfirm = document.getElementById('btn-confirm') btnConfirm.addEventListener('click', confirmTask, false) var btnReject = document.getElementById('btn-reject') btnReject.addEventListener('click', rejectTask, false) } async function connectMetaMask() { let provider = null if (typeof window.ethereum !== 'undefined') { provider = window.ethereum try { await provider.request({ method: 'eth_requestAccounts' }) } catch (error) { if (error.code === -32002) { throw new Error('MeatMask not login, Open MeatMask and login first') } else { throw new Error('User Rejected') } } } else if (window.web3) { provider = window.web3.currentProvider } else if (window.celo) { provider = window.celo } else { throw new Error('No Web3 Provider found') } return provider } async function confirmNeededChain() { const chainId = wallet.chainId if (chainId !== DEFAULT_CHAIN_DATA.id) { await switchEthereumChain() } } async function switchEthereumChain() { let data = DEFAULT_CHAIN_DATA let hexChainId = toHexChainId(data.id) try { await wallet.provider.request({ method: 'wallet_addEthereumChain', params: [ { chainId: hexChainId, chainName: data.name, nativeCurrency: { name: data.symbol, symbol: data.symbol, decimals: data.decimals || 18, }, blockExplorerUrls: [data.explorerurl], rpcUrls: [data.rpc], }, ], }) console.log('add chain success') } catch (addError) { console.error('add chain error: ', addError) } // try { // await wallet.provider.request({ // method: 'wallet_switchEthereumChain', // params: [{ chainId: hexChainId }], // }) // console.log('switch chain success') // } catch (e) { // console.log('switch chain error: ', e) // if (e.code === 4902 || e.message.indexOf('Unrecognized chain ID') >= 0) { // try { // await wallet.provider.request({ // method: 'wallet_addEthereumChain', // params: [ // { // chainId: hexChainId, // chainName: data.name, // nativeCurrency: { // name: data.symbol, // symbol: data.symbol, // decimals: data.decimals || 18, // }, // blockExplorerUrls: [data.explorerurl], // rpcUrls: [data.rpc], // }, // ], // }) // console.log('add chain success') // } catch (addError) { // console.error('add chain error: ', addError) // } // } // } } function subscribeToEvents(provider) { provider.on('accountsChanged', async accounts => { if (accounts && accounts.length > 0) { if (wallet.account !== accounts[0]) { console.log('account change', wallet.account, accounts[0]) wallet.account = accounts } } }) // Subscribe to chainId change provider.on('chainChanged', async chainId => { const chainIdNum = parseInt(chainId) console.log('chainChanged', chainId, chainIdNum) if (wallet.chainId !== chainIdNum) { wallet.chainId = chainIdNum await confirmNeededChain() } }) // Subscribe to session disconnection provider.on('disconnect', err => { console.log('disconnect', err) }) } function loadTaskData() { wallet.walletAddress = document.getElementById('wallet-address').value let nodes = document.getElementsByClassName('scheduleId') wallet.scheduleList = [] for (let node of nodes) { wallet.scheduleList.push(node.value) } console.log(wallet.scheduleList) } ;(async function () { loadTaskData() initUIEvent() let self = window.wallet self.provider = await connectMetaMask() self.web3 = new Web3(self.provider) let accounts = await self.web3.eth.getAccounts() if (accounts.length > 0) { self.account = accounts[0] } self.chainId = await self.web3.eth.getChainId() console.log('chainId: ', self.chainId, 'account: ', self.account) await confirmNeededChain() subscribeToEvents(self.provider) await initWallet() setTimeout(async () => { let result = await querySchedule('0xa5c35368cd44dbe805a4595d6813ed3afefa1bf667209dc8d63f99cdec117f58') console.log(result) }, 5000) })()