diff --git a/client/src/App.jsx b/client/src/App.jsx index 385ce98..6cdde28 100644 --- a/client/src/App.jsx +++ b/client/src/App.jsx @@ -1,5 +1,5 @@ import { - useCallback, useEffect, useReducer, useState, useMemo, + useCallback, useEffect, useState, useMemo, } from 'react'; import { useSDK } from '@metamask/sdk-react'; import { Web3 } from 'web3'; @@ -11,27 +11,13 @@ import Row from 'react-bootstrap/Row'; import Col from 'react-bootstrap/Col'; import Stack from 'react-bootstrap/Stack'; -import { getContractByChainId } from './contract-config'; +import useList from './List'; +import { getContractByChainId, getContractNameByAddress } from './contract-config'; import Web3Context from './Web3Context'; import DAOArtifact from './assets/DAO.json'; -import work1Artifact from './assets/Work1.json'; -import AvailabilityStakes from './AvailabilityStakes'; -import WorkRequests from './WorkRequests'; - -const updateList = (list, action) => { - switch (action.type) { - case 'update': { - const newList = [...list]; - newList[Number(action.item.id)] = action.item; - return newList; - } - case 'refresh': - default: - return []; - } -}; - -const useList = (initialValue) => useReducer(updateList, initialValue ?? []); +import Work1Artifact from './assets/Work1.json'; +import OnboardingArtifact from './assets/Onboarding.json'; +import WorkContract from './WorkContract'; function App() { const { @@ -40,49 +26,44 @@ function App() { const [DAO, setDAO] = useState(); const [work1, setWork1] = useState(); - const [work1Price, setWork1Price] = useState(); + const [onboarding, setOnboarding] = useState(); const [balanceEther, setBalanceEther] = useState(); const [reputation, setReputation] = useState(); const [totalReputation, setTotalReputation] = useState(); const [posts, dispatchPost] = useList(); const [validationPools, dispatchValidationPool] = useList(); - const [availabilityStakes, dispatchAvailabilityStake] = useList(); - const [workRequests, dispatchWorkRequest] = useList(); const web3ProviderValue = useMemo(() => ({ provider, DAO, work1, - work1Price, + onboarding, reputation, setReputation, account, chainId, - availabilityStakes, - workRequests, }), [ - provider, DAO, work1, work1Price, reputation, setReputation, account, chainId, - availabilityStakes, workRequests, - ]); + provider, DAO, work1, onboarding, reputation, setReputation, account, chainId]); // In this effect, we initialize everything and add contract event listeners. useEffect(() => { if (!provider || !chainId || !account || balance === undefined) return; const DAOAddress = getContractByChainId(chainId, 'DAO'); const Work1Address = getContractByChainId(chainId, 'Work1'); + const OnboardingAddress = getContractByChainId(chainId, 'Onboarding'); const web3 = new Web3(provider); const DAOContract = new web3.eth.Contract(DAOArtifact.abi, DAOAddress); - const work1Contract = new web3.eth.Contract(work1Artifact.abi, Work1Address); + const Work1Contract = new web3.eth.Contract(Work1Artifact.abi, Work1Address); + const OnboardingContract = new web3.eth.Contract(OnboardingArtifact.abi, OnboardingAddress); + + setDAO(DAOContract); + setWork1(Work1Contract); + setOnboarding(OnboardingContract); /* -------------------------------------------------------------------------------- */ /* --------------------------- BEGIN FETCHERS ------------------------------------- */ /* -------------------------------------------------------------------------------- */ - const fetchPrice = async () => { - const fetchedPrice = await work1Contract.methods.price().call(); - setWork1Price(web3.utils.fromWei(fetchedPrice, 'ether')); - }; - const fetchReputation = async () => { setReputation(await DAOContract.methods.balanceOf(account).call()); setTotalReputation(await DAOContract.methods.totalSupply().call()); @@ -141,68 +122,13 @@ function App() { await Promise.all(promises); }; - const fetchAvailabilityStake = async (stakeIndex) => { - const s = await work1Contract.methods.stakes(stakeIndex).call(); - Object.assign(s, { - id: Number(stakeIndex), - currentUserIsWorker: () => s.worker.toLowerCase() === account.toString().toLowerCase(), - timeRemaining: new Date(Number(s.endTime) * 1000) - new Date(), - }); - dispatchAvailabilityStake({ type: 'update', item: s }); - if (s.timeRemaining > 0) { - setTimeout(() => { - s.timeRemaining = 0; - dispatchAvailabilityStake({ type: 'update', item: s }); - }, s.timeRemaining); - } - return s; - }; - - const fetchAvailabilityStakes = async () => { - const count = await work1Contract.methods.stakeCount().call(); - const promises = []; - dispatchAvailabilityStake({ type: 'refresh' }); - for (let i = 0; i < count; i += 1) { - promises.push(fetchAvailabilityStake(i)); - } - await Promise.all(promises); - }; - - const fetchWorkRequest = async (requestIndex) => { - const r = await work1Contract.methods.requests(requestIndex).call(); - Object.assign(r, { - id: Number(requestIndex), - feeEther: web3.utils.fromWei(r.fee, 'ether'), - currentUserIsCustomer: () => r.customer.toLowerCase() - === account.toString().toLowerCase(), - }); - dispatchWorkRequest({ type: 'update', item: r }); - return r; - }; - - const fetchWorkRequests = async () => { - const count = await work1Contract.methods.requestCount().call(); - const promises = []; - dispatchWorkRequest({ type: 'refresh' }); - for (let i = 0; i < count; i += 1) { - promises.push(fetchWorkRequest(i)); - } - await Promise.all(promises); - }; - /* -------------------------------------------------------------------------------- */ /* --------------------------- END FETCHERS --------------------------------------- */ /* -------------------------------------------------------------------------------- */ - fetchPrice(); fetchReputation(); fetchPosts(); fetchValidationPools(); - fetchAvailabilityStakes(); - fetchWorkRequests(); - - setWork1(work1Contract); - setDAO(DAOContract); /* -------------------------------------------------------------------------------- */ /* --------------------------- BEGIN EVENT HANDLERS ------------------------------- */ @@ -224,30 +150,14 @@ function App() { fetchValidationPool(event.returnValues.poolIndex); }); - work1Contract.events.AvailabilityStaked({ fromBlock: 'latest' }).on('data', (event) => { - console.log('event: availability staked', event); - fetchAvailabilityStake(event.returnValues.stakeIndex); + Work1Contract.events.AvailabilityStaked({ fromBlock: 'latest' }).on('data', () => { fetchReputation(); }); - work1Contract.events.WorkAssigned({ fromBlock: 'latest' }).on('data', async (event) => { - console.log('event: work assigned', event); - const r = await fetchWorkRequest(event.returnValues.requestIndex); - console.log('work request', r); - fetchAvailabilityStake(r.stakeIndex); + OnboardingContract.events.AvailabilityStaked({ fromBlock: 'latest' }).on('data', () => { + fetchReputation(); }); - - work1Contract.events.WorkEvidenceSubmitted({ fromBlock: 'latest' }).on('data', (event) => { - console.log('event: work evidence submitted', event); - fetchWorkRequest(event.returnValues.requestIndex); - }); - - work1Contract.events.WorkApprovalSubmitted({ fromBlock: 'latest' }).on('data', (event) => { - console.log('event: work approval submitted', event); - fetchWorkRequest(event.returnValues.requestIndex); - }); - }, [provider, account, chainId, balance, setReputation, dispatchAvailabilityStake, - dispatchValidationPool, dispatchWorkRequest, dispatchPost]); + }, [provider, account, chainId, balance, dispatchValidationPool, dispatchPost]); /* -------------------------------------------------------------------------------- */ /* --------------------------- END MAIN INITIALIZION EFFECT ----------------------- */ @@ -299,12 +209,18 @@ function App() { }, [DAO, account]); const initiateValidationPool = useCallback(async (postIndex, poolDuration) => { - await DAO.methods.initiateValidationPool(postIndex, poolDuration ?? 3600).send({ + const web3 = new Web3(provider); + await DAO.methods.initiateValidationPool( + postIndex, + poolDuration ?? 3600, + false, + web3.eth.abi.encodeParameter('bytes', '0x00'), + ).send({ from: account, gas: 1000000, value: 100, }); - }, [DAO, account]); + }, [provider, DAO, account]); const stake = useCallback(async (poolIndex, amount, inFavor) => { console.log(`Attempting to stake ${amount} ${inFavor ? 'for' : 'against'} pool ${poolIndex}`); @@ -334,6 +250,12 @@ function App() { /* --------------------------- END UI ACTIONS ------------------------------------- */ /* -------------------------------------------------------------------------------- */ + const getAdressName = useCallback((address) => { + const contractName = getContractNameByAddress(chainId, address); + if (contractName) return `${contractName} Contract`; + return address; + }, [chainId]); + return ( {!connected && } @@ -401,7 +323,7 @@ function App() { {post.id.toString()} {post.author} - {post.sender} + {getAdressName(post.sender)} Initiate Validation Pool {' '} @@ -434,6 +356,7 @@ function App() { ID Post ID + Sender Fee Duration End Time @@ -451,6 +374,7 @@ function App() { {pool.id.toString()} {pool.postIndex.toString()} + {getAdressName(pool.sender)} {pool.fee.toString()} {pool.duration.toString()} {new Date(Number(pool.endTime) * 1000).toLocaleString()} @@ -476,30 +400,27 @@ function App() { -
-

Work Contract 1

-
- {`Price: ${work1Price} ETH`} -
- - -
-

Work Contract 1

-
- {`Price: ${work1Price} ETH`} -
- - + {work1 && ( + + )} + {onboarding && ( + + )}
-

Work Contract 1

-
- {`Price: ${work1Price} ETH`} -
- - + {work1 && ( + + )}
diff --git a/client/src/AvailabilityStakes.jsx b/client/src/AvailabilityStakes.jsx index 62558e4..a0f5904 100644 --- a/client/src/AvailabilityStakes.jsx +++ b/client/src/AvailabilityStakes.jsx @@ -1,9 +1,10 @@ -import { useCallback, useContext } from 'react'; +import { useCallback, useContext, useEffect } from 'react'; import { PropTypes } from 'prop-types'; import Button from 'react-bootstrap/Button'; import { getContractByChainId } from './contract-config'; import Web3Context from './Web3Context'; +import WorkContractContext from './WorkContractContext'; const getAvailabilityStatus = (stake) => { if (stake.reclaimed) return 'Reclaimed'; @@ -12,13 +13,61 @@ const getAvailabilityStatus = (stake) => { return 'Expired'; }; -function AvailabilityStakes({ showActions, showAmount, onlyShowAvailable }) { +function AvailabilityStakes({ + showActions, showAmount, onlyShowAvailable, +}) { const { - DAO, work1, availabilityStakes, reputation, setReputation, account, chainId, + DAO, reputation, setReputation, account, chainId, } = useContext(Web3Context); + const { + workContract, + availabilityStakes, + dispatchAvailabilityStake, + } = useContext(WorkContractContext); + + const fetchAvailabilityStake = useCallback(async (stakeIndex) => { + const s = await workContract.methods.stakes(stakeIndex).call(); + Object.assign(s, { + id: Number(stakeIndex), + currentUserIsWorker: () => s.worker.toLowerCase() === account.toString().toLowerCase(), + timeRemaining: new Date(Number(s.endTime) * 1000) - new Date(), + }); + dispatchAvailabilityStake({ type: 'update', item: s }); + if (s.timeRemaining > 0) { + setTimeout(() => { + s.timeRemaining = 0; + dispatchAvailabilityStake({ type: 'update', item: s }); + }, s.timeRemaining); + } + return s; + }, [workContract, account, dispatchAvailabilityStake]); + + const fetchAvailabilityStakes = useCallback(async () => { + const count = await workContract.methods.stakeCount().call(); + const promises = []; + dispatchAvailabilityStake({ type: 'refresh' }); + for (let i = 0; i < count; i += 1) { + promises.push(fetchAvailabilityStake(i)); + } + await Promise.all(promises); + }, [workContract, fetchAvailabilityStake, dispatchAvailabilityStake]); + + useEffect(() => { + fetchAvailabilityStakes(); + + workContract.events.AvailabilityStaked({ fromBlock: 'latest' }).on('data', (event) => { + console.log('event: availability staked', event); + fetchAvailabilityStake(event.returnValues.stakeIndex); + }); + + workContract.events.WorkAssigned({ fromBlock: 'latest' }).on('data', (event) => { + fetchAvailabilityStake(event.returnValues.stakeIndex); + }); + }, [workContract, fetchAvailabilityStakes, fetchAvailabilityStake]); + const stakeAvailability = useCallback(async (duration) => { - const target = getContractByChainId(chainId, 'Work1'); + const target = getContractByChainId(chainId, 'Onboarding'); await DAO.methods.stakeAvailability(target, reputation / BigInt(2), duration).send({ from: account, gas: 999999, @@ -28,18 +77,18 @@ function AvailabilityStakes({ showActions, showAmount, onlyShowAvailable }) { }, [DAO, account, chainId, reputation, setReputation]); const reclaimAvailabilityStake = useCallback(async (stakeIndex) => { - await work1.methods.reclaimAvailability(stakeIndex).send({ + await workContract.methods.reclaimAvailability(stakeIndex).send({ from: account, gas: 999999, }); - }, [work1, account]); + }, [workContract, account]); const extendAvailabilityStake = useCallback(async (stakeIndex, duration) => { - await work1.methods.extendAvailability(stakeIndex, duration).send({ + await workContract.methods.extendAvailability(stakeIndex, duration).send({ from: account, gas: 999999, }); - }, [work1, account]); + }, [workContract, account]); const displayData = availabilityStakes.filter((stake) => { if (!stake) return false; diff --git a/client/src/List.js b/client/src/List.js new file mode 100644 index 0000000..8002d9a --- /dev/null +++ b/client/src/List.js @@ -0,0 +1,18 @@ +import { useReducer } from 'react'; + +const updateList = (list, action) => { + switch (action.type) { + case 'update': { + const newList = [...list]; + newList[Number(action.item.id)] = action.item; + return newList; + } + case 'refresh': + default: + return []; + } +}; + +const useList = (initialValue) => useReducer(updateList, initialValue ?? []); + +export default useList; diff --git a/client/src/WorkContract.jsx b/client/src/WorkContract.jsx new file mode 100644 index 0000000..b6a2fa3 --- /dev/null +++ b/client/src/WorkContract.jsx @@ -0,0 +1,47 @@ +import { useMemo } from 'react'; +import { PropTypes } from 'prop-types'; +import useList from './List'; +import WorkContractContext from './WorkContractContext'; +import AvailabilityStakes from './AvailabilityStakes'; +import WorkRequests from './WorkRequests'; + +function WorkContract({ + workContract, + showAvailabilityActions, + showAvailabilityAmount, onlyShowAvailable, title, verb, showRequestWork, +}) { + const [availabilityStakes, dispatchAvailabilityStake] = useList(); + const workContractProviderValue = useMemo(() => ({ + workContract, availabilityStakes, dispatchAvailabilityStake, + }), [workContract, availabilityStakes, dispatchAvailabilityStake]); + return ( + +

{title}

+ + +
+ ); +} + +WorkContract.propTypes = { + workContract: PropTypes.any.isRequired, // eslint-disable-line react/forbid-prop-types + showRequestWork: PropTypes.bool, + title: PropTypes.string.isRequired, + verb: PropTypes.string.isRequired, + showAvailabilityActions: PropTypes.bool, + showAvailabilityAmount: PropTypes.bool, + onlyShowAvailable: PropTypes.bool, +}; + +WorkContract.defaultProps = { + showRequestWork: false, + showAvailabilityActions: true, + showAvailabilityAmount: true, + onlyShowAvailable: false, +}; + +export default WorkContract; diff --git a/client/src/WorkContractContext.js b/client/src/WorkContractContext.js new file mode 100644 index 0000000..ce219de --- /dev/null +++ b/client/src/WorkContractContext.js @@ -0,0 +1,5 @@ +import { createContext } from 'react'; + +const WorkContractContext = createContext({}); + +export default WorkContractContext; diff --git a/client/src/WorkRequests.jsx b/client/src/WorkRequests.jsx index 5a195ac..547f7f4 100644 --- a/client/src/WorkRequests.jsx +++ b/client/src/WorkRequests.jsx @@ -1,9 +1,13 @@ -import { useCallback, useContext } from 'react'; +import { + useCallback, useContext, useEffect, useState, +} from 'react'; import { PropTypes } from 'prop-types'; import Button from 'react-bootstrap/Button'; import Web3 from 'web3'; import Web3Context from './Web3Context'; +import useList from './List'; +import WorkContractContext from './WorkContractContext'; const getRequestStatus = (request) => { switch (Number(request.status)) { @@ -20,51 +24,109 @@ const getRequestStatus = (request) => { } }; -function WorkRequests({ showRequestWork }) { +function WorkRequests({ + showRequestWork, verb, +}) { + const [workRequests, dispatchWorkRequest] = useList(); + const [price, setPrice] = useState(); + const { workContract, availabilityStakes } = useContext(WorkContractContext); + const { - provider, work1, work1Price, workRequests, availabilityStakes, account, + provider, account, } = useContext(Web3Context); + const fetchPrice = useCallback(async () => { + const web3 = new Web3(provider); + const fetchedPrice = await workContract.methods.price().call(); + setPrice(web3.utils.fromWei(fetchedPrice, 'ether')); + }, [workContract, provider]); + + const fetchWorkRequest = useCallback(async (requestIndex) => { + const web3 = new Web3(provider); + const r = await workContract.methods.requests(requestIndex).call(); + Object.assign(r, { + id: Number(requestIndex), + feeEther: web3.utils.fromWei(r.fee, 'ether'), + currentUserIsCustomer: () => r.customer.toLowerCase() + === account.toString().toLowerCase(), + }); + dispatchWorkRequest({ type: 'update', item: r }); + return r; + }, [workContract, provider, account, dispatchWorkRequest]); + + const fetchWorkRequests = useCallback(async () => { + const count = await workContract.methods.requestCount().call(); + const promises = []; + dispatchWorkRequest({ type: 'refresh' }); + for (let i = 0; i < count; i += 1) { + promises.push(fetchWorkRequest(i)); + } + await Promise.all(promises); + }, [workContract, dispatchWorkRequest, fetchWorkRequest]); + + useEffect(() => { + fetchPrice(); + fetchWorkRequests(); + + workContract.events.WorkAssigned({ fromBlock: 'latest' }).on('data', (event) => { + console.log('event: work assigned', event); + fetchWorkRequest(event.returnValues.requestIndex); + }); + + workContract.events.WorkEvidenceSubmitted({ fromBlock: 'latest' }).on('data', (event) => { + console.log('event: work evidence submitted', event); + fetchWorkRequest(event.returnValues.requestIndex); + }); + + workContract.events.WorkApprovalSubmitted({ fromBlock: 'latest' }).on('data', (event) => { + console.log('event: work approval submitted', event); + fetchWorkRequest(event.returnValues.requestIndex); + }); + }, [workContract, fetchWorkRequests, fetchPrice, fetchWorkRequest]); + const requestWork = useCallback(async () => { const web3 = new Web3(provider); - const priceWei = BigInt(web3.utils.toWei(work1Price, 'ether')); - await work1.methods.requestWork().send({ + const priceWei = BigInt(web3.utils.toWei(price, 'ether')); + await workContract.methods.requestWork().send({ from: account, gas: 1000000, value: priceWei, }); - }, [provider, work1, account, work1Price]); + }, [provider, workContract, account, price]); const submitWorkEvidence = useCallback(async (requestIndex) => { - await work1.methods.submitWorkEvidence(requestIndex).send({ + await workContract.methods.submitWorkEvidence(requestIndex).send({ from: account, gas: 1000000, }); - }, [work1, account]); + }, [workContract, account]); const submitWorkApproval = useCallback(async (requestIndex) => { - await work1.methods.submitWorkApproval(requestIndex, true).send({ + await workContract.methods.submitWorkApproval(requestIndex, true).send({ from: account, gas: 1000000, }); - }, [work1, account]); + }, [workContract, account]); const submitWorkDisapproval = useCallback(async (requestIndex) => { - await work1.methods.submitWorkApproval(requestIndex, false).send({ + await workContract.methods.submitWorkApproval(requestIndex, false).send({ from: account, gas: 1000000, }); - }, [work1, account]); + }, [workContract, account]); return ( <> +
+ {`Price: ${price} ETH`} +
{showRequestWork && (
- +
)}
- Work Request Count: + Request Count: {' '} {workRequests.length}
@@ -78,7 +140,7 @@ function WorkRequests({ showRequestWork }) { Status Stake ID Approval - Pool ID + {/* Pool ID */} Actions @@ -95,25 +157,24 @@ function WorkRequests({ showRequestWork }) { {getRequestStatus(request)} {request.stakeIndex.toString()} {request.approval.toString()} - {request.poolIndex.toString()} {availabilityStakes.length > 0 - && availabilityStakes[Number(request.stakeIndex)]?.currentUserIsWorker() - && Number(request.status) === 0 && ( - + && availabilityStakes[Number(request.stakeIndex)]?.currentUserIsWorker() + && Number(request.status) === 0 && ( + )} {request.currentUserIsCustomer() - && Number(request.status) === 1 && ( - <> - - - + && Number(request.status) === 1 && ( + <> + + + )} @@ -127,6 +188,7 @@ function WorkRequests({ showRequestWork }) { WorkRequests.propTypes = { showRequestWork: PropTypes.bool, + verb: PropTypes.string.isRequired, }; WorkRequests.defaultProps = { diff --git a/client/src/assets/DAO.json b/client/src/assets/DAO.json index 31f0197..be59a73 100644 --- a/client/src/assets/DAO.json +++ b/client/src/assets/DAO.json @@ -313,6 +313,16 @@ "internalType": "uint256", "name": "duration", "type": "uint256" + }, + { + "internalType": "bool", + "name": "callbackOnValidate", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "callbackData", + "type": "bytes" } ], "name": "initiateValidationPool", @@ -637,16 +647,6 @@ "name": "fee", "type": "uint256" }, - { - "internalType": "uint256", - "name": "initialStakedFor", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "initialStakedAgainst", - "type": "uint256" - }, { "internalType": "uint256", "name": "duration", @@ -666,14 +666,24 @@ "internalType": "bool", "name": "outcome", "type": "bool" + }, + { + "internalType": "bool", + "name": "callbackOnValidate", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "callbackData", + "type": "bytes" } ], "stateMutability": "view", "type": "function" } ], - "bytecode": "0x60806040523480156200001157600080fd5b506040518060400160405280600a81526020017f52657075746174696f6e000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f524550000000000000000000000000000000000000000000000000000000000081525081600390816200008f919062000324565b508060049081620000a1919062000324565b5050506200040b565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200012c57607f821691505b602082108103620001425762000141620000e4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620001ac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200016d565b620001b886836200016d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000205620001ff620001f984620001d0565b620001da565b620001d0565b9050919050565b6000819050919050565b6200022183620001e4565b6200023962000230826200020c565b8484546200017a565b825550505050565b600090565b6200025062000241565b6200025d81848462000216565b505050565b5b8181101562000285576200027960008262000246565b60018101905062000263565b5050565b601f821115620002d4576200029e8162000148565b620002a9846200015d565b81016020851015620002b9578190505b620002d1620002c8856200015d565b83018262000262565b50505b505050565b600082821c905092915050565b6000620002f960001984600802620002d9565b1980831691505092915050565b6000620003148383620002e6565b9150826002028217905092915050565b6200032f82620000aa565b67ffffffffffffffff8111156200034b576200034a620000b5565b5b62000357825462000113565b6200036482828562000289565b600060209050601f8311600181146200039c576000841562000387578287015190505b62000393858262000306565b86555062000403565b601f198416620003ac8662000148565b60005b82811015620003d657848901518255600182019150602085019450602081019050620003af565b86831015620003f65784890151620003f2601f891682620002e6565b8355505b6001600288020188555050505b505050505050565b612608806200041b6000396000f3fe6080604052600436106101405760003560e01c806356715761116100b657806395d89b411161006f57806395d89b41146104b05780639fcb294b146104db578063a230c5241461050b578063a233627914610548578063a9059cbb1461058f578063dd62ed3e146105cc57610140565b806356715761146103785780635daf08ca146103a3578063642b5bfb146103e05780636db5c8fd1461040b57806370a0823114610436578063883802741461047357610140565b806317c182171161010857806317c182171461024257806318160ddd1461027f57806323b872dd146102aa578063313ce567146102e75780633ff7544214610312578063561b24631461034f57610140565b806306fdde0314610145578063095ea7b3146101705780630b1e7f83146101ad57806311aee380146101ec57806317906c2e14610217575b600080fd5b34801561015157600080fd5b5061015a610609565b6040516101679190611bb4565b60405180910390f35b34801561017c57600080fd5b5061019760048036038101906101929190611c6f565b61069b565b6040516101a49190611cca565b60405180910390f35b3480156101b957600080fd5b506101d460048036038101906101cf9190611ce5565b6106be565b6040516101e393929190611d30565b60405180910390f35b3480156101f857600080fd5b50610201610728565b60405161020e9190611d67565b60405180910390f35b34801561022357600080fd5b5061022c61072e565b6040516102399190611d67565b60405180910390f35b34801561024e57600080fd5b5061026960048036038101906102649190611ce5565b610734565b6040516102769190611cca565b60405180910390f35b34801561028b57600080fd5b50610294610c88565b6040516102a19190611d67565b60405180910390f35b3480156102b657600080fd5b506102d160048036038101906102cc9190611d82565b610c92565b6040516102de9190611cca565b60405180910390f35b3480156102f357600080fd5b506102fc610cc1565b6040516103099190611df1565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190611e0c565b610cca565b6040516103469190611d67565b60405180910390f35b34801561035b57600080fd5b5061037660048036038101906103719190611e65565b610dc8565b005b34801561038457600080fd5b5061038d610df1565b60405161039a9190611d67565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190611ce5565b610df6565b6040516103d79190611eb8565b60405180910390f35b3480156103ec57600080fd5b506103f5610e29565b6040516104029190611d67565b60405180910390f35b34801561041757600080fd5b50610420610e2f565b60405161042d9190611d67565b60405180910390f35b34801561044257600080fd5b5061045d60048036038101906104589190611e0c565b610e36565b60405161046a9190611d67565b60405180910390f35b34801561047f57600080fd5b5061049a60048036038101906104959190611ed3565b610e7e565b6040516104a79190611cca565b60405180910390f35b3480156104bc57600080fd5b506104c5610f09565b6040516104d29190611bb4565b60405180910390f35b6104f560048036038101906104f09190611f26565b610f9b565b6040516105029190611d67565b60405180910390f35b34801561051757600080fd5b50610532600480360381019061052d9190611e0c565b6112a5565b60405161053f9190611cca565b60405180910390f35b34801561055457600080fd5b5061056f600480360381019061056a9190611ce5565b6112c5565b6040516105869b9a99989796959493929190611f66565b60405180910390f35b34801561059b57600080fd5b506105b660048036038101906105b19190611c6f565b611359565b6040516105c39190611cca565b60405180910390f35b3480156105d857600080fd5b506105f360048036038101906105ee9190612011565b61137c565b6040516106009190611d67565b60405180910390f35b60606003805461061890612080565b80601f016020809104026020016040519081016040528092919081815260200182805461064490612080565b80156106915780601f1061066657610100808354040283529160200191610691565b820191906000526020600020905b81548152906001019060200180831161067457829003601f168201915b5050505050905090565b6000806106a6611403565b90506106b381858561140b565b600191505092915050565b600a6020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b60065481565b600b5481565b6000806008600084815260200190815260200160002090506000600a6000836001015481526020019081526020016000209050816009015442116107ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a490612123565b60405180910390fd5b6000151582600a0160009054906101000a900460ff16151514610805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fc9061218f565b60405180910390fd5b600080600080600090505b85600401548110156108815785600301600082815260200190815260200160002091508160010160009054906101000a900460ff16156108615781600201548461085a91906121de565b9350610874565b81600201548361087191906121de565b92505b8080600101915050610810565b508183101595508580156109035750600760008560020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610a11578360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560006006600081548092919061094490612212565b91905055815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008660020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600185600a0160006101000a81548160ff0219169083151502179055508585600a0160016101000a81548160ff0219169083151502179055507f926ee3a021d24f18cfab444988fa0338bcaa0f1e0d7c2211c07d10cbad6772948787604051610a7b92919061225a565b60405180910390a1600086610a905782610a92565b835b9050600087610aa15784610aa3565b835b9050600080600090505b8860040154811015610b665788600301600082815260200190815260200160002094508460010160009054906101000a900460ff1615158a151503610b5957600084866002015485610aff9190612283565b610b0991906122f4565b9050610b49308760030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838960020154610b4491906121de565b61141d565b8083610b5591906121de565b9250505b8080600101915050610aad565b5060008183610b759190612325565b90506000811115610bb057610baf308960020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361141d565b5b60005b600654811015610c795760006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000610bff610c88565b610c0883610e36565b8d60050154610c179190612283565b610c2191906122f4565b90508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c69573d6000803e3d6000fd5b5050508080600101915050610bb3565b50505050505050505050919050565b6000600254905090565b600080610c9d611403565b9050610caa858285611511565b610cb585858561141d565b60019150509392505050565b60006012905090565b6000600b6000815480929190610cdf90612212565b9190505590506000600a60008381526020019081526020016000209050828160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550338160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508181600001819055507f60b94e7764708712b927071922e2d834b79011347c7b80aed74caeeece2eed4c82604051610dba9190611d67565b60405180910390a150919050565b6000600860008581526020019081526020016000209050610deb813385856115a5565b50505050565b603c81565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b6201518081565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610e8a8484611359565b90508015610f02578373ffffffffffffffffffffffffffffffffffffffff1663216ed6ad3385856040518463ffffffff1660e01b8152600401610ecf93929190612359565b600060405180830381600087803b158015610ee957600080fd5b505af1158015610efd573d6000803e3d6000fd5b505050505b9392505050565b606060048054610f1890612080565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4490612080565b8015610f915780601f10610f6657610100808354040283529160200191610f91565b820191906000526020600020905b815481529060010190602001808311610f7457829003601f168201915b5050505050905090565b6000803411610fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd690612402565b60405180910390fd5b603c821015611023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101a9061246e565b60405180910390fd5b62015180821115611069576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611060906124da565b60405180910390fd5b6000600a60008581526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110a90612546565b60405180910390fd5b6009600081548092919061112690612212565b9190505591506000600860008481526020019081526020016000209050338160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084816001018190555034816005018190555083816008018190555083426111ad91906121de565b81600901819055508281600001819055506111ec8260020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16346116a6565b611229818360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660023461122291906122f4565b60016115a5565b611266818360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660023461125f91906122f4565b60006115a5565b7f6e5c598b821d7fa8550e5fea58ab6e27c59e1cbe1df75a8591aa0c453b49e10a836040516112959190611d67565b60405180910390a1505092915050565b60076020528060005260406000206000915054906101000a900460ff1681565b60086020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600401549080600501549080600601549080600701549080600801549080600901549080600a0160009054906101000a900460ff169080600a0160019054906101000a900460ff1690508b565b600080611364611403565b905061137181858561141d565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b6114188383836001611728565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361148f5760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016114869190611eb8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115015760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016114f89190611eb8565b60405180910390fd5b61150c8383836118ff565b505050565b600061151d848461137c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461159f578181101561158f578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161158693929190612359565b60405180910390fd5b61159e84848484036000611728565b5b50505050565b83600901544211156115ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e3906125b2565b60405180910390fd5b6115f783308461141d565b600084600401600081548092919061160e90612212565b91905055905060008560030160008381526020019081526020016000209050848160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828160010160006101000a81548160ff021916908315150217905550838160020181905550818160000181905550505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117185760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161170f9190611eb8565b60405180910390fd5b611724600083836118ff565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361179a5760006040517fe602df050000000000000000000000000000000000000000000000000000000081526004016117919190611eb8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361180c5760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016118039190611eb8565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080156118f9578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516118f09190611d67565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361195157806002600082825461194591906121de565b92505081905550611a24565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156119dd578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016119d493929190612359565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a6d5780600260008282540392505081905550611aba565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b179190611d67565b60405180910390a3505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611b5e578082015181840152602081019050611b43565b60008484015250505050565b6000601f19601f8301169050919050565b6000611b8682611b24565b611b908185611b2f565b9350611ba0818560208601611b40565b611ba981611b6a565b840191505092915050565b60006020820190508181036000830152611bce8184611b7b565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611c0682611bdb565b9050919050565b611c1681611bfb565b8114611c2157600080fd5b50565b600081359050611c3381611c0d565b92915050565b6000819050919050565b611c4c81611c39565b8114611c5757600080fd5b50565b600081359050611c6981611c43565b92915050565b60008060408385031215611c8657611c85611bd6565b5b6000611c9485828601611c24565b9250506020611ca585828601611c5a565b9150509250929050565b60008115159050919050565b611cc481611caf565b82525050565b6000602082019050611cdf6000830184611cbb565b92915050565b600060208284031215611cfb57611cfa611bd6565b5b6000611d0984828501611c5a565b91505092915050565b611d1b81611c39565b82525050565b611d2a81611bfb565b82525050565b6000606082019050611d456000830186611d12565b611d526020830185611d21565b611d5f6040830184611d21565b949350505050565b6000602082019050611d7c6000830184611d12565b92915050565b600080600060608486031215611d9b57611d9a611bd6565b5b6000611da986828701611c24565b9350506020611dba86828701611c24565b9250506040611dcb86828701611c5a565b9150509250925092565b600060ff82169050919050565b611deb81611dd5565b82525050565b6000602082019050611e066000830184611de2565b92915050565b600060208284031215611e2257611e21611bd6565b5b6000611e3084828501611c24565b91505092915050565b611e4281611caf565b8114611e4d57600080fd5b50565b600081359050611e5f81611e39565b92915050565b600080600060608486031215611e7e57611e7d611bd6565b5b6000611e8c86828701611c5a565b9350506020611e9d86828701611c5a565b9250506040611eae86828701611e50565b9150509250925092565b6000602082019050611ecd6000830184611d21565b92915050565b600080600060608486031215611eec57611eeb611bd6565b5b6000611efa86828701611c24565b9350506020611f0b86828701611c5a565b9250506040611f1c86828701611c5a565b9150509250925092565b60008060408385031215611f3d57611f3c611bd6565b5b6000611f4b85828601611c5a565b9250506020611f5c85828601611c5a565b9150509250929050565b600061016082019050611f7c600083018e611d12565b611f89602083018d611d12565b611f96604083018c611d21565b611fa3606083018b611d12565b611fb0608083018a611d12565b611fbd60a0830189611d12565b611fca60c0830188611d12565b611fd760e0830187611d12565b611fe5610100830186611d12565b611ff3610120830185611cbb565b612001610140830184611cbb565b9c9b505050505050505050505050565b6000806040838503121561202857612027611bd6565b5b600061203685828601611c24565b925050602061204785828601611c24565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061209857607f821691505b6020821081036120ab576120aa612051565b5b50919050565b7f506f6f6c20656e642074696d6520686173206e6f74207965742061727269766560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b600061210d602183611b2f565b9150612118826120b1565b604082019050919050565b6000602082019050818103600083015261213c81612100565b9050919050565b7f506f6f6c20697320616c7265616479207265736f6c7665640000000000000000600082015250565b6000612179601883611b2f565b915061218482612143565b602082019050919050565b600060208201905081810360008301526121a88161216c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006121e982611c39565b91506121f483611c39565b925082820190508082111561220c5761220b6121af565b5b92915050565b600061221d82611c39565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361224f5761224e6121af565b5b600182019050919050565b600060408201905061226f6000830185611d12565b61227c6020830184611cbb565b9392505050565b600061228e82611c39565b915061229983611c39565b92508282026122a781611c39565b915082820484148315176122be576122bd6121af565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006122ff82611c39565b915061230a83611c39565b92508261231a576123196122c5565b5b828204905092915050565b600061233082611c39565b915061233b83611c39565b9250828203905081811115612353576123526121af565b5b92915050565b600060608201905061236e6000830186611d21565b61237b6020830185611d12565b6123886040830184611d12565b949350505050565b7f46656520697320726571756972656420746f20696e6974696174652076616c6960008201527f646174696f6e20706f6f6c000000000000000000000000000000000000000000602082015250565b60006123ec602b83611b2f565b91506123f782612390565b604082019050919050565b6000602082019050818103600083015261241b816123df565b9050919050565b7f4475726174696f6e20697320746f6f2073686f72740000000000000000000000600082015250565b6000612458601583611b2f565b915061246382612422565b602082019050919050565b600060208201905081810360008301526124878161244b565b9050919050565b7f4475726174696f6e20697320746f6f206c6f6e67000000000000000000000000600082015250565b60006124c4601483611b2f565b91506124cf8261248e565b602082019050919050565b600060208201905081810360008301526124f3816124b7565b9050919050565b7f54617267657420706f7374206e6f7420666f756e640000000000000000000000600082015250565b6000612530601583611b2f565b915061253b826124fa565b602082019050919050565b6000602082019050818103600083015261255f81612523565b9050919050565b7f506f6f6c20656e642074696d6520686173207061737365640000000000000000600082015250565b600061259c601883611b2f565b91506125a782612566565b602082019050919050565b600060208201905081810360008301526125cb8161258f565b905091905056fea2646970667358221220493bc48ed6781c50ea5b85d36b6f57bf83b3b82cebbd13bf10a0f709ec0a39eb64736f6c63430008180033", - "deployedBytecode": "0x6080604052600436106101405760003560e01c806356715761116100b657806395d89b411161006f57806395d89b41146104b05780639fcb294b146104db578063a230c5241461050b578063a233627914610548578063a9059cbb1461058f578063dd62ed3e146105cc57610140565b806356715761146103785780635daf08ca146103a3578063642b5bfb146103e05780636db5c8fd1461040b57806370a0823114610436578063883802741461047357610140565b806317c182171161010857806317c182171461024257806318160ddd1461027f57806323b872dd146102aa578063313ce567146102e75780633ff7544214610312578063561b24631461034f57610140565b806306fdde0314610145578063095ea7b3146101705780630b1e7f83146101ad57806311aee380146101ec57806317906c2e14610217575b600080fd5b34801561015157600080fd5b5061015a610609565b6040516101679190611bb4565b60405180910390f35b34801561017c57600080fd5b5061019760048036038101906101929190611c6f565b61069b565b6040516101a49190611cca565b60405180910390f35b3480156101b957600080fd5b506101d460048036038101906101cf9190611ce5565b6106be565b6040516101e393929190611d30565b60405180910390f35b3480156101f857600080fd5b50610201610728565b60405161020e9190611d67565b60405180910390f35b34801561022357600080fd5b5061022c61072e565b6040516102399190611d67565b60405180910390f35b34801561024e57600080fd5b5061026960048036038101906102649190611ce5565b610734565b6040516102769190611cca565b60405180910390f35b34801561028b57600080fd5b50610294610c88565b6040516102a19190611d67565b60405180910390f35b3480156102b657600080fd5b506102d160048036038101906102cc9190611d82565b610c92565b6040516102de9190611cca565b60405180910390f35b3480156102f357600080fd5b506102fc610cc1565b6040516103099190611df1565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190611e0c565b610cca565b6040516103469190611d67565b60405180910390f35b34801561035b57600080fd5b5061037660048036038101906103719190611e65565b610dc8565b005b34801561038457600080fd5b5061038d610df1565b60405161039a9190611d67565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190611ce5565b610df6565b6040516103d79190611eb8565b60405180910390f35b3480156103ec57600080fd5b506103f5610e29565b6040516104029190611d67565b60405180910390f35b34801561041757600080fd5b50610420610e2f565b60405161042d9190611d67565b60405180910390f35b34801561044257600080fd5b5061045d60048036038101906104589190611e0c565b610e36565b60405161046a9190611d67565b60405180910390f35b34801561047f57600080fd5b5061049a60048036038101906104959190611ed3565b610e7e565b6040516104a79190611cca565b60405180910390f35b3480156104bc57600080fd5b506104c5610f09565b6040516104d29190611bb4565b60405180910390f35b6104f560048036038101906104f09190611f26565b610f9b565b6040516105029190611d67565b60405180910390f35b34801561051757600080fd5b50610532600480360381019061052d9190611e0c565b6112a5565b60405161053f9190611cca565b60405180910390f35b34801561055457600080fd5b5061056f600480360381019061056a9190611ce5565b6112c5565b6040516105869b9a99989796959493929190611f66565b60405180910390f35b34801561059b57600080fd5b506105b660048036038101906105b19190611c6f565b611359565b6040516105c39190611cca565b60405180910390f35b3480156105d857600080fd5b506105f360048036038101906105ee9190612011565b61137c565b6040516106009190611d67565b60405180910390f35b60606003805461061890612080565b80601f016020809104026020016040519081016040528092919081815260200182805461064490612080565b80156106915780601f1061066657610100808354040283529160200191610691565b820191906000526020600020905b81548152906001019060200180831161067457829003601f168201915b5050505050905090565b6000806106a6611403565b90506106b381858561140b565b600191505092915050565b600a6020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b60065481565b600b5481565b6000806008600084815260200190815260200160002090506000600a6000836001015481526020019081526020016000209050816009015442116107ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a490612123565b60405180910390fd5b6000151582600a0160009054906101000a900460ff16151514610805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fc9061218f565b60405180910390fd5b600080600080600090505b85600401548110156108815785600301600082815260200190815260200160002091508160010160009054906101000a900460ff16156108615781600201548461085a91906121de565b9350610874565b81600201548361087191906121de565b92505b8080600101915050610810565b508183101595508580156109035750600760008560020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610a11578360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560006006600081548092919061094490612212565b91905055815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008660020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600185600a0160006101000a81548160ff0219169083151502179055508585600a0160016101000a81548160ff0219169083151502179055507f926ee3a021d24f18cfab444988fa0338bcaa0f1e0d7c2211c07d10cbad6772948787604051610a7b92919061225a565b60405180910390a1600086610a905782610a92565b835b9050600087610aa15784610aa3565b835b9050600080600090505b8860040154811015610b665788600301600082815260200190815260200160002094508460010160009054906101000a900460ff1615158a151503610b5957600084866002015485610aff9190612283565b610b0991906122f4565b9050610b49308760030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838960020154610b4491906121de565b61141d565b8083610b5591906121de565b9250505b8080600101915050610aad565b5060008183610b759190612325565b90506000811115610bb057610baf308960020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361141d565b5b60005b600654811015610c795760006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000610bff610c88565b610c0883610e36565b8d60050154610c179190612283565b610c2191906122f4565b90508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c69573d6000803e3d6000fd5b5050508080600101915050610bb3565b50505050505050505050919050565b6000600254905090565b600080610c9d611403565b9050610caa858285611511565b610cb585858561141d565b60019150509392505050565b60006012905090565b6000600b6000815480929190610cdf90612212565b9190505590506000600a60008381526020019081526020016000209050828160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550338160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508181600001819055507f60b94e7764708712b927071922e2d834b79011347c7b80aed74caeeece2eed4c82604051610dba9190611d67565b60405180910390a150919050565b6000600860008581526020019081526020016000209050610deb813385856115a5565b50505050565b603c81565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b6201518081565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610e8a8484611359565b90508015610f02578373ffffffffffffffffffffffffffffffffffffffff1663216ed6ad3385856040518463ffffffff1660e01b8152600401610ecf93929190612359565b600060405180830381600087803b158015610ee957600080fd5b505af1158015610efd573d6000803e3d6000fd5b505050505b9392505050565b606060048054610f1890612080565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4490612080565b8015610f915780601f10610f6657610100808354040283529160200191610f91565b820191906000526020600020905b815481529060010190602001808311610f7457829003601f168201915b5050505050905090565b6000803411610fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd690612402565b60405180910390fd5b603c821015611023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101a9061246e565b60405180910390fd5b62015180821115611069576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611060906124da565b60405180910390fd5b6000600a60008581526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110a90612546565b60405180910390fd5b6009600081548092919061112690612212565b9190505591506000600860008481526020019081526020016000209050338160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084816001018190555034816005018190555083816008018190555083426111ad91906121de565b81600901819055508281600001819055506111ec8260020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16346116a6565b611229818360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660023461122291906122f4565b60016115a5565b611266818360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660023461125f91906122f4565b60006115a5565b7f6e5c598b821d7fa8550e5fea58ab6e27c59e1cbe1df75a8591aa0c453b49e10a836040516112959190611d67565b60405180910390a1505092915050565b60076020528060005260406000206000915054906101000a900460ff1681565b60086020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600401549080600501549080600601549080600701549080600801549080600901549080600a0160009054906101000a900460ff169080600a0160019054906101000a900460ff1690508b565b600080611364611403565b905061137181858561141d565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b6114188383836001611728565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361148f5760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016114869190611eb8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115015760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016114f89190611eb8565b60405180910390fd5b61150c8383836118ff565b505050565b600061151d848461137c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461159f578181101561158f578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161158693929190612359565b60405180910390fd5b61159e84848484036000611728565b5b50505050565b83600901544211156115ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e3906125b2565b60405180910390fd5b6115f783308461141d565b600084600401600081548092919061160e90612212565b91905055905060008560030160008381526020019081526020016000209050848160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828160010160006101000a81548160ff021916908315150217905550838160020181905550818160000181905550505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117185760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161170f9190611eb8565b60405180910390fd5b611724600083836118ff565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361179a5760006040517fe602df050000000000000000000000000000000000000000000000000000000081526004016117919190611eb8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361180c5760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016118039190611eb8565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080156118f9578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516118f09190611d67565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361195157806002600082825461194591906121de565b92505081905550611a24565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156119dd578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016119d493929190612359565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a6d5780600260008282540392505081905550611aba565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b179190611d67565b60405180910390a3505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611b5e578082015181840152602081019050611b43565b60008484015250505050565b6000601f19601f8301169050919050565b6000611b8682611b24565b611b908185611b2f565b9350611ba0818560208601611b40565b611ba981611b6a565b840191505092915050565b60006020820190508181036000830152611bce8184611b7b565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611c0682611bdb565b9050919050565b611c1681611bfb565b8114611c2157600080fd5b50565b600081359050611c3381611c0d565b92915050565b6000819050919050565b611c4c81611c39565b8114611c5757600080fd5b50565b600081359050611c6981611c43565b92915050565b60008060408385031215611c8657611c85611bd6565b5b6000611c9485828601611c24565b9250506020611ca585828601611c5a565b9150509250929050565b60008115159050919050565b611cc481611caf565b82525050565b6000602082019050611cdf6000830184611cbb565b92915050565b600060208284031215611cfb57611cfa611bd6565b5b6000611d0984828501611c5a565b91505092915050565b611d1b81611c39565b82525050565b611d2a81611bfb565b82525050565b6000606082019050611d456000830186611d12565b611d526020830185611d21565b611d5f6040830184611d21565b949350505050565b6000602082019050611d7c6000830184611d12565b92915050565b600080600060608486031215611d9b57611d9a611bd6565b5b6000611da986828701611c24565b9350506020611dba86828701611c24565b9250506040611dcb86828701611c5a565b9150509250925092565b600060ff82169050919050565b611deb81611dd5565b82525050565b6000602082019050611e066000830184611de2565b92915050565b600060208284031215611e2257611e21611bd6565b5b6000611e3084828501611c24565b91505092915050565b611e4281611caf565b8114611e4d57600080fd5b50565b600081359050611e5f81611e39565b92915050565b600080600060608486031215611e7e57611e7d611bd6565b5b6000611e8c86828701611c5a565b9350506020611e9d86828701611c5a565b9250506040611eae86828701611e50565b9150509250925092565b6000602082019050611ecd6000830184611d21565b92915050565b600080600060608486031215611eec57611eeb611bd6565b5b6000611efa86828701611c24565b9350506020611f0b86828701611c5a565b9250506040611f1c86828701611c5a565b9150509250925092565b60008060408385031215611f3d57611f3c611bd6565b5b6000611f4b85828601611c5a565b9250506020611f5c85828601611c5a565b9150509250929050565b600061016082019050611f7c600083018e611d12565b611f89602083018d611d12565b611f96604083018c611d21565b611fa3606083018b611d12565b611fb0608083018a611d12565b611fbd60a0830189611d12565b611fca60c0830188611d12565b611fd760e0830187611d12565b611fe5610100830186611d12565b611ff3610120830185611cbb565b612001610140830184611cbb565b9c9b505050505050505050505050565b6000806040838503121561202857612027611bd6565b5b600061203685828601611c24565b925050602061204785828601611c24565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061209857607f821691505b6020821081036120ab576120aa612051565b5b50919050565b7f506f6f6c20656e642074696d6520686173206e6f74207965742061727269766560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b600061210d602183611b2f565b9150612118826120b1565b604082019050919050565b6000602082019050818103600083015261213c81612100565b9050919050565b7f506f6f6c20697320616c7265616479207265736f6c7665640000000000000000600082015250565b6000612179601883611b2f565b915061218482612143565b602082019050919050565b600060208201905081810360008301526121a88161216c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006121e982611c39565b91506121f483611c39565b925082820190508082111561220c5761220b6121af565b5b92915050565b600061221d82611c39565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361224f5761224e6121af565b5b600182019050919050565b600060408201905061226f6000830185611d12565b61227c6020830184611cbb565b9392505050565b600061228e82611c39565b915061229983611c39565b92508282026122a781611c39565b915082820484148315176122be576122bd6121af565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006122ff82611c39565b915061230a83611c39565b92508261231a576123196122c5565b5b828204905092915050565b600061233082611c39565b915061233b83611c39565b9250828203905081811115612353576123526121af565b5b92915050565b600060608201905061236e6000830186611d21565b61237b6020830185611d12565b6123886040830184611d12565b949350505050565b7f46656520697320726571756972656420746f20696e6974696174652076616c6960008201527f646174696f6e20706f6f6c000000000000000000000000000000000000000000602082015250565b60006123ec602b83611b2f565b91506123f782612390565b604082019050919050565b6000602082019050818103600083015261241b816123df565b9050919050565b7f4475726174696f6e20697320746f6f2073686f72740000000000000000000000600082015250565b6000612458601583611b2f565b915061246382612422565b602082019050919050565b600060208201905081810360008301526124878161244b565b9050919050565b7f4475726174696f6e20697320746f6f206c6f6e67000000000000000000000000600082015250565b60006124c4601483611b2f565b91506124cf8261248e565b602082019050919050565b600060208201905081810360008301526124f3816124b7565b9050919050565b7f54617267657420706f7374206e6f7420666f756e640000000000000000000000600082015250565b6000612530601583611b2f565b915061253b826124fa565b602082019050919050565b6000602082019050818103600083015261255f81612523565b9050919050565b7f506f6f6c20656e642074696d6520686173207061737365640000000000000000600082015250565b600061259c601883611b2f565b91506125a782612566565b602082019050919050565b600060208201905081810360008301526125cb8161258f565b905091905056fea2646970667358221220493bc48ed6781c50ea5b85d36b6f57bf83b3b82cebbd13bf10a0f709ec0a39eb64736f6c63430008180033", + "bytecode": "0x60806040523480156200001157600080fd5b506040518060400160405280600a81526020017f52657075746174696f6e000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f524550000000000000000000000000000000000000000000000000000000000081525081600390816200008f919062000324565b508060049081620000a1919062000324565b5050506200040b565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200012c57607f821691505b602082108103620001425762000141620000e4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620001ac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200016d565b620001b886836200016d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000205620001ff620001f984620001d0565b620001da565b620001d0565b9050919050565b6000819050919050565b6200022183620001e4565b6200023962000230826200020c565b8484546200017a565b825550505050565b600090565b6200025062000241565b6200025d81848462000216565b505050565b5b8181101562000285576200027960008262000246565b60018101905062000263565b5050565b601f821115620002d4576200029e8162000148565b620002a9846200015d565b81016020851015620002b9578190505b620002d1620002c8856200015d565b83018262000262565b50505b505050565b600082821c905092915050565b6000620002f960001984600802620002d9565b1980831691505092915050565b6000620003148383620002e6565b9150826002028217905092915050565b6200032f82620000aa565b67ffffffffffffffff8111156200034b576200034a620000b5565b5b62000357825462000113565b6200036482828562000289565b600060209050601f8311600181146200039c576000841562000387578287015190505b62000393858262000306565b86555062000403565b601f198416620003ac8662000148565b60005b82811015620003d657848901518255600182019150602085019450602081019050620003af565b86831015620003f65784890151620003f2601f891682620002e6565b8355505b6001600288020188555050505b505050505050565b612bf4806200041b6000396000f3fe6080604052600436106101405760003560e01c806356715761116100b657806395d89b411161006f57806395d89b41146104b0578063a230c524146104db578063a233627914610518578063a9059cbb1461055f578063dd62ed3e1461059c578063ee2e5230146105d957610140565b806356715761146103785780635daf08ca146103a3578063642b5bfb146103e05780636db5c8fd1461040b57806370a0823114610436578063883802741461047357610140565b806317c182171161010857806317c182171461024257806318160ddd1461027f57806323b872dd146102aa578063313ce567146102e75780633ff7544214610312578063561b24631461034f57610140565b806306fdde0314610145578063095ea7b3146101705780630b1e7f83146101ad57806311aee380146101ec57806317906c2e14610217575b600080fd5b34801561015157600080fd5b5061015a610609565b6040516101679190611d28565b60405180910390f35b34801561017c57600080fd5b5061019760048036038101906101929190611de8565b61069b565b6040516101a49190611e43565b60405180910390f35b3480156101b957600080fd5b506101d460048036038101906101cf9190611e5e565b6106be565b6040516101e393929190611ea9565b60405180910390f35b3480156101f857600080fd5b50610201610728565b60405161020e9190611ee0565b60405180910390f35b34801561022357600080fd5b5061022c61072e565b6040516102399190611ee0565b60405180910390f35b34801561024e57600080fd5b5061026960048036038101906102649190611e5e565b610734565b6040516102769190611e43565b60405180910390f35b34801561028b57600080fd5b50610294610d34565b6040516102a19190611ee0565b60405180910390f35b3480156102b657600080fd5b506102d160048036038101906102cc9190611efb565b610d3e565b6040516102de9190611e43565b60405180910390f35b3480156102f357600080fd5b506102fc610d6d565b6040516103099190611f6a565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190611f85565b610d76565b6040516103469190611ee0565b60405180910390f35b34801561035b57600080fd5b5061037660048036038101906103719190611fde565b610e74565b005b34801561038457600080fd5b5061038d610e9d565b60405161039a9190611ee0565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190611e5e565b610ea2565b6040516103d79190612031565b60405180910390f35b3480156103ec57600080fd5b506103f5610ed5565b6040516104029190611ee0565b60405180910390f35b34801561041757600080fd5b50610420610edb565b60405161042d9190611ee0565b60405180910390f35b34801561044257600080fd5b5061045d60048036038101906104589190611f85565b610ee2565b60405161046a9190611ee0565b60405180910390f35b34801561047f57600080fd5b5061049a6004803603810190610495919061204c565b610f2a565b6040516104a79190611e43565b60405180910390f35b3480156104bc57600080fd5b506104c5610fb5565b6040516104d29190611d28565b60405180910390f35b3480156104e757600080fd5b5061050260048036038101906104fd9190611f85565b611047565b60405161050f9190611e43565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190611e5e565b611067565b6040516105569b9a999897969594939291906120f4565b60405180910390f35b34801561056b57600080fd5b5061058660048036038101906105819190611de8565b611190565b6040516105939190611e43565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be91906121a6565b6111b3565b6040516105d09190611ee0565b60405180910390f35b6105f360048036038101906105ee919061224b565b61123a565b6040516106009190611ee0565b60405180910390f35b60606003805461061890612302565b80601f016020809104026020016040519081016040528092919081815260200182805461064490612302565b80156106915780601f1061066657610100808354040283529160200191610691565b820191906000526020600020905b81548152906001019060200180831161067457829003601f168201915b5050505050905090565b6000806106a6611577565b90506106b381858561157f565b600191505092915050565b600a6020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b60065481565b600b5481565b6000806008600084815260200190815260200160002090506000600a6000836001015481526020019081526020016000209050816007015442116107ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a4906123a5565b60405180910390fd5b600015158260080160009054906101000a900460ff16151514610805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fc90612411565b60405180910390fd5b600080600080600090505b85600401548110156108815785600301600082815260200190815260200160002091508160010160009054906101000a900460ff16156108615781600201548461085a9190612460565b9350610874565b8160020154836108719190612460565b92505b8080600101915050610810565b508183101595508580156109035750600760008560020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610a11578360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560006006600081548092919061094490612494565b91905055815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008660020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b60018560080160006101000a81548160ff021916908315150217905550858560080160016101000a81548160ff0219169083151502179055507f926ee3a021d24f18cfab444988fa0338bcaa0f1e0d7c2211c07d10cbad6772948787604051610a7b9291906124dc565b60405180910390a1600086610a905782610a92565b835b9050600087610aa15784610aa3565b835b9050600080600090505b8860040154811015610b665788600301600082815260200190815260200160002094508460010160009054906101000a900460ff1615158a151503610b5957600084866002015485610aff9190612505565b610b099190612576565b9050610b49308760030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838960020154610b449190612460565b611591565b8083610b559190612460565b9250505b8080600101915050610aad565b5060008183610b7591906125a7565b90506000811115610bb057610baf308960020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611591565b5b60005b600654811015610c795760006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000610bff610d34565b610c0883610ee2565b8d60050154610c179190612505565b610c219190612576565b90508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c69573d6000803e3d6000fd5b5050508080600101915050610bb3565b508860080160029054906101000a900460ff1615610d26578860020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1397c6e8b8b6009016040518363ffffffff1660e01b8152600401610cf3929190612674565b600060405180830381600087803b158015610d0d57600080fd5b505af1158015610d21573d6000803e3d6000fd5b505050505b505050505050505050919050565b6000600254905090565b600080610d49611577565b9050610d56858285611685565b610d61858585611591565b60019150509392505050565b60006012905090565b6000600b6000815480929190610d8b90612494565b9190505590506000600a60008381526020019081526020016000209050828160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550338160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508181600001819055507f60b94e7764708712b927071922e2d834b79011347c7b80aed74caeeece2eed4c82604051610e669190611ee0565b60405180910390a150919050565b6000600860008581526020019081526020016000209050610e9781338585611719565b50505050565b603c81565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b6201518081565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610f368484611190565b90508015610fae578373ffffffffffffffffffffffffffffffffffffffff1663216ed6ad3385856040518463ffffffff1660e01b8152600401610f7b939291906126a4565b600060405180830381600087803b158015610f9557600080fd5b505af1158015610fa9573d6000803e3d6000fd5b505050505b9392505050565b606060048054610fc490612302565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff090612302565b801561103d5780601f106110125761010080835404028352916020019161103d565b820191906000526020600020905b81548152906001019060200180831161102057829003601f168201915b5050505050905090565b60076020528060005260406000206000915054906101000a900460ff1681565b60086020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154908060050154908060060154908060070154908060080160009054906101000a900460ff16908060080160019054906101000a900460ff16908060080160029054906101000a900460ff169080600901805461110d90612302565b80601f016020809104026020016040519081016040528092919081815260200182805461113990612302565b80156111865780601f1061115b57610100808354040283529160200191611186565b820191906000526020600020905b81548152906001019060200180831161116957829003601f168201915b505050505090508b565b60008061119b611577565b90506111a8818585611591565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600080341161127e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112759061274d565b60405180910390fd5b603c8510156112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b9906127b9565b60405180910390fd5b62015180851115611308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ff90612825565b60405180910390fd5b6000600a60008881526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036113b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a990612891565b60405180910390fd5b600960008154809291906113c590612494565b9190505591506000600860008481526020019081526020016000209050338160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550878160010181905550348160050181905550868160060181905550864261144c9190612460565b8160070181905550828160000181905550858160080160026101000a81548160ff021916908315150217905550848482600901918261148c929190612a82565b506114bb8260020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163461181a565b6114f8818360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166002346114f19190612576565b6001611719565b611535818360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660023461152e9190612576565b6000611719565b7f6e5c598b821d7fa8550e5fea58ab6e27c59e1cbe1df75a8591aa0c453b49e10a836040516115649190611ee0565b60405180910390a1505095945050505050565b600033905090565b61158c838383600161189c565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116035760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016115fa9190612031565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116755760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161166c9190612031565b60405180910390fd5b611680838383611a73565b505050565b600061169184846111b3565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117135781811015611703578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016116fa939291906126a4565b60405180910390fd5b6117128484848403600061189c565b5b50505050565b8360070154421115611760576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175790612b9e565b60405180910390fd5b61176b833084611591565b600084600401600081548092919061178290612494565b91905055905060008560030160008381526020019081526020016000209050848160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828160010160006101000a81548160ff021916908315150217905550838160020181905550818160000181905550505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361188c5760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016118839190612031565b60405180910390fd5b61189860008383611a73565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361190e5760006040517fe602df050000000000000000000000000000000000000000000000000000000081526004016119059190612031565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036119805760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016119779190612031565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015611a6d578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611a649190611ee0565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ac5578060026000828254611ab99190612460565b92505081905550611b98565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611b51578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611b48939291906126a4565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611be15780600260008282540392505081905550611c2e565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611c8b9190611ee0565b60405180910390a3505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611cd2578082015181840152602081019050611cb7565b60008484015250505050565b6000601f19601f8301169050919050565b6000611cfa82611c98565b611d048185611ca3565b9350611d14818560208601611cb4565b611d1d81611cde565b840191505092915050565b60006020820190508181036000830152611d428184611cef565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611d7f82611d54565b9050919050565b611d8f81611d74565b8114611d9a57600080fd5b50565b600081359050611dac81611d86565b92915050565b6000819050919050565b611dc581611db2565b8114611dd057600080fd5b50565b600081359050611de281611dbc565b92915050565b60008060408385031215611dff57611dfe611d4a565b5b6000611e0d85828601611d9d565b9250506020611e1e85828601611dd3565b9150509250929050565b60008115159050919050565b611e3d81611e28565b82525050565b6000602082019050611e586000830184611e34565b92915050565b600060208284031215611e7457611e73611d4a565b5b6000611e8284828501611dd3565b91505092915050565b611e9481611db2565b82525050565b611ea381611d74565b82525050565b6000606082019050611ebe6000830186611e8b565b611ecb6020830185611e9a565b611ed86040830184611e9a565b949350505050565b6000602082019050611ef56000830184611e8b565b92915050565b600080600060608486031215611f1457611f13611d4a565b5b6000611f2286828701611d9d565b9350506020611f3386828701611d9d565b9250506040611f4486828701611dd3565b9150509250925092565b600060ff82169050919050565b611f6481611f4e565b82525050565b6000602082019050611f7f6000830184611f5b565b92915050565b600060208284031215611f9b57611f9a611d4a565b5b6000611fa984828501611d9d565b91505092915050565b611fbb81611e28565b8114611fc657600080fd5b50565b600081359050611fd881611fb2565b92915050565b600080600060608486031215611ff757611ff6611d4a565b5b600061200586828701611dd3565b935050602061201686828701611dd3565b925050604061202786828701611fc9565b9150509250925092565b60006020820190506120466000830184611e9a565b92915050565b60008060006060848603121561206557612064611d4a565b5b600061207386828701611d9d565b935050602061208486828701611dd3565b925050604061209586828701611dd3565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b60006120c68261209f565b6120d081856120aa565b93506120e0818560208601611cb4565b6120e981611cde565b840191505092915050565b60006101608201905061210a600083018e611e8b565b612117602083018d611e8b565b612124604083018c611e9a565b612131606083018b611e8b565b61213e608083018a611e8b565b61214b60a0830189611e8b565b61215860c0830188611e8b565b61216560e0830187611e34565b612173610100830186611e34565b612181610120830185611e34565b81810361014083015261219481846120bb565b90509c9b505050505050505050505050565b600080604083850312156121bd576121bc611d4a565b5b60006121cb85828601611d9d565b92505060206121dc85828601611d9d565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261220b5761220a6121e6565b5b8235905067ffffffffffffffff811115612228576122276121eb565b5b602083019150836001820283011115612244576122436121f0565b5b9250929050565b60008060008060006080868803121561226757612266611d4a565b5b600061227588828901611dd3565b955050602061228688828901611dd3565b945050604061229788828901611fc9565b935050606086013567ffffffffffffffff8111156122b8576122b7611d4f565b5b6122c4888289016121f5565b92509250509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061231a57607f821691505b60208210810361232d5761232c6122d3565b5b50919050565b7f506f6f6c20656e642074696d6520686173206e6f74207965742061727269766560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b600061238f602183611ca3565b915061239a82612333565b604082019050919050565b600060208201905081810360008301526123be81612382565b9050919050565b7f506f6f6c20697320616c7265616479207265736f6c7665640000000000000000600082015250565b60006123fb601883611ca3565b9150612406826123c5565b602082019050919050565b6000602082019050818103600083015261242a816123ee565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061246b82611db2565b915061247683611db2565b925082820190508082111561248e5761248d612431565b5b92915050565b600061249f82611db2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124d1576124d0612431565b5b600182019050919050565b60006040820190506124f16000830185611e8b565b6124fe6020830184611e34565b9392505050565b600061251082611db2565b915061251b83611db2565b925082820261252981611db2565b915082820484148315176125405761253f612431565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061258182611db2565b915061258c83611db2565b92508261259c5761259b612547565b5b828204905092915050565b60006125b282611db2565b91506125bd83611db2565b92508282039050818111156125d5576125d4612431565b5b92915050565b60008190508160005260206000209050919050565b600081546125fd81612302565b61260781866120aa565b9450600182166000811461262257600181146126385761266b565b60ff19831686528115156020028601935061266b565b612641856125db565b60005b8381101561266357815481890152600182019150602081019050612644565b808801955050505b50505092915050565b60006040820190506126896000830185611e34565b818103602083015261269b81846125f0565b90509392505050565b60006060820190506126b96000830186611e9a565b6126c66020830185611e8b565b6126d36040830184611e8b565b949350505050565b7f46656520697320726571756972656420746f20696e6974696174652076616c6960008201527f646174696f6e20706f6f6c000000000000000000000000000000000000000000602082015250565b6000612737602b83611ca3565b9150612742826126db565b604082019050919050565b600060208201905081810360008301526127668161272a565b9050919050565b7f4475726174696f6e20697320746f6f2073686f72740000000000000000000000600082015250565b60006127a3601583611ca3565b91506127ae8261276d565b602082019050919050565b600060208201905081810360008301526127d281612796565b9050919050565b7f4475726174696f6e20697320746f6f206c6f6e67000000000000000000000000600082015250565b600061280f601483611ca3565b915061281a826127d9565b602082019050919050565b6000602082019050818103600083015261283e81612802565b9050919050565b7f54617267657420706f7374206e6f7420666f756e640000000000000000000000600082015250565b600061287b601583611ca3565b915061288682612845565b602082019050919050565b600060208201905081810360008301526128aa8161286e565b9050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020601f8301049050919050565b600082821b905092915050565b6000600883026129387fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826128fb565b61294286836128fb565b95508019841693508086168417925050509392505050565b6000819050919050565b600061297f61297a61297584611db2565b61295a565b611db2565b9050919050565b6000819050919050565b61299983612964565b6129ad6129a582612986565b848454612908565b825550505050565b600090565b6129c26129b5565b6129cd818484612990565b505050565b5b818110156129f1576129e66000826129ba565b6001810190506129d3565b5050565b601f821115612a3657612a07816125db565b612a10846128eb565b81016020851015612a1f578190505b612a33612a2b856128eb565b8301826129d2565b50505b505050565b600082821c905092915050565b6000612a5960001984600802612a3b565b1980831691505092915050565b6000612a728383612a48565b9150826002028217905092915050565b612a8c83836128b1565b67ffffffffffffffff811115612aa557612aa46128bc565b5b612aaf8254612302565b612aba8282856129f5565b6000601f831160018114612ae95760008415612ad7578287013590505b612ae18582612a66565b865550612b49565b601f198416612af7866125db565b60005b82811015612b1f57848901358255600182019150602085019450602081019050612afa565b86831015612b3c5784890135612b38601f891682612a48565b8355505b6001600288020188555050505b50505050505050565b7f506f6f6c20656e642074696d6520686173207061737365640000000000000000600082015250565b6000612b88601883611ca3565b9150612b9382612b52565b602082019050919050565b60006020820190508181036000830152612bb781612b7b565b905091905056fea26469706673582212208ad2ae62513a73710c2c6647b8b3ff5b39f714af4dec72a84c4c3f3fb84461e064736f6c63430008180033", + "deployedBytecode": "0x6080604052600436106101405760003560e01c806356715761116100b657806395d89b411161006f57806395d89b41146104b0578063a230c524146104db578063a233627914610518578063a9059cbb1461055f578063dd62ed3e1461059c578063ee2e5230146105d957610140565b806356715761146103785780635daf08ca146103a3578063642b5bfb146103e05780636db5c8fd1461040b57806370a0823114610436578063883802741461047357610140565b806317c182171161010857806317c182171461024257806318160ddd1461027f57806323b872dd146102aa578063313ce567146102e75780633ff7544214610312578063561b24631461034f57610140565b806306fdde0314610145578063095ea7b3146101705780630b1e7f83146101ad57806311aee380146101ec57806317906c2e14610217575b600080fd5b34801561015157600080fd5b5061015a610609565b6040516101679190611d28565b60405180910390f35b34801561017c57600080fd5b5061019760048036038101906101929190611de8565b61069b565b6040516101a49190611e43565b60405180910390f35b3480156101b957600080fd5b506101d460048036038101906101cf9190611e5e565b6106be565b6040516101e393929190611ea9565b60405180910390f35b3480156101f857600080fd5b50610201610728565b60405161020e9190611ee0565b60405180910390f35b34801561022357600080fd5b5061022c61072e565b6040516102399190611ee0565b60405180910390f35b34801561024e57600080fd5b5061026960048036038101906102649190611e5e565b610734565b6040516102769190611e43565b60405180910390f35b34801561028b57600080fd5b50610294610d34565b6040516102a19190611ee0565b60405180910390f35b3480156102b657600080fd5b506102d160048036038101906102cc9190611efb565b610d3e565b6040516102de9190611e43565b60405180910390f35b3480156102f357600080fd5b506102fc610d6d565b6040516103099190611f6a565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190611f85565b610d76565b6040516103469190611ee0565b60405180910390f35b34801561035b57600080fd5b5061037660048036038101906103719190611fde565b610e74565b005b34801561038457600080fd5b5061038d610e9d565b60405161039a9190611ee0565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190611e5e565b610ea2565b6040516103d79190612031565b60405180910390f35b3480156103ec57600080fd5b506103f5610ed5565b6040516104029190611ee0565b60405180910390f35b34801561041757600080fd5b50610420610edb565b60405161042d9190611ee0565b60405180910390f35b34801561044257600080fd5b5061045d60048036038101906104589190611f85565b610ee2565b60405161046a9190611ee0565b60405180910390f35b34801561047f57600080fd5b5061049a6004803603810190610495919061204c565b610f2a565b6040516104a79190611e43565b60405180910390f35b3480156104bc57600080fd5b506104c5610fb5565b6040516104d29190611d28565b60405180910390f35b3480156104e757600080fd5b5061050260048036038101906104fd9190611f85565b611047565b60405161050f9190611e43565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190611e5e565b611067565b6040516105569b9a999897969594939291906120f4565b60405180910390f35b34801561056b57600080fd5b5061058660048036038101906105819190611de8565b611190565b6040516105939190611e43565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be91906121a6565b6111b3565b6040516105d09190611ee0565b60405180910390f35b6105f360048036038101906105ee919061224b565b61123a565b6040516106009190611ee0565b60405180910390f35b60606003805461061890612302565b80601f016020809104026020016040519081016040528092919081815260200182805461064490612302565b80156106915780601f1061066657610100808354040283529160200191610691565b820191906000526020600020905b81548152906001019060200180831161067457829003601f168201915b5050505050905090565b6000806106a6611577565b90506106b381858561157f565b600191505092915050565b600a6020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b60065481565b600b5481565b6000806008600084815260200190815260200160002090506000600a6000836001015481526020019081526020016000209050816007015442116107ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a4906123a5565b60405180910390fd5b600015158260080160009054906101000a900460ff16151514610805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fc90612411565b60405180910390fd5b600080600080600090505b85600401548110156108815785600301600082815260200190815260200160002091508160010160009054906101000a900460ff16156108615781600201548461085a9190612460565b9350610874565b8160020154836108719190612460565b92505b8080600101915050610810565b508183101595508580156109035750600760008560020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610a11578360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560006006600081548092919061094490612494565b91905055815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008660020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b60018560080160006101000a81548160ff021916908315150217905550858560080160016101000a81548160ff0219169083151502179055507f926ee3a021d24f18cfab444988fa0338bcaa0f1e0d7c2211c07d10cbad6772948787604051610a7b9291906124dc565b60405180910390a1600086610a905782610a92565b835b9050600087610aa15784610aa3565b835b9050600080600090505b8860040154811015610b665788600301600082815260200190815260200160002094508460010160009054906101000a900460ff1615158a151503610b5957600084866002015485610aff9190612505565b610b099190612576565b9050610b49308760030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838960020154610b449190612460565b611591565b8083610b559190612460565b9250505b8080600101915050610aad565b5060008183610b7591906125a7565b90506000811115610bb057610baf308960020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611591565b5b60005b600654811015610c795760006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000610bff610d34565b610c0883610ee2565b8d60050154610c179190612505565b610c219190612576565b90508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c69573d6000803e3d6000fd5b5050508080600101915050610bb3565b508860080160029054906101000a900460ff1615610d26578860020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1397c6e8b8b6009016040518363ffffffff1660e01b8152600401610cf3929190612674565b600060405180830381600087803b158015610d0d57600080fd5b505af1158015610d21573d6000803e3d6000fd5b505050505b505050505050505050919050565b6000600254905090565b600080610d49611577565b9050610d56858285611685565b610d61858585611591565b60019150509392505050565b60006012905090565b6000600b6000815480929190610d8b90612494565b9190505590506000600a60008381526020019081526020016000209050828160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550338160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508181600001819055507f60b94e7764708712b927071922e2d834b79011347c7b80aed74caeeece2eed4c82604051610e669190611ee0565b60405180910390a150919050565b6000600860008581526020019081526020016000209050610e9781338585611719565b50505050565b603c81565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b6201518081565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610f368484611190565b90508015610fae578373ffffffffffffffffffffffffffffffffffffffff1663216ed6ad3385856040518463ffffffff1660e01b8152600401610f7b939291906126a4565b600060405180830381600087803b158015610f9557600080fd5b505af1158015610fa9573d6000803e3d6000fd5b505050505b9392505050565b606060048054610fc490612302565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff090612302565b801561103d5780601f106110125761010080835404028352916020019161103d565b820191906000526020600020905b81548152906001019060200180831161102057829003601f168201915b5050505050905090565b60076020528060005260406000206000915054906101000a900460ff1681565b60086020528060005260406000206000915090508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154908060050154908060060154908060070154908060080160009054906101000a900460ff16908060080160019054906101000a900460ff16908060080160029054906101000a900460ff169080600901805461110d90612302565b80601f016020809104026020016040519081016040528092919081815260200182805461113990612302565b80156111865780601f1061115b57610100808354040283529160200191611186565b820191906000526020600020905b81548152906001019060200180831161116957829003601f168201915b505050505090508b565b60008061119b611577565b90506111a8818585611591565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600080341161127e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112759061274d565b60405180910390fd5b603c8510156112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b9906127b9565b60405180910390fd5b62015180851115611308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ff90612825565b60405180910390fd5b6000600a60008881526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036113b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a990612891565b60405180910390fd5b600960008154809291906113c590612494565b9190505591506000600860008481526020019081526020016000209050338160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550878160010181905550348160050181905550868160060181905550864261144c9190612460565b8160070181905550828160000181905550858160080160026101000a81548160ff021916908315150217905550848482600901918261148c929190612a82565b506114bb8260020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163461181a565b6114f8818360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166002346114f19190612576565b6001611719565b611535818360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660023461152e9190612576565b6000611719565b7f6e5c598b821d7fa8550e5fea58ab6e27c59e1cbe1df75a8591aa0c453b49e10a836040516115649190611ee0565b60405180910390a1505095945050505050565b600033905090565b61158c838383600161189c565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116035760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016115fa9190612031565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116755760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161166c9190612031565b60405180910390fd5b611680838383611a73565b505050565b600061169184846111b3565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117135781811015611703578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016116fa939291906126a4565b60405180910390fd5b6117128484848403600061189c565b5b50505050565b8360070154421115611760576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175790612b9e565b60405180910390fd5b61176b833084611591565b600084600401600081548092919061178290612494565b91905055905060008560030160008381526020019081526020016000209050848160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828160010160006101000a81548160ff021916908315150217905550838160020181905550818160000181905550505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361188c5760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016118839190612031565b60405180910390fd5b61189860008383611a73565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361190e5760006040517fe602df050000000000000000000000000000000000000000000000000000000081526004016119059190612031565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036119805760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016119779190612031565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015611a6d578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611a649190611ee0565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ac5578060026000828254611ab99190612460565b92505081905550611b98565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611b51578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611b48939291906126a4565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611be15780600260008282540392505081905550611c2e565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611c8b9190611ee0565b60405180910390a3505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611cd2578082015181840152602081019050611cb7565b60008484015250505050565b6000601f19601f8301169050919050565b6000611cfa82611c98565b611d048185611ca3565b9350611d14818560208601611cb4565b611d1d81611cde565b840191505092915050565b60006020820190508181036000830152611d428184611cef565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611d7f82611d54565b9050919050565b611d8f81611d74565b8114611d9a57600080fd5b50565b600081359050611dac81611d86565b92915050565b6000819050919050565b611dc581611db2565b8114611dd057600080fd5b50565b600081359050611de281611dbc565b92915050565b60008060408385031215611dff57611dfe611d4a565b5b6000611e0d85828601611d9d565b9250506020611e1e85828601611dd3565b9150509250929050565b60008115159050919050565b611e3d81611e28565b82525050565b6000602082019050611e586000830184611e34565b92915050565b600060208284031215611e7457611e73611d4a565b5b6000611e8284828501611dd3565b91505092915050565b611e9481611db2565b82525050565b611ea381611d74565b82525050565b6000606082019050611ebe6000830186611e8b565b611ecb6020830185611e9a565b611ed86040830184611e9a565b949350505050565b6000602082019050611ef56000830184611e8b565b92915050565b600080600060608486031215611f1457611f13611d4a565b5b6000611f2286828701611d9d565b9350506020611f3386828701611d9d565b9250506040611f4486828701611dd3565b9150509250925092565b600060ff82169050919050565b611f6481611f4e565b82525050565b6000602082019050611f7f6000830184611f5b565b92915050565b600060208284031215611f9b57611f9a611d4a565b5b6000611fa984828501611d9d565b91505092915050565b611fbb81611e28565b8114611fc657600080fd5b50565b600081359050611fd881611fb2565b92915050565b600080600060608486031215611ff757611ff6611d4a565b5b600061200586828701611dd3565b935050602061201686828701611dd3565b925050604061202786828701611fc9565b9150509250925092565b60006020820190506120466000830184611e9a565b92915050565b60008060006060848603121561206557612064611d4a565b5b600061207386828701611d9d565b935050602061208486828701611dd3565b925050604061209586828701611dd3565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b60006120c68261209f565b6120d081856120aa565b93506120e0818560208601611cb4565b6120e981611cde565b840191505092915050565b60006101608201905061210a600083018e611e8b565b612117602083018d611e8b565b612124604083018c611e9a565b612131606083018b611e8b565b61213e608083018a611e8b565b61214b60a0830189611e8b565b61215860c0830188611e8b565b61216560e0830187611e34565b612173610100830186611e34565b612181610120830185611e34565b81810361014083015261219481846120bb565b90509c9b505050505050505050505050565b600080604083850312156121bd576121bc611d4a565b5b60006121cb85828601611d9d565b92505060206121dc85828601611d9d565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261220b5761220a6121e6565b5b8235905067ffffffffffffffff811115612228576122276121eb565b5b602083019150836001820283011115612244576122436121f0565b5b9250929050565b60008060008060006080868803121561226757612266611d4a565b5b600061227588828901611dd3565b955050602061228688828901611dd3565b945050604061229788828901611fc9565b935050606086013567ffffffffffffffff8111156122b8576122b7611d4f565b5b6122c4888289016121f5565b92509250509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061231a57607f821691505b60208210810361232d5761232c6122d3565b5b50919050565b7f506f6f6c20656e642074696d6520686173206e6f74207965742061727269766560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b600061238f602183611ca3565b915061239a82612333565b604082019050919050565b600060208201905081810360008301526123be81612382565b9050919050565b7f506f6f6c20697320616c7265616479207265736f6c7665640000000000000000600082015250565b60006123fb601883611ca3565b9150612406826123c5565b602082019050919050565b6000602082019050818103600083015261242a816123ee565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061246b82611db2565b915061247683611db2565b925082820190508082111561248e5761248d612431565b5b92915050565b600061249f82611db2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124d1576124d0612431565b5b600182019050919050565b60006040820190506124f16000830185611e8b565b6124fe6020830184611e34565b9392505050565b600061251082611db2565b915061251b83611db2565b925082820261252981611db2565b915082820484148315176125405761253f612431565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061258182611db2565b915061258c83611db2565b92508261259c5761259b612547565b5b828204905092915050565b60006125b282611db2565b91506125bd83611db2565b92508282039050818111156125d5576125d4612431565b5b92915050565b60008190508160005260206000209050919050565b600081546125fd81612302565b61260781866120aa565b9450600182166000811461262257600181146126385761266b565b60ff19831686528115156020028601935061266b565b612641856125db565b60005b8381101561266357815481890152600182019150602081019050612644565b808801955050505b50505092915050565b60006040820190506126896000830185611e34565b818103602083015261269b81846125f0565b90509392505050565b60006060820190506126b96000830186611e9a565b6126c66020830185611e8b565b6126d36040830184611e8b565b949350505050565b7f46656520697320726571756972656420746f20696e6974696174652076616c6960008201527f646174696f6e20706f6f6c000000000000000000000000000000000000000000602082015250565b6000612737602b83611ca3565b9150612742826126db565b604082019050919050565b600060208201905081810360008301526127668161272a565b9050919050565b7f4475726174696f6e20697320746f6f2073686f72740000000000000000000000600082015250565b60006127a3601583611ca3565b91506127ae8261276d565b602082019050919050565b600060208201905081810360008301526127d281612796565b9050919050565b7f4475726174696f6e20697320746f6f206c6f6e67000000000000000000000000600082015250565b600061280f601483611ca3565b915061281a826127d9565b602082019050919050565b6000602082019050818103600083015261283e81612802565b9050919050565b7f54617267657420706f7374206e6f7420666f756e640000000000000000000000600082015250565b600061287b601583611ca3565b915061288682612845565b602082019050919050565b600060208201905081810360008301526128aa8161286e565b9050919050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020601f8301049050919050565b600082821b905092915050565b6000600883026129387fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826128fb565b61294286836128fb565b95508019841693508086168417925050509392505050565b6000819050919050565b600061297f61297a61297584611db2565b61295a565b611db2565b9050919050565b6000819050919050565b61299983612964565b6129ad6129a582612986565b848454612908565b825550505050565b600090565b6129c26129b5565b6129cd818484612990565b505050565b5b818110156129f1576129e66000826129ba565b6001810190506129d3565b5050565b601f821115612a3657612a07816125db565b612a10846128eb565b81016020851015612a1f578190505b612a33612a2b856128eb565b8301826129d2565b50505b505050565b600082821c905092915050565b6000612a5960001984600802612a3b565b1980831691505092915050565b6000612a728383612a48565b9150826002028217905092915050565b612a8c83836128b1565b67ffffffffffffffff811115612aa557612aa46128bc565b5b612aaf8254612302565b612aba8282856129f5565b6000601f831160018114612ae95760008415612ad7578287013590505b612ae18582612a66565b865550612b49565b601f198416612af7866125db565b60005b82811015612b1f57848901358255600182019150602085019450602081019050612afa565b86831015612b3c5784890135612b38601f891682612a48565b8355505b6001600288020188555050505b50505050505050565b7f506f6f6c20656e642074696d6520686173207061737365640000000000000000600082015250565b6000612b88601883611ca3565b9150612b9382612b52565b602082019050919050565b60006020820190508181036000830152612bb781612b7b565b905091905056fea26469706673582212208ad2ae62513a73710c2c6647b8b3ff5b39f714af4dec72a84c4c3f3fb84461e064736f6c63430008180033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/client/src/assets/Onboarding.json b/client/src/assets/Onboarding.json new file mode 100644 index 0000000..d369fa6 --- /dev/null +++ b/client/src/assets/Onboarding.json @@ -0,0 +1,318 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Onboarding", + "sourceName": "contracts/Onboarding.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract DAO", + "name": "dao_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "price_", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "AvailabilityStaked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "requestIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approval", + "type": "bool" + } + ], + "name": "WorkApprovalSubmitted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "requestIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "WorkAssigned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "requestIndex", + "type": "uint256" + } + ], + "name": "WorkEvidenceSubmitted", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "acceptAvailability", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "extendAvailability", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "votePasses", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "callbackData", + "type": "bytes" + } + ], + "name": "onValidate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "price", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + } + ], + "name": "reclaimAvailability", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "requestCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "requestWork", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "requests", + "outputs": [ + { + "internalType": "address", + "name": "customer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "fee", + "type": "uint256" + }, + { + "internalType": "enum WorkContract.WorkStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "stakeIndex", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "approval", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "stakeCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "stakes", + "outputs": [ + { + "internalType": "address", + "name": "worker", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endTime", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "assigned", + "type": "bool" + }, + { + "internalType": "bool", + "name": "reclaimed", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestIndex", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "approval", + "type": "bool" + } + ], + "name": "submitWorkApproval", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestIndex", + "type": "uint256" + } + ], + "name": "submitWorkEvidence", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60c06040523480156200001157600080fd5b506040516200240538038062002405833981810160405281019062000037919062000138565b81818173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508060a08181525050505050506200017f565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000b18262000084565b9050919050565b6000620000c582620000a4565b9050919050565b620000d781620000b8565b8114620000e357600080fd5b50565b600081519050620000f781620000cc565b92915050565b6000819050919050565b6200011281620000fd565b81146200011e57600080fd5b50565b600081519050620001328162000107565b92915050565b600080604083850312156200015257620001516200007f565b5b60006200016285828601620000e6565b9250506020620001758582860162000121565b9150509250929050565b60805160a05161222f620001d6600039600081816103c30152610b3001526000818161066e015281816108b0015281816109ad01528181610a9401528181610f34015281816110750152611137015261222f6000f3fe6080604052600436106100a75760003560e01c8063a035b1fe11610064578063a035b1fe1461019d578063b5b20c00146101c8578063c4a32591146101f1578063c4a9e1161461021a578063d5a44f8614610245578063e1397c6e14610286576100a7565b8063216ed6ad146100ac5780634b8b194c146100d55780635badbe4c146100df5780638150d5071461010a57806381d12c5814610133578063854b6a4f14610174575b600080fd5b3480156100b857600080fd5b506100d360048036038101906100ce9190611485565b6102af565b005b6100dd6103c1565b005b3480156100eb57600080fd5b506100f46104b7565b60405161010191906114e7565b60405180910390f35b34801561011657600080fd5b50610131600480360381019061012c9190611502565b6104bd565b005b34801561013f57600080fd5b5061015a60048036038101906101559190611502565b61074a565b60405161016b9594939291906115d0565b60405180910390f35b34801561018057600080fd5b5061019b6004803603810190610196919061164f565b6107ba565b005b3480156101a957600080fd5b506101b2610b2e565b6040516101bf91906114e7565b60405180910390f35b3480156101d457600080fd5b506101ef60048036038101906101ea919061168f565b610b52565b005b3480156101fd57600080fd5b5061021860048036038101906102139190611502565b610d18565b005b34801561022657600080fd5b5061022f610ebc565b60405161023c91906114e7565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190611502565b610ec2565b60405161027d9594939291906116cf565b60405180910390f35b34801561029257600080fd5b506102ad60048036038101906102a89190611787565b610f32565b005b600082116102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e990611844565b60405180910390fd5b60006001600081548092919061030790611893565b91905055905060008060008381526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838160010181905550824261037b91906118db565b81600201819055507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9826040516103b291906114e7565b60405180910390a15050505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041b9061195b565b60405180910390fd5b60006003600081548092919061043990611893565b9190505590506000600260008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503481600101819055506104ab826111f4565b81600301819055505050565b60035481565b600080600083815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055c906119ed565b60405180910390fd5b806002015442116105ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a290611a7f565b60405180910390fd5b8060030160019054906101000a900460ff16156105fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f490611aeb565b60405180910390fd5b8060030160009054906101000a900460ff161561064f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064690611b7d565b60405180910390fd5b60018160030160016101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3383600101546040518363ffffffff1660e01b81526004016106cb929190611b9d565b6020604051808303816000875af11580156106ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070e9190611bdb565b507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e98260405161073e91906114e7565b60405180910390a15050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16908060030154908060040160009054906101000a900460ff16905085565b6000600260008481526020019081526020016000209050600160038111156107e5576107e461153e565b5b8160020160009054906101000a900460ff1660038111156108095761080861153e565b5b14610849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084090611c54565b60405180910390fd5b600080600083600301548152602001908152602001600020905060028260020160006101000a81548160ff0219169083600381111561088b5761088a61153e565b5b0217905550828260040160006101000a81548160ff02191690831515021790555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ff754428360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161092b9190611c74565b6020604051808303816000875af115801561094a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096e9190611ca4565b90507f470d2978e081461f6d144c091dfd83ec06e6011da0b03bd1c0121b7fb71370dc85856040516109a1929190611cd1565b60405180910390a160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ee2e5230600a86600101546109f89190611d29565b8660010154610a079190611d5a565b846201518060018b604051602001610a1f91906114e7565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401610a4d9493929190611e1e565b60206040518083038185885af1158015610a6b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a909190611ca4565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663561b246382856001015460016040518463ffffffff1660e01b8152600401610af493929190611e6a565b600060405180830381600087803b158015610b0e57600080fd5b505af1158015610b22573d6000803e3d6000fd5b50505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600084815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf190611f13565b60405180910390fd5b8060030160019054906101000a900460ff1615610c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4390611aeb565b60405180910390fd5b8060030160009054906101000a900460ff1615610c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9590611b7d565b60405180910390fd5b8060020154421115610cc3578142610cb691906118db565b8160020181905550610cdc565b818160020154610cd391906118db565b81600201819055505b7fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e983604051610d0b91906114e7565b60405180910390a1505050565b600060026000838152602001908152602001600020905060006003811115610d4357610d4261153e565b5b8160020160009054906101000a900460ff166003811115610d6757610d6661153e565b5b14610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e90611f7f565b60405180910390fd5b60008060008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4a90612011565b60405180910390fd5b60018260020160006101000a81548160ff02191690836003811115610e7b57610e7a61153e565b5b02179055507ffaecd3b4db089bf25a48306100dd5fb2152e3887c7815b2b221dbb7da2f8e8dc83604051610eaf91906114e7565b60405180910390a1505050565b60015481565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16905085565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb7906120a3565b60405180910390fd5b60008282810190610fd19190611502565b9050600060026000838152602001908152602001600020905084611071578060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a836001015461103e9190611d29565b9081150290604051600060405180830381858888f19350505050158015611069573d6000803e3d6000fd5b5050506111ef565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ff754428360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016110f09190611c74565b6020604051808303816000875af115801561110f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111339190611ca4565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ee2e5230600a84600101546111829190611d29565b836201518060006040518563ffffffff1660e01b81526004016111a7939291906120e9565b60206040518083038185885af11580156111c5573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111ea9190611ca4565b505050505b505050565b60006111fe611272565b90506000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507fd9e7f38a71691fb1db2da17057c03d381a42a9925350883f10e8e5d0bca4a3b48383604051611264929190612133565b60405180910390a150919050565b60008060005b6001548110156112f65760008082815260200190815260200160002060030160009054906101000a900460ff166112e9576000808281526020019081526020016000206002015442116112e95760008082815260200190815260200160002060010154826112e691906118db565b91505b8080600101915050611278565b506000811161133a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611331906121a8565b60405180910390fd5b6000814461134891906121c8565b9050600080600090505b6001548110156113e05760008082815260200190815260200160002060030160009054906101000a900460ff166113d3576000808281526020019081526020016000206002015442116113d35760008082815260200190815260200160002060010154826113c091906118db565b9150828211156113d2578094506113e0565b5b8080600101915050611352565b5050505090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061141c826113f1565b9050919050565b61142c81611411565b811461143757600080fd5b50565b60008135905061144981611423565b92915050565b6000819050919050565b6114628161144f565b811461146d57600080fd5b50565b60008135905061147f81611459565b92915050565b60008060006060848603121561149e5761149d6113e7565b5b60006114ac8682870161143a565b93505060206114bd86828701611470565b92505060406114ce86828701611470565b9150509250925092565b6114e18161144f565b82525050565b60006020820190506114fc60008301846114d8565b92915050565b600060208284031215611518576115176113e7565b5b600061152684828501611470565b91505092915050565b61153881611411565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061157e5761157d61153e565b5b50565b600081905061158f8261156d565b919050565b600061159f82611581565b9050919050565b6115af81611594565b82525050565b60008115159050919050565b6115ca816115b5565b82525050565b600060a0820190506115e5600083018861152f565b6115f260208301876114d8565b6115ff60408301866115a6565b61160c60608301856114d8565b61161960808301846115c1565b9695505050505050565b61162c816115b5565b811461163757600080fd5b50565b60008135905061164981611623565b92915050565b60008060408385031215611666576116656113e7565b5b600061167485828601611470565b92505060206116858582860161163a565b9150509250929050565b600080604083850312156116a6576116a56113e7565b5b60006116b485828601611470565b92505060206116c585828601611470565b9150509250929050565b600060a0820190506116e4600083018861152f565b6116f160208301876114d8565b6116fe60408301866114d8565b61170b60608301856115c1565b61171860808301846115c1565b9695505050505050565b600080fd5b600080fd5b600080fd5b60008083601f84011261174757611746611722565b5b8235905067ffffffffffffffff81111561176457611763611727565b5b6020830191508360018202830111156117805761177f61172c565b5b9250929050565b6000806000604084860312156117a05761179f6113e7565b5b60006117ae8682870161163a565b935050602084013567ffffffffffffffff8111156117cf576117ce6113ec565b5b6117db86828701611731565b92509250509250925092565b600082825260208201905092915050565b7f4e6f207374616b652070726f7669646564000000000000000000000000000000600082015250565b600061182e6011836117e7565b9150611839826117f8565b602082019050919050565b6000602082019050818103600083015261185d81611821565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061189e8261144f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036118d0576118cf611864565b5b600182019050919050565b60006118e68261144f565b91506118f18361144f565b925082820190508082111561190957611908611864565b5b92915050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b60006119456010836117e7565b91506119508261190f565b602082019050919050565b6000602082019050818103600083015261197481611938565b9050919050565b7f576f726b65722063616e206f6e6c79207265636c61696d207468656972206f7760008201527f6e20617661696c6162696c697479207374616b65000000000000000000000000602082015250565b60006119d76034836117e7565b91506119e28261197b565b604082019050919050565b60006020820190508181036000830152611a06816119ca565b9050919050565b7f5374616b65206475726174696f6e20686173206e6f742079657420656c61707360008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000611a696022836117e7565b9150611a7482611a0d565b604082019050919050565b60006020820190508181036000830152611a9881611a5c565b9050919050565b7f5374616b652068617320616c7265616479206265656e207265636c61696d6564600082015250565b6000611ad56020836117e7565b9150611ae082611a9f565b602082019050919050565b60006020820190508181036000830152611b0481611ac8565b9050919050565b7f5374616b652068617320616c7265616479206265656e2061737369676e65642060008201527f776f726b00000000000000000000000000000000000000000000000000000000602082015250565b6000611b676024836117e7565b9150611b7282611b0b565b604082019050919050565b60006020820190508181036000830152611b9681611b5a565b9050919050565b6000604082019050611bb2600083018561152f565b611bbf60208301846114d8565b9392505050565b600081519050611bd581611623565b92915050565b600060208284031215611bf157611bf06113e7565b5b6000611bff84828501611bc6565b91505092915050565b7f537461747573206d7573742062652045766964656e63655375626d6974746564600082015250565b6000611c3e6020836117e7565b9150611c4982611c08565b602082019050919050565b60006020820190508181036000830152611c6d81611c31565b9050919050565b6000602082019050611c89600083018461152f565b92915050565b600081519050611c9e81611459565b92915050565b600060208284031215611cba57611cb96113e7565b5b6000611cc884828501611c8f565b91505092915050565b6000604082019050611ce660008301856114d8565b611cf360208301846115c1565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611d348261144f565b9150611d3f8361144f565b925082611d4f57611d4e611cfa565b5b828204905092915050565b6000611d658261144f565b9150611d708361144f565b9250828203905081811115611d8857611d87611864565b5b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611dc8578082015181840152602081019050611dad565b60008484015250505050565b6000601f19601f8301169050919050565b6000611df082611d8e565b611dfa8185611d99565b9350611e0a818560208601611daa565b611e1381611dd4565b840191505092915050565b6000608082019050611e3360008301876114d8565b611e4060208301866114d8565b611e4d60408301856115c1565b8181036060830152611e5f8184611de5565b905095945050505050565b6000606082019050611e7f60008301866114d8565b611e8c60208301856114d8565b611e9960408301846115c1565b949350505050565b7f576f726b65722063616e206f6e6c7920657874656e64207468656972206f776e60008201527f20617661696c6162696c697479207374616b6500000000000000000000000000602082015250565b6000611efd6033836117e7565b9150611f0882611ea1565b604082019050919050565b60006020820190508181036000830152611f2c81611ef0565b9050919050565b7f537461747573206d757374206265205265717565737465640000000000000000600082015250565b6000611f696018836117e7565b9150611f7482611f33565b602082019050919050565b60006020820190508181036000830152611f9881611f5c565b9050919050565b7f576f726b65722063616e206f6e6c79207375626d69742065766964656e63652060008201527f666f7220776f726b2074686579206172652061737369676e6564000000000000602082015250565b6000611ffb603a836117e7565b915061200682611f9f565b604082019050919050565b6000602082019050818103600083015261202a81611fee565b9050919050565b7f6f6e56616c6964617465206d6179206f6e6c792062652063616c6c656420627960008201527f207468652044414f20636f6e7472616374000000000000000000000000000000602082015250565b600061208d6031836117e7565b915061209882612031565b604082019050919050565b600060208201905081810360008301526120bc81612080565b9050919050565b50565b60006120d3600083611d99565b91506120de826120c3565b600082019050919050565b60006080820190506120fe60008301866114d8565b61210b60208301856114d8565b61211860408301846115c1565b8181036060830152612129816120c6565b9050949350505050565b600060408201905061214860008301856114d8565b61215560208301846114d8565b9392505050565b7f4e6f20617661696c61626c6520776f726b6572207374616b6573000000000000600082015250565b6000612192601a836117e7565b915061219d8261215c565b602082019050919050565b600060208201905081810360008301526121c181612185565b9050919050565b60006121d38261144f565b91506121de8361144f565b9250826121ee576121ed611cfa565b5b82820690509291505056fea264697066735822122036b35f7d4d1ba0d128145c692f4a9b70210ef993347af75c828f7ad1e0f5d8aa64736f6c63430008180033", + "deployedBytecode": "0x6080604052600436106100a75760003560e01c8063a035b1fe11610064578063a035b1fe1461019d578063b5b20c00146101c8578063c4a32591146101f1578063c4a9e1161461021a578063d5a44f8614610245578063e1397c6e14610286576100a7565b8063216ed6ad146100ac5780634b8b194c146100d55780635badbe4c146100df5780638150d5071461010a57806381d12c5814610133578063854b6a4f14610174575b600080fd5b3480156100b857600080fd5b506100d360048036038101906100ce9190611485565b6102af565b005b6100dd6103c1565b005b3480156100eb57600080fd5b506100f46104b7565b60405161010191906114e7565b60405180910390f35b34801561011657600080fd5b50610131600480360381019061012c9190611502565b6104bd565b005b34801561013f57600080fd5b5061015a60048036038101906101559190611502565b61074a565b60405161016b9594939291906115d0565b60405180910390f35b34801561018057600080fd5b5061019b6004803603810190610196919061164f565b6107ba565b005b3480156101a957600080fd5b506101b2610b2e565b6040516101bf91906114e7565b60405180910390f35b3480156101d457600080fd5b506101ef60048036038101906101ea919061168f565b610b52565b005b3480156101fd57600080fd5b5061021860048036038101906102139190611502565b610d18565b005b34801561022657600080fd5b5061022f610ebc565b60405161023c91906114e7565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190611502565b610ec2565b60405161027d9594939291906116cf565b60405180910390f35b34801561029257600080fd5b506102ad60048036038101906102a89190611787565b610f32565b005b600082116102f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e990611844565b60405180910390fd5b60006001600081548092919061030790611893565b91905055905060008060008381526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838160010181905550824261037b91906118db565b81600201819055507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e9826040516103b291906114e7565b60405180910390a15050505050565b7f0000000000000000000000000000000000000000000000000000000000000000341015610424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041b9061195b565b60405180910390fd5b60006003600081548092919061043990611893565b9190505590506000600260008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503481600101819055506104ab826111f4565b81600301819055505050565b60035481565b600080600083815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055c906119ed565b60405180910390fd5b806002015442116105ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a290611a7f565b60405180910390fd5b8060030160019054906101000a900460ff16156105fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f490611aeb565b60405180910390fd5b8060030160009054906101000a900460ff161561064f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064690611b7d565b60405180910390fd5b60018160030160016101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3383600101546040518363ffffffff1660e01b81526004016106cb929190611b9d565b6020604051808303816000875af11580156106ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070e9190611bdb565b507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e98260405161073e91906114e7565b60405180910390a15050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16908060030154908060040160009054906101000a900460ff16905085565b6000600260008481526020019081526020016000209050600160038111156107e5576107e461153e565b5b8160020160009054906101000a900460ff1660038111156108095761080861153e565b5b14610849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084090611c54565b60405180910390fd5b600080600083600301548152602001908152602001600020905060028260020160006101000a81548160ff0219169083600381111561088b5761088a61153e565b5b0217905550828260040160006101000a81548160ff02191690831515021790555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ff754428360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161092b9190611c74565b6020604051808303816000875af115801561094a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096e9190611ca4565b90507f470d2978e081461f6d144c091dfd83ec06e6011da0b03bd1c0121b7fb71370dc85856040516109a1929190611cd1565b60405180910390a160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ee2e5230600a86600101546109f89190611d29565b8660010154610a079190611d5a565b846201518060018b604051602001610a1f91906114e7565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401610a4d9493929190611e1e565b60206040518083038185885af1158015610a6b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a909190611ca4565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663561b246382856001015460016040518463ffffffff1660e01b8152600401610af493929190611e6a565b600060405180830381600087803b158015610b0e57600080fd5b505af1158015610b22573d6000803e3d6000fd5b50505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600084815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf190611f13565b60405180910390fd5b8060030160019054906101000a900460ff1615610c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4390611aeb565b60405180910390fd5b8060030160009054906101000a900460ff1615610c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9590611b7d565b60405180910390fd5b8060020154421115610cc3578142610cb691906118db565b8160020181905550610cdc565b818160020154610cd391906118db565b81600201819055505b7fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e983604051610d0b91906114e7565b60405180910390a1505050565b600060026000838152602001908152602001600020905060006003811115610d4357610d4261153e565b5b8160020160009054906101000a900460ff166003811115610d6757610d6661153e565b5b14610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e90611f7f565b60405180910390fd5b60008060008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4a90612011565b60405180910390fd5b60018260020160006101000a81548160ff02191690836003811115610e7b57610e7a61153e565b5b02179055507ffaecd3b4db089bf25a48306100dd5fb2152e3887c7815b2b221dbb7da2f8e8dc83604051610eaf91906114e7565b60405180910390a1505050565b60015481565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16905085565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb7906120a3565b60405180910390fd5b60008282810190610fd19190611502565b9050600060026000838152602001908152602001600020905084611071578060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a836001015461103e9190611d29565b9081150290604051600060405180830381858888f19350505050158015611069573d6000803e3d6000fd5b5050506111ef565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ff754428360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016110f09190611c74565b6020604051808303816000875af115801561110f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111339190611ca4565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ee2e5230600a84600101546111829190611d29565b836201518060006040518563ffffffff1660e01b81526004016111a7939291906120e9565b60206040518083038185885af11580156111c5573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111ea9190611ca4565b505050505b505050565b60006111fe611272565b90506000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507fd9e7f38a71691fb1db2da17057c03d381a42a9925350883f10e8e5d0bca4a3b48383604051611264929190612133565b60405180910390a150919050565b60008060005b6001548110156112f65760008082815260200190815260200160002060030160009054906101000a900460ff166112e9576000808281526020019081526020016000206002015442116112e95760008082815260200190815260200160002060010154826112e691906118db565b91505b8080600101915050611278565b506000811161133a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611331906121a8565b60405180910390fd5b6000814461134891906121c8565b9050600080600090505b6001548110156113e05760008082815260200190815260200160002060030160009054906101000a900460ff166113d3576000808281526020019081526020016000206002015442116113d35760008082815260200190815260200160002060010154826113c091906118db565b9150828211156113d2578094506113e0565b5b8080600101915050611352565b5050505090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061141c826113f1565b9050919050565b61142c81611411565b811461143757600080fd5b50565b60008135905061144981611423565b92915050565b6000819050919050565b6114628161144f565b811461146d57600080fd5b50565b60008135905061147f81611459565b92915050565b60008060006060848603121561149e5761149d6113e7565b5b60006114ac8682870161143a565b93505060206114bd86828701611470565b92505060406114ce86828701611470565b9150509250925092565b6114e18161144f565b82525050565b60006020820190506114fc60008301846114d8565b92915050565b600060208284031215611518576115176113e7565b5b600061152684828501611470565b91505092915050565b61153881611411565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061157e5761157d61153e565b5b50565b600081905061158f8261156d565b919050565b600061159f82611581565b9050919050565b6115af81611594565b82525050565b60008115159050919050565b6115ca816115b5565b82525050565b600060a0820190506115e5600083018861152f565b6115f260208301876114d8565b6115ff60408301866115a6565b61160c60608301856114d8565b61161960808301846115c1565b9695505050505050565b61162c816115b5565b811461163757600080fd5b50565b60008135905061164981611623565b92915050565b60008060408385031215611666576116656113e7565b5b600061167485828601611470565b92505060206116858582860161163a565b9150509250929050565b600080604083850312156116a6576116a56113e7565b5b60006116b485828601611470565b92505060206116c585828601611470565b9150509250929050565b600060a0820190506116e4600083018861152f565b6116f160208301876114d8565b6116fe60408301866114d8565b61170b60608301856115c1565b61171860808301846115c1565b9695505050505050565b600080fd5b600080fd5b600080fd5b60008083601f84011261174757611746611722565b5b8235905067ffffffffffffffff81111561176457611763611727565b5b6020830191508360018202830111156117805761177f61172c565b5b9250929050565b6000806000604084860312156117a05761179f6113e7565b5b60006117ae8682870161163a565b935050602084013567ffffffffffffffff8111156117cf576117ce6113ec565b5b6117db86828701611731565b92509250509250925092565b600082825260208201905092915050565b7f4e6f207374616b652070726f7669646564000000000000000000000000000000600082015250565b600061182e6011836117e7565b9150611839826117f8565b602082019050919050565b6000602082019050818103600083015261185d81611821565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061189e8261144f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036118d0576118cf611864565b5b600182019050919050565b60006118e68261144f565b91506118f18361144f565b925082820190508082111561190957611908611864565b5b92915050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b60006119456010836117e7565b91506119508261190f565b602082019050919050565b6000602082019050818103600083015261197481611938565b9050919050565b7f576f726b65722063616e206f6e6c79207265636c61696d207468656972206f7760008201527f6e20617661696c6162696c697479207374616b65000000000000000000000000602082015250565b60006119d76034836117e7565b91506119e28261197b565b604082019050919050565b60006020820190508181036000830152611a06816119ca565b9050919050565b7f5374616b65206475726174696f6e20686173206e6f742079657420656c61707360008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000611a696022836117e7565b9150611a7482611a0d565b604082019050919050565b60006020820190508181036000830152611a9881611a5c565b9050919050565b7f5374616b652068617320616c7265616479206265656e207265636c61696d6564600082015250565b6000611ad56020836117e7565b9150611ae082611a9f565b602082019050919050565b60006020820190508181036000830152611b0481611ac8565b9050919050565b7f5374616b652068617320616c7265616479206265656e2061737369676e65642060008201527f776f726b00000000000000000000000000000000000000000000000000000000602082015250565b6000611b676024836117e7565b9150611b7282611b0b565b604082019050919050565b60006020820190508181036000830152611b9681611b5a565b9050919050565b6000604082019050611bb2600083018561152f565b611bbf60208301846114d8565b9392505050565b600081519050611bd581611623565b92915050565b600060208284031215611bf157611bf06113e7565b5b6000611bff84828501611bc6565b91505092915050565b7f537461747573206d7573742062652045766964656e63655375626d6974746564600082015250565b6000611c3e6020836117e7565b9150611c4982611c08565b602082019050919050565b60006020820190508181036000830152611c6d81611c31565b9050919050565b6000602082019050611c89600083018461152f565b92915050565b600081519050611c9e81611459565b92915050565b600060208284031215611cba57611cb96113e7565b5b6000611cc884828501611c8f565b91505092915050565b6000604082019050611ce660008301856114d8565b611cf360208301846115c1565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611d348261144f565b9150611d3f8361144f565b925082611d4f57611d4e611cfa565b5b828204905092915050565b6000611d658261144f565b9150611d708361144f565b9250828203905081811115611d8857611d87611864565b5b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611dc8578082015181840152602081019050611dad565b60008484015250505050565b6000601f19601f8301169050919050565b6000611df082611d8e565b611dfa8185611d99565b9350611e0a818560208601611daa565b611e1381611dd4565b840191505092915050565b6000608082019050611e3360008301876114d8565b611e4060208301866114d8565b611e4d60408301856115c1565b8181036060830152611e5f8184611de5565b905095945050505050565b6000606082019050611e7f60008301866114d8565b611e8c60208301856114d8565b611e9960408301846115c1565b949350505050565b7f576f726b65722063616e206f6e6c7920657874656e64207468656972206f776e60008201527f20617661696c6162696c697479207374616b6500000000000000000000000000602082015250565b6000611efd6033836117e7565b9150611f0882611ea1565b604082019050919050565b60006020820190508181036000830152611f2c81611ef0565b9050919050565b7f537461747573206d757374206265205265717565737465640000000000000000600082015250565b6000611f696018836117e7565b9150611f7482611f33565b602082019050919050565b60006020820190508181036000830152611f9881611f5c565b9050919050565b7f576f726b65722063616e206f6e6c79207375626d69742065766964656e63652060008201527f666f7220776f726b2074686579206172652061737369676e6564000000000000602082015250565b6000611ffb603a836117e7565b915061200682611f9f565b604082019050919050565b6000602082019050818103600083015261202a81611fee565b9050919050565b7f6f6e56616c6964617465206d6179206f6e6c792062652063616c6c656420627960008201527f207468652044414f20636f6e7472616374000000000000000000000000000000602082015250565b600061208d6031836117e7565b915061209882612031565b604082019050919050565b600060208201905081810360008301526120bc81612080565b9050919050565b50565b60006120d3600083611d99565b91506120de826120c3565b600082019050919050565b60006080820190506120fe60008301866114d8565b61210b60208301856114d8565b61211860408301846115c1565b8181036060830152612129816120c6565b9050949350505050565b600060408201905061214860008301856114d8565b61215560208301846114d8565b9392505050565b7f4e6f20617661696c61626c6520776f726b6572207374616b6573000000000000600082015250565b6000612192601a836117e7565b915061219d8261215c565b602082019050919050565b600060208201905081810360008301526121c181612185565b9050919050565b60006121d38261144f565b91506121de8361144f565b9250826121ee576121ed611cfa565b5b82820690509291505056fea264697066735822122036b35f7d4d1ba0d128145c692f4a9b70210ef993347af75c828f7ad1e0f5d8aa64736f6c63430008180033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/client/src/assets/Work1.json b/client/src/assets/Work1.json index 48266c3..81d6272 100644 --- a/client/src/assets/Work1.json +++ b/client/src/assets/Work1.json @@ -56,14 +56,14 @@ "inputs": [ { "indexed": false, - "internalType": "address", - "name": "worker", - "type": "address" + "internalType": "uint256", + "name": "requestIndex", + "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "requestIndex", + "name": "stakeIndex", "type": "uint256" } ], @@ -191,7 +191,7 @@ "type": "uint256" }, { - "internalType": "enum WorkStatus", + "internalType": "enum WorkContract.WorkStatus", "name": "status", "type": "uint8" }, @@ -204,11 +204,6 @@ "internalType": "bool", "name": "approval", "type": "bool" - }, - { - "internalType": "uint256", - "name": "poolIndex", - "type": "uint256" } ], "stateMutability": "view", @@ -298,8 +293,8 @@ "type": "function" } ], - "bytecode": "0x60c06040523480156200001157600080fd5b5060405162001d1438038062001d14833981810160405281019062000037919062000134565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508060a0818152505050506200017b565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ad8262000080565b9050919050565b6000620000c182620000a0565b9050919050565b620000d381620000b4565b8114620000df57600080fd5b50565b600081519050620000f381620000c8565b92915050565b6000819050919050565b6200010e81620000f9565b81146200011a57600080fd5b50565b6000815190506200012e8162000103565b92915050565b600080604083850312156200014e576200014d6200007b565b5b60006200015e85828601620000e2565b925050602062000171858286016200011d565b9150509250929050565b60805160a051611b5e620001b6600039600081816103900152610a3301526000818161063b01528181610883015261097e0152611b5e6000f3fe60806040526004361061009c5760003560e01c8063854b6a4f11610064578063854b6a4f1461016a578063a035b1fe14610193578063b5b20c00146101be578063c4a32591146101e7578063c4a9e11614610210578063d5a44f861461023b5761009c565b8063216ed6ad146100a15780634b8b194c146100ca5780635badbe4c146100d45780638150d507146100ff57806381d12c5814610128575b600080fd5b3480156100ad57600080fd5b506100c860048036038101906100c391906110e5565b61027c565b005b6100d261038e565b005b3480156100e057600080fd5b506100e9610484565b6040516100f69190611147565b60405180910390f35b34801561010b57600080fd5b5061012660048036038101906101219190611162565b61048a565b005b34801561013457600080fd5b5061014f600480360381019061014a9190611162565b610717565b60405161016196959493929190611230565b60405180910390f35b34801561017657600080fd5b50610191600480360381019061018c91906112bd565b61078d565b005b34801561019f57600080fd5b506101a8610a31565b6040516101b59190611147565b60405180910390f35b3480156101ca57600080fd5b506101e560048036038101906101e091906112fd565b610a55565b005b3480156101f357600080fd5b5061020e60048036038101906102099190611162565b610c1b565b005b34801561021c57600080fd5b50610225610dbf565b6040516102329190611147565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d9190611162565b610dc5565b60405161027395949392919061133d565b60405180910390f35b600082116102bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b6906113ed565b60405180910390fd5b6000600160008154809291906102d49061143c565b91905055905060008060008381526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083816001018190555082426103489190611484565b81600201819055507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e98260405161037f9190611147565b60405180910390a15050505050565b7f00000000000000000000000000000000000000000000000000000000000000003410156103f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e890611504565b60405180910390fd5b6000600360008154809291906104069061143c565b9190505590506000600260008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034816001018190555061047882610e35565b81600301819055505050565b60035481565b600080600083815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052990611596565b60405180910390fd5b80600201544211610578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056f90611628565b60405180910390fd5b8060030160019054906101000a900460ff16156105ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c190611694565b60405180910390fd5b8060030160009054906101000a900460ff161561061c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061390611726565b60405180910390fd5b60018160030160016101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3383600101546040518363ffffffff1660e01b8152600401610698929190611746565b6020604051808303816000875af11580156106b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106db9190611784565b507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e98260405161070b9190611147565b60405180910390a15050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16908060030154908060040160009054906101000a900460ff16908060050154905086565b6000600260008481526020019081526020016000209050600160038111156107b8576107b761119e565b5b8160020160009054906101000a900460ff1660038111156107dc576107db61119e565b5b1461081c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610813906117fd565b60405180910390fd5b600080600083600301548152602001908152602001600020905060028260020160006101000a81548160ff0219169083600381111561085e5761085d61119e565b5b0217905550828260040160006101000a81548160ff02191690831515021790555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ff754428360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016108fe919061181d565b6020604051808303816000875af115801561091d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610941919061184d565b90507f470d2978e081461f6d144c091dfd83ec06e6011da0b03bd1c0121b7fb71370dc858560405161097492919061187a565b60405180910390a17f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639fcb294b846001015483620151806040518463ffffffff1660e01b81526004016109df9291906118a3565b60206040518083038185885af11580156109fd573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a22919061184d565b83600501819055505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600084815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af49061193e565b60405180910390fd5b8060030160019054906101000a900460ff1615610b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4690611694565b60405180910390fd5b8060030160009054906101000a900460ff1615610ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9890611726565b60405180910390fd5b8060020154421115610bc6578142610bb99190611484565b8160020181905550610bdf565b818160020154610bd69190611484565b81600201819055505b7fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e983604051610c0e9190611147565b60405180910390a1505050565b600060026000838152602001908152602001600020905060006003811115610c4657610c4561119e565b5b8160020160009054906101000a900460ff166003811115610c6a57610c6961119e565b5b14610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca1906119aa565b60405180910390fd5b60008060008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4d90611a3c565b60405180910390fd5b60018260020160006101000a81548160ff02191690836003811115610d7e57610d7d61119e565b5b02179055507ffaecd3b4db089bf25a48306100dd5fb2152e3887c7815b2b221dbb7da2f8e8dc83604051610db29190611147565b60405180910390a1505050565b60015481565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16905085565b6000610e3f610ed7565b90506000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507f429f9327062651dbcecaca0d28b9929067489d32d2c1133ec207c965f1f0ab198160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684604051610ec9929190611746565b60405180910390a150919050565b60008060005b600154811015610f5b5760008082815260200190815260200160002060030160009054906101000a900460ff16610f4e57600080828152602001908152602001600020600201544211610f4e576000808281526020019081526020016000206001015482610f4b9190611484565b91505b8080600101915050610edd565b5060008111610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690611aa8565b60405180910390fd5b60008144610fad9190611af7565b9050600080600090505b6001548110156110455760008082815260200190815260200160002060030160009054906101000a900460ff16611038576000808281526020019081526020016000206002015442116110385760008082815260200190815260200160002060010154826110259190611484565b91508282111561103757809450611045565b5b8080600101915050610fb7565b5050505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061107c82611051565b9050919050565b61108c81611071565b811461109757600080fd5b50565b6000813590506110a981611083565b92915050565b6000819050919050565b6110c2816110af565b81146110cd57600080fd5b50565b6000813590506110df816110b9565b92915050565b6000806000606084860312156110fe576110fd61104c565b5b600061110c8682870161109a565b935050602061111d868287016110d0565b925050604061112e868287016110d0565b9150509250925092565b611141816110af565b82525050565b600060208201905061115c6000830184611138565b92915050565b6000602082840312156111785761117761104c565b5b6000611186848285016110d0565b91505092915050565b61119881611071565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106111de576111dd61119e565b5b50565b60008190506111ef826111cd565b919050565b60006111ff826111e1565b9050919050565b61120f816111f4565b82525050565b60008115159050919050565b61122a81611215565b82525050565b600060c082019050611245600083018961118f565b6112526020830188611138565b61125f6040830187611206565b61126c6060830186611138565b6112796080830185611221565b61128660a0830184611138565b979650505050505050565b61129a81611215565b81146112a557600080fd5b50565b6000813590506112b781611291565b92915050565b600080604083850312156112d4576112d361104c565b5b60006112e2858286016110d0565b92505060206112f3858286016112a8565b9150509250929050565b600080604083850312156113145761131361104c565b5b6000611322858286016110d0565b9250506020611333858286016110d0565b9150509250929050565b600060a082019050611352600083018861118f565b61135f6020830187611138565b61136c6040830186611138565b6113796060830185611221565b6113866080830184611221565b9695505050505050565b600082825260208201905092915050565b7f4e6f207374616b652070726f7669646564000000000000000000000000000000600082015250565b60006113d7601183611390565b91506113e2826113a1565b602082019050919050565b60006020820190508181036000830152611406816113ca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611447826110af565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114795761147861140d565b5b600182019050919050565b600061148f826110af565b915061149a836110af565b92508282019050808211156114b2576114b161140d565b5b92915050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b60006114ee601083611390565b91506114f9826114b8565b602082019050919050565b6000602082019050818103600083015261151d816114e1565b9050919050565b7f576f726b65722063616e206f6e6c79207265636c61696d207468656972206f7760008201527f6e20617661696c6162696c697479207374616b65000000000000000000000000602082015250565b6000611580603483611390565b915061158b82611524565b604082019050919050565b600060208201905081810360008301526115af81611573565b9050919050565b7f5374616b65206475726174696f6e20686173206e6f742079657420656c61707360008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000611612602283611390565b915061161d826115b6565b604082019050919050565b6000602082019050818103600083015261164181611605565b9050919050565b7f5374616b652068617320616c7265616479206265656e207265636c61696d6564600082015250565b600061167e602083611390565b915061168982611648565b602082019050919050565b600060208201905081810360008301526116ad81611671565b9050919050565b7f5374616b652068617320616c7265616479206265656e2061737369676e65642060008201527f776f726b00000000000000000000000000000000000000000000000000000000602082015250565b6000611710602483611390565b915061171b826116b4565b604082019050919050565b6000602082019050818103600083015261173f81611703565b9050919050565b600060408201905061175b600083018561118f565b6117686020830184611138565b9392505050565b60008151905061177e81611291565b92915050565b60006020828403121561179a5761179961104c565b5b60006117a88482850161176f565b91505092915050565b7f537461747573206d7573742062652045766964656e63655375626d6974746564600082015250565b60006117e7602083611390565b91506117f2826117b1565b602082019050919050565b60006020820190508181036000830152611816816117da565b9050919050565b6000602082019050611832600083018461118f565b92915050565b600081519050611847816110b9565b92915050565b6000602082840312156118635761186261104c565b5b600061187184828501611838565b91505092915050565b600060408201905061188f6000830185611138565b61189c6020830184611221565b9392505050565b60006040820190506118b86000830185611138565b6118c56020830184611138565b9392505050565b7f576f726b65722063616e206f6e6c7920657874656e64207468656972206f776e60008201527f20617661696c6162696c697479207374616b6500000000000000000000000000602082015250565b6000611928603383611390565b9150611933826118cc565b604082019050919050565b600060208201905081810360008301526119578161191b565b9050919050565b7f537461747573206d757374206265205265717565737465640000000000000000600082015250565b6000611994601883611390565b915061199f8261195e565b602082019050919050565b600060208201905081810360008301526119c381611987565b9050919050565b7f576f726b65722063616e206f6e6c79207375626d69742065766964656e63652060008201527f666f7220776f726b2074686579206172652061737369676e6564000000000000602082015250565b6000611a26603a83611390565b9150611a31826119ca565b604082019050919050565b60006020820190508181036000830152611a5581611a19565b9050919050565b7f4e6f20617661696c61626c6520776f726b6572207374616b6573000000000000600082015250565b6000611a92601a83611390565b9150611a9d82611a5c565b602082019050919050565b60006020820190508181036000830152611ac181611a85565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611b02826110af565b9150611b0d836110af565b925082611b1d57611b1c611ac8565b5b82820690509291505056fea2646970667358221220e6e32e9b883fcac7d6bc76f38dfffd5fb185308227b61cc5a76195346f2fa86e64736f6c63430008180033", - "deployedBytecode": "0x60806040526004361061009c5760003560e01c8063854b6a4f11610064578063854b6a4f1461016a578063a035b1fe14610193578063b5b20c00146101be578063c4a32591146101e7578063c4a9e11614610210578063d5a44f861461023b5761009c565b8063216ed6ad146100a15780634b8b194c146100ca5780635badbe4c146100d45780638150d507146100ff57806381d12c5814610128575b600080fd5b3480156100ad57600080fd5b506100c860048036038101906100c391906110e5565b61027c565b005b6100d261038e565b005b3480156100e057600080fd5b506100e9610484565b6040516100f69190611147565b60405180910390f35b34801561010b57600080fd5b5061012660048036038101906101219190611162565b61048a565b005b34801561013457600080fd5b5061014f600480360381019061014a9190611162565b610717565b60405161016196959493929190611230565b60405180910390f35b34801561017657600080fd5b50610191600480360381019061018c91906112bd565b61078d565b005b34801561019f57600080fd5b506101a8610a31565b6040516101b59190611147565b60405180910390f35b3480156101ca57600080fd5b506101e560048036038101906101e091906112fd565b610a55565b005b3480156101f357600080fd5b5061020e60048036038101906102099190611162565b610c1b565b005b34801561021c57600080fd5b50610225610dbf565b6040516102329190611147565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d9190611162565b610dc5565b60405161027395949392919061133d565b60405180910390f35b600082116102bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b6906113ed565b60405180910390fd5b6000600160008154809291906102d49061143c565b91905055905060008060008381526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083816001018190555082426103489190611484565b81600201819055507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e98260405161037f9190611147565b60405180910390a15050505050565b7f00000000000000000000000000000000000000000000000000000000000000003410156103f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e890611504565b60405180910390fd5b6000600360008154809291906104069061143c565b9190505590506000600260008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034816001018190555061047882610e35565b81600301819055505050565b60035481565b600080600083815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052990611596565b60405180910390fd5b80600201544211610578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056f90611628565b60405180910390fd5b8060030160019054906101000a900460ff16156105ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c190611694565b60405180910390fd5b8060030160009054906101000a900460ff161561061c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061390611726565b60405180910390fd5b60018160030160016101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3383600101546040518363ffffffff1660e01b8152600401610698929190611746565b6020604051808303816000875af11580156106b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106db9190611784565b507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e98260405161070b9190611147565b60405180910390a15050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16908060030154908060040160009054906101000a900460ff16908060050154905086565b6000600260008481526020019081526020016000209050600160038111156107b8576107b761119e565b5b8160020160009054906101000a900460ff1660038111156107dc576107db61119e565b5b1461081c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610813906117fd565b60405180910390fd5b600080600083600301548152602001908152602001600020905060028260020160006101000a81548160ff0219169083600381111561085e5761085d61119e565b5b0217905550828260040160006101000a81548160ff02191690831515021790555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ff754428360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016108fe919061181d565b6020604051808303816000875af115801561091d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610941919061184d565b90507f470d2978e081461f6d144c091dfd83ec06e6011da0b03bd1c0121b7fb71370dc858560405161097492919061187a565b60405180910390a17f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639fcb294b846001015483620151806040518463ffffffff1660e01b81526004016109df9291906118a3565b60206040518083038185885af11580156109fd573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a22919061184d565b83600501819055505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600084815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af49061193e565b60405180910390fd5b8060030160019054906101000a900460ff1615610b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4690611694565b60405180910390fd5b8060030160009054906101000a900460ff1615610ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9890611726565b60405180910390fd5b8060020154421115610bc6578142610bb99190611484565b8160020181905550610bdf565b818160020154610bd69190611484565b81600201819055505b7fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e983604051610c0e9190611147565b60405180910390a1505050565b600060026000838152602001908152602001600020905060006003811115610c4657610c4561119e565b5b8160020160009054906101000a900460ff166003811115610c6a57610c6961119e565b5b14610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca1906119aa565b60405180910390fd5b60008060008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4d90611a3c565b60405180910390fd5b60018260020160006101000a81548160ff02191690836003811115610d7e57610d7d61119e565b5b02179055507ffaecd3b4db089bf25a48306100dd5fb2152e3887c7815b2b221dbb7da2f8e8dc83604051610db29190611147565b60405180910390a1505050565b60015481565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16905085565b6000610e3f610ed7565b90506000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507f429f9327062651dbcecaca0d28b9929067489d32d2c1133ec207c965f1f0ab198160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684604051610ec9929190611746565b60405180910390a150919050565b60008060005b600154811015610f5b5760008082815260200190815260200160002060030160009054906101000a900460ff16610f4e57600080828152602001908152602001600020600201544211610f4e576000808281526020019081526020016000206001015482610f4b9190611484565b91505b8080600101915050610edd565b5060008111610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690611aa8565b60405180910390fd5b60008144610fad9190611af7565b9050600080600090505b6001548110156110455760008082815260200190815260200160002060030160009054906101000a900460ff16611038576000808281526020019081526020016000206002015442116110385760008082815260200190815260200160002060010154826110259190611484565b91508282111561103757809450611045565b5b8080600101915050610fb7565b5050505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061107c82611051565b9050919050565b61108c81611071565b811461109757600080fd5b50565b6000813590506110a981611083565b92915050565b6000819050919050565b6110c2816110af565b81146110cd57600080fd5b50565b6000813590506110df816110b9565b92915050565b6000806000606084860312156110fe576110fd61104c565b5b600061110c8682870161109a565b935050602061111d868287016110d0565b925050604061112e868287016110d0565b9150509250925092565b611141816110af565b82525050565b600060208201905061115c6000830184611138565b92915050565b6000602082840312156111785761117761104c565b5b6000611186848285016110d0565b91505092915050565b61119881611071565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106111de576111dd61119e565b5b50565b60008190506111ef826111cd565b919050565b60006111ff826111e1565b9050919050565b61120f816111f4565b82525050565b60008115159050919050565b61122a81611215565b82525050565b600060c082019050611245600083018961118f565b6112526020830188611138565b61125f6040830187611206565b61126c6060830186611138565b6112796080830185611221565b61128660a0830184611138565b979650505050505050565b61129a81611215565b81146112a557600080fd5b50565b6000813590506112b781611291565b92915050565b600080604083850312156112d4576112d361104c565b5b60006112e2858286016110d0565b92505060206112f3858286016112a8565b9150509250929050565b600080604083850312156113145761131361104c565b5b6000611322858286016110d0565b9250506020611333858286016110d0565b9150509250929050565b600060a082019050611352600083018861118f565b61135f6020830187611138565b61136c6040830186611138565b6113796060830185611221565b6113866080830184611221565b9695505050505050565b600082825260208201905092915050565b7f4e6f207374616b652070726f7669646564000000000000000000000000000000600082015250565b60006113d7601183611390565b91506113e2826113a1565b602082019050919050565b60006020820190508181036000830152611406816113ca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611447826110af565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114795761147861140d565b5b600182019050919050565b600061148f826110af565b915061149a836110af565b92508282019050808211156114b2576114b161140d565b5b92915050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b60006114ee601083611390565b91506114f9826114b8565b602082019050919050565b6000602082019050818103600083015261151d816114e1565b9050919050565b7f576f726b65722063616e206f6e6c79207265636c61696d207468656972206f7760008201527f6e20617661696c6162696c697479207374616b65000000000000000000000000602082015250565b6000611580603483611390565b915061158b82611524565b604082019050919050565b600060208201905081810360008301526115af81611573565b9050919050565b7f5374616b65206475726174696f6e20686173206e6f742079657420656c61707360008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000611612602283611390565b915061161d826115b6565b604082019050919050565b6000602082019050818103600083015261164181611605565b9050919050565b7f5374616b652068617320616c7265616479206265656e207265636c61696d6564600082015250565b600061167e602083611390565b915061168982611648565b602082019050919050565b600060208201905081810360008301526116ad81611671565b9050919050565b7f5374616b652068617320616c7265616479206265656e2061737369676e65642060008201527f776f726b00000000000000000000000000000000000000000000000000000000602082015250565b6000611710602483611390565b915061171b826116b4565b604082019050919050565b6000602082019050818103600083015261173f81611703565b9050919050565b600060408201905061175b600083018561118f565b6117686020830184611138565b9392505050565b60008151905061177e81611291565b92915050565b60006020828403121561179a5761179961104c565b5b60006117a88482850161176f565b91505092915050565b7f537461747573206d7573742062652045766964656e63655375626d6974746564600082015250565b60006117e7602083611390565b91506117f2826117b1565b602082019050919050565b60006020820190508181036000830152611816816117da565b9050919050565b6000602082019050611832600083018461118f565b92915050565b600081519050611847816110b9565b92915050565b6000602082840312156118635761186261104c565b5b600061187184828501611838565b91505092915050565b600060408201905061188f6000830185611138565b61189c6020830184611221565b9392505050565b60006040820190506118b86000830185611138565b6118c56020830184611138565b9392505050565b7f576f726b65722063616e206f6e6c7920657874656e64207468656972206f776e60008201527f20617661696c6162696c697479207374616b6500000000000000000000000000602082015250565b6000611928603383611390565b9150611933826118cc565b604082019050919050565b600060208201905081810360008301526119578161191b565b9050919050565b7f537461747573206d757374206265205265717565737465640000000000000000600082015250565b6000611994601883611390565b915061199f8261195e565b602082019050919050565b600060208201905081810360008301526119c381611987565b9050919050565b7f576f726b65722063616e206f6e6c79207375626d69742065766964656e63652060008201527f666f7220776f726b2074686579206172652061737369676e6564000000000000602082015250565b6000611a26603a83611390565b9150611a31826119ca565b604082019050919050565b60006020820190508181036000830152611a5581611a19565b9050919050565b7f4e6f20617661696c61626c6520776f726b6572207374616b6573000000000000600082015250565b6000611a92601a83611390565b9150611a9d82611a5c565b602082019050919050565b60006020820190508181036000830152611ac181611a85565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611b02826110af565b9150611b0d836110af565b925082611b1d57611b1c611ac8565b5b82820690509291505056fea2646970667358221220e6e32e9b883fcac7d6bc76f38dfffd5fb185308227b61cc5a76195346f2fa86e64736f6c63430008180033", + "bytecode": "0x60c06040523480156200001157600080fd5b5060405162001e3238038062001e32833981810160405281019062000037919062000138565b81818173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508060a08181525050505050506200017f565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000b18262000084565b9050919050565b6000620000c582620000a4565b9050919050565b620000d781620000b8565b8114620000e357600080fd5b50565b600081519050620000f781620000cc565b92915050565b6000819050919050565b6200011281620000fd565b81146200011e57600080fd5b50565b600081519050620001328162000107565b92915050565b600080604083850312156200015257620001516200007f565b5b60006200016285828601620000e6565b9250506020620001758582860162000121565b9150509250929050565b60805160a051611c71620001c16000396000818161038f0152610ac001526000818161063a0152818161087c015281816109790152610a240152611c716000f3fe60806040526004361061009c5760003560e01c8063854b6a4f11610064578063854b6a4f14610169578063a035b1fe14610192578063b5b20c00146101bd578063c4a32591146101e6578063c4a9e1161461020f578063d5a44f861461023a5761009c565b8063216ed6ad146100a15780634b8b194c146100ca5780635badbe4c146100d45780638150d507146100ff57806381d12c5814610128575b600080fd5b3480156100ad57600080fd5b506100c860048036038101906100c3919061114e565b61027b565b005b6100d261038d565b005b3480156100e057600080fd5b506100e9610483565b6040516100f691906111b0565b60405180910390f35b34801561010b57600080fd5b50610126600480360381019061012191906111cb565b610489565b005b34801561013457600080fd5b5061014f600480360381019061014a91906111cb565b610716565b604051610160959493929190611299565b60405180910390f35b34801561017557600080fd5b50610190600480360381019061018b9190611318565b610786565b005b34801561019e57600080fd5b506101a7610abe565b6040516101b491906111b0565b60405180910390f35b3480156101c957600080fd5b506101e460048036038101906101df9190611358565b610ae2565b005b3480156101f257600080fd5b5061020d600480360381019061020891906111cb565b610ca8565b005b34801561021b57600080fd5b50610224610e4c565b60405161023191906111b0565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c91906111cb565b610e52565b604051610272959493929190611398565b60405180910390f35b600082116102be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b590611448565b60405180910390fd5b6000600160008154809291906102d390611497565b91905055905060008060008381526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838160010181905550824261034791906114df565b81600201819055507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e98260405161037e91906111b0565b60405180910390a15050505050565b7f00000000000000000000000000000000000000000000000000000000000000003410156103f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e79061155f565b60405180910390fd5b60006003600081548092919061040590611497565b9190505590506000600260008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034816001018190555061047782610ec2565b81600301819055505050565b60035481565b600080600083815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610531576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610528906115f1565b60405180910390fd5b80600201544211610577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056e90611683565b60405180910390fd5b8060030160019054906101000a900460ff16156105c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c0906116ef565b60405180910390fd5b8060030160009054906101000a900460ff161561061b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061290611781565b60405180910390fd5b60018160030160016101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3383600101546040518363ffffffff1660e01b81526004016106979291906117a1565b6020604051808303816000875af11580156106b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106da91906117df565b507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e98260405161070a91906111b0565b60405180910390a15050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16908060030154908060040160009054906101000a900460ff16905085565b6000600260008481526020019081526020016000209050600160038111156107b1576107b0611207565b5b8160020160009054906101000a900460ff1660038111156107d5576107d4611207565b5b14610815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080c90611858565b60405180910390fd5b600080600083600301548152602001908152602001600020905060028260020160006101000a81548160ff0219169083600381111561085757610856611207565b5b0217905550828260040160006101000a81548160ff02191690831515021790555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ff754428360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016108f79190611878565b6020604051808303816000875af1158015610916573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093a91906118a8565b90507f470d2978e081461f6d144c091dfd83ec06e6011da0b03bd1c0121b7fb71370dc858560405161096d9291906118d5565b60405180910390a160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ee2e52308560010154846201518060006040518563ffffffff1660e01b81526004016109dd93929190611935565b60206040518083038185885af11580156109fb573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a2091906118a8565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663561b246382856001015460016040518463ffffffff1660e01b8152600401610a849392919061197f565b600060405180830381600087803b158015610a9e57600080fd5b505af1158015610ab2573d6000803e3d6000fd5b50505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600084815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8190611a28565b60405180910390fd5b8060030160019054906101000a900460ff1615610bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd3906116ef565b60405180910390fd5b8060030160009054906101000a900460ff1615610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2590611781565b60405180910390fd5b8060020154421115610c53578142610c4691906114df565b8160020181905550610c6c565b818160020154610c6391906114df565b81600201819055505b7fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e983604051610c9b91906111b0565b60405180910390a1505050565b600060026000838152602001908152602001600020905060006003811115610cd357610cd2611207565b5b8160020160009054906101000a900460ff166003811115610cf757610cf6611207565b5b14610d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2e90611a94565b60405180910390fd5b60008060008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dda90611b26565b60405180910390fd5b60018260020160006101000a81548160ff02191690836003811115610e0b57610e0a611207565b5b02179055507ffaecd3b4db089bf25a48306100dd5fb2152e3887c7815b2b221dbb7da2f8e8dc83604051610e3f91906111b0565b60405180910390a1505050565b60015481565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16905085565b6000610ecc610f40565b90506000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507fd9e7f38a71691fb1db2da17057c03d381a42a9925350883f10e8e5d0bca4a3b48383604051610f32929190611b46565b60405180910390a150919050565b60008060005b600154811015610fc45760008082815260200190815260200160002060030160009054906101000a900460ff16610fb757600080828152602001908152602001600020600201544211610fb7576000808281526020019081526020016000206001015482610fb491906114df565b91505b8080600101915050610f46565b5060008111611008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fff90611bbb565b60405180910390fd5b600081446110169190611c0a565b9050600080600090505b6001548110156110ae5760008082815260200190815260200160002060030160009054906101000a900460ff166110a1576000808281526020019081526020016000206002015442116110a157600080828152602001908152602001600020600101548261108e91906114df565b9150828211156110a0578094506110ae565b5b8080600101915050611020565b5050505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006110e5826110ba565b9050919050565b6110f5816110da565b811461110057600080fd5b50565b600081359050611112816110ec565b92915050565b6000819050919050565b61112b81611118565b811461113657600080fd5b50565b60008135905061114881611122565b92915050565b600080600060608486031215611167576111666110b5565b5b600061117586828701611103565b935050602061118686828701611139565b925050604061119786828701611139565b9150509250925092565b6111aa81611118565b82525050565b60006020820190506111c560008301846111a1565b92915050565b6000602082840312156111e1576111e06110b5565b5b60006111ef84828501611139565b91505092915050565b611201816110da565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061124757611246611207565b5b50565b600081905061125882611236565b919050565b60006112688261124a565b9050919050565b6112788161125d565b82525050565b60008115159050919050565b6112938161127e565b82525050565b600060a0820190506112ae60008301886111f8565b6112bb60208301876111a1565b6112c8604083018661126f565b6112d560608301856111a1565b6112e2608083018461128a565b9695505050505050565b6112f58161127e565b811461130057600080fd5b50565b600081359050611312816112ec565b92915050565b6000806040838503121561132f5761132e6110b5565b5b600061133d85828601611139565b925050602061134e85828601611303565b9150509250929050565b6000806040838503121561136f5761136e6110b5565b5b600061137d85828601611139565b925050602061138e85828601611139565b9150509250929050565b600060a0820190506113ad60008301886111f8565b6113ba60208301876111a1565b6113c760408301866111a1565b6113d4606083018561128a565b6113e1608083018461128a565b9695505050505050565b600082825260208201905092915050565b7f4e6f207374616b652070726f7669646564000000000000000000000000000000600082015250565b60006114326011836113eb565b915061143d826113fc565b602082019050919050565b6000602082019050818103600083015261146181611425565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006114a282611118565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114d4576114d3611468565b5b600182019050919050565b60006114ea82611118565b91506114f583611118565b925082820190508082111561150d5761150c611468565b5b92915050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b60006115496010836113eb565b915061155482611513565b602082019050919050565b600060208201905081810360008301526115788161153c565b9050919050565b7f576f726b65722063616e206f6e6c79207265636c61696d207468656972206f7760008201527f6e20617661696c6162696c697479207374616b65000000000000000000000000602082015250565b60006115db6034836113eb565b91506115e68261157f565b604082019050919050565b6000602082019050818103600083015261160a816115ce565b9050919050565b7f5374616b65206475726174696f6e20686173206e6f742079657420656c61707360008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b600061166d6022836113eb565b915061167882611611565b604082019050919050565b6000602082019050818103600083015261169c81611660565b9050919050565b7f5374616b652068617320616c7265616479206265656e207265636c61696d6564600082015250565b60006116d96020836113eb565b91506116e4826116a3565b602082019050919050565b60006020820190508181036000830152611708816116cc565b9050919050565b7f5374616b652068617320616c7265616479206265656e2061737369676e65642060008201527f776f726b00000000000000000000000000000000000000000000000000000000602082015250565b600061176b6024836113eb565b91506117768261170f565b604082019050919050565b6000602082019050818103600083015261179a8161175e565b9050919050565b60006040820190506117b660008301856111f8565b6117c360208301846111a1565b9392505050565b6000815190506117d9816112ec565b92915050565b6000602082840312156117f5576117f46110b5565b5b6000611803848285016117ca565b91505092915050565b7f537461747573206d7573742062652045766964656e63655375626d6974746564600082015250565b60006118426020836113eb565b915061184d8261180c565b602082019050919050565b6000602082019050818103600083015261187181611835565b9050919050565b600060208201905061188d60008301846111f8565b92915050565b6000815190506118a281611122565b92915050565b6000602082840312156118be576118bd6110b5565b5b60006118cc84828501611893565b91505092915050565b60006040820190506118ea60008301856111a1565b6118f7602083018461128a565b9392505050565b600082825260208201905092915050565b50565b600061191f6000836118fe565b915061192a8261190f565b600082019050919050565b600060808201905061194a60008301866111a1565b61195760208301856111a1565b611964604083018461128a565b818103606083015261197581611912565b9050949350505050565b600060608201905061199460008301866111a1565b6119a160208301856111a1565b6119ae604083018461128a565b949350505050565b7f576f726b65722063616e206f6e6c7920657874656e64207468656972206f776e60008201527f20617661696c6162696c697479207374616b6500000000000000000000000000602082015250565b6000611a126033836113eb565b9150611a1d826119b6565b604082019050919050565b60006020820190508181036000830152611a4181611a05565b9050919050565b7f537461747573206d757374206265205265717565737465640000000000000000600082015250565b6000611a7e6018836113eb565b9150611a8982611a48565b602082019050919050565b60006020820190508181036000830152611aad81611a71565b9050919050565b7f576f726b65722063616e206f6e6c79207375626d69742065766964656e63652060008201527f666f7220776f726b2074686579206172652061737369676e6564000000000000602082015250565b6000611b10603a836113eb565b9150611b1b82611ab4565b604082019050919050565b60006020820190508181036000830152611b3f81611b03565b9050919050565b6000604082019050611b5b60008301856111a1565b611b6860208301846111a1565b9392505050565b7f4e6f20617661696c61626c6520776f726b6572207374616b6573000000000000600082015250565b6000611ba5601a836113eb565b9150611bb082611b6f565b602082019050919050565b60006020820190508181036000830152611bd481611b98565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611c1582611118565b9150611c2083611118565b925082611c3057611c2f611bdb565b5b82820690509291505056fea26469706673582212204bb381e4f7b11ec259d1c2f84fb774d0bd5e43656e2d0c30f9a644e89eba4d9164736f6c63430008180033", + "deployedBytecode": "0x60806040526004361061009c5760003560e01c8063854b6a4f11610064578063854b6a4f14610169578063a035b1fe14610192578063b5b20c00146101bd578063c4a32591146101e6578063c4a9e1161461020f578063d5a44f861461023a5761009c565b8063216ed6ad146100a15780634b8b194c146100ca5780635badbe4c146100d45780638150d507146100ff57806381d12c5814610128575b600080fd5b3480156100ad57600080fd5b506100c860048036038101906100c3919061114e565b61027b565b005b6100d261038d565b005b3480156100e057600080fd5b506100e9610483565b6040516100f691906111b0565b60405180910390f35b34801561010b57600080fd5b50610126600480360381019061012191906111cb565b610489565b005b34801561013457600080fd5b5061014f600480360381019061014a91906111cb565b610716565b604051610160959493929190611299565b60405180910390f35b34801561017557600080fd5b50610190600480360381019061018b9190611318565b610786565b005b34801561019e57600080fd5b506101a7610abe565b6040516101b491906111b0565b60405180910390f35b3480156101c957600080fd5b506101e460048036038101906101df9190611358565b610ae2565b005b3480156101f257600080fd5b5061020d600480360381019061020891906111cb565b610ca8565b005b34801561021b57600080fd5b50610224610e4c565b60405161023191906111b0565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c91906111cb565b610e52565b604051610272959493929190611398565b60405180910390f35b600082116102be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102b590611448565b60405180910390fd5b6000600160008154809291906102d390611497565b91905055905060008060008381526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838160010181905550824261034791906114df565b81600201819055507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e98260405161037e91906111b0565b60405180910390a15050505050565b7f00000000000000000000000000000000000000000000000000000000000000003410156103f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e79061155f565b60405180910390fd5b60006003600081548092919061040590611497565b9190505590506000600260008381526020019081526020016000209050338160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034816001018190555061047782610ec2565b81600301819055505050565b60035481565b600080600083815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610531576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610528906115f1565b60405180910390fd5b80600201544211610577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056e90611683565b60405180910390fd5b8060030160019054906101000a900460ff16156105c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c0906116ef565b60405180910390fd5b8060030160009054906101000a900460ff161561061b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061290611781565b60405180910390fd5b60018160030160016101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3383600101546040518363ffffffff1660e01b81526004016106979291906117a1565b6020604051808303816000875af11580156106b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106da91906117df565b507fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e98260405161070a91906111b0565b60405180910390a15050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16908060030154908060040160009054906101000a900460ff16905085565b6000600260008481526020019081526020016000209050600160038111156107b1576107b0611207565b5b8160020160009054906101000a900460ff1660038111156107d5576107d4611207565b5b14610815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080c90611858565b60405180910390fd5b600080600083600301548152602001908152602001600020905060028260020160006101000a81548160ff0219169083600381111561085757610856611207565b5b0217905550828260040160006101000a81548160ff02191690831515021790555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ff754428360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016108f79190611878565b6020604051808303816000875af1158015610916573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093a91906118a8565b90507f470d2978e081461f6d144c091dfd83ec06e6011da0b03bd1c0121b7fb71370dc858560405161096d9291906118d5565b60405180910390a160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ee2e52308560010154846201518060006040518563ffffffff1660e01b81526004016109dd93929190611935565b60206040518083038185885af11580156109fb573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a2091906118a8565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663561b246382856001015460016040518463ffffffff1660e01b8152600401610a849392919061197f565b600060405180830381600087803b158015610a9e57600080fd5b505af1158015610ab2573d6000803e3d6000fd5b50505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600084815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8190611a28565b60405180910390fd5b8060030160019054906101000a900460ff1615610bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd3906116ef565b60405180910390fd5b8060030160009054906101000a900460ff1615610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2590611781565b60405180910390fd5b8060020154421115610c53578142610c4691906114df565b8160020181905550610c6c565b818160020154610c6391906114df565b81600201819055505b7fa85b1153cd317f9d39e14d8dbfb592ffb46123e9fc61b21b3f70d7d90a81a7e983604051610c9b91906111b0565b60405180910390a1505050565b600060026000838152602001908152602001600020905060006003811115610cd357610cd2611207565b5b8160020160009054906101000a900460ff166003811115610cf757610cf6611207565b5b14610d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2e90611a94565b60405180910390fd5b60008060008360030154815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dda90611b26565b60405180910390fd5b60018260020160006101000a81548160ff02191690836003811115610e0b57610e0a611207565b5b02179055507ffaecd3b4db089bf25a48306100dd5fb2152e3887c7815b2b221dbb7da2f8e8dc83604051610e3f91906111b0565b60405180910390a1505050565b60015481565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16905085565b6000610ecc610f40565b90506000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055507fd9e7f38a71691fb1db2da17057c03d381a42a9925350883f10e8e5d0bca4a3b48383604051610f32929190611b46565b60405180910390a150919050565b60008060005b600154811015610fc45760008082815260200190815260200160002060030160009054906101000a900460ff16610fb757600080828152602001908152602001600020600201544211610fb7576000808281526020019081526020016000206001015482610fb491906114df565b91505b8080600101915050610f46565b5060008111611008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fff90611bbb565b60405180910390fd5b600081446110169190611c0a565b9050600080600090505b6001548110156110ae5760008082815260200190815260200160002060030160009054906101000a900460ff166110a1576000808281526020019081526020016000206002015442116110a157600080828152602001908152602001600020600101548261108e91906114df565b9150828211156110a0578094506110ae565b5b8080600101915050611020565b5050505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006110e5826110ba565b9050919050565b6110f5816110da565b811461110057600080fd5b50565b600081359050611112816110ec565b92915050565b6000819050919050565b61112b81611118565b811461113657600080fd5b50565b60008135905061114881611122565b92915050565b600080600060608486031215611167576111666110b5565b5b600061117586828701611103565b935050602061118686828701611139565b925050604061119786828701611139565b9150509250925092565b6111aa81611118565b82525050565b60006020820190506111c560008301846111a1565b92915050565b6000602082840312156111e1576111e06110b5565b5b60006111ef84828501611139565b91505092915050565b611201816110da565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061124757611246611207565b5b50565b600081905061125882611236565b919050565b60006112688261124a565b9050919050565b6112788161125d565b82525050565b60008115159050919050565b6112938161127e565b82525050565b600060a0820190506112ae60008301886111f8565b6112bb60208301876111a1565b6112c8604083018661126f565b6112d560608301856111a1565b6112e2608083018461128a565b9695505050505050565b6112f58161127e565b811461130057600080fd5b50565b600081359050611312816112ec565b92915050565b6000806040838503121561132f5761132e6110b5565b5b600061133d85828601611139565b925050602061134e85828601611303565b9150509250929050565b6000806040838503121561136f5761136e6110b5565b5b600061137d85828601611139565b925050602061138e85828601611139565b9150509250929050565b600060a0820190506113ad60008301886111f8565b6113ba60208301876111a1565b6113c760408301866111a1565b6113d4606083018561128a565b6113e1608083018461128a565b9695505050505050565b600082825260208201905092915050565b7f4e6f207374616b652070726f7669646564000000000000000000000000000000600082015250565b60006114326011836113eb565b915061143d826113fc565b602082019050919050565b6000602082019050818103600083015261146181611425565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006114a282611118565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114d4576114d3611468565b5b600182019050919050565b60006114ea82611118565b91506114f583611118565b925082820190508082111561150d5761150c611468565b5b92915050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b60006115496010836113eb565b915061155482611513565b602082019050919050565b600060208201905081810360008301526115788161153c565b9050919050565b7f576f726b65722063616e206f6e6c79207265636c61696d207468656972206f7760008201527f6e20617661696c6162696c697479207374616b65000000000000000000000000602082015250565b60006115db6034836113eb565b91506115e68261157f565b604082019050919050565b6000602082019050818103600083015261160a816115ce565b9050919050565b7f5374616b65206475726174696f6e20686173206e6f742079657420656c61707360008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b600061166d6022836113eb565b915061167882611611565b604082019050919050565b6000602082019050818103600083015261169c81611660565b9050919050565b7f5374616b652068617320616c7265616479206265656e207265636c61696d6564600082015250565b60006116d96020836113eb565b91506116e4826116a3565b602082019050919050565b60006020820190508181036000830152611708816116cc565b9050919050565b7f5374616b652068617320616c7265616479206265656e2061737369676e65642060008201527f776f726b00000000000000000000000000000000000000000000000000000000602082015250565b600061176b6024836113eb565b91506117768261170f565b604082019050919050565b6000602082019050818103600083015261179a8161175e565b9050919050565b60006040820190506117b660008301856111f8565b6117c360208301846111a1565b9392505050565b6000815190506117d9816112ec565b92915050565b6000602082840312156117f5576117f46110b5565b5b6000611803848285016117ca565b91505092915050565b7f537461747573206d7573742062652045766964656e63655375626d6974746564600082015250565b60006118426020836113eb565b915061184d8261180c565b602082019050919050565b6000602082019050818103600083015261187181611835565b9050919050565b600060208201905061188d60008301846111f8565b92915050565b6000815190506118a281611122565b92915050565b6000602082840312156118be576118bd6110b5565b5b60006118cc84828501611893565b91505092915050565b60006040820190506118ea60008301856111a1565b6118f7602083018461128a565b9392505050565b600082825260208201905092915050565b50565b600061191f6000836118fe565b915061192a8261190f565b600082019050919050565b600060808201905061194a60008301866111a1565b61195760208301856111a1565b611964604083018461128a565b818103606083015261197581611912565b9050949350505050565b600060608201905061199460008301866111a1565b6119a160208301856111a1565b6119ae604083018461128a565b949350505050565b7f576f726b65722063616e206f6e6c7920657874656e64207468656972206f776e60008201527f20617661696c6162696c697479207374616b6500000000000000000000000000602082015250565b6000611a126033836113eb565b9150611a1d826119b6565b604082019050919050565b60006020820190508181036000830152611a4181611a05565b9050919050565b7f537461747573206d757374206265205265717565737465640000000000000000600082015250565b6000611a7e6018836113eb565b9150611a8982611a48565b602082019050919050565b60006020820190508181036000830152611aad81611a71565b9050919050565b7f576f726b65722063616e206f6e6c79207375626d69742065766964656e63652060008201527f666f7220776f726b2074686579206172652061737369676e6564000000000000602082015250565b6000611b10603a836113eb565b9150611b1b82611ab4565b604082019050919050565b60006020820190508181036000830152611b3f81611b03565b9050919050565b6000604082019050611b5b60008301856111a1565b611b6860208301846111a1565b9392505050565b7f4e6f20617661696c61626c6520776f726b6572207374616b6573000000000000600082015250565b6000611ba5601a836113eb565b9150611bb082611b6f565b602082019050919050565b60006020820190508181036000830152611bd481611b98565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611c1582611118565b9150611c2083611118565b925082611c3057611c2f611bdb565b5b82820690509291505056fea26469706673582212204bb381e4f7b11ec259d1c2f84fb774d0bd5e43656e2d0c30f9a644e89eba4d9164736f6c63430008180033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/client/src/contract-addresses.json b/client/src/contract-addresses.json index 70caddd..a8bf23b 100644 --- a/client/src/contract-addresses.json +++ b/client/src/contract-addresses.json @@ -1,10 +1,12 @@ { "localhost": { - "DAO": "0x74DD88A13804003bDD1EBB41ebEE47EA145B8E46", - "Work1": "0x0bB2b52F9E4068E99038E0A9B86D337461926F17" + "DAO": "0x4CC737e8Ec8873abCBC98c8c4a401990d6Fc4F38", + "Work1": "0xa0A1c1e84F50f6786A6927b448903a37776D2e74", + "Onboarding": "0xA6bE53f1F25816c65CF3bc36d6F8793Eed14fd09" }, "sepolia": { - "DAO": "0xA4Cb4d99be0Fef3e59dCaE909D6E8ef46EF07257", - "Work1": "0xdB3b37B555c980617140C8d8687a19B8381F374d" + "DAO": "0x8611676563EBcd69dC52E5829bF2914A957398C3", + "Work1": "0xCd5881DB1aa6b86283a9c5660FaB65C989cf2721", + "Onboarding": "0x215078c5cf21ffB79Ee14Cf09156B94a11b7340f" } } \ No newline at end of file diff --git a/client/src/contract-config.js b/client/src/contract-config.js index 3bd8299..7a46347 100644 --- a/client/src/contract-config.js +++ b/client/src/contract-config.js @@ -16,3 +16,12 @@ export const getContractByChainId = (chainId, contractName) => { if (!network) throw new Error(`Chain ID ${chainId} not recognized`); return getContractByNetworkName(network, contractName); }; + +export const getContractNameByAddress = (chainId, address) => { + const network = Object.entries(networks).find(([, id]) => id === chainId)[0]; + if (!network) throw new Error(`Chain ID ${chainId} not recognized`); + const entries = Object.entries(contractAddresses[network]); + const entry = entries.find(([, addr]) => addr.toLowerCase() === address.toLowerCase()); + if (entry) return entry[0]; + return undefined; +}; diff --git a/ethereum/contract-addresses.json b/ethereum/contract-addresses.json index 70caddd..a8bf23b 100644 --- a/ethereum/contract-addresses.json +++ b/ethereum/contract-addresses.json @@ -1,10 +1,12 @@ { "localhost": { - "DAO": "0x74DD88A13804003bDD1EBB41ebEE47EA145B8E46", - "Work1": "0x0bB2b52F9E4068E99038E0A9B86D337461926F17" + "DAO": "0x4CC737e8Ec8873abCBC98c8c4a401990d6Fc4F38", + "Work1": "0xa0A1c1e84F50f6786A6927b448903a37776D2e74", + "Onboarding": "0xA6bE53f1F25816c65CF3bc36d6F8793Eed14fd09" }, "sepolia": { - "DAO": "0xA4Cb4d99be0Fef3e59dCaE909D6E8ef46EF07257", - "Work1": "0xdB3b37B555c980617140C8d8687a19B8381F374d" + "DAO": "0x8611676563EBcd69dC52E5829bF2914A957398C3", + "Work1": "0xCd5881DB1aa6b86283a9c5660FaB65C989cf2721", + "Onboarding": "0x215078c5cf21ffB79Ee14Cf09156B94a11b7340f" } } \ No newline at end of file diff --git a/ethereum/contracts/Onboarding.sol b/ethereum/contracts/Onboarding.sol index a3ec294..c7b6a3f 100644 --- a/ethereum/contracts/Onboarding.sol +++ b/ethereum/contracts/Onboarding.sol @@ -25,12 +25,10 @@ contract Onboarding is WorkContract, IOnValidate { uint postIndex = dao.addPost(stake.worker); emit WorkApprovalSubmitted(requestIndex, approval); // Initiate validation pool - dao.initiateValidationPool{value: request.fee - request.fee / 10}( - postIndex, - POOL_DURATION, - true, - abi.encode(requestIndex) - ); + uint poolIndex = dao.initiateValidationPool{ + value: request.fee - request.fee / 10 + }(postIndex, POOL_DURATION, true, abi.encode(requestIndex)); + dao.stake(poolIndex, stake.amount, true); } /// Callback to be executed when review pool completes @@ -39,9 +37,13 @@ contract Onboarding is WorkContract, IOnValidate { msg.sender == address(dao), "onValidate may only be called by the DAO contract" ); - if (!votePasses) return; uint requestIndex = abi.decode(callbackData, (uint)); WorkRequest storage request = requests[requestIndex]; + if (!votePasses) { + // refund the customer the remaining amount + payable(request.customer).transfer(request.fee / 10); + return; + } uint postIndex = dao.addPost(request.customer); dao.initiateValidationPool{value: request.fee / 10}( postIndex, diff --git a/ethereum/contracts/WorkContract.sol b/ethereum/contracts/WorkContract.sol index a9da0a3..06d57a2 100644 --- a/ethereum/contracts/WorkContract.sol +++ b/ethereum/contracts/WorkContract.sol @@ -39,7 +39,7 @@ abstract contract WorkContract is IAcceptAvailability { uint constant POOL_DURATION = 1 days; event AvailabilityStaked(uint stakeIndex); - event WorkAssigned(address worker, uint requestIndex); + event WorkAssigned(uint requestIndex, uint stakeIndex); event WorkEvidenceSubmitted(uint requestIndex); event WorkApprovalSubmitted(uint requestIndex, bool approval); @@ -123,7 +123,7 @@ abstract contract WorkContract is IAcceptAvailability { stakeIndex = randomWeightedSelection(); AvailabilityStake storage stake = stakes[stakeIndex]; stake.assigned = true; - emit WorkAssigned(stake.worker, requestIndex); + emit WorkAssigned(requestIndex, stakeIndex); } /// Accept work request with fee @@ -169,11 +169,12 @@ abstract contract WorkContract is IAcceptAvailability { uint postIndex = dao.addPost(stake.worker); emit WorkApprovalSubmitted(requestIndex, approval); // Initiate validation pool - dao.initiateValidationPool{value: request.fee}( + uint poolIndex = dao.initiateValidationPool{value: request.fee}( postIndex, POOL_DURATION, - true, - abi.encode(requestIndex) + false, + "" ); + dao.stake(poolIndex, stake.amount, true); } } diff --git a/ethereum/scripts/automatic-staking.js b/ethereum/scripts/automatic-staking.js index 3b996bb..0130ada 100644 --- a/ethereum/scripts/automatic-staking.js +++ b/ethereum/scripts/automatic-staking.js @@ -46,13 +46,20 @@ const poolIsActive = (pool) => { return true; }; -const poolIsValid = (pool) => { - const Work1Address = getContractByNetworkName(network, 'Work1'); - return pool.sender === Work1Address; +const poolIsValid = (pool) => [ + getContractByNetworkName(network, 'Work1'), + getContractByNetworkName(network, 'Onboarding'), +].includes(pool.sender); + +const getPoolStatus = (pool) => { + if (poolIsActive(pool)) return 'Active'; + if (!pool.resolved) return 'Ready to Evaluate'; + if (pool.outcome) return 'Accepted'; + return 'Rejected'; }; -const stake = async (pool, amount) => { - console.log(`staking ${amount} in favor of pool ${pool.id.toString()}`); +const stake = async (pool, amount, inFavor) => { + console.log(`staking ${amount} ${inFavor ? 'in favor of' : 'against'} pool ${pool.id.toString()}`); await dao.stake(pool.id, amount, true); await fetchReputation(); }; @@ -60,7 +67,7 @@ const stake = async (pool, amount) => { const stakeEach = async (pools, amountPerPool) => { const promises = []; pools.forEach((pool) => { - promises.push(stake(pool, amountPerPool)); + promises.push(stake(pool, amountPerPool, poolIsValid(pool))); }); await Promise.all(promises); }; @@ -69,19 +76,14 @@ async function main() { await initialize(); validationPools.forEach((pool) => { - let status; - if (poolIsActive(pool)) status = 'Active'; - else if (!pool.resolved) status = 'Ready to Evaluate'; - else if (pool.outcome) status = 'Accepted'; - else status = 'Rejected'; - console.log(`pool ${pool.id.toString()}, status: ${status}`); + console.log(`pool ${pool.id.toString()}, status: ${getPoolStatus(pool)}`); }); - // Stake half of available reputation on any active, valid pools - const activeValidPools = validationPools.filter(poolIsActive).filter(poolIsValid); - if (activeValidPools.length && reputation > 0) { - const amountPerPool = reputation / BigInt(2) / BigInt(activeValidPools.length); - await stakeEach(activeValidPools, amountPerPool); + // Stake half of available reputation on any active pools + const activePools = validationPools.filter(poolIsActive); + if (activePools.length && reputation > 0) { + const amountPerPool = reputation / BigInt(2) / BigInt(activePools.length); + await stakeEach(activePools, amountPerPool); } // Listen for new validation pools @@ -89,13 +91,14 @@ async function main() { console.log(`pool ${poolIndex} started`); const pool = await fetchValidationPool(poolIndex); await fetchReputation(); - + if (!reputation) return; + const amountToStake = reputation / BigInt(2); if (poolIsValid(pool)) { // Stake half of available reputation on this validation pool - const amount = reputation / BigInt(2); - await stake(pool, amount, true); + await stake(pool, amountToStake, true); } else { console.log(`pool sender ${pool.sender} is not recognized`); + await stake(pool, amountToStake, false); } }); diff --git a/ethereum/scripts/deploy.js b/ethereum/scripts/deploy.js index 17ea49e..0a64435 100644 --- a/ethereum/scripts/deploy.js +++ b/ethereum/scripts/deploy.js @@ -11,13 +11,18 @@ async function main() { console.log(`DAO deployed to ${dao.target}`); contractAddresses[network].DAO = dao.target; + fs.copyFileSync('./artifacts/contracts/DAO.sol/DAO.json', '../client/src/assets/DAO.json'); - const WORK1_PRICE = ethers.parseEther('0.001'); - const work1 = await ethers.deployContract('Work1', [dao.target, WORK1_PRICE]); - await work1.waitForDeployment(); + const deployWorkContract = async (name, price) => { + const contract = await ethers.deployContract('Work1', [dao.target, price]); + await contract.waitForDeployment(); + console.log(`${name} deployed to ${contract.target}`); + contractAddresses[network][name] = contract.target; + fs.copyFileSync(`./artifacts/contracts/${name}.sol/${name}.json`, `../client/src/assets/${name}.json`); + }; - console.log(`Work1 deployed to ${work1.target}`); - contractAddresses[network].Work1 = work1.target; + await deployWorkContract('Work1', ethers.parseEther('0.001')); + await deployWorkContract('Onboarding', ethers.parseEther('0.001')); fs.writeFileSync('../client/src/contract-addresses.json', JSON.stringify(contractAddresses, null, 2)); console.log('Wrote file', fs.realpathSync('../client/src/contract-addresses.json')); @@ -25,8 +30,6 @@ async function main() { fs.writeFileSync('./contract-addresses.json', JSON.stringify(contractAddresses, null, 2)); console.log('Wrote file', fs.realpathSync('./contract-addresses.json')); - fs.copyFileSync('./artifacts/contracts/DAO.sol/DAO.json', '../client/src/assets/DAO.json'); - fs.copyFileSync('./artifacts/contracts/Work1.sol/Work1.json', '../client/src/assets/Work1.json'); console.log('Copied ABIs to', fs.realpathSync('../client/src/assets')); } diff --git a/ethereum/test/DAO.js b/ethereum/test/DAO.js index 7b43a9b..e0a6345 100644 --- a/ethereum/test/DAO.js +++ b/ethereum/test/DAO.js @@ -136,7 +136,13 @@ describe('DAO', () => { }); it('should be able to evaluate outcome of second validation pool', async () => { - const init = () => dao.initiateValidationPool(0, POOL_DURATION, { value: POOL_FEE }); + const init = () => dao.initiateValidationPool( + 0, + POOL_DURATION, + false, + callbackData, + { value: POOL_FEE }, + ); await expect(init()).to.emit(dao, 'ValidationPoolInitiated').withArgs(1); expect(await dao.validationPoolCount()).to.equal(2); time.increase(POOL_DURATION + 1); @@ -153,7 +159,13 @@ describe('DAO', () => { await dao.evaluateOutcome(0); expect(await dao.balanceOf(account1)).to.equal(100); expect(await dao.balanceOf(dao.target)).to.equal(0); - await dao.initiateValidationPool(0, POOL_DURATION, { value: POOL_FEE }); + await dao.initiateValidationPool( + 0, + POOL_DURATION, + false, + callbackData, + { value: POOL_FEE }, + ); expect(await dao.balanceOf(dao.target)).to.equal(100); }); diff --git a/ethereum/test/Work1.js b/ethereum/test/Work1.js index c0e6c92..961b763 100644 --- a/ethereum/test/Work1.js +++ b/ethereum/test/Work1.js @@ -129,11 +129,11 @@ describe('Work1', () => { describe('Request and assign work', () => { it('should be able to request work and assign to a worker', async () => { const { - dao, work1, account1, account2, + dao, work1, account2, } = await loadFixture(deploy); await dao.stakeAvailability(work1.target, 50, STAKE_DURATION); const requestWork = () => work1.connect(account2).requestWork({ value: WORK1_PRICE }); - await expect(requestWork()).to.emit(work1, 'WorkAssigned').withArgs(account1, 0); + await expect(requestWork()).to.emit(work1, 'WorkAssigned').withArgs(0, 0); expect(await work1.requestCount()).to.equal(1); const request = await work1.requests(0); expect(request.customer).to.equal(account2); @@ -141,11 +141,11 @@ describe('Work1', () => { it('should not be able to reclaim stake after work is assigned', async () => { const { - dao, work1, account1, account2, + dao, work1, account2, } = await loadFixture(deploy); await dao.stakeAvailability(work1.target, 50, STAKE_DURATION); const requestWork = () => work1.connect(account2).requestWork({ value: WORK1_PRICE }); - await expect(requestWork()).to.emit(work1, 'WorkAssigned').withArgs(account1, 0); + await expect(requestWork()).to.emit(work1, 'WorkAssigned').withArgs(0, 0); await time.increase(STAKE_DURATION + 1); await expect(work1.reclaimAvailability(0)).to.be.revertedWith('Stake has already been assigned work'); }); @@ -177,11 +177,11 @@ describe('Work1', () => { it('should not assign work to the same availability stake twice', async () => { const { - dao, work1, account1, account2, + dao, work1, account2, } = await loadFixture(deploy); await dao.stakeAvailability(work1.target, 50, STAKE_DURATION); const requestWork = () => work1.connect(account2).requestWork({ value: WORK1_PRICE }); - await expect(requestWork()).to.emit(work1, 'WorkAssigned').withArgs(account1, 0); + await expect(requestWork()).to.emit(work1, 'WorkAssigned').withArgs(0, 0); await expect(requestWork()).to.be.revertedWith('No available worker stakes'); }); @@ -238,6 +238,9 @@ describe('Work1', () => { expect(pool.fee).to.equal(WORK1_PRICE); expect(pool.sender).to.equal(work1.target); expect(pool.postIndex).to.equal(1); + expect(pool.stakeCount).to.equal(3); + await time.increase(86401); + await expect(dao.evaluateOutcome(1)).to.emit(dao, 'ValidationPoolResolved').withArgs(1, true); }); it('should be able to submit work disapproval', async () => {