258 lines
6.9 KiB
JavaScript
258 lines
6.9 KiB
JavaScript
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)
|
|
})()
|