import { useEffect, useState } from 'react';
import { useSDK } from '@metamask/sdk-react';
import { Web3 } from 'web3';
import Button from 'react-bootstrap/Button';
// import './App.css';
import DAOArtifact from './assets/DAO.json';
// import work1Artifact from './assets/Work1.json';
const contracts = {
'0x539': { // Hardhat
DAO: '0x8d914D38dD301FC4606f5aa9fEcF8A76389020d3',
Work1: '0x050C420Cc4995B41217Eba1B54B82Fd5687e9139',
},
'0xaa36a7': { // Sepolia
DAO: '0x8d914D38dD301FC4606f5aa9fEcF8A76389020d3',
Work1: '0x050C420Cc4995B41217Eba1B54B82Fd5687e9139',
},
};
function App() {
const {
sdk, connected, provider, chainId, account, balance,
} = useSDK();
const [DAO, setDAO] = useState();
// const [work1, setWork1] = useState();
// const [work1Price, setWork1Price] = useState();
const [balanceEther, setBalanceEther] = useState();
const [reputation, setReputation] = useState();
const [totalReputation, setTotalReputation] = useState();
const [posts, setPosts] = useState([]);
const [validationPools, setValidationPools] = useState([]);
// const watchReputationToken = useCallback(async () => {
// await provider.request({
// method: 'wallet_watchAsset',
// params: {
// type: 'ERC20',
// options: {
// address: DAOAddress,
// },
// },
// });
// }, [provider]);
useEffect(() => {
if (!provider || !chainId || !account) return;
if (!contracts[chainId]) return;
const web3 = new Web3(provider);
const DAOContract = new web3.eth.Contract(DAOArtifact.abi, contracts[chainId].DAO);
// const work1Contract = new web3.eth.Contract(work1Artifact.abi, contracts[chainId].Work1);
// const fetchPrice = async () => {
// const priceWei = await work1Contract.methods.price().call();
// setWork1Price(web3.utils.fromWei(priceWei, 'ether'));
// };
const fetchReputation = async () => {
setReputation(await DAOContract.methods.balanceOf(account).call());
setTotalReputation(await DAOContract.methods.totalSupply().call());
};
const fetchPosts = async () => {
const count = await DAOContract.methods.postCount().call();
const promises = [];
for (let i = 0; i < count; i += 1) {
promises.push(DAOContract.methods.posts(i).call());
}
const fetchedPosts = await Promise.all(promises);
setPosts(fetchedPosts);
};
const fetchValidationPools = async () => {
const count = await DAOContract.methods.validationPoolCount().call();
const promises = [];
for (let i = 0; i < count; i += 1) {
promises.push(DAOContract.methods.validationPools(i).call());
}
const pools = await Promise.all(promises);
setValidationPools(pools);
};
// fetchPrice();
fetchReputation();
fetchPosts();
fetchValidationPools();
// setWork1(work1Contract);
setDAO(DAOContract);
DAOContract.events.ValidationPoolInitiated({ fromBlock: 'latest' }).on('data', (event) => {
console.log('event: validation pool initiated', event);
fetchPosts();
fetchValidationPools();
});
DAOContract.events.ValidationPoolResolved({ fromBlock: 'latest' }).on('data', (event) => {
console.log('event: validation pool resolved', event);
fetchReputation();
fetchValidationPools();
});
}, [provider, account, chainId]);
useEffect(() => {
if (!provider || balance === undefined) return;
const web3 = new Web3(provider);
setBalanceEther(web3.utils.fromWei(balance, 'ether'));
}, [provider, balance]);
const connect = async () => {
try {
await sdk?.connect();
} catch (err) {
console.warn('failed to connect..', err);
}
};
const disconnect = async () => {
try {
sdk?.terminate();
} catch (err) {
console.warn('failed to disconnect..', err);
}
};
const addPost = async () => {
await DAO.methods.addPost(account).send({
from: account,
gas: 1000000,
});
};
const initiateValidationPool = async (postIndex) => {
const poolDuration = 0;
await DAO.methods.initiateValidationPool(postIndex, poolDuration).send({
from: account,
gas: 1000000,
value: 100,
});
};
const evaluateOutcome = async (poolIndex) => {
await DAO.methods.evaluateOutcome(poolIndex).send({
from: account,
gas: 1000000,
});
};
// const stakeAvailability = async () => { }
// const requestWork = async () => {
// work1.events.WorkAssigned(() => {
// console.log('event callback');
// });
// await work1.methods.requestWork().send({
// from: account,
// gas: 1000000,
// });
// };
return (
<>
{!connected && }
{connected && (
<>
{!contracts[chainId] && (
Please switch MetaMask to Sepolia testnet!
)}
{chainId && `Chain ID: ${chainId}`}
{`Account: ${account}`}
{`Balance: ${balanceEther} ETH`}
{`Your REP: ${reputation}`}
{`Total REP: ${totalReputation}`}
{`Posts count: ${posts.length}`}
ID |
Author |
Actions |
{posts.map((post) => (
{post.id.toString()} |
{post.author} |
|
))}
{`Validation Pool Count: ${validationPools.length}`}
ID |
Post ID |
Fee |
Duration |
End Time |
Status |
Actions |
{validationPools.map((pool) => (
{pool.id.toString()} |
{pool.postIndex.toString()} |
{pool.fee.toString()} |
{pool.duration.toString()} |
{new Date(Number(pool.endTime) * 1000).toLocaleString()} |
{pool.resolved && (pool.outcome ? 'Accepted' : 'Rejected')}
{!pool.resolved && new Date() < new Date(Number(pool.endTime) * 1000) && 'In Progress'}
{!pool.resolved && new Date() >= new Date(Number(pool.endTime) * 1000) && 'Ready to Evaluate'}
|
{!pool.resolved && (
)}
|
))}
{ /* `Work1 Price: ${work1Price} ETH` */ }
{ /* */ }
>
)}
>
);
}
export default App;