diff --git a/.env b/.env index 39f2027..269e6e5 100644 --- a/.env +++ b/.env @@ -1,8 +1,23 @@ +# Port number for the application to run on (default: 3000) VITE_APP_PORT=3000 +# Chain ID for the blockchain network (e.g., 27272 for DMD Beta) VITE_APP_CHAINID=27272 -VITE_APP_CHAIN_NAME=DMDv4 Beta -VITE_APP_EXPLORER_URL=https://beta-explorer.bit.diamonds -VITE_APP_RPC_URL=https://beta-rpc.bit.diamonds + +# Human-readable name of the blockchain network (e.g., DMD Beta) +VITE_APP_CHAIN_NAME=DMD Beta + +# RPC URL to connect to the blockchain network (e.g., https://beta-rpc.bit.diamonds/) +VITE_APP_RPC_URL=https://beta-rpc.bit.diamonds/ + +# URL of the blockchain explorer for viewing transactions (e.g., https://beta-explorer.bit.diamonds/) +VITE_APP_EXPLORER_URL=https://beta-explorer.bit.diamonds/ + +# WalletConnect project ID for integration VITE_APP_WC_PROJECT_ID=2cceb4f25f1cb889b967ea3c40bfd7cd -q \ No newline at end of file + +# Contract address for claiming rewards or tokens +VITE_APP_CLAIMING_CONTRACT_ADDRESS=0xe0E6787A55049A90aAa4335D0Ff14fAD26B8e88e + +# Contract address for the aggregator +VITE_APP_AGGREGAOTR_CONTRACT_ADDRESS=0x07C0Ad8CBDC5876a59e863F2138dA67870fc7994 \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..1bbf515 --- /dev/null +++ b/.env.example @@ -0,0 +1,23 @@ +# Port number for the application to run on (default: 3000) +VITE_APP_PORT= + +# Chain ID for the blockchain network (e.g., 27272 for DMD Beta) +VITE_APP_CHAINID= + +# Human-readable name of the blockchain network (e.g., DMD Beta) +VITE_APP_CHAIN_NAME= + +# RPC URL to connect to the blockchain network (e.g., https://beta-rpc.bit.diamonds/) +VITE_APP_RPC_URL= + +# URL of the blockchain explorer for viewing transactions (e.g., https://beta-explorer.bit.diamonds/) +VITE_APP_EXPLORER_URL= + +# WalletConnect project ID for integration +VITE_APP_WC_PROJECT_ID= + +# Contract address for claiming rewards or tokens +VITE_APP_CLAIMING_CONTRACT_ADDRESS= + +# Contract address for the aggregator +VITE_APP_AGGREGAOTR_CONTRACT_ADDRESS= \ No newline at end of file diff --git a/src/components/ValidatorsTable/ColumnsFilter/index.tsx b/src/components/ValidatorsTable/ColumnsFilter/index.tsx new file mode 100644 index 0000000..49158da --- /dev/null +++ b/src/components/ValidatorsTable/ColumnsFilter/index.tsx @@ -0,0 +1,216 @@ +import React, { useState, useRef, useEffect } from "react"; +import styles from "./styles.module.css"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faBars } from "@fortawesome/free-solid-svg-icons"; +import { faRemove } from "@fortawesome/free-solid-svg-icons"; +import { faColumns } from "@fortawesome/free-solid-svg-icons"; + +interface ModalProps { + buttonText: string; + tableFields: any[]; + setTableFields: any; + defaultFields: any; +} + +const ColumnsFilterModal: React.FC = ({ buttonText, tableFields, setTableFields, defaultFields }) => { + const [isOpen, setIsOpen] = useState(false); + const [draggedItemIndex, setDraggedItemIndex] = useState(null); + const modalRef = useRef(null); + + const [tempSelectedColumns, setTempSelectedColumns] = useState([]); + const [selectedColumns, setSelectedColumns] = useState(tableFields.filter((field) => field.label && field.updateAble).map((field) => field.label)); + + useEffect(() => { + setSelectedColumns(tableFields.filter((field) => field.label && field.updateAble && !field.hide).map((field) => field.label)); + }, [tableFields]); + + const openModal = () => { + setTempSelectedColumns(selectedColumns); + setIsOpen(true); + }; + const closeModal = () => setIsOpen(false); + + const handleColumnClick = (label: string) => { + setTempSelectedColumns((prev) => + prev.includes(label) ? prev.filter((column) => column !== label) : [...prev, label] + ); + }; + + const handleDragStart = ( + event: React.DragEvent, + index: number + ) => { + setDraggedItemIndex(index); + event.dataTransfer.effectAllowed = "move"; + }; + + const handleDragOver = (event: React.DragEvent) => { + event.preventDefault(); + const target = event.currentTarget; + target.classList.add(styles.dragOver); // Add the drag-over class + }; + + const handleDrop = (event: React.DragEvent, dropIndex: number) => { + event.preventDefault(); + const target = event.currentTarget; + target.classList.remove(styles.dragOver); // Remove the drag-over class + if (draggedItemIndex === null || draggedItemIndex === dropIndex) return; + + const updatedColumns = [...tempSelectedColumns]; + const draggedItem = updatedColumns[draggedItemIndex]; + updatedColumns.splice(draggedItemIndex, 1); + updatedColumns.splice(dropIndex, 0, draggedItem); + + setTempSelectedColumns(updatedColumns); + setDraggedItemIndex(null); + }; + + const handleDragLeave = (event: React.DragEvent) => { + const target = event.currentTarget; + target.classList.remove(styles.dragOver); // Remove the drag-over class + }; + + const handleTouchStart = ( + event: React.TouchEvent, + index: number + ) => { + setDraggedItemIndex(index); + }; + + const handleTouchMove = (event: React.TouchEvent) => { + event.preventDefault(); // Prevent scrolling while dragging + }; + + const handleTouchEnd = ( + event: React.TouchEvent, + dropIndex: number + ) => { + if (draggedItemIndex === null || draggedItemIndex === dropIndex) return; + + const updatedColumns = [...tempSelectedColumns]; + const draggedItem = updatedColumns[draggedItemIndex]; + updatedColumns.splice(draggedItemIndex, 1); + updatedColumns.splice(dropIndex, 0, draggedItem); + + setTempSelectedColumns(updatedColumns); + setDraggedItemIndex(null); + }; + + const handleColumnsChange = () => { + // Create a copy of the tableFields array + const updatedTableFields = [...tableFields]; + + // Iterate over the tableFields array and update the hide property for updateable fields + updatedTableFields.forEach((field) => { + if (field.updateAble && field.label) { + field.hide = !tempSelectedColumns.includes(field.label); + } + }); + + // Filter out the updateable fields and sort them based on the tempSelectedColumns order + const updateableFields = updatedTableFields.filter((field) => field.updateAble && field.label); + updateableFields.sort((a, b) => tempSelectedColumns.indexOf(a.label) - tempSelectedColumns.indexOf(b.label)); + + // Merge the sorted updateable fields back into their original positions + let updateableIndex = 0; + const finalTableFields = updatedTableFields.map((field) => { + if (field.updateAble && field.label) { + return updateableFields[updateableIndex++]; + } + return field; + }); + + // Update the state with the final table fields + setTableFields(finalTableFields); + setSelectedColumns(tempSelectedColumns); + closeModal(); + }; + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if (modalRef.current && !modalRef.current.contains(event.target as Node)) { + closeModal(); + } + }; + + if (isOpen) { + document.addEventListener("mousedown", handleClickOutside); + } + + return () => { + document.removeEventListener("mousedown", handleClickOutside); + }; + }, [isOpen]); + + return ( + <> + + + {isOpen && ( +
+
+ +

Add, delete and sort columns just how you need it

+ +
+ {tempSelectedColumns.length === 0 ? ( + Select columns to start + ) : ( +
    + {tempSelectedColumns.map((column, index) => ( +
  • field.label === column) !== -1} + onDragStart={(event) => handleDragStart(event, index)} + onDragOver={handleDragOver} + onDrop={(event) => handleDrop(event, index)} + onTouchStart={(event) => handleTouchStart(event, index)} + onTouchMove={handleTouchMove} + onTouchEnd={(event) => handleTouchEnd(event, index)} + > + {index + 1} + {column} + {tableFields.findIndex(field => field.label === column) !== -1 && } +
  • + ))} +
+ )} +
+ +
+
    + {defaultFields.map((option: any) => ( + option.label && option.updateAble && ( +
  • handleColumnClick(option.label)} + > + {option.label} + {tempSelectedColumns.includes(option.label) && ( + + )} +
  • + ) + ))} +
+
+ +
+ + +
+ +
+
+ )} + + ); +}; + +export default ColumnsFilterModal; diff --git a/src/components/ValidatorsTable/ColumnsFilter/styles.module.css b/src/components/ValidatorsTable/ColumnsFilter/styles.module.css new file mode 100644 index 0000000..472ee31 --- /dev/null +++ b/src/components/ValidatorsTable/ColumnsFilter/styles.module.css @@ -0,0 +1,241 @@ +/* styles.module.css */ +.openBtn { + gap: .3rem; + display: flex; + align-items: center; +} + +.modalOverlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; +} + +.modalContent { + width: 100%; + padding: 20px; + max-width: 500px; + color: #0145b2; + background: #fff; + position: relative; + border-radius: 8px; +} + +.modalContent>p { + margin: 20px 0px; + font-weight: bold; + text-align: start; +} + +.modalClose { + position: absolute; + top: 10px; + right: 10px; + background: none; + border: none; + font-size: 1.5rem; + cursor: pointer; +} + +label { + margin-bottom: 15px; +} + +label span { + display: block; + margin-bottom: 5px; +} + +input { + width: 100%; + padding: 8px; + box-sizing: border-box; + border: 1px solid #ccc; + border-radius: 4px; + font-size: 1rem; + transition: border-color 0.3s; +} + +input:focus { + border-color: #007bff; + outline: none; + color: grey; +} + +.inputWrapper { + width: 100%; + position: relative; + display: inline-block; +} + +.nodeOperatorShare { + padding-right: 30px; + /* Adjust for the percentage sign */ +} + +.percentageSign { + position: absolute; + right: 10px; + top: 50%; + transform: translateY(-50%); + pointer-events: none; + font-size: 0.9em; + color: #555; +} + +span>a { + cursor: pointer; + font-weight: bold; +} + + +.columnSelectionContainer { + gap: 1rem; + display: flex; + flex-wrap: wrap; + margin-top: 1rem; +} + +.dragging { + opacity: 0.5; + border: 2px dashed #007bff; +} + +.drag-over { + border: 2px dashed #3861fb; + background-color: #f0f8ff; +} + +[draggable="true"] { + user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; +} + +.selectedColumns { + display: flex; + align-items: center; + padding: 4px; + margin-top: 16px; + min-height: 42px; + border-radius: 8px; + margin-bottom: 32px; + background-color: #eff2f5; +} + +.selectedColumns > span { + font-size: 12px; + font-weight: 600; + margin-left: 4px; + text-align: start; +} + +ul.moveableItems { + width: 100%; + display: flex; + flex-wrap: wrap; + padding: 0; + margin: 0; +} + +ul.moveableItems li { + list-style: none; + margin: 0; + border: 1px solid transparent; + padding: 5px 12px; + border-radius: 28px; + color: black; + cursor: move; + text-align: center; /* Align text in the center of each column */ + transition: 0.3s; + line-height: 22px; + font-weight: 600; + font-size: 12px; + margin: 4px 4px 4px; + background-color: #fff; +} + +ul.moveableItems li > span { + padding: 1px 4px; + background: #eff2f5; + border-radius: 8px; + margin: 0px 4px; +} + +ul.moveableItems li > svg { + margin-left: 5px; + font-weight: 100; + color: rgb(196, 196, 196); +} + +/* Highlight the item being dragged */ +ul.moveableItems li[draggable="true"]:active { + opacity: 0.6; + border: 2px dashed #007bff; + background-color: #e6f0ff; + transform: scale(1.05); + transition: transform 0.2s ease, background-color 0.2s ease; +} + +/* Highlight the drop area when an item is dragged over */ +ul.moveableItems li.drag-over { + border: 2px dashed #007bff; + background-color: #f0f8ff; + transition: background-color 0.2s ease, border 0.2s ease; +} + +/* Add a pointer cursor to draggable items */ +ul.moveableItems li { + cursor: grab; +} + +ul.moveableItems li:active { + cursor: grabbing; +} + +.coulmnSelected { + cursor: pointer !important; + color: #3861fb !important; + background: #e6f0ff !important; +} + +.coulmnSelected > svg { + width: 13px; + height: 13px; + border-radius: 100px; + color: white !important; + background: #3861fb !important; +} + +.coulmnNotSelected { + cursor: pointer !important; + background: #eff2f5 !important; +} + +.modalFooter { + gap: .5rem; + display: flex; + margin-top: 32px; + justify-content: flex-end; +} + +.modalFooter > button { + font-weight: 500; + border-radius: 8px; +} + +.modalFooter > button:nth-child(2) { + border: none; + color: white; + cursor: pointer; + padding: 8px 16px; + background: #007bff; +} \ No newline at end of file diff --git a/src/components/ValidatorsTable/index.tsx b/src/components/ValidatorsTable/index.tsx index ebb5e78..285eabd 100644 --- a/src/components/ValidatorsTable/index.tsx +++ b/src/components/ValidatorsTable/index.tsx @@ -11,6 +11,25 @@ import { useStakingContext } from "../../contexts/StakingContext"; import styles from "./styles.module.css"; import Tooltip from "../Tooltip"; import Navigation from "../Navigation"; +import copy from "copy-to-clipboard"; +import { toast } from "react-toastify"; +import ColumnsFilterModal from "./ColumnsFilter"; +import { truncateAddress } from "../../utils/common"; + +let tableFieldsDefault = [ + { key: "jazzIcon", label: "", sortAble: false, updateAble: false, hide: false }, + { key: "isActive", label: "Status", sortAble: true, updateAble: true, hide: false }, + { key: "stakingAddress", label: "Wallet address", sortAble: false, updateAble: true, hide: false }, + { key: "miningAddress", label: "Miner address", sortAble: false, updateAble: true, hide: true }, + { key: "miningPublicKey", label: "Public Key", sortAble: false, updateAble: true, hide: true }, + { key: "totalStake", label: "Total Stake", sortAble: true, updateAble: true, hide: false }, + { key: "votingPower", label: "Voting Power", sortAble: true, updateAble: true, hide: false }, + { key: "score", label: "Score", sortAble: true, updateAble: true, hide: false }, + { key: "connectivityReport", label: "CR", sortAble: true, updateAble: true, hide: false }, + { key: "myStake", label: "My Stake", sortAble: true, updateAble: false, hide: false }, + { key: "stakeBtn", label: "", sortAble: false, updateAble: false, hide: false }, + { key: "unstakeClaimBtn", label: "", sortAble: false, updateAble: false, hide: false }, +]; interface ValidatorsTableProps { itemsPerPage?: number; @@ -28,6 +47,8 @@ const ValidatorsTable: React.FC = ({ itemsPerPage = 100 }) const [sortConfig, setSortConfig] = useState<{ key: string, direction: string } | null>(null); + const [tableFields, setTableFields] = useState(tableFieldsDefault); + useEffect(() => { // If a filter is passed via state, apply it if (location.state?.filter) { @@ -35,6 +56,21 @@ const ValidatorsTable: React.FC = ({ itemsPerPage = 100 }) } }, [location.state]); + // Load tableFieldsDefault from local storage if it exists, otherwise use the default + useEffect(() => { + const storedTableFields = localStorage.getItem('validatorFieldsData'); + if (storedTableFields) { + setTableFields(JSON.parse(storedTableFields)); + } else { + localStorage.setItem('validatorFieldsData', JSON.stringify(tableFieldsDefault)); + } + }, []); + + // Update local storage whenever tableFields changes + useEffect(() => { + localStorage.setItem('validatorFieldsData', JSON.stringify(tableFields)); + }, [tableFields]); + // Handle filter change const handleFilterChange = (event: React.ChangeEvent) => { setFilter(event.target.value as 'default' | 'valid' | 'active' | 'invalid' | 'stakedOn'); @@ -47,6 +83,12 @@ const ValidatorsTable: React.FC = ({ itemsPerPage = 100 }) setCurrentPage(0); // Reset to first page when starting a new search }; + const copyData = (e: React.MouseEvent, data: string, msg: string) => { + e.stopPropagation(); + copy(data); + toast.success(msg); + }; + // Apply filters and search let poolsCopy = [...pools]; @@ -70,9 +112,16 @@ const ValidatorsTable: React.FC = ({ itemsPerPage = 100 }) // Apply sorting if sortConfig is set if (sortConfig !== null) { poolsCopy.sort((a: any, b: any) => { - const keyA = sortConfig.key === 'myStake' ? parseFloat(a[sortConfig.key] || '0') : a[sortConfig.key]; - const keyB = sortConfig.key === 'myStake' ? parseFloat(b[sortConfig.key] || '0') : b[sortConfig.key]; - + let keyA, keyB; + + if (sortConfig.key === 'myStake' || sortConfig.key === 'score' || sortConfig.key === 'connectivityReport') { + keyA = parseFloat(a[sortConfig.key] || '0'); + keyB = parseFloat(b[sortConfig.key] || '0'); + } else { + keyA = a[sortConfig.key]; + keyB = b[sortConfig.key]; + } + if (keyA < keyB) { return sortConfig.direction === 'ascending' ? -1 : 1; } @@ -81,7 +130,7 @@ const ValidatorsTable: React.FC = ({ itemsPerPage = 100 }) } return 0; }); - } + } const pageCount = Math.ceil(poolsCopy.length / itemsPerPage); const offset = currentPage * itemsPerPage; @@ -122,6 +171,158 @@ const ValidatorsTable: React.FC = ({ itemsPerPage = 100 }) return pageNumbers; }; + const renderHeaders = () => { + return ( + + + {tableFields.filter(field => !field.hide).map((column, index) => { + if (column.key === 'myStake' && !userWallet.myAddr) { + return ; // Skip rendering "My Stake" column if userWallet.myAddr is not present + } + return ( + column.sortAble && requestSort(column.key)} + > + {column.label} + {column.sortAble && column.key && column.key !== 'stakingAddress' && column.key !== 'jazzIcon' && column.key != 'stakeBtn' && column.key != 'unstakeClaimBtn' && ( + <> + {column.key !== 'myStake' && } + + + )} + + ); + })} + + + ); + }; + + const renderRows = (currentItems: any[]) => { + return currentItems.map((pool, index) => ( + navigate(`/staking/details/${pool.stakingAddress}`)} className={styles.tableBodyRow} key={index}> + {tableFields.filter(field => !field.hide).map((column, colIndex) => { + if (column.key === 'jazzIcon') { + return ( + + + + ); + } else if (column.key === 'isActive') { + return ( + + {typeof pool.isActive === 'boolean' + ? pool.isActive ? Active : (pool.isToBeElected || pool.isPendingValidator) ? "Valid" : "Invalid" + : (
)} + + ); + } else if (column.key === 'stakingAddress') { + return ( + + {pool.stakingAddress ? ( + <> +
copyData(e, pool.stakingAddress, "Copied staking address")}>{truncateAddress(pool.stakingAddress)}
+ + ) : ( +
+ )} + + ); + } else if (column.key === 'miningAddress') { + return ( + + {pool.miningAddress ? ( +
copyData(e, pool.miningAddress, "Copied mining address")}>{truncateAddress(pool.miningAddress)}
+ ) : ( +
+ )} + + ); + } else if (column.key === 'miningPublicKey') { + return ( + + {pool.miningPublicKey ? ( +
copyData(e, pool.miningPublicKey, "Copied public key")}>{truncateAddress(pool.miningPublicKey)}
+ ) : ( +
+ )} + + ); + } else if (column.key === 'totalStake') { + return ( + + {BigNumber(pool.totalStake ?? 0) ? BigNumber(BigNumber(pool.totalStake ?? 0)).dividedBy(10**18).toFixed(4) + " DMD" : (
)} + + ); + } else if (column.key === 'votingPower') { + return ( + + {pool.votingPower && pool.votingPower.toString() !== 'NaN' && pool.votingPower.toString() !== 'Infinity' + ? `${pool.votingPower.toString()} %` + :
} + + ); + } else if (column.key === 'score') { + return ( + {pool.score !== undefined && pool.score !== null ? pool.score : (
)} + ); + } else if (column.key === 'connectivityReport') { + return ( + 0 ? 'orange' : 'inherit'), fontWeight: pool.isFaultyValidator ? 'bold' : 'normal' }}> + {pool.connectivityReport !== undefined && pool.connectivityReport !== null ? pool.connectivityReport : (
)} + + ); + } else if (column.key === 'myStake' && userWallet.myAddr) { + return ( + {userWallet.myAddr && BigNumber(pool.myStake) ? BigNumber(pool.myStake).dividedBy(10**18).toFixed(0) : (
)} DMD + ); + } else if (column.key === 'stakeBtn' && userWallet.myAddr) { + return ( + + {(pool.isActive || pool.isToBeElected || pool.isPendingValidator) && BigNumber(pool.totalStake ?? 0).isLessThan(BigNumber(50000).multipliedBy(10**18)) && ( + + )} + + ); + } else if (column.key === 'unstakeClaimBtn' && userWallet.myAddr) { + return ( + + {BigNumber(pool.orderedWithdrawAmount).isGreaterThan(0) && BigNumber(pool.orderedWithdrawUnlockEpoch).isLessThanOrEqualTo(stakingEpoch) ? ( + + ) : ( + BigNumber(pool.myStake).isGreaterThan(0) && ( + + ) + )} + + ); + } else { + return ; + } + })} + + )); + }; + + const getTooltipText = (key: string) => { + switch (key) { + case 'isActive': + return "Active candidate is part of the active set; Valid - is not part of the active set, but can be elected; Invalid - a candidate who is flagged unavailable on the blockchain or has not enough stake"; + case 'totalStake': + return "Total delegated DMD (self-staked DMD + delegates' stake)"; + case 'votingPower': + return "Value that approximates a node’s influence in the DAO participation"; + case 'score': + return "Combined score value, based on the results of generating the shared key, the stability of the validator connection and misbehaviour reports from other validators"; + case 'connectivityReport': + return "Connectivity report value, based on how many other active validators did report bad connectivity towards that node"; + default: + return ""; + } + }; + return (
@@ -164,106 +365,16 @@ const ValidatorsTable: React.FC = ({ itemsPerPage = 100 }) + +
{/* Table */}
- - - - - - - - - - - - - + {renderHeaders()} - {currentItems.length <= 0 ? ( - - - - ) : currentItems.map((pool, index) => ( - navigate(`/staking/details/${pool.stakingAddress}`)} className={styles.tableBodyRow} key={index}> - - - - - - - { - userWallet.myAddr ? <> - - - - : <> - - - - - } - - )) - } + {renderRows(currentItems)}
requestSort('isActive')}> - Status - - - - Wallet - requestSort('totalStake')}> - Total Stake - - - requestSort('votingPower')}> - Voting Power - - - requestSort('score')}> - Score - - - requestSort('myStake')}> - {userWallet.myAddr ? ( - <> - My stake - - ) : ""} -
- No validators found -
- - - {typeof pool.isActive === 'boolean' - ? pool.isActive ? Active : (pool.isToBeElected || pool.isPendingValidator) ? "Valid" : "Invalid" - : (
)} -
{pool.stakingAddress ? pool.stakingAddress : (
)}
{ - BigNumber(pool.totalStake ?? 0) ? BigNumber(BigNumber(pool.totalStake ?? 0)).dividedBy(10**18).toFixed(4) + " DMD" : (
) - }
- {pool.votingPower && pool.votingPower.toString() !== 'NaN' && pool.votingPower.toString() !== 'Infinity' - ? `${pool.votingPower.toString()} %` - :
} -
{pool.score !== undefined && pool.score !== null ? pool.score : (
)}
{userWallet.myAddr && BigNumber(pool.myStake) ? BigNumber(pool.myStake).dividedBy(10**18).toFixed(0) : (
) } DMD
- { - (pool.isActive || pool.isToBeElected || pool.isPendingValidator) && BigNumber(pool.totalStake ?? 0).isLessThan(BigNumber(50000).multipliedBy(10**18)) && ( - - ) - } - - { - BigNumber(pool.orderedWithdrawAmount).isGreaterThan(0) && BigNumber(pool.orderedWithdrawUnlockEpoch).isLessThanOrEqualTo(stakingEpoch) ? ( - - ) : ( - BigNumber(pool.myStake).isGreaterThan(0) && ( - - ) - ) - } -
diff --git a/src/components/ValidatorsTable/styles.module.css b/src/components/ValidatorsTable/styles.module.css index 69c23c8..4241997 100644 --- a/src/components/ValidatorsTable/styles.module.css +++ b/src/components/ValidatorsTable/styles.module.css @@ -64,7 +64,14 @@ .styledTable tbody tr { border-bottom: 1px solid rgba(245, 247, 250, 0); padding: 20px; + position: relative; /* Ensure hover effects work on the whole row */ } + +.styledTable tbody tr:hover { + cursor: pointer; + background-color: #e6f2ff; /* Light blue */ +} + .styledTable img { border-radius: 50%; width: 50px; @@ -72,6 +79,33 @@ object-fit: cover; } +.styledTable .walletColumn { + position: sticky; + left: 0; + background-color: white; /* Ensure the sticky column has a background */ + z-index: 2; /* Keeps it on top of other columns */ +} + +.styledTable .walletColumnHeader { + position: sticky; + left: 0; + background-color: rgb(245, 247, 250); /* Same as header background */ + z-index: 1; /* Keeps it behind the content in other columns */ +} + +/* For specific cell, e.g. for the wallet column */ +.styledTable td.walletColumn { + position: sticky; + left: 0; + background-color: white; + z-index: 2; /* Keep it on top of other columns */ +} + +/* Ensure the sticky Wallet column inherits the hover effect */ +.styledTable tbody tr:hover td.walletColumn { + background-color: #e6f2ff; /* Light blue */ +} + /* Responsive styles */ /* @media (max-width: 768px) { .styledTable th:nth-child(4), @@ -169,12 +203,17 @@ td .loader { .filterContainer { gap: 1rem; + width: 100%; display: flex; align-self: start; text-align: center; margin-bottom: 20px; - align-items: baseline; - justify-content: center; + align-items: center; +} + +.filterContainer > input { + align-self: flex-start; + max-width: 260px; } .filterContainer label { @@ -189,4 +228,17 @@ td .loader { background-color: #fff; outline: none; cursor: pointer; +} + +.filterContainer > :last-child { + margin-left: auto; +} + +.addressesContainer > div:hover { + font-weight: 500; +} + +.addressesContainer > div:nth-child(2) { + color: gray; + font-size: 0.8em; } \ No newline at end of file diff --git a/src/constants.ts b/src/constants.ts index 818249f..cffa56a 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,4 +1,4 @@ export const CURR_VERSION_INFO = { - version: "openbeta-1.1", + version: "openbeta-1.1.1", reset: true } \ No newline at end of file diff --git a/src/contexts/DaoContext/index.tsx b/src/contexts/DaoContext/index.tsx index f6a647c..6d5bf7c 100644 --- a/src/contexts/DaoContext/index.tsx +++ b/src/contexts/DaoContext/index.tsx @@ -78,7 +78,7 @@ const DaoContextProvider: React.FC = ({ children }) => { const governancePot = await web3Context.web3.eth.getBalance(web3Context.contractsManager.daoContract.options.address); setGovernancePotBalance(BigNumber(governancePot).dividedBy(1e18)); - const claimingPot = await web3Context.web3.eth.getBalance(import.meta.env.VITE_APP_CLAIMING_CONTRACT_ADDRESS); + const claimingPot = await web3Context.web3.eth.getBalance(import.meta.env.VITE_APP_CLAIMING_CONTRACT_ADDRESS || "0xe0E6787A55049A90aAa4335D0Ff14fAD26B8e88e"); setClaimingContractBalance(BigNumber(claimingPot).dividedBy(1e18)); subscribeToEvents(); diff --git a/src/contexts/StakingContext/index.tsx b/src/contexts/StakingContext/index.tsx index 0548e21..0012371 100644 --- a/src/contexts/StakingContext/index.tsx +++ b/src/contexts/StakingContext/index.tsx @@ -127,9 +127,11 @@ const StakingContextProvider: React.FC = ({children}) => { } const getNodeOperatorData = async (pool: Pool) => { - const nodeOperatorAddress = await contractsManager.stContract?.methods.poolNodeOperator(pool.stakingAddress).call(); - const nodeOperatorShare = await contractsManager.stContract?.methods.poolNodeOperatorShare(pool.stakingAddress).call(); - return { nodeOperatorAddress, nodeOperatorShare: new BigNumber(nodeOperatorShare || 0) }; + const nodeOperatorData = await contractsManager.aggregator?.methods.getNodeOperatorData(pool.stakingAddress).call(); + if (nodeOperatorData) { + return { nodeOperatorAddress: nodeOperatorData[0], nodeOperatorShare: new BigNumber(nodeOperatorData[1] || 0) }; + } + return { nodeOperatorAddress: '0x0000000000000000000000000000000000000000', nodeOperatorShare: new BigNumber(0) }; } const updateStakeAmounts = async (poolsInp?: Pool[]) => { @@ -429,20 +431,12 @@ const StakingContextProvider: React.FC = ({children}) => { const poolsData = await contractsManager.aggregator?.methods.getAllPools().call(); if (poolsData) { - activePoolAddrs = poolsData[1]; // miningAddresses - inactivePoolAddrs = poolsData[2]; // stakingAddresses - toBeElectedPoolAddrs = poolsData[3]; // stakingAddresses - pendingValidatorAddrs = poolsData[4]; // miningAddresses + activePoolAddrs = poolsData[4]; // stakingAddresses + inactivePoolAddrs = poolsData[1]; // stakingAddresses + toBeElectedPoolAddrs = poolsData[2]; // stakingAddresses + pendingValidatorAddrs = poolsData[6]; // stakingAddresses } - activePoolAddrs = await Promise.all( - activePoolAddrs.map(addr => contractsManager.vsContract?.methods.stakingByMiningAddress(addr).call()) - ); - - pendingValidatorAddrs = await Promise.all( - pendingValidatorAddrs.map(addr => contractsManager.vsContract?.methods.stakingByMiningAddress(addr).call()) - ); - console.log(`[INFO] Syncing Active(${activePoolAddrs.length}) and Inactive(${inactivePoolAddrs.length}) pools...`); const allPools = activePoolAddrs.concat(inactivePoolAddrs).concat(toBeElectedPoolAddrs).concat(pendingValidatorAddrs); @@ -544,8 +538,9 @@ const StakingContextProvider: React.FC = ({children}) => { pool.isToBeElected = toBeElectedPoolAddrs.indexOf(stakingAddress) >= 0; pool.isPendingValidator = pendingValidatorAddrs.indexOf(pool.miningAddress) >= 0; pool.isMe = userWallet ? userWallet.myAddr === pool.stakingAddress : false; - pool.score = Number(await contractsManager.bsContract?.methods.getValidatorScore(pool.miningAddress).call()); - + pool.isFaultyValidator = updatedPoolData[6]; + pool.score = updatedPoolData[7]; + pool.connectivityReport = updatedPoolData[8]; return pool; } @@ -644,9 +639,9 @@ const StakingContextProvider: React.FC = ({children}) => { const poolsData = await contractsManager.aggregator?.methods.getAllPools().call(); if (poolsData) { - activePoolAddrs = poolsData[1]; - toBeElectedPoolAddrs = poolsData[3]; - pendingValidatorAddrs = poolsData[4]; + activePoolAddrs = poolsData[4]; + toBeElectedPoolAddrs = poolsData[2]; + pendingValidatorAddrs = poolsData[6]; } const updatedData = await contractsManager.aggregator?.methods.getPoolsData([pool.stakingAddress]).call(); @@ -777,8 +772,11 @@ const StakingContextProvider: React.FC = ({children}) => { if (!contractsManager.stContract || !userWallet || !userWallet.myAddr) return { maxWithdrawAmount, maxWithdrawOrderAmount }; try { - maxWithdrawAmount = new BigNumber(await contractsManager.stContract.methods.maxWithdrawAllowed(pool.stakingAddress, userWallet.myAddr).call()); - maxWithdrawOrderAmount = new BigNumber(await contractsManager.stContract.methods.maxWithdrawOrderAllowed(pool.stakingAddress, userWallet.myAddr).call()); + const withdrawableAmounts = await contractsManager.aggregator?.methods.getWithdrawableAmounts(pool.stakingAddress, userWallet.myAddr).call(); + if (withdrawableAmounts) { + maxWithdrawAmount = new BigNumber(withdrawableAmounts[0]); + maxWithdrawOrderAmount = new BigNumber(withdrawableAmounts[1]); + } } catch (error) { console.error("Couldn't fetch withdrawable amounts:", error); } diff --git a/src/contexts/StakingContext/models/contractManager.ts b/src/contexts/StakingContext/models/contractManager.ts index 1c99666..a25518e 100755 --- a/src/contexts/StakingContext/models/contractManager.ts +++ b/src/contexts/StakingContext/models/contractManager.ts @@ -229,7 +229,7 @@ export class ContractManager { } public async getHbbftAggregator(): Promise { - let contractAddress = '0x9990000000000000000000000000000000000000'; + let contractAddress = import.meta.env.VITE_APP_AGGREGAOTR_CONTRACT_ADDRESS || '0x9990000000000000000000000000000000000000'; const abi: any = JsonHbbtAggregator.abi; const contract: any = new this.web3.eth.Contract(abi, contractAddress); diff --git a/src/contexts/StakingContext/models/model.ts b/src/contexts/StakingContext/models/model.ts index 40d6533..e8f690f 100755 --- a/src/contexts/StakingContext/models/model.ts +++ b/src/contexts/StakingContext/models/model.ts @@ -34,6 +34,8 @@ export class Pool { public ownStake: BigNumber = new BigNumber(0); public poolOperator: string = ''; public poolOperatorShare: BigNumber = new BigNumber(0); + public connectivityReport: string = ''; + public isFaultyValidator: boolean = false; constructor(stakingAddress: string) { this.stakingAddress = stakingAddress; diff --git a/src/contexts/contract-abis/HbbftAggregator.json b/src/contexts/contract-abis/HbbftAggregator.json index 2a23b57..91a10bf 100644 --- a/src/contexts/contract-abis/HbbftAggregator.json +++ b/src/contexts/contract-abis/HbbftAggregator.json @@ -1,474 +1,572 @@ { - "_format": "hh-sol-artifact-1", - "contractName": "DMDAggregator", - "sourceName": "contracts/Aggregator.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_st", - "type": "address" - }, - { - "internalType": "address", - "name": "_vs", - "type": "address" - }, - { - "internalType": "address", - "name": "_tp", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, + "_format": "hh-sol-artifact-1", + "contractName": "DMDAggregator", + "sourceName": "contracts/Aggregator.sol", + "abi": [ + { + "inputs": [ { - "inputs": [], - "name": "br", - "outputs": [ - { - "internalType": "contract IBlockRewardHbbft", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "address", + "name": "initialOwner", + "type": "address" }, { - "inputs": [], - "name": "getAllPools", - "outputs": [ - { - "components": [ - { - "internalType": "address[]", - "name": "activePools", - "type": "address[]" - }, - { - "internalType": "address[]", - "name": "validators", - "type": "address[]" - }, - { - "internalType": "address[]", - "name": "inActivePools", - "type": "address[]" - }, - { - "internalType": "address[]", - "name": "poolsToBeElected", - "type": "address[]" - }, - { - "internalType": "address[]", - "name": "pendingValidators", - "type": "address[]" - } - ], - "internalType": "struct DMDAggregator.Pools", - "name": "pools", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "address", + "name": "_st", + "type": "address" }, { - "inputs": [ - { - "internalType": "address[]", - "name": "delegators", - "type": "address[]" - }, - { - "internalType": "address", - "name": "poolAddress", - "type": "address" - } - ], - "name": "getDelegationsData", - "outputs": [ - { - "components": [ - { - "internalType": "address", - "name": "delegator", - "type": "address" - }, - { - "internalType": "uint256", - "name": "delegatedAmount", - "type": "uint256" - } - ], - "internalType": "struct DMDAggregator.DelegateData[]", - "name": "_delegatesData", - "type": "tuple[]" - }, - { - "internalType": "uint256", - "name": "_ownStake", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_candidateStake", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "address", + "name": "_vs", + "type": "address" }, { - "inputs": [], - "name": "getGlobals", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "deltaPot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "reinsertPot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "keygenRound", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stakingEpoch", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "minimumGasPrice", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "candidateMinStake", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "delegatorMinStake", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stakingEpochStartTime", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stakingEpochStartBlock", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "areStakeAndWithdrawAllowed", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "stakingFixedEpochEndTime", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stakingFixedEpochDuration", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stakingWithdrawDisallowPeriod", - "type": "uint256" - } - ], - "internalType": "struct DMDAggregator.GlobalsData", - "name": "_globalsData", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, + "internalType": "address", + "name": "_tp", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ { - "inputs": [ - { - "internalType": "address[]", - "name": "_sAs", - "type": "address[]" - } - ], - "name": "getPoolsData", - "outputs": [ - { - "components": [ - { - "internalType": "address", - "name": "miningAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "availableSince", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "publicKey", - "type": "bytes" - }, - { - "internalType": "address[]", - "name": "delegators", - "type": "address[]" - }, - { - "internalType": "enum IValidatorSetHbbft.KeyGenMode", - "name": "keygenMode", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "stakedAmountTotal", - "type": "uint256" - } - ], - "internalType": "struct DMDAggregator.PoolData[]", - "name": "poolsData", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnableInvalidOwner", + "type": "error" + }, + { + "inputs": [ { - "inputs": [ - { - "internalType": "address", - "name": "_user", - "type": "address" - }, - { - "internalType": "address[]", - "name": "_pools", - "type": "address[]" - } - ], - "name": "getUserOrderedWithdraws", - "outputs": [ - { - "components": [ - { - "internalType": "address", - "name": "pool", - "type": "address" - }, - { - "internalType": "uint256", - "name": "orderedAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "withdrawEpoch", - "type": "uint256" - } - ], - "internalType": "struct DMDAggregator.OrderedWithdrawData[]", - "name": "_stakesData", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "OwnableUnauthorizedAccount", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ { - "inputs": [ - { - "internalType": "address", - "name": "_user", - "type": "address" - }, - { - "internalType": "address[]", - "name": "_pools", - "type": "address[]" - } - ], - "name": "getUserStakes", - "outputs": [ - { - "components": [ - { - "internalType": "address", - "name": "pool", - "type": "address" - }, - { - "internalType": "uint256", - "name": "myStakedAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "stakedAmountTotal", - "type": "uint256" - } - ], - "internalType": "struct DMDAggregator.StakeData[]", - "name": "_stakesData", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" }, { - "inputs": [], - "name": "kh", - "outputs": [ - { - "internalType": "contract IKeyGenHistory", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "getAllPools", + "outputs": [ + { + "components": [ + { + "internalType": "address[]", + "name": "stActivePools", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "stInActivePools", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "stPoolsToBeElected", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "vsValidatorsMiningAddresses", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "vsValidatorsStakingAddresses", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "vsPendingValidatorsMiningAddresses", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "vsPendingValidatorsStakingAddresses", + "type": "address[]" + } + ], + "internalType": "struct DMDAggregator.Pools", + "name": "pools", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "address[]", + "name": "delegators", + "type": "address[]" }, { - "inputs": [ - { - "internalType": "address", - "name": "_br", - "type": "address" - } - ], - "name": "setBlockRewardContract", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "address", + "name": "poolAddress", + "type": "address" + } + ], + "name": "getDelegationsData", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "delegatedAmount", + "type": "uint256" + } + ], + "internalType": "struct DMDAggregator.DelegateData[]", + "name": "_delegatesData", + "type": "tuple[]" }, { - "inputs": [ - { - "internalType": "address", - "name": "_kh", - "type": "address" - } - ], - "name": "setKeygenHistoryContract", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "uint256", + "name": "_ownStake", + "type": "uint256" }, { - "inputs": [ - { - "internalType": "address", - "name": "_st", - "type": "address" - } - ], - "name": "setStakingContract", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "uint256", + "name": "_candidateStake", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGlobals", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "deltaPot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "reinsertPot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "keygenRound", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakingEpoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimumGasPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "candidateMinStake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "delegatorMinStake", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakingEpochStartTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakingEpochStartBlock", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "areStakeAndWithdrawAllowed", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "stakingFixedEpochEndTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakingFixedEpochDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakingWithdrawDisallowPeriod", + "type": "uint256" + } + ], + "internalType": "struct DMDAggregator.GlobalsData", + "name": "_globalsData", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "stakingAddress", + "type": "address" + } + ], + "name": "getNodeOperatorData", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" }, { - "inputs": [ - { - "internalType": "address", - "name": "_tp", - "type": "address" - } - ], - "name": "setTxPermissionContract", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_sAs", + "type": "address[]" + } + ], + "name": "getPoolsData", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "miningAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "availableSince", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "publicKey", + "type": "bytes" + }, + { + "internalType": "address[]", + "name": "delegators", + "type": "address[]" + }, + { + "internalType": "enum IValidatorSetHbbft.KeyGenMode", + "name": "keygenMode", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "stakedAmountTotal", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isFaultyValidator", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "validatorScore", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "connectivityScore", + "type": "uint256" + } + ], + "internalType": "struct DMDAggregator.PoolData[]", + "name": "poolsData", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "miningAddresses", + "type": "address[]" + } + ], + "name": "getStakingAddresses", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" }, { - "inputs": [ - { - "internalType": "address", - "name": "_vs", - "type": "address" - } - ], - "name": "setValidatorsSetContract", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" + "internalType": "address[]", + "name": "_pools", + "type": "address[]" + } + ], + "name": "getUserOrderedWithdraws", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + }, + { + "internalType": "uint256", + "name": "orderedAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "withdrawEpoch", + "type": "uint256" + } + ], + "internalType": "struct DMDAggregator.OrderedWithdrawData[]", + "name": "_stakesData", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" }, { - "inputs": [], - "name": "st", - "outputs": [ - { - "internalType": "contract IStakingHbbft", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "address[]", + "name": "_pools", + "type": "address[]" + } + ], + "name": "getUserStakes", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "pool", + "type": "address" + }, + { + "internalType": "uint256", + "name": "myStakedAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "stakedAmountTotal", + "type": "uint256" + } + ], + "internalType": "struct DMDAggregator.StakeData[]", + "name": "_stakesData", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "poolStAddress", + "type": "address" }, { - "inputs": [], - "name": "tp", - "outputs": [ - { - "internalType": "contract ITxPermission", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "getWithdrawableAmounts", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" }, { - "inputs": [], - "name": "vs", - "outputs": [ - { - "internalType": "contract IValidatorSetHbbft", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_br", + "type": "address" + } + ], + "name": "setBlockRewardContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_kh", + "type": "address" + } + ], + "name": "setKeygenHistoryContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_st", + "type": "address" + } + ], + "name": "setStakingContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tp", + "type": "address" + } + ], + "name": "setTxPermissionContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_vs", + "type": "address" + } + ], + "name": "setValidatorsSetContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" } - ], - "bytecode": "0x60806040523480156200001157600080fd5b506040516200378538038062003785833981810160405281019062000037919062000355565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b47aef1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001a8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ce9190620003b1565b600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166356b54bae6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200027c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a29190620003b1565b600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050620003e3565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200031d82620002f0565b9050919050565b6200032f8162000310565b81146200033b57600080fd5b50565b6000815190506200034f8162000324565b92915050565b600080600060608486031215620003715762000370620002eb565b5b600062000381868287016200033e565b935050602062000394868287016200033e565b9250506040620003a7868287016200033e565b9150509250925092565b600060208284031215620003ca57620003c9620002eb565b5b6000620003da848285016200033e565b91505092915050565b61339280620003f36000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c8063944de246116100a2578063b55efa5e11610071578063b55efa5e146102a6578063c1b9a952146102d8578063d88ff1f4146102f4578063d9f38c9914610312578063f02a72f5146103305761010b565b8063944de2461461020c5780639dd373b91461022a578063a1ae3fb814610246578063b4432cea146102765761010b565b80634f514134116100de5780634f5141341461018457806373f0cc2d146101a05780638da5cb5b146101be57806391c55c3d146101dc5761010b565b80630691cc6a1461011057806327a3e16b1461012e578063336ca2521461014a5780634cfbab0014610168575b600080fd5b61011861034e565b604051610125919061219e565b60405180910390f35b6101486004803603810190610143919061220b565b610374565b005b610152610446565b60405161015f9190612259565b60405180910390f35b610182600480360381019061017d919061220b565b61046c565b005b61019e6004803603810190610199919061220b565b61053e565b005b6101a8610610565b6040516101b59190612295565b60405180910390f35b6101c6610636565b6040516101d391906122bf565b60405180910390f35b6101f660048036038101906101f19190612433565b61065a565b604051610203919061279b565b60405180910390f35b610214610b4a565b60405161022191906127de565b60405180910390f35b610244600480360381019061023f919061220b565b610b70565b005b610260600480360381019061025b9190612854565b610c42565b60405161026d91906129a5565b60405180910390f35b610290600480360381019061028b9190612854565b610ec2565b60405161029d9190612ab8565b60405180910390f35b6102c060048036038101906102bb9190612ada565b611144565b6040516102cf93929190612c23565b60405180910390f35b6102f260048036038101906102ed919061220b565b6113be565b005b6102fc611490565b6040516103099190612cf3565b60405180910390f35b61031a6117ad565b6040516103279190612e3b565b60405180910390f35b610338611f64565b6040516103459190612e78565b60405180910390f35b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f990612ef0565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f190612ef0565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c390612ef0565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060815167ffffffffffffffff811115610677576106766122f0565b5b6040519080825280602002602001820160405280156106b057816020015b61069d611f8a565b8152602001906001900390816106955790505b50905060005b8251811015610b44576000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166253517585848151811061071157610710612f10565b5b60200260200101516040518263ffffffff1660e01b815260040161073591906122bf565b602060405180830381865afa158015610752573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107769190612f54565b90506040518060c001604052808273ffffffffffffffffffffffffffffffffffffffff168152602001600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166360e5c520846040518263ffffffff1660e01b81526004016107fa91906122bf565b602060405180830381865afa158015610817573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083b9190612fad565b8152602001600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663857cdbb8846040518263ffffffff1660e01b815260040161089b91906122bf565b600060405180830381865afa1580156108b8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108e19190613080565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639ea8082b87868151811061093757610936612f10565b5b60200260200101516040518263ffffffff1660e01b815260040161095b91906122bf565b600060405180830381865afa158015610978573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109a19190613160565b8152602001600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314e28d90846040518263ffffffff1660e01b8152600401610a0191906122bf565b602060405180830381865afa158015610a1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4291906131ce565b6005811115610a5457610a536125fe565b5b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635267e1d6878681518110610aaa57610aa9612f10565b5b60200260200101516040518263ffffffff1660e01b8152600401610ace91906122bf565b602060405180830381865afa158015610aeb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0f9190612fad565b815250838381518110610b2557610b24612f10565b5b6020026020010181905250508080610b3c9061322a565b9150506106b6565b50919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf590612ef0565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60608282905067ffffffffffffffff811115610c6157610c606122f0565b5b604051908082528060200260200182016040528015610c9a57816020015b610c87611fe8565b815260200190600190039081610c7f5790505b50905060005b83839050811015610eba576040518060600160405280858584818110610cc957610cc8612f10565b5b9050602002016020810190610cde919061220b565b73ffffffffffffffffffffffffffffffffffffffff168152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a697ecff878786818110610d4a57610d49612f10565b5b9050602002016020810190610d5f919061220b565b896040518363ffffffff1660e01b8152600401610d7d929190613272565b602060405180830381865afa158015610d9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbe9190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635267e1d6878786818110610e1457610e13612f10565b5b9050602002016020810190610e29919061220b565b6040518263ffffffff1660e01b8152600401610e4591906122bf565b602060405180830381865afa158015610e62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e869190612fad565b815250828281518110610e9c57610e9b612f10565b5b60200260200101819052508080610eb29061322a565b915050610ca0565b509392505050565b60608282905067ffffffffffffffff811115610ee157610ee06122f0565b5b604051908082528060200260200182016040528015610f1a57816020015b610f0761201f565b815260200190600190039081610eff5790505b50905060005b8383905081101561113c576040518060600160405280858584818110610f4957610f48612f10565b5b9050602002016020810190610f5e919061220b565b73ffffffffffffffffffffffffffffffffffffffff168152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e9ab0300878786818110610fca57610fc9612f10565b5b9050602002016020810190610fdf919061220b565b896040518363ffffffff1660e01b8152600401610ffd929190613272565b602060405180830381865afa15801561101a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103e9190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a420596787878681811061109457611093612f10565b5b90506020020160208101906110a9919061220b565b896040518363ffffffff1660e01b81526004016110c7929190613272565b602060405180830381865afa1580156110e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111089190612fad565b81525082828151811061111e5761111d612f10565b5b602002602001018190525080806111349061322a565b915050610f20565b509392505050565b6060600080845167ffffffffffffffff811115611164576111636122f0565b5b60405190808252806020026020018201604052801561119d57816020015b61118a612056565b8152602001906001900390816111825790505b50925060005b855181101561130d5760008682815181106111c1576111c0612f10565b5b602002602001015190506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a697ecff88846040518363ffffffff1660e01b815260040161122a929190613272565b602060405180830381865afa158015611247573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126b9190612fad565b905060405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001828152508684815181106112ab576112aa612f10565b5b60200260200101819052508173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146112f85780846112f5919061329b565b93505b505080806113059061322a565b9150506111a3565b5080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635267e1d6866040518263ffffffff1660e01b815260040161136a91906122bf565b602060405180830381865afa158015611387573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ab9190612fad565b6113b591906132cf565b91509250925092565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461144c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144390612ef0565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611498612086565b6040518060a00160405280600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663673a2a1f6040518163ffffffff1660e01b8152600401600060405180830381865afa158015611510573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115399190613160565b8152602001600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b7ab4db56040518163ffffffff1660e01b8152600401600060405180830381865afa1580156115ab573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115d49190613160565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663df6f55f56040518163ffffffff1660e01b8152600401600060405180830381865afa158015611646573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061166f9190613160565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a5d54f656040518163ffffffff1660e01b8152600401600060405180830381865afa1580156116e1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061170a9190613160565b8152602001600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eebc7a396040518163ffffffff1660e01b8152600401600060405180830381865afa15801561177c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906117a59190613160565b815250905090565b6117b56120b5565b604051806101a00160405280600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c57a8016040518163ffffffff1660e01b8152600401602060405180830381865afa15801561182e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118529190612fad565b8152602001600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166373f129586040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e89190612fad565b8152602001600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166348bb1b2d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561195a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197e9190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663794c0c686040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a149190612fad565b8152602001600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663df3cecf66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaa9190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fef76436040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b409190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663da7a9b6a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd69190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639b03d7446040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6c9190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637069e7466040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d029190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f49425016040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d98919061332f565b15158152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166322e3d9866040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e309190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f9a8d8f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ea2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec69190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663028b8bdb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5c9190612fad565b815250905090565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081526020016060815260200160006005811115611fdb57611fda6125fe565b5b8152602001600081525090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b6040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b604051806101a001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000815260200160008152602001600081525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061216461215f61215a8461211f565b61213f565b61211f565b9050919050565b600061217682612149565b9050919050565b60006121888261216b565b9050919050565b6121988161217d565b82525050565b60006020820190506121b3600083018461218f565b92915050565b6000604051905090565b600080fd5b600080fd5b60006121d88261211f565b9050919050565b6121e8816121cd565b81146121f357600080fd5b50565b600081359050612205816121df565b92915050565b600060208284031215612221576122206121c3565b5b600061222f848285016121f6565b91505092915050565b60006122438261216b565b9050919050565b61225381612238565b82525050565b600060208201905061226e600083018461224a565b92915050565b600061227f8261216b565b9050919050565b61228f81612274565b82525050565b60006020820190506122aa6000830184612286565b92915050565b6122b9816121cd565b82525050565b60006020820190506122d460008301846122b0565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612328826122df565b810181811067ffffffffffffffff82111715612347576123466122f0565b5b80604052505050565b600061235a6121b9565b9050612366828261231f565b919050565b600067ffffffffffffffff821115612386576123856122f0565b5b602082029050602081019050919050565b600080fd5b60006123af6123aa8461236b565b612350565b905080838252602082019050602084028301858111156123d2576123d1612397565b5b835b818110156123fb57806123e788826121f6565b8452602084019350506020810190506123d4565b5050509392505050565b600082601f83011261241a576124196122da565b5b813561242a84826020860161239c565b91505092915050565b600060208284031215612449576124486121c3565b5b600082013567ffffffffffffffff811115612467576124666121c8565b5b61247384828501612405565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6124b1816121cd565b82525050565b6000819050919050565b6124ca816124b7565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561250a5780820151818401526020810190506124ef565b60008484015250505050565b6000612521826124d0565b61252b81856124db565b935061253b8185602086016124ec565b612544816122df565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061258783836124a8565b60208301905092915050565b6000602082019050919050565b60006125ab8261254f565b6125b5818561255a565b93506125c08361256b565b8060005b838110156125f15781516125d8888261257b565b97506125e383612593565b9250506001810190506125c4565b5085935050505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6006811061263e5761263d6125fe565b5b50565b600081905061264f8261262d565b919050565b600061265f82612641565b9050919050565b61266f81612654565b82525050565b600060c08301600083015161268d60008601826124a8565b5060208301516126a060208601826124c1565b50604083015184820360408601526126b88282612516565b915050606083015184820360608601526126d282826125a0565b91505060808301516126e76080860182612666565b5060a08301516126fa60a08601826124c1565b508091505092915050565b60006127118383612675565b905092915050565b6000602082019050919050565b60006127318261247c565b61273b8185612487565b93508360208202850161274d85612498565b8060005b85811015612789578484038952815161276a8582612705565b945061277583612719565b925060208a01995050600181019050612751565b50829750879550505050505092915050565b600060208201905081810360008301526127b58184612726565b905092915050565b60006127c88261216b565b9050919050565b6127d8816127bd565b82525050565b60006020820190506127f360008301846127cf565b92915050565b600080fd5b60008083601f840112612814576128136122da565b5b8235905067ffffffffffffffff811115612831576128306127f9565b5b60208301915083602082028301111561284d5761284c612397565b5b9250929050565b60008060006040848603121561286d5761286c6121c3565b5b600061287b868287016121f6565b935050602084013567ffffffffffffffff81111561289c5761289b6121c8565b5b6128a8868287016127fe565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6060820160008201516128f660008501826124a8565b50602082015161290960208501826124c1565b50604082015161291c60408501826124c1565b50505050565b600061292e83836128e0565b60608301905092915050565b6000602082019050919050565b6000612952826128b4565b61295c81856128bf565b9350612967836128d0565b8060005b8381101561299857815161297f8882612922565b975061298a8361293a565b92505060018101905061296b565b5085935050505092915050565b600060208201905081810360008301526129bf8184612947565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b606082016000820151612a0960008501826124a8565b506020820151612a1c60208501826124c1565b506040820151612a2f60408501826124c1565b50505050565b6000612a4183836129f3565b60608301905092915050565b6000602082019050919050565b6000612a65826129c7565b612a6f81856129d2565b9350612a7a836129e3565b8060005b83811015612aab578151612a928882612a35565b9750612a9d83612a4d565b925050600181019050612a7e565b5085935050505092915050565b60006020820190508181036000830152612ad28184612a5a565b905092915050565b60008060408385031215612af157612af06121c3565b5b600083013567ffffffffffffffff811115612b0f57612b0e6121c8565b5b612b1b85828601612405565b9250506020612b2c858286016121f6565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b604082016000820151612b7860008501826124a8565b506020820151612b8b60208501826124c1565b50505050565b6000612b9d8383612b62565b60408301905092915050565b6000602082019050919050565b6000612bc182612b36565b612bcb8185612b41565b9350612bd683612b52565b8060005b83811015612c07578151612bee8882612b91565b9750612bf983612ba9565b925050600181019050612bda565b5085935050505092915050565b612c1d816124b7565b82525050565b60006060820190508181036000830152612c3d8186612bb6565b9050612c4c6020830185612c14565b612c596040830184612c14565b949350505050565b600060a0830160008301518482036000860152612c7e82826125a0565b91505060208301518482036020860152612c9882826125a0565b91505060408301518482036040860152612cb282826125a0565b91505060608301518482036060860152612ccc82826125a0565b91505060808301518482036080860152612ce682826125a0565b9150508091505092915050565b60006020820190508181036000830152612d0d8184612c61565b905092915050565b60008115159050919050565b612d2a81612d15565b82525050565b6101a082016000820151612d4760008501826124c1565b506020820151612d5a60208501826124c1565b506040820151612d6d60408501826124c1565b506060820151612d8060608501826124c1565b506080820151612d9360808501826124c1565b5060a0820151612da660a08501826124c1565b5060c0820151612db960c08501826124c1565b5060e0820151612dcc60e08501826124c1565b50610100820151612de16101008501826124c1565b50610120820151612df6610120850182612d21565b50610140820151612e0b6101408501826124c1565b50610160820151612e206101608501826124c1565b50610180820151612e356101808501826124c1565b50505050565b60006101a082019050612e516000830184612d30565b92915050565b6000612e628261216b565b9050919050565b612e7281612e57565b82525050565b6000602082019050612e8d6000830184612e69565b92915050565b600082825260208201905092915050565b7f4e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b6000612eda600983612e93565b9150612ee582612ea4565b602082019050919050565b60006020820190508181036000830152612f0981612ecd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050612f4e816121df565b92915050565b600060208284031215612f6a57612f696121c3565b5b6000612f7884828501612f3f565b91505092915050565b612f8a816124b7565b8114612f9557600080fd5b50565b600081519050612fa781612f81565b92915050565b600060208284031215612fc357612fc26121c3565b5b6000612fd184828501612f98565b91505092915050565b600080fd5b600067ffffffffffffffff821115612ffa57612ff96122f0565b5b613003826122df565b9050602081019050919050565b600061302361301e84612fdf565b612350565b90508281526020810184848401111561303f5761303e612fda565b5b61304a8482856124ec565b509392505050565b600082601f830112613067576130666122da565b5b8151613077848260208601613010565b91505092915050565b600060208284031215613096576130956121c3565b5b600082015167ffffffffffffffff8111156130b4576130b36121c8565b5b6130c084828501613052565b91505092915050565b60006130dc6130d78461236b565b612350565b905080838252602082019050602084028301858111156130ff576130fe612397565b5b835b8181101561312857806131148882612f3f565b845260208401935050602081019050613101565b5050509392505050565b600082601f830112613147576131466122da565b5b81516131578482602086016130c9565b91505092915050565b600060208284031215613176576131756121c3565b5b600082015167ffffffffffffffff811115613194576131936121c8565b5b6131a084828501613132565b91505092915050565b600681106131b657600080fd5b50565b6000815190506131c8816131a9565b92915050565b6000602082840312156131e4576131e36121c3565b5b60006131f2848285016131b9565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613235826124b7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613267576132666131fb565b5b600182019050919050565b600060408201905061328760008301856122b0565b61329460208301846122b0565b9392505050565b60006132a6826124b7565b91506132b1836124b7565b92508282019050808211156132c9576132c86131fb565b5b92915050565b60006132da826124b7565b91506132e5836124b7565b92508282039050818111156132fd576132fc6131fb565b5b92915050565b61330c81612d15565b811461331757600080fd5b50565b60008151905061332981613303565b92915050565b600060208284031215613345576133446121c3565b5b60006133538482850161331a565b9150509291505056fea2646970667358221220df22e0aa4f9eeb04f6821f7d4761023529e1380a94d15d60ebe047d300ec4bcc64736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061010b5760003560e01c8063944de246116100a2578063b55efa5e11610071578063b55efa5e146102a6578063c1b9a952146102d8578063d88ff1f4146102f4578063d9f38c9914610312578063f02a72f5146103305761010b565b8063944de2461461020c5780639dd373b91461022a578063a1ae3fb814610246578063b4432cea146102765761010b565b80634f514134116100de5780634f5141341461018457806373f0cc2d146101a05780638da5cb5b146101be57806391c55c3d146101dc5761010b565b80630691cc6a1461011057806327a3e16b1461012e578063336ca2521461014a5780634cfbab0014610168575b600080fd5b61011861034e565b604051610125919061219e565b60405180910390f35b6101486004803603810190610143919061220b565b610374565b005b610152610446565b60405161015f9190612259565b60405180910390f35b610182600480360381019061017d919061220b565b61046c565b005b61019e6004803603810190610199919061220b565b61053e565b005b6101a8610610565b6040516101b59190612295565b60405180910390f35b6101c6610636565b6040516101d391906122bf565b60405180910390f35b6101f660048036038101906101f19190612433565b61065a565b604051610203919061279b565b60405180910390f35b610214610b4a565b60405161022191906127de565b60405180910390f35b610244600480360381019061023f919061220b565b610b70565b005b610260600480360381019061025b9190612854565b610c42565b60405161026d91906129a5565b60405180910390f35b610290600480360381019061028b9190612854565b610ec2565b60405161029d9190612ab8565b60405180910390f35b6102c060048036038101906102bb9190612ada565b611144565b6040516102cf93929190612c23565b60405180910390f35b6102f260048036038101906102ed919061220b565b6113be565b005b6102fc611490565b6040516103099190612cf3565b60405180910390f35b61031a6117ad565b6040516103279190612e3b565b60405180910390f35b610338611f64565b6040516103459190612e78565b60405180910390f35b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f990612ef0565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f190612ef0565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c390612ef0565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060815167ffffffffffffffff811115610677576106766122f0565b5b6040519080825280602002602001820160405280156106b057816020015b61069d611f8a565b8152602001906001900390816106955790505b50905060005b8251811015610b44576000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166253517585848151811061071157610710612f10565b5b60200260200101516040518263ffffffff1660e01b815260040161073591906122bf565b602060405180830381865afa158015610752573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107769190612f54565b90506040518060c001604052808273ffffffffffffffffffffffffffffffffffffffff168152602001600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166360e5c520846040518263ffffffff1660e01b81526004016107fa91906122bf565b602060405180830381865afa158015610817573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083b9190612fad565b8152602001600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663857cdbb8846040518263ffffffff1660e01b815260040161089b91906122bf565b600060405180830381865afa1580156108b8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108e19190613080565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639ea8082b87868151811061093757610936612f10565b5b60200260200101516040518263ffffffff1660e01b815260040161095b91906122bf565b600060405180830381865afa158015610978573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109a19190613160565b8152602001600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314e28d90846040518263ffffffff1660e01b8152600401610a0191906122bf565b602060405180830381865afa158015610a1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4291906131ce565b6005811115610a5457610a536125fe565b5b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635267e1d6878681518110610aaa57610aa9612f10565b5b60200260200101516040518263ffffffff1660e01b8152600401610ace91906122bf565b602060405180830381865afa158015610aeb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0f9190612fad565b815250838381518110610b2557610b24612f10565b5b6020026020010181905250508080610b3c9061322a565b9150506106b6565b50919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf590612ef0565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60608282905067ffffffffffffffff811115610c6157610c606122f0565b5b604051908082528060200260200182016040528015610c9a57816020015b610c87611fe8565b815260200190600190039081610c7f5790505b50905060005b83839050811015610eba576040518060600160405280858584818110610cc957610cc8612f10565b5b9050602002016020810190610cde919061220b565b73ffffffffffffffffffffffffffffffffffffffff168152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a697ecff878786818110610d4a57610d49612f10565b5b9050602002016020810190610d5f919061220b565b896040518363ffffffff1660e01b8152600401610d7d929190613272565b602060405180830381865afa158015610d9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbe9190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635267e1d6878786818110610e1457610e13612f10565b5b9050602002016020810190610e29919061220b565b6040518263ffffffff1660e01b8152600401610e4591906122bf565b602060405180830381865afa158015610e62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e869190612fad565b815250828281518110610e9c57610e9b612f10565b5b60200260200101819052508080610eb29061322a565b915050610ca0565b509392505050565b60608282905067ffffffffffffffff811115610ee157610ee06122f0565b5b604051908082528060200260200182016040528015610f1a57816020015b610f0761201f565b815260200190600190039081610eff5790505b50905060005b8383905081101561113c576040518060600160405280858584818110610f4957610f48612f10565b5b9050602002016020810190610f5e919061220b565b73ffffffffffffffffffffffffffffffffffffffff168152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e9ab0300878786818110610fca57610fc9612f10565b5b9050602002016020810190610fdf919061220b565b896040518363ffffffff1660e01b8152600401610ffd929190613272565b602060405180830381865afa15801561101a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103e9190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a420596787878681811061109457611093612f10565b5b90506020020160208101906110a9919061220b565b896040518363ffffffff1660e01b81526004016110c7929190613272565b602060405180830381865afa1580156110e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111089190612fad565b81525082828151811061111e5761111d612f10565b5b602002602001018190525080806111349061322a565b915050610f20565b509392505050565b6060600080845167ffffffffffffffff811115611164576111636122f0565b5b60405190808252806020026020018201604052801561119d57816020015b61118a612056565b8152602001906001900390816111825790505b50925060005b855181101561130d5760008682815181106111c1576111c0612f10565b5b602002602001015190506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a697ecff88846040518363ffffffff1660e01b815260040161122a929190613272565b602060405180830381865afa158015611247573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126b9190612fad565b905060405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001828152508684815181106112ab576112aa612f10565b5b60200260200101819052508173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146112f85780846112f5919061329b565b93505b505080806113059061322a565b9150506111a3565b5080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635267e1d6866040518263ffffffff1660e01b815260040161136a91906122bf565b602060405180830381865afa158015611387573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ab9190612fad565b6113b591906132cf565b91509250925092565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461144c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144390612ef0565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611498612086565b6040518060a00160405280600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663673a2a1f6040518163ffffffff1660e01b8152600401600060405180830381865afa158015611510573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115399190613160565b8152602001600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b7ab4db56040518163ffffffff1660e01b8152600401600060405180830381865afa1580156115ab573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115d49190613160565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663df6f55f56040518163ffffffff1660e01b8152600401600060405180830381865afa158015611646573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061166f9190613160565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a5d54f656040518163ffffffff1660e01b8152600401600060405180830381865afa1580156116e1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061170a9190613160565b8152602001600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eebc7a396040518163ffffffff1660e01b8152600401600060405180830381865afa15801561177c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906117a59190613160565b815250905090565b6117b56120b5565b604051806101a00160405280600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c57a8016040518163ffffffff1660e01b8152600401602060405180830381865afa15801561182e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118529190612fad565b8152602001600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166373f129586040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e89190612fad565b8152602001600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166348bb1b2d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561195a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197e9190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663794c0c686040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a149190612fad565b8152602001600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663df3cecf66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaa9190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fef76436040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b409190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663da7a9b6a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd69190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639b03d7446040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6c9190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637069e7466040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d029190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f49425016040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d98919061332f565b15158152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166322e3d9866040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e309190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f9a8d8f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ea2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec69190612fad565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663028b8bdb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5c9190612fad565b815250905090565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081526020016060815260200160006005811115611fdb57611fda6125fe565b5b8152602001600081525090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b6040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b604051806101a001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000815260200160008152602001600081525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061216461215f61215a8461211f565b61213f565b61211f565b9050919050565b600061217682612149565b9050919050565b60006121888261216b565b9050919050565b6121988161217d565b82525050565b60006020820190506121b3600083018461218f565b92915050565b6000604051905090565b600080fd5b600080fd5b60006121d88261211f565b9050919050565b6121e8816121cd565b81146121f357600080fd5b50565b600081359050612205816121df565b92915050565b600060208284031215612221576122206121c3565b5b600061222f848285016121f6565b91505092915050565b60006122438261216b565b9050919050565b61225381612238565b82525050565b600060208201905061226e600083018461224a565b92915050565b600061227f8261216b565b9050919050565b61228f81612274565b82525050565b60006020820190506122aa6000830184612286565b92915050565b6122b9816121cd565b82525050565b60006020820190506122d460008301846122b0565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612328826122df565b810181811067ffffffffffffffff82111715612347576123466122f0565b5b80604052505050565b600061235a6121b9565b9050612366828261231f565b919050565b600067ffffffffffffffff821115612386576123856122f0565b5b602082029050602081019050919050565b600080fd5b60006123af6123aa8461236b565b612350565b905080838252602082019050602084028301858111156123d2576123d1612397565b5b835b818110156123fb57806123e788826121f6565b8452602084019350506020810190506123d4565b5050509392505050565b600082601f83011261241a576124196122da565b5b813561242a84826020860161239c565b91505092915050565b600060208284031215612449576124486121c3565b5b600082013567ffffffffffffffff811115612467576124666121c8565b5b61247384828501612405565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6124b1816121cd565b82525050565b6000819050919050565b6124ca816124b7565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561250a5780820151818401526020810190506124ef565b60008484015250505050565b6000612521826124d0565b61252b81856124db565b935061253b8185602086016124ec565b612544816122df565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061258783836124a8565b60208301905092915050565b6000602082019050919050565b60006125ab8261254f565b6125b5818561255a565b93506125c08361256b565b8060005b838110156125f15781516125d8888261257b565b97506125e383612593565b9250506001810190506125c4565b5085935050505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6006811061263e5761263d6125fe565b5b50565b600081905061264f8261262d565b919050565b600061265f82612641565b9050919050565b61266f81612654565b82525050565b600060c08301600083015161268d60008601826124a8565b5060208301516126a060208601826124c1565b50604083015184820360408601526126b88282612516565b915050606083015184820360608601526126d282826125a0565b91505060808301516126e76080860182612666565b5060a08301516126fa60a08601826124c1565b508091505092915050565b60006127118383612675565b905092915050565b6000602082019050919050565b60006127318261247c565b61273b8185612487565b93508360208202850161274d85612498565b8060005b85811015612789578484038952815161276a8582612705565b945061277583612719565b925060208a01995050600181019050612751565b50829750879550505050505092915050565b600060208201905081810360008301526127b58184612726565b905092915050565b60006127c88261216b565b9050919050565b6127d8816127bd565b82525050565b60006020820190506127f360008301846127cf565b92915050565b600080fd5b60008083601f840112612814576128136122da565b5b8235905067ffffffffffffffff811115612831576128306127f9565b5b60208301915083602082028301111561284d5761284c612397565b5b9250929050565b60008060006040848603121561286d5761286c6121c3565b5b600061287b868287016121f6565b935050602084013567ffffffffffffffff81111561289c5761289b6121c8565b5b6128a8868287016127fe565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6060820160008201516128f660008501826124a8565b50602082015161290960208501826124c1565b50604082015161291c60408501826124c1565b50505050565b600061292e83836128e0565b60608301905092915050565b6000602082019050919050565b6000612952826128b4565b61295c81856128bf565b9350612967836128d0565b8060005b8381101561299857815161297f8882612922565b975061298a8361293a565b92505060018101905061296b565b5085935050505092915050565b600060208201905081810360008301526129bf8184612947565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b606082016000820151612a0960008501826124a8565b506020820151612a1c60208501826124c1565b506040820151612a2f60408501826124c1565b50505050565b6000612a4183836129f3565b60608301905092915050565b6000602082019050919050565b6000612a65826129c7565b612a6f81856129d2565b9350612a7a836129e3565b8060005b83811015612aab578151612a928882612a35565b9750612a9d83612a4d565b925050600181019050612a7e565b5085935050505092915050565b60006020820190508181036000830152612ad28184612a5a565b905092915050565b60008060408385031215612af157612af06121c3565b5b600083013567ffffffffffffffff811115612b0f57612b0e6121c8565b5b612b1b85828601612405565b9250506020612b2c858286016121f6565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b604082016000820151612b7860008501826124a8565b506020820151612b8b60208501826124c1565b50505050565b6000612b9d8383612b62565b60408301905092915050565b6000602082019050919050565b6000612bc182612b36565b612bcb8185612b41565b9350612bd683612b52565b8060005b83811015612c07578151612bee8882612b91565b9750612bf983612ba9565b925050600181019050612bda565b5085935050505092915050565b612c1d816124b7565b82525050565b60006060820190508181036000830152612c3d8186612bb6565b9050612c4c6020830185612c14565b612c596040830184612c14565b949350505050565b600060a0830160008301518482036000860152612c7e82826125a0565b91505060208301518482036020860152612c9882826125a0565b91505060408301518482036040860152612cb282826125a0565b91505060608301518482036060860152612ccc82826125a0565b91505060808301518482036080860152612ce682826125a0565b9150508091505092915050565b60006020820190508181036000830152612d0d8184612c61565b905092915050565b60008115159050919050565b612d2a81612d15565b82525050565b6101a082016000820151612d4760008501826124c1565b506020820151612d5a60208501826124c1565b506040820151612d6d60408501826124c1565b506060820151612d8060608501826124c1565b506080820151612d9360808501826124c1565b5060a0820151612da660a08501826124c1565b5060c0820151612db960c08501826124c1565b5060e0820151612dcc60e08501826124c1565b50610100820151612de16101008501826124c1565b50610120820151612df6610120850182612d21565b50610140820151612e0b6101408501826124c1565b50610160820151612e206101608501826124c1565b50610180820151612e356101808501826124c1565b50505050565b60006101a082019050612e516000830184612d30565b92915050565b6000612e628261216b565b9050919050565b612e7281612e57565b82525050565b6000602082019050612e8d6000830184612e69565b92915050565b600082825260208201905092915050565b7f4e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b6000612eda600983612e93565b9150612ee582612ea4565b602082019050919050565b60006020820190508181036000830152612f0981612ecd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050612f4e816121df565b92915050565b600060208284031215612f6a57612f696121c3565b5b6000612f7884828501612f3f565b91505092915050565b612f8a816124b7565b8114612f9557600080fd5b50565b600081519050612fa781612f81565b92915050565b600060208284031215612fc357612fc26121c3565b5b6000612fd184828501612f98565b91505092915050565b600080fd5b600067ffffffffffffffff821115612ffa57612ff96122f0565b5b613003826122df565b9050602081019050919050565b600061302361301e84612fdf565b612350565b90508281526020810184848401111561303f5761303e612fda565b5b61304a8482856124ec565b509392505050565b600082601f830112613067576130666122da565b5b8151613077848260208601613010565b91505092915050565b600060208284031215613096576130956121c3565b5b600082015167ffffffffffffffff8111156130b4576130b36121c8565b5b6130c084828501613052565b91505092915050565b60006130dc6130d78461236b565b612350565b905080838252602082019050602084028301858111156130ff576130fe612397565b5b835b8181101561312857806131148882612f3f565b845260208401935050602081019050613101565b5050509392505050565b600082601f830112613147576131466122da565b5b81516131578482602086016130c9565b91505092915050565b600060208284031215613176576131756121c3565b5b600082015167ffffffffffffffff811115613194576131936121c8565b5b6131a084828501613132565b91505092915050565b600681106131b657600080fd5b50565b6000815190506131c8816131a9565b92915050565b6000602082840312156131e4576131e36121c3565b5b60006131f2848285016131b9565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613235826124b7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613267576132666131fb565b5b600182019050919050565b600060408201905061328760008301856122b0565b61329460208301846122b0565b9392505050565b60006132a6826124b7565b91506132b1836124b7565b92508282019050808211156132c9576132c86131fb565b5b92915050565b60006132da826124b7565b91506132e5836124b7565b92508282039050818111156132fd576132fc6131fb565b5b92915050565b61330c81612d15565b811461331757600080fd5b50565b60008151905061332981613303565b92915050565b600060208284031215613345576133446121c3565b5b60006133538482850161331a565b9150509291505056fea2646970667358221220df22e0aa4f9eeb04f6821f7d4761023529e1380a94d15d60ebe047d300ec4bcc64736f6c63430008110033", - "linkReferences": {}, - "deployedLinkReferences": {} + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50604051613f6e380380613f6e833981810160405281019061003291906105ec565b83600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100a55760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161009c9190610662565b60405180910390fd5b6100b4816104c560201b60201c565b5082600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633da74fc66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610209919061067d565b600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b47aef1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102da919061067d565b600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166356b54bae6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610387573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ab919061067d565b600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663669554696040518163ffffffff1660e01b8152600401602060405180830381865afa158015610458573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047c919061067d565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050506106aa565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006105b98261058e565b9050919050565b6105c9816105ae565b81146105d457600080fd5b50565b6000815190506105e6816105c0565b92915050565b6000806000806080858703121561060657610605610589565b5b6000610614878288016105d7565b9450506020610625878288016105d7565b9350506040610636878288016105d7565b9250506060610647878288016105d7565b91505092959194509250565b61065c816105ae565b82525050565b60006020820190506106776000830184610653565b92915050565b60006020828403121561069357610692610589565b5b60006106a1848285016105d7565b91505092915050565b6138b5806106b96000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c8063a1ae3fb8116100a2578063c2b58e8811610071578063c2b58e88146102b7578063d88ff1f4146102e8578063d9f38c9914610306578063f2fde38b14610324578063fb372a8f146103405761010b565b8063a1ae3fb814610209578063b4432cea14610239578063b55efa5e14610269578063c1b9a9521461029b5761010b565b80638da5cb5b116100de5780638da5cb5b1461016e5780638e2cfe661461018c57806391c55c3d146101bd5780639dd373b9146101ed5761010b565b806327a3e16b146101105780634cfbab001461012c5780634f51413414610148578063715018a614610164575b600080fd5b61012a60048036038101906101259190612727565b610370565b005b61014660048036038101906101419190612727565b6103bc565b005b610162600480360381019061015d9190612727565b610408565b005b61016c610454565b005b610176610468565b6040516101839190612763565b60405180910390f35b6101a660048036038101906101a19190612727565b610491565b6040516101b4929190612797565b60405180910390f35b6101d760048036038101906101d29190612919565b6105e1565b6040516101e49190612cce565b60405180910390f35b61020760048036038101906102029190612727565b610d4b565b005b610223600480360381019061021e9190612d4b565b610d97565b6040516102309190612e9c565b60405180910390f35b610253600480360381019061024e9190612d4b565b611011565b6040516102609190612faf565b60405180910390f35b610283600480360381019061027e9190612fd1565b61128d565b6040516102929392919061310b565b60405180910390f35b6102b560048036038101906102b09190612727565b611501565b005b6102d160048036038101906102cc9190613149565b61154d565b6040516102df929190613189565b60405180910390f35b6102f06116a3565b6040516102fd9190613278565b60405180910390f35b61030e6119f4565b60405161031b91906133a5565b60405180910390f35b61033e60048036038101906103399190612727565b6121ab565b005b61035a60048036038101906103559190612919565b612231565b6040516103679190613430565b60405180910390f35b6103786123a7565b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6103c46123a7565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6104106123a7565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61045c6123a7565b610466600061242e565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663615f2b71856040518263ffffffff1660e01b81526004016104f19190612763565b602060405180830381865afa15801561050e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105329190613467565b90506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166384725c76866040518263ffffffff1660e01b81526004016105919190612763565b602060405180830381865afa1580156105ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d291906134c0565b90508181935093505050915091565b6060815167ffffffffffffffff8111156105fe576105fd6127d6565b5b60405190808252806020026020018201604052801561063757816020015b6106246124fa565b81526020019060019003908161061c5790505b50905060005b8251811015610d45576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663794c0c686040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d991906134c0565b90506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166253517586858151811061072d5761072c6134ed565b5b60200260200101516040518263ffffffff1660e01b81526004016107519190612763565b602060405180830381865afa15801561076e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107929190613467565b90506040518061012001604052808273ffffffffffffffffffffffffffffffffffffffff168152602001600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166360e5c520846040518263ffffffff1660e01b81526004016108179190612763565b602060405180830381865afa158015610834573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085891906134c0565b8152602001600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663857cdbb8846040518263ffffffff1660e01b81526004016108b89190612763565b600060405180830381865afa1580156108d5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108fe91906135c2565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639ea8082b888781518110610954576109536134ed565b5b60200260200101516040518263ffffffff1660e01b81526004016109789190612763565b600060405180830381865afa158015610995573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109be91906136a2565b8152602001600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314e28d90846040518263ffffffff1660e01b8152600401610a1e9190612763565b602060405180830381865afa158015610a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5f9190613710565b6005811115610a7157610a70612ada565b5b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635267e1d6888781518110610ac757610ac66134ed565b5b60200260200101516040518263ffffffff1660e01b8152600401610aeb9190612763565b602060405180830381865afa158015610b08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2c91906134c0565b8152602001600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663161b07b285856040518363ffffffff1660e01b8152600401610b8e92919061373d565b602060405180830381865afa158015610bab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcf9190613792565b15158152602001600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e5079ddc846040518263ffffffff1660e01b8152600401610c319190612763565b602060405180830381865afa158015610c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7291906134c0565b8152602001600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329cf856485856040518363ffffffff1660e01b8152600401610cd492919061373d565b602060405180830381865afa158015610cf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1591906134c0565b815250848481518110610d2b57610d2a6134ed565b5b60200260200101819052505050808060010191505061063d565b50919050565b610d536123a7565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60608282905067ffffffffffffffff811115610db657610db56127d6565b5b604051908082528060200260200182016040528015610def57816020015b610ddc612570565b815260200190600190039081610dd45790505b50905060005b83839050811015611009576040518060600160405280858584818110610e1e57610e1d6134ed565b5b9050602002016020810190610e339190612727565b73ffffffffffffffffffffffffffffffffffffffff168152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a697ecff878786818110610e9f57610e9e6134ed565b5b9050602002016020810190610eb49190612727565b896040518363ffffffff1660e01b8152600401610ed29291906137bf565b602060405180830381865afa158015610eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1391906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635267e1d6878786818110610f6957610f686134ed565b5b9050602002016020810190610f7e9190612727565b6040518263ffffffff1660e01b8152600401610f9a9190612763565b602060405180830381865afa158015610fb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdb91906134c0565b815250828281518110610ff157610ff06134ed565b5b60200260200101819052508080600101915050610df5565b509392505050565b60608282905067ffffffffffffffff8111156110305761102f6127d6565b5b60405190808252806020026020018201604052801561106957816020015b6110566125a7565b81526020019060019003908161104e5790505b50905060005b83839050811015611285576040518060600160405280858584818110611098576110976134ed565b5b90506020020160208101906110ad9190612727565b73ffffffffffffffffffffffffffffffffffffffff168152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e9ab0300878786818110611119576111186134ed565b5b905060200201602081019061112e9190612727565b896040518363ffffffff1660e01b815260040161114c9291906137bf565b602060405180830381865afa158015611169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118d91906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a42059678787868181106111e3576111e26134ed565b5b90506020020160208101906111f89190612727565b896040518363ffffffff1660e01b81526004016112169291906137bf565b602060405180830381865afa158015611233573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125791906134c0565b81525082828151811061126d5761126c6134ed565b5b6020026020010181905250808060010191505061106f565b509392505050565b6060600080845167ffffffffffffffff8111156112ad576112ac6127d6565b5b6040519080825280602002602001820160405280156112e657816020015b6112d36125de565b8152602001906001900390816112cb5790505b50925060005b855181101561145057600086828151811061130a576113096134ed565b5b602002602001015190506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a697ecff88846040518363ffffffff1660e01b81526004016113739291906137bf565b602060405180830381865afa158015611390573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b491906134c0565b905060405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001828152508684815181106113f4576113f36134ed565b5b60200260200101819052508173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161461144157808461143e9190613817565b93505b505080806001019150506112ec565b5080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635267e1d6866040518263ffffffff1660e01b81526004016114ad9190612763565b602060405180830381865afa1580156114ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ee91906134c0565b6114f8919061384b565b91509250925092565b6115096123a7565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636bda157786866040518363ffffffff1660e01b81526004016115af9291906137bf565b602060405180830381865afa1580156115cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f091906134c0565b90506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663950a651387876040518363ffffffff1660e01b81526004016116519291906137bf565b602060405180830381865afa15801561166e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169291906134c0565b905081819350935050509250929050565b6116ab61260e565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b7ab4db56040518163ffffffff1660e01b8152600401600060405180830381865afa15801561171a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061174391906136a2565b90506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eebc7a396040518163ffffffff1660e01b8152600401600060405180830381865afa1580156117b4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906117dd91906136a2565b905060006117ea83612231565b905060006117f783612231565b90506040518060e00160405280600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663673a2a1f6040518163ffffffff1660e01b8152600401600060405180830381865afa158015611871573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061189a91906136a2565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663df6f55f56040518163ffffffff1660e01b8152600401600060405180830381865afa15801561190c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061193591906136a2565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a5d54f656040518163ffffffff1660e01b8152600401600060405180830381865afa1580156119a7573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906119d091906136a2565b81526020018581526020018381526020018481526020018281525094505050505090565b6119fc61264b565b604051806101a00160405280600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c57a8016040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9991906134c0565b8152602001600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166373f129586040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2f91906134c0565b8152602001600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166348bb1b2d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc591906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663794c0c686040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5b91906134c0565b8152602001600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663df3cecf66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ccd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf191906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fef76436040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8791906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663da7a9b6a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611df9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1d91906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639b03d7446040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb391906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637069e7466040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4991906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f49425016040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdf9190613792565b15158152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166322e3d9866040518163ffffffff1660e01b8152600401602060405180830381865afa158015612053573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207791906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f9a8d8f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210d91906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663028b8bdb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561217f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a391906134c0565b815250905090565b6121b36123a7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036122255760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161221c9190612763565b60405180910390fd5b61222e8161242e565b50565b60606000825167ffffffffffffffff8111156122505761224f6127d6565b5b60405190808252806020026020018201604052801561227e5781602001602082028036833780820191505090505b50905060005b835181101561239d57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ee4d0bc8583815181106122de576122dd6134ed565b5b60200260200101516040518263ffffffff1660e01b81526004016123029190612763565b602060405180830381865afa15801561231f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123439190613467565b828281518110612356576123556134ed565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050612284565b5080915050919050565b6123af6124f2565b73ffffffffffffffffffffffffffffffffffffffff166123cd610468565b73ffffffffffffffffffffffffffffffffffffffff161461242c576123f06124f2565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016124239190612763565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b604051806101200160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160608152602001606081526020016000600581111561254c5761254b612ada565b5b81526020016000815260200160001515815260200160008152602001600081525090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b6040518060e00160405280606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b604051806101a001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126f4826126c9565b9050919050565b612704816126e9565b811461270f57600080fd5b50565b600081359050612721816126fb565b92915050565b60006020828403121561273d5761273c6126bf565b5b600061274b84828501612712565b91505092915050565b61275d816126e9565b82525050565b60006020820190506127786000830184612754565b92915050565b6000819050919050565b6127918161277e565b82525050565b60006040820190506127ac6000830185612754565b6127b96020830184612788565b9392505050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61280e826127c5565b810181811067ffffffffffffffff8211171561282d5761282c6127d6565b5b80604052505050565b60006128406126b5565b905061284c8282612805565b919050565b600067ffffffffffffffff82111561286c5761286b6127d6565b5b602082029050602081019050919050565b600080fd5b600061289561289084612851565b612836565b905080838252602082019050602084028301858111156128b8576128b761287d565b5b835b818110156128e157806128cd8882612712565b8452602084019350506020810190506128ba565b5050509392505050565b600082601f830112612900576128ff6127c0565b5b8135612910848260208601612882565b91505092915050565b60006020828403121561292f5761292e6126bf565b5b600082013567ffffffffffffffff81111561294d5761294c6126c4565b5b612959848285016128eb565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612997816126e9565b82525050565b6129a68161277e565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129e65780820151818401526020810190506129cb565b60008484015250505050565b60006129fd826129ac565b612a0781856129b7565b9350612a178185602086016129c8565b612a20816127c5565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000612a63838361298e565b60208301905092915050565b6000602082019050919050565b6000612a8782612a2b565b612a918185612a36565b9350612a9c83612a47565b8060005b83811015612acd578151612ab48882612a57565b9750612abf83612a6f565b925050600181019050612aa0565b5085935050505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60068110612b1a57612b19612ada565b5b50565b6000819050612b2b82612b09565b919050565b6000612b3b82612b1d565b9050919050565b612b4b81612b30565b82525050565b60008115159050919050565b612b6681612b51565b82525050565b600061012083016000830151612b85600086018261298e565b506020830151612b98602086018261299d565b5060408301518482036040860152612bb082826129f2565b91505060608301518482036060860152612bca8282612a7c565b9150506080830151612bdf6080860182612b42565b5060a0830151612bf260a086018261299d565b5060c0830151612c0560c0860182612b5d565b5060e0830151612c1860e086018261299d565b50610100830151612c2d61010086018261299d565b508091505092915050565b6000612c448383612b6c565b905092915050565b6000602082019050919050565b6000612c6482612962565b612c6e818561296d565b935083602082028501612c808561297e565b8060005b85811015612cbc5784840389528151612c9d8582612c38565b9450612ca883612c4c565b925060208a01995050600181019050612c84565b50829750879550505050505092915050565b60006020820190508181036000830152612ce88184612c59565b905092915050565b600080fd5b60008083601f840112612d0b57612d0a6127c0565b5b8235905067ffffffffffffffff811115612d2857612d27612cf0565b5b602083019150836020820283011115612d4457612d4361287d565b5b9250929050565b600080600060408486031215612d6457612d636126bf565b5b6000612d7286828701612712565b935050602084013567ffffffffffffffff811115612d9357612d926126c4565b5b612d9f86828701612cf5565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b606082016000820151612ded600085018261298e565b506020820151612e00602085018261299d565b506040820151612e13604085018261299d565b50505050565b6000612e258383612dd7565b60608301905092915050565b6000602082019050919050565b6000612e4982612dab565b612e538185612db6565b9350612e5e83612dc7565b8060005b83811015612e8f578151612e768882612e19565b9750612e8183612e31565b925050600181019050612e62565b5085935050505092915050565b60006020820190508181036000830152612eb68184612e3e565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b606082016000820151612f00600085018261298e565b506020820151612f13602085018261299d565b506040820151612f26604085018261299d565b50505050565b6000612f388383612eea565b60608301905092915050565b6000602082019050919050565b6000612f5c82612ebe565b612f668185612ec9565b9350612f7183612eda565b8060005b83811015612fa2578151612f898882612f2c565b9750612f9483612f44565b925050600181019050612f75565b5085935050505092915050565b60006020820190508181036000830152612fc98184612f51565b905092915050565b60008060408385031215612fe857612fe76126bf565b5b600083013567ffffffffffffffff811115613006576130056126c4565b5b613012858286016128eb565b925050602061302385828601612712565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60408201600082015161306f600085018261298e565b506020820151613082602085018261299d565b50505050565b60006130948383613059565b60408301905092915050565b6000602082019050919050565b60006130b88261302d565b6130c28185613038565b93506130cd83613049565b8060005b838110156130fe5781516130e58882613088565b97506130f0836130a0565b9250506001810190506130d1565b5085935050505092915050565b6000606082019050818103600083015261312581866130ad565b90506131346020830185612788565b6131416040830184612788565b949350505050565b600080604083850312156131605761315f6126bf565b5b600061316e85828601612712565b925050602061317f85828601612712565b9150509250929050565b600060408201905061319e6000830185612788565b6131ab6020830184612788565b9392505050565b600060e08301600083015184820360008601526131cf8282612a7c565b915050602083015184820360208601526131e98282612a7c565b915050604083015184820360408601526132038282612a7c565b9150506060830151848203606086015261321d8282612a7c565b915050608083015184820360808601526132378282612a7c565b91505060a083015184820360a08601526132518282612a7c565b91505060c083015184820360c086015261326b8282612a7c565b9150508091505092915050565b6000602082019050818103600083015261329281846131b2565b905092915050565b6101a0820160008201516132b1600085018261299d565b5060208201516132c4602085018261299d565b5060408201516132d7604085018261299d565b5060608201516132ea606085018261299d565b5060808201516132fd608085018261299d565b5060a082015161331060a085018261299d565b5060c082015161332360c085018261299d565b5060e082015161333660e085018261299d565b5061010082015161334b61010085018261299d565b50610120820151613360610120850182612b5d565b5061014082015161337561014085018261299d565b5061016082015161338a61016085018261299d565b5061018082015161339f61018085018261299d565b50505050565b60006101a0820190506133bb600083018461329a565b92915050565b600082825260208201905092915050565b60006133dd82612a2b565b6133e781856133c1565b93506133f283612a47565b8060005b8381101561342357815161340a8882612a57565b975061341583612a6f565b9250506001810190506133f6565b5085935050505092915050565b6000602082019050818103600083015261344a81846133d2565b905092915050565b600081519050613461816126fb565b92915050565b60006020828403121561347d5761347c6126bf565b5b600061348b84828501613452565b91505092915050565b61349d8161277e565b81146134a857600080fd5b50565b6000815190506134ba81613494565b92915050565b6000602082840312156134d6576134d56126bf565b5b60006134e4848285016134ab565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600067ffffffffffffffff82111561353c5761353b6127d6565b5b613545826127c5565b9050602081019050919050565b600061356561356084613521565b612836565b9050828152602081018484840111156135815761358061351c565b5b61358c8482856129c8565b509392505050565b600082601f8301126135a9576135a86127c0565b5b81516135b9848260208601613552565b91505092915050565b6000602082840312156135d8576135d76126bf565b5b600082015167ffffffffffffffff8111156135f6576135f56126c4565b5b61360284828501613594565b91505092915050565b600061361e61361984612851565b612836565b905080838252602082019050602084028301858111156136415761364061287d565b5b835b8181101561366a57806136568882613452565b845260208401935050602081019050613643565b5050509392505050565b600082601f830112613689576136886127c0565b5b815161369984826020860161360b565b91505092915050565b6000602082840312156136b8576136b76126bf565b5b600082015167ffffffffffffffff8111156136d6576136d56126c4565b5b6136e284828501613674565b91505092915050565b600681106136f857600080fd5b50565b60008151905061370a816136eb565b92915050565b600060208284031215613726576137256126bf565b5b6000613734848285016136fb565b91505092915050565b60006040820190506137526000830185612788565b61375f6020830184612754565b9392505050565b61376f81612b51565b811461377a57600080fd5b50565b60008151905061378c81613766565b92915050565b6000602082840312156137a8576137a76126bf565b5b60006137b68482850161377d565b91505092915050565b60006040820190506137d46000830185612754565b6137e16020830184612754565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138228261277e565b915061382d8361277e565b9250828201905080821115613845576138446137e8565b5b92915050565b60006138568261277e565b91506138618361277e565b9250828203905081811115613879576138786137e8565b5b9291505056fea2646970667358221220f30bde26f3a12c9a686c1ba434b949a66a859be1618a20385994959b861fd47564736f6c63430008190033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061010b5760003560e01c8063a1ae3fb8116100a2578063c2b58e8811610071578063c2b58e88146102b7578063d88ff1f4146102e8578063d9f38c9914610306578063f2fde38b14610324578063fb372a8f146103405761010b565b8063a1ae3fb814610209578063b4432cea14610239578063b55efa5e14610269578063c1b9a9521461029b5761010b565b80638da5cb5b116100de5780638da5cb5b1461016e5780638e2cfe661461018c57806391c55c3d146101bd5780639dd373b9146101ed5761010b565b806327a3e16b146101105780634cfbab001461012c5780634f51413414610148578063715018a614610164575b600080fd5b61012a60048036038101906101259190612727565b610370565b005b61014660048036038101906101419190612727565b6103bc565b005b610162600480360381019061015d9190612727565b610408565b005b61016c610454565b005b610176610468565b6040516101839190612763565b60405180910390f35b6101a660048036038101906101a19190612727565b610491565b6040516101b4929190612797565b60405180910390f35b6101d760048036038101906101d29190612919565b6105e1565b6040516101e49190612cce565b60405180910390f35b61020760048036038101906102029190612727565b610d4b565b005b610223600480360381019061021e9190612d4b565b610d97565b6040516102309190612e9c565b60405180910390f35b610253600480360381019061024e9190612d4b565b611011565b6040516102609190612faf565b60405180910390f35b610283600480360381019061027e9190612fd1565b61128d565b6040516102929392919061310b565b60405180910390f35b6102b560048036038101906102b09190612727565b611501565b005b6102d160048036038101906102cc9190613149565b61154d565b6040516102df929190613189565b60405180910390f35b6102f06116a3565b6040516102fd9190613278565b60405180910390f35b61030e6119f4565b60405161031b91906133a5565b60405180910390f35b61033e60048036038101906103399190612727565b6121ab565b005b61035a60048036038101906103559190612919565b612231565b6040516103679190613430565b60405180910390f35b6103786123a7565b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6103c46123a7565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6104106123a7565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61045c6123a7565b610466600061242e565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663615f2b71856040518263ffffffff1660e01b81526004016104f19190612763565b602060405180830381865afa15801561050e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105329190613467565b90506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166384725c76866040518263ffffffff1660e01b81526004016105919190612763565b602060405180830381865afa1580156105ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d291906134c0565b90508181935093505050915091565b6060815167ffffffffffffffff8111156105fe576105fd6127d6565b5b60405190808252806020026020018201604052801561063757816020015b6106246124fa565b81526020019060019003908161061c5790505b50905060005b8251811015610d45576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663794c0c686040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d991906134c0565b90506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166253517586858151811061072d5761072c6134ed565b5b60200260200101516040518263ffffffff1660e01b81526004016107519190612763565b602060405180830381865afa15801561076e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107929190613467565b90506040518061012001604052808273ffffffffffffffffffffffffffffffffffffffff168152602001600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166360e5c520846040518263ffffffff1660e01b81526004016108179190612763565b602060405180830381865afa158015610834573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085891906134c0565b8152602001600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663857cdbb8846040518263ffffffff1660e01b81526004016108b89190612763565b600060405180830381865afa1580156108d5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108fe91906135c2565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639ea8082b888781518110610954576109536134ed565b5b60200260200101516040518263ffffffff1660e01b81526004016109789190612763565b600060405180830381865afa158015610995573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109be91906136a2565b8152602001600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314e28d90846040518263ffffffff1660e01b8152600401610a1e9190612763565b602060405180830381865afa158015610a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5f9190613710565b6005811115610a7157610a70612ada565b5b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635267e1d6888781518110610ac757610ac66134ed565b5b60200260200101516040518263ffffffff1660e01b8152600401610aeb9190612763565b602060405180830381865afa158015610b08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2c91906134c0565b8152602001600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663161b07b285856040518363ffffffff1660e01b8152600401610b8e92919061373d565b602060405180830381865afa158015610bab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcf9190613792565b15158152602001600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e5079ddc846040518263ffffffff1660e01b8152600401610c319190612763565b602060405180830381865afa158015610c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7291906134c0565b8152602001600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329cf856485856040518363ffffffff1660e01b8152600401610cd492919061373d565b602060405180830381865afa158015610cf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1591906134c0565b815250848481518110610d2b57610d2a6134ed565b5b60200260200101819052505050808060010191505061063d565b50919050565b610d536123a7565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60608282905067ffffffffffffffff811115610db657610db56127d6565b5b604051908082528060200260200182016040528015610def57816020015b610ddc612570565b815260200190600190039081610dd45790505b50905060005b83839050811015611009576040518060600160405280858584818110610e1e57610e1d6134ed565b5b9050602002016020810190610e339190612727565b73ffffffffffffffffffffffffffffffffffffffff168152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a697ecff878786818110610e9f57610e9e6134ed565b5b9050602002016020810190610eb49190612727565b896040518363ffffffff1660e01b8152600401610ed29291906137bf565b602060405180830381865afa158015610eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1391906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635267e1d6878786818110610f6957610f686134ed565b5b9050602002016020810190610f7e9190612727565b6040518263ffffffff1660e01b8152600401610f9a9190612763565b602060405180830381865afa158015610fb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdb91906134c0565b815250828281518110610ff157610ff06134ed565b5b60200260200101819052508080600101915050610df5565b509392505050565b60608282905067ffffffffffffffff8111156110305761102f6127d6565b5b60405190808252806020026020018201604052801561106957816020015b6110566125a7565b81526020019060019003908161104e5790505b50905060005b83839050811015611285576040518060600160405280858584818110611098576110976134ed565b5b90506020020160208101906110ad9190612727565b73ffffffffffffffffffffffffffffffffffffffff168152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e9ab0300878786818110611119576111186134ed565b5b905060200201602081019061112e9190612727565b896040518363ffffffff1660e01b815260040161114c9291906137bf565b602060405180830381865afa158015611169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118d91906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a42059678787868181106111e3576111e26134ed565b5b90506020020160208101906111f89190612727565b896040518363ffffffff1660e01b81526004016112169291906137bf565b602060405180830381865afa158015611233573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125791906134c0565b81525082828151811061126d5761126c6134ed565b5b6020026020010181905250808060010191505061106f565b509392505050565b6060600080845167ffffffffffffffff8111156112ad576112ac6127d6565b5b6040519080825280602002602001820160405280156112e657816020015b6112d36125de565b8152602001906001900390816112cb5790505b50925060005b855181101561145057600086828151811061130a576113096134ed565b5b602002602001015190506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a697ecff88846040518363ffffffff1660e01b81526004016113739291906137bf565b602060405180830381865afa158015611390573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b491906134c0565b905060405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001828152508684815181106113f4576113f36134ed565b5b60200260200101819052508173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161461144157808461143e9190613817565b93505b505080806001019150506112ec565b5080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635267e1d6866040518263ffffffff1660e01b81526004016114ad9190612763565b602060405180830381865afa1580156114ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ee91906134c0565b6114f8919061384b565b91509250925092565b6115096123a7565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636bda157786866040518363ffffffff1660e01b81526004016115af9291906137bf565b602060405180830381865afa1580156115cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f091906134c0565b90506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663950a651387876040518363ffffffff1660e01b81526004016116519291906137bf565b602060405180830381865afa15801561166e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169291906134c0565b905081819350935050509250929050565b6116ab61260e565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b7ab4db56040518163ffffffff1660e01b8152600401600060405180830381865afa15801561171a573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061174391906136a2565b90506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eebc7a396040518163ffffffff1660e01b8152600401600060405180830381865afa1580156117b4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906117dd91906136a2565b905060006117ea83612231565b905060006117f783612231565b90506040518060e00160405280600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663673a2a1f6040518163ffffffff1660e01b8152600401600060405180830381865afa158015611871573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061189a91906136a2565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663df6f55f56040518163ffffffff1660e01b8152600401600060405180830381865afa15801561190c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061193591906136a2565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a5d54f656040518163ffffffff1660e01b8152600401600060405180830381865afa1580156119a7573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906119d091906136a2565b81526020018581526020018381526020018481526020018281525094505050505090565b6119fc61264b565b604051806101a00160405280600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c57a8016040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9991906134c0565b8152602001600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166373f129586040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2f91906134c0565b8152602001600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166348bb1b2d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc591906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663794c0c686040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5b91906134c0565b8152602001600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663df3cecf66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ccd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf191906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fef76436040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8791906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663da7a9b6a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611df9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1d91906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639b03d7446040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb391906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637069e7466040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4991906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f49425016040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdf9190613792565b15158152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166322e3d9866040518163ffffffff1660e01b8152600401602060405180830381865afa158015612053573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207791906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f9a8d8f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210d91906134c0565b8152602001600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663028b8bdb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561217f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a391906134c0565b815250905090565b6121b36123a7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036122255760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161221c9190612763565b60405180910390fd5b61222e8161242e565b50565b60606000825167ffffffffffffffff8111156122505761224f6127d6565b5b60405190808252806020026020018201604052801561227e5781602001602082028036833780820191505090505b50905060005b835181101561239d57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ee4d0bc8583815181106122de576122dd6134ed565b5b60200260200101516040518263ffffffff1660e01b81526004016123029190612763565b602060405180830381865afa15801561231f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123439190613467565b828281518110612356576123556134ed565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050612284565b5080915050919050565b6123af6124f2565b73ffffffffffffffffffffffffffffffffffffffff166123cd610468565b73ffffffffffffffffffffffffffffffffffffffff161461242c576123f06124f2565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016124239190612763565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b604051806101200160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160608152602001606081526020016000600581111561254c5761254b612ada565b5b81526020016000815260200160001515815260200160008152602001600081525090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b6040518060e00160405280606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b604051806101a001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126f4826126c9565b9050919050565b612704816126e9565b811461270f57600080fd5b50565b600081359050612721816126fb565b92915050565b60006020828403121561273d5761273c6126bf565b5b600061274b84828501612712565b91505092915050565b61275d816126e9565b82525050565b60006020820190506127786000830184612754565b92915050565b6000819050919050565b6127918161277e565b82525050565b60006040820190506127ac6000830185612754565b6127b96020830184612788565b9392505050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61280e826127c5565b810181811067ffffffffffffffff8211171561282d5761282c6127d6565b5b80604052505050565b60006128406126b5565b905061284c8282612805565b919050565b600067ffffffffffffffff82111561286c5761286b6127d6565b5b602082029050602081019050919050565b600080fd5b600061289561289084612851565b612836565b905080838252602082019050602084028301858111156128b8576128b761287d565b5b835b818110156128e157806128cd8882612712565b8452602084019350506020810190506128ba565b5050509392505050565b600082601f830112612900576128ff6127c0565b5b8135612910848260208601612882565b91505092915050565b60006020828403121561292f5761292e6126bf565b5b600082013567ffffffffffffffff81111561294d5761294c6126c4565b5b612959848285016128eb565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612997816126e9565b82525050565b6129a68161277e565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129e65780820151818401526020810190506129cb565b60008484015250505050565b60006129fd826129ac565b612a0781856129b7565b9350612a178185602086016129c8565b612a20816127c5565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000612a63838361298e565b60208301905092915050565b6000602082019050919050565b6000612a8782612a2b565b612a918185612a36565b9350612a9c83612a47565b8060005b83811015612acd578151612ab48882612a57565b9750612abf83612a6f565b925050600181019050612aa0565b5085935050505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60068110612b1a57612b19612ada565b5b50565b6000819050612b2b82612b09565b919050565b6000612b3b82612b1d565b9050919050565b612b4b81612b30565b82525050565b60008115159050919050565b612b6681612b51565b82525050565b600061012083016000830151612b85600086018261298e565b506020830151612b98602086018261299d565b5060408301518482036040860152612bb082826129f2565b91505060608301518482036060860152612bca8282612a7c565b9150506080830151612bdf6080860182612b42565b5060a0830151612bf260a086018261299d565b5060c0830151612c0560c0860182612b5d565b5060e0830151612c1860e086018261299d565b50610100830151612c2d61010086018261299d565b508091505092915050565b6000612c448383612b6c565b905092915050565b6000602082019050919050565b6000612c6482612962565b612c6e818561296d565b935083602082028501612c808561297e565b8060005b85811015612cbc5784840389528151612c9d8582612c38565b9450612ca883612c4c565b925060208a01995050600181019050612c84565b50829750879550505050505092915050565b60006020820190508181036000830152612ce88184612c59565b905092915050565b600080fd5b60008083601f840112612d0b57612d0a6127c0565b5b8235905067ffffffffffffffff811115612d2857612d27612cf0565b5b602083019150836020820283011115612d4457612d4361287d565b5b9250929050565b600080600060408486031215612d6457612d636126bf565b5b6000612d7286828701612712565b935050602084013567ffffffffffffffff811115612d9357612d926126c4565b5b612d9f86828701612cf5565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b606082016000820151612ded600085018261298e565b506020820151612e00602085018261299d565b506040820151612e13604085018261299d565b50505050565b6000612e258383612dd7565b60608301905092915050565b6000602082019050919050565b6000612e4982612dab565b612e538185612db6565b9350612e5e83612dc7565b8060005b83811015612e8f578151612e768882612e19565b9750612e8183612e31565b925050600181019050612e62565b5085935050505092915050565b60006020820190508181036000830152612eb68184612e3e565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b606082016000820151612f00600085018261298e565b506020820151612f13602085018261299d565b506040820151612f26604085018261299d565b50505050565b6000612f388383612eea565b60608301905092915050565b6000602082019050919050565b6000612f5c82612ebe565b612f668185612ec9565b9350612f7183612eda565b8060005b83811015612fa2578151612f898882612f2c565b9750612f9483612f44565b925050600181019050612f75565b5085935050505092915050565b60006020820190508181036000830152612fc98184612f51565b905092915050565b60008060408385031215612fe857612fe76126bf565b5b600083013567ffffffffffffffff811115613006576130056126c4565b5b613012858286016128eb565b925050602061302385828601612712565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60408201600082015161306f600085018261298e565b506020820151613082602085018261299d565b50505050565b60006130948383613059565b60408301905092915050565b6000602082019050919050565b60006130b88261302d565b6130c28185613038565b93506130cd83613049565b8060005b838110156130fe5781516130e58882613088565b97506130f0836130a0565b9250506001810190506130d1565b5085935050505092915050565b6000606082019050818103600083015261312581866130ad565b90506131346020830185612788565b6131416040830184612788565b949350505050565b600080604083850312156131605761315f6126bf565b5b600061316e85828601612712565b925050602061317f85828601612712565b9150509250929050565b600060408201905061319e6000830185612788565b6131ab6020830184612788565b9392505050565b600060e08301600083015184820360008601526131cf8282612a7c565b915050602083015184820360208601526131e98282612a7c565b915050604083015184820360408601526132038282612a7c565b9150506060830151848203606086015261321d8282612a7c565b915050608083015184820360808601526132378282612a7c565b91505060a083015184820360a08601526132518282612a7c565b91505060c083015184820360c086015261326b8282612a7c565b9150508091505092915050565b6000602082019050818103600083015261329281846131b2565b905092915050565b6101a0820160008201516132b1600085018261299d565b5060208201516132c4602085018261299d565b5060408201516132d7604085018261299d565b5060608201516132ea606085018261299d565b5060808201516132fd608085018261299d565b5060a082015161331060a085018261299d565b5060c082015161332360c085018261299d565b5060e082015161333660e085018261299d565b5061010082015161334b61010085018261299d565b50610120820151613360610120850182612b5d565b5061014082015161337561014085018261299d565b5061016082015161338a61016085018261299d565b5061018082015161339f61018085018261299d565b50505050565b60006101a0820190506133bb600083018461329a565b92915050565b600082825260208201905092915050565b60006133dd82612a2b565b6133e781856133c1565b93506133f283612a47565b8060005b8381101561342357815161340a8882612a57565b975061341583612a6f565b9250506001810190506133f6565b5085935050505092915050565b6000602082019050818103600083015261344a81846133d2565b905092915050565b600081519050613461816126fb565b92915050565b60006020828403121561347d5761347c6126bf565b5b600061348b84828501613452565b91505092915050565b61349d8161277e565b81146134a857600080fd5b50565b6000815190506134ba81613494565b92915050565b6000602082840312156134d6576134d56126bf565b5b60006134e4848285016134ab565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600067ffffffffffffffff82111561353c5761353b6127d6565b5b613545826127c5565b9050602081019050919050565b600061356561356084613521565b612836565b9050828152602081018484840111156135815761358061351c565b5b61358c8482856129c8565b509392505050565b600082601f8301126135a9576135a86127c0565b5b81516135b9848260208601613552565b91505092915050565b6000602082840312156135d8576135d76126bf565b5b600082015167ffffffffffffffff8111156135f6576135f56126c4565b5b61360284828501613594565b91505092915050565b600061361e61361984612851565b612836565b905080838252602082019050602084028301858111156136415761364061287d565b5b835b8181101561366a57806136568882613452565b845260208401935050602081019050613643565b5050509392505050565b600082601f830112613689576136886127c0565b5b815161369984826020860161360b565b91505092915050565b6000602082840312156136b8576136b76126bf565b5b600082015167ffffffffffffffff8111156136d6576136d56126c4565b5b6136e284828501613674565b91505092915050565b600681106136f857600080fd5b50565b60008151905061370a816136eb565b92915050565b600060208284031215613726576137256126bf565b5b6000613734848285016136fb565b91505092915050565b60006040820190506137526000830185612788565b61375f6020830184612754565b9392505050565b61376f81612b51565b811461377a57600080fd5b50565b60008151905061378c81613766565b92915050565b6000602082840312156137a8576137a76126bf565b5b60006137b68482850161377d565b91505092915050565b60006040820190506137d46000830185612754565b6137e16020830184612754565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138228261277e565b915061382d8361277e565b9250828201905080821115613845576138446137e8565b5b92915050565b60006138568261277e565b91506138618361277e565b9250828203905081811115613879576138786137e8565b5b9291505056fea2646970667358221220f30bde26f3a12c9a686c1ba434b949a66a859be1618a20385994959b861fd47564736f6c63430008190033", + "linkReferences": {}, + "deployedLinkReferences": {} } \ No newline at end of file diff --git a/src/contexts/contracts/HbbftAggregator.ts b/src/contexts/contracts/HbbftAggregator.ts index 3d9097b..34cf1f3 100644 --- a/src/contexts/contracts/HbbftAggregator.ts +++ b/src/contexts/contracts/HbbftAggregator.ts @@ -21,6 +21,13 @@ export interface EventOptions { topics?: string[]; } +export type OwnershipTransferred = ContractEventLog<{ + previousOwner: string; + newOwner: string; + 0: string; + 1: string; +}>; + export interface HbbftAggregator extends BaseContract { constructor( jsonInterface: any[], @@ -29,10 +36,8 @@ export interface HbbftAggregator extends BaseContract { ): HbbftAggregator; clone(): HbbftAggregator; methods: { - br(): NonPayableTransactionObject; - getAllPools(): NonPayableTransactionObject< - [string[], string[], string[], string[], string[]] + [string[], string[], string[], string[], string[], string[], string[]] >; getDelegationsData( @@ -65,12 +70,31 @@ export interface HbbftAggregator extends BaseContract { ] >; + getNodeOperatorData(stakingAddress: string): NonPayableTransactionObject<{ + 0: string; + 1: string; + }>; + getPoolsData( _sAs: string[] ): NonPayableTransactionObject< - [string, string, string, string[], string, string][] + [ + string, + string, + string, + string[], + string, + string, + boolean, + string, + string + ][] >; + getStakingAddresses( + miningAddresses: string[] + ): NonPayableTransactionObject; + getUserOrderedWithdraws( _user: string, _pools: string[] @@ -81,10 +105,18 @@ export interface HbbftAggregator extends BaseContract { _pools: string[] ): NonPayableTransactionObject<[string, string, string][]>; - kh(): NonPayableTransactionObject; + getWithdrawableAmounts( + poolStAddress: string, + user: string + ): NonPayableTransactionObject<{ + 0: string; + 1: string; + }>; owner(): NonPayableTransactionObject; + renounceOwnership(): NonPayableTransactionObject; + setBlockRewardContract(_br: string): NonPayableTransactionObject; setKeygenHistoryContract(_kh: string): NonPayableTransactionObject; @@ -95,13 +127,22 @@ export interface HbbftAggregator extends BaseContract { setValidatorsSetContract(_vs: string): NonPayableTransactionObject; - st(): NonPayableTransactionObject; - - tp(): NonPayableTransactionObject; - - vs(): NonPayableTransactionObject; + transferOwnership(newOwner: string): NonPayableTransactionObject; }; events: { + OwnershipTransferred(cb?: Callback): EventEmitter; + OwnershipTransferred( + options?: EventOptions, + cb?: Callback + ): EventEmitter; + allEvents(options?: EventOptions, cb?: Callback): EventEmitter; }; + + once(event: "OwnershipTransferred", cb: Callback): void; + once( + event: "OwnershipTransferred", + options: EventOptions, + cb: Callback + ): void; } diff --git a/src/index.css b/src/index.css index 75b9a50..0f43a53 100644 --- a/src/index.css +++ b/src/index.css @@ -128,4 +128,11 @@ body { w3m-modal { z-index: 1001; +} + +button:disabled { + background-color: #cccccc; /* Gray background for disabled button */ + color: #666666; /* Light gray text color */ + cursor: not-allowed; /* Show 'not allowed' cursor */ + opacity: 0.6; /* Optional: Make the button semi-transparent */ } \ No newline at end of file diff --git a/src/layout/Navbar/index.tsx b/src/layout/Navbar/index.tsx index 749ac6f..f34f98e 100644 --- a/src/layout/Navbar/index.tsx +++ b/src/layout/Navbar/index.tsx @@ -46,11 +46,11 @@ const NavBar: React.FC = () => { - {web3Context.userWallet && web3Context.userWallet.myAddr ? ( - {startTransition(() => {navigate('dao')})}} className="nav-link w-nav-link">DAO - ) : ( - - )} + {web3Context.userWallet && web3Context.userWallet.myAddr ? ( + {startTransition(() => {navigate('dao')})}} className="nav-link w-nav-link">DAO + ) : ( + + )}
diff --git a/src/pages/Home/styles.module.css b/src/pages/Home/styles.module.css index c0fa43b..b0a2f2a 100644 --- a/src/pages/Home/styles.module.css +++ b/src/pages/Home/styles.module.css @@ -250,6 +250,7 @@ h1 { color: #0145b2; text-align: left; height: 80px; + font-weight: bold; } .styledTable th,