2023-04-10 16:19:12 +08:00

257 lines
6.9 KiB
JavaScript

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.confirmTransactionBatch(ids).estimateGas()
gas = gas | 0
await wallet.contract.methods.confirmTransactionBatch(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.revokeConfirmationBatch(ids).estimateGas()
gas = gas | 0
await wallet.contract.methods.revokeConfirmationBatch(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)
})()