From c27712a6d31e897a599bf553e15e0278fa6bad20 Mon Sep 17 00:00:00 2001 From: bitbeckers Date: Fri, 3 Feb 2023 16:00:07 +0100 Subject: [PATCH] fix(todos): fux display, close button --- app/.graphclient/index.ts | 40 +- app/.graphclient/schema.graphql | 16 + .../sources/fux/introspectionSchema.ts | 288 ++++ app/.graphclient/sources/fux/schema.graphql | 16 + app/.graphclient/sources/fux/types.ts | 16 + app/components/FUX/ValueReviewForm/index.tsx | 29 +- app/graph/workstreams.graphql | 24 +- app/hooks/resolution.ts | 39 +- app/pages/workstream/[workstreamID].tsx | 63 +- summon-evm/.openzeppelin/goerli.json | 1266 +++++++++++++++++ summon-evm/contracts/FUX.sol | 13 +- .../test/fux/fux.workstream.behavior.ts | 4 +- .../types/factories/contracts/FUX__factory.ts | 2 +- 13 files changed, 1737 insertions(+), 79 deletions(-) diff --git a/app/.graphclient/index.ts b/app/.graphclient/index.ts index 96bacf5..47a53af 100644 --- a/app/.graphclient/index.ts +++ b/app/.graphclient/index.ts @@ -136,6 +136,8 @@ export type Evaluation_filter = { ratings_not_contains_nocase?: InputMaybe>; /** Filter for the block changed event. */ _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; }; export type Evaluation_orderBy = @@ -213,6 +215,8 @@ export type FuxGiven_filter = { balance_not_in?: InputMaybe>; /** Filter for the block changed event. */ _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; }; export type FuxGiven_orderBy = @@ -650,6 +654,8 @@ export type TokenBalance_filter = { balance_not_in?: InputMaybe>; /** Filter for the block changed event. */ _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; }; export type TokenBalance_orderBy = @@ -710,6 +716,8 @@ export type Token_filter = { tokenBalances_?: InputMaybe; /** Filter for the block changed event. */ _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; }; export type Token_orderBy = @@ -813,6 +821,8 @@ export type UserWorkstream_filter = { workstream_?: InputMaybe; /** Filter for the block changed event. */ _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; }; export type UserWorkstream_orderBy = @@ -846,6 +856,8 @@ export type User_filter = { rewards_not_in?: InputMaybe>; /** Filter for the block changed event. */ _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; }; export type User_orderBy = @@ -924,6 +936,8 @@ export type VFuxWorkstream_filter = { balance_not_in?: InputMaybe>; /** Filter for the block changed event. */ _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; }; export type VFuxWorkstream_orderBy = @@ -1046,6 +1060,8 @@ export type Workstream_filter = { resolved_not_in?: InputMaybe>; /** Filter for the block changed event. */ _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; }; export type Workstream_orderBy = @@ -1729,9 +1745,12 @@ export type WorkstreamByIDQueryVariables = Exact<{ export type WorkstreamByIDQuery = { workstream?: Maybe<( Pick - & { contributors?: Maybe>>, coordinator?: Maybe>, evaluations?: Maybe + & { user: Pick } + )>>, coordinator?: Maybe>, evaluations?: Maybe - & { contributors: Array> } + & { creator: Pick, contributors: Array> } )>>, fuxGiven?: Maybe & { user: Pick } @@ -1740,9 +1759,12 @@ export type WorkstreamByIDQuery = { workstream?: Maybe<( export type WorkstreamByIDFragmentFragment = ( Pick - & { contributors?: Maybe>>, coordinator?: Maybe>, evaluations?: Maybe + & { user: Pick } + )>>, coordinator?: Maybe>, evaluations?: Maybe - & { contributors: Array> } + & { creator: Pick, contributors: Array> } )>>, fuxGiven?: Maybe & { user: Pick } @@ -1855,7 +1877,7 @@ export const WorkstreamsByUserFragmentFragmentDoc = gql` export const WorkstreamByIDFragmentFragmentDoc = gql` fragment WorkstreamByIDFragment on Workstream { contributors { - id + ...ContributorFragment } coordinator { id @@ -1866,10 +1888,7 @@ export const WorkstreamByIDFragmentFragmentDoc = gql` name resolved evaluations { - contributors { - id - } - ratings + ...EvaluationFragment } fuxGiven { balance @@ -1878,7 +1897,8 @@ export const WorkstreamByIDFragmentFragmentDoc = gql` } } } - ` as unknown as DocumentNode; + ${ContributorFragmentFragmentDoc} +${EvaluationFragmentFragmentDoc}` as unknown as DocumentNode; export const BalancesDocument = gql` query Balances($address: ID!) @live { user(id: $address) { diff --git a/app/.graphclient/schema.graphql b/app/.graphclient/schema.graphql index 4c06ad1..3c3f597 100644 --- a/app/.graphclient/schema.graphql +++ b/app/.graphclient/schema.graphql @@ -102,6 +102,8 @@ input Evaluation_filter { ratings_not_contains_nocase: [BigInt!] """Filter for the block changed event.""" _change_block: BlockChangedFilter + and: [Evaluation_filter] + or: [Evaluation_filter] } enum Evaluation_orderBy { @@ -180,6 +182,8 @@ input FuxGiven_filter { balance_not_in: [BigInt!] """Filter for the block changed event.""" _change_block: BlockChangedFilter + and: [FuxGiven_filter] + or: [FuxGiven_filter] } enum FuxGiven_orderBy { @@ -696,6 +700,8 @@ input TokenBalance_filter { balance_not_in: [BigInt!] """Filter for the block changed event.""" _change_block: BlockChangedFilter + and: [TokenBalance_filter] + or: [TokenBalance_filter] } enum TokenBalance_orderBy { @@ -757,6 +763,8 @@ input Token_filter { tokenBalances_: TokenBalance_filter """Filter for the block changed event.""" _change_block: BlockChangedFilter + and: [Token_filter] + or: [Token_filter] } enum Token_orderBy { @@ -834,6 +842,8 @@ input UserWorkstream_filter { workstream_: Workstream_filter """Filter for the block changed event.""" _change_block: BlockChangedFilter + and: [UserWorkstream_filter] + or: [UserWorkstream_filter] } enum UserWorkstream_orderBy { @@ -868,6 +878,8 @@ input User_filter { rewards_not_in: [BigInt!] """Filter for the block changed event.""" _change_block: BlockChangedFilter + and: [User_filter] + or: [User_filter] } enum User_orderBy { @@ -947,6 +959,8 @@ input VFuxWorkstream_filter { balance_not_in: [BigInt!] """Filter for the block changed event.""" _change_block: BlockChangedFilter + and: [VFuxWorkstream_filter] + or: [VFuxWorkstream_filter] } enum VFuxWorkstream_orderBy { @@ -1043,6 +1057,8 @@ input Workstream_filter { resolved_not_in: [Boolean!] """Filter for the block changed event.""" _change_block: BlockChangedFilter + and: [Workstream_filter] + or: [Workstream_filter] } enum Workstream_orderBy { diff --git a/app/.graphclient/sources/fux/introspectionSchema.ts b/app/.graphclient/sources/fux/introspectionSchema.ts index 3524ffa..a802821 100644 --- a/app/.graphclient/sources/fux/introspectionSchema.ts +++ b/app/.graphclient/sources/fux/introspectionSchema.ts @@ -1515,6 +1515,42 @@ const schemaAST = { } }, "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Evaluation_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Evaluation_filter" + } + } + }, + "directives": [] } ], "directives": [] @@ -2600,6 +2636,42 @@ const schemaAST = { } }, "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FuxGiven_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "FuxGiven_filter" + } + } + }, + "directives": [] } ], "directives": [] @@ -7780,6 +7852,42 @@ const schemaAST = { } }, "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "TokenBalance_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "TokenBalance_filter" + } + } + }, + "directives": [] } ], "directives": [] @@ -8623,6 +8731,42 @@ const schemaAST = { } }, "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Token_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Token_filter" + } + } + }, + "directives": [] } ], "directives": [] @@ -9929,6 +10073,42 @@ const schemaAST = { } }, "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "UserWorkstream_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "UserWorkstream_filter" + } + } + }, + "directives": [] } ], "directives": [] @@ -10374,6 +10554,42 @@ const schemaAST = { } }, "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "User_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "User_filter" + } + } + }, + "directives": [] } ], "directives": [] @@ -11467,6 +11683,42 @@ const schemaAST = { } }, "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "VFuxWorkstream_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "VFuxWorkstream_filter" + } + } + }, + "directives": [] } ], "directives": [] @@ -13119,6 +13371,42 @@ const schemaAST = { } }, "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Workstream_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Workstream_filter" + } + } + }, + "directives": [] } ], "directives": [] diff --git a/app/.graphclient/sources/fux/schema.graphql b/app/.graphclient/sources/fux/schema.graphql index 4c06ad1..3c3f597 100644 --- a/app/.graphclient/sources/fux/schema.graphql +++ b/app/.graphclient/sources/fux/schema.graphql @@ -102,6 +102,8 @@ input Evaluation_filter { ratings_not_contains_nocase: [BigInt!] """Filter for the block changed event.""" _change_block: BlockChangedFilter + and: [Evaluation_filter] + or: [Evaluation_filter] } enum Evaluation_orderBy { @@ -180,6 +182,8 @@ input FuxGiven_filter { balance_not_in: [BigInt!] """Filter for the block changed event.""" _change_block: BlockChangedFilter + and: [FuxGiven_filter] + or: [FuxGiven_filter] } enum FuxGiven_orderBy { @@ -696,6 +700,8 @@ input TokenBalance_filter { balance_not_in: [BigInt!] """Filter for the block changed event.""" _change_block: BlockChangedFilter + and: [TokenBalance_filter] + or: [TokenBalance_filter] } enum TokenBalance_orderBy { @@ -757,6 +763,8 @@ input Token_filter { tokenBalances_: TokenBalance_filter """Filter for the block changed event.""" _change_block: BlockChangedFilter + and: [Token_filter] + or: [Token_filter] } enum Token_orderBy { @@ -834,6 +842,8 @@ input UserWorkstream_filter { workstream_: Workstream_filter """Filter for the block changed event.""" _change_block: BlockChangedFilter + and: [UserWorkstream_filter] + or: [UserWorkstream_filter] } enum UserWorkstream_orderBy { @@ -868,6 +878,8 @@ input User_filter { rewards_not_in: [BigInt!] """Filter for the block changed event.""" _change_block: BlockChangedFilter + and: [User_filter] + or: [User_filter] } enum User_orderBy { @@ -947,6 +959,8 @@ input VFuxWorkstream_filter { balance_not_in: [BigInt!] """Filter for the block changed event.""" _change_block: BlockChangedFilter + and: [VFuxWorkstream_filter] + or: [VFuxWorkstream_filter] } enum VFuxWorkstream_orderBy { @@ -1043,6 +1057,8 @@ input Workstream_filter { resolved_not_in: [Boolean!] """Filter for the block changed event.""" _change_block: BlockChangedFilter + and: [Workstream_filter] + or: [Workstream_filter] } enum Workstream_orderBy { diff --git a/app/.graphclient/sources/fux/types.ts b/app/.graphclient/sources/fux/types.ts index 50bbab1..adf021d 100644 --- a/app/.graphclient/sources/fux/types.ts +++ b/app/.graphclient/sources/fux/types.ts @@ -114,6 +114,8 @@ export type Evaluation_filter = { ratings_not_contains_nocase?: InputMaybe>; /** Filter for the block changed event. */ _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; }; export type Evaluation_orderBy = @@ -191,6 +193,8 @@ export type FuxGiven_filter = { balance_not_in?: InputMaybe>; /** Filter for the block changed event. */ _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; }; export type FuxGiven_orderBy = @@ -628,6 +632,8 @@ export type TokenBalance_filter = { balance_not_in?: InputMaybe>; /** Filter for the block changed event. */ _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; }; export type TokenBalance_orderBy = @@ -688,6 +694,8 @@ export type Token_filter = { tokenBalances_?: InputMaybe; /** Filter for the block changed event. */ _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; }; export type Token_orderBy = @@ -791,6 +799,8 @@ export type UserWorkstream_filter = { workstream_?: InputMaybe; /** Filter for the block changed event. */ _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; }; export type UserWorkstream_orderBy = @@ -824,6 +834,8 @@ export type User_filter = { rewards_not_in?: InputMaybe>; /** Filter for the block changed event. */ _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; }; export type User_orderBy = @@ -902,6 +914,8 @@ export type VFuxWorkstream_filter = { balance_not_in?: InputMaybe>; /** Filter for the block changed event. */ _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; }; export type VFuxWorkstream_orderBy = @@ -1024,6 +1038,8 @@ export type Workstream_filter = { resolved_not_in?: InputMaybe>; /** Filter for the block changed event. */ _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; }; export type Workstream_orderBy = diff --git a/app/components/FUX/ValueReviewForm/index.tsx b/app/components/FUX/ValueReviewForm/index.tsx index 14baa13..b556a25 100644 --- a/app/components/FUX/ValueReviewForm/index.tsx +++ b/app/components/FUX/ValueReviewForm/index.tsx @@ -73,6 +73,7 @@ const ValueReviewForm: React.FC<{ ); if (!currentEvaluation) { + console.log("No current founr"); return; } @@ -107,7 +108,7 @@ const ValueReviewForm: React.FC<{ }, [formData]); const onSubmit = (data: FormData) => { - if (!total || !workstream?.id || Object.values(data.ratings).length == 0) { + if (!total || !workstream) { toast({ title: `Missing input data`, status: "error", @@ -117,7 +118,7 @@ const ValueReviewForm: React.FC<{ if (total != 100) { toast({ - title: `Not enough: ${total.toString() || "..."}/100`, + title: `Not enough: ${total || "..."}/100`, status: "error", }); return; @@ -126,6 +127,7 @@ const ValueReviewForm: React.FC<{ const filteredData = Object.entries(data.ratings).filter( (entry) => entry[0] !== user ); + console.log("DATA RATING: ", filteredData); if (filteredData?.length > 0) { submitEvaluation( @@ -140,6 +142,7 @@ const ValueReviewForm: React.FC<{ const owner = workstream?.coordinator?.id; console.log("Ratings: ", ratings); + console.log("Workstream: ", workstream); const reviewForm = contributors && contributors?.length > 0 && user ? ( @@ -150,7 +153,7 @@ const ValueReviewForm: React.FC<{ - + {contributors.map((contributor, index) => { return contributor.user.id.toLowerCase() === user.toLowerCase() ? undefined : ( @@ -160,16 +163,15 @@ const ValueReviewForm: React.FC<{ colSpan={6} borderLeftRadius="3xl" bg="#301A3A" - placeItems={"left"} > - - - {contributor.user.id.toLowerCase() === - owner?.toLowerCase() ? ( - - ) : ( - <> - )} + + + + {contributor.user.id.toLowerCase() === + owner?.toLowerCase() ? ( + + ) : undefined} + { +export const useCloseWorkstream = () => { const toast = useToast(); const contract = useFuxContract(); const { mutate } = useWriteContract(contract, "resolveValueEvaluation", { onError: (e) => { toast({ - title: `Couldn't resolve value evaluation: ${parseTxErrorMessage(e)}`, + title: `Couldn't close workstream: ${parseTxErrorMessage(e)}`, status: "error", }); throw new Error(e.message); }, onResponse: () => { toast({ - title: `Submitting resolution`, + title: `Closing workstream`, status: "info", duration: 30000, }); }, onConfirmation: () => { toast({ - title: "Resolution submitted", + title: "Workstream closed", status: "success", }); }, @@ -37,34 +37,3 @@ export const useResolveValueEvaluation = () => { return (workstreamID: number, contributors: string[], ratings: BigNumberish[]) => mutate(workstreamID, contributors, ratings); }; - -export const useResolveSoloWorkstream = () => { - const toast = useToast(); - const contract = useFuxContract(); - - const { mutate } = useWriteContract(contract, "resolveSoloWorkstream", { - onError: (e) => { - toast({ - title: `Couldn't resolve workstream: ${parseTxErrorMessage(e)}`, - status: "error", - }); - throw new Error(e.message); - }, - onResponse: () => { - toast({ - title: `Submitting resolution`, - status: "info", - duration: 30000, - }); - }, - onConfirmation: () => { - toast({ - title: "Resolution submitted", - status: "success", - }); - }, - }); - - return (workstreamID: number) => - mutate(workstreamID); -}; diff --git a/app/pages/workstream/[workstreamID].tsx b/app/pages/workstream/[workstreamID].tsx index 70b8c71..bde47d8 100644 --- a/app/pages/workstream/[workstreamID].tsx +++ b/app/pages/workstream/[workstreamID].tsx @@ -1,9 +1,12 @@ import { + EvaluationFragmentFragment, TokenBalanceDocument, + UserWorkstream, WorkstreamByIDDocument, } from "../../.graphclient"; import CommitFuxModal from "../../components/FUX/CommitFuxModal"; import { ContributorRow } from "../../components/FUX/ContributorRow"; +import { useCloseWorkstream } from "../../hooks/resolution"; import { useConstants } from "../../utils/constants"; import { VStack, @@ -19,17 +22,32 @@ import { Flex, } from "@chakra-ui/react"; import { useWallet } from "@raidguild/quiver"; -import { ethers } from "ethers"; +import { BigNumberish, ethers } from "ethers"; +import _ from "lodash"; import { DateTime } from "luxon"; import type { NextPage } from "next"; import NextLink from "next/link"; import { useRouter } from "next/router"; +import { useEffect } from "react"; import { useQuery } from "urql"; +type Evaluation = { + creator: { + id: string; + }; + contributors: [ + { + id: string; + } + ]; + ratings: BigNumberish[]; +}; + const Workstream: NextPage = () => { const router = useRouter(); const { address: user } = useWallet(); const { nativeToken } = useConstants(); + const closeWorkstream = useCloseWorkstream(); const { workstreamID } = router.query; const [result, reexecuteQuery] = useQuery({ @@ -43,7 +61,7 @@ const Workstream: NextPage = () => { const _workstream = data?.workstream; const fuxGiven = _workstream?.fuxGiven?.find( - (contributor) => contributor.user.id === user + (contributor) => contributor.user.id.toLowerCase() === user?.toLowerCase() )?.balance; const [fuxBalanceResponse, reexecuteBalanceQuery] = useQuery({ @@ -62,6 +80,38 @@ const Workstream: NextPage = () => { const balance = fuxAvailableData?.tokenBalances.find((balance) => balance); + const contributors = _workstream?.contributors?.map( + (contributor) => contributor.user + ); + + const getAverageEvaluations = (evaluations: Evaluation[]) => { + const merged = _.mergeWith({}, ...evaluations, (objValue, srcValue) => + (objValue || []).concat(srcValue) + ); + + console.log("merged: ", merged); + }; + + useEffect(() => { + if (_workstream?.evaluations) { + const evaluations = _workstream?.evaluations as Evaluation[]; + + getAverageEvaluations(evaluations); + } + }, [_workstream]); + + const handleFinalize = async () => { + const _contributors = contributors?.map((contributor) => contributor.id); + const _vFux: BigNumberish[] = []; + + if (!_contributors || !_vFux) { + console.log("invalid input"); + return; + } + + closeWorkstream(Number(workstreamID), _contributors, _vFux); + }; + return _workstream ? ( <> @@ -89,7 +139,10 @@ const Workstream: NextPage = () => { EVALUATE - + {_workstream.coordinator?.id.toLowerCase() === + user?.toLowerCase() ? ( + + ) : undefined} @@ -129,8 +182,8 @@ const Workstream: NextPage = () => { Contributors: - {_workstream.contributors?.map(({ id }, index) => ( - + {_workstream.contributors?.map(({ user }, index) => ( + ))} diff --git a/summon-evm/.openzeppelin/goerli.json b/summon-evm/.openzeppelin/goerli.json index 86d8609..17ab865 100644 --- a/summon-evm/.openzeppelin/goerli.json +++ b/summon-evm/.openzeppelin/goerli.json @@ -851,6 +851,1272 @@ } } } + }, + "59fe6e9df9b85db9c481148be3a783eb9ba7719888adf71f0594629e02f1dfe8": { + "address": "0x214235E29A6A53bd2B51c2676b87e9A78422Be4e", + "txHash": "0xdd2ba7c040a78d9c09b3e6b3a6918c53d1e6c3db88e17403ef48ef813f7b7b8e", + "layout": { + "solcVersion": "0.8.13", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_balances", + "offset": 0, + "slot": "101", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))", + "contract": "ERC1155Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol:25" + }, + { + "label": "_operatorApprovals", + "offset": 0, + "slot": "102", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "contract": "ERC1155Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol:28" + }, + { + "label": "_uri", + "offset": 0, + "slot": "103", + "type": "t_string_storage", + "contract": "ERC1155Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol:31" + }, + { + "label": "__gap", + "offset": 0, + "slot": "104", + "type": "t_array(t_uint256)47_storage", + "contract": "ERC1155Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol:528" + }, + { + "label": "_roles", + "offset": 0, + "slot": "151", + "type": "t_mapping(t_bytes32,t_struct(RoleData)34_storage)", + "contract": "AccessControlUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61" + }, + { + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage", + "contract": "AccessControlUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:259" + }, + { + "label": "_totalSupply", + "offset": 0, + "slot": "201", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "ERC1155SupplyUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155SupplyUpgradeable.sol:23" + }, + { + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)49_storage", + "contract": "ERC1155SupplyUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155SupplyUpgradeable.sol:76" + }, + { + "label": "_baseURI", + "offset": 0, + "slot": "251", + "type": "t_string_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:27" + }, + { + "label": "_tokenURIs", + "offset": 0, + "slot": "252", + "type": "t_mapping(t_uint256,t_string_storage)", + "contract": "ERC1155URIStorageUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:30" + }, + { + "label": "__gap", + "offset": 0, + "slot": "253", + "type": "t_array(t_uint256)48_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:77" + }, + { + "label": "__gap", + "offset": 0, + "slot": "301", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1155ReceiverUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/utils/ERC1155ReceiverUpgradeable.sol:31" + }, + { + "label": "__gap", + "offset": 0, + "slot": "351", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "401", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "counter", + "offset": 0, + "slot": "451", + "type": "t_uint256", + "contract": "FUX", + "src": "contracts/FUX.sol:41" + }, + { + "label": "workstreams", + "offset": 0, + "slot": "452", + "type": "t_mapping(t_uint256,t_struct(Workstream)4512_storage)", + "contract": "FUX", + "src": "contracts/FUX.sol:76" + }, + { + "label": "contributorWorkstreams", + "offset": 0, + "slot": "453", + "type": "t_mapping(t_address,t_array(t_uint256)dyn_storage)", + "contract": "FUX", + "src": "contracts/FUX.sol:77" + }, + { + "label": "contributorCommitments", + "offset": 0, + "slot": "454", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "FUX", + "src": "contracts/FUX.sol:78" + }, + { + "label": "valueEvaluations", + "offset": 0, + "slot": "455", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_struct(Evaluation)4521_storage))", + "contract": "FUX", + "src": "contracts/FUX.sol:79" + }, + { + "label": "vFuxAvailableForWorkstream", + "offset": 0, + "slot": "456", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "FUX", + "src": "contracts/FUX.sol:80" + }, + { + "label": "isFuxer", + "offset": 0, + "slot": "457", + "type": "t_mapping(t_address,t_bool)", + "contract": "FUX", + "src": "contracts/FUX.sol:81" + }, + { + "label": "isContributor", + "offset": 0, + "slot": "458", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_bool))", + "contract": "FUX", + "src": "contracts/FUX.sol:82" + }, + { + "label": "balances", + "offset": 0, + "slot": "459", + "type": "t_mapping(t_address,t_uint256)", + "contract": "FUX", + "src": "contracts/FUX.sol:83" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)47_storage": { + "label": "uint256[47]", + "numberOfBytes": "1504" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint256)dyn_storage": { + "label": "uint256[]", + "numberOfBytes": "32" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_array(t_uint256)dyn_storage)": { + "label": "mapping(address => uint256[])", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_bool))": { + "label": "mapping(address => mapping(uint256 => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_struct(Evaluation)4521_storage))": { + "label": "mapping(address => mapping(uint256 => struct FUX.Evaluation))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint256))": { + "label": "mapping(address => mapping(uint256 => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)34_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bool)": { + "label": "mapping(uint256 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { + "label": "mapping(uint256 => mapping(address => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_string_storage)": { + "label": "mapping(uint256 => string)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Evaluation)4521_storage)": { + "label": "mapping(uint256 => struct FUX.Evaluation)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Workstream)4512_storage)": { + "label": "mapping(uint256 => struct FUX.Workstream)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Evaluation)4521_storage": { + "label": "struct FUX.Evaluation", + "members": [ + { + "label": "contributors", + "type": "t_array(t_address)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "ratings", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "exists", + "type": "t_bool", + "offset": 0, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(RoleData)34_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "members", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Workstream)4512_storage": { + "label": "struct FUX.Workstream", + "members": [ + { + "label": "name", + "type": "t_string_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "1" + }, + { + "label": "contributors", + "type": "t_array(t_address)dyn_storage", + "offset": 0, + "slot": "2" + }, + { + "label": "evaluations", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "3" + }, + { + "label": "deadline", + "type": "t_uint256", + "offset": 0, + "slot": "4" + }, + { + "label": "funds", + "type": "t_uint256", + "offset": 0, + "slot": "5" + }, + { + "label": "exists", + "type": "t_bool", + "offset": 0, + "slot": "6" + } + ], + "numberOfBytes": "224" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "8d228d946e569fa82718d3c0ea8ab5a373b75afbf37b5c4fc5bc88b7a6e2d5b3": { + "address": "0xdd4ead51AF98Dd56292acd6bF692f700555342A1", + "txHash": "0x9c05c898e28d75a3b5c54dd891147260112f4cd00442f07eee8f3c20652d87b6", + "layout": { + "solcVersion": "0.8.13", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_balances", + "offset": 0, + "slot": "101", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))", + "contract": "ERC1155Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol:25" + }, + { + "label": "_operatorApprovals", + "offset": 0, + "slot": "102", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "contract": "ERC1155Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol:28" + }, + { + "label": "_uri", + "offset": 0, + "slot": "103", + "type": "t_string_storage", + "contract": "ERC1155Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol:31" + }, + { + "label": "__gap", + "offset": 0, + "slot": "104", + "type": "t_array(t_uint256)47_storage", + "contract": "ERC1155Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol:528" + }, + { + "label": "_roles", + "offset": 0, + "slot": "151", + "type": "t_mapping(t_bytes32,t_struct(RoleData)34_storage)", + "contract": "AccessControlUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61" + }, + { + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage", + "contract": "AccessControlUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:259" + }, + { + "label": "_totalSupply", + "offset": 0, + "slot": "201", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "ERC1155SupplyUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155SupplyUpgradeable.sol:23" + }, + { + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)49_storage", + "contract": "ERC1155SupplyUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155SupplyUpgradeable.sol:76" + }, + { + "label": "_baseURI", + "offset": 0, + "slot": "251", + "type": "t_string_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:27" + }, + { + "label": "_tokenURIs", + "offset": 0, + "slot": "252", + "type": "t_mapping(t_uint256,t_string_storage)", + "contract": "ERC1155URIStorageUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:30" + }, + { + "label": "__gap", + "offset": 0, + "slot": "253", + "type": "t_array(t_uint256)48_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:77" + }, + { + "label": "__gap", + "offset": 0, + "slot": "301", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1155ReceiverUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/utils/ERC1155ReceiverUpgradeable.sol:31" + }, + { + "label": "__gap", + "offset": 0, + "slot": "351", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "401", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "counter", + "offset": 0, + "slot": "451", + "type": "t_uint256", + "contract": "FUX", + "src": "contracts/FUX.sol:41" + }, + { + "label": "workstreams", + "offset": 0, + "slot": "452", + "type": "t_mapping(t_uint256,t_struct(Workstream)4512_storage)", + "contract": "FUX", + "src": "contracts/FUX.sol:76" + }, + { + "label": "contributorWorkstreams", + "offset": 0, + "slot": "453", + "type": "t_mapping(t_address,t_array(t_uint256)dyn_storage)", + "contract": "FUX", + "src": "contracts/FUX.sol:77" + }, + { + "label": "contributorCommitments", + "offset": 0, + "slot": "454", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "FUX", + "src": "contracts/FUX.sol:78" + }, + { + "label": "valueEvaluations", + "offset": 0, + "slot": "455", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_struct(Evaluation)4521_storage))", + "contract": "FUX", + "src": "contracts/FUX.sol:79" + }, + { + "label": "vFuxAvailableForWorkstream", + "offset": 0, + "slot": "456", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "FUX", + "src": "contracts/FUX.sol:80" + }, + { + "label": "isFuxer", + "offset": 0, + "slot": "457", + "type": "t_mapping(t_address,t_bool)", + "contract": "FUX", + "src": "contracts/FUX.sol:81" + }, + { + "label": "isContributor", + "offset": 0, + "slot": "458", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_bool))", + "contract": "FUX", + "src": "contracts/FUX.sol:82" + }, + { + "label": "balances", + "offset": 0, + "slot": "459", + "type": "t_mapping(t_address,t_uint256)", + "contract": "FUX", + "src": "contracts/FUX.sol:83" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)47_storage": { + "label": "uint256[47]", + "numberOfBytes": "1504" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint256)dyn_storage": { + "label": "uint256[]", + "numberOfBytes": "32" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_array(t_uint256)dyn_storage)": { + "label": "mapping(address => uint256[])", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_bool))": { + "label": "mapping(address => mapping(uint256 => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_struct(Evaluation)4521_storage))": { + "label": "mapping(address => mapping(uint256 => struct FUX.Evaluation))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint256))": { + "label": "mapping(address => mapping(uint256 => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)34_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bool)": { + "label": "mapping(uint256 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { + "label": "mapping(uint256 => mapping(address => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_string_storage)": { + "label": "mapping(uint256 => string)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Evaluation)4521_storage)": { + "label": "mapping(uint256 => struct FUX.Evaluation)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Workstream)4512_storage)": { + "label": "mapping(uint256 => struct FUX.Workstream)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Evaluation)4521_storage": { + "label": "struct FUX.Evaluation", + "members": [ + { + "label": "contributors", + "type": "t_array(t_address)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "ratings", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "exists", + "type": "t_bool", + "offset": 0, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(RoleData)34_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "members", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Workstream)4512_storage": { + "label": "struct FUX.Workstream", + "members": [ + { + "label": "name", + "type": "t_string_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "1" + }, + { + "label": "contributors", + "type": "t_array(t_address)dyn_storage", + "offset": 0, + "slot": "2" + }, + { + "label": "evaluations", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "3" + }, + { + "label": "deadline", + "type": "t_uint256", + "offset": 0, + "slot": "4" + }, + { + "label": "funds", + "type": "t_uint256", + "offset": 0, + "slot": "5" + }, + { + "label": "exists", + "type": "t_bool", + "offset": 0, + "slot": "6" + } + ], + "numberOfBytes": "224" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "2201890420d78ab6ffddbadedf480177161b81261d57e3887139bec3bd2ccbc9": { + "address": "0x9d881da0C7774030900383eDe3a3B47757C4EcD1", + "txHash": "0x7c32607eba7bedc3c433b6b837d235785717ea4528b66d53cbed075e5523020a", + "layout": { + "solcVersion": "0.8.13", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_balances", + "offset": 0, + "slot": "101", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))", + "contract": "ERC1155Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol:25" + }, + { + "label": "_operatorApprovals", + "offset": 0, + "slot": "102", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "contract": "ERC1155Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol:28" + }, + { + "label": "_uri", + "offset": 0, + "slot": "103", + "type": "t_string_storage", + "contract": "ERC1155Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol:31" + }, + { + "label": "__gap", + "offset": 0, + "slot": "104", + "type": "t_array(t_uint256)47_storage", + "contract": "ERC1155Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol:528" + }, + { + "label": "_roles", + "offset": 0, + "slot": "151", + "type": "t_mapping(t_bytes32,t_struct(RoleData)34_storage)", + "contract": "AccessControlUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61" + }, + { + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage", + "contract": "AccessControlUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:259" + }, + { + "label": "_totalSupply", + "offset": 0, + "slot": "201", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "ERC1155SupplyUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155SupplyUpgradeable.sol:23" + }, + { + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)49_storage", + "contract": "ERC1155SupplyUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155SupplyUpgradeable.sol:76" + }, + { + "label": "_baseURI", + "offset": 0, + "slot": "251", + "type": "t_string_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:27" + }, + { + "label": "_tokenURIs", + "offset": 0, + "slot": "252", + "type": "t_mapping(t_uint256,t_string_storage)", + "contract": "ERC1155URIStorageUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:30" + }, + { + "label": "__gap", + "offset": 0, + "slot": "253", + "type": "t_array(t_uint256)48_storage", + "contract": "ERC1155URIStorageUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol:77" + }, + { + "label": "__gap", + "offset": 0, + "slot": "301", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1155ReceiverUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC1155/utils/ERC1155ReceiverUpgradeable.sol:31" + }, + { + "label": "__gap", + "offset": 0, + "slot": "351", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "401", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "counter", + "offset": 0, + "slot": "451", + "type": "t_uint256", + "contract": "FUX", + "src": "contracts/FUX.sol:41" + }, + { + "label": "workstreams", + "offset": 0, + "slot": "452", + "type": "t_mapping(t_uint256,t_struct(Workstream)4512_storage)", + "contract": "FUX", + "src": "contracts/FUX.sol:76" + }, + { + "label": "contributorWorkstreams", + "offset": 0, + "slot": "453", + "type": "t_mapping(t_address,t_array(t_uint256)dyn_storage)", + "contract": "FUX", + "src": "contracts/FUX.sol:77" + }, + { + "label": "contributorCommitments", + "offset": 0, + "slot": "454", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "FUX", + "src": "contracts/FUX.sol:78" + }, + { + "label": "valueEvaluations", + "offset": 0, + "slot": "455", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_struct(Evaluation)4521_storage))", + "contract": "FUX", + "src": "contracts/FUX.sol:79" + }, + { + "label": "vFuxAvailableForWorkstream", + "offset": 0, + "slot": "456", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "contract": "FUX", + "src": "contracts/FUX.sol:80" + }, + { + "label": "isFuxer", + "offset": 0, + "slot": "457", + "type": "t_mapping(t_address,t_bool)", + "contract": "FUX", + "src": "contracts/FUX.sol:81" + }, + { + "label": "isContributor", + "offset": 0, + "slot": "458", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_bool))", + "contract": "FUX", + "src": "contracts/FUX.sol:82" + }, + { + "label": "balances", + "offset": 0, + "slot": "459", + "type": "t_mapping(t_address,t_uint256)", + "contract": "FUX", + "src": "contracts/FUX.sol:83" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)47_storage": { + "label": "uint256[47]", + "numberOfBytes": "1504" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint256)dyn_storage": { + "label": "uint256[]", + "numberOfBytes": "32" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_array(t_uint256)dyn_storage)": { + "label": "mapping(address => uint256[])", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_bool))": { + "label": "mapping(address => mapping(uint256 => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_struct(Evaluation)4521_storage))": { + "label": "mapping(address => mapping(uint256 => struct FUX.Evaluation))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint256))": { + "label": "mapping(address => mapping(uint256 => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)34_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_bool)": { + "label": "mapping(uint256 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { + "label": "mapping(uint256 => mapping(address => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_string_storage)": { + "label": "mapping(uint256 => string)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Evaluation)4521_storage)": { + "label": "mapping(uint256 => struct FUX.Evaluation)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Workstream)4512_storage)": { + "label": "mapping(uint256 => struct FUX.Workstream)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Evaluation)4521_storage": { + "label": "struct FUX.Evaluation", + "members": [ + { + "label": "contributors", + "type": "t_array(t_address)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "ratings", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "exists", + "type": "t_bool", + "offset": 0, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(RoleData)34_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "members", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Workstream)4512_storage": { + "label": "struct FUX.Workstream", + "members": [ + { + "label": "name", + "type": "t_string_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "creator", + "type": "t_address", + "offset": 0, + "slot": "1" + }, + { + "label": "contributors", + "type": "t_array(t_address)dyn_storage", + "offset": 0, + "slot": "2" + }, + { + "label": "evaluations", + "type": "t_array(t_uint256)dyn_storage", + "offset": 0, + "slot": "3" + }, + { + "label": "deadline", + "type": "t_uint256", + "offset": 0, + "slot": "4" + }, + { + "label": "funds", + "type": "t_uint256", + "offset": 0, + "slot": "5" + }, + { + "label": "exists", + "type": "t_bool", + "offset": 0, + "slot": "6" + } + ], + "numberOfBytes": "224" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } } } } diff --git a/summon-evm/contracts/FUX.sol b/summon-evm/contracts/FUX.sol index 03c9dbc..9534b71 100644 --- a/summon-evm/contracts/FUX.sol +++ b/summon-evm/contracts/FUX.sol @@ -224,8 +224,6 @@ contract FUX is } function withdrawFromWorkstream(uint256 workstreamID) public { - if (!_isContributor(msg.sender, workstreamID)) revert NotContributor(); - _withdrawFux(workstreamID); } @@ -234,7 +232,7 @@ contract FUX is address[] memory contributors, uint256[] memory ratings ) public { - if (!_isContributor(msg.sender, workstreamID) || !_isCoordinator(workstreamID)) revert NotApprovedOrOwner(); + if (!_isContributor(msg.sender, workstreamID)) revert NotApprovedOrOwner(); if (getWorkstreamCommitment(msg.sender, workstreamID) == 0) revert NotEnoughFux(); if (contributors.length == 0 || contributors.length != ratings.length) revert InvalidInput("contributors, vFuxGiven"); @@ -253,11 +251,11 @@ contract FUX is if (getWorkstreamCommitment(msg.sender, workstreamID) == 0) revert NotEnoughFux(); if (getVFuxForEvaluation(workstreamID) == 0) revert NotEnoughVFux(); - _submitEvaluations(workstreamID, contributors, vFuxGiven); - _payVFux(contributors, vFuxGiven, workstreamID); uint256 funds = workstream.funds; + workstream.exists = false; + if (funds > 0) { workstream.funds = 0; _reserveFunds(contributors, vFuxGiven, funds); @@ -265,7 +263,6 @@ contract FUX is _returnFux(contributors, workstreamID); _withdrawFux(workstreamID); - workstream.exists = false; emit WorkstreamClosed(workstreamID); } @@ -285,9 +282,9 @@ contract FUX is emit RewardsReserved(workstream.creator, funds); } - _withdrawFux(workstreamID); - workstream.exists = false; + + _withdrawFux(workstreamID); emit WorkstreamClosed(workstreamID); } diff --git a/summon-evm/test/fux/fux.workstream.behavior.ts b/summon-evm/test/fux/fux.workstream.behavior.ts index 1b2cd31..05752a9 100644 --- a/summon-evm/test/fux/fux.workstream.behavior.ts +++ b/summon-evm/test/fux/fux.workstream.behavior.ts @@ -107,8 +107,8 @@ export function shouldBehaveLikeFuxWorkstream(): void { expect(await contractWithUser.getWorkstreamCommitment(user.address, 1)).to.be.eq(50); expect(await contractWithUser.balanceOf(user.address, 0)).to.be.eq(50); - await expect(contractWithOwner.withdrawFromWorkstream(1)).to.be.revertedWithCustomError(fux, "NotContributor"); - + await expect(contractWithOwner.withdrawFromWorkstream(1)).to.be.revertedWithCustomError(fux, "NotEnoughFux"); + await expect(contractWithUser.withdrawFromWorkstream(1)).to.emit(fux, "FuxWithdraw").withArgs(user.address, 1, 50); expect(await contractWithUser.balanceOf(user.address, 0)).to.be.eq(100); diff --git a/summon-evm/types/factories/contracts/FUX__factory.ts b/summon-evm/types/factories/contracts/FUX__factory.ts index b87360c..6d0e642 100644 --- a/summon-evm/types/factories/contracts/FUX__factory.ts +++ b/summon-evm/types/factories/contracts/FUX__factory.ts @@ -1415,7 +1415,7 @@ const _abi = [ ] as const; const _bytecode = - "0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e8565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60805161497f6200012060003960008181610cfe01528181610d83015281816111b201528181611237015261131d015261497f6000f3fe6080604052600436106102db5760003560e01c80638129fc1c11610184578063d422831f116100d6578063e70545191161008a578063f242432a11610064578063f242432a146108df578063f385facc146108fa578063f72c0d8b1461090f57600080fd5b8063e705451914610849578063e985e9c514610869578063f23a6e61146108b257600080fd5b8063d6b0fd2a116100bb578063d6b0fd2a146107dc578063d7cec15514610809578063e3ca59551461082957600080fd5b8063d422831f146106d2578063d547741f146107bc57600080fd5b8063a217fddf11610138578063b14ab80311610112578063b14ab80314610727578063bc197c8114610747578063bd85b0391461078f57600080fd5b8063a217fddf146106d2578063a22cb465146106e7578063a8319ed21461070757600080fd5b80638b5d41ef116101695780638b5d41ef1461064a5780638e8e18ad1461067757806391d148541461068c57600080fd5b80638129fc1c1461062257806387390eb21461063757600080fd5b806336568abe1161023d5780634e1273f4116101f157806352d1902d116101cb57806352d1902d146105a25780636c24a76f146105b75780637f345710146105ee57600080fd5b80634e1273f4146105405780634f1ef286146105605780634f558e791461057357600080fd5b8063372500ab11610222578063372500ab146104c857806342f6a961146104dd5780634562bbea146104fd57600080fd5b806336568abe146104885780633659cfe6146104a857600080fd5b80630e89341c11610294578063248a9ca311610279578063248a9ca3146104185780632eb2c2d6146104485780632f2ff15d1461046857600080fd5b80630e89341c146103b2578063222cc569146103df57600080fd5b806302fe5305116102c557806302fe530514610343578063042bf9f0146103655780630ab083581461038557600080fd5b8062fdd58e146102e057806301ffc9a714610313575b600080fd5b3480156102ec57600080fd5b506103006102fb366004613b7d565b610943565b6040519081526020015b60405180910390f35b34801561031f57600080fd5b5061033361032e366004613bbd565b6109ee565b604051901515815260200161030a565b34801561034f57600080fd5b5061036361035e366004613c91565b6109ff565b005b34801561037157600080fd5b50610363610380366004613dd0565b610a36565b34801561039157600080fd5b506103a56103a0366004613e3d565b610bb1565b60405161030a9190613e93565b3480156103be57600080fd5b506103d26103cd366004613ea6565b610c1e565b60405161030a9190613f17565b3480156103eb57600080fd5b506103006103fa366004613ea6565b3360009081526101c860209081526040808320938352929052205490565b34801561042457600080fd5b50610300610433366004613ea6565b60009081526097602052604090206001015490565b34801561045457600080fd5b50610363610463366004613f2a565b610c29565b34801561047457600080fd5b50610363610483366004613fd4565b610c42565b34801561049457600080fd5b506103636104a3366004613fd4565b610c6c565b3480156104b457600080fd5b506103636104c3366004613e3d565b610cf4565b3480156104d457600080fd5b50610363610e6f565b3480156104e957600080fd5b506103636104f836600461404c565b610f1f565b34801561050957600080fd5b50610300610518366004613b7d565b6001600160a01b0390911660009081526101c660209081526040808320938352929052205490565b34801561054c57600080fd5b506103a561055b366004614098565b61106a565b61036361056e3660046140fc565b6111a8565b34801561057f57600080fd5b5061033361058e366004613ea6565b600090815260c96020526040902054151590565b3480156105ae57600080fd5b50610300611310565b3480156105c357600080fd5b506103006105d2366004613e3d565b6001600160a01b031660009081526101cb602052604090205490565b3480156105fa57600080fd5b506103007f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c81565b34801561062e57600080fd5b506103636113d6565b610363610645366004614140565b61157c565b34801561065657600080fd5b5061066a610665366004613b7d565b61186e565b60405161030a91906141f4565b34801561068357600080fd5b50610300600181565b34801561069857600080fd5b506103336106a7366004613fd4565b60009182526097602090815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156106de57600080fd5b50610300600081565b3480156106f357600080fd5b50610363610702366004614246565b61197b565b34801561071357600080fd5b50610363610722366004613dd0565b611986565b34801561073357600080fd5b50610363610742366004613ea6565b611a96565b34801561075357600080fd5b506107766107623660046142c4565b63bc197c8160e01b98975050505050505050565b6040516001600160e01b0319909116815260200161030a565b34801561079b57600080fd5b506103006107aa366004613ea6565b600090815260c9602052604090205490565b3480156107c857600080fd5b506103636107d7366004613fd4565b611c69565b3480156107e857600080fd5b506107fc6107f7366004613ea6565b611c8e565b60405161030a919061437f565b34801561081557600080fd5b50610363610824366004613ea6565b611e78565b34801561083557600080fd5b50610363610844366004613ea6565b611ebd565b34801561085557600080fd5b50610363610864366004614418565b612017565b34801561087557600080fd5b5061033361088436600461443a565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205460ff1690565b3480156108be57600080fd5b506107766108cd366004614464565b63f23a6e6160e01b9695505050505050565b3480156108eb57600080fd5b506103636104633660046144dc565b34801561090657600080fd5b50610363612161565b34801561091b57600080fd5b506103007f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e381565b60006001600160a01b0383166109c65760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201527f616c6964206f776e65720000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526065602090815260408083206001600160a01b03949094168352929052205490565b60006109f982612200565b92915050565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c610a2981612225565b610a328261222f565b5050565b60008381526101c460205260409020600681015460ff16610a6a576040516355dcb6f160e01b815260040160405180910390fd5b610a8f8460009081526101c460205260409020600101546001600160a01b0316331490565b610aac57604051634f6429f360e11b815260040160405180910390fd5b3360009081526101c660209081526040808320878452909152902054600003610ae85760405163a95eee8160e01b815260040160405180910390fd5b3360009081526101c860209081526040808320878452909152902054600003610b245760405163da92a67760e01b815260040160405180910390fd5b610b2f848484612242565b610b3a8383866123b2565b60058101548015610b575760006005830155610b5784848361247c565b610b6184866125c1565b610b6a85612650565b60068201805460ff191690556040518581527f537df8eb1adad6c5857328cc572568971f50e40fabde274f091190a3f4878e6a906020015b60405180910390a15050505050565b6001600160a01b03811660009081526101c56020908152604091829020805483518184028101840190945280845260609392830182828015610c1257602002820191906000526020600020905b815481526020019060010190808311610bfe575b50505050509050919050565b60606109f982612709565b60405163e92ecd6760e01b815260040160405180910390fd5b600082815260976020526040902060010154610c5d81612225565b610c6783836127e9565b505050565b6001600160a01b0381163314610cea5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084016109bd565b610a32828261288b565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610d815760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b60648201526084016109bd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610ddc7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610e475760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b60648201526084016109bd565b610e508161290e565b60408051600080825260208201909252610e6c91839190612938565b50565b3360009081526101cb60205260408120549003610e9f57604051631036b5ad60e31b815260040160405180910390fd5b3360008181526101cb6020526040808220805490839055905190929183156108fc02918491818181858888f19350505050158015610ee1573d6000803e3d6000fd5b5060408051338152602081018390527ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe91015b60405180910390a150565b60008381526101c460205260409020600681015460ff16610f53576040516355dcb6f160e01b815260040160405180910390fd5b60018101546001600160a01b03163314610f805760405163390cdd9b60e21b815260040160405180910390fd5b8160005b81811015611036576000858583818110610fa057610fa0614541565b9050602002016020810190610fb59190613e3d565b6001600160a01b031660008181526101c560209081526040808320805460018181018355918552838520018c905560028901805480830182559085528385200180546001600160a01b031916861790559383526101ca82528083208b84529091529020805460ff19169091179055508061102e8161456d565b915050610f84565b507f53f304d7ddc99bcc4695bc068800ce525ea67661c7f16ad157fee5a1ed6f6b3c858585604051610ba293929190614586565b606081518351146110e35760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d61746368000000000000000000000000000000000000000000000060648201526084016109bd565b6000835167ffffffffffffffff8111156110ff576110ff613bda565b604051908082528060200260200182016040528015611128578160200160208202803683370190505b50905060005b84518110156111a05761117385828151811061114c5761114c614541565b602002602001015185838151811061116657611166614541565b6020026020010151610943565b82828151811061118557611185614541565b60209081029190910101526111998161456d565b905061112e565b509392505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036112355760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b60648201526084016109bd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112907f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146112fb5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b60648201526084016109bd565b6113048261290e565b610a3282826001612938565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113b05760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016109bd565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b90565b600054610100900460ff16158080156113f65750600054600160ff909116105b806114105750303b158015611410575060005460ff166001145b6114825760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109bd565b6000805460ff1916600117905580156114a5576000805461ff0019166101001790555b6114bd60405180602001604052806000815250612ad8565b6114c5612b4c565b6114cd612b4c565b6114d5612b4c565b6114e06000336127e9565b61150a7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c336127e9565b6115347f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e3336127e9565b60006101c3558015610e6c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610f14565b60016101c3600082825461159091906145dc565b90915550506101c3546040805160e08101825260609181018290528181019190915286815233602082015260808101839052600160c08201523460a0820152848067ffffffffffffffff8111156115e9576115e9613bda565b604051908082528060200260200182016040528015611612578160200160208202803683370190505b50604083015260005b818110156116df57600088888381811061163757611637614541565b905060200201602081019061164c9190613e3d565b6001600160a01b03811660008181526101ca602090815260408083208a84528252808320805460ff191660019081179091559383526101c58252808320805494850181558352912090910187905585015180519192508291849081106116b4576116b4614541565b6001600160a01b039092166020928302919091019091015250806116d78161456d565b91505061161b565b507f53f304d7ddc99bcc4695bc068800ce525ea67661c7f16ad157fee5a1ed6f6b3c83888860405161171393929190614586565b60405180910390a13360009081526101c66020908152604080832086845282528083208890556101c48252909120835180518593611755928492910190613a39565b506020828101516001830180546001600160a01b0319166001600160a01b03909216919091179055604083015180516117949260028501920190613abd565b50606082015180516117b0916003840191602090910190613b12565b506080820151600482015560a0820151600582015560c0909101516006909101805460ff19169115159190911790553360008181526101c660209081526040808320878452825280832089905580519182019052818152611815929130918990612bb9565b604080518481523460208201529081018590526080606082018190526000908201527f500a40456624e358ffccc959dbc8099d186757aa0a8a913e064aead8baa2e0669060a00160405180910390a15050505050505050565b6040805160608082018352808252602080830182905260008385018190526001600160a01b03871681526101c78252848120868252825284902084518154928302810160809081019096529283018281529394929390928492849184018282801561190257602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116118e4575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561195a57602002820191906000526020600020905b815481526020019060010190808311611946575b50505091835250506002919091015460ff1615156020909101529392505050565b610a32338383612da1565b3360009081526101ca6020908152604080832086845290915290205460ff1615806119d357506119d18360009081526101c460205260409020600101546001600160a01b0316331490565b155b156119f15760405163390cdd9b60e21b815260040160405180910390fd5b3360009081526101c660209081526040808320868452909152902054600003611a2d5760405163a95eee8160e01b815260040160405180910390fd5b81511580611a3d57508051825114155b15611a8b5760405163d647364f60e01b815260206004820152601760248201527f636f6e7472696275746f72732c2076467578476976656e00000000000000000060448201526064016109bd565b610c67838383612242565b60008181526101c460205260409020600681015460ff16611aca576040516355dcb6f160e01b815260040160405180910390fd5b611aef8260009081526101c460205260409020600101546001600160a01b0316331490565b611b0c57604051634f6429f360e11b815260040160405180910390fd5b3360009081526101c660209081526040808320858452909152902054600003611b485760405163a95eee8160e01b815260040160405180910390fd5b6002810154600114611b9d5760405163d647364f60e01b815260206004820152600860248201527f4e6f7420736f6c6f00000000000000000000000000000000000000000000000060448201526064016109bd565b60058101548015611c1b576000600583018190553381526101cb6020526040812080548290611bcd9082906145dc565b90915550506001820154604080516001600160a01b039092168252602082018390527f47265b27f934438348d392d07a4bc3087b1f08c6ebf1ee5181b476356f18f67d910160405180910390a15b611c2483612650565b60068201805460ff191690556040518381527f537df8eb1adad6c5857328cc572568971f50e40fabde274f091190a3f4878e6a906020015b60405180910390a1505050565b600082815260976020526040902060010154611c8481612225565b610c67838361288b565b611cd96040518060e001604052806060815260200160006001600160a01b03168152602001606081526020016060815260200160008152602001600081526020016000151581525090565b60008281526101c4602052604090819020815160e08101909252805482908290611d02906145f4565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2e906145f4565b8015611d7b5780601f10611d5057610100808354040283529160200191611d7b565b820191906000526020600020905b815481529060010190602001808311611d5e57829003601f168201915b505050918352505060018201546001600160a01b03166020808301919091526002830180546040805182850281018501825282815294019392830182828015611ded57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611dcf575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611e4557602002820191906000526020600020905b815481526020019060010190808311611e31575b5050509183525050600482015460208201526005820154604082015260069091015460ff16151560609091015292915050565b3360009081526101ca6020908152604080832084845290915290205460ff16611eb45760405163d764187d60e01b815260040160405180910390fd5b610e6c81612650565b611ee28160009081526101c460205260409020600101546001600160a01b0316331490565b611eff57604051634f6429f360e11b815260040160405180910390fd5b3360009081526101c86020908152604080832084845290915290205415611f395760405163463fefc760e01b815260040160405180910390fd5b3360009081526101c660209081526040808320848452909152902054600003611f755760405163a95eee8160e01b815260040160405180910390fd5b60008181526101c4602052604090206006015460ff16611fa8576040516355dcb6f160e01b815260040160405180910390fd5b611fc5336001606460405180602001604052806000815250612e95565b3360008181526101c86020908152604080832085845282529182902060649055815192835282018390527f7b013762bcc4a01787a4815463c2c29ee415e5348c5b65ee468c3c03a76f60eb9101610f14565b3360009081526101ca6020908152604080832085845290915290205460ff166120535760405163d764187d60e01b815260040160405180910390fd5b3360009081526101c6602090815260408083208584529091529020548181036120be5760405162461bcd60e51b815260206004820152601260248201527f53616d6520616d6f756e74206f6620465558000000000000000000000000000060448201526064016109bd565b3360009081526101c66020908152604080832086845290915290208290558181101561210a5761210a333060006120f5858761462e565b60405180602001604052806000815250612bb9565b8181111561212357612123303360006120f5868661462e565b60408051338152602081018590529081018390527f3e0d5a590ba8d04db40e773cf88b938280ed4080a2688ba8e8105fb56f58e22490606001611c5c565b3360009081526101c9602052604090205460ff16156121935760405163463fefc760e01b815260040160405180910390fd5b6121b0336000606460405180602001604052806000815250612e95565b6040513381527f5184a1d5e0b0bcb8ee2c912752a2301033333eba83e58729ac34b470353164539060200160405180910390a13360009081526101c960205260409020805460ff19166001179055565b60006001600160e01b03198216630271189760e51b14806109f957506109f982612fba565b610e6c8133612fdf565b8051610a32906067906020840190613a39565b61224b81613054565b60641461229b5760405163d647364f60e01b815260206004820152600e60248201527f726174696e677320213d2031303000000000000000000000000000000000000060448201526064016109bd565b6122a4826130a3565b815115806122b457508051825114155b156123025760405163d647364f60e01b815260206004820152601560248201527f636f6e7472696275746f72732c20726174696e6773000000000000000000000060448201526064016109bd565b6040805160608101825283815260208082018490526001828401523360009081526101c7825283812087825282529290922081518051929391926123499284920190613abd565b5060208281015180516123629260018501920190613b12565b50604091820151600291909101805460ff1916911515919091179055517fc122d799d7d6cf0e12589532937ae647267a673c8921450ca41c6d405ee6abf890611c5c908590339086908690614645565b60006123bd83613054565b90508060641415806123ea57503360009081526101c8602090815260408083208584529091529020548114155b156124085760405163da92a67760e01b815260040160405180910390fd5b825160005b81811015612474576124643387838151811061242b5761242b614541565b6020026020010151600188858151811061244757612447614541565b602002602001015160405180602001604052806000815250612bb9565b61246d8161456d565b905061240d565b505050505050565b81516000805b828110156125985760006064858784815181106124a1576124a1614541565b60200260200101516124b3919061468a565b6124bd91906146a9565b90506124c981846145dc565b9250806101cb60008985815181106124e3576124e3614541565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082825461251a91906145dc565b925050819055507f47265b27f934438348d392d07a4bc3087b1f08c6ebf1ee5181b476356f18f67d87838151811061255457612554614541565b60200260200101518260405161257f9291906001600160a01b03929092168252602082015260400190565b60405180910390a1506125918161456d565b9050612482565b50828111156125ba57604051631036b5ad60e31b815260040160405180910390fd5b5050505050565b815160005b8181101561264a5760008482815181106125e2576125e2614541565b6020908102919091018101516001600160a01b03811660009081526101c6835260408082208883528452808220805490839055815194850190915281845291935090916126359130918591908590612bb9565b505080806126429061456d565b9150506125c6565b50505050565b3360009081526101c6602090815260408083208484529091528120549081900361268d5760405163a95eee8160e01b815260040160405180910390fd5b3360008181526101c6602090815260408083208684528252808320839055805191820190528181526126c492309290918590612bb9565b60408051338152602081018490529081018290527f81c3d6f4c1e03f5c57415284db949754444cf26d552e13742dd88bd8b13a89329060600160405180910390a15050565b600081815260fc6020526040812080546060929190612727906145f4565b80601f0160208091040260200160405190810160405280929190818152602001828054612753906145f4565b80156127a05780601f10612775576101008083540402835291602001916127a0565b820191906000526020600020905b81548152906001019060200180831161278357829003601f168201915b5050505050905060008151116127be576127b98361313d565b6127e2565b60fb816040516020016127d29291906146e7565b6040516020818303038152906040525b9392505050565b60008281526097602090815260408083206001600160a01b038516845290915290205460ff16610a325760008281526097602090815260408083206001600160a01b03851684529091529020805460ff191660011790556128473390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526097602090815260408083206001600160a01b038516845290915290205460ff1615610a325760008281526097602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e3610a3281612225565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561296b57610c67836131c7565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156129c5575060408051601f3d908101601f191682019092526129c291810190614784565b60015b612a375760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f74205555505300000000000000000000000000000000000060648201526084016109bd565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612acc5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c6555554944000000000000000000000000000000000000000000000060648201526084016109bd565b50610c67838383613285565b600054610100900460ff16612b435760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016109bd565b610e6c816132aa565b600054610100900460ff16612bb75760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016109bd565b565b6001600160a01b038416612c355760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016109bd565b336000612c418561331e565b90506000612c4e8561331e565b9050612c5e838989858589613369565b60008681526065602090815260408083206001600160a01b038c16845290915290205485811015612cf75760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e736665720000000000000000000000000000000000000000000060648201526084016109bd565b60008781526065602090815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290612d369084906145dc565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612d96848a8a8a8a8a613377565b505050505050505050565b816001600160a01b0316836001600160a01b031603612e285760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c66000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b03838116600081815260666020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416612ef55760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016109bd565b336000612f018561331e565b90506000612f0e8561331e565b9050612f1f83600089858589613369565b60008681526065602090815260408083206001600160a01b038b16845290915281208054879290612f519084906145dc565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612fb183600089898989613377565b50505050505050565b60006001600160e01b03198216637965db0b60e01b14806109f957506109f982613531565b60008281526097602090815260408083206001600160a01b038516845290915290205460ff16610a325761301281613581565b61301d836020613593565b60405160200161302e92919061479d565b60408051601f198184030181529082905262461bcd60e51b82526109bd91600401613f17565b8051600090815b8181101561309c5783818151811061307557613075614541565b60200260200101518361308891906145dc565b9250806130948161456d565b91505061305b565b5050919050565b805160005b81811015610c6757336001600160a01b03168382815181106130cc576130cc614541565b60200260200101516001600160a01b03160361312b5760405163d647364f60e01b815260206004820152601560248201527f73656e64657220697320636f6e7472696275746f72000000000000000000000060448201526064016109bd565b806131358161456d565b9150506130a8565b60606067805461314c906145f4565b80601f0160208091040260200160405190810160405280929190818152602001828054613178906145f4565b8015610c125780601f1061319a57610100808354040283529160200191610c12565b820191906000526020600020905b8154815290600101906020018083116131a85750939695505050505050565b6001600160a01b0381163b6132445760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016109bd565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b61328e8361373c565b60008251118061329b5750805b15610c675761264a838361377c565b600054610100900460ff166133155760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016109bd565b610e6c8161222f565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061335857613358614541565b602090810291909101015292915050565b612474868686868686613887565b6001600160a01b0384163b156124745760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906133bb908990899088908890889060040161481e565b6020604051808303816000875af19250505080156133f6575060408051601f3d908101601f191682019092526133f391810190614856565b60015b6134ab57613402614873565b806308c379a00361343b575061341661488e565b80613421575061343d565b8060405162461bcd60e51b81526004016109bd9190613f17565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e74657200000000000000000000000060648201526084016109bd565b6001600160e01b0319811663f23a6e6160e01b14612fb15760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e7300000000000000000000000000000000000000000000000060648201526084016109bd565b60006001600160e01b03198216636cdb3d1360e11b148061356257506001600160e01b031982166303a24d0760e21b145b806109f957506301ffc9a760e01b6001600160e01b03198316146109f9565b60606109f96001600160a01b03831660145b606060006135a283600261468a565b6135ad9060026145dc565b67ffffffffffffffff8111156135c5576135c5613bda565b6040519080825280601f01601f1916602001820160405280156135ef576020820181803683370190505b509050600360fc1b8160008151811061360a5761360a614541565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061363957613639614541565b60200101906001600160f81b031916908160001a905350600061365d84600261468a565b6136689060016145dc565b90505b60018111156136ed577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106136a9576136a9614541565b1a60f81b8282815181106136bf576136bf614541565b60200101906001600160f81b031916908160001a90535060049490941c936136e681614918565b905061366b565b5083156127e25760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109bd565b613745816131c7565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6137fb5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084016109bd565b600080846001600160a01b031684604051613816919061492f565b600060405180830381855af49150503d8060008114613851576040519150601f19603f3d011682016040523d82523d6000602084013e613856565b606091505b509150915061387e828260405180606001604052806027815260200161494c60279139613a15565b95945050505050565b6001600160a01b03851661390e5760005b835181101561390c578281815181106138b3576138b3614541565b602002602001015160c960008684815181106138d1576138d1614541565b6020026020010151815260200190815260200160002060008282546138f691906145dc565b9091555061390590508161456d565b9050613898565b505b6001600160a01b0384166124745760005b8351811015612fb157600084828151811061393c5761393c614541565b60200260200101519050600084838151811061395a5761395a614541565b60200260200101519050600060c96000848152602001908152602001600020549050818110156139f25760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f7460448201527f616c537570706c7900000000000000000000000000000000000000000000000060648201526084016109bd565b600092835260c9602052604090922091039055613a0e8161456d565b905061391f565b60608315613a245750816127e2565b6127e283838151156134215781518083602001fd5b828054613a45906145f4565b90600052602060002090601f016020900481019282613a675760008555613aad565b82601f10613a8057805160ff1916838001178555613aad565b82800160010185558215613aad579182015b82811115613aad578251825591602001919060010190613a92565b50613ab9929150613b4c565b5090565b828054828255906000526020600020908101928215613aad579160200282015b82811115613aad57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613add565b828054828255906000526020600020908101928215613aad5791602002820182811115613aad578251825591602001919060010190613a92565b5b80821115613ab95760008155600101613b4d565b80356001600160a01b0381168114613b7857600080fd5b919050565b60008060408385031215613b9057600080fd5b613b9983613b61565b946020939093013593505050565b6001600160e01b031981168114610e6c57600080fd5b600060208284031215613bcf57600080fd5b81356127e281613ba7565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715613c1657613c16613bda565b6040525050565b600082601f830112613c2e57600080fd5b813567ffffffffffffffff811115613c4857613c48613bda565b604051613c5f601f8301601f191660200182613bf0565b818152846020838601011115613c7457600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215613ca357600080fd5b813567ffffffffffffffff811115613cba57600080fd5b613cc684828501613c1d565b949350505050565b600067ffffffffffffffff821115613ce857613ce8613bda565b5060051b60200190565b600082601f830112613d0357600080fd5b81356020613d1082613cce565b604051613d1d8282613bf0565b83815260059390931b8501820192828101915086841115613d3d57600080fd5b8286015b84811015613d5f57613d5281613b61565b8352918301918301613d41565b509695505050505050565b600082601f830112613d7b57600080fd5b81356020613d8882613cce565b604051613d958282613bf0565b83815260059390931b8501820192828101915086841115613db557600080fd5b8286015b84811015613d5f5780358352918301918301613db9565b600080600060608486031215613de557600080fd5b83359250602084013567ffffffffffffffff80821115613e0457600080fd5b613e1087838801613cf2565b93506040860135915080821115613e2657600080fd5b50613e3386828701613d6a565b9150509250925092565b600060208284031215613e4f57600080fd5b6127e282613b61565b600081518084526020808501945080840160005b83811015613e8857815187529582019590820190600101613e6c565b509495945050505050565b6020815260006127e26020830184613e58565b600060208284031215613eb857600080fd5b5035919050565b60005b83811015613eda578181015183820152602001613ec2565b8381111561264a5750506000910152565b60008151808452613f03816020860160208601613ebf565b601f01601f19169290920160200192915050565b6020815260006127e26020830184613eeb565b600080600080600060a08688031215613f4257600080fd5b613f4b86613b61565b9450613f5960208701613b61565b9350604086013567ffffffffffffffff80821115613f7657600080fd5b613f8289838a01613d6a565b94506060880135915080821115613f9857600080fd5b613fa489838a01613d6a565b93506080880135915080821115613fba57600080fd5b50613fc788828901613c1d565b9150509295509295909350565b60008060408385031215613fe757600080fd5b82359150613ff760208401613b61565b90509250929050565b60008083601f84011261401257600080fd5b50813567ffffffffffffffff81111561402a57600080fd5b6020830191508360208260051b850101111561404557600080fd5b9250929050565b60008060006040848603121561406157600080fd5b83359250602084013567ffffffffffffffff81111561407f57600080fd5b61408b86828701614000565b9497909650939450505050565b600080604083850312156140ab57600080fd5b823567ffffffffffffffff808211156140c357600080fd5b6140cf86838701613cf2565b935060208501359150808211156140e557600080fd5b506140f285828601613d6a565b9150509250929050565b6000806040838503121561410f57600080fd5b61411883613b61565b9150602083013567ffffffffffffffff81111561413457600080fd5b6140f285828601613c1d565b60008060008060006080868803121561415857600080fd5b853567ffffffffffffffff8082111561417057600080fd5b61417c89838a01613c1d565b9650602088013591508082111561419257600080fd5b5061419f88828901614000565b9699909850959660408101359660609091013595509350505050565b600081518084526020808501945080840160005b83811015613e885781516001600160a01b0316875295820195908201906001016141cf565b60208152600082516060602084015261421060808401826141bb565b90506020840151601f1984830301604085015261422d8282613e58565b9150506040840151151560608401528091505092915050565b6000806040838503121561425957600080fd5b61426283613b61565b91506020830135801515811461427757600080fd5b809150509250929050565b60008083601f84011261429457600080fd5b50813567ffffffffffffffff8111156142ac57600080fd5b60208301915083602082850101111561404557600080fd5b60008060008060008060008060a0898b0312156142e057600080fd5b6142e989613b61565b97506142f760208a01613b61565b9650604089013567ffffffffffffffff8082111561431457600080fd5b6143208c838d01614000565b909850965060608b013591508082111561433957600080fd5b6143458c838d01614000565b909650945060808b013591508082111561435e57600080fd5b5061436b8b828c01614282565b999c989b5096995094979396929594505050565b602081526000825160e0602084015261439c610100840182613eeb565b90506001600160a01b0360208501511660408401526040840151601f19808584030160608601526143cd83836141bb565b92506060860151915080858403016080860152506143eb8282613e58565b915050608084015160a084015260a084015160c084015260c0840151151560e08401528091505092915050565b6000806040838503121561442b57600080fd5b50508035926020909101359150565b6000806040838503121561444d57600080fd5b61445683613b61565b9150613ff760208401613b61565b60008060008060008060a0878903121561447d57600080fd5b61448687613b61565b955061449460208801613b61565b94506040870135935060608701359250608087013567ffffffffffffffff8111156144be57600080fd5b6144ca89828a01614282565b979a9699509497509295939492505050565b600080600080600060a086880312156144f457600080fd5b6144fd86613b61565b945061450b60208701613b61565b93506040860135925060608601359150608086013567ffffffffffffffff81111561453557600080fd5b613fc788828901613c1d565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161457f5761457f614557565b5060010190565b83815260406020808301829052908201839052600090849060608401835b868110156145d0576001600160a01b036145bd85613b61565b16825292820192908201906001016145a4565b50979650505050505050565b600082198211156145ef576145ef614557565b500190565b600181811c9082168061460857607f821691505b60208210810361462857634e487b7160e01b600052602260045260246000fd5b50919050565b60008282101561464057614640614557565b500390565b8481526001600160a01b038416602082015260806040820152600061466d60808301856141bb565b828103606084015261467f8185613e58565b979650505050505050565b60008160001904831182151516156146a4576146a4614557565b500290565b6000826146c657634e487b7160e01b600052601260045260246000fd5b500490565b600081516146dd818560208601613ebf565b9290920192915050565b600080845481600182811c91508083168061470357607f831692505b6020808410820361472257634e487b7160e01b86526022600452602486fd5b818015614736576001811461474757614774565b60ff19861689528489019650614774565b60008b81526020902060005b8681101561476c5781548b820152908501908301614753565b505084890196505b50505050505061387e81856146cb565b60006020828403121561479657600080fd5b5051919050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516147d5816017850160208801613ebf565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351614812816028840160208801613ebf565b01602801949350505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261467f60a0830184613eeb565b60006020828403121561486857600080fd5b81516127e281613ba7565b600060033d11156113d35760046000803e5060005160e01c90565b600060443d101561489c5790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156148cc57505050505090565b82850191508151818111156148e45750505050505090565b843d87010160208285010111156148fe5750505050505090565b61490d60208286010187613bf0565b509095945050505050565b60008161492757614927614557565b506000190190565b60008251614941818460208701613ebf565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c634300080d000a"; + "0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e8565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6080516149096200012060003960008181610cf301528181610d78015281816111a70152818161122c015261131201526149096000f3fe6080604052600436106102db5760003560e01c80638129fc1c11610184578063d422831f116100d6578063e70545191161008a578063f242432a11610064578063f242432a146108df578063f385facc146108fa578063f72c0d8b1461090f57600080fd5b8063e705451914610849578063e985e9c514610869578063f23a6e61146108b257600080fd5b8063d6b0fd2a116100bb578063d6b0fd2a146107dc578063d7cec15514610809578063e3ca59551461082957600080fd5b8063d422831f146106d2578063d547741f146107bc57600080fd5b8063a217fddf11610138578063b14ab80311610112578063b14ab80314610727578063bc197c8114610747578063bd85b0391461078f57600080fd5b8063a217fddf146106d2578063a22cb465146106e7578063a8319ed21461070757600080fd5b80638b5d41ef116101695780638b5d41ef1461064a5780638e8e18ad1461067757806391d148541461068c57600080fd5b80638129fc1c1461062257806387390eb21461063757600080fd5b806336568abe1161023d5780634e1273f4116101f157806352d1902d116101cb57806352d1902d146105a25780636c24a76f146105b75780637f345710146105ee57600080fd5b80634e1273f4146105405780634f1ef286146105605780634f558e791461057357600080fd5b8063372500ab11610222578063372500ab146104c857806342f6a961146104dd5780634562bbea146104fd57600080fd5b806336568abe146104885780633659cfe6146104a857600080fd5b80630e89341c11610294578063248a9ca311610279578063248a9ca3146104185780632eb2c2d6146104485780632f2ff15d1461046857600080fd5b80630e89341c146103b2578063222cc569146103df57600080fd5b806302fe5305116102c557806302fe530514610343578063042bf9f0146103655780630ab083581461038557600080fd5b8062fdd58e146102e057806301ffc9a714610313575b600080fd5b3480156102ec57600080fd5b506103006102fb366004613b07565b610943565b6040519081526020015b60405180910390f35b34801561031f57600080fd5b5061033361032e366004613b47565b6109ee565b604051901515815260200161030a565b34801561034f57600080fd5b5061036361035e366004613c1b565b6109ff565b005b34801561037157600080fd5b50610363610380366004613d5a565b610a36565b34801561039157600080fd5b506103a56103a0366004613dc7565b610ba6565b60405161030a9190613e1d565b3480156103be57600080fd5b506103d26103cd366004613e30565b610c13565b60405161030a9190613ea1565b3480156103eb57600080fd5b506103006103fa366004613e30565b3360009081526101c860209081526040808320938352929052205490565b34801561042457600080fd5b50610300610433366004613e30565b60009081526097602052604090206001015490565b34801561045457600080fd5b50610363610463366004613eb4565b610c1e565b34801561047457600080fd5b50610363610483366004613f5e565b610c37565b34801561049457600080fd5b506103636104a3366004613f5e565b610c61565b3480156104b457600080fd5b506103636104c3366004613dc7565b610ce9565b3480156104d457600080fd5b50610363610e64565b3480156104e957600080fd5b506103636104f8366004613fd6565b610f14565b34801561050957600080fd5b50610300610518366004613b07565b6001600160a01b0390911660009081526101c660209081526040808320938352929052205490565b34801561054c57600080fd5b506103a561055b366004614022565b61105f565b61036361056e366004614086565b61119d565b34801561057f57600080fd5b5061033361058e366004613e30565b600090815260c96020526040902054151590565b3480156105ae57600080fd5b50610300611305565b3480156105c357600080fd5b506103006105d2366004613dc7565b6001600160a01b031660009081526101cb602052604090205490565b3480156105fa57600080fd5b506103007f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c81565b34801561062e57600080fd5b506103636113cb565b6103636106453660046140ca565b611571565b34801561065657600080fd5b5061066a610665366004613b07565b611863565b60405161030a919061417e565b34801561068357600080fd5b50610300600181565b34801561069857600080fd5b506103336106a7366004613f5e565b60009182526097602090815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156106de57600080fd5b50610300600081565b3480156106f357600080fd5b506103636107023660046141d0565b611970565b34801561071357600080fd5b50610363610722366004613d5a565b61197b565b34801561073357600080fd5b50610363610742366004613e30565b611a5c565b34801561075357600080fd5b5061077661076236600461424e565b63bc197c8160e01b98975050505050505050565b6040516001600160e01b0319909116815260200161030a565b34801561079b57600080fd5b506103006107aa366004613e30565b600090815260c9602052604090205490565b3480156107c857600080fd5b506103636107d7366004613f5e565b611c2f565b3480156107e857600080fd5b506107fc6107f7366004613e30565b611c54565b60405161030a9190614309565b34801561081557600080fd5b50610363610824366004613e30565b611e3e565b34801561083557600080fd5b50610363610844366004613e30565b611e47565b34801561085557600080fd5b506103636108643660046143a2565b611fa1565b34801561087557600080fd5b506103336108843660046143c4565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205460ff1690565b3480156108be57600080fd5b506107766108cd3660046143ee565b63f23a6e6160e01b9695505050505050565b3480156108eb57600080fd5b50610363610463366004614466565b34801561090657600080fd5b506103636120eb565b34801561091b57600080fd5b506103007f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e381565b60006001600160a01b0383166109c65760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201527f616c6964206f776e65720000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526065602090815260408083206001600160a01b03949094168352929052205490565b60006109f98261218a565b92915050565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c610a29816121af565b610a32826121b9565b5050565b60008381526101c460205260409020600681015460ff16610a6a576040516355dcb6f160e01b815260040160405180910390fd5b610a8f8460009081526101c460205260409020600101546001600160a01b0316331490565b610aac57604051634f6429f360e11b815260040160405180910390fd5b3360009081526101c660209081526040808320878452909152902054600003610ae85760405163a95eee8160e01b815260040160405180910390fd5b3360009081526101c860209081526040808320878452909152902054600003610b245760405163da92a67760e01b815260040160405180910390fd5b610b2f8383866121cc565b600581015460068201805460ff191690558015610b585760006005830155610b58848483612296565b610b6284866123db565b610b6b8561246a565b6040518581527f537df8eb1adad6c5857328cc572568971f50e40fabde274f091190a3f4878e6a906020015b60405180910390a15050505050565b6001600160a01b03811660009081526101c56020908152604091829020805483518184028101840190945280845260609392830182828015610c0757602002820191906000526020600020905b815481526020019060010190808311610bf3575b50505050509050919050565b60606109f982612523565b60405163e92ecd6760e01b815260040160405180910390fd5b600082815260976020526040902060010154610c52816121af565b610c5c8383612603565b505050565b6001600160a01b0381163314610cdf5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084016109bd565b610a3282826126a5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610d765760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b60648201526084016109bd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610dd17f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610e3c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b60648201526084016109bd565b610e4581612728565b60408051600080825260208201909252610e6191839190612752565b50565b3360009081526101cb60205260408120549003610e9457604051631036b5ad60e31b815260040160405180910390fd5b3360008181526101cb6020526040808220805490839055905190929183156108fc02918491818181858888f19350505050158015610ed6573d6000803e3d6000fd5b5060408051338152602081018390527ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe91015b60405180910390a150565b60008381526101c460205260409020600681015460ff16610f48576040516355dcb6f160e01b815260040160405180910390fd5b60018101546001600160a01b03163314610f755760405163390cdd9b60e21b815260040160405180910390fd5b8160005b8181101561102b576000858583818110610f9557610f956144cb565b9050602002016020810190610faa9190613dc7565b6001600160a01b031660008181526101c560209081526040808320805460018181018355918552838520018c905560028901805480830182559085528385200180546001600160a01b031916861790559383526101ca82528083208b84529091529020805460ff191690911790555080611023816144f7565b915050610f79565b507f53f304d7ddc99bcc4695bc068800ce525ea67661c7f16ad157fee5a1ed6f6b3c858585604051610b9793929190614510565b606081518351146110d85760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d61746368000000000000000000000000000000000000000000000060648201526084016109bd565b6000835167ffffffffffffffff8111156110f4576110f4613b64565b60405190808252806020026020018201604052801561111d578160200160208202803683370190505b50905060005b845181101561119557611168858281518110611141576111416144cb565b602002602001015185838151811061115b5761115b6144cb565b6020026020010151610943565b82828151811061117a5761117a6144cb565b602090810291909101015261118e816144f7565b9050611123565b509392505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361122a5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b60648201526084016109bd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112857f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146112f05760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b60648201526084016109bd565b6112f982612728565b610a3282826001612752565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113a55760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016109bd565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b90565b600054610100900460ff16158080156113eb5750600054600160ff909116105b806114055750303b158015611405575060005460ff166001145b6114775760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109bd565b6000805460ff19166001179055801561149a576000805461ff0019166101001790555b6114b2604051806020016040528060008152506128f2565b6114ba612966565b6114c2612966565b6114ca612966565b6114d5600033612603565b6114ff7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c33612603565b6115297f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e333612603565b60006101c3558015610e61576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610f09565b60016101c360008282546115859190614566565b90915550506101c3546040805160e08101825260609181018290528181019190915286815233602082015260808101839052600160c08201523460a0820152848067ffffffffffffffff8111156115de576115de613b64565b604051908082528060200260200182016040528015611607578160200160208202803683370190505b50604083015260005b818110156116d457600088888381811061162c5761162c6144cb565b90506020020160208101906116419190613dc7565b6001600160a01b03811660008181526101ca602090815260408083208a84528252808320805460ff191660019081179091559383526101c58252808320805494850181558352912090910187905585015180519192508291849081106116a9576116a96144cb565b6001600160a01b039092166020928302919091019091015250806116cc816144f7565b915050611610565b507f53f304d7ddc99bcc4695bc068800ce525ea67661c7f16ad157fee5a1ed6f6b3c83888860405161170893929190614510565b60405180910390a13360009081526101c66020908152604080832086845282528083208890556101c4825290912083518051859361174a9284929101906139c3565b506020828101516001830180546001600160a01b0319166001600160a01b03909216919091179055604083015180516117899260028501920190613a47565b50606082015180516117a5916003840191602090910190613a9c565b506080820151600482015560a0820151600582015560c0909101516006909101805460ff19169115159190911790553360008181526101c66020908152604080832087845282528083208990558051918201905281815261180a9291309189906129d3565b604080518481523460208201529081018590526080606082018190526000908201527f500a40456624e358ffccc959dbc8099d186757aa0a8a913e064aead8baa2e0669060a00160405180910390a15050505050505050565b6040805160608082018352808252602080830182905260008385018190526001600160a01b03871681526101c7825284812086825282528490208451815492830281016080908101909652928301828152939492939092849284918401828280156118f757602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116118d9575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561194f57602002820191906000526020600020905b81548152602001906001019080831161193b575b50505091835250506002919091015460ff1615156020909101529392505050565b610a32338383612bbb565b3360009081526101ca6020908152604080832086845290915290205460ff166119b75760405163390cdd9b60e21b815260040160405180910390fd5b3360009081526101c6602090815260408083208684529091529020546000036119f35760405163a95eee8160e01b815260040160405180910390fd5b81511580611a0357508051825114155b15611a515760405163d647364f60e01b815260206004820152601760248201527f636f6e7472696275746f72732c2076467578476976656e00000000000000000060448201526064016109bd565b610c5c838383612caf565b60008181526101c460205260409020600681015460ff16611a90576040516355dcb6f160e01b815260040160405180910390fd5b611ab58260009081526101c460205260409020600101546001600160a01b0316331490565b611ad257604051634f6429f360e11b815260040160405180910390fd5b3360009081526101c660209081526040808320858452909152902054600003611b0e5760405163a95eee8160e01b815260040160405180910390fd5b6002810154600114611b635760405163d647364f60e01b815260206004820152600860248201527f4e6f7420736f6c6f00000000000000000000000000000000000000000000000060448201526064016109bd565b60058101548015611be1576000600583018190553381526101cb6020526040812080548290611b93908290614566565b90915550506001820154604080516001600160a01b039092168252602082018390527f47265b27f934438348d392d07a4bc3087b1f08c6ebf1ee5181b476356f18f67d910160405180910390a15b60068201805460ff19169055611bf68361246a565b6040518381527f537df8eb1adad6c5857328cc572568971f50e40fabde274f091190a3f4878e6a906020015b60405180910390a1505050565b600082815260976020526040902060010154611c4a816121af565b610c5c83836126a5565b611c9f6040518060e001604052806060815260200160006001600160a01b03168152602001606081526020016060815260200160008152602001600081526020016000151581525090565b60008281526101c4602052604090819020815160e08101909252805482908290611cc89061457e565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf49061457e565b8015611d415780601f10611d1657610100808354040283529160200191611d41565b820191906000526020600020905b815481529060010190602001808311611d2457829003601f168201915b505050918352505060018201546001600160a01b03166020808301919091526002830180546040805182850281018501825282815294019392830182828015611db357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611d95575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611e0b57602002820191906000526020600020905b815481526020019060010190808311611df7575b5050509183525050600482015460208201526005820154604082015260069091015460ff16151560609091015292915050565b610e618161246a565b611e6c8160009081526101c460205260409020600101546001600160a01b0316331490565b611e8957604051634f6429f360e11b815260040160405180910390fd5b3360009081526101c86020908152604080832084845290915290205415611ec35760405163463fefc760e01b815260040160405180910390fd5b3360009081526101c660209081526040808320848452909152902054600003611eff5760405163a95eee8160e01b815260040160405180910390fd5b60008181526101c4602052604090206006015460ff16611f32576040516355dcb6f160e01b815260040160405180910390fd5b611f4f336001606460405180602001604052806000815250612e1f565b3360008181526101c86020908152604080832085845282529182902060649055815192835282018390527f7b013762bcc4a01787a4815463c2c29ee415e5348c5b65ee468c3c03a76f60eb9101610f09565b3360009081526101ca6020908152604080832085845290915290205460ff16611fdd5760405163d764187d60e01b815260040160405180910390fd5b3360009081526101c6602090815260408083208584529091529020548181036120485760405162461bcd60e51b815260206004820152601260248201527f53616d6520616d6f756e74206f6620465558000000000000000000000000000060448201526064016109bd565b3360009081526101c660209081526040808320868452909152902082905581811015612094576120943330600061207f85876145b8565b604051806020016040528060008152506129d3565b818111156120ad576120ad3033600061207f86866145b8565b60408051338152602081018590529081018390527f3e0d5a590ba8d04db40e773cf88b938280ed4080a2688ba8e8105fb56f58e22490606001611c22565b3360009081526101c9602052604090205460ff161561211d5760405163463fefc760e01b815260040160405180910390fd5b61213a336000606460405180602001604052806000815250612e1f565b6040513381527f5184a1d5e0b0bcb8ee2c912752a2301033333eba83e58729ac34b470353164539060200160405180910390a13360009081526101c960205260409020805460ff19166001179055565b60006001600160e01b03198216630271189760e51b14806109f957506109f982612f44565b610e618133612f69565b8051610a329060679060208401906139c3565b60006121d783612fde565b905080606414158061220457503360009081526101c8602090815260408083208584529091529020548114155b156122225760405163da92a67760e01b815260040160405180910390fd5b825160005b8181101561228e5761227e33878381518110612245576122456144cb565b60200260200101516001888581518110612261576122616144cb565b6020026020010151604051806020016040528060008152506129d3565b612287816144f7565b9050612227565b505050505050565b81516000805b828110156123b25760006064858784815181106122bb576122bb6144cb565b60200260200101516122cd91906145cf565b6122d791906145ee565b90506122e38184614566565b9250806101cb60008985815181106122fd576122fd6144cb565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546123349190614566565b925050819055507f47265b27f934438348d392d07a4bc3087b1f08c6ebf1ee5181b476356f18f67d87838151811061236e5761236e6144cb565b6020026020010151826040516123999291906001600160a01b03929092168252602082015260400190565b60405180910390a1506123ab816144f7565b905061229c565b50828111156123d457604051631036b5ad60e31b815260040160405180910390fd5b5050505050565b815160005b818110156124645760008482815181106123fc576123fc6144cb565b6020908102919091018101516001600160a01b03811660009081526101c68352604080822088835284528082208054908390558151948501909152818452919350909161244f91309185919085906129d3565b5050808061245c906144f7565b9150506123e0565b50505050565b3360009081526101c660209081526040808320848452909152812054908190036124a75760405163a95eee8160e01b815260040160405180910390fd5b3360008181526101c6602090815260408083208684528252808320839055805191820190528181526124de923092909185906129d3565b60408051338152602081018490529081018290527f81c3d6f4c1e03f5c57415284db949754444cf26d552e13742dd88bd8b13a89329060600160405180910390a15050565b600081815260fc60205260408120805460609291906125419061457e565b80601f016020809104026020016040519081016040528092919081815260200182805461256d9061457e565b80156125ba5780601f1061258f576101008083540402835291602001916125ba565b820191906000526020600020905b81548152906001019060200180831161259d57829003601f168201915b5050505050905060008151116125d8576125d38361302d565b6125fc565b60fb816040516020016125ec92919061462c565b6040516020818303038152906040525b9392505050565b60008281526097602090815260408083206001600160a01b038516845290915290205460ff16610a325760008281526097602090815260408083206001600160a01b03851684529091529020805460ff191660011790556126613390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526097602090815260408083206001600160a01b038516845290915290205460ff1615610a325760008281526097602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e3610a32816121af565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561278557610c5c836130b7565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156127df575060408051601f3d908101601f191682019092526127dc918101906146c9565b60015b6128515760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f74205555505300000000000000000000000000000000000060648201526084016109bd565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146128e65760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c6555554944000000000000000000000000000000000000000000000060648201526084016109bd565b50610c5c838383613175565b600054610100900460ff1661295d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016109bd565b610e618161319a565b600054610100900460ff166129d15760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016109bd565b565b6001600160a01b038416612a4f5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016109bd565b336000612a5b8561320e565b90506000612a688561320e565b9050612a78838989858589613259565b60008681526065602090815260408083206001600160a01b038c16845290915290205485811015612b115760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e736665720000000000000000000000000000000000000000000060648201526084016109bd565b60008781526065602090815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290612b50908490614566565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612bb0848a8a8a8a8a613267565b505050505050505050565b816001600160a01b0316836001600160a01b031603612c425760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c66000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b03838116600081815260666020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612cb881612fde565b606414612d085760405163d647364f60e01b815260206004820152600e60248201527f726174696e677320213d2031303000000000000000000000000000000000000060448201526064016109bd565b612d1182613421565b81511580612d2157508051825114155b15612d6f5760405163d647364f60e01b815260206004820152601560248201527f636f6e7472696275746f72732c20726174696e6773000000000000000000000060448201526064016109bd565b6040805160608101825283815260208082018490526001828401523360009081526101c782528381208782528252929092208151805192939192612db69284920190613a47565b506020828101518051612dcf9260018501920190613a9c565b50604091820151600291909101805460ff1916911515919091179055517fc122d799d7d6cf0e12589532937ae647267a673c8921450ca41c6d405ee6abf890611c229085903390869086906146e2565b6001600160a01b038416612e7f5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016109bd565b336000612e8b8561320e565b90506000612e988561320e565b9050612ea983600089858589613259565b60008681526065602090815260408083206001600160a01b038b16845290915281208054879290612edb908490614566565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612f3b83600089898989613267565b50505050505050565b60006001600160e01b03198216637965db0b60e01b14806109f957506109f9826134bb565b60008281526097602090815260408083206001600160a01b038516845290915290205460ff16610a3257612f9c8161350b565b612fa783602061351d565b604051602001612fb8929190614727565b60408051601f198184030181529082905262461bcd60e51b82526109bd91600401613ea1565b8051600090815b8181101561302657838181518110612fff57612fff6144cb565b6020026020010151836130129190614566565b92508061301e816144f7565b915050612fe5565b5050919050565b60606067805461303c9061457e565b80601f01602080910402602001604051908101604052809291908181526020018280546130689061457e565b8015610c075780601f1061308a57610100808354040283529160200191610c07565b820191906000526020600020905b8154815290600101906020018083116130985750939695505050505050565b6001600160a01b0381163b6131345760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016109bd565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b61317e836136c6565b60008251118061318b5750805b15610c5c576124648383613706565b600054610100900460ff166132055760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016109bd565b610e61816121b9565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110613248576132486144cb565b602090810291909101015292915050565b61228e868686868686613811565b6001600160a01b0384163b1561228e5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906132ab90899089908890889088906004016147a8565b6020604051808303816000875af19250505080156132e6575060408051601f3d908101601f191682019092526132e3918101906147e0565b60015b61339b576132f26147fd565b806308c379a00361332b5750613306614818565b80613311575061332d565b8060405162461bcd60e51b81526004016109bd9190613ea1565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e74657200000000000000000000000060648201526084016109bd565b6001600160e01b0319811663f23a6e6160e01b14612f3b5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e7300000000000000000000000000000000000000000000000060648201526084016109bd565b805160005b81811015610c5c57336001600160a01b031683828151811061344a5761344a6144cb565b60200260200101516001600160a01b0316036134a95760405163d647364f60e01b815260206004820152601560248201527f73656e64657220697320636f6e7472696275746f72000000000000000000000060448201526064016109bd565b806134b3816144f7565b915050613426565b60006001600160e01b03198216636cdb3d1360e11b14806134ec57506001600160e01b031982166303a24d0760e21b145b806109f957506301ffc9a760e01b6001600160e01b03198316146109f9565b60606109f96001600160a01b03831660145b6060600061352c8360026145cf565b613537906002614566565b67ffffffffffffffff81111561354f5761354f613b64565b6040519080825280601f01601f191660200182016040528015613579576020820181803683370190505b509050600360fc1b81600081518110613594576135946144cb565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106135c3576135c36144cb565b60200101906001600160f81b031916908160001a90535060006135e78460026145cf565b6135f2906001614566565b90505b6001811115613677577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110613633576136336144cb565b1a60f81b828281518110613649576136496144cb565b60200101906001600160f81b031916908160001a90535060049490941c93613670816148a2565b90506135f5565b5083156125fc5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109bd565b6136cf816130b7565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6137855760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084016109bd565b600080846001600160a01b0316846040516137a091906148b9565b600060405180830381855af49150503d80600081146137db576040519150601f19603f3d011682016040523d82523d6000602084013e6137e0565b606091505b509150915061380882826040518060600160405280602781526020016148d66027913961399f565b95945050505050565b6001600160a01b0385166138985760005b83518110156138965782818151811061383d5761383d6144cb565b602002602001015160c9600086848151811061385b5761385b6144cb565b6020026020010151815260200190815260200160002060008282546138809190614566565b9091555061388f9050816144f7565b9050613822565b505b6001600160a01b03841661228e5760005b8351811015612f3b5760008482815181106138c6576138c66144cb565b6020026020010151905060008483815181106138e4576138e46144cb565b60200260200101519050600060c960008481526020019081526020016000205490508181101561397c5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f7460448201527f616c537570706c7900000000000000000000000000000000000000000000000060648201526084016109bd565b600092835260c9602052604090922091039055613998816144f7565b90506138a9565b606083156139ae5750816125fc565b6125fc83838151156133115781518083602001fd5b8280546139cf9061457e565b90600052602060002090601f0160209004810192826139f15760008555613a37565b82601f10613a0a57805160ff1916838001178555613a37565b82800160010185558215613a37579182015b82811115613a37578251825591602001919060010190613a1c565b50613a43929150613ad6565b5090565b828054828255906000526020600020908101928215613a37579160200282015b82811115613a3757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613a67565b828054828255906000526020600020908101928215613a375791602002820182811115613a37578251825591602001919060010190613a1c565b5b80821115613a435760008155600101613ad7565b80356001600160a01b0381168114613b0257600080fd5b919050565b60008060408385031215613b1a57600080fd5b613b2383613aeb565b946020939093013593505050565b6001600160e01b031981168114610e6157600080fd5b600060208284031215613b5957600080fd5b81356125fc81613b31565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715613ba057613ba0613b64565b6040525050565b600082601f830112613bb857600080fd5b813567ffffffffffffffff811115613bd257613bd2613b64565b604051613be9601f8301601f191660200182613b7a565b818152846020838601011115613bfe57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215613c2d57600080fd5b813567ffffffffffffffff811115613c4457600080fd5b613c5084828501613ba7565b949350505050565b600067ffffffffffffffff821115613c7257613c72613b64565b5060051b60200190565b600082601f830112613c8d57600080fd5b81356020613c9a82613c58565b604051613ca78282613b7a565b83815260059390931b8501820192828101915086841115613cc757600080fd5b8286015b84811015613ce957613cdc81613aeb565b8352918301918301613ccb565b509695505050505050565b600082601f830112613d0557600080fd5b81356020613d1282613c58565b604051613d1f8282613b7a565b83815260059390931b8501820192828101915086841115613d3f57600080fd5b8286015b84811015613ce95780358352918301918301613d43565b600080600060608486031215613d6f57600080fd5b83359250602084013567ffffffffffffffff80821115613d8e57600080fd5b613d9a87838801613c7c565b93506040860135915080821115613db057600080fd5b50613dbd86828701613cf4565b9150509250925092565b600060208284031215613dd957600080fd5b6125fc82613aeb565b600081518084526020808501945080840160005b83811015613e1257815187529582019590820190600101613df6565b509495945050505050565b6020815260006125fc6020830184613de2565b600060208284031215613e4257600080fd5b5035919050565b60005b83811015613e64578181015183820152602001613e4c565b838111156124645750506000910152565b60008151808452613e8d816020860160208601613e49565b601f01601f19169290920160200192915050565b6020815260006125fc6020830184613e75565b600080600080600060a08688031215613ecc57600080fd5b613ed586613aeb565b9450613ee360208701613aeb565b9350604086013567ffffffffffffffff80821115613f0057600080fd5b613f0c89838a01613cf4565b94506060880135915080821115613f2257600080fd5b613f2e89838a01613cf4565b93506080880135915080821115613f4457600080fd5b50613f5188828901613ba7565b9150509295509295909350565b60008060408385031215613f7157600080fd5b82359150613f8160208401613aeb565b90509250929050565b60008083601f840112613f9c57600080fd5b50813567ffffffffffffffff811115613fb457600080fd5b6020830191508360208260051b8501011115613fcf57600080fd5b9250929050565b600080600060408486031215613feb57600080fd5b83359250602084013567ffffffffffffffff81111561400957600080fd5b61401586828701613f8a565b9497909650939450505050565b6000806040838503121561403557600080fd5b823567ffffffffffffffff8082111561404d57600080fd5b61405986838701613c7c565b9350602085013591508082111561406f57600080fd5b5061407c85828601613cf4565b9150509250929050565b6000806040838503121561409957600080fd5b6140a283613aeb565b9150602083013567ffffffffffffffff8111156140be57600080fd5b61407c85828601613ba7565b6000806000806000608086880312156140e257600080fd5b853567ffffffffffffffff808211156140fa57600080fd5b61410689838a01613ba7565b9650602088013591508082111561411c57600080fd5b5061412988828901613f8a565b9699909850959660408101359660609091013595509350505050565b600081518084526020808501945080840160005b83811015613e125781516001600160a01b031687529582019590820190600101614159565b60208152600082516060602084015261419a6080840182614145565b90506020840151601f198483030160408501526141b78282613de2565b9150506040840151151560608401528091505092915050565b600080604083850312156141e357600080fd5b6141ec83613aeb565b91506020830135801515811461420157600080fd5b809150509250929050565b60008083601f84011261421e57600080fd5b50813567ffffffffffffffff81111561423657600080fd5b602083019150836020828501011115613fcf57600080fd5b60008060008060008060008060a0898b03121561426a57600080fd5b61427389613aeb565b975061428160208a01613aeb565b9650604089013567ffffffffffffffff8082111561429e57600080fd5b6142aa8c838d01613f8a565b909850965060608b01359150808211156142c357600080fd5b6142cf8c838d01613f8a565b909650945060808b01359150808211156142e857600080fd5b506142f58b828c0161420c565b999c989b5096995094979396929594505050565b602081526000825160e06020840152614326610100840182613e75565b90506001600160a01b0360208501511660408401526040840151601f19808584030160608601526143578383614145565b92506060860151915080858403016080860152506143758282613de2565b915050608084015160a084015260a084015160c084015260c0840151151560e08401528091505092915050565b600080604083850312156143b557600080fd5b50508035926020909101359150565b600080604083850312156143d757600080fd5b6143e083613aeb565b9150613f8160208401613aeb565b60008060008060008060a0878903121561440757600080fd5b61441087613aeb565b955061441e60208801613aeb565b94506040870135935060608701359250608087013567ffffffffffffffff81111561444857600080fd5b61445489828a0161420c565b979a9699509497509295939492505050565b600080600080600060a0868803121561447e57600080fd5b61448786613aeb565b945061449560208701613aeb565b93506040860135925060608601359150608086013567ffffffffffffffff8111156144bf57600080fd5b613f5188828901613ba7565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201614509576145096144e1565b5060010190565b83815260406020808301829052908201839052600090849060608401835b8681101561455a576001600160a01b0361454785613aeb565b168252928201929082019060010161452e565b50979650505050505050565b60008219821115614579576145796144e1565b500190565b600181811c9082168061459257607f821691505b6020821081036145b257634e487b7160e01b600052602260045260246000fd5b50919050565b6000828210156145ca576145ca6144e1565b500390565b60008160001904831182151516156145e9576145e96144e1565b500290565b60008261460b57634e487b7160e01b600052601260045260246000fd5b500490565b60008151614622818560208601613e49565b9290920192915050565b600080845481600182811c91508083168061464857607f831692505b6020808410820361466757634e487b7160e01b86526022600452602486fd5b81801561467b576001811461468c576146b9565b60ff198616895284890196506146b9565b60008b81526020902060005b868110156146b15781548b820152908501908301614698565b505084890196505b5050505050506138088185614610565b6000602082840312156146db57600080fd5b5051919050565b8481526001600160a01b038416602082015260806040820152600061470a6080830185614145565b828103606084015261471c8185613de2565b979650505050505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161475f816017850160208801613e49565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161479c816028840160208801613e49565b01602801949350505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261471c60a0830184613e75565b6000602082840312156147f257600080fd5b81516125fc81613b31565b600060033d11156113c85760046000803e5060005160e01c90565b600060443d10156148265790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561485657505050505090565b828501915081518181111561486e5750505050505090565b843d87010160208285010111156148885750505050505090565b61489760208286010187613b7a565b509095945050505050565b6000816148b1576148b16144e1565b506000190190565b600082516148cb818460208701613e49565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c634300080d000a"; type FUXConstructorParams = | [signer?: Signer]