From 06aee1e57b94ec1f8801bcd71f890868a5640782 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Tue, 16 Jul 2024 21:52:30 +0530 Subject: [PATCH 01/36] WIP: - Implementing WAGMI for Etherlink Login - Changing useTezos hook to handle login with Etherlink - Changing Validation options when Etherlink is active. --- src/services/beacon/hooks/useTezos.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/services/beacon/hooks/useTezos.ts b/src/services/beacon/hooks/useTezos.ts index b632b473..0af1e940 100644 --- a/src/services/beacon/hooks/useTezos.ts +++ b/src/services/beacon/hooks/useTezos.ts @@ -39,6 +39,14 @@ export const useTezos = (): WalletConnectReturn => { signer: ethSigner } = useContext(EtherlinkContext) + const chainId = useChainId() + const { address: ethAddress, isConnected } = useWagmiAccount() + const { connect: wagmiConnect, connectors } = useWagmiConnect() + // eslint-disable-next-line react-hooks/exhaustive-deps + const openEthWallet = () => { + wagmiConnect({ connector: connectors[0], chainId }) + } + const queryClient = useQueryClient() const handleEtherlinkNetworkChange = useCallback( From 208b2495f1211e40bb8724f56bfef1f257ee2f90 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Wed, 24 Jul 2024 17:01:37 +0530 Subject: [PATCH 02/36] WIP - Etherlink Integration --- src/services/beacon/hooks/useTezos.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/services/beacon/hooks/useTezos.ts b/src/services/beacon/hooks/useTezos.ts index 0af1e940..52e0c1c9 100644 --- a/src/services/beacon/hooks/useTezos.ts +++ b/src/services/beacon/hooks/useTezos.ts @@ -40,11 +40,13 @@ export const useTezos = (): WalletConnectReturn => { } = useContext(EtherlinkContext) const chainId = useChainId() + const { open, close } = useWeb3Modal() const { address: ethAddress, isConnected } = useWagmiAccount() const { connect: wagmiConnect, connectors } = useWagmiConnect() // eslint-disable-next-line react-hooks/exhaustive-deps const openEthWallet = () => { - wagmiConnect({ connector: connectors[0], chainId }) + open({ view: "Connect" }) + // wagmiConnect({ connector: connectors[0], chainId }) } const queryClient = useQueryClient() From 903b90a1238da2e17189d0f25670aaef49d3a669 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Tue, 30 Jul 2024 03:50:47 +0530 Subject: [PATCH 03/36] WIP: --- src/modules/creator/token/tezos/steps/Config.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/creator/token/tezos/steps/Config.tsx b/src/modules/creator/token/tezos/steps/Config.tsx index 9638e0ca..8db27e91 100644 --- a/src/modules/creator/token/tezos/steps/Config.tsx +++ b/src/modules/creator/token/tezos/steps/Config.tsx @@ -187,7 +187,7 @@ export const ConfigContract: React.FC = () => { - Configure Token Contract + Configure Token ContractX From 88c90232fa44daaf2db457b9bcde6aa853d28c94 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Tue, 30 Jul 2024 05:08:44 +0530 Subject: [PATCH 04/36] Changes - Login and Logout working in many cases - Created common ToolbarAccount Component - Improved useTezos for Etherlink Support - Improved utils.ts for helper functions --- src/modules/common/ToolbarCommon.tsx | 33 +++++++-------------- src/modules/explorer/components/Toolbar.tsx | 1 + src/services/beacon/hooks/useTezos.ts | 9 ++++-- 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/src/modules/common/ToolbarCommon.tsx b/src/modules/common/ToolbarCommon.tsx index 6f0f4425..06a3da92 100644 --- a/src/modules/common/ToolbarCommon.tsx +++ b/src/modules/common/ToolbarCommon.tsx @@ -26,7 +26,7 @@ import { ChangeNetworkButton } from "./ChangeNetworkButton" import { ArrowBackIos } from "@material-ui/icons" import { ConnectWalletButton } from "./ConnectWalletButton" import { NavigationMenu } from "modules/explorer/components/NavigationMenu" -import { ActionSheet, useActionSheet } from "modules/explorer/context/ActionSheets" +import { ActionSheet, useActionSheet } from "../explorer/context/ActionSheets" const Header = styled(Grid)(({ theme }) => ({ width: "1000px", @@ -77,23 +77,15 @@ const LogoText = styled(Typography)({ letterSpacing: "initial" }) -const AddressBarWrapper: React.FC = ({ variant, onClick, ...props }) => { - const theme = useTheme() - const background = variant === "common" ? theme.palette.primary.dark : theme.palette.primary.main - const StyledGrid = styled(Grid)(({ theme }) => ({ - borderRadius: 8, - background: background, - paddingLeft: 16, - paddingRight: 16, - paddingTop: 5, - paddingBottom: 6, - boxSizing: "border-box" - })) - - return -} - -AddressBarWrapper.displayName = "AddressBarWrapper" +const AddressBarWrapper = styled(Grid)(({ theme }) => ({ + borderRadius: 8, + background: theme.palette.primary.main, + paddingLeft: 16, + paddingRight: 16, + paddingTop: 5, + paddingBottom: 6, + boxSizing: "border-box" +})) const LogoItem = styled("img")({ height: "30px", @@ -142,9 +134,8 @@ export const Navbar: React.FC = ({ variant = "default", mode, child const isMobileExtraSmall = useMediaQuery(theme.breakpoints.down("xs")) const { open: openUserMenuSheet } = useActionSheet(ActionSheet.UserMenu) - const walletAddress = network.startsWith("etherlink") ? etherlink.account?.address : tzAccountAddress - console.log({ walletAddress, tzAccountAddress }) + const handleClick = (event: React.MouseEvent) => { if (variant === "default") { setAnchorEl(event.currentTarget) @@ -166,7 +157,6 @@ export const Navbar: React.FC = ({ variant = "default", mode, child const renderAccountButton = () => { if (walletAddress) { - console.log({ walletAddress }) return ( = ({ variant = "default", mode, child ) } else { - console.log("No wallet address") return ( diff --git a/src/modules/explorer/components/Toolbar.tsx b/src/modules/explorer/components/Toolbar.tsx index 9f4d782b..6b2a6570 100644 --- a/src/modules/explorer/components/Toolbar.tsx +++ b/src/modules/explorer/components/Toolbar.tsx @@ -14,6 +14,7 @@ import { import HomeButton from "assets/logos/homebase-logo.svg" import { toShortAddress } from "services/contracts/utils" +import { toShortAddress } from "services/contracts/utils" import { useTezos } from "services/beacon/hooks/useTezos" import { ChangeNetworkButton } from "./ChangeNetworkButton" import { UserProfileName } from "modules/explorer/components/UserProfileName" diff --git a/src/services/beacon/hooks/useTezos.ts b/src/services/beacon/hooks/useTezos.ts index 52e0c1c9..08058a23 100644 --- a/src/services/beacon/hooks/useTezos.ts +++ b/src/services/beacon/hooks/useTezos.ts @@ -41,10 +41,13 @@ export const useTezos = (): WalletConnectReturn => { const chainId = useChainId() const { open, close } = useWeb3Modal() - const { address: ethAddress, isConnected } = useWagmiAccount() - const { connect: wagmiConnect, connectors } = useWagmiConnect() + const { address: ethAddress, isConnected: isEtherlinkConnected } = useWagmiAccount() + // const { connect: wagmiConnect, connectors } = useWagmiConnect() // eslint-disable-next-line react-hooks/exhaustive-deps - const openEthWallet = () => { + const openEthWallet = async () => { + if (isEtherlinkConnected) { + await disconnectEtherlink(wagmiConfig) + } open({ view: "Connect" }) // wagmiConnect({ connector: connectors[0], chainId }) } From 49899c289ebb4ce6129b5b1f4cd47484b9976198 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Tue, 13 Aug 2024 17:17:36 +0530 Subject: [PATCH 05/36] WIP - Lite DAO Create --- bun.lockb | Bin 1053516 -> 1060020 bytes package.json | 2 + .../creator/token/tezos/steps/Config.tsx | 2 +- src/modules/lite/creator/index.tsx | 18 +- src/services/services/lite/lite-services.ts | 49 +++- src/workers/deploy_erc20.js | 249 ++++++++++++++++++ 6 files changed, 306 insertions(+), 14 deletions(-) create mode 100644 src/workers/deploy_erc20.js diff --git a/bun.lockb b/bun.lockb index 8cc4c015fafc7bd547bddf9cc0b25eb977c2761f..1440fde50535aa4ad95efe2eaa1c2fc86e8f7b11 100755 GIT binary patch delta 166656 zcmce<33yb+xAxoJp&<>TDB=(Z5L8qU93e;m0TB@qQ4}x=5|RKxAdrN~fd*$0$5uB6 zQKC4ahztS>I4go9M^S^QaUO8QdAz^3YVFYQaXkO?-RIu@ki7M-T2-}b)v94vcl4!u zx-WaD`}OS)z4YzpS3P^~-Zy`A<{g*heSObMWy4M$KI5VbFM4)n{MHSLdASE3)+nN9 z{SAX##9BS{$keLrWa-$#c4NvTEqX>H4I+^ljltc()jd3(H@RI&(TGUo5BRR~>!RNf z{cp$@erV-38Lk6&M_x`lYPw?F1VQBX6QYp>@?;?iH8`fcUHRyOqay?1SUICO;T6h@ z%O)37;OG;*-i?N3uDVF1NuOw>G5RIrOI*eE;W9Ldp5(1T8CL)Nh->H0le|GUd2Bo5 zxt}7=k})$Qk@_f(D;ZbZjxJw@!XEGmlg3XgEG;T7J1KQ%^Vaq6?dR>fyetaQ?-(UHgmlNV2|C>~!FiHs;H z8LRF$M7}S2dz|H)`DREok^|oY-v>M~KN@KQu0!4$oHTio^ICa9k(`{$&DlSB?Ag)C ze&n?RRoA^%$1G4b6@v$Xrw{X8I1*GFCm?SLZaOy_X$qb?+_$w9egM1@+#k#t;mgIr zX7DcxJZ=POFFE6JpO|qws0OEls`%xiXk;%in}!Yn|2e}C<;5d?=gyx}Qc;L=x{mT8 zvT&EGGi+V1#K}X15N{__*t>9@U8Rw zXiNm9*MWRh+#Hn0{z0z=c>cIlWvk}NRpY%wc8mK6n^x-WX*IzY-vd;rPADiVFYXYD z{6)U{`6Vd%V-tPBDI#2hr=ia0rkU~)P9EF}d^85@urdVw=)4OUe3hL=|aACoi z$(R+1ES;IkKd^Z+%)S;iwL1}101UQbpI_n~@IEL9g}e{>S}Qt%a!6}XBe(~sfcObJ zHQTSh+>hu5pzJ&N3SVC_oavdI@el$v+!KN3%mJVxX#*9g!mU?&gN9z^r@$8Ea@5_k ze285Os=+CS$ATJ(Gr?BiTJ%-_LQtW#akl3tIXNSB%yr&_<=1)#wSjBMn}X`$@5qG- zxD5Kr_%on*($H-hIQA^Kdj2M;1?Ya`H-Iv{4JdKb27S?SoZ zlO{wWE<#XyIpzaoFimPswV$4U*lc{ z6<o7FFE6_`QG2TRX$?Yfr`9SkqcMC z)%|-xRd~DQ9|p?c=g`x*ECe+UDNqef2Ni*(pvDuol@*UFo;m_91BQV0Bj>O-kdWnv zf@&xWRDniLfq=Nf=YIrhAm0F$zwln)^QYl5-~mt#?@7<(nGf$v?R7}Uk-+maVSCg;Jr2m7yzsG^9{zy>6ACA`)^yJu~5BcUk1Xb@#hRZ>jH}o3shwcxX zgFE=djBqJwxY##v7E6cc@;FzT$AH*m)%hBjV(xegMW5j~iJ|P}N=LJ5ZP4 z*1(ldC?dRB-`-x9>U(JOzHOF!{g=_xz�SAeMphS9xjSd7RTCyRY!$PywpLBSASL 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

Ct_Y=e!u(rag>JoKqfE5ck#xE0SW zU;{^^#;d)rhGQwRvd*>n2k;NBM&8@Z;N^j zr^MqC*;hiJ|88WNDA+!kgx!O=7rul2lHsQrqyd$8rSGu&%N!dgMYt-(N!g=or&hT; z^axniXhiAmizgoo3T&D$Pu@KF0ybXw+EwSUXWNH?x-JcVvT$$K=S%N@ia)-2cu&!> zSME<*w`8CVzaPE8gBLa?J_m?{QjNi*N-is%y4K<&-Z-I(bJj`iLce2^7ADCRE7Iq> zJFx2Gx*@Z@K6&$m zGAv8`;>7xO(aK*JG>q+J#04`6KB`df50}3e=UC=%oYca&p~Xk3l`H#A*B2LCdGqO# zCrssjV=H)T^!6gWF(YrBx2I;VE_J2wl9t_unrMAk|uWqA|S z%e^ivOL6f-39689{DKO~gkIjxn6fI6I zlW;Hz|61Fu9_LOG^18OKhy@=^o8NEm^=>3gvKnLY>X=D`DOsaBX3$i33Uhg|yFf_0 zI=*tuxL)P@)UYE3BZGIVWAY3kVJG-ILawZ1Ru3WT!=$BoG_=n6_RnHv-%VQieOWtc z1UVu9PBTsYz<_MT*cJ2hQJIq7pXqG{Z(+;UH&s3-%{GL1j}V)ZhO9`Q>Z`JmAx70V zg9#C~gb*1BQEPD4wjca-YfNN_1NdaYXa2rFGKGIy`u#|sNA=B7;szyXV0I3}ywt#? zpXlc<-_SH4fjeU(Q{xNFB8|-Bp_o?gix+B+f8qW-iZC*;P28IQk(ez+NIs5Ds6vP5 z#@N&>{KU2S z*=A;&8YF5?HizoXO&5QE8*WewGk84l=Cm*?X~2-JEdm3QlS7N5ugjPC;qv#9IoQ@X z*}}Y3$a{ngA>`%`IT8#G`21RANSmkAN$+T%7%k19k)-wZdf67t(9#?sq+k7}eaY0Y zF56#2mdurB8NoObZyoCDNhmded|EIgc_VXWLVSb<9C*)F`P+kW4yV8QiR-T z6Bv+!m@oPi_-XLA+p{8@@pT)sV>I(6ZChWL6#w;Pnfno;F(N}0#7AA=irIEW^?NUO zM*7rjYvPX4Y$QY)Lc||DsOhRJO}9mc_`IztMF_hL*%==6u&o(~JnTziF0;RxpmvYXxr>=dvjES)3&xX?b6wZ^-I@@EZ1Hpc$MS&;GjUgw$eW*#NRnvH?iCn$+EqJx{B$bIWiJUx4smbnCwr@kuG9ER9 z)@Df_JZ5IA0PG&qh?ssI=rK@Q^h4In1tI0Km7>+ya0AI;>pR*-ugj8x-voJn|d_MQPnw3iHRabLBX(i}pUdqkvNH!IB z#%|N5Vb}p>v!2l1T%8yS+%fXxhRThuGG*;;R62YTQr!J{zI}Lf`JIowak=l~ zjcQL*d^(e~2q84x`@dSTyLdn^EoOyj>d-;~WqX=#)7@oa)Fnhxvn$*k9CWXzIX>N; zJ}7@L(`{DVq$cJJcQOgn&TyxQeUEUunKS9f#|<{MX1KQorSD@BhLcJ0KE7fcdzpXh zj-;u%Z>50T74edUX1If0UMuO&?`tZ| zbT{?$ifz4oSzemyt`(BLf1uvv4vyC6^)J&?zKTg!dAZN!4!BHzQ)L!~sYwWRVfJE+ z>St;EY%(E23*{-mt#G6MX0SrEBSbnvL|i}l-NV`^*L%~*pQkX-*Zs}9Su7Q^`kRp1 zg#6Y?YscnC3l^`t_=J#Qn~`{{zZr@d_JokS2S~Q2M!_OU2XrB%hBP7L z4Db#1n}g1zSXp_K?sW2V&yG*p0p_97$UeZNpTh_#KEM>6gS*-Q(*<`(Lt^Tpv2<+L zt>F(RswTP((2yr&ovt4`Z-v5yhn#MdZ%p71ID~+!Sk%$nTijUZL zWmaWP!h9q__FD#+%yUWO2qAPC&fE4(_fwk|=n2%hp}jo7d^(q#jCCG zF@jtJP5cPPWomSdYiu>>aHqiTOFP$kV^TNX=fhY1+|?tDOcz~(>Q`O z$`3RXNF$^HA=Pei($~%w7Ja_%arYOB+T{K((`|LOH)W8 zci^KXs$|okZKr>ZeZ`xGw}lT6GB4**zDtDALOJKxS*4Sg9N@dv$fqgxY>>%2pPD4_ znAVtKSvNtF{!`t@4Rq3?&V}(&Iokic?&psSe3l&_#!vwos)ENHnNQ2s^O#)S z9bzV=j2CRWE_SC0+Bd{>TZHF7pT|OtYq7i9n?j}ty7GlN{tNAQ_Y2=_ z>{w#T$nK{u?x!?VTw~-eA*xX4r=$^bm}b@>{B6#TvSZ3TXsc&VTAB9=nTDIDODJ^d z;U>>lB-m!SZ^%E*v2}CXIGZv=hU`Dw)L2T034~C02kaa;GgZn$2_r*f9bvALR@jOW zzHU#JH)Z!f%XS<^p`7Q^hv+EKz2Bz#Mb1pwhJxb1%VG0x!h1VC&AE<-U8vJE!MBki zY)PG5-chF_qs(gR@^_u;pdle6Y0li}{$YH+Czm7B>^;i-MaZymgwQl8wD3;0B`g2> zIx@sFS}qknJ=RTfH%O5@DAH%qC{yKY+T-nQ`@fgemgDWYy*(G(a{t+LVQ=rbx2GPZ zErXnr2Av#Z9x@t&b__D$|lowmsdvarvu#pi!b>k}qKKSo2tEZX0V{%b6=z$C{GMaXU+t>9(9{!8)~5o)5;F zr_0?rGQTD{@9hw(F0>l#y&Cc9+-6TgNH)LkVi_{dlwP4JIL=I1L8pI6NUc40PqrA= zu~xbPdfCJ49&Xhe;G<6OHahRP^DSfMiuCC*&g5N1Tn`~Mp(8`;Iq=bCI#;I~(`t^~GbhrgzOWk^6$vZsoMWgEGMK1U(Ko>rHub_JDqOj|6PDLCTmW9!)n@i zif^c$tas-6l_wLXFvOgPf@M=o@ip}A*{P=P8rt~zR5MCu6JvI)afjxlPzxEWMGZm7w%-d!Ll(JXUympfVXya8!unE~rbX2LA9dOgAB z%`yp_u(p?L8aI_`+B$Bku;sISMauc{=D9Vp^sDGya`WmMycr+e!({T5%l_-b^hv!w z-s||WS?2O--r=?0KxV0DoA3?3ERJqqcJ7|-yE*#wuVsIpy*}nWZ?sS)*lmv4wuwTF zoMR$(5WT=gW}}l<(9*eP&PL|g?z!gSMv^%_*Ec|aYJKzGZzKCxagt$@-I#0AZ{j}V zPeQ1C38K%r-Yhi4clYhRM@Sf9x@;mXUxrme-cm>I##2R@%$q5E_6Sp7W|0UpW-~>s z9$^;a4yzyGn+!iDH+d2dZhO;d9qt`cQ%${$E!($r_|{!z<9U7Zsh&>tf?7tHoh{?0 z2zh%uc8xHNw@}wXBvs}32Q-B>X5$5t1S|QgwlWQw=D>TnE-%46@=K1bJ?zdPOqr_*6 z&p0t?*(LZSA}#mzV)rXgp6Jv`cPN|YnU%y1sZMUXhe>*R%tt#GAO6XSOG_S@XRdE$ zppx65ZM-l3=ZK3s0{`VU&4=;u@@l)gvyEwn?qGKM8Z%tNZW|c5IaM~#2P6{FUP=BjIk$*!5?)(<{ z?otZr%J9K*vwAnBtG3+SBxX?6WhTcScTtrQ5_?{TLM zS--+}n~`Q>r7o=^CijlKI38JHLiSSl>nlvyUiaXTf~$OY_>W)oo?CcW*ShpjUf*42 zsa59WUdBVb)h7KuOzt|n>~rUEZCdRcK|Xn~*|^W0CZyLlzM7nnbssje6v&w8l&zWJohYDD6ATZq@3t zW`-6tt-h42{Tj1(KWTC&|F}G(tjqy=qvsma`~dAVc#TUWx+$4BUUHM@ zpu6VZ;RhUaCw9HSU-u9827SdrMrq}>=Ey-x$&LE$gX9o(y$(Ob5*l-zIev&0Z5^9L z^xT#|u+fY~+qakxx0=<22#UMSR5?z_{q(e+1~%pV?DM#*(l?6?*<_pf>lh7hLl)fb z3)%7fujfX;YBxSIWQFZ!Flhx5Bm6j}sJ_D-Jx;l6@x4x6kve0vxiupS-13&&dud4V zt*LQ>v{&ymb52l-?K^!9n(NS+hbxXJDXY8mQ16)VeSJ$Bla(~!z)th<1nHmNY0{r$ z#kjfCxK5GJeCLatyH`8UnJa(g3<@Nwp7jEr?c6x#lshCaC~TKmdYY)tbuQ%YF5e*R z|MYAT&$4dy6@@M&O0zW^6Q6O11qS(YOJQ1`b+->%v)3Fs%NIP%SwFZ#Q%1)(PsC{))S8SjiKJs7(I zAKxiGD$&IDeUhq0yl)uKoi_z;QomLgOnaIAE|`d0^yIpm-1QB=V4~k*IV^k8bh;Jk z8Ia02{(Q;Qy^a50m&}gaG)~B6bM7|ba$GiX?=bvGtl=H*GV)(G7v(N<+2puO z_{CSvq`SmVbIp``O1$gWOoe-dvupB|d+t+Owb$K8IQ6;-dqAQOubYw;xKVT6@O^){ zHuAz}-&8xKT@?j3z9hty|wT!*&<$2ZJ`x?GMD{>+*jTwxk-WmMC0KU3(TH%&j8Q*N4-KkKgUrmv?9Ps=?e z!=A+dUv=LZP}LE%4M#zQbK$C#D_)S;q9_PNi3JI^#DWNxSc1fgViao>4M8liVpm47 zVeg8HqQ-)~pom6|1r2s=h*)B*?=xr50YotQzW3M5pTnM=ot>SXotd4TJ@}UX1M0?rXiXppNdOQ?9s~U0QmWV5PNxdH>Ip?ryR7PZHhV_mn zsckUO@Ml(~Ep9y)%vIzscjk6IgI96{F#=Y8RVE%<|KMcP`{?v5%n&ea%_4Ji*^SCS zw<@pBeyDK}B5oWssy}&Iy4M%~8~`}G1Xv(DQ<4rohm|z`j)XGy4y)GNR%clI;Jpfn za^f}nDP_C>W4ApuHE{vNY@g?w!sDDS0RlFV`}_kne8T^}_#l6Wqmwwu&)NVr|2!r4 zmuTydBP8l_yN(?e`2ABV55faAe9S)l-EjNxEB-8NY{;QWf^sMlZH?i8fHsak*Lr|s zE88J0^V-hKp#;Xh6A(24u`&Iy>))q3RZ}38;oU<`HPrYm`SxgX=VqCCZS~LSJ-4m@ zOh80$Jm7z%vpKsOOgpBpCu*2!B~6!`bQ|N+BClrjGn)2LcAy@ATa}ZhKBMTrLFOWW zvl6erqjIN-w`x`eI7g{rHP=6*#J{nJIs^y~qV4w#srvW#(>PqC#=`HQhF!M!k|l0W zI)14iYB&ao`N?@k##g{z=DF~DTkU(0<`a8~-B3Oy0e08t6bK0Krhs5u5SP$8d3C_W z#wr8`(g`(uoH$x?+&z{pGrtD8Z@Se@O-LB~_{S6z`wxI0Mb8`6y*iBvt%DxSn zaeYh8yD5NBkMe9$!#mgB-vJixos0buvku>mGs50(&}k|P>p6= z6|3HH-#5(-@!gafj(wT*enETC);LUsDF1EMVv&6p`{ngJ`2}S&_W6L|-Q;&wy&taM z7$zoP8QnIurbyuVSoj+&Gvn1)ru;qqXv6alr)QPQW=T+eV+{$OUEe~7?aZM~Z=vV3 zUd7Xms=b5qD2P{~MG;CgPkV1=H+PBb#DwPlj~4MCpo$Bk&DSkpbH||e;8p?}ICmKQ zQbD42ua@1-In=Hq0ws^W$Vv#nyiVEFtjaf7(xV%jTXU;a@aS+2jo6k!+^3;Y9XPSx zrDcC98EmNq;@4DwC=}$tQXBHCjmkP@P`Sy5+LZxA)!`a%BKpGmy1`M4s%!GJ)TTFb>Bk!jtYdcV*`glo0?c_G5T044eFV~WSN|A>H zklimu8UG+Ew$VZUDVN|krIKnHWOz>k(O2|aS-Gq6$He%vaY-xiLlXA(HGK?6MC>!XaBZxRt4LTytj@+GOoIKbGc~86BW&Nu` zySIWNyaB@seTN!enZ@pZ-D-u&{Sl~PqX$;m+EXOjN)PQQ)=7>w7LDVjJ*|2#SEp}2 zSeBrk&fv&q2a0o+<37XIi3SQR&#twBc9s`{^{71fAOzSzBfrKd`?+9pg-jTd;$39d z;!?Wx zkX#j1ymb+LTI}7U^_IiEhbnz2X&!!G(6p+cS43D0lw6gWU6InOLKPV+NlNUjYrQw- z3l zQL`HL-hg9=&6~-Oa56mgHt zG5dXhQY%*r)A}Qj@PMyQ_`~$Xp_S|}t4LHstXYm+9jsa{;~=!;9ma%-=3zU>-JG7+ zQZ=XrCemMm<1no@SXY=;7mk4-Ja?8qqPiA49FN{YP;@mZ!y63N%$N`q14TMuXmh@X zNF;fP75BEg$?HZR9Oi&F)>`m6Rh3x4k}7hlD#uXom-dpfyIEj4eAkK4BWKWBRa}KC zc*Q+F?m@owG1*tqGw-T;42%lwHgVwzv{l1W&parwE+C4wjw)wqVO{t`+F*-$k_+ao zmLA^`V|T(jXGzQtZoOGo*1`INHZ7W+6!^WB1C{(B+td7d@)w#6NGm+)Vm&CPR$h`4 zQHYo_bZ?nQucrd1x+c}(NU%m7>&wynyiy+u2&}K_gS9@}ih_MmE+|#@l;a~iYs4qH zHemY>o=5otST#Nb<6}#{4di;1h5wSi{YH*4H9q@VNb~H--)v6!m30R#oH&J55?hC| z{4niX>X1c4^nIib`80$!E>%}(Aeo@omM5e9J_!BG7VxbZ;Uc)47FK z&W9ng34EyF#!x3fx1lje-B+J7@ce&6s}aQLqys*bz}=?!(8(qs@Vt*O$O$PMuDJeX z(q0`j4B>Sj@@fj>mC}Gxn__ir^CjT$3-K%3ymgM(lF` zi5UCzR^`P|ZAL$e`%Z4BZWml7H$P=#@qaFO=;#l*`M2O*ZkkxG`Tfs9yNqwKp_~|i z{lPguNr}w7`Lp!xKQY)W0$51p{I#`Lz>naR=q|;f!+L0PMP+_Y=;5D%iW7T5kJ(hK9Ap3JALh! zz20*ThbBEt+BBqe^egpgNUnj9tjvZK5-7V`nlutlm>LMyVvgl;pzuAalpWl#J#Jy= z%y=t}1VwjGFOwdPC?gPJIkpic1YxBu03=7m*E(H0eqn3Vmy&61_u6$ic@?o>_aN*N z3j{l$;vV$sqZt#gN95$t2(wAyKVXjhg0C-~=d6pOwWYg7_)(k1G9h4&+%F{YL#L`g=z+o%i2MGirBY7dfSwI+oR>jF>g1jc^&(U zj|1P)YRsElJ7AaB$7OBNbwlpoZPI)U^YqbIG?frvp%be8yU&v_qo} zyA|6B)DOcr%YgcOn?}s+aC6Y#K+V1+3`=5js?`aoA^v?j@vck6tZ6}KY>r)8QtFS8 z0QZ*U(+AI{Eh($B?B!laYNe1rlm7VPDoazlt0SvcH`YNmWtWx|@Pq6kjciE+e}Gs| z1OyB3wwYTb-HcQdkizx|HXu%I`{-Vyk`g_K?Ta6WNQ?tHyB-jolUcy zVNnfx=`_D@X;hQd%H!p!c`Q#DOS#V;yv?i%5Y|u|=!BiSwMO!8A-!NLG5`r+IH3fDBA^ls@ z;;vw2Ol#VS7TUB(6I+sbH@Qir0~n_ZFkA&D_HjImZ9S0r<9LJ|q7bg+-G?!VJbD3x z$Y(N8d^dQW-GgXPH<+#>a#7F>Su2&gqeC?Ti3WB@vq3==gA5`qVe0c4Mc8KJ+fX7i zOUw0c^A6 zqL=LItED{j8qzN;d?-@J+C~4eS-<9$-c-|dMW3nlQ1xe6dpgAogEH>d8&r&MPmZB@ zQhN#rl_PSsrUtL+vIUK(cyCOJ)>F~?S6~iRdoa+W-Z1}KGgVfM(>e%y(znlduZCyT z7e~8F&b(OO{>Ej1;Lu&Km@@TerEKdC>ESuYk$-6(W zG!Krw3Z?}I)8hUBTiJ!e!%;rhC23-~ywg281;ZtHXR^<@9xFg9Xb zgSH)d(n7Q~4gduAD=i*bD%^L~(!93gdQuu=UkC_xT>5UTcBop{x*Qo(acoBotB&_4 zj<@*Z&vL!;YA*C7=b>nu4G2EKxVAJnICy=~1r-8JweBStQe$EB7AyTG@L`jRwMsAQ zhqlIMfZ%>TV>WEb8R6%V*S1?Pif8P@0KxYw@AU7~ZA!hqh?y%mfPEHf*bPfQAOG~X zfD}GBVeC+(YkE-@x80{=AG+mms|vGw@5}4|Pt@=<*NEvB>vDo#R53ehk}2F2?!nz6JQ-i8z59h zW0;76MPAfzdAH2l8NJm)KpQipid`;_eUZSSB9xx?rN{_~@JAhJmH+Wc3PyD>g2aM- zrj10O1zvvKr#h%ypaQ&+><5x%B-R|>Jm5xP+AJH#xDSTzFX$M1Qa9Rai zP0~fdOK}}SHKI^oYY26X!d$i;BII!2_!A@NCbdMyld?U>Y!5*VOZTz)mnv^Hea|wa z?j|P=p-pJZgHf_^GNLdkK#rhsUuFzm+CqCpUL zW5q|Ky_TENdo-vO7g`Locr*e4-VtOm29QvCK4UQby&{Cgr`vaiT}hu3qX?Ta{R41~ zjUh$>q7;S@A3Vw7c|@&+c@SFq$(}Lt7#2Ifu^3PB5!87s+@NwJX#7}g?x4Wa$3kmX z8zCHp2C1D}I$8EjRKNECIa3WMJ4zAbK-w=OXu~*QDmIdiavAlU1+6+#w&tw0%8n%W z->@x3UH&9&>G()`{~OxE{u;)k9$V$a@r7=c(XsM}o%SY2owD=hEpk$=3G!}JX-5=g zPsHGlM~M}Fu%nY>{o_4Y(PTXtJWwZ){3c`G)l^So%5TCM*83eD z{%b%Yt7=ssul+{XCqs4`Y^565(W^UrJ2Pl;vB~%Heul>E>>Zi&Dy~V~vop4)_wk0~ zw<~($a};>4nyEi9#w0RQZ)!STL|*jc>G%}c)y#>@RKA&PSE+_t^&ReYl}4l0Bi_wQ z`#K;?Z(1KUjIQZ;@`z#SMA;VQV+~9fc^&B=W^4L`3ZY4O{t$!etsCfM3C$w}*1gG8Wd`26Zl})t96N=k%>c&fQ$!dm<(~(45~qJT6Q=_h6$|~mDRgj# z9O~`5U8HHI>Ywet*|^(R7&vc>z?1g)0RcW1dA{EA(9N=YJ}4}~WgKrFW5`T6U=^nd zouJ<9rFAo*rnQU8>SbVK1b}$*mPVyl_%5orUhN={Rpv~PxGL;ri~%%Tz3iM0-_Kh% z^A2~)feR0lc~dDe|3&AOQz>BV7{QlwqwmKIN=xY+=nl)88FcYSGR^@9%S;!tSk`84h}?H_zJn&G=@bYE?ZURP0WO&9 zL3*X~j%D6$v*e(?7M&H}aM4)vA0Y4bBJ;VR7oo&@bHV9HGeiIaYASp#`a}$H;#_Ea zRc+C*nR02#Y!-RPLKw1U(YRQ-9t&%7tlWfeB4@8aBRp}|X)CZ9=zx3Dyto_ArNEmw7x-bGY$tV?OMV%GpnQatD*>GfmwzrDpNGEkEu{F| zCCxaC0Vg%gkR7yvDK9+JfxT(?Jd?Mm;RD+y zZ+08^{^NQxucpjA$^v`6E6o$@r}pX_Ay561+1Xax)P%Z3tl_>JRyTC)hEm9OTf{Dt47 zQREU>1N%jiiIZ|C-r_6%7vrHcQ$$f-ETY>>;MqXV{o^s(zDtA|X_T?AMCmGDc4x(n zDS{pwv4o-lAx&69aq)5!-&ufUXM80T3Fmp0j2{;MVc{6g=0*!ddrWW?p=?vkN(`Fu zdxLez^HPs*Otjv9LTH~g-;ktfqkW|>d?i!du~4)o)?46G^ajXBc+!}qI1nl%uCJbS z6aeStsx;T0KvQoSq8EFYiK$4c6|s3s=UK^^in>A#ML5y2WpaoGEf>Qf*Oib!Ohea| z=>GfVkZ!Rk4K#TGT zBUaM$l~5^@R*}alNN(IJm7HDuo^_sipOw0*>(-)%dH3N%_tZuaty<;PB(9?PHL_iK zDA)ZekfYh;iS-Xzu}`Fi1y8P`t*antmsZ8DMnA4dOJ!{5(@W$I<0IICL3lywv zbo(CMFthK<7D zPOF+4*6dIJS_-%lBXHkHdp2XKe**{(QG9W#%HGF^t&9o;>r;~s8!3CU+{CO8AY?^r zNPRX^U;?77`!`Z@f@~Od0ad)}uV#)I(0Y@b4vkrpW6Ex$hW9Un-E+KpeE2>=sli7w z@MAEj;o!iqZJkQJdFQuGGJSzJoY!sKBs9fTo8MlZ4hkHAHma8#Gg0XF*4s@-M>g>0 zkTKV=fYsbY!CPQ;)sKkqbI%qC9G(}q!1|s5QnrW(UzMu%)%oq_XsY^T*v^&SifO_) zH*E#;uP4yktvF;`w3Yg82ZmK!>C`s7-@KLLxr{;AO2i&38P};2WrJlhemj&^AKHyc zlrz)R<|7dZcTyBO}R*pf;22d^$Blq{=ElO3er ziREa!LkzoWb^RXSDgMeih)}B4QNvM^6~?7M{qTK@Re5cj?4ZEku~sT2A=6^R4l<%3 z355Pq{UizjV#z;=B6fl_wIe#b6Wid&+sSqpj6m8>iUfVRja7QJ#zy}nF}1@he7KTw zW>%fNzOU`1_uNvW!DBZR;Qv3m{Agl-2P!cfFW^tY7zY<)k`M30INI)^SNp(X@$@n# z;P=1EfIU?n+Pe5(P9G(ix-whwr$SI*x~wOc{jw!x?8n$c_K`<25cS?i`Xd;@(0vq@ zjOVz0)b9+qnUIX`kxq6h8JcI=ehN4Mi*9#7$gM}esR@;K$328-soAN{2Po};K$md@ zn;GweIQMY{I1@FdL{x|8b<7_F92c~BbJ0nyI(_6{;AG|K?=S=}>Yz{xeFog@*t9`VjZX-nn8QE}UMRh)JfY|6OE3ugRfXhGqyDha zg7<#?qe9s`(s zgffp|HEO*pEVMr=SQ!1RN7eBi@31Cij-$5$M=AUSSUBb=`Dfv|^eDNYY&?P%e6_(p zZrJK2!M=RfUYmX&$JSp#y z)KMA8{WNMXpCD&Q2}@DW)1Y0mM;lMW8z`9)3pCzsQ^czIYUhy~cNZu1%oE9;YE6{` zv%8rkRS(Ild6z-~Xq!u70n!SP>ZK8-(c^7$TGbNIvNznWTWLGk#kvnlI0V0T$0|2; zibMOFR17u9D{y);=amRqYaY2+Ue@IsOVRWGH*8A|vA1HtD=PjXJ2 z$c^)tT++z@Jl?ydQRsPubud4Q-8)r&Ue@Agd#|u$y5kz2hlxLG*wVCVnsDY1zm6^P zYJNzgRK|f#lizi06W*PN6QFL2B(V=NP{0L{N}5DZSI7>^ zKVJ|Mjy7MF&ActoiXHUE)+3K}^P48Z`koxucSa4{lJmE}I5TOl$3PGPVdv8_58Rr& z2qHj?&ou~5)0b#`r8w~MYR5Gj#1yae&(;0PL@M*O^(~~2nZT1M@vhu+# z8hBZ@peieH3*n=#YM&E~PELq!9rtUSFNEB?JR;&Rq;wuFKzkM3u4#G?`S$GZrn21w>ui^k-}) zlG4)ul8w3DS!WawcJ4vzl4a7oI1abd=sm&`v?&8~uN7`)Ac~QGN%%eDrI%XiNd7lq zbw6d?=F4I`2g*`!VD_*Guiwd=MRVlVfpuiOiOEwHg0XNW^S5s_Ju)Bh6DB#~Cd}Pu z7q0PhtBJySjTBg>ngD;acK%(EKUp>dZ$qsWF>IQ4S9UfQuCjQXmS-vW4%}HW#Cl|Y z4V;G%C>pK+3l&`CdKXbIl@t8zco*RfZ8e~`7Fwl+hK9Osv9u$bd$L)6IA>l;E$%@R z0|}Ovy_v0PuJru{V58xh(1c}w>)6=IEaW@{o%f*#Kq%6dy9Sl11+4*@;IZI?Jw;{8 zwi+eM`efnD9of&_FwUoJ8AUWW-&d27M(3E0T9*Qm{X>@4z) zcTbkq2&yc;wiVpDKiU$dD4cAPrw#y z9C0eg7Bj4-fAf8&HTMvq_~5uGKJEz)>>J+}E)j00JbHqbxc=jkjp5@;(Zp<&#pNSI zp*M%^w>ho0IVO(J)RO8MHw)LadCV$ToQ&%}6KnAmQ4mhKxw;BWRH9}Ui zKCa`to@nhjB@YrA+QAHo+-BJfhf~OPoxx?~B(KY1k+CKZQ=OsEWNpzGM&j}gEs)I| zZ2=5Ot?l{@+wj6Nvqg(R?zHI{Y=6;-ze{a|cx^nHZpch-#d~aZWNI&D&RlSR4vz!3 zc6vTX7KKI!($E54fbykxXyFUcg|z$~Tt-?uZu#I!yPoR2#1=THRMPpEEO6=&wE>Xj zD`4ex`B!3Q`TK}TF|Xu0rW%NPxhFJ#AKhQWmTKJ7uBq6+;Uhlnt(p>TEF=}0LvdI< z+8DH4>!S0(RW55e$&!}8{khz4%I0~x>Oq$8Wv{{|Ebu)qb~}oB56GAHNw~@b4yj_K zrA4b#Y@nAPaQd~$X6{H`=x0Q%o6X#}kf5UHRGR>8^qM5$LPiv1Pl~dkd8RslO|rBx zlb56$BW-y=J0w&>V2c;iC2F&2oR0_qJI`wdT>Sm)Ae{?~5SWbUiMVZKAj`3G85;Eh z*OXj}>vnu*07b2lZPw(+Yo-AG6l11y%q13=<T zyutr*#~_E4-Fb4ZtzhKT8!U9nT>)iv)cr?THP-DjFN@YUuc7w6`!>*B=yznoJ~2?YH}&? z$?hrTlmZ_wKBX$9A)hy&($LbnR4Fuv+--G8jVXifv9Kb_0EKv&Dp~(c?`;A6%irX0 zr}H!xIU0nRYr?3peCm>ml~! z*BqDq{|UnOB*0!5Anklb*?|8K7?E1WAHCqjWOIlAK!f&041?B3ZXz&J_pHl;Hp^S& zYe3&&?Zx@a%%nqy!YX)9EOIo|EC*Kd++I6qDO#z=u_ zu+(VZ`G#sZLJIV6sVknwgE;o#BZUtaYqpg#=i}H1T1m;&z`?EST?JU zBnbTVai=!rbd8ecmDA}>rCGnyI-|~A`tn!0f@g)!_{a=zp02k4WkrYeE@gY6%znUV zhxXPVY-?Q~ltQjfI_FUx(gfVx9Zm`M6A~(SSIZ-I?Wh`bD*IA@lv$YuH0qE#_+Z`X zk!pRNl699YTi?`uf?A(&ZFrf6P0F2!MVbAeeidfeM;-WS*$R}|;iL)4E01sSOx=Mp z@A}uB%UZngN7stUr|^PZvs3r~I`~WP*(YzH%(0qwq3wb#$0Z(okVX$cX!rF`1R?w5 zuYS`dB;I~E$~?e!&2QHlUOjP7!TN%?J1G<_pk+5H{lFLytj=PuYjxcY>H&bp+7&ekanN8vY$YP!`_ zf33)kqfMUfLwk?x*0)=PTaRu%`h2~WKHnh*r-L+Dmp+g61|A!3>9isg| zWO%p1{S|y+{Ra*hJXHBttsJZrhV>deBy2!9|KHbi2o3sD=Tc573~}o*U~n&$oW7#u z=0SdOx{3;bo7z$%SS^yip00Aa{1gKqf04deV^i5i{Pqv3#6MK(xJ_k&RuHOT6(#gL zdbzHmQ+|py2(@2;lsao&(J6md1$qX^()t?p8WS`$qD%*Vx2Z% z0Z;3S6mPCCVeiJA&IiH8`~bFYJT3VExX8o*QuH9EFkiiRp)hE|q^{OUle*e$OtMU< r4mFIw Date: Tue, 20 Aug 2024 03:04:41 +0530 Subject: [PATCH 09/36] Removed unused deps --- bun.lockb | Bin 1055084 -> 1053516 bytes package.json | 1 - src/workers/deploy_erc20.js | 249 ------------------------------------ 3 files changed, 250 deletions(-) delete mode 100644 src/workers/deploy_erc20.js diff --git a/bun.lockb b/bun.lockb index 476c4471e235d8e12514dc9621abcc669cee9d79..9277286a493641e39137066ce5b0f8bdd2659078 100755 GIT binary patch delta 162143 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
b-+`XKXGf8m;|(LCIhXV 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 delta 162536 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 z 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 WqeHg~fC8-z^-Hj5L9w { - const erc20CodeOld = ` -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; -contract ERC20 { - string public constant name = "ERC20"; - string public constant symbol = "ERC"; - uint8 public constant decimals = 18; - - mapping(address => uint256) balances; - - event Transfer(address indexed from, address indexed to, uint256 tokens); - - uint256 public immutable totalSupply; - - constructor(uint256 total) { - totalSupply = total; - balances[msg.sender] = total; - } - - function balanceOf(address tokenOwner) public view returns (uint256) { - return balances[tokenOwner]; - } - - function transfer(address receiver, uint256 numTokens) public returns (bool) { - require(balances[msg.sender] >= numTokens); - balances[msg.sender] = balances[msg.sender] - numTokens; - balances[receiver] = balances[receiver] + numTokens; - emit Transfer(msg.sender, receiver, numTokens); - return true; - } - - function transferFrom(address owner, address buyer, uint256 numTokens) public returns (bool) { - require(balances[owner] >= numTokens); - balances[owner] = balances[owner] - numTokens; - balances[buyer] = balances[buyer] + numTokens; - emit Transfer(owner, buyer, numTokens); - return true; - } -} -` - const contextCode = ` -abstract contract Context { - function _msgSender() internal view virtual returns (address) { - return msg.sender; - } - - function _msgData() internal view virtual returns (bytes calldata) { - return msg.data; - } - - function _contextSuffixLength() internal view virtual returns (uint256) { - return 0; - } -} -` - const ierc20Code = ` - -interface IERC20 { - event Transfer(address indexed from, address indexed to, uint256 value); - event Approval(address indexed owner, address indexed spender, uint256 value); - function totalSupply() external view returns (uint256); - function balanceOf(address account) external view returns (uint256); - function transfer(address to, uint256 value) external returns (bool); - function allowance(address owner, address spender) external view returns (uint256); - function approve(address spender, uint256 value) external returns (bool); - function transferFrom(address from, address to, uint256 value) external returns (bool); -} - ` - const erc20Code = ` - // SPDX-License-Identifier: MIT - -pragma solidity ^0.8.20; - -${ierc20Code} - -${contextCode} -// import "./IERC20.sol"; -// import "../../utils/Context.sol"; - -contract ERC20 is Context, IERC20 { - mapping (address => uint256) private _balances; - - mapping (address => mapping (address => uint256)) private _allowances; - - uint256 private _totalSupply; - - string private _name; - string private _symbol; - - constructor (string memory name_, string memory symbol_) { - _name = name_; - _symbol = symbol_; - } - - - function name() public view virtual returns (string memory) { - return _name; - } - - function symbol() public view virtual returns (string memory) { - return _symbol; - } - function decimals() public view virtual returns (uint8) { - return 18; - } - - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - function balanceOf(address account) public view virtual override returns (uint256) { - return _balances[account]; - } - - function transfer(address recipient, uint256 amount) public virtual override returns (bool) { - _transfer(_msgSender(), recipient, amount); - return true; - } - - function allowance(address owner, address spender) public view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - function approve(address spender, uint256 amount) public virtual override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { - _transfer(sender, recipient, amount); - - uint256 currentAllowance = _allowances[sender][_msgSender()]; - require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); - _approve(sender, _msgSender(), currentAllowance - amount); - - return true; - } - - function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); - return true; - } - - function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { - uint256 currentAllowance = _allowances[_msgSender()][spender]; - require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); - _approve(_msgSender(), spender, currentAllowance - subtractedValue); - - return true; - } - - function _transfer(address sender, address recipient, uint256 amount) internal virtual { - require(sender != address(0), "ERC20: transfer from the zero address"); - require(recipient != address(0), "ERC20: transfer to the zero address"); - - _beforeTokenTransfer(sender, recipient, amount); - - uint256 senderBalance = _balances[sender]; - require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); - _balances[sender] = senderBalance - amount; - _balances[recipient] += amount; - - emit Transfer(sender, recipient, amount); - } - - function _mint(address account, uint256 amount) internal virtual { - require(account != address(0), "ERC20: mint to the zero address"); - - _beforeTokenTransfer(address(0), account, amount); - - _totalSupply += amount; - _balances[account] += amount; - emit Transfer(address(0), account, amount); - } - - function _burn(address account, uint256 amount) internal virtual { - require(account != address(0), "ERC20: burn from the zero address"); - - _beforeTokenTransfer(account, address(0), amount); - - uint256 accountBalance = _balances[account]; - require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); - _balances[account] = accountBalance - amount; - _totalSupply -= amount; - - emit Transfer(account, address(0), amount); - } - - function _approve(address owner, address spender, uint256 amount) internal virtual { - require(owner != address(0), "ERC20: approve from the zero address"); - require(spender != address(0), "ERC20: approve to the zero address"); - - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - - function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } -} -` - const contractCode = e.data.contractCode - const sourceCode = { - language: "Solidity", - sources: { - contract: { - content: contractCode - } - }, - settings: { - outputSelection: { - "*": { - "*": ["abi", "evm.bytecode"] - } - } - // remappings: [ - // '@openzeppelin/=/node_modules/@openzeppelin/', - // ], - } - } - - const compiler = wrapper(self.Module) - console.log(`Solc version: ${compiler.version()}`) - - function findImports(path) { - if (path === "ERC20.sol") - return { - contents: erc20Code - } - if (path === "./IERC20.sol") { - return { content: ierc20Code } - } - if (path === "../../utils/Context.sol") { - return { content: contextCode } - } else return { error: "File not found" } - } - - self.postMessage({ - output: JSON.parse(compiler.compile(JSON.stringify(sourceCode), { import: findImports })) - }) - }, - false -) From d39acd4ef29cf9a1e5cffb484a251a8e62929cc6 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Tue, 20 Aug 2024 03:14:06 +0530 Subject: [PATCH 10/36] Removed Unused Code --- src/services/services/dao/hooks/useLiteDAO.ts | 10 ---------- src/services/services/lite/lite-services.ts | 9 --------- 2 files changed, 19 deletions(-) delete mode 100644 src/services/services/dao/hooks/useLiteDAO.ts diff --git a/src/services/services/dao/hooks/useLiteDAO.ts b/src/services/services/dao/hooks/useLiteDAO.ts deleted file mode 100644 index 810de2dc..00000000 --- a/src/services/services/dao/hooks/useLiteDAO.ts +++ /dev/null @@ -1,10 +0,0 @@ -// import { useQuery } from "@tanstack/react-query" -// import { useTezos } from "services/beacon/hooks/useTezos" - -// export const useLiteDAO = (address: string){ -// const { network } = useTezos() -// const { data, ...rest } = useQuery({ -// queryKey: ["lite-dao", address, network], -// queryFn: () => getLiteDAO(address, network) -// }) -// } diff --git a/src/services/services/lite/lite-services.ts b/src/services/services/lite/lite-services.ts index 9efe3475..a24fc0c9 100644 --- a/src/services/services/lite/lite-services.ts +++ b/src/services/services/lite/lite-services.ts @@ -42,15 +42,6 @@ export const getLiteDAOs = async (network: string) => { "Content-Type": "application/json" } }) - // const resp = await fetch(`${REACT_APP_LITE_API_URL}/daos/`, { - // method: "POST", - // body: JSON.stringify({ - // network - // }), - // headers: { - // "Content-Type": "application/json" - // } - // }) const daos: Community[] = await resp.json() From 86c221a09f122ab37775ba60a30698f9ba0feb00 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Tue, 20 Aug 2024 03:39:42 +0530 Subject: [PATCH 11/36] Removed bun lock --- bun.lockb | Bin 1053516 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 bun.lockb diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index 9277286a493641e39137066ce5b0f8bdd2659078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1053516 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

@cA3Ykl_bD9~LWeDYJ!$%gJto!e;n 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 z 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%0AQ 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ν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

LE5~esZKNJc=x6 z9<2E}BT$t?V3Oinp=MWKaugNd27qox@3#FTr}-Qw3Y-X9X^47&qt~BkqPZVMDj&1M z&k4u`Aa>nLtEc!0e5jqaacBJKU#r&{q>uQiqGJ6$q;ek&Ys;yipvQ(eM`s$IS~I@URPu|txlfsiP-rh>uGMb&<$D-DdspN^_OfSU>~4ts1I3Ya z4*E;r<&4I@@`@UTzabUj^~5$g>b|~sBN|iywnFpwx3-T8iHR3Fh$${-p$FArV4XG; zbOVK$3L*o>yv7!_hwmedF;Zk!Lw#yS1{KIm;uOOf%~=)8&SaoFU%Jy3DD60C6gs5J zCK#$JjItow^YHdQ>H_%<1KsOi`u3zk9Jn~n(g{!Vol;1CoKzmdt;NlTE?F{qnQk*L z_sgL|Fm-oR%3Nz16CsVtWsYC;(R5q{W;SnX)WEt?IOvY*>RyGU%L(bp_w^%aar?h7 z9wz53GPD{?YlKZDYA0CD!=xm&S+5~43HuP6L1M@pRV7-vR~KlH4hme@oFxKW@x_utnX z9yi%Ogq^@pp`sSD!i$UxzRRAB^v#l3#qIZ#trPcLGqsF-o@YZWFCvFlgrFR$HIbvH z#i6IF9_f+>=dPkbmo2d)l`j1;l4w(4=J)Y3I8<$zU~CcC9U zL$1`dGGgfo>wa-<=GM?GOwn=5p9s8v?J zUnqZt>vC#Nw3@~?a2ttSmyIYhj2Ed#6bOZiK(c!KVozHcK{&kw#tvl5p zG(jkdTAaYR_$2|eslB&Yau00`R>rt!TSoc388%r)(G%;J{0Z>-8xOiqH4%nCtLnbd zzR-JHo%PwuYvLh(lD`?1hWnEr5AWBkq|-|q>Ob!rvybzS&8JwnjgN1XGIAxr13qdS z{`MgZh&KUr_dDz+h4#%&TH8t5h~f-}M16a_Vx4c}1^(?G^FVSTi12W*eoomq!*}p} z`$6+vB%Ebc>thUy<))vTX9X+@Sl37d-TU~r%>h*Bem~~LU>53U_^<0X44xf`jAf?@ z+-~}nEvX$Nfhvm<(S`7|0xIHoOcu7AhWPi+6xp&i(6L$$1wgz>pbIexB_+C3mqwd! zk$Be-6j;7B%}jN%99LjHOX}Kj+x%`9r6Qt_-NlQUWXtE5AFUtsC}(i-%>QBSF5kN7 zx;=o?E!`!Z(%l`>-QC??BHaywG}7HENHF%#i}m8i0wW2PA$bz$R+9#FVelY!K2 z(;R{xnwu^}R_{gS5Xt_`Hb37;BY}OvikO0lnt8V^OODTyVntN|4RsWC;viQ2mT~SG=uw(CK}BMsKdMZk;9gaIO_~5`u&;b zlLO%9fNtmUDEY%eayhYv|4WV{j6$Io3J7`gq*gXz%^48b|7cNe~t7Ku4o6Rf)IHX;~+l$ z+4Fkj1-t1Z$mws#(SZ96bou^!`2MoPKA56{V=sv#jZROlJA}*&<$ja?y}iyZ6#ez8 zNg&R{pyz$>UC9zR&OEbOPGMM5GX~zN>ZCv`26$Z*gKlI|jWC@YZs7dQQ&b)DlA%QX z7m}ku`Av&Rw7uG@$YFt>Y&-%=h01Bw+bqkJD)D-jWG<|8R2`H>Lx5OF;KX z{r!o|#dg8Ph=Jw1ozja!sTjyethm>?{t){=@Q8oqVkuuF>#x}z{IiE&o@wt+UZeB*P!?m5ZE}=1SALw^43~ ziY8HLPe^Yw>#EOATP#b+WQWrZO{C1*&>0IgVmnBbPaDeB_5)Ar8zz|-khdIk^CAht zHagwD9#Bw_bWY-z7`gq`p#KQdGVzMkc>@(sQTpHEh2$)+pw4r*wm-+2y(>kr5H z99poLi1fr^R5w232aX-${g6v~gXx<2*`lOWek>yWAV2RpcmIw@5CvRsR)Ov}73s=K znG+ zQ^81^{>f%6P~U3M?Mko7-G-=3fhMx7JIX2Sbf05wq;IbxYCmL>j@qo24eKTjxk}j* z9F{%uW;|YCP#%^g_>~?yEJuXN92%|d0=PAxOI^1RRMtkC-6Y-DQb44o;L9y&NNA9$_W^KYxq<-L)1LRr%|XC#auHGBPOwYPJ>Ex4}WskJr) z(GVI21OR#KKv#8szPSk^W%f^nAz|}A2UlFE_gw(ut1<3~XY1eQ^~cl!h`hH7m$2rf zi`sc74?fuqvh0L+i(_IzA_I4`ky53FAjN4~cbJ24-Z@4F$ z7ouHsR6jX;ex}j68jd6Lf3&-_8(cA~Dq!bpgZ(Ft7o1_h8yO6^4WJt+EqEz)Mo59s z3N3yHkHv3@$%US7(4V5~m^t-Ob}Sz6zC(}9!*R`PNHSvX)TOxbGkGh>P%-{n6oaxi zBTO9NHiB;E4@H3sbJGTMTe9B2>mrp>tQdZML|P+qq1zCu-3TZHHXi4q0cR$}!KR{C zd8Ncr`iR}@T6FeqyzPXtmDovu+XTABzU|Bdi2n?>I4zAWd?pLdK6r(h3UEYj_5U@m z{TSL!RE8eYm6gZZZEP~=6EaVW%tQRU2U|{7jH((G`e7q%}(oH|6ocwC}x!_s2!{&e> z`8b>wa#k3>7x5vY4oXLiR% z9p4AK6dOgU-o3$#D2{eOqo=b>&9+cmn1uW^xlklX&@)zSjM29J+K3QH=w9`cU6=rH z+d=n@(j_BtF5{L{i)pv+v0R1Lbo%!*bjzMvnL(ZsjfbdIlhidlyT0eOz&=q7iOcIk zI?uVs!fy?k7Z;+T<_EC<&;h!6jHnHX4zqiF8QiQ_nB+BN`>aW{E+pA1VJ?PYaMcO& z69)_4p1;XvPU^Ql;AptdPe&nd-}vYUyi3MeY^=Zm@^*qQvJbcR-EyGe{a4$!$X3`! z793g4eLG=~%jCl*vAec6jp`~GuiL#ly|bZ~g44B<$OuQ)T1?(_tIp44&TKjMfZGMS zNg0P1!|)*&>#Li4l9J&y24R;j9dQOM3qcp9qH{Hv%1;R`XbT_cG>b$%TR2!RH+U^oCn&1>!I(U8^!XSBAz#W$>7n_PGW}Oc$b^K1qpw%oE)Wc@vb!FH-92T zJ=4A2*`rGi!IYurit~`VMq_>1EOhGostHV7a6Qxwx|*0f(0$INW4*tpAfH43;WL^D>ouYkNYw%|S7(pUac7 zo^+7z0)n6fzx;8X-t+ENx@+$daQi@4Jyq_W z68Ygw(4`Gq<=o99(dJa*!U<#IK2>=DXK|E#6JP!GV`Oy~W)eNWk42A*b)g2OhJGl- z{5AFC{?|rfy<{ezP3V&}~GlgsZCxK0geAE`E$LiA)O|zo!z9-Yh*L=7(`Uq3oEW zCyfhhhJjdRjn@klNs)Q`c9xhGDVQF*xdo)R4}~uxxt!a$??T$hpMW|Hf^H|ecVA&? zCnpZ|z!uF#Lh*YHI~{yk>{rsPbjJrDu@g30h6*V;UWfY`dnx>shE;t>HcB)f{+;`K zb!5|}Jn;8B1iE7e=S?+!!@U!v5 zA)}i4w|sMSRZ}OEv9(o@Ir)K<2DJy|9R}Sxevt@E2II-Ue2b+h@Qt4L#{^z$UNf-e zqgI7u+p8ja?_#pMWOj_{C=qM0?&foEG(=VzU2N=jtVLGPTP)82cLa1tixO7%oX@yn zNj2jFvnt(B$x|${aq}rdcy!Iz&SaL4w({Sa~k0qgXNfBr8uW!hD{o{~yYD&mZlaXWX)qnKQ-kThXGWLMD z?u)*NtGkjdVgDpkxCFvzA2kEmpBw{SeBGBt`c>7Ma^lwFi)u^?I{axF?3vrfI=yw= z@!e0U(R;gzgCE^2FAHa1Dz5dhqSL>KEksc7t&owwH}t|Z1oDo9uFMDK6~l@P44dC( z6K-CWqp3K8f&Tx>i?-rqn~s^eNrmWEGrrSA&mnzE&BNOy3Yws6(+E7w8|+4RIv2F< zIRV@W(Cw($ZyU#9V3m63k@?@je!;Z|GL)$5=kkJRhF!Qsn%+=~k)nO>hXF{^!NHKOq z=16-xkf%g9O4Hs)9y^Idn<;G;CDE&25q{I=#IP9L-$<1M+$qqd+Vhc6_nVvhsB&K| z|J0H|y?^nO(ztnB>5S4H zaDRes%GWZJT2|MU4%L#VjmvfPPWtlBk>JkwhE*B6<2`YC<0QAcywsHbR#@YPsy0w#UFqaJ~?;U~uTWPnn*&@Xv;j3X6WGLl> z#iqasL4>HFv;Se=T%yn`o{_xGTN__g{ljg2mGd;+4Ul&RbSqiMq&wIzzzJ2ibfjC8^M+wf{z=3$hEVGK>^%Z z&^>(2`Yt$2<)6)K>*wAEht1;F2!p8`*G!mQeeLs8Iwv=MXiM1RdE{?QNHvt#s%{PT zxeM{FM57kOUqb0FJVL;o16@n*%KXQa3i;qFE!OYbDuJ3Uknayfv*bUfJ2ftu_a;VI zk1@^+M#2d(HMlSSl8fy4?mLGphRHomIHKE!0tNP~=Rwz)lc*mdLAXy_6>(?Uf39zm z@q5ymM36qx2f{Z^ZNi2#b$zqD{YnAV%sZ92NIsa!3M%xEYyoTJ@?Z2}zvhDXonN49 zlM&M?j(fZ8u6~nsnlCDa30>$mV?B5bFMZU~c7Ja78Ta!Sl$j5x3AY(CsU-)JZg2=K zbQ^GcVRWDN#yA+k`}zXt9?oa_ewkZ8Q*A-Najm488(<5r4Rm&Tr9^r+F(@HCR-I0s zFs58u!d;qPgnRN$E_Q=JEMEerRDL7OCYmgb38?QP=)$`-G6ahzh{O5>9Ti!_-j(;1 zsOqFPw#s62m1M6D8RwOdY11BFBiH6N$hu7zNgck zK})jRLQwUa(t}x|Ps1Br2fb9l^JN3lq9x$2fbR3!d@>76zOehSli(uhgm-?NV$ECC zPc-%_m3wz@cAvT}dGg#KCo=0bPj7MYh+tpskG!<;lnW~r$(GgI_rHl!~Ha$?eHNkj0Q2My>O=@~&jag%mxU?H^H$WHnm@VB2{;#a} z$)^MTeA_<3D}`eBpw5|og2u))h0{q?j4$xb+-gX_`P3_sLe|2u_A-S!j0A^dg-9{1 z+CPE!$={$W=80(#KchLlMb*dYL8x6*&XxTAXE|NJ@$}k$^a&4jXQO~k6=8C!+k95Q zDovFC62}J=y2+=69r>0&y_>IrK;BKzH9IlGPpxo4L4H3%|DYjt%(frf@~ifW)H!s) zPB2!|k5sB&Ib483EdO-N?ButPmu<1NawdAuFvZOD1P&I$IN)x9uIUwW8T!Nvd?1wC z`vjG0!>F+NW+O{s!a0TsR4%Z_{%Zxr!n59}+bY4gcf{^KU#M8+f(+eHVExb>(iRowBPs1aWuguPb zWuS`8L`KpW$l8Iy^`ciyo^M*!X|KTs_LcE*T5^09Esig>`(h>jB zT4)Ye^X=)|&%<~Q>WQllkf!KrsOxUmJ^Di7X8W!gy^xK~S(Q(Pc{uYwWM98c4g>Yw z2VFX-fl+C)lEmbUh_{&bv{o)Z?_`FD_`qMNCfjncP%KcR<}WDsfck9_Ow%Ty7}n~GQppDE+qSHf7WmUTkD5!hLSw}CzJ3J5{R&QcP;tZw#^3;ggTg_p@zLK zeCwEtuJ3|;*KnVBfV@YbE0~-1Jicp4k;c*6Ual{AVjaRm_~*EoRi-z$-`Q?;l9X_Z zN$Dz@aIYE9J?Q7BM%kt@=uJ#hiDy^Ot6DC8+sP`x2lu;AKsWb( zeEJ=dLgf)1ZZ-Pbw-bqb%Ar%Q=xD$5Op5At$lG`_ z)pHWw!$bX@rr>($6m+!{;^zgCB#l(&MG5}l)bL0?2iu0KmT)jxun_Cd3PXcdKu{ZP&&qKeD4dS*COL zctt1Z4vcU#yDSa~g7Nikf}LmnrBEfC4}sV5CFsWN$y{Wz`*GSF>7QG?k|_!F;9R>l z%lAGcire`#Wr*u+$e`JqV2#XJO^*!o{o`|zBOhW?oCwOmK;xSJLQe_gy#iggEH;#< zpU=oKa0fU)s^xGt#BWrZ4O5x7^`-WUs7YfR&VAVR6PU|?WjMu6=4#VZvWn#?$f^=Yxek)&9~K2Dmq%dlp{de_$#?igP||G%wDLduF2Wm7d}A z!*`{9q(XNss02e}h@6c!<$R>GU&y9NOp|spcb)_f5?Za0EH2Dn;-Tit)P_ zR_>(Z1>9%216>x{jjtUm=4D!ysy;sa7k~LR`g^?`BzB65eXT2(gvrO~C30zguTCGv z^9RW(QkF=6@kF)bs3u&j+wKlfTh<2Za1Xj=HMguPL1`I(%B)#h-224GY*m-*7kf`6 za=!0p{7i$a?5OTJy!DAxS%0_ln;v3@!~N-`+RJ`1UMNTNh-G^La34TdZgAXd6gT@H zv;tl{*7L{+;e*eYl}zPN`wX8L&YEbJu%OtGon4kX_KM&6hTXnrCXN`JjCkl5wiH^w ztmS+J=anBpSK?FExSCQ00qQRiwJy*dg%jq>X1K* zP&H4D`mz5tA+&eF_d2`aFc$M(O9OeIKvx-J?EFlGS)sFH)nH0ZP6wiP9VZMc(UgO% zG2IJM*liCn+t#kY4Xw1^eM_<^!~)q`5Kb6p{mXhUrZf-7ham_X|hkAXnyD#W801Y@0G%wsZm#d z7_VlBg#^(U@9YfNIo~0dKSowsxfb zD9c;~Zzy0lL=T~GH~?+m6QBRM*!#-z%C&a7JLTc1cSv3W)Zq6TtU9Y4P!O?Wx>6l(?{Ti?TjPcs$;n~mf*9<)b zyiY$AcNMA)3M~!c&l1p^1Kwe1D<-lmbjE)%YH)B~hdTVvjLLtc?TA;U@{z0fI zZn&>=a3n99cjV^qNl?Q*B5mD%)>UG;;VGZg%<~w-jS(;S58y(9?l*Dod89@+Hs7z* zq4Xg!(;R6FX%p?J+$4GMSU;{RIC5S&Cp=LV!^7(uu<3SEjbqg!3-J^qmQpB#MTgit zg#i~Dbj|kf<4JW)2EE?tu(s1BF6na)@2QSnmQGI`9JuJLljr)3KHI)|BWP(qh;Tos z+&sud3Sj@+)Kxm}7fAmn)&jUNpbIy!^!~m|U)FIZvojWLhq~xHv(OOrVR^m{3ufVX zF|7pRekn;^6{Y8A!dmx}-bpJY6BA+rM!s4d^cP_w%1>M00BLxM1b6UHnNXGLJ z%t1YS48%6IDHXaok;z}Z6Z#*Nv5QB)cdUxJsWjec=Q3L{)baL*C{P`yGi(Lp@~@on}VR`bXqyb z#@X(ixbQufA^}AU4@)zU7anv~bNG+NwPb&-7M;$NDf53~%S&xztfrz~uAM9@_e(4|XPtaAY$UrNI09-`S zWjiT4uAhTSxtHW&rHz_&;;V~z8UP&jb|`XJu>*JsfMj&3uElX=up z|MPEaH7Z1?zQ+y$D;mBI>`{(}fjfJi4&giA;C>4-=rVQ>mhjqjt2^KPkE->Aj--u;jWxh4q5_CI6gO!)6>2#e6B{dp;> zt6{{CKM*N+?tX*cn|TMi%V_9fJB&`zC8!6nK6TpBjgUXLe@l&5a&8~ae5lx!L;Uqw zB64r#y$e5_)X5L=_F&ZzN@-r0pM6WvVX=}{;QRwB==PcWt%P7TgSc!9gBcBlNfu6^LN^sqc2D)g+ zyL{-`&`UQh3(1U z7jUE`KX+UDgqs2NMF(9BHmY>;qQ4vHY}rLd|Gh+5wVscMEc)u~b%0sA#U5LnPRNv# zc6IoK4->INNX*hihcdjA_La z;{z(>0vYQ{mc}u4fr~RX%&|!YW+?ieC`DKX%hsZDVR8q;Plo$PRWAc@4jL15AL4}6 zOHubY=^`=LDdd)5{|aoF-}$jEYCQ)S(DQ^6&7e>XW-$v|HD@7|QBc;Ket8Pv_@L9Q ztWkl9oT+D;4CKWEU4`e2EKKD#ab<1X9E-51Kk)+d7>FlNt|j_T2Q9Ux>S?^8mJy#5 z+_XynPzMNd-k}e|knS<|DG8Ov->WXfegRx;&<*>knD^8z;#=fZt7q$TPkCtl@yhJ@ zA$Lovc;PDRcaBYwbdthS{b8pMb-`zopYR%5Qn#qT;CSl)&@3a6s3RqRk@v zT`K&JvYRamY_yf$Fxr&vCZi(iq|2|y%EiQn6!VT!&-}V_8Uz+HVlm_29x28zLS_w} zr-Ip>&uZYD0xsxc_PUh(+=dm`f*MeUGjsbxtTkd-ci2TPK4w^>`)%+m@oz?=VXP`V zGh(ESFGElN=G|SA68<}mG}f?{x!m{}TnFHRuDQMRCpTe3-PQOxrba2K{G$K9p8=iu zTB6YN-mMA`>XpaKSKo>;V{0f${}ZGBxu!0;fW+&oArkS|tXY$gU*J9@KIq1a{2MI| ztYaUnUELvsw_qi><$YuQBG%S`DCX>iR>wF_I(kO7K(6_1DBvx>7!NhYZh=n~h6M8C zsn^a5+bwt<6M*g%>DQMBSdq^VE|loaO@$Olwl%5s+$JSnt9s-N&eK7H_Z;^eA_N7c z5%^T}&O8;I;kZtnd`te^l4VdBN=RMB{qm4^HX4dt7T^+rZg7$xaYsi@ z9Oj3FM6tRri@(LO?aqGXs_Qsc3s6G&RNoeHe>>3Kdu^3${7Oc&&r;Fl1EGBD6BoJy zKS9r`m=3tapequ@aXW#9fZygni?EQ5TRgiS7;itns5IBAFL_e#?4`o)D!ZB4w;xnl z=(X#4#JDR(ZpPGV=O0FM+z@?R3HEnLK$pLh{{Khniyum|MQtJ$pxI6!qkDk2}a46 zswZB+eGj_Xp9kM%8QB&@KKMYR4h$_NpB%wVG(yb#k}R5usJtpY(kv8KXReDR{xDMg z{=wo+Iy$gI<|n0qwhtOFB)^>y;F5tZXW8OmTh4*?xVvP;h<5V{oX+)y(CrCi(B^d= zXXszWV}YmhWKH^a;_2DR6=mt98Ypuu07jD%aqv-nW{;X5` zU>}A8bpMCv7*c}n;`8n3-&Jw(iIdMp|Lvfxj60+D)>CSJA-{ax`*StZFBGiWx{cRz zNc^ilk?F?E`X;?DxJjZq$*Q(wOrRlN45%*^=zhRswI83liWtY+f2bEM?uxJf_3Ogs z9&Icn0d>@4LD5)iLLEu#S0S0uzqn*LkN8p9U@i920|&O-``IVrO7J?S23-vrDD`U1 z7WXQ$O={P!#IK)wx*Bxaw=sy$@=Fr#!yYB|6v9QF{qfG00y%Na`BYb(_J#S*HDw_b z2m4v2<9+~nX+W36iMF@}`Wl@|>#LG#@^1lEC3dQ&nFqBPiegNmw2WP2&lbV`O>c8D`lOqDqSc^N<#vnj5?-1hV9XT0>D1lWOS0&N;UH9s`GkA$=x2^t8L@D%D9 z%>^fImvg@hdL2}yox3#On8RR~^j${sM&38Q2V6$b{U6rh1L%tAGtE|fKq}(Ok*kHM`SV?6KU_shxo~U2p*8 zWddDZ6D~MLlb2u7&57&V%YkzfSGE!-YtB@Y`q)VsC(zbHMY_Fc?7`TW<6AzcKGs@e~hhH-Q58V_87=U3AJ%xz~7p!bsSvMk>*@ zM|W0v_iMryzdtSoN16S{2&TR(xU;MA@nMHGnp`UDw;a!=Qscjf_ANeHWeEjZ0eM+L z*Y+>{Zk@8Mr`OeQ{$iGHl@f|KEEKbd2tU0;RGJkz$kP?gNTbfDDYL=4e+ojpYE9WE z=dx`_sXw27(jz%O=>jer=uUi%84LXO?AkUtF*?LgWSSVhPXf4{c~bk&&QPIFOBzy5Y6JmTlpgrV;mE_JGtS+itU%X-@1pez9La)2(3 z#TGU0wfDXD?OOFNInlx9(6@2PKZ_8L)Al>p&4LUk*8WupEqe+<4Asb6pW*)CY2!=6 zjUY+M6r!~Yty?|;E+^==^-{8{dIbA9{~+MYL>8|gWy!{mAf}CmEk^x^xUNcTktY5# zWS!ElNoS2Qn(LX?z3R_WiOAy)>_ge8Jyc*U;BtYkWT?khulglgc#a_1_i&1f$+J4O zUkeo)tnqwIhq&-b!()8kUC0y=3GLSHzQ&S6OJ_?O9Dm8X^*y)J>57IN0$gs;4HtQB zl2U21qeT3~{oAQI`^$BGkD1q|nn3Z+0k3e)sww^@DRrYCGEtwIEERs`vJdYWMM|p7 zC+wg0GF00c8-U9Lx<_Vq#}JvZuf7a?W{aKfX}JCpsQJEfTYsXNi>SZ>+Z5rc&#DU)6h+J zf6O0Eo>;;~eCvSgc12>;i`MqhRXBFYj)FY%1ycx)aR)B)_W7Pj4Seq71Knk@5C#|O zs+jOSzk6 zaSOl|1zpMq>GuK_$O7l-e&%S-Dctr`;^#hVP8YB~vasiQ8TBqL99SA#-EycO)1h=XpwrLmxs%^Jb@J0;4I zhxUQ5b@sDbBx5V*L{}JR9%$FL{r!3husVVg8xj*lbyopXX}zRc8jA3Cp~D)^Y=6P^ zyaecanzxprkw>s()cCcSJma6O$<_qWq^P^8Gss^2<&F@h~JS!3I7CaNbA?bcfW>6F$%pjg#EqIfftz<)E8*{%}97b7Lp0C~0)By5I zgYFdX&@ivxiDig?kZw#iLyEk@Uvpvh5vmCaZmSC`Qw#s-PK^STEJ~Fj&&YGbCwABs zwpHL+~6p8PKgs-DP$Y97zwF3Z|GIq|1RkR_uW^KM4N@DMqOwm9KCl z5X1wi7ij$BQcdKgw31n+B zL(S)%b<0G7nR0wCa6Kdkx`U8+Q#K|7&UbXtf6zc%a(KJ4L#DyfxH&N(t4Lj){R zxm^6X!|Gl1o z)L6Z1gAfA6z|kD$pPY}E{ZEvsU*EUKeEOlMq&NQ9*HRV!OvucX;%c#ozPlA~C^A?e)Gw;!c50=0FJCaV1C?Lb~-&@DtK z77WR(xmqe)o%^W|&9(DYYvvCFA$tY&ucGppwW$6izkB7eANJNyJJh3-G^64Fuyr`1 z0B|9E1#}MGS>&5DZU&Ltj^FGh$B2BM|Ain4suGr+sIOe}Jn2x_F!J;hyxrqz3p4F)KN?(lDBSNTtwg z(|oE)G;QgCcfE|5&`0(m=^8iadK^reY{c`HS20++(}sDb{2W5^54`_sg05OXgBsd@ zV`cCaw_O>&EAMOC*jp0=>=nw*PS&h4yOWP3(cFsh5T$g)DolQ(d8T>TEqKzMAihI* zG~GXChXa4VTA-`B+nuvc)=w+c9@_3<7=wuPc;;8$^tAmc_xpQmx7~FF1&tILn76d+ z2NSZhOe((G2z0z3mFD{DSW;qiJCfjjmNw`fJIQn>Da;29^x1gu-CQt;@#^ZG*!IIz zHC8V;-kEh-98cwEP&l3IS(+o>W6@N@`aAAfy!Up#;}=(oZ?ZB5>Z=2~4b)xyF@*F& z_YjC%A{AVk%$+wi@E+eS#Ip8~o1gxTP~kIB8R(wT1|+A$NlUTPX{WSYd(Q>arSzGn zkl*2F0In|Ra>lh4K-%7p8rmD1PJAAp@le;PQl>G@&3mrzQncp(Ccb)W@{phZJ?Wx& z5aMbidpS|^zmFk%ag)^xnC6C^5dp3q=;pWP8JflA*h@esvR|+-Qe9dx+h!fbhxjEt zyM~9Al0D(EZe`9aJe#CT$4o=uX@AK0bcb^FIffN!$Df4L zoZFc~R8}UL!4^&{u2d{f*3s4U;re9R#_C6M&XblVOB<;`UL(-0CxCwN=|)|Gisl16fhw(kwfNk}9@|2Xf7!p|VMal?p`WVyOVAx*Hi zb0@m|^NBFbUth+5+kSx=4k)Q0;)7rN7(X7^rpx%= zE;+V0uClb9dlgcC|x|9blqDPqb_d~>8>g|!!0<+WDdH=)p{K=Vp+6Wd3JjEI>M!?=5)r)oSm2F-<#sAl2G=P zxGv;5E62N`8?0}f6e2NS5lCM`^}=6O$-;0IX{x~M*aCC|-k4W&@~cRY78}YI-rJ5U ziqP}D5;a|$-69c1`3soA$u7F&LW$pJN0G)^|b`u zm8=hQcsCjiI+VIZk>Y%DFXO}kA*5OFM_t?-sAq8zKf$3{=|)cKk3-+zDF~~wP9#q? zy#Ls_$o?;tl%KREA8@TeH$apT_rv>Ngep%FOLAY=-%Y)Ze4d-^A^c)*GYxBtqUSIO zwZjzY78TO&pYDECm_!w^L_5{9nR+rl{=Rfxdkt`{K^JE|sP(mBiO+)S4%f&W8p1IW z&MW!Gea<^0R2SAEsMU%|<1Ss%VBmxNXM!&>>s3{uVg(<&VJ6-O8_bKsje+x?HlVw^ z+>WTUM1s(^9O8Y~2O|<@4?mJVzlJAbp;RtRl+t&U%m3RyH?fIm>2g*6yldXtPiiV4 z(cu?{FQv~fGID+(uPx}JAlc0n=~HcUKxk1CLrn3Y!>pHX4?%cNq*SE$XxUZsPidX% zR;lHT4*o?J#F2#&Hh0KP;^Cw&xt?u~uHh91TszR!TBbVwF}s|6IcnK_I&Ooj67Z^L z9`$EFZp5mo0G7Qqv&}`1x~km!O1kD@f#|uNlH?=i4u&AdV50rkC&8N+z_kb66!J7X z&G^T5NZJ=Al5EHpB}T*4{KVHIdK8Th6|&PPGjdmmsuCt5P?DIWTk6%4+UU)8gs5;= zUM7if?+X>dIdccl-I+BxvD{Vnv|J^Pb?8!%xVVI`T#^lclB?=tLac5;m*$z{6kMCm zL=4fT%siy5tL2q_HhOa~VYwl)u0QAe4ditM-FJKS_K5s-Imx$dCOPbxZL!Gm;(v)# z%r;WXob$&#TUir*7w-*Ja@;7xFqe;ezZ~O^$funnc2g^v;UTuqZ$B{ z={t15+6TDKpv&qrf0xD_^98LoW%8+CL7vU^aQkqVpl91V93{)8@kT7cEIulj#jY=A z<=K73YFJwLtl~h*i9~>PxGUca5xm}9K=*5A)5cm2QwQ$yfK*2doQjluGFwrFQzMf` z?|sJf;Uzz9X6#M;y9_j{yRQa#BTS4CDJPb$En5z2%ccQHOjAH!SJ1uOA%&RCXp^}2YE(j2KxR}W1oq=62^R>OHwx=g^W41q5rOkA_NC}eS+dYA zB`^LJ3iF_&3f58wOBe^FXG!pP<_@~XmbeG&Jo&eA!CY=na&wiCdp|yDSs?1xxa8)3 z5Bu+XaL1gLBta-y(1ag_h8*{jcQsC>hFDEd{#cgp#7YZ%1?u1dx))+V^%P?tOnZfz zf%Ax-peySUgYA_YufkVIiY8p{2&ruV>wsaZ?H5`GVdO?6O~LAJN-o@dN-t_C+qH*Y z9VOx#@@d*QV{QGvMiOhE=n|0E3v`o%1ny(t&=t*UhFr0cT?@r+`zXxpXv*`1Sp7mR+`lnKWPp!qab}(Bs8dfu&hZGN!irUNf^+_ zQY;FnJjM~G(fSjs{Wy&vx((YPh;c1ONv|Dd)7PxRNO71&qy z2VFZnxjXTWAj4sE_rE*Y}Umt21J7i z1+5lOH8g0r&rgfmX5hYm0O*GJ3uAWsJbWE2U^WihUq+0V=XE`rWf!i2g|}qEYI|35 ziWqby6X|{r`^l^(^_{S6Fw{GqjGknJA1)r-+NEHBG7xk*J(vP^GLD8qFLl^U8hihS zy~1s<8DyH7Jz^ZvmvVU-mvKZG!^`Pevl0#Xi@<8?8ve$6{hnv?0$Zfkz-l@M)Heup z;kt&+19asfiILgs7owBOT1;pUj~bPPQVQYT?{hf7ffdYHpwYsR7GLow3*#! za~XE=Y#sp?Ww{us^UJZY<5YCtT2Jmgc4$)rZ3K)F^mv2WIQYWuMcdeK;Pb<0(B;## zaef!o(e#Oc=EI=mpGWAti@bMnpRXWX`bmE z6H~_@=2ceV9Kh$v5YUBOzjd6w)~XrWcMD@pEf4wy+qn?Z`LUDMiPhmISsXsM;?OpX zq+;KmBvq_9smc(sz};zBDYxY321xK6foRaRE4YNJA<#O5k z{*Qq8B*&G_ox`;)UAkT=p^qno$a_QeO%86@UBJVaHw0nIA}BhElY22plFQKUGq*>L zL4NrN_gNue?9c&2?O%RfiBTRmAyyLMsCETEg2W#cdycL3*?5NNn4or zsEBOI|Hs}rKueNsYd6cbZQHhO8>ejBwr$(CZQJOw*@b_8)vLzKzT>|CKJo%=p?#0V{@Alr` zhI+RZbSYkr4$w>y1w*8AfRHLts*%dXgAD~DU+DG)bB z$TeNU?SIg};^z}B3ipgQVA{0o)uJVg(>zM%j*rLI_#KnxX83zGyLh!b z+`HX%`$oskJ?_o6VDEj!`4BJXhX#d?R{whBK-I!eKTTLQu5j@yRd ztXRA!b&}RG_%UA<>`-8Gd8w5wa^`kWno!t854 zePx2#ck}Rwd5m`bCYJ5tv!H2&5?<|&@@}`uwa+ho)yUO-`QTtDpC#T`Df0X!R~O{Z z6}NQ8yEjJHzfr>f{_wZgG~L^5Wx!ZN@4kB9cxTao9pX11+$VXaH1AUuKD)`Q-O=9d zR%p;*>y^Dte%bu&&7`4ohEy*$EP3;lY5R|8vpac!4O51%yYndHx(GY_`H48ARg1lI zMqbVkr)uxmc?NvlGUefgyZiEce=jn|yWMGVp9L6@c-y5Ir>8B>JLq)1_eX0MPZFr; zu?OAHf6O1J{o1~J+YdZ(#c%jFEo;o5IqKJUL$fBS-n!Zv|8wrPi?m_L@CaV>JJ!41 zrU^$)^WS}F{qgTwH0sbJO6(@1n-rWmI77RduXe|Ix0|W_`pp;P`rDGF`QGPuYLs}NYwMq_Sg>sPT%rW1GjpX*R5`0%BftMv>2D#?su&$ndH7OVE+Ter6K@ZOKdd$(J* zu}|tJFTVCTwx(~&(0QvL4;SfD$;vHG<&L&E)`_d(JC4{{OZH^VPVwF^}rg@)_CwR9T=lt<%C2DqfRwe4Au5(%*>+>LDr&U2$`BbhL zEs39+0bl2>_4RT0!K=gFY1K3RhV0|gZ0ywgY>xy9!r!Tr;Bx<8hQI6Nm4}Jm?cQqD z{!mh%&=>M1I8*o5t1E57)~)wC(%2!(US`jcddY`XzT>vN*k?-D3B&6(p7OQywKKuD z#wk^DK)AFu-W>Q?%2TJ*Ag^{OdAB>|UFC3R()NGRXOREnfvdhblP$&PQF(VqnpSS) zwA4c{-c3?sZQeV6E~OijeZ;N-i)+X2eRO@w={{G62kJF{dH6GZHWc-0cd~c8VN=ZQ zmGo@3_tQ=linTEBl$}x5X8Dlsm(w%iH_Y8*`SxT(@&wA1bw&NTwPx<_Q^8M$JM*t3 z`Es@Fq#IGE&At^hNamtFz1p4P-ENj%uiy1<_xW7seRHcV?NICO*1{Rn9Gp{W$@Az< zBAqIdBl)Hq0aH{zbj_z|uUvi#t{szS?BE%|H0j z4hZrj`R9X?zwGi8Gv-IH`JLw7?twRzw|?r?GGe`1D>g4}ST}mtj?IVoDeteI-{5yD z^aqvx&d6C8C_3?&nj~RnM6xq}!m{+^gz1wZGVQG}@ z)!zHGO}G7QtsT9?Cpp+*X{|vIlD!FdGF_P^rO&)Px2A2)$?@mZ8ePBBz*)za?Or>t zV)c||Jk{Q2tuu3HZtu_KW_Y*z;Y{d5vv1yxR%^_YCOccyPPeuH(UeEe3>^@0O{z1E zc5X`CH{Qpf%i5LSS!vR`*R!(RO7r4**{NUWb}AZdcK`Ir%N_9Ek7s(f+x>Hrs%y`z zFYK@O@g$9hWPIm8lHX?e6HUrldspeni|*Il)~syCtG{MWx#LK7xLd>23A{r+N>ce{~Rt!weM{?a+4O4cZLu}j!p^Iwhe<&*MU#PN4#hI!L1 z#=fl^E_R<;xaav`eNs#d)IZPMgJGw>h;Xjv)GIT~ZYUOJxOX0Ad$(I5%<&tSCYR3m zG1ZLV4c|;F-E~T}+E)T!tTU=yGM~=@r(TPY=T3-qHPbe)k*0pKII)6u3lp|npcof( zkEl1OxKH&1#a4T*w>jSJ?pSwXK;>)K&gbtn;@P9sB@?%5R=h&kay>7t?wCE;h$$C~ z^=x>#){Oia18gXg{duZJ^IK)Cxq8F;TZ8LAj69+3skfWG@0XkF-R|1W;m)PG-+9EG zaGn`iBlyXD^>yr%of}Mwl;V2lc(FRC4mD!I{n6JBpUXF-_M!?q?uLstrgf+ADf+}Y z_hRAtR=)DrspU1l^Ss-A*r`zQ{8h6&UiYQ&m*WMi-slpn+ot2U@>J|U?b_%qz0z0S zIkaxNI(bGt%{Z}m!Q_)R->EV3PRO}?>lKO?_G08JP2!jGYInYOyKyJi4R(2D@)T7D zJ@@rtU+}VrtBm3?xbWTT4l5F5*pXO~cUS0_;L`AkQ=7I)Uuf~=Bc>Eu=F^ozO6XR~{MuCd6w-Mk$pwZ6E#VbrwyTSUz7*>xsq&KxUGx485uWP%inFXmlbH>24UU=ZRFGnC&y2m) zan_sU^TL1FB}tM_Fcd@e<~ilv&g z8SSTUu0~$%F7s|T-J7uuQUu6x=2Od6BlfgU8aI5Vn#GD=?>>9Zkzltct*%sWc(4gU zVr@!y>5~6c4e#}PzOa4gfcpyP+1+;enP^vQuiKr=tKH?^?bdGhHE^n%VctCW+V5uc zy1s7~E583$`pn}`)~t4Q%7u`Nx>k+0Y;cm6Z+46hmMvTQwec$XnOSjT%k;6*jO@Dc z@}rcw3wpJ?!n@r@uh->CSu{}IeOa2%7~JVxl(~yL-OYL|!u#eUCKstzd+osH$+jfB zA84ijIl*qfdwcw4sjst^x4WLOPtaP&&V8!p>#Fy29V@-tts4A&gB+7uCuz{FUG3Hv zKV6O5>QldV_pfe!vo6H`F?|k4e|o6St!EcY9hh;a&%`Dh;t!7+{ZZ&Xd-{gyP`+uu zyAAtC_nO~T-tESZz2;W50P81je^uaW(j9#!R!=kHLOXwlf`*MW@$1#{Yx{LsSngEf zj4PhJIntxd{b+k8_IQ|~+J*ViKgxNyV|>5f3bUhNV_og$bz3*uMBwU zO_qH_GNtd*H`{|WEk~RVaj#OOIel`T3Oh0G;jHhg1@Tp3n6JQ5{f}C4Jx#*1Aqw=k zIJ4Y!uXfjXx4U~<`l(^lZX0`I$hr{sYad#)c}DKDiSHkc7BXY+IPp8hj5PMe(!1)$x)~h6W!K_R4i&W^6xE9)|qYZ{WvC*9ADUE%mEKb&B-y^KsISCGTEU zUK}!0iupm8K998i%R5tdg`?Gou%enGIsTfUq zCu;g~>)p+(-e!28_2{eNZ_^cwySrMb;<2k#p4YheCI98l#oJQ4S_;~AgU6#Z)M?T% zd85`Y8{Qf4Ya{->rHfq#Tn7Fv8PIX4cEe`wIP`DHu50vPWkAP!9qYdz_y4o{bhqef z+pJC7W|WH)cs#*8o*w^M-5=<-b(X4J(0)5WmFHjMh)9E)I46s1^HhthuUk} zu&IyQ`@3FGCEFMo-w@v;WE6&a3PniMjZ!KHZXr)fK%Rvu5HmOsWm`=jPvx%#_*mi8m9 z8=YrpELGXg<&53HKL&Kl^8G zci&%E>$l&e-+#^^*LAYT6aHU(_VB$8SGo+i47d#ZRWhJ+&!7|k`+J!FD*15B;WFSd z@b}Jut_iE||LvHV__4WHuml7+x^^xfBQjsiRj1Iw{<>(j^A|8#?P1(?H?fn{p_!*be&GUa` zK-=za+n49_BRe{7{m1{h=#R>P_L*kU<&wGshpDq2* zJC)X(PqTIno7HRXIUB>*|N6PWpEnb3&i@J-(Dodn@^9DmQxp68Z{2UJX{ROmZJMQ& z`hM-NkP|I~maT2uhIJMHDEClnUj8o!<)Bp)-mEh4zCXqH_?z(hqk45()k%|@(l;GC z{|wK3d(FNJT?SkR{viXpzVAn;YyXq?{+jmR{khaX%&r^#0W+ZO;1eC}sXvV$aQ56R zxeT}rxD5Q%8PGBINBK_fr%t4sd6xl~0ha-nfge5tI_I_HhY-E{xblnRyC{#!|KFf# zL(>Vo``+sRmnHXqE(0zDE(3p`4CuTNmmiP+tM@na_gSNENnHm1=NZuP;P&j_-#hrv z-2eO)+>}3S2DBY)S?tRb$$hW!v#vrn-!20#11+heX`0u!CpL}^j{z30&em`e!?2pL6|HZLbuQA1+@83Od ztj{eP`Lu4MW%$SclXJr#lY#$>_4~)nscXe$z-7Q?z-8di%7ESjB?k9i==WdV`0vQFYtv=GW#DJYfX+RC#(f2UbbhoP>W8NRzd8PQ z7__|q_+62l`<~>-S^HWaKil`o|7^SZaWd-h{75;~y!@T6+qJxZr{7BXk+!uTX&-d+ z@?Xz@wxR#Z?}EB*?Z2MWpRwj&W&LV7be-M0U48vDfE!!}Tn7F{2L3Ah{=ZnvKmEVm zvFT4=1#Sjh23!VQ23!VQ23!VQ27a0he7|=5{<{`G&5XMlbs2CO`1ZX}g?YZ+vjA>e za2aqJa2aqJa2fakGob72n!A0w-=6&e*NvMcmjRanmjRc7KQ;ru{RU{QI=W$^`<4IR zx$n>V?pX8OrggG!k5GTVKioZ2{l{(>uC>2b2L9RpAvgQsZ+#OiqofbQ9{+5q^-N@P z_*c(H>UgmJ(eL{@kb8;qex6OQo0b0v!s}&v{GY$BrajI7yWe~v5kJwO_4ew8??1FJ z$A9e8{U=I?n^iK99=!W!)i&Y=mjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRan zmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRan zmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRan zmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRan zmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRan zmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRan zmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRan zmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRan zmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRan zmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRan zmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRan zmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRan zmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRan zmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRan zmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRan zmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRan zmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRan zmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRanmjRan zmjRanmjRanmjRanmjRanmjRanmjRanmw_K50~4kM`ZgaUKKxb&&f2&B&UiX= zm2q0$5Rk!KRja4v&ttBdxloK3GgsYQXvRyJt6?q-<0Z}2G#8ff(&lR6v~1y^qB$R& z=0!QKZmz!7i@Ta)ABHC8v@Xh;YijL9#^o{B-0ErlBsSN=oYv0@Tj?#$ zY5lA=*UDUU+(vV)&BefNGS|jjOxzZ8ZOv&t9y8Ytr{#?eXUui5dU0^Rm28HN=He1> zv<uU89;NB~V4BgCWyI5-Vx|>UcTWzifPV<)-CY$SJ^^)Lb zn(J*YDQ=LtKIW3)GMMX&(|(m4vY8uT^-|#WvN33X8fY#habY$j?N5Wur6Mk(jf-Kh zwU?T>sJUS{&2t(kZf=B4n-*8j+(>iU4|*~$jCw|yOHX`=dfGono729L(B^rJxs15P z=Emamx|txUx$)*Q<7TsL+K(sNv{{JfYU5{^WG*Z5d~=h{Wy38nH^p3b+(K(_s<|Av za8_@cxtzFfI~c`ubGe9pS-lzNa^w7&n`ut_eE@T_%;m)eG&kE^KHN?1*bH;b*wWIN#tAv|pZim&Yj9XxCr@1P)rRH{- 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


y~e!JQ1x@Vj^fw4>gWxUm-M=|w2U$?Q> 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 Date: Tue, 20 Aug 2024 03:49:26 +0530 Subject: [PATCH 12/36] removed unused deps --- yarn.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/yarn.lock b/yarn.lock index ff06d93c..59b318fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17323,3 +17323,4 @@ zwitch@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== + From f500ca644130b1edf870d7c2838e5a4c1bc7359b Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Tue, 20 Aug 2024 05:01:25 +0530 Subject: [PATCH 13/36] Fix for Build --- package.json | 2 +- yarn.lock | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 7fd883c8..a86f32b7 100644 --- a/package.json +++ b/package.json @@ -156,4 +156,4 @@ "npm run lint:check" ] } -} +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 59b318fe..ff06d93c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17323,4 +17323,3 @@ zwitch@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== - From 8a3ddb35ae2ca2be9d7f09e72e26b3d64740a4fb Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Tue, 17 Sep 2024 02:05:43 +0530 Subject: [PATCH 14/36] Frontend for onChain Etherlink DAO --- netlify.toml | 11 ++ src/modules/common/ToolbarAccount.tsx | 2 +- .../components/ConfigProposalForm.tsx | 2 +- .../explorer/components/DAOStatsRow.tsx | 50 +++++++- .../EthChangeConfigProposalForm.tsx | 113 ++++++++++++++++++ .../components/EthContractCallForm.tsx | 57 +++++++++ .../components/EthTransferFundsForm.tsx | 109 +++++++++++++++++ .../components/ProposalActionsDialog.tsx | 60 +++++++++- src/modules/explorer/pages/DAO/index.tsx | 87 +++++++++++++- src/modules/explorer/pages/DAO/router.tsx | 4 +- .../explorer/pages/Proposals/index.tsx | 108 ++++++++++++++++- .../contracts/baseDAO/lambdaDAO/index.ts | 22 +++- src/services/services/dao/hooks/useDAO.ts | 87 +++++++++++++- src/theme/index.ts | 1 + yarn.lock | 42 +++++++ 15 files changed, 733 insertions(+), 22 deletions(-) create mode 100644 netlify.toml create mode 100644 src/modules/explorer/components/EthChangeConfigProposalForm.tsx create mode 100644 src/modules/explorer/components/EthContractCallForm.tsx create mode 100644 src/modules/explorer/components/EthTransferFundsForm.tsx diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 00000000..e049fd8e --- /dev/null +++ b/netlify.toml @@ -0,0 +1,11 @@ +[[redirects]] + from = "/explorer/dao/KT1DNHADdFxHM6mRKTgyJmchW5ELxcoW1aSh/overview" + to = "https://v1.tezos-homebase.io/explorer/dao/KT1DNHADdFxHM6mRKTgyJmchW5ELxcoW1aSh/overview" + status = 302 + force = true + +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 + \ No newline at end of file diff --git a/src/modules/common/ToolbarAccount.tsx b/src/modules/common/ToolbarAccount.tsx index 035da87e..b6f28951 100644 --- a/src/modules/common/ToolbarAccount.tsx +++ b/src/modules/common/ToolbarAccount.tsx @@ -103,7 +103,7 @@ export const ToolbarAccount: React.FC = ({ children, variant = "common" }) setPopperOpen(!popperOpen) } - // console.log("XX", { account, etherlink }) + console.log("XX", { account, etherlink }) if (walletAddress || etherlink?.isConnected) return ( = ({ open, handleClose }) => { display={"inline"} style={{ fontWeight: 300 }} > - {dao && dao?.data.extra.frozen_extra_value.toString()} {dao ? dao.data.token.symbol : ""} + {dao && dao?.data.extra?.frozen_extra_value?.toString()} {dao ? dao.data.token?.symbol : ""}

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 { - Configure Token ContractX + Configure Token Contract diff --git a/src/modules/lite/creator/index.tsx b/src/modules/lite/creator/index.tsx index baed8420..82ff296b 100644 --- a/src/modules/lite/creator/index.tsx +++ b/src/modules/lite/creator/index.tsx @@ -34,6 +34,9 @@ import { ProposalCodeEditorInput } from "modules/explorer/components/ProposalFor import Prism, { highlight } from "prismjs" import "prism-themes/themes/prism-night-owl.css" import { Network } from "services/beacon" +import { signMessage } from "@wagmi/core" +import { config as wagmiConfig } from "services/wagmi/config" +import { useSignMessage } from "wagmi" const CodeButton = styled(CodeIcon)(({ theme }) => ({ background: theme.palette.primary.dark, @@ -281,6 +284,20 @@ const CommunityForm = ({ submitForm, values, setFieldValue, errors, touched, set } }, [error, setFieldValue, tokenMetadata]) + // TODO: Remove Me + useEffect(() => { + setFieldTouched("tokenAddress") + setFieldTouched("description") + setFieldTouched("name") + + setFieldValue("tokenType", "erc20") + setFieldValue("tokenAddress", "0x336bfd0356f6babec084f9120901c0296db1967e") + setFieldValue("tokenID", 0) + setFieldValue("symbol", "MTK") + setFieldValue("description", "Sample Description") + setFieldValue("name", "Test Community") + }, [values]) + return ( @@ -489,7 +506,6 @@ const CommunityForm = ({ submitForm, values, setFieldValue, errors, touched, set export const CommunityCreator: React.FC = () => { const navigate = useHistory() const { network, account, wallet, etherlink } = useTezos() - const openNotification = useNotification() const initialState: Community = { diff --git a/src/services/services/lite/lite-services.ts b/src/services/services/lite/lite-services.ts index a24fc0c9..93b561ae 100644 --- a/src/services/services/lite/lite-services.ts +++ b/src/services/services/lite/lite-services.ts @@ -42,6 +42,15 @@ export const getLiteDAOs = async (network: string) => { "Content-Type": "application/json" } }) + // const resp = await fetch(`${REACT_APP_LITE_API_URL}/daos/`, { + // method: "POST", + // body: JSON.stringify({ + // network + // }), + // headers: { + // "Content-Type": "application/json" + // } + // }) const daos: Community[] = await resp.json() @@ -119,19 +128,35 @@ export const saveLiteCommunity = async ( payloadBytes: string, network: Network ) => { - const resp = await fetch(`${getEnv(EnvKey.REACT_APP_LITE_API_URL)}/dao/add`, { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify({ - signature, - publicKey, - payloadBytes, - network + if (network.startsWith("etherlink")) { + const resp = await fetch(`${getEnv(EnvKey.REACT_APP_LITE_API_URL)}/dao/add`, { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ + signature, + publicKey, + payloadBytes, + network + }) }) - }) - return resp + return resp + } else { + const resp = await fetch(`${getEnv(EnvKey.REACT_APP_LITE_API_URL)}/dao/add`, { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ + signature, + publicKey, + payloadBytes, + network + }) + }) + return resp + } } export const saveLiteProposal = async ( diff --git a/src/workers/deploy_erc20.js b/src/workers/deploy_erc20.js new file mode 100644 index 00000000..23564192 --- /dev/null +++ b/src/workers/deploy_erc20.js @@ -0,0 +1,249 @@ +importScripts("https://binaries.soliditylang.org/bin/soljson-v0.8.20+commit.a1b79de6.js") +// importScripts('https://binaries.soliditylang.org/bin/soljson-v0.8.19+commit.7dd6d404.js') +import wrapper from "solc/wrapper" + +self.addEventListener( + "message", + e => { + const erc20CodeOld = ` +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; +contract ERC20 { + string public constant name = "ERC20"; + string public constant symbol = "ERC"; + uint8 public constant decimals = 18; + + mapping(address => uint256) balances; + + event Transfer(address indexed from, address indexed to, uint256 tokens); + + uint256 public immutable totalSupply; + + constructor(uint256 total) { + totalSupply = total; + balances[msg.sender] = total; + } + + function balanceOf(address tokenOwner) public view returns (uint256) { + return balances[tokenOwner]; + } + + function transfer(address receiver, uint256 numTokens) public returns (bool) { + require(balances[msg.sender] >= numTokens); + balances[msg.sender] = balances[msg.sender] - numTokens; + balances[receiver] = balances[receiver] + numTokens; + emit Transfer(msg.sender, receiver, numTokens); + return true; + } + + function transferFrom(address owner, address buyer, uint256 numTokens) public returns (bool) { + require(balances[owner] >= numTokens); + balances[owner] = balances[owner] - numTokens; + balances[buyer] = balances[buyer] + numTokens; + emit Transfer(owner, buyer, numTokens); + return true; + } +} +` + const contextCode = ` +abstract contract Context { + function _msgSender() internal view virtual returns (address) { + return msg.sender; + } + + function _msgData() internal view virtual returns (bytes calldata) { + return msg.data; + } + + function _contextSuffixLength() internal view virtual returns (uint256) { + return 0; + } +} +` + const ierc20Code = ` + +interface IERC20 { + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); + function totalSupply() external view returns (uint256); + function balanceOf(address account) external view returns (uint256); + function transfer(address to, uint256 value) external returns (bool); + function allowance(address owner, address spender) external view returns (uint256); + function approve(address spender, uint256 value) external returns (bool); + function transferFrom(address from, address to, uint256 value) external returns (bool); +} + ` + const erc20Code = ` + // SPDX-License-Identifier: MIT + +pragma solidity ^0.8.20; + +${ierc20Code} + +${contextCode} +// import "./IERC20.sol"; +// import "../../utils/Context.sol"; + +contract ERC20 is Context, IERC20 { + mapping (address => uint256) private _balances; + + mapping (address => mapping (address => uint256)) private _allowances; + + uint256 private _totalSupply; + + string private _name; + string private _symbol; + + constructor (string memory name_, string memory symbol_) { + _name = name_; + _symbol = symbol_; + } + + + function name() public view virtual returns (string memory) { + return _name; + } + + function symbol() public view virtual returns (string memory) { + return _symbol; + } + function decimals() public view virtual returns (uint8) { + return 18; + } + + function totalSupply() public view virtual override returns (uint256) { + return _totalSupply; + } + + function balanceOf(address account) public view virtual override returns (uint256) { + return _balances[account]; + } + + function transfer(address recipient, uint256 amount) public virtual override returns (bool) { + _transfer(_msgSender(), recipient, amount); + return true; + } + + function allowance(address owner, address spender) public view virtual override returns (uint256) { + return _allowances[owner][spender]; + } + + function approve(address spender, uint256 amount) public virtual override returns (bool) { + _approve(_msgSender(), spender, amount); + return true; + } + + function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { + _transfer(sender, recipient, amount); + + uint256 currentAllowance = _allowances[sender][_msgSender()]; + require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); + _approve(sender, _msgSender(), currentAllowance - amount); + + return true; + } + + function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); + return true; + } + + function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { + uint256 currentAllowance = _allowances[_msgSender()][spender]; + require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); + _approve(_msgSender(), spender, currentAllowance - subtractedValue); + + return true; + } + + function _transfer(address sender, address recipient, uint256 amount) internal virtual { + require(sender != address(0), "ERC20: transfer from the zero address"); + require(recipient != address(0), "ERC20: transfer to the zero address"); + + _beforeTokenTransfer(sender, recipient, amount); + + uint256 senderBalance = _balances[sender]; + require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); + _balances[sender] = senderBalance - amount; + _balances[recipient] += amount; + + emit Transfer(sender, recipient, amount); + } + + function _mint(address account, uint256 amount) internal virtual { + require(account != address(0), "ERC20: mint to the zero address"); + + _beforeTokenTransfer(address(0), account, amount); + + _totalSupply += amount; + _balances[account] += amount; + emit Transfer(address(0), account, amount); + } + + function _burn(address account, uint256 amount) internal virtual { + require(account != address(0), "ERC20: burn from the zero address"); + + _beforeTokenTransfer(account, address(0), amount); + + uint256 accountBalance = _balances[account]; + require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); + _balances[account] = accountBalance - amount; + _totalSupply -= amount; + + emit Transfer(account, address(0), amount); + } + + function _approve(address owner, address spender, uint256 amount) internal virtual { + require(owner != address(0), "ERC20: approve from the zero address"); + require(spender != address(0), "ERC20: approve to the zero address"); + + _allowances[owner][spender] = amount; + emit Approval(owner, spender, amount); + } + + + function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } +} +` + const contractCode = e.data.contractCode + const sourceCode = { + language: "Solidity", + sources: { + contract: { + content: contractCode + } + }, + settings: { + outputSelection: { + "*": { + "*": ["abi", "evm.bytecode"] + } + } + // remappings: [ + // '@openzeppelin/=/node_modules/@openzeppelin/', + // ], + } + } + + const compiler = wrapper(self.Module) + console.log(`Solc version: ${compiler.version()}`) + + function findImports(path) { + if (path === "ERC20.sol") + return { + contents: erc20Code + } + if (path === "./IERC20.sol") { + return { content: ierc20Code } + } + if (path === "../../utils/Context.sol") { + return { content: contextCode } + } else return { error: "File not found" } + } + + self.postMessage({ + output: JSON.parse(compiler.compile(JSON.stringify(sourceCode), { import: findImports })) + }) + }, + false +) From 89cb4b9eb34195ef818d62ff19c8cf447bd4df81 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Wed, 14 Aug 2024 03:55:07 +0530 Subject: [PATCH 06/36] WIP - Offchain DAO Almost Works. --- src/modules/lite/creator/index.tsx | 24 ++++++------- src/services/services/lite/lite-services.ts | 40 +++++++-------------- 2 files changed, 24 insertions(+), 40 deletions(-) diff --git a/src/modules/lite/creator/index.tsx b/src/modules/lite/creator/index.tsx index 82ff296b..8f4d1321 100644 --- a/src/modules/lite/creator/index.tsx +++ b/src/modules/lite/creator/index.tsx @@ -285,18 +285,18 @@ const CommunityForm = ({ submitForm, values, setFieldValue, errors, touched, set }, [error, setFieldValue, tokenMetadata]) // TODO: Remove Me - useEffect(() => { - setFieldTouched("tokenAddress") - setFieldTouched("description") - setFieldTouched("name") - - setFieldValue("tokenType", "erc20") - setFieldValue("tokenAddress", "0x336bfd0356f6babec084f9120901c0296db1967e") - setFieldValue("tokenID", 0) - setFieldValue("symbol", "MTK") - setFieldValue("description", "Sample Description") - setFieldValue("name", "Test Community") - }, [values]) + // useEffect(() => { + // setFieldTouched("tokenAddress") + // setFieldTouched("description") + // setFieldTouched("name") + + // setFieldValue("tokenType", "erc20") + // setFieldValue("tokenAddress", "0x336bfd0356f6babec084f9120901c0296db1967e") + // setFieldValue("tokenID", 0) + // setFieldValue("symbol", "MTK") + // setFieldValue("description", "Sample Description") + // setFieldValue("name", "Test Community") + // }, [values]) return ( diff --git a/src/services/services/lite/lite-services.ts b/src/services/services/lite/lite-services.ts index 93b561ae..9efe3475 100644 --- a/src/services/services/lite/lite-services.ts +++ b/src/services/services/lite/lite-services.ts @@ -128,35 +128,19 @@ export const saveLiteCommunity = async ( payloadBytes: string, network: Network ) => { - if (network.startsWith("etherlink")) { - const resp = await fetch(`${getEnv(EnvKey.REACT_APP_LITE_API_URL)}/dao/add`, { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify({ - signature, - publicKey, - payloadBytes, - network - }) - }) - return resp - } else { - const resp = await fetch(`${getEnv(EnvKey.REACT_APP_LITE_API_URL)}/dao/add`, { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify({ - signature, - publicKey, - payloadBytes, - network - }) + const resp = await fetch(`${getEnv(EnvKey.REACT_APP_LITE_API_URL)}/dao/add`, { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ + signature, + publicKey, + payloadBytes, + network }) - return resp - } + }) + return resp } export const saveLiteProposal = async ( From 7289cb98cb44a7cd0e8394467fa94b8010383841 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Wed, 14 Aug 2024 17:00:46 +0530 Subject: [PATCH 07/36] Other Code Improvements --- src/modules/common/ToolbarCommon.tsx | 5 ++++- src/modules/lite/creator/index.tsx | 17 ----------------- src/services/beacon/hooks/useTezos.ts | 2 -- 3 files changed, 4 insertions(+), 20 deletions(-) diff --git a/src/modules/common/ToolbarCommon.tsx b/src/modules/common/ToolbarCommon.tsx index 06a3da92..3d7fd168 100644 --- a/src/modules/common/ToolbarCommon.tsx +++ b/src/modules/common/ToolbarCommon.tsx @@ -134,8 +134,9 @@ export const Navbar: React.FC = ({ variant = "default", mode, child const isMobileExtraSmall = useMediaQuery(theme.breakpoints.down("xs")) const { open: openUserMenuSheet } = useActionSheet(ActionSheet.UserMenu) - const walletAddress = network.startsWith("etherlink") ? etherlink.account?.address : tzAccountAddress + const walletAddress = network.startsWith("etherlink") ? etherlink.account?.address : tzAccountAddress + console.log({ walletAddress, tzAccountAddress }) const handleClick = (event: React.MouseEvent) => { if (variant === "default") { setAnchorEl(event.currentTarget) @@ -157,6 +158,7 @@ export const Navbar: React.FC = ({ variant = "default", mode, child const renderAccountButton = () => { if (walletAddress) { + console.log({ walletAddress }) return ( = ({ variant = "default", mode, child ) } else { + console.log("No wallet address") return ( diff --git a/src/modules/lite/creator/index.tsx b/src/modules/lite/creator/index.tsx index 8f4d1321..01225acc 100644 --- a/src/modules/lite/creator/index.tsx +++ b/src/modules/lite/creator/index.tsx @@ -34,9 +34,6 @@ import { ProposalCodeEditorInput } from "modules/explorer/components/ProposalFor import Prism, { highlight } from "prismjs" import "prism-themes/themes/prism-night-owl.css" import { Network } from "services/beacon" -import { signMessage } from "@wagmi/core" -import { config as wagmiConfig } from "services/wagmi/config" -import { useSignMessage } from "wagmi" const CodeButton = styled(CodeIcon)(({ theme }) => ({ background: theme.palette.primary.dark, @@ -284,20 +281,6 @@ const CommunityForm = ({ submitForm, values, setFieldValue, errors, touched, set } }, [error, setFieldValue, tokenMetadata]) - // TODO: Remove Me - // useEffect(() => { - // setFieldTouched("tokenAddress") - // setFieldTouched("description") - // setFieldTouched("name") - - // setFieldValue("tokenType", "erc20") - // setFieldValue("tokenAddress", "0x336bfd0356f6babec084f9120901c0296db1967e") - // setFieldValue("tokenID", 0) - // setFieldValue("symbol", "MTK") - // setFieldValue("description", "Sample Description") - // setFieldValue("name", "Test Community") - // }, [values]) - return ( diff --git a/src/services/beacon/hooks/useTezos.ts b/src/services/beacon/hooks/useTezos.ts index 08058a23..9826e3eb 100644 --- a/src/services/beacon/hooks/useTezos.ts +++ b/src/services/beacon/hooks/useTezos.ts @@ -39,7 +39,6 @@ export const useTezos = (): WalletConnectReturn => { signer: ethSigner } = useContext(EtherlinkContext) - const chainId = useChainId() const { open, close } = useWeb3Modal() const { address: ethAddress, isConnected: isEtherlinkConnected } = useWagmiAccount() // const { connect: wagmiConnect, connectors } = useWagmiConnect() @@ -49,7 +48,6 @@ export const useTezos = (): WalletConnectReturn => { await disconnectEtherlink(wagmiConfig) } open({ view: "Connect" }) - // wagmiConnect({ connector: connectors[0], chainId }) } const queryClient = useQueryClient() From 937252a25ecfc36026dfb370f8b81cad32e144b3 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Tue, 20 Aug 2024 02:59:59 +0530 Subject: [PATCH 08/36] Removed unused deps --- bun.lockb | Bin 1060020 -> 1055084 bytes package.json | 1 - 2 files changed, 1 deletion(-) diff --git a/bun.lockb b/bun.lockb index 1440fde50535aa4ad95efe2eaa1c2fc86e8f7b11..476c4471e235d8e12514dc9621abcc669cee9d79 100755 GIT binary patch delta 162802 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 delta 165376 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

diff --git a/src/modules/explorer/components/DAOStatsRow.tsx b/src/modules/explorer/components/DAOStatsRow.tsx index 971d72b5..38b9706f 100644 --- a/src/modules/explorer/components/DAOStatsRow.tsx +++ b/src/modules/explorer/components/DAOStatsRow.tsx @@ -29,7 +29,7 @@ const ItemContent = styled(Grid)({ const ItemTitle = styled(Typography)(({ theme }) => ({ fontSize: 18, - fontWeight: 600, + fontWeight: 500, [theme.breakpoints.down("md")]: { fontSize: 15 } @@ -59,16 +59,14 @@ const formatConfig = { trimMantissa: true } -export const DAOStatsRow: React.FC = () => { +const DAOStatsRowTezos = () => { const daoId = useDAOID() const { data, ledger, cycleInfo } = useDAO(daoId) const symbol = data && data.data.token.symbol.toUpperCase() - const theme = useTheme() const { data: activeProposals } = useProposals(daoId, ProposalStatus.ACTIVE) const { data: polls } = usePolls(data?.liteDAOData?._id) const activeLiteProposals = polls?.filter(p => Number(p.endTime) > dayjs().valueOf()) const { tokenHoldings } = useDAOHoldings(daoId) - const { nftHoldings } = useDAONFTHoldings(daoId) const { data: executableProposals } = useProposals(daoId, ProposalStatus.EXECUTABLE) const { hours, minutes, days } = useTimeLeftInCycle() const shouldDisable = useIsProposalButtonDisabled(daoId) @@ -203,3 +201,47 @@ export const DAOStatsRow: React.FC = () => { ) } + +const DAOStatsRowEtherlink = () => { + const daoId = useDAOID() + const { data } = useDAO(daoId) + const daoStats = data?.data?.etherlink?.stats + return ( + + + {[ + { + title: "Members", + value: daoStats?.members + }, + { + title: "Active Proposals", + value: daoStats?.active_proposals + }, + { + title: "Awaiting Executions", + value: daoStats?.awaiting_executions || "-" + } + ].map((item, index) => ( + + + + {item.title} + + + {item.value} + + + + ))} + + + ) +} + +export const DAOStatsRow: React.FC = () => { + const daoId = useDAOID() + const { data } = useDAO(daoId) + const network = data?.data.network + return network?.startsWith("etherlink") ? : +} diff --git a/src/modules/explorer/components/EthChangeConfigProposalForm.tsx b/src/modules/explorer/components/EthChangeConfigProposalForm.tsx new file mode 100644 index 00000000..00807c0b --- /dev/null +++ b/src/modules/explorer/components/EthChangeConfigProposalForm.tsx @@ -0,0 +1,113 @@ +import React, { useState } from "react" +import { Box } from "@mui/material" +import { ResponsiveDialog } from "./ResponsiveDialog" +import { ProposalFormInput } from "./ProposalFormInput" +import { Controller } from "react-hook-form" +import { Grid, TextField, Typography, MenuItem, useMediaQuery, useTheme } from "@material-ui/core" +import { SendButton } from "./ProposalFormSendButton" +import Select, { SelectChangeEvent } from "@mui/material/Select" + +interface EthContractCallFormProps { + open: boolean + handleClose: () => void +} + +const EthChangeConfigProposalForm: React.FC = ({ open, handleClose }) => { + const [configType, setConfigType] = useState("quorums") + const [title, setTitle] = useState("") + const [offChainResources, setOffChainResources] = useState("") + + const theme = useTheme() + const isMobileSmall = useMediaQuery(theme.breakpoints.down("sm")) + return ( + + + + + + {configType === "quorums" ? ( + <> + + + + Participation percentage required for transfers and contract calls + + + + { + setOffChainResources(e.target.value) + }} + type="number" + InputProps={{ disableUnderline: true }} + placeholder="%" + style={{ border: "1px solid #ccc", width: "70px", borderRadius: 4 }} + /> + + + + + + + Participation percentage required for change config proposals + + + + { + setOffChainResources(e.target.value) + }} + type="number" + InputProps={{ disableUnderline: true }} + placeholder="%" + style={{ border: "1px solid #ccc", width: "70px", borderRadius: 4 }} + /> + + + + ) : ( + <> + + Coming Soon + + + )} + + + {}}>Submit + + + ) +} + +export default EthChangeConfigProposalForm diff --git a/src/modules/explorer/components/EthContractCallForm.tsx b/src/modules/explorer/components/EthContractCallForm.tsx new file mode 100644 index 00000000..ac2c3124 --- /dev/null +++ b/src/modules/explorer/components/EthContractCallForm.tsx @@ -0,0 +1,57 @@ +import React, { useState } from "react" +import { Box } from "@mui/material" +import { ResponsiveDialog } from "./ResponsiveDialog" +import { ProposalFormInput } from "./ProposalFormInput" +import { Controller } from "react-hook-form" +import { Grid, TextField } from "@material-ui/core" +import { SendButton } from "./ProposalFormSendButton" + +interface EthContractCallFormProps { + open: boolean + handleClose: () => void +} + +const EthContractCallForm: React.FC = ({ open, handleClose }) => { + const [title, setTitle] = useState("") + const [offChainResources, setOffChainResources] = useState("") + return ( + + + + { + setTitle(e.target.value) + }} + type="string" + InputProps={{ disableUnderline: true }} + placeholder="Add Proposal Title here" + /> + + + + + { + setOffChainResources(e.target.value) + }} + type="string" + InputProps={{ disableUnderline: true }} + placeholder="Add link to offchain resources" + /> + + + + {}}>Submit + + + ) +} + +export default EthContractCallForm diff --git a/src/modules/explorer/components/EthTransferFundsForm.tsx b/src/modules/explorer/components/EthTransferFundsForm.tsx new file mode 100644 index 00000000..18c474a6 --- /dev/null +++ b/src/modules/explorer/components/EthTransferFundsForm.tsx @@ -0,0 +1,109 @@ +import React, { useState } from "react" +import { Box } from "@mui/material" +import { ResponsiveDialog } from "./ResponsiveDialog" +import { ProposalFormInput } from "./ProposalFormInput" +import { Controller } from "react-hook-form" +import { Grid, TextField, Paper, styled, useTheme, useMediaQuery } from "@material-ui/core" +import { Autocomplete } from "@material-ui/lab" +import { SendButton } from "./ProposalFormSendButton" + +interface EthContractCallFormProps { + open: boolean + handleClose: () => void +} +const AutoCompleteField = styled(Autocomplete)({ + "& .MuiInputLabel-root": { + display: "none" + }, + "& .MuiAutocomplete-inputRoot": { + padding: 0 + }, + "& label + .MuiInput-formControl": { + marginTop: "0" + }, + + '& .MuiAutocomplete-inputRoot[class*="MuiInput-root"] .MuiAutocomplete-input:first-child': { + padding: 0 + } +}) + +const AutoCompletePaper = styled(Paper)({ + background: "#24282B" +}) + +const EthTransferFundsForm: React.FC = ({ open, handleClose }) => { + const [title, setTitle] = useState("") + const [offChainResources, setOffChainResources] = useState("") + const theme = useTheme() + const isMobileSmall = useMediaQuery(theme.breakpoints.down("sm")) + return ( + + + + { + setTitle(e.target.value) + }} + type="string" + InputProps={{ disableUnderline: true }} + placeholder="0xc0de..." + /> + + + + + + + (option as any).symbol} + renderInput={params => ( + + )} + onChange={(e, data) => { + console.log(data) + }} + /> + + + { + setOffChainResources(e.target.value) + }} + type="number" + InputProps={{ disableUnderline: true }} + placeholder="Amount" + /> + + + +
+
+ + {}}>Submit + +
+
+ ) +} + +export default EthTransferFundsForm diff --git a/src/modules/explorer/components/ProposalActionsDialog.tsx b/src/modules/explorer/components/ProposalActionsDialog.tsx index d3757979..652c6843 100644 --- a/src/modules/explorer/components/ProposalActionsDialog.tsx +++ b/src/modules/explorer/components/ProposalActionsDialog.tsx @@ -14,6 +14,9 @@ import { useDAO } from "services/services/dao/hooks/useDAO" import { ProposalCreatorModal } from "modules/lite/explorer/pages/CreateProposal/ProposalCreatorModal" import { useIsProposalButtonDisabled } from "services/contracts/baseDAO/hooks/useCycleInfo" import { ProposalFormContainer } from "./ProposalForm" +import EthContractCallForm from "./EthContractCallForm" +import EthChangeConfigProposalForm from "./EthChangeConfigProposalForm" +import EthTransferFundsForm from "./EthTransferFundsForm" type RecursivePartial = { [P in keyof T]?: RecursivePartial @@ -140,7 +143,7 @@ interface Props { const defaultOpenSupportedExecuteProposalModal = "none" -export const ProposalActionsDialog: React.FC = ({ open, handleClose }) => { +const ProposalActionsDialogForTezos: React.FC = ({ open, handleClose }) => { const daoId = useDAOID() const { data } = useDAO(daoId) const theme = useTheme() @@ -361,3 +364,58 @@ export const ProposalActionsDialog: React.FC = ({ open, handleClose }) => ) } + +const ProposalActionsDialogForEtherlink: React.FC = ({ open, handleClose }) => { + const theme = useTheme() + const isMobileSmall = useMediaQuery(theme.breakpoints.down("sm")) + const [modalOpen, setModalOpen] = useState<"transfer_funds" | "change_config" | "contract_call" | boolean>(false) + return ( + <> + + + Select Proposal Type + + + {[ + { + label: "Transfer Funds", + description: "Propose a transfer of funds from the DAO treasury", + modal: "transfer_funds" + }, + { + label: "Change Config", + description: "Propose changes to the DAO configuration", + modal: "change_config" + }, + { + label: "Contract Call", + description: "Propose a call to an external contract", + modal: "contract_call" + } + ].map((option, index) => ( + setModalOpen(option.modal as any)}> + + {option.label} + {option.description} + + + ))} + + + setModalOpen(false)} /> + setModalOpen(false)} /> + setModalOpen(false)} /> + + ) +} + +export const ProposalActionsDialog: React.FC = ({ open, handleClose }) => { + const daoId = useDAOID() + const { data } = useDAO(daoId) + + return data?.data.network.startsWith("etherlink") ? ( + + ) : ( + + ) +} diff --git a/src/modules/explorer/pages/DAO/index.tsx b/src/modules/explorer/pages/DAO/index.tsx index a2e975d9..8483a347 100644 --- a/src/modules/explorer/pages/DAO/index.tsx +++ b/src/modules/explorer/pages/DAO/index.tsx @@ -18,6 +18,8 @@ import dayjs from "dayjs" import { DaoSettingModal } from "./components/Settings" import SettingsIcon from "@mui/icons-material/Settings" import { SettingsDialog } from "./components/SettingsDialog" +import { IconButton } from "@mui/material" +import { FileCopyOutlined } from "@material-ui/icons" export const StyledAvatar = styled(Avatar)({ height: 50, @@ -84,12 +86,14 @@ const SubtitleText = styled(Typography)(({ theme }) => ({ } })) -export const DAO: React.FC = () => { +export const DAOOverview: React.FC = () => { const daoId = useDAOID() const { data, cycleInfo, ledger } = useDAO(daoId) + + console.log("daoData", data) const theme = useTheme() const isExtraSmall = useMediaQuery(theme.breakpoints.down("xs")) - const symbol = data && data.data.token.symbol.toUpperCase() + const symbol = (data && data.data.token?.symbol?.toUpperCase()) || "Unknown" const name = data && data.data.name const description = data && data.data.description @@ -106,6 +110,10 @@ export const DAO: React.FC = () => { } const usersTableData = useMemo(() => { + if (data?.data?.meta?.users) { + return data.data.meta.users + } + if (!ledger || !cycleInfo || !data) { return [] } @@ -121,6 +129,8 @@ export const DAO: React.FC = () => { })) }, [cycleInfo, data, ledger]) + console.log({ usersTableData }) + return ( @@ -148,7 +158,78 @@ export const DAO: React.FC = () => {
- {description} + {data?.data.network?.startsWith("etherlink") ? ( + <> + + + + DAO Contract + + + {data?.data.address || "-"} + { + if (data?.data.address) { + navigator.clipboard.writeText(data.data.address) + } + }} + size="small" + style={{ marginLeft: "8px", color: theme.palette.primary.light }} + > + + + + + + + Governance Token + + + {data?.data.token.symbol || "-"} + { + if (data?.data.token.symbol) { + navigator.clipboard.writeText(data.data.token.symbol) + } + }} + size="small" + style={{ marginLeft: "8px" }} + > + + + + + + {description} + + +
+ + ) : ( + {description} + )}
diff --git a/src/modules/explorer/pages/DAO/router.tsx b/src/modules/explorer/pages/DAO/router.tsx index 24916b61..2844a99f 100644 --- a/src/modules/explorer/pages/DAO/router.tsx +++ b/src/modules/explorer/pages/DAO/router.tsx @@ -1,7 +1,7 @@ import { styled, useTheme } from "@material-ui/core" import { NotFound } from "modules/explorer/components/NotFound" import { NotIndexed } from "modules/explorer/components/NotIndexed" -import { DAO } from "modules/explorer/pages/DAO/index" +import { DAOOverview } from "modules/explorer/pages/DAO/index" import { User } from "modules/explorer/pages/User" import React, { useContext, useEffect, useState } from "react" import { useHistory } from "react-router" @@ -128,7 +128,7 @@ export const DAORouter = (): JSX.Element => { - + diff --git a/src/modules/explorer/pages/Proposals/index.tsx b/src/modules/explorer/pages/Proposals/index.tsx index c6a9045e..7e32fef1 100644 --- a/src/modules/explorer/pages/Proposals/index.tsx +++ b/src/modules/explorer/pages/Proposals/index.tsx @@ -1,5 +1,17 @@ import React, { useCallback, useState } from "react" -import { Button, Grid, styled, Theme, Typography, useMediaQuery, useTheme } from "@material-ui/core" +import { + Button, + FormControl, + Grid, + InputLabel, + MenuItem, + styled, + Theme, + Typography, + useMediaQuery, + useTheme +} from "@material-ui/core" +import Select, { SelectChangeEvent } from "@mui/material/Select" import { useDAO } from "services/services/dao/hooks/useDAO" import { useProposals } from "services/services/dao/hooks/useProposals" @@ -103,7 +115,7 @@ export const DropButton = styled(Button)({ fontSize: "16px" }) -export const Proposals: React.FC = () => { +const TezosProposals = () => { const daoId = useDAOID() const { data, cycleInfo } = useDAO(daoId) const [selectedTab, setSelectedTab] = React.useState(0) @@ -323,3 +335,95 @@ export const Proposals: React.FC = () => { ) } + +const EtherlinkProposals = () => { + const daoId = useDAOID() + const { data, cycleInfo } = useDAO(daoId) + const { data: proposals } = useProposals(daoId) + const theme = useTheme() + const isMobileSmall = useMediaQuery(theme.breakpoints.down("xs")) + const [openDialog, setOpenDialog] = useState(false) + + const handleCloseModal = () => { + setOpenDialog(false) + } + + return ( + <> + + + + + + + Type + + + + + + Status + + + + + + 143 Proposals + + + + setOpenDialog(true)}> + New Proposal + + + + + + + + + ) +} + +export const Proposals: React.FC = () => { + const daoId = useDAOID() + const { data, cycleInfo } = useDAO(daoId) + return data?.data.network.startsWith("etherlink") ? : +} diff --git a/src/services/contracts/baseDAO/lambdaDAO/index.ts b/src/services/contracts/baseDAO/lambdaDAO/index.ts index 5460a55a..ee9de5bc 100644 --- a/src/services/contracts/baseDAO/lambdaDAO/index.ts +++ b/src/services/contracts/baseDAO/lambdaDAO/index.ts @@ -22,9 +22,11 @@ import { hexStringToBytes } from "services/utils/utils" const parser = new Parser() -interface LambdaDAOData extends BaseDAOData { +export interface LambdaDAOData extends BaseDAOData { extra: LambdaExtraDTO liteDAO: Community | undefined + etherlink?: any // TODO: Define type + meta?: any } interface RegistryItemDTO { @@ -70,6 +72,7 @@ const mapStorageRegistryAffectedList = ( } export class LambdaDAO extends BaseDAO { + public etherlink?: any // TODO: Define type public liteDAOData: Community | undefined public decoded: { decodedRegistry: { @@ -86,13 +89,20 @@ export class LambdaDAO extends BaseDAO { super(data) this.decoded = { - decodedRegistry: mapStorageRegistryList(this.data.extra.registry), - decodedRegistryAffected: mapStorageRegistryAffectedList(this.data.extra.registry_affected) + decodedRegistry: [], + decodedRegistryAffected: [] } - this.data.extra.returnedPercentage = new BigNumber(100) - .minus(new BigNumber(this.data.extra.slash_scale_value)) - .toString() + if (this.data.extra?.registry) { + this.decoded.decodedRegistry = mapStorageRegistryList(this.data.extra.registry) + this.decoded.decodedRegistryAffected = mapStorageRegistryAffectedList(this.data.extra.registry_affected) + } + + if (this.data.extra?.slash_scale_value) { + this.data.extra.returnedPercentage = new BigNumber(100) + .minus(new BigNumber(this.data.extra.slash_scale_value)) + .toString() + } this.liteDAOData = data.liteDAO } diff --git a/src/services/services/dao/hooks/useDAO.ts b/src/services/services/dao/hooks/useDAO.ts index 87526016..ec01bad9 100644 --- a/src/services/services/dao/hooks/useDAO.ts +++ b/src/services/services/dao/hooks/useDAO.ts @@ -13,6 +13,7 @@ import { getDAO } from "services/services/dao/services" import { useBlockchainInfo } from "../../../contracts/baseDAO/hooks/useBlockchainInfo" import { fetchLiteData } from "services/services/lite/lite-services" +// Generally this is used for onChain DAOs so can be renamed to useOnChainDAO export const useDAO = (address: string) => { const [cycleInfo, setCycleInfo] = useState() const { network } = useTezos() @@ -24,6 +25,84 @@ export const useDAO = (address: string) => { const { data, ...rest } = useQuery( ["dao", address], async () => { + console.log("daoData Address", address) + if (address == "onchain-etherlink") { + const data = new LambdaDAO({ + name: "Etherlink", + dao_type: { + id: 3, + name: "lambda" + }, + description: "my Etherlink Dao", + data: { + network: "etherlink_testnet" + }, + start_level: 0, + period: "0", + ledger: [], + id: 1, + admin: "", + address: "onchain-etherlink", + token: { + id: 0, + name: "Unknown", + symbol: "Unknown", + decimals: 0, + network: network as Network, + supply: "0", + contract: "Unknown", + token_id: "Unknown", + standard: "Unknown" + }, + etherlink: { + stats: { + members: "58", + active_proposals: "1", + awaiting_executions: "2" + } + }, + meta: { + users: [ + { + address: "tz1VJpG3LpAgE3yvvQn9FgG4YbYpP3oYXxw", + availableStaked: 5000, + totalStaked: 10000, + votes: 1000, + proposalsVoted: 100 + } + ] + }, + extra: { + frozen_token_id: "0", + min_quorum_threshold: "0", + quorum_change: "0", + quorum_threshold: "0", + frozen_extra_value: "0", + frozen_scale_value: "0", + max_proposal_size: 0, + max_xtz_amount: "0", + returnedPercentage: 0 + }, + liteDAO: undefined, + frozen_token_id: "0", + frozen_scale_value: "0", + frozen_extra_value: "0", + guardian: "", + max_quorum_change: "0", + max_quorum_threshold: "0", + min_quorum_threshold: "0", + quorum_change: "0", + quorum_threshold: "0", + max_proposal_size: 0, + max_xtz_amount: "0", + min_xtz_amount: "0", + network: "etherlink_testnet", + slash_division_value: "0", + slash_scale_value: "0" + } as any) + console.log("daoData LambdaDAO", data) + return data + } const response = await getDAO(address as string) const liteDAO = await fetchLiteData(address, network) @@ -103,13 +182,17 @@ export const useDAO = (address: string) => { }, { enabled: !!address, - refetchInterval: 30000 + refetchInterval: 30000, + refetchOnWindowFocus: false } ) useEffect(() => { ;(async () => { - if (data && blockchainInfo) { + if ((data as any)?.address === "onchain-etherlink") { + console.log("No cycle info for etherlink") + return + } else if (data && blockchainInfo) { const blockTimeAverage = blockchainInfo.constants.timeBetweenBlocks const blocksFromStart = block - data.data.start_level const periodsFromStart = Math.floor(blocksFromStart / Number(data.data.period)) diff --git a/src/theme/index.ts b/src/theme/index.ts index fa4c0a9c..9ba14ab8 100644 --- a/src/theme/index.ts +++ b/src/theme/index.ts @@ -10,6 +10,7 @@ export const theme = createTheme({ } }, palette: { + type: "dark", primary: { main: "#2F3438", dark: "#1C1F23", diff --git a/yarn.lock b/yarn.lock index ff06d93c..5b143111 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4781,6 +4781,13 @@ dependencies: "@walletconnect/jsonrpc-types" "^1.0.2" +"@walletconnect/relay-api@1.0.11": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@walletconnect/relay-api/-/relay-api-1.0.11.tgz#80ab7ef2e83c6c173be1a59756f95e515fb63224" + integrity sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q== + dependencies: + "@walletconnect/jsonrpc-types" "^1.0.2" + "@walletconnect/relay-auth@1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz#0b5c55c9aa3b0ef61f526ce679f3ff8a5c4c2c7c" @@ -4884,6 +4891,28 @@ query-string "7.1.3" uint8arrays "3.1.0" +"@walletconnect/utils@^2.14.0": + version "2.16.1" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.16.1.tgz#2099cc2bd16b0edc32022f64aa2c2c323b45d1d4" + integrity sha512-aoQirVoDoiiEtYeYDtNtQxFzwO/oCrz9zqeEEXYJaAwXlGVTS34KFe7W3/Rxd/pldTYKFOZsku2EzpISfH8Wsw== + dependencies: + "@stablelib/chacha20poly1305" "1.0.1" + "@stablelib/hkdf" "1.0.1" + "@stablelib/random" "1.0.2" + "@stablelib/sha256" "1.0.1" + "@stablelib/x25519" "1.0.3" + "@walletconnect/relay-api" "1.0.11" + "@walletconnect/relay-auth" "1.0.4" + "@walletconnect/safe-json" "1.0.2" + "@walletconnect/time" "1.0.2" + "@walletconnect/types" "2.16.1" + "@walletconnect/window-getters" "1.0.1" + "@walletconnect/window-metadata" "1.0.1" + detect-browser "5.3.0" + elliptic "^6.5.7" + query-string "7.1.3" + uint8arrays "3.1.0" + "@walletconnect/window-getters@1.0.1", "@walletconnect/window-getters@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.1.tgz#f36d1c72558a7f6b87ecc4451fc8bd44f63cbbdc" @@ -7537,6 +7566,19 @@ elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +elliptic@^6.5.7: + version "6.5.7" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.7.tgz#8ec4da2cb2939926a1b9a73619d768207e647c8b" + integrity sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emittery@^0.10.2: version "0.10.2" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" From 4d4bd1bf934515e64aa8a57c220d89d628e3c116 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Tue, 1 Oct 2024 15:33:14 +0530 Subject: [PATCH 15/36] WIP - OnChain DAO Create --- src/modules/creator/etherlink.tsx | 7 +++++++ src/modules/creator/state/context.tsx | 4 +++- .../explorer/components/EthChangeConfigProposalForm.tsx | 5 +---- src/services/wagmi/config.ts | 4 ++-- 4 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 src/modules/creator/etherlink.tsx diff --git a/src/modules/creator/etherlink.tsx b/src/modules/creator/etherlink.tsx new file mode 100644 index 00000000..ec9bdba8 --- /dev/null +++ b/src/modules/creator/etherlink.tsx @@ -0,0 +1,7 @@ +import React, { useContext } from "react" +import { EthCreatorContext } from "./state" + +export const EthDAOCreate: React.FC = () => { + const creator = useContext(EthCreatorContext) + return
Ethereum DAO Create
+} diff --git a/src/modules/creator/state/context.tsx b/src/modules/creator/state/context.tsx index 1f3f9531..6d2bdc09 100644 --- a/src/modules/creator/state/context.tsx +++ b/src/modules/creator/state/context.tsx @@ -189,4 +189,6 @@ const CreatorProvider: React.FC = ({ children }) => { return {children} } -export { CreatorProvider, CreatorContext } +const EthCreatorContext = createContext({}) + +export { CreatorProvider, CreatorContext, EthCreatorContext } diff --git a/src/modules/explorer/components/EthChangeConfigProposalForm.tsx b/src/modules/explorer/components/EthChangeConfigProposalForm.tsx index 00807c0b..ba5eb89e 100644 --- a/src/modules/explorer/components/EthChangeConfigProposalForm.tsx +++ b/src/modules/explorer/components/EthChangeConfigProposalForm.tsx @@ -1,11 +1,8 @@ import React, { useState } from "react" -import { Box } from "@mui/material" import { ResponsiveDialog } from "./ResponsiveDialog" -import { ProposalFormInput } from "./ProposalFormInput" -import { Controller } from "react-hook-form" import { Grid, TextField, Typography, MenuItem, useMediaQuery, useTheme } from "@material-ui/core" import { SendButton } from "./ProposalFormSendButton" -import Select, { SelectChangeEvent } from "@mui/material/Select" +import Select from "@mui/material/Select" interface EthContractCallFormProps { open: boolean diff --git a/src/services/wagmi/config.ts b/src/services/wagmi/config.ts index 34f7b5d4..cee937d3 100644 --- a/src/services/wagmi/config.ts +++ b/src/services/wagmi/config.ts @@ -1,11 +1,11 @@ import { createConfig, http } from "wagmi" -import { etherlink, etherlinkTestnet } from "wagmi/chains" +import { etherlink, etherlinkTestnet, hardhat } from "wagmi/chains" import { metaMask, injected, safe } from "wagmi/connectors" import { DeployContract } from "./token" import { getDefaultConfig } from "connectkit" -const wagmiChains = [etherlink, etherlinkTestnet] as const +const wagmiChains = [etherlink, etherlinkTestnet, hardhat] as const // 1. Your WalletConnect Cloud project ID const projectId = "7dd66fecc485693b67e6921c580e7040" From 8fbb9c7ea0d7d5af7efb82c1048b0e7315601f8a Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Mon, 18 Nov 2024 23:53:52 +0530 Subject: [PATCH 16/36] Change in UseTezos --- src/services/beacon/hooks/useTezos.ts | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/services/beacon/hooks/useTezos.ts b/src/services/beacon/hooks/useTezos.ts index 9826e3eb..b632b473 100644 --- a/src/services/beacon/hooks/useTezos.ts +++ b/src/services/beacon/hooks/useTezos.ts @@ -39,17 +39,6 @@ export const useTezos = (): WalletConnectReturn => { signer: ethSigner } = useContext(EtherlinkContext) - const { open, close } = useWeb3Modal() - const { address: ethAddress, isConnected: isEtherlinkConnected } = useWagmiAccount() - // const { connect: wagmiConnect, connectors } = useWagmiConnect() - // eslint-disable-next-line react-hooks/exhaustive-deps - const openEthWallet = async () => { - if (isEtherlinkConnected) { - await disconnectEtherlink(wagmiConfig) - } - open({ view: "Connect" }) - } - const queryClient = useQueryClient() const handleEtherlinkNetworkChange = useCallback( From 4d1b1736ea49e1563a9c081ddb928c00781d1eac Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Tue, 19 Nov 2024 01:22:14 +0530 Subject: [PATCH 17/36] DAO Creator Routing Setup --- package.json | 2 +- src/App.tsx | 6 + src/components/ui/DaoCreator.tsx | 195 +++++++++++ src/modules/common/ToolbarAccount.tsx | 2 +- src/modules/common/ToolbarCommon.tsx | 2 +- src/modules/creator/index.tsx | 128 +------- src/modules/creator/router.tsx | 1 + src/modules/creator/state/types.ts | 2 +- src/modules/creator/steps/DaoSettings.tsx | 133 +------- src/modules/creator/steps/Template.tsx | 44 +-- .../etherlink/components/EvmDaoBasics.tsx | 302 ++++++++++++++++++ .../etherlink/components/EvmDaoDeployment.tsx | 14 + .../etherlink/components/EvmDaoQuorum.tsx | 14 + .../etherlink/components/EvmDaoSummary.tsx | 14 + .../etherlink/components/EvmDaoVoting.tsx | 14 + src/modules/etherlink/config.ts | 24 ++ src/modules/etherlink/index.tsx | 0 src/modules/etherlink/layout.tsx | 94 ++++++ src/modules/etherlink/router.tsx | 22 ++ src/modules/etherlink/utils.ts | 7 + .../explorer/components/ProposalForm.tsx | 14 +- src/modules/explorer/components/Toolbar.tsx | 26 +- src/modules/explorer/pages/DAO/router.tsx | 1 - yarn.lock | 228 ++++++++++--- 24 files changed, 943 insertions(+), 346 deletions(-) create mode 100644 src/components/ui/DaoCreator.tsx create mode 100644 src/modules/etherlink/components/EvmDaoBasics.tsx create mode 100644 src/modules/etherlink/components/EvmDaoDeployment.tsx create mode 100644 src/modules/etherlink/components/EvmDaoQuorum.tsx create mode 100644 src/modules/etherlink/components/EvmDaoSummary.tsx create mode 100644 src/modules/etherlink/components/EvmDaoVoting.tsx create mode 100644 src/modules/etherlink/config.ts create mode 100644 src/modules/etherlink/index.tsx create mode 100644 src/modules/etherlink/layout.tsx create mode 100644 src/modules/etherlink/router.tsx create mode 100644 src/modules/etherlink/utils.ts diff --git a/package.json b/package.json index a86f32b7..7fd883c8 100644 --- a/package.json +++ b/package.json @@ -156,4 +156,4 @@ "npm run lint:check" ] } -} \ No newline at end of file +} diff --git a/src/App.tsx b/src/App.tsx index 8cad6798..df7484d2 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -30,6 +30,7 @@ import { DAOCreatorRouter } from "modules/creator/router" import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider" import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs" import { CommunityCreator } from "modules/lite/creator" +import { EtherlinkDAOCreatorRouter } from "modules/etherlink/router" const queryClient = new QueryClient({ defaultOptions: { @@ -109,6 +110,11 @@ const App: React.FC = () => { + + + + + diff --git a/src/components/ui/DaoCreator.tsx b/src/components/ui/DaoCreator.tsx new file mode 100644 index 00000000..50479753 --- /dev/null +++ b/src/components/ui/DaoCreator.tsx @@ -0,0 +1,195 @@ +import { + Box, + Grid, + Paper, + Step, + StepLabel, + Stepper, + TextareaAutosize, + Typography, + styled, + withStyles, + withTheme +} from "@material-ui/core" +import { InfoRounded } from "@mui/icons-material" +import { TextField as FormikTextField } from "formik-material-ui" + +export const PageContainer = styled(Grid)(({ theme }) => ({ + background: theme.palette.primary.main +})) + +export const StepContentContainer = styled(Grid)({ + alignItems: "baseline", + height: "100%", + paddingTop: 0, + boxSizing: "border-box", + overflowY: "auto", + marginLeft: 47, + zIndex: 10, + width: "fit-content", + ["@media (max-width:1167px)"]: { + marginLeft: 0 + } +}) + +export const StyledStepper = styled(Stepper)({ + "background": "inherit", + "paddingTop": 48, + "& .MuiStepLabel-label": { + fontSize: 14, + lineHeight: 14 + }, + "cursor": "pointer" +}) + +export const IndicatorValue = styled(Paper)(({ theme }) => ({ + display: "flex", + alignItems: "center", + justifyContent: "center", + textAlign: "center", + position: "absolute", + top: 0, + width: "100%", + height: "100%", + margin: "0 auto", + fontSize: 25, + color: theme.palette.text.secondary, + userSelect: "none", + boxShadow: "none", + background: "inherit", + fontFamily: "Roboto Flex" +})) + +export const FAQClickToAction = styled(Typography)(({ theme }) => ({ + color: theme.palette.secondary.main, + fontSize: "14px", + cursor: "pointer", + fontWeight: 300 +})) + +export const FAQReadMe = styled(Typography)(({ theme }) => ({ + fontSize: "14px", + cursor: "pointer", + fontWeight: 300 +})) + +export const ProgressContainer = styled(Grid)(({ theme }) => ({ + background: "#2F3438", + display: "grid", + borderRadius: 8, + maxHeight: 680, + paddingTop: 20, + position: "sticky", + top: 130 +})) + +export const PageContent = styled(Grid)({ + width: "1000px", + height: "100%", + margin: "auto", + padding: "28px 0", + flexDirection: "row", + paddingTop: 0, + ["@media (max-width:1167px)"]: { + width: "86vw" + } +}) + +export const DescriptionText = styled(Typography)(({ theme }) => ({ + color: theme.palette.secondary.dark +})) + +export const SecondContainer = styled(Grid)({ + marginTop: 25 +}) + +export const CustomInputContainer = styled(Grid)(({ theme }) => ({ + "height": 54, + "boxSizing": "border-box", + "marginTop": 14, + "background": "#2F3438", + "borderRadius": 8, + "alignItems": "center", + "display": "flex", + "padding": "13px 23px", + "fontWeight": 300, + "& input::placeholder": { + fontWeight: 300 + } +})) + +export const CustomTextarea = styled(withTheme(TextareaAutosize))(props => ({ + "minHeight": 152, + "boxSizing": "border-box", + "width": "100%", + "marginTop": 14, + "fontWeight": 300, + "padding": "21px 20px", + "border": "none", + "fontSize": 16, + "fontFamily": "Roboto Flex", + "color": props.theme.palette.text.secondary, + "background": "#2F3438", + "lineHeight": "135%", + "letterSpacing": -0.18, + "borderRadius": 8, + "paddingRight": 40, + "wordBreak": "break-word", + "&:focus-visible": { + outline: "none" + } +})) + +export const CustomFormikTextField = withStyles({ + root: { + "& .MuiInput-root": { + fontWeight: 300, + textAlign: "initial" + }, + "& .MuiInputBase-input": { + textAlign: "initial" + }, + "& .MuiInputBase-root": { + textWeight: 300 + }, + "& .MuiInput-underline:before": { + borderBottom: "none !important" + }, + "& .MuiInput-underline:hover:before": { + borderBottom: "none !important" + }, + "& .MuiInput-underline:after": { + borderBottom: "none !important" + } + } +})(FormikTextField) + +export const ErrorText = styled(Typography)({ + fontSize: 14, + color: "red", + marginTop: 4 +}) + +export const InfoIconInput = styled(InfoRounded)(({ theme }) => ({ + cursor: "default", + color: theme.palette.secondary.light, + height: 16, + width: 16 +})) +export const TextareaContainer = styled(Grid)({ + display: "flex", + position: "relative" +}) + +export const MetadataContainer = styled(Grid)({ + margin: "-4px 0 16px 0" +}) + +export const InfoIcon = styled(InfoRounded)(({ theme }) => ({ + position: "absolute", + right: 25, + top: "20%", + color: theme.palette.secondary.light, + height: 18, + width: 18 +})) diff --git a/src/modules/common/ToolbarAccount.tsx b/src/modules/common/ToolbarAccount.tsx index b6f28951..035da87e 100644 --- a/src/modules/common/ToolbarAccount.tsx +++ b/src/modules/common/ToolbarAccount.tsx @@ -103,7 +103,7 @@ export const ToolbarAccount: React.FC = ({ children, variant = "common" }) setPopperOpen(!popperOpen) } - console.log("XX", { account, etherlink }) + // console.log("XX", { account, etherlink }) if (walletAddress || etherlink?.isConnected) return ( ({ width: "1000px", diff --git a/src/modules/creator/index.tsx b/src/modules/creator/index.tsx index 56e75581..a7bee385 100644 --- a/src/modules/creator/index.tsx +++ b/src/modules/creator/index.tsx @@ -1,18 +1,5 @@ -import React, { useContext, useEffect, useMemo } from "react" -import { - Box, - Grid, - Paper, - Step, - StepLabel, - Stepper, - Typography, - styled, - useMediaQuery, - useTheme, - Theme, - Link -} from "@material-ui/core" +import React, { useContext, useEffect } from "react" +import { Box, Grid, Step, StepLabel, useMediaQuery, useTheme, Link } from "@material-ui/core" import ProgressBar from "react-customizable-progressbar" import { useHistory } from "react-router" @@ -21,113 +8,22 @@ import { StepRouter, STEPS, urlToStepMap, useStepNumber } from "modules/creator/ import { NavigationBar } from "modules/creator/components/NavigationBar" import { Navbar } from "modules/common/Toolbar" import mixpanel from "mixpanel-browser" - -const PageContainer = styled(Grid)(({ theme }) => ({ - background: theme.palette.primary.main -})) - -const StepContentContainer = styled(Grid)({ - alignItems: "baseline", - height: "100%", - paddingTop: 0, - boxSizing: "border-box", - overflowY: "auto", - marginLeft: 47, - zIndex: 10, - width: "fit-content", - ["@media (max-width:1167px)"]: { - marginLeft: 0 - } -}) - -const StyledStepper = styled(Stepper)({ - "background": "inherit", - "paddingTop": 48, - "& .MuiStepLabel-label": { - fontSize: 14, - lineHeight: 14 - }, - "cursor": "pointer" -}) - -const IndicatorValue = styled(Paper)(({ theme }) => ({ - display: "flex", - alignItems: "center", - justifyContent: "center", - textAlign: "center", - position: "absolute", - top: 0, - width: "100%", - height: "100%", - margin: "0 auto", - fontSize: 25, - color: theme.palette.text.secondary, - userSelect: "none", - boxShadow: "none", - background: "inherit", - fontFamily: "Roboto Flex" -})) - -const FAQClickToAction = styled(Typography)(({ theme }) => ({ - color: theme.palette.secondary.main, - fontSize: "14px", - cursor: "pointer", - fontWeight: 300 -})) - -const FAQReadMe = styled(Typography)(({ theme }) => ({ - fontSize: "14px", - cursor: "pointer", - fontWeight: 300 -})) - -const ProgressContainer = styled(Grid)(({ theme }) => ({ - background: "#2F3438", - display: "grid", - borderRadius: 8, - maxHeight: 680, - paddingTop: 20, - position: "sticky", - top: 130 -})) - -const custom = (theme: Theme) => ({ - logo: { - height: "100%", - alignItems: "baseline", - display: "flex", - marginTop: 22 - }, - appBorder: { - borderBottom: `2px solid ${theme.palette.primary.light}` - }, - appHeight: { - height: "inherit" - }, - appLogoHeight: { - height: "inherit", - borderRight: `2px solid ${theme.palette.primary.light}` - } -}) - -const PageContent = styled(Grid)({ - width: "1000px", - height: "100%", - margin: "auto", - padding: "28px 0", - flexDirection: "row", - paddingTop: 0, - ["@media (max-width:1167px)"]: { - width: "86vw" - } -}) +import { + PageContainer, + PageContent, + ProgressContainer, + IndicatorValue, + StyledStepper, + StepContentContainer, + FAQReadMe, + FAQClickToAction +} from "components/ui/DaoCreator" export const DAOCreate: React.FC = () => { const creator = useContext(CreatorContext) const { back, next } = creator.state const step = useStepNumber() - const progress = useMemo(() => step * 20, [step]) const history = useHistory() const theme = useTheme() const isMobile = useMediaQuery(theme.breakpoints.down("sm")) diff --git a/src/modules/creator/router.tsx b/src/modules/creator/router.tsx index 9555c579..2e68b410 100644 --- a/src/modules/creator/router.tsx +++ b/src/modules/creator/router.tsx @@ -4,6 +4,7 @@ import { DAOList } from "modules/explorer/pages/DAOList" import { DAORouter } from "modules/explorer/pages/DAO/router" import { DAOCreate } from "." import { TokenDeploymentRouter } from "./token/router" +import { EtherlinkDAOCreatorRouter } from "modules/etherlink/router" export const DAOCreatorRouter = (): JSX.Element => { const match = useRouteMatch() diff --git a/src/modules/creator/state/types.ts b/src/modules/creator/state/types.ts index 6bbe0081..7b96ded5 100644 --- a/src/modules/creator/state/types.ts +++ b/src/modules/creator/state/types.ts @@ -66,7 +66,7 @@ export interface NavigationBarProps { } } -export type DAOTemplate = "lambda" | "lite" | "" +export type DAOTemplate = "lambda" | "lite" | "lambda-etherlink" export type DeploymentMethod = "managed" | "self-deployed" diff --git a/src/modules/creator/steps/DaoSettings.tsx b/src/modules/creator/steps/DaoSettings.tsx index a4568c39..f4ee9ba3 100644 --- a/src/modules/creator/steps/DaoSettings.tsx +++ b/src/modules/creator/steps/DaoSettings.tsx @@ -1,129 +1,26 @@ -import { - Grid, - styled, - Typography, - withStyles, - TextareaAutosize, - withTheme, - Box, - useMediaQuery, - useTheme, - InputAdornment, - Tooltip, - Link -} from "@material-ui/core" -import { validateContractAddress, validateAddress } from "@taquito/utils" import React, { useContext, useEffect } from "react" +import { Grid, Typography, Box, useMediaQuery, useTheme, InputAdornment, Tooltip, Link } from "@material-ui/core" +import { validateContractAddress, validateAddress } from "@taquito/utils" + import { useHistory, withRouter } from "react-router" import { useRouteMatch } from "react-router-dom" import { Field, Form, Formik, FormikErrors, getIn } from "formik" -import { TextField as FormikTextField } from "formik-material-ui" import { TitleBlock } from "modules/common/TitleBlock" - import { CreatorContext, ActionTypes, OrgSettings } from "modules/creator/state" -import { InfoRounded } from "@material-ui/icons" import { useTokenMetadata } from "services/contracts/baseDAO/hooks/useTokenMetadata" import { useTezos } from "services/beacon/hooks/useTezos" - -const SecondContainer = styled(Grid)({ - marginTop: 25 -}) - -const CustomInputContainer = styled(Grid)(({ theme }) => ({ - "height": 54, - "boxSizing": "border-box", - "marginTop": 14, - "background": "#2F3438", - "borderRadius": 8, - "alignItems": "center", - "display": "flex", - "padding": "13px 23px", - "fontWeight": 300, - "& input::placeholder": { - fontWeight: 300 - } -})) - -const InfoIcon = styled(InfoRounded)(({ theme }) => ({ - position: "absolute", - right: 25, - top: "20%", - color: theme.palette.secondary.light, - height: 18, - width: 18 -})) - -const InfoIconInput = styled(InfoRounded)(({ theme }) => ({ - cursor: "default", - color: theme.palette.secondary.light, - height: 16, - width: 16 -})) - -const TextareaContainer = styled(Grid)({ - display: "flex", - position: "relative" -}) - -const CustomFormikTextField = withStyles({ - root: { - "& .MuiInput-root": { - fontWeight: 300, - textAlign: "initial" - }, - "& .MuiInputBase-input": { - textAlign: "initial" - }, - "& .MuiInputBase-root": { - textWeight: 300 - }, - "& .MuiInput-underline:before": { - borderBottom: "none !important" - }, - "& .MuiInput-underline:hover:before": { - borderBottom: "none !important" - }, - "& .MuiInput-underline:after": { - borderBottom: "none !important" - } - } -})(FormikTextField) - -const MetadataContainer = styled(Grid)({ - margin: "-4px 0 16px 0" -}) - -const CustomTextarea = styled(withTheme(TextareaAutosize))(props => ({ - "minHeight": 152, - "boxSizing": "border-box", - "width": "100%", - "marginTop": 14, - "fontWeight": 300, - "padding": "21px 20px", - "border": "none", - "fontSize": 16, - "fontFamily": "Roboto Flex", - "color": props.theme.palette.text.secondary, - "background": "#2F3438", - "lineHeight": "135%", - "letterSpacing": -0.18, - "borderRadius": 8, - "paddingRight": 40, - "wordBreak": "break-word", - "&:focus-visible": { - outline: "none" - } -})) - -const ErrorText = styled(Typography)({ - fontSize: 14, - color: "red", - marginTop: 4 -}) - -const DescriptionText = styled(Typography)(({ theme }) => ({ - color: theme.palette.secondary.dark -})) +import { + InfoIconInput, + DescriptionText, + TextareaContainer, + CustomInputContainer, + CustomFormikTextField, + ErrorText, + MetadataContainer, + CustomTextarea, + SecondContainer, + InfoIcon +} from "components/ui/DaoCreator" const DaoSettingsForm = withRouter(({ submitForm, values, setFieldValue, errors, touched, setFieldTouched }: any) => { const theme = useTheme() diff --git a/src/modules/creator/steps/Template.tsx b/src/modules/creator/steps/Template.tsx index 630dd5e8..82b3d09f 100644 --- a/src/modules/creator/steps/Template.tsx +++ b/src/modules/creator/steps/Template.tsx @@ -42,12 +42,11 @@ const LambdaCustomBoxFullDao = ({ style, update, isMobileSmall, isEtherLink, sel alignItems="center" xs={isMobileSmall ? 12 : 5} onClick={() => { - if (isEtherLink) return + if (isEtherLink) return update("lambda-etherlink") update("lambda") }} title={"Hello World"} - className={selectedTemplate === "lambda" ? style.selected : ""} - style={{ opacity: isEtherLink ? 0.4 : 1 }} + className={["lambda", "lambda-etherlink"].includes(selectedTemplate) ? style.selected : ""} > Full DAO @@ -116,11 +115,14 @@ export const Template = (): JSX.Element => { type: ActionTypes.UPDATE_TEMPLATE, template: selectedTemplate }) - - if (selectedTemplate === "lambda") { - return history.push(`dao`) + switch (selectedTemplate) { + case "lambda": + return history.push(`dao`) + case "lite": + return history.push("/creator/etherlink/dao") + default: + return history.push("/lite") } - return history.push("/lite") }, text: "Continue" }, @@ -144,25 +146,13 @@ export const Template = (): JSX.Element => { - {isEtherLink ? ( - - - - ) : ( - - )}{" "} + { Off-chain weighted voting. Multiple voting strategies. No treasury.{" "} - {" "} + {error ? {"Must select a template in order to continue"} : null} diff --git a/src/modules/etherlink/components/EvmDaoBasics.tsx b/src/modules/etherlink/components/EvmDaoBasics.tsx new file mode 100644 index 00000000..1c1e178d --- /dev/null +++ b/src/modules/etherlink/components/EvmDaoBasics.tsx @@ -0,0 +1,302 @@ +import { Field, Form, FormikErrors, getIn } from "formik" +import { Formik } from "formik" +import { Box } from "@mui/material" +import { TitleBlock } from "modules/common/TitleBlock" +import { + DescriptionText, + SecondContainer, + CustomInputContainer, + CustomFormikTextField, + InfoIconInput, + TextareaContainer, + MetadataContainer, + CustomTextarea +} from "components/ui/DaoCreator" +import React from "react" +import { Link } from "@material-ui/core" +import { + Grid, + styled, + Typography, + withStyles, + TextareaAutosize, + withTheme, + useMediaQuery, + useTheme, + InputAdornment, + Tooltip +} from "@material-ui/core" + +import { ErrorText } from "modules/creator/token/ui" +import { OrgSettings } from "modules/creator/state/types" +import { isInvalidEvmAddress, validateEvmTokenAddress } from "../utils" +import { InfoIcon } from "modules/explorer/components/styled/InfoIcon" + +interface EvmDaoBasicsProps { + // Add props as needed +} + +const validateForm = (values: OrgSettings) => { + const errors: FormikErrors = {} + + if (!values.name) { + errors.name = "Required" + } + + if (!values.symbol) { + errors.symbol = "Required" + } + + if (!values.description) { + errors.description = "Required" + } + + if (!values.guardian) { + errors.guardian = "Required" + } + + if (values.guardian && isInvalidEvmAddress(values.guardian)) { + errors.guardian = "Invalid address" + } + + if (!values.governanceToken.address) { + errors.governanceToken = { + ...errors.governanceToken, + address: "Required" + } + } + + if (values.governanceToken.address && validateEvmTokenAddress(values.governanceToken.address)) { + errors.governanceToken = { + ...errors.governanceToken, + address: "Invalid address" + } + } + + if (!values.governanceToken.tokenId) { + errors.governanceToken = { + ...errors.governanceToken, + tokenId: "Required" + } + } + + if (!values.governanceToken.tokenMetadata) { + errors.governanceToken = { + ...errors.governanceToken, + address: "Could not find token" + } + } + + if (values.governanceToken.tokenMetadata?.standard === "fa1.2") { + errors.governanceToken = { + ...errors.governanceToken, + address: "FA1.2 Tokens Not Supported" + } + } + + return errors +} + +export const EvmDaoBasics: React.FC = () => { + const theme = useTheme() + const isMobile = useMediaQuery(theme.breakpoints.down("sm")) + + const saveStepInfo = (values: OrgSettings, { setSubmitting }: { setSubmitting: (b: boolean) => void }) => { + const newValues: OrgSettings = { ...values } + // const newState = { + // ...state?.data, + // orgSettings: newValues + // } + + setSubmitting(true) + // dispatch({ type: ActionTypes.UPDATE_ORGANIZATION_SETTINGS, org: newValues }) + // history.push(`voting`) + } + + const tokenMetadata = { + name: "Test", + symbol: "TEST" + } + const loading = false + + const orgSettings: OrgSettings = { + name: "", + symbol: "", + description: "", + administrator: "", + guardian: "", + governanceToken: { address: "", tokenId: "" } + } + + return ( + + + These settings will define the name, symbol, and initial distribution of your token. You will need a + pre-existing ERC20 token to use as governance token. To deploy your own governance token you can go{" "} + + here + {" "} + and then come back. + + } + > + + + {({ submitForm, isSubmitting, setFieldValue, values, errors, touched, setFieldTouched }) => { + return ( +
+ <> + + + + {" "} + DAO Name{" "} + + + + + {errors.name && touched.name ? {errors.name} : null} + + + + {" "} + Token Address{" "} + + + setFieldTouched("governanceToken.address")} + inputProps={{ + maxLength: 36 + }} + /> + + {errors.governanceToken?.address && touched.governanceToken?.address ? ( + {errors.governanceToken?.address} + ) : null} + + + + {" "} + Token ID{" "} + + + + + + + + ) + }} + /> + + {errors.governanceToken?.tokenId && touched.governanceToken?.tokenId ? ( + {errors.governanceToken?.tokenId} + ) : null} + + {tokenMetadata && !loading && ( + + + {tokenMetadata.name} ({tokenMetadata.symbol}) + + + )} + + + + + {" "} + Guardian Address{" "} + + + + + setFieldTouched("guardian")} + inputProps={{ + maxLength: 36 + }} + InputProps={{ + endAdornment: ( + + + + + + ) + }} + > + + {errors.guardian && touched.guardian ? {errors.guardian} : null} + + + + + + DAO Description + + + + + {() => ( + { + setFieldValue("description", newValue.target.value) + }} + /> + )} + + + + + + {errors.description && touched.description ? {errors.description} : null} + + +
+ ) + }} +
+
+ ) +} diff --git a/src/modules/etherlink/components/EvmDaoDeployment.tsx b/src/modules/etherlink/components/EvmDaoDeployment.tsx new file mode 100644 index 00000000..a14d41c5 --- /dev/null +++ b/src/modules/etherlink/components/EvmDaoDeployment.tsx @@ -0,0 +1,14 @@ +import React from "react" + +interface EvmDaoDeploymentProps { + // Add props as needed +} + +export const EvmDaoDeployment: React.FC = () => { + return ( +
+

Deploy Your DAO

+
+
+ ) +} diff --git a/src/modules/etherlink/components/EvmDaoQuorum.tsx b/src/modules/etherlink/components/EvmDaoQuorum.tsx new file mode 100644 index 00000000..d824a1af --- /dev/null +++ b/src/modules/etherlink/components/EvmDaoQuorum.tsx @@ -0,0 +1,14 @@ +import React from "react" + +interface EvmDaoQuorumProps { + // Add props as needed +} + +export const EvmDaoQuorum: React.FC = () => { + return ( +
+

Quorum Settings

+
+
+ ) +} diff --git a/src/modules/etherlink/components/EvmDaoSummary.tsx b/src/modules/etherlink/components/EvmDaoSummary.tsx new file mode 100644 index 00000000..b3bb0a99 --- /dev/null +++ b/src/modules/etherlink/components/EvmDaoSummary.tsx @@ -0,0 +1,14 @@ +import React from "react" + +interface EvmDaoSummaryProps { + // Add props as needed +} + +export const EvmDaoSummary: React.FC = () => { + return ( +
+

DAO Summary

+
+
+ ) +} diff --git a/src/modules/etherlink/components/EvmDaoVoting.tsx b/src/modules/etherlink/components/EvmDaoVoting.tsx new file mode 100644 index 00000000..441b7dce --- /dev/null +++ b/src/modules/etherlink/components/EvmDaoVoting.tsx @@ -0,0 +1,14 @@ +import React from "react" + +interface EvmDaoVotingProps { + // Add props as needed +} + +export const EvmDaoVoting: React.FC = () => { + return ( +
+

Voting Configuration

+
+
+ ) +} diff --git a/src/modules/etherlink/config.ts b/src/modules/etherlink/config.ts new file mode 100644 index 00000000..c763f126 --- /dev/null +++ b/src/modules/etherlink/config.ts @@ -0,0 +1,24 @@ +import { EvmDaoBasics } from "./components/EvmDaoBasics" +import { EvmDaoDeployment } from "./components/EvmDaoDeployment" +import { EvmDaoQuorum } from "./components/EvmDaoQuorum" +import { EvmDaoSummary } from "./components/EvmDaoSummary" +import { EvmDaoVoting } from "./components/EvmDaoVoting" + +export const STEPS = [ + { title: "DAO Template", index: 0, path: "template", component: EvmDaoBasics }, + { title: "DAO Basics", index: 1, path: "dao", component: EvmDaoBasics }, + { title: "Proposals & Voting", index: 2, path: "voting", component: EvmDaoVoting }, + { title: "Quorum", index: 3, path: "quorum", component: EvmDaoQuorum }, + { title: "Review Information", index: 4, path: "summary", component: EvmDaoSummary }, + { title: "Deployment Type", index: 5, path: "type", component: EvmDaoDeployment } +] + +export const urlToStepMap: Record = { + template: 0, + dao: 1, + voting: 2, + quorum: 3, + summary: 4, + type: 5, + review: 6 +} diff --git a/src/modules/etherlink/index.tsx b/src/modules/etherlink/index.tsx new file mode 100644 index 00000000..e69de29b diff --git a/src/modules/etherlink/layout.tsx b/src/modules/etherlink/layout.tsx new file mode 100644 index 00000000..22fe1c57 --- /dev/null +++ b/src/modules/etherlink/layout.tsx @@ -0,0 +1,94 @@ +import React, { useContext, useEffect } from "react" +import { Box, Grid, Step, StepLabel, useMediaQuery, useTheme, Link } from "@material-ui/core" +import ProgressBar from "react-customizable-progressbar" +import { useHistory } from "react-router" + +import { CreatorContext, StepInfo } from "modules/creator/state" +import { StepRouter, STEPS, useStepNumber } from "modules/creator/steps" +import { NavigationBar } from "modules/creator/components/NavigationBar" +import { Navbar } from "modules/common/Toolbar" +import { + PageContainer, + StepContentContainer, + ProgressContainer, + IndicatorValue, + FAQReadMe, + FAQClickToAction, + StyledStepper, + PageContent +} from "components/ui/DaoCreator" +import mixpanel from "mixpanel-browser" + +import { urlToStepMap } from "./config" + +export const EvmDaoCreatorLayout: React.FC = ({ children }) => { + // const creator = useContext(CreatorContext) + + // const { back, next } = creator.state + const back = () => {} + const next = () => {} + const step = useStepNumber() + const history = useHistory() + const theme = useTheme() + const isMobile = useMediaQuery(theme.breakpoints.down("sm")) + + useEffect(() => { + mixpanel.unregister("daoAddress") + mixpanel.unregister("daoType") + + mixpanel.track("Visited Creator") + }, []) + + return ( + + + + {!isMobile && ( + + + + + {Math.floor((step / (Object.keys(urlToStepMap).length - 1)) * 100)}% + + + + New to DAOs? + + Read our FAQ + + + + {STEPS.map(({ title, path }: StepInfo, index: number) => ( + + (index < step ? history.push(path) : null)} icon={index + 1}> + {title} + + + ))} + + + + )} + + + + + + {children} + {/* */} + + + + {/* {step < 6 && } */} + + + + ) +} diff --git a/src/modules/etherlink/router.tsx b/src/modules/etherlink/router.tsx new file mode 100644 index 00000000..0913fc7d --- /dev/null +++ b/src/modules/etherlink/router.tsx @@ -0,0 +1,22 @@ +import { Redirect, Switch, useRouteMatch } from "react-router-dom" + +import { Route } from "react-router-dom" +import { STEPS } from "./config" +import { EvmDaoCreatorLayout } from "./layout" + +export const EtherlinkDAOCreatorRouter = () => { + const match = useRouteMatch() + console.log("EtherlinkDAOCreatorRouter", match) + return ( + + {STEPS.map(step => ( + + + + + + ))} + {/* */} + + ) +} diff --git a/src/modules/etherlink/utils.ts b/src/modules/etherlink/utils.ts new file mode 100644 index 00000000..11c96800 --- /dev/null +++ b/src/modules/etherlink/utils.ts @@ -0,0 +1,7 @@ +export const isInvalidEvmAddress = (address: string) => { + return true +} + +export const validateEvmTokenAddress = (address: string) => { + return true +} diff --git a/src/modules/explorer/components/ProposalForm.tsx b/src/modules/explorer/components/ProposalForm.tsx index dd560aa7..56b4758f 100644 --- a/src/modules/explorer/components/ProposalForm.tsx +++ b/src/modules/explorer/components/ProposalForm.tsx @@ -32,12 +32,6 @@ const CustomContainer = styled(Grid)({ padding: "42px 54px 0px 54px" }) -const IconSwap = styled(SwapIcon)({ - marginLeft: 16, - marginRight: 16, - cursor: "pointer" -}) - const DialogTitle = styled(Typography)({ fontSize: 24, fontWeight: 500, @@ -89,7 +83,7 @@ const enabledForms: Record< component: ({ open }) => } ], - "": [], + "lambda-etherlink": [], "lite": [] } @@ -98,16 +92,10 @@ const Content = styled(Grid)({ paddingBottom: 24 }) -const SwapText = styled(Typography)({ - opacity: 0.65, - color: "#fff" -}) - export const ProposalFormContainer: React.FC = ({ open, handleClose, defaultValues, defaultTab }) => { const daoId = useDAOID() const { data: dao } = useDAO(daoId) const { data: daoHoldings } = useDAOHoldings(daoId) - const [state, setState] = useState(defaultTab) const methods = useForm({ defaultValues: useMemo( diff --git a/src/modules/explorer/components/Toolbar.tsx b/src/modules/explorer/components/Toolbar.tsx index 6b2a6570..c660eac3 100644 --- a/src/modules/explorer/components/Toolbar.tsx +++ b/src/modules/explorer/components/Toolbar.tsx @@ -1,38 +1,16 @@ import React from "react" -import { - AppBar, - Toolbar, - Button, - styled, - Typography, - Box, - Grid, - useTheme, - useMediaQuery, - Theme -} from "@material-ui/core" +import { Box, Grid, useTheme, useMediaQuery } from "@material-ui/core" import HomeButton from "assets/logos/homebase-logo.svg" -import { toShortAddress } from "services/contracts/utils" -import { toShortAddress } from "services/contracts/utils" -import { useTezos } from "services/beacon/hooks/useTezos" -import { ChangeNetworkButton } from "./ChangeNetworkButton" -import { UserProfileName } from "modules/explorer/components/UserProfileName" -import { ProfileAvatar } from "modules/explorer/components/styled/ProfileAvatar" import { NavigationMenu } from "modules/explorer/components/NavigationMenu" -import { ActionSheet, useActionSheet } from "../context/ActionSheets" -import { SmallButton } from "../../common/SmallButton" -import { ConnectWalletButton } from "modules/common/ConnectWalletButton" + import { ToolbarAccount } from "modules/common/ToolbarAccount" import { Header, StyledAppBar, StyledToolbar, LogoText, LogoItem, ToolbarContainer } from "components/ui/Toolbar" export const Navbar: React.FC<{ disableMobileMenu?: boolean }> = ({ disableMobileMenu, children }) => { - const { connect, account: tzAccountAddress, etherlink, network } = useTezos() const theme = useTheme() const isMobileExtraSmall = useMediaQuery(theme.breakpoints.down("mobile")) - const { open: openUserMenuSheet } = useActionSheet(ActionSheet.UserMenu) - const walletAddress = network.startsWith("etherlink") ? etherlink.account?.address : tzAccountAddress return ( diff --git a/src/modules/explorer/pages/DAO/router.tsx b/src/modules/explorer/pages/DAO/router.tsx index 2844a99f..a2e9f896 100644 --- a/src/modules/explorer/pages/DAO/router.tsx +++ b/src/modules/explorer/pages/DAO/router.tsx @@ -101,7 +101,6 @@ export const useDAOID = () => { export const DAORouter = (): JSX.Element => { const match = useRouteMatch() - const theme = useTheme() const { id: daoId } = useParams<{ id: string }>() return ( diff --git a/yarn.lock b/yarn.lock index 5b143111..ed578352 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1594,6 +1594,18 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@coinbase/wallet-sdk@4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-4.0.3.tgz#fd52dd4c168c35979c7b3294018a6f78d163a593" + integrity sha512-y/OGEjlvosikjfB+wk+4CVb9OxD1ob9cidEBLI5h8Hxaf/Qoob2XoVT1uvhtAzBx34KpGYSd+alKvh/GCRre4Q== + dependencies: + buffer "^6.0.3" + clsx "^1.2.1" + eventemitter3 "^5.0.1" + keccak "^3.0.3" + preact "^10.16.0" + sha.js "^2.4.11" + "@coinbase/wallet-sdk@4.0.4": version "4.0.4" resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-4.0.4.tgz#634cd89bac93eeaf381a1f026476794e53431ed6" @@ -4598,6 +4610,7 @@ mipd "0.0.7" zustand "4.4.1" +"@walletconnect/core@2.11.2", "@walletconnect/core@2.14.0", "@walletconnect/core@2.15.0": "@walletconnect/core@2.11.2", "@walletconnect/core@2.14.0", "@walletconnect/core@2.15.0": version "2.14.0" resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.14.0.tgz#e8afb01455968b02aaf26c74f3bfcc9b82678a39" @@ -4628,6 +4641,22 @@ dependencies: tslib "1.14.1" +"@walletconnect/ethereum-provider@2.14.0": + version "2.14.0" + resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-2.14.0.tgz#0ed4ba9b383c889b56e0af87181756d900fc504a" + integrity sha512-Cc2/DCn85VciA10BrsNWFM//3VC1D8yjwrjfUKjGndLPDz0YIdAxTgYZViIlMjE0lzQC/DMvPYEAnGfW0O1Bwg== + dependencies: + "@walletconnect/jsonrpc-http-connection" "1.0.8" + "@walletconnect/jsonrpc-provider" "1.0.14" + "@walletconnect/jsonrpc-types" "1.0.4" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/modal" "2.6.2" + "@walletconnect/sign-client" "2.14.0" + "@walletconnect/types" "2.14.0" + "@walletconnect/universal-provider" "2.14.0" + "@walletconnect/utils" "2.14.0" + events "3.3.0" + "@walletconnect/ethereum-provider@2.15.0": version "2.15.0" resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-2.15.0.tgz#df4aa157b69285712355ef2aea3f72d0eb585b4b" @@ -4781,13 +4810,6 @@ dependencies: "@walletconnect/jsonrpc-types" "^1.0.2" -"@walletconnect/relay-api@1.0.11": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@walletconnect/relay-api/-/relay-api-1.0.11.tgz#80ab7ef2e83c6c173be1a59756f95e515fb63224" - integrity sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q== - dependencies: - "@walletconnect/jsonrpc-types" "^1.0.2" - "@walletconnect/relay-auth@1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz#0b5c55c9aa3b0ef61f526ce679f3ff8a5c4c2c7c" @@ -4822,6 +4844,21 @@ "@walletconnect/utils" "2.11.2" events "^3.3.0" +"@walletconnect/sign-client@2.14.0": + version "2.14.0" + resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.14.0.tgz#36533ef0976a869d815624217527482c90937fc8" + integrity sha512-UrB3S3eLjPYfBLCN3WJ5u7+WcZ8kFMe/QIDqLf76Jk6TaLwkSUy563LvnSw4KW/kA+/cY1KBSdUDfX1tzYJJXg== + dependencies: + "@walletconnect/core" "2.14.0" + "@walletconnect/events" "1.0.1" + "@walletconnect/heartbeat" "1.2.2" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/logger" "2.1.2" + "@walletconnect/time" "1.0.2" + "@walletconnect/types" "2.14.0" + "@walletconnect/utils" "2.14.0" + events "3.3.0" + "@walletconnect/sign-client@2.15.0": version "2.15.0" resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.15.0.tgz#bad69a2850dac26d011ba54be86073455fc398c8" @@ -4856,6 +4893,21 @@ "@walletconnect/logger" "2.1.2" events "3.3.0" +"@walletconnect/universal-provider@2.14.0": + version "2.14.0" + resolved "https://registry.yarnpkg.com/@walletconnect/universal-provider/-/universal-provider-2.14.0.tgz#39d029be80374894b5f4249b76282dd9211d8b9f" + integrity sha512-Mr8uoTmD6H0+Hh+3gxBu4l3T2uP/nNPR02sVtwEujNum++F727mMk+ifPRIpkVo21V/bvXFEy8sHTs5hqyq5iA== + dependencies: + "@walletconnect/jsonrpc-http-connection" "1.0.8" + "@walletconnect/jsonrpc-provider" "1.0.14" + "@walletconnect/jsonrpc-types" "1.0.4" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/logger" "2.1.2" + "@walletconnect/sign-client" "2.14.0" + "@walletconnect/types" "2.14.0" + "@walletconnect/utils" "2.14.0" + events "3.3.0" + "@walletconnect/universal-provider@2.15.0": version "2.15.0" resolved "https://registry.yarnpkg.com/@walletconnect/universal-provider/-/universal-provider-2.15.0.tgz#e71ca2043f99f5acfb4da3d38de2b5ee4bd18e5b" @@ -4871,7 +4923,7 @@ "@walletconnect/utils" "2.15.0" events "3.3.0" -"@walletconnect/utils@2.11.2", "@walletconnect/utils@2.14.0", "@walletconnect/utils@2.15.0": +"@walletconnect/utils@2.11.2", "@walletconnect/utils@2.12.0", "@walletconnect/utils@2.14.0", "@walletconnect/utils@2.15.0": version "2.14.0" resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.14.0.tgz#48493ffe1e902815fda3cbd5cc5409288a066d35" integrity sha512-vRVomYQEtEAyCK2c5bzzEvtgxaGGITF8mWuIL+WYSAMyEJLY97mirP2urDucNwcUczwxUgI+no9RiNFbUHreQQ== @@ -4891,28 +4943,6 @@ query-string "7.1.3" uint8arrays "3.1.0" -"@walletconnect/utils@^2.14.0": - version "2.16.1" - resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.16.1.tgz#2099cc2bd16b0edc32022f64aa2c2c323b45d1d4" - integrity sha512-aoQirVoDoiiEtYeYDtNtQxFzwO/oCrz9zqeEEXYJaAwXlGVTS34KFe7W3/Rxd/pldTYKFOZsku2EzpISfH8Wsw== - dependencies: - "@stablelib/chacha20poly1305" "1.0.1" - "@stablelib/hkdf" "1.0.1" - "@stablelib/random" "1.0.2" - "@stablelib/sha256" "1.0.1" - "@stablelib/x25519" "1.0.3" - "@walletconnect/relay-api" "1.0.11" - "@walletconnect/relay-auth" "1.0.4" - "@walletconnect/safe-json" "1.0.2" - "@walletconnect/time" "1.0.2" - "@walletconnect/types" "2.16.1" - "@walletconnect/window-getters" "1.0.1" - "@walletconnect/window-metadata" "1.0.1" - detect-browser "5.3.0" - elliptic "^6.5.7" - query-string "7.1.3" - uint8arrays "3.1.0" - "@walletconnect/window-getters@1.0.1", "@walletconnect/window-getters@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.1.tgz#f36d1c72558a7f6b87ecc4451fc8bd44f63cbbdc" @@ -4928,6 +4958,131 @@ "@walletconnect/window-getters" "^1.0.1" tslib "1.14.1" +"@web3modal/common@5.0.11": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@web3modal/common/-/common-5.0.11.tgz#319cb471579f75807e1b7fb4d86a6c0e7e8f8cba" + integrity sha512-xI6FKrk4/TofM27e0R5F0e7OWMa0YECJshITgFVrX57ZPbgw0O8bTTgLa0yxYG3A5xMnuz6dOYjAAQV+EXrr9w== + dependencies: + bignumber.js "9.1.2" + dayjs "1.11.10" + +"@web3modal/core@5.0.11": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@web3modal/core/-/core-5.0.11.tgz#5503f8f05d54f3ca9a76144cdc08796de431d327" + integrity sha512-YX5msOOEmB0HYwdDt3sF8JCMyTfkzCV9tMWPMQqBdFT8p+9lPaW4JCmqYwJMI9AhUiPpZWc6ubFit62+OzBAQQ== + dependencies: + "@web3modal/common" "5.0.11" + "@web3modal/wallet" "5.0.11" + valtio "1.11.2" + +"@web3modal/polyfills@5.0.11": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@web3modal/polyfills/-/polyfills-5.0.11.tgz#137356994f2429979c1734d3ea40a04642da68a5" + integrity sha512-F2pC4egFTwlGyyK6PuW1lEJwdl1NK+9AfiO9aiR58RXzj4uFStPuO4wzOGONz+5Kv8lM1ZiooRD0pMcJmsyzLw== + dependencies: + buffer "6.0.3" + +"@web3modal/scaffold-react@5.0.11": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@web3modal/scaffold-react/-/scaffold-react-5.0.11.tgz#1eda11a22ec7b8d5ec698c4266f75683d730c332" + integrity sha512-zJJY9WsIUDnPvdJ91FpkUM8YORq4dsWF74hbMBGSwKzkHcJg1PmGWBz2+iKfkR6pr/0FRUYlxkqS4MzrEaGItQ== + dependencies: + "@web3modal/scaffold" "5.0.11" + +"@web3modal/scaffold-ui@5.0.11": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@web3modal/scaffold-ui/-/scaffold-ui-5.0.11.tgz#94f77c3b16e1a39676e8b265ecf5c9a3a6095c20" + integrity sha512-QHi980YGjFW335VVLQ9lQasH347xrdHomtvU1P1jXGg3wygDRs57rGRy6kK2yiLJomom02YGI+H1Tl8JvnAtZg== + dependencies: + "@web3modal/common" "5.0.11" + "@web3modal/core" "5.0.11" + "@web3modal/scaffold-utils" "5.0.11" + "@web3modal/siwe" "5.0.11" + "@web3modal/ui" "5.0.11" + "@web3modal/wallet" "5.0.11" + lit "3.1.0" + +"@web3modal/scaffold-utils@5.0.11": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@web3modal/scaffold-utils/-/scaffold-utils-5.0.11.tgz#ccf18a5cc40852ac698eba7d7c0c101617b8e018" + integrity sha512-3/fEndFBX9tNf/OpbE8zny9XRbGPlKojDlrkhz6ygcF2Dx0458ykpB342OtZPs3CjnPnZKRuo+H2y11KFo1IdQ== + dependencies: + "@coinbase/wallet-sdk" "4.0.3" + "@web3modal/core" "5.0.11" + "@web3modal/polyfills" "5.0.11" + "@web3modal/wallet" "5.0.11" + valtio "1.11.2" + +"@web3modal/scaffold-vue@5.0.11": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@web3modal/scaffold-vue/-/scaffold-vue-5.0.11.tgz#ebb9ee3755e356d8d69d71595839928789c0c643" + integrity sha512-GvdWVMAis1nvjErrsxsd4DvGyZ/+V1DoeoCBLgXqImYg2JfIYuH80xUiOJNKWq1wrs+/J9pNsc+r4BDSNtI+HQ== + dependencies: + "@web3modal/core" "5.0.11" + "@web3modal/scaffold" "5.0.11" + +"@web3modal/scaffold@5.0.11": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@web3modal/scaffold/-/scaffold-5.0.11.tgz#11784d827db3be643936a02ad82d85bbd43294fd" + integrity sha512-QoKI1srTvUVem9zUGJ//d0rq7xxQhyulC9CeaSusa6roljS6VP65aqPvhEvtudK5LWbqpLoK6WtLrIdVVj3DFg== + dependencies: + "@web3modal/common" "5.0.11" + "@web3modal/core" "5.0.11" + "@web3modal/scaffold-ui" "5.0.11" + "@web3modal/scaffold-utils" "5.0.11" + "@web3modal/siwe" "5.0.11" + "@web3modal/ui" "5.0.11" + "@web3modal/wallet" "5.0.11" + lit "3.1.0" + +"@web3modal/siwe@5.0.11": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@web3modal/siwe/-/siwe-5.0.11.tgz#4d0daf72e1bc3b21f26729a2d59a698b76014d00" + integrity sha512-dQZFxhoyphINz2H6Y/t8/zalErulV46NGk+U2z7Hq6H5c8XKBC4dCIDFem62+kDk07QKgg3lG+sUlf4ZU4YgRA== + dependencies: + "@walletconnect/utils" "2.12.0" + "@web3modal/common" "5.0.11" + "@web3modal/core" "5.0.11" + "@web3modal/scaffold-utils" "5.0.11" + "@web3modal/ui" "5.0.11" + "@web3modal/wallet" "5.0.11" + lit "3.1.0" + valtio "1.11.2" + +"@web3modal/ui@5.0.11": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@web3modal/ui/-/ui-5.0.11.tgz#a692ce5f983a0a7108de6354947d40d766b46c15" + integrity sha512-Tm5SU7GGymvTgqRBCqMYl/I6Kou8hOLdYVhQIfghFEGd/TH0kTdAdjH30a65n/sxTmW3LC/CoflC6FCGP0TOcA== + dependencies: + lit "3.1.0" + qrcode "1.5.3" + +"@web3modal/wagmi@5.0.11": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@web3modal/wagmi/-/wagmi-5.0.11.tgz#eb5d5e2fab33cc29fbc3fa9bb5cf36cc9ae71424" + integrity sha512-8/2tS4bcdjsqk6hxpiclsVz2/Te6a0mZ1uLqZ+GvD6+4i1+yc34f9ZRtfvf2+mpG+bRdHhSB5a5TIzRgtCzsYw== + dependencies: + "@walletconnect/ethereum-provider" "2.14.0" + "@walletconnect/utils" "2.14.0" + "@web3modal/common" "5.0.11" + "@web3modal/polyfills" "5.0.11" + "@web3modal/scaffold" "5.0.11" + "@web3modal/scaffold-react" "5.0.11" + "@web3modal/scaffold-utils" "5.0.11" + "@web3modal/scaffold-vue" "5.0.11" + "@web3modal/siwe" "5.0.11" + "@web3modal/wallet" "5.0.11" + +"@web3modal/wallet@5.0.11": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@web3modal/wallet/-/wallet-5.0.11.tgz#d05fdf58f4c3b5f9ff9b16a7ba3798571be61ab0" + integrity sha512-8lsDCfsJS23UXllVyg9uB/RIWi+2k/g3hc4QN8Z9HGVhJREjk/cNc7e+mWWI077PDsplXAjnw3sK864O12v7Xg== + dependencies: + "@walletconnect/logger" "2.1.2" + "@web3modal/common" "5.0.11" + "@web3modal/polyfills" "5.0.11" + zod "3.22.4" + "@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": version "1.12.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" @@ -7566,19 +7721,6 @@ elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -elliptic@^6.5.7: - version "6.5.7" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.7.tgz#8ec4da2cb2939926a1b9a73619d768207e647c8b" - integrity sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - emittery@^0.10.2: version "0.10.2" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" From c43c1a360690a95d7ffbd653483260d15a09ddfd Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Mon, 25 Nov 2024 23:01:31 +0530 Subject: [PATCH 18/36] Added dAO definition within the file --- src/assets/abis/hb_dao.json | 2259 +++++++++++++++++ .../contracts/baseDAO/hooks/useOriginate.ts | 11 +- 2 files changed, 2269 insertions(+), 1 deletion(-) create mode 100644 src/assets/abis/hb_dao.json diff --git a/src/assets/abis/hb_dao.json b/src/assets/abis/hb_dao.json new file mode 100644 index 00000000..ff8db245 --- /dev/null +++ b/src/assets/abis/hb_dao.json @@ -0,0 +1,2259 @@ +{ + "compiler": { + "version": "0.8.24+commit.e11b9ed9" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVotes", + "name": "_token", + "type": "address" + }, + { + "internalType": "contract TimelockController", + "name": "_timelock", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint48", + "name": "minsDelay", + "type": "uint48" + }, + { + "internalType": "uint32", + "name": "minsVoting", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "pThreshold", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "qvrm", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "CheckpointUnorderedInsertion", + "type": "error" + }, + { + "inputs": [], + "name": "FailedInnerCall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "voter", + "type": "address" + } + ], + "name": "GovernorAlreadyCastVote", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "GovernorAlreadyQueuedProposal", + "type": "error" + }, + { + "inputs": [], + "name": "GovernorDisabledDeposit", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "proposer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "votes", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ], + "name": "GovernorInsufficientProposerVotes", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "targets", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "calldatas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "values", + "type": "uint256" + } + ], + "name": "GovernorInvalidProposalLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "quorumNumerator", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "quorumDenominator", + "type": "uint256" + } + ], + "name": "GovernorInvalidQuorumFraction", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "voter", + "type": "address" + } + ], + "name": "GovernorInvalidSignature", + "type": "error" + }, + { + "inputs": [], + "name": "GovernorInvalidVoteType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "votingPeriod", + "type": "uint256" + } + ], + "name": "GovernorInvalidVotingPeriod", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "GovernorNonexistentProposal", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "GovernorNotQueuedProposal", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "GovernorOnlyExecutor", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "GovernorOnlyProposer", + "type": "error" + }, + { + "inputs": [], + "name": "GovernorQueueNotImplemented", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "proposer", + "type": "address" + } + ], + "name": "GovernorRestrictedProposer", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "enum IGovernor.ProposalState", + "name": "current", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "expectedStates", + "type": "bytes32" + } + ], + "name": "GovernorUnexpectedProposalState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "currentNonce", + "type": "uint256" + } + ], + "name": "InvalidAccountNonce", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidShortString", + "type": "error" + }, + { + "inputs": [], + "name": "QueueEmpty", + "type": "error" + }, + { + "inputs": [], + "name": "QueueFull", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "bits", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "SafeCastOverflowedUintDowncast", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "str", + "type": "string" + } + ], + "name": "StringTooLong", + "type": "error" + }, + { + "anonymous": false, + "inputs": [], + "name": "EIP712DomainChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "ProposalCanceled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "proposer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "string[]", + "name": "signatures", + "type": "string[]" + }, + { + "indexed": false, + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "voteStart", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "voteEnd", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "description", + "type": "string" + } + ], + "name": "ProposalCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "ProposalExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "etaSeconds", + "type": "uint256" + } + ], + "name": "ProposalQueued", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldProposalThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newProposalThreshold", + "type": "uint256" + } + ], + "name": "ProposalThresholdSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldQuorumNumerator", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newQuorumNumerator", + "type": "uint256" + } + ], + "name": "QuorumNumeratorUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "oldTimelock", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newTimelock", + "type": "address" + } + ], + "name": "TimelockChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "voter", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "VoteCast", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "voter", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "reason", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "params", + "type": "bytes" + } + ], + "name": "VoteCastWithParams", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldVotingDelay", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newVotingDelay", + "type": "uint256" + } + ], + "name": "VotingDelaySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldVotingPeriod", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newVotingPeriod", + "type": "uint256" + } + ], + "name": "VotingPeriodSet", + "type": "event" + }, + { + "inputs": [], + "name": "BALLOT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "CLOCK_MODE", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "COUNTING_MODE", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "EXTENDED_BALLOT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "descriptionHash", + "type": "bytes32" + } + ], + "name": "cancel", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + } + ], + "name": "castVote", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "address", + "name": "voter", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "castVoteBySig", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "castVoteWithReason", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + }, + { + "internalType": "bytes", + "name": "params", + "type": "bytes" + } + ], + "name": "castVoteWithReasonAndParams", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "address", + "name": "voter", + "type": "address" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + }, + { + "internalType": "bytes", + "name": "params", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "castVoteWithReasonAndParamsBySig", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "clock", + "outputs": [ + { + "internalType": "uint48", + "name": "", + "type": "uint48" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "descriptionHash", + "type": "bytes32" + } + ], + "name": "execute", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "timepoint", + "type": "uint256" + } + ], + "name": "getVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "timepoint", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "params", + "type": "bytes" + } + ], + "name": "getVotesWithParams", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasVoted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "descriptionHash", + "type": "bytes32" + } + ], + "name": "hashProposal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155BatchReceived", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalDeadline", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalEta", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalNeedsQueuing", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalProposer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalSnapshot", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proposalThreshold", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "againstVotes", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "forVotes", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "abstainVotes", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + } + ], + "name": "propose", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "descriptionHash", + "type": "bytes32" + } + ], + "name": "queue", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "quorum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "quorumDenominator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "timepoint", + "type": "uint256" + } + ], + "name": "quorumNumerator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "quorumNumerator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "relay", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newProposalThreshold", + "type": "uint256" + } + ], + "name": "setProposalThreshold", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint48", + "name": "newVotingDelay", + "type": "uint48" + } + ], + "name": "setVotingDelay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "newVotingPeriod", + "type": "uint32" + } + ], + "name": "setVotingPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "state", + "outputs": [ + { + "internalType": "enum IGovernor.ProposalState", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "timelock", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "token", + "outputs": [ + { + "internalType": "contract IERC5805", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newQuorumNumerator", + "type": "uint256" + } + ], + "name": "updateQuorumNumerator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract TimelockController", + "name": "newTimelock", + "type": "address" + } + ], + "name": "updateTimelock", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "votingDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "votingPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "devdoc": { + "errors": { + "CheckpointUnorderedInsertion()": [ + { + "details": "A value was attempted to be inserted on a past checkpoint." + } + ], + "FailedInnerCall()": [ + { + "details": "A call to an address target failed. The target may have reverted." + } + ], + "GovernorAlreadyCastVote(address)": [ + { + "details": "The vote was already cast." + } + ], + "GovernorAlreadyQueuedProposal(uint256)": [ + { + "details": "The proposal has already been queued." + } + ], + "GovernorDisabledDeposit()": [ + { + "details": "Token deposits are disabled in this contract." + } + ], + "GovernorInsufficientProposerVotes(address,uint256,uint256)": [ + { + "details": "The `proposer` does not have the required votes to create a proposal." + } + ], + "GovernorInvalidProposalLength(uint256,uint256,uint256)": [ + { + "details": "Empty proposal or a mismatch between the parameters length for a proposal call." + } + ], + "GovernorInvalidQuorumFraction(uint256,uint256)": [ + { + "details": "The quorum set is not a valid fraction." + } + ], + "GovernorInvalidSignature(address)": [ + { + "details": "The provided signature is not valid for the expected `voter`. If the `voter` is a contract, the signature is not valid using {IERC1271-isValidSignature}." + } + ], + "GovernorInvalidVoteType()": [ + { + "details": "The vote type used is not valid for the corresponding counting module." + } + ], + "GovernorInvalidVotingPeriod(uint256)": [ + { + "details": "The voting period set is not a valid period." + } + ], + "GovernorNonexistentProposal(uint256)": [ + { + "details": "The `proposalId` doesn't exist." + } + ], + "GovernorNotQueuedProposal(uint256)": [ + { + "details": "The proposal hasn't been queued yet." + } + ], + "GovernorOnlyExecutor(address)": [ + { + "details": "The `account` is not the governance executor." + } + ], + "GovernorOnlyProposer(address)": [ + { + "details": "The `account` is not a proposer." + } + ], + "GovernorQueueNotImplemented()": [ + { + "details": "Queue operation is not implemented for this governor. Execute should be called directly." + } + ], + "GovernorRestrictedProposer(address)": [ + { + "details": "The `proposer` is not allowed to create a proposal." + } + ], + "GovernorUnexpectedProposalState(uint256,uint8,bytes32)": [ + { + "details": "The current state of a proposal is not the required for performing an operation. The `expectedStates` is a bitmap with the bits enabled for each ProposalState enum position counting from right to left. NOTE: If `expectedState` is `bytes32(0)`, the proposal is expected to not be in any state (i.e. not exist). This is the case when a proposal that is expected to be unset is already initiated (the proposal is duplicated). See {Governor-_encodeStateBitmap}." + } + ], + "InvalidAccountNonce(address,uint256)": [ + { + "details": "The nonce used for an `account` is not the expected current nonce." + } + ], + "QueueEmpty()": [ + { + "details": "An operation (e.g. {front}) couldn't be completed due to the queue being empty." + } + ], + "QueueFull()": [ + { + "details": "A push operation couldn't be completed due to the queue being full." + } + ], + "SafeCastOverflowedUintDowncast(uint8,uint256)": [ + { + "details": "Value doesn't fit in an uint of `bits` size." + } + ] + }, + "events": { + "EIP712DomainChanged()": { + "details": "MAY be emitted to signal that the domain could have changed." + }, + "ProposalCanceled(uint256)": { + "details": "Emitted when a proposal is canceled." + }, + "ProposalCreated(uint256,address,address[],uint256[],string[],bytes[],uint256,uint256,string)": { + "details": "Emitted when a proposal is created." + }, + "ProposalExecuted(uint256)": { + "details": "Emitted when a proposal is executed." + }, + "ProposalQueued(uint256,uint256)": { + "details": "Emitted when a proposal is queued." + }, + "TimelockChange(address,address)": { + "details": "Emitted when the timelock controller used for proposal execution is modified." + }, + "VoteCast(address,uint256,uint8,uint256,string)": { + "details": "Emitted when a vote is cast without params. Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used." + }, + "VoteCastWithParams(address,uint256,uint8,uint256,string,bytes)": { + "details": "Emitted when a vote is cast with params. Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used. `params` are additional encoded parameters. Their interpepretation also depends on the voting module used." + } + }, + "kind": "dev", + "methods": { + "CLOCK_MODE()": { + "details": "Machine-readable description of the clock as specified in EIP-6372." + }, + "COUNTING_MODE()": { + "details": "See {IGovernor-COUNTING_MODE}." + }, + "cancel(address[],uint256[],bytes[],bytes32)": { + "details": "See {IGovernor-cancel}." + }, + "castVote(uint256,uint8)": { + "details": "See {IGovernor-castVote}." + }, + "castVoteBySig(uint256,uint8,address,bytes)": { + "details": "See {IGovernor-castVoteBySig}." + }, + "castVoteWithReason(uint256,uint8,string)": { + "details": "See {IGovernor-castVoteWithReason}." + }, + "castVoteWithReasonAndParams(uint256,uint8,string,bytes)": { + "details": "See {IGovernor-castVoteWithReasonAndParams}." + }, + "castVoteWithReasonAndParamsBySig(uint256,uint8,address,string,bytes,bytes)": { + "details": "See {IGovernor-castVoteWithReasonAndParamsBySig}." + }, + "clock()": { + "details": "Clock (as specified in EIP-6372) is set to match the token's clock. Fallback to block numbers if the token does not implement EIP-6372." + }, + "eip712Domain()": { + "details": "See {IERC-5267}." + }, + "execute(address[],uint256[],bytes[],bytes32)": { + "details": "See {IGovernor-execute}." + }, + "getVotes(address,uint256)": { + "details": "See {IGovernor-getVotes}." + }, + "getVotesWithParams(address,uint256,bytes)": { + "details": "See {IGovernor-getVotesWithParams}." + }, + "hasVoted(uint256,address)": { + "details": "See {IGovernor-hasVoted}." + }, + "hashProposal(address[],uint256[],bytes[],bytes32)": { + "details": "See {IGovernor-hashProposal}. The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in advance, before the proposal is submitted. Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the same proposal (with same operation and same description) will have the same id if submitted on multiple governors across multiple networks. This also means that in order to execute the same operation twice (on the same governor) the proposer will have to change the description in order to avoid proposal id conflicts." + }, + "name()": { + "details": "See {IGovernor-name}." + }, + "nonces(address)": { + "details": "Returns the next unused nonce for an address." + }, + "onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)": { + "details": "See {IERC1155Receiver-onERC1155BatchReceived}. Receiving tokens is disabled if the governance executor is other than the governor itself (eg. when using with a timelock)." + }, + "onERC1155Received(address,address,uint256,uint256,bytes)": { + "details": "See {IERC1155Receiver-onERC1155Received}. Receiving tokens is disabled if the governance executor is other than the governor itself (eg. when using with a timelock)." + }, + "onERC721Received(address,address,uint256,bytes)": { + "details": "See {IERC721Receiver-onERC721Received}. Receiving tokens is disabled if the governance executor is other than the governor itself (eg. when using with a timelock)." + }, + "proposalDeadline(uint256)": { + "details": "See {IGovernor-proposalDeadline}." + }, + "proposalEta(uint256)": { + "details": "See {IGovernor-proposalEta}." + }, + "proposalProposer(uint256)": { + "details": "See {IGovernor-proposalProposer}." + }, + "proposalSnapshot(uint256)": { + "details": "See {IGovernor-proposalSnapshot}." + }, + "proposalVotes(uint256)": { + "details": "Accessor to the internal vote counts." + }, + "propose(address[],uint256[],bytes[],string)": { + "details": "See {IGovernor-propose}. This function has opt-in frontrunning protection, described in {_isValidDescriptionForProposer}." + }, + "queue(address[],uint256[],bytes[],bytes32)": { + "details": "See {IGovernor-queue}." + }, + "quorumDenominator()": { + "details": "Returns the quorum denominator. Defaults to 100, but may be overridden." + }, + "quorumNumerator()": { + "details": "Returns the current quorum numerator. See {quorumDenominator}." + }, + "quorumNumerator(uint256)": { + "details": "Returns the quorum numerator at a specific timepoint. See {quorumDenominator}." + }, + "relay(address,uint256,bytes)": { + "details": "Relays a transaction or function call to an arbitrary target. In cases where the governance executor is some contract other than the governor itself, like when using a timelock, this function can be invoked in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. Note that if the executor is simply the governor itself, use of `relay` is redundant." + }, + "setProposalThreshold(uint256)": { + "details": "Update the proposal threshold. This operation can only be performed through a governance proposal. Emits a {ProposalThresholdSet} event." + }, + "setVotingDelay(uint48)": { + "details": "Update the voting delay. This operation can only be performed through a governance proposal. Emits a {VotingDelaySet} event." + }, + "setVotingPeriod(uint32)": { + "details": "Update the voting period. This operation can only be performed through a governance proposal. Emits a {VotingPeriodSet} event." + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + }, + "timelock()": { + "details": "Public accessor to check the address of the timelock" + }, + "token()": { + "details": "The token that voting power is sourced from." + }, + "updateQuorumNumerator(uint256)": { + "details": "Changes the quorum numerator. Emits a {QuorumNumeratorUpdated} event. Requirements: - Must be called through a governance proposal. - New numerator must be smaller or equal to the denominator." + }, + "updateTimelock(address)": { + "details": "Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates must be proposed, scheduled, and executed through governance proposals. CAUTION: It is not recommended to change the timelock while there are other queued governance proposals." + }, + "version()": { + "details": "See {IGovernor-version}." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "bytecode": "610180604052348015610010575f80fd5b506040516183f43803806183f483398181016040528101906100329190610e8f565b858160ff1688603c876100459190610f75565b603c876100529190610fb1565b868a806100636101af60201b60201c565b6100765f836101ec60201b90919060201c565b61012081815250506100926001826101ec60201b90919060201c565b6101408181525050818051906020012060e08181525050808051906020012061010081815250504660a081815250506100cf61023960201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250505050806003908161011b91906111f1565b505061012c8361029360201b60201c565b61013b8261030660201b60201c565b61014a816103bf60201b60201c565b5050508073ffffffffffffffffffffffffffffffffffffffff166101608173ffffffffffffffffffffffffffffffffffffffff1681525050506101928161040460201b60201c565b506101a2816104de60201b60201c565b50505050505050506116ae565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b5f60208351101561020d576102068361057b60201b60201c565b9050610233565b8261021d836105e060201b60201c565b5f01908161022b91906111f1565b5060ff5f1b90505b92915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60e0516101005146306040516020016102789594939291906112f6565b60405160208183030381529060405280519060200120905090565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360085f9054906101000a900465ffffffffffff16826040516102d7929190611377565b60405180910390a18060085f6101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b5f8163ffffffff1603610350575f6040517ff1cfbf0500000000000000000000000000000000000000000000000000000000815260040161034791906113d7565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828600860069054906101000a900463ffffffff1682604051610393929190611420565b60405180910390a180600860066101000a81548163ffffffff021916908363ffffffff16021790555050565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461600754826040516103f2929190611447565b60405180910390a18060078190555050565b5f6104136105e960201b60201c565b90508082111561045c5781816040517f243e5445000000000000000000000000000000000000000000000000000000008152600401610453929190611447565b60405180910390fd5b5f61046b6105f160201b60201c565b905061049e61047e61062360201b60201c565b61048d856106ba60201b60201c565b600a61072760201b9092919060201c565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781846040516104d1929190611447565b60405180910390a1505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260405161053092919061146e565b60405180910390a180600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f80829050601f815111156105c757826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016105be91906114dd565b60405180910390fd5b8051816105d39061152a565b5f1c175f1b915050919050565b5f819050919050565b5f6064905090565b5f610602600a61074860201b60201c565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff16905090565b5f6106326107b060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166391ddadf46040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561069957506040513d601f19601f820116820180604052508101906106969190611590565b60015b6106b2576106ab6107ba60201b60201c565b90506106b7565b809150505b90565b5f79ffffffffffffffffffffffffffffffffffffffffffffffffffff801682111561071f5760d0826040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526004016107169291906115f4565b60405180910390fd5b819050919050565b5f8061073c855f0185856107cf60201b60201c565b91509150935093915050565b5f80825f018054905090505f81146107a657610778835f0160018361076d919061161b565b610b4360201b60201c565b5f0160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff166107a8565b5f5b915050919050565b5f61016051905090565b5f6107ca43610b5560201b60201c565b905090565b5f805f858054905090505f811115610a5b575f6107fe876001846107f3919061161b565b610b4360201b60201c565b6040518060400160405290815f82015f9054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020015f820160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff168152505090508565ffffffffffff16815f015165ffffffffffff1611156108e9576040517f2520601d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8565ffffffffffff16815f015165ffffffffffff1603610971578461092088600185610915919061161b565b610b4360201b60201c565b5f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550610a4a565b8660405180604001604052808865ffffffffffff1681526020018779ffffffffffffffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a81548165ffffffffffff021916908365ffffffffffff1602179055506020820151815f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b806020015185935093505050610b3b565b8560405180604001604052808765ffffffffffff1681526020018679ffffffffffffffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a81548165ffffffffffff021916908365ffffffffffff1602179055506020820151815f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505f8492509250505b935093915050565b5f825f528160205f2001905092915050565b5f65ffffffffffff8016821115610ba6576030826040517f6dfcc650000000000000000000000000000000000000000000000000000000008152600401610b9d929190611687565b60405180910390fd5b819050919050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610be882610bbf565b9050919050565b5f610bf982610bde565b9050919050565b610c0981610bef565b8114610c13575f80fd5b50565b5f81519050610c2481610c00565b92915050565b5f610c3482610bbf565b9050919050565b5f610c4582610c2a565b9050919050565b610c5581610c3b565b8114610c5f575f80fd5b50565b5f81519050610c7081610c4c565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610cc482610c7e565b810181811067ffffffffffffffff82111715610ce357610ce2610c8e565b5b80604052505050565b5f610cf5610bae565b9050610d018282610cbb565b919050565b5f67ffffffffffffffff821115610d2057610d1f610c8e565b5b610d2982610c7e565b9050602081019050919050565b8281835e5f83830152505050565b5f610d56610d5184610d06565b610cec565b905082815260208101848484011115610d7257610d71610c7a565b5b610d7d848285610d36565b509392505050565b5f82601f830112610d9957610d98610c76565b5b8151610da9848260208601610d44565b91505092915050565b5f65ffffffffffff82169050919050565b610dcc81610db2565b8114610dd6575f80fd5b50565b5f81519050610de781610dc3565b92915050565b5f63ffffffff82169050919050565b610e0581610ded565b8114610e0f575f80fd5b50565b5f81519050610e2081610dfc565b92915050565b5f819050919050565b610e3881610e26565b8114610e42575f80fd5b50565b5f81519050610e5381610e2f565b92915050565b5f60ff82169050919050565b610e6e81610e59565b8114610e78575f80fd5b50565b5f81519050610e8981610e65565b92915050565b5f805f805f805f60e0888a031215610eaa57610ea9610bb7565b5b5f610eb78a828b01610c16565b9750506020610ec88a828b01610c62565b965050604088015167ffffffffffffffff811115610ee957610ee8610bbb565b5b610ef58a828b01610d85565b9550506060610f068a828b01610dd9565b9450506080610f178a828b01610e12565b93505060a0610f288a828b01610e45565b92505060c0610f398a828b01610e7b565b91505092959891949750929550565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610f7f82610db2565b9150610f8a83610db2565b9250828202610f9881610db2565b9150808214610faa57610fa9610f48565b5b5092915050565b5f610fbb82610ded565b9150610fc683610ded565b9250828202610fd481610ded565b9150808214610fe657610fe5610f48565b5b5092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061103b57607f821691505b60208210810361104e5761104d610ff7565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026110b07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611075565b6110ba8683611075565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6110f56110f06110eb84610e26565b6110d2565b610e26565b9050919050565b5f819050919050565b61110e836110db565b61112261111a826110fc565b848454611081565b825550505050565b5f90565b61113661112a565b611141818484611105565b505050565b5b81811015611164576111595f8261112e565b600181019050611147565b5050565b601f8211156111a95761117a81611054565b61118384611066565b81016020851015611192578190505b6111a661119e85611066565b830182611146565b50505b505050565b5f82821c905092915050565b5f6111c95f19846008026111ae565b1980831691505092915050565b5f6111e183836111ba565b9150826002028217905092915050565b6111fa82610fed565b67ffffffffffffffff81111561121357611212610c8e565b5b61121d8254611024565b611228828285611168565b5f60209050601f831160018114611259575f8415611247578287015190505b61125185826111d6565b8655506112b8565b601f19841661126786611054565b5f5b8281101561128e57848901518255600182019150602085019450602081019050611269565b868310156112ab57848901516112a7601f8916826111ba565b8355505b6001600288020188555050505b505050505050565b5f819050919050565b6112d2816112c0565b82525050565b6112e181610e26565b82525050565b6112f081610bde565b82525050565b5f60a0820190506113095f8301886112c9565b61131660208301876112c9565b61132360408301866112c9565b61133060608301856112d8565b61133d60808301846112e7565b9695505050505050565b5f61136161135c61135784610db2565b6110d2565b610e26565b9050919050565b61137181611347565b82525050565b5f60408201905061138a5f830185611368565b6113976020830184611368565b9392505050565b5f819050919050565b5f6113c16113bc6113b78461139e565b6110d2565b610e26565b9050919050565b6113d1816113a7565b82525050565b5f6020820190506113ea5f8301846113c8565b92915050565b5f61140a61140561140084610ded565b6110d2565b610e26565b9050919050565b61141a816113f0565b82525050565b5f6040820190506114335f830185611411565b6114406020830184611411565b9392505050565b5f60408201905061145a5f8301856112d8565b61146760208301846112d8565b9392505050565b5f6040820190506114815f8301856112e7565b61148e60208301846112e7565b9392505050565b5f82825260208201905092915050565b5f6114af82610fed565b6114b98185611495565b93506114c9818560208601610d36565b6114d281610c7e565b840191505092915050565b5f6020820190508181035f8301526114f581846114a5565b905092915050565b5f81519050919050565b5f819050602082019050919050565b5f61152182516112c0565b80915050919050565b5f611534826114fd565b8261153e84611507565b905061154981611516565b92506020821015611589576115847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802611075565b831692505b5050919050565b5f602082840312156115a5576115a4610bb7565b5b5f6115b284828501610dd9565b91505092915050565b5f819050919050565b5f6115de6115d96115d4846115bb565b6110d2565b610e59565b9050919050565b6115ee816115c4565b82525050565b5f6040820190506116075f8301856115e5565b61161460208301846112d8565b9392505050565b5f61162582610e26565b915061163083610e26565b925082820390508181111561164857611647610f48565b5b92915050565b5f819050919050565b5f61167161166c6116678461164e565b6110d2565b610e59565b9050919050565b61168181611657565b82525050565b5f60408201905061169a5f830185611678565b6116a760208301846112d8565b9392505050565b60805160a05160c05160e05161010051610120516101405161016051616ceb6117095f395f611edc01525f612df701525f612dbc01525f61455601525f61453501525f61388d01525f6138e301525f61390c0152616ceb5ff3fe608060405260043610610296575f3560e01c80637ecebe0011610159578063c01f9e37116100c0578063e540d01d11610079578063e540d01d14610b89578063eb9019d414610bb1578063ece40cc114610bed578063f23a6e6114610c15578063f8ce560a14610c51578063fc0c546a14610c8d57610309565b8063c01f9e3714610a77578063c28bc2fa14610ab3578063c59057e414610acf578063d33219b414610b0b578063dd4e2ba514610b35578063deaaa7cc14610b5f57610309565b8063a7713a7011610112578063a7713a7014610947578063a890c91014610971578063a9a9529414610999578063ab58fb8e146109d5578063b58131b014610a11578063bc197c8114610a3b57610309565b80637ecebe001461080f57806384b0196e1461084b5780638ff262e31461087b57806391ddadf4146108b757806397c3d334146108e15780639a802a6d1461090b57610309565b806343859632116101fd5780635b8d0e0d116101b65780635b8d0e0d146106bb5780635f398a14146106f757806360c4247f14610733578063790518871461076f5780637b3c71d3146107975780637d5e81e2146107d357610309565b80634385963214610575578063452115d6146105b15780634bf5d7e9146105ed578063544ffc9c1461061757806354fd4d5014610655578063567813881461067f57610309565b8063160cbed71161024f578063160cbed71461043d5780632656227d146104795780632d63f693146104a95780632fe3e261146104e55780633932abb11461050f5780633e4f49e61461053957610309565b806301ffc9a71461030d57806302a251a31461034957806306f3f9e61461037357806306fdde031461039b578063143489d0146103c5578063150b7a021461040157610309565b36610309573073ffffffffffffffffffffffffffffffffffffffff166102ba610cb7565b73ffffffffffffffffffffffffffffffffffffffff1614610307576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b5f80fd5b348015610318575f80fd5b50610333600480360381019061032e91906148c7565b610cc5565b604051610340919061490c565b60405180910390f35b348015610354575f80fd5b5061035d610da6565b60405161036a919061493d565b60405180910390f35b34801561037e575f80fd5b5061039960048036038101906103949190614980565b610db4565b005b3480156103a6575f80fd5b506103af610dc8565b6040516103bc9190614a1b565b60405180910390f35b3480156103d0575f80fd5b506103eb60048036038101906103e69190614980565b610e58565b6040516103f89190614a7a565b60405180910390f35b34801561040c575f80fd5b5061042760048036038101906104229190614be9565b610e93565b6040516104349190614c78565b60405180910390f35b348015610448575f80fd5b50610463600480360381019061045e9190614f26565b610f12565b604051610470919061493d565b60405180910390f35b610493600480360381019061048e9190614f26565b611008565b6040516104a0919061493d565b60405180910390f35b3480156104b4575f80fd5b506104cf60048036038101906104ca9190614980565b6111e2565b6040516104dc919061493d565b60405180910390f35b3480156104f0575f80fd5b506104f9611218565b6040516105069190614fed565b60405180910390f35b34801561051a575f80fd5b5061052361123c565b604051610530919061493d565b60405180910390f35b348015610544575f80fd5b5061055f600480360381019061055a9190614980565b61124a565b60405161056c9190615079565b60405180910390f35b348015610580575f80fd5b5061059b60048036038101906105969190615092565b61125b565b6040516105a8919061490c565b60405180910390f35b3480156105bc575f80fd5b506105d760048036038101906105d29190614f26565b6112c0565b6040516105e4919061493d565b60405180910390f35b3480156105f8575f80fd5b50610601611380565b60405161060e9190614a1b565b60405180910390f35b348015610622575f80fd5b5061063d60048036038101906106389190614980565b61143d565b60405161064c939291906150d0565b60405180910390f35b348015610660575f80fd5b50610669611470565b6040516106769190614a1b565b60405180910390f35b34801561068a575f80fd5b506106a560048036038101906106a0919061513b565b6114ad565b6040516106b2919061493d565b60405180910390f35b3480156106c6575f80fd5b506106e160048036038101906106dc91906151d2565b6114dc565b6040516106ee919061493d565b60405180910390f35b348015610702575f80fd5b5061071d600480360381019061071891906152b4565b61160b565b60405161072a919061493d565b60405180910390f35b34801561073e575f80fd5b5061075960048036038101906107549190614980565b611673565b604051610766919061493d565b60405180910390f35b34801561077a575f80fd5b506107956004803603810190610790919061538f565b61176c565b005b3480156107a2575f80fd5b506107bd60048036038101906107b891906153ba565b611780565b6040516107ca919061493d565b60405180910390f35b3480156107de575f80fd5b506107f960048036038101906107f491906154c9565b6117e6565b604051610806919061493d565b60405180910390f35b34801561081a575f80fd5b506108356004803603810190610830919061559d565b6118d3565b604051610842919061493d565b60405180910390f35b348015610856575f80fd5b5061085f611919565b60405161087297969594939291906156b9565b60405180910390f35b348015610886575f80fd5b506108a1600480360381019061089c919061573b565b6119be565b6040516108ae919061493d565b60405180910390f35b3480156108c2575f80fd5b506108cb611a92565b6040516108d891906157ca565b60405180910390f35b3480156108ec575f80fd5b506108f5611b1d565b604051610902919061493d565b60405180910390f35b348015610916575f80fd5b50610931600480360381019061092c91906157e3565b611b25565b60405161093e919061493d565b60405180910390f35b348015610952575f80fd5b5061095b611b3a565b604051610968919061493d565b60405180910390f35b34801561097c575f80fd5b506109976004803603810190610992919061589b565b611b66565b005b3480156109a4575f80fd5b506109bf60048036038101906109ba9190614980565b611b7a565b6040516109cc919061490c565b60405180910390f35b3480156109e0575f80fd5b506109fb60048036038101906109f69190614980565b611b8b565b604051610a08919061493d565b60405180910390f35b348015610a1c575f80fd5b50610a25611bc1565b604051610a32919061493d565b60405180910390f35b348015610a46575f80fd5b50610a616004803603810190610a5c91906158c6565b611bcf565b604051610a6e9190614c78565b60405180910390f35b348015610a82575f80fd5b50610a9d6004803603810190610a989190614980565b611c4f565b604051610aaa919061493d565b60405180910390f35b610acd6004803603810190610ac891906159e6565b611cb9565b005b348015610ada575f80fd5b50610af56004803603810190610af09190614f26565b611d42565b604051610b02919061493d565b60405180910390f35b348015610b16575f80fd5b50610b1f611d7c565b604051610b2c9190614a7a565b60405180910390f35b348015610b40575f80fd5b50610b49611da4565b604051610b569190614a1b565b60405180910390f35b348015610b6a575f80fd5b50610b73611de1565b604051610b809190614fed565b60405180910390f35b348015610b94575f80fd5b50610baf6004803603810190610baa9190615a90565b611e05565b005b348015610bbc575f80fd5b50610bd76004803603810190610bd29190615abb565b611e19565b604051610be4919061493d565b60405180910390f35b348015610bf8575f80fd5b50610c136004803603810190610c0e9190614980565b611e34565b005b348015610c20575f80fd5b50610c3b6004803603810190610c369190615af9565b611e48565b604051610c489190614c78565b60405180910390f35b348015610c5c575f80fd5b50610c776004803603810190610c729190614980565b611ec8565b604051610c84919061493d565b60405180910390f35b348015610c98575f80fd5b50610ca1611ed9565b604051610cae9190615be7565b60405180910390f35b5f610cc0611f00565b905090565b5f7f65455a86000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d8f57507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d9f5750610d9e82611f28565b5b9050919050565b5f610daf611f91565b905090565b610dbc611fb0565b610dc5816120a5565b50565b606060038054610dd790615c2d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0390615c2d565b8015610e4e5780601f10610e2557610100808354040283529160200191610e4e565b820191905f5260205f20905b815481529060010190602001808311610e3157829003601f168201915b5050505050905090565b5f60045f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f3073ffffffffffffffffffffffffffffffffffffffff16610eb3610cb7565b73ffffffffffffffffffffffffffffffffffffffff1614610f00576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63150b7a0260e01b9050949350505050565b5f80610f2086868686611d42565b9050610f3581610f306004612167565b61218b565b505f610f4482888888886121f6565b90505f8165ffffffffffff1614610fc9578060045f8481526020019081526020015f206001015f6101000a81548165ffffffffffff021916908365ffffffffffff1602179055507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928282604051610fbc929190615c8d565b60405180910390a1610ffb565b6040517f90884a4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8192505050949350505050565b5f8061101686868686611d42565b9050611036816110266005612167565b6110306004612167565b1761218b565b50600160045f8381526020019081526020015f205f01601e6101000a81548160ff0219169083151502179055503073ffffffffffffffffffffffffffffffffffffffff16611082610cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611138575f5b8651811015611136573073ffffffffffffffffffffffffffffffffffffffff168782815181106110d2576110d1615cb4565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361112b5761112a85828151811061110b5761110a615cb4565b5b602002602001015180519060200120600561220f90919063ffffffff16565b5b80600101905061109f565b505b611145818787878761232e565b3073ffffffffffffffffffffffffffffffffffffffff16611164610cb7565b73ffffffffffffffffffffffffffffffffffffffff161415801561118f575061118d6005612342565b155b1561119f5761119e60056123ae565b5b7f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f816040516111ce919061493d565b60405180910390a180915050949350505050565b5f60045f8381526020019081526020015f205f0160149054906101000a900465ffffffffffff1665ffffffffffff169050919050565b7f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a81181565b5f611245612424565b905090565b5f61125482612446565b9050919050565b5f60095f8481526020019081526020015f206003015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f806112ce86868686611d42565b90506112e2816112dd5f612167565b61218b565b506112ec81610e58565b73ffffffffffffffffffffffffffffffffffffffff1661130a6125fb565b73ffffffffffffffffffffffffffffffffffffffff16146113695761132d6125fb565b6040517f233d98e30000000000000000000000000000000000000000000000000000000081526004016113609190614a7a565b60405180910390fd5b61137586868686612602565b915050949350505050565b606061138a611ed9565b73ffffffffffffffffffffffffffffffffffffffff16634bf5d7e96040518163ffffffff1660e01b81526004015f60405180830381865afa9250505080156113f457506040513d5f823e3d601f19601f820116820180604052508101906113f19190615d4f565b60015b611435576040518060400160405280601d81526020017f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000815250905061143a565b809150505b90565b5f805f8060095f8681526020019081526020015f209050805f015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b5f806114b76125fb565b90506114d384828560405180602001604052805f815250612619565b91505092915050565b5f80611569876115637f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a8118c8c8c6115128e612638565b8d8d604051611522929190615dc4565b60405180910390208c805190602001206040516020016115489796959493929190615deb565b6040516020818303038152906040528051906020012061268b565b856126a4565b9050806115ad57866040517f94ab6c070000000000000000000000000000000000000000000000000000000081526004016115a49190614a7a565b60405180910390fd5b6115fd89888a89898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505088612731565b915050979650505050505050565b5f806116156125fb565b905061166787828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505087612731565b91505095945050505050565b5f80600a5f018054905090505f600a5f016001836116919190615e85565b815481106116a2576116a1615cb4565b5b905f5260205f200190505f815f015f9054906101000a900465ffffffffffff1690505f825f0160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff169050858265ffffffffffff1611611728578079ffffffffffffffffffffffffffffffffffffffffffffffffffff16945050505050611767565b6117446117348761282e565b600a61288790919063ffffffff16565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff169450505050505b919050565b611774611fb0565b61177d81612974565b50565b5f8061178a6125fb565b90506117db86828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050612619565b915050949350505050565b5f806117f06125fb565b90506117fc81846129e7565b61183d57806040517fd9b395570000000000000000000000000000000000000000000000000000000081526004016118349190614a7a565b60405180910390fd5b5f61186382600161184c611a92565b6118569190615eb8565b65ffffffffffff16611e19565b90505f61186e611bc1565b9050808210156118b9578282826040517fc242ee160000000000000000000000000000000000000000000000000000000081526004016118b093929190615ef1565b60405180910390fd5b6118c68888888887612b2f565b9350505050949350505050565b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f6060805f805f606061192a612db4565b611932612dee565b46305f801b5f67ffffffffffffffff81111561195157611950614ac5565b5b60405190808252806020026020018201604052801561197f5781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b5f80611a2984611a237ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d78989896119f48b612638565b604051602001611a08959493929190615f26565b6040516020818303038152906040528051906020012061268b565b856126a4565b905080611a6d57836040517f94ab6c07000000000000000000000000000000000000000000000000000000008152600401611a649190614a7a565b60405180910390fd5b611a8786858760405180602001604052805f815250612619565b915050949350505050565b5f611a9b611ed9565b73ffffffffffffffffffffffffffffffffffffffff166391ddadf46040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611b0257506040513d601f19601f82011682018060405250810190611aff9190615f8b565b60015b611b1557611b0e612e29565b9050611b1a565b809150505b90565b5f6064905090565b5f611b31848484612e38565b90509392505050565b5f611b45600a612ec3565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff16905090565b611b6e611fb0565b611b7781612f25565b50565b5f611b8482612fc2565b9050919050565b5f60045f8381526020019081526020015f206001015f9054906101000a900465ffffffffffff1665ffffffffffff169050919050565b5f611bca612fcc565b905090565b5f3073ffffffffffffffffffffffffffffffffffffffff16611bef610cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611c3c576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63bc197c8160e01b905095945050505050565b5f60045f8381526020019081526020015f205f01601a9054906101000a900463ffffffff1663ffffffff1660045f8481526020019081526020015f205f0160149054906101000a900465ffffffffffff16611caa9190615fb6565b65ffffffffffff169050919050565b611cc1611fb0565b5f808573ffffffffffffffffffffffffffffffffffffffff16858585604051611ceb929190615dc4565b5f6040518083038185875af1925050503d805f8114611d25576040519150601f19603f3d011682016040523d82523d5f602084013e611d2a565b606091505b5091509150611d398282612fd5565b50505050505050565b5f84848484604051602001611d5a94939291906161b3565b604051602081830303815290604052805190602001205f1c9050949350505050565b5f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d781565b611e0d611fb0565b611e1681612ff9565b50565b5f611e2c8383611e276130b2565b612e38565b905092915050565b611e3c611fb0565b611e45816130c8565b50565b5f3073ffffffffffffffffffffffffffffffffffffffff16611e68610cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611eb5576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63f23a6e6160e01b905095945050505050565b5f611ed28261310d565b9050919050565b5f7f0000000000000000000000000000000000000000000000000000000000000000905090565b5f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f600860069054906101000a900463ffffffff1663ffffffff16905090565b611fb86125fb565b73ffffffffffffffffffffffffffffffffffffffff16611fd6610cb7565b73ffffffffffffffffffffffffffffffffffffffff161461203557611ff96125fb565b6040517f47096e4700000000000000000000000000000000000000000000000000000000815260040161202c9190614a7a565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612054610cb7565b73ffffffffffffffffffffffffffffffffffffffff16146120a3575f6120786131b9565b604051612086929190615dc4565b604051809103902090505b8061209c60056131c5565b0361209157505b565b5f6120ae611b1d565b9050808211156120f75781816040517f243e54450000000000000000000000000000000000000000000000000000000081526004016120ee92919061620b565b60405180910390fd5b5f612100611b3a565b905061212761210d611a92565b6121168561331a565b600a6133879092919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997818460405161215a92919061620b565b60405180910390a1505050565b5f81600781111561217b5761217a615006565b5b60ff166001901b5f1b9050919050565b5f806121968461124a565b90505f801b836121a583612167565b16036121ec578381846040517f31b75e4d0000000000000000000000000000000000000000000000000000000081526004016121e393929190616232565b60405180910390fd5b8091505092915050565b5f61220486868686866133a2565b905095945050505050565b5f825f0160109054906101000a90046fffffffffffffffffffffffffffffffff169050825f015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16600182016fffffffffffffffffffffffffffffffff16036122b0576040517f8acb5f2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81836001015f836fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060018101835f0160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550505050565b61233b85858585856135a8565b5050505050565b5f815f015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16825f0160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16149050919050565b5f815f015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505f815f0160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b5f60085f9054906101000a900465ffffffffffff1665ffffffffffff16905090565b5f806124518361365c565b90506005600781111561246757612466615006565b5b81600781111561247a57612479615006565b5b1461248857809150506125f6565b5f600c5f8581526020019081526020015f20549050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016124f79190614fed565b602060405180830381865afa158015612512573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125369190616291565b15612546576005925050506125f6565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b81526004016125a09190614fed565b602060405180830381865afa1580156125bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125df9190616291565b156125ef576007925050506125f6565b6002925050505b919050565b5f33905090565b5f61260f858585856137b3565b9050949350505050565b5f61262e858585856126296130b2565b612731565b9050949350505050565b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050559050919050565b5f61269d61269761388a565b83613940565b9050919050565b5f805f6126b18585613980565b50915091505f60038111156126c9576126c8615006565b5b8160038111156126dc576126db615006565b5b14801561271457508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b8061272657506127258686866139d5565b5b925050509392505050565b5f612745866127406001612167565b61218b565b505f61275a86612754896111e2565b85612e38565b90506127698787878487613af4565b5f8351036127ca578573ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4888784886040516127bd94939291906162bc565b60405180910390a2612821565b8573ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb8712888784888860405161281895949392919061634e565b60405180910390a25b8091505095945050505050565b5f65ffffffffffff801682111561287f576030826040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526004016128769291906163e6565b60405180910390fd5b819050919050565b5f80835f018054905090505f808290506005831115612908575f6128aa84613ce3565b846128b59190615e85565b90506128c3875f0182613dd9565b5f015f9054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1610156128f657809150612906565b600181612903919061640d565b92505b505b5f612917875f01878585613deb565b90505f811461296657612938875f016001836129339190615e85565b613dd9565b5f0160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff16612968565b5f5b94505050505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360085f9054906101000a900465ffffffffffff16826040516129b8929190616440565b60405180910390a18060085f6101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b5f80825190506034811015612a00576001915050612b29565b5f6014820384015190507f2370726f706f7365723d3078000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff19168173ffffffffffffffffffffffffffffffffffffffff191614612a6a57600192505050612b29565b5f80602884612a799190615e85565b90505b83811015612af3575f80612aac888481518110612a9c57612a9b615cb4565b5b602001015160f81c60f81b613e60565b9150915081612ac45760019650505050505050612b29565b8060ff1660048573ffffffffffffffffffffffffffffffffffffffff16901b1793505050806001019050612a7c565b508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161493505050505b92915050565b5f612b438686868680519060200120611d42565b905084518651141580612b5857508351865114155b80612b6357505f8651145b15612bac578551845186516040517f447b05d0000000000000000000000000000000000000000000000000000000008152600401612ba3939291906150d0565b60405180910390fd5b5f60045f8381526020019081526020015f205f0160149054906101000a900465ffffffffffff1665ffffffffffff1614612c2b5780612bea8261124a565b5f801b6040517f31b75e4d000000000000000000000000000000000000000000000000000000008152600401612c2293929190616232565b60405180910390fd5b5f612c3461123c565b612c3c611a92565b65ffffffffffff16612c4e919061640d565b90505f612c59610da6565b90505f60045f8581526020019081526020015f20905084815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612cb98361282e565b815f0160146101000a81548165ffffffffffff021916908365ffffffffffff160217905550612ce782613ef7565b815f01601a6101000a81548163ffffffff021916908363ffffffff1602179055507f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084868b8b8d5167ffffffffffffffff811115612d4857612d47614ac5565b5b604051908082528060200260200182016040528015612d7b57816020015b6060815260200190600190039081612d665790505b508c89898b612d8a919061640d565b8e604051612da09998979695949392919061656a565b60405180910390a150505095945050505050565b6060612de95f7f0000000000000000000000000000000000000000000000000000000000000000613f4e90919063ffffffff16565b905090565b6060612e2460017f0000000000000000000000000000000000000000000000000000000000000000613f4e90919063ffffffff16565b905090565b5f612e334361282e565b905090565b5f612e41611ed9565b73ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b8152600401612e7b929190616618565b602060405180830381865afa158015612e96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eba9190616653565b90509392505050565b5f80825f018054905090505f8114612f1b57612eed835f01600183612ee89190615e85565b613dd9565b5f0160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff16612f1d565b5f5b915050919050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051612f7792919061667e565b60405180910390a180600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60019050919050565b5f600754905090565b606082612fea57612fe582613ffb565b612ff2565b819050612ff3565b5b92915050565b5f8163ffffffff1603613043575f6040517ff1cfbf0500000000000000000000000000000000000000000000000000000000815260040161303a91906166de565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828600860069054906101000a900463ffffffff1682604051613086929190616727565b60405180910390a180600860066101000a81548163ffffffff021916908363ffffffff16021790555050565b606060405180602001604052805f815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461600754826040516130fb92919061620b565b60405180910390a18060078190555050565b5f613116611b1d565b61311f83611673565b613127611ed9565b73ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b815260040161315f919061493d565b602060405180830381865afa15801561317a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061319e9190616653565b6131a8919061674e565b6131b291906167bc565b9050919050565b365f8036915091509091565b5f80825f015f9054906101000a90046fffffffffffffffffffffffffffffffff169050825f0160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff1603613264576040517f75e52f4f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826001015f826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020019081526020015f20549150826001015f826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020019081526020015f205f905560018101835f015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050919050565b5f79ffffffffffffffffffffffffffffffffffffffffffffffffffff801682111561337f5760d0826040517f6dfcc650000000000000000000000000000000000000000000000000000000008152600401613376929190616825565b60405180910390fd5b819050919050565b5f80613396855f01858561403f565b91509150935093915050565b5f80600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa15801561340e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134329190616653565b90505f61343e846143a7565b9050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888885f866040518663ffffffff1660e01b81526004016134a2959493929190616887565b602060405180830381865afa1580156134bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134e19190616901565b600c5f8a81526020019081526020015f2081905550600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb08888885f86886040518763ffffffff1660e01b815260040161355a9695949392919061692c565b5f604051808303815f87803b158015613571575f80fd5b505af1158015613583573d5f803e3d5ffd5b5050505061359b8242613596919061640d565b61282e565b9250505095945050505050565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686865f6135f3886143a7565b6040518763ffffffff1660e01b8152600401613613959493929190616887565b5f604051808303818588803b15801561362a575f80fd5b505af115801561363c573d5f803e3d5ffd5b5050505050600c5f8681526020019081526020015f205f90555050505050565b5f8060045f8481526020019081526020015f2090505f815f01601e9054906101000a900460ff1690505f825f01601f9054906101000a900460ff16905081156136ab57600793505050506137ae565b80156136bd57600293505050506137ae565b5f6136c7866111e2565b90505f810361370d57856040517f6ad06075000000000000000000000000000000000000000000000000000000008152600401613704919061493d565b60405180910390fd5b5f613716611a92565b65ffffffffffff169050808210613734575f955050505050506137ae565b5f61373e88611c4f565b905081811061375657600196505050505050506137ae565b61375f886143c4565b1580613771575061376f88614408565b155b1561378557600396505050505050506137ae565b5f61378f89611b8b565b036137a357600496505050505050506137ae565b600596505050505050505b919050565b5f806137c18686868661442f565b90505f600c5f8381526020019081526020015f205490505f801b811461387d57600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c4d252f5826040518263ffffffff1660e01b815260040161383b9190614fed565b5f604051808303815f87803b158015613852575f80fd5b505af1158015613864573d5f803e3d5ffd5b50505050600c5f8381526020019081526020015f205f90555b8192505050949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561390557507f000000000000000000000000000000000000000000000000000000000000000046145b15613932577f0000000000000000000000000000000000000000000000000000000000000000905061393d565b61393a614511565b90505b90565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f60418451036139c0575f805f602087015192506040870151915060608701515f1a90506139b2888285856145a6565b9550955095505050506139ce565b5f600285515f1b9250925092505b9250925092565b5f805f8573ffffffffffffffffffffffffffffffffffffffff168585604051602401613a029291906169a0565b604051602081830303815290604052631626ba7e60e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051613a5491906169fe565b5f60405180830381855afa9150503d805f8114613a8c576040519150601f19603f3d011682016040523d82523d5f602084013e613a91565b606091505b5091509150818015613aa557506020815110155b8015613ae95750631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681806020019051810190613ae79190616901565b145b925050509392505050565b5f60095f8781526020019081526020015f209050806003015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615613b9657846040517f71c6af49000000000000000000000000000000000000000000000000000000008152600401613b8d9190614a7a565b60405180910390fd5b6001816003015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f6002811115613c0057613bff615006565b5b60ff168460ff1603613c2a5782815f015f828254613c1e919061640d565b92505081905550613cdb565b60016002811115613c3e57613c3d615006565b5b60ff168460ff1603613c695782816001015f828254613c5d919061640d565b92505081905550613cda565b600280811115613c7c57613c7b615006565b5b60ff168460ff1603613ca75782816002015f828254613c9b919061640d565b92505081905550613cd9565b6040517f06b337c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b505050505050565b5f808203613cf3575f9050613dd4565b5f6001613cff8461468d565b901c6001901b90506001818481613d1957613d1861678f565b5b048201901c90506001818481613d3257613d3161678f565b5b048201901c90506001818481613d4b57613d4a61678f565b5b048201901c90506001818481613d6457613d6361678f565b5b048201901c90506001818481613d7d57613d7c61678f565b5b048201901c90506001818481613d9657613d9561678f565b5b048201901c90506001818481613daf57613dae61678f565b5b048201901c9050613dd081828581613dca57613dc961678f565b5b04614764565b9150505b919050565b5f825f528160205f2001905092915050565b5f5b81831015613e55575f613e00848461477c565b90508465ffffffffffff16613e158783613dd9565b5f015f9054906101000a900465ffffffffffff1665ffffffffffff161115613e3f57809250613e4f565b600181613e4c919061640d565b93505b50613ded565b819050949350505050565b5f805f8360f81c90508060ff16602f108015613e7f5750603a8160ff16105b15613e94576001603082039250925050613ef2565b8060ff166040108015613eaa575060478160ff16105b15613ebf576001603782039250925050613ef2565b8060ff166060108015613ed5575060678160ff16105b15613eea576001605782039250925050613ef2565b5f8092509250505b915091565b5f63ffffffff8016821115613f46576020826040517f6dfcc650000000000000000000000000000000000000000000000000000000008152600401613f3d929190616a4d565b60405180910390fd5b819050919050565b606060ff5f1b8314613f6a57613f63836147a1565b9050613ff5565b818054613f7690615c2d565b80601f0160208091040260200160405190810160405280929190818152602001828054613fa290615c2d565b8015613fed5780601f10613fc457610100808354040283529160200191613fed565b820191905f5260205f20905b815481529060010190602001808311613fd057829003601f168201915b505050505090505b92915050565b5f8151111561400d5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f858054905090505f8111156142bf575f614068876001846140639190615e85565b613dd9565b6040518060400160405290815f82015f9054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020015f820160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff168152505090508565ffffffffffff16815f015165ffffffffffff161115614153576040517f2520601d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8565ffffffffffff16815f015165ffffffffffff16036141d557846141848860018561417f9190615e85565b613dd9565b5f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506142ae565b8660405180604001604052808865ffffffffffff1681526020018779ffffffffffffffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a81548165ffffffffffff021916908365ffffffffffff1602179055506020820151815f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80602001518593509350505061439f565b8560405180604001604052808765ffffffffffff1681526020018679ffffffffffffffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a81548165ffffffffffff021916908365ffffffffffff1602179055506020820151815f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505f8492509250505b935093915050565b5f813060601b6bffffffffffffffffffffffff1916189050919050565b5f8060095f8481526020019081526020015f209050806002015481600101546143ed919061640d565b6143fe6143f9856111e2565b611ec8565b1115915050919050565b5f8060095f8481526020019081526020015f209050805f0154816001015411915050919050565b5f8061443d86868686611d42565b90506144a18161444d6007612167565b6144576006612167565b6144616002612167565b60018060078081111561447757614476615006565b5b6144819190616a74565b600261448d9190616bd7565b6144979190615e85565b5f1b18181861218b565b50600160045f8381526020019081526020015f205f01601f6101000a81548160ff0219169083151502179055507f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c816040516144fd919061493d565b60405180910390a180915050949350505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000463060405160200161458b959493929190616c21565b60405160208183030381529060405280519060200120905090565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c11156145e2575f600385925092509250614683565b5f6001888888886040515f81526020016040526040516146059493929190616c72565b6020604051602081039080840390855afa158015614625573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603614676575f60015f801b93509350935050614683565b805f805f1b935093509350505b9450945094915050565b5f805f90505f608084901c11156146ac57608083901c92506080810190505b5f604084901c11156146c657604083901c92506040810190505b5f602084901c11156146e057602083901c92506020810190505b5f601084901c11156146fa57601083901c92506010810190505b5f600884901c111561471457600883901c92506008810190505b5f600484901c111561472e57600483901c92506004810190505b5f600284901c111561474857600283901c92506002810190505b5f600184901c111561475b576001810190505b80915050919050565b5f8183106147725781614774565b825b905092915050565b5f600282841861478c91906167bc565b828416614799919061640d565b905092915050565b60605f6147ad83614813565b90505f602067ffffffffffffffff8111156147cb576147ca614ac5565b5b6040519080825280601f01601f1916602001820160405280156147fd5781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b5f8060ff835f1c169050601f811115614858576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6148a681614872565b81146148b0575f80fd5b50565b5f813590506148c18161489d565b92915050565b5f602082840312156148dc576148db61486a565b5b5f6148e9848285016148b3565b91505092915050565b5f8115159050919050565b614906816148f2565b82525050565b5f60208201905061491f5f8301846148fd565b92915050565b5f819050919050565b61493781614925565b82525050565b5f6020820190506149505f83018461492e565b92915050565b61495f81614925565b8114614969575f80fd5b50565b5f8135905061497a81614956565b92915050565b5f602082840312156149955761499461486a565b5b5f6149a28482850161496c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6149ed826149ab565b6149f781856149b5565b9350614a078185602086016149c5565b614a10816149d3565b840191505092915050565b5f6020820190508181035f830152614a3381846149e3565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614a6482614a3b565b9050919050565b614a7481614a5a565b82525050565b5f602082019050614a8d5f830184614a6b565b92915050565b614a9c81614a5a565b8114614aa6575f80fd5b50565b5f81359050614ab781614a93565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b614afb826149d3565b810181811067ffffffffffffffff82111715614b1a57614b19614ac5565b5b80604052505050565b5f614b2c614861565b9050614b388282614af2565b919050565b5f67ffffffffffffffff821115614b5757614b56614ac5565b5b614b60826149d3565b9050602081019050919050565b828183375f83830152505050565b5f614b8d614b8884614b3d565b614b23565b905082815260208101848484011115614ba957614ba8614ac1565b5b614bb4848285614b6d565b509392505050565b5f82601f830112614bd057614bcf614abd565b5b8135614be0848260208601614b7b565b91505092915050565b5f805f8060808587031215614c0157614c0061486a565b5b5f614c0e87828801614aa9565b9450506020614c1f87828801614aa9565b9350506040614c308782880161496c565b925050606085013567ffffffffffffffff811115614c5157614c5061486e565b5b614c5d87828801614bbc565b91505092959194509250565b614c7281614872565b82525050565b5f602082019050614c8b5f830184614c69565b92915050565b5f67ffffffffffffffff821115614cab57614caa614ac5565b5b602082029050602081019050919050565b5f80fd5b5f614cd2614ccd84614c91565b614b23565b90508083825260208201905060208402830185811115614cf557614cf4614cbc565b5b835b81811015614d1e5780614d0a8882614aa9565b845260208401935050602081019050614cf7565b5050509392505050565b5f82601f830112614d3c57614d3b614abd565b5b8135614d4c848260208601614cc0565b91505092915050565b5f67ffffffffffffffff821115614d6f57614d6e614ac5565b5b602082029050602081019050919050565b5f614d92614d8d84614d55565b614b23565b90508083825260208201905060208402830185811115614db557614db4614cbc565b5b835b81811015614dde5780614dca888261496c565b845260208401935050602081019050614db7565b5050509392505050565b5f82601f830112614dfc57614dfb614abd565b5b8135614e0c848260208601614d80565b91505092915050565b5f67ffffffffffffffff821115614e2f57614e2e614ac5565b5b602082029050602081019050919050565b5f614e52614e4d84614e15565b614b23565b90508083825260208201905060208402830185811115614e7557614e74614cbc565b5b835b81811015614ebc57803567ffffffffffffffff811115614e9a57614e99614abd565b5b808601614ea78982614bbc565b85526020850194505050602081019050614e77565b5050509392505050565b5f82601f830112614eda57614ed9614abd565b5b8135614eea848260208601614e40565b91505092915050565b5f819050919050565b614f0581614ef3565b8114614f0f575f80fd5b50565b5f81359050614f2081614efc565b92915050565b5f805f8060808587031215614f3e57614f3d61486a565b5b5f85013567ffffffffffffffff811115614f5b57614f5a61486e565b5b614f6787828801614d28565b945050602085013567ffffffffffffffff811115614f8857614f8761486e565b5b614f9487828801614de8565b935050604085013567ffffffffffffffff811115614fb557614fb461486e565b5b614fc187828801614ec6565b9250506060614fd287828801614f12565b91505092959194509250565b614fe781614ef3565b82525050565b5f6020820190506150005f830184614fde565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6008811061504457615043615006565b5b50565b5f81905061505482615033565b919050565b5f61506382615047565b9050919050565b61507381615059565b82525050565b5f60208201905061508c5f83018461506a565b92915050565b5f80604083850312156150a8576150a761486a565b5b5f6150b58582860161496c565b92505060206150c685828601614aa9565b9150509250929050565b5f6060820190506150e35f83018661492e565b6150f0602083018561492e565b6150fd604083018461492e565b949350505050565b5f60ff82169050919050565b61511a81615105565b8114615124575f80fd5b50565b5f8135905061513581615111565b92915050565b5f80604083850312156151515761515061486a565b5b5f61515e8582860161496c565b925050602061516f85828601615127565b9150509250929050565b5f80fd5b5f8083601f84011261519257615191614abd565b5b8235905067ffffffffffffffff8111156151af576151ae615179565b5b6020830191508360018202830111156151cb576151ca614cbc565b5b9250929050565b5f805f805f805f60c0888a0312156151ed576151ec61486a565b5b5f6151fa8a828b0161496c565b975050602061520b8a828b01615127565b965050604061521c8a828b01614aa9565b955050606088013567ffffffffffffffff81111561523d5761523c61486e565b5b6152498a828b0161517d565b9450945050608088013567ffffffffffffffff81111561526c5761526b61486e565b5b6152788a828b01614bbc565b92505060a088013567ffffffffffffffff8111156152995761529861486e565b5b6152a58a828b01614bbc565b91505092959891949750929550565b5f805f805f608086880312156152cd576152cc61486a565b5b5f6152da8882890161496c565b95505060206152eb88828901615127565b945050604086013567ffffffffffffffff81111561530c5761530b61486e565b5b6153188882890161517d565b9350935050606086013567ffffffffffffffff81111561533b5761533a61486e565b5b61534788828901614bbc565b9150509295509295909350565b5f65ffffffffffff82169050919050565b61536e81615354565b8114615378575f80fd5b50565b5f8135905061538981615365565b92915050565b5f602082840312156153a4576153a361486a565b5b5f6153b18482850161537b565b91505092915050565b5f805f80606085870312156153d2576153d161486a565b5b5f6153df8782880161496c565b94505060206153f087828801615127565b935050604085013567ffffffffffffffff8111156154115761541061486e565b5b61541d8782880161517d565b925092505092959194509250565b5f67ffffffffffffffff82111561544557615444614ac5565b5b61544e826149d3565b9050602081019050919050565b5f61546d6154688461542b565b614b23565b90508281526020810184848401111561548957615488614ac1565b5b615494848285614b6d565b509392505050565b5f82601f8301126154b0576154af614abd565b5b81356154c084826020860161545b565b91505092915050565b5f805f80608085870312156154e1576154e061486a565b5b5f85013567ffffffffffffffff8111156154fe576154fd61486e565b5b61550a87828801614d28565b945050602085013567ffffffffffffffff81111561552b5761552a61486e565b5b61553787828801614de8565b935050604085013567ffffffffffffffff8111156155585761555761486e565b5b61556487828801614ec6565b925050606085013567ffffffffffffffff8111156155855761558461486e565b5b6155918782880161549c565b91505092959194509250565b5f602082840312156155b2576155b161486a565b5b5f6155bf84828501614aa9565b91505092915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6155fc816155c8565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61563481614925565b82525050565b5f615645838361562b565b60208301905092915050565b5f602082019050919050565b5f61566782615602565b615671818561560c565b935061567c8361561c565b805f5b838110156156ac578151615693888261563a565b975061569e83615651565b92505060018101905061567f565b5085935050505092915050565b5f60e0820190506156cc5f83018a6155f3565b81810360208301526156de81896149e3565b905081810360408301526156f281886149e3565b9050615701606083018761492e565b61570e6080830186614a6b565b61571b60a0830185614fde565b81810360c083015261572d818461565d565b905098975050505050505050565b5f805f80608085870312156157535761575261486a565b5b5f6157608782880161496c565b945050602061577187828801615127565b935050604061578287828801614aa9565b925050606085013567ffffffffffffffff8111156157a3576157a261486e565b5b6157af87828801614bbc565b91505092959194509250565b6157c481615354565b82525050565b5f6020820190506157dd5f8301846157bb565b92915050565b5f805f606084860312156157fa576157f961486a565b5b5f61580786828701614aa9565b93505060206158188682870161496c565b925050604084013567ffffffffffffffff8111156158395761583861486e565b5b61584586828701614bbc565b9150509250925092565b5f61585982614a3b565b9050919050565b5f61586a8261584f565b9050919050565b61587a81615860565b8114615884575f80fd5b50565b5f8135905061589581615871565b92915050565b5f602082840312156158b0576158af61486a565b5b5f6158bd84828501615887565b91505092915050565b5f805f805f60a086880312156158df576158de61486a565b5b5f6158ec88828901614aa9565b95505060206158fd88828901614aa9565b945050604086013567ffffffffffffffff81111561591e5761591d61486e565b5b61592a88828901614de8565b935050606086013567ffffffffffffffff81111561594b5761594a61486e565b5b61595788828901614de8565b925050608086013567ffffffffffffffff8111156159785761597761486e565b5b61598488828901614bbc565b9150509295509295909350565b5f8083601f8401126159a6576159a5614abd565b5b8235905067ffffffffffffffff8111156159c3576159c2615179565b5b6020830191508360018202830111156159df576159de614cbc565b5b9250929050565b5f805f80606085870312156159fe576159fd61486a565b5b5f615a0b87828801614aa9565b9450506020615a1c8782880161496c565b935050604085013567ffffffffffffffff811115615a3d57615a3c61486e565b5b615a4987828801615991565b925092505092959194509250565b5f63ffffffff82169050919050565b615a6f81615a57565b8114615a79575f80fd5b50565b5f81359050615a8a81615a66565b92915050565b5f60208284031215615aa557615aa461486a565b5b5f615ab284828501615a7c565b91505092915050565b5f8060408385031215615ad157615ad061486a565b5b5f615ade85828601614aa9565b9250506020615aef8582860161496c565b9150509250929050565b5f805f805f60a08688031215615b1257615b1161486a565b5b5f615b1f88828901614aa9565b9550506020615b3088828901614aa9565b9450506040615b418882890161496c565b9350506060615b528882890161496c565b925050608086013567ffffffffffffffff811115615b7357615b7261486e565b5b615b7f88828901614bbc565b9150509295509295909350565b5f819050919050565b5f615baf615baa615ba584614a3b565b615b8c565b614a3b565b9050919050565b5f615bc082615b95565b9050919050565b5f615bd182615bb6565b9050919050565b615be181615bc7565b82525050565b5f602082019050615bfa5f830184615bd8565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680615c4457607f821691505b602082108103615c5757615c56615c00565b5b50919050565b5f615c77615c72615c6d84615354565b615b8c565b614925565b9050919050565b615c8781615c5d565b82525050565b5f604082019050615ca05f83018561492e565b615cad6020830184615c7e565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f615cf3615cee8461542b565b614b23565b905082815260208101848484011115615d0f57615d0e614ac1565b5b615d1a8482856149c5565b509392505050565b5f82601f830112615d3657615d35614abd565b5b8151615d46848260208601615ce1565b91505092915050565b5f60208284031215615d6457615d6361486a565b5b5f82015167ffffffffffffffff811115615d8157615d8061486e565b5b615d8d84828501615d22565b91505092915050565b5f81905092915050565b5f615dab8385615d96565b9350615db8838584614b6d565b82840190509392505050565b5f615dd0828486615da0565b91508190509392505050565b615de581615105565b82525050565b5f60e082019050615dfe5f83018a614fde565b615e0b602083018961492e565b615e186040830188615ddc565b615e256060830187614a6b565b615e32608083018661492e565b615e3f60a0830185614fde565b615e4c60c0830184614fde565b98975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f615e8f82614925565b9150615e9a83614925565b9250828203905081811115615eb257615eb1615e58565b5b92915050565b5f615ec282615354565b9150615ecd83615354565b9250828203905065ffffffffffff811115615eeb57615eea615e58565b5b92915050565b5f606082019050615f045f830186614a6b565b615f11602083018561492e565b615f1e604083018461492e565b949350505050565b5f60a082019050615f395f830188614fde565b615f46602083018761492e565b615f536040830186615ddc565b615f606060830185614a6b565b615f6d608083018461492e565b9695505050505050565b5f81519050615f8581615365565b92915050565b5f60208284031215615fa057615f9f61486a565b5b5f615fad84828501615f77565b91505092915050565b5f615fc082615354565b9150615fcb83615354565b9250828201905065ffffffffffff811115615fe957615fe8615e58565b5b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61602181614a5a565b82525050565b5f6160328383616018565b60208301905092915050565b5f602082019050919050565b5f61605482615fef565b61605e8185615ff9565b935061606983616009565b805f5b838110156160995781516160808882616027565b975061608b8361603e565b92505060018101905061606c565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6160f3826160cf565b6160fd81856160d9565b935061610d8185602086016149c5565b616116816149d3565b840191505092915050565b5f61612c83836160e9565b905092915050565b5f602082019050919050565b5f61614a826160a6565b61615481856160b0565b935083602082028501616166856160c0565b805f5b858110156161a157848403895281516161828582616121565b945061618d83616134565b925060208a01995050600181019050616169565b50829750879550505050505092915050565b5f6080820190508181035f8301526161cb818761604a565b905081810360208301526161df818661565d565b905081810360408301526161f38185616140565b90506162026060830184614fde565b95945050505050565b5f60408201905061621e5f83018561492e565b61622b602083018461492e565b9392505050565b5f6060820190506162455f83018661492e565b616252602083018561506a565b61625f6040830184614fde565b949350505050565b616270816148f2565b811461627a575f80fd5b50565b5f8151905061628b81616267565b92915050565b5f602082840312156162a6576162a561486a565b5b5f6162b38482850161627d565b91505092915050565b5f6080820190506162cf5f83018761492e565b6162dc6020830186615ddc565b6162e9604083018561492e565b81810360608301526162fb81846149e3565b905095945050505050565b5f82825260208201905092915050565b5f616320826160cf565b61632a8185616306565b935061633a8185602086016149c5565b616343816149d3565b840191505092915050565b5f60a0820190506163615f83018861492e565b61636e6020830187615ddc565b61637b604083018661492e565b818103606083015261638d81856149e3565b905081810360808301526163a18184616316565b90509695505050505050565b5f819050919050565b5f6163d06163cb6163c6846163ad565b615b8c565b615105565b9050919050565b6163e0816163b6565b82525050565b5f6040820190506163f95f8301856163d7565b616406602083018461492e565b9392505050565b5f61641782614925565b915061642283614925565b925082820190508082111561643a57616439615e58565b5b92915050565b5f6040820190506164535f830185615c7e565b6164606020830184615c7e565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f82825260208201905092915050565b5f6164aa826149ab565b6164b48185616490565b93506164c48185602086016149c5565b6164cd816149d3565b840191505092915050565b5f6164e383836164a0565b905092915050565b5f602082019050919050565b5f61650182616467565b61650b8185616471565b93508360208202850161651d85616481565b805f5b85811015616558578484038952815161653985826164d8565b9450616544836164eb565b925060208a01995050600181019050616520565b50829750879550505050505092915050565b5f6101208201905061657e5f83018c61492e565b61658b602083018b614a6b565b818103604083015261659d818a61604a565b905081810360608301526165b1818961565d565b905081810360808301526165c581886164f7565b905081810360a08301526165d98187616140565b90506165e860c083018661492e565b6165f560e083018561492e565b81810361010083015261660881846149e3565b90509a9950505050505050505050565b5f60408201905061662b5f830185614a6b565b616638602083018461492e565b9392505050565b5f8151905061664d81614956565b92915050565b5f602082840312156166685761666761486a565b5b5f6166758482850161663f565b91505092915050565b5f6040820190506166915f830185614a6b565b61669e6020830184614a6b565b9392505050565b5f819050919050565b5f6166c86166c36166be846166a5565b615b8c565b614925565b9050919050565b6166d8816166ae565b82525050565b5f6020820190506166f15f8301846166cf565b92915050565b5f61671161670c61670784615a57565b615b8c565b614925565b9050919050565b616721816166f7565b82525050565b5f60408201905061673a5f830185616718565b6167476020830184616718565b9392505050565b5f61675882614925565b915061676383614925565b925082820261677181614925565b9150828204841483151761678857616787615e58565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6167c682614925565b91506167d183614925565b9250826167e1576167e061678f565b5b828204905092915050565b5f819050919050565b5f61680f61680a616805846167ec565b615b8c565b615105565b9050919050565b61681f816167f5565b82525050565b5f6040820190506168385f830185616816565b616845602083018461492e565b9392505050565b5f815f1b9050919050565b5f61687161686c616867846166a5565b61684c565b614ef3565b9050919050565b61688181616857565b82525050565b5f60a0820190508181035f83015261689f818861604a565b905081810360208301526168b3818761565d565b905081810360408301526168c78186616140565b90506168d66060830185616878565b6168e36080830184614fde565b9695505050505050565b5f815190506168fb81614efc565b92915050565b5f602082840312156169165761691561486a565b5b5f616923848285016168ed565b91505092915050565b5f60c0820190508181035f830152616944818961604a565b90508181036020830152616958818861565d565b9050818103604083015261696c8187616140565b905061697b6060830186616878565b6169886080830185614fde565b61699560a083018461492e565b979650505050505050565b5f6040820190506169b35f830185614fde565b81810360208301526169c58184616316565b90509392505050565b5f6169d8826160cf565b6169e28185615d96565b93506169f28185602086016149c5565b80840191505092915050565b5f616a0982846169ce565b915081905092915050565b5f819050919050565b5f616a37616a32616a2d84616a14565b615b8c565b615105565b9050919050565b616a4781616a1d565b82525050565b5f604082019050616a605f830185616a3e565b616a6d602083018461492e565b9392505050565b5f616a7e82615105565b9150616a8983615105565b9250828201905060ff811115616aa257616aa1615e58565b5b92915050565b5f8160011c9050919050565b5f808291508390505b6001851115616afd57808604811115616ad957616ad8615e58565b5b6001851615616ae85780820291505b8081029050616af685616aa8565b9450616abd565b94509492505050565b5f82616b155760019050616bd0565b81616b22575f9050616bd0565b8160018114616b385760028114616b4257616b71565b6001915050616bd0565b60ff841115616b5457616b53615e58565b5b8360020a915084821115616b6b57616b6a615e58565b5b50616bd0565b5060208310610133831016604e8410600b8410161715616ba65782820a905083811115616ba157616ba0615e58565b5b616bd0565b616bb38484846001616ab4565b92509050818404811115616bca57616bc9615e58565b5b81810290505b9392505050565b5f616be182614925565b9150616bec83615105565b9250616c197fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484616b06565b905092915050565b5f60a082019050616c345f830188614fde565b616c416020830187614fde565b616c4e6040830186614fde565b616c5b606083018561492e565b616c686080830184614a6b565b9695505050505050565b5f608082019050616c855f830187614fde565b616c926020830186615ddc565b616c9f6040830185614fde565b616cac6060830184614fde565b9594505050505056fea264697066735822122026365c024e462ebeb7f76526307aa5fbc02335be98d5268e2625e95acfaaa48b64736f6c634300081a0033" + }, + "settings": { + "compilationTarget": { + "contracts/Dao.sol": "HomebaseDAO" + }, + "evmVersion": "shanghai", + "libraries": {}, + "metadata": { + "bytecodeHash": "ipfs" + }, + "optimizer": { + "enabled": true, + "runs": 200 + }, + "remappings": [] + }, + "sources": { + "@openzeppelin/contracts/access/AccessControl.sol": { + "keccak256": "0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308", + "license": "MIT", + "urls": [ + "bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80", + "dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z" + ] + }, + "@openzeppelin/contracts/access/IAccessControl.sol": { + "keccak256": "0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41", + "license": "MIT", + "urls": [ + "bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26", + "dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH" + ] + }, + "@openzeppelin/contracts/governance/Governor.sol": { + "keccak256": "0x9a6dc5abbb0b6415e343956d2a5f1a89251d5b4937ebcc4f0ffa17fec35a2149", + "license": "MIT", + "urls": [ + "bzz-raw://8e3ceb0f102494cb4547b2c460f81d8f23239db10e1ff3f97770adeb9d17d6e1", + "dweb:/ipfs/QmZ1xxtnTNFZ8M9vrvScY1YQAGAFMVGgsDoeWibS7sRzxD" + ] + }, + "@openzeppelin/contracts/governance/IGovernor.sol": { + "keccak256": "0x0a6c99ff573c20b62b8c568282517664e6d55000d4302aad10c668c97c0d2e0e", + "license": "MIT", + "urls": [ + "bzz-raw://66f355c55b1a366f831f7f912e1dffb16c15a4637d03f0c22cf335a5613856b6", + "dweb:/ipfs/QmPJMYLeuJsSHnBumMgxdtitNMagxexkP7UwCJq5ygxvQQ" + ] + }, + "@openzeppelin/contracts/governance/TimelockController.sol": { + "keccak256": "0x50ea4919331ca84a89c44be1e1fdecd597c7f5575c3d93f582197db97171c2c9", + "license": "MIT", + "urls": [ + "bzz-raw://a80401f75260f9f42440c05baee0d2ff7cdd1e1e451400000eabb9c901abe383", + "dweb:/ipfs/QmVdWjwkxmWrxcmz6ffmC8nCLwj5ixKrgWF7mKERdkZSfR" + ] + }, + "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { + "keccak256": "0x5c9ef54955aadafa3bac0ee7c40b2f1a164b4f3c2a72e1cb52043f664a85c15c", + "license": "MIT", + "urls": [ + "bzz-raw://2e016de12aa6a756541c7a7bf39a72d27dc112b251806d03efd24f86ff13732f", + "dweb:/ipfs/QmX8aoCruyuvMDH9r6uTCg4qTdqhbdFMdM5Z8Lxrtae8oT" + ] + }, + "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol": { + "keccak256": "0x1e0810708b8f5de8d3db73240ccee2d36a305cb904aa5acd4588834ebce6acce", + "license": "MIT", + "urls": [ + "bzz-raw://9758197a4d3cb1aa3036a9bd0edbf34a2eba82e484d3d519da495e495d752dee", + "dweb:/ipfs/QmYtV61Sp55bfcW4DZvsRuDo2EKb5PekqoY3nx5STJn6Zt" + ] + }, + "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol": { + "keccak256": "0x14e3ca2567cb0fc75ee2415931a495e4eb9b2a9edd261d3ebd9dd6c0df775711", + "license": "MIT", + "urls": [ + "bzz-raw://7dc5a48cb3df6a0f40f4fb1e1b61f4252924019448a948b2a2716e66b39dd1a6", + "dweb:/ipfs/QmdcYiYhQwFYGDC1w8ypo6gEgpkJ8NpKtixofQqUpYZZ9b" + ] + }, + "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol": { + "keccak256": "0x3ac80e86633701fd0675df10770877da0cab60fb041553ddbc78c431e4a7c3cc", + "license": "MIT", + "urls": [ + "bzz-raw://28acdbbe336d814144cacf1be1f2423252b494baa25d9c7cc6390a4b6348d1f2", + "dweb:/ipfs/QmXvrHzPXV8UWwp1crzDpfPLvdyfj9PKoF5acP6utkhmFs" + ] + }, + "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { + "keccak256": "0x5b5cdb361ed018c0162942d673c17e187c1a52ded2ce4f41e8a3f3f5d1656e00", + "license": "MIT", + "urls": [ + "bzz-raw://fd78b11b946d9001725a38844f1d6163906965ec321e1b09bd7e476baedc5d12", + "dweb:/ipfs/QmPgTnTYDbgXgwHXbkxofSH51QDFfycwx1tn8Qj5hGGk5u" + ] + }, + "@openzeppelin/contracts/governance/utils/IVotes.sol": { + "keccak256": "0x5e2b397ae88fd5c68e4f6762eb9f65f65c36702eb57796495f471d024ce70947", + "license": "MIT", + "urls": [ + "bzz-raw://348fc8e291d54314bb22437b532f443d5dbfb80c8cc9591567c1af6554ccf856", + "dweb:/ipfs/QmP8ZTyitZinxcpwAHeYHhwj7u21zPpKXSiww38V74sXC2" + ] + }, + "@openzeppelin/contracts/interfaces/IERC1271.sol": { + "keccak256": "0x85a45f3f10014a0f8be41157a32b6a5f905753ea64a4b64e29fc12b7deeecf39", + "license": "MIT", + "urls": [ + "bzz-raw://c3c74009ce36136b36c77c23935b8e4a7b4f253be2da2be4fb4a916b1ce43743", + "dweb:/ipfs/QmcH36v3iN7SJJuF73AunLR2LtNxhVJ1wm63ph4dPZ4pcL" + ] + }, + "@openzeppelin/contracts/interfaces/IERC165.sol": { + "keccak256": "0xde7e9fd9aee8d4f40772f96bb3b58836cbc6dfc0227014a061947f8821ea9724", + "license": "MIT", + "urls": [ + "bzz-raw://11fea9f8bc98949ac6709f0c1699db7430d2948137aa94d5a9e95a91f61a710a", + "dweb:/ipfs/QmQdfRXxQjwP6yn3DVo1GHPpriKNcFghSPi94Z1oKEFUNS" + ] + }, + "@openzeppelin/contracts/interfaces/IERC5267.sol": { + "keccak256": "0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92", + "license": "MIT", + "urls": [ + "bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a", + "dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP" + ] + }, + "@openzeppelin/contracts/interfaces/IERC5805.sol": { + "keccak256": "0x4b9b89f91adbb7d3574f85394754cfb08c5b4eafca8a7061e2094a019ab8f818", + "license": "MIT", + "urls": [ + "bzz-raw://7373d5dbb8eb2381aa0883a456fac89283fcaf52f42fa805d4188f270716742a", + "dweb:/ipfs/QmVnZDmT4ABvNhRJMaQnbCzsCA8HpyHPVaxi4fCi92LFv2" + ] + }, + "@openzeppelin/contracts/interfaces/IERC6372.sol": { + "keccak256": "0xeb2857b7dafb7e0d8526dbfe794e6c047df2851c9e6ee91dc4a55f3c34af5d33", + "license": "MIT", + "urls": [ + "bzz-raw://49bf13f6c2a38a9bcc7b852d4e2b9cebb4068b832642cce61069cdb5f06bb2fb", + "dweb:/ipfs/QmdKAJVE7rR2kENCZnEM1yKswrGii7WuE9gZpsQvnXJhwn" + ] + }, + "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol": { + "keccak256": "0xb69597a63b202e28401128bed6a6d259e8730191274471af7303eafb247881a3", + "license": "MIT", + "urls": [ + "bzz-raw://25addbda49a578b3318130585601344c5149a5549d749adf88e9685349a46b23", + "dweb:/ipfs/Qme2DuD8gpsve1ZvaSMQpBwMdpU7yAtekDwr7gUp8dX4zX" + ] + }, + "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol": { + "keccak256": "0xc26cd2e2bcf59b87c986fc653545b35010db9c585a3f3312fe61d7b1b3805735", + "license": "MIT", + "urls": [ + "bzz-raw://46fe54b0ac3ee60bdff012fae7d13c1171dff433aa4fdd356fd06ce46fbe711b", + "dweb:/ipfs/QmTTm6jBY6jQ6fx1cnCT4YepEV2aQvqLme5TSxuidfpf2q" + ] + }, + "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { + "keccak256": "0x7f7a26306c79a65fb8b3b6c757cd74660c532cd8a02e165488e30027dd34ca49", + "license": "MIT", + "urls": [ + "bzz-raw://d01e0b2b837ee2f628545e54d8715b49c7ef2befd08356c2e7f6c50dde8a1c22", + "dweb:/ipfs/QmWBAn6y2D1xgftci97Z3qR9tQnkvwQpYwFwkTvDMvqU4i" + ] + }, + "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol": { + "keccak256": "0xaad20f8713b5cd98114278482d5d91b9758f9727048527d582e8e88fd4901fd8", + "license": "MIT", + "urls": [ + "bzz-raw://5396e8dbb000c2fada59b7d2093b9c7c870fd09413ab0fdaba45d882959c6244", + "dweb:/ipfs/QmXQn5XckSiUsUBpMYuiFeqnojRX4rKa9jmgjCPeTuPmhh" + ] + }, + "@openzeppelin/contracts/utils/Address.sol": { + "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", + "license": "MIT", + "urls": [ + "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", + "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" + ] + }, + "@openzeppelin/contracts/utils/Context.sol": { + "keccak256": "0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2", + "license": "MIT", + "urls": [ + "bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12", + "dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF" + ] + }, + "@openzeppelin/contracts/utils/Nonces.sol": { + "keccak256": "0x0082767004fca261c332e9ad100868327a863a88ef724e844857128845ab350f", + "license": "MIT", + "urls": [ + "bzz-raw://132dce9686a54e025eb5ba5d2e48208f847a1ec3e60a3e527766d7bf53fb7f9e", + "dweb:/ipfs/QmXn1a2nUZMpu2z6S88UoTfMVtY2YNh86iGrzJDYmMkKeZ" + ] + }, + "@openzeppelin/contracts/utils/ShortStrings.sol": { + "keccak256": "0x18a7171df639a934592915a520ecb97c5bbc9675a1105607aac8a94e72bf62c6", + "license": "MIT", + "urls": [ + "bzz-raw://7478e1f13da69a2867ccd883001d836b75620362e743f196376d63ed0c422a1c", + "dweb:/ipfs/QmWywcQ9TNfwtoqAxbn25d8C5VrV12PrPS9UjtGe6pL2BA" + ] + }, + "@openzeppelin/contracts/utils/StorageSlot.sol": { + "keccak256": "0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418", + "license": "MIT", + "urls": [ + "bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c", + "dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR" + ] + }, + "@openzeppelin/contracts/utils/Strings.sol": { + "keccak256": "0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792", + "license": "MIT", + "urls": [ + "bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453", + "dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i" + ] + }, + "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "keccak256": "0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf", + "license": "MIT", + "urls": [ + "bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c", + "dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF" + ] + }, + "@openzeppelin/contracts/utils/cryptography/EIP712.sol": { + "keccak256": "0x999f705a027ed6dc2d4e0df2cc4a509852c6bfd11de1c8161bf88832d0503fd0", + "license": "MIT", + "urls": [ + "bzz-raw://0798def67258d9a3cc20b2b4da7ebf351a5cefe0abfdd665d2d81f8e32f89b21", + "dweb:/ipfs/QmPEvJosnPfzHNjKvCv2D3891mA2Ww8eUwkqrxBjuYdHCt" + ] + }, + "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol": { + "keccak256": "0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435", + "license": "MIT", + "urls": [ + "bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c", + "dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX" + ] + }, + "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol": { + "keccak256": "0x6b11eb41a228cca35d4b662b4df69fcd75192851365102690f57b2ac01e83fe6", + "license": "MIT", + "urls": [ + "bzz-raw://ab006a2983ed350d2af21ddcdd835dcae3b8340086cc4d088460da5abd041f69", + "dweb:/ipfs/QmbEacDhkJZiGrgzLjB4pNtE8Z1uudjDw1DvcDUTVQFsLG" + ] + }, + "@openzeppelin/contracts/utils/introspection/ERC165.sol": { + "keccak256": "0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133", + "license": "MIT", + "urls": [ + "bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8", + "dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA" + ] + }, + "@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", + "license": "MIT", + "urls": [ + "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", + "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" + ] + }, + "@openzeppelin/contracts/utils/math/Math.sol": { + "keccak256": "0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d", + "license": "MIT", + "urls": [ + "bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875", + "dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L" + ] + }, + "@openzeppelin/contracts/utils/math/SafeCast.sol": { + "keccak256": "0xe19a4d5f31d2861e7344e8e535e2feafb913d806d3e2b5fe7782741a2a7094fe", + "license": "MIT", + "urls": [ + "bzz-raw://4aed79c0fa6f0546ed02f2f683e8f77f0fd2ed7eb34d8bbf3d373c9a6d95b13c", + "dweb:/ipfs/QmWqVz6UAVqmnWU5pqYPt1o6iDEZyPaBraAA3rKfTTSfYj" + ] + }, + "@openzeppelin/contracts/utils/math/SignedMath.sol": { + "keccak256": "0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72", + "license": "MIT", + "urls": [ + "bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc", + "dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT" + ] + }, + "@openzeppelin/contracts/utils/structs/Checkpoints.sol": { + "keccak256": "0xbdc5e074d7dd6678f67e92b1a51a20226801a407b0e1af3da367c5d1ff4519ad", + "license": "MIT", + "urls": [ + "bzz-raw://a36cca6b22fff3db16fc789ff6c60eea71d4b156065d4d0c83a0bc5e91a77a8b", + "dweb:/ipfs/QmYN3exd5AemxjBrN8XMB1p5LbbE16uC3sjbYjwi8AjcGR" + ] + }, + "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol": { + "keccak256": "0xed6b702230a66640a0f1dd96106dd697e821b6b0fbb2eeab1c09d88d7c411a67", + "license": "MIT", + "urls": [ + "bzz-raw://766996a7c9fb936ae08fc451c6bf6c3a9b49aca26002fb76c7fd1833fca459d8", + "dweb:/ipfs/QmaFKhhPJCNxESLDoio7aR2KSvi4Y8YKirrb9tu4LM1vDp" + ] + }, + "@openzeppelin/contracts/utils/types/Time.sol": { + "keccak256": "0xc7755af115020049e4140f224f9ee88d7e1799ffb0646f37bf0df24bf6213f58", + "license": "MIT", + "urls": [ + "bzz-raw://7f09bf94d5274334ec021f61a04659db303f31e60460e14b709c9bf187740111", + "dweb:/ipfs/QmNvgomZYUwFAt4cZbPWAiTeSZQreGehY9BK5xyVJsUttb" + ] + }, + "contracts/Dao.sol": { + "keccak256": "0x48040ad90460a4a96ce52afdc9f1770d90110395bde9283f2e57d07e7bb107a4", + "license": "MIT", + "urls": [ + "bzz-raw://eb09814f0c3253bac4add6c634c9e9a69ef935b25b6e10b2395a68abf5e969ce", + "dweb:/ipfs/QmamHVNMP9HbSo7QGFkR5HfN72nJc8PRv5rBaWf6soEunb" + ] + } + }, + "version": 1 +} \ No newline at end of file diff --git a/src/services/contracts/baseDAO/hooks/useOriginate.ts b/src/services/contracts/baseDAO/hooks/useOriginate.ts index 2f0ec66c..95823806 100644 --- a/src/services/contracts/baseDAO/hooks/useOriginate.ts +++ b/src/services/contracts/baseDAO/hooks/useOriginate.ts @@ -14,6 +14,10 @@ import { getSignature } from "services/lite/utils" import { saveLiteCommunity } from "services/services/lite/lite-services" import { Community } from "models/Community" import { EnvKey, getEnv } from "services/config" +import HomebaseDaoEvm from "assets/abis/hb_dao.json" + +const ERC20_ABI = HomebaseDaoEvm.output.abi +const ERC20_BYTECODE = HomebaseDaoEvm.output.bytecode const INITIAL_STATES = [ { @@ -74,7 +78,9 @@ export const useOriginate = (template: DAOTemplate) => { const [states, setStates] = useState(INITIAL_STATES) const [activeState, setActiveState] = useState() - const { tezos, connect, network, account, wallet } = useTezos() + const { tezos, connect, network, account, wallet, etherlink } = useTezos() + const provider = etherlink.provider + const signer = etherlink.signer const result = useMutation, Error, OriginateParams>( async ({ metadataParams, params, deploymentMethod }) => { @@ -82,6 +88,9 @@ export const useOriginate = (template: DAOTemplate) => { let contract + if (network.startsWith("etherlink")) { + console.log("Deploying on Etherlink") + } if (deploymentMethod === "managed") { const deployParams: any = { params: { ...params }, From 1c591fb389ee0272d7452bd2c5fb61db0c457705 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Tue, 10 Dec 2024 03:03:23 +0530 Subject: [PATCH 19/36] WIP - OnChain DAOs on Etherlink --- package.json | 1 + src/components/ui/ContentContainer.tsx | 6 + src/components/ui/CopyButton.tsx | 28 + src/components/ui/DaoExplorer.tsx | 35 + src/components/ui/HeroContainer.tsx | 9 + src/components/ui/StyledAvatar.tsx | 6 + src/components/ui/SubtitleText.tsx | 23 + src/components/ui/TitleText.tsx | 23 + src/components/ui/ViewSettings.tsx | 10 + .../etherlink/components/EvmMembersTable.tsx | 236 ++++++ .../etherlink/components/EvmNotFound.tsx | 12 + .../etherlink/components/EvmNotIndexed.tsx | 17 + .../explorer/EtherlinkDAO/EvmMembersPage.tsx | 28 + .../EtherlinkDAO/EvmProposalDetailsPage.tsx | 3 + .../EtherlinkDAO/EvmProposalsPage.tsx | 5 + .../explorer/EtherlinkDAO/EvmRegistryPage.tsx | 5 + .../explorer/EtherlinkDAO/EvmUserPage.tsx | 3 + src/modules/etherlink/explorer/index.tsx | 179 +++++ src/modules/etherlink/explorer/router.tsx | 117 +++ .../explorer/components/ContentContainer.tsx | 1 + .../explorer/components/DAOStatsRow.tsx | 2 +- .../explorer/components/NavigationMenu.tsx | 90 ++- src/modules/explorer/pages/DAO/index.tsx | 6 - .../pages/DAOList/components/DAOItem.tsx | 9 +- src/modules/explorer/pages/DAOList/index.tsx | 9 +- .../explorer/pages/Proposals/index.tsx | 2 +- src/modules/explorer/router.tsx | 4 + .../explorer/components/ContentContainer.tsx | 1 + .../contracts/etherlinkDAO/firebase-config.ts | 14 + .../etherlinkDAO/hooks/useFirestoreStore.tsx | 121 +++ src/services/services/dao/hooks/useAllDAOs.ts | 26 +- src/services/services/dao/hooks/useDAO.ts | 184 +++-- .../services/dao/hooks/useProposals.ts | 13 +- src/services/wagmi/context.tsx | 52 ++ src/utils.ts | 13 + yarn.lock | 722 +++++++++++++----- 36 files changed, 1688 insertions(+), 327 deletions(-) create mode 100644 src/components/ui/ContentContainer.tsx create mode 100644 src/components/ui/CopyButton.tsx create mode 100644 src/components/ui/DaoExplorer.tsx create mode 100644 src/components/ui/HeroContainer.tsx create mode 100644 src/components/ui/StyledAvatar.tsx create mode 100644 src/components/ui/SubtitleText.tsx create mode 100644 src/components/ui/TitleText.tsx create mode 100644 src/components/ui/ViewSettings.tsx create mode 100644 src/modules/etherlink/components/EvmMembersTable.tsx create mode 100644 src/modules/etherlink/components/EvmNotFound.tsx create mode 100644 src/modules/etherlink/components/EvmNotIndexed.tsx create mode 100644 src/modules/etherlink/explorer/EtherlinkDAO/EvmMembersPage.tsx create mode 100644 src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx create mode 100644 src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalsPage.tsx create mode 100644 src/modules/etherlink/explorer/EtherlinkDAO/EvmRegistryPage.tsx create mode 100644 src/modules/etherlink/explorer/EtherlinkDAO/EvmUserPage.tsx create mode 100644 src/modules/etherlink/explorer/index.tsx create mode 100644 src/modules/etherlink/explorer/router.tsx create mode 100644 src/services/contracts/etherlinkDAO/firebase-config.ts create mode 100644 src/services/contracts/etherlinkDAO/hooks/useFirestoreStore.tsx diff --git a/package.json b/package.json index 7fd883c8..6ac75407 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "dayjs": "^1.11.11", "ethers": "^6.13.1", "export-to-csv": "^1.2.4", + "firebase": "11.0.2", "formik": "^2.2.6", "formik-material-ui": "^3.0.1", "graphql": "^15.5.1", diff --git a/src/components/ui/ContentContainer.tsx b/src/components/ui/ContentContainer.tsx new file mode 100644 index 00000000..1cb088d1 --- /dev/null +++ b/src/components/ui/ContentContainer.tsx @@ -0,0 +1,6 @@ +import { styled, Grid } from "@material-ui/core" + +export const ContentContainer = styled(Grid)(({ theme }) => ({ + borderRadius: 8, + background: theme.palette.primary.main +})) diff --git a/src/components/ui/CopyButton.tsx b/src/components/ui/CopyButton.tsx new file mode 100644 index 00000000..bc827656 --- /dev/null +++ b/src/components/ui/CopyButton.tsx @@ -0,0 +1,28 @@ +import React, { useState } from "react" +import { Box, Tooltip, styled } from "@material-ui/core" +import { ReactComponent as CopyIcon } from "assets/img/copy_icon.svg" + +const TooltipButton = styled(Tooltip)({ + cursor: "pointer" +}) + +export const CopyButton: React.FC<{ text: string }> = ({ text }) => { + const [copied, setCopied] = useState(false) + return ( + { + navigator.clipboard.writeText(text) + setCopied(true) + + setTimeout(() => { + setCopied(false) + }, 2000) + }} + > + + + + + ) +} diff --git a/src/components/ui/DaoExplorer.tsx b/src/components/ui/DaoExplorer.tsx new file mode 100644 index 00000000..01e4d8db --- /dev/null +++ b/src/components/ui/DaoExplorer.tsx @@ -0,0 +1,35 @@ +import { + Box, + Grid, + Paper, + Step, + StepLabel, + Stepper, + TextareaAutosize, + Typography, + styled, + withStyles, + withTheme +} from "@material-ui/core" + +const PageLayout = styled("div")(({ theme }) => ({ + background: theme.palette.primary.dark, + width: "1000px", + margin: "42px auto 0px auto", + + ["@media (max-width: 1425px)"]: {}, + + ["@media (max-width:1335px)"]: {}, + + ["@media (max-width:1167px)"]: { + width: "86vw" + }, + + ["@media (max-width:1030px)"]: {}, + + ["@media (max-width:960px)"]: { + marginTop: 0 + } +})) + +export { PageLayout } diff --git a/src/components/ui/HeroContainer.tsx b/src/components/ui/HeroContainer.tsx new file mode 100644 index 00000000..acc927a2 --- /dev/null +++ b/src/components/ui/HeroContainer.tsx @@ -0,0 +1,9 @@ +import { styled } from "@material-ui/core" +import { ContentContainer } from "./ContentContainer" + +export const HeroContainer = styled(ContentContainer)(({ theme }) => ({ + padding: 38, + [theme.breakpoints.down("sm")]: { + width: "inherit" + } +})) diff --git a/src/components/ui/StyledAvatar.tsx b/src/components/ui/StyledAvatar.tsx new file mode 100644 index 00000000..10b5199c --- /dev/null +++ b/src/components/ui/StyledAvatar.tsx @@ -0,0 +1,6 @@ +import { Avatar, styled } from "@material-ui/core" + +export const StyledAvatar = styled(Avatar)({ + height: 50, + width: 50 +}) diff --git a/src/components/ui/SubtitleText.tsx b/src/components/ui/SubtitleText.tsx new file mode 100644 index 00000000..a6ad2b46 --- /dev/null +++ b/src/components/ui/SubtitleText.tsx @@ -0,0 +1,23 @@ +import { styled, Typography } from "@material-ui/core" + +export const SubtitleText = styled(Typography)(({ theme }) => ({ + fontSize: 18, + color: theme.palette.primary.light, + width: "875px", + fontWeight: 300, + maxHeight: "200px", + overflowY: "scroll", + + ["@media (max-width:1166px)"]: { + width: "75.3vw" + }, + + ["@media (max-width:1138px)"]: { + width: "100%" + }, + + ["@media (max-width:599.98px)"]: { + width: "100%", + margin: "-15px auto 0 auto" + } +})) diff --git a/src/components/ui/TitleText.tsx b/src/components/ui/TitleText.tsx new file mode 100644 index 00000000..0858c22a --- /dev/null +++ b/src/components/ui/TitleText.tsx @@ -0,0 +1,23 @@ +import { styled, Typography } from "@material-ui/core" + +export const TitleText = styled(Typography)(({ theme }) => ({ + fontSize: 36, + fontWeight: 600, + lineHeight: 0.8, + + ["@media (max-width:642px)"]: { + fontSize: 35 + }, + + ["@media (max-width:583px)"]: { + fontSize: 30 + }, + + ["@media (max-width:533px)"]: { + fontSize: 25 + }, + + ["@media (max-width:462px)"]: { + fontSize: 22 + } +})) diff --git a/src/components/ui/ViewSettings.tsx b/src/components/ui/ViewSettings.tsx new file mode 100644 index 00000000..1f94c18f --- /dev/null +++ b/src/components/ui/ViewSettings.tsx @@ -0,0 +1,10 @@ +import { Grid, styled } from "@material-ui/core" + +export const ViewSettings = styled(Grid)({ + "fontWeight": 300, + "gap": 8, + "cursor": "pointer", + "& h6": { + fontWeight: 300 + } +}) diff --git a/src/modules/etherlink/components/EvmMembersTable.tsx b/src/modules/etherlink/components/EvmMembersTable.tsx new file mode 100644 index 00000000..01889ff0 --- /dev/null +++ b/src/modules/etherlink/components/EvmMembersTable.tsx @@ -0,0 +1,236 @@ +import React, { useState } from "react" +import { styled, Grid, Typography, useTheme, useMediaQuery } from "@material-ui/core" +import dayjs from "dayjs" +import { Blockie } from "modules/common/Blockie" +import { CopyButton } from "components/ui/CopyButton" +import { toShortAddress } from "services/contracts/utils" +import numbro from "numbro" +import ReactPaginate from "react-paginate" + +const localizedFormat = require("dayjs/plugin/localizedFormat") +dayjs.extend(localizedFormat) + +interface RowData { + address: string + votingWeight: string + personalBalance: string + proposalsVoted: any[] + proposalsCreated: any[] +} + +const CardContainer = styled(Grid)(({ theme }) => ({ + background: theme.palette.primary.main, + padding: "40px 48px", + borderRadius: 8 +})) + +const Value = styled(Typography)({ + marginTop: 8, + fontWeight: 300, + gap: 6, + display: "flex", + textTransform: "uppercase" +}) + +const Symbol = styled(Typography)({ + marginLeft: 4, + fontWeight: 300 +}) + +const formatConfig = { + average: true, + mantissa: 1, + thousandSeparated: true, + trimMantissa: true +} + +interface UserTable { + data: RowData[] + symbol: string + handlePageClick: (event: { selected: number }) => void + pageCount: number + currentPage: number + offset: number +} + +const MobileUsersTable: React.FC = ({ data, symbol, handlePageClick, pageCount, currentPage, offset }) => { + return ( + <> + + {data.slice(offset, offset + 8).map((item, i) => ( + + + + + {toShortAddress(item.address)} + + + + + + + Voting Weight + + + {numbro(item.votingWeight).format(formatConfig)} + + + + + Personal Balance + + + {numbro(item.personalBalance).format(formatConfig)} + + + + + Proposals Created + + + {numbro(item.proposalsCreated?.length).format(formatConfig)} + {symbol} + + + + + Proposals Voted + + + {numbro(item.proposalsVoted?.length).format(formatConfig)} + {symbol} + + + + + ))} + + + + + + ) +} + +const DesktopUsersTable: React.FC = ({ data, symbol, handlePageClick, pageCount, currentPage, offset }) => { + return ( + <> + + {data.slice(offset, offset + 8).map((item, i) => ( + + + + + {item.address} + + + + + + + Voting Weight + + + {numbro(item.votingWeight).format(formatConfig)} + + + + + Personal Balance + + + {numbro(item.personalBalance).format(formatConfig)} + + + + + Proposals Created + + + {numbro(item.proposalsCreated?.length).format(formatConfig)} + {symbol} + + + + + Proposals Voted + + + {numbro(item.proposalsVoted?.length).format(formatConfig)} + {symbol} + + + + + ))} + + + + + + + ) +} + +export const EvmMembersTable: React.FC<{ data: RowData[]; symbol: string }> = ({ data, symbol }) => { + const theme = useTheme() + const isExtraSmall = useMediaQuery(theme.breakpoints.down(820)) + const [currentPage, setCurrentPage] = useState(0) + const [offset, setOffset] = useState(0) + const pageCount = Math.ceil(data ? data.length / 8 : 0) + + // Invoke when user click to request another page. + const handlePageClick = (event: { selected: number }) => { + if (data) { + const newOffset = (event.selected * 8) % data.length + setOffset(newOffset) + setCurrentPage(event.selected) + } + } + + return isExtraSmall ? ( + + ) : ( + + ) +} diff --git a/src/modules/etherlink/components/EvmNotFound.tsx b/src/modules/etherlink/components/EvmNotFound.tsx new file mode 100644 index 00000000..d6e2a19c --- /dev/null +++ b/src/modules/etherlink/components/EvmNotFound.tsx @@ -0,0 +1,12 @@ +import { Box, Typography } from "@material-ui/core" +import React from "react" + +export const EvmNotFound: React.FC = () => { + return ( + + + 404 Not Found + + + ) +} diff --git a/src/modules/etherlink/components/EvmNotIndexed.tsx b/src/modules/etherlink/components/EvmNotIndexed.tsx new file mode 100644 index 00000000..745ea132 --- /dev/null +++ b/src/modules/etherlink/components/EvmNotIndexed.tsx @@ -0,0 +1,17 @@ +import { Box, styled, Theme, Typography } from "@material-ui/core" +import React from "react" + +const SecondaryText = styled("span")(({ theme }: { theme: Theme }) => ({ + color: theme.palette.secondary.main +})) + +export const EvmNotIndexed: React.FC<{ address: string }> = ({ address }) => { + return ( + + + Your DAO with address:
{address}
is currently being{" "} + indexed and will be available in a few minutes +
+
+ ) +} diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmMembersPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmMembersPage.tsx new file mode 100644 index 00000000..deb8e0f9 --- /dev/null +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmMembersPage.tsx @@ -0,0 +1,28 @@ +import { Grid } from "@mui/material" +import { TitleText } from "components/ui/TitleText" +import { EvmMembersTable } from "modules/etherlink/components/EvmMembersTable" +import { EtherlinkContext } from "services/wagmi/context" +import { useContext } from "react" + +export const EvmMembersPage = () => { + const { daoMembers } = useContext(EtherlinkContext) + const daoMemberData = daoMembers?.map((member: any) => ({ + address: member.address, + votingWeight: member.votingWeight, + personalBalance: member.personalBalance, + proposalsCreated: member.proposalsCreated, + proposalsVoted: member.proposalsVoted + })) + console.log("daoMemberData", daoMemberData, daoMembers) + return ( + + + Members + + + + + + + ) +} diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx new file mode 100644 index 00000000..a6732bd8 --- /dev/null +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx @@ -0,0 +1,3 @@ +export const EvmProposalDetailsPage = () => { + return
Proposal Details
+} diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalsPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalsPage.tsx new file mode 100644 index 00000000..ed9f917b --- /dev/null +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalsPage.tsx @@ -0,0 +1,5 @@ +import { EtherlinkProposals } from "modules/explorer/pages/Proposals" + +export const EvmProposalsPage = () => { + return +} diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmRegistryPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmRegistryPage.tsx new file mode 100644 index 00000000..adb69a58 --- /dev/null +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmRegistryPage.tsx @@ -0,0 +1,5 @@ +import { Registry } from "modules/explorer/pages/Registry" + +export const EvmRegistryPage = () => { + return +} diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmUserPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmUserPage.tsx new file mode 100644 index 00000000..f4c565f1 --- /dev/null +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmUserPage.tsx @@ -0,0 +1,3 @@ +export const EvmUserPage = () => { + return
User
+} diff --git a/src/modules/etherlink/explorer/index.tsx b/src/modules/etherlink/explorer/index.tsx new file mode 100644 index 00000000..c95b8594 --- /dev/null +++ b/src/modules/etherlink/explorer/index.tsx @@ -0,0 +1,179 @@ +import React, { useMemo, useState } from "react" +import { Grid, styled, Typography, Button, useTheme, useMediaQuery, Avatar } from "@material-ui/core" + +import { useDAO } from "services/services/dao/hooks/useDAO" +import { useEtherlinkDAOID } from "./router" + +// import { ContentContainer } from "../../components/ContentContainer" +// import { DAOStatsRow } from "../../components/DAOStatsRow" +// import { UsersTable } from "../../components/UsersTable" +import BigNumber from "bignumber.js" +import { SmallButton } from "../../common/SmallButton" + +// import { DaoSettingModal } from "./components/Settings" +import SettingsIcon from "@mui/icons-material/Settings" +// import { SettingsDialog } from "./components/SettingsDialog" +import { IconButton } from "@mui/material" +import { FileCopyOutlined } from "@material-ui/icons" +import { HeroContainer } from "components/ui/HeroContainer" +// import { TitleText } from "components/ui/TitleText" +import { ViewSettings } from "components/ui/ViewSettings" +import { SubtitleText } from "components/ui/SubtitleText" +import { TitleText } from "components/ui/TitleText" +import { DAOStatsRowEtherlink } from "modules/explorer/components/DAOStatsRow" + +export const EtherlinkDAOOverview: React.FC = () => { + const daoId = useEtherlinkDAOID() + const { data, cycleInfo, ledger } = useDAO(daoId) + + console.log("explorer/index.tsx", data) + const theme = useTheme() + const isExtraSmall = useMediaQuery(theme.breakpoints.down("xs")) + const symbol = (data && data.data.token?.symbol?.toUpperCase()) || "Unknown" + + const name = data && data.data.name + const description = data && data.data.description + + const [openDialog, setOpenDialog] = useState(false) + const [openChangeDialog, setChangeOpenDialog] = useState(false) + + const handleCloseModal = () => { + setOpenDialog(false) + } + + const handleCloseChangeModal = () => { + setChangeOpenDialog(false) + } + + const usersTableData = useMemo(() => { + if (data?.data?.meta?.users) { + return data.data.meta.users + } + + if (!ledger || !cycleInfo || !data) { + return [] + } + + return ledger + .sort((a, b) => b.available_balance.minus(a.available_balance).toNumber()) + .map(p => ({ + address: p.holder.address, + totalStaked: new BigNumber(p.total_balance).dp(10, 1).toString(), + availableStaked: new BigNumber(p.available_balance).dp(10, 1).toString(), + votes: p.holder.votes_cast.toString(), + proposalsVoted: p.holder.proposals_voted.toString() + })) + }, [cycleInfo, data, ledger]) + + console.log({ usersTableData }) + + return ( + + + + + + + {name} + + + setOpenDialog(true)}> + + + View Settings + + + {/* */} + + + setChangeOpenDialog(true)}> + Change Settings + + {/* */} + + + + + {data?.data.network?.startsWith("etherlink") ? ( + <> + + + + DAO Contract + + + {data?.data.address || "-"} + { + if (data?.data.address) { + navigator.clipboard.writeText(data.data.address) + } + }} + size="small" + style={{ marginLeft: "8px", color: theme.palette.primary.light }} + > + + + + + + + Governance Token + + + {data?.data.token.symbol || "-"} + { + if (data?.data.token.symbol) { + navigator.clipboard.writeText(data.data.token.symbol) + } + }} + size="small" + style={{ marginLeft: "8px" }} + > + + + + + + {description} + + +
+ + ) : ( + {description} + )} +
+
+
+ + + + {/* */} + +
+ ) +} diff --git a/src/modules/etherlink/explorer/router.tsx b/src/modules/etherlink/explorer/router.tsx new file mode 100644 index 00000000..2be65153 --- /dev/null +++ b/src/modules/etherlink/explorer/router.tsx @@ -0,0 +1,117 @@ +import React, { useContext, useEffect, useState } from "react" +import { Redirect, Route, RouteProps, Switch, useParams, useRouteMatch } from "react-router-dom" +import { useHistory } from "react-router" + +import { EvmNotFound } from "modules/etherlink/components/EvmNotFound" +import { EvmNotIndexed } from "modules/etherlink/components/EvmNotIndexed" +import { EtherlinkDAOOverview } from "./index" + +import { Network } from "services/beacon" +import { useTezos } from "services/beacon/hooks/useTezos" +import { useDAO } from "services/services/dao/hooks/useDAO" +import { PageLayout } from "components/ui/DaoExplorer" +import { Navbar } from "modules/explorer/components/Toolbar" +import { EvmProposalsPage } from "./EtherlinkDAO/EvmProposalsPage" +import { EvmMembersPage } from "./EtherlinkDAO/EvmMembersPage" +import { EvmRegistryPage } from "./EtherlinkDAO/EvmRegistryPage" +import { EvmProposalDetailsPage } from "./EtherlinkDAO/EvmProposalDetailsPage" +import { EvmUserPage } from "./EtherlinkDAO/EvmUserPage" + +enum DAOState { + NOT_FOUND = 0, + NOT_INDEXED = 1, + FOUND = 2 +} + +const EtherlinkDAORouteContent: React.FC = ({ children }) => { + const daoId = useEtherlinkDAOID() + const { tezos, network, changeNetwork } = useTezos() + const { data, isLoading, error } = useDAO(daoId) + const [state, setState] = useState(DAOState.FOUND) + const history = useHistory() + + console.log("etherlink/router.tsx", { daoId, isLoading, data }) + + useEffect(() => { + ;(async () => { + if (!data && !!error && !isLoading) { + try { + await tezos.contract.at(daoId) + setState(DAOState.NOT_INDEXED) + } catch (e) { + setState(DAOState.NOT_FOUND) + } + } + })() + }, [data, error, daoId, tezos.contract, isLoading]) + + useEffect(() => { + if (history && data && data.data.network.toLowerCase() !== network.toLowerCase()) { + changeNetwork(data.data.network.toLowerCase() as Network) + } + }, [data, history, network, changeNetwork]) + + return ( + <> + {state === DAOState.NOT_FOUND ? ( + + ) : state === DAOState.NOT_INDEXED ? ( + + ) : ( + children + )} + + ) +} + +const EtherlinkDAORoute: React.FC = ({ children, ...props }) => { + return ( + + {children} + + ) +} + +const EtherlinkDAOContext = React.createContext("") + +const EtherlinkDAOProvider: React.FC<{ daoId: string }> = ({ daoId, children }) => { + return {children} +} + +export const useEtherlinkDAOID = () => { + return useContext(EtherlinkDAOContext) +} + +export const EtherlinkDAORouter = (): JSX.Element => { + const match = useRouteMatch() + const { id: daoId } = useParams<{ id: string }>() + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} diff --git a/src/modules/explorer/components/ContentContainer.tsx b/src/modules/explorer/components/ContentContainer.tsx index 76fdc40b..37d19228 100644 --- a/src/modules/explorer/components/ContentContainer.tsx +++ b/src/modules/explorer/components/ContentContainer.tsx @@ -1,3 +1,4 @@ +// TODO: Replace usage with components/ui/ContentContainer import { styled, Grid } from "@material-ui/core" export const ContentContainer = styled(Grid)(({ theme }) => ({ diff --git a/src/modules/explorer/components/DAOStatsRow.tsx b/src/modules/explorer/components/DAOStatsRow.tsx index 38b9706f..4c3acd71 100644 --- a/src/modules/explorer/components/DAOStatsRow.tsx +++ b/src/modules/explorer/components/DAOStatsRow.tsx @@ -202,7 +202,7 @@ const DAOStatsRowTezos = () => { ) } -const DAOStatsRowEtherlink = () => { +export const DAOStatsRowEtherlink = () => { const daoId = useDAOID() const { data } = useDAO(daoId) const daoStats = data?.data?.etherlink?.stats diff --git a/src/modules/explorer/components/NavigationMenu.tsx b/src/modules/explorer/components/NavigationMenu.tsx index 44013627..dfdb95f7 100644 --- a/src/modules/explorer/components/NavigationMenu.tsx +++ b/src/modules/explorer/components/NavigationMenu.tsx @@ -14,13 +14,15 @@ import { ReactComponent as VotingIcon } from "assets/logos/voting.svg" import { ReactComponent as TreasuryIcon } from "assets/logos/treasury.svg" import { ReactComponent as RegistryIcon } from "assets/logos/list.svg" import { ReactComponent as UserIcon } from "assets/logos/user.svg" -import React, { useEffect, useState } from "react" +import React, { useContext, useEffect, useState } from "react" import { useDAOID } from "../pages/DAO/router" import { useDAO } from "services/services/dao/hooks/useDAO" import { useTezos } from "services/beacon/hooks/useTezos" import { useLocation } from "react-router" import { Link } from "react-router-dom" import { debounce } from "../utils/debounce" +import { EtherlinkContext } from "services/wagmi/context" +import { useEtherlinkDAOID } from "modules/etherlink/explorer/router" const Container = styled(Grid)(({ theme }) => ({ width: "100%", @@ -148,38 +150,51 @@ interface Page { href: string } -const getPages = (daoId: string): Page[] => [ - { - pathId: "overview", - name: "Home", - icon: HouseIcon, - href: `/explorer/dao/${daoId}` - }, - { - pathId: "proposals", - name: "Proposals", - icon: VotingIcon, - href: `/explorer/dao/${daoId}/proposals` - }, - { - pathId: "treasury", - name: "Treasury", - icon: TreasuryIcon, - href: `/explorer/dao/${daoId}/treasury` - }, - { - pathId: "registry", - name: "Registry", - icon: RegistryIcon, - href: `/explorer/dao/${daoId}/registry` - }, - { - pathId: "user", - name: "User", - icon: UserIcon, - href: `/explorer/dao/${daoId}/user` +const getPages = (daoId: string, etherlinkDaoSelected: boolean): Page[] => { + const defaultPages = [ + { + pathId: "overview", + name: "Home", + icon: HouseIcon, + href: etherlinkDaoSelected ? `/explorer/etherlink/dao/${daoId}` : `/explorer/dao/${daoId}` + }, + { + pathId: "proposals", + name: "Proposals", + icon: VotingIcon, + href: etherlinkDaoSelected ? `/explorer/etherlink/dao/${daoId}/proposals` : `/explorer/dao/${daoId}/proposals` + }, + { + pathId: "treasury", + name: "Treasury", + icon: TreasuryIcon, + href: etherlinkDaoSelected ? `/explorer/etherlink/dao/${daoId}/treasury` : `/explorer/dao/${daoId}/treasury` + }, + { + pathId: "registry", + name: "Registry", + icon: RegistryIcon, + href: etherlinkDaoSelected ? `/explorer/etherlink/dao/${daoId}/registry` : `/explorer/dao/${daoId}/registry` + }, + { + pathId: "user", + name: "User", + icon: UserIcon, + href: etherlinkDaoSelected ? `/explorer/etherlink/dao/${daoId}/user` : `/explorer/dao/${daoId}/user` + } + ] + + if (etherlinkDaoSelected) { + defaultPages.splice(defaultPages.length - 1, 0, { + pathId: "members", + name: "Members", + icon: UserIcon, + href: `/explorer/etherlink/dao/${daoId}/members` + }) } -] + + return defaultPages +} const styles = makeStyles(theme => ({ explorer: { @@ -239,6 +254,7 @@ export const NavigationMenu: React.FC<{ disableMobileMenu?: boolean }> = ({ disa const [pages, setPages] = useState([]) const { account } = useTezos() const daoId = useDAOID() + const etherlinkDaoId = useEtherlinkDAOID() const { data: dao } = useDAO(daoId) const path = useLocation() const pathId = path.pathname.split("/").slice(-1)[0] @@ -246,18 +262,24 @@ export const NavigationMenu: React.FC<{ disableMobileMenu?: boolean }> = ({ disa const isMobileSmall = useMediaQuery(theme.breakpoints.down(960)) const classes = styles() const location = useLocation() + const { daoSelected: etherlinkDaoSelected } = useContext(EtherlinkContext) useEffect(() => { if (dao) { const disabledPages: string[] = [] + const isEtherlink = !!etherlinkDaoSelected?.id if (!account) { disabledPages.push("User") } - setPages(getPages(daoId).filter(page => !disabledPages.includes(page.name))) + if (isEtherlink) { + disabledPages.push("Treasury") + } + + setPages(getPages(daoId || etherlinkDaoId, isEtherlink).filter(page => !disabledPages.includes(page.name))) } - }, [account, dao, daoId]) + }, [account, dao, daoId, etherlinkDaoId, etherlinkDaoSelected]) return !isMobileSmall || disableMobileMenu ? ( diff --git a/src/modules/explorer/pages/DAO/index.tsx b/src/modules/explorer/pages/DAO/index.tsx index 8483a347..d62b2121 100644 --- a/src/modules/explorer/pages/DAO/index.tsx +++ b/src/modules/explorer/pages/DAO/index.tsx @@ -1,20 +1,14 @@ import React, { useMemo, useState } from "react" import { Grid, styled, Typography, Button, useTheme, useMediaQuery, Avatar } from "@material-ui/core" -import { useFlush } from "services/contracts/baseDAO/hooks/useFlush" import { useDAO } from "services/services/dao/hooks/useDAO" -import { useProposals } from "services/services/dao/hooks/useProposals" import { useDAOID } from "./router" import { ContentContainer } from "../../components/ContentContainer" -import { ProposalsList } from "../../components/ProposalsList" -import { ProposalStatus } from "services/services/dao/mappers/proposal/types" import { DAOStatsRow } from "../../components/DAOStatsRow" import { UsersTable } from "../../components/UsersTable" import BigNumber from "bignumber.js" import { SmallButton } from "../../../common/SmallButton" -import { usePolls } from "modules/lite/explorer/hooks/usePolls" -import dayjs from "dayjs" import { DaoSettingModal } from "./components/Settings" import SettingsIcon from "@mui/icons-material/Settings" import { SettingsDialog } from "./components/SettingsDialog" diff --git a/src/modules/explorer/pages/DAOList/components/DAOItem.tsx b/src/modules/explorer/pages/DAOList/components/DAOItem.tsx index 3de2f799..7579a909 100644 --- a/src/modules/explorer/pages/DAOList/components/DAOItem.tsx +++ b/src/modules/explorer/pages/DAOList/components/DAOItem.tsx @@ -4,6 +4,7 @@ import { EnvKey, getEnv } from "services/config" import ReactHtmlParser from "react-html-parser" import { formatNumber } from "modules/explorer/utils/FormatNumber" import BigNumber from "bignumber.js" +import { getDaoHref } from "utils" const Container = styled(Grid)(({ theme }: { theme: Theme }) => ({ "background": theme.palette.primary.main, @@ -122,13 +123,8 @@ export const DAOItem: React.FC<{ description: string } }> = ({ dao }) => { - const theme = useTheme() const daoType = dao.dao_type.name - const daoRouteIfLambda = daoType === "lambda" ? `dao/${dao.id}` : `lite/dao/${dao.id}` - const daoHref = - daoType !== "lambda" && daoType !== "lite" - ? `${getEnv(EnvKey.REACT_APP_V2_URL)}/explorer/dao/${dao.id}` - : daoRouteIfLambda + const daoHref = getDaoHref(dao.id, daoType) return ( @@ -141,6 +137,7 @@ export const DAOItem: React.FC<{ {daoType === "lambda" ? V3 : null} {daoType === "registry" || daoType === "treasury" ? V2 : null} {daoType === "lite" ? Lite : null} + {daoType === "etherlink_onchain" ? V4 : null}
diff --git a/src/modules/explorer/pages/DAOList/index.tsx b/src/modules/explorer/pages/DAOList/index.tsx index e75f56a3..e9cde4f1 100644 --- a/src/modules/explorer/pages/DAOList/index.tsx +++ b/src/modules/explorer/pages/DAOList/index.tsx @@ -117,6 +117,7 @@ export const DAOList: React.FC = () => { const { network, account, etherlink } = useTezos() const { data: daos, isLoading } = useAllDAOs(network) + console.log({ daos }) const theme = useTheme() const isMobileExtraSmall = useMediaQuery(theme.breakpoints.down("xs")) const isMobileSmall = useMediaQuery(theme.breakpoints.down("mobile")) @@ -139,8 +140,8 @@ export const DAOList: React.FC = () => { name: dao.name, description: dao.description, symbol: dao.token.symbol, - votingAddresses: dao.ledgers ? dao.ledgers.map(l => l.holder.address) : [], - votingAddressesCount, + votingAddresses: dao.ledgers?.map((l: { holder: { address: any } }) => l.holder.address) || [], + votingAddressesCount: votingAddressesCount || dao.holders_count || 0, dao_type: { name: dao.dao_type.name }, @@ -172,7 +173,7 @@ export const DAOList: React.FC = () => { id: dao.address, name: dao.name, symbol: dao.token.symbol, - votingAddresses: dao.ledgers ? dao.ledgers.map(l => l.holder.address) : [], + votingAddresses: dao.ledgers ? dao.ledgers.map((l: { holder: { address: any } }) => l.holder.address) : [], votingAddressesCount: dao.dao_type.name === "lite" ? dao.votingAddressesCount : dao.ledgers ? dao.ledgers?.length : 0, dao_type: { @@ -197,8 +198,6 @@ export const DAOList: React.FC = () => { return [] }, [daos, searchText, account, etherlink?.account?.address]) - console.log({ daos, currentDAOs, myDAOs }) - const filterDAOs = (filter: string) => { setSearchText(filter.trim()) } diff --git a/src/modules/explorer/pages/Proposals/index.tsx b/src/modules/explorer/pages/Proposals/index.tsx index 7e32fef1..483e5e5b 100644 --- a/src/modules/explorer/pages/Proposals/index.tsx +++ b/src/modules/explorer/pages/Proposals/index.tsx @@ -336,7 +336,7 @@ const TezosProposals = () => { ) } -const EtherlinkProposals = () => { +export const EtherlinkProposals = () => { const daoId = useDAOID() const { data, cycleInfo } = useDAO(daoId) const { data: proposals } = useProposals(daoId) diff --git a/src/modules/explorer/router.tsx b/src/modules/explorer/router.tsx index ea1d1c92..b3d64770 100644 --- a/src/modules/explorer/router.tsx +++ b/src/modules/explorer/router.tsx @@ -2,6 +2,7 @@ import React from "react" import { Redirect, Route, Switch, useRouteMatch } from "react-router-dom" import { DAOList } from "modules/explorer/pages/DAOList" import { DAORouter } from "modules/explorer/pages/DAO/router" +import { EtherlinkDAORouter } from "modules/etherlink/explorer/router" import { LiteExplorerRouter } from "modules/lite/explorer/router" export const DAOExplorerRouter = (): JSX.Element => { @@ -15,6 +16,9 @@ export const DAOExplorerRouter = (): JSX.Element => { + + + diff --git a/src/modules/lite/explorer/components/ContentContainer.tsx b/src/modules/lite/explorer/components/ContentContainer.tsx index 1cb088d1..b413b8d2 100644 --- a/src/modules/lite/explorer/components/ContentContainer.tsx +++ b/src/modules/lite/explorer/components/ContentContainer.tsx @@ -1,3 +1,4 @@ +// TODO: Replace usage with components/ui/ContentContainer import { styled, Grid } from "@material-ui/core" export const ContentContainer = styled(Grid)(({ theme }) => ({ diff --git a/src/services/contracts/etherlinkDAO/firebase-config.ts b/src/services/contracts/etherlinkDAO/firebase-config.ts new file mode 100644 index 00000000..9c46c575 --- /dev/null +++ b/src/services/contracts/etherlinkDAO/firebase-config.ts @@ -0,0 +1,14 @@ +import { initializeApp } from "firebase/app" +import { getFirestore } from "firebase/firestore" +const firebaseConfig = { + apiKey: "AIzaSyBqvj7uTsnxX8B-PNRaNI_bWoUevyx-TII", + authDomain: "homebase-6907d.firebaseapp.com", + projectId: "homebase-6907d", + storageBucket: "homebase-6907d.firebasestorage.app", + messagingSenderId: "377420069232", + appId: "1:377420069232:web:4d2b785464d3a0e09077b5", + measurementId: "G-67HZK5DL97" +} +const app = initializeApp(firebaseConfig) + +export const db = getFirestore(app) diff --git a/src/services/contracts/etherlinkDAO/hooks/useFirestoreStore.tsx b/src/services/contracts/etherlinkDAO/hooks/useFirestoreStore.tsx new file mode 100644 index 00000000..34cd0fb7 --- /dev/null +++ b/src/services/contracts/etherlinkDAO/hooks/useFirestoreStore.tsx @@ -0,0 +1,121 @@ +// Get Indexes OnChain Data from Firestore +import { create } from "zustand" +import { collection, doc, getDocs, onSnapshot } from "firebase/firestore" +import { db } from "../firebase-config" + +interface FirestoreState { + data: Record + loading: Record + error: Record + unsubscribe?: Record void> + fetchCollection: (collectionName: string) => Promise +} + +const useFirestoreStore = create((set, get) => ({ + data: {}, + loading: {}, + error: {}, + unsubscribe: {}, + + // Fetch data for a specific collection + fetchCollection: async (collectionName: string) => { + const { data, loading } = get() + + if (loading[collectionName]) return // Prevent duplicate fetches + + set(state => ({ + loading: { ...state.loading, [collectionName]: true } + })) + + try { + let collectionRef + + // Check if collectionName includes "/" to identify child collections + if (collectionName.includes("/")) { + const pathSegments = collectionName.split("/") + if (pathSegments.length % 2 === 0) { + throw new Error("Invalid collection path. Ensure the path alternates between document and collection.") + } + + // let docRef = doc(db, pathSegments[0], pathSegments[1]) + // for (let i = 2; i < pathSegments.length - 1; i += 2) { + // docRef = doc(docRef, pathSegments[i], pathSegments[i + 1]) + // } + // console.log("docRef", docRef) + // console.log("pathSegments", pathSegments[pathSegments.length - 1]) + // collectionRef = collection(docRef, pathSegments[pathSegments.length - 1]) + + // const docRef = doc(db, pathSegments[0], pathSegments[1]) + console.log("collectionName", "daosEtherlink-Testnet/0x3d0bd8fe6126fb2dcedcf872eaa2631fe1c759c6/proposals") + console.log("collectionName_Input", collectionName) + collectionRef = collection(db, collectionName) + // const snapshot = await getDocs(collectionRef) + // console.log("collectionName_SnapShopt", snapshot.docs) + } else { + collectionRef = collection(db, collectionName) + } + + const unsubscribe = onSnapshot( + collectionRef, + snapshot => { + console.log("collectionData", snapshot.docs) + + const collectionData = snapshot.docs.map(doc => ({ + id: doc?.id, + ...doc?.data() + })) + + set(state => ({ + data: { ...state.data, [collectionName]: collectionData }, + loading: { ...state.loading, [collectionName]: false } + })) + }, + error => { + console.log("FirebaseError", error) + set(state => ({ + error: { ...state.error, [collectionName]: (error as Error).message ?? "Unknown error" }, + loading: { ...state.loading, [collectionName]: false } + })) + } + ) + + // Save unsubscribe function for cleanup + set(state => ({ + unsubscribe: { ...state.unsubscribe, [collectionName]: unsubscribe } + })) + } catch (error) { + console.log("FirebaseError", error) + set(state => ({ + error: { ...state.error, [collectionName]: (error as Error).message ?? "Unknown error" }, + loading: { ...state.loading, [collectionName]: false } + })) + } + }, + + // Clear data for a specific collection + clearCollection: (collectionName: string) => { + const unsubscribe = get().unsubscribe?.[collectionName] + if (unsubscribe) unsubscribe() // Cleanup Firestore listener + + set(state => ({ + data: { ...state.data, [collectionName]: [] }, + loading: { ...state.loading, [collectionName]: false }, + error: { ...state.error, [collectionName]: null } + })) + }, + + // Clear all data (useful for logout scenarios) + clearAll: () => { + const { unsubscribe } = get() + Object.values(unsubscribe || {}).forEach(unsub => unsub()) // Cleanup all listeners + + set({ + data: {}, + loading: {}, + error: {}, + unsubscribe: {} + }) + } +})) + +export default useFirestoreStore diff --git a/src/services/services/dao/hooks/useAllDAOs.ts b/src/services/services/dao/hooks/useAllDAOs.ts index cce1626e..8778b51b 100644 --- a/src/services/services/dao/hooks/useAllDAOs.ts +++ b/src/services/services/dao/hooks/useAllDAOs.ts @@ -2,18 +2,40 @@ import { useQuery } from "react-query" import { Network } from "services/beacon" import { getDAOs } from "services/services/dao/services" import { getLiteDAOs } from "../../lite/lite-services" +import { useContext, useEffect } from "react" +import { EtherlinkContext } from "services/wagmi/context" export const useAllDAOs = (network: Network) => { + const { daos: etherinkDaos, isLoadingDaos } = useContext(EtherlinkContext) + return useQuery( ["daos", network], async () => { const homebase_daos = await getDAOs(network) const lite_daos = await getLiteDAOs(network) + const evm_daos = + etherinkDaos?.map((dao: any) => ({ + ...dao, + dao_type: { + badge: "v4", + name: "etherlink_onchain" + }, + token: { + id: NaN, + name: dao.name, + contract: dao.token, + symbol: dao.symbol, + standard: "ERC20" + }, + holders_count: dao.holders, + ledgers: [], + network: "Etherlink" + })) || [] - return [...homebase_daos, ...lite_daos] + return [...homebase_daos, ...lite_daos, ...evm_daos] }, { - enabled: !!network + enabled: !!(network && !isLoadingDaos) } ) } diff --git a/src/services/services/dao/hooks/useDAO.ts b/src/services/services/dao/hooks/useDAO.ts index ec01bad9..8e24ed14 100644 --- a/src/services/services/dao/hooks/useDAO.ts +++ b/src/services/services/dao/hooks/useDAO.ts @@ -12,12 +12,20 @@ import { parseUnits } from "services/contracts/utils" import { getDAO } from "services/services/dao/services" import { useBlockchainInfo } from "../../../contracts/baseDAO/hooks/useBlockchainInfo" import { fetchLiteData } from "services/services/lite/lite-services" +import { EtherlinkContext } from "services/wagmi/context" // Generally this is used for onChain DAOs so can be renamed to useOnChainDAO export const useDAO = (address: string) => { + const [isLoading, setIsLoading] = useState(true) + const [daoData, setDaoData] = useState(null) const [cycleInfo, setCycleInfo] = useState() const { network } = useTezos() const { data: blockchainInfo } = useBlockchainInfo() + const { + daos: etherlinkOnchainDAOs, + selectDao: selectEtherlinkDao, + daoSelected: etherlinkDaoSelected + } = useContext(EtherlinkContext) const { state: { block } } = useContext(TZKTSubscriptionsContext) @@ -25,86 +33,9 @@ export const useDAO = (address: string) => { const { data, ...rest } = useQuery( ["dao", address], async () => { - console.log("daoData Address", address) - if (address == "onchain-etherlink") { - const data = new LambdaDAO({ - name: "Etherlink", - dao_type: { - id: 3, - name: "lambda" - }, - description: "my Etherlink Dao", - data: { - network: "etherlink_testnet" - }, - start_level: 0, - period: "0", - ledger: [], - id: 1, - admin: "", - address: "onchain-etherlink", - token: { - id: 0, - name: "Unknown", - symbol: "Unknown", - decimals: 0, - network: network as Network, - supply: "0", - contract: "Unknown", - token_id: "Unknown", - standard: "Unknown" - }, - etherlink: { - stats: { - members: "58", - active_proposals: "1", - awaiting_executions: "2" - } - }, - meta: { - users: [ - { - address: "tz1VJpG3LpAgE3yvvQn9FgG4YbYpP3oYXxw", - availableStaked: 5000, - totalStaked: 10000, - votes: 1000, - proposalsVoted: 100 - } - ] - }, - extra: { - frozen_token_id: "0", - min_quorum_threshold: "0", - quorum_change: "0", - quorum_threshold: "0", - frozen_extra_value: "0", - frozen_scale_value: "0", - max_proposal_size: 0, - max_xtz_amount: "0", - returnedPercentage: 0 - }, - liteDAO: undefined, - frozen_token_id: "0", - frozen_scale_value: "0", - frozen_extra_value: "0", - guardian: "", - max_quorum_change: "0", - max_quorum_threshold: "0", - min_quorum_threshold: "0", - quorum_change: "0", - quorum_threshold: "0", - max_proposal_size: 0, - max_xtz_amount: "0", - min_xtz_amount: "0", - network: "etherlink_testnet", - slash_division_value: "0", - slash_scale_value: "0" - } as any) - console.log("daoData LambdaDAO", data) - return data - } - const response = await getDAO(address as string) - const liteDAO = await fetchLiteData(address, network) + const [response, liteDAO] = await Promise.all([getDAO(address as string), fetchLiteData(address, network)]) + + console.log("useDAO.ts", { response, liteDAO }) const dao = response.daos[0] @@ -210,6 +141,86 @@ export const useDAO = (address: string) => { })() }, [data, blockchainInfo, block, network]) + useEffect(() => { + const dao = etherlinkDaoSelected + if (dao) + setDaoData( + new LambdaDAO({ + id: 1, + name: dao.name, + dao_type: { + id: 3, + name: "lambda" + }, + description: dao.description, + data: { + network: "etherlink_testnet" + }, + start_level: 0, + period: "0", + ledger: [], + admin: "", + address: dao.address, + token: { + id: 0, + name: "Unknown", + symbol: "Unknown", + decimals: 0, + network: network as Network, + supply: "0", + contract: "Unknown", + token_id: "Unknown", + standard: "Unknown" + }, + etherlink: { + stats: { + members: "58", + active_proposals: "1", + awaiting_executions: "2" + } + }, + meta: { + users: [ + { + address: "tz1VJpG3LpAgE3yvvQn9FgG4YbYpP3oYXxw", + availableStaked: 5000, + totalStaked: 10000, + votes: 1000, + proposalsVoted: 100 + } + ] + }, + extra: { + frozen_token_id: "0", + min_quorum_threshold: "0", + quorum_change: "0", + quorum_threshold: "0", + frozen_extra_value: "0", + frozen_scale_value: "0", + max_proposal_size: 0, + max_xtz_amount: "0", + returnedPercentage: 0 + }, + liteDAO: undefined, + frozen_token_id: "0", + frozen_scale_value: "0", + frozen_extra_value: "0", + guardian: "", + max_quorum_change: "0", + max_quorum_threshold: "0", + min_quorum_threshold: "0", + quorum_change: "0", + quorum_threshold: "0", + max_proposal_size: 0, + max_xtz_amount: "0", + min_xtz_amount: "0", + network: "etherlink_testnet", + slash_division_value: "0", + slash_scale_value: "0" + } as any) + ) + }, [address, etherlinkDaoSelected, network]) + const ledgerWithBalances = useMemo(() => { if (data && cycleInfo) { return data.data.ledger.map(l => { @@ -230,10 +241,19 @@ export const useDAO = (address: string) => { } }, [data, cycleInfo]) + useEffect(() => { + console.log("useDAO.ts", { daoData }) + }, [daoData]) + + useEffect(() => { + selectEtherlinkDao(address) + }, [address, selectEtherlinkDao]) + return { - data, + data: daoData, cycleInfo, ledger: ledgerWithBalances, - ...rest + ...rest, + isLoading: rest.isLoading || isLoading } } diff --git a/src/services/services/dao/hooks/useProposals.ts b/src/services/services/dao/hooks/useProposals.ts index 8b1e30a9..082dd7a1 100644 --- a/src/services/services/dao/hooks/useProposals.ts +++ b/src/services/services/dao/hooks/useProposals.ts @@ -3,9 +3,12 @@ import { BaseDAO, CycleInfo } from "services/contracts/baseDAO" import { getProposals } from "services/services/dao/services" import { ProposalStatus } from "services/services/dao/mappers/proposal/types" import { useDAO } from "./useDAO" +import { useEffect, useState } from "react" export const useProposals = (contractAddress: string, status?: ProposalStatus) => { - const { data: daoData, isLoading, error, cycleInfo } = useDAO(contractAddress) + const [isLoading, setIsLoading] = useState(true) + const [proposalData, setProposalData] = useState([]) + const { data: daoData, isLoading: isLoadingDAO, error, cycleInfo } = useDAO(contractAddress) const queryResults = useQuery( ["proposals", contractAddress, status], @@ -27,8 +30,14 @@ export const useProposals = (contractAddress: string, status?: ProposalStatus) = } ) + useEffect(() => { + if (queryResults.data) { + setProposalData(queryResults.data) + } + }, [queryResults.data]) + return { - data: queryResults.data, + data: proposalData, isLoading: isLoading || queryResults.isLoading, error: error || queryResults.error } diff --git a/src/services/wagmi/context.tsx b/src/services/wagmi/context.tsx index 0bc1f890..67f98463 100644 --- a/src/services/wagmi/context.tsx +++ b/src/services/wagmi/context.tsx @@ -5,6 +5,7 @@ import { config as wagmiConfig } from "services/wagmi/config" import { etherlink, etherlinkTestnet } from "wagmi/chains" import { useSIWE, useModal, SIWESession } from "connectkit" import { useEthersProvider, useEthersSigner } from "./ethers" +import useFirestoreStore from "services/contracts/etherlinkDAO/hooks/useFirestoreStore" interface EtherlinkType { isConnected: boolean @@ -57,6 +58,44 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children console.log("Wagmi Chain", chain, status) console.log("Wagmi Address", address) + + const [isLoadingDaos, setIsLoadingDaos] = useState(true) + const selectedDaoIdRef = useRef(null) + const [daoData, setDaoData] = useState([]) + const [daoSelected, setDaoSelected] = useState({}) + const [daoProposals, setDaoProposals] = useState([]) + const [daoMembers, setDaoMembers] = useState([]) + const { data: firestoreData, loading, fetchCollection } = useFirestoreStore() + + useEffect(() => { + fetchCollection("daosEtherlink-Testnet").then((data: any) => { + setIsLoadingDaos(false) + }) + }, [fetchCollection]) + + useEffect(() => { + console.log("wagmi/context.tsx", { firestoreData }) + if (firestoreData?.["daosEtherlink-Testnet"]) { + setDaoData(firestoreData["daosEtherlink-Testnet"]) + } + const daoProposalKey = `daosEtherlink-Testnet/${daoSelected.id}/proposals` + if (firestoreData?.[daoProposalKey]) { + setDaoProposals(firestoreData[daoProposalKey]) + } + const daoMembersKey = `daosEtherlink-Testnet/${daoSelected.id}/members` + if (firestoreData?.[daoMembersKey]) { + setDaoMembers(firestoreData[daoMembersKey]) + } + }, [daoSelected.id, firestoreData]) + + useEffect(() => { + console.log("daoSelected", daoSelected) + if (daoSelected.id) { + fetchCollection(`daosEtherlink-Testnet/${daoSelected.id}/proposals`) + fetchCollection(`daosEtherlink-Testnet/${daoSelected.id}/members`) + } + }, [daoSelected, fetchCollection]) + return ( = ({ children setOpen(true) // connect({ config: wagmiConfig }) }, + daos: daoData, + isLoadingDaos, + daoSelected: daoSelected, + daoProposals: daoProposals, + daoMembers: daoMembers, + selectDao: (daoId: string) => { + const dao = daoData.find(dao => dao.id === daoId) + // alert(`dao:${daoId}`) + if (dao) { + setDaoSelected(dao) + selectedDaoIdRef.current = daoId + } + }, disconnect: () => disconnectEtherlink(wagmiConfig), switchToNetwork: (network: string) => { const networkId = network === "etherlink_mainnet" ? etherlink.id : etherlinkTestnet.id diff --git a/src/utils.ts b/src/utils.ts index c4ef0f13..fa3eadea 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,5 +1,7 @@ import { LambdaCode } from "services/bakingBad/lambdas" import BigNumber from "bignumber.js" +import { EnvKey } from "services/config/constants" +import { getEnv } from "services/config/env" export const roundNumber = ({ number, decimals }: { number: number; decimals: number }) => Math.round(number * 10 ** decimals) / 10 ** decimals @@ -24,3 +26,14 @@ export const parseLambdaCode = (lambdaCode: LambdaCode | undefined) => { export const numberWithCommas = (x: number | BigNumber) => { return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") } + +export const getDaoHref = (daoId: string, daoType: string) => { + const daoRouteIfLambda = daoType === "lambda" ? `dao/${daoId}` : `lite/dao/${daoId}` + const daoHref = + daoType !== "lambda" && daoType !== "lite" + ? `${getEnv(EnvKey.REACT_APP_V2_URL)}/explorer/dao/${daoId}` + : daoRouteIfLambda + + if (daoType === "etherlink_onchain") return `/explorer/etherlink/dao/${daoId}` + return daoHref +} diff --git a/yarn.lock b/yarn.lock index ed578352..955a8e70 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1594,18 +1594,6 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@coinbase/wallet-sdk@4.0.3": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-4.0.3.tgz#fd52dd4c168c35979c7b3294018a6f78d163a593" - integrity sha512-y/OGEjlvosikjfB+wk+4CVb9OxD1ob9cidEBLI5h8Hxaf/Qoob2XoVT1uvhtAzBx34KpGYSd+alKvh/GCRre4Q== - dependencies: - buffer "^6.0.3" - clsx "^1.2.1" - eventemitter3 "^5.0.1" - keccak "^3.0.3" - preact "^10.16.0" - sha.js "^2.4.11" - "@coinbase/wallet-sdk@4.0.4": version "4.0.4" resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-4.0.4.tgz#634cd89bac93eeaf381a1f026476794e53431ed6" @@ -2012,6 +2000,396 @@ ethereum-cryptography "^2.0.0" micro-ftch "^0.3.1" +"@firebase/analytics-compat@0.2.16": + version "0.2.16" + resolved "https://registry.yarnpkg.com/@firebase/analytics-compat/-/analytics-compat-0.2.16.tgz#a84513988358494ef6f80ef626d4198da2b62381" + integrity sha512-Q/s+u/TEMSb2EDJFQMGsOzpSosybBl8HuoSEMyGZ99+0Pu7SIR9MPDGUjc8PKiCFQWDJ3QXxgqh1d/rujyAMbA== + dependencies: + "@firebase/analytics" "0.10.10" + "@firebase/analytics-types" "0.8.3" + "@firebase/component" "0.6.11" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/analytics-types@0.8.3": + version "0.8.3" + resolved "https://registry.yarnpkg.com/@firebase/analytics-types/-/analytics-types-0.8.3.tgz#d08cd39a6209693ca2039ba7a81570dfa6c1518f" + integrity sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg== + +"@firebase/analytics@0.10.10": + version "0.10.10" + resolved "https://registry.yarnpkg.com/@firebase/analytics/-/analytics-0.10.10.tgz#68492c7ec3a341fd6caf3f89cbd9e7e7ad374140" + integrity sha512-Psdo7c9g2SLAYh6u1XRA+RZ7ab2JfBVuAt/kLzXkhKZL/gS2cQUCMsOW5p0RIlDPRKqpdNSmvujd2TeRWLKOkQ== + dependencies: + "@firebase/component" "0.6.11" + "@firebase/installations" "0.6.11" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/app-check-compat@0.3.17": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@firebase/app-check-compat/-/app-check-compat-0.3.17.tgz#ec0e0b52c4c5ea7cb6d976f9d1f892e97d19febc" + integrity sha512-a/eadrGsY0MVCBPhrNbKUhoYpms4UKTYLKO7nswwSFVsm3Rw6NslQQCNLfvljcDqP4E7alQDRGJXjkxd/5gJ+Q== + dependencies: + "@firebase/app-check" "0.8.10" + "@firebase/app-check-types" "0.5.3" + "@firebase/component" "0.6.11" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/app-check-interop-types@0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.3.tgz#ed9c4a4f48d1395ef378f007476db3940aa5351a" + integrity sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A== + +"@firebase/app-check-types@0.5.3": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@firebase/app-check-types/-/app-check-types-0.5.3.tgz#38ba954acf4bffe451581a32fffa20337f11d8e5" + integrity sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng== + +"@firebase/app-check@0.8.10": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@firebase/app-check/-/app-check-0.8.10.tgz#7fa10c9242ecc181a0f45a68bfc268e12729ff02" + integrity sha512-DWFfxxif/t+Ow4MmRUevDX+A3hVxm1rUf6y5ZP4sIomfnVCO1NNahqtsv9rb1/tKGkTeoVT40weiTS/WjQG1mA== + dependencies: + "@firebase/component" "0.6.11" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/app-compat@0.2.46": + version "0.2.46" + resolved "https://registry.yarnpkg.com/@firebase/app-compat/-/app-compat-0.2.46.tgz#67238416c9e45e9e8649dfe70304026af1cb0b08" + integrity sha512-9hSHWE5LMqtKIm13CnH5OZeMPbkVV3y5vgNZ5EMFHcG2ceRrncyNjG9No5XfWQw8JponZdGs4HlE4aMD/jxcFA== + dependencies: + "@firebase/app" "0.10.16" + "@firebase/component" "0.6.11" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/app-types@0.9.3": + version "0.9.3" + resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.9.3.tgz#8408219eae9b1fb74f86c24e7150a148460414ad" + integrity sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw== + +"@firebase/app@0.10.16": + version "0.10.16" + resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.10.16.tgz#c557ee8fa0085909b48d6e0a00e7403943bd836f" + integrity sha512-SUati2qH48gvVGnSsqMkZr1Iq7No52a3tJQ4itboSTM89Erezmw3v1RsfVymrDze9+KiOLmBpvLNKSvheITFjg== + dependencies: + "@firebase/component" "0.6.11" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.2" + idb "7.1.1" + tslib "^2.1.0" + +"@firebase/auth-compat@0.5.16": + version "0.5.16" + resolved "https://registry.yarnpkg.com/@firebase/auth-compat/-/auth-compat-0.5.16.tgz#ef365d2594c0706688abefb8dd61f32a677625f6" + integrity sha512-YlYwJMBqAyv0ESy3jDUyshMhZlbUiwAm6B6+uUmigNDHU+uq7j4SFiDJEZlFFIz397yBzKn06SUdqutdQzGnCA== + dependencies: + "@firebase/auth" "1.8.1" + "@firebase/auth-types" "0.12.3" + "@firebase/component" "0.6.11" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/auth-interop-types@0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@firebase/auth-interop-types/-/auth-interop-types-0.2.4.tgz#176a08686b0685596ff03d7879b7e4115af53de0" + integrity sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA== + +"@firebase/auth-types@0.12.3": + version "0.12.3" + resolved "https://registry.yarnpkg.com/@firebase/auth-types/-/auth-types-0.12.3.tgz#650e54a36060b5ea012075ddbd3cb26566334c41" + integrity sha512-Zq9zI0o5hqXDtKg6yDkSnvMCMuLU6qAVS51PANQx+ZZX5xnzyNLEBO3GZgBUPsV5qIMFhjhqmLDxUqCbnAYy2A== + +"@firebase/auth@1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@firebase/auth/-/auth-1.8.1.tgz#8b508328f60bb069a11de8c7e1e4e39e01d5a796" + integrity sha512-LX9N/Cf5Z35r5yqm2+5M3+2bRRe/+RFaa/+u4HDni7TA27C/Xm4XHLKcWcLg1BzjrS4zngSaBEOSODvp6RFOqQ== + dependencies: + "@firebase/component" "0.6.11" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/component@0.6.11": + version "0.6.11" + resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.6.11.tgz#228a2ff5a6b0e5970b84d4dd298bf6ed0483018e" + integrity sha512-eQbeCgPukLgsKD0Kw5wQgsMDX5LeoI1MIrziNDjmc6XDq5ZQnuUymANQgAb2wp1tSF9zDSXyxJmIUXaKgN58Ug== + dependencies: + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/data-connect@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@firebase/data-connect/-/data-connect-0.1.2.tgz#25c0d7c522089be4a44cbe7d2039dd3601448f81" + integrity sha512-Bcf29mntFCt5V7aceMe36wnkHrG7cwbMlUVbDHOlh2foQKx9VtSXEONw9r6FtL1sFobHVYOM5L6umX35f59m5g== + dependencies: + "@firebase/auth-interop-types" "0.2.4" + "@firebase/component" "0.6.11" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/database-compat@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@firebase/database-compat/-/database-compat-2.0.1.tgz#063c4bff74782337117280fbf5b73b463a9a0638" + integrity sha512-IsFivOjdE1GrjTeKoBU/ZMenESKDXidFDzZzHBPQ/4P20ptGdrl3oLlWrV/QJqJ9lND4IidE3z4Xr5JyfUW1vg== + dependencies: + "@firebase/component" "0.6.11" + "@firebase/database" "1.0.10" + "@firebase/database-types" "1.0.7" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/database-types@1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-1.0.7.tgz#8a0819ca8c486fc967d3a9021a008c8f969576bf" + integrity sha512-I7zcLfJXrM0WM+ksFmFdAMdlq/DFmpeMNa+/GNsLyFo5u/lX5zzkPzGe3srVWqaBQBY5KprylDGxOsP6ETfL0A== + dependencies: + "@firebase/app-types" "0.9.3" + "@firebase/util" "1.10.2" + +"@firebase/database@1.0.10": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@firebase/database/-/database-1.0.10.tgz#e23044d5fd2cdfd07e7bef57fd80643db07af33d" + integrity sha512-sWp2g92u7xT4BojGbTXZ80iaSIaL6GAL0pwvM0CO/hb0nHSnABAqsH7AhnWGsGvXuEvbPr7blZylPaR9J+GSuQ== + dependencies: + "@firebase/app-check-interop-types" "0.3.3" + "@firebase/auth-interop-types" "0.2.4" + "@firebase/component" "0.6.11" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.2" + faye-websocket "0.11.4" + tslib "^2.1.0" + +"@firebase/firestore-compat@0.3.40": + version "0.3.40" + resolved "https://registry.yarnpkg.com/@firebase/firestore-compat/-/firestore-compat-0.3.40.tgz#3f4cfc2d25d2f25d9925cdf5903c0b49bfdaeebc" + integrity sha512-18HopMN811KYBc9Ptpr1Rewwio0XF09FF3jc5wtV6rGyAs815SlFFw5vW7ZeLd43zv9tlEc2FzM0H+5Vr9ZRxw== + dependencies: + "@firebase/component" "0.6.11" + "@firebase/firestore" "4.7.5" + "@firebase/firestore-types" "3.0.3" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/firestore-types@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-3.0.3.tgz#7d0c3dd8850c0193d8f5ee0cc8f11961407742c1" + integrity sha512-hD2jGdiWRxB/eZWF89xcK9gF8wvENDJkzpVFb4aGkzfEaKxVRD1kjz1t1Wj8VZEp2LCB53Yx1zD8mrhQu87R6Q== + +"@firebase/firestore@4.7.5": + version "4.7.5" + resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-4.7.5.tgz#a34d215b28b2888841ed5e06fa6db2ae2246098a" + integrity sha512-OO3rHvjC07jL2ITN255xH/UzCVSvh6xG8oTzQdFScQvFbcm1fjCL1hgAdpDZcx3vVcKMV+6ktr8wbllkB8r+FQ== + dependencies: + "@firebase/component" "0.6.11" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.2" + "@firebase/webchannel-wrapper" "1.0.3" + "@grpc/grpc-js" "~1.9.0" + "@grpc/proto-loader" "^0.7.8" + tslib "^2.1.0" + +"@firebase/functions-compat@0.3.16": + version "0.3.16" + resolved "https://registry.yarnpkg.com/@firebase/functions-compat/-/functions-compat-0.3.16.tgz#397980bc6d40b614be70350b62200188ae4bb289" + integrity sha512-FL7EXehiiBisNIR7mlb0i+moyWKLVfcEJgh/Wq6ZV6BdrCObpCTz7w5EvuRIEFX5e9cNL2oWInKg8S5X4HtINg== + dependencies: + "@firebase/component" "0.6.11" + "@firebase/functions" "0.11.10" + "@firebase/functions-types" "0.6.3" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/functions-types@0.6.3": + version "0.6.3" + resolved "https://registry.yarnpkg.com/@firebase/functions-types/-/functions-types-0.6.3.tgz#f5faf770248b13f45d256f614230da6a11bfb654" + integrity sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg== + +"@firebase/functions@0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.11.10.tgz#da908e936f9dcd2fc1bf22447500f7bf96d7615b" + integrity sha512-TP+Dzebazhw6+GduBdWn1kOJRFH84G2z+BW3pNVfkpFRkc//+uT1Uw2+dLpMGSSBRG7FrcDG91vcPnOFCzr15w== + dependencies: + "@firebase/app-check-interop-types" "0.3.3" + "@firebase/auth-interop-types" "0.2.4" + "@firebase/component" "0.6.11" + "@firebase/messaging-interop-types" "0.2.3" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/installations-compat@0.2.11": + version "0.2.11" + resolved "https://registry.yarnpkg.com/@firebase/installations-compat/-/installations-compat-0.2.11.tgz#8bd9e3fbcf9a7fabcfa2386264be6a224567cdb5" + integrity sha512-SHRgw5LTa6v8LubmJZxcOCwEd1MfWQPUtKdiuCx2VMWnapX54skZd1PkQg0K4l3k+4ujbI2cn7FE6Li9hbChBw== + dependencies: + "@firebase/component" "0.6.11" + "@firebase/installations" "0.6.11" + "@firebase/installations-types" "0.5.3" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/installations-types@0.5.3": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@firebase/installations-types/-/installations-types-0.5.3.tgz#cac8a14dd49f09174da9df8ae453f9b359c3ef2f" + integrity sha512-2FJI7gkLqIE0iYsNQ1P751lO3hER+Umykel+TkLwHj6plzWVxqvfclPUZhcKFVQObqloEBTmpi2Ozn7EkCABAA== + +"@firebase/installations@0.6.11": + version "0.6.11" + resolved "https://registry.yarnpkg.com/@firebase/installations/-/installations-0.6.11.tgz#0ac38af96ec737f458aa93d07e0499bd1dde9bdd" + integrity sha512-w8fY8mw6fxJzsZM2ufmTtomopXl1+bn/syYon+Gpn+0p0nO1cIUEVEFrFazTLaaL9q1CaVhc3HmseRTsI3igAA== + dependencies: + "@firebase/component" "0.6.11" + "@firebase/util" "1.10.2" + idb "7.1.1" + tslib "^2.1.0" + +"@firebase/logger@0.4.4": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.4.4.tgz#29e8379d20fd1149349a195ee6deee4573a86f48" + integrity sha512-mH0PEh1zoXGnaR8gD1DeGeNZtWFKbnz9hDO91dIml3iou1gpOnLqXQ2dJfB71dj6dpmUjcQ6phY3ZZJbjErr9g== + dependencies: + tslib "^2.1.0" + +"@firebase/messaging-compat@0.2.14": + version "0.2.14" + resolved "https://registry.yarnpkg.com/@firebase/messaging-compat/-/messaging-compat-0.2.14.tgz#c6532a1cc1bebe55aca486c30f48688f68b50f18" + integrity sha512-r9weK8jTEA2aGiwy0IbMQPnzuJ0DHkOQaMxGJOlU2QZ1a7fh6RHpNtaoM+LKnn6u1NQgmAOWYNr9vezVQEm9zw== + dependencies: + "@firebase/component" "0.6.11" + "@firebase/messaging" "0.12.14" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/messaging-interop-types@0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.3.tgz#e647c9cd1beecfe6a6e82018a6eec37555e4da3e" + integrity sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q== + +"@firebase/messaging@0.12.14": + version "0.12.14" + resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.12.14.tgz#21d32de01f2abbb262c35185d50043bce18d4fb4" + integrity sha512-cSGP34jJswFvME8tdMDkvJvW6T1jEekyMSyq84AMBZ0KEpJbDWuC9n4wKT2lxUm1jaL651iZnn6g51yCl77ICg== + dependencies: + "@firebase/component" "0.6.11" + "@firebase/installations" "0.6.11" + "@firebase/messaging-interop-types" "0.2.3" + "@firebase/util" "1.10.2" + idb "7.1.1" + tslib "^2.1.0" + +"@firebase/performance-compat@0.2.11": + version "0.2.11" + resolved "https://registry.yarnpkg.com/@firebase/performance-compat/-/performance-compat-0.2.11.tgz#35799c62d4c477d4b82d9824359a2bd88386db12" + integrity sha512-DqeNBy51W2xzlklyC7Ht9JQ94HhTA08PCcM4MDeyG/ol3fqum/+YgtHWQ2IQuduqH9afETthZqLwCZiSgY7hiA== + dependencies: + "@firebase/component" "0.6.11" + "@firebase/logger" "0.4.4" + "@firebase/performance" "0.6.11" + "@firebase/performance-types" "0.2.3" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/performance-types@0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@firebase/performance-types/-/performance-types-0.2.3.tgz#5ce64e90fa20ab5561f8b62a305010cf9fab86fb" + integrity sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ== + +"@firebase/performance@0.6.11": + version "0.6.11" + resolved "https://registry.yarnpkg.com/@firebase/performance/-/performance-0.6.11.tgz#c07c0e30117f9b2890d8995259e07424f6d9e265" + integrity sha512-FlkJFeqLlIeh5T4Am3uE38HVzggliDIEFy/fErEc1faINOUFCb6vQBEoNZGaXvRnTR8lh3X/hP7tv37C7BsK9g== + dependencies: + "@firebase/component" "0.6.11" + "@firebase/installations" "0.6.11" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/remote-config-compat@0.2.11": + version "0.2.11" + resolved "https://registry.yarnpkg.com/@firebase/remote-config-compat/-/remote-config-compat-0.2.11.tgz#5c3660acf673b1787837cc7eba3a07bc958989f5" + integrity sha512-zfIjpwPrGuIOZDmduukN086qjhZ1LnbJi/iYzgua+2qeTlO0XdlE1v66gJPwygGB3TOhT0yb9EiUZ3nBNttMqg== + dependencies: + "@firebase/component" "0.6.11" + "@firebase/logger" "0.4.4" + "@firebase/remote-config" "0.4.11" + "@firebase/remote-config-types" "0.3.3" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/remote-config-types@0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@firebase/remote-config-types/-/remote-config-types-0.3.3.tgz#8105382aabf0ee94607a6081889af122d305dd0d" + integrity sha512-YlRI9CHxrk3lpQuFup9N1eohpwdWayKZUNZ/YeQ0PZoncJ66P32UsKUKqVXOaieTjJIOh7yH8JEzRdht5s+d6g== + +"@firebase/remote-config@0.4.11": + version "0.4.11" + resolved "https://registry.yarnpkg.com/@firebase/remote-config/-/remote-config-0.4.11.tgz#7d664e12148c3135c177739020c754aa41d6e542" + integrity sha512-9z0rgKuws2nj+7cdiqF+NY1QR4na6KnuOvP+jQvgilDOhGtKOcCMq5XHiu66i73A9kFhyU6QQ2pHXxcmaq1pBw== + dependencies: + "@firebase/component" "0.6.11" + "@firebase/installations" "0.6.11" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/storage-compat@0.3.14": + version "0.3.14" + resolved "https://registry.yarnpkg.com/@firebase/storage-compat/-/storage-compat-0.3.14.tgz#1779f44c517bb6d8d93245ac53a9bc1ecb2e1225" + integrity sha512-Ok5FmXJiapaNAOQ8W8qppnfwgP8540jw2B8M0c4TFZqF4BD+CoKBxW0dRtOuLNGadLhzqqkDZZZtkexxrveQqA== + dependencies: + "@firebase/component" "0.6.11" + "@firebase/storage" "0.13.4" + "@firebase/storage-types" "0.8.3" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/storage-types@0.8.3": + version "0.8.3" + resolved "https://registry.yarnpkg.com/@firebase/storage-types/-/storage-types-0.8.3.tgz#2531ef593a3452fc12c59117195d6485c6632d3d" + integrity sha512-+Muk7g9uwngTpd8xn9OdF/D48uiQ7I1Fae7ULsWPuKoCH3HU7bfFPhxtJYzyhjdniowhuDpQcfPmuNRAqZEfvg== + +"@firebase/storage@0.13.4": + version "0.13.4" + resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.13.4.tgz#83a3b638ffb8dbb8cb4f58d25c0961dfebc7cd9d" + integrity sha512-b1KaTTRiMupFurIhpGIbReaWev0k5O3ouTHkAPcEssT+FvU3q/1JwzvkX4+ZdB60Fc43Mbp8qQ1gWfT0Z2FP9Q== + dependencies: + "@firebase/component" "0.6.11" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/util@1.10.2": + version "1.10.2" + resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.10.2.tgz#4dbb565cfbdf51b4fb2081c5093dba3037d49a35" + integrity sha512-qnSHIoE9FK+HYnNhTI8q14evyqbc/vHRivfB4TgCIUOl4tosmKSQlp7ltymOlMP4xVIJTg5wrkfcZ60X4nUf7Q== + dependencies: + tslib "^2.1.0" + +"@firebase/vertexai@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@firebase/vertexai/-/vertexai-1.0.1.tgz#e07fb84da1dfa4c6da358b2e2ab167ec9f69a19a" + integrity sha512-f48MGSofhaS05ebpN7zMIv4tBqYf19pXr5/4njKtNZVLbjxUswDma0SuFDoO+IwgbdkhFxgtNctM+C1zfI/O1Q== + dependencies: + "@firebase/app-check-interop-types" "0.3.3" + "@firebase/component" "0.6.11" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.2" + tslib "^2.1.0" + +"@firebase/webchannel-wrapper@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.3.tgz#a73bab8eb491d7b8b7be2f0e6c310647835afe83" + integrity sha512-2xCRM9q9FlzGZCdgDMJwc0gyUkWFtkosy7Xxr6sFgQwn+wMNIWd7xIvYNauU1r64B5L5rsGKy/n9TKJ0aAFeqQ== + "@floating-ui/core@^1.0.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.0.tgz#fa41b87812a16bf123122bf945946bae3fdf7fc1" @@ -2039,6 +2417,24 @@ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== +"@grpc/grpc-js@~1.9.0": + version "1.9.15" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.9.15.tgz#433d7ac19b1754af690ea650ab72190bd700739b" + integrity sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ== + dependencies: + "@grpc/proto-loader" "^0.7.8" + "@types/node" ">=12.12.47" + +"@grpc/proto-loader@^0.7.8": + version "0.7.13" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf" + integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== + dependencies: + lodash.camelcase "^4.3.0" + long "^5.0.0" + protobufjs "^7.2.5" + yargs "^17.7.2" + "@hookform/resolvers@^2.8.1": version "2.9.11" resolved "https://registry.yarnpkg.com/@hookform/resolvers/-/resolvers-2.9.11.tgz#9ce96e7746625a89239f68ca57c4f654264c17ef" @@ -3221,6 +3617,59 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + "@reach/portal@^0.13.0": version "0.13.2" resolved "https://registry.yarnpkg.com/@reach/portal/-/portal-0.13.2.tgz#6f2a6f4afc14894bde9c6435667bb9b660887ed9" @@ -4181,6 +4630,13 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469" integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== +"@types/node@>=12.12.47", "@types/node@>=13.7.0": + version "22.10.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.1.tgz#41ffeee127b8975a05f8c4f83fb89bcb2987d766" + integrity sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ== + dependencies: + undici-types "~6.20.0" + "@types/node@^14.14.35": version "14.18.63" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.63.tgz#1788fa8da838dbb5f9ea994b834278205db6ca2b" @@ -4610,7 +5066,6 @@ mipd "0.0.7" zustand "4.4.1" -"@walletconnect/core@2.11.2", "@walletconnect/core@2.14.0", "@walletconnect/core@2.15.0": "@walletconnect/core@2.11.2", "@walletconnect/core@2.14.0", "@walletconnect/core@2.15.0": version "2.14.0" resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.14.0.tgz#e8afb01455968b02aaf26c74f3bfcc9b82678a39" @@ -4641,22 +5096,6 @@ dependencies: tslib "1.14.1" -"@walletconnect/ethereum-provider@2.14.0": - version "2.14.0" - resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-2.14.0.tgz#0ed4ba9b383c889b56e0af87181756d900fc504a" - integrity sha512-Cc2/DCn85VciA10BrsNWFM//3VC1D8yjwrjfUKjGndLPDz0YIdAxTgYZViIlMjE0lzQC/DMvPYEAnGfW0O1Bwg== - dependencies: - "@walletconnect/jsonrpc-http-connection" "1.0.8" - "@walletconnect/jsonrpc-provider" "1.0.14" - "@walletconnect/jsonrpc-types" "1.0.4" - "@walletconnect/jsonrpc-utils" "1.0.8" - "@walletconnect/modal" "2.6.2" - "@walletconnect/sign-client" "2.14.0" - "@walletconnect/types" "2.14.0" - "@walletconnect/universal-provider" "2.14.0" - "@walletconnect/utils" "2.14.0" - events "3.3.0" - "@walletconnect/ethereum-provider@2.15.0": version "2.15.0" resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-2.15.0.tgz#df4aa157b69285712355ef2aea3f72d0eb585b4b" @@ -4844,21 +5283,6 @@ "@walletconnect/utils" "2.11.2" events "^3.3.0" -"@walletconnect/sign-client@2.14.0": - version "2.14.0" - resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.14.0.tgz#36533ef0976a869d815624217527482c90937fc8" - integrity sha512-UrB3S3eLjPYfBLCN3WJ5u7+WcZ8kFMe/QIDqLf76Jk6TaLwkSUy563LvnSw4KW/kA+/cY1KBSdUDfX1tzYJJXg== - dependencies: - "@walletconnect/core" "2.14.0" - "@walletconnect/events" "1.0.1" - "@walletconnect/heartbeat" "1.2.2" - "@walletconnect/jsonrpc-utils" "1.0.8" - "@walletconnect/logger" "2.1.2" - "@walletconnect/time" "1.0.2" - "@walletconnect/types" "2.14.0" - "@walletconnect/utils" "2.14.0" - events "3.3.0" - "@walletconnect/sign-client@2.15.0": version "2.15.0" resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.15.0.tgz#bad69a2850dac26d011ba54be86073455fc398c8" @@ -4893,21 +5317,6 @@ "@walletconnect/logger" "2.1.2" events "3.3.0" -"@walletconnect/universal-provider@2.14.0": - version "2.14.0" - resolved "https://registry.yarnpkg.com/@walletconnect/universal-provider/-/universal-provider-2.14.0.tgz#39d029be80374894b5f4249b76282dd9211d8b9f" - integrity sha512-Mr8uoTmD6H0+Hh+3gxBu4l3T2uP/nNPR02sVtwEujNum++F727mMk+ifPRIpkVo21V/bvXFEy8sHTs5hqyq5iA== - dependencies: - "@walletconnect/jsonrpc-http-connection" "1.0.8" - "@walletconnect/jsonrpc-provider" "1.0.14" - "@walletconnect/jsonrpc-types" "1.0.4" - "@walletconnect/jsonrpc-utils" "1.0.8" - "@walletconnect/logger" "2.1.2" - "@walletconnect/sign-client" "2.14.0" - "@walletconnect/types" "2.14.0" - "@walletconnect/utils" "2.14.0" - events "3.3.0" - "@walletconnect/universal-provider@2.15.0": version "2.15.0" resolved "https://registry.yarnpkg.com/@walletconnect/universal-provider/-/universal-provider-2.15.0.tgz#e71ca2043f99f5acfb4da3d38de2b5ee4bd18e5b" @@ -4923,7 +5332,7 @@ "@walletconnect/utils" "2.15.0" events "3.3.0" -"@walletconnect/utils@2.11.2", "@walletconnect/utils@2.12.0", "@walletconnect/utils@2.14.0", "@walletconnect/utils@2.15.0": +"@walletconnect/utils@2.11.2", "@walletconnect/utils@2.14.0", "@walletconnect/utils@2.15.0": version "2.14.0" resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.14.0.tgz#48493ffe1e902815fda3cbd5cc5409288a066d35" integrity sha512-vRVomYQEtEAyCK2c5bzzEvtgxaGGITF8mWuIL+WYSAMyEJLY97mirP2urDucNwcUczwxUgI+no9RiNFbUHreQQ== @@ -4958,131 +5367,6 @@ "@walletconnect/window-getters" "^1.0.1" tslib "1.14.1" -"@web3modal/common@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@web3modal/common/-/common-5.0.11.tgz#319cb471579f75807e1b7fb4d86a6c0e7e8f8cba" - integrity sha512-xI6FKrk4/TofM27e0R5F0e7OWMa0YECJshITgFVrX57ZPbgw0O8bTTgLa0yxYG3A5xMnuz6dOYjAAQV+EXrr9w== - dependencies: - bignumber.js "9.1.2" - dayjs "1.11.10" - -"@web3modal/core@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@web3modal/core/-/core-5.0.11.tgz#5503f8f05d54f3ca9a76144cdc08796de431d327" - integrity sha512-YX5msOOEmB0HYwdDt3sF8JCMyTfkzCV9tMWPMQqBdFT8p+9lPaW4JCmqYwJMI9AhUiPpZWc6ubFit62+OzBAQQ== - dependencies: - "@web3modal/common" "5.0.11" - "@web3modal/wallet" "5.0.11" - valtio "1.11.2" - -"@web3modal/polyfills@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@web3modal/polyfills/-/polyfills-5.0.11.tgz#137356994f2429979c1734d3ea40a04642da68a5" - integrity sha512-F2pC4egFTwlGyyK6PuW1lEJwdl1NK+9AfiO9aiR58RXzj4uFStPuO4wzOGONz+5Kv8lM1ZiooRD0pMcJmsyzLw== - dependencies: - buffer "6.0.3" - -"@web3modal/scaffold-react@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@web3modal/scaffold-react/-/scaffold-react-5.0.11.tgz#1eda11a22ec7b8d5ec698c4266f75683d730c332" - integrity sha512-zJJY9WsIUDnPvdJ91FpkUM8YORq4dsWF74hbMBGSwKzkHcJg1PmGWBz2+iKfkR6pr/0FRUYlxkqS4MzrEaGItQ== - dependencies: - "@web3modal/scaffold" "5.0.11" - -"@web3modal/scaffold-ui@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@web3modal/scaffold-ui/-/scaffold-ui-5.0.11.tgz#94f77c3b16e1a39676e8b265ecf5c9a3a6095c20" - integrity sha512-QHi980YGjFW335VVLQ9lQasH347xrdHomtvU1P1jXGg3wygDRs57rGRy6kK2yiLJomom02YGI+H1Tl8JvnAtZg== - dependencies: - "@web3modal/common" "5.0.11" - "@web3modal/core" "5.0.11" - "@web3modal/scaffold-utils" "5.0.11" - "@web3modal/siwe" "5.0.11" - "@web3modal/ui" "5.0.11" - "@web3modal/wallet" "5.0.11" - lit "3.1.0" - -"@web3modal/scaffold-utils@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@web3modal/scaffold-utils/-/scaffold-utils-5.0.11.tgz#ccf18a5cc40852ac698eba7d7c0c101617b8e018" - integrity sha512-3/fEndFBX9tNf/OpbE8zny9XRbGPlKojDlrkhz6ygcF2Dx0458ykpB342OtZPs3CjnPnZKRuo+H2y11KFo1IdQ== - dependencies: - "@coinbase/wallet-sdk" "4.0.3" - "@web3modal/core" "5.0.11" - "@web3modal/polyfills" "5.0.11" - "@web3modal/wallet" "5.0.11" - valtio "1.11.2" - -"@web3modal/scaffold-vue@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@web3modal/scaffold-vue/-/scaffold-vue-5.0.11.tgz#ebb9ee3755e356d8d69d71595839928789c0c643" - integrity sha512-GvdWVMAis1nvjErrsxsd4DvGyZ/+V1DoeoCBLgXqImYg2JfIYuH80xUiOJNKWq1wrs+/J9pNsc+r4BDSNtI+HQ== - dependencies: - "@web3modal/core" "5.0.11" - "@web3modal/scaffold" "5.0.11" - -"@web3modal/scaffold@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@web3modal/scaffold/-/scaffold-5.0.11.tgz#11784d827db3be643936a02ad82d85bbd43294fd" - integrity sha512-QoKI1srTvUVem9zUGJ//d0rq7xxQhyulC9CeaSusa6roljS6VP65aqPvhEvtudK5LWbqpLoK6WtLrIdVVj3DFg== - dependencies: - "@web3modal/common" "5.0.11" - "@web3modal/core" "5.0.11" - "@web3modal/scaffold-ui" "5.0.11" - "@web3modal/scaffold-utils" "5.0.11" - "@web3modal/siwe" "5.0.11" - "@web3modal/ui" "5.0.11" - "@web3modal/wallet" "5.0.11" - lit "3.1.0" - -"@web3modal/siwe@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@web3modal/siwe/-/siwe-5.0.11.tgz#4d0daf72e1bc3b21f26729a2d59a698b76014d00" - integrity sha512-dQZFxhoyphINz2H6Y/t8/zalErulV46NGk+U2z7Hq6H5c8XKBC4dCIDFem62+kDk07QKgg3lG+sUlf4ZU4YgRA== - dependencies: - "@walletconnect/utils" "2.12.0" - "@web3modal/common" "5.0.11" - "@web3modal/core" "5.0.11" - "@web3modal/scaffold-utils" "5.0.11" - "@web3modal/ui" "5.0.11" - "@web3modal/wallet" "5.0.11" - lit "3.1.0" - valtio "1.11.2" - -"@web3modal/ui@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@web3modal/ui/-/ui-5.0.11.tgz#a692ce5f983a0a7108de6354947d40d766b46c15" - integrity sha512-Tm5SU7GGymvTgqRBCqMYl/I6Kou8hOLdYVhQIfghFEGd/TH0kTdAdjH30a65n/sxTmW3LC/CoflC6FCGP0TOcA== - dependencies: - lit "3.1.0" - qrcode "1.5.3" - -"@web3modal/wagmi@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@web3modal/wagmi/-/wagmi-5.0.11.tgz#eb5d5e2fab33cc29fbc3fa9bb5cf36cc9ae71424" - integrity sha512-8/2tS4bcdjsqk6hxpiclsVz2/Te6a0mZ1uLqZ+GvD6+4i1+yc34f9ZRtfvf2+mpG+bRdHhSB5a5TIzRgtCzsYw== - dependencies: - "@walletconnect/ethereum-provider" "2.14.0" - "@walletconnect/utils" "2.14.0" - "@web3modal/common" "5.0.11" - "@web3modal/polyfills" "5.0.11" - "@web3modal/scaffold" "5.0.11" - "@web3modal/scaffold-react" "5.0.11" - "@web3modal/scaffold-utils" "5.0.11" - "@web3modal/scaffold-vue" "5.0.11" - "@web3modal/siwe" "5.0.11" - "@web3modal/wallet" "5.0.11" - -"@web3modal/wallet@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@web3modal/wallet/-/wallet-5.0.11.tgz#d05fdf58f4c3b5f9ff9b16a7ba3798571be61ab0" - integrity sha512-8lsDCfsJS23UXllVyg9uB/RIWi+2k/g3hc4QN8Z9HGVhJREjk/cNc7e+mWWI077PDsplXAjnw3sK864O12v7Xg== - dependencies: - "@walletconnect/logger" "2.1.2" - "@web3modal/common" "5.0.11" - "@web3modal/polyfills" "5.0.11" - zod "3.22.4" - "@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": version "1.12.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" @@ -8744,7 +9028,7 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -faye-websocket@^0.11.3: +faye-websocket@0.11.4, faye-websocket@^0.11.3: version "0.11.4" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== @@ -8862,6 +9146,40 @@ find-yarn-workspace-root@^2.0.0: dependencies: micromatch "^4.0.2" +firebase@11.0.2: + version "11.0.2" + resolved "https://registry.yarnpkg.com/firebase/-/firebase-11.0.2.tgz#5de236ee1f2fa517279595e5d4199428da772f48" + integrity sha512-w4T8BSJpzdZA25QRch5ahLsgB6uRvg1LEic4BaC5rTD1YygroI1AXp+W+rbMnr8d8EjfAv6t4k8doULIjc1P8Q== + dependencies: + "@firebase/analytics" "0.10.10" + "@firebase/analytics-compat" "0.2.16" + "@firebase/app" "0.10.16" + "@firebase/app-check" "0.8.10" + "@firebase/app-check-compat" "0.3.17" + "@firebase/app-compat" "0.2.46" + "@firebase/app-types" "0.9.3" + "@firebase/auth" "1.8.1" + "@firebase/auth-compat" "0.5.16" + "@firebase/data-connect" "0.1.2" + "@firebase/database" "1.0.10" + "@firebase/database-compat" "2.0.1" + "@firebase/firestore" "4.7.5" + "@firebase/firestore-compat" "0.3.40" + "@firebase/functions" "0.11.10" + "@firebase/functions-compat" "0.3.16" + "@firebase/installations" "0.6.11" + "@firebase/installations-compat" "0.2.11" + "@firebase/messaging" "0.12.14" + "@firebase/messaging-compat" "0.2.14" + "@firebase/performance" "0.6.11" + "@firebase/performance-compat" "0.2.11" + "@firebase/remote-config" "0.4.11" + "@firebase/remote-config-compat" "0.2.11" + "@firebase/storage" "0.13.4" + "@firebase/storage-compat" "0.3.14" + "@firebase/util" "1.10.2" + "@firebase/vertexai" "1.0.1" + flat-cache@^3.0.4: version "3.2.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" @@ -9715,7 +10033,7 @@ idb-keyval@^6.2.1: resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-6.2.1.tgz#94516d625346d16f56f3b33855da11bfded2db33" integrity sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg== -idb@^7.0.1: +idb@7.1.1, idb@^7.0.1: version "7.1.1" resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== @@ -11714,6 +12032,11 @@ log-update@^6.0.0: strip-ansi "^7.1.0" wrap-ansi "^9.0.0" +long@^5.0.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + longest-streak@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" @@ -13926,6 +14249,24 @@ property-information@^6.0.0: resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.1.tgz#de8b79a7415fd2107dfbe65758bb2cc9dfcf60ac" integrity sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w== +protobufjs@^7.2.5: + version "7.4.0" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a" + integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -16345,6 +16686,11 @@ undici-types@~6.19.2: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + unenv@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/unenv/-/unenv-1.9.0.tgz#469502ae85be1bd3a6aa60f810972b1a904ca312" @@ -17460,7 +17806,7 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.3.1, yargs@^17.5.1: +yargs@^17.3.1, yargs@^17.5.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== From 358b6d58fa2bae744e2bc3b9c526023b84d6ac4e Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Tue, 10 Dec 2024 04:00:34 +0530 Subject: [PATCH 20/36] WIP - Etherlink Onchain DAO Pages --- .../components/EvmDaoProposalList.tsx | 115 ++++++++++++++++ .../components/EvmProposalDetail.tsx | 0 .../etherlink/components/EvmProposalItem.tsx | 81 +++++++++++ .../explorer/EtherlinkDAO/EvmRegistryPage.tsx | 129 +++++++++++++++++- .../components/ProposalActionsDialog.tsx | 21 ++- .../explorer/pages/Proposals/index.tsx | 28 ++-- .../services/dao/mappers/proposal/types.ts | 1 + src/services/wagmi/context.tsx | 7 +- 8 files changed, 367 insertions(+), 15 deletions(-) create mode 100644 src/modules/etherlink/components/EvmDaoProposalList.tsx create mode 100644 src/modules/etherlink/components/EvmProposalDetail.tsx create mode 100644 src/modules/etherlink/components/EvmProposalItem.tsx diff --git a/src/modules/etherlink/components/EvmDaoProposalList.tsx b/src/modules/etherlink/components/EvmDaoProposalList.tsx new file mode 100644 index 00000000..d471ced0 --- /dev/null +++ b/src/modules/etherlink/components/EvmDaoProposalList.tsx @@ -0,0 +1,115 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useCallback, useEffect, useMemo, useState } from "react" +import { CircularProgress, Collapse, Grid, Typography, styled } from "@material-ui/core" +import { ProposalItem } from "modules/explorer/pages/User" +import { Link } from "react-router-dom" +import { Proposal, ProposalStatus } from "services/services/dao/mappers/proposal/types" +import { ProposalTableRow } from "modules/lite/explorer/components/ProposalTableRow" +import { Poll } from "models/Polls" +import ReactPaginate from "react-paginate" +import { EvmProposalItem } from "./EvmProposalItem" + +const TableContainer = styled(Grid)({ + width: "100%" +}) + +const CustomGrid = styled(Grid)({ + "&:not(:last-child)": { + marginBottom: 16 + } +}) + +const LoaderContainer = styled(Grid)({ + paddingTop: 40, + paddingBottom: 40 +}) + +interface Props { + proposals: Proposal[] | undefined + showFooter?: boolean + rightItem?: (proposal: Proposal) => React.ReactElement + showFullList?: boolean + filters: undefined +} + +interface ProposalObj { + type: string + proposal: Proposal | Poll +} + +export const EvmDaoProposalList: React.FC = ({ proposals, showFullList = true, filters = undefined }) => { + const [currentPage, setCurrentPage] = useState(0) + const [offset, setOffset] = useState(0) + const offsetLimit = 50 + const [filteredProposals, setFilteredProposals] = useState([]) + + const [isLoading, setIsLoading] = useState(false) + + console.log("EvmDaoProposalList", proposals) + const pageCount = Math.ceil(proposals ? proposals.length / offsetLimit : 0) + + // Invoke when user click to request another page. + const handlePageClick = (event: { selected: number }) => { + if (filteredProposals) { + setOffset((event.selected * offsetLimit) % filteredProposals.length) + setCurrentPage(event.selected) + } + } + + useEffect(() => { + setIsLoading(false) + setFilteredProposals( + proposals?.map((proposal: any) => ({ + id: proposal?.id, + title: proposal?.title, + proposer: proposal?.proposer || (proposal?.author as string), + type: "lambda", + proposal: proposal + })) ?? [] + ) + }, [proposals]) + + return ( + + {isLoading ? ( + + + + ) : ( + <> + + {filteredProposals && filteredProposals.length && filteredProposals.length > 0 ? ( + + {filteredProposals.slice(offset, offset + offsetLimit).map((p, i) => ( + + + + + + ))} + + ) : ( + No proposals found + )} + + {showFullList ? ( + + + + ) : null} + + )} + + ) +} diff --git a/src/modules/etherlink/components/EvmProposalDetail.tsx b/src/modules/etherlink/components/EvmProposalDetail.tsx new file mode 100644 index 00000000..e69de29b diff --git a/src/modules/etherlink/components/EvmProposalItem.tsx b/src/modules/etherlink/components/EvmProposalItem.tsx new file mode 100644 index 00000000..c8948fca --- /dev/null +++ b/src/modules/etherlink/components/EvmProposalItem.tsx @@ -0,0 +1,81 @@ +import { Box, Grid, Theme, Typography, styled, useMediaQuery, useTheme } from "@material-ui/core" +import dayjs from "dayjs" +import React from "react" +import { toShortAddress } from "services/contracts/utils" +import { Proposal, ProposalStatus } from "services/services/dao/mappers/proposal/types" +import { StatusBadge } from "modules/explorer/components/StatusBadge" + +const ContentBlockItem = styled(Grid)(({ theme }: { theme: Theme }) => ({ + padding: "37px 42px", + background: theme.palette.primary.main, + borderRadius: 8 +})) + +const ProposalTitle = styled(Typography)({ + fontWeight: "bold" +}) + +const CreatedText = styled(Typography)({ + fontWeight: 300, + color: "#bfc5ca" +}) + +const getStatusByHistory = (history: { active: number; executable: number; passed: number; pending: number }) => { + const statuses = Object.keys(history) + const status = statuses.reduce((maxStatus, currentStatus) => { + return history[currentStatus as keyof typeof history] > history[maxStatus as keyof typeof history] + ? currentStatus + : maxStatus + }) + // TODO: @ashutoshpw, handle more statuses + switch (status) { + case "active": + return ProposalStatus.ACTIVE + case "pending": + return ProposalStatus.PENDING + case "rejected": + return ProposalStatus.REJECTED + case "accepted": + return ProposalStatus.ACTIVE + case "executed": + return ProposalStatus.EXECUTED + default: + return ProposalStatus.NO_QUORUM + } +} + +export const EvmProposalItem: React.FC<{ + proposal: Proposal | any +}> = ({ proposal, children }) => { + const formattedDate = dayjs(proposal.startDate).format("LLL") + + return ( + + + + + + {proposal.title} + + + + + + + + + + Created at {formattedDate} by{" "} + + {proposal.author ? toShortAddress(proposal.author) : "unknown"} + + + + + + + + {children} + + ) +} diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmRegistryPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmRegistryPage.tsx index adb69a58..88f75fa7 100644 --- a/src/modules/etherlink/explorer/EtherlinkDAO/EvmRegistryPage.tsx +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmRegistryPage.tsx @@ -1,5 +1,128 @@ -import { Registry } from "modules/explorer/pages/Registry" +import { Button, Grid, Tooltip, useMediaQuery, useTheme } from "@material-ui/core" +import { CopyAddress } from "modules/common/CopyAddress" +import { ProposalFormContainer, ProposalFormDefaultValues } from "modules/explorer/components/ProposalForm" -export const EvmRegistryPage = () => { - return +import React, { useContext, useMemo, useState } from "react" +import { useDAO } from "services/services/dao/hooks/useDAO" +import { useProposals } from "services/services/dao/hooks/useProposals" +import { LambdaProposal } from "services/services/dao/mappers/proposal/types" +import { Hero } from "modules/explorer/components/Hero" +import { HeroTitle } from "modules/explorer/components/HeroTitle" +import { RegistryTable } from "modules/explorer/pages/Registry/components/RegistryTable" +import { useIsProposalButtonDisabled } from "../../../../services/contracts/baseDAO/hooks/useCycleInfo" +import { InfoIcon } from "modules/explorer/components/styled/InfoIcon" +import { MainButton } from "modules/common/MainButton" +import { LambdaDAO } from "services/contracts/baseDAO/lambdaDAO" +import { useEtherlinkDAOID } from "../router" +import { EtherlinkContext } from "services/wagmi/context" + +export const EvmRegistryPage: React.FC = () => { + const theme = useTheme() + const isMobileSmall = useMediaQuery(theme.breakpoints.down("sm")) + const daoId = useEtherlinkDAOID() + const { data: dao } = useDAO(daoId) + const { daoSelected } = useContext(EtherlinkContext) + const [updateRegistryOpen, setUpdateRegistryOpen] = useState(false) + const { data: proposalsData } = useProposals(daoId) + const [defaultData, setDefaultData] = useState() + const shouldDisable = useIsProposalButtonDisabled(daoId) + + const onCloseRegistryUpdate = () => { + setUpdateRegistryOpen(false) + setDefaultData(undefined) + } + + const proposals = useMemo(() => { + if (!proposalsData || !dao) { + return [] + } + + const registryDAO = dao as LambdaDAO + const registryProposalsData = proposalsData as LambdaProposal[] + + const registryAffectedKeysProposalIds = registryDAO.decoded.decodedRegistryAffected.map(r => r.proposalId) + + return registryProposalsData + .filter(proposal => registryAffectedKeysProposalIds.includes(proposal.id)) + .sort((a, b) => new Date(a.startDate).getTime() - new Date(b.startDate).getTime()) + .map(proposal => ({ + ...proposal, + description: "Proposal description", + address: proposal.id, + lastUpdated: proposal.startDate, + list: proposal.metadata.list, + proposalId: proposal.id, + agoraPostId: Number(proposal.metadata.agoraPostId) + })) + .flatMap(proposal => + proposal.list.map(({ key }) => ({ + ...proposal, + key + })) + ) + }, [dao, proposalsData]) + + const onClickItem = (item: { key: string; value: string }) => { + setDefaultData({ + registryUpdateForm: { + isBatch: false, + list: [item] + } + }) + setUpdateRegistryOpen(true) + } + + const registryList = Object.entries(daoSelected?.registry).map(([key, value]) => ({ + key, + value: value as string, + onClick: () => {}, + lastUpdated: "" + })) + + console.log("registryList", registryList) + + return ( + <> + + + + Registry + {dao && ( + + )} + + + setUpdateRegistryOpen(true)} + disabled={shouldDisable} + > + New Item + + {shouldDisable && ( + + + + )} + + + + + + + {/* */} + + ) } diff --git a/src/modules/explorer/components/ProposalActionsDialog.tsx b/src/modules/explorer/components/ProposalActionsDialog.tsx index 652c6843..f2bb01db 100644 --- a/src/modules/explorer/components/ProposalActionsDialog.tsx +++ b/src/modules/explorer/components/ProposalActionsDialog.tsx @@ -377,20 +377,35 @@ const ProposalActionsDialogForEtherlink: React.FC = ({ open, handleClose {[ + { + label: "Off-Chain Debate", + description: "Post a thesis and have tokenized arguments around it", + modal: "off_chain_debate" + }, { label: "Transfer Funds", description: "Propose a transfer of funds from the DAO treasury", modal: "transfer_funds" }, { - label: "Change Config", - description: "Propose changes to the DAO configuration", - modal: "change_config" + label: "Edit Registry", + description: "Change an entry or add a new one", + modal: "edit_registry" }, { label: "Contract Call", description: "Propose a call to an external contract", modal: "contract_call" + }, + { + label: "Change Config", + description: "Propose changes to the DAO configuration", + modal: "change_config" + }, + { + label: "Token Operation", + description: "Propose a token operation", + modal: "token_operation" } ].map((option, index) => ( setModalOpen(option.modal as any)}> diff --git a/src/modules/explorer/pages/Proposals/index.tsx b/src/modules/explorer/pages/Proposals/index.tsx index 483e5e5b..1e75e58b 100644 --- a/src/modules/explorer/pages/Proposals/index.tsx +++ b/src/modules/explorer/pages/Proposals/index.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useState } from "react" +import React, { useCallback, useState, useContext } from "react" import { Button, FormControl, @@ -36,6 +36,9 @@ import DeleteIcon from "@mui/icons-material/Delete" import FilterAltIcon from "@mui/icons-material/FilterAlt" import { FilterProposalsDialog } from "modules/explorer/components/FiltersDialog" import { Filters } from "../User/components/UserMovements" +import { useEtherlinkDAOID } from "modules/etherlink/explorer/router" +import { EtherlinkContext } from "services/wagmi/context" +import { EvmDaoProposalList } from "modules/etherlink/components/EvmDaoProposalList" const FiltersContainer = styled(Grid)({ marginTop: 45, @@ -337,11 +340,13 @@ const TezosProposals = () => { } export const EtherlinkProposals = () => { - const daoId = useDAOID() - const { data, cycleInfo } = useDAO(daoId) - const { data: proposals } = useProposals(daoId) + const daoId = useEtherlinkDAOID() + // TODO: Replace useContext with a useEtherlinkProvider + const { daoProposals } = useContext(EtherlinkContext) + // const { data, cycleInfo } = useDAO(daoId) + // const { data: proposals } = useProposals(daoId) const theme = useTheme() - const isMobileSmall = useMediaQuery(theme.breakpoints.down("xs")) + // const isMobileSmall = useMediaQuery(theme.breakpoints.down("xs")) const [openDialog, setOpenDialog] = useState(false) const handleCloseModal = () => { @@ -371,6 +376,9 @@ export const EtherlinkProposals = () => { style={{ color: "#fff", border: "1px solid #ccc", height: "40px" }} > All + Off-Chain + Token Operation + Registry Transfer Contract Call Change Config @@ -387,10 +395,13 @@ export const EtherlinkProposals = () => { > All Active - Approved - Rejected + Passed + Executable Executed Expired + No Quorum + Pending + Rejected { }} > - 143 Proposals + {daoProposals?.length || 0} Proposals @@ -418,6 +429,7 @@ export const EtherlinkProposals = () => { + ) } diff --git a/src/services/services/dao/mappers/proposal/types.ts b/src/services/services/dao/mappers/proposal/types.ts index c5a2c0d5..d0babb0e 100644 --- a/src/services/services/dao/mappers/proposal/types.ts +++ b/src/services/services/dao/mappers/proposal/types.ts @@ -106,6 +106,7 @@ const INDEXER_TO_PROPOSAL_STATUS_MAP: Record = { export abstract class Proposal { id: string + title?: string dao: BaseDAO upVotes: BigNumber downVotes: BigNumber diff --git a/src/services/wagmi/context.tsx b/src/services/wagmi/context.tsx index 67f98463..a891b41f 100644 --- a/src/services/wagmi/context.tsx +++ b/src/services/wagmi/context.tsx @@ -60,10 +60,13 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children console.log("Wagmi Address", address) const [isLoadingDaos, setIsLoadingDaos] = useState(true) + const [isLoadingDaoProposals, setIsLoadingDaoProposals] = useState(true) + const selectedDaoIdRef = useRef(null) const [daoData, setDaoData] = useState([]) const [daoSelected, setDaoSelected] = useState({}) const [daoProposals, setDaoProposals] = useState([]) + const [daoProposalSelected, setDaoProposalSelected] = useState({}) const [daoMembers, setDaoMembers] = useState([]) const { data: firestoreData, loading, fetchCollection } = useFirestoreStore() @@ -80,7 +83,7 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children } const daoProposalKey = `daosEtherlink-Testnet/${daoSelected.id}/proposals` if (firestoreData?.[daoProposalKey]) { - setDaoProposals(firestoreData[daoProposalKey]) + setDaoProposals(firestoreData[daoProposalKey]?.sort((a: any, b: any) => b.createdAt - a.createdAt)) } const daoMembersKey = `daosEtherlink-Testnet/${daoSelected.id}/members` if (firestoreData?.[daoMembersKey]) { @@ -112,8 +115,10 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children }, daos: daoData, isLoadingDaos, + isLoadingDaoProposals: false, daoSelected: daoSelected, daoProposals: daoProposals, + daoProposalSelected: daoProposalSelected, daoMembers: daoMembers, selectDao: (daoId: string) => { const dao = daoData.find(dao => dao.id === daoId) From a140e737dd98fe46b509eccc44b0d151eef5f155 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Tue, 10 Dec 2024 15:50:50 +0530 Subject: [PATCH 21/36] WIP - Onchain Proposal Details Page --- .../components/EvmDaoSettingsModal.tsx | 138 ++++++++++ .../etherlink/components/EvmDaoStatsRow.tsx | 72 ++++++ .../components/EvmProposalDetailCard.tsx | 218 ++++++++++++++++ .../etherlink/components/EvmProposalItem.tsx | 30 +-- .../components/EvmProposalVoteDetail.tsx | 235 ++++++++++++++++++ .../components/VotingPowerWidget.tsx | 154 ++++++++++++ .../explorer/EtherlinkDAO/EvmMembersPage.tsx | 7 +- .../EtherlinkDAO/EvmProposalDetailsPage.tsx | 106 +++++++- .../explorer/EtherlinkDAO/EvmRegistryPage.tsx | 2 +- src/modules/etherlink/explorer/index.tsx | 185 ++++++-------- .../explorer/pages/Proposals/index.tsx | 2 +- src/services/wagmi/context.tsx | 46 +++- 12 files changed, 1049 insertions(+), 146 deletions(-) create mode 100644 src/modules/etherlink/components/EvmDaoSettingsModal.tsx create mode 100644 src/modules/etherlink/components/EvmDaoStatsRow.tsx create mode 100644 src/modules/etherlink/components/EvmProposalDetailCard.tsx create mode 100644 src/modules/etherlink/components/EvmProposalVoteDetail.tsx create mode 100644 src/modules/etherlink/components/VotingPowerWidget.tsx diff --git a/src/modules/etherlink/components/EvmDaoSettingsModal.tsx b/src/modules/etherlink/components/EvmDaoSettingsModal.tsx new file mode 100644 index 00000000..0f9e6d70 --- /dev/null +++ b/src/modules/etherlink/components/EvmDaoSettingsModal.tsx @@ -0,0 +1,138 @@ +import React, { useContext } from "react" +import { + Grid, + styled, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Typography, + useMediaQuery, + useTheme +} from "@material-ui/core" +import { ResponsiveDialog } from "modules/explorer/components/ResponsiveDialog" + +import { EtherlinkContext } from "services/wagmi/context" +import { CopyButton } from "modules/common/CopyButton" +import { CopyAddress } from "modules/common/CopyAddress" + +const CustomTableContainer = styled(TableContainer)(({ theme }) => ({ + width: "inherit", + [theme.breakpoints.down("sm")]: {} +})) + +const CustomTableCell = styled(TableCell)(({ theme }) => ({ + [theme.breakpoints.down("sm")]: { + paddingBottom: 0, + paddingLeft: "16px !important", + textAlign: "end" + } +})) + +const CustomTableCellValue = styled(TableCell)(({ theme }) => ({ + [theme.breakpoints.down("sm")]: { + paddingTop: 0, + paddingRight: "16px !important", + textAlign: "end", + paddingBottom: 0 + } +})) + +const RowValue = styled(Typography)(({ theme }) => ({ + fontWeight: 300, + fontSize: 18, + [theme.breakpoints.down("sm")]: { + fontSize: 16 + } +})) + +export const EvmDaoSettingModal: React.FC<{ + open: boolean + handleClose: () => void +}> = ({ open, handleClose }) => { + const { daoSelected } = useContext(EtherlinkContext) + const theme = useTheme() + const isMobileSmall = useMediaQuery(theme.breakpoints.down("sm")) + + const tableData = [ + { + key: "DAO Contract Address", + value: daoSelected?.address + }, + { + key: "Treasury Address", + value: daoSelected?.treasuryAddress + }, + { + key: "Registry Address", + value: daoSelected?.registryAddress + }, + { + key: "Governance Token", + value: daoSelected?.token + }, + { + key: "Quorum", + value: daoSelected?.quorum + }, + { + key: "Proposal Threshold", + value: daoSelected?.proposalThreshold + }, + { + key: "Voting Duration (minutes", + value: daoSelected?.votingDuration + }, + { + key: "Voting Delay (minutes)", + value: daoSelected?.votingDelay + }, + { + key: "Execution Delay (minutes)", + value: daoSelected?.executionDelay + } + ] + + return ( + <> + + + + + {daoSelected?.id && + tableData.map((item: { key: string; value: string }) => ( + + + + {item.key} + + + + {typeof item.value === "string" && item?.value?.startsWith("0x") ? ( + + {isMobileSmall ? ( + + ) : ( + <> + + {item.value} + + + + )} + + ) : ( + {item.value} + )} + + + ))} + +
+
+
+ + ) +} diff --git a/src/modules/etherlink/components/EvmDaoStatsRow.tsx b/src/modules/etherlink/components/EvmDaoStatsRow.tsx new file mode 100644 index 00000000..2b37dbef --- /dev/null +++ b/src/modules/etherlink/components/EvmDaoStatsRow.tsx @@ -0,0 +1,72 @@ +import React, { useContext, useMemo } from "react" +import { Box, Grid, styled, useTheme, Typography, Paper } from "@material-ui/core" + +import { EtherlinkContext } from "services/wagmi/context" + +const Item = styled(Paper)(({ theme }) => ({ + backgroundColor: "#24282d", + borderRadius: 8, + color: theme.palette.text.primary, + height: 84, + display: "flex", + padding: "33px 40px 30px 40px", + flexDirection: "column", + gap: 8 +})) + +const ItemContent = styled(Grid)({ + gap: 8 +}) + +const ItemTitle = styled(Typography)(({ theme }) => ({ + fontSize: 18, + fontWeight: 500, + [theme.breakpoints.down("md")]: { + fontSize: 15 + } +})) + +const ItemValue = styled(Typography)(({ theme }) => ({ + fontSize: 32, + fontWeight: 300, + overflowX: "scroll", + cursor: "default", + [theme.breakpoints.down("sm")]: { + fontSize: 28 + } +})) + +export const EvmDaoStatsRow = () => { + const { daoSelected } = useContext(EtherlinkContext) + return ( + + + {[ + { + title: "Members", + value: daoSelected?.holders + }, + { + title: "Active Proposals", + value: daoSelected?.proposals?.length || "0" + }, + { + title: "Awaiting Executions", + value: daoSelected?.awaiting_executions || "-" + } + ].map((item, index) => ( + + + + {item.title} + + + {item.value} + + + + ))} + + + ) +} diff --git a/src/modules/etherlink/components/EvmProposalDetailCard.tsx b/src/modules/etherlink/components/EvmProposalDetailCard.tsx new file mode 100644 index 00000000..267ac5d6 --- /dev/null +++ b/src/modules/etherlink/components/EvmProposalDetailCard.tsx @@ -0,0 +1,218 @@ +import React from "react" +import { Grid, styled, Typography, Link, useTheme, useMediaQuery, Popover, withStyles } from "@material-ui/core" +import { GridContainer } from "modules/common/GridContainer" +import { ProposalStatus, TableStatusBadge } from "modules/lite/explorer/components/ProposalTableRowStatusBadge" +import { CreatorBadge } from "modules/lite/explorer/components/CreatorBadge" +import { FileCopyOutlined } from "@material-ui/icons" +import Share from "assets/img/share.svg" +import { CommunityBadge } from "modules/lite/explorer/components/CommunityBadge" +import LinkIcon from "assets/img/link.svg" +import { Poll } from "models/Polls" +import dayjs from "dayjs" +import { useNotification } from "modules/common/hooks/useNotification" +import ReactHtmlParser from "react-html-parser" + +const LogoItem = styled("img")(({ theme }) => ({ + cursor: "pointer", + [theme.breakpoints.down("sm")]: { + height: 10 + } +})) + +const TextContainer = styled(Typography)(({ theme }) => ({ + display: "flex", + alignItems: "center", + gap: 10, + marginRight: 8, + [theme.breakpoints.down("sm")]: { + marginTop: 20 + } +})) + +const EndTextContainer = styled(Typography)(({ theme }) => ({ + display: "flex", + alignItems: "center", + gap: 10, + marginRight: 8, + [theme.breakpoints.down("sm")]: { + marginTop: 20 + } +})) + +const EndText = styled(Typography)(({ theme }) => ({ + [theme.breakpoints.down("sm")]: { + marginTop: 20 + } +})) + +const Divider = styled(Typography)(({ theme }) => ({ + marginLeft: 8, + marginRight: 8, + [theme.breakpoints.down("sm")]: { + marginTop: 20 + } +})) + +const StyledLink = styled(Link)(({ theme }) => ({ + fontFamily: "Roboto Flex", + fontWeight: 300, + fontSize: 16, + marginLeft: 8, + [theme.breakpoints.down("sm")]: { + fontWeight: 100, + fontSize: 10 + } +})) + +const CopyIcon = styled(FileCopyOutlined)({ + marginRight: 8, + cursor: "pointer" +}) + +const CustomPopover = withStyles({ + paper: { + "marginTop": 10, + "padding": 8, + "cursor": "pointer", + "background": "#1c1f23 !important", + "&:hover": { + background: "#81feb76b !important" + } + } +})(Popover) + +export const EvmProposalDetailCard: React.FC<{ poll: Poll | undefined }> = ({ poll }) => { + const theme = useTheme() + const isMobileSmall = useMediaQuery(theme.breakpoints.down("sm")) + const [anchorEl, setAnchorEl] = React.useState(null) + const openNotification = useNotification() + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(anchorEl ? null : event.currentTarget) + } + + const handleClose = () => { + setAnchorEl(null) + } + + const open = Boolean(anchorEl) + const id = open ? "simple-popper" : undefined + + const handleCopy = () => { + const url = location.href + navigator.clipboard.writeText(url) + openNotification({ + message: "Proposal link copied to clipboard!", + autoHideDuration: 3000, + variant: "success" + }) + handleClose() + } + + return ( + <> + + + + + + {poll?.name} + + + + + + + + + Share + + + + + + Copy link + + + + + + + + + + + + + + {/* */} + + + + + + + + + + Start date:{" "} + + + {dayjs(Number(poll?.startTime)).format("lll")} + + - + + End date:{" "} + + + {dayjs(Number(poll?.endTime)).format("lll")} + + + + + + + {ReactHtmlParser(poll?.description ? poll?.description : "")} + + + + {poll?.externalLink ? ( + + + + {poll?.externalLink} + + + ) : null} + + + + ) +} diff --git a/src/modules/etherlink/components/EvmProposalItem.tsx b/src/modules/etherlink/components/EvmProposalItem.tsx index c8948fca..680dd0ed 100644 --- a/src/modules/etherlink/components/EvmProposalItem.tsx +++ b/src/modules/etherlink/components/EvmProposalItem.tsx @@ -1,8 +1,8 @@ -import { Box, Grid, Theme, Typography, styled, useMediaQuery, useTheme } from "@material-ui/core" +import { Grid, Theme, Typography, styled } from "@material-ui/core" import dayjs from "dayjs" import React from "react" import { toShortAddress } from "services/contracts/utils" -import { Proposal, ProposalStatus } from "services/services/dao/mappers/proposal/types" +import { Proposal } from "services/services/dao/mappers/proposal/types" import { StatusBadge } from "modules/explorer/components/StatusBadge" const ContentBlockItem = styled(Grid)(({ theme }: { theme: Theme }) => ({ @@ -20,30 +20,6 @@ const CreatedText = styled(Typography)({ color: "#bfc5ca" }) -const getStatusByHistory = (history: { active: number; executable: number; passed: number; pending: number }) => { - const statuses = Object.keys(history) - const status = statuses.reduce((maxStatus, currentStatus) => { - return history[currentStatus as keyof typeof history] > history[maxStatus as keyof typeof history] - ? currentStatus - : maxStatus - }) - // TODO: @ashutoshpw, handle more statuses - switch (status) { - case "active": - return ProposalStatus.ACTIVE - case "pending": - return ProposalStatus.PENDING - case "rejected": - return ProposalStatus.REJECTED - case "accepted": - return ProposalStatus.ACTIVE - case "executed": - return ProposalStatus.EXECUTED - default: - return ProposalStatus.NO_QUORUM - } -} - export const EvmProposalItem: React.FC<{ proposal: Proposal | any }> = ({ proposal, children }) => { @@ -61,7 +37,7 @@ export const EvmProposalItem: React.FC<{ - + diff --git a/src/modules/etherlink/components/EvmProposalVoteDetail.tsx b/src/modules/etherlink/components/EvmProposalVoteDetail.tsx new file mode 100644 index 00000000..df2ead34 --- /dev/null +++ b/src/modules/etherlink/components/EvmProposalVoteDetail.tsx @@ -0,0 +1,235 @@ +/* eslint-disable @typescript-eslint/no-non-null-asserted-optional-chain */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import React, { useContext, useEffect, useMemo, useState } from "react" +import { Button, Grid, LinearProgress, styled, Typography, useMediaQuery, useTheme } from "@material-ui/core" +import { GridContainer } from "modules/common/GridContainer" +import { VotesDialog } from "modules/lite/explorer/components/VotesDialog" +import { Poll } from "models/Polls" +import { Choice } from "models/Choice" + +import { useTezos } from "services/beacon/hooks/useTezos" +import { getTurnoutValue } from "services/utils/utils" +import { useTokenDelegationSupported } from "services/contracts/token/hooks/useTokenDelegationSupported" +import { DownloadCsvFile } from "modules/lite/explorer/components/DownloadCsvFile" +import { EtherlinkContext } from "services/wagmi/context" + +const Container = styled(Grid)(({ theme }) => ({ + background: theme.palette.primary.main, + borderRadius: 8 +})) + +const TitleContainer = styled(Grid)(({ theme }) => ({ + paddingTop: 18, + paddingLeft: 46, + paddingRight: 46, + paddingBottom: 18, + borderBottom: `0.3px solid ${theme.palette.primary.light}`, + [theme.breakpoints.down("sm")]: { + padding: "18px 25px" + } +})) + +const LinearContainer = styled(GridContainer)({ + paddingBottom: 0, + minHeight: 110 +}) + +const LegendContainer = styled(GridContainer)({ + minHeight: 30, + paddingBottom: 0 +}) + +const GraphicsContainer = styled(Grid)({ + paddingBottom: 25 +}) + +export const EvmProposalVoteDetail: React.FC<{ + poll: Poll | undefined + choices: Choice[] + token: any + isXTZ: boolean +}> = ({ poll, choices, token, isXTZ }) => { + const theme = useTheme() + const isMobileSmall = useMediaQuery(theme.breakpoints.down("xs")) + const isMobile = useMediaQuery(theme.breakpoints.down("sm")) + const [open, setOpen] = React.useState(false) + const { network } = useTezos() + const [turnout, setTurnout] = useState() + const [votes, setVotes] = useState([]) + const { daoSelected, daoProposalSelected } = useContext(EtherlinkContext) + const tokenData = useMemo( + () => ({ + tokenAddress: daoSelected?.token, + tokenID: daoSelected?.id, + symbol: daoSelected?.symbol, + decimals: daoSelected?.decimals + }), + [daoSelected] + ) + const { data: isTokenDelegationSupported } = useTokenDelegationSupported(tokenData?.tokenAddress) + const totalVoteCount = daoProposalSelected?.votesFor + daoProposalSelected?.votesAgainst + + const handleClickOpen = () => { + setVotes(choices.filter(elem => elem.walletAddresses.length > 0)) + setOpen(true) + } + + const handleClose = () => { + setOpen(false) + } + + const formatConfig = { + average: true, + mantissa: 1, + thousandSeparated: true, + trimMantissa: true + } + + useMemo(async () => { + if (token && tokenData) { + const value = await getTurnoutValue( + network, + tokenData?.tokenAddress, + tokenData.tokenID, + Number(poll?.referenceBlock), + totalVoteCount + ) + if (value) { + setTurnout(value) + } + } + }, [poll, network, token, tokenData, totalVoteCount]) + + return ( + + {/* Disabled as Data is wrong in Firebase */} + {/* + + Voter Turnout + + + + + + + + + */} + + + Vorting Results + + + + {choices && + choices.map((choice: Choice, index) => { + const isFor = choice.name === "For" + const voteCount = isFor ? daoProposalSelected?.votesFor : daoProposalSelected?.votesAgainst + + const linearProgressValue = totalVoteCount > 0 ? (voteCount / totalVoteCount) * 100 : 0 + return ( + + + + + {choice.name} + + + + + {voteCount} Voters - {tokenData?.symbol} + + + + + + + + + + {linearProgressValue}% + + + + + ) + })} + + + + handleClickOpen()}> + {totalVoteCount} + + handleClickOpen()}> + Votes + + {isTokenDelegationSupported && turnout && !poll?.isXTZ ? ( + + ({turnout.toFixed(2)} % Turnout) + + ) : null} + + + + {/* + {numbro(calculateProposalTotal(choices, isXTZ ? 6 : tokenData?.decimals)).format(formatConfig)} + + + {isXTZ ? "XTZ" : poll?.tokenSymbol} + */} + + {/* {!poll?.isXTZ && ( + + ( + {getTreasuryPercentage( + calculateProposalTotal(choices, isXTZ ? 6 : tokenData?.decimals), + poll?.totalSupplyAtReferenceBlock, + isXTZ ? 6 : tokenData?.decimals + ) + .dp(5, 1) + .toString()} + % of Total Supply) + + )} */} + {totalVoteCount > 0 ? ( + + ) : null} + + + + + + ) +} diff --git a/src/modules/etherlink/components/VotingPowerWidget.tsx b/src/modules/etherlink/components/VotingPowerWidget.tsx new file mode 100644 index 00000000..9e9b6a93 --- /dev/null +++ b/src/modules/etherlink/components/VotingPowerWidget.tsx @@ -0,0 +1,154 @@ +import React, { useState, useEffect } from "react" +import { Box, Select, MenuItem, Typography, Slider, Paper, styled, SelectChangeEvent, Grid } from "@mui/material" +import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown" + +export interface Org { + symbol: string +} + +export interface Member { + name: string + votingWeight: number +} + +// TODO: @ashutoshpw Replace with actual data +export const generateMembers = (): Member[] => { + return Array.from({ length: 100 }, (_, index) => ({ + name: `Member ${index + 1}`, + votingWeight: Math.random() * 100 + 1 + })) +} + +const StyledPaper = styled(Paper)(({ theme }) => ({ + minWidth: 520, + height: 30, + backgroundColor: theme.palette.grey[200], + display: "flex", + alignItems: "center", + justifyContent: "center" +})) + +const StyledSelect = styled(Select)(({ theme }) => ({ + "& .MuiSelect-select": { + paddingRight: theme.spacing(4), + fontWeight: 600, + backgroundColor: "transparent" + }, + "&:before, &:after": { + display: "none" + } +})) + +export const VotingPowerStats: React.FC<{ + membersCount: number + membersPercentage: number + votingPower: number + votingPowerPercentage: number +}> = ({ membersCount, membersPercentage, votingPower, votingPowerPercentage }) => { + return ( + + + + Number of Members + + + {membersCount} + + + {membersPercentage.toFixed(2)}% + + + + + Voting Power + + + {votingPower.toFixed(2)} + + + {votingPowerPercentage.toFixed(2)}% + + + + ) +} + +export const VotingPowerWidget: React.FC<{ tokenSymbol: string }> = ({ tokenSymbol }) => { + const [sliderValue, setSliderValue] = useState(1) + const [members, setMembers] = useState([]) + const [selectedFeature, setSelectedFeature] = useState("vote concentration") + const concentrationOptions = ["vote concentration", `${tokenSymbol} ownership`] + + useEffect(() => { + const initialMembers = generateMembers() + initialMembers.sort((a, b) => b.votingWeight - a.votingWeight) + setMembers(initialMembers) + }, []) + + const totalMembers = members.length + const totalVotingPower = members.reduce((sum, member) => sum + member.votingWeight, 0) + const percentageOfMembers = 101 - sliderValue + const membersToInclude = Math.max(1, Math.round((percentageOfMembers / 100) * totalMembers)) + const selectedMembers = members.slice(0, membersToInclude) + const cumulativeVotingPower = selectedMembers.reduce((sum, member) => sum + member.votingWeight, 0) + + const membersPercentage = (membersToInclude / totalMembers) * 100 + const votingPowerPercentage = (cumulativeVotingPower / totalVotingPower) * 100 + + return ( + + + + Drag slider to check + + + { + setSelectedFeature(event.target.value) + }} + IconComponent={KeyboardArrowDownIcon} + variant="standard" + > + {concentrationOptions.map(option => ( + + {option} + + ))} + + + + + + + + + setSliderValue(value as number)} + min={1} + max={100} + sx={{ width: 430 }} + /> + + + + ) +} diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmMembersPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmMembersPage.tsx index deb8e0f9..3699a972 100644 --- a/src/modules/etherlink/explorer/EtherlinkDAO/EvmMembersPage.tsx +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmMembersPage.tsx @@ -3,6 +3,7 @@ import { TitleText } from "components/ui/TitleText" import { EvmMembersTable } from "modules/etherlink/components/EvmMembersTable" import { EtherlinkContext } from "services/wagmi/context" import { useContext } from "react" +import { VotingPowerWidget } from "modules/etherlink/components/VotingPowerWidget" export const EvmMembersPage = () => { const { daoMembers } = useContext(EtherlinkContext) @@ -16,10 +17,14 @@ export const EvmMembersPage = () => { console.log("daoMemberData", daoMemberData, daoMembers) return ( - + Members + + + + diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx index a6732bd8..465bcb95 100644 --- a/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx @@ -1,3 +1,107 @@ +import { ArrowBackIosOutlined } from "@mui/icons-material" +import { GridContainer } from "modules/common/GridContainer" +import { Button, Grid, Typography, useMediaQuery, useTheme } from "@mui/material" +import { PageContainer } from "components/ui/DaoCreator" +import { ProposalDetailCard } from "modules/lite/explorer/components/ProposalDetailCard" +import { useContext, useEffect } from "react" +import { useParams } from "react-router-dom" +import { EtherlinkContext } from "services/wagmi/context" +import { ProposalStatus } from "services/services/dao/mappers/proposal/types" +import { EvmProposalDetailCard } from "modules/etherlink/components/EvmProposalDetailCard" +import { ChoiceItemSelected } from "modules/lite/explorer/components/ChoiceItemSelected" +import { EvmProposalVoteDetail } from "modules/etherlink/components/EvmProposalVoteDetail" export const EvmProposalDetailsPage = () => { - return
Proposal Details
+ const params = useParams() as { proposalId: string } + const proposalId = params?.proposalId + + const { daoSelected, daoProposalSelected, selectDaoProposal } = useContext(EtherlinkContext) + const theme = useTheme() + const isMobileSmall = useMediaQuery(theme.breakpoints.down("sm")) + + useEffect(() => { + selectDaoProposal(proposalId) + }, [proposalId, selectDaoProposal]) + + const choices = [ + { + name: "For", + pollID: "1", + walletAddresses: [], + selected: true + }, + { + name: "Against", + pollID: "1", + walletAddresses: [], + selected: false + } + ] + console.log("daoProposalSelected", daoProposalSelected) + + return ( +
+ Proposal Details + + + + + + + {choices && choices.length > 0 ? ( + + + {/* {[choices].map((choice, index) => { + return ( + {}} + /> + ) + })} */} + + {/* {poll?.isActive === ProposalStatus.ACTIVE ? ( + + ) : null} */} + + ) : null} + + + + {/* {poll && poll !== undefined ? ( + + ) : null} */} + + + +
+ ) } diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmRegistryPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmRegistryPage.tsx index 88f75fa7..e2b88585 100644 --- a/src/modules/etherlink/explorer/EtherlinkDAO/EvmRegistryPage.tsx +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmRegistryPage.tsx @@ -89,7 +89,7 @@ export const EvmRegistryPage: React.FC = () => { Registry {dao && ( { const daoId = useEtherlinkDAOID() const { data, cycleInfo, ledger } = useDAO(daoId) + const { daoSelected } = useContext(EtherlinkContext) - console.log("explorer/index.tsx", data) const theme = useTheme() const isExtraSmall = useMediaQuery(theme.breakpoints.down("xs")) - const symbol = (data && data.data.token?.symbol?.toUpperCase()) || "Unknown" + const symbol = (daoSelected && daoSelected?.token?.toUpperCase()) || "Unknown" - const name = data && data.data.name - const description = data && data.data.description + const name = daoSelected && daoSelected?.name + const description = daoSelected && daoSelected?.description const [openDialog, setOpenDialog] = useState(false) const [openChangeDialog, setChangeOpenDialog] = useState(false) @@ -45,28 +40,6 @@ export const EtherlinkDAOOverview: React.FC = () => { setChangeOpenDialog(false) } - const usersTableData = useMemo(() => { - if (data?.data?.meta?.users) { - return data.data.meta.users - } - - if (!ledger || !cycleInfo || !data) { - return [] - } - - return ledger - .sort((a, b) => b.available_balance.minus(a.available_balance).toNumber()) - .map(p => ({ - address: p.holder.address, - totalStaked: new BigNumber(p.total_balance).dp(10, 1).toString(), - availableStaked: new BigNumber(p.available_balance).dp(10, 1).toString(), - votes: p.holder.votes_cast.toString(), - proposalsVoted: p.holder.proposals_voted.toString() - })) - }, [cycleInfo, data, ledger]) - - console.log({ usersTableData }) - return ( @@ -83,7 +56,7 @@ export const EtherlinkDAOOverview: React.FC = () => { View Settings - {/* */} + setChangeOpenDialog(true)}> @@ -94,86 +67,70 @@ export const EtherlinkDAOOverview: React.FC = () => {
- {data?.data.network?.startsWith("etherlink") ? ( - <> - - - - DAO Contract - - - {data?.data.address || "-"} - { - if (data?.data.address) { - navigator.clipboard.writeText(data.data.address) - } - }} - size="small" - style={{ marginLeft: "8px", color: theme.palette.primary.light }} - > - - - - - - - Governance Token - - - {data?.data.token.symbol || "-"} - { - if (data?.data.token.symbol) { - navigator.clipboard.writeText(data.data.token.symbol) - } - }} - size="small" - style={{ marginLeft: "8px" }} - > - - - - - - {description} - - -
- - ) : ( - {description} - )} + + + + DAO Contract + + + {daoSelected?.address || "-"} + { + if (daoSelected?.address) { + navigator.clipboard.writeText(daoSelected.address) + } + }} + size="small" + style={{ marginLeft: "8px", color: theme.palette.primary.light }} + > + + + + + + + Governance Token + + + {daoSelected?.token || "-"} + { + if (daoSelected?.token) { + navigator.clipboard.writeText(daoSelected.token) + } + }} + size="small" + style={{ marginLeft: "8px" }} + > + + + + + + {description} + + +
- - - - {/* */} - +
) } diff --git a/src/modules/explorer/pages/Proposals/index.tsx b/src/modules/explorer/pages/Proposals/index.tsx index 1e75e58b..2252196f 100644 --- a/src/modules/explorer/pages/Proposals/index.tsx +++ b/src/modules/explorer/pages/Proposals/index.tsx @@ -348,7 +348,7 @@ export const EtherlinkProposals = () => { const theme = useTheme() // const isMobileSmall = useMediaQuery(theme.breakpoints.down("xs")) const [openDialog, setOpenDialog] = useState(false) - + console.log({ daoProposals }) const handleCloseModal = () => { setOpenDialog(false) } diff --git a/src/services/wagmi/context.tsx b/src/services/wagmi/context.tsx index a891b41f..78d3568d 100644 --- a/src/services/wagmi/context.tsx +++ b/src/services/wagmi/context.tsx @@ -6,6 +6,8 @@ import { etherlink, etherlinkTestnet } from "wagmi/chains" import { useSIWE, useModal, SIWESession } from "connectkit" import { useEthersProvider, useEthersSigner } from "./ethers" import useFirestoreStore from "services/contracts/etherlinkDAO/hooks/useFirestoreStore" +import { useParams } from "react-router-dom" +import { Proposal, ProposalStatus } from "services/services/dao/mappers/proposal/types" interface EtherlinkType { isConnected: boolean @@ -19,6 +21,31 @@ interface EtherlinkType { disconnect: () => void } +// TODO: @ashutoshpw, handle more statuus and move to utils +const getStatusByHistory = (history: { active: number; executable: number; passed: number; pending: number }) => { + const statuses = Object.keys(history) + const status = statuses.reduce((maxStatus, currentStatus) => { + return history[currentStatus as keyof typeof history] > history[maxStatus as keyof typeof history] + ? currentStatus + : maxStatus + }) + // TODO: @ashutoshpw, handle more statuses + switch (status) { + case "active": + return ProposalStatus.ACTIVE + case "pending": + return ProposalStatus.PENDING + case "rejected": + return ProposalStatus.REJECTED + case "accepted": + return ProposalStatus.ACTIVE + case "executed": + return ProposalStatus.EXECUTED + default: + return ProposalStatus.NO_QUORUM + } +} + export const EtherlinkContext = createContext(undefined) export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children }) => { @@ -66,6 +93,7 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children const [daoData, setDaoData] = useState([]) const [daoSelected, setDaoSelected] = useState({}) const [daoProposals, setDaoProposals] = useState([]) + const [daoProposalSelectedId, setDaoProposalSelectedId] = useState(null) const [daoProposalSelected, setDaoProposalSelected] = useState({}) const [daoMembers, setDaoMembers] = useState([]) const { data: firestoreData, loading, fetchCollection } = useFirestoreStore() @@ -83,7 +111,16 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children } const daoProposalKey = `daosEtherlink-Testnet/${daoSelected.id}/proposals` if (firestoreData?.[daoProposalKey]) { - setDaoProposals(firestoreData[daoProposalKey]?.sort((a: any, b: any) => b.createdAt - a.createdAt)) + setDaoProposals( + firestoreData[daoProposalKey] + ?.sort((a: any, b: any) => b.createdAt - a.createdAt) + .map(firebaseProposal => { + return { + ...firebaseProposal, + status: getStatusByHistory(firebaseProposal.statusHistory) + } + }) + ) } const daoMembersKey = `daosEtherlink-Testnet/${daoSelected.id}/members` if (firestoreData?.[daoMembersKey]) { @@ -120,6 +157,13 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children daoProposals: daoProposals, daoProposalSelected: daoProposalSelected, daoMembers: daoMembers, + selectDaoProposal: (proposalId: string) => { + const proposal = daoProposals.find((proposal: any) => proposal.id === proposalId) + if (proposal) { + setDaoProposalSelected(proposal) + // fetchCollection(`daosEtherlink-Testnet/${daoSelected.id}/proposals/${proposalId}`) + } + }, selectDao: (daoId: string) => { const dao = daoData.find(dao => dao.id === daoId) // alert(`dao:${daoId}`) From 748fc1f074997f528eab5f9a758512a079cae169 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Tue, 10 Dec 2024 17:31:21 +0530 Subject: [PATCH 22/36] Almost Zero ESlint Errors --- package.json | 2 +- .../components/EvmProposalVoteDetail.tsx | 13 +++-- .../EtherlinkDAO/EvmProposalDetailsPage.tsx | 6 ++- .../components/ProposalActionsDialog.tsx | 28 ++++++----- .../explorer/components/ProposalForm.tsx | 4 +- .../explorer/pages/Proposals/index.tsx | 20 +++----- src/modules/explorer/pages/User/index.tsx | 12 ++++- .../baseDAO/hooks/useTokenHoldersWithVotes.ts | 4 +- src/services/wagmi/context.tsx | 47 ++++++++++++------- yarn.lock | 2 +- 10 files changed, 80 insertions(+), 58 deletions(-) diff --git a/package.json b/package.json index ebc93d6c..17303163 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@types/valid-url": "^1.0.4", "@wagmi/core": "2.13.4", "assert": "^2.0.0", - "assert-never": "^1.2.1", + "assert-never": "^1.3.0", "bignumber.js": "^9.0.1", "blockies-ts": "^1.0.0", "caniuse-lite": "", diff --git a/src/modules/etherlink/components/EvmProposalVoteDetail.tsx b/src/modules/etherlink/components/EvmProposalVoteDetail.tsx index df2ead34..ed93d360 100644 --- a/src/modules/etherlink/components/EvmProposalVoteDetail.tsx +++ b/src/modules/etherlink/components/EvmProposalVoteDetail.tsx @@ -51,7 +51,6 @@ export const EvmProposalVoteDetail: React.FC<{ }> = ({ poll, choices, token, isXTZ }) => { const theme = useTheme() const isMobileSmall = useMediaQuery(theme.breakpoints.down("xs")) - const isMobile = useMediaQuery(theme.breakpoints.down("sm")) const [open, setOpen] = React.useState(false) const { network } = useTezos() const [turnout, setTurnout] = useState() @@ -122,12 +121,12 @@ export const EvmProposalVoteDetail: React.FC<{ */} - Vorting Results + Voting Results {choices && - choices.map((choice: Choice, index) => { + choices?.map((choice: Choice, index) => { const isFor = choice.name === "For" const voteCount = isFor ? daoProposalSelected?.votesFor : daoProposalSelected?.votesAgainst @@ -212,23 +211,23 @@ export const EvmProposalVoteDetail: React.FC<{ % of Total Supply) )} */} - {totalVoteCount > 0 ? ( + {/* {totalVoteCount > 0 ? ( - ) : null} + ) : null} */}
- + /> */} ) diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx index 465bcb95..14c02141 100644 --- a/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx @@ -10,6 +10,7 @@ import { ProposalStatus } from "services/services/dao/mappers/proposal/types" import { EvmProposalDetailCard } from "modules/etherlink/components/EvmProposalDetailCard" import { ChoiceItemSelected } from "modules/lite/explorer/components/ChoiceItemSelected" import { EvmProposalVoteDetail } from "modules/etherlink/components/EvmProposalVoteDetail" +import { TitleText } from "components/ui/TitleText" export const EvmProposalDetailsPage = () => { const params = useParams() as { proposalId: string } const proposalId = params?.proposalId @@ -40,7 +41,10 @@ export const EvmProposalDetailsPage = () => { return (
- Proposal Details + + Proposal Details + + diff --git a/src/modules/explorer/components/ProposalActionsDialog.tsx b/src/modules/explorer/components/ProposalActionsDialog.tsx index 34e94591..a799b012 100644 --- a/src/modules/explorer/components/ProposalActionsDialog.tsx +++ b/src/modules/explorer/components/ProposalActionsDialog.tsx @@ -17,6 +17,7 @@ import { ProposalFormContainer } from "./ProposalForm" import EthContractCallForm from "./EthContractCallForm" import EthChangeConfigProposalForm from "./EthChangeConfigProposalForm" import EthTransferFundsForm from "./EthTransferFundsForm" +import { useQueryParams } from "../hooks/useQueryParams" type RecursivePartial = { [P in keyof T]?: RecursivePartial @@ -142,15 +143,13 @@ const getTreasuryActions = (): GenericAction[] => [ } ] -interface Props { - open: boolean - handleClose: () => void - queryType: string | null -} - const defaultOpenSupportedExecuteProposalModal = "none" -const ProposalActionsDialogForTezos: React.FC = ({ open, handleClose }) => { +const ProposalActionsDialogForTezos: React.FC<{ + open: boolean + handleClose: () => void + queryType?: string +}> = ({ open, handleClose, queryType }) => { const daoId = useDAOID() const { data } = useDAO(daoId) const theme = useTheme() @@ -216,7 +215,6 @@ const ProposalActionsDialogForTezos: React.FC = ({ open, handleClose }) = const [openSupportedExecuteProposalModalKey, setOpenSupportedExecuteProposalModal] = useState( defaultOpenSupportedExecuteProposalModal ) - useEffect(() => { if (queryType === "add-function") { handleOpenCustomProposalModal(ProposalAction.new) @@ -400,7 +398,11 @@ const ProposalActionsDialogForTezos: React.FC = ({ open, handleClose }) = ) } -const ProposalActionsDialogForEtherlink: React.FC = ({ open, handleClose }) => { +const ProposalActionsDialogForEtherlink: React.FC<{ + open: boolean + handleClose: () => void + queryType?: string +}> = ({ open, handleClose, queryType }) => { const theme = useTheme() const isMobileSmall = useMediaQuery(theme.breakpoints.down("sm")) const [modalOpen, setModalOpen] = useState<"transfer_funds" | "change_config" | "contract_call" | boolean>(false) @@ -459,13 +461,17 @@ const ProposalActionsDialogForEtherlink: React.FC = ({ open, handleClose ) } -export const ProposalActionsDialog: React.FC = ({ open, handleClose }) => { +export const ProposalActionsDialog: React.FC<{ open: boolean; handleClose: () => void; queryType?: string }> = ({ + open, + handleClose, + queryType +}) => { const daoId = useDAOID() const { data } = useDAO(daoId) return data?.data.network.startsWith("etherlink") ? ( ) : ( - + ) } diff --git a/src/modules/explorer/components/ProposalForm.tsx b/src/modules/explorer/components/ProposalForm.tsx index 56b4758f..b4f4e32e 100644 --- a/src/modules/explorer/components/ProposalForm.tsx +++ b/src/modules/explorer/components/ProposalForm.tsx @@ -121,7 +121,7 @@ export const ProposalFormContainer: React.FC = ({ open, handleClose, defa }) }, [defaultValues, methods]) - const forms = enabledForms[dao?.data.type || "lambda"] + const forms = enabledForms[(dao?.data.type as DAOTemplate) || "lambda"] const { mutate: registryMutate } = useRegistryPropose() const onSubmit = useCallback( @@ -176,7 +176,7 @@ export const ProposalFormContainer: React.FC = ({ open, handleClose, defa - {forms.map((form, i) => ( + {forms.map((form: any, i: number) => ( diff --git a/src/modules/explorer/pages/Proposals/index.tsx b/src/modules/explorer/pages/Proposals/index.tsx index 17fc9387..82f4f99b 100644 --- a/src/modules/explorer/pages/Proposals/index.tsx +++ b/src/modules/explorer/pages/Proposals/index.tsx @@ -1,16 +1,5 @@ -import React, { useCallback, useState, useContext } from "react" -import { - Button, - FormControl, - Grid, - InputLabel, - MenuItem, - styled, - Theme, - Typography, - useMediaQuery, - useTheme -} from "@material-ui/core" +import React, { useCallback, useState, useContext, useEffect } from "react" +import { Button, Grid, MenuItem, styled, Theme, Typography, useMediaQuery, useTheme } from "@material-ui/core" import Select, { SelectChangeEvent } from "@mui/material/Select" import { useDAO } from "services/services/dao/hooks/useDAO" @@ -334,7 +323,7 @@ const TezosProposals = () => { - + {/* Keeping this component here as it is inhe master branch */} { return ( <> + + Proposals + ({ padding: "37px 42px", background: theme.palette.primary.main, @@ -136,7 +142,9 @@ export const User: React.FC = () => { return [] } - return proposals.filter(p => p.voters.map(voter => voter.address.toLowerCase()).includes(account.toLowerCase())) + return proposals.filter(p => + p.voters.map((voter: Vote) => voter.address.toLowerCase()).includes(account.toLowerCase()) + ) }, [account, proposals]) const onUnstakeFromAllProposals = useCallback(async () => { @@ -165,7 +173,7 @@ export const User: React.FC = () => { droppedProposals && executedProposals .concat(droppedProposals) - .some(proposal => proposal.voters.find(vote => vote.address === account)?.staked) + .some(proposal => proposal.voters.find((vote: Vote) => vote.address === account)?.staked) const getVoteDecision = (proposal: Proposal) => proposal.voters.find(voter => voter.address.toLowerCase())?.support as boolean diff --git a/src/services/contracts/baseDAO/hooks/useTokenHoldersWithVotes.ts b/src/services/contracts/baseDAO/hooks/useTokenHoldersWithVotes.ts index 53dbbb7d..2a11baa4 100644 --- a/src/services/contracts/baseDAO/hooks/useTokenHoldersWithVotes.ts +++ b/src/services/contracts/baseDAO/hooks/useTokenHoldersWithVotes.ts @@ -17,9 +17,9 @@ export const useTokenHoldersWithVotes = (contractAddress: string) => { let proposalsVoted = 0 let votes = new BigNumber(0) - proposals.forEach(proposal => { + proposals.forEach((proposal: any) => { const voter = proposal.voters.find( - voter => voter.address.toLowerCase() === tokenHolder.holder.address.toLowerCase() + (voter: any) => voter.address.toLowerCase() === tokenHolder.holder.address.toLowerCase() ) if (voter) { diff --git a/src/services/wagmi/context.tsx b/src/services/wagmi/context.tsx index 78d3568d..41361207 100644 --- a/src/services/wagmi/context.tsx +++ b/src/services/wagmi/context.tsx @@ -7,7 +7,7 @@ import { useSIWE, useModal, SIWESession } from "connectkit" import { useEthersProvider, useEthersSigner } from "./ethers" import useFirestoreStore from "services/contracts/etherlinkDAO/hooks/useFirestoreStore" import { useParams } from "react-router-dom" -import { Proposal, ProposalStatus } from "services/services/dao/mappers/proposal/types" +import { ProposalStatus } from "services/services/dao/mappers/proposal/types" interface EtherlinkType { isConnected: boolean @@ -76,6 +76,17 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children } return "unknown" }, [chain?.name]) + + const firebaseRootCollection = useMemo(() => { + if (etherlinkNetwork === "etherlink_mainnet") { + return "daosEtherlink-Mainnet" + } + if (etherlinkNetwork === "etherlink_testnet") { + return "daosEtherlink-Testnet" + } + return undefined + }, [etherlinkNetwork]) + console.log("Etherlink Network", etherlinkNetwork) // useEffect(() => { @@ -93,23 +104,26 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children const [daoData, setDaoData] = useState([]) const [daoSelected, setDaoSelected] = useState({}) const [daoProposals, setDaoProposals] = useState([]) - const [daoProposalSelectedId, setDaoProposalSelectedId] = useState(null) const [daoProposalSelected, setDaoProposalSelected] = useState({}) const [daoMembers, setDaoMembers] = useState([]) const { data: firestoreData, loading, fetchCollection } = useFirestoreStore() + console.log({ firestoreData }) + useEffect(() => { - fetchCollection("daosEtherlink-Testnet").then((data: any) => { - setIsLoadingDaos(false) - }) - }, [fetchCollection]) + if (firebaseRootCollection) { + fetchCollection(firebaseRootCollection).then((data: any) => { + setIsLoadingDaos(false) + }) + } + }, [fetchCollection, firebaseRootCollection]) useEffect(() => { - console.log("wagmi/context.tsx", { firestoreData }) - if (firestoreData?.["daosEtherlink-Testnet"]) { - setDaoData(firestoreData["daosEtherlink-Testnet"]) + if (!firebaseRootCollection) return + if (firestoreData?.[firebaseRootCollection]) { + setDaoData(firestoreData[firebaseRootCollection]) } - const daoProposalKey = `daosEtherlink-Testnet/${daoSelected.id}/proposals` + const daoProposalKey = `${firebaseRootCollection}/${daoSelected.id}/proposals` if (firestoreData?.[daoProposalKey]) { setDaoProposals( firestoreData[daoProposalKey] @@ -122,19 +136,18 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children }) ) } - const daoMembersKey = `daosEtherlink-Testnet/${daoSelected.id}/members` + const daoMembersKey = `${firebaseRootCollection}/${daoSelected.id}/members` if (firestoreData?.[daoMembersKey]) { setDaoMembers(firestoreData[daoMembersKey]) } - }, [daoSelected.id, firestoreData]) + }, [daoSelected.id, firebaseRootCollection, firestoreData]) useEffect(() => { - console.log("daoSelected", daoSelected) - if (daoSelected.id) { - fetchCollection(`daosEtherlink-Testnet/${daoSelected.id}/proposals`) - fetchCollection(`daosEtherlink-Testnet/${daoSelected.id}/members`) + if (daoSelected.id && firebaseRootCollection) { + fetchCollection(`${firebaseRootCollection}/${daoSelected.id}/proposals`) + fetchCollection(`${firebaseRootCollection}/${daoSelected.id}/members`) } - }, [daoSelected, fetchCollection]) + }, [daoSelected, fetchCollection, firebaseRootCollection]) return ( Date: Tue, 10 Dec 2024 17:47:16 +0530 Subject: [PATCH 23/36] Fixed Navigation --- src/modules/etherlink/explorer/index.tsx | 6 - .../explorer/components/NavigationMenu.tsx | 2 + src/services/wagmi/context.tsx | 197 ++++++++++-------- 3 files changed, 111 insertions(+), 94 deletions(-) diff --git a/src/modules/etherlink/explorer/index.tsx b/src/modules/etherlink/explorer/index.tsx index 18e5db9b..4c68fb57 100644 --- a/src/modules/etherlink/explorer/index.tsx +++ b/src/modules/etherlink/explorer/index.tsx @@ -1,9 +1,6 @@ import React, { useContext, useState } from "react" import { Grid, Typography, useTheme, useMediaQuery } from "@material-ui/core" -import { useDAO } from "services/services/dao/hooks/useDAO" -import { useEtherlinkDAOID } from "./router" - import { SmallButton } from "../../common/SmallButton" import SettingsIcon from "@mui/icons-material/Settings" @@ -18,13 +15,10 @@ import { EvmDaoStatsRow } from "../components/EvmDaoStatsRow" import { EvmDaoSettingModal } from "../components/EvmDaoSettingsModal" export const EtherlinkDAOOverview: React.FC = () => { - const daoId = useEtherlinkDAOID() - const { data, cycleInfo, ledger } = useDAO(daoId) const { daoSelected } = useContext(EtherlinkContext) const theme = useTheme() const isExtraSmall = useMediaQuery(theme.breakpoints.down("xs")) - const symbol = (daoSelected && daoSelected?.token?.toUpperCase()) || "Unknown" const name = daoSelected && daoSelected?.name const description = daoSelected && daoSelected?.description diff --git a/src/modules/explorer/components/NavigationMenu.tsx b/src/modules/explorer/components/NavigationMenu.tsx index dfdb95f7..70b552ed 100644 --- a/src/modules/explorer/components/NavigationMenu.tsx +++ b/src/modules/explorer/components/NavigationMenu.tsx @@ -281,6 +281,8 @@ export const NavigationMenu: React.FC<{ disableMobileMenu?: boolean }> = ({ disa } }, [account, dao, daoId, etherlinkDaoId, etherlinkDaoSelected]) + if (location.pathname === "/explorer/daos" || location.pathname === "/explorer/daos/") return null + return !isMobileSmall || disableMobileMenu ? ( void } +const useEtherlinkDao = ({ network }: { network: string }) => { + const selectedDaoIdRef = useRef(null) + + const firebaseRootCollection = useMemo(() => { + if (network === "etherlink_mainnet") { + return "daosEtherlink-Mainnet" + } + if (network === "etherlink_testnet") { + return "daosEtherlink-Testnet" + } + return undefined + }, [network]) + + const [isLoadingDaos, setIsLoadingDaos] = useState(true) + const [isLoadingDaoProposals, setIsLoadingDaoProposals] = useState(true) + + const [daoData, setDaoData] = useState([]) + const [daoSelected, setDaoSelected] = useState({}) + const [daoProposals, setDaoProposals] = useState([]) + const [daoProposalSelected, setDaoProposalSelected] = useState({}) + const [daoMembers, setDaoMembers] = useState([]) + const { data: firestoreData, loading, fetchCollection } = useFirestoreStore() + + useEffect(() => { + if (firebaseRootCollection) { + fetchCollection(firebaseRootCollection).then((data: any) => { + setIsLoadingDaos(false) + }) + } + }, [fetchCollection, firebaseRootCollection]) + + useEffect(() => { + console.log("Firestore Data", firestoreData) + if (!firebaseRootCollection) return + if (firestoreData?.[firebaseRootCollection]) { + setDaoData(firestoreData[firebaseRootCollection]) + } + const daoProposalKey = `${firebaseRootCollection}/${daoSelected.id}/proposals` + if (firestoreData?.[daoProposalKey]) { + setDaoProposals( + firestoreData[daoProposalKey] + ?.sort((a: any, b: any) => b.createdAt - a.createdAt) + .map(firebaseProposal => { + return { + ...firebaseProposal, + status: getStatusByHistory(firebaseProposal.statusHistory) + } + }) + ) + } + const daoMembersKey = `${firebaseRootCollection}/${daoSelected.id}/members` + if (firestoreData?.[daoMembersKey]) { + setDaoMembers(firestoreData[daoMembersKey]) + } + }, [daoSelected.id, firebaseRootCollection, firestoreData]) + + useEffect(() => { + if (daoSelected.id && firebaseRootCollection) { + fetchCollection(`${firebaseRootCollection}/${daoSelected.id}/proposals`) + fetchCollection(`${firebaseRootCollection}/${daoSelected.id}/members`) + } + }, [daoSelected, fetchCollection, firebaseRootCollection]) + + return { + daos: daoData, + daoSelected, + daoProposals, + daoProposalSelected, + daoMembers, + selectDaoProposal: (proposalId: string) => { + const proposal = daoProposals.find((proposal: any) => proposal.id === proposalId) + if (proposal) { + setDaoProposalSelected(proposal) + } + }, + selectDao: (daoId: string) => { + const dao = daoData.find(dao => dao.id === daoId) + if (dao) { + setDaoSelected(dao) + selectedDaoIdRef.current = daoId + } + }, + isLoadingDaos, + isLoadingDaoProposals + } +} + // TODO: @ashutoshpw, handle more statuus and move to utils const getStatusByHistory = (history: { active: number; executable: number; passed: number; pending: number }) => { const statuses = Object.keys(history) @@ -65,6 +152,7 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children const { connect } = useWagmiConnect() const { address, isConnected, chain, isDisconnected, status } = useWagmiAccount() + console.log("SIWE Data", status) // console.log("SIWE Data", data, status, error, isSignedIn, isReady, isRejected, isLoading) const etherlinkNetwork = useMemo(() => { @@ -77,78 +165,24 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children return "unknown" }, [chain?.name]) - const firebaseRootCollection = useMemo(() => { - if (etherlinkNetwork === "etherlink_mainnet") { - return "daosEtherlink-Mainnet" - } - if (etherlinkNetwork === "etherlink_testnet") { - return "daosEtherlink-Testnet" - } - return undefined - }, [etherlinkNetwork]) + const { + daos, + isLoadingDaos, + daoSelected, + daoProposals, + isLoadingDaoProposals, + daoProposalSelected, + daoMembers, + selectDaoProposal, + selectDao + } = useEtherlinkDao({ + network: etherlinkNetwork + }) console.log("Etherlink Network", etherlinkNetwork) - - // useEffect(() => { - // console.log(tezosNetwork) - // modal.switchNetwork(etherlinkTestnet as unknown as CaipNetwork) - // }, [tezosNetwork]) - console.log("Wagmi Chain", chain, status) console.log("Wagmi Address", address) - const [isLoadingDaos, setIsLoadingDaos] = useState(true) - const [isLoadingDaoProposals, setIsLoadingDaoProposals] = useState(true) - - const selectedDaoIdRef = useRef(null) - const [daoData, setDaoData] = useState([]) - const [daoSelected, setDaoSelected] = useState({}) - const [daoProposals, setDaoProposals] = useState([]) - const [daoProposalSelected, setDaoProposalSelected] = useState({}) - const [daoMembers, setDaoMembers] = useState([]) - const { data: firestoreData, loading, fetchCollection } = useFirestoreStore() - - console.log({ firestoreData }) - - useEffect(() => { - if (firebaseRootCollection) { - fetchCollection(firebaseRootCollection).then((data: any) => { - setIsLoadingDaos(false) - }) - } - }, [fetchCollection, firebaseRootCollection]) - - useEffect(() => { - if (!firebaseRootCollection) return - if (firestoreData?.[firebaseRootCollection]) { - setDaoData(firestoreData[firebaseRootCollection]) - } - const daoProposalKey = `${firebaseRootCollection}/${daoSelected.id}/proposals` - if (firestoreData?.[daoProposalKey]) { - setDaoProposals( - firestoreData[daoProposalKey] - ?.sort((a: any, b: any) => b.createdAt - a.createdAt) - .map(firebaseProposal => { - return { - ...firebaseProposal, - status: getStatusByHistory(firebaseProposal.statusHistory) - } - }) - ) - } - const daoMembersKey = `${firebaseRootCollection}/${daoSelected.id}/members` - if (firestoreData?.[daoMembersKey]) { - setDaoMembers(firestoreData[daoMembersKey]) - } - }, [daoSelected.id, firebaseRootCollection, firestoreData]) - - useEffect(() => { - if (daoSelected.id && firebaseRootCollection) { - fetchCollection(`${firebaseRootCollection}/${daoSelected.id}/proposals`) - fetchCollection(`${firebaseRootCollection}/${daoSelected.id}/members`) - } - }, [daoSelected, fetchCollection, firebaseRootCollection]) - return ( = ({ children setOpen(true) // connect({ config: wagmiConfig }) }, - daos: daoData, + daos, isLoadingDaos, - isLoadingDaoProposals: false, - daoSelected: daoSelected, - daoProposals: daoProposals, - daoProposalSelected: daoProposalSelected, - daoMembers: daoMembers, - selectDaoProposal: (proposalId: string) => { - const proposal = daoProposals.find((proposal: any) => proposal.id === proposalId) - if (proposal) { - setDaoProposalSelected(proposal) - // fetchCollection(`daosEtherlink-Testnet/${daoSelected.id}/proposals/${proposalId}`) - } - }, - selectDao: (daoId: string) => { - const dao = daoData.find(dao => dao.id === daoId) - // alert(`dao:${daoId}`) - if (dao) { - setDaoSelected(dao) - selectedDaoIdRef.current = daoId - } - }, + isLoadingDaoProposals, + daoSelected, + daoProposals, + daoProposalSelected, + daoMembers, + selectDaoProposal, + selectDao, disconnect: () => disconnectEtherlink(wagmiConfig), switchToNetwork: (network: string) => { const networkId = network === "etherlink_mainnet" ? etherlink.id : etherlinkTestnet.id From 40633858f8dd0eb6a383c43b08e3df37d9af6b45 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Tue, 10 Dec 2024 18:35:14 +0530 Subject: [PATCH 24/36] Loading Line for better loader --- package.json | 1 - src/App.tsx | 71 ++++++++----------- src/components/ui/DaoCreator.tsx | 14 +--- src/components/ui/DaoExplorer.tsx | 14 +--- src/components/ui/LoadingLine.tsx | 55 ++++++++++++++ src/index.tsx | 30 ++++---- .../explorer/components/CodeCollapse.tsx | 12 +--- .../explorer/components/DAOStatsRow.tsx | 4 +- src/modules/explorer/pages/DAOList/index.tsx | 10 ++- .../ProposalDetails/components/CodeVisor.tsx | 2 +- src/services/beacon/hooks/useTezos.ts | 3 +- src/services/config/hooks/featureFlags.ts | 7 -- src/services/config/hooks/index.ts | 1 - src/services/services/dao/hooks/useAllDAOs.ts | 7 +- src/services/wagmi/context.tsx | 21 +++--- yarn.lock | 33 +-------- 16 files changed, 136 insertions(+), 149 deletions(-) create mode 100644 src/components/ui/LoadingLine.tsx delete mode 100644 src/services/config/hooks/featureFlags.ts delete mode 100644 src/services/config/hooks/index.ts diff --git a/package.json b/package.json index 17303163..dd5772e5 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,6 @@ "html-react-parser": "^5.0.6", "https-browserify": "^1.0.0", "jsonschema": "^1.4.0", - "launchdarkly-react-client-sdk": "2.27.0", "mixpanel-browser": "^2.42.0", "notistack": "^1.0.3", "numbro": "^2.4.0", diff --git a/src/App.tsx b/src/App.tsx index df7484d2..3c2565a3 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,15 +1,11 @@ import React from "react" import "App.css" -import { withLDProvider } from "launchdarkly-react-client-sdk" + import { BrowserRouter as Router, Redirect, Route, Switch } from "react-router-dom" import mixpanel from "mixpanel-browser" import { QueryClient, QueryClientProvider } from "react-query" -import { - QueryClient as TanStackQueryClient, - QueryClientProvider as TanStackQueryClientProvider -} from "@tanstack/react-query" -import { Box, makeStyles, ThemeProvider } from "@material-ui/core" +import { Box, ThemeProvider, styled } from "@material-ui/core" import { SnackbarProvider } from "notistack" import { DAOExplorerRouter } from "modules/explorer/router" @@ -46,31 +42,31 @@ const queryClient = new QueryClient({ } }) -const styles = makeStyles({ - success: { - backgroundColor: "#4BCF93 !important", - padding: "6px 28px", - height: 54, - fontSize: 13, - lineHeight: "0px", - opacity: 1 - }, - error: { - backgroundColor: "#ED254E !important", - padding: "6px 28px", - height: 54, - fontSize: 13, - lineHeight: "0px", - opacity: 1 - }, - info: { - backgroundColor: "#3866F9 !important", - padding: "6px 28px", - height: 54, - fontSize: 13, - lineHeight: "0px", - opacity: 1 - } +const SuccessSnackbar = styled("div")({ + backgroundColor: "#4BCF93 !important", + padding: "6px 28px", + height: 54, + fontSize: 13, + lineHeight: "0px", + opacity: 1 +}) + +const ErrorSnackbar = styled("div")({ + backgroundColor: "#ED254E !important", + padding: "6px 28px", + height: 54, + fontSize: 13, + lineHeight: "0px", + opacity: 1 +}) + +const InfoSnackbar = styled("div")({ + backgroundColor: "#3866F9 !important", + padding: "6px 28px", + height: 54, + fontSize: 13, + lineHeight: "0px", + opacity: 1 }) const MIXPANEL_TOKEN = getEnv(EnvKey.REACT_APP_MIXPANEL_TOKEN) @@ -90,15 +86,13 @@ mixpanel.init(MIXPANEL_TOKEN, { mixpanel.track("Visit") const App: React.FC = () => { - const classes = styles() - return ( @@ -168,7 +162,4 @@ const App: React.FC = () => { const env = getEnv(EnvKey.REACT_APP_ENV) -export default withLDProvider({ - clientSideID: - env === "PROD" ? getEnv(EnvKey.REACT_APP_LAUNCH_DARKLY_SDK_PROD) : getEnv(EnvKey.REACT_APP_LAUNCH_DARKLY_SDK_DEV) -})(App) +export default App diff --git a/src/components/ui/DaoCreator.tsx b/src/components/ui/DaoCreator.tsx index 50479753..1ad38e34 100644 --- a/src/components/ui/DaoCreator.tsx +++ b/src/components/ui/DaoCreator.tsx @@ -1,16 +1,4 @@ -import { - Box, - Grid, - Paper, - Step, - StepLabel, - Stepper, - TextareaAutosize, - Typography, - styled, - withStyles, - withTheme -} from "@material-ui/core" +import { Grid, Paper, Stepper, TextareaAutosize, Typography, styled, withStyles, withTheme } from "@material-ui/core" import { InfoRounded } from "@mui/icons-material" import { TextField as FormikTextField } from "formik-material-ui" diff --git a/src/components/ui/DaoExplorer.tsx b/src/components/ui/DaoExplorer.tsx index 01e4d8db..87d28811 100644 --- a/src/components/ui/DaoExplorer.tsx +++ b/src/components/ui/DaoExplorer.tsx @@ -1,16 +1,4 @@ -import { - Box, - Grid, - Paper, - Step, - StepLabel, - Stepper, - TextareaAutosize, - Typography, - styled, - withStyles, - withTheme -} from "@material-ui/core" +import { styled } from "@material-ui/core" const PageLayout = styled("div")(({ theme }) => ({ background: theme.palette.primary.dark, diff --git a/src/components/ui/LoadingLine.tsx b/src/components/ui/LoadingLine.tsx new file mode 100644 index 00000000..f367817e --- /dev/null +++ b/src/components/ui/LoadingLine.tsx @@ -0,0 +1,55 @@ +import React from "react" +import { makeStyles, Theme } from "@material-ui/core/styles" + +interface LoadingLineProps { + color?: string + height?: number + barWidth?: number +} + +const useStyles = makeStyles((theme: Theme) => ({ + "root": { + width: "100%", + backgroundColor: theme.palette.grey[200], + position: "relative", + overflow: "hidden" + }, + "bar": { + height: "100%", + position: "absolute", + animation: "$loadingLine 1s infinite linear" + }, + "@keyframes loadingLine": { + "0%": { + transform: "translateX(-100%)" + }, + "100%": { + transform: "translateX(400%)" + } + } +})) + +export const LoadingLine: React.FC = ({ + color = "#3f51b5", // Default Material-UI primary color + height = 2, + barWidth = 30 +}) => { + const classes = useStyles() + + return ( +
+
+
+ ) +} diff --git a/src/index.tsx b/src/index.tsx index 6957df74..37a0daa7 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,5 +1,5 @@ -import React from "react" -import ReactDOM from "react-dom" +import { createRoot } from "react-dom/client" + import App from "App" import { TezosProvider } from "services/beacon/context" import { EtherlinkProvider } from "services/wagmi/context" @@ -8,21 +8,17 @@ import dayjs from "dayjs" import { Web3Provider } from "services/wagmi/web3provider" import { NetworkProvider } from "services/useNetwork" -// BigNumber.config({ DECIMAL_PLACES: }) - dayjs.extend(localizedFormat) -ReactDOM.render( - - - - - - - - - - - , - document.getElementById("root") +// New React 18 way to render +createRoot(document.getElementById("root") as HTMLElement).render( + + + + + + + + + ) diff --git a/src/modules/explorer/components/CodeCollapse.tsx b/src/modules/explorer/components/CodeCollapse.tsx index 86fc3ba1..b5a8b793 100644 --- a/src/modules/explorer/components/CodeCollapse.tsx +++ b/src/modules/explorer/components/CodeCollapse.tsx @@ -1,20 +1,12 @@ -import { Collapse, Grid, IconButton, styled, Typography } from "@material-ui/core" -import { ProposalItem } from "modules/explorer/pages/User" import React, { useState } from "react" -import { Link } from "react-router-dom" -import { Proposal } from "services/services/dao/mappers/proposal/types" +import { Collapse, Grid, IconButton, Typography } from "@material-ui/core" + import KeyboardArrowDownIcon from "@material-ui/icons/KeyboardArrowDown" import KeyboardArrowUpIcon from "@material-ui/icons/KeyboardArrowUp" import { ProposalCodeEditorInput } from "./ProposalFormInput" import Prism, { highlight } from "prismjs" import { TableContainer, TableHeader } from "components/ui/Table" -const ProposalsFooter = styled(Grid)({ - padding: "16px 46px", - borderTop: ".6px solid rgba(125,140,139, 0.2)", - minHeight: 34 -}) - interface Props { code: string } diff --git a/src/modules/explorer/components/DAOStatsRow.tsx b/src/modules/explorer/components/DAOStatsRow.tsx index 6aee7f7c..68e857ca 100644 --- a/src/modules/explorer/components/DAOStatsRow.tsx +++ b/src/modules/explorer/components/DAOStatsRow.tsx @@ -1,5 +1,5 @@ import React, { useMemo } from "react" -import { Box, Grid, styled, useTheme, Typography, Paper } from "@material-ui/core" +import { Box, Grid, styled, Typography, Paper } from "@material-ui/core" import { useDAO } from "services/services/dao/hooks/useDAO" import { useProposals } from "services/services/dao/hooks/useProposals" import BigNumber from "bignumber.js" @@ -7,7 +7,7 @@ import { ProposalStatus } from "services/services/dao/mappers/proposal/types" import { useDAOID } from "../pages/DAO/router" import { usePolls } from "modules/lite/explorer/hooks/usePolls" import dayjs from "dayjs" -import { useDAOHoldings, useDAONFTHoldings } from "services/contracts/baseDAO/hooks/useDAOHoldings" +import { useDAOHoldings } from "services/contracts/baseDAO/hooks/useDAOHoldings" import { useTimeLeftInCycle } from "../hooks/useTimeLeftInCycle" import { useIsProposalButtonDisabled } from "services/contracts/baseDAO/hooks/useCycleInfo" import numbro from "numbro" diff --git a/src/modules/explorer/pages/DAOList/index.tsx b/src/modules/explorer/pages/DAOList/index.tsx index c2e586af..3ad1e12c 100644 --- a/src/modules/explorer/pages/DAOList/index.tsx +++ b/src/modules/explorer/pages/DAOList/index.tsx @@ -25,6 +25,7 @@ import { ReactComponent as MyDAOsIcon } from "assets/img/my-daos-icon.svg" import { ReactComponent as MyDAOsSelectedIcon } from "assets/img/my-daos-selected-icon.svg" import ReactPaginate from "react-paginate" import "./styles.css" +import { LoadingLine } from "components/ui/LoadingLine" const PageContainer = styled("div")(({ theme }) => ({ width: "1000px", @@ -115,9 +116,9 @@ const TabsContainer = styled(Grid)(({ theme }) => ({ export const DAOList: React.FC = () => { const { network, etherlink, account } = useTezos() - const { data: daos, isLoading } = useAllDAOs(network) + const { data: daos, isLoading, isLoadingWithFirebase } = useAllDAOs(network) - console.log({ daos }) + console.log("isLoadingWithFirebase", isLoadingWithFirebase) const theme = useTheme() const isMobileExtraSmall = useMediaQuery(theme.breakpoints.down("xs")) const isMobileSmall = useMediaQuery(theme.breakpoints.down("mobile")) @@ -285,6 +286,11 @@ export const DAOList: React.FC = () => { + {isLoadingWithFirebase ? ( + + + + ) : null} diff --git a/src/modules/explorer/pages/ProposalDetails/components/CodeVisor.tsx b/src/modules/explorer/pages/ProposalDetails/components/CodeVisor.tsx index 37be13d9..4b62e4d5 100644 --- a/src/modules/explorer/pages/ProposalDetails/components/CodeVisor.tsx +++ b/src/modules/explorer/pages/ProposalDetails/components/CodeVisor.tsx @@ -1,4 +1,4 @@ -import { Grid, styled, makeStyles } from "@material-ui/core" +import { Grid, styled, Typography } from "@material-ui/core" import React, { useState } from "react" import { ResponsiveDialog } from "modules/explorer/components/ResponsiveDialog" import Prism, { highlight, plugins } from "prismjs" diff --git a/src/services/beacon/hooks/useTezos.ts b/src/services/beacon/hooks/useTezos.ts index b632b473..c9c00054 100644 --- a/src/services/beacon/hooks/useTezos.ts +++ b/src/services/beacon/hooks/useTezos.ts @@ -100,6 +100,7 @@ export const useTezos = (): WalletConnectReturn => { async (newNetwork: Network) => { mixpanel.register({ Network: newNetwork }) localStorage.setItem("homebase:network", newNetwork) + switchToNetwork(newNetwork) if (newNetwork.startsWith("etherlink")) { await handleEtherlinkNetworkChange(newNetwork) } else { @@ -107,7 +108,7 @@ export const useTezos = (): WalletConnectReturn => { } queryClient.resetQueries() }, - [handleEtherlinkNetworkChange, handleTezosNetworkChange, queryClient] + [handleEtherlinkNetworkChange, handleTezosNetworkChange, switchToNetwork, queryClient] ) const handleTezosConnect = useCallback( diff --git a/src/services/config/hooks/featureFlags.ts b/src/services/config/hooks/featureFlags.ts deleted file mode 100644 index 084cef30..00000000 --- a/src/services/config/hooks/featureFlags.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { useFlags } from "launchdarkly-react-client-sdk" -import { FeatureFlag } from "services/config/constants" - -export const useFeatureFlag = (featureFlag: FeatureFlag) => { - const flags = useFlags() - return flags[featureFlag] ?? false -} diff --git a/src/services/config/hooks/index.ts b/src/services/config/hooks/index.ts deleted file mode 100644 index 4734e37c..00000000 --- a/src/services/config/hooks/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./featureFlags" diff --git a/src/services/services/dao/hooks/useAllDAOs.ts b/src/services/services/dao/hooks/useAllDAOs.ts index 8778b51b..c0ad7b74 100644 --- a/src/services/services/dao/hooks/useAllDAOs.ts +++ b/src/services/services/dao/hooks/useAllDAOs.ts @@ -8,7 +8,7 @@ import { EtherlinkContext } from "services/wagmi/context" export const useAllDAOs = (network: Network) => { const { daos: etherinkDaos, isLoadingDaos } = useContext(EtherlinkContext) - return useQuery( + const queryData = useQuery( ["daos", network], async () => { const homebase_daos = await getDAOs(network) @@ -38,4 +38,9 @@ export const useAllDAOs = (network: Network) => { enabled: !!(network && !isLoadingDaos) } ) + + return { + ...queryData, + isLoadingWithFirebase: isLoadingDaos + } } diff --git a/src/services/wagmi/context.tsx b/src/services/wagmi/context.tsx index d6f9386b..3b1a0803 100644 --- a/src/services/wagmi/context.tsx +++ b/src/services/wagmi/context.tsx @@ -8,6 +8,7 @@ import { useEthersProvider, useEthersSigner } from "./ethers" import useFirestoreStore from "services/contracts/etherlinkDAO/hooks/useFirestoreStore" import { useParams } from "react-router-dom" import { ProposalStatus } from "services/services/dao/mappers/proposal/types" +import { useTezos } from "services/beacon/hooks/useTezos" interface EtherlinkType { isConnected: boolean @@ -23,7 +24,7 @@ interface EtherlinkType { const useEtherlinkDao = ({ network }: { network: string }) => { const selectedDaoIdRef = useRef(null) - + console.log("useEtherlinkDao", { network }) const firebaseRootCollection = useMemo(() => { if (network === "etherlink_mainnet") { return "daosEtherlink-Mainnet" @@ -34,7 +35,9 @@ const useEtherlinkDao = ({ network }: { network: string }) => { return undefined }, [network]) - const [isLoadingDaos, setIsLoadingDaos] = useState(true) + console.log({ firebaseRootCollection }) + + const [isLoadingDaos, setIsLoadingDaos] = useState(!!firebaseRootCollection) const [isLoadingDaoProposals, setIsLoadingDaoProposals] = useState(true) const [daoData, setDaoData] = useState([]) @@ -46,9 +49,8 @@ const useEtherlinkDao = ({ network }: { network: string }) => { useEffect(() => { if (firebaseRootCollection) { - fetchCollection(firebaseRootCollection).then((data: any) => { - setIsLoadingDaos(false) - }) + // Trigger DAO Loading Request + fetchCollection(firebaseRootCollection) } }, [fetchCollection, firebaseRootCollection]) @@ -57,6 +59,7 @@ const useEtherlinkDao = ({ network }: { network: string }) => { if (!firebaseRootCollection) return if (firestoreData?.[firebaseRootCollection]) { setDaoData(firestoreData[firebaseRootCollection]) + setIsLoadingDaos(false) } const daoProposalKey = `${firebaseRootCollection}/${daoSelected.id}/proposals` if (firestoreData?.[daoProposalKey]) { @@ -136,6 +139,7 @@ const getStatusByHistory = (history: { active: number; executable: number; passe export const EtherlinkContext = createContext(undefined) export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children }) => { + const [network, setNetwork] = useState(localStorage.getItem("homebase:network") || undefined) const { setOpen } = useModal() const provider = useEthersProvider() const signer = useEthersSigner() @@ -162,8 +166,8 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children if (chain?.name === "Etherlink Testnet") { return "etherlink_testnet" } - return "unknown" - }, [chain?.name]) + return network + }, [chain?.name, network]) const { daos, @@ -176,7 +180,7 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children selectDaoProposal, selectDao } = useEtherlinkDao({ - network: etherlinkNetwork + network: etherlinkNetwork || "" }) console.log("Etherlink Network", etherlinkNetwork) @@ -209,6 +213,7 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children disconnect: () => disconnectEtherlink(wagmiConfig), switchToNetwork: (network: string) => { const networkId = network === "etherlink_mainnet" ? etherlink.id : etherlinkTestnet.id + setNetwork(network) switchChain({ chainId: networkId }) } }} diff --git a/yarn.lock b/yarn.lock index 4a3a55bd..b8cd7ffb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6250,7 +6250,7 @@ base-x@^4.0.0: resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== -base64-js@^1.3.0, base64-js@^1.3.1: +base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -11800,32 +11800,6 @@ launch-editor@^2.6.0: picocolors "^1.0.0" shell-quote "^1.8.1" -launchdarkly-js-client-sdk@2.22.1: - version "2.22.1" - resolved "https://registry.yarnpkg.com/launchdarkly-js-client-sdk/-/launchdarkly-js-client-sdk-2.22.1.tgz#e6064c79bc575eea0aa4364be41754d54d89ae6a" - integrity sha512-EAdw7B8w4m/WZGmHHLj9gbYBP6lCqJs5TQDCM9kWJOnvHBz7DJIxOdqazNMDn5AzBxfvaMG7cpLms+Cur5LD5g== - dependencies: - escape-string-regexp "^1.0.5" - launchdarkly-js-sdk-common "3.6.0" - -launchdarkly-js-sdk-common@3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/launchdarkly-js-sdk-common/-/launchdarkly-js-sdk-common-3.6.0.tgz#d146be5bbd86a019c4bedc52e66c37a1ffa7bb3d" - integrity sha512-wCdBoBiYXlP64jTrC0dOXY2B345LSJO/IvitbdW4kBKmJ1DkeufpqV0s5DBlwE0RLzDmaQx3mRTmcoNAIhIoaA== - dependencies: - base64-js "^1.3.0" - fast-deep-equal "^2.0.1" - uuid "^3.3.2" - -launchdarkly-react-client-sdk@2.27.0: - version "2.27.0" - resolved "https://registry.yarnpkg.com/launchdarkly-react-client-sdk/-/launchdarkly-react-client-sdk-2.27.0.tgz#18a2f470e3af166d25d2252e4a14f092378fc2cb" - integrity sha512-I2mmY5OHbc8bHkfYlt131cRXjSolCzbMtt0lMeN7vC5vMWnjNnLCT08YRrqromnNgPNUtg/7kwPEUTOmUCFqiA== - dependencies: - hoist-non-react-statics "^3.3.2" - launchdarkly-js-client-sdk "2.22.1" - lodash.camelcase "^4.3.0" - leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -16969,11 +16943,6 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" From d56da98b54bdb981b0b45bdea6d7d985457173d6 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Tue, 10 Dec 2024 23:38:59 +0530 Subject: [PATCH 25/36] Fixed for build --- src/services/config/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/services/config/index.ts b/src/services/config/index.ts index 021be719..737fb20c 100644 --- a/src/services/config/index.ts +++ b/src/services/config/index.ts @@ -1,3 +1,2 @@ export * from "./constants" export * from "./env" -export * from "./hooks" From 368e2493674a584aa255441ba9faebf569ffe2d4 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Tue, 17 Dec 2024 21:30:46 +0530 Subject: [PATCH 26/36] WIP - DAO Proposal Details Page --- src/assets/logos/members.svg | 4 + src/components/ui/Badge.tsx | 39 +++ src/components/ui/LinearProgress.tsx | 20 ++ .../components/EvmProposalCountdown.tsx | 92 ++++++ .../components/EvmProposalDetailCard.tsx | 35 +- .../components/EvmProposalVoteDetail.tsx | 312 +++++++++++++----- .../etherlink/components/EvmTreasuryTable.tsx | 48 +++ .../explorer/EtherlinkDAO/EvmMembersPage.tsx | 5 +- .../EtherlinkDAO/EvmProposalDetailsPage.tsx | 17 +- src/modules/etherlink/explorer/index.tsx | 15 +- .../explorer/components/NavigationMenu.tsx | 11 +- src/services/wagmi/context.tsx | 40 ++- 12 files changed, 520 insertions(+), 118 deletions(-) create mode 100644 src/assets/logos/members.svg create mode 100644 src/components/ui/Badge.tsx create mode 100644 src/components/ui/LinearProgress.tsx create mode 100644 src/modules/etherlink/components/EvmProposalCountdown.tsx create mode 100644 src/modules/etherlink/components/EvmTreasuryTable.tsx diff --git a/src/assets/logos/members.svg b/src/assets/logos/members.svg new file mode 100644 index 00000000..234d3e88 --- /dev/null +++ b/src/assets/logos/members.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/components/ui/Badge.tsx b/src/components/ui/Badge.tsx new file mode 100644 index 00000000..dc535e2c --- /dev/null +++ b/src/components/ui/Badge.tsx @@ -0,0 +1,39 @@ +import React from "react" +import { Grid, GridProps, Typography } from "@material-ui/core" +import { styled, Theme } from "@material-ui/core/styles" +import hexToRgba from "hex-to-rgba" +import { theme } from "theme" + +const getStatusColor = (status: string, theme: Theme): string => { + return "#85c4ff" +} + +const StyledGrid = styled(Grid)(({ status, theme }: { status: string; theme: Theme }) => ({ + "borderRadius": 50, + "boxSizing": "border-box", + "minWidth": 87, + "textAlign": "center", + "padding": "4px 16px", + + "background": hexToRgba(getStatusColor(status, theme), 0.4), + "color": getStatusColor(status, theme), + "& > div": { + height: "100%" + } +})) + +const Text = styled(Typography)({ + fontWeight: 500, + fontSize: 16, + textTransform: "capitalize" +}) + +export const Badge: React.FC<{ status: string } & GridProps> = ({ status }) => ( + + + + {status} + + + +) diff --git a/src/components/ui/LinearProgress.tsx b/src/components/ui/LinearProgress.tsx new file mode 100644 index 00000000..4d1577cd --- /dev/null +++ b/src/components/ui/LinearProgress.tsx @@ -0,0 +1,20 @@ +import { Button, Grid, Theme, LinearProgress as MuiLinearProgress } from "@material-ui/core" +import { styled } from "@mui/material/styles" +import { withStyles } from "@material-ui/core/styles" + +const StyledLinearProgress = withStyles((theme: Theme) => ({ + root: (props: { variant: "success" | "error" }) => ({ + "height": 10, + "backgroundColor": theme.palette.primary.light, + "color": theme.palette.primary.light, + "& .MuiLinearProgress-bar": { + backgroundColor: `${ + props.variant === "success" ? theme.palette.secondary.main : theme.palette.error.main + } !important` + } + }) +}))((props: { value: number }) => ) + +export const LinearProgress = ({ value, variant }: { value: number; variant: "success" | "error" }) => { + return +} diff --git a/src/modules/etherlink/components/EvmProposalCountdown.tsx b/src/modules/etherlink/components/EvmProposalCountdown.tsx new file mode 100644 index 00000000..330c3cf5 --- /dev/null +++ b/src/modules/etherlink/components/EvmProposalCountdown.tsx @@ -0,0 +1,92 @@ +import { Grid } from "@material-ui/core" +import { Timer } from "@mui/icons-material" +import { Box } from "@mui/material" +import { Typography } from "@mui/material" +import dayjs from "dayjs" +import React, { useContext, useEffect, useState } from "react" +import { EtherlinkContext } from "services/wagmi/context" +import { GridContainer } from "modules/common/GridContainer" + +interface TimeLeft { + days: number + hours: number + minutes: number + seconds: number +} + +export const EvmProposalCountdown = () => { + const [timeLeft, setTimeLeft] = useState({ days: 0, hours: 0, minutes: 0, seconds: 0 }) + const { daoProposalSelected } = useContext(EtherlinkContext) + const targetDate = daoProposalSelected?.votingExpiresAt + + useEffect(() => { + const calculateTimeLeft = () => { + const now = dayjs() + const target = dayjs(targetDate) + const diff = target.diff(now, "second") + + if (diff <= 0) { + setTimeLeft({ days: 0, hours: 0, minutes: 0, seconds: 0 }) + return + } + + const days = Math.floor(diff / (24 * 60 * 60)) + const hours = Math.floor((diff % (24 * 60 * 60)) / (60 * 60)) + const minutes = Math.floor((diff % (60 * 60)) / 60) + const seconds = diff % 60 + + setTimeLeft({ days, hours, minutes, seconds }) + } + + calculateTimeLeft() + const timer = setInterval(calculateTimeLeft, 1000) + + return () => clearInterval(timer) + }, [targetDate]) + + if (!targetDate) return null + + const TimeUnit = ({ value, unit }: { value: number; unit: string }) => ( + + + {value.toString().padStart(2, "0")} + + + {unit} + + + ) + + return ( + + + + + Time Left to Vote + + + + {timeLeft.days > 0 && } + + + + + + ) +} diff --git a/src/modules/etherlink/components/EvmProposalDetailCard.tsx b/src/modules/etherlink/components/EvmProposalDetailCard.tsx index 267ac5d6..e63c4cb1 100644 --- a/src/modules/etherlink/components/EvmProposalDetailCard.tsx +++ b/src/modules/etherlink/components/EvmProposalDetailCard.tsx @@ -1,4 +1,4 @@ -import React from "react" +import React, { useContext } from "react" import { Grid, styled, Typography, Link, useTheme, useMediaQuery, Popover, withStyles } from "@material-ui/core" import { GridContainer } from "modules/common/GridContainer" import { ProposalStatus, TableStatusBadge } from "modules/lite/explorer/components/ProposalTableRowStatusBadge" @@ -11,6 +11,8 @@ import { Poll } from "models/Polls" import dayjs from "dayjs" import { useNotification } from "modules/common/hooks/useNotification" import ReactHtmlParser from "react-html-parser" +import { EtherlinkContext } from "services/wagmi/context" +import { Badge } from "components/ui/Badge" const LogoItem = styled("img")(({ theme }) => ({ cursor: "pointer", @@ -84,6 +86,7 @@ const CustomPopover = withStyles({ export const EvmProposalDetailCard: React.FC<{ poll: Poll | undefined }> = ({ poll }) => { const theme = useTheme() const isMobileSmall = useMediaQuery(theme.breakpoints.down("sm")) + const { daoProposalSelected } = useContext(EtherlinkContext) const [anchorEl, setAnchorEl] = React.useState(null) const openNotification = useNotification() @@ -123,7 +126,7 @@ export const EvmProposalDetailCard: React.FC<{ poll: Poll | undefined }> = ({ po > - {poll?.name} + {daoProposalSelected?.title} @@ -172,42 +175,48 @@ export const EvmProposalDetailCard: React.FC<{ poll: Poll | undefined }> = ({ po - {/* */} - + + + {/* */} + + + Posted by: + + - + Start date:{" "} - - {dayjs(Number(poll?.startTime)).format("lll")} + + {dayjs(Number(daoProposalSelected?.createdAt?.seconds)).format("lll")} - End date:{" "} - - {dayjs(Number(poll?.endTime)).format("lll")} + + {daoProposalSelected?.votingExpiresAt?.format("lll")} - {ReactHtmlParser(poll?.description ? poll?.description : "")} + {ReactHtmlParser(daoProposalSelected?.description ? daoProposalSelected?.description : "")} - {poll?.externalLink ? ( + {daoProposalSelected?.externalResource ? ( - - {poll?.externalLink} + + {daoProposalSelected?.externalResource} ) : null} diff --git a/src/modules/etherlink/components/EvmProposalVoteDetail.tsx b/src/modules/etherlink/components/EvmProposalVoteDetail.tsx index ed93d360..29a9fafb 100644 --- a/src/modules/etherlink/components/EvmProposalVoteDetail.tsx +++ b/src/modules/etherlink/components/EvmProposalVoteDetail.tsx @@ -1,23 +1,47 @@ /* eslint-disable @typescript-eslint/no-non-null-asserted-optional-chain */ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import React, { useContext, useEffect, useMemo, useState } from "react" -import { Button, Grid, LinearProgress, styled, Typography, useMediaQuery, useTheme } from "@material-ui/core" +import { Button, Grid, styled, Theme, Typography, useMediaQuery, useTheme } from "@material-ui/core" import { GridContainer } from "modules/common/GridContainer" import { VotesDialog } from "modules/lite/explorer/components/VotesDialog" import { Poll } from "models/Polls" import { Choice } from "models/Choice" +import ProgressBar from "react-customizable-progressbar" import { useTezos } from "services/beacon/hooks/useTezos" import { getTurnoutValue } from "services/utils/utils" import { useTokenDelegationSupported } from "services/contracts/token/hooks/useTokenDelegationSupported" import { DownloadCsvFile } from "modules/lite/explorer/components/DownloadCsvFile" import { EtherlinkContext } from "services/wagmi/context" +import { LinearProgress } from "components/ui/LinearProgress" +import { formatNumber } from "modules/explorer/utils/FormatNumber" const Container = styled(Grid)(({ theme }) => ({ background: theme.palette.primary.main, borderRadius: 8 })) +const ContainerTitle = styled(Typography)({ + fontSize: 24, + fontWeight: 600 +}) + +const ProgressText = styled(Typography)(({ textcolor }: { textcolor: string }) => ({ + color: textcolor, + display: "flex", + alignItems: "center", + position: "absolute", + width: "100%", + height: "100%", + fontSize: 16, + userSelect: "none", + boxShadow: "none", + background: "inherit", + fontFamily: "Roboto Flex", + justifyContent: "center", + top: 0 +})) + const TitleContainer = styled(Grid)(({ theme }) => ({ paddingTop: 18, paddingLeft: 46, @@ -43,12 +67,34 @@ const GraphicsContainer = styled(Grid)({ paddingBottom: 25 }) +const HistoryItem = styled(Grid)(({ theme }: { theme: Theme }) => ({ + marginTop: 8, + paddingBottom: 4, + display: "flex", + height: "auto", + + [theme.breakpoints.down("sm")]: { + width: "unset" + } +})) + +const HistoryKey = styled(Typography)({ + fontSize: 18, + fontWeight: 500, + textTransform: "capitalize" +}) + +const HistoryValue = styled(Typography)({ + fontSize: 18, + fontWeight: 300, + color: "#BFC5CA" +}) + export const EvmProposalVoteDetail: React.FC<{ poll: Poll | undefined choices: Choice[] token: any - isXTZ: boolean -}> = ({ poll, choices, token, isXTZ }) => { +}> = ({ poll, choices, token }) => { const theme = useTheme() const isMobileSmall = useMediaQuery(theme.breakpoints.down("xs")) const [open, setOpen] = React.useState(false) @@ -99,10 +145,15 @@ export const EvmProposalVoteDetail: React.FC<{ } }, [poll, network, token, tokenData, totalVoteCount]) + const votesQuorumPercentage = 50 + + console.log({ daoProposalSelected }) + return ( - - {/* Disabled as Data is wrong in Firebase */} - {/* + <> + + {/* Disabled as Data is wrong in Firebase */} + {/* Voter Turnout @@ -119,86 +170,89 @@ export const EvmProposalVoteDetail: React.FC<{ */} - - - Voting Results - - - - {choices && - choices?.map((choice: Choice, index) => { - const isFor = choice.name === "For" - const voteCount = isFor ? daoProposalSelected?.votesFor : daoProposalSelected?.votesAgainst - - const linearProgressValue = totalVoteCount > 0 ? (voteCount / totalVoteCount) * 100 : 0 - return ( - - - - - {choice.name} - - - - - {voteCount} Voters - {tokenData?.symbol} - - - - - - + + + Voting Results + + + + {choices && + choices?.map((choice: Choice, index) => { + const isFor = choice.name === "For" + const voteCount = isFor ? daoProposalSelected?.votesFor : daoProposalSelected?.votesAgainst + + const linearProgressValue = totalVoteCount > 0 ? (voteCount / totalVoteCount) * 100 : 0 + // const linearProgressValue = 50 + return ( + + + + + {choice.name} + + + + + {voteCount} Voters - {tokenData?.symbol} + + - - - {linearProgressValue}% - + + + + + + + {linearProgressValue}% + + - - - ) - })} - - - - handleClickOpen()}> - {totalVoteCount} - - handleClickOpen()}> - Votes - - {isTokenDelegationSupported && turnout && !poll?.isXTZ ? ( - - ({turnout.toFixed(2)} % Turnout) + + ) + })} + + + + handleClickOpen()}> + {totalVoteCount} - ) : null} - + handleClickOpen()}> + Votes + + {isTokenDelegationSupported && turnout && !poll?.isXTZ ? ( + + ({turnout.toFixed(2)} % Turnout) + + ) : null} + - - {/* + + {/* {numbro(calculateProposalTotal(choices, isXTZ ? 6 : tokenData?.decimals)).format(formatConfig)} {isXTZ ? "XTZ" : poll?.tokenSymbol} */} - {/* {!poll?.isXTZ && ( + {/* {!poll?.isXTZ && ( ( {getTreasuryPercentage( @@ -211,16 +265,16 @@ export const EvmProposalVoteDetail: React.FC<{ % of Total Supply) )} */} - {/* {totalVoteCount > 0 ? ( + {/* {totalVoteCount > 0 ? ( ) : null} */} - - - {/* + + {/* */} - - + + + + + + {/* Quorum */} + + + Quorum + + + +
+ {`${votesQuorumPercentage}%`} +
+
+
+
+
+
+ {/* History */} + + + + + History + + {daoProposalSelected?.statusHistoryMap?.map( + ( + item: { + status: string + timestamp: number + timestamp_human: string + }, + index: number + ) => { + return ( + + + {item.status} + + + + {item.timestamp_human} + + + + ) + } + )} + + {/* {isLambdaProposal ? ( + <> + + + Information + + + + Proposal Type: {_.startCase((proposal as LambdaProposal).metadata.lambdaType)} + + + + + ) : null} */} + + + +
+
+
+ ) } diff --git a/src/modules/etherlink/components/EvmTreasuryTable.tsx b/src/modules/etherlink/components/EvmTreasuryTable.tsx new file mode 100644 index 00000000..30e33336 --- /dev/null +++ b/src/modules/etherlink/components/EvmTreasuryTable.tsx @@ -0,0 +1,48 @@ +import { Typography } from "@material-ui/core" +import { SmallButton } from "modules/common/SmallButton" +import { Grid } from "@material-ui/core" +import { TableContainer } from "@material-ui/core" +import { TableBody, TableCell, TableHead, TableRow } from "@material-ui/core" + +import { Table } from "@material-ui/core" +import { CopyButton } from "components/ui/CopyButton" +import { useContext } from "react" +import { EtherlinkContext } from "services/wagmi/context" + +export const EvmTreasuryTable = () => { + const { daoSelected } = useContext(EtherlinkContext) + console.log("daoSelected", daoSelected) + return ( + + + + + Token Name + Symbol + Amount + Address + + + + + + Tezos + XTZ + 1000.00 + + + 0x1234...5678 + + + + + + Transfer + + + + +
+
+ ) +} diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmMembersPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmMembersPage.tsx index 3699a972..28310365 100644 --- a/src/modules/etherlink/explorer/EtherlinkDAO/EvmMembersPage.tsx +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmMembersPage.tsx @@ -21,9 +21,10 @@ export const EvmMembersPage = () => { Members - + {/* uncommented on andrei recommendation */} + {/* - + */} diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx index 14c02141..e3378443 100644 --- a/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx @@ -11,6 +11,7 @@ import { EvmProposalDetailCard } from "modules/etherlink/components/EvmProposalD import { ChoiceItemSelected } from "modules/lite/explorer/components/ChoiceItemSelected" import { EvmProposalVoteDetail } from "modules/etherlink/components/EvmProposalVoteDetail" import { TitleText } from "components/ui/TitleText" +import { EvmProposalCountdown } from "modules/etherlink/components/EvmProposalCountdown" export const EvmProposalDetailsPage = () => { const params = useParams() as { proposalId: string } const proposalId = params?.proposalId @@ -37,19 +38,19 @@ export const EvmProposalDetailsPage = () => { selected: false } ] + console.log("daoProposalSelected", daoProposalSelected) return (
- - Proposal Details - - + + + {choices && choices.length > 0 ? ( @@ -87,13 +88,8 @@ export const EvmProposalDetailsPage = () => { ) : null} + - {/* {poll && poll !== undefined ? ( { +
) } diff --git a/src/modules/etherlink/explorer/index.tsx b/src/modules/etherlink/explorer/index.tsx index 4c68fb57..ba31393a 100644 --- a/src/modules/etherlink/explorer/index.tsx +++ b/src/modules/etherlink/explorer/index.tsx @@ -1,5 +1,15 @@ import React, { useContext, useState } from "react" -import { Grid, Typography, useTheme, useMediaQuery } from "@material-ui/core" +import { + Grid, + Typography, + useTheme, + useMediaQuery, + TableCell, + TableBody, + TableContainer, + Table, + TableRow +} from "@material-ui/core" import { SmallButton } from "../../common/SmallButton" @@ -13,6 +23,8 @@ import { TitleText } from "components/ui/TitleText" import { EtherlinkContext } from "services/wagmi/context" import { EvmDaoStatsRow } from "../components/EvmDaoStatsRow" import { EvmDaoSettingModal } from "../components/EvmDaoSettingsModal" +import { CopyButton } from "components/ui/CopyButton" +import { EvmTreasuryTable } from "../components/EvmTreasuryTable" export const EtherlinkDAOOverview: React.FC = () => { const { daoSelected } = useContext(EtherlinkContext) @@ -125,6 +137,7 @@ export const EtherlinkDAOOverview: React.FC = () => {
+ ) } diff --git a/src/modules/explorer/components/NavigationMenu.tsx b/src/modules/explorer/components/NavigationMenu.tsx index 70b552ed..05bc00de 100644 --- a/src/modules/explorer/components/NavigationMenu.tsx +++ b/src/modules/explorer/components/NavigationMenu.tsx @@ -14,6 +14,7 @@ import { ReactComponent as VotingIcon } from "assets/logos/voting.svg" import { ReactComponent as TreasuryIcon } from "assets/logos/treasury.svg" import { ReactComponent as RegistryIcon } from "assets/logos/list.svg" import { ReactComponent as UserIcon } from "assets/logos/user.svg" +import { ReactComponent as MembersIcon } from "assets/logos/members.svg" import React, { useContext, useEffect, useState } from "react" import { useDAOID } from "../pages/DAO/router" import { useDAO } from "services/services/dao/hooks/useDAO" @@ -178,7 +179,7 @@ const getPages = (daoId: string, etherlinkDaoSelected: boolean): Page[] => { }, { pathId: "user", - name: "User", + name: etherlinkDaoSelected ? "Account" : "User", icon: UserIcon, href: etherlinkDaoSelected ? `/explorer/etherlink/dao/${daoId}/user` : `/explorer/dao/${daoId}/user` } @@ -188,7 +189,7 @@ const getPages = (daoId: string, etherlinkDaoSelected: boolean): Page[] => { defaultPages.splice(defaultPages.length - 1, 0, { pathId: "members", name: "Members", - icon: UserIcon, + icon: MembersIcon, href: `/explorer/etherlink/dao/${daoId}/members` }) } @@ -252,7 +253,7 @@ const BottomNavBar: React.FC = ({ children }) => { export const NavigationMenu: React.FC<{ disableMobileMenu?: boolean }> = ({ disableMobileMenu }) => { const [pages, setPages] = useState([]) - const { account } = useTezos() + const { account, etherlink } = useTezos() const daoId = useDAOID() const etherlinkDaoId = useEtherlinkDAOID() const { data: dao } = useDAO(daoId) @@ -269,7 +270,7 @@ export const NavigationMenu: React.FC<{ disableMobileMenu?: boolean }> = ({ disa const disabledPages: string[] = [] const isEtherlink = !!etherlinkDaoSelected?.id - if (!account) { + if (!account && !etherlink.isConnected) { disabledPages.push("User") } @@ -279,7 +280,7 @@ export const NavigationMenu: React.FC<{ disableMobileMenu?: boolean }> = ({ disa setPages(getPages(daoId || etherlinkDaoId, isEtherlink).filter(page => !disabledPages.includes(page.name))) } - }, [account, dao, daoId, etherlinkDaoId, etherlinkDaoSelected]) + }, [account, dao, daoId, etherlink.isConnected, etherlinkDaoId, etherlinkDaoSelected]) if (location.pathname === "/explorer/daos" || location.pathname === "/explorer/daos/") return null diff --git a/src/services/wagmi/context.tsx b/src/services/wagmi/context.tsx index 3b1a0803..da330713 100644 --- a/src/services/wagmi/context.tsx +++ b/src/services/wagmi/context.tsx @@ -9,6 +9,7 @@ import useFirestoreStore from "services/contracts/etherlinkDAO/hooks/useFirestor import { useParams } from "react-router-dom" import { ProposalStatus } from "services/services/dao/mappers/proposal/types" import { useTezos } from "services/beacon/hooks/useTezos" +import dayjs from "dayjs" interface EtherlinkType { isConnected: boolean @@ -25,17 +26,27 @@ interface EtherlinkType { const useEtherlinkDao = ({ network }: { network: string }) => { const selectedDaoIdRef = useRef(null) console.log("useEtherlinkDao", { network }) + const firebaseRootCollection = useMemo(() => { if (network === "etherlink_mainnet") { return "daosEtherlink-Mainnet" } if (network === "etherlink_testnet") { - return "daosEtherlink-Testnet" + return "idaosEtherlink-Testnet" } return undefined }, [network]) - console.log({ firebaseRootCollection }) + const firebaseRootTokenCollection = useMemo(() => { + if (!firebaseRootCollection) return undefined + if (firebaseRootCollection.endsWith("daosEtherlink-Testnet")) { + return "tokensEtherlink-Testnet" + } + if (firebaseRootCollection.endsWith("daosEtherlink-Mainnet")) { + return "tokensEtherlink-Mainnet" + } + return undefined + }, [firebaseRootCollection]) const [isLoadingDaos, setIsLoadingDaos] = useState(!!firebaseRootCollection) const [isLoadingDaoProposals, setIsLoadingDaoProposals] = useState(true) @@ -52,12 +63,20 @@ const useEtherlinkDao = ({ network }: { network: string }) => { // Trigger DAO Loading Request fetchCollection(firebaseRootCollection) } - }, [fetchCollection, firebaseRootCollection]) + if (firebaseRootTokenCollection) { + // Trigger Token Loading Request + fetchCollection(firebaseRootTokenCollection) + } + }, [fetchCollection, firebaseRootCollection, firebaseRootTokenCollection]) useEffect(() => { console.log("Firestore Data", firestoreData) if (!firebaseRootCollection) return if (firestoreData?.[firebaseRootCollection]) { + firestoreData[firebaseRootCollection]?.forEach((dao: any) => { + console.log("DAOTreasury", dao.id, Object.values(dao.treasury)) + }) + setDaoData(firestoreData[firebaseRootCollection]) setIsLoadingDaos(false) } @@ -67,9 +86,20 @@ const useEtherlinkDao = ({ network }: { network: string }) => { firestoreData[daoProposalKey] ?.sort((a: any, b: any) => b.createdAt - a.createdAt) .map(firebaseProposal => { + const proposalCreatedAt = dayjs.unix(firebaseProposal.createdAt?.seconds as unknown as number) + const votingDelayInMinutes = daoSelected?.votingDuration || 1 + const votingExpiresAt = proposalCreatedAt.add(votingDelayInMinutes, "minutes") return { ...firebaseProposal, - status: getStatusByHistory(firebaseProposal.statusHistory) + status: getStatusByHistory(firebaseProposal.statusHistory), + statusHistoryMap: Object.entries(firebaseProposal.statusHistory).map( + ([status, timestamp]: [string, any]) => ({ + status, + timestamp: timestamp?.seconds as unknown as number, + timestamp_human: dayjs.unix(timestamp?.seconds as unknown as number).format("MMM DD, YYYY HH:mm:ss") + }) + ), + votingExpiresAt: votingExpiresAt } }) ) @@ -78,7 +108,7 @@ const useEtherlinkDao = ({ network }: { network: string }) => { if (firestoreData?.[daoMembersKey]) { setDaoMembers(firestoreData[daoMembersKey]) } - }, [daoSelected.id, firebaseRootCollection, firestoreData]) + }, [daoSelected.id, daoSelected?.votingDuration, firebaseRootCollection, firestoreData]) useEffect(() => { if (daoSelected.id && firebaseRootCollection) { From 619629b583b421142798ba6dc7465b8da5566ec6 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Wed, 18 Dec 2024 13:12:20 +0530 Subject: [PATCH 27/36] WIP: DAO onChain Creator --- src/components/ui/InputText.tsx | 36 +++ src/components/ui/StyledSlider.tsx | 83 ++++++ src/modules/creator/steps/Governance.tsx | 27 +- .../etherlink/components/EvmDaoBasics.tsx | 153 +++------- .../etherlink/components/EvmDaoDeployment.tsx | 14 - .../etherlink/components/EvmDaoMembership.tsx | 122 ++++++++ .../etherlink/components/EvmDaoQuorum.tsx | 72 ++++- .../etherlink/components/EvmDaoSummary.tsx | 9 +- .../etherlink/components/EvmDaoVoting.tsx | 264 +++++++++++++++++- src/modules/etherlink/config.ts | 6 +- src/modules/etherlink/layout.tsx | 24 +- .../hooks/useEvmDaoCreateStore.tsx | 109 ++++++++ src/services/wagmi/context.tsx | 6 +- 13 files changed, 742 insertions(+), 183 deletions(-) create mode 100644 src/components/ui/InputText.tsx create mode 100644 src/components/ui/StyledSlider.tsx delete mode 100644 src/modules/etherlink/components/EvmDaoDeployment.tsx create mode 100644 src/modules/etherlink/components/EvmDaoMembership.tsx create mode 100644 src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx diff --git a/src/components/ui/InputText.tsx b/src/components/ui/InputText.tsx new file mode 100644 index 00000000..291df0ad --- /dev/null +++ b/src/components/ui/InputText.tsx @@ -0,0 +1,36 @@ +import { withStyles } from "@material-ui/core" +import { TextField } from "@mui/material" + +const InputText = withStyles(theme => ({ + root: { + "& .MuiInputBase-root": { + height: 54, + boxSizing: "border-box", + background: "#333333", + borderRadius: 8, + padding: "13px 23px", + fontWeight: 300, + color: "#ffffff", + fontSize: 18, + fontFamily: "Roboto Flex" + }, + "& .MuiInputBase-input": { + "padding": 0, + "&::placeholder": { + fontWeight: 300, + opacity: 1 + } + }, + "& .MuiInput-underline:before": { + borderBottom: "none" + }, + "& .MuiInput-underline:hover:before": { + borderBottom: "none" + }, + "& .MuiInput-underline:after": { + borderBottom: "none" + } + } +}))(TextField) + +export default InputText diff --git a/src/components/ui/StyledSlider.tsx b/src/components/ui/StyledSlider.tsx new file mode 100644 index 00000000..9e414992 --- /dev/null +++ b/src/components/ui/StyledSlider.tsx @@ -0,0 +1,83 @@ +import { Grid, Paper, Slider, styled, Typography, withStyles, withTheme } from "@material-ui/core" +import { useRef } from "react" + +const StyledSlider = withStyles({ + root: { + textAlign: "center", + width: "100%", + height: 4.5 + }, + valueLabel: { + textAlign: "center" + }, + thumb: { + height: 20, + width: 20, + top: "36.5%", + backgroundColor: "#fff", + border: "3px solid #fff" + }, + track: { + backgroundColor: "#4BCF93", + borderRadius: "4px", + height: 4.5 + }, + rail: { + height: 4.5 + } +})(Slider) + +export const CustomSliderValue = styled(withTheme(Paper))(props => ({ + boxShadow: "none", + height: 54, + display: "flex", + alignItems: "center", + justifyContent: "center", + background: "#2F3438", + borderRadius: 8, + width: "100%" +})) + +export const StyledSliderWithValue = ({ + defaultValue, + onChange +}: { + defaultValue: number + onChange: (newValue: any) => void +}) => { + const sliderValueRef = useRef(null) + const debounceTimeout = useRef() + return ( + + + { + if (sliderValueRef.current) { + sliderValueRef.current.innerHTML = `${newValue}%` + } + clearTimeout(debounceTimeout.current) + debounceTimeout.current = setTimeout(() => { + onChange(newValue) + }, 100) + }} + /> + + + + + {defaultValue}% + + + + + ) +} + +export default StyledSlider diff --git a/src/modules/creator/steps/Governance.tsx b/src/modules/creator/steps/Governance.tsx index 88d0cc87..37137003 100644 --- a/src/modules/creator/steps/Governance.tsx +++ b/src/modules/creator/steps/Governance.tsx @@ -15,6 +15,7 @@ import BigNumber from "bignumber.js" import { mutezToXtz, parseUnits } from "services/contracts/utils" import { FieldChange, handleChange } from "../utils" import { useBlockchainInfo } from "services/contracts/baseDAO/hooks/useBlockchainInfo" +import StyledSlider from "components/ui/StyledSlider" const TimeBox = styled(Grid)(({ theme }) => ({ background: theme.palette.primary.dark, @@ -116,32 +117,6 @@ const ValueText = styled(Typography)(({ theme }) => ({ fontWeight: 200 })) -const StyledSlider = withStyles({ - root: { - textAlign: "center", - width: "100%", - height: 4.5 - }, - valueLabel: { - textAlign: "center" - }, - thumb: { - height: 20, - width: 20, - top: "36.5%", - backgroundColor: "#fff", - border: "3px solid #fff" - }, - track: { - backgroundColor: "#4BCF93", - borderRadius: "4px", - height: 4.5 - }, - rail: { - height: 4.5 - } -})(Slider) - const CustomSliderValue = styled(withTheme(Paper))(props => ({ boxShadow: "none", height: 54, diff --git a/src/modules/etherlink/components/EvmDaoBasics.tsx b/src/modules/etherlink/components/EvmDaoBasics.tsx index 1c1e178d..3ba80ac1 100644 --- a/src/modules/etherlink/components/EvmDaoBasics.tsx +++ b/src/modules/etherlink/components/EvmDaoBasics.tsx @@ -14,30 +14,32 @@ import { } from "components/ui/DaoCreator" import React from "react" import { Link } from "@material-ui/core" -import { - Grid, - styled, - Typography, - withStyles, - TextareaAutosize, - withTheme, - useMediaQuery, - useTheme, - InputAdornment, - Tooltip -} from "@material-ui/core" +import { Grid, Typography, useMediaQuery, useTheme, InputAdornment, Tooltip } from "@material-ui/core" import { ErrorText } from "modules/creator/token/ui" -import { OrgSettings } from "modules/creator/state/types" -import { isInvalidEvmAddress, validateEvmTokenAddress } from "../utils" +import { validateEvmTokenAddress } from "../utils" import { InfoIcon } from "modules/explorer/components/styled/InfoIcon" interface EvmDaoBasicsProps { // Add props as needed } -const validateForm = (values: OrgSettings) => { - const errors: FormikErrors = {} +type EvmDaoSettings = { + name: string + symbol: string + description: string + administrator: string + guardian: string + governanceToken: { + address?: string + symbol: string + tokenSymbol: string + tokenDecimals: number + } +} + +const validateForm = (values: EvmDaoSettings) => { + const errors: FormikErrors = {} if (!values.name) { errors.name = "Required" @@ -51,14 +53,6 @@ const validateForm = (values: OrgSettings) => { errors.description = "Required" } - if (!values.guardian) { - errors.guardian = "Required" - } - - if (values.guardian && isInvalidEvmAddress(values.guardian)) { - errors.guardian = "Invalid address" - } - if (!values.governanceToken.address) { errors.governanceToken = { ...errors.governanceToken, @@ -66,31 +60,20 @@ const validateForm = (values: OrgSettings) => { } } - if (values.governanceToken.address && validateEvmTokenAddress(values.governanceToken.address)) { - errors.governanceToken = { - ...errors.governanceToken, - address: "Invalid address" - } - } - - if (!values.governanceToken.tokenId) { - errors.governanceToken = { - ...errors.governanceToken, - tokenId: "Required" - } - } - - if (!values.governanceToken.tokenMetadata) { + if ( + values.governanceToken.symbol && + (values.governanceToken.symbol.length > 4 || values.governanceToken.symbol.length < 2) + ) { errors.governanceToken = { ...errors.governanceToken, - address: "Could not find token" + address: "Invalid Symbol" } } - if (values.governanceToken.tokenMetadata?.standard === "fa1.2") { + if (!values.governanceToken.tokenDecimals) { errors.governanceToken = { ...errors.governanceToken, - address: "FA1.2 Tokens Not Supported" + tokenDecimals: "Required" } } @@ -101,8 +84,8 @@ export const EvmDaoBasics: React.FC = () => { const theme = useTheme() const isMobile = useMediaQuery(theme.breakpoints.down("sm")) - const saveStepInfo = (values: OrgSettings, { setSubmitting }: { setSubmitting: (b: boolean) => void }) => { - const newValues: OrgSettings = { ...values } + const saveStepInfo = (values: EvmDaoSettings, { setSubmitting }: { setSubmitting: (b: boolean) => void }) => { + const newValues: EvmDaoSettings = { ...values } // const newState = { // ...state?.data, // orgSettings: newValues @@ -113,19 +96,13 @@ export const EvmDaoBasics: React.FC = () => { // history.push(`voting`) } - const tokenMetadata = { - name: "Test", - symbol: "TEST" - } - const loading = false - - const orgSettings: OrgSettings = { + const orgSettings: EvmDaoSettings = { name: "", symbol: "", description: "", administrator: "", guardian: "", - governanceToken: { address: "", tokenId: "" } + governanceToken: { address: "", symbol: "", tokenDecimals: 0, tokenSymbol: "" } } return ( @@ -134,12 +111,8 @@ export const EvmDaoBasics: React.FC = () => { title="DAO Basics" description={ - These settings will define the name, symbol, and initial distribution of your token. You will need a - pre-existing ERC20 token to use as governance token. To deploy your own governance token you can go{" "} - - here - {" "} - and then come back. + These settings will define the name, symbol, and initial distribution of your DAO along with the ERC20 + token. } > @@ -176,41 +149,41 @@ export const EvmDaoBasics: React.FC = () => { {" "} - Token Address{" "} + Ticker Symbol{" "} setFieldTouched("governanceToken.address")} + onClick={() => setFieldTouched("governanceToken.symbol")} inputProps={{ maxLength: 36 }} /> - {errors.governanceToken?.address && touched.governanceToken?.address ? ( - {errors.governanceToken?.address} + {errors.governanceToken?.symbol && touched.governanceToken?.symbol ? ( + {errors.governanceToken?.symbol} ) : null} {" "} - Token ID{" "} + Token Decimals{" "} @@ -219,52 +192,10 @@ export const EvmDaoBasics: React.FC = () => { }} /> - {errors.governanceToken?.tokenId && touched.governanceToken?.tokenId ? ( - {errors.governanceToken?.tokenId} + {errors.governanceToken?.tokenDecimals && touched.governanceToken?.tokenDecimals ? ( + {errors.governanceToken?.tokenDecimals} ) : null} - {tokenMetadata && !loading && ( - - - {tokenMetadata.name} ({tokenMetadata.symbol}) - - - )} - - - - - {" "} - Guardian Address{" "} - - - - - setFieldTouched("guardian")} - inputProps={{ - maxLength: 36 - }} - InputProps={{ - endAdornment: ( - - - - - - ) - }} - > - - {errors.guardian && touched.guardian ? {errors.guardian} : null} - diff --git a/src/modules/etherlink/components/EvmDaoDeployment.tsx b/src/modules/etherlink/components/EvmDaoDeployment.tsx deleted file mode 100644 index a14d41c5..00000000 --- a/src/modules/etherlink/components/EvmDaoDeployment.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from "react" - -interface EvmDaoDeploymentProps { - // Add props as needed -} - -export const EvmDaoDeployment: React.FC = () => { - return ( -
-

Deploy Your DAO

-
-
- ) -} diff --git a/src/modules/etherlink/components/EvmDaoMembership.tsx b/src/modules/etherlink/components/EvmDaoMembership.tsx new file mode 100644 index 00000000..360304d3 --- /dev/null +++ b/src/modules/etherlink/components/EvmDaoMembership.tsx @@ -0,0 +1,122 @@ +import { useState } from "react" +import { TextField } from "@mui/material" +import { IconButton, styled } from "@material-ui/core" +import { Button } from "components/ui/Button" +import { Add, RemoveCircleOutline } from "@material-ui/icons" +import { Box } from "@material-ui/core" +import { DescriptionText } from "components/ui/DaoCreator" +import { TitleBlock } from "modules/common/TitleBlock" +import useEvmDaoCreateStore from "services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore" + +interface Member { + address: string + amountOfTokens: number +} +const StyledTextField = styled(TextField)({ + "& .MuiInput-root": { + color: "#fff", + paddingBottom: "4px" + }, + "& label": { + color: "#fff" + }, + "& label.Mui-focused": { + color: "#fff" + }, + "& .MuiInput-underline:before": { + borderBottomColor: "#ccc" + }, + "& .MuiInput-underline:after": { + borderBottomColor: "#fff" + }, + "& .MuiOutlinedInput-root": { + "& fieldset": { + borderColor: "#fff" + }, + "&:hover fieldset": { + borderColor: "#fff" + }, + "&.Mui-focused fieldset": { + borderColor: "#fff" + } + } +}) + +export const EvmDaoMembership = () => { + const { data, setFieldValue } = useEvmDaoCreateStore() + const members = data.members as Member[] + const setMembers = (members: Member[]) => { + setFieldValue("members", members) + } + + const handleMemberChange = (index: number, field: keyof Member, value: string) => { + const newMembers = [...members] + newMembers[index] = { ...newMembers[index], [field]: value } + setMembers(newMembers) + } + + const handleAddMember = () => { + setMembers([...members, { address: "", amountOfTokens: 0 }]) + } + + const handleRemoveMember = (index: number) => { + setMembers(members.filter((_, i) => i !== index)) + } + + return ( + + + Specify the address and their voting power of your associated. Voting power is represented by their amount + of tokens + + } + /> + + {members.map((member, index) => ( + + + handleMemberChange(index, "address", e.target.value)} + /> + + + handleMemberChange(index, "amountOfTokens", e.target.value)} + /> + + {index >= 1 && ( + handleRemoveMember(index)} size="small"> + + + )} + {index === 0 && } + + ))} + + + + + ) +} diff --git a/src/modules/etherlink/components/EvmDaoQuorum.tsx b/src/modules/etherlink/components/EvmDaoQuorum.tsx index d824a1af..48616bc0 100644 --- a/src/modules/etherlink/components/EvmDaoQuorum.tsx +++ b/src/modules/etherlink/components/EvmDaoQuorum.tsx @@ -1,14 +1,80 @@ -import React from "react" +import { Grid, Typography, useMediaQuery, useTheme, Tooltip, InputAdornment } from "@material-ui/core" +import { CustomFormikTextField, CustomInputContainer, DescriptionText, InfoIconInput } from "components/ui/DaoCreator" +import InputText from "components/ui/InputText" +import { StyledSliderWithValue } from "components/ui/StyledSlider" +import { Field } from "formik" +import { TitleBlock } from "modules/common/TitleBlock" +import React, { useRef } from "react" +import useEvmDaoCreateStore from "services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore" interface EvmDaoQuorumProps { // Add props as needed } export const EvmDaoQuorum: React.FC = () => { + const theme = useTheme() + const isMobile = useMediaQuery(theme.breakpoints.down("sm")) + const { data, getIn, setFieldValue } = useEvmDaoCreateStore() return (
-

Quorum Settings

-
+ + These settings will define the quorum settings for your DAO. + + } + /> + { + setFieldValue("quorum.returnedTokenPercentage", newValue || 0) + }} + /> + + + + Proposal Threshold ({data?.governanceToken?.symbol} Amount) + + + Minimum voting power to submit a proposal + + + + + +
) } + +{ + /* + + + + + + ) + }} + /> + */ +} diff --git a/src/modules/etherlink/components/EvmDaoSummary.tsx b/src/modules/etherlink/components/EvmDaoSummary.tsx index b3bb0a99..49f62bdf 100644 --- a/src/modules/etherlink/components/EvmDaoSummary.tsx +++ b/src/modules/etherlink/components/EvmDaoSummary.tsx @@ -1,3 +1,5 @@ +import { DescriptionText } from "components/ui/DaoCreator" +import { TitleBlock } from "modules/common/TitleBlock" import React from "react" interface EvmDaoSummaryProps { @@ -7,7 +9,12 @@ interface EvmDaoSummaryProps { export const EvmDaoSummary: React.FC = () => { return (
-

DAO Summary

+ These settings will define the summary for your DAO. + } + />
) diff --git a/src/modules/etherlink/components/EvmDaoVoting.tsx b/src/modules/etherlink/components/EvmDaoVoting.tsx index 441b7dce..bd4e9c08 100644 --- a/src/modules/etherlink/components/EvmDaoVoting.tsx +++ b/src/modules/etherlink/components/EvmDaoVoting.tsx @@ -1,14 +1,270 @@ +import { Grid, styled, Tooltip, Typography, withStyles } from "@material-ui/core" +import { InfoRounded } from "@material-ui/icons" +import { DescriptionText } from "components/ui/DaoCreator" +import { TitleBlock } from "modules/common/TitleBlock" import React from "react" +import { Field, Formik, Form } from "formik" +import { TextField } from "formik-material-ui" + +const TimeBox = styled(Grid)(({ theme }) => ({ + background: theme.palette.primary.dark, + borderRadius: 8, + width: 72, + minHeight: 59, + marginBottom: 16, + display: "grid", + [theme.breakpoints.down("sm")]: { + width: 160 + } +})) + +const TimeText = styled(Typography)({ + marginTop: -20, + marginLeft: 16, + fontWeight: 300 +}) + +const CustomTooltip = styled(Tooltip)({ + marginLeft: 8 +}) + +const InfoIconInput = styled(InfoRounded)(({ theme }) => ({ + cursor: "default", + color: theme.palette.secondary.light, + height: 16, + width: 16, + marginLeft: 8 +})) + +const InputContainer = styled(Grid)({ + paddingRight: 15, + ["@media (max-width:1167px)"]: { + paddingRight: 0 + } +}) + +const CustomFormikTextField = withStyles({ + root: { + "& input": { + textAlign: "center" + } + } +})(TextField) + +const styles = { + voting: { + marginTop: 6, + marginBottom: 16, + fontWeight: 400, + fontSize: 18, + width: "75%" + } +} interface EvmDaoVotingProps { - // Add props as needed + onSubmit?: (values: any) => void + initialValues?: any } -export const EvmDaoVoting: React.FC = () => { +const initialFormValues = { + votingBlocksDay: 0, + votingBlocksHours: 0, + votingBlocksMinutes: 0, + proposalFlushBlocksDay: 0, + proposalFlushBlocksHours: 0, + proposalFlushBlocksMinutes: 0, + proposalExpiryBlocksDay: 0, + proposalExpiryBlocksHours: 0, + proposalExpiryBlocksMinutes: 0 +} + +export const EvmDaoVoting: React.FC = ({ onSubmit, initialValues = initialFormValues }) => { + const handleSubmit = (values: any) => { + if (onSubmit) { + onSubmit(values) + } + } + return (
-

Voting Configuration

-
+ + These settings will define the voting configuration for your DAO. + + } + /> + + + {({ isSubmitting }) => ( +
+ + + + + Voting Delay + + + + + + + + + + + + days + + + + + + hours + + + + + + minutes + + + + + + + + Voting Duration + + + + + + + + + + + + days + + + + + + hours + + + + + + minutes + + + + + + + + Execution Delay + + + + + + + + + + + + days + + + + + + hours + + + + + + minutes + + + + +
+ )} +
) } diff --git a/src/modules/etherlink/config.ts b/src/modules/etherlink/config.ts index c763f126..f4685058 100644 --- a/src/modules/etherlink/config.ts +++ b/src/modules/etherlink/config.ts @@ -1,5 +1,5 @@ import { EvmDaoBasics } from "./components/EvmDaoBasics" -import { EvmDaoDeployment } from "./components/EvmDaoDeployment" +import { EvmDaoMembership } from "./components/EvmDaoMembership" import { EvmDaoQuorum } from "./components/EvmDaoQuorum" import { EvmDaoSummary } from "./components/EvmDaoSummary" import { EvmDaoVoting } from "./components/EvmDaoVoting" @@ -9,8 +9,8 @@ export const STEPS = [ { title: "DAO Basics", index: 1, path: "dao", component: EvmDaoBasics }, { title: "Proposals & Voting", index: 2, path: "voting", component: EvmDaoVoting }, { title: "Quorum", index: 3, path: "quorum", component: EvmDaoQuorum }, - { title: "Review Information", index: 4, path: "summary", component: EvmDaoSummary }, - { title: "Deployment Type", index: 5, path: "type", component: EvmDaoDeployment } + { title: "Membership", index: 4, path: "membership", component: EvmDaoMembership }, + { title: "Review & Deploy", index: 5, path: "summary", component: EvmDaoSummary } ] export const urlToStepMap: Record = { diff --git a/src/modules/etherlink/layout.tsx b/src/modules/etherlink/layout.tsx index 22fe1c57..5604ebf8 100644 --- a/src/modules/etherlink/layout.tsx +++ b/src/modules/etherlink/layout.tsx @@ -3,9 +3,8 @@ import { Box, Grid, Step, StepLabel, useMediaQuery, useTheme, Link } from "@mate import ProgressBar from "react-customizable-progressbar" import { useHistory } from "react-router" -import { CreatorContext, StepInfo } from "modules/creator/state" -import { StepRouter, STEPS, useStepNumber } from "modules/creator/steps" -import { NavigationBar } from "modules/creator/components/NavigationBar" +import { StepInfo } from "modules/creator/state" +import { STEPS } from "modules/etherlink/config" import { Navbar } from "modules/common/Toolbar" import { PageContainer, @@ -17,28 +16,17 @@ import { StyledStepper, PageContent } from "components/ui/DaoCreator" -import mixpanel from "mixpanel-browser" import { urlToStepMap } from "./config" +import { NavigationBar } from "modules/creator/components/NavigationBar" +import useEvmDaoCreateStore from "services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore" export const EvmDaoCreatorLayout: React.FC = ({ children }) => { - // const creator = useContext(CreatorContext) - - // const { back, next } = creator.state - const back = () => {} - const next = () => {} - const step = useStepNumber() + const { currentStep: step, next, prev: back } = useEvmDaoCreateStore() const history = useHistory() const theme = useTheme() const isMobile = useMediaQuery(theme.breakpoints.down("sm")) - useEffect(() => { - mixpanel.unregister("daoAddress") - mixpanel.unregister("daoType") - - mixpanel.track("Visited Creator") - }, []) - return ( @@ -86,7 +74,7 @@ export const EvmDaoCreatorLayout: React.FC = ({ children }) => {
- {/* {step < 6 && } */} + {step < 6 && } diff --git a/src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx b/src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx new file mode 100644 index 00000000..4336105b --- /dev/null +++ b/src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx @@ -0,0 +1,109 @@ +import { create } from "zustand" +import { STEPS } from "modules/etherlink/config" +import { useHistory } from "react-router-dom" + +interface EvmDaoCreateStore { + currentStep: number + data: Record + loading: Record + error: Record + getIn: (field: string) => any + setFieldValue: (field: string, value: any) => void + next: { + text: string + handler: () => string | undefined + } + prev: { + text: string + handler: () => string | undefined + } +} + +const useEvmDaoCreateZustantStore = create((set, get) => ({ + currentStep: 0, + data: { + name: "", + symbol: "", + description: "", + administrator: "", + governanceToken: { + address: "", + symbol: "", + tokenDecimals: 0 + }, + quorum: { + returnedTokenPercentage: 0 + }, + members: [{ address: "", amountOfTokens: 0 }], + voting: { + votingBlocksDay: 0, + votingBlocksWeek: 0 + }, + registry: {} + }, + getIn: (field: string) => { + if (field.includes(".")) { + const [parent, child] = field.split(".") + return get().data[parent][child] + } + return get().data[field] + }, + setFieldValue: (field: string, value: any) => { + if (field.includes(".")) { + const [parent, child] = field.split(".") + set({ data: { ...get().data, [parent]: { ...get().data[parent], [child]: value } } }) + } else { + set({ data: { ...get().data, [field]: value } }) + } + }, + next: { + text: "Next", + handler: () => { + const { currentStep } = get() + if (currentStep === STEPS.length - 1) return + console.log("Moving to Next Step", currentStep) + set({ currentStep: currentStep + 1 }) + return STEPS[currentStep + 1]?.path + } + }, + prev: { + text: "Back", + handler: () => { + const { currentStep } = get() + if (currentStep === 0) return + console.log("Moving to Previous Step", currentStep) + set({ currentStep: currentStep - 1 }) + return STEPS[currentStep - 1]?.path + } + }, + loading: {}, + error: {} +})) + +const useEvmDaoCreateStore = () => { + const data = useEvmDaoCreateZustantStore() + const history = useHistory() + return { + ...data, + next: { + text: "Next", + handler: () => { + const nextStep = data.next.handler() + if (nextStep) { + history.push(nextStep) + } + } + }, + prev: { + text: "Back", + handler: () => { + const prevStep = data.prev.handler() + if (prevStep) { + history.push(prevStep) + } + } + } + } +} + +export default useEvmDaoCreateStore diff --git a/src/services/wagmi/context.tsx b/src/services/wagmi/context.tsx index da330713..7f812607 100644 --- a/src/services/wagmi/context.tsx +++ b/src/services/wagmi/context.tsx @@ -73,9 +73,9 @@ const useEtherlinkDao = ({ network }: { network: string }) => { console.log("Firestore Data", firestoreData) if (!firebaseRootCollection) return if (firestoreData?.[firebaseRootCollection]) { - firestoreData[firebaseRootCollection]?.forEach((dao: any) => { - console.log("DAOTreasury", dao.id, Object.values(dao.treasury)) - }) + // firestoreData[firebaseRootCollection]?.forEach((dao: any) => { + // console.log("DAOTreasury", dao.id, Object.values(dao.treasury)) + // }) setDaoData(firestoreData[firebaseRootCollection]) setIsLoadingDaos(false) From 7122514eaa0c96de9b0324931fd1f237822d3f81 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Wed, 18 Dec 2024 17:13:27 +0530 Subject: [PATCH 28/36] WIP - OnChain DAO --- src/assets/abis/hb_dao.json | 3918 +++++++---------- src/assets/abis/hb_evm.json | 1849 ++++---- src/assets/abis/hb_timelock.json | 55 + src/assets/abis/hb_wrapper.json | 255 ++ .../etherlink/components/EvmTreasuryTable.tsx | 10 +- .../contracts/baseDAO/hooks/useOriginate.ts | 4 - .../etherlinkDAO/hooks/temp-config.ts | 1875 ++++++++ .../hooks/useEvmDaoCreateStore.tsx | 150 +- .../contracts/token/hooks/useToken.ts | 3 +- src/services/wagmi/context.tsx | 22 + 10 files changed, 4976 insertions(+), 3165 deletions(-) create mode 100644 src/assets/abis/hb_timelock.json create mode 100644 src/assets/abis/hb_wrapper.json create mode 100644 src/services/contracts/etherlinkDAO/hooks/temp-config.ts diff --git a/src/assets/abis/hb_dao.json b/src/assets/abis/hb_dao.json index ff8db245..8817290f 100644 --- a/src/assets/abis/hb_dao.json +++ b/src/assets/abis/hb_dao.json @@ -1,2259 +1,1661 @@ { - "compiler": { - "version": "0.8.24+commit.e11b9ed9" - }, - "language": "Solidity", - "output": { - "abi": [ - { - "inputs": [ - { - "internalType": "contract IVotes", - "name": "_token", - "type": "address" - }, - { - "internalType": "contract TimelockController", - "name": "_timelock", - "type": "address" - }, - { - "internalType": "string", - "name": "name", - "type": "string" - }, - { - "internalType": "uint48", - "name": "minsDelay", - "type": "uint48" - }, - { - "internalType": "uint32", - "name": "minsVoting", - "type": "uint32" - }, - { - "internalType": "uint256", - "name": "pThreshold", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "qvrm", - "type": "uint8" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "CheckpointUnorderedInsertion", - "type": "error" - }, - { - "inputs": [], - "name": "FailedInnerCall", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "voter", - "type": "address" - } - ], - "name": "GovernorAlreadyCastVote", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "GovernorAlreadyQueuedProposal", - "type": "error" - }, - { - "inputs": [], - "name": "GovernorDisabledDeposit", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "proposer", - "type": "address" - }, - { - "internalType": "uint256", - "name": "votes", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "threshold", - "type": "uint256" - } - ], - "name": "GovernorInsufficientProposerVotes", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targets", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "calldatas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "values", - "type": "uint256" - } - ], - "name": "GovernorInvalidProposalLength", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "quorumNumerator", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "quorumDenominator", - "type": "uint256" - } - ], - "name": "GovernorInvalidQuorumFraction", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "voter", - "type": "address" - } - ], - "name": "GovernorInvalidSignature", - "type": "error" - }, - { - "inputs": [], - "name": "GovernorInvalidVoteType", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "votingPeriod", - "type": "uint256" - } - ], - "name": "GovernorInvalidVotingPeriod", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "GovernorNonexistentProposal", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "GovernorNotQueuedProposal", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "GovernorOnlyExecutor", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "GovernorOnlyProposer", - "type": "error" - }, - { - "inputs": [], - "name": "GovernorQueueNotImplemented", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "proposer", - "type": "address" - } - ], - "name": "GovernorRestrictedProposer", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "internalType": "enum IGovernor.ProposalState", - "name": "current", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "expectedStates", - "type": "bytes32" - } - ], - "name": "GovernorUnexpectedProposalState", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "currentNonce", - "type": "uint256" - } - ], - "name": "InvalidAccountNonce", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidShortString", - "type": "error" - }, - { - "inputs": [], - "name": "QueueEmpty", - "type": "error" - }, - { - "inputs": [], - "name": "QueueFull", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "bits", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "SafeCastOverflowedUintDowncast", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "str", - "type": "string" - } - ], - "name": "StringTooLong", - "type": "error" - }, - { - "anonymous": false, - "inputs": [], - "name": "EIP712DomainChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "ProposalCanceled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "proposer", - "type": "address" - }, - { - "indexed": false, - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "indexed": false, - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "indexed": false, - "internalType": "string[]", - "name": "signatures", - "type": "string[]" - }, - { - "indexed": false, - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "voteStart", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "voteEnd", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "description", - "type": "string" - } - ], - "name": "ProposalCreated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "ProposalExecuted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "etaSeconds", - "type": "uint256" - } - ], - "name": "ProposalQueued", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "oldProposalThreshold", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newProposalThreshold", - "type": "uint256" - } - ], - "name": "ProposalThresholdSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "oldQuorumNumerator", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newQuorumNumerator", - "type": "uint256" - } - ], - "name": "QuorumNumeratorUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "oldTimelock", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "newTimelock", - "type": "address" - } - ], - "name": "TimelockChange", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "voter", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint8", - "name": "support", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "weight", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "reason", - "type": "string" - } - ], - "name": "VoteCast", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "voter", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint8", - "name": "support", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "weight", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "reason", - "type": "string" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "params", - "type": "bytes" - } - ], - "name": "VoteCastWithParams", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "oldVotingDelay", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newVotingDelay", - "type": "uint256" - } - ], - "name": "VotingDelaySet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "oldVotingPeriod", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newVotingPeriod", - "type": "uint256" - } - ], - "name": "VotingPeriodSet", - "type": "event" - }, - { - "inputs": [], - "name": "BALLOT_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CLOCK_MODE", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "COUNTING_MODE", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "EXTENDED_BALLOT_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" - }, - { - "internalType": "bytes32", - "name": "descriptionHash", - "type": "bytes32" - } - ], - "name": "cancel", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "support", - "type": "uint8" - } - ], - "name": "castVote", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "support", - "type": "uint8" - }, - { - "internalType": "address", - "name": "voter", - "type": "address" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "name": "castVoteBySig", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "support", - "type": "uint8" - }, - { - "internalType": "string", - "name": "reason", - "type": "string" - } - ], - "name": "castVoteWithReason", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "support", - "type": "uint8" - }, - { - "internalType": "string", - "name": "reason", - "type": "string" - }, - { - "internalType": "bytes", - "name": "params", - "type": "bytes" - } - ], - "name": "castVoteWithReasonAndParams", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "support", - "type": "uint8" - }, - { - "internalType": "address", - "name": "voter", - "type": "address" - }, - { - "internalType": "string", - "name": "reason", - "type": "string" - }, - { - "internalType": "bytes", - "name": "params", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "name": "castVoteWithReasonAndParamsBySig", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "clock", - "outputs": [ - { - "internalType": "uint48", - "name": "", - "type": "uint48" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "eip712Domain", - "outputs": [ - { - "internalType": "bytes1", - "name": "fields", - "type": "bytes1" - }, - { - "internalType": "string", - "name": "name", - "type": "string" - }, - { - "internalType": "string", - "name": "version", - "type": "string" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "verifyingContract", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "salt", - "type": "bytes32" - }, - { - "internalType": "uint256[]", - "name": "extensions", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" - }, - { - "internalType": "bytes32", - "name": "descriptionHash", - "type": "bytes32" - } - ], - "name": "execute", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "timepoint", - "type": "uint256" - } - ], - "name": "getVotes", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "timepoint", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "params", - "type": "bytes" - } - ], - "name": "getVotesWithParams", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasVoted", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" - }, - { - "internalType": "bytes32", - "name": "descriptionHash", - "type": "bytes32" - } - ], - "name": "hashProposal", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "nonces", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "name": "onERC1155BatchReceived", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "name": "onERC1155Received", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "name": "onERC721Received", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "proposalDeadline", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "proposalEta", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "proposalNeedsQueuing", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "proposalProposer", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "proposalSnapshot", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "proposalThreshold", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "proposalVotes", - "outputs": [ - { - "internalType": "uint256", - "name": "againstVotes", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "forVotes", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "abstainVotes", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" - }, - { - "internalType": "string", - "name": "description", - "type": "string" - } - ], - "name": "propose", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" - }, - { - "internalType": "bytes32", - "name": "descriptionHash", - "type": "bytes32" - } - ], - "name": "queue", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - } - ], - "name": "quorum", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "quorumDenominator", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "timepoint", - "type": "uint256" - } - ], - "name": "quorumNumerator", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "quorumNumerator", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "relay", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "newProposalThreshold", - "type": "uint256" - } - ], - "name": "setProposalThreshold", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint48", - "name": "newVotingDelay", - "type": "uint48" - } - ], - "name": "setVotingDelay", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint32", - "name": "newVotingPeriod", - "type": "uint32" - } - ], - "name": "setVotingPeriod", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "state", - "outputs": [ - { - "internalType": "enum IGovernor.ProposalState", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "timelock", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "token", - "outputs": [ - { - "internalType": "contract IERC5805", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "newQuorumNumerator", - "type": "uint256" - } - ], - "name": "updateQuorumNumerator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract TimelockController", - "name": "newTimelock", - "type": "address" - } - ], - "name": "updateTimelock", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "version", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "votingDelay", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "votingPeriod", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "devdoc": { - "errors": { - "CheckpointUnorderedInsertion()": [ - { - "details": "A value was attempted to be inserted on a past checkpoint." - } - ], - "FailedInnerCall()": [ - { - "details": "A call to an address target failed. The target may have reverted." - } - ], - "GovernorAlreadyCastVote(address)": [ - { - "details": "The vote was already cast." - } - ], - "GovernorAlreadyQueuedProposal(uint256)": [ - { - "details": "The proposal has already been queued." - } - ], - "GovernorDisabledDeposit()": [ - { - "details": "Token deposits are disabled in this contract." - } - ], - "GovernorInsufficientProposerVotes(address,uint256,uint256)": [ - { - "details": "The `proposer` does not have the required votes to create a proposal." - } - ], - "GovernorInvalidProposalLength(uint256,uint256,uint256)": [ - { - "details": "Empty proposal or a mismatch between the parameters length for a proposal call." - } - ], - "GovernorInvalidQuorumFraction(uint256,uint256)": [ - { - "details": "The quorum set is not a valid fraction." - } - ], - "GovernorInvalidSignature(address)": [ - { - "details": "The provided signature is not valid for the expected `voter`. If the `voter` is a contract, the signature is not valid using {IERC1271-isValidSignature}." - } - ], - "GovernorInvalidVoteType()": [ - { - "details": "The vote type used is not valid for the corresponding counting module." - } - ], - "GovernorInvalidVotingPeriod(uint256)": [ - { - "details": "The voting period set is not a valid period." - } - ], - "GovernorNonexistentProposal(uint256)": [ - { - "details": "The `proposalId` doesn't exist." - } - ], - "GovernorNotQueuedProposal(uint256)": [ - { - "details": "The proposal hasn't been queued yet." - } - ], - "GovernorOnlyExecutor(address)": [ - { - "details": "The `account` is not the governance executor." - } - ], - "GovernorOnlyProposer(address)": [ - { - "details": "The `account` is not a proposer." - } - ], - "GovernorQueueNotImplemented()": [ - { - "details": "Queue operation is not implemented for this governor. Execute should be called directly." - } - ], - "GovernorRestrictedProposer(address)": [ - { - "details": "The `proposer` is not allowed to create a proposal." - } - ], - "GovernorUnexpectedProposalState(uint256,uint8,bytes32)": [ - { - "details": "The current state of a proposal is not the required for performing an operation. The `expectedStates` is a bitmap with the bits enabled for each ProposalState enum position counting from right to left. NOTE: If `expectedState` is `bytes32(0)`, the proposal is expected to not be in any state (i.e. not exist). This is the case when a proposal that is expected to be unset is already initiated (the proposal is duplicated). See {Governor-_encodeStateBitmap}." - } - ], - "InvalidAccountNonce(address,uint256)": [ - { - "details": "The nonce used for an `account` is not the expected current nonce." - } - ], - "QueueEmpty()": [ - { - "details": "An operation (e.g. {front}) couldn't be completed due to the queue being empty." - } - ], - "QueueFull()": [ - { - "details": "A push operation couldn't be completed due to the queue being full." - } - ], - "SafeCastOverflowedUintDowncast(uint8,uint256)": [ - { - "details": "Value doesn't fit in an uint of `bits` size." - } - ] - }, - "events": { - "EIP712DomainChanged()": { - "details": "MAY be emitted to signal that the domain could have changed." - }, - "ProposalCanceled(uint256)": { - "details": "Emitted when a proposal is canceled." - }, - "ProposalCreated(uint256,address,address[],uint256[],string[],bytes[],uint256,uint256,string)": { - "details": "Emitted when a proposal is created." - }, - "ProposalExecuted(uint256)": { - "details": "Emitted when a proposal is executed." - }, - "ProposalQueued(uint256,uint256)": { - "details": "Emitted when a proposal is queued." - }, - "TimelockChange(address,address)": { - "details": "Emitted when the timelock controller used for proposal execution is modified." - }, - "VoteCast(address,uint256,uint8,uint256,string)": { - "details": "Emitted when a vote is cast without params. Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used." - }, - "VoteCastWithParams(address,uint256,uint8,uint256,string,bytes)": { - "details": "Emitted when a vote is cast with params. Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used. `params` are additional encoded parameters. Their interpepretation also depends on the voting module used." - } - }, - "kind": "dev", - "methods": { - "CLOCK_MODE()": { - "details": "Machine-readable description of the clock as specified in EIP-6372." - }, - "COUNTING_MODE()": { - "details": "See {IGovernor-COUNTING_MODE}." - }, - "cancel(address[],uint256[],bytes[],bytes32)": { - "details": "See {IGovernor-cancel}." - }, - "castVote(uint256,uint8)": { - "details": "See {IGovernor-castVote}." - }, - "castVoteBySig(uint256,uint8,address,bytes)": { - "details": "See {IGovernor-castVoteBySig}." - }, - "castVoteWithReason(uint256,uint8,string)": { - "details": "See {IGovernor-castVoteWithReason}." - }, - "castVoteWithReasonAndParams(uint256,uint8,string,bytes)": { - "details": "See {IGovernor-castVoteWithReasonAndParams}." - }, - "castVoteWithReasonAndParamsBySig(uint256,uint8,address,string,bytes,bytes)": { - "details": "See {IGovernor-castVoteWithReasonAndParamsBySig}." - }, - "clock()": { - "details": "Clock (as specified in EIP-6372) is set to match the token's clock. Fallback to block numbers if the token does not implement EIP-6372." - }, - "eip712Domain()": { - "details": "See {IERC-5267}." - }, - "execute(address[],uint256[],bytes[],bytes32)": { - "details": "See {IGovernor-execute}." - }, - "getVotes(address,uint256)": { - "details": "See {IGovernor-getVotes}." - }, - "getVotesWithParams(address,uint256,bytes)": { - "details": "See {IGovernor-getVotesWithParams}." - }, - "hasVoted(uint256,address)": { - "details": "See {IGovernor-hasVoted}." - }, - "hashProposal(address[],uint256[],bytes[],bytes32)": { - "details": "See {IGovernor-hashProposal}. The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in advance, before the proposal is submitted. Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the same proposal (with same operation and same description) will have the same id if submitted on multiple governors across multiple networks. This also means that in order to execute the same operation twice (on the same governor) the proposer will have to change the description in order to avoid proposal id conflicts." - }, - "name()": { - "details": "See {IGovernor-name}." - }, - "nonces(address)": { - "details": "Returns the next unused nonce for an address." - }, - "onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)": { - "details": "See {IERC1155Receiver-onERC1155BatchReceived}. Receiving tokens is disabled if the governance executor is other than the governor itself (eg. when using with a timelock)." - }, - "onERC1155Received(address,address,uint256,uint256,bytes)": { - "details": "See {IERC1155Receiver-onERC1155Received}. Receiving tokens is disabled if the governance executor is other than the governor itself (eg. when using with a timelock)." - }, - "onERC721Received(address,address,uint256,bytes)": { - "details": "See {IERC721Receiver-onERC721Received}. Receiving tokens is disabled if the governance executor is other than the governor itself (eg. when using with a timelock)." - }, - "proposalDeadline(uint256)": { - "details": "See {IGovernor-proposalDeadline}." - }, - "proposalEta(uint256)": { - "details": "See {IGovernor-proposalEta}." - }, - "proposalProposer(uint256)": { - "details": "See {IGovernor-proposalProposer}." - }, - "proposalSnapshot(uint256)": { - "details": "See {IGovernor-proposalSnapshot}." - }, - "proposalVotes(uint256)": { - "details": "Accessor to the internal vote counts." - }, - "propose(address[],uint256[],bytes[],string)": { - "details": "See {IGovernor-propose}. This function has opt-in frontrunning protection, described in {_isValidDescriptionForProposer}." - }, - "queue(address[],uint256[],bytes[],bytes32)": { - "details": "See {IGovernor-queue}." - }, - "quorumDenominator()": { - "details": "Returns the quorum denominator. Defaults to 100, but may be overridden." - }, - "quorumNumerator()": { - "details": "Returns the current quorum numerator. See {quorumDenominator}." - }, - "quorumNumerator(uint256)": { - "details": "Returns the quorum numerator at a specific timepoint. See {quorumDenominator}." - }, - "relay(address,uint256,bytes)": { - "details": "Relays a transaction or function call to an arbitrary target. In cases where the governance executor is some contract other than the governor itself, like when using a timelock, this function can be invoked in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. Note that if the executor is simply the governor itself, use of `relay` is redundant." - }, - "setProposalThreshold(uint256)": { - "details": "Update the proposal threshold. This operation can only be performed through a governance proposal. Emits a {ProposalThresholdSet} event." - }, - "setVotingDelay(uint48)": { - "details": "Update the voting delay. This operation can only be performed through a governance proposal. Emits a {VotingDelaySet} event." - }, - "setVotingPeriod(uint32)": { - "details": "Update the voting period. This operation can only be performed through a governance proposal. Emits a {VotingPeriodSet} event." - }, - "supportsInterface(bytes4)": { - "details": "See {IERC165-supportsInterface}." - }, - "timelock()": { - "details": "Public accessor to check the address of the timelock" - }, - "token()": { - "details": "The token that voting power is sourced from." - }, - "updateQuorumNumerator(uint256)": { - "details": "Changes the quorum numerator. Emits a {QuorumNumeratorUpdated} event. Requirements: - Must be called through a governance proposal. - New numerator must be smaller or equal to the denominator." - }, - "updateTimelock(address)": { - "details": "Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates must be proposed, scheduled, and executed through governance proposals. CAUTION: It is not recommended to change the timelock while there are other queued governance proposals." - }, - "version()": { - "details": "See {IGovernor-version}." - } - }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "bytecode": "610180604052348015610010575f80fd5b506040516183f43803806183f483398181016040528101906100329190610e8f565b858160ff1688603c876100459190610f75565b603c876100529190610fb1565b868a806100636101af60201b60201c565b6100765f836101ec60201b90919060201c565b61012081815250506100926001826101ec60201b90919060201c565b6101408181525050818051906020012060e08181525050808051906020012061010081815250504660a081815250506100cf61023960201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250505050806003908161011b91906111f1565b505061012c8361029360201b60201c565b61013b8261030660201b60201c565b61014a816103bf60201b60201c565b5050508073ffffffffffffffffffffffffffffffffffffffff166101608173ffffffffffffffffffffffffffffffffffffffff1681525050506101928161040460201b60201c565b506101a2816104de60201b60201c565b50505050505050506116ae565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b5f60208351101561020d576102068361057b60201b60201c565b9050610233565b8261021d836105e060201b60201c565b5f01908161022b91906111f1565b5060ff5f1b90505b92915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60e0516101005146306040516020016102789594939291906112f6565b60405160208183030381529060405280519060200120905090565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360085f9054906101000a900465ffffffffffff16826040516102d7929190611377565b60405180910390a18060085f6101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b5f8163ffffffff1603610350575f6040517ff1cfbf0500000000000000000000000000000000000000000000000000000000815260040161034791906113d7565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828600860069054906101000a900463ffffffff1682604051610393929190611420565b60405180910390a180600860066101000a81548163ffffffff021916908363ffffffff16021790555050565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461600754826040516103f2929190611447565b60405180910390a18060078190555050565b5f6104136105e960201b60201c565b90508082111561045c5781816040517f243e5445000000000000000000000000000000000000000000000000000000008152600401610453929190611447565b60405180910390fd5b5f61046b6105f160201b60201c565b905061049e61047e61062360201b60201c565b61048d856106ba60201b60201c565b600a61072760201b9092919060201c565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781846040516104d1929190611447565b60405180910390a1505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260405161053092919061146e565b60405180910390a180600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f80829050601f815111156105c757826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016105be91906114dd565b60405180910390fd5b8051816105d39061152a565b5f1c175f1b915050919050565b5f819050919050565b5f6064905090565b5f610602600a61074860201b60201c565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff16905090565b5f6106326107b060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166391ddadf46040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561069957506040513d601f19601f820116820180604052508101906106969190611590565b60015b6106b2576106ab6107ba60201b60201c565b90506106b7565b809150505b90565b5f79ffffffffffffffffffffffffffffffffffffffffffffffffffff801682111561071f5760d0826040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526004016107169291906115f4565b60405180910390fd5b819050919050565b5f8061073c855f0185856107cf60201b60201c565b91509150935093915050565b5f80825f018054905090505f81146107a657610778835f0160018361076d919061161b565b610b4360201b60201c565b5f0160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff166107a8565b5f5b915050919050565b5f61016051905090565b5f6107ca43610b5560201b60201c565b905090565b5f805f858054905090505f811115610a5b575f6107fe876001846107f3919061161b565b610b4360201b60201c565b6040518060400160405290815f82015f9054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020015f820160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff168152505090508565ffffffffffff16815f015165ffffffffffff1611156108e9576040517f2520601d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8565ffffffffffff16815f015165ffffffffffff1603610971578461092088600185610915919061161b565b610b4360201b60201c565b5f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550610a4a565b8660405180604001604052808865ffffffffffff1681526020018779ffffffffffffffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a81548165ffffffffffff021916908365ffffffffffff1602179055506020820151815f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b806020015185935093505050610b3b565b8560405180604001604052808765ffffffffffff1681526020018679ffffffffffffffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a81548165ffffffffffff021916908365ffffffffffff1602179055506020820151815f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505f8492509250505b935093915050565b5f825f528160205f2001905092915050565b5f65ffffffffffff8016821115610ba6576030826040517f6dfcc650000000000000000000000000000000000000000000000000000000008152600401610b9d929190611687565b60405180910390fd5b819050919050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610be882610bbf565b9050919050565b5f610bf982610bde565b9050919050565b610c0981610bef565b8114610c13575f80fd5b50565b5f81519050610c2481610c00565b92915050565b5f610c3482610bbf565b9050919050565b5f610c4582610c2a565b9050919050565b610c5581610c3b565b8114610c5f575f80fd5b50565b5f81519050610c7081610c4c565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610cc482610c7e565b810181811067ffffffffffffffff82111715610ce357610ce2610c8e565b5b80604052505050565b5f610cf5610bae565b9050610d018282610cbb565b919050565b5f67ffffffffffffffff821115610d2057610d1f610c8e565b5b610d2982610c7e565b9050602081019050919050565b8281835e5f83830152505050565b5f610d56610d5184610d06565b610cec565b905082815260208101848484011115610d7257610d71610c7a565b5b610d7d848285610d36565b509392505050565b5f82601f830112610d9957610d98610c76565b5b8151610da9848260208601610d44565b91505092915050565b5f65ffffffffffff82169050919050565b610dcc81610db2565b8114610dd6575f80fd5b50565b5f81519050610de781610dc3565b92915050565b5f63ffffffff82169050919050565b610e0581610ded565b8114610e0f575f80fd5b50565b5f81519050610e2081610dfc565b92915050565b5f819050919050565b610e3881610e26565b8114610e42575f80fd5b50565b5f81519050610e5381610e2f565b92915050565b5f60ff82169050919050565b610e6e81610e59565b8114610e78575f80fd5b50565b5f81519050610e8981610e65565b92915050565b5f805f805f805f60e0888a031215610eaa57610ea9610bb7565b5b5f610eb78a828b01610c16565b9750506020610ec88a828b01610c62565b965050604088015167ffffffffffffffff811115610ee957610ee8610bbb565b5b610ef58a828b01610d85565b9550506060610f068a828b01610dd9565b9450506080610f178a828b01610e12565b93505060a0610f288a828b01610e45565b92505060c0610f398a828b01610e7b565b91505092959891949750929550565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610f7f82610db2565b9150610f8a83610db2565b9250828202610f9881610db2565b9150808214610faa57610fa9610f48565b5b5092915050565b5f610fbb82610ded565b9150610fc683610ded565b9250828202610fd481610ded565b9150808214610fe657610fe5610f48565b5b5092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061103b57607f821691505b60208210810361104e5761104d610ff7565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026110b07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611075565b6110ba8683611075565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6110f56110f06110eb84610e26565b6110d2565b610e26565b9050919050565b5f819050919050565b61110e836110db565b61112261111a826110fc565b848454611081565b825550505050565b5f90565b61113661112a565b611141818484611105565b505050565b5b81811015611164576111595f8261112e565b600181019050611147565b5050565b601f8211156111a95761117a81611054565b61118384611066565b81016020851015611192578190505b6111a661119e85611066565b830182611146565b50505b505050565b5f82821c905092915050565b5f6111c95f19846008026111ae565b1980831691505092915050565b5f6111e183836111ba565b9150826002028217905092915050565b6111fa82610fed565b67ffffffffffffffff81111561121357611212610c8e565b5b61121d8254611024565b611228828285611168565b5f60209050601f831160018114611259575f8415611247578287015190505b61125185826111d6565b8655506112b8565b601f19841661126786611054565b5f5b8281101561128e57848901518255600182019150602085019450602081019050611269565b868310156112ab57848901516112a7601f8916826111ba565b8355505b6001600288020188555050505b505050505050565b5f819050919050565b6112d2816112c0565b82525050565b6112e181610e26565b82525050565b6112f081610bde565b82525050565b5f60a0820190506113095f8301886112c9565b61131660208301876112c9565b61132360408301866112c9565b61133060608301856112d8565b61133d60808301846112e7565b9695505050505050565b5f61136161135c61135784610db2565b6110d2565b610e26565b9050919050565b61137181611347565b82525050565b5f60408201905061138a5f830185611368565b6113976020830184611368565b9392505050565b5f819050919050565b5f6113c16113bc6113b78461139e565b6110d2565b610e26565b9050919050565b6113d1816113a7565b82525050565b5f6020820190506113ea5f8301846113c8565b92915050565b5f61140a61140561140084610ded565b6110d2565b610e26565b9050919050565b61141a816113f0565b82525050565b5f6040820190506114335f830185611411565b6114406020830184611411565b9392505050565b5f60408201905061145a5f8301856112d8565b61146760208301846112d8565b9392505050565b5f6040820190506114815f8301856112e7565b61148e60208301846112e7565b9392505050565b5f82825260208201905092915050565b5f6114af82610fed565b6114b98185611495565b93506114c9818560208601610d36565b6114d281610c7e565b840191505092915050565b5f6020820190508181035f8301526114f581846114a5565b905092915050565b5f81519050919050565b5f819050602082019050919050565b5f61152182516112c0565b80915050919050565b5f611534826114fd565b8261153e84611507565b905061154981611516565b92506020821015611589576115847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802611075565b831692505b5050919050565b5f602082840312156115a5576115a4610bb7565b5b5f6115b284828501610dd9565b91505092915050565b5f819050919050565b5f6115de6115d96115d4846115bb565b6110d2565b610e59565b9050919050565b6115ee816115c4565b82525050565b5f6040820190506116075f8301856115e5565b61161460208301846112d8565b9392505050565b5f61162582610e26565b915061163083610e26565b925082820390508181111561164857611647610f48565b5b92915050565b5f819050919050565b5f61167161166c6116678461164e565b6110d2565b610e59565b9050919050565b61168181611657565b82525050565b5f60408201905061169a5f830185611678565b6116a760208301846112d8565b9392505050565b60805160a05160c05160e05161010051610120516101405161016051616ceb6117095f395f611edc01525f612df701525f612dbc01525f61455601525f61453501525f61388d01525f6138e301525f61390c0152616ceb5ff3fe608060405260043610610296575f3560e01c80637ecebe0011610159578063c01f9e37116100c0578063e540d01d11610079578063e540d01d14610b89578063eb9019d414610bb1578063ece40cc114610bed578063f23a6e6114610c15578063f8ce560a14610c51578063fc0c546a14610c8d57610309565b8063c01f9e3714610a77578063c28bc2fa14610ab3578063c59057e414610acf578063d33219b414610b0b578063dd4e2ba514610b35578063deaaa7cc14610b5f57610309565b8063a7713a7011610112578063a7713a7014610947578063a890c91014610971578063a9a9529414610999578063ab58fb8e146109d5578063b58131b014610a11578063bc197c8114610a3b57610309565b80637ecebe001461080f57806384b0196e1461084b5780638ff262e31461087b57806391ddadf4146108b757806397c3d334146108e15780639a802a6d1461090b57610309565b806343859632116101fd5780635b8d0e0d116101b65780635b8d0e0d146106bb5780635f398a14146106f757806360c4247f14610733578063790518871461076f5780637b3c71d3146107975780637d5e81e2146107d357610309565b80634385963214610575578063452115d6146105b15780634bf5d7e9146105ed578063544ffc9c1461061757806354fd4d5014610655578063567813881461067f57610309565b8063160cbed71161024f578063160cbed71461043d5780632656227d146104795780632d63f693146104a95780632fe3e261146104e55780633932abb11461050f5780633e4f49e61461053957610309565b806301ffc9a71461030d57806302a251a31461034957806306f3f9e61461037357806306fdde031461039b578063143489d0146103c5578063150b7a021461040157610309565b36610309573073ffffffffffffffffffffffffffffffffffffffff166102ba610cb7565b73ffffffffffffffffffffffffffffffffffffffff1614610307576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b5f80fd5b348015610318575f80fd5b50610333600480360381019061032e91906148c7565b610cc5565b604051610340919061490c565b60405180910390f35b348015610354575f80fd5b5061035d610da6565b60405161036a919061493d565b60405180910390f35b34801561037e575f80fd5b5061039960048036038101906103949190614980565b610db4565b005b3480156103a6575f80fd5b506103af610dc8565b6040516103bc9190614a1b565b60405180910390f35b3480156103d0575f80fd5b506103eb60048036038101906103e69190614980565b610e58565b6040516103f89190614a7a565b60405180910390f35b34801561040c575f80fd5b5061042760048036038101906104229190614be9565b610e93565b6040516104349190614c78565b60405180910390f35b348015610448575f80fd5b50610463600480360381019061045e9190614f26565b610f12565b604051610470919061493d565b60405180910390f35b610493600480360381019061048e9190614f26565b611008565b6040516104a0919061493d565b60405180910390f35b3480156104b4575f80fd5b506104cf60048036038101906104ca9190614980565b6111e2565b6040516104dc919061493d565b60405180910390f35b3480156104f0575f80fd5b506104f9611218565b6040516105069190614fed565b60405180910390f35b34801561051a575f80fd5b5061052361123c565b604051610530919061493d565b60405180910390f35b348015610544575f80fd5b5061055f600480360381019061055a9190614980565b61124a565b60405161056c9190615079565b60405180910390f35b348015610580575f80fd5b5061059b60048036038101906105969190615092565b61125b565b6040516105a8919061490c565b60405180910390f35b3480156105bc575f80fd5b506105d760048036038101906105d29190614f26565b6112c0565b6040516105e4919061493d565b60405180910390f35b3480156105f8575f80fd5b50610601611380565b60405161060e9190614a1b565b60405180910390f35b348015610622575f80fd5b5061063d60048036038101906106389190614980565b61143d565b60405161064c939291906150d0565b60405180910390f35b348015610660575f80fd5b50610669611470565b6040516106769190614a1b565b60405180910390f35b34801561068a575f80fd5b506106a560048036038101906106a0919061513b565b6114ad565b6040516106b2919061493d565b60405180910390f35b3480156106c6575f80fd5b506106e160048036038101906106dc91906151d2565b6114dc565b6040516106ee919061493d565b60405180910390f35b348015610702575f80fd5b5061071d600480360381019061071891906152b4565b61160b565b60405161072a919061493d565b60405180910390f35b34801561073e575f80fd5b5061075960048036038101906107549190614980565b611673565b604051610766919061493d565b60405180910390f35b34801561077a575f80fd5b506107956004803603810190610790919061538f565b61176c565b005b3480156107a2575f80fd5b506107bd60048036038101906107b891906153ba565b611780565b6040516107ca919061493d565b60405180910390f35b3480156107de575f80fd5b506107f960048036038101906107f491906154c9565b6117e6565b604051610806919061493d565b60405180910390f35b34801561081a575f80fd5b506108356004803603810190610830919061559d565b6118d3565b604051610842919061493d565b60405180910390f35b348015610856575f80fd5b5061085f611919565b60405161087297969594939291906156b9565b60405180910390f35b348015610886575f80fd5b506108a1600480360381019061089c919061573b565b6119be565b6040516108ae919061493d565b60405180910390f35b3480156108c2575f80fd5b506108cb611a92565b6040516108d891906157ca565b60405180910390f35b3480156108ec575f80fd5b506108f5611b1d565b604051610902919061493d565b60405180910390f35b348015610916575f80fd5b50610931600480360381019061092c91906157e3565b611b25565b60405161093e919061493d565b60405180910390f35b348015610952575f80fd5b5061095b611b3a565b604051610968919061493d565b60405180910390f35b34801561097c575f80fd5b506109976004803603810190610992919061589b565b611b66565b005b3480156109a4575f80fd5b506109bf60048036038101906109ba9190614980565b611b7a565b6040516109cc919061490c565b60405180910390f35b3480156109e0575f80fd5b506109fb60048036038101906109f69190614980565b611b8b565b604051610a08919061493d565b60405180910390f35b348015610a1c575f80fd5b50610a25611bc1565b604051610a32919061493d565b60405180910390f35b348015610a46575f80fd5b50610a616004803603810190610a5c91906158c6565b611bcf565b604051610a6e9190614c78565b60405180910390f35b348015610a82575f80fd5b50610a9d6004803603810190610a989190614980565b611c4f565b604051610aaa919061493d565b60405180910390f35b610acd6004803603810190610ac891906159e6565b611cb9565b005b348015610ada575f80fd5b50610af56004803603810190610af09190614f26565b611d42565b604051610b02919061493d565b60405180910390f35b348015610b16575f80fd5b50610b1f611d7c565b604051610b2c9190614a7a565b60405180910390f35b348015610b40575f80fd5b50610b49611da4565b604051610b569190614a1b565b60405180910390f35b348015610b6a575f80fd5b50610b73611de1565b604051610b809190614fed565b60405180910390f35b348015610b94575f80fd5b50610baf6004803603810190610baa9190615a90565b611e05565b005b348015610bbc575f80fd5b50610bd76004803603810190610bd29190615abb565b611e19565b604051610be4919061493d565b60405180910390f35b348015610bf8575f80fd5b50610c136004803603810190610c0e9190614980565b611e34565b005b348015610c20575f80fd5b50610c3b6004803603810190610c369190615af9565b611e48565b604051610c489190614c78565b60405180910390f35b348015610c5c575f80fd5b50610c776004803603810190610c729190614980565b611ec8565b604051610c84919061493d565b60405180910390f35b348015610c98575f80fd5b50610ca1611ed9565b604051610cae9190615be7565b60405180910390f35b5f610cc0611f00565b905090565b5f7f65455a86000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d8f57507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d9f5750610d9e82611f28565b5b9050919050565b5f610daf611f91565b905090565b610dbc611fb0565b610dc5816120a5565b50565b606060038054610dd790615c2d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0390615c2d565b8015610e4e5780601f10610e2557610100808354040283529160200191610e4e565b820191905f5260205f20905b815481529060010190602001808311610e3157829003601f168201915b5050505050905090565b5f60045f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f3073ffffffffffffffffffffffffffffffffffffffff16610eb3610cb7565b73ffffffffffffffffffffffffffffffffffffffff1614610f00576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63150b7a0260e01b9050949350505050565b5f80610f2086868686611d42565b9050610f3581610f306004612167565b61218b565b505f610f4482888888886121f6565b90505f8165ffffffffffff1614610fc9578060045f8481526020019081526020015f206001015f6101000a81548165ffffffffffff021916908365ffffffffffff1602179055507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928282604051610fbc929190615c8d565b60405180910390a1610ffb565b6040517f90884a4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8192505050949350505050565b5f8061101686868686611d42565b9050611036816110266005612167565b6110306004612167565b1761218b565b50600160045f8381526020019081526020015f205f01601e6101000a81548160ff0219169083151502179055503073ffffffffffffffffffffffffffffffffffffffff16611082610cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611138575f5b8651811015611136573073ffffffffffffffffffffffffffffffffffffffff168782815181106110d2576110d1615cb4565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361112b5761112a85828151811061110b5761110a615cb4565b5b602002602001015180519060200120600561220f90919063ffffffff16565b5b80600101905061109f565b505b611145818787878761232e565b3073ffffffffffffffffffffffffffffffffffffffff16611164610cb7565b73ffffffffffffffffffffffffffffffffffffffff161415801561118f575061118d6005612342565b155b1561119f5761119e60056123ae565b5b7f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f816040516111ce919061493d565b60405180910390a180915050949350505050565b5f60045f8381526020019081526020015f205f0160149054906101000a900465ffffffffffff1665ffffffffffff169050919050565b7f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a81181565b5f611245612424565b905090565b5f61125482612446565b9050919050565b5f60095f8481526020019081526020015f206003015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f806112ce86868686611d42565b90506112e2816112dd5f612167565b61218b565b506112ec81610e58565b73ffffffffffffffffffffffffffffffffffffffff1661130a6125fb565b73ffffffffffffffffffffffffffffffffffffffff16146113695761132d6125fb565b6040517f233d98e30000000000000000000000000000000000000000000000000000000081526004016113609190614a7a565b60405180910390fd5b61137586868686612602565b915050949350505050565b606061138a611ed9565b73ffffffffffffffffffffffffffffffffffffffff16634bf5d7e96040518163ffffffff1660e01b81526004015f60405180830381865afa9250505080156113f457506040513d5f823e3d601f19601f820116820180604052508101906113f19190615d4f565b60015b611435576040518060400160405280601d81526020017f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000815250905061143a565b809150505b90565b5f805f8060095f8681526020019081526020015f209050805f015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b5f806114b76125fb565b90506114d384828560405180602001604052805f815250612619565b91505092915050565b5f80611569876115637f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a8118c8c8c6115128e612638565b8d8d604051611522929190615dc4565b60405180910390208c805190602001206040516020016115489796959493929190615deb565b6040516020818303038152906040528051906020012061268b565b856126a4565b9050806115ad57866040517f94ab6c070000000000000000000000000000000000000000000000000000000081526004016115a49190614a7a565b60405180910390fd5b6115fd89888a89898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505088612731565b915050979650505050505050565b5f806116156125fb565b905061166787828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505087612731565b91505095945050505050565b5f80600a5f018054905090505f600a5f016001836116919190615e85565b815481106116a2576116a1615cb4565b5b905f5260205f200190505f815f015f9054906101000a900465ffffffffffff1690505f825f0160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff169050858265ffffffffffff1611611728578079ffffffffffffffffffffffffffffffffffffffffffffffffffff16945050505050611767565b6117446117348761282e565b600a61288790919063ffffffff16565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff169450505050505b919050565b611774611fb0565b61177d81612974565b50565b5f8061178a6125fb565b90506117db86828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050612619565b915050949350505050565b5f806117f06125fb565b90506117fc81846129e7565b61183d57806040517fd9b395570000000000000000000000000000000000000000000000000000000081526004016118349190614a7a565b60405180910390fd5b5f61186382600161184c611a92565b6118569190615eb8565b65ffffffffffff16611e19565b90505f61186e611bc1565b9050808210156118b9578282826040517fc242ee160000000000000000000000000000000000000000000000000000000081526004016118b093929190615ef1565b60405180910390fd5b6118c68888888887612b2f565b9350505050949350505050565b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f6060805f805f606061192a612db4565b611932612dee565b46305f801b5f67ffffffffffffffff81111561195157611950614ac5565b5b60405190808252806020026020018201604052801561197f5781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b5f80611a2984611a237ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d78989896119f48b612638565b604051602001611a08959493929190615f26565b6040516020818303038152906040528051906020012061268b565b856126a4565b905080611a6d57836040517f94ab6c07000000000000000000000000000000000000000000000000000000008152600401611a649190614a7a565b60405180910390fd5b611a8786858760405180602001604052805f815250612619565b915050949350505050565b5f611a9b611ed9565b73ffffffffffffffffffffffffffffffffffffffff166391ddadf46040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611b0257506040513d601f19601f82011682018060405250810190611aff9190615f8b565b60015b611b1557611b0e612e29565b9050611b1a565b809150505b90565b5f6064905090565b5f611b31848484612e38565b90509392505050565b5f611b45600a612ec3565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff16905090565b611b6e611fb0565b611b7781612f25565b50565b5f611b8482612fc2565b9050919050565b5f60045f8381526020019081526020015f206001015f9054906101000a900465ffffffffffff1665ffffffffffff169050919050565b5f611bca612fcc565b905090565b5f3073ffffffffffffffffffffffffffffffffffffffff16611bef610cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611c3c576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63bc197c8160e01b905095945050505050565b5f60045f8381526020019081526020015f205f01601a9054906101000a900463ffffffff1663ffffffff1660045f8481526020019081526020015f205f0160149054906101000a900465ffffffffffff16611caa9190615fb6565b65ffffffffffff169050919050565b611cc1611fb0565b5f808573ffffffffffffffffffffffffffffffffffffffff16858585604051611ceb929190615dc4565b5f6040518083038185875af1925050503d805f8114611d25576040519150601f19603f3d011682016040523d82523d5f602084013e611d2a565b606091505b5091509150611d398282612fd5565b50505050505050565b5f84848484604051602001611d5a94939291906161b3565b604051602081830303815290604052805190602001205f1c9050949350505050565b5f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d781565b611e0d611fb0565b611e1681612ff9565b50565b5f611e2c8383611e276130b2565b612e38565b905092915050565b611e3c611fb0565b611e45816130c8565b50565b5f3073ffffffffffffffffffffffffffffffffffffffff16611e68610cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611eb5576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63f23a6e6160e01b905095945050505050565b5f611ed28261310d565b9050919050565b5f7f0000000000000000000000000000000000000000000000000000000000000000905090565b5f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f600860069054906101000a900463ffffffff1663ffffffff16905090565b611fb86125fb565b73ffffffffffffffffffffffffffffffffffffffff16611fd6610cb7565b73ffffffffffffffffffffffffffffffffffffffff161461203557611ff96125fb565b6040517f47096e4700000000000000000000000000000000000000000000000000000000815260040161202c9190614a7a565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612054610cb7565b73ffffffffffffffffffffffffffffffffffffffff16146120a3575f6120786131b9565b604051612086929190615dc4565b604051809103902090505b8061209c60056131c5565b0361209157505b565b5f6120ae611b1d565b9050808211156120f75781816040517f243e54450000000000000000000000000000000000000000000000000000000081526004016120ee92919061620b565b60405180910390fd5b5f612100611b3a565b905061212761210d611a92565b6121168561331a565b600a6133879092919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997818460405161215a92919061620b565b60405180910390a1505050565b5f81600781111561217b5761217a615006565b5b60ff166001901b5f1b9050919050565b5f806121968461124a565b90505f801b836121a583612167565b16036121ec578381846040517f31b75e4d0000000000000000000000000000000000000000000000000000000081526004016121e393929190616232565b60405180910390fd5b8091505092915050565b5f61220486868686866133a2565b905095945050505050565b5f825f0160109054906101000a90046fffffffffffffffffffffffffffffffff169050825f015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16600182016fffffffffffffffffffffffffffffffff16036122b0576040517f8acb5f2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81836001015f836fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060018101835f0160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550505050565b61233b85858585856135a8565b5050505050565b5f815f015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16825f0160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16149050919050565b5f815f015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505f815f0160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b5f60085f9054906101000a900465ffffffffffff1665ffffffffffff16905090565b5f806124518361365c565b90506005600781111561246757612466615006565b5b81600781111561247a57612479615006565b5b1461248857809150506125f6565b5f600c5f8581526020019081526020015f20549050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016124f79190614fed565b602060405180830381865afa158015612512573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125369190616291565b15612546576005925050506125f6565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b81526004016125a09190614fed565b602060405180830381865afa1580156125bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125df9190616291565b156125ef576007925050506125f6565b6002925050505b919050565b5f33905090565b5f61260f858585856137b3565b9050949350505050565b5f61262e858585856126296130b2565b612731565b9050949350505050565b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050559050919050565b5f61269d61269761388a565b83613940565b9050919050565b5f805f6126b18585613980565b50915091505f60038111156126c9576126c8615006565b5b8160038111156126dc576126db615006565b5b14801561271457508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b8061272657506127258686866139d5565b5b925050509392505050565b5f612745866127406001612167565b61218b565b505f61275a86612754896111e2565b85612e38565b90506127698787878487613af4565b5f8351036127ca578573ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4888784886040516127bd94939291906162bc565b60405180910390a2612821565b8573ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb8712888784888860405161281895949392919061634e565b60405180910390a25b8091505095945050505050565b5f65ffffffffffff801682111561287f576030826040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526004016128769291906163e6565b60405180910390fd5b819050919050565b5f80835f018054905090505f808290506005831115612908575f6128aa84613ce3565b846128b59190615e85565b90506128c3875f0182613dd9565b5f015f9054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1610156128f657809150612906565b600181612903919061640d565b92505b505b5f612917875f01878585613deb565b90505f811461296657612938875f016001836129339190615e85565b613dd9565b5f0160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff16612968565b5f5b94505050505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360085f9054906101000a900465ffffffffffff16826040516129b8929190616440565b60405180910390a18060085f6101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b5f80825190506034811015612a00576001915050612b29565b5f6014820384015190507f2370726f706f7365723d3078000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff19168173ffffffffffffffffffffffffffffffffffffffff191614612a6a57600192505050612b29565b5f80602884612a799190615e85565b90505b83811015612af3575f80612aac888481518110612a9c57612a9b615cb4565b5b602001015160f81c60f81b613e60565b9150915081612ac45760019650505050505050612b29565b8060ff1660048573ffffffffffffffffffffffffffffffffffffffff16901b1793505050806001019050612a7c565b508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161493505050505b92915050565b5f612b438686868680519060200120611d42565b905084518651141580612b5857508351865114155b80612b6357505f8651145b15612bac578551845186516040517f447b05d0000000000000000000000000000000000000000000000000000000008152600401612ba3939291906150d0565b60405180910390fd5b5f60045f8381526020019081526020015f205f0160149054906101000a900465ffffffffffff1665ffffffffffff1614612c2b5780612bea8261124a565b5f801b6040517f31b75e4d000000000000000000000000000000000000000000000000000000008152600401612c2293929190616232565b60405180910390fd5b5f612c3461123c565b612c3c611a92565b65ffffffffffff16612c4e919061640d565b90505f612c59610da6565b90505f60045f8581526020019081526020015f20905084815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612cb98361282e565b815f0160146101000a81548165ffffffffffff021916908365ffffffffffff160217905550612ce782613ef7565b815f01601a6101000a81548163ffffffff021916908363ffffffff1602179055507f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084868b8b8d5167ffffffffffffffff811115612d4857612d47614ac5565b5b604051908082528060200260200182016040528015612d7b57816020015b6060815260200190600190039081612d665790505b508c89898b612d8a919061640d565b8e604051612da09998979695949392919061656a565b60405180910390a150505095945050505050565b6060612de95f7f0000000000000000000000000000000000000000000000000000000000000000613f4e90919063ffffffff16565b905090565b6060612e2460017f0000000000000000000000000000000000000000000000000000000000000000613f4e90919063ffffffff16565b905090565b5f612e334361282e565b905090565b5f612e41611ed9565b73ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b8152600401612e7b929190616618565b602060405180830381865afa158015612e96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eba9190616653565b90509392505050565b5f80825f018054905090505f8114612f1b57612eed835f01600183612ee89190615e85565b613dd9565b5f0160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff16612f1d565b5f5b915050919050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051612f7792919061667e565b60405180910390a180600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60019050919050565b5f600754905090565b606082612fea57612fe582613ffb565b612ff2565b819050612ff3565b5b92915050565b5f8163ffffffff1603613043575f6040517ff1cfbf0500000000000000000000000000000000000000000000000000000000815260040161303a91906166de565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828600860069054906101000a900463ffffffff1682604051613086929190616727565b60405180910390a180600860066101000a81548163ffffffff021916908363ffffffff16021790555050565b606060405180602001604052805f815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461600754826040516130fb92919061620b565b60405180910390a18060078190555050565b5f613116611b1d565b61311f83611673565b613127611ed9565b73ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b815260040161315f919061493d565b602060405180830381865afa15801561317a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061319e9190616653565b6131a8919061674e565b6131b291906167bc565b9050919050565b365f8036915091509091565b5f80825f015f9054906101000a90046fffffffffffffffffffffffffffffffff169050825f0160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff1603613264576040517f75e52f4f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826001015f826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020019081526020015f20549150826001015f826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020019081526020015f205f905560018101835f015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050919050565b5f79ffffffffffffffffffffffffffffffffffffffffffffffffffff801682111561337f5760d0826040517f6dfcc650000000000000000000000000000000000000000000000000000000008152600401613376929190616825565b60405180910390fd5b819050919050565b5f80613396855f01858561403f565b91509150935093915050565b5f80600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa15801561340e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134329190616653565b90505f61343e846143a7565b9050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888885f866040518663ffffffff1660e01b81526004016134a2959493929190616887565b602060405180830381865afa1580156134bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134e19190616901565b600c5f8a81526020019081526020015f2081905550600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb08888885f86886040518763ffffffff1660e01b815260040161355a9695949392919061692c565b5f604051808303815f87803b158015613571575f80fd5b505af1158015613583573d5f803e3d5ffd5b5050505061359b8242613596919061640d565b61282e565b9250505095945050505050565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686865f6135f3886143a7565b6040518763ffffffff1660e01b8152600401613613959493929190616887565b5f604051808303818588803b15801561362a575f80fd5b505af115801561363c573d5f803e3d5ffd5b5050505050600c5f8681526020019081526020015f205f90555050505050565b5f8060045f8481526020019081526020015f2090505f815f01601e9054906101000a900460ff1690505f825f01601f9054906101000a900460ff16905081156136ab57600793505050506137ae565b80156136bd57600293505050506137ae565b5f6136c7866111e2565b90505f810361370d57856040517f6ad06075000000000000000000000000000000000000000000000000000000008152600401613704919061493d565b60405180910390fd5b5f613716611a92565b65ffffffffffff169050808210613734575f955050505050506137ae565b5f61373e88611c4f565b905081811061375657600196505050505050506137ae565b61375f886143c4565b1580613771575061376f88614408565b155b1561378557600396505050505050506137ae565b5f61378f89611b8b565b036137a357600496505050505050506137ae565b600596505050505050505b919050565b5f806137c18686868661442f565b90505f600c5f8381526020019081526020015f205490505f801b811461387d57600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c4d252f5826040518263ffffffff1660e01b815260040161383b9190614fed565b5f604051808303815f87803b158015613852575f80fd5b505af1158015613864573d5f803e3d5ffd5b50505050600c5f8381526020019081526020015f205f90555b8192505050949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561390557507f000000000000000000000000000000000000000000000000000000000000000046145b15613932577f0000000000000000000000000000000000000000000000000000000000000000905061393d565b61393a614511565b90505b90565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f60418451036139c0575f805f602087015192506040870151915060608701515f1a90506139b2888285856145a6565b9550955095505050506139ce565b5f600285515f1b9250925092505b9250925092565b5f805f8573ffffffffffffffffffffffffffffffffffffffff168585604051602401613a029291906169a0565b604051602081830303815290604052631626ba7e60e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051613a5491906169fe565b5f60405180830381855afa9150503d805f8114613a8c576040519150601f19603f3d011682016040523d82523d5f602084013e613a91565b606091505b5091509150818015613aa557506020815110155b8015613ae95750631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681806020019051810190613ae79190616901565b145b925050509392505050565b5f60095f8781526020019081526020015f209050806003015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615613b9657846040517f71c6af49000000000000000000000000000000000000000000000000000000008152600401613b8d9190614a7a565b60405180910390fd5b6001816003015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f6002811115613c0057613bff615006565b5b60ff168460ff1603613c2a5782815f015f828254613c1e919061640d565b92505081905550613cdb565b60016002811115613c3e57613c3d615006565b5b60ff168460ff1603613c695782816001015f828254613c5d919061640d565b92505081905550613cda565b600280811115613c7c57613c7b615006565b5b60ff168460ff1603613ca75782816002015f828254613c9b919061640d565b92505081905550613cd9565b6040517f06b337c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b505050505050565b5f808203613cf3575f9050613dd4565b5f6001613cff8461468d565b901c6001901b90506001818481613d1957613d1861678f565b5b048201901c90506001818481613d3257613d3161678f565b5b048201901c90506001818481613d4b57613d4a61678f565b5b048201901c90506001818481613d6457613d6361678f565b5b048201901c90506001818481613d7d57613d7c61678f565b5b048201901c90506001818481613d9657613d9561678f565b5b048201901c90506001818481613daf57613dae61678f565b5b048201901c9050613dd081828581613dca57613dc961678f565b5b04614764565b9150505b919050565b5f825f528160205f2001905092915050565b5f5b81831015613e55575f613e00848461477c565b90508465ffffffffffff16613e158783613dd9565b5f015f9054906101000a900465ffffffffffff1665ffffffffffff161115613e3f57809250613e4f565b600181613e4c919061640d565b93505b50613ded565b819050949350505050565b5f805f8360f81c90508060ff16602f108015613e7f5750603a8160ff16105b15613e94576001603082039250925050613ef2565b8060ff166040108015613eaa575060478160ff16105b15613ebf576001603782039250925050613ef2565b8060ff166060108015613ed5575060678160ff16105b15613eea576001605782039250925050613ef2565b5f8092509250505b915091565b5f63ffffffff8016821115613f46576020826040517f6dfcc650000000000000000000000000000000000000000000000000000000008152600401613f3d929190616a4d565b60405180910390fd5b819050919050565b606060ff5f1b8314613f6a57613f63836147a1565b9050613ff5565b818054613f7690615c2d565b80601f0160208091040260200160405190810160405280929190818152602001828054613fa290615c2d565b8015613fed5780601f10613fc457610100808354040283529160200191613fed565b820191905f5260205f20905b815481529060010190602001808311613fd057829003601f168201915b505050505090505b92915050565b5f8151111561400d5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f858054905090505f8111156142bf575f614068876001846140639190615e85565b613dd9565b6040518060400160405290815f82015f9054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020015f820160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff168152505090508565ffffffffffff16815f015165ffffffffffff161115614153576040517f2520601d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8565ffffffffffff16815f015165ffffffffffff16036141d557846141848860018561417f9190615e85565b613dd9565b5f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506142ae565b8660405180604001604052808865ffffffffffff1681526020018779ffffffffffffffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a81548165ffffffffffff021916908365ffffffffffff1602179055506020820151815f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80602001518593509350505061439f565b8560405180604001604052808765ffffffffffff1681526020018679ffffffffffffffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a81548165ffffffffffff021916908365ffffffffffff1602179055506020820151815f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505f8492509250505b935093915050565b5f813060601b6bffffffffffffffffffffffff1916189050919050565b5f8060095f8481526020019081526020015f209050806002015481600101546143ed919061640d565b6143fe6143f9856111e2565b611ec8565b1115915050919050565b5f8060095f8481526020019081526020015f209050805f0154816001015411915050919050565b5f8061443d86868686611d42565b90506144a18161444d6007612167565b6144576006612167565b6144616002612167565b60018060078081111561447757614476615006565b5b6144819190616a74565b600261448d9190616bd7565b6144979190615e85565b5f1b18181861218b565b50600160045f8381526020019081526020015f205f01601f6101000a81548160ff0219169083151502179055507f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c816040516144fd919061493d565b60405180910390a180915050949350505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000463060405160200161458b959493929190616c21565b60405160208183030381529060405280519060200120905090565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c11156145e2575f600385925092509250614683565b5f6001888888886040515f81526020016040526040516146059493929190616c72565b6020604051602081039080840390855afa158015614625573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603614676575f60015f801b93509350935050614683565b805f805f1b935093509350505b9450945094915050565b5f805f90505f608084901c11156146ac57608083901c92506080810190505b5f604084901c11156146c657604083901c92506040810190505b5f602084901c11156146e057602083901c92506020810190505b5f601084901c11156146fa57601083901c92506010810190505b5f600884901c111561471457600883901c92506008810190505b5f600484901c111561472e57600483901c92506004810190505b5f600284901c111561474857600283901c92506002810190505b5f600184901c111561475b576001810190505b80915050919050565b5f8183106147725781614774565b825b905092915050565b5f600282841861478c91906167bc565b828416614799919061640d565b905092915050565b60605f6147ad83614813565b90505f602067ffffffffffffffff8111156147cb576147ca614ac5565b5b6040519080825280601f01601f1916602001820160405280156147fd5781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b5f8060ff835f1c169050601f811115614858576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6148a681614872565b81146148b0575f80fd5b50565b5f813590506148c18161489d565b92915050565b5f602082840312156148dc576148db61486a565b5b5f6148e9848285016148b3565b91505092915050565b5f8115159050919050565b614906816148f2565b82525050565b5f60208201905061491f5f8301846148fd565b92915050565b5f819050919050565b61493781614925565b82525050565b5f6020820190506149505f83018461492e565b92915050565b61495f81614925565b8114614969575f80fd5b50565b5f8135905061497a81614956565b92915050565b5f602082840312156149955761499461486a565b5b5f6149a28482850161496c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6149ed826149ab565b6149f781856149b5565b9350614a078185602086016149c5565b614a10816149d3565b840191505092915050565b5f6020820190508181035f830152614a3381846149e3565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614a6482614a3b565b9050919050565b614a7481614a5a565b82525050565b5f602082019050614a8d5f830184614a6b565b92915050565b614a9c81614a5a565b8114614aa6575f80fd5b50565b5f81359050614ab781614a93565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b614afb826149d3565b810181811067ffffffffffffffff82111715614b1a57614b19614ac5565b5b80604052505050565b5f614b2c614861565b9050614b388282614af2565b919050565b5f67ffffffffffffffff821115614b5757614b56614ac5565b5b614b60826149d3565b9050602081019050919050565b828183375f83830152505050565b5f614b8d614b8884614b3d565b614b23565b905082815260208101848484011115614ba957614ba8614ac1565b5b614bb4848285614b6d565b509392505050565b5f82601f830112614bd057614bcf614abd565b5b8135614be0848260208601614b7b565b91505092915050565b5f805f8060808587031215614c0157614c0061486a565b5b5f614c0e87828801614aa9565b9450506020614c1f87828801614aa9565b9350506040614c308782880161496c565b925050606085013567ffffffffffffffff811115614c5157614c5061486e565b5b614c5d87828801614bbc565b91505092959194509250565b614c7281614872565b82525050565b5f602082019050614c8b5f830184614c69565b92915050565b5f67ffffffffffffffff821115614cab57614caa614ac5565b5b602082029050602081019050919050565b5f80fd5b5f614cd2614ccd84614c91565b614b23565b90508083825260208201905060208402830185811115614cf557614cf4614cbc565b5b835b81811015614d1e5780614d0a8882614aa9565b845260208401935050602081019050614cf7565b5050509392505050565b5f82601f830112614d3c57614d3b614abd565b5b8135614d4c848260208601614cc0565b91505092915050565b5f67ffffffffffffffff821115614d6f57614d6e614ac5565b5b602082029050602081019050919050565b5f614d92614d8d84614d55565b614b23565b90508083825260208201905060208402830185811115614db557614db4614cbc565b5b835b81811015614dde5780614dca888261496c565b845260208401935050602081019050614db7565b5050509392505050565b5f82601f830112614dfc57614dfb614abd565b5b8135614e0c848260208601614d80565b91505092915050565b5f67ffffffffffffffff821115614e2f57614e2e614ac5565b5b602082029050602081019050919050565b5f614e52614e4d84614e15565b614b23565b90508083825260208201905060208402830185811115614e7557614e74614cbc565b5b835b81811015614ebc57803567ffffffffffffffff811115614e9a57614e99614abd565b5b808601614ea78982614bbc565b85526020850194505050602081019050614e77565b5050509392505050565b5f82601f830112614eda57614ed9614abd565b5b8135614eea848260208601614e40565b91505092915050565b5f819050919050565b614f0581614ef3565b8114614f0f575f80fd5b50565b5f81359050614f2081614efc565b92915050565b5f805f8060808587031215614f3e57614f3d61486a565b5b5f85013567ffffffffffffffff811115614f5b57614f5a61486e565b5b614f6787828801614d28565b945050602085013567ffffffffffffffff811115614f8857614f8761486e565b5b614f9487828801614de8565b935050604085013567ffffffffffffffff811115614fb557614fb461486e565b5b614fc187828801614ec6565b9250506060614fd287828801614f12565b91505092959194509250565b614fe781614ef3565b82525050565b5f6020820190506150005f830184614fde565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6008811061504457615043615006565b5b50565b5f81905061505482615033565b919050565b5f61506382615047565b9050919050565b61507381615059565b82525050565b5f60208201905061508c5f83018461506a565b92915050565b5f80604083850312156150a8576150a761486a565b5b5f6150b58582860161496c565b92505060206150c685828601614aa9565b9150509250929050565b5f6060820190506150e35f83018661492e565b6150f0602083018561492e565b6150fd604083018461492e565b949350505050565b5f60ff82169050919050565b61511a81615105565b8114615124575f80fd5b50565b5f8135905061513581615111565b92915050565b5f80604083850312156151515761515061486a565b5b5f61515e8582860161496c565b925050602061516f85828601615127565b9150509250929050565b5f80fd5b5f8083601f84011261519257615191614abd565b5b8235905067ffffffffffffffff8111156151af576151ae615179565b5b6020830191508360018202830111156151cb576151ca614cbc565b5b9250929050565b5f805f805f805f60c0888a0312156151ed576151ec61486a565b5b5f6151fa8a828b0161496c565b975050602061520b8a828b01615127565b965050604061521c8a828b01614aa9565b955050606088013567ffffffffffffffff81111561523d5761523c61486e565b5b6152498a828b0161517d565b9450945050608088013567ffffffffffffffff81111561526c5761526b61486e565b5b6152788a828b01614bbc565b92505060a088013567ffffffffffffffff8111156152995761529861486e565b5b6152a58a828b01614bbc565b91505092959891949750929550565b5f805f805f608086880312156152cd576152cc61486a565b5b5f6152da8882890161496c565b95505060206152eb88828901615127565b945050604086013567ffffffffffffffff81111561530c5761530b61486e565b5b6153188882890161517d565b9350935050606086013567ffffffffffffffff81111561533b5761533a61486e565b5b61534788828901614bbc565b9150509295509295909350565b5f65ffffffffffff82169050919050565b61536e81615354565b8114615378575f80fd5b50565b5f8135905061538981615365565b92915050565b5f602082840312156153a4576153a361486a565b5b5f6153b18482850161537b565b91505092915050565b5f805f80606085870312156153d2576153d161486a565b5b5f6153df8782880161496c565b94505060206153f087828801615127565b935050604085013567ffffffffffffffff8111156154115761541061486e565b5b61541d8782880161517d565b925092505092959194509250565b5f67ffffffffffffffff82111561544557615444614ac5565b5b61544e826149d3565b9050602081019050919050565b5f61546d6154688461542b565b614b23565b90508281526020810184848401111561548957615488614ac1565b5b615494848285614b6d565b509392505050565b5f82601f8301126154b0576154af614abd565b5b81356154c084826020860161545b565b91505092915050565b5f805f80608085870312156154e1576154e061486a565b5b5f85013567ffffffffffffffff8111156154fe576154fd61486e565b5b61550a87828801614d28565b945050602085013567ffffffffffffffff81111561552b5761552a61486e565b5b61553787828801614de8565b935050604085013567ffffffffffffffff8111156155585761555761486e565b5b61556487828801614ec6565b925050606085013567ffffffffffffffff8111156155855761558461486e565b5b6155918782880161549c565b91505092959194509250565b5f602082840312156155b2576155b161486a565b5b5f6155bf84828501614aa9565b91505092915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6155fc816155c8565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61563481614925565b82525050565b5f615645838361562b565b60208301905092915050565b5f602082019050919050565b5f61566782615602565b615671818561560c565b935061567c8361561c565b805f5b838110156156ac578151615693888261563a565b975061569e83615651565b92505060018101905061567f565b5085935050505092915050565b5f60e0820190506156cc5f83018a6155f3565b81810360208301526156de81896149e3565b905081810360408301526156f281886149e3565b9050615701606083018761492e565b61570e6080830186614a6b565b61571b60a0830185614fde565b81810360c083015261572d818461565d565b905098975050505050505050565b5f805f80608085870312156157535761575261486a565b5b5f6157608782880161496c565b945050602061577187828801615127565b935050604061578287828801614aa9565b925050606085013567ffffffffffffffff8111156157a3576157a261486e565b5b6157af87828801614bbc565b91505092959194509250565b6157c481615354565b82525050565b5f6020820190506157dd5f8301846157bb565b92915050565b5f805f606084860312156157fa576157f961486a565b5b5f61580786828701614aa9565b93505060206158188682870161496c565b925050604084013567ffffffffffffffff8111156158395761583861486e565b5b61584586828701614bbc565b9150509250925092565b5f61585982614a3b565b9050919050565b5f61586a8261584f565b9050919050565b61587a81615860565b8114615884575f80fd5b50565b5f8135905061589581615871565b92915050565b5f602082840312156158b0576158af61486a565b5b5f6158bd84828501615887565b91505092915050565b5f805f805f60a086880312156158df576158de61486a565b5b5f6158ec88828901614aa9565b95505060206158fd88828901614aa9565b945050604086013567ffffffffffffffff81111561591e5761591d61486e565b5b61592a88828901614de8565b935050606086013567ffffffffffffffff81111561594b5761594a61486e565b5b61595788828901614de8565b925050608086013567ffffffffffffffff8111156159785761597761486e565b5b61598488828901614bbc565b9150509295509295909350565b5f8083601f8401126159a6576159a5614abd565b5b8235905067ffffffffffffffff8111156159c3576159c2615179565b5b6020830191508360018202830111156159df576159de614cbc565b5b9250929050565b5f805f80606085870312156159fe576159fd61486a565b5b5f615a0b87828801614aa9565b9450506020615a1c8782880161496c565b935050604085013567ffffffffffffffff811115615a3d57615a3c61486e565b5b615a4987828801615991565b925092505092959194509250565b5f63ffffffff82169050919050565b615a6f81615a57565b8114615a79575f80fd5b50565b5f81359050615a8a81615a66565b92915050565b5f60208284031215615aa557615aa461486a565b5b5f615ab284828501615a7c565b91505092915050565b5f8060408385031215615ad157615ad061486a565b5b5f615ade85828601614aa9565b9250506020615aef8582860161496c565b9150509250929050565b5f805f805f60a08688031215615b1257615b1161486a565b5b5f615b1f88828901614aa9565b9550506020615b3088828901614aa9565b9450506040615b418882890161496c565b9350506060615b528882890161496c565b925050608086013567ffffffffffffffff811115615b7357615b7261486e565b5b615b7f88828901614bbc565b9150509295509295909350565b5f819050919050565b5f615baf615baa615ba584614a3b565b615b8c565b614a3b565b9050919050565b5f615bc082615b95565b9050919050565b5f615bd182615bb6565b9050919050565b615be181615bc7565b82525050565b5f602082019050615bfa5f830184615bd8565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680615c4457607f821691505b602082108103615c5757615c56615c00565b5b50919050565b5f615c77615c72615c6d84615354565b615b8c565b614925565b9050919050565b615c8781615c5d565b82525050565b5f604082019050615ca05f83018561492e565b615cad6020830184615c7e565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f615cf3615cee8461542b565b614b23565b905082815260208101848484011115615d0f57615d0e614ac1565b5b615d1a8482856149c5565b509392505050565b5f82601f830112615d3657615d35614abd565b5b8151615d46848260208601615ce1565b91505092915050565b5f60208284031215615d6457615d6361486a565b5b5f82015167ffffffffffffffff811115615d8157615d8061486e565b5b615d8d84828501615d22565b91505092915050565b5f81905092915050565b5f615dab8385615d96565b9350615db8838584614b6d565b82840190509392505050565b5f615dd0828486615da0565b91508190509392505050565b615de581615105565b82525050565b5f60e082019050615dfe5f83018a614fde565b615e0b602083018961492e565b615e186040830188615ddc565b615e256060830187614a6b565b615e32608083018661492e565b615e3f60a0830185614fde565b615e4c60c0830184614fde565b98975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f615e8f82614925565b9150615e9a83614925565b9250828203905081811115615eb257615eb1615e58565b5b92915050565b5f615ec282615354565b9150615ecd83615354565b9250828203905065ffffffffffff811115615eeb57615eea615e58565b5b92915050565b5f606082019050615f045f830186614a6b565b615f11602083018561492e565b615f1e604083018461492e565b949350505050565b5f60a082019050615f395f830188614fde565b615f46602083018761492e565b615f536040830186615ddc565b615f606060830185614a6b565b615f6d608083018461492e565b9695505050505050565b5f81519050615f8581615365565b92915050565b5f60208284031215615fa057615f9f61486a565b5b5f615fad84828501615f77565b91505092915050565b5f615fc082615354565b9150615fcb83615354565b9250828201905065ffffffffffff811115615fe957615fe8615e58565b5b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61602181614a5a565b82525050565b5f6160328383616018565b60208301905092915050565b5f602082019050919050565b5f61605482615fef565b61605e8185615ff9565b935061606983616009565b805f5b838110156160995781516160808882616027565b975061608b8361603e565b92505060018101905061606c565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6160f3826160cf565b6160fd81856160d9565b935061610d8185602086016149c5565b616116816149d3565b840191505092915050565b5f61612c83836160e9565b905092915050565b5f602082019050919050565b5f61614a826160a6565b61615481856160b0565b935083602082028501616166856160c0565b805f5b858110156161a157848403895281516161828582616121565b945061618d83616134565b925060208a01995050600181019050616169565b50829750879550505050505092915050565b5f6080820190508181035f8301526161cb818761604a565b905081810360208301526161df818661565d565b905081810360408301526161f38185616140565b90506162026060830184614fde565b95945050505050565b5f60408201905061621e5f83018561492e565b61622b602083018461492e565b9392505050565b5f6060820190506162455f83018661492e565b616252602083018561506a565b61625f6040830184614fde565b949350505050565b616270816148f2565b811461627a575f80fd5b50565b5f8151905061628b81616267565b92915050565b5f602082840312156162a6576162a561486a565b5b5f6162b38482850161627d565b91505092915050565b5f6080820190506162cf5f83018761492e565b6162dc6020830186615ddc565b6162e9604083018561492e565b81810360608301526162fb81846149e3565b905095945050505050565b5f82825260208201905092915050565b5f616320826160cf565b61632a8185616306565b935061633a8185602086016149c5565b616343816149d3565b840191505092915050565b5f60a0820190506163615f83018861492e565b61636e6020830187615ddc565b61637b604083018661492e565b818103606083015261638d81856149e3565b905081810360808301526163a18184616316565b90509695505050505050565b5f819050919050565b5f6163d06163cb6163c6846163ad565b615b8c565b615105565b9050919050565b6163e0816163b6565b82525050565b5f6040820190506163f95f8301856163d7565b616406602083018461492e565b9392505050565b5f61641782614925565b915061642283614925565b925082820190508082111561643a57616439615e58565b5b92915050565b5f6040820190506164535f830185615c7e565b6164606020830184615c7e565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f82825260208201905092915050565b5f6164aa826149ab565b6164b48185616490565b93506164c48185602086016149c5565b6164cd816149d3565b840191505092915050565b5f6164e383836164a0565b905092915050565b5f602082019050919050565b5f61650182616467565b61650b8185616471565b93508360208202850161651d85616481565b805f5b85811015616558578484038952815161653985826164d8565b9450616544836164eb565b925060208a01995050600181019050616520565b50829750879550505050505092915050565b5f6101208201905061657e5f83018c61492e565b61658b602083018b614a6b565b818103604083015261659d818a61604a565b905081810360608301526165b1818961565d565b905081810360808301526165c581886164f7565b905081810360a08301526165d98187616140565b90506165e860c083018661492e565b6165f560e083018561492e565b81810361010083015261660881846149e3565b90509a9950505050505050505050565b5f60408201905061662b5f830185614a6b565b616638602083018461492e565b9392505050565b5f8151905061664d81614956565b92915050565b5f602082840312156166685761666761486a565b5b5f6166758482850161663f565b91505092915050565b5f6040820190506166915f830185614a6b565b61669e6020830184614a6b565b9392505050565b5f819050919050565b5f6166c86166c36166be846166a5565b615b8c565b614925565b9050919050565b6166d8816166ae565b82525050565b5f6020820190506166f15f8301846166cf565b92915050565b5f61671161670c61670784615a57565b615b8c565b614925565b9050919050565b616721816166f7565b82525050565b5f60408201905061673a5f830185616718565b6167476020830184616718565b9392505050565b5f61675882614925565b915061676383614925565b925082820261677181614925565b9150828204841483151761678857616787615e58565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6167c682614925565b91506167d183614925565b9250826167e1576167e061678f565b5b828204905092915050565b5f819050919050565b5f61680f61680a616805846167ec565b615b8c565b615105565b9050919050565b61681f816167f5565b82525050565b5f6040820190506168385f830185616816565b616845602083018461492e565b9392505050565b5f815f1b9050919050565b5f61687161686c616867846166a5565b61684c565b614ef3565b9050919050565b61688181616857565b82525050565b5f60a0820190508181035f83015261689f818861604a565b905081810360208301526168b3818761565d565b905081810360408301526168c78186616140565b90506168d66060830185616878565b6168e36080830184614fde565b9695505050505050565b5f815190506168fb81614efc565b92915050565b5f602082840312156169165761691561486a565b5b5f616923848285016168ed565b91505092915050565b5f60c0820190508181035f830152616944818961604a565b90508181036020830152616958818861565d565b9050818103604083015261696c8187616140565b905061697b6060830186616878565b6169886080830185614fde565b61699560a083018461492e565b979650505050505050565b5f6040820190506169b35f830185614fde565b81810360208301526169c58184616316565b90509392505050565b5f6169d8826160cf565b6169e28185615d96565b93506169f28185602086016149c5565b80840191505092915050565b5f616a0982846169ce565b915081905092915050565b5f819050919050565b5f616a37616a32616a2d84616a14565b615b8c565b615105565b9050919050565b616a4781616a1d565b82525050565b5f604082019050616a605f830185616a3e565b616a6d602083018461492e565b9392505050565b5f616a7e82615105565b9150616a8983615105565b9250828201905060ff811115616aa257616aa1615e58565b5b92915050565b5f8160011c9050919050565b5f808291508390505b6001851115616afd57808604811115616ad957616ad8615e58565b5b6001851615616ae85780820291505b8081029050616af685616aa8565b9450616abd565b94509492505050565b5f82616b155760019050616bd0565b81616b22575f9050616bd0565b8160018114616b385760028114616b4257616b71565b6001915050616bd0565b60ff841115616b5457616b53615e58565b5b8360020a915084821115616b6b57616b6a615e58565b5b50616bd0565b5060208310610133831016604e8410600b8410161715616ba65782820a905083811115616ba157616ba0615e58565b5b616bd0565b616bb38484846001616ab4565b92509050818404811115616bca57616bc9615e58565b5b81810290505b9392505050565b5f616be182614925565b9150616bec83615105565b9250616c197fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484616b06565b905092915050565b5f60a082019050616c345f830188614fde565b616c416020830187614fde565b616c4e6040830186614fde565b616c5b606083018561492e565b616c686080830184614a6b565b9695505050505050565b5f608082019050616c855f830187614fde565b616c926020830186615ddc565b616c9f6040830185614fde565b616cac6060830184614fde565b9594505050505056fea264697066735822122026365c024e462ebeb7f76526307aa5fbc02335be98d5268e2625e95acfaaa48b64736f6c634300081a0033" - }, - "settings": { - "compilationTarget": { - "contracts/Dao.sol": "HomebaseDAO" - }, - "evmVersion": "shanghai", - "libraries": {}, - "metadata": { - "bytecodeHash": "ipfs" - }, - "optimizer": { - "enabled": true, - "runs": 200 - }, - "remappings": [] - }, - "sources": { - "@openzeppelin/contracts/access/AccessControl.sol": { - "keccak256": "0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308", - "license": "MIT", - "urls": [ - "bzz-raw://46326c0bb1e296b67185e81c918e0b40501b8b6386165855df0a3f3c634b6a80", - "dweb:/ipfs/QmTwyrDYtsxsk6pymJTK94PnEpzsmkpUxFuzEiakDopy4Z" - ] - }, - "@openzeppelin/contracts/access/IAccessControl.sol": { - "keccak256": "0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41", - "license": "MIT", - "urls": [ - "bzz-raw://1fd2f35495652e57e3f99bc6c510bc5f7dd398a176ea2e72d8ed730aebc6ca26", - "dweb:/ipfs/QmTQV6X4gkikTib49cho5iDX3JvSQbdsoEChoDwrk3CbbH" - ] - }, - "@openzeppelin/contracts/governance/Governor.sol": { - "keccak256": "0x9a6dc5abbb0b6415e343956d2a5f1a89251d5b4937ebcc4f0ffa17fec35a2149", - "license": "MIT", - "urls": [ - "bzz-raw://8e3ceb0f102494cb4547b2c460f81d8f23239db10e1ff3f97770adeb9d17d6e1", - "dweb:/ipfs/QmZ1xxtnTNFZ8M9vrvScY1YQAGAFMVGgsDoeWibS7sRzxD" - ] - }, - "@openzeppelin/contracts/governance/IGovernor.sol": { - "keccak256": "0x0a6c99ff573c20b62b8c568282517664e6d55000d4302aad10c668c97c0d2e0e", - "license": "MIT", - "urls": [ - "bzz-raw://66f355c55b1a366f831f7f912e1dffb16c15a4637d03f0c22cf335a5613856b6", - "dweb:/ipfs/QmPJMYLeuJsSHnBumMgxdtitNMagxexkP7UwCJq5ygxvQQ" - ] - }, - "@openzeppelin/contracts/governance/TimelockController.sol": { - "keccak256": "0x50ea4919331ca84a89c44be1e1fdecd597c7f5575c3d93f582197db97171c2c9", - "license": "MIT", - "urls": [ - "bzz-raw://a80401f75260f9f42440c05baee0d2ff7cdd1e1e451400000eabb9c901abe383", - "dweb:/ipfs/QmVdWjwkxmWrxcmz6ffmC8nCLwj5ixKrgWF7mKERdkZSfR" - ] - }, - "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { - "keccak256": "0x5c9ef54955aadafa3bac0ee7c40b2f1a164b4f3c2a72e1cb52043f664a85c15c", - "license": "MIT", - "urls": [ - "bzz-raw://2e016de12aa6a756541c7a7bf39a72d27dc112b251806d03efd24f86ff13732f", - "dweb:/ipfs/QmX8aoCruyuvMDH9r6uTCg4qTdqhbdFMdM5Z8Lxrtae8oT" - ] - }, - "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol": { - "keccak256": "0x1e0810708b8f5de8d3db73240ccee2d36a305cb904aa5acd4588834ebce6acce", - "license": "MIT", - "urls": [ - "bzz-raw://9758197a4d3cb1aa3036a9bd0edbf34a2eba82e484d3d519da495e495d752dee", - "dweb:/ipfs/QmYtV61Sp55bfcW4DZvsRuDo2EKb5PekqoY3nx5STJn6Zt" - ] - }, - "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol": { - "keccak256": "0x14e3ca2567cb0fc75ee2415931a495e4eb9b2a9edd261d3ebd9dd6c0df775711", - "license": "MIT", - "urls": [ - "bzz-raw://7dc5a48cb3df6a0f40f4fb1e1b61f4252924019448a948b2a2716e66b39dd1a6", - "dweb:/ipfs/QmdcYiYhQwFYGDC1w8ypo6gEgpkJ8NpKtixofQqUpYZZ9b" - ] - }, - "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol": { - "keccak256": "0x3ac80e86633701fd0675df10770877da0cab60fb041553ddbc78c431e4a7c3cc", - "license": "MIT", - "urls": [ - "bzz-raw://28acdbbe336d814144cacf1be1f2423252b494baa25d9c7cc6390a4b6348d1f2", - "dweb:/ipfs/QmXvrHzPXV8UWwp1crzDpfPLvdyfj9PKoF5acP6utkhmFs" - ] - }, - "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { - "keccak256": "0x5b5cdb361ed018c0162942d673c17e187c1a52ded2ce4f41e8a3f3f5d1656e00", - "license": "MIT", - "urls": [ - "bzz-raw://fd78b11b946d9001725a38844f1d6163906965ec321e1b09bd7e476baedc5d12", - "dweb:/ipfs/QmPgTnTYDbgXgwHXbkxofSH51QDFfycwx1tn8Qj5hGGk5u" - ] - }, - "@openzeppelin/contracts/governance/utils/IVotes.sol": { - "keccak256": "0x5e2b397ae88fd5c68e4f6762eb9f65f65c36702eb57796495f471d024ce70947", - "license": "MIT", - "urls": [ - "bzz-raw://348fc8e291d54314bb22437b532f443d5dbfb80c8cc9591567c1af6554ccf856", - "dweb:/ipfs/QmP8ZTyitZinxcpwAHeYHhwj7u21zPpKXSiww38V74sXC2" - ] - }, - "@openzeppelin/contracts/interfaces/IERC1271.sol": { - "keccak256": "0x85a45f3f10014a0f8be41157a32b6a5f905753ea64a4b64e29fc12b7deeecf39", - "license": "MIT", - "urls": [ - "bzz-raw://c3c74009ce36136b36c77c23935b8e4a7b4f253be2da2be4fb4a916b1ce43743", - "dweb:/ipfs/QmcH36v3iN7SJJuF73AunLR2LtNxhVJ1wm63ph4dPZ4pcL" - ] - }, - "@openzeppelin/contracts/interfaces/IERC165.sol": { - "keccak256": "0xde7e9fd9aee8d4f40772f96bb3b58836cbc6dfc0227014a061947f8821ea9724", - "license": "MIT", - "urls": [ - "bzz-raw://11fea9f8bc98949ac6709f0c1699db7430d2948137aa94d5a9e95a91f61a710a", - "dweb:/ipfs/QmQdfRXxQjwP6yn3DVo1GHPpriKNcFghSPi94Z1oKEFUNS" - ] - }, - "@openzeppelin/contracts/interfaces/IERC5267.sol": { - "keccak256": "0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92", - "license": "MIT", - "urls": [ - "bzz-raw://c5c0f29195ad64cbe556da8e257dac8f05f78c53f90323c0d2accf8e6922d33a", - "dweb:/ipfs/QmQ61TED8uaCZwcbh8KkgRSsCav7x7HbcGHwHts3U4DmUP" - ] - }, - "@openzeppelin/contracts/interfaces/IERC5805.sol": { - "keccak256": "0x4b9b89f91adbb7d3574f85394754cfb08c5b4eafca8a7061e2094a019ab8f818", - "license": "MIT", - "urls": [ - "bzz-raw://7373d5dbb8eb2381aa0883a456fac89283fcaf52f42fa805d4188f270716742a", - "dweb:/ipfs/QmVnZDmT4ABvNhRJMaQnbCzsCA8HpyHPVaxi4fCi92LFv2" - ] - }, - "@openzeppelin/contracts/interfaces/IERC6372.sol": { - "keccak256": "0xeb2857b7dafb7e0d8526dbfe794e6c047df2851c9e6ee91dc4a55f3c34af5d33", - "license": "MIT", - "urls": [ - "bzz-raw://49bf13f6c2a38a9bcc7b852d4e2b9cebb4068b832642cce61069cdb5f06bb2fb", - "dweb:/ipfs/QmdKAJVE7rR2kENCZnEM1yKswrGii7WuE9gZpsQvnXJhwn" - ] - }, - "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol": { - "keccak256": "0xb69597a63b202e28401128bed6a6d259e8730191274471af7303eafb247881a3", - "license": "MIT", - "urls": [ - "bzz-raw://25addbda49a578b3318130585601344c5149a5549d749adf88e9685349a46b23", - "dweb:/ipfs/Qme2DuD8gpsve1ZvaSMQpBwMdpU7yAtekDwr7gUp8dX4zX" - ] - }, - "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol": { - "keccak256": "0xc26cd2e2bcf59b87c986fc653545b35010db9c585a3f3312fe61d7b1b3805735", - "license": "MIT", - "urls": [ - "bzz-raw://46fe54b0ac3ee60bdff012fae7d13c1171dff433aa4fdd356fd06ce46fbe711b", - "dweb:/ipfs/QmTTm6jBY6jQ6fx1cnCT4YepEV2aQvqLme5TSxuidfpf2q" - ] - }, - "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { - "keccak256": "0x7f7a26306c79a65fb8b3b6c757cd74660c532cd8a02e165488e30027dd34ca49", - "license": "MIT", - "urls": [ - "bzz-raw://d01e0b2b837ee2f628545e54d8715b49c7ef2befd08356c2e7f6c50dde8a1c22", - "dweb:/ipfs/QmWBAn6y2D1xgftci97Z3qR9tQnkvwQpYwFwkTvDMvqU4i" - ] - }, - "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol": { - "keccak256": "0xaad20f8713b5cd98114278482d5d91b9758f9727048527d582e8e88fd4901fd8", - "license": "MIT", - "urls": [ - "bzz-raw://5396e8dbb000c2fada59b7d2093b9c7c870fd09413ab0fdaba45d882959c6244", - "dweb:/ipfs/QmXQn5XckSiUsUBpMYuiFeqnojRX4rKa9jmgjCPeTuPmhh" - ] - }, - "@openzeppelin/contracts/utils/Address.sol": { - "keccak256": "0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721", - "license": "MIT", - "urls": [ - "bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245", - "dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y" - ] - }, - "@openzeppelin/contracts/utils/Context.sol": { - "keccak256": "0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2", - "license": "MIT", - "urls": [ - "bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12", - "dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF" - ] - }, - "@openzeppelin/contracts/utils/Nonces.sol": { - "keccak256": "0x0082767004fca261c332e9ad100868327a863a88ef724e844857128845ab350f", - "license": "MIT", - "urls": [ - "bzz-raw://132dce9686a54e025eb5ba5d2e48208f847a1ec3e60a3e527766d7bf53fb7f9e", - "dweb:/ipfs/QmXn1a2nUZMpu2z6S88UoTfMVtY2YNh86iGrzJDYmMkKeZ" - ] - }, - "@openzeppelin/contracts/utils/ShortStrings.sol": { - "keccak256": "0x18a7171df639a934592915a520ecb97c5bbc9675a1105607aac8a94e72bf62c6", - "license": "MIT", - "urls": [ - "bzz-raw://7478e1f13da69a2867ccd883001d836b75620362e743f196376d63ed0c422a1c", - "dweb:/ipfs/QmWywcQ9TNfwtoqAxbn25d8C5VrV12PrPS9UjtGe6pL2BA" - ] - }, - "@openzeppelin/contracts/utils/StorageSlot.sol": { - "keccak256": "0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418", - "license": "MIT", - "urls": [ - "bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c", - "dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR" - ] - }, - "@openzeppelin/contracts/utils/Strings.sol": { - "keccak256": "0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792", - "license": "MIT", - "urls": [ - "bzz-raw://6e52e0a7765c943ef14e5bcf11e46e6139fa044be564881378349236bf2e3453", - "dweb:/ipfs/QmZEeeXoFPW47amyP35gfzomF9DixqqTEPwzBakv6cZw6i" - ] - }, - "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { - "keccak256": "0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf", - "license": "MIT", - "urls": [ - "bzz-raw://ba80ba06c8e6be852847e4c5f4492cef801feb6558ae09ed705ff2e04ea8b13c", - "dweb:/ipfs/QmXRJDv3xHLVQCVXg1ZvR35QS9sij5y9NDWYzMfUfAdTHF" - ] - }, - "@openzeppelin/contracts/utils/cryptography/EIP712.sol": { - "keccak256": "0x999f705a027ed6dc2d4e0df2cc4a509852c6bfd11de1c8161bf88832d0503fd0", - "license": "MIT", - "urls": [ - "bzz-raw://0798def67258d9a3cc20b2b4da7ebf351a5cefe0abfdd665d2d81f8e32f89b21", - "dweb:/ipfs/QmPEvJosnPfzHNjKvCv2D3891mA2Ww8eUwkqrxBjuYdHCt" - ] - }, - "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol": { - "keccak256": "0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435", - "license": "MIT", - "urls": [ - "bzz-raw://2ceacff44c0fdc81e48e0e0b1db87a2076d3c1fb497341de077bf1da9f6b406c", - "dweb:/ipfs/QmRUo1muMRAewxrKQ7TkXUtknyRoR57AyEkoPpiuZQ8FzX" - ] - }, - "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol": { - "keccak256": "0x6b11eb41a228cca35d4b662b4df69fcd75192851365102690f57b2ac01e83fe6", - "license": "MIT", - "urls": [ - "bzz-raw://ab006a2983ed350d2af21ddcdd835dcae3b8340086cc4d088460da5abd041f69", - "dweb:/ipfs/QmbEacDhkJZiGrgzLjB4pNtE8Z1uudjDw1DvcDUTVQFsLG" - ] - }, - "@openzeppelin/contracts/utils/introspection/ERC165.sol": { - "keccak256": "0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133", - "license": "MIT", - "urls": [ - "bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8", - "dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA" - ] - }, - "@openzeppelin/contracts/utils/introspection/IERC165.sol": { - "keccak256": "0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b", - "license": "MIT", - "urls": [ - "bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df", - "dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL" - ] - }, - "@openzeppelin/contracts/utils/math/Math.sol": { - "keccak256": "0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d", - "license": "MIT", - "urls": [ - "bzz-raw://4ece9f0b9c8daca08c76b6b5405a6446b6f73b3a15fab7ff56e296cbd4a2c875", - "dweb:/ipfs/QmQyRpyPRL5SQuAgj6SHmbir3foX65FJjbVTTQrA2EFg6L" - ] - }, - "@openzeppelin/contracts/utils/math/SafeCast.sol": { - "keccak256": "0xe19a4d5f31d2861e7344e8e535e2feafb913d806d3e2b5fe7782741a2a7094fe", - "license": "MIT", - "urls": [ - "bzz-raw://4aed79c0fa6f0546ed02f2f683e8f77f0fd2ed7eb34d8bbf3d373c9a6d95b13c", - "dweb:/ipfs/QmWqVz6UAVqmnWU5pqYPt1o6iDEZyPaBraAA3rKfTTSfYj" - ] - }, - "@openzeppelin/contracts/utils/math/SignedMath.sol": { - "keccak256": "0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72", - "license": "MIT", - "urls": [ - "bzz-raw://7d533a1c97cd43a57cd9c465f7ee8dd0e39ae93a8fb8ff8e5303a356b081cdcc", - "dweb:/ipfs/QmVBEei6aTnvYNZp2CHYVNKyZS4q1KkjANfY39WVXZXVoT" - ] - }, - "@openzeppelin/contracts/utils/structs/Checkpoints.sol": { - "keccak256": "0xbdc5e074d7dd6678f67e92b1a51a20226801a407b0e1af3da367c5d1ff4519ad", - "license": "MIT", - "urls": [ - "bzz-raw://a36cca6b22fff3db16fc789ff6c60eea71d4b156065d4d0c83a0bc5e91a77a8b", - "dweb:/ipfs/QmYN3exd5AemxjBrN8XMB1p5LbbE16uC3sjbYjwi8AjcGR" - ] - }, - "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol": { - "keccak256": "0xed6b702230a66640a0f1dd96106dd697e821b6b0fbb2eeab1c09d88d7c411a67", - "license": "MIT", - "urls": [ - "bzz-raw://766996a7c9fb936ae08fc451c6bf6c3a9b49aca26002fb76c7fd1833fca459d8", - "dweb:/ipfs/QmaFKhhPJCNxESLDoio7aR2KSvi4Y8YKirrb9tu4LM1vDp" - ] - }, - "@openzeppelin/contracts/utils/types/Time.sol": { - "keccak256": "0xc7755af115020049e4140f224f9ee88d7e1799ffb0646f37bf0df24bf6213f58", - "license": "MIT", - "urls": [ - "bzz-raw://7f09bf94d5274334ec021f61a04659db303f31e60460e14b709c9bf187740111", - "dweb:/ipfs/QmNvgomZYUwFAt4cZbPWAiTeSZQreGehY9BK5xyVJsUttb" - ] - }, - "contracts/Dao.sol": { - "keccak256": "0x48040ad90460a4a96ce52afdc9f1770d90110395bde9283f2e57d07e7bb107a4", - "license": "MIT", - "urls": [ - "bzz-raw://eb09814f0c3253bac4add6c634c9e9a69ef935b25b6e10b2395a68abf5e969ce", - "dweb:/ipfs/QmamHVNMP9HbSo7QGFkR5HfN72nJc8PRv5rBaWf6soEunb" - ] - } - }, - "version": 1 -} \ No newline at end of file + "_format": "hh-sol-artifact-1", + "contractName": "HomebaseDAO", + "sourceName": "contracts/Dao.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVotes", + "name": "_token", + "type": "address" + }, + { + "internalType": "contract TimelockController", + "name": "_timelock", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint48", + "name": "minsDelay", + "type": "uint48" + }, + { + "internalType": "uint32", + "name": "minsVoting", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "pThreshold", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "qvrm", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "CheckpointUnorderedInsertion", + "type": "error" + }, + { + "inputs": [], + "name": "FailedInnerCall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "voter", + "type": "address" + } + ], + "name": "GovernorAlreadyCastVote", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "GovernorAlreadyQueuedProposal", + "type": "error" + }, + { + "inputs": [], + "name": "GovernorDisabledDeposit", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "proposer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "votes", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ], + "name": "GovernorInsufficientProposerVotes", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "targets", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "calldatas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "values", + "type": "uint256" + } + ], + "name": "GovernorInvalidProposalLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "quorumNumerator", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "quorumDenominator", + "type": "uint256" + } + ], + "name": "GovernorInvalidQuorumFraction", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "voter", + "type": "address" + } + ], + "name": "GovernorInvalidSignature", + "type": "error" + }, + { + "inputs": [], + "name": "GovernorInvalidVoteType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "votingPeriod", + "type": "uint256" + } + ], + "name": "GovernorInvalidVotingPeriod", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "GovernorNonexistentProposal", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "GovernorNotQueuedProposal", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "GovernorOnlyExecutor", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "GovernorOnlyProposer", + "type": "error" + }, + { + "inputs": [], + "name": "GovernorQueueNotImplemented", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "proposer", + "type": "address" + } + ], + "name": "GovernorRestrictedProposer", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "enum IGovernor.ProposalState", + "name": "current", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "expectedStates", + "type": "bytes32" + } + ], + "name": "GovernorUnexpectedProposalState", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "currentNonce", + "type": "uint256" + } + ], + "name": "InvalidAccountNonce", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidShortString", + "type": "error" + }, + { + "inputs": [], + "name": "QueueEmpty", + "type": "error" + }, + { + "inputs": [], + "name": "QueueFull", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "bits", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "SafeCastOverflowedUintDowncast", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "str", + "type": "string" + } + ], + "name": "StringTooLong", + "type": "error" + }, + { + "anonymous": false, + "inputs": [], + "name": "EIP712DomainChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "ProposalCanceled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "proposer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "string[]", + "name": "signatures", + "type": "string[]" + }, + { + "indexed": false, + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "voteStart", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "voteEnd", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "description", + "type": "string" + } + ], + "name": "ProposalCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "ProposalExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "etaSeconds", + "type": "uint256" + } + ], + "name": "ProposalQueued", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldProposalThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newProposalThreshold", + "type": "uint256" + } + ], + "name": "ProposalThresholdSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldQuorumNumerator", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newQuorumNumerator", + "type": "uint256" + } + ], + "name": "QuorumNumeratorUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "oldTimelock", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newTimelock", + "type": "address" + } + ], + "name": "TimelockChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "voter", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "VoteCast", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "voter", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "reason", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "params", + "type": "bytes" + } + ], + "name": "VoteCastWithParams", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldVotingDelay", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newVotingDelay", + "type": "uint256" + } + ], + "name": "VotingDelaySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldVotingPeriod", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newVotingPeriod", + "type": "uint256" + } + ], + "name": "VotingPeriodSet", + "type": "event" + }, + { + "inputs": [], + "name": "BALLOT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "CLOCK_MODE", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "COUNTING_MODE", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "EXTENDED_BALLOT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "descriptionHash", + "type": "bytes32" + } + ], + "name": "cancel", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + } + ], + "name": "castVote", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "address", + "name": "voter", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "castVoteBySig", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "castVoteWithReason", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + }, + { + "internalType": "bytes", + "name": "params", + "type": "bytes" + } + ], + "name": "castVoteWithReasonAndParams", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "address", + "name": "voter", + "type": "address" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + }, + { + "internalType": "bytes", + "name": "params", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "castVoteWithReasonAndParamsBySig", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "clock", + "outputs": [ + { + "internalType": "uint48", + "name": "", + "type": "uint48" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "descriptionHash", + "type": "bytes32" + } + ], + "name": "execute", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "timepoint", + "type": "uint256" + } + ], + "name": "getVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "timepoint", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "params", + "type": "bytes" + } + ], + "name": "getVotesWithParams", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasVoted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "descriptionHash", + "type": "bytes32" + } + ], + "name": "hashProposal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155BatchReceived", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalDeadline", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalEta", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalNeedsQueuing", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalProposer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalSnapshot", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proposalThreshold", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "againstVotes", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "forVotes", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "abstainVotes", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + } + ], + "name": "propose", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "descriptionHash", + "type": "bytes32" + } + ], + "name": "queue", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "quorum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "quorumDenominator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "timepoint", + "type": "uint256" + } + ], + "name": "quorumNumerator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "quorumNumerator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "relay", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newProposalThreshold", + "type": "uint256" + } + ], + "name": "setProposalThreshold", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint48", + "name": "newVotingDelay", + "type": "uint48" + } + ], + "name": "setVotingDelay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "newVotingPeriod", + "type": "uint32" + } + ], + "name": "setVotingPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "state", + "outputs": [ + { + "internalType": "enum IGovernor.ProposalState", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "timelock", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "token", + "outputs": [ + { + "internalType": "contract IERC5805", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newQuorumNumerator", + "type": "uint256" + } + ], + "name": "updateQuorumNumerator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract TimelockController", + "name": "newTimelock", + "type": "address" + } + ], + "name": "updateTimelock", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "votingDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "votingPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x6101806040523480156200001257600080fd5b5060405162004efe38038062004efe833981016040819052620000359162000812565b8560ff8216886200004887603c6200094f565b6200005587603c6200097c565b868a80620000776040805180820190915260018152603160f81b602082015290565b6200008482600062000193565b610120526200009581600162000193565b61014052815160208084019190912060e052815190820120610100524660a0526200012360e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60805250503060c05260036200013a828262000a30565b5062000148905083620001cc565b620001538262000232565b6200015e81620002d9565b5050506001600160a01b03166101605262000179816200031a565b506200018581620003ba565b505050505050505062000b8a565b6000602083511015620001b357620001ab8362000423565b9050620001c6565b81620001c0848262000a30565b5060ff90505b92915050565b6008546040805165ffffffffffff928316815291831660208301527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a16008805465ffffffffffff191665ffffffffffff92909216919091179055565b8063ffffffff16600003620002625760405163f1cfbf0560e01b8152600060048201526024015b60405180910390fd5b6008546040805163ffffffff66010000000000009093048316815291831660208301527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a16008805463ffffffff90921666010000000000000263ffffffff60301b19909216919091179055565b60075460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a1600755565b606480821115620003495760405163243e544560e01b8152600481018390526024810182905260440162000259565b60006200035562000466565b90506200037a6200036562000482565b620003708562000504565b600a91906200053e565b505060408051828152602081018590527f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997910160405180910390a1505050565b600b54604080516001600160a01b03928316815291831660208301527f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401910160405180910390a1600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600080829050601f8151111562000451578260405163305a27a960e01b815260040162000259919062000afc565b80516200045e8262000b31565b179392505050565b600062000474600a6200055b565b6001600160d01b0316905090565b60006200048f6101605190565b6001600160a01b03166391ddadf46040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015620004eb575060408051601f3d908101601f19168201909252620004e89181019062000b56565b60015b620004ff57620004fa620005ab565b905090565b919050565b60006001600160d01b038211156200053a576040516306dfcc6560e41b815260d060048201526024810183905260440162000259565b5090565b6000806200054e858585620005b8565b915091505b935093915050565b80546000908015620005a15762000587836200057960018462000b74565b600091825260209091200190565b54660100000000000090046001600160d01b0316620005a4565b60005b9392505050565b6000620004fa436200074a565b825460009081908015620006eb576000620005da876200057960018562000b74565b60408051808201909152905465ffffffffffff80821680845266010000000000009092046001600160d01b0316602084015291925090871610156200063257604051632520601d60e01b815260040160405180910390fd5b805165ffffffffffff80881691160362000686578462000659886200057960018662000b74565b80546001600160d01b039290921666010000000000000265ffffffffffff909216919091179055620006da565b6040805180820190915265ffffffffffff80881682526001600160d01b0380881660208085019182528b54600181018d5560008d815291909120945191519092166601000000000000029216919091179101555b602001519250839150620005539050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a5560008a815291822095519251909316660100000000000002919093161792019190915590508162000553565b600065ffffffffffff8211156200053a576040516306dfcc6560e41b8152603060048201526024810183905260440162000259565b6001600160a01b03811681146200079557600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620007cb578181015183820152602001620007b1565b50506000910152565b805165ffffffffffff81168114620004ff57600080fd5b805163ffffffff81168114620004ff57600080fd5b805160ff81168114620004ff57600080fd5b600080600080600080600060e0888a0312156200082e57600080fd5b87516200083b816200077f565b60208901519097506200084e816200077f565b60408901519096506001600160401b03808211156200086c57600080fd5b818a0191508a601f8301126200088157600080fd5b81518181111562000896576200089662000798565b604051601f8201601f19908116603f01168101908382118183101715620008c157620008c162000798565b816040528281528d6020848701011115620008db57600080fd5b620008ee836020830160208801620007ae565b80995050505050506200090460608901620007d4565b93506200091460808901620007eb565b925060a088015191506200092b60c0890162000800565b905092959891949750929550565b634e487b7160e01b600052601160045260246000fd5b65ffffffffffff81811683821602808216919082811462000974576200097462000939565b505092915050565b63ffffffff81811683821602808216919082811462000974576200097462000939565b600181811c90821680620009b457607f821691505b602082108103620009d557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a2b576000816000526020600020601f850160051c8101602086101562000a065750805b601f850160051c820191505b8181101562000a275782815560010162000a12565b5050505b505050565b81516001600160401b0381111562000a4c5762000a4c62000798565b62000a648162000a5d84546200099f565b84620009db565b602080601f83116001811462000a9c576000841562000a835750858301515b600019600386901b1c1916600185901b17855562000a27565b600085815260208120601f198616915b8281101562000acd5788860151825594840194600190910190840162000aac565b508582101562000aec5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000825180602084015262000b1d816040850160208701620007ae565b601f01601f19169190910160400192915050565b80516020808301519190811015620009d55760001960209190910360031b1b16919050565b60006020828403121562000b6957600080fd5b620005a482620007d4565b81810381811115620001c657620001c662000939565b60805160a05160c05160e051610100516101205161014051610160516142f262000c0c600039600081816109de01528181610e48015281816113a301528181611ff4015261224e01526000611fbf01526000611f92015260006128820152600061285a015260006127b5015260006127df0152600061280901526142f26000f3fe6080604052600436106102975760003560e01c80637ecebe001161015a578063c01f9e37116100c1578063e540d01d1161007a578063e540d01d1461092f578063eb9019d41461094f578063ece40cc11461096f578063f23a6e611461098f578063f8ce560a146109af578063fc0c546a146109cf57600080fd5b8063c01f9e3714610844578063c28bc2fa14610864578063c59057e414610877578063d33219b414610897578063dd4e2ba5146108b5578063deaaa7cc146108fb57600080fd5b8063a7713a7011610113578063a7713a7014610782578063a890c91014610797578063a9a95294146107b7578063ab58fb8e146107d7578063b58131b01461080f578063bc197c811461082457600080fd5b80637ecebe00146106a457806384b0196e146106da5780638ff262e31461070257806391ddadf41461072257806397c3d3341461074e5780639a802a6d1461076257600080fd5b806343859632116101fe5780635b8d0e0d116101b75780635b8d0e0d146105e45780635f398a141461060457806360c4247f1461062457806379051887146106445780637b3c71d3146106645780637d5e81e21461068457600080fd5b806343859632146104c6578063452115d6146105105780634bf5d7e914610530578063544ffc9c1461054557806354fd4d501461059a57806356781388146105c457600080fd5b8063160cbed711610250578063160cbed7146103fd5780632656227d1461041d5780632d63f693146104305780632fe3e261146104505780633932abb1146104845780633e4f49e61461049957600080fd5b806301ffc9a7146102d357806302a251a31461030857806306f3f9e61461033457806306fdde0314610354578063143489d014610376578063150b7a02146103c457600080fd5b366102ce57306102a5610a02565b6001600160a01b0316146102cc57604051637485328f60e11b815260040160405180910390fd5b005b600080fd5b3480156102df57600080fd5b506102f36102ee36600461323a565b610a1b565b60405190151581526020015b60405180910390f35b34801561031457600080fd5b50600854600160301b900463ffffffff165b6040519081526020016102ff565b34801561034057600080fd5b506102cc61034f366004613264565b610a6d565b34801561036057600080fd5b50610369610a81565b6040516102ff91906132cd565b34801561038257600080fd5b506103ac610391366004613264565b6000908152600460205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016102ff565b3480156103d057600080fd5b506103e46103df3660046133c0565b610b13565b6040516001600160e01b031990911681526020016102ff565b34801561040957600080fd5b5061032661041836600461359f565b610b56565b61032661042b36600461359f565b610c25565b34801561043c57600080fd5b5061032661044b366004613264565b610d91565b34801561045c57600080fd5b506103267f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a81181565b34801561049057600080fd5b50610326610db2565b3480156104a557600080fd5b506104b96104b4366004613264565b610dc5565b6040516102ff9190613666565b3480156104d257600080fd5b506102f36104e1366004613674565b60008281526009602090815260408083206001600160a01b038516845260030190915290205460ff1692915050565b34801561051c57600080fd5b5061032661052b36600461359f565b610dd0565b34801561053c57600080fd5b50610369610e44565b34801561055157600080fd5b5061057f610560366004613264565b6000908152600960205260409020805460018201546002909201549092565b604080519384526020840192909252908201526060016102ff565b3480156105a657600080fd5b506040805180820190915260018152603160f81b6020820152610369565b3480156105d057600080fd5b506103266105df3660046136b5565b610f06565b3480156105f057600080fd5b506103266105ff366004613729565b610f2f565b34801561061057600080fd5b5061032661061f3660046137e3565b61108e565b34801561063057600080fd5b5061032661063f366004613264565b6110e3565b34801561065057600080fd5b506102cc61065f36600461387a565b611171565b34801561067057600080fd5b5061032661067f366004613897565b611182565b34801561069057600080fd5b5061032661069f3660046138f0565b6111ca565b3480156106b057600080fd5b506103266106bf3660046139a4565b6001600160a01b031660009081526002602052604090205490565b3480156106e657600080fd5b506106ef611287565b6040516102ff97969594939291906139fd565b34801561070e57600080fd5b5061032661071d366004613a6d565b6112cd565b34801561072e57600080fd5b5061073761139f565b60405165ffffffffffff90911681526020016102ff565b34801561075a57600080fd5b506064610326565b34801561076e57600080fd5b5061032661077d366004613abe565b611427565b34801561078e57600080fd5b50610326611434565b3480156107a357600080fd5b506102cc6107b23660046139a4565b61144e565b3480156107c357600080fd5b506102f36107d2366004613264565b61145f565b3480156107e357600080fd5b506103266107f2366004613264565b60009081526004602052604090206001015465ffffffffffff1690565b34801561081b57600080fd5b50610326611468565b34801561083057600080fd5b506103e461083f366004613b16565b611473565b34801561085057600080fd5b5061032661085f366004613264565b6114b7565b6102cc610872366004613ba9565b6114fa565b34801561088357600080fd5b5061032661089236600461359f565b61157a565b3480156108a357600080fd5b50600b546001600160a01b03166103ac565b3480156108c157600080fd5b506040805180820190915260208082527f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e90820152610369565b34801561090757600080fd5b506103267ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d781565b34801561093b57600080fd5b506102cc61094a366004613bec565b6115b4565b34801561095b57600080fd5b5061032661096a366004613c12565b6115c5565b34801561097b57600080fd5b506102cc61098a366004613264565b6115ed565b34801561099b57600080fd5b506103e46109aa366004613c3e565b6115fe565b3480156109bb57600080fd5b506103266109ca366004613264565b611642565b3480156109db57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103ac565b6000610a16600b546001600160a01b031690565b905090565b60006001600160e01b031982166332a2ad4360e11b1480610a4c57506001600160e01b03198216630271189760e51b145b80610a6757506301ffc9a760e01b6001600160e01b03198316145b92915050565b610a7561164d565b610a7e816116c7565b50565b606060038054610a9090613ca6565b80601f0160208091040260200160405190810160405280929190818152602001828054610abc90613ca6565b8015610b095780601f10610ade57610100808354040283529160200191610b09565b820191906000526020600020905b815481529060010190602001808311610aec57829003601f168201915b5050505050905090565b600030610b1e610a02565b6001600160a01b031614610b4557604051637485328f60e11b815260040160405180910390fd5b50630a85bd0160e11b949350505050565b600080610b658686868661157a565b9050610b7a81610b75600461175d565b611780565b506000610b8a82888888886117bf565b905065ffffffffffff811615610c0257600082815260046020908152604091829020600101805465ffffffffffff191665ffffffffffff85169081179091558251858152918201527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892910160405180910390a1610c1b565b604051634844252360e11b815260040160405180910390fd5b5095945050505050565b600080610c348686868661157a565b9050610c5481610c44600561175d565b610c4e600461175d565b17611780565b506000818152600460205260409020805460ff60f01b1916600160f01b17905530610c7d610a02565b6001600160a01b031614610d075760005b8651811015610d0557306001600160a01b0316878281518110610cb357610cb3613ce0565b60200260200101516001600160a01b031603610cfd57610cfd858281518110610cde57610cde613ce0565b60200260200101518051906020012060056117ce90919063ffffffff16565b600101610c8e565b505b610d14818787878761183f565b30610d1d610a02565b6001600160a01b031614158015610d4957506005546001600160801b03808216600160801b9092041614155b15610d545760006005555b6040518181527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f906020015b60405180910390a195945050505050565b600090815260046020526040902054600160a01b900465ffffffffffff1690565b6000610a1660085465ffffffffffff1690565b6000610a6782611853565b600080610ddf8686868661157a565b9050610def81610b75600061175d565b506000818152600460205260409020546001600160a01b03163314610e2e5760405163233d98e360e01b81523360048201526024015b60405180910390fd5b610e3a86868686611992565b9695505050505050565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634bf5d7e96040518163ffffffff1660e01b8152600401600060405180830381865afa925050508015610ec557506040513d6000823e601f3d908101601f19168201604052610ec29190810190613cf6565b60015b610f01575060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b919050565b600080339050610f27848285604051806020016040528060008152506119a9565b949350505050565b6000806110128761100c7f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a8118c8c8c610f848e6001600160a01b0316600090815260026020526040902080546001810190915590565b8d8d604051610f94929190613d63565b60405180910390208c80519060200120604051602001610ff19796959493929190968752602087019590955260ff9390931660408601526001600160a01b03919091166060850152608084015260a083015260c082015260e00190565b604051602081830303815290604052805190602001206119cc565b856119f9565b90508061103d576040516394ab6c0760e01b81526001600160a01b0388166004820152602401610e25565b61108189888a89898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b9250611a51915050565b9998505050505050505050565b6000803390506110d887828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250611a51915050565b979650505050505050565b600a805460009182906110f7600184613d89565b8154811061110757611107613ce0565b6000918252602090912001805490915065ffffffffffff811690600160301b90046001600160d01b031685821161114a576001600160d01b031695945050505050565b61115e61115687611b2e565b600a90611b65565b6001600160d01b03169695505050505050565b61117961164d565b610a7e81611c1a565b600080339050610e3a86828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119a992505050565b6000336111d78184611c80565b6111ff5760405163d9b3955760e01b81526001600160a01b0382166004820152602401610e25565b600061122682600161120f61139f565b6112199190613d9c565b65ffffffffffff166115c5565b90506000611232611468565b90508082101561126e57604051636121770b60e11b81526001600160a01b03841660048201526024810183905260448101829052606401610e25565b61127b8888888887611d6b565b98975050505050505050565b60006060806000806000606061129b611f8b565b6112a3611fb8565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6000806113598461100c7ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d78989896113228b6001600160a01b0316600090815260026020526040902080546001810190915590565b60408051602081019690965285019390935260ff90911660608401526001600160a01b0316608083015260a082015260c001610ff1565b905080611384576040516394ab6c0760e01b81526001600160a01b0385166004820152602401610e25565b610e3a868587604051806020016040528060008152506119a9565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166391ddadf46040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561141b575060408051601f3d908101601f1916820190925261141891810190613dc2565b60015b610f0157610a16611fe5565b6000610f27848484611ff0565b6000611440600a612086565b6001600160d01b0316905090565b61145661164d565b610a7e816120bf565b60006001610a67565b6000610a1660075490565b60003061147e610a02565b6001600160a01b0316146114a557604051637485328f60e11b815260040160405180910390fd5b5063bc197c8160e01b95945050505050565b6000818152600460205260408120546114ec90600160d01b810463ffffffff1690600160a01b900465ffffffffffff16613ddf565b65ffffffffffff1692915050565b61150261164d565b600080856001600160a01b0316858585604051611520929190613d63565b60006040518083038185875af1925050503d806000811461155d576040519150601f19603f3d011682016040523d82523d6000602084013e611562565b606091505b50915091506115718282612128565b50505050505050565b6000848484846040516020016115939493929190613e92565b60408051601f19818403018152919052805160209091012095945050505050565b6115bc61164d565b610a7e81612144565b60006115e683836115e160408051602081019091526000815290565b611ff0565b9392505050565b6115f561164d565b610a7e816121e2565b600030611609610a02565b6001600160a01b03161461163057604051637485328f60e11b815260040160405180910390fd5b5063f23a6e6160e01b95945050505050565b6000610a6782612223565b33611656610a02565b6001600160a01b03161461167f576040516347096e4760e01b8152336004820152602401610e25565b30611688610a02565b6001600160a01b0316146116c557600080366040516116a8929190613d63565b604051809103902090505b806116be60056122cd565b036116b357505b565b6064808211156116f45760405163243e544560e01b81526004810183905260248101829052604401610e25565b60006116fe611434565b905061171d61170b61139f565b6117148561234b565b600a919061237f565b505060408051828152602081018590527f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997910160405180910390a1505050565b60008160078111156117715761177161362e565b600160ff919091161b92915050565b60008061178c84610dc5565b905060008361179a8361175d565b16036115e6578381846040516331b75e4d60e01b8152600401610e2593929190613edd565b6000610e3a868686868661239a565b81546001600160801b03600160801b82048116918116600183019091160361180957604051638acb5f2760e01b815260040160405180910390fd5b6001600160801b03808216600090815260018086016020526040909120939093558354919092018216600160801b029116179055565b61184c8585858585612539565b5050505050565b60008061185f836125cf565b905060058160078111156118755761187561362e565b146118805792915050565b6000838152600c60205260409081902054600b549151632c258a9f60e11b81526004810182905290916001600160a01b03169063584b153e90602401602060405180830381865afa1580156118d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fd9190613eff565b1561190c575060059392505050565b600b54604051632ab0f52960e01b8152600481018390526001600160a01b0390911690632ab0f52990602401602060405180830381865afa158015611955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119799190613eff565b15611988575060079392505050565b5060029392505050565b60006119a085858585612709565b95945050505050565b60006119a0858585856119c760408051602081019091526000815290565b611a51565b6000610a676119d96127a8565b8360405161190160f01b8152600281019290925260228201526042902090565b6000806000611a0885856128d3565b5090925090506000816003811115611a2257611a2261362e565b148015611a405750856001600160a01b0316826001600160a01b0316145b80610e3a5750610e3a868686612920565b6000611a6186610b75600161175d565b506000611a7786611a7189610d91565b85611ff0565b9050611a8687878784876129fb565b8251600003611adb57856001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda488878488604051611ace9493929190613f21565b60405180910390a2610e3a565b856001600160a01b03167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128887848888604051611b1c959493929190613f49565b60405180910390a29695505050505050565b600065ffffffffffff821115611b61576040516306dfcc6560e41b81526030600482015260248101839052604401610e25565b5090565b815460009081816005811115611bc4576000611b8084612afc565b611b8a9085613d89565b60008881526020902090915081015465ffffffffffff9081169087161015611bb457809150611bc2565b611bbf816001613f83565b92505b505b6000611bd287878585612be4565b90508015611c0d57611bf787611be9600184613d89565b600091825260209091200190565b54600160301b90046001600160d01b03166110d8565b6000979650505050505050565b6008546040805165ffffffffffff928316815291831660208301527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a16008805465ffffffffffff191665ffffffffffff92909216919091179055565b80516000906034811015611c98576001915050610a67565b82810160131901516001600160a01b031981166b046e0e4dee0dee6cae47a60f60a31b14611ccb57600192505050610a67565b600080611cd9602885613d89565b90505b83811015611d4a57600080611d10888481518110611cfc57611cfc613ce0565b01602001516001600160f81b031916612c46565b9150915081611d285760019650505050505050610a67565b8060ff166004856001600160a01b0316901b1793505050806001019050611cdc565b50856001600160a01b0316816001600160a01b031614935050505092915050565b6000611d80868686868051906020012061157a565b905084518651141580611d9557508351865114155b80611d9f57508551155b15611dd457855184518651604051630447b05d60e41b8152600481019390935260248301919091526044820152606401610e25565b600081815260046020526040902054600160a01b900465ffffffffffff1615611e1f5780611e0182610dc5565b6040516331b75e4d60e01b8152610e25929190600090600401613edd565b6000611e29610db2565b611e3161139f565b65ffffffffffff16611e439190613f83565b90506000611e5e60085463ffffffff600160301b9091041690565b600084815260046020526040902080546001600160a01b0319166001600160a01b038716178155909150611e9183611b2e565b815465ffffffffffff91909116600160a01b0265ffffffffffff60a01b19909116178155611ebe82612cd8565b815463ffffffff91909116600160d01b0263ffffffff60d01b1990911617815588517f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e090859087908c908c906001600160401b03811115611f2157611f216132f5565b604051908082528060200260200182016040528015611f5457816020015b6060815260200190600190039081611f3f5790505b508c89611f618a82613f83565b8e604051611f7799989796959493929190613f96565b60405180910390a150505095945050505050565b6060610a167f00000000000000000000000000000000000000000000000000000000000000006000612d09565b6060610a167f00000000000000000000000000000000000000000000000000000000000000006001612d09565b6000610a1643611b2e565b60007f0000000000000000000000000000000000000000000000000000000000000000604051630748d63560e31b81526001600160a01b038681166004830152602482018690529190911690633a46b1a890604401602060405180830381865afa158015612062573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f27919061406d565b805460009080156120b6576120a083611be9600184613d89565b54600160301b90046001600160d01b03166115e6565b60009392505050565b600b54604080516001600160a01b03928316815291831660208301527f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401910160405180910390a1600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60608261213d5761213882612db4565b610a67565b5080610a67565b8063ffffffff1660000361216e5760405163f1cfbf0560e01b815260006004820152602401610e25565b6008546040805163ffffffff600160301b9093048316815291831660208301527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a16008805463ffffffff909216600160301b0269ffffffff00000000000019909216919091179055565b60075460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a1600755565b60006064612230836110e3565b604051632394e7a360e21b8152600481018590526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638e539e8c90602401602060405180830381865afa158015612295573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b9919061406d565b6122c39190614086565b610a6791906140b3565b80546000906001600160801b0380821691600160801b9004168103612305576040516375e52f4f60e01b815260040160405180910390fd5b6001600160801b038181166000908152600185810160205260408220805492905585546fffffffffffffffffffffffffffffffff19169301909116919091179092555090565b60006001600160d01b03821115611b61576040516306dfcc6560e41b815260d0600482015260248101839052604401610e25565b60008061238d858585612ddd565b915091505b935093915050565b600080600b60009054906101000a90046001600160a01b03166001600160a01b031663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612414919061406d565b905060003060601b6bffffffffffffffffffffffff19168418600b5460405163b1c5f42760e01b81529192506001600160a01b03169063b1c5f42790612467908a908a908a9060009088906004016140d5565b602060405180830381865afa158015612484573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a8919061406d565b6000898152600c602052604080822092909255600b5491516308f2a0bb60e41b81526001600160a01b0390921691638f2a0bb0916124f3918b918b918b919088908a90600401614123565b600060405180830381600087803b15801561250d57600080fd5b505af1158015612521573d6000803e3d6000fd5b5050505061127b82426125349190613f83565b611b2e565b600b546001600160a01b031663e38335e53486868660003060601b6bffffffffffffffffffffffff191688186040518763ffffffff1660e01b81526004016125859594939291906140d5565b6000604051808303818588803b15801561259e57600080fd5b505af11580156125b2573d6000803e3d6000fd5b50505060009687525050600c602052505060408320929092555050565b6000818152600460205260408120805460ff600160f01b8204811691600160f81b900416811561260457506007949350505050565b801561261557506002949350505050565b600061262086610d91565b90508060000361264657604051636ad0607560e01b815260048101879052602401610e25565b600061265061139f565b65ffffffffffff16905080821061266e575060009695505050505050565b6000612679886114b7565b905081811061269057506001979650505050505050565b61269988612f57565b15806126b957506000888152600960205260409020805460019091015411155b156126cc57506003979650505050505050565b60008881526004602052604090206001015465ffffffffffff166000036126fb57506004979650505050505050565b506005979650505050505050565b60008061271886868686612f8e565b6000818152600c60205260409020549091508015610c1b57600b5460405163c4d252f560e01b8152600481018390526001600160a01b039091169063c4d252f590602401600060405180830381600087803b15801561277657600080fd5b505af115801561278a573d6000803e3d6000fd5b5050506000838152600c602052604081205550509050949350505050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561280157507f000000000000000000000000000000000000000000000000000000000000000046145b1561282b57507f000000000000000000000000000000000000000000000000000000000000000090565b610a16604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b6000806000835160410361290d5760208401516040850151606086015160001a6128ff8882858561303f565b955095509550505050612919565b50508151600091506002905b9250925092565b6000806000856001600160a01b0316858560405160240161294292919061417b565b60408051601f198184030181529181526020820180516001600160e01b0316630b135d3f60e11b179052516129779190614194565b600060405180830381855afa9150503d80600081146129b2576040519150601f19603f3d011682016040523d82523d6000602084013e6129b7565b606091505b50915091508180156129cb57506020815110155b8015610e3a57508051630b135d3f60e11b906129f0908301602090810190840161406d565b149695505050505050565b60008581526009602090815260408083206001600160a01b0388168452600381019092529091205460ff1615612a4f576040516371c6af4960e01b81526001600160a01b0386166004820152602401610e25565b6001600160a01b03851660009081526003820160205260409020805460ff1916600117905560ff8416612a9b5782816000016000828254612a909190613f83565b90915550612af49050565b60001960ff851601612abb5782816001016000828254612a909190613f83565b60011960ff851601612adb5782816002016000828254612a909190613f83565b6040516303599be160e11b815260040160405180910390fd5b505050505050565b600081600003612b0e57506000919050565b60006001612b1b8461310e565b901c6001901b90506001818481612b3457612b3461409d565b048201901c90506001818481612b4c57612b4c61409d565b048201901c90506001818481612b6457612b6461409d565b048201901c90506001818481612b7c57612b7c61409d565b048201901c90506001818481612b9457612b9461409d565b048201901c90506001818481612bac57612bac61409d565b048201901c90506001818481612bc457612bc461409d565b048201901c90506115e681828581612bde57612bde61409d565b046131a2565b60005b81831015612c3e576000612bfb84846131b8565b60008781526020902090915065ffffffffffff86169082015465ffffffffffff161115612c2a57809250612c38565b612c35816001613f83565b93505b50612be7565b509392505050565b60008060f883901c602f81118015612c615750603a8160ff16105b15612c7657600194602f199091019350915050565b8060ff166040108015612c8c575060478160ff16105b15612ca1576001946036199091019350915050565b8060ff166060108015612cb7575060678160ff16105b15612ccc576001946056199091019350915050565b50600093849350915050565b600063ffffffff821115611b61576040516306dfcc6560e41b81526020600482015260248101839052604401610e25565b606060ff8314612d2357612d1c836131d3565b9050610a67565b818054612d2f90613ca6565b80601f0160208091040260200160405190810160405280929190818152602001828054612d5b90613ca6565b8015612da85780601f10612d7d57610100808354040283529160200191612da8565b820191906000526020600020905b815481529060010190602001808311612d8b57829003601f168201915b50505050509050610a67565b805115612dc45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b825460009081908015612efc576000612dfb87611be9600185613d89565b60408051808201909152905465ffffffffffff808216808452600160301b9092046001600160d01b031660208401529192509087161015612e4f57604051632520601d60e01b815260040160405180910390fd5b805165ffffffffffff808816911603612e9b5784612e7288611be9600186613d89565b80546001600160d01b0392909216600160301b0265ffffffffffff909216919091179055612eec565b6040805180820190915265ffffffffffff80881682526001600160d01b0380881660208085019182528b54600181018d5560008d81529190912094519151909216600160301b029216919091179101555b6020015192508391506123929050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a5560008a815291822095519251909316600160301b029190931617920191909155905081612392565b600081815260096020526040812060028101546001820154612f799190613f83565b612f856109ca85610d91565b11159392505050565b600080612f9d8686868661157a565b9050612feb81612fad600761175d565b612fb7600661175d565b612fc1600261175d565b6001612fce6007826141b0565b612fd99060026142ad565b612fe39190613d89565b181818611780565b506000818152600460205260409081902080546001600160f81b0316600160f81b179055517f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90610d809083815260200190565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561307a5750600091506003905082613104565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156130ce573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166130fa57506000925060019150829050613104565b9250600091508190505b9450945094915050565b600080608083901c1561312357608092831c92015b604083901c1561313557604092831c92015b602083901c1561314757602092831c92015b601083901c1561315957601092831c92015b600883901c1561316b57600892831c92015b600483901c1561317d57600492831c92015b600283901c1561318f57600292831c92015b600183901c15610a675760010192915050565b60008183106131b157816115e6565b5090919050565b60006131c760028484186140b3565b6115e690848416613f83565b606060006131e083613212565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b600060ff8216601f811115610a6757604051632cd44ac360e21b815260040160405180910390fd5b60006020828403121561324c57600080fd5b81356001600160e01b0319811681146115e657600080fd5b60006020828403121561327657600080fd5b5035919050565b60005b83811015613298578181015183820152602001613280565b50506000910152565b600081518084526132b981602086016020860161327d565b601f01601f19169290920160200192915050565b6020815260006115e660208301846132a1565b6001600160a01b0381168114610a7e57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613333576133336132f5565b604052919050565b60006001600160401b03821115613354576133546132f5565b50601f01601f191660200190565b60006133756133708461333b565b61330b565b905082815283838301111561338957600080fd5b828260208301376000602084830101529392505050565b600082601f8301126133b157600080fd5b6115e683833560208501613362565b600080600080608085870312156133d657600080fd5b84356133e1816132e0565b935060208501356133f1816132e0565b92506040850135915060608501356001600160401b0381111561341357600080fd5b61341f878288016133a0565b91505092959194509250565b60006001600160401b03821115613444576134446132f5565b5060051b60200190565b600082601f83011261345f57600080fd5b8135602061346f6133708361342b565b8083825260208201915060208460051b87010193508684111561349157600080fd5b602086015b848110156134b65780356134a9816132e0565b8352918301918301613496565b509695505050505050565b600082601f8301126134d257600080fd5b813560206134e26133708361342b565b8083825260208201915060208460051b87010193508684111561350457600080fd5b602086015b848110156134b65780358352918301918301613509565b600082601f83011261353157600080fd5b813560206135416133708361342b565b82815260059290921b8401810191818101908684111561356057600080fd5b8286015b848110156134b65780356001600160401b038111156135835760008081fd5b6135918986838b01016133a0565b845250918301918301613564565b600080600080608085870312156135b557600080fd5b84356001600160401b03808211156135cc57600080fd5b6135d88883890161344e565b955060208701359150808211156135ee57600080fd5b6135fa888389016134c1565b9450604087013591508082111561361057600080fd5b5061361d87828801613520565b949793965093946060013593505050565b634e487b7160e01b600052602160045260246000fd5b6008811061366257634e487b7160e01b600052602160045260246000fd5b9052565b60208101610a678284613644565b6000806040838503121561368757600080fd5b823591506020830135613699816132e0565b809150509250929050565b803560ff81168114610f0157600080fd5b600080604083850312156136c857600080fd5b823591506136d8602084016136a4565b90509250929050565b60008083601f8401126136f357600080fd5b5081356001600160401b0381111561370a57600080fd5b60208301915083602082850101111561372257600080fd5b9250929050565b600080600080600080600060c0888a03121561374457600080fd5b87359650613754602089016136a4565b95506040880135613764816132e0565b945060608801356001600160401b038082111561378057600080fd5b61378c8b838c016136e1565b909650945060808a01359150808211156137a557600080fd5b6137b18b838c016133a0565b935060a08a01359150808211156137c757600080fd5b506137d48a828b016133a0565b91505092959891949750929550565b6000806000806000608086880312156137fb57600080fd5b8535945061380b602087016136a4565b935060408601356001600160401b038082111561382757600080fd5b61383389838a016136e1565b9095509350606088013591508082111561384c57600080fd5b50613859888289016133a0565b9150509295509295909350565b65ffffffffffff81168114610a7e57600080fd5b60006020828403121561388c57600080fd5b81356115e681613866565b600080600080606085870312156138ad57600080fd5b843593506138bd602086016136a4565b925060408501356001600160401b038111156138d857600080fd5b6138e4878288016136e1565b95989497509550505050565b6000806000806080858703121561390657600080fd5b84356001600160401b038082111561391d57600080fd5b6139298883890161344e565b9550602087013591508082111561393f57600080fd5b61394b888389016134c1565b9450604087013591508082111561396157600080fd5b61396d88838901613520565b9350606087013591508082111561398357600080fd5b508501601f8101871361399557600080fd5b61341f87823560208401613362565b6000602082840312156139b657600080fd5b81356115e6816132e0565b60008151808452602080850194506020840160005b838110156139f2578151875295820195908201906001016139d6565b509495945050505050565b60ff60f81b8816815260e060208201526000613a1c60e08301896132a1565b8281036040840152613a2e81896132a1565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501529050613a5f81856139c1565b9a9950505050505050505050565b60008060008060808587031215613a8357600080fd5b84359350613a93602086016136a4565b92506040850135613aa3816132e0565b915060608501356001600160401b0381111561341357600080fd5b600080600060608486031215613ad357600080fd5b8335613ade816132e0565b92506020840135915060408401356001600160401b03811115613b0057600080fd5b613b0c868287016133a0565b9150509250925092565b600080600080600060a08688031215613b2e57600080fd5b8535613b39816132e0565b94506020860135613b49816132e0565b935060408601356001600160401b0380821115613b6557600080fd5b613b7189838a016134c1565b94506060880135915080821115613b8757600080fd5b613b9389838a016134c1565b9350608088013591508082111561384c57600080fd5b60008060008060608587031215613bbf57600080fd5b8435613bca816132e0565b93506020850135925060408501356001600160401b038111156138d857600080fd5b600060208284031215613bfe57600080fd5b813563ffffffff811681146115e657600080fd5b60008060408385031215613c2557600080fd5b8235613c30816132e0565b946020939093013593505050565b600080600080600060a08688031215613c5657600080fd5b8535613c61816132e0565b94506020860135613c71816132e0565b9350604086013592506060860135915060808601356001600160401b03811115613c9a57600080fd5b613859888289016133a0565b600181811c90821680613cba57607f821691505b602082108103613cda57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613d0857600080fd5b81516001600160401b03811115613d1e57600080fd5b8201601f81018413613d2f57600080fd5b8051613d3d6133708261333b565b818152856020838501011115613d5257600080fd5b6119a082602083016020860161327d565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610a6757610a67613d73565b65ffffffffffff828116828216039080821115613dbb57613dbb613d73565b5092915050565b600060208284031215613dd457600080fd5b81516115e681613866565b65ffffffffffff818116838216019080821115613dbb57613dbb613d73565b60008151808452602080850194506020840160005b838110156139f25781516001600160a01b031687529582019590820190600101613e13565b60008282518085526020808601955060208260051b8401016020860160005b84811015613e8557601f19868403018952613e738383516132a1565b98840198925090830190600101613e57565b5090979650505050505050565b608081526000613ea56080830187613dfe565b8281036020840152613eb781876139c1565b90508281036040840152613ecb8186613e38565b91505082606083015295945050505050565b83815260608101613ef16020830185613644565b826040830152949350505050565b600060208284031215613f1157600080fd5b815180151581146115e657600080fd5b84815260ff84166020820152826040820152608060608201526000610e3a60808301846132a1565b85815260ff8516602082015283604082015260a060608201526000613f7160a08301856132a1565b828103608084015261127b81856132a1565b80820180821115610a6757610a67613d73565b60006101208b8352602060018060a01b038c1681850152816040850152613fbf8285018c613dfe565b91508382036060850152613fd3828b6139c1565b915083820360808501528189518084528284019150828160051b850101838c0160005b8381101561402457601f198784030185526140128383516132a1565b94860194925090850190600101613ff6565b505086810360a0880152614038818c613e38565b9450505050508560c08401528460e084015282810361010084015261405d81856132a1565b9c9b505050505050505050505050565b60006020828403121561407f57600080fd5b5051919050565b8082028115828204841417610a6757610a67613d73565b634e487b7160e01b600052601260045260246000fd5b6000826140d057634e487b7160e01b600052601260045260246000fd5b500490565b60a0815260006140e860a0830188613dfe565b82810360208401526140fa81886139c1565b9050828103604084015261410e8187613e38565b60608401959095525050608001529392505050565b60c08152600061413660c0830189613dfe565b828103602084015261414881896139c1565b9050828103604084015261415c8188613e38565b60608401969096525050608081019290925260a0909101529392505050565b828152604060208201526000610f2760408301846132a1565b600082516141a681846020870161327d565b9190910192915050565b60ff8181168382160190811115610a6757610a67613d73565b600181815b808511156142045781600019048211156141ea576141ea613d73565b808516156141f757918102915b93841c93908002906141ce565b509250929050565b60008261421b57506001610a67565b8161422857506000610a67565b816001811461423e576002811461424857614264565b6001915050610a67565b60ff84111561425957614259613d73565b50506001821b610a67565b5060208310610133831016604e8410600b8410161715614287575081810a610a67565b61429183836141c9565b80600019048211156142a5576142a5613d73565b029392505050565b60006115e660ff84168361420c56fea26469706673582212207e5225747b7cf04e0aa9458d081e82f64dc7a4a4bbcdbfddb6c229e2586bbbd864736f6c63430008180033", + "deployedBytecode": "0x6080604052600436106102975760003560e01c80637ecebe001161015a578063c01f9e37116100c1578063e540d01d1161007a578063e540d01d1461092f578063eb9019d41461094f578063ece40cc11461096f578063f23a6e611461098f578063f8ce560a146109af578063fc0c546a146109cf57600080fd5b8063c01f9e3714610844578063c28bc2fa14610864578063c59057e414610877578063d33219b414610897578063dd4e2ba5146108b5578063deaaa7cc146108fb57600080fd5b8063a7713a7011610113578063a7713a7014610782578063a890c91014610797578063a9a95294146107b7578063ab58fb8e146107d7578063b58131b01461080f578063bc197c811461082457600080fd5b80637ecebe00146106a457806384b0196e146106da5780638ff262e31461070257806391ddadf41461072257806397c3d3341461074e5780639a802a6d1461076257600080fd5b806343859632116101fe5780635b8d0e0d116101b75780635b8d0e0d146105e45780635f398a141461060457806360c4247f1461062457806379051887146106445780637b3c71d3146106645780637d5e81e21461068457600080fd5b806343859632146104c6578063452115d6146105105780634bf5d7e914610530578063544ffc9c1461054557806354fd4d501461059a57806356781388146105c457600080fd5b8063160cbed711610250578063160cbed7146103fd5780632656227d1461041d5780632d63f693146104305780632fe3e261146104505780633932abb1146104845780633e4f49e61461049957600080fd5b806301ffc9a7146102d357806302a251a31461030857806306f3f9e61461033457806306fdde0314610354578063143489d014610376578063150b7a02146103c457600080fd5b366102ce57306102a5610a02565b6001600160a01b0316146102cc57604051637485328f60e11b815260040160405180910390fd5b005b600080fd5b3480156102df57600080fd5b506102f36102ee36600461323a565b610a1b565b60405190151581526020015b60405180910390f35b34801561031457600080fd5b50600854600160301b900463ffffffff165b6040519081526020016102ff565b34801561034057600080fd5b506102cc61034f366004613264565b610a6d565b34801561036057600080fd5b50610369610a81565b6040516102ff91906132cd565b34801561038257600080fd5b506103ac610391366004613264565b6000908152600460205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016102ff565b3480156103d057600080fd5b506103e46103df3660046133c0565b610b13565b6040516001600160e01b031990911681526020016102ff565b34801561040957600080fd5b5061032661041836600461359f565b610b56565b61032661042b36600461359f565b610c25565b34801561043c57600080fd5b5061032661044b366004613264565b610d91565b34801561045c57600080fd5b506103267f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a81181565b34801561049057600080fd5b50610326610db2565b3480156104a557600080fd5b506104b96104b4366004613264565b610dc5565b6040516102ff9190613666565b3480156104d257600080fd5b506102f36104e1366004613674565b60008281526009602090815260408083206001600160a01b038516845260030190915290205460ff1692915050565b34801561051c57600080fd5b5061032661052b36600461359f565b610dd0565b34801561053c57600080fd5b50610369610e44565b34801561055157600080fd5b5061057f610560366004613264565b6000908152600960205260409020805460018201546002909201549092565b604080519384526020840192909252908201526060016102ff565b3480156105a657600080fd5b506040805180820190915260018152603160f81b6020820152610369565b3480156105d057600080fd5b506103266105df3660046136b5565b610f06565b3480156105f057600080fd5b506103266105ff366004613729565b610f2f565b34801561061057600080fd5b5061032661061f3660046137e3565b61108e565b34801561063057600080fd5b5061032661063f366004613264565b6110e3565b34801561065057600080fd5b506102cc61065f36600461387a565b611171565b34801561067057600080fd5b5061032661067f366004613897565b611182565b34801561069057600080fd5b5061032661069f3660046138f0565b6111ca565b3480156106b057600080fd5b506103266106bf3660046139a4565b6001600160a01b031660009081526002602052604090205490565b3480156106e657600080fd5b506106ef611287565b6040516102ff97969594939291906139fd565b34801561070e57600080fd5b5061032661071d366004613a6d565b6112cd565b34801561072e57600080fd5b5061073761139f565b60405165ffffffffffff90911681526020016102ff565b34801561075a57600080fd5b506064610326565b34801561076e57600080fd5b5061032661077d366004613abe565b611427565b34801561078e57600080fd5b50610326611434565b3480156107a357600080fd5b506102cc6107b23660046139a4565b61144e565b3480156107c357600080fd5b506102f36107d2366004613264565b61145f565b3480156107e357600080fd5b506103266107f2366004613264565b60009081526004602052604090206001015465ffffffffffff1690565b34801561081b57600080fd5b50610326611468565b34801561083057600080fd5b506103e461083f366004613b16565b611473565b34801561085057600080fd5b5061032661085f366004613264565b6114b7565b6102cc610872366004613ba9565b6114fa565b34801561088357600080fd5b5061032661089236600461359f565b61157a565b3480156108a357600080fd5b50600b546001600160a01b03166103ac565b3480156108c157600080fd5b506040805180820190915260208082527f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e90820152610369565b34801561090757600080fd5b506103267ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d781565b34801561093b57600080fd5b506102cc61094a366004613bec565b6115b4565b34801561095b57600080fd5b5061032661096a366004613c12565b6115c5565b34801561097b57600080fd5b506102cc61098a366004613264565b6115ed565b34801561099b57600080fd5b506103e46109aa366004613c3e565b6115fe565b3480156109bb57600080fd5b506103266109ca366004613264565b611642565b3480156109db57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103ac565b6000610a16600b546001600160a01b031690565b905090565b60006001600160e01b031982166332a2ad4360e11b1480610a4c57506001600160e01b03198216630271189760e51b145b80610a6757506301ffc9a760e01b6001600160e01b03198316145b92915050565b610a7561164d565b610a7e816116c7565b50565b606060038054610a9090613ca6565b80601f0160208091040260200160405190810160405280929190818152602001828054610abc90613ca6565b8015610b095780601f10610ade57610100808354040283529160200191610b09565b820191906000526020600020905b815481529060010190602001808311610aec57829003601f168201915b5050505050905090565b600030610b1e610a02565b6001600160a01b031614610b4557604051637485328f60e11b815260040160405180910390fd5b50630a85bd0160e11b949350505050565b600080610b658686868661157a565b9050610b7a81610b75600461175d565b611780565b506000610b8a82888888886117bf565b905065ffffffffffff811615610c0257600082815260046020908152604091829020600101805465ffffffffffff191665ffffffffffff85169081179091558251858152918201527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892910160405180910390a1610c1b565b604051634844252360e11b815260040160405180910390fd5b5095945050505050565b600080610c348686868661157a565b9050610c5481610c44600561175d565b610c4e600461175d565b17611780565b506000818152600460205260409020805460ff60f01b1916600160f01b17905530610c7d610a02565b6001600160a01b031614610d075760005b8651811015610d0557306001600160a01b0316878281518110610cb357610cb3613ce0565b60200260200101516001600160a01b031603610cfd57610cfd858281518110610cde57610cde613ce0565b60200260200101518051906020012060056117ce90919063ffffffff16565b600101610c8e565b505b610d14818787878761183f565b30610d1d610a02565b6001600160a01b031614158015610d4957506005546001600160801b03808216600160801b9092041614155b15610d545760006005555b6040518181527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f906020015b60405180910390a195945050505050565b600090815260046020526040902054600160a01b900465ffffffffffff1690565b6000610a1660085465ffffffffffff1690565b6000610a6782611853565b600080610ddf8686868661157a565b9050610def81610b75600061175d565b506000818152600460205260409020546001600160a01b03163314610e2e5760405163233d98e360e01b81523360048201526024015b60405180910390fd5b610e3a86868686611992565b9695505050505050565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634bf5d7e96040518163ffffffff1660e01b8152600401600060405180830381865afa925050508015610ec557506040513d6000823e601f3d908101601f19168201604052610ec29190810190613cf6565b60015b610f01575060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b919050565b600080339050610f27848285604051806020016040528060008152506119a9565b949350505050565b6000806110128761100c7f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a8118c8c8c610f848e6001600160a01b0316600090815260026020526040902080546001810190915590565b8d8d604051610f94929190613d63565b60405180910390208c80519060200120604051602001610ff19796959493929190968752602087019590955260ff9390931660408601526001600160a01b03919091166060850152608084015260a083015260c082015260e00190565b604051602081830303815290604052805190602001206119cc565b856119f9565b90508061103d576040516394ab6c0760e01b81526001600160a01b0388166004820152602401610e25565b61108189888a89898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b9250611a51915050565b9998505050505050505050565b6000803390506110d887828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250611a51915050565b979650505050505050565b600a805460009182906110f7600184613d89565b8154811061110757611107613ce0565b6000918252602090912001805490915065ffffffffffff811690600160301b90046001600160d01b031685821161114a576001600160d01b031695945050505050565b61115e61115687611b2e565b600a90611b65565b6001600160d01b03169695505050505050565b61117961164d565b610a7e81611c1a565b600080339050610e3a86828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119a992505050565b6000336111d78184611c80565b6111ff5760405163d9b3955760e01b81526001600160a01b0382166004820152602401610e25565b600061122682600161120f61139f565b6112199190613d9c565b65ffffffffffff166115c5565b90506000611232611468565b90508082101561126e57604051636121770b60e11b81526001600160a01b03841660048201526024810183905260448101829052606401610e25565b61127b8888888887611d6b565b98975050505050505050565b60006060806000806000606061129b611f8b565b6112a3611fb8565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6000806113598461100c7ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d78989896113228b6001600160a01b0316600090815260026020526040902080546001810190915590565b60408051602081019690965285019390935260ff90911660608401526001600160a01b0316608083015260a082015260c001610ff1565b905080611384576040516394ab6c0760e01b81526001600160a01b0385166004820152602401610e25565b610e3a868587604051806020016040528060008152506119a9565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166391ddadf46040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561141b575060408051601f3d908101601f1916820190925261141891810190613dc2565b60015b610f0157610a16611fe5565b6000610f27848484611ff0565b6000611440600a612086565b6001600160d01b0316905090565b61145661164d565b610a7e816120bf565b60006001610a67565b6000610a1660075490565b60003061147e610a02565b6001600160a01b0316146114a557604051637485328f60e11b815260040160405180910390fd5b5063bc197c8160e01b95945050505050565b6000818152600460205260408120546114ec90600160d01b810463ffffffff1690600160a01b900465ffffffffffff16613ddf565b65ffffffffffff1692915050565b61150261164d565b600080856001600160a01b0316858585604051611520929190613d63565b60006040518083038185875af1925050503d806000811461155d576040519150601f19603f3d011682016040523d82523d6000602084013e611562565b606091505b50915091506115718282612128565b50505050505050565b6000848484846040516020016115939493929190613e92565b60408051601f19818403018152919052805160209091012095945050505050565b6115bc61164d565b610a7e81612144565b60006115e683836115e160408051602081019091526000815290565b611ff0565b9392505050565b6115f561164d565b610a7e816121e2565b600030611609610a02565b6001600160a01b03161461163057604051637485328f60e11b815260040160405180910390fd5b5063f23a6e6160e01b95945050505050565b6000610a6782612223565b33611656610a02565b6001600160a01b03161461167f576040516347096e4760e01b8152336004820152602401610e25565b30611688610a02565b6001600160a01b0316146116c557600080366040516116a8929190613d63565b604051809103902090505b806116be60056122cd565b036116b357505b565b6064808211156116f45760405163243e544560e01b81526004810183905260248101829052604401610e25565b60006116fe611434565b905061171d61170b61139f565b6117148561234b565b600a919061237f565b505060408051828152602081018590527f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997910160405180910390a1505050565b60008160078111156117715761177161362e565b600160ff919091161b92915050565b60008061178c84610dc5565b905060008361179a8361175d565b16036115e6578381846040516331b75e4d60e01b8152600401610e2593929190613edd565b6000610e3a868686868661239a565b81546001600160801b03600160801b82048116918116600183019091160361180957604051638acb5f2760e01b815260040160405180910390fd5b6001600160801b03808216600090815260018086016020526040909120939093558354919092018216600160801b029116179055565b61184c8585858585612539565b5050505050565b60008061185f836125cf565b905060058160078111156118755761187561362e565b146118805792915050565b6000838152600c60205260409081902054600b549151632c258a9f60e11b81526004810182905290916001600160a01b03169063584b153e90602401602060405180830381865afa1580156118d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fd9190613eff565b1561190c575060059392505050565b600b54604051632ab0f52960e01b8152600481018390526001600160a01b0390911690632ab0f52990602401602060405180830381865afa158015611955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119799190613eff565b15611988575060079392505050565b5060029392505050565b60006119a085858585612709565b95945050505050565b60006119a0858585856119c760408051602081019091526000815290565b611a51565b6000610a676119d96127a8565b8360405161190160f01b8152600281019290925260228201526042902090565b6000806000611a0885856128d3565b5090925090506000816003811115611a2257611a2261362e565b148015611a405750856001600160a01b0316826001600160a01b0316145b80610e3a5750610e3a868686612920565b6000611a6186610b75600161175d565b506000611a7786611a7189610d91565b85611ff0565b9050611a8687878784876129fb565b8251600003611adb57856001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda488878488604051611ace9493929190613f21565b60405180910390a2610e3a565b856001600160a01b03167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128887848888604051611b1c959493929190613f49565b60405180910390a29695505050505050565b600065ffffffffffff821115611b61576040516306dfcc6560e41b81526030600482015260248101839052604401610e25565b5090565b815460009081816005811115611bc4576000611b8084612afc565b611b8a9085613d89565b60008881526020902090915081015465ffffffffffff9081169087161015611bb457809150611bc2565b611bbf816001613f83565b92505b505b6000611bd287878585612be4565b90508015611c0d57611bf787611be9600184613d89565b600091825260209091200190565b54600160301b90046001600160d01b03166110d8565b6000979650505050505050565b6008546040805165ffffffffffff928316815291831660208301527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a16008805465ffffffffffff191665ffffffffffff92909216919091179055565b80516000906034811015611c98576001915050610a67565b82810160131901516001600160a01b031981166b046e0e4dee0dee6cae47a60f60a31b14611ccb57600192505050610a67565b600080611cd9602885613d89565b90505b83811015611d4a57600080611d10888481518110611cfc57611cfc613ce0565b01602001516001600160f81b031916612c46565b9150915081611d285760019650505050505050610a67565b8060ff166004856001600160a01b0316901b1793505050806001019050611cdc565b50856001600160a01b0316816001600160a01b031614935050505092915050565b6000611d80868686868051906020012061157a565b905084518651141580611d9557508351865114155b80611d9f57508551155b15611dd457855184518651604051630447b05d60e41b8152600481019390935260248301919091526044820152606401610e25565b600081815260046020526040902054600160a01b900465ffffffffffff1615611e1f5780611e0182610dc5565b6040516331b75e4d60e01b8152610e25929190600090600401613edd565b6000611e29610db2565b611e3161139f565b65ffffffffffff16611e439190613f83565b90506000611e5e60085463ffffffff600160301b9091041690565b600084815260046020526040902080546001600160a01b0319166001600160a01b038716178155909150611e9183611b2e565b815465ffffffffffff91909116600160a01b0265ffffffffffff60a01b19909116178155611ebe82612cd8565b815463ffffffff91909116600160d01b0263ffffffff60d01b1990911617815588517f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e090859087908c908c906001600160401b03811115611f2157611f216132f5565b604051908082528060200260200182016040528015611f5457816020015b6060815260200190600190039081611f3f5790505b508c89611f618a82613f83565b8e604051611f7799989796959493929190613f96565b60405180910390a150505095945050505050565b6060610a167f00000000000000000000000000000000000000000000000000000000000000006000612d09565b6060610a167f00000000000000000000000000000000000000000000000000000000000000006001612d09565b6000610a1643611b2e565b60007f0000000000000000000000000000000000000000000000000000000000000000604051630748d63560e31b81526001600160a01b038681166004830152602482018690529190911690633a46b1a890604401602060405180830381865afa158015612062573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f27919061406d565b805460009080156120b6576120a083611be9600184613d89565b54600160301b90046001600160d01b03166115e6565b60009392505050565b600b54604080516001600160a01b03928316815291831660208301527f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401910160405180910390a1600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60608261213d5761213882612db4565b610a67565b5080610a67565b8063ffffffff1660000361216e5760405163f1cfbf0560e01b815260006004820152602401610e25565b6008546040805163ffffffff600160301b9093048316815291831660208301527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a16008805463ffffffff909216600160301b0269ffffffff00000000000019909216919091179055565b60075460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a1600755565b60006064612230836110e3565b604051632394e7a360e21b8152600481018590526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638e539e8c90602401602060405180830381865afa158015612295573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b9919061406d565b6122c39190614086565b610a6791906140b3565b80546000906001600160801b0380821691600160801b9004168103612305576040516375e52f4f60e01b815260040160405180910390fd5b6001600160801b038181166000908152600185810160205260408220805492905585546fffffffffffffffffffffffffffffffff19169301909116919091179092555090565b60006001600160d01b03821115611b61576040516306dfcc6560e41b815260d0600482015260248101839052604401610e25565b60008061238d858585612ddd565b915091505b935093915050565b600080600b60009054906101000a90046001600160a01b03166001600160a01b031663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612414919061406d565b905060003060601b6bffffffffffffffffffffffff19168418600b5460405163b1c5f42760e01b81529192506001600160a01b03169063b1c5f42790612467908a908a908a9060009088906004016140d5565b602060405180830381865afa158015612484573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a8919061406d565b6000898152600c602052604080822092909255600b5491516308f2a0bb60e41b81526001600160a01b0390921691638f2a0bb0916124f3918b918b918b919088908a90600401614123565b600060405180830381600087803b15801561250d57600080fd5b505af1158015612521573d6000803e3d6000fd5b5050505061127b82426125349190613f83565b611b2e565b600b546001600160a01b031663e38335e53486868660003060601b6bffffffffffffffffffffffff191688186040518763ffffffff1660e01b81526004016125859594939291906140d5565b6000604051808303818588803b15801561259e57600080fd5b505af11580156125b2573d6000803e3d6000fd5b50505060009687525050600c602052505060408320929092555050565b6000818152600460205260408120805460ff600160f01b8204811691600160f81b900416811561260457506007949350505050565b801561261557506002949350505050565b600061262086610d91565b90508060000361264657604051636ad0607560e01b815260048101879052602401610e25565b600061265061139f565b65ffffffffffff16905080821061266e575060009695505050505050565b6000612679886114b7565b905081811061269057506001979650505050505050565b61269988612f57565b15806126b957506000888152600960205260409020805460019091015411155b156126cc57506003979650505050505050565b60008881526004602052604090206001015465ffffffffffff166000036126fb57506004979650505050505050565b506005979650505050505050565b60008061271886868686612f8e565b6000818152600c60205260409020549091508015610c1b57600b5460405163c4d252f560e01b8152600481018390526001600160a01b039091169063c4d252f590602401600060405180830381600087803b15801561277657600080fd5b505af115801561278a573d6000803e3d6000fd5b5050506000838152600c602052604081205550509050949350505050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561280157507f000000000000000000000000000000000000000000000000000000000000000046145b1561282b57507f000000000000000000000000000000000000000000000000000000000000000090565b610a16604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b6000806000835160410361290d5760208401516040850151606086015160001a6128ff8882858561303f565b955095509550505050612919565b50508151600091506002905b9250925092565b6000806000856001600160a01b0316858560405160240161294292919061417b565b60408051601f198184030181529181526020820180516001600160e01b0316630b135d3f60e11b179052516129779190614194565b600060405180830381855afa9150503d80600081146129b2576040519150601f19603f3d011682016040523d82523d6000602084013e6129b7565b606091505b50915091508180156129cb57506020815110155b8015610e3a57508051630b135d3f60e11b906129f0908301602090810190840161406d565b149695505050505050565b60008581526009602090815260408083206001600160a01b0388168452600381019092529091205460ff1615612a4f576040516371c6af4960e01b81526001600160a01b0386166004820152602401610e25565b6001600160a01b03851660009081526003820160205260409020805460ff1916600117905560ff8416612a9b5782816000016000828254612a909190613f83565b90915550612af49050565b60001960ff851601612abb5782816001016000828254612a909190613f83565b60011960ff851601612adb5782816002016000828254612a909190613f83565b6040516303599be160e11b815260040160405180910390fd5b505050505050565b600081600003612b0e57506000919050565b60006001612b1b8461310e565b901c6001901b90506001818481612b3457612b3461409d565b048201901c90506001818481612b4c57612b4c61409d565b048201901c90506001818481612b6457612b6461409d565b048201901c90506001818481612b7c57612b7c61409d565b048201901c90506001818481612b9457612b9461409d565b048201901c90506001818481612bac57612bac61409d565b048201901c90506001818481612bc457612bc461409d565b048201901c90506115e681828581612bde57612bde61409d565b046131a2565b60005b81831015612c3e576000612bfb84846131b8565b60008781526020902090915065ffffffffffff86169082015465ffffffffffff161115612c2a57809250612c38565b612c35816001613f83565b93505b50612be7565b509392505050565b60008060f883901c602f81118015612c615750603a8160ff16105b15612c7657600194602f199091019350915050565b8060ff166040108015612c8c575060478160ff16105b15612ca1576001946036199091019350915050565b8060ff166060108015612cb7575060678160ff16105b15612ccc576001946056199091019350915050565b50600093849350915050565b600063ffffffff821115611b61576040516306dfcc6560e41b81526020600482015260248101839052604401610e25565b606060ff8314612d2357612d1c836131d3565b9050610a67565b818054612d2f90613ca6565b80601f0160208091040260200160405190810160405280929190818152602001828054612d5b90613ca6565b8015612da85780601f10612d7d57610100808354040283529160200191612da8565b820191906000526020600020905b815481529060010190602001808311612d8b57829003601f168201915b50505050509050610a67565b805115612dc45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b825460009081908015612efc576000612dfb87611be9600185613d89565b60408051808201909152905465ffffffffffff808216808452600160301b9092046001600160d01b031660208401529192509087161015612e4f57604051632520601d60e01b815260040160405180910390fd5b805165ffffffffffff808816911603612e9b5784612e7288611be9600186613d89565b80546001600160d01b0392909216600160301b0265ffffffffffff909216919091179055612eec565b6040805180820190915265ffffffffffff80881682526001600160d01b0380881660208085019182528b54600181018d5560008d81529190912094519151909216600160301b029216919091179101555b6020015192508391506123929050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a5560008a815291822095519251909316600160301b029190931617920191909155905081612392565b600081815260096020526040812060028101546001820154612f799190613f83565b612f856109ca85610d91565b11159392505050565b600080612f9d8686868661157a565b9050612feb81612fad600761175d565b612fb7600661175d565b612fc1600261175d565b6001612fce6007826141b0565b612fd99060026142ad565b612fe39190613d89565b181818611780565b506000818152600460205260409081902080546001600160f81b0316600160f81b179055517f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90610d809083815260200190565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561307a5750600091506003905082613104565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156130ce573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166130fa57506000925060019150829050613104565b9250600091508190505b9450945094915050565b600080608083901c1561312357608092831c92015b604083901c1561313557604092831c92015b602083901c1561314757602092831c92015b601083901c1561315957601092831c92015b600883901c1561316b57600892831c92015b600483901c1561317d57600492831c92015b600283901c1561318f57600292831c92015b600183901c15610a675760010192915050565b60008183106131b157816115e6565b5090919050565b60006131c760028484186140b3565b6115e690848416613f83565b606060006131e083613212565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b600060ff8216601f811115610a6757604051632cd44ac360e21b815260040160405180910390fd5b60006020828403121561324c57600080fd5b81356001600160e01b0319811681146115e657600080fd5b60006020828403121561327657600080fd5b5035919050565b60005b83811015613298578181015183820152602001613280565b50506000910152565b600081518084526132b981602086016020860161327d565b601f01601f19169290920160200192915050565b6020815260006115e660208301846132a1565b6001600160a01b0381168114610a7e57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613333576133336132f5565b604052919050565b60006001600160401b03821115613354576133546132f5565b50601f01601f191660200190565b60006133756133708461333b565b61330b565b905082815283838301111561338957600080fd5b828260208301376000602084830101529392505050565b600082601f8301126133b157600080fd5b6115e683833560208501613362565b600080600080608085870312156133d657600080fd5b84356133e1816132e0565b935060208501356133f1816132e0565b92506040850135915060608501356001600160401b0381111561341357600080fd5b61341f878288016133a0565b91505092959194509250565b60006001600160401b03821115613444576134446132f5565b5060051b60200190565b600082601f83011261345f57600080fd5b8135602061346f6133708361342b565b8083825260208201915060208460051b87010193508684111561349157600080fd5b602086015b848110156134b65780356134a9816132e0565b8352918301918301613496565b509695505050505050565b600082601f8301126134d257600080fd5b813560206134e26133708361342b565b8083825260208201915060208460051b87010193508684111561350457600080fd5b602086015b848110156134b65780358352918301918301613509565b600082601f83011261353157600080fd5b813560206135416133708361342b565b82815260059290921b8401810191818101908684111561356057600080fd5b8286015b848110156134b65780356001600160401b038111156135835760008081fd5b6135918986838b01016133a0565b845250918301918301613564565b600080600080608085870312156135b557600080fd5b84356001600160401b03808211156135cc57600080fd5b6135d88883890161344e565b955060208701359150808211156135ee57600080fd5b6135fa888389016134c1565b9450604087013591508082111561361057600080fd5b5061361d87828801613520565b949793965093946060013593505050565b634e487b7160e01b600052602160045260246000fd5b6008811061366257634e487b7160e01b600052602160045260246000fd5b9052565b60208101610a678284613644565b6000806040838503121561368757600080fd5b823591506020830135613699816132e0565b809150509250929050565b803560ff81168114610f0157600080fd5b600080604083850312156136c857600080fd5b823591506136d8602084016136a4565b90509250929050565b60008083601f8401126136f357600080fd5b5081356001600160401b0381111561370a57600080fd5b60208301915083602082850101111561372257600080fd5b9250929050565b600080600080600080600060c0888a03121561374457600080fd5b87359650613754602089016136a4565b95506040880135613764816132e0565b945060608801356001600160401b038082111561378057600080fd5b61378c8b838c016136e1565b909650945060808a01359150808211156137a557600080fd5b6137b18b838c016133a0565b935060a08a01359150808211156137c757600080fd5b506137d48a828b016133a0565b91505092959891949750929550565b6000806000806000608086880312156137fb57600080fd5b8535945061380b602087016136a4565b935060408601356001600160401b038082111561382757600080fd5b61383389838a016136e1565b9095509350606088013591508082111561384c57600080fd5b50613859888289016133a0565b9150509295509295909350565b65ffffffffffff81168114610a7e57600080fd5b60006020828403121561388c57600080fd5b81356115e681613866565b600080600080606085870312156138ad57600080fd5b843593506138bd602086016136a4565b925060408501356001600160401b038111156138d857600080fd5b6138e4878288016136e1565b95989497509550505050565b6000806000806080858703121561390657600080fd5b84356001600160401b038082111561391d57600080fd5b6139298883890161344e565b9550602087013591508082111561393f57600080fd5b61394b888389016134c1565b9450604087013591508082111561396157600080fd5b61396d88838901613520565b9350606087013591508082111561398357600080fd5b508501601f8101871361399557600080fd5b61341f87823560208401613362565b6000602082840312156139b657600080fd5b81356115e6816132e0565b60008151808452602080850194506020840160005b838110156139f2578151875295820195908201906001016139d6565b509495945050505050565b60ff60f81b8816815260e060208201526000613a1c60e08301896132a1565b8281036040840152613a2e81896132a1565b606084018890526001600160a01b038716608085015260a0840186905283810360c08501529050613a5f81856139c1565b9a9950505050505050505050565b60008060008060808587031215613a8357600080fd5b84359350613a93602086016136a4565b92506040850135613aa3816132e0565b915060608501356001600160401b0381111561341357600080fd5b600080600060608486031215613ad357600080fd5b8335613ade816132e0565b92506020840135915060408401356001600160401b03811115613b0057600080fd5b613b0c868287016133a0565b9150509250925092565b600080600080600060a08688031215613b2e57600080fd5b8535613b39816132e0565b94506020860135613b49816132e0565b935060408601356001600160401b0380821115613b6557600080fd5b613b7189838a016134c1565b94506060880135915080821115613b8757600080fd5b613b9389838a016134c1565b9350608088013591508082111561384c57600080fd5b60008060008060608587031215613bbf57600080fd5b8435613bca816132e0565b93506020850135925060408501356001600160401b038111156138d857600080fd5b600060208284031215613bfe57600080fd5b813563ffffffff811681146115e657600080fd5b60008060408385031215613c2557600080fd5b8235613c30816132e0565b946020939093013593505050565b600080600080600060a08688031215613c5657600080fd5b8535613c61816132e0565b94506020860135613c71816132e0565b9350604086013592506060860135915060808601356001600160401b03811115613c9a57600080fd5b613859888289016133a0565b600181811c90821680613cba57607f821691505b602082108103613cda57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613d0857600080fd5b81516001600160401b03811115613d1e57600080fd5b8201601f81018413613d2f57600080fd5b8051613d3d6133708261333b565b818152856020838501011115613d5257600080fd5b6119a082602083016020860161327d565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610a6757610a67613d73565b65ffffffffffff828116828216039080821115613dbb57613dbb613d73565b5092915050565b600060208284031215613dd457600080fd5b81516115e681613866565b65ffffffffffff818116838216019080821115613dbb57613dbb613d73565b60008151808452602080850194506020840160005b838110156139f25781516001600160a01b031687529582019590820190600101613e13565b60008282518085526020808601955060208260051b8401016020860160005b84811015613e8557601f19868403018952613e738383516132a1565b98840198925090830190600101613e57565b5090979650505050505050565b608081526000613ea56080830187613dfe565b8281036020840152613eb781876139c1565b90508281036040840152613ecb8186613e38565b91505082606083015295945050505050565b83815260608101613ef16020830185613644565b826040830152949350505050565b600060208284031215613f1157600080fd5b815180151581146115e657600080fd5b84815260ff84166020820152826040820152608060608201526000610e3a60808301846132a1565b85815260ff8516602082015283604082015260a060608201526000613f7160a08301856132a1565b828103608084015261127b81856132a1565b80820180821115610a6757610a67613d73565b60006101208b8352602060018060a01b038c1681850152816040850152613fbf8285018c613dfe565b91508382036060850152613fd3828b6139c1565b915083820360808501528189518084528284019150828160051b850101838c0160005b8381101561402457601f198784030185526140128383516132a1565b94860194925090850190600101613ff6565b505086810360a0880152614038818c613e38565b9450505050508560c08401528460e084015282810361010084015261405d81856132a1565b9c9b505050505050505050505050565b60006020828403121561407f57600080fd5b5051919050565b8082028115828204841417610a6757610a67613d73565b634e487b7160e01b600052601260045260246000fd5b6000826140d057634e487b7160e01b600052601260045260246000fd5b500490565b60a0815260006140e860a0830188613dfe565b82810360208401526140fa81886139c1565b9050828103604084015261410e8187613e38565b60608401959095525050608001529392505050565b60c08152600061413660c0830189613dfe565b828103602084015261414881896139c1565b9050828103604084015261415c8188613e38565b60608401969096525050608081019290925260a0909101529392505050565b828152604060208201526000610f2760408301846132a1565b600082516141a681846020870161327d565b9190910192915050565b60ff8181168382160190811115610a6757610a67613d73565b600181815b808511156142045781600019048211156141ea576141ea613d73565b808516156141f757918102915b93841c93908002906141ce565b509250929050565b60008261421b57506001610a67565b8161422857506000610a67565b816001811461423e576002811461424857614264565b6001915050610a67565b60ff84111561425957614259613d73565b50506001821b610a67565b5060208310610133831016604e8410600b8410161715614287575081810a610a67565b61429183836141c9565b80600019048211156142a5576142a5613d73565b029392505050565b60006115e660ff84168361420c56fea26469706673582212207e5225747b7cf04e0aa9458d081e82f64dc7a4a4bbcdbfddb6c229e2586bbbd864736f6c63430008180033", + "linkReferences": {}, + "deployedLinkReferences": {} + } + \ No newline at end of file diff --git a/src/assets/abis/hb_evm.json b/src/assets/abis/hb_evm.json index 2b22d7b6..25dba5bd 100644 --- a/src/assets/abis/hb_evm.json +++ b/src/assets/abis/hb_evm.json @@ -3,903 +3,966 @@ "contractName": "HBEVM_token", "sourceName": "contracts/Token.sol", "abi": [ - { - "inputs": [ - { - "internalType": "string", - "name": "name", - "type": "string" - }, - { - "internalType": "string", - "name": "symbol", - "type": "string" - }, - { - "internalType": "address[]", - "name": "initialMembers", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "initialAmounts", - "type": "uint256[]" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "CheckpointUnorderedInsertion", - "type": "error" - }, - { - "inputs": [], - "name": "ECDSAInvalidSignature", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "length", - "type": "uint256" - } - ], - "name": "ECDSAInvalidSignatureLength", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "ECDSAInvalidSignatureS", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "increasedSupply", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "cap", - "type": "uint256" - } - ], - "name": "ERC20ExceededSafeSupply", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "allowance", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "needed", - "type": "uint256" - } - ], - "name": "ERC20InsufficientAllowance", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "balance", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "needed", - "type": "uint256" - } - ], - "name": "ERC20InsufficientBalance", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "approver", - "type": "address" - } - ], - "name": "ERC20InvalidApprover", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "ERC20InvalidReceiver", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "ERC20InvalidSender", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "ERC20InvalidSpender", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "ERC2612ExpiredSignature", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "signer", - "type": "address" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "ERC2612InvalidSigner", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "timepoint", - "type": "uint256" - }, - { - "internalType": "uint48", - "name": "clock", - "type": "uint48" - } - ], - "name": "ERC5805FutureLookup", - "type": "error" - }, - { - "inputs": [], - "name": "ERC6372InconsistentClock", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "currentNonce", - "type": "uint256" - } - ], - "name": "InvalidAccountNonce", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidShortString", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "bits", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "SafeCastOverflowedUintDowncast", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "str", - "type": "string" - } - ], - "name": "StringTooLong", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "expiry", - "type": "uint256" - } - ], - "name": "VotesExpiredSignature", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "delegator", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "fromDelegate", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "toDelegate", - "type": "address" - } - ], - "name": "DelegateChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "delegate", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "previousVotes", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newVotes", - "type": "uint256" - } - ], - "name": "DelegateVotesChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "EIP712DomainChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "inputs": [], - "name": "CLOCK_MODE", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DOMAIN_SEPARATOR", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "uint8", + "name": "decimals_", + "type": "uint8" + }, + { + "internalType": "address[]", + "name": "initialMembers", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "initialAmounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "CheckpointUnorderedInsertion", + "type": "error" + }, + { + "inputs": [], + "name": "ECDSAInvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "ECDSAInvalidSignatureLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "ECDSAInvalidSignatureS", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "increasedSupply", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "cap", + "type": "uint256" + } + ], + "name": "ERC20ExceededSafeSupply", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint32", - "name": "pos", - "type": "uint32" - } - ], - "name": "checkpoints", - "outputs": [ - { - "components": [ - { - "internalType": "uint48", - "name": "_key", - "type": "uint48" - }, - { - "internalType": "uint208", - "name": "_value", - "type": "uint208" - } - ], - "internalType": "struct Checkpoints.Checkpoint208", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientAllowance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "approver", + "type": "address" + } + ], + "name": "ERC20InvalidApprover", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "ERC20InvalidReceiver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "ERC20InvalidSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "ERC20InvalidSpender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "ERC2612ExpiredSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "signer", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "ERC2612InvalidSigner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "timepoint", + "type": "uint256" + }, + { + "internalType": "uint48", "name": "clock", - "outputs": [ - { - "internalType": "uint48", - "name": "", - "type": "uint48" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "delegatee", - "type": "address" - } - ], + "type": "uint48" + } + ], + "name": "ERC5805FutureLookup", + "type": "error" + }, + { + "inputs": [], + "name": "ERC6372InconsistentClock", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "currentNonce", + "type": "uint256" + } + ], + "name": "InvalidAccountNonce", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidShortString", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "bits", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "SafeCastOverflowedUintDowncast", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "str", + "type": "string" + } + ], + "name": "StringTooLong", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + } + ], + "name": "VotesExpiredSignature", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fromDelegate", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "toDelegate", + "type": "address" + } + ], + "name": "DelegateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", "name": "delegate", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "delegatee", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "expiry", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "delegateBySig", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "delegates", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "eip712Domain", - "outputs": [ - { - "internalType": "bytes1", - "name": "fields", - "type": "bytes1" - }, - { - "internalType": "string", - "name": "name", - "type": "string" - }, - { - "internalType": "string", - "name": "version", - "type": "string" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "verifyingContract", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "salt", - "type": "bytes32" - }, - { - "internalType": "uint256[]", - "name": "extensions", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "timepoint", - "type": "uint256" - } - ], - "name": "getPastTotalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "timepoint", - "type": "uint256" - } - ], - "name": "getPastVotes", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "getVotes", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "previousVotes", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newVotes", + "type": "uint256" + } + ], + "name": "DelegateVotesChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EIP712DomainChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "CLOCK_MODE", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint32", + "name": "pos", + "type": "uint32" + } + ], + "name": "checkpoints", + "outputs": [ + { + "components": [ + { + "internalType": "uint48", + "name": "_key", + "type": "uint48" + }, + { + "internalType": "uint208", + "name": "_value", + "type": "uint208" + } + ], + "internalType": "struct Checkpoints.Checkpoint208", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "clock", + "outputs": [ + { + "internalType": "uint48", + "name": "", + "type": "uint48" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatee", + "type": "address" + } + ], + "name": "delegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatee", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "delegateBySig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "delegates", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "nonces", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "numCheckpoints", - "outputs": [ - { - "internalType": "uint32", - "name": "", - "type": "uint32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "timepoint", + "type": "uint256" + } + ], + "name": "getPastTotalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "timepoint", + "type": "uint256" + } + ], + "name": "getPastVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isTransferable", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "numCheckpoints", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } ], - "bytecode": "0x6101606040523480156200001257600080fd5b506040516200583b3803806200583b8339818101604052810190620000389190620014eb565b83806040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250868681600390816200008391906200181a565b5080600490816200009591906200181a565b505050620000ae6005836200021c60201b90919060201c565b6101208181525050620000cc6006826200021c60201b90919060201c565b6101408181525050818051906020012060e08181525050808051906020012061010081815250504660a081815250506200010b6200027460201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050505050805182511462000190576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001879062001988565b60405180910390fd5b60005b82518163ffffffff1610156200021157620001fb838263ffffffff1681518110620001c357620001c2620019aa565b5b6020026020010151838363ffffffff1681518110620001e757620001e6620019aa565b5b6020026020010151620002d160201b60201c565b8080620002089062001a18565b91505062000193565b505050505062001ec1565b600060208351101562000242576200023a836200035e60201b60201c565b90506200026e565b826200025483620003cb60201b60201c565b60000190816200026591906200181a565b5060ff60001b90505b92915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60e051610100514630604051602001620002b695949392919062001a86565b60405160208183030381529060405280519060200120905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620003465760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016200033d919062001ae3565b60405180910390fd5b6200035a60008383620003d560201b60201c565b5050565b600080829050601f81511115620003ae57826040517f305a27a9000000000000000000000000000000000000000000000000000000008152600401620003a5919062001b41565b60405180910390fd5b805181620003bc9062001b97565b60001c1760001b915050919050565b6000819050919050565b620003e8838383620003ed60201b60201c565b505050565b62000400838383620004c260201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620004aa57600062000447620006f260201b60201c565b905060006200045b620006fc60201b60201c565b905080821115620004a75781816040517f1cb15d260000000000000000000000000000000000000000000000000000000081526004016200049e92919062001c07565b60405180910390fd5b50505b620004bd8383836200072060201b60201c565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620005185780600260008282546200050b919062001c34565b92505081905550620005ee565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015620005a7578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016200059e9392919062001c6f565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000639578060026000828254039250508190555062000686565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620006e5919062001cac565b60405180910390a3505050565b6000600254905090565b600079ffffffffffffffffffffffffffffffffffffffffffffffffffff8016905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620007875762000784600a6200082660201b62000d971762000778846200083e60201b60201c565b620008af60201b60201c565b50505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620007ee57620007eb600a620008ff60201b62000dad17620007df846200083e60201b60201c565b620008af60201b60201c565b50505b6200082162000803846200091760201b60201c565b62000814846200091760201b60201c565b836200098060201b60201c565b505050565b6000818362000836919062001cef565b905092915050565b600079ffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115620008a75760d0826040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526004016200089e92919062001d94565b60405180910390fd5b819050919050565b600080620008f3620008c662000c3360201b60201c565b620008e2620008db8862000c4a60201b60201c565b868860201c565b8762000cbe60201b9092919060201c565b91509150935093915050565b600081836200090f919062001dc1565b905092915050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015620009bd5750600081115b1562000c2e57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000af85760008062000a67600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020620008ff60201b62000dad1762000a5b866200083e60201b60201c565b620008af60201b60201c565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff16915079ffffffffffffffffffffffffffffffffffffffffffffffffffff1691508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000aed92919062001c07565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000c2d5760008062000b9c600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206200082660201b62000d971762000b90866200083e60201b60201c565b620008af60201b60201c565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff16915079ffffffffffffffffffffffffffffffffffffffffffffffffffff1691508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000c2292919062001c07565b60405180910390a250505b5b505050565b600062000c4562000ce360201b60201c565b905090565b600080826000018054905090506000811462000cb35762000c838360000160018362000c77919062001e16565b62000cfb60201b60201c565b60000160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff1662000cb6565b60005b915050919050565b60008062000cd785600001858562000d1060201b60201c565b91509150935093915050565b600062000cf643620010aa60201b60201c565b905090565b60008260005281602060002001905092915050565b600080600085805490509050600081111562000fba57600062000d488760018462000d3c919062001e16565b62000cfb60201b60201c565b6040518060400160405290816000820160009054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020016000820160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff168152505090508565ffffffffffff16816000015165ffffffffffff16111562000e38576040517f2520601d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8565ffffffffffff16816000015165ffffffffffff160362000ec8578462000e758860018562000e69919062001e16565b62000cfb60201b60201c565b60000160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555062000fa8565b8660405180604001604052808865ffffffffffff1681526020018779ffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b806020015185935093505050620010a2565b8560405180604001604052808765ffffffffffff1681526020018679ffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550505060008492509250505b935093915050565b600065ffffffffffff8016821115620010ff576030826040517f6dfcc650000000000000000000000000000000000000000000000000000000008152600401620010f692919062001e94565b60405180910390fd5b819050919050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620011708262001125565b810181811067ffffffffffffffff8211171562001192576200119162001136565b5b80604052505050565b6000620011a762001107565b9050620011b5828262001165565b919050565b600067ffffffffffffffff821115620011d857620011d762001136565b5b620011e38262001125565b9050602081019050919050565b60005b8381101562001210578082015181840152602081019050620011f3565b60008484015250505050565b6000620012336200122d84620011ba565b6200119b565b90508281526020810184848401111562001252576200125162001120565b5b6200125f848285620011f0565b509392505050565b600082601f8301126200127f576200127e6200111b565b5b8151620012918482602086016200121c565b91505092915050565b600067ffffffffffffffff821115620012b857620012b762001136565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620012fb82620012ce565b9050919050565b6200130d81620012ee565b81146200131957600080fd5b50565b6000815190506200132d8162001302565b92915050565b60006200134a62001344846200129a565b6200119b565b9050808382526020820190506020840283018581111562001370576200136f620012c9565b5b835b818110156200139d57806200138888826200131c565b84526020840193505060208101905062001372565b5050509392505050565b600082601f830112620013bf57620013be6200111b565b5b8151620013d184826020860162001333565b91505092915050565b600067ffffffffffffffff821115620013f857620013f762001136565b5b602082029050602081019050919050565b6000819050919050565b6200141e8162001409565b81146200142a57600080fd5b50565b6000815190506200143e8162001413565b92915050565b60006200145b6200145584620013da565b6200119b565b90508083825260208201905060208402830185811115620014815762001480620012c9565b5b835b81811015620014ae57806200149988826200142d565b84526020840193505060208101905062001483565b5050509392505050565b600082601f830112620014d057620014cf6200111b565b5b8151620014e284826020860162001444565b91505092915050565b6000806000806080858703121562001508576200150762001111565b5b600085015167ffffffffffffffff81111562001529576200152862001116565b5b620015378782880162001267565b945050602085015167ffffffffffffffff8111156200155b576200155a62001116565b5b620015698782880162001267565b935050604085015167ffffffffffffffff8111156200158d576200158c62001116565b5b6200159b87828801620013a7565b925050606085015167ffffffffffffffff811115620015bf57620015be62001116565b5b620015cd87828801620014b8565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200162c57607f821691505b602082108103620016425762001641620015e4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620016ac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200166d565b620016b886836200166d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620016fb620016f5620016ef8462001409565b620016d0565b62001409565b9050919050565b6000819050919050565b6200171783620016da565b6200172f620017268262001702565b8484546200167a565b825550505050565b600090565b6200174662001737565b620017538184846200170c565b505050565b5b818110156200177b576200176f6000826200173c565b60018101905062001759565b5050565b601f821115620017ca57620017948162001648565b6200179f846200165d565b81016020851015620017af578190505b620017c7620017be856200165d565b83018262001758565b50505b505050565b600082821c905092915050565b6000620017ef60001984600802620017cf565b1980831691505092915050565b60006200180a8383620017dc565b9150826002028217905092915050565b6200182582620015d9565b67ffffffffffffffff81111562001841576200184062001136565b5b6200184d825462001613565b6200185a8282856200177f565b600060209050601f8311600181146200189257600084156200187d578287015190505b620018898582620017fc565b865550620018f9565b601f198416620018a28662001648565b60005b82811015620018cc57848901518255600182019150602085019450602081019050620018a5565b86831015620018ec5784890151620018e8601f891682620017dc565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f696e697469616c416d6f756e7473206d757374206265206173206d616e79206160008201527f7320696e697469616c4d656d6265727300000000000000000000000000000000602082015250565b60006200197060308362001901565b91506200197d8262001912565b604082019050919050565b60006020820190508181036000830152620019a38162001961565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600063ffffffff82169050919050565b600062001a258262001a08565b915063ffffffff820362001a3e5762001a3d620019d9565b5b600182019050919050565b6000819050919050565b62001a5e8162001a49565b82525050565b62001a6f8162001409565b82525050565b62001a8081620012ee565b82525050565b600060a08201905062001a9d600083018862001a53565b62001aac602083018762001a53565b62001abb604083018662001a53565b62001aca606083018562001a64565b62001ad9608083018462001a75565b9695505050505050565b600060208201905062001afa600083018462001a75565b92915050565b600062001b0d82620015d9565b62001b19818562001901565b935062001b2b818560208601620011f0565b62001b368162001125565b840191505092915050565b6000602082019050818103600083015262001b5d818462001b00565b905092915050565b600081519050919050565b6000819050602082019050919050565b600062001b8e825162001a49565b80915050919050565b600062001ba48262001b65565b8262001bb08462001b70565b905062001bbd8162001b80565b9250602082101562001c005762001bfb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026200166d565b831692505b5050919050565b600060408201905062001c1e600083018562001a64565b62001c2d602083018462001a64565b9392505050565b600062001c418262001409565b915062001c4e8362001409565b925082820190508082111562001c695762001c68620019d9565b5b92915050565b600060608201905062001c86600083018662001a75565b62001c95602083018562001a64565b62001ca4604083018462001a64565b949350505050565b600060208201905062001cc3600083018462001a64565b92915050565b600079ffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b600062001cfc8262001cc9565b915062001d098362001cc9565b9250828201905079ffffffffffffffffffffffffffffffffffffffffffffffffffff81111562001d3e5762001d3d620019d9565b5b92915050565b6000819050919050565b600060ff82169050919050565b600062001d7c62001d7662001d708462001d44565b620016d0565b62001d4e565b9050919050565b62001d8e8162001d5b565b82525050565b600060408201905062001dab600083018562001d83565b62001dba602083018462001a64565b9392505050565b600062001dce8262001cc9565b915062001ddb8362001cc9565b9250828203905079ffffffffffffffffffffffffffffffffffffffffffffffffffff81111562001e105762001e0f620019d9565b5b92915050565b600062001e238262001409565b915062001e308362001409565b925082820390508181111562001e4b5762001e4a620019d9565b5b92915050565b6000819050919050565b600062001e7c62001e7662001e708462001e51565b620016d0565b62001d4e565b9050919050565b62001e8e8162001e5b565b82525050565b600060408201905062001eab600083018562001e83565b62001eba602083018462001a64565b9392505050565b60805160a05160c05160e05161010051610120516101405161391f62001f1c60003960006113c401526000611389015260006117e5015260006117c401526000610f6901526000610fbf01526000610fe8015261391f6000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806370a08231116100c35780639ab24eb01161007c5780639ab24eb01461040b578063a9059cbb1461043b578063c3cda5201461046b578063d505accf14610487578063dd62ed3e146104a3578063f1127ed8146104d357610158565b806370a082311461031b5780637ecebe001461034b57806384b0196e1461037b5780638e539e8c1461039f57806391ddadf4146103cf57806395d89b41146103ed57610158565b80633a46b1a8116101155780633a46b1a81461023557806340c10f19146102655780634bf5d7e914610281578063587cde1e1461029f5780635c19a95c146102cf5780636fcfff45146102eb57610158565b806306fdde031461015d578063095ea7b31461017b57806318160ddd146101ab57806323b872dd146101c9578063313ce567146101f95780633644e51514610217575b600080fd5b610165610503565b6040516101729190612bc9565b60405180910390f35b61019560048036038101906101909190612c84565b610595565b6040516101a29190612cdf565b60405180910390f35b6101b36105b8565b6040516101c09190612d09565b60405180910390f35b6101e360048036038101906101de9190612d24565b6105c2565b6040516101f09190612cdf565b60405180910390f35b6102016105f1565b60405161020e9190612d93565b60405180910390f35b61021f6105fa565b60405161022c9190612dc7565b60405180910390f35b61024f600480360381019061024a9190612c84565b610609565b60405161025c9190612d09565b60405180910390f35b61027f600480360381019061027a9190612c84565b6106e2565b005b6102896106f0565b6040516102969190612bc9565b60405180910390f35b6102b960048036038101906102b49190612de2565b610784565b6040516102c69190612e1e565b60405180910390f35b6102e960048036038101906102e49190612de2565b6107ed565b005b61030560048036038101906103009190612de2565b610807565b6040516103129190612e58565b60405180910390f35b61033560048036038101906103309190612de2565b610819565b6040516103429190612d09565b60405180910390f35b61036560048036038101906103609190612de2565b610861565b6040516103729190612d09565b60405180910390f35b610383610873565b6040516103969796959493929190612f6c565b60405180910390f35b6103b960048036038101906103b49190612ff0565b61091d565b6040516103c69190612d09565b60405180910390f35b6103d76109b8565b6040516103e4919061303e565b60405180910390f35b6103f56109c7565b6040516104029190612bc9565b60405180910390f35b61042560048036038101906104209190612de2565b610a59565b6040516104329190612d09565b60405180910390f35b61045560048036038101906104509190612c84565b610ac5565b6040516104629190612cdf565b60405180910390f35b610485600480360381019061048091906130b1565b610ae8565b005b6104a1600480360381019061049c919061313e565b610bae565b005b6104bd60048036038101906104b891906131e0565b610cf6565b6040516104ca9190612d09565b60405180910390f35b6104ed60048036038101906104e8919061324c565b610d7d565b6040516104fa91906132ff565b60405180910390f35b60606003805461051290613349565b80601f016020809104026020016040519081016040528092919081815260200182805461053e90613349565b801561058b5780601f106105605761010080835404028352916020019161058b565b820191906000526020600020905b81548152906001019060200180831161056e57829003601f168201915b5050505050905090565b6000806105a0610dc3565b90506105ad818585610dcb565b600191505092915050565b6000600254905090565b6000806105cd610dc3565b90506105da858285610ddd565b6105e5858585610e71565b60019150509392505050565b60006012905090565b6000610604610f65565b905090565b6000806106146109b8565b90508065ffffffffffff1683106106645782816040517fecd3f81e00000000000000000000000000000000000000000000000000000000815260040161065b92919061337a565b60405180910390fd5b6106bd6106708461101c565b600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061107690919063ffffffff16565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff1691505092915050565b6106ec8282611170565b5050565b60606106fa6111f2565b65ffffffffffff1661070a6109b8565b65ffffffffffff1614610749576040517f6ff0714000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060400160405280601d81526020017f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000815250905090565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107f7610dc3565b90506108038183611202565b5050565b600061081282611316565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061086c8261136e565b9050919050565b600060608060008060006060610887611380565b61088f6113bb565b46306000801b600067ffffffffffffffff8111156108b0576108af6133a3565b5b6040519080825280602002602001820160405280156108de5781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b6000806109286109b8565b90508065ffffffffffff1683106109785782816040517fecd3f81e00000000000000000000000000000000000000000000000000000000815260040161096f92919061337a565b60405180910390fd5b6109946109848461101c565b600a61107690919063ffffffff16565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b60006109c26111f2565b905090565b6060600480546109d690613349565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0290613349565b8015610a4f5780601f10610a2457610100808354040283529160200191610a4f565b820191906000526020600020905b815481529060010190602001808311610a3257829003601f168201915b5050505050905090565b6000610aa2600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206113f6565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff169050919050565b600080610ad0610dc3565b9050610add818585610e71565b600191505092915050565b83421115610b2d57836040517f4683af0e000000000000000000000000000000000000000000000000000000008152600401610b249190612d09565b60405180910390fd5b6000610b8f610b877fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610b6c94939291906133d2565b6040516020818303038152906040528051906020012061145e565b858585611478565b9050610b9b81876114a8565b610ba58188611202565b50505050505050565b83421115610bf357836040517f62791302000000000000000000000000000000000000000000000000000000008152600401610bea9190612d09565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610c228c611500565b89604051602001610c3896959493929190613417565b6040516020818303038152906040528051906020012090506000610c5b8261145e565b90506000610c6b82878787611478565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cdf57808a6040517f4b800e46000000000000000000000000000000000000000000000000000000008152600401610cd6929190613478565b60405180910390fd5b610cea8a8a8a610dcb565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610d85612afb565b610d8f8383611557565b905092915050565b60008183610da591906134d0565b905092915050565b60008183610dbb919061351e565b905092915050565b600033905090565b610dd883838360016115b8565b505050565b6000610de98484610cf6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e6b5781811015610e5b578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610e529392919061356c565b60405180910390fd5b610e6a848484840360006115b8565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ee35760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610eda9190612e1e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f555760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610f4c9190612e1e565b60405180910390fd5b610f6083838361178f565b505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610fe157507f000000000000000000000000000000000000000000000000000000000000000046145b1561100e577f00000000000000000000000000000000000000000000000000000000000000009050611019565b61101661179f565b90505b90565b600065ffffffffffff801682111561106e576030826040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526004016110659291906135e8565b60405180910390fd5b819050919050565b6000808360000180549050905060008082905060058311156110fe57600061109d84611835565b846110a89190613611565b90506110b7876000018261192e565b60000160009054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1610156110ec578091506110fc565b6001816110f99190613645565b92505b505b600061110f87600001878585611943565b905060008114611161576111328760000160018361112d9190613611565b61192e565b60000160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff16611164565b60005b94505050505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111e25760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016111d99190612e1e565b60405180910390fd5b6111ee6000838361178f565b5050565b60006111fd4361101c565b905090565b600061120d83610784565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611311818361130c866119bc565b6119ce565b505050565b6000611367611362600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611c47565b611c58565b9050919050565b600061137982611cb0565b9050919050565b60606113b660057f0000000000000000000000000000000000000000000000000000000000000000611cf990919063ffffffff16565b905090565b60606113f160067f0000000000000000000000000000000000000000000000000000000000000000611cf990919063ffffffff16565b905090565b6000808260000180549050905060008114611453576114248360000160018361141f9190613611565b61192e565b60000160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff16611456565b60005b915050919050565b600061147161146b610f65565b83611da9565b9050919050565b60008060008061148a88888888611dea565b92509250925061149a8282611ede565b829350505050949350505050565b60006114b383611500565b90508082146114fb5782816040517f752d88c00000000000000000000000000000000000000000000000000000000081526004016114f2929190613679565b60405180910390fd5b505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050559050919050565b61155f612afb565b6115b082600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061204290919063ffffffff16565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361162a5760006040517fe602df050000000000000000000000000000000000000000000000000000000081526004016116219190612e1e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361169c5760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016116939190612e1e565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015611789578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516117809190612d09565b60405180910390a35b50505050565b61179a838383612117565b505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000463060405160200161181a9594939291906136a2565b60405160208183030381529060405280519060200120905090565b60008082036118475760009050611929565b60006001611854846121c8565b901c6001901b9050600181848161186e5761186d6136f5565b5b048201901c90506001818481611887576118866136f5565b5b048201901c905060018184816118a05761189f6136f5565b5b048201901c905060018184816118b9576118b86136f5565b5b048201901c905060018184816118d2576118d16136f5565b5b048201901c905060018184816118eb576118ea6136f5565b5b048201901c90506001818481611904576119036136f5565b5b048201901c90506119258182858161191f5761191e6136f5565b5b046122a9565b9150505b919050565b60008260005281602060002001905092915050565b60005b818310156119b157600061195a84846122c2565b90508465ffffffffffff1661196f878361192e565b60000160009054906101000a900465ffffffffffff1665ffffffffffff16111561199b578092506119ab565b6001816119a89190613645565b93505b50611946565b819050949350505050565b60006119c782610819565b9050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611a0a5750600081115b15611c4257600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611b2857600080611a99600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610dad611a94866122e8565b612356565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff16915079ffffffffffffffffffffffffffffffffffffffffffffffffffff1691508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611b1d929190613724565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611c4157600080611bb2600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610d97611bad866122e8565b612356565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff16915079ffffffffffffffffffffffffffffffffffffffffffffffffffff1691508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611c36929190613724565b60405180910390a250505b5b505050565b600081600001805490509050919050565b600063ffffffff8016821115611ca8576020826040517f6dfcc650000000000000000000000000000000000000000000000000000000008152600401611c9f929190613788565b60405180910390fd5b819050919050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060ff60001b8314611d1657611d0f83612396565b9050611da3565b818054611d2290613349565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4e90613349565b8015611d9b5780601f10611d7057610100808354040283529160200191611d9b565b820191906000526020600020905b815481529060010190602001808311611d7e57829003601f168201915b505050505090505b92915050565b60006040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b60008060007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08460001c1115611e2a576000600385925092509250611ed4565b600060018888888860405160008152602001604052604051611e4f94939291906137b1565b6020604051602081039080840390855afa158015611e71573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ec557600060016000801b93509350935050611ed4565b8060008060001b935093509350505b9450945094915050565b60006003811115611ef257611ef16137f6565b5b826003811115611f0557611f046137f6565b5b031561203e5760016003811115611f1f57611f1e6137f6565b5b826003811115611f3257611f316137f6565b5b03611f69576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026003811115611f7d57611f7c6137f6565b5b826003811115611f9057611f8f6137f6565b5b03611fd5578060001c6040517ffce698f7000000000000000000000000000000000000000000000000000000008152600401611fcc9190612d09565b60405180910390fd5b600380811115611fe857611fe76137f6565b5b826003811115611ffb57611ffa6137f6565b5b0361203d57806040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004016120349190612dc7565b60405180910390fd5b5b5050565b61204a612afb565b826000018263ffffffff168154811061206657612065613825565b5b906000526020600020016040518060400160405290816000820160009054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020016000820160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b61212283838361240a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121b85760006121606105b8565b9050600061216c61262f565b9050808211156121b55781816040517f1cb15d260000000000000000000000000000000000000000000000000000000081526004016121ac929190613724565b60405180910390fd5b50505b6121c3838383612653565b505050565b600080600090506000608084901c11156121ea57608083901c92506080810190505b6000604084901c111561220557604083901c92506040810190505b6000602084901c111561222057602083901c92506020810190505b6000601084901c111561223b57601083901c92506010810190505b6000600884901c111561225657600883901c92506008810190505b6000600484901c111561227157600483901c92506004810190505b6000600284901c111561228c57600283901c92506002810190505b6000600184901c11156122a0576001810190505b80915050919050565b60008183106122b857816122ba565b825b905092915050565b600060028284186122d39190613854565b8284166122e09190613645565b905092915050565b600079ffffffffffffffffffffffffffffffffffffffffffffffffffff801682111561234e5760d0826040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526004016123459291906138c0565b60405180910390fd5b819050919050565b60008061238a6123646109b8565b61237a612370886113f6565b868863ffffffff16565b8761270d9092919063ffffffff16565b91509150935093915050565b606060006123a38361272a565b90506000602067ffffffffffffffff8111156123c2576123c16133a3565b5b6040519080825280601f01601f1916602001820160405280156123f45781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361245c5780600260008282546124509190613645565b9250508190555061252f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156124e8578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016124df9392919061356c565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361257857806002600082825403925050819055506125c5565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516126229190612d09565b60405180910390a3505050565b600079ffffffffffffffffffffffffffffffffffffffffffffffffffff8016905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126a05761269d600a610d97612698846122e8565b612356565b50505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126ed576126ea600a610dad6126e5846122e8565b612356565b50505b6127086126f984610784565b61270284610784565b836119ce565b505050565b60008061271e85600001858561277a565b91509150935093915050565b60008060ff8360001c169050601f811115612771576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b6000806000858054905090506000811115612a0b5760006127a7876001846127a29190613611565b61192e565b6040518060400160405290816000820160009054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020016000820160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff168152505090508565ffffffffffff16816000015165ffffffffffff161115612896576040517f2520601d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8565ffffffffffff16816000015165ffffffffffff160361291a57846128c8886001856128c39190613611565b61192e565b60000160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506129fa565b8660405180604001604052808865ffffffffffff1681526020018779ffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b806020015185935093505050612af3565b8560405180604001604052808765ffffffffffff1681526020018679ffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550505060008492509250505b935093915050565b6040518060400160405280600065ffffffffffff168152602001600079ffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b73578082015181840152602081019050612b58565b60008484015250505050565b6000601f19601f8301169050919050565b6000612b9b82612b39565b612ba58185612b44565b9350612bb5818560208601612b55565b612bbe81612b7f565b840191505092915050565b60006020820190508181036000830152612be38184612b90565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c1b82612bf0565b9050919050565b612c2b81612c10565b8114612c3657600080fd5b50565b600081359050612c4881612c22565b92915050565b6000819050919050565b612c6181612c4e565b8114612c6c57600080fd5b50565b600081359050612c7e81612c58565b92915050565b60008060408385031215612c9b57612c9a612beb565b5b6000612ca985828601612c39565b9250506020612cba85828601612c6f565b9150509250929050565b60008115159050919050565b612cd981612cc4565b82525050565b6000602082019050612cf46000830184612cd0565b92915050565b612d0381612c4e565b82525050565b6000602082019050612d1e6000830184612cfa565b92915050565b600080600060608486031215612d3d57612d3c612beb565b5b6000612d4b86828701612c39565b9350506020612d5c86828701612c39565b9250506040612d6d86828701612c6f565b9150509250925092565b600060ff82169050919050565b612d8d81612d77565b82525050565b6000602082019050612da86000830184612d84565b92915050565b6000819050919050565b612dc181612dae565b82525050565b6000602082019050612ddc6000830184612db8565b92915050565b600060208284031215612df857612df7612beb565b5b6000612e0684828501612c39565b91505092915050565b612e1881612c10565b82525050565b6000602082019050612e336000830184612e0f565b92915050565b600063ffffffff82169050919050565b612e5281612e39565b82525050565b6000602082019050612e6d6000830184612e49565b92915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b612ea881612e73565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612ee381612c4e565b82525050565b6000612ef58383612eda565b60208301905092915050565b6000602082019050919050565b6000612f1982612eae565b612f238185612eb9565b9350612f2e83612eca565b8060005b83811015612f5f578151612f468882612ee9565b9750612f5183612f01565b925050600181019050612f32565b5085935050505092915050565b600060e082019050612f81600083018a612e9f565b8181036020830152612f938189612b90565b90508181036040830152612fa78188612b90565b9050612fb66060830187612cfa565b612fc36080830186612e0f565b612fd060a0830185612db8565b81810360c0830152612fe28184612f0e565b905098975050505050505050565b60006020828403121561300657613005612beb565b5b600061301484828501612c6f565b91505092915050565b600065ffffffffffff82169050919050565b6130388161301d565b82525050565b6000602082019050613053600083018461302f565b92915050565b61306281612d77565b811461306d57600080fd5b50565b60008135905061307f81613059565b92915050565b61308e81612dae565b811461309957600080fd5b50565b6000813590506130ab81613085565b92915050565b60008060008060008060c087890312156130ce576130cd612beb565b5b60006130dc89828a01612c39565b96505060206130ed89828a01612c6f565b95505060406130fe89828a01612c6f565b945050606061310f89828a01613070565b935050608061312089828a0161309c565b92505060a061313189828a0161309c565b9150509295509295509295565b600080600080600080600060e0888a03121561315d5761315c612beb565b5b600061316b8a828b01612c39565b975050602061317c8a828b01612c39565b965050604061318d8a828b01612c6f565b955050606061319e8a828b01612c6f565b94505060806131af8a828b01613070565b93505060a06131c08a828b0161309c565b92505060c06131d18a828b0161309c565b91505092959891949750929550565b600080604083850312156131f7576131f6612beb565b5b600061320585828601612c39565b925050602061321685828601612c39565b9150509250929050565b61322981612e39565b811461323457600080fd5b50565b60008135905061324681613220565b92915050565b6000806040838503121561326357613262612beb565b5b600061327185828601612c39565b925050602061328285828601613237565b9150509250929050565b6132958161301d565b82525050565b600079ffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6132ca8161329b565b82525050565b6040820160008201516132e6600085018261328c565b5060208201516132f960208501826132c1565b50505050565b600060408201905061331460008301846132d0565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061336157607f821691505b6020821081036133745761337361331a565b5b50919050565b600060408201905061338f6000830185612cfa565b61339c602083018461302f565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080820190506133e76000830187612db8565b6133f46020830186612e0f565b6134016040830185612cfa565b61340e6060830184612cfa565b95945050505050565b600060c08201905061342c6000830189612db8565b6134396020830188612e0f565b6134466040830187612e0f565b6134536060830186612cfa565b6134606080830185612cfa565b61346d60a0830184612cfa565b979650505050505050565b600060408201905061348d6000830185612e0f565b61349a6020830184612e0f565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134db8261329b565b91506134e68361329b565b9250828201905079ffffffffffffffffffffffffffffffffffffffffffffffffffff811115613518576135176134a1565b5b92915050565b60006135298261329b565b91506135348361329b565b9250828203905079ffffffffffffffffffffffffffffffffffffffffffffffffffff811115613566576135656134a1565b5b92915050565b60006060820190506135816000830186612e0f565b61358e6020830185612cfa565b61359b6040830184612cfa565b949350505050565b6000819050919050565b6000819050919050565b60006135d26135cd6135c8846135a3565b6135ad565b612d77565b9050919050565b6135e2816135b7565b82525050565b60006040820190506135fd60008301856135d9565b61360a6020830184612cfa565b9392505050565b600061361c82612c4e565b915061362783612c4e565b925082820390508181111561363f5761363e6134a1565b5b92915050565b600061365082612c4e565b915061365b83612c4e565b9250828201905080821115613673576136726134a1565b5b92915050565b600060408201905061368e6000830185612e0f565b61369b6020830184612cfa565b9392505050565b600060a0820190506136b76000830188612db8565b6136c46020830187612db8565b6136d16040830186612db8565b6136de6060830185612cfa565b6136eb6080830184612e0f565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006040820190506137396000830185612cfa565b6137466020830184612cfa565b9392505050565b6000819050919050565b600061377261376d6137688461374d565b6135ad565b612d77565b9050919050565b61378281613757565b82525050565b600060408201905061379d6000830185613779565b6137aa6020830184612cfa565b9392505050565b60006080820190506137c66000830187612db8565b6137d36020830186612d84565b6137e06040830185612db8565b6137ed6060830184612db8565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061385f82612c4e565b915061386a83612c4e565b92508261387a576138796136f5565b5b828204905092915050565b6000819050919050565b60006138aa6138a56138a084613885565b6135ad565b612d77565b9050919050565b6138ba8161388f565b82525050565b60006040820190506138d560008301856138b1565b6138e26020830184612cfa565b939250505056fea26469706673582212207a8acb8aebf0ca70a2a2ca038f649d366444e8ce4565803973e3ab0a015303d364736f6c63430008180033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101585760003560e01c806370a08231116100c35780639ab24eb01161007c5780639ab24eb01461040b578063a9059cbb1461043b578063c3cda5201461046b578063d505accf14610487578063dd62ed3e146104a3578063f1127ed8146104d357610158565b806370a082311461031b5780637ecebe001461034b57806384b0196e1461037b5780638e539e8c1461039f57806391ddadf4146103cf57806395d89b41146103ed57610158565b80633a46b1a8116101155780633a46b1a81461023557806340c10f19146102655780634bf5d7e914610281578063587cde1e1461029f5780635c19a95c146102cf5780636fcfff45146102eb57610158565b806306fdde031461015d578063095ea7b31461017b57806318160ddd146101ab57806323b872dd146101c9578063313ce567146101f95780633644e51514610217575b600080fd5b610165610503565b6040516101729190612bc9565b60405180910390f35b61019560048036038101906101909190612c84565b610595565b6040516101a29190612cdf565b60405180910390f35b6101b36105b8565b6040516101c09190612d09565b60405180910390f35b6101e360048036038101906101de9190612d24565b6105c2565b6040516101f09190612cdf565b60405180910390f35b6102016105f1565b60405161020e9190612d93565b60405180910390f35b61021f6105fa565b60405161022c9190612dc7565b60405180910390f35b61024f600480360381019061024a9190612c84565b610609565b60405161025c9190612d09565b60405180910390f35b61027f600480360381019061027a9190612c84565b6106e2565b005b6102896106f0565b6040516102969190612bc9565b60405180910390f35b6102b960048036038101906102b49190612de2565b610784565b6040516102c69190612e1e565b60405180910390f35b6102e960048036038101906102e49190612de2565b6107ed565b005b61030560048036038101906103009190612de2565b610807565b6040516103129190612e58565b60405180910390f35b61033560048036038101906103309190612de2565b610819565b6040516103429190612d09565b60405180910390f35b61036560048036038101906103609190612de2565b610861565b6040516103729190612d09565b60405180910390f35b610383610873565b6040516103969796959493929190612f6c565b60405180910390f35b6103b960048036038101906103b49190612ff0565b61091d565b6040516103c69190612d09565b60405180910390f35b6103d76109b8565b6040516103e4919061303e565b60405180910390f35b6103f56109c7565b6040516104029190612bc9565b60405180910390f35b61042560048036038101906104209190612de2565b610a59565b6040516104329190612d09565b60405180910390f35b61045560048036038101906104509190612c84565b610ac5565b6040516104629190612cdf565b60405180910390f35b610485600480360381019061048091906130b1565b610ae8565b005b6104a1600480360381019061049c919061313e565b610bae565b005b6104bd60048036038101906104b891906131e0565b610cf6565b6040516104ca9190612d09565b60405180910390f35b6104ed60048036038101906104e8919061324c565b610d7d565b6040516104fa91906132ff565b60405180910390f35b60606003805461051290613349565b80601f016020809104026020016040519081016040528092919081815260200182805461053e90613349565b801561058b5780601f106105605761010080835404028352916020019161058b565b820191906000526020600020905b81548152906001019060200180831161056e57829003601f168201915b5050505050905090565b6000806105a0610dc3565b90506105ad818585610dcb565b600191505092915050565b6000600254905090565b6000806105cd610dc3565b90506105da858285610ddd565b6105e5858585610e71565b60019150509392505050565b60006012905090565b6000610604610f65565b905090565b6000806106146109b8565b90508065ffffffffffff1683106106645782816040517fecd3f81e00000000000000000000000000000000000000000000000000000000815260040161065b92919061337a565b60405180910390fd5b6106bd6106708461101c565b600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061107690919063ffffffff16565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff1691505092915050565b6106ec8282611170565b5050565b60606106fa6111f2565b65ffffffffffff1661070a6109b8565b65ffffffffffff1614610749576040517f6ff0714000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060400160405280601d81526020017f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000815250905090565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107f7610dc3565b90506108038183611202565b5050565b600061081282611316565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061086c8261136e565b9050919050565b600060608060008060006060610887611380565b61088f6113bb565b46306000801b600067ffffffffffffffff8111156108b0576108af6133a3565b5b6040519080825280602002602001820160405280156108de5781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b6000806109286109b8565b90508065ffffffffffff1683106109785782816040517fecd3f81e00000000000000000000000000000000000000000000000000000000815260040161096f92919061337a565b60405180910390fd5b6109946109848461101c565b600a61107690919063ffffffff16565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b60006109c26111f2565b905090565b6060600480546109d690613349565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0290613349565b8015610a4f5780601f10610a2457610100808354040283529160200191610a4f565b820191906000526020600020905b815481529060010190602001808311610a3257829003601f168201915b5050505050905090565b6000610aa2600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206113f6565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff169050919050565b600080610ad0610dc3565b9050610add818585610e71565b600191505092915050565b83421115610b2d57836040517f4683af0e000000000000000000000000000000000000000000000000000000008152600401610b249190612d09565b60405180910390fd5b6000610b8f610b877fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610b6c94939291906133d2565b6040516020818303038152906040528051906020012061145e565b858585611478565b9050610b9b81876114a8565b610ba58188611202565b50505050505050565b83421115610bf357836040517f62791302000000000000000000000000000000000000000000000000000000008152600401610bea9190612d09565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610c228c611500565b89604051602001610c3896959493929190613417565b6040516020818303038152906040528051906020012090506000610c5b8261145e565b90506000610c6b82878787611478565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cdf57808a6040517f4b800e46000000000000000000000000000000000000000000000000000000008152600401610cd6929190613478565b60405180910390fd5b610cea8a8a8a610dcb565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610d85612afb565b610d8f8383611557565b905092915050565b60008183610da591906134d0565b905092915050565b60008183610dbb919061351e565b905092915050565b600033905090565b610dd883838360016115b8565b505050565b6000610de98484610cf6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e6b5781811015610e5b578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610e529392919061356c565b60405180910390fd5b610e6a848484840360006115b8565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ee35760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610eda9190612e1e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f555760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610f4c9190612e1e565b60405180910390fd5b610f6083838361178f565b505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610fe157507f000000000000000000000000000000000000000000000000000000000000000046145b1561100e577f00000000000000000000000000000000000000000000000000000000000000009050611019565b61101661179f565b90505b90565b600065ffffffffffff801682111561106e576030826040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526004016110659291906135e8565b60405180910390fd5b819050919050565b6000808360000180549050905060008082905060058311156110fe57600061109d84611835565b846110a89190613611565b90506110b7876000018261192e565b60000160009054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1610156110ec578091506110fc565b6001816110f99190613645565b92505b505b600061110f87600001878585611943565b905060008114611161576111328760000160018361112d9190613611565b61192e565b60000160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff16611164565b60005b94505050505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111e25760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016111d99190612e1e565b60405180910390fd5b6111ee6000838361178f565b5050565b60006111fd4361101c565b905090565b600061120d83610784565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611311818361130c866119bc565b6119ce565b505050565b6000611367611362600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611c47565b611c58565b9050919050565b600061137982611cb0565b9050919050565b60606113b660057f0000000000000000000000000000000000000000000000000000000000000000611cf990919063ffffffff16565b905090565b60606113f160067f0000000000000000000000000000000000000000000000000000000000000000611cf990919063ffffffff16565b905090565b6000808260000180549050905060008114611453576114248360000160018361141f9190613611565b61192e565b60000160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff16611456565b60005b915050919050565b600061147161146b610f65565b83611da9565b9050919050565b60008060008061148a88888888611dea565b92509250925061149a8282611ede565b829350505050949350505050565b60006114b383611500565b90508082146114fb5782816040517f752d88c00000000000000000000000000000000000000000000000000000000081526004016114f2929190613679565b60405180910390fd5b505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050559050919050565b61155f612afb565b6115b082600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061204290919063ffffffff16565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361162a5760006040517fe602df050000000000000000000000000000000000000000000000000000000081526004016116219190612e1e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361169c5760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016116939190612e1e565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015611789578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516117809190612d09565b60405180910390a35b50505050565b61179a838383612117565b505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000463060405160200161181a9594939291906136a2565b60405160208183030381529060405280519060200120905090565b60008082036118475760009050611929565b60006001611854846121c8565b901c6001901b9050600181848161186e5761186d6136f5565b5b048201901c90506001818481611887576118866136f5565b5b048201901c905060018184816118a05761189f6136f5565b5b048201901c905060018184816118b9576118b86136f5565b5b048201901c905060018184816118d2576118d16136f5565b5b048201901c905060018184816118eb576118ea6136f5565b5b048201901c90506001818481611904576119036136f5565b5b048201901c90506119258182858161191f5761191e6136f5565b5b046122a9565b9150505b919050565b60008260005281602060002001905092915050565b60005b818310156119b157600061195a84846122c2565b90508465ffffffffffff1661196f878361192e565b60000160009054906101000a900465ffffffffffff1665ffffffffffff16111561199b578092506119ab565b6001816119a89190613645565b93505b50611946565b819050949350505050565b60006119c782610819565b9050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611a0a5750600081115b15611c4257600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611b2857600080611a99600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610dad611a94866122e8565b612356565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff16915079ffffffffffffffffffffffffffffffffffffffffffffffffffff1691508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611b1d929190613724565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611c4157600080611bb2600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610d97611bad866122e8565b612356565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff16915079ffffffffffffffffffffffffffffffffffffffffffffffffffff1691508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611c36929190613724565b60405180910390a250505b5b505050565b600081600001805490509050919050565b600063ffffffff8016821115611ca8576020826040517f6dfcc650000000000000000000000000000000000000000000000000000000008152600401611c9f929190613788565b60405180910390fd5b819050919050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060ff60001b8314611d1657611d0f83612396565b9050611da3565b818054611d2290613349565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4e90613349565b8015611d9b5780601f10611d7057610100808354040283529160200191611d9b565b820191906000526020600020905b815481529060010190602001808311611d7e57829003601f168201915b505050505090505b92915050565b60006040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b60008060007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08460001c1115611e2a576000600385925092509250611ed4565b600060018888888860405160008152602001604052604051611e4f94939291906137b1565b6020604051602081039080840390855afa158015611e71573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ec557600060016000801b93509350935050611ed4565b8060008060001b935093509350505b9450945094915050565b60006003811115611ef257611ef16137f6565b5b826003811115611f0557611f046137f6565b5b031561203e5760016003811115611f1f57611f1e6137f6565b5b826003811115611f3257611f316137f6565b5b03611f69576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026003811115611f7d57611f7c6137f6565b5b826003811115611f9057611f8f6137f6565b5b03611fd5578060001c6040517ffce698f7000000000000000000000000000000000000000000000000000000008152600401611fcc9190612d09565b60405180910390fd5b600380811115611fe857611fe76137f6565b5b826003811115611ffb57611ffa6137f6565b5b0361203d57806040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004016120349190612dc7565b60405180910390fd5b5b5050565b61204a612afb565b826000018263ffffffff168154811061206657612065613825565b5b906000526020600020016040518060400160405290816000820160009054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020016000820160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b61212283838361240a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121b85760006121606105b8565b9050600061216c61262f565b9050808211156121b55781816040517f1cb15d260000000000000000000000000000000000000000000000000000000081526004016121ac929190613724565b60405180910390fd5b50505b6121c3838383612653565b505050565b600080600090506000608084901c11156121ea57608083901c92506080810190505b6000604084901c111561220557604083901c92506040810190505b6000602084901c111561222057602083901c92506020810190505b6000601084901c111561223b57601083901c92506010810190505b6000600884901c111561225657600883901c92506008810190505b6000600484901c111561227157600483901c92506004810190505b6000600284901c111561228c57600283901c92506002810190505b6000600184901c11156122a0576001810190505b80915050919050565b60008183106122b857816122ba565b825b905092915050565b600060028284186122d39190613854565b8284166122e09190613645565b905092915050565b600079ffffffffffffffffffffffffffffffffffffffffffffffffffff801682111561234e5760d0826040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526004016123459291906138c0565b60405180910390fd5b819050919050565b60008061238a6123646109b8565b61237a612370886113f6565b868863ffffffff16565b8761270d9092919063ffffffff16565b91509150935093915050565b606060006123a38361272a565b90506000602067ffffffffffffffff8111156123c2576123c16133a3565b5b6040519080825280601f01601f1916602001820160405280156123f45781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361245c5780600260008282546124509190613645565b9250508190555061252f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156124e8578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016124df9392919061356c565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361257857806002600082825403925050819055506125c5565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516126229190612d09565b60405180910390a3505050565b600079ffffffffffffffffffffffffffffffffffffffffffffffffffff8016905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126a05761269d600a610d97612698846122e8565b612356565b50505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126ed576126ea600a610dad6126e5846122e8565b612356565b50505b6127086126f984610784565b61270284610784565b836119ce565b505050565b60008061271e85600001858561277a565b91509150935093915050565b60008060ff8360001c169050601f811115612771576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b6000806000858054905090506000811115612a0b5760006127a7876001846127a29190613611565b61192e565b6040518060400160405290816000820160009054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020016000820160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff168152505090508565ffffffffffff16816000015165ffffffffffff161115612896576040517f2520601d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8565ffffffffffff16816000015165ffffffffffff160361291a57846128c8886001856128c39190613611565b61192e565b60000160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506129fa565b8660405180604001604052808865ffffffffffff1681526020018779ffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b806020015185935093505050612af3565b8560405180604001604052808765ffffffffffff1681526020018679ffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550505060008492509250505b935093915050565b6040518060400160405280600065ffffffffffff168152602001600079ffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b73578082015181840152602081019050612b58565b60008484015250505050565b6000601f19601f8301169050919050565b6000612b9b82612b39565b612ba58185612b44565b9350612bb5818560208601612b55565b612bbe81612b7f565b840191505092915050565b60006020820190508181036000830152612be38184612b90565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c1b82612bf0565b9050919050565b612c2b81612c10565b8114612c3657600080fd5b50565b600081359050612c4881612c22565b92915050565b6000819050919050565b612c6181612c4e565b8114612c6c57600080fd5b50565b600081359050612c7e81612c58565b92915050565b60008060408385031215612c9b57612c9a612beb565b5b6000612ca985828601612c39565b9250506020612cba85828601612c6f565b9150509250929050565b60008115159050919050565b612cd981612cc4565b82525050565b6000602082019050612cf46000830184612cd0565b92915050565b612d0381612c4e565b82525050565b6000602082019050612d1e6000830184612cfa565b92915050565b600080600060608486031215612d3d57612d3c612beb565b5b6000612d4b86828701612c39565b9350506020612d5c86828701612c39565b9250506040612d6d86828701612c6f565b9150509250925092565b600060ff82169050919050565b612d8d81612d77565b82525050565b6000602082019050612da86000830184612d84565b92915050565b6000819050919050565b612dc181612dae565b82525050565b6000602082019050612ddc6000830184612db8565b92915050565b600060208284031215612df857612df7612beb565b5b6000612e0684828501612c39565b91505092915050565b612e1881612c10565b82525050565b6000602082019050612e336000830184612e0f565b92915050565b600063ffffffff82169050919050565b612e5281612e39565b82525050565b6000602082019050612e6d6000830184612e49565b92915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b612ea881612e73565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612ee381612c4e565b82525050565b6000612ef58383612eda565b60208301905092915050565b6000602082019050919050565b6000612f1982612eae565b612f238185612eb9565b9350612f2e83612eca565b8060005b83811015612f5f578151612f468882612ee9565b9750612f5183612f01565b925050600181019050612f32565b5085935050505092915050565b600060e082019050612f81600083018a612e9f565b8181036020830152612f938189612b90565b90508181036040830152612fa78188612b90565b9050612fb66060830187612cfa565b612fc36080830186612e0f565b612fd060a0830185612db8565b81810360c0830152612fe28184612f0e565b905098975050505050505050565b60006020828403121561300657613005612beb565b5b600061301484828501612c6f565b91505092915050565b600065ffffffffffff82169050919050565b6130388161301d565b82525050565b6000602082019050613053600083018461302f565b92915050565b61306281612d77565b811461306d57600080fd5b50565b60008135905061307f81613059565b92915050565b61308e81612dae565b811461309957600080fd5b50565b6000813590506130ab81613085565b92915050565b60008060008060008060c087890312156130ce576130cd612beb565b5b60006130dc89828a01612c39565b96505060206130ed89828a01612c6f565b95505060406130fe89828a01612c6f565b945050606061310f89828a01613070565b935050608061312089828a0161309c565b92505060a061313189828a0161309c565b9150509295509295509295565b600080600080600080600060e0888a03121561315d5761315c612beb565b5b600061316b8a828b01612c39565b975050602061317c8a828b01612c39565b965050604061318d8a828b01612c6f565b955050606061319e8a828b01612c6f565b94505060806131af8a828b01613070565b93505060a06131c08a828b0161309c565b92505060c06131d18a828b0161309c565b91505092959891949750929550565b600080604083850312156131f7576131f6612beb565b5b600061320585828601612c39565b925050602061321685828601612c39565b9150509250929050565b61322981612e39565b811461323457600080fd5b50565b60008135905061324681613220565b92915050565b6000806040838503121561326357613262612beb565b5b600061327185828601612c39565b925050602061328285828601613237565b9150509250929050565b6132958161301d565b82525050565b600079ffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6132ca8161329b565b82525050565b6040820160008201516132e6600085018261328c565b5060208201516132f960208501826132c1565b50505050565b600060408201905061331460008301846132d0565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061336157607f821691505b6020821081036133745761337361331a565b5b50919050565b600060408201905061338f6000830185612cfa565b61339c602083018461302f565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080820190506133e76000830187612db8565b6133f46020830186612e0f565b6134016040830185612cfa565b61340e6060830184612cfa565b95945050505050565b600060c08201905061342c6000830189612db8565b6134396020830188612e0f565b6134466040830187612e0f565b6134536060830186612cfa565b6134606080830185612cfa565b61346d60a0830184612cfa565b979650505050505050565b600060408201905061348d6000830185612e0f565b61349a6020830184612e0f565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134db8261329b565b91506134e68361329b565b9250828201905079ffffffffffffffffffffffffffffffffffffffffffffffffffff811115613518576135176134a1565b5b92915050565b60006135298261329b565b91506135348361329b565b9250828203905079ffffffffffffffffffffffffffffffffffffffffffffffffffff811115613566576135656134a1565b5b92915050565b60006060820190506135816000830186612e0f565b61358e6020830185612cfa565b61359b6040830184612cfa565b949350505050565b6000819050919050565b6000819050919050565b60006135d26135cd6135c8846135a3565b6135ad565b612d77565b9050919050565b6135e2816135b7565b82525050565b60006040820190506135fd60008301856135d9565b61360a6020830184612cfa565b9392505050565b600061361c82612c4e565b915061362783612c4e565b925082820390508181111561363f5761363e6134a1565b5b92915050565b600061365082612c4e565b915061365b83612c4e565b9250828201905080821115613673576136726134a1565b5b92915050565b600060408201905061368e6000830185612e0f565b61369b6020830184612cfa565b9392505050565b600060a0820190506136b76000830188612db8565b6136c46020830187612db8565b6136d16040830186612db8565b6136de6060830185612cfa565b6136eb6080830184612e0f565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006040820190506137396000830185612cfa565b6137466020830184612cfa565b9392505050565b6000819050919050565b600061377261376d6137688461374d565b6135ad565b612d77565b9050919050565b61378281613757565b82525050565b600060408201905061379d6000830185613779565b6137aa6020830184612cfa565b9392505050565b60006080820190506137c66000830187612db8565b6137d36020830186612d84565b6137e06040830185612db8565b6137ed6060830184612db8565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061385f82612c4e565b915061386a83612c4e565b92508261387a576138796136f5565b5b828204905092915050565b6000819050919050565b60006138aa6138a56138a084613885565b6135ad565b612d77565b9050919050565b6138ba8161388f565b82525050565b60006040820190506138d560008301856138b1565b6138e26020830184612cfa565b939250505056fea26469706673582212207a8acb8aebf0ca70a2a2ca038f649d366444e8ce4565803973e3ab0a015303d364736f6c63430008180033", + "bytecode": "0x6101606040523480156200001257600080fd5b5060405162002fe238038062002fe2833981016040819052620000359162000ab5565b6040805180820190915260018152603160f81b6020820152859081908187600362000061838262000c19565b50600462000070828262000c19565b506200008291508390506005620001cb565b6101205262000093816006620001cb565b61014052815160208084019190912060e052815190820120610100524660a0526200012160e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60805250503060c05250600b805460ff61ffff60a81b01191660ff851617905560005b82518163ffffffff161015620001bf57620001aa838263ffffffff168151811062000173576200017362000ce5565b6020026020010151838363ffffffff168151811062000196576200019662000ce5565b60200260200101516200020460201b60201c565b80620001b68162000d11565b91505062000144565b50505050505062000e0a565b6000602083511015620001eb57620001e38362000246565b9050620001fe565b81620001f8848262000c19565b5060ff90505b92915050565b6001600160a01b038216620002345760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b620002426000838362000289565b5050565b600080829050601f8151111562000274578260405163305a27a960e01b81526004016200022b919062000d37565b8051620002818262000d6c565b179392505050565b620002968383836200029b565b505050565b620002a88383836200030a565b6001600160a01b038316620002fd576000620002c360025490565b90506001600160d01b0380821115620002fa57604051630e58ae9360e11b815260048101839052602481018290526044016200022b565b50505b620002968383836200043d565b6001600160a01b038316620003395780600260008282546200032d919062000d91565b90915550620003ad9050565b6001600160a01b038316600090815260208190526040902054818110156200038e5760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016200022b565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620003cb57600280548290039055620003ea565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200043091815260200190565b60405180910390a3505050565b6001600160a01b03831662000472576200046f600a62000b4c620004d560201b176200046984620004ea565b62000524565b50505b6001600160a01b038216620004a1576200049e600a62000b586200055860201b176200046984620004ea565b50505b6001600160a01b03838116600090815260086020526040808220548584168352912054620002969291821691168362000566565b6000620004e3828462000da7565b9392505050565b60006001600160d01b0382111562000520576040516306dfcc6560e41b815260d06004820152602481018390526044016200022b565b5090565b6000806200054b42620005426200053b88620006cd565b868860201c565b8791906200071c565b915091505b935093915050565b6000620004e3828462000dd1565b816001600160a01b0316836001600160a01b031614158015620005895750600081115b1562000296576001600160a01b038316156200062c576001600160a01b038316600090815260096020908152604082208291620005d7919062000558901b62000b58176200046986620004ea565b6001600160d01b031691506001600160d01b03169150846001600160a01b031660008051602062002fc2833981519152838360405162000621929190918252602082015260400190565b60405180910390a250505b6001600160a01b0382161562000296576001600160a01b038216600090815260096020908152604082208291620006749190620004d5901b62000b4c176200046986620004ea565b6001600160d01b031691506001600160d01b03169150836001600160a01b031660008051602062002fc28339815191528383604051620006be929190918252602082015260400190565b60405180910390a25050505050565b805460009080156200071357620006f983620006eb60018462000df4565b600091825260209091200190565b54660100000000000090046001600160d01b0316620004e3565b60009392505050565b6000806200054b858585825460009081908015620008595760006200074887620006eb60018562000df4565b60408051808201909152905465ffffffffffff80821680845266010000000000009092046001600160d01b031660208401529192509087161015620007a057604051632520601d60e01b815260040160405180910390fd5b805165ffffffffffff808816911603620007f45784620007c788620006eb60018662000df4565b80546001600160d01b039290921666010000000000000265ffffffffffff90921691909117905562000848565b6040805180820190915265ffffffffffff80881682526001600160d01b0380881660208085019182528b54600181018d5560008d815291909120945191519092166601000000000000029216919091179101555b602001519250839150620005509050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a5560008a815291822095519251909316660100000000000002919093161792019190915590508162000550565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620008f957620008f9620008b8565b604052919050565b60005b838110156200091e57818101518382015260200162000904565b50506000910152565b600082601f8301126200093957600080fd5b81516001600160401b03811115620009555762000955620008b8565b6200096a601f8201601f1916602001620008ce565b8181528460208386010111156200098057600080fd5b6200099382602083016020870162000901565b949350505050565b60006001600160401b03821115620009b757620009b7620008b8565b5060051b60200190565b600082601f830112620009d357600080fd5b81516020620009ec620009e6836200099b565b620008ce565b8083825260208201915060208460051b87010193508684111562000a0f57600080fd5b602086015b8481101562000a445780516001600160a01b038116811462000a365760008081fd5b835291830191830162000a14565b509695505050505050565b600082601f83011262000a6157600080fd5b8151602062000a74620009e6836200099b565b8083825260208201915060208460051b87010193508684111562000a9757600080fd5b602086015b8481101562000a44578051835291830191830162000a9c565b600080600080600060a0868803121562000ace57600080fd5b85516001600160401b038082111562000ae657600080fd5b62000af489838a0162000927565b9650602088015191508082111562000b0b57600080fd5b62000b1989838a0162000927565b95506040880151915060ff8216821462000b3257600080fd5b60608801519194508082111562000b4857600080fd5b62000b5689838a01620009c1565b9350608088015191508082111562000b6d57600080fd5b5062000b7c8882890162000a4f565b9150509295509295909350565b600181811c9082168062000b9e57607f821691505b60208210810362000bbf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000296576000816000526020600020601f850160051c8101602086101562000bf05750805b601f850160051c820191505b8181101562000c115782815560010162000bfc565b505050505050565b81516001600160401b0381111562000c355762000c35620008b8565b62000c4d8162000c46845462000b89565b8462000bc5565b602080601f83116001811462000c85576000841562000c6c5750858301515b600019600386901b1c1916600185901b17855562000c11565b600085815260208120601f198616915b8281101562000cb65788860151825594840194600190910190840162000c95565b508582101562000cd55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600063ffffffff80831681810362000d2d5762000d2d62000cfb565b6001019392505050565b602081526000825180602084015262000d5881604085016020870162000901565b601f01601f19169190910160400192915050565b8051602080830151919081101562000bbf5760001960209190910360031b1b16919050565b80820180821115620001fe57620001fe62000cfb565b6001600160d01b0381811683821601908082111562000dca5762000dca62000cfb565b5092915050565b6001600160d01b0382811682821603908082111562000dca5762000dca62000cfb565b81810381811115620001fe57620001fe62000cfb565b60805160a05160c05160e05161010051610120516101405161215d62000e656000396000610ece01526000610ea101526000610c7401526000610c4c01526000610ba701526000610bd101526000610bfb015261215d6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f95780639dc29fac11610097578063d505accf11610071578063d505accf14610418578063dd62ed3e1461042b578063f1127ed814610464578063f851a440146104a357600080fd5b80639dc29fac146103df578063a9059cbb146103f2578063c3cda5201461040557600080fd5b80638e539e8c116100d35780638e539e8c1461039b57806391ddadf4146103ae57806395d89b41146103c45780639ab24eb0146103cc57600080fd5b806370a08231146103445780637ecebe001461036d57806384b0196e1461038057600080fd5b80633a46b1a811610166578063587cde1e11610140578063587cde1e146102b25780635c19a95c146102f65780636fcfff4514610309578063704b6c021461033157600080fd5b80633a46b1a81461026057806340c10f19146102735780634bf5d7e91461028857600080fd5b80632121dc75116101a25780632121dc751461021c57806323b872dd14610230578063313ce567146102435780633644e5151461025857600080fd5b806306fdde03146101c9578063095ea7b3146101e757806318160ddd1461020a575b600080fd5b6101d16104bb565b6040516101de9190611d1c565b60405180910390f35b6101fa6101f5366004611d4b565b61054d565b60405190151581526020016101de565b6002545b6040519081526020016101de565b600b546101fa90600160a81b900460ff1681565b6101fa61023e366004611d75565b610567565b600b5460405160ff90911681526020016101de565b61020e6105db565b61020e61026e366004611d4b565b6105ea565b610286610281366004611d4b565b610661565b005b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b60208201526101d1565b6102de6102c0366004611db1565b6001600160a01b039081166000908152600860205260409020541690565b6040516001600160a01b0390911681526020016101de565b610286610304366004611db1565b61069e565b61031c610317366004611db1565b6106a9565b60405163ffffffff90911681526020016101de565b61028661033f366004611db1565b6106b4565b61020e610352366004611db1565b6001600160a01b031660009081526020819052604090205490565b61020e61037b366004611db1565b6107a1565b6103886107ac565b6040516101de9796959493929190611dcc565b61020e6103a9366004611e65565b6107f2565b60405165ffffffffffff421681526020016101de565b6101d1610852565b61020e6103da366004611db1565b610861565b6102866103ed366004611d4b565b610891565b6101fa610400366004611d4b565b6108ca565b610286610413366004611e8f565b610937565b610286610426366004611ee7565b6109f4565b61020e610439366004611f51565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610477610472366004611f84565b610b2e565b60408051825165ffffffffffff1681526020928301516001600160d01b031692810192909252016101de565b600b546102de9061010090046001600160a01b031681565b6060600380546104ca90611fc4565b80601f01602080910402602001604051908101604052809291908181526020018280546104f690611fc4565b80156105435780601f1061051857610100808354040283529160200191610543565b820191906000526020600020905b81548152906001019060200180831161052657829003601f168201915b5050505050905090565b60003361055b818585610b64565b60019150505b92915050565b600b54600090600160a81b900460ff166105c85760405162461bcd60e51b815260206004820181905260248201527f5472616e7366657273206172652063757272656e746c792064697361626c656460448201526064015b60405180910390fd5b6105d3848484610b76565b949350505050565b60006105e5610b9a565b905090565b60004265ffffffffffff8116831061062657604051637669fc0f60e11b81526004810184905265ffffffffffff821660248201526044016105bf565b61065061063284610cc5565b6001600160a01b038616600090815260096020526040902090610cfc565b6001600160d01b0316949350505050565b600b5461010090046001600160a01b031633146106905760405162461bcd60e51b81526004016105bf90611ffe565b61069a8282610db2565b5050565b3361069a8183610de8565b600061056182610e5a565b600b5461010090046001600160a01b0316156107125760405162461bcd60e51b815260206004820152601a60248201527f41646d696e2068617320616c7265616479206265656e2073657400000000000060448201526064016105bf565b6001600160a01b0381166107685760405162461bcd60e51b815260206004820181905260248201527f4e65772061646d696e20616464726573732063616e6e6f74206265207a65726f60448201526064016105bf565b600b805460ff60b01b196001600160a01b03909316610100029290921661010061ff0160a81b031990921691909117600160b01b179055565b600061056182610e7c565b6000606080600080600060606107c0610e9a565b6107c8610ec7565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b60004265ffffffffffff8116831061082e57604051637669fc0f60e11b81526004810184905265ffffffffffff821660248201526044016105bf565b61084261083a84610cc5565b600a90610cfc565b6001600160d01b03169392505050565b6060600480546104ca90611fc4565b6001600160a01b038116600090815260096020526040812061088290610ef4565b6001600160d01b031692915050565b600b5461010090046001600160a01b031633146108c05760405162461bcd60e51b81526004016105bf90611ffe565b61069a8282610f2d565b600b54600090600160a81b900460ff166109265760405162461bcd60e51b815260206004820181905260248201527f5472616e7366657273206172652063757272656e746c792064697361626c656460448201526064016105bf565b6109308383610f63565b9392505050565b8342111561095b57604051632341d78760e11b8152600481018590526024016105bf565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590526000906109d5906109cd9060a00160405160208183030381529060405280519060200120610f71565b858585610f9e565b90506109e18187610fcc565b6109eb8188610de8565b50505050505050565b83421115610a185760405163313c898160e11b8152600481018590526024016105bf565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610a658c6001600160a01b0316600090815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610ac082610f71565b90506000610ad082878787610f9e565b9050896001600160a01b0316816001600160a01b031614610b17576040516325c0072360e11b81526001600160a01b0380831660048301528b1660248201526044016105bf565b610b228a8a8a610b64565b50505050505050505050565b6040805180820190915260008082526020820152610930838361101f565b60006109308284612056565b6000610930828461207d565b610b718383836001611055565b505050565b600033610b8485828561112b565b610b8f8585856111a3565b506001949350505050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610bf357507f000000000000000000000000000000000000000000000000000000000000000046145b15610c1d57507f000000000000000000000000000000000000000000000000000000000000000090565b6105e5604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b600065ffffffffffff821115610cf8576040516306dfcc6560e41b815260306004820152602481018390526044016105bf565b5090565b815460009081816005811115610d5b576000610d1784611202565b610d21908561209d565b60008881526020902090915081015465ffffffffffff9081169087161015610d4b57809150610d59565b610d568160016120b0565b92505b505b6000610d69878785856112ea565b90508015610da457610d8e87610d8060018461209d565b600091825260209091200190565b54600160301b90046001600160d01b0316610da7565b60005b979650505050505050565b6001600160a01b038216610ddc5760405163ec442f0560e01b8152600060048201526024016105bf565b61069a6000838361134c565b6001600160a01b0382811660008181526008602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610b718183610e5586611357565b611375565b6001600160a01b038116600090815260096020526040812054610561906114e1565b6001600160a01b038116600090815260076020526040812054610561565b60606105e57f00000000000000000000000000000000000000000000000000000000000000006005611512565b60606105e57f00000000000000000000000000000000000000000000000000000000000000006006611512565b80546000908015610f2457610f0e83610d8060018461209d565b54600160301b90046001600160d01b0316610930565b60009392505050565b6001600160a01b038216610f5757604051634b637e8f60e11b8152600060048201526024016105bf565b61069a8260008361134c565b60003361055b8185856111a3565b6000610561610f7e610b9a565b8360405161190160f01b8152600281019290925260228201526042902090565b600080600080610fb0888888886115bd565b925092509250610fc0828261168c565b50909695505050505050565b6001600160a01b0382166000908152600760205260409020805460018101909155818114610b71576040516301d4b62360e61b81526001600160a01b0384166004820152602481018290526044016105bf565b60408051808201909152600080825260208201526001600160a01b03831660009081526009602052604090206109309083611745565b6001600160a01b03841661107f5760405163e602df0560e01b8152600060048201526024016105bf565b6001600160a01b0383166110a957604051634a1406b160e11b8152600060048201526024016105bf565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561112557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161111c91815260200190565b60405180910390a35b50505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114611125578181101561119457604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016105bf565b61112584848484036000611055565b6001600160a01b0383166111cd57604051634b637e8f60e11b8152600060048201526024016105bf565b6001600160a01b0382166111f75760405163ec442f0560e01b8152600060048201526024016105bf565b610b7183838361134c565b60008160000361121457506000919050565b60006001611221846117b5565b901c6001901b9050600181848161123a5761123a6120c3565b048201901c90506001818481611252576112526120c3565b048201901c9050600181848161126a5761126a6120c3565b048201901c90506001818481611282576112826120c3565b048201901c9050600181848161129a5761129a6120c3565b048201901c905060018184816112b2576112b26120c3565b048201901c905060018184816112ca576112ca6120c3565b048201901c9050610930818285816112e4576112e46120c3565b04611849565b60005b81831015611344576000611301848461185f565b60008781526020902090915065ffffffffffff86169082015465ffffffffffff1611156113305780925061133e565b61133b8160016120b0565b93505b506112ed565b509392505050565b610b7183838361187a565b6001600160a01b038116600090815260208190526040812054610561565b816001600160a01b0316836001600160a01b0316141580156113975750600081115b15610b71576001600160a01b0383161561143f576001600160a01b038316600090815260096020526040812081906113da90610b586113d5866118e1565b611915565b6001600160d01b031691506001600160d01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611434929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610b71576001600160a01b0382166000908152600960205260408120819061147890610b4c6113d5866118e1565b6001600160d01b031691506001600160d01b03169150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516114d2929190918252602082015260400190565b60405180910390a25050505050565b600063ffffffff821115610cf8576040516306dfcc6560e41b815260206004820152602481018390526044016105bf565b606060ff831461152c5761152583611947565b9050610561565b81805461153890611fc4565b80601f016020809104026020016040519081016040528092919081815260200182805461156490611fc4565b80156115b15780601f10611586576101008083540402835291602001916115b1565b820191906000526020600020905b81548152906001019060200180831161159457829003601f168201915b50505050509050610561565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156115f85750600091506003905082611682565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561164c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661167857506000925060019150829050611682565b9250600091508190505b9450945094915050565b60008260038111156116a0576116a06120d9565b036116a9575050565b60018260038111156116bd576116bd6120d9565b036116db5760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156116ef576116ef6120d9565b036117105760405163fce698f760e01b8152600481018290526024016105bf565b6003826003811115611724576117246120d9565b0361069a576040516335e2f38360e21b8152600481018290526024016105bf565b6040805180820190915260008082526020820152826000018263ffffffff1681548110611774576117746120ef565b60009182526020918290206040805180820190915291015465ffffffffffff81168252600160301b90046001600160d01b0316918101919091529392505050565b600080608083901c156117ca57608092831c92015b604083901c156117dc57604092831c92015b602083901c156117ee57602092831c92015b601083901c1561180057601092831c92015b600883901c1561181257600892831c92015b600483901c1561182457600492831c92015b600283901c1561183657600292831c92015b600183901c156105615760010192915050565b60008183106118585781610930565b5090919050565b600061186e6002848418612105565b610930908484166120b0565b611885838383611986565b6001600160a01b0383166118d657600061189e60025490565b90506001600160d01b03808211156118d357604051630e58ae9360e11b815260048101839052602481018290526044016105bf565b50505b610b71838383611ab0565b60006001600160d01b03821115610cf8576040516306dfcc6560e41b815260d06004820152602481018390526044016105bf565b60008061193a4261193261192888610ef4565b868863ffffffff16565b879190611b26565b915091505b935093915050565b6060600061195483611b34565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6001600160a01b0383166119b15780600260008282546119a691906120b0565b90915550611a239050565b6001600160a01b03831660009081526020819052604090205481811015611a045760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016105bf565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216611a3f57600280548290039055611a5e565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611aa391815260200190565b60405180910390a3505050565b6001600160a01b038316611ad257611acf600a610b4c6113d5846118e1565b50505b6001600160a01b038216611af457611af1600a610b586113d5846118e1565b50505b6001600160a01b03838116600090815260086020526040808220548584168352912054610b7192918216911683611375565b60008061193a858585611b5c565b600060ff8216601f81111561056157604051632cd44ac360e21b815260040160405180910390fd5b825460009081908015611c7b576000611b7a87610d8060018561209d565b60408051808201909152905465ffffffffffff808216808452600160301b9092046001600160d01b031660208401529192509087161015611bce57604051632520601d60e01b815260040160405180910390fd5b805165ffffffffffff808816911603611c1a5784611bf188610d8060018661209d565b80546001600160d01b0392909216600160301b0265ffffffffffff909216919091179055611c6b565b6040805180820190915265ffffffffffff80881682526001600160d01b0380881660208085019182528b54600181018d5560008d81529190912094519151909216600160301b029216919091179101555b60200151925083915061193f9050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a5560008a815291822095519251909316600160301b02919093161792019190915590508161193f565b6000815180845260005b81811015611cfc57602081850181015186830182015201611ce0565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006109306020830184611cd6565b80356001600160a01b0381168114611d4657600080fd5b919050565b60008060408385031215611d5e57600080fd5b611d6783611d2f565b946020939093013593505050565b600080600060608486031215611d8a57600080fd5b611d9384611d2f565b9250611da160208501611d2f565b9150604084013590509250925092565b600060208284031215611dc357600080fd5b61093082611d2f565b60ff60f81b881681526000602060e06020840152611ded60e084018a611cd6565b8381036040850152611dff818a611cd6565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b81811015611e5357835183529284019291840191600101611e37565b50909c9b505050505050505050505050565b600060208284031215611e7757600080fd5b5035919050565b803560ff81168114611d4657600080fd5b60008060008060008060c08789031215611ea857600080fd5b611eb187611d2f565b95506020870135945060408701359350611ecd60608801611e7e565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a031215611f0257600080fd5b611f0b88611d2f565b9650611f1960208901611d2f565b95506040880135945060608801359350611f3560808901611e7e565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215611f6457600080fd5b611f6d83611d2f565b9150611f7b60208401611d2f565b90509250929050565b60008060408385031215611f9757600080fd5b611fa083611d2f565b9150602083013563ffffffff81168114611fb957600080fd5b809150509250929050565b600181811c90821680611fd857607f821691505b602082108103611ff857634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526022908201527f4f6e6c792061646d696e2063616e20706572666f726d2074686973206163746960408201526137b760f11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6001600160d01b0381811683821601908082111561207657612076612040565b5092915050565b6001600160d01b0382811682821603908082111561207657612076612040565b8181038181111561056157610561612040565b8082018082111561056157610561612040565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60008261212257634e487b7160e01b600052601260045260246000fd5b50049056fea264697066735822122015e78c8ed87ea28c6abfd07c63b99fae4e885dc312d3d5a4c5d91ec0a913192964736f6c63430008180033dec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f95780639dc29fac11610097578063d505accf11610071578063d505accf14610418578063dd62ed3e1461042b578063f1127ed814610464578063f851a440146104a357600080fd5b80639dc29fac146103df578063a9059cbb146103f2578063c3cda5201461040557600080fd5b80638e539e8c116100d35780638e539e8c1461039b57806391ddadf4146103ae57806395d89b41146103c45780639ab24eb0146103cc57600080fd5b806370a08231146103445780637ecebe001461036d57806384b0196e1461038057600080fd5b80633a46b1a811610166578063587cde1e11610140578063587cde1e146102b25780635c19a95c146102f65780636fcfff4514610309578063704b6c021461033157600080fd5b80633a46b1a81461026057806340c10f19146102735780634bf5d7e91461028857600080fd5b80632121dc75116101a25780632121dc751461021c57806323b872dd14610230578063313ce567146102435780633644e5151461025857600080fd5b806306fdde03146101c9578063095ea7b3146101e757806318160ddd1461020a575b600080fd5b6101d16104bb565b6040516101de9190611d1c565b60405180910390f35b6101fa6101f5366004611d4b565b61054d565b60405190151581526020016101de565b6002545b6040519081526020016101de565b600b546101fa90600160a81b900460ff1681565b6101fa61023e366004611d75565b610567565b600b5460405160ff90911681526020016101de565b61020e6105db565b61020e61026e366004611d4b565b6105ea565b610286610281366004611d4b565b610661565b005b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b60208201526101d1565b6102de6102c0366004611db1565b6001600160a01b039081166000908152600860205260409020541690565b6040516001600160a01b0390911681526020016101de565b610286610304366004611db1565b61069e565b61031c610317366004611db1565b6106a9565b60405163ffffffff90911681526020016101de565b61028661033f366004611db1565b6106b4565b61020e610352366004611db1565b6001600160a01b031660009081526020819052604090205490565b61020e61037b366004611db1565b6107a1565b6103886107ac565b6040516101de9796959493929190611dcc565b61020e6103a9366004611e65565b6107f2565b60405165ffffffffffff421681526020016101de565b6101d1610852565b61020e6103da366004611db1565b610861565b6102866103ed366004611d4b565b610891565b6101fa610400366004611d4b565b6108ca565b610286610413366004611e8f565b610937565b610286610426366004611ee7565b6109f4565b61020e610439366004611f51565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610477610472366004611f84565b610b2e565b60408051825165ffffffffffff1681526020928301516001600160d01b031692810192909252016101de565b600b546102de9061010090046001600160a01b031681565b6060600380546104ca90611fc4565b80601f01602080910402602001604051908101604052809291908181526020018280546104f690611fc4565b80156105435780601f1061051857610100808354040283529160200191610543565b820191906000526020600020905b81548152906001019060200180831161052657829003601f168201915b5050505050905090565b60003361055b818585610b64565b60019150505b92915050565b600b54600090600160a81b900460ff166105c85760405162461bcd60e51b815260206004820181905260248201527f5472616e7366657273206172652063757272656e746c792064697361626c656460448201526064015b60405180910390fd5b6105d3848484610b76565b949350505050565b60006105e5610b9a565b905090565b60004265ffffffffffff8116831061062657604051637669fc0f60e11b81526004810184905265ffffffffffff821660248201526044016105bf565b61065061063284610cc5565b6001600160a01b038616600090815260096020526040902090610cfc565b6001600160d01b0316949350505050565b600b5461010090046001600160a01b031633146106905760405162461bcd60e51b81526004016105bf90611ffe565b61069a8282610db2565b5050565b3361069a8183610de8565b600061056182610e5a565b600b5461010090046001600160a01b0316156107125760405162461bcd60e51b815260206004820152601a60248201527f41646d696e2068617320616c7265616479206265656e2073657400000000000060448201526064016105bf565b6001600160a01b0381166107685760405162461bcd60e51b815260206004820181905260248201527f4e65772061646d696e20616464726573732063616e6e6f74206265207a65726f60448201526064016105bf565b600b805460ff60b01b196001600160a01b03909316610100029290921661010061ff0160a81b031990921691909117600160b01b179055565b600061056182610e7c565b6000606080600080600060606107c0610e9a565b6107c8610ec7565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b60004265ffffffffffff8116831061082e57604051637669fc0f60e11b81526004810184905265ffffffffffff821660248201526044016105bf565b61084261083a84610cc5565b600a90610cfc565b6001600160d01b03169392505050565b6060600480546104ca90611fc4565b6001600160a01b038116600090815260096020526040812061088290610ef4565b6001600160d01b031692915050565b600b5461010090046001600160a01b031633146108c05760405162461bcd60e51b81526004016105bf90611ffe565b61069a8282610f2d565b600b54600090600160a81b900460ff166109265760405162461bcd60e51b815260206004820181905260248201527f5472616e7366657273206172652063757272656e746c792064697361626c656460448201526064016105bf565b6109308383610f63565b9392505050565b8342111561095b57604051632341d78760e11b8152600481018590526024016105bf565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590526000906109d5906109cd9060a00160405160208183030381529060405280519060200120610f71565b858585610f9e565b90506109e18187610fcc565b6109eb8188610de8565b50505050505050565b83421115610a185760405163313c898160e11b8152600481018590526024016105bf565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610a658c6001600160a01b0316600090815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610ac082610f71565b90506000610ad082878787610f9e565b9050896001600160a01b0316816001600160a01b031614610b17576040516325c0072360e11b81526001600160a01b0380831660048301528b1660248201526044016105bf565b610b228a8a8a610b64565b50505050505050505050565b6040805180820190915260008082526020820152610930838361101f565b60006109308284612056565b6000610930828461207d565b610b718383836001611055565b505050565b600033610b8485828561112b565b610b8f8585856111a3565b506001949350505050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610bf357507f000000000000000000000000000000000000000000000000000000000000000046145b15610c1d57507f000000000000000000000000000000000000000000000000000000000000000090565b6105e5604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b600065ffffffffffff821115610cf8576040516306dfcc6560e41b815260306004820152602481018390526044016105bf565b5090565b815460009081816005811115610d5b576000610d1784611202565b610d21908561209d565b60008881526020902090915081015465ffffffffffff9081169087161015610d4b57809150610d59565b610d568160016120b0565b92505b505b6000610d69878785856112ea565b90508015610da457610d8e87610d8060018461209d565b600091825260209091200190565b54600160301b90046001600160d01b0316610da7565b60005b979650505050505050565b6001600160a01b038216610ddc5760405163ec442f0560e01b8152600060048201526024016105bf565b61069a6000838361134c565b6001600160a01b0382811660008181526008602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610b718183610e5586611357565b611375565b6001600160a01b038116600090815260096020526040812054610561906114e1565b6001600160a01b038116600090815260076020526040812054610561565b60606105e57f00000000000000000000000000000000000000000000000000000000000000006005611512565b60606105e57f00000000000000000000000000000000000000000000000000000000000000006006611512565b80546000908015610f2457610f0e83610d8060018461209d565b54600160301b90046001600160d01b0316610930565b60009392505050565b6001600160a01b038216610f5757604051634b637e8f60e11b8152600060048201526024016105bf565b61069a8260008361134c565b60003361055b8185856111a3565b6000610561610f7e610b9a565b8360405161190160f01b8152600281019290925260228201526042902090565b600080600080610fb0888888886115bd565b925092509250610fc0828261168c565b50909695505050505050565b6001600160a01b0382166000908152600760205260409020805460018101909155818114610b71576040516301d4b62360e61b81526001600160a01b0384166004820152602481018290526044016105bf565b60408051808201909152600080825260208201526001600160a01b03831660009081526009602052604090206109309083611745565b6001600160a01b03841661107f5760405163e602df0560e01b8152600060048201526024016105bf565b6001600160a01b0383166110a957604051634a1406b160e11b8152600060048201526024016105bf565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561112557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161111c91815260200190565b60405180910390a35b50505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114611125578181101561119457604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016105bf565b61112584848484036000611055565b6001600160a01b0383166111cd57604051634b637e8f60e11b8152600060048201526024016105bf565b6001600160a01b0382166111f75760405163ec442f0560e01b8152600060048201526024016105bf565b610b7183838361134c565b60008160000361121457506000919050565b60006001611221846117b5565b901c6001901b9050600181848161123a5761123a6120c3565b048201901c90506001818481611252576112526120c3565b048201901c9050600181848161126a5761126a6120c3565b048201901c90506001818481611282576112826120c3565b048201901c9050600181848161129a5761129a6120c3565b048201901c905060018184816112b2576112b26120c3565b048201901c905060018184816112ca576112ca6120c3565b048201901c9050610930818285816112e4576112e46120c3565b04611849565b60005b81831015611344576000611301848461185f565b60008781526020902090915065ffffffffffff86169082015465ffffffffffff1611156113305780925061133e565b61133b8160016120b0565b93505b506112ed565b509392505050565b610b7183838361187a565b6001600160a01b038116600090815260208190526040812054610561565b816001600160a01b0316836001600160a01b0316141580156113975750600081115b15610b71576001600160a01b0383161561143f576001600160a01b038316600090815260096020526040812081906113da90610b586113d5866118e1565b611915565b6001600160d01b031691506001600160d01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611434929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610b71576001600160a01b0382166000908152600960205260408120819061147890610b4c6113d5866118e1565b6001600160d01b031691506001600160d01b03169150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516114d2929190918252602082015260400190565b60405180910390a25050505050565b600063ffffffff821115610cf8576040516306dfcc6560e41b815260206004820152602481018390526044016105bf565b606060ff831461152c5761152583611947565b9050610561565b81805461153890611fc4565b80601f016020809104026020016040519081016040528092919081815260200182805461156490611fc4565b80156115b15780601f10611586576101008083540402835291602001916115b1565b820191906000526020600020905b81548152906001019060200180831161159457829003601f168201915b50505050509050610561565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156115f85750600091506003905082611682565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561164c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661167857506000925060019150829050611682565b9250600091508190505b9450945094915050565b60008260038111156116a0576116a06120d9565b036116a9575050565b60018260038111156116bd576116bd6120d9565b036116db5760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156116ef576116ef6120d9565b036117105760405163fce698f760e01b8152600481018290526024016105bf565b6003826003811115611724576117246120d9565b0361069a576040516335e2f38360e21b8152600481018290526024016105bf565b6040805180820190915260008082526020820152826000018263ffffffff1681548110611774576117746120ef565b60009182526020918290206040805180820190915291015465ffffffffffff81168252600160301b90046001600160d01b0316918101919091529392505050565b600080608083901c156117ca57608092831c92015b604083901c156117dc57604092831c92015b602083901c156117ee57602092831c92015b601083901c1561180057601092831c92015b600883901c1561181257600892831c92015b600483901c1561182457600492831c92015b600283901c1561183657600292831c92015b600183901c156105615760010192915050565b60008183106118585781610930565b5090919050565b600061186e6002848418612105565b610930908484166120b0565b611885838383611986565b6001600160a01b0383166118d657600061189e60025490565b90506001600160d01b03808211156118d357604051630e58ae9360e11b815260048101839052602481018290526044016105bf565b50505b610b71838383611ab0565b60006001600160d01b03821115610cf8576040516306dfcc6560e41b815260d06004820152602481018390526044016105bf565b60008061193a4261193261192888610ef4565b868863ffffffff16565b879190611b26565b915091505b935093915050565b6060600061195483611b34565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6001600160a01b0383166119b15780600260008282546119a691906120b0565b90915550611a239050565b6001600160a01b03831660009081526020819052604090205481811015611a045760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016105bf565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216611a3f57600280548290039055611a5e565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611aa391815260200190565b60405180910390a3505050565b6001600160a01b038316611ad257611acf600a610b4c6113d5846118e1565b50505b6001600160a01b038216611af457611af1600a610b586113d5846118e1565b50505b6001600160a01b03838116600090815260086020526040808220548584168352912054610b7192918216911683611375565b60008061193a858585611b5c565b600060ff8216601f81111561056157604051632cd44ac360e21b815260040160405180910390fd5b825460009081908015611c7b576000611b7a87610d8060018561209d565b60408051808201909152905465ffffffffffff808216808452600160301b9092046001600160d01b031660208401529192509087161015611bce57604051632520601d60e01b815260040160405180910390fd5b805165ffffffffffff808816911603611c1a5784611bf188610d8060018661209d565b80546001600160d01b0392909216600160301b0265ffffffffffff909216919091179055611c6b565b6040805180820190915265ffffffffffff80881682526001600160d01b0380881660208085019182528b54600181018d5560008d81529190912094519151909216600160301b029216919091179101555b60200151925083915061193f9050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a5560008a815291822095519251909316600160301b02919093161792019190915590508161193f565b6000815180845260005b81811015611cfc57602081850181015186830182015201611ce0565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006109306020830184611cd6565b80356001600160a01b0381168114611d4657600080fd5b919050565b60008060408385031215611d5e57600080fd5b611d6783611d2f565b946020939093013593505050565b600080600060608486031215611d8a57600080fd5b611d9384611d2f565b9250611da160208501611d2f565b9150604084013590509250925092565b600060208284031215611dc357600080fd5b61093082611d2f565b60ff60f81b881681526000602060e06020840152611ded60e084018a611cd6565b8381036040850152611dff818a611cd6565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b81811015611e5357835183529284019291840191600101611e37565b50909c9b505050505050505050505050565b600060208284031215611e7757600080fd5b5035919050565b803560ff81168114611d4657600080fd5b60008060008060008060c08789031215611ea857600080fd5b611eb187611d2f565b95506020870135945060408701359350611ecd60608801611e7e565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a031215611f0257600080fd5b611f0b88611d2f565b9650611f1960208901611d2f565b95506040880135945060608801359350611f3560808901611e7e565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215611f6457600080fd5b611f6d83611d2f565b9150611f7b60208401611d2f565b90509250929050565b60008060408385031215611f9757600080fd5b611fa083611d2f565b9150602083013563ffffffff81168114611fb957600080fd5b809150509250929050565b600181811c90821680611fd857607f821691505b602082108103611ff857634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526022908201527f4f6e6c792061646d696e2063616e20706572666f726d2074686973206163746960408201526137b760f11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6001600160d01b0381811683821601908082111561207657612076612040565b5092915050565b6001600160d01b0382811682821603908082111561207657612076612040565b8181038181111561056157610561612040565b8082018082111561056157610561612040565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60008261212257634e487b7160e01b600052601260045260246000fd5b50049056fea264697066735822122015e78c8ed87ea28c6abfd07c63b99fae4e885dc312d3d5a4c5d91ec0a913192964736f6c63430008180033", "linkReferences": {}, "deployedLinkReferences": {} -} \ No newline at end of file + } + \ No newline at end of file diff --git a/src/assets/abis/hb_timelock.json b/src/assets/abis/hb_timelock.json new file mode 100644 index 00000000..ccebf86e --- /dev/null +++ b/src/assets/abis/hb_timelock.json @@ -0,0 +1,55 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TimelockFactory", + "sourceName": "contracts/Factories.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "uint256", + "name": "executionDelay", + "type": "uint256" + } + ], + "name": "deployTimelock", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "deployedTimelocks", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5061206c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80631ecbdf631461003b5780638c9513bb1461006a575b600080fd5b61004e610049366004610147565b61007d565b6040516001600160a01b03909116815260200160405180910390f35b61004e610078366004610160565b6100a7565b6000818154811061008d57600080fd5b6000918252602090912001546001600160a01b0316905081565b60006060806000848383886040516100be9061013a565b6100cb94939291906101dd565b604051809103906000f0801580156100e7573d6000803e3d6000fd5b50600080546001810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b0383161790559695505050505050565b611e148061022383390190565b60006020828403121561015957600080fd5b5035919050565b6000806040838503121561017357600080fd5b82356001600160a01b038116811461018a57600080fd5b946020939093013593505050565b60008151808452602080850194506020840160005b838110156101d25781516001600160a01b0316875295820195908201906001016101ad565b509495945050505050565b8481526080602082015260006101f66080830186610198565b82810360408401526102088186610198565b91505060018060a01b03831660608301529594505050505056fe60806040523480156200001157600080fd5b5060405162001e1438038062001e1483398101604081905262000034916200032f565b620000416000306200019d565b506001600160a01b0381161562000061576200005f6000826200019d565b505b60005b83518110156200010157620000bc7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1858381518110620000a857620000a8620003b6565b60200260200101516200019d60201b60201c565b50620000f77ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783858381518110620000a857620000a8620003b6565b5060010162000064565b5060005b82518110156200015357620001497fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63848381518110620000a857620000a8620003b6565b5060010162000105565b5060028490556040805160008152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a150505050620003cc565b6000828152602081815260408083206001600160a01b038516845290915281205460ff1662000242576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055620001f93390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000246565b5060005b92915050565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200027a57600080fd5b919050565b600082601f8301126200029157600080fd5b815160206001600160401b0380831115620002b057620002b06200024c565b8260051b604051601f19603f83011681018181108482111715620002d857620002d86200024c565b6040529384526020818701810194908101925087851115620002f957600080fd5b6020870191505b848210156200032457620003148262000262565b8352918301919083019062000300565b979650505050505050565b600080600080608085870312156200034657600080fd5b845160208601519094506001600160401b03808211156200036657600080fd5b62000374888389016200027f565b945060408701519150808211156200038b57600080fd5b506200039a878288016200027f565b925050620003ab6060860162000262565b905092959194509250565b634e487b7160e01b600052603260045260246000fd5b611a3880620003dc6000396000f3fe6080604052600436106101bb5760003560e01c80638065657f116100ec578063bc197c811161008a578063d547741f11610064578063d547741f1461056a578063e38335e51461058a578063f23a6e611461059d578063f27a0c92146105c957600080fd5b8063bc197c81146104f1578063c4d252f51461051d578063d45c44351461053d57600080fd5b806391d14854116100c657806391d1485414610468578063a217fddf14610488578063b08e51c01461049d578063b1c5f427146104d157600080fd5b80638065657f146103f45780638f2a0bb0146104145780638f61f4f51461043457600080fd5b80632ab0f5291161015957806336568abe1161013357806336568abe14610367578063584b153e1461038757806364d62353146103a75780637958004c146103c757600080fd5b80632ab0f529146103075780632f2ff15d1461032757806331d507501461034757600080fd5b8063134008d311610195578063134008d31461026057806313bc9f2014610273578063150b7a0214610293578063248a9ca3146102d757600080fd5b806301d5062a146101c757806301ffc9a7146101e957806307bd02651461021e57600080fd5b366101c257005b600080fd5b3480156101d357600080fd5b506101e76101e23660046111ba565b6105de565b005b3480156101f557600080fd5b5061020961020436600461122e565b6106b4565b60405190151581526020015b60405180910390f35b34801561022a57600080fd5b506102527fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610215565b6101e761026e366004611258565b6106c5565b34801561027f57600080fd5b5061020961028e3660046112c3565b61077a565b34801561029f57600080fd5b506102be6102ae366004611391565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610215565b3480156102e357600080fd5b506102526102f23660046112c3565b60009081526020819052604090206001015490565b34801561031357600080fd5b506102096103223660046112c3565b6107a0565b34801561033357600080fd5b506101e76103423660046113f8565b6107a9565b34801561035357600080fd5b506102096103623660046112c3565b6107d4565b34801561037357600080fd5b506101e76103823660046113f8565b6107f9565b34801561039357600080fd5b506102096103a23660046112c3565b610831565b3480156103b357600080fd5b506101e76103c23660046112c3565b610877565b3480156103d357600080fd5b506103e76103e23660046112c3565b6108ea565b604051610215919061143a565b34801561040057600080fd5b5061025261040f366004611258565b610935565b34801561042057600080fd5b506101e761042f3660046114a6565b610974565b34801561044057600080fd5b506102527fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b34801561047457600080fd5b506102096104833660046113f8565b610b02565b34801561049457600080fd5b50610252600081565b3480156104a957600080fd5b506102527ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156104dd57600080fd5b506102526104ec366004611557565b610b2b565b3480156104fd57600080fd5b506102be61050c36600461167e565b63bc197c8160e01b95945050505050565b34801561052957600080fd5b506101e76105383660046112c3565b610b70565b34801561054957600080fd5b506102526105583660046112c3565b60009081526001602052604090205490565b34801561057657600080fd5b506101e76105853660046113f8565b610c1b565b6101e7610598366004611557565b610c40565b3480156105a957600080fd5b506102be6105b8366004611727565b63f23a6e6160e01b95945050505050565b3480156105d557600080fd5b50600254610252565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161060881610dc7565b6000610618898989898989610935565b90506106248184610dd4565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a604051610660969594939291906117b4565b60405180910390a383156106a957807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d0387856040516106a091815260200190565b60405180910390a25b505050505050505050565b60006106bf82610e68565b92915050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636106f1816000610b02565b6106ff576106ff8133610e8d565b600061070f888888888888610935565b905061071b8185610eca565b61072788888888610f18565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161075f94939291906117f1565b60405180910390a361077081610f90565b5050505050505050565b600060025b610788836108ea565b600381111561079957610799611424565b1492915050565b6000600361077f565b6000828152602081905260409020600101546107c481610dc7565b6107ce8383610fbc565b50505050565b6000806107e0836108ea565b60038111156107f1576107f1611424565b141592915050565b6001600160a01b03811633146108225760405163334bd91960e11b815260040160405180910390fd5b61082c828261104e565b505050565b60008061083d836108ea565b9050600181600381111561085357610853611424565b14806108705750600281600381111561086e5761086e611424565b145b9392505050565b333081146108a85760405163e2850c5960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b60025460408051918252602082018490527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a150600255565b6000818152600160205260408120548060000361090a5750600092915050565b6001810361091b5750600392915050565b4281111561092c5750600192915050565b50600292915050565b6000868686868686604051602001610952969594939291906117b4565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161099e81610dc7565b88871415806109ad5750888514155b156109df576040516001624fcdef60e01b03198152600481018a9052602481018690526044810188905260640161089f565b60006109f18b8b8b8b8b8b8b8b610b2b565b90506109fd8184610dd4565b60005b8a811015610ab35780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610a3d57610a3d611823565b9050602002016020810190610a529190611839565b8d8d86818110610a6457610a64611823565b905060200201358c8c87818110610a7d57610a7d611823565b9050602002810190610a8f9190611854565b8c8b604051610aa3969594939291906117b4565b60405180910390a3600101610a00565b508315610af557807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d038785604051610aec91815260200190565b60405180910390a25b5050505050505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60008888888888888888604051602001610b4c989796959493929190611930565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610b9a81610dc7565b610ba382610831565b610bdf5781610bb260026110b9565b610bbc60016110b9565b604051635ead8eb560e01b8152600481019390935217602482015260440161089f565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610c3681610dc7565b6107ce838361104e565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610c6c816000610b02565b610c7a57610c7a8133610e8d565b8786141580610c895750878414155b15610cbb576040516001624fcdef60e01b0319815260048101899052602481018590526044810187905260640161089f565b6000610ccd8a8a8a8a8a8a8a8a610b2b565b9050610cd98185610eca565b60005b89811015610db15760008b8b83818110610cf857610cf8611823565b9050602002016020810190610d0d9190611839565b905060008a8a84818110610d2357610d23611823565b9050602002013590503660008a8a86818110610d4157610d41611823565b9050602002810190610d539190611854565b91509150610d6384848484610f18565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b5886868686604051610d9a94939291906117f1565b60405180910390a350505050806001019050610cdc565b50610dbb81610f90565b50505050505050505050565b610dd18133610e8d565b50565b610ddd826107d4565b15610e0f5781610ded60006110b9565b604051635ead8eb560e01b81526004810192909252602482015260440161089f565b6000610e1a60025490565b905080821015610e4757604051635433660960e01b8152600481018390526024810182905260440161089f565b610e5182426119d1565b600093845260016020526040909320929092555050565b60006001600160e01b03198216630271189760e51b14806106bf57506106bf826110dc565b610e978282610b02565b610ec65760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161089f565b5050565b610ed38261077a565b610ee25781610ded60026110b9565b8015801590610ef75750610ef5816107a0565b155b15610ec65760405163121534c360e31b81526004810182905260240161089f565b600080856001600160a01b0316858585604051610f369291906119f2565b60006040518083038185875af1925050503d8060008114610f73576040519150601f19603f3d011682016040523d82523d6000602084013e610f78565b606091505b5091509150610f878282611111565b50505050505050565b610f998161077a565b610fa85780610ded60026110b9565b600090815260016020819052604090912055565b6000610fc88383610b02565b611046576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610ffe3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016106bf565b5060006106bf565b600061105a8383610b02565b15611046576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016106bf565b60008160038111156110cd576110cd611424565b600160ff919091161b92915050565b60006001600160e01b03198216637965db0b60e01b14806106bf57506301ffc9a760e01b6001600160e01b03198316146106bf565b606082611126576111218261112d565b6106bf565b50806106bf565b80511561113d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80356001600160a01b038116811461116d57600080fd5b919050565b60008083601f84011261118457600080fd5b5081356001600160401b0381111561119b57600080fd5b6020830191508360208285010111156111b357600080fd5b9250929050565b600080600080600080600060c0888a0312156111d557600080fd5b6111de88611156565b96506020880135955060408801356001600160401b0381111561120057600080fd5b61120c8a828b01611172565b989b979a50986060810135976080820135975060a09091013595509350505050565b60006020828403121561124057600080fd5b81356001600160e01b03198116811461087057600080fd5b60008060008060008060a0878903121561127157600080fd5b61127a87611156565b95506020870135945060408701356001600160401b0381111561129c57600080fd5b6112a889828a01611172565b979a9699509760608101359660809091013595509350505050565b6000602082840312156112d557600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561131a5761131a6112dc565b604052919050565b600082601f83011261133357600080fd5b81356001600160401b0381111561134c5761134c6112dc565b61135f601f8201601f19166020016112f2565b81815284602083860101111561137457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156113a757600080fd5b6113b085611156565b93506113be60208601611156565b92506040850135915060608501356001600160401b038111156113e057600080fd5b6113ec87828801611322565b91505092959194509250565b6000806040838503121561140b57600080fd5b8235915061141b60208401611156565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b602081016004831061145c57634e487b7160e01b600052602160045260246000fd5b91905290565b60008083601f84011261147457600080fd5b5081356001600160401b0381111561148b57600080fd5b6020830191508360208260051b85010111156111b357600080fd5b600080600080600080600080600060c08a8c0312156114c457600080fd5b89356001600160401b03808211156114db57600080fd5b6114e78d838e01611462565b909b50995060208c013591508082111561150057600080fd5b61150c8d838e01611462565b909950975060408c013591508082111561152557600080fd5b506115328c828d01611462565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561157357600080fd5b88356001600160401b038082111561158a57600080fd5b6115968c838d01611462565b909a50985060208b01359150808211156115af57600080fd5b6115bb8c838d01611462565b909850965060408b01359150808211156115d457600080fd5b506115e18b828c01611462565b999c989b509699959896976060870135966080013595509350505050565b600082601f83011261161057600080fd5b813560206001600160401b0382111561162b5761162b6112dc565b8160051b61163a8282016112f2565b928352848101820192828101908785111561165457600080fd5b83870192505b848310156116735782358252918301919083019061165a565b979650505050505050565b600080600080600060a0868803121561169657600080fd5b61169f86611156565b94506116ad60208701611156565b935060408601356001600160401b03808211156116c957600080fd5b6116d589838a016115ff565b945060608801359150808211156116eb57600080fd5b6116f789838a016115ff565b9350608088013591508082111561170d57600080fd5b5061171a88828901611322565b9150509295509295909350565b600080600080600060a0868803121561173f57600080fd5b61174886611156565b945061175660208701611156565b9350604086013592506060860135915060808601356001600160401b0381111561177f57600080fd5b61171a88828901611322565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a0604082015260006117dc60a08301868861178b565b60608301949094525060800152949350505050565b60018060a01b038516815283602082015260606040820152600061181960608301848661178b565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561184b57600080fd5b61087082611156565b6000808335601e1984360301811261186b57600080fd5b8301803591506001600160401b0382111561188557600080fd5b6020019150368190038213156111b357600080fd5b6000838385526020808601955060208560051b8301018460005b8781101561192357848303601f19018952813536889003601e190181126118da57600080fd5b870184810190356001600160401b038111156118f557600080fd5b80360382131561190457600080fd5b61190f85828461178b565b9a86019a94505050908301906001016118b4565b5090979650505050505050565b60a0808252810188905260008960c08301825b8b811015611971576001600160a01b0361195c84611156565b16825260209283019290910190600101611943565b5083810360208501528881526001600160fb1b0389111561199157600080fd5b8860051b9150818a602083013701828103602090810160408501526119b9908201878961189a565b60608401959095525050608001529695505050505050565b808201808211156106bf57634e487b7160e01b600052601160045260246000fd5b818382376000910190815291905056fea26469706673582212208b7d4906d8ae4a7bcf3f7e4af04af3a5811504f1ac624afa8e9ba6dbbcc6136464736f6c63430008180033a26469706673582212205911324004849c77445c3b2494cdf0d7b6b43f3d39e91829d2efd16f6c8e7de064736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80631ecbdf631461003b5780638c9513bb1461006a575b600080fd5b61004e610049366004610147565b61007d565b6040516001600160a01b03909116815260200160405180910390f35b61004e610078366004610160565b6100a7565b6000818154811061008d57600080fd5b6000918252602090912001546001600160a01b0316905081565b60006060806000848383886040516100be9061013a565b6100cb94939291906101dd565b604051809103906000f0801580156100e7573d6000803e3d6000fd5b50600080546001810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b0383161790559695505050505050565b611e148061022383390190565b60006020828403121561015957600080fd5b5035919050565b6000806040838503121561017357600080fd5b82356001600160a01b038116811461018a57600080fd5b946020939093013593505050565b60008151808452602080850194506020840160005b838110156101d25781516001600160a01b0316875295820195908201906001016101ad565b509495945050505050565b8481526080602082015260006101f66080830186610198565b82810360408401526102088186610198565b91505060018060a01b03831660608301529594505050505056fe60806040523480156200001157600080fd5b5060405162001e1438038062001e1483398101604081905262000034916200032f565b620000416000306200019d565b506001600160a01b0381161562000061576200005f6000826200019d565b505b60005b83518110156200010157620000bc7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1858381518110620000a857620000a8620003b6565b60200260200101516200019d60201b60201c565b50620000f77ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783858381518110620000a857620000a8620003b6565b5060010162000064565b5060005b82518110156200015357620001497fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63848381518110620000a857620000a8620003b6565b5060010162000105565b5060028490556040805160008152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a150505050620003cc565b6000828152602081815260408083206001600160a01b038516845290915281205460ff1662000242576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055620001f93390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000246565b5060005b92915050565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200027a57600080fd5b919050565b600082601f8301126200029157600080fd5b815160206001600160401b0380831115620002b057620002b06200024c565b8260051b604051601f19603f83011681018181108482111715620002d857620002d86200024c565b6040529384526020818701810194908101925087851115620002f957600080fd5b6020870191505b848210156200032457620003148262000262565b8352918301919083019062000300565b979650505050505050565b600080600080608085870312156200034657600080fd5b845160208601519094506001600160401b03808211156200036657600080fd5b62000374888389016200027f565b945060408701519150808211156200038b57600080fd5b506200039a878288016200027f565b925050620003ab6060860162000262565b905092959194509250565b634e487b7160e01b600052603260045260246000fd5b611a3880620003dc6000396000f3fe6080604052600436106101bb5760003560e01c80638065657f116100ec578063bc197c811161008a578063d547741f11610064578063d547741f1461056a578063e38335e51461058a578063f23a6e611461059d578063f27a0c92146105c957600080fd5b8063bc197c81146104f1578063c4d252f51461051d578063d45c44351461053d57600080fd5b806391d14854116100c657806391d1485414610468578063a217fddf14610488578063b08e51c01461049d578063b1c5f427146104d157600080fd5b80638065657f146103f45780638f2a0bb0146104145780638f61f4f51461043457600080fd5b80632ab0f5291161015957806336568abe1161013357806336568abe14610367578063584b153e1461038757806364d62353146103a75780637958004c146103c757600080fd5b80632ab0f529146103075780632f2ff15d1461032757806331d507501461034757600080fd5b8063134008d311610195578063134008d31461026057806313bc9f2014610273578063150b7a0214610293578063248a9ca3146102d757600080fd5b806301d5062a146101c757806301ffc9a7146101e957806307bd02651461021e57600080fd5b366101c257005b600080fd5b3480156101d357600080fd5b506101e76101e23660046111ba565b6105de565b005b3480156101f557600080fd5b5061020961020436600461122e565b6106b4565b60405190151581526020015b60405180910390f35b34801561022a57600080fd5b506102527fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610215565b6101e761026e366004611258565b6106c5565b34801561027f57600080fd5b5061020961028e3660046112c3565b61077a565b34801561029f57600080fd5b506102be6102ae366004611391565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610215565b3480156102e357600080fd5b506102526102f23660046112c3565b60009081526020819052604090206001015490565b34801561031357600080fd5b506102096103223660046112c3565b6107a0565b34801561033357600080fd5b506101e76103423660046113f8565b6107a9565b34801561035357600080fd5b506102096103623660046112c3565b6107d4565b34801561037357600080fd5b506101e76103823660046113f8565b6107f9565b34801561039357600080fd5b506102096103a23660046112c3565b610831565b3480156103b357600080fd5b506101e76103c23660046112c3565b610877565b3480156103d357600080fd5b506103e76103e23660046112c3565b6108ea565b604051610215919061143a565b34801561040057600080fd5b5061025261040f366004611258565b610935565b34801561042057600080fd5b506101e761042f3660046114a6565b610974565b34801561044057600080fd5b506102527fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b34801561047457600080fd5b506102096104833660046113f8565b610b02565b34801561049457600080fd5b50610252600081565b3480156104a957600080fd5b506102527ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156104dd57600080fd5b506102526104ec366004611557565b610b2b565b3480156104fd57600080fd5b506102be61050c36600461167e565b63bc197c8160e01b95945050505050565b34801561052957600080fd5b506101e76105383660046112c3565b610b70565b34801561054957600080fd5b506102526105583660046112c3565b60009081526001602052604090205490565b34801561057657600080fd5b506101e76105853660046113f8565b610c1b565b6101e7610598366004611557565b610c40565b3480156105a957600080fd5b506102be6105b8366004611727565b63f23a6e6160e01b95945050505050565b3480156105d557600080fd5b50600254610252565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161060881610dc7565b6000610618898989898989610935565b90506106248184610dd4565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a604051610660969594939291906117b4565b60405180910390a383156106a957807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d0387856040516106a091815260200190565b60405180910390a25b505050505050505050565b60006106bf82610e68565b92915050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636106f1816000610b02565b6106ff576106ff8133610e8d565b600061070f888888888888610935565b905061071b8185610eca565b61072788888888610f18565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161075f94939291906117f1565b60405180910390a361077081610f90565b5050505050505050565b600060025b610788836108ea565b600381111561079957610799611424565b1492915050565b6000600361077f565b6000828152602081905260409020600101546107c481610dc7565b6107ce8383610fbc565b50505050565b6000806107e0836108ea565b60038111156107f1576107f1611424565b141592915050565b6001600160a01b03811633146108225760405163334bd91960e11b815260040160405180910390fd5b61082c828261104e565b505050565b60008061083d836108ea565b9050600181600381111561085357610853611424565b14806108705750600281600381111561086e5761086e611424565b145b9392505050565b333081146108a85760405163e2850c5960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b60025460408051918252602082018490527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a150600255565b6000818152600160205260408120548060000361090a5750600092915050565b6001810361091b5750600392915050565b4281111561092c5750600192915050565b50600292915050565b6000868686868686604051602001610952969594939291906117b4565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161099e81610dc7565b88871415806109ad5750888514155b156109df576040516001624fcdef60e01b03198152600481018a9052602481018690526044810188905260640161089f565b60006109f18b8b8b8b8b8b8b8b610b2b565b90506109fd8184610dd4565b60005b8a811015610ab35780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610a3d57610a3d611823565b9050602002016020810190610a529190611839565b8d8d86818110610a6457610a64611823565b905060200201358c8c87818110610a7d57610a7d611823565b9050602002810190610a8f9190611854565b8c8b604051610aa3969594939291906117b4565b60405180910390a3600101610a00565b508315610af557807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d038785604051610aec91815260200190565b60405180910390a25b5050505050505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60008888888888888888604051602001610b4c989796959493929190611930565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610b9a81610dc7565b610ba382610831565b610bdf5781610bb260026110b9565b610bbc60016110b9565b604051635ead8eb560e01b8152600481019390935217602482015260440161089f565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610c3681610dc7565b6107ce838361104e565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610c6c816000610b02565b610c7a57610c7a8133610e8d565b8786141580610c895750878414155b15610cbb576040516001624fcdef60e01b0319815260048101899052602481018590526044810187905260640161089f565b6000610ccd8a8a8a8a8a8a8a8a610b2b565b9050610cd98185610eca565b60005b89811015610db15760008b8b83818110610cf857610cf8611823565b9050602002016020810190610d0d9190611839565b905060008a8a84818110610d2357610d23611823565b9050602002013590503660008a8a86818110610d4157610d41611823565b9050602002810190610d539190611854565b91509150610d6384848484610f18565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b5886868686604051610d9a94939291906117f1565b60405180910390a350505050806001019050610cdc565b50610dbb81610f90565b50505050505050505050565b610dd18133610e8d565b50565b610ddd826107d4565b15610e0f5781610ded60006110b9565b604051635ead8eb560e01b81526004810192909252602482015260440161089f565b6000610e1a60025490565b905080821015610e4757604051635433660960e01b8152600481018390526024810182905260440161089f565b610e5182426119d1565b600093845260016020526040909320929092555050565b60006001600160e01b03198216630271189760e51b14806106bf57506106bf826110dc565b610e978282610b02565b610ec65760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161089f565b5050565b610ed38261077a565b610ee25781610ded60026110b9565b8015801590610ef75750610ef5816107a0565b155b15610ec65760405163121534c360e31b81526004810182905260240161089f565b600080856001600160a01b0316858585604051610f369291906119f2565b60006040518083038185875af1925050503d8060008114610f73576040519150601f19603f3d011682016040523d82523d6000602084013e610f78565b606091505b5091509150610f878282611111565b50505050505050565b610f998161077a565b610fa85780610ded60026110b9565b600090815260016020819052604090912055565b6000610fc88383610b02565b611046576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610ffe3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016106bf565b5060006106bf565b600061105a8383610b02565b15611046576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016106bf565b60008160038111156110cd576110cd611424565b600160ff919091161b92915050565b60006001600160e01b03198216637965db0b60e01b14806106bf57506301ffc9a760e01b6001600160e01b03198316146106bf565b606082611126576111218261112d565b6106bf565b50806106bf565b80511561113d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80356001600160a01b038116811461116d57600080fd5b919050565b60008083601f84011261118457600080fd5b5081356001600160401b0381111561119b57600080fd5b6020830191508360208285010111156111b357600080fd5b9250929050565b600080600080600080600060c0888a0312156111d557600080fd5b6111de88611156565b96506020880135955060408801356001600160401b0381111561120057600080fd5b61120c8a828b01611172565b989b979a50986060810135976080820135975060a09091013595509350505050565b60006020828403121561124057600080fd5b81356001600160e01b03198116811461087057600080fd5b60008060008060008060a0878903121561127157600080fd5b61127a87611156565b95506020870135945060408701356001600160401b0381111561129c57600080fd5b6112a889828a01611172565b979a9699509760608101359660809091013595509350505050565b6000602082840312156112d557600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561131a5761131a6112dc565b604052919050565b600082601f83011261133357600080fd5b81356001600160401b0381111561134c5761134c6112dc565b61135f601f8201601f19166020016112f2565b81815284602083860101111561137457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156113a757600080fd5b6113b085611156565b93506113be60208601611156565b92506040850135915060608501356001600160401b038111156113e057600080fd5b6113ec87828801611322565b91505092959194509250565b6000806040838503121561140b57600080fd5b8235915061141b60208401611156565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b602081016004831061145c57634e487b7160e01b600052602160045260246000fd5b91905290565b60008083601f84011261147457600080fd5b5081356001600160401b0381111561148b57600080fd5b6020830191508360208260051b85010111156111b357600080fd5b600080600080600080600080600060c08a8c0312156114c457600080fd5b89356001600160401b03808211156114db57600080fd5b6114e78d838e01611462565b909b50995060208c013591508082111561150057600080fd5b61150c8d838e01611462565b909950975060408c013591508082111561152557600080fd5b506115328c828d01611462565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561157357600080fd5b88356001600160401b038082111561158a57600080fd5b6115968c838d01611462565b909a50985060208b01359150808211156115af57600080fd5b6115bb8c838d01611462565b909850965060408b01359150808211156115d457600080fd5b506115e18b828c01611462565b999c989b509699959896976060870135966080013595509350505050565b600082601f83011261161057600080fd5b813560206001600160401b0382111561162b5761162b6112dc565b8160051b61163a8282016112f2565b928352848101820192828101908785111561165457600080fd5b83870192505b848310156116735782358252918301919083019061165a565b979650505050505050565b600080600080600060a0868803121561169657600080fd5b61169f86611156565b94506116ad60208701611156565b935060408601356001600160401b03808211156116c957600080fd5b6116d589838a016115ff565b945060608801359150808211156116eb57600080fd5b6116f789838a016115ff565b9350608088013591508082111561170d57600080fd5b5061171a88828901611322565b9150509295509295909350565b600080600080600060a0868803121561173f57600080fd5b61174886611156565b945061175660208701611156565b9350604086013592506060860135915060808601356001600160401b0381111561177f57600080fd5b61171a88828901611322565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a0604082015260006117dc60a08301868861178b565b60608301949094525060800152949350505050565b60018060a01b038516815283602082015260606040820152600061181960608301848661178b565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561184b57600080fd5b61087082611156565b6000808335601e1984360301811261186b57600080fd5b8301803591506001600160401b0382111561188557600080fd5b6020019150368190038213156111b357600080fd5b6000838385526020808601955060208560051b8301018460005b8781101561192357848303601f19018952813536889003601e190181126118da57600080fd5b870184810190356001600160401b038111156118f557600080fd5b80360382131561190457600080fd5b61190f85828461178b565b9a86019a94505050908301906001016118b4565b5090979650505050505050565b60a0808252810188905260008960c08301825b8b811015611971576001600160a01b0361195c84611156565b16825260209283019290910190600101611943565b5083810360208501528881526001600160fb1b0389111561199157600080fd5b8860051b9150818a602083013701828103602090810160408501526119b9908201878961189a565b60608401959095525050608001529695505050505050565b808201808211156106bf57634e487b7160e01b600052601160045260246000fd5b818382376000910190815291905056fea26469706673582212208b7d4906d8ae4a7bcf3f7e4af04af3a5811504f1ac624afa8e9ba6dbbcc6136464736f6c63430008180033a26469706673582212205911324004849c77445c3b2494cdf0d7b6b43f3d39e91829d2efd16f6c8e7de064736f6c63430008180033", + "linkReferences": {}, + "deployedLinkReferences": {} + } + \ No newline at end of file diff --git a/src/assets/abis/hb_wrapper.json b/src/assets/abis/hb_wrapper.json new file mode 100644 index 00000000..4ad8c43e --- /dev/null +++ b/src/assets/abis/hb_wrapper.json @@ -0,0 +1,255 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "WrapperContract", + "sourceName": "contracts/Factories.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenFactory", + "type": "address" + }, + { + "internalType": "address", + "name": "_timelockFactory", + "type": "address" + }, + { + "internalType": "address", + "name": "_daoFactory", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "dao", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "initialMembers", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "initialAmounts", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "description", + "type": "string" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "executionDelay", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "registry", + "type": "address" + }, + { + "indexed": false, + "internalType": "string[]", + "name": "keys", + "type": "string[]" + }, + { + "indexed": false, + "internalType": "string[]", + "name": "values", + "type": "string[]" + } + ], + "name": "NewDaoCreated", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + }, + { + "internalType": "uint8", + "name": "decimals", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "executionDelay", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "initialMembers", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "initialAmounts", + "type": "uint256[]" + }, + { + "internalType": "string[]", + "name": "keys", + "type": "string[]" + }, + { + "internalType": "string[]", + "name": "values", + "type": "string[]" + } + ], + "internalType": "struct WrapperContract.DaoParams", + "name": "params", + "type": "tuple" + } + ], + "name": "deployDAOwithToken", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "deployedDAOs", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "deployedRegistries", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "deployedTimelocks", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "deployedTokens", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getNumberOfDAOs", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5060405161251f38038061251f83398101604081905261002f9161008d565b600080546001600160a01b039485166001600160a01b0319918216179091556001805493851693821693909317909255600280549190931691161790556100d0565b80516001600160a01b038116811461008857600080fd5b919050565b6000806000606084860312156100a257600080fd5b6100ab84610071565b92506100b960208501610071565b91506100c760408501610071565b90509250925092565b612440806100df6000396000f3fe6080604052600436106100555760003560e01c8063104af3e41461005a57806319e0b288146100975780631ecbdf63146100b75780634cfff150146100d7578063b7ec0122146100ec578063ec81aadb1461010a575b600080fd5b34801561006657600080fd5b5061007a6100753660046107ed565b61012a565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100a357600080fd5b5061007a6100b23660046107ed565b610154565b3480156100c357600080fd5b5061007a6100d23660046107ed565b610164565b6100ea6100e5366004610a90565b610174565b005b3480156100f857600080fd5b5060035460405190815260200161008e565b34801561011657600080fd5b5061007a6101253660046107ed565b610467565b6006818154811061013a57600080fd5b6000918252602090912001546001600160a01b0316905081565b6003818154811061013a57600080fd5b6005818154811061013a57600080fd5b60a081015151610185906004610bf5565b8160c001515110156101f85760405162461bcd60e51b815260206004820152603260248201527f496e73756666696369656e742073657474696e6773206461746120696e20696e604482015271697469616c416d6f756e747320617272617960701b606482015260840160405180910390fd5b6000805482516020840151606085015160a086015160c0870151604051634adaab4b60e11b81526001600160a01b03909616956395b5569695610245959094909390929091600401610cd8565b6020604051808303816000875af1158015610264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102889190610d3a565b6001546080840151604051638c9513bb60e01b815230600482015260248101919091529192506000916001600160a01b0390911690638c9513bb906044016020604051808303816000875af11580156102e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103099190610d3a565b600254845160c086015160405163012c36e160e31b81529394506000936001600160a01b0390931692630961b7089261034a92889288929190600401610d5e565b6020604051808303816000875af1158015610369573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038d9190610d3a565b90506000823060405161039f906107e0565b6001600160a01b03928316815291166020820152604001604051809103906000f0801580156103d2573d6000803e3d6000fd5b5090506103ec828585848960e001518a6101000151610477565b816001600160a01b03167f01c5013cf023a364cc49643b8f57347e398d2f0db0968edeb64e7c41bf2dfbde858760a001518860c0015189600001518a602001518b604001518c60800151898e60e001518f61010001516040516104589a99989796959493929190610e01565b60405180910390a25050505050565b6004818154811061013a57600080fd5b6003805460018181019092557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b03808a166001600160a01b0319928316179092556004805480850182557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180548a85169084168117909155600580548087019091557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180548a86169085161790556006805495860181556000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f909401805493881693909216929092179055604051633825b60160e11b815263704b6c029161059e918891016001600160a01b0391909116815260200190565b600060405180830381600087803b1580156105b857600080fd5b505af11580156105cc573d6000803e3d6000fd5b505050506000849050806001600160a01b0316632f2ff15d826001600160a01b0316638f61f4f56040518163ffffffff1660e01b8152600401602060405180830381865afa158015610622573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106469190610ec1565b6040516001600160e01b031960e084901b16815260048101919091526001600160a01b038a166024820152604401600060405180830381600087803b15801561068e57600080fd5b505af11580156106a2573d6000803e3d6000fd5b50505050806001600160a01b0316632f2ff15d826001600160a01b03166307bd02656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107179190610ec1565b6040516001600160e01b031960e084901b16815260048101919091526001600160a01b038a166024820152604401600060405180830381600087803b15801561075f57600080fd5b505af1158015610773573d6000803e3d6000fd5b505060405163223e3d0960e21b81526001600160a01b03871692506388f8f42491506107a59086908690600401610eda565b600060405180830381600087803b1580156107bf57600080fd5b505af11580156107d3573d6000803e3d6000fd5b5050505050505050505050565b61150280610f0983390190565b6000602082840312156107ff57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051610120810167ffffffffffffffff8111828210171561084057610840610806565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561086f5761086f610806565b604052919050565b600082601f83011261088857600080fd5b813567ffffffffffffffff8111156108a2576108a2610806565b6108b5601f8201601f1916602001610846565b8181528460208386010111156108ca57600080fd5b816020850160208301376000918101602001919091529392505050565b803560ff811681146108f857600080fd5b919050565b600067ffffffffffffffff82111561091757610917610806565b5060051b60200190565b6001600160a01b038116811461093657600080fd5b50565b600082601f83011261094a57600080fd5b8135602061095f61095a836108fd565b610846565b8083825260208201915060208460051b87010193508684111561098157600080fd5b602086015b848110156109a657803561099981610921565b8352918301918301610986565b509695505050505050565b600082601f8301126109c257600080fd5b813560206109d261095a836108fd565b8083825260208201915060208460051b8701019350868411156109f457600080fd5b602086015b848110156109a657803583529183019183016109f9565b600082601f830112610a2157600080fd5b81356020610a3161095a836108fd565b82815260059290921b84018101918181019086841115610a5057600080fd5b8286015b848110156109a657803567ffffffffffffffff811115610a745760008081fd5b610a828986838b0101610877565b845250918301918301610a54565b600060208284031215610aa257600080fd5b813567ffffffffffffffff80821115610aba57600080fd5b908301906101208286031215610acf57600080fd5b610ad761081c565b823582811115610ae657600080fd5b610af287828601610877565b825250602083013582811115610b0757600080fd5b610b1387828601610877565b602083015250604083013582811115610b2b57600080fd5b610b3787828601610877565b604083015250610b49606084016108e7565b60608201526080830135608082015260a083013582811115610b6a57600080fd5b610b7687828601610939565b60a08301525060c083013582811115610b8e57600080fd5b610b9a878286016109b1565b60c08301525060e083013582811115610bb257600080fd5b610bbe87828601610a10565b60e0830152506101008084013583811115610bd857600080fd5b610be488828701610a10565b918301919091525095945050505050565b80820180821115610c1657634e487b7160e01b600052601160045260246000fd5b92915050565b6000815180845260005b81811015610c4257602081850181015186830182015201610c26565b506000602082860101526020601f19601f83011685010191505092915050565b60008151808452602080850194506020840160005b83811015610c9c5781516001600160a01b031687529582019590820190600101610c77565b509495945050505050565b60008151808452602080850194506020840160005b83811015610c9c57815187529582019590820190600101610cbc565b60a081526000610ceb60a0830188610c1c565b8281036020840152610cfd8188610c1c565b905060ff861660408401528281036060840152610d1a8186610c62565b90508281036080840152610d2e8185610ca7565b98975050505050505050565b600060208284031215610d4c57600080fd5b8151610d5781610921565b9392505050565b6001600160a01b03858116825284166020820152608060408201819052600090610d8a90830185610c1c565b8281036060840152610d9c8185610ca7565b979650505050505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015610df457601f19868403018952610de2838351610c1c565b98840198925090830190600101610dc6565b5090979650505050505050565b6001600160a01b038b8116825261014060208301819052600091610e278483018e610c62565b91508382036040850152610e3b828d610ca7565b91508382036060850152610e4f828c610c1c565b91508382036080850152610e63828b610c1c565b915083820360a0850152610e77828a610c1c565b91508760c085015280871660e085015250828103610100840152610e9b8186610da7565b9050828103610120840152610eb08185610da7565b9d9c50505050505050505050505050565b600060208284031215610ed357600080fd5b5051919050565b604081526000610eed6040830185610da7565b8281036020840152610eff8185610da7565b9594505050505056fe608060405234801561001057600080fd5b506040516200150238038062001502833981016040819052610031916100dd565b60016000556001600160a01b0382166100905760405162461bcd60e51b815260206004820152601c60248201527f4f776e657220616464726573732063616e6e6f74206265207a65726f00000000604482015260640160405180910390fd5b600380546001600160a01b039384166001600160a01b03199182161790915560048054929093169116179055610110565b80516001600160a01b03811681146100d857600080fd5b919050565b600080604083850312156100f057600080fd5b6100f9836100c1565b9150610107602084016100c1565b90509250929050565b6113e280620001206000396000f3fe6080604052600436106100a05760003560e01c806388f8f4241161006457806388f8f424146101ae5780638da5cb5b146101ce578063981f5499146102065780639db5dbe414610228578063ac210cc714610248578063bc87eed31461026857600080fd5b8063150b7a02146100e15780631aca63761461011f5780632559ddf5146101415780632e9c247b146101615780637b1a49091461018e57600080fd5b366100dc5760405134815233907f4103257eaac983ca79a70d28f90dfc4fa16b619bb0c17ee7cab0d4034c2796249060200160405180910390a2005b600080fd5b3480156100ed57600080fd5b506101016100fc366004610ce7565b61027d565b6040516001600160e01b031990911681526020015b60405180910390f35b34801561012b57600080fd5b5061013f61013a366004610d86565b6102de565b005b34801561014d57600080fd5b5061013f61015c366004610e7e565b610420565b34801561016d57600080fd5b5061018161017c366004610ee2565b610568565b6040516101169190610f6f565b34801561019a57600080fd5b5061013f6101a9366004610f89565b610618565b3480156101ba57600080fd5b5061013f6101c9366004611054565b610766565b3480156101da57600080fd5b506003546101ee906001600160a01b031681565b6040516001600160a01b039091168152602001610116565b34801561021257600080fd5b5061021b6108c8565b60405161011691906110ae565b34801561023457600080fd5b5061013f610243366004610d86565b610a1a565b34801561025457600080fd5b506004546101ee906001600160a01b031681565b34801561027457600080fd5b5061021b610b55565b6000336001600160a01b0316856001600160a01b03167fa7623ac946123c8343a3277b72c66662dab5c4784cebe18bb73311b3d41882a7866040516102c491815260200190565b60405180910390a350630a85bd0160e11b95945050505050565b6003546001600160a01b031633146103115760405162461bcd60e51b815260040161030890611112565b60405180910390fd5b61031a83610c2e565b6103665760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e206973206e6f7420612076616c69642045524337323100000000006044820152606401610308565b604051632142170760e11b81523060048201526001600160a01b038381166024830152604482018390528416906342842e0e90606401600060405180830381600087803b1580156103b657600080fd5b505af11580156103ca573d6000803e3d6000fd5b50505050816001600160a01b0316836001600160a01b03167fc461d0f02e326879d642fc0b955c081fd7827836382a43e99fe5df550589b0118360405161041391815260200190565b60405180910390a3505050565b6003546001600160a01b031633148061044357506004546001600160a01b031633145b61048f5760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c79207468652044414f2063616e206564697420726567697374727900006044820152606401610308565b60018260405161049f9190611149565b908152602001604051809103902080546104b890611165565b90506000036104ff57600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace016104fd83826111e9565b505b806001836040516105109190611149565b9081526020016040518091039020908161052a91906111e9565b507f7b86c5d3c943fd36e157d1f4f62c14255da7cef7e527b7066f90325657091a0c828260405161055c9291906112a9565b60405180910390a15050565b606060018260405161057a9190611149565b9081526020016040518091039020805461059390611165565b80601f01602080910402602001604051908101604052809291908181526020018280546105bf90611165565b801561060c5780601f106105e15761010080835404028352916020019161060c565b820191906000526020600020905b8154815290600101906020018083116105ef57829003601f168201915b50505050509050919050565b6003546001600160a01b031633146106425760405162461bcd60e51b815260040161030890611112565b61064a610ca5565b804710156106915760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610308565b60405147906001600160a01b0384169083156108fc029084906000818181858888f193505050501580156106c9573d6000803e3d6000fd5b506106d482826112d7565b47146107145760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610308565b826001600160a01b03167fba7bb5aa419c34d8776b86cc0e9d41e72d74a893a511f361a11af6c05e920c3d8360405161074f91815260200190565b60405180910390a2506107626001600055565b5050565b6003546001600160a01b031633148061078957506004546001600160a01b031633145b6107d55760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c79207468652044414f2063616e206564697420726567697374727900006044820152606401610308565b60005b82518110156108c35760008382815181106107f5576107f56112fe565b602002602001015190506000838381518110610813576108136112fe565b6020026020010151905060018260405161082d9190611149565b9081526020016040518091039020805461084690611165565b905060000361088d57600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0161088b83826111e9565b505b8060018360405161089e9190611149565b908152602001604051809103902090816108b891906111e9565b5050506001016107d8565b505050565b60025460609060009067ffffffffffffffff8111156108e9576108e9610dc7565b60405190808252806020026020018201604052801561091c57816020015b60608152602001906001900390816109075790505b50905060005b600254811015610a1457600160028281548110610941576109416112fe565b906000526020600020016040516109589190611314565b9081526020016040518091039020805461097190611165565b80601f016020809104026020016040519081016040528092919081815260200182805461099d90611165565b80156109ea5780601f106109bf576101008083540402835291602001916109ea565b820191906000526020600020905b8154815290600101906020018083116109cd57829003601f168201915b5050505050828281518110610a0157610a016112fe565b6020908102919091010152600101610922565b50919050565b6003546001600160a01b03163314610a445760405162461bcd60e51b815260040161030890611112565b60405163a9059cbb60e01b81526001600160a01b038381166004830152602482018390526000919085169063a9059cbb906044016020604051808303816000875af1158015610a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abb919061138a565b905080610b025760405162461bcd60e51b8152602060048201526015602482015274115490cc8c081d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610308565b826001600160a01b0316846001600160a01b03167f3ed03153e9c248019b0420ed4652ed13c51da0ec7ecc09eb2d3b70f2064be64b84604051610b4791815260200190565b60405180910390a350505050565b60606002805480602002602001604051908101604052809291908181526020016000905b82821015610c25578382906000526020600020018054610b9890611165565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc490611165565b8015610c115780601f10610be657610100808354040283529160200191610c11565b820191906000526020600020905b815481529060010190602001808311610bf457829003601f168201915b505050505081526020019060010190610b79565b50505050905090565b604051632142170760e11b815230600482018190526024820152600060448201819052906001600160a01b038316906342842e0e90606401600060405180830381600087803b158015610c8057600080fd5b505af1925050508015610c91575060015b610c9d57506000919050565b506001919050565b600260005403610cc857604051633ee5aeb560e01b815260040160405180910390fd5b6002600055565b6001600160a01b0381168114610ce457600080fd5b50565b600080600080600060808688031215610cff57600080fd5b8535610d0a81610ccf565b94506020860135610d1a81610ccf565b935060408601359250606086013567ffffffffffffffff80821115610d3e57600080fd5b818801915088601f830112610d5257600080fd5b813581811115610d6157600080fd5b896020828501011115610d7357600080fd5b9699959850939650602001949392505050565b600080600060608486031215610d9b57600080fd5b8335610da681610ccf565b92506020840135610db681610ccf565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610e0657610e06610dc7565b604052919050565b600082601f830112610e1f57600080fd5b813567ffffffffffffffff811115610e3957610e39610dc7565b610e4c601f8201601f1916602001610ddd565b818152846020838601011115610e6157600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215610e9157600080fd5b823567ffffffffffffffff80821115610ea957600080fd5b610eb586838701610e0e565b93506020850135915080821115610ecb57600080fd5b50610ed885828601610e0e565b9150509250929050565b600060208284031215610ef457600080fd5b813567ffffffffffffffff811115610f0b57600080fd5b610f1784828501610e0e565b949350505050565b60005b83811015610f3a578181015183820152602001610f22565b50506000910152565b60008151808452610f5b816020860160208601610f1f565b601f01601f19169290920160200192915050565b602081526000610f826020830184610f43565b9392505050565b60008060408385031215610f9c57600080fd5b8235610fa781610ccf565b946020939093013593505050565b600082601f830112610fc657600080fd5b8135602067ffffffffffffffff80831115610fe357610fe3610dc7565b8260051b610ff2838201610ddd565b938452858101830193838101908886111561100c57600080fd5b84880192505b858310156110485782358481111561102a5760008081fd5b6110388a87838c0101610e0e565b8352509184019190840190611012565b98975050505050505050565b6000806040838503121561106757600080fd5b823567ffffffffffffffff8082111561107f57600080fd5b61108b86838701610fb5565b935060208501359150808211156110a157600080fd5b50610ed885828601610fb5565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561110557603f198886030184526110f3858351610f43565b945092850192908501906001016110d7565b5092979650505050505050565b6020808252601f908201527f4f6e6c79207468652044414f2063616e206d616b65207472616e736665727300604082015260600190565b6000825161115b818460208701610f1f565b9190910192915050565b600181811c9082168061117957607f821691505b602082108103610a1457634e487b7160e01b600052602260045260246000fd5b601f8211156108c3576000816000526020600020601f850160051c810160208610156111c25750805b601f850160051c820191505b818110156111e1578281556001016111ce565b505050505050565b815167ffffffffffffffff81111561120357611203610dc7565b611217816112118454611165565b84611199565b602080601f83116001811461124c57600084156112345750858301515b600019600386901b1c1916600185901b1785556111e1565b600085815260208120601f198616915b8281101561127b5788860151825594840194600190910190840161125c565b50858210156112995787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815260006112bc6040830185610f43565b82810360208401526112ce8185610f43565b95945050505050565b818103818111156112f857634e487b7160e01b600052601160045260246000fd5b92915050565b634e487b7160e01b600052603260045260246000fd5b600080835461132281611165565b6001828116801561133a576001811461134f5761137e565b60ff198416875282151583028701945061137e565b8760005260208060002060005b858110156113755781548a82015290840190820161135c565b50505082870194505b50929695505050505050565b60006020828403121561139c57600080fd5b81518015158114610f8257600080fdfea2646970667358221220837b3ce23c3d441ddd2b50cc690305c50de34a5cbdb8f62ead0bb9423aeb64f664736f6c63430008180033a2646970667358221220289e93b874e060ab7744631a500caf935dcb9eb1222154b3cd8b4b5b0c8714d464736f6c63430008180033", + "deployedBytecode": "0x6080604052600436106100555760003560e01c8063104af3e41461005a57806319e0b288146100975780631ecbdf63146100b75780634cfff150146100d7578063b7ec0122146100ec578063ec81aadb1461010a575b600080fd5b34801561006657600080fd5b5061007a6100753660046107ed565b61012a565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100a357600080fd5b5061007a6100b23660046107ed565b610154565b3480156100c357600080fd5b5061007a6100d23660046107ed565b610164565b6100ea6100e5366004610a90565b610174565b005b3480156100f857600080fd5b5060035460405190815260200161008e565b34801561011657600080fd5b5061007a6101253660046107ed565b610467565b6006818154811061013a57600080fd5b6000918252602090912001546001600160a01b0316905081565b6003818154811061013a57600080fd5b6005818154811061013a57600080fd5b60a081015151610185906004610bf5565b8160c001515110156101f85760405162461bcd60e51b815260206004820152603260248201527f496e73756666696369656e742073657474696e6773206461746120696e20696e604482015271697469616c416d6f756e747320617272617960701b606482015260840160405180910390fd5b6000805482516020840151606085015160a086015160c0870151604051634adaab4b60e11b81526001600160a01b03909616956395b5569695610245959094909390929091600401610cd8565b6020604051808303816000875af1158015610264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102889190610d3a565b6001546080840151604051638c9513bb60e01b815230600482015260248101919091529192506000916001600160a01b0390911690638c9513bb906044016020604051808303816000875af11580156102e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103099190610d3a565b600254845160c086015160405163012c36e160e31b81529394506000936001600160a01b0390931692630961b7089261034a92889288929190600401610d5e565b6020604051808303816000875af1158015610369573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038d9190610d3a565b90506000823060405161039f906107e0565b6001600160a01b03928316815291166020820152604001604051809103906000f0801580156103d2573d6000803e3d6000fd5b5090506103ec828585848960e001518a6101000151610477565b816001600160a01b03167f01c5013cf023a364cc49643b8f57347e398d2f0db0968edeb64e7c41bf2dfbde858760a001518860c0015189600001518a602001518b604001518c60800151898e60e001518f61010001516040516104589a99989796959493929190610e01565b60405180910390a25050505050565b6004818154811061013a57600080fd5b6003805460018181019092557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b03808a166001600160a01b0319928316179092556004805480850182557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180548a85169084168117909155600580548087019091557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180548a86169085161790556006805495860181556000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f909401805493881693909216929092179055604051633825b60160e11b815263704b6c029161059e918891016001600160a01b0391909116815260200190565b600060405180830381600087803b1580156105b857600080fd5b505af11580156105cc573d6000803e3d6000fd5b505050506000849050806001600160a01b0316632f2ff15d826001600160a01b0316638f61f4f56040518163ffffffff1660e01b8152600401602060405180830381865afa158015610622573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106469190610ec1565b6040516001600160e01b031960e084901b16815260048101919091526001600160a01b038a166024820152604401600060405180830381600087803b15801561068e57600080fd5b505af11580156106a2573d6000803e3d6000fd5b50505050806001600160a01b0316632f2ff15d826001600160a01b03166307bd02656040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107179190610ec1565b6040516001600160e01b031960e084901b16815260048101919091526001600160a01b038a166024820152604401600060405180830381600087803b15801561075f57600080fd5b505af1158015610773573d6000803e3d6000fd5b505060405163223e3d0960e21b81526001600160a01b03871692506388f8f42491506107a59086908690600401610eda565b600060405180830381600087803b1580156107bf57600080fd5b505af11580156107d3573d6000803e3d6000fd5b5050505050505050505050565b61150280610f0983390190565b6000602082840312156107ff57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051610120810167ffffffffffffffff8111828210171561084057610840610806565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561086f5761086f610806565b604052919050565b600082601f83011261088857600080fd5b813567ffffffffffffffff8111156108a2576108a2610806565b6108b5601f8201601f1916602001610846565b8181528460208386010111156108ca57600080fd5b816020850160208301376000918101602001919091529392505050565b803560ff811681146108f857600080fd5b919050565b600067ffffffffffffffff82111561091757610917610806565b5060051b60200190565b6001600160a01b038116811461093657600080fd5b50565b600082601f83011261094a57600080fd5b8135602061095f61095a836108fd565b610846565b8083825260208201915060208460051b87010193508684111561098157600080fd5b602086015b848110156109a657803561099981610921565b8352918301918301610986565b509695505050505050565b600082601f8301126109c257600080fd5b813560206109d261095a836108fd565b8083825260208201915060208460051b8701019350868411156109f457600080fd5b602086015b848110156109a657803583529183019183016109f9565b600082601f830112610a2157600080fd5b81356020610a3161095a836108fd565b82815260059290921b84018101918181019086841115610a5057600080fd5b8286015b848110156109a657803567ffffffffffffffff811115610a745760008081fd5b610a828986838b0101610877565b845250918301918301610a54565b600060208284031215610aa257600080fd5b813567ffffffffffffffff80821115610aba57600080fd5b908301906101208286031215610acf57600080fd5b610ad761081c565b823582811115610ae657600080fd5b610af287828601610877565b825250602083013582811115610b0757600080fd5b610b1387828601610877565b602083015250604083013582811115610b2b57600080fd5b610b3787828601610877565b604083015250610b49606084016108e7565b60608201526080830135608082015260a083013582811115610b6a57600080fd5b610b7687828601610939565b60a08301525060c083013582811115610b8e57600080fd5b610b9a878286016109b1565b60c08301525060e083013582811115610bb257600080fd5b610bbe87828601610a10565b60e0830152506101008084013583811115610bd857600080fd5b610be488828701610a10565b918301919091525095945050505050565b80820180821115610c1657634e487b7160e01b600052601160045260246000fd5b92915050565b6000815180845260005b81811015610c4257602081850181015186830182015201610c26565b506000602082860101526020601f19601f83011685010191505092915050565b60008151808452602080850194506020840160005b83811015610c9c5781516001600160a01b031687529582019590820190600101610c77565b509495945050505050565b60008151808452602080850194506020840160005b83811015610c9c57815187529582019590820190600101610cbc565b60a081526000610ceb60a0830188610c1c565b8281036020840152610cfd8188610c1c565b905060ff861660408401528281036060840152610d1a8186610c62565b90508281036080840152610d2e8185610ca7565b98975050505050505050565b600060208284031215610d4c57600080fd5b8151610d5781610921565b9392505050565b6001600160a01b03858116825284166020820152608060408201819052600090610d8a90830185610c1c565b8281036060840152610d9c8185610ca7565b979650505050505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015610df457601f19868403018952610de2838351610c1c565b98840198925090830190600101610dc6565b5090979650505050505050565b6001600160a01b038b8116825261014060208301819052600091610e278483018e610c62565b91508382036040850152610e3b828d610ca7565b91508382036060850152610e4f828c610c1c565b91508382036080850152610e63828b610c1c565b915083820360a0850152610e77828a610c1c565b91508760c085015280871660e085015250828103610100840152610e9b8186610da7565b9050828103610120840152610eb08185610da7565b9d9c50505050505050505050505050565b600060208284031215610ed357600080fd5b5051919050565b604081526000610eed6040830185610da7565b8281036020840152610eff8185610da7565b9594505050505056fe608060405234801561001057600080fd5b506040516200150238038062001502833981016040819052610031916100dd565b60016000556001600160a01b0382166100905760405162461bcd60e51b815260206004820152601c60248201527f4f776e657220616464726573732063616e6e6f74206265207a65726f00000000604482015260640160405180910390fd5b600380546001600160a01b039384166001600160a01b03199182161790915560048054929093169116179055610110565b80516001600160a01b03811681146100d857600080fd5b919050565b600080604083850312156100f057600080fd5b6100f9836100c1565b9150610107602084016100c1565b90509250929050565b6113e280620001206000396000f3fe6080604052600436106100a05760003560e01c806388f8f4241161006457806388f8f424146101ae5780638da5cb5b146101ce578063981f5499146102065780639db5dbe414610228578063ac210cc714610248578063bc87eed31461026857600080fd5b8063150b7a02146100e15780631aca63761461011f5780632559ddf5146101415780632e9c247b146101615780637b1a49091461018e57600080fd5b366100dc5760405134815233907f4103257eaac983ca79a70d28f90dfc4fa16b619bb0c17ee7cab0d4034c2796249060200160405180910390a2005b600080fd5b3480156100ed57600080fd5b506101016100fc366004610ce7565b61027d565b6040516001600160e01b031990911681526020015b60405180910390f35b34801561012b57600080fd5b5061013f61013a366004610d86565b6102de565b005b34801561014d57600080fd5b5061013f61015c366004610e7e565b610420565b34801561016d57600080fd5b5061018161017c366004610ee2565b610568565b6040516101169190610f6f565b34801561019a57600080fd5b5061013f6101a9366004610f89565b610618565b3480156101ba57600080fd5b5061013f6101c9366004611054565b610766565b3480156101da57600080fd5b506003546101ee906001600160a01b031681565b6040516001600160a01b039091168152602001610116565b34801561021257600080fd5b5061021b6108c8565b60405161011691906110ae565b34801561023457600080fd5b5061013f610243366004610d86565b610a1a565b34801561025457600080fd5b506004546101ee906001600160a01b031681565b34801561027457600080fd5b5061021b610b55565b6000336001600160a01b0316856001600160a01b03167fa7623ac946123c8343a3277b72c66662dab5c4784cebe18bb73311b3d41882a7866040516102c491815260200190565b60405180910390a350630a85bd0160e11b95945050505050565b6003546001600160a01b031633146103115760405162461bcd60e51b815260040161030890611112565b60405180910390fd5b61031a83610c2e565b6103665760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e206973206e6f7420612076616c69642045524337323100000000006044820152606401610308565b604051632142170760e11b81523060048201526001600160a01b038381166024830152604482018390528416906342842e0e90606401600060405180830381600087803b1580156103b657600080fd5b505af11580156103ca573d6000803e3d6000fd5b50505050816001600160a01b0316836001600160a01b03167fc461d0f02e326879d642fc0b955c081fd7827836382a43e99fe5df550589b0118360405161041391815260200190565b60405180910390a3505050565b6003546001600160a01b031633148061044357506004546001600160a01b031633145b61048f5760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c79207468652044414f2063616e206564697420726567697374727900006044820152606401610308565b60018260405161049f9190611149565b908152602001604051809103902080546104b890611165565b90506000036104ff57600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace016104fd83826111e9565b505b806001836040516105109190611149565b9081526020016040518091039020908161052a91906111e9565b507f7b86c5d3c943fd36e157d1f4f62c14255da7cef7e527b7066f90325657091a0c828260405161055c9291906112a9565b60405180910390a15050565b606060018260405161057a9190611149565b9081526020016040518091039020805461059390611165565b80601f01602080910402602001604051908101604052809291908181526020018280546105bf90611165565b801561060c5780601f106105e15761010080835404028352916020019161060c565b820191906000526020600020905b8154815290600101906020018083116105ef57829003601f168201915b50505050509050919050565b6003546001600160a01b031633146106425760405162461bcd60e51b815260040161030890611112565b61064a610ca5565b804710156106915760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610308565b60405147906001600160a01b0384169083156108fc029084906000818181858888f193505050501580156106c9573d6000803e3d6000fd5b506106d482826112d7565b47146107145760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610308565b826001600160a01b03167fba7bb5aa419c34d8776b86cc0e9d41e72d74a893a511f361a11af6c05e920c3d8360405161074f91815260200190565b60405180910390a2506107626001600055565b5050565b6003546001600160a01b031633148061078957506004546001600160a01b031633145b6107d55760405162461bcd60e51b815260206004820152601e60248201527f4f6e6c79207468652044414f2063616e206564697420726567697374727900006044820152606401610308565b60005b82518110156108c35760008382815181106107f5576107f56112fe565b602002602001015190506000838381518110610813576108136112fe565b6020026020010151905060018260405161082d9190611149565b9081526020016040518091039020805461084690611165565b905060000361088d57600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0161088b83826111e9565b505b8060018360405161089e9190611149565b908152602001604051809103902090816108b891906111e9565b5050506001016107d8565b505050565b60025460609060009067ffffffffffffffff8111156108e9576108e9610dc7565b60405190808252806020026020018201604052801561091c57816020015b60608152602001906001900390816109075790505b50905060005b600254811015610a1457600160028281548110610941576109416112fe565b906000526020600020016040516109589190611314565b9081526020016040518091039020805461097190611165565b80601f016020809104026020016040519081016040528092919081815260200182805461099d90611165565b80156109ea5780601f106109bf576101008083540402835291602001916109ea565b820191906000526020600020905b8154815290600101906020018083116109cd57829003601f168201915b5050505050828281518110610a0157610a016112fe565b6020908102919091010152600101610922565b50919050565b6003546001600160a01b03163314610a445760405162461bcd60e51b815260040161030890611112565b60405163a9059cbb60e01b81526001600160a01b038381166004830152602482018390526000919085169063a9059cbb906044016020604051808303816000875af1158015610a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abb919061138a565b905080610b025760405162461bcd60e51b8152602060048201526015602482015274115490cc8c081d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610308565b826001600160a01b0316846001600160a01b03167f3ed03153e9c248019b0420ed4652ed13c51da0ec7ecc09eb2d3b70f2064be64b84604051610b4791815260200190565b60405180910390a350505050565b60606002805480602002602001604051908101604052809291908181526020016000905b82821015610c25578382906000526020600020018054610b9890611165565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc490611165565b8015610c115780601f10610be657610100808354040283529160200191610c11565b820191906000526020600020905b815481529060010190602001808311610bf457829003601f168201915b505050505081526020019060010190610b79565b50505050905090565b604051632142170760e11b815230600482018190526024820152600060448201819052906001600160a01b038316906342842e0e90606401600060405180830381600087803b158015610c8057600080fd5b505af1925050508015610c91575060015b610c9d57506000919050565b506001919050565b600260005403610cc857604051633ee5aeb560e01b815260040160405180910390fd5b6002600055565b6001600160a01b0381168114610ce457600080fd5b50565b600080600080600060808688031215610cff57600080fd5b8535610d0a81610ccf565b94506020860135610d1a81610ccf565b935060408601359250606086013567ffffffffffffffff80821115610d3e57600080fd5b818801915088601f830112610d5257600080fd5b813581811115610d6157600080fd5b896020828501011115610d7357600080fd5b9699959850939650602001949392505050565b600080600060608486031215610d9b57600080fd5b8335610da681610ccf565b92506020840135610db681610ccf565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610e0657610e06610dc7565b604052919050565b600082601f830112610e1f57600080fd5b813567ffffffffffffffff811115610e3957610e39610dc7565b610e4c601f8201601f1916602001610ddd565b818152846020838601011115610e6157600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215610e9157600080fd5b823567ffffffffffffffff80821115610ea957600080fd5b610eb586838701610e0e565b93506020850135915080821115610ecb57600080fd5b50610ed885828601610e0e565b9150509250929050565b600060208284031215610ef457600080fd5b813567ffffffffffffffff811115610f0b57600080fd5b610f1784828501610e0e565b949350505050565b60005b83811015610f3a578181015183820152602001610f22565b50506000910152565b60008151808452610f5b816020860160208601610f1f565b601f01601f19169290920160200192915050565b602081526000610f826020830184610f43565b9392505050565b60008060408385031215610f9c57600080fd5b8235610fa781610ccf565b946020939093013593505050565b600082601f830112610fc657600080fd5b8135602067ffffffffffffffff80831115610fe357610fe3610dc7565b8260051b610ff2838201610ddd565b938452858101830193838101908886111561100c57600080fd5b84880192505b858310156110485782358481111561102a5760008081fd5b6110388a87838c0101610e0e565b8352509184019190840190611012565b98975050505050505050565b6000806040838503121561106757600080fd5b823567ffffffffffffffff8082111561107f57600080fd5b61108b86838701610fb5565b935060208501359150808211156110a157600080fd5b50610ed885828601610fb5565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561110557603f198886030184526110f3858351610f43565b945092850192908501906001016110d7565b5092979650505050505050565b6020808252601f908201527f4f6e6c79207468652044414f2063616e206d616b65207472616e736665727300604082015260600190565b6000825161115b818460208701610f1f565b9190910192915050565b600181811c9082168061117957607f821691505b602082108103610a1457634e487b7160e01b600052602260045260246000fd5b601f8211156108c3576000816000526020600020601f850160051c810160208610156111c25750805b601f850160051c820191505b818110156111e1578281556001016111ce565b505050505050565b815167ffffffffffffffff81111561120357611203610dc7565b611217816112118454611165565b84611199565b602080601f83116001811461124c57600084156112345750858301515b600019600386901b1c1916600185901b1785556111e1565b600085815260208120601f198616915b8281101561127b5788860151825594840194600190910190840161125c565b50858210156112995787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815260006112bc6040830185610f43565b82810360208401526112ce8185610f43565b95945050505050565b818103818111156112f857634e487b7160e01b600052601160045260246000fd5b92915050565b634e487b7160e01b600052603260045260246000fd5b600080835461132281611165565b6001828116801561133a576001811461134f5761137e565b60ff198416875282151583028701945061137e565b8760005260208060002060005b858110156113755781548a82015290840190820161135c565b50505082870194505b50929695505050505050565b60006020828403121561139c57600080fd5b81518015158114610f8257600080fdfea2646970667358221220837b3ce23c3d441ddd2b50cc690305c50de34a5cbdb8f62ead0bb9423aeb64f664736f6c63430008180033a2646970667358221220289e93b874e060ab7744631a500caf935dcb9eb1222154b3cd8b4b5b0c8714d464736f6c63430008180033", + "linkReferences": {}, + "deployedLinkReferences": {} + } + \ No newline at end of file diff --git a/src/modules/etherlink/components/EvmTreasuryTable.tsx b/src/modules/etherlink/components/EvmTreasuryTable.tsx index 30e33336..dde3b90d 100644 --- a/src/modules/etherlink/components/EvmTreasuryTable.tsx +++ b/src/modules/etherlink/components/EvmTreasuryTable.tsx @@ -10,8 +10,8 @@ import { useContext } from "react" import { EtherlinkContext } from "services/wagmi/context" export const EvmTreasuryTable = () => { - const { daoSelected } = useContext(EtherlinkContext) - console.log("daoSelected", daoSelected) + const { daoSelected, daoRegistryDetails } = useContext(EtherlinkContext) + console.log("daoSelected", daoRegistryDetails) return ( @@ -26,12 +26,12 @@ export const EvmTreasuryTable = () => { - Tezos + Etherink Testnet XTZ - 1000.00 + {daoRegistryDetails?.balance} - 0x1234...5678 + native token diff --git a/src/services/contracts/baseDAO/hooks/useOriginate.ts b/src/services/contracts/baseDAO/hooks/useOriginate.ts index 95823806..fe8042e6 100644 --- a/src/services/contracts/baseDAO/hooks/useOriginate.ts +++ b/src/services/contracts/baseDAO/hooks/useOriginate.ts @@ -14,10 +14,6 @@ import { getSignature } from "services/lite/utils" import { saveLiteCommunity } from "services/services/lite/lite-services" import { Community } from "models/Community" import { EnvKey, getEnv } from "services/config" -import HomebaseDaoEvm from "assets/abis/hb_dao.json" - -const ERC20_ABI = HomebaseDaoEvm.output.abi -const ERC20_BYTECODE = HomebaseDaoEvm.output.bytecode const INITIAL_STATES = [ { diff --git a/src/services/contracts/etherlinkDAO/hooks/temp-config.ts b/src/services/contracts/etherlinkDAO/hooks/temp-config.ts new file mode 100644 index 00000000..e78cc5f1 --- /dev/null +++ b/src/services/contracts/etherlinkDAO/hooks/temp-config.ts @@ -0,0 +1,1875 @@ +export const DAO_BYTECODE = + "610180604052348015610010575f80fd5b5060405161819f38038061819f83398181016040528101906100329190610c83565b806004836078610e1060016040518060400160405280600a81526020017f4d79476f7665726e6f7200000000000000000000000000000000000000000000815250806100826101c960201b60201c565b6100955f8361020660201b90919060201c565b61012081815250506100b160018261020660201b90919060201c565b6101408181525050818051906020012060e08181525050808051906020012061010081815250504660a081815250506100ee61025360201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250505050806003908161013a9190610efb565b505061014b836102ad60201b60201c565b61015a8261032060201b60201c565b610169816103d960201b60201c565b5050508073ffffffffffffffffffffffffffffffffffffffff166101608173ffffffffffffffffffffffffffffffffffffffff1681525050506101b18161041e60201b60201c565b506101c1816104f860201b60201c565b505050611459565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b5f602083511015610227576102208361059560201b60201c565b905061024d565b82610237836105fa60201b60201c565b5f0190816102459190610efb565b5060ff5f1b90505b92915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60e051610100514630604051602001610292959493929190611000565b60405160208183030381529060405280519060200120905090565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360085f9054906101000a900465ffffffffffff16826040516102f1929190611092565b60405180910390a18060085f6101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b5f8163ffffffff160361036a575f6040517ff1cfbf0500000000000000000000000000000000000000000000000000000000815260040161036191906110f2565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828600860069054906101000a900463ffffffff16826040516103ad92919061114a565b60405180910390a180600860066101000a81548163ffffffff021916908363ffffffff16021790555050565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc054616007548260405161040c929190611171565b60405180910390a18060078190555050565b5f61042d61060360201b60201c565b9050808211156104765781816040517f243e544500000000000000000000000000000000000000000000000000000000815260040161046d929190611171565b60405180910390fd5b5f61048561060b60201b60201c565b90506104b861049861063d60201b60201c565b6104a7856106d460201b60201c565b600a61074160201b9092919060201c565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781846040516104eb929190611171565b60405180910390a1505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260405161054a929190611198565b60405180910390a180600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f80829050601f815111156105e157826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016105d89190611225565b60405180910390fd5b8051816105ed90611272565b5f1c175f1b915050919050565b5f819050919050565b5f6064905090565b5f61061c600a61076260201b60201c565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff16905090565b5f61064c6107ca60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166391ddadf46040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156106b357506040513d601f19601f820116820180604052508101906106b09190611302565b60015b6106cc576106c56107d460201b60201c565b90506106d1565b809150505b90565b5f79ffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156107395760d0826040517f6dfcc650000000000000000000000000000000000000000000000000000000008152600401610730929190611372565b60405180910390fd5b819050919050565b5f80610756855f0185856107e960201b60201c565b91509150935093915050565b5f80825f018054905090505f81146107c057610792835f0160018361078791906113c6565b610b5d60201b60201c565b5f0160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff166107c2565b5f5b915050919050565b5f61016051905090565b5f6107e443610b6f60201b60201c565b905090565b5f805f858054905090505f811115610a75575f6108188760018461080d91906113c6565b610b5d60201b60201c565b6040518060400160405290815f82015f9054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020015f820160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff168152505090508565ffffffffffff16815f015165ffffffffffff161115610903576040517f2520601d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8565ffffffffffff16815f015165ffffffffffff160361098b578461093a8860018561092f91906113c6565b610b5d60201b60201c565b5f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550610a64565b8660405180604001604052808865ffffffffffff1681526020018779ffffffffffffffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a81548165ffffffffffff021916908365ffffffffffff1602179055506020820151815f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b806020015185935093505050610b55565b8560405180604001604052808765ffffffffffff1681526020018679ffffffffffffffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a81548165ffffffffffff021916908365ffffffffffff1602179055506020820151815f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505f8492509250505b935093915050565b5f825f528160205f2001905092915050565b5f65ffffffffffff8016821115610bc0576030826040517f6dfcc650000000000000000000000000000000000000000000000000000000008152600401610bb7929190611432565b60405180910390fd5b819050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610bf582610bcc565b9050919050565b5f610c0682610beb565b9050919050565b610c1681610bfc565b8114610c20575f80fd5b50565b5f81519050610c3181610c0d565b92915050565b5f610c4182610bcc565b9050919050565b5f610c5282610c37565b9050919050565b610c6281610c48565b8114610c6c575f80fd5b50565b5f81519050610c7d81610c59565b92915050565b5f8060408385031215610c9957610c98610bc8565b5b5f610ca685828601610c23565b9250506020610cb785828601610c6f565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680610d3c57607f821691505b602082108103610d4f57610d4e610cf8565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302610db17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610d76565b610dbb8683610d76565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f610dff610dfa610df584610dd3565b610ddc565b610dd3565b9050919050565b5f819050919050565b610e1883610de5565b610e2c610e2482610e06565b848454610d82565b825550505050565b5f90565b610e40610e34565b610e4b818484610e0f565b505050565b5b81811015610e6e57610e635f82610e38565b600181019050610e51565b5050565b601f821115610eb357610e8481610d55565b610e8d84610d67565b81016020851015610e9c578190505b610eb0610ea885610d67565b830182610e50565b50505b505050565b5f82821c905092915050565b5f610ed35f1984600802610eb8565b1980831691505092915050565b5f610eeb8383610ec4565b9150826002028217905092915050565b610f0482610cc1565b67ffffffffffffffff811115610f1d57610f1c610ccb565b5b610f278254610d25565b610f32828285610e72565b5f60209050601f831160018114610f63575f8415610f51578287015190505b610f5b8582610ee0565b865550610fc2565b601f198416610f7186610d55565b5f5b82811015610f9857848901518255600182019150602085019450602081019050610f73565b86831015610fb55784890151610fb1601f891682610ec4565b8355505b6001600288020188555050505b505050505050565b5f819050919050565b610fdc81610fca565b82525050565b610feb81610dd3565b82525050565b610ffa81610beb565b82525050565b5f60a0820190506110135f830188610fd3565b6110206020830187610fd3565b61102d6040830186610fd3565b61103a6060830185610fe2565b6110476080830184610ff1565b9695505050505050565b5f65ffffffffffff82169050919050565b5f61107c61107761107284611051565b610ddc565b610dd3565b9050919050565b61108c81611062565b82525050565b5f6040820190506110a55f830185611083565b6110b26020830184611083565b9392505050565b5f819050919050565b5f6110dc6110d76110d2846110b9565b610ddc565b610dd3565b9050919050565b6110ec816110c2565b82525050565b5f6020820190506111055f8301846110e3565b92915050565b5f63ffffffff82169050919050565b5f61113461112f61112a8461110b565b610ddc565b610dd3565b9050919050565b6111448161111a565b82525050565b5f60408201905061115d5f83018561113b565b61116a602083018461113b565b9392505050565b5f6040820190506111845f830185610fe2565b6111916020830184610fe2565b9392505050565b5f6040820190506111ab5f830185610ff1565b6111b86020830184610ff1565b9392505050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6111f782610cc1565b61120181856111bf565b93506112118185602086016111cf565b61121a816111dd565b840191505092915050565b5f6020820190508181035f83015261123d81846111ed565b905092915050565b5f81519050919050565b5f819050602082019050919050565b5f6112698251610fca565b80915050919050565b5f61127c82611245565b826112868461124f565b90506112918161125e565b925060208210156112d1576112cc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802610d76565b831692505b5050919050565b6112e181611051565b81146112eb575f80fd5b50565b5f815190506112fc816112d8565b92915050565b5f6020828403121561131757611316610bc8565b5b5f611324848285016112ee565b91505092915050565b5f819050919050565b5f60ff82169050919050565b5f61135c6113576113528461132d565b610ddc565b611336565b9050919050565b61136c81611342565b82525050565b5f6040820190506113855f830185611363565b6113926020830184610fe2565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6113d082610dd3565b91506113db83610dd3565b92508282039050818111156113f3576113f2611399565b5b92915050565b5f819050919050565b5f61141c611417611412846113f9565b610ddc565b611336565b9050919050565b61142c81611402565b82525050565b5f6040820190506114455f830185611423565b6114526020830184610fe2565b9392505050565b60805160a05160c05160e05161010051610120516101405161016051616ceb6114b45f395f611edc01525f612df701525f612dbc01525f61455601525f61453501525f61388d01525f6138e301525f61390c0152616ceb5ff3fe608060405260043610610296575f3560e01c80637ecebe0011610159578063c01f9e37116100c0578063e540d01d11610079578063e540d01d14610b89578063eb9019d414610bb1578063ece40cc114610bed578063f23a6e6114610c15578063f8ce560a14610c51578063fc0c546a14610c8d57610309565b8063c01f9e3714610a77578063c28bc2fa14610ab3578063c59057e414610acf578063d33219b414610b0b578063dd4e2ba514610b35578063deaaa7cc14610b5f57610309565b8063a7713a7011610112578063a7713a7014610947578063a890c91014610971578063a9a9529414610999578063ab58fb8e146109d5578063b58131b014610a11578063bc197c8114610a3b57610309565b80637ecebe001461080f57806384b0196e1461084b5780638ff262e31461087b57806391ddadf4146108b757806397c3d334146108e15780639a802a6d1461090b57610309565b806343859632116101fd5780635b8d0e0d116101b65780635b8d0e0d146106bb5780635f398a14146106f757806360c4247f14610733578063790518871461076f5780637b3c71d3146107975780637d5e81e2146107d357610309565b80634385963214610575578063452115d6146105b15780634bf5d7e9146105ed578063544ffc9c1461061757806354fd4d5014610655578063567813881461067f57610309565b8063160cbed71161024f578063160cbed71461043d5780632656227d146104795780632d63f693146104a95780632fe3e261146104e55780633932abb11461050f5780633e4f49e61461053957610309565b806301ffc9a71461030d57806302a251a31461034957806306f3f9e61461037357806306fdde031461039b578063143489d0146103c5578063150b7a021461040157610309565b36610309573073ffffffffffffffffffffffffffffffffffffffff166102ba610cb7565b73ffffffffffffffffffffffffffffffffffffffff1614610307576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b5f80fd5b348015610318575f80fd5b50610333600480360381019061032e91906148c7565b610cc5565b604051610340919061490c565b60405180910390f35b348015610354575f80fd5b5061035d610da6565b60405161036a919061493d565b60405180910390f35b34801561037e575f80fd5b5061039960048036038101906103949190614980565b610db4565b005b3480156103a6575f80fd5b506103af610dc8565b6040516103bc9190614a1b565b60405180910390f35b3480156103d0575f80fd5b506103eb60048036038101906103e69190614980565b610e58565b6040516103f89190614a7a565b60405180910390f35b34801561040c575f80fd5b5061042760048036038101906104229190614be9565b610e93565b6040516104349190614c78565b60405180910390f35b348015610448575f80fd5b50610463600480360381019061045e9190614f26565b610f12565b604051610470919061493d565b60405180910390f35b610493600480360381019061048e9190614f26565b611008565b6040516104a0919061493d565b60405180910390f35b3480156104b4575f80fd5b506104cf60048036038101906104ca9190614980565b6111e2565b6040516104dc919061493d565b60405180910390f35b3480156104f0575f80fd5b506104f9611218565b6040516105069190614fed565b60405180910390f35b34801561051a575f80fd5b5061052361123c565b604051610530919061493d565b60405180910390f35b348015610544575f80fd5b5061055f600480360381019061055a9190614980565b61124a565b60405161056c9190615079565b60405180910390f35b348015610580575f80fd5b5061059b60048036038101906105969190615092565b61125b565b6040516105a8919061490c565b60405180910390f35b3480156105bc575f80fd5b506105d760048036038101906105d29190614f26565b6112c0565b6040516105e4919061493d565b60405180910390f35b3480156105f8575f80fd5b50610601611380565b60405161060e9190614a1b565b60405180910390f35b348015610622575f80fd5b5061063d60048036038101906106389190614980565b61143d565b60405161064c939291906150d0565b60405180910390f35b348015610660575f80fd5b50610669611470565b6040516106769190614a1b565b60405180910390f35b34801561068a575f80fd5b506106a560048036038101906106a0919061513b565b6114ad565b6040516106b2919061493d565b60405180910390f35b3480156106c6575f80fd5b506106e160048036038101906106dc91906151d2565b6114dc565b6040516106ee919061493d565b60405180910390f35b348015610702575f80fd5b5061071d600480360381019061071891906152b4565b61160b565b60405161072a919061493d565b60405180910390f35b34801561073e575f80fd5b5061075960048036038101906107549190614980565b611673565b604051610766919061493d565b60405180910390f35b34801561077a575f80fd5b506107956004803603810190610790919061538f565b61176c565b005b3480156107a2575f80fd5b506107bd60048036038101906107b891906153ba565b611780565b6040516107ca919061493d565b60405180910390f35b3480156107de575f80fd5b506107f960048036038101906107f491906154c9565b6117e6565b604051610806919061493d565b60405180910390f35b34801561081a575f80fd5b506108356004803603810190610830919061559d565b6118d3565b604051610842919061493d565b60405180910390f35b348015610856575f80fd5b5061085f611919565b60405161087297969594939291906156b9565b60405180910390f35b348015610886575f80fd5b506108a1600480360381019061089c919061573b565b6119be565b6040516108ae919061493d565b60405180910390f35b3480156108c2575f80fd5b506108cb611a92565b6040516108d891906157ca565b60405180910390f35b3480156108ec575f80fd5b506108f5611b1d565b604051610902919061493d565b60405180910390f35b348015610916575f80fd5b50610931600480360381019061092c91906157e3565b611b25565b60405161093e919061493d565b60405180910390f35b348015610952575f80fd5b5061095b611b3a565b604051610968919061493d565b60405180910390f35b34801561097c575f80fd5b506109976004803603810190610992919061589b565b611b66565b005b3480156109a4575f80fd5b506109bf60048036038101906109ba9190614980565b611b7a565b6040516109cc919061490c565b60405180910390f35b3480156109e0575f80fd5b506109fb60048036038101906109f69190614980565b611b8b565b604051610a08919061493d565b60405180910390f35b348015610a1c575f80fd5b50610a25611bc1565b604051610a32919061493d565b60405180910390f35b348015610a46575f80fd5b50610a616004803603810190610a5c91906158c6565b611bcf565b604051610a6e9190614c78565b60405180910390f35b348015610a82575f80fd5b50610a9d6004803603810190610a989190614980565b611c4f565b604051610aaa919061493d565b60405180910390f35b610acd6004803603810190610ac891906159e6565b611cb9565b005b348015610ada575f80fd5b50610af56004803603810190610af09190614f26565b611d42565b604051610b02919061493d565b60405180910390f35b348015610b16575f80fd5b50610b1f611d7c565b604051610b2c9190614a7a565b60405180910390f35b348015610b40575f80fd5b50610b49611da4565b604051610b569190614a1b565b60405180910390f35b348015610b6a575f80fd5b50610b73611de1565b604051610b809190614fed565b60405180910390f35b348015610b94575f80fd5b50610baf6004803603810190610baa9190615a90565b611e05565b005b348015610bbc575f80fd5b50610bd76004803603810190610bd29190615abb565b611e19565b604051610be4919061493d565b60405180910390f35b348015610bf8575f80fd5b50610c136004803603810190610c0e9190614980565b611e34565b005b348015610c20575f80fd5b50610c3b6004803603810190610c369190615af9565b611e48565b604051610c489190614c78565b60405180910390f35b348015610c5c575f80fd5b50610c776004803603810190610c729190614980565b611ec8565b604051610c84919061493d565b60405180910390f35b348015610c98575f80fd5b50610ca1611ed9565b604051610cae9190615be7565b60405180910390f35b5f610cc0611f00565b905090565b5f7f65455a86000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d8f57507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d9f5750610d9e82611f28565b5b9050919050565b5f610daf611f91565b905090565b610dbc611fb0565b610dc5816120a5565b50565b606060038054610dd790615c2d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0390615c2d565b8015610e4e5780601f10610e2557610100808354040283529160200191610e4e565b820191905f5260205f20905b815481529060010190602001808311610e3157829003601f168201915b5050505050905090565b5f60045f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f3073ffffffffffffffffffffffffffffffffffffffff16610eb3610cb7565b73ffffffffffffffffffffffffffffffffffffffff1614610f00576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63150b7a0260e01b9050949350505050565b5f80610f2086868686611d42565b9050610f3581610f306004612167565b61218b565b505f610f4482888888886121f6565b90505f8165ffffffffffff1614610fc9578060045f8481526020019081526020015f206001015f6101000a81548165ffffffffffff021916908365ffffffffffff1602179055507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928282604051610fbc929190615c8d565b60405180910390a1610ffb565b6040517f90884a4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8192505050949350505050565b5f8061101686868686611d42565b9050611036816110266005612167565b6110306004612167565b1761218b565b50600160045f8381526020019081526020015f205f01601e6101000a81548160ff0219169083151502179055503073ffffffffffffffffffffffffffffffffffffffff16611082610cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611138575f5b8651811015611136573073ffffffffffffffffffffffffffffffffffffffff168782815181106110d2576110d1615cb4565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361112b5761112a85828151811061110b5761110a615cb4565b5b602002602001015180519060200120600561220f90919063ffffffff16565b5b80600101905061109f565b505b611145818787878761232e565b3073ffffffffffffffffffffffffffffffffffffffff16611164610cb7565b73ffffffffffffffffffffffffffffffffffffffff161415801561118f575061118d6005612342565b155b1561119f5761119e60056123ae565b5b7f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f816040516111ce919061493d565b60405180910390a180915050949350505050565b5f60045f8381526020019081526020015f205f0160149054906101000a900465ffffffffffff1665ffffffffffff169050919050565b7f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a81181565b5f611245612424565b905090565b5f61125482612446565b9050919050565b5f60095f8481526020019081526020015f206003015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f806112ce86868686611d42565b90506112e2816112dd5f612167565b61218b565b506112ec81610e58565b73ffffffffffffffffffffffffffffffffffffffff1661130a6125fb565b73ffffffffffffffffffffffffffffffffffffffff16146113695761132d6125fb565b6040517f233d98e30000000000000000000000000000000000000000000000000000000081526004016113609190614a7a565b60405180910390fd5b61137586868686612602565b915050949350505050565b606061138a611ed9565b73ffffffffffffffffffffffffffffffffffffffff16634bf5d7e96040518163ffffffff1660e01b81526004015f60405180830381865afa9250505080156113f457506040513d5f823e3d601f19601f820116820180604052508101906113f19190615d4f565b60015b611435576040518060400160405280601d81526020017f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000815250905061143a565b809150505b90565b5f805f8060095f8681526020019081526020015f209050805f015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b5f806114b76125fb565b90506114d384828560405180602001604052805f815250612619565b91505092915050565b5f80611569876115637f3e83946653575f9a39005e1545185629e92736b7528ab20ca3816f315424a8118c8c8c6115128e612638565b8d8d604051611522929190615dc4565b60405180910390208c805190602001206040516020016115489796959493929190615deb565b6040516020818303038152906040528051906020012061268b565b856126a4565b9050806115ad57866040517f94ab6c070000000000000000000000000000000000000000000000000000000081526004016115a49190614a7a565b60405180910390fd5b6115fd89888a89898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505088612731565b915050979650505050505050565b5f806116156125fb565b905061166787828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505087612731565b91505095945050505050565b5f80600a5f018054905090505f600a5f016001836116919190615e85565b815481106116a2576116a1615cb4565b5b905f5260205f200190505f815f015f9054906101000a900465ffffffffffff1690505f825f0160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff169050858265ffffffffffff1611611728578079ffffffffffffffffffffffffffffffffffffffffffffffffffff16945050505050611767565b6117446117348761282e565b600a61288790919063ffffffff16565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff169450505050505b919050565b611774611fb0565b61177d81612974565b50565b5f8061178a6125fb565b90506117db86828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050612619565b915050949350505050565b5f806117f06125fb565b90506117fc81846129e7565b61183d57806040517fd9b395570000000000000000000000000000000000000000000000000000000081526004016118349190614a7a565b60405180910390fd5b5f61186382600161184c611a92565b6118569190615eb8565b65ffffffffffff16611e19565b90505f61186e611bc1565b9050808210156118b9578282826040517fc242ee160000000000000000000000000000000000000000000000000000000081526004016118b093929190615ef1565b60405180910390fd5b6118c68888888887612b2f565b9350505050949350505050565b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f6060805f805f606061192a612db4565b611932612dee565b46305f801b5f67ffffffffffffffff81111561195157611950614ac5565b5b60405190808252806020026020018201604052801561197f5781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b5f80611a2984611a237ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d78989896119f48b612638565b604051602001611a08959493929190615f26565b6040516020818303038152906040528051906020012061268b565b856126a4565b905080611a6d57836040517f94ab6c07000000000000000000000000000000000000000000000000000000008152600401611a649190614a7a565b60405180910390fd5b611a8786858760405180602001604052805f815250612619565b915050949350505050565b5f611a9b611ed9565b73ffffffffffffffffffffffffffffffffffffffff166391ddadf46040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611b0257506040513d601f19601f82011682018060405250810190611aff9190615f8b565b60015b611b1557611b0e612e29565b9050611b1a565b809150505b90565b5f6064905090565b5f611b31848484612e38565b90509392505050565b5f611b45600a612ec3565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff16905090565b611b6e611fb0565b611b7781612f25565b50565b5f611b8482612fc2565b9050919050565b5f60045f8381526020019081526020015f206001015f9054906101000a900465ffffffffffff1665ffffffffffff169050919050565b5f611bca612fcc565b905090565b5f3073ffffffffffffffffffffffffffffffffffffffff16611bef610cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611c3c576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63bc197c8160e01b905095945050505050565b5f60045f8381526020019081526020015f205f01601a9054906101000a900463ffffffff1663ffffffff1660045f8481526020019081526020015f205f0160149054906101000a900465ffffffffffff16611caa9190615fb6565b65ffffffffffff169050919050565b611cc1611fb0565b5f808573ffffffffffffffffffffffffffffffffffffffff16858585604051611ceb929190615dc4565b5f6040518083038185875af1925050503d805f8114611d25576040519150601f19603f3d011682016040523d82523d5f602084013e611d2a565b606091505b5091509150611d398282612fd5565b50505050505050565b5f84848484604051602001611d5a94939291906161b3565b604051602081830303815290604052805190602001205f1c9050949350505050565b5f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7ff2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d781565b611e0d611fb0565b611e1681612ff9565b50565b5f611e2c8383611e276130b2565b612e38565b905092915050565b611e3c611fb0565b611e45816130c8565b50565b5f3073ffffffffffffffffffffffffffffffffffffffff16611e68610cb7565b73ffffffffffffffffffffffffffffffffffffffff1614611eb5576040517fe90a651e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63f23a6e6160e01b905095945050505050565b5f611ed28261310d565b9050919050565b5f7f0000000000000000000000000000000000000000000000000000000000000000905090565b5f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f600860069054906101000a900463ffffffff1663ffffffff16905090565b611fb86125fb565b73ffffffffffffffffffffffffffffffffffffffff16611fd6610cb7565b73ffffffffffffffffffffffffffffffffffffffff161461203557611ff96125fb565b6040517f47096e4700000000000000000000000000000000000000000000000000000000815260040161202c9190614a7a565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612054610cb7565b73ffffffffffffffffffffffffffffffffffffffff16146120a3575f6120786131b9565b604051612086929190615dc4565b604051809103902090505b8061209c60056131c5565b0361209157505b565b5f6120ae611b1d565b9050808211156120f75781816040517f243e54450000000000000000000000000000000000000000000000000000000081526004016120ee92919061620b565b60405180910390fd5b5f612100611b3a565b905061212761210d611a92565b6121168561331a565b600a6133879092919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997818460405161215a92919061620b565b60405180910390a1505050565b5f81600781111561217b5761217a615006565b5b60ff166001901b5f1b9050919050565b5f806121968461124a565b90505f801b836121a583612167565b16036121ec578381846040517f31b75e4d0000000000000000000000000000000000000000000000000000000081526004016121e393929190616232565b60405180910390fd5b8091505092915050565b5f61220486868686866133a2565b905095945050505050565b5f825f0160109054906101000a90046fffffffffffffffffffffffffffffffff169050825f015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16600182016fffffffffffffffffffffffffffffffff16036122b0576040517f8acb5f2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81836001015f836fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060018101835f0160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550505050565b61233b85858585856135a8565b5050505050565b5f815f015f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16825f0160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16149050919050565b5f815f015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505f815f0160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b5f60085f9054906101000a900465ffffffffffff1665ffffffffffff16905090565b5f806124518361365c565b90506005600781111561246757612466615006565b5b81600781111561247a57612479615006565b5b1461248857809150506125f6565b5f600c5f8581526020019081526020015f20549050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016124f79190614fed565b602060405180830381865afa158015612512573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125369190616291565b15612546576005925050506125f6565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b81526004016125a09190614fed565b602060405180830381865afa1580156125bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125df9190616291565b156125ef576007925050506125f6565b6002925050505b919050565b5f33905090565b5f61260f858585856137b3565b9050949350505050565b5f61262e858585856126296130b2565b612731565b9050949350505050565b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050559050919050565b5f61269d61269761388a565b83613940565b9050919050565b5f805f6126b18585613980565b50915091505f60038111156126c9576126c8615006565b5b8160038111156126dc576126db615006565b5b14801561271457508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b8061272657506127258686866139d5565b5b925050509392505050565b5f612745866127406001612167565b61218b565b505f61275a86612754896111e2565b85612e38565b90506127698787878487613af4565b5f8351036127ca578573ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4888784886040516127bd94939291906162bc565b60405180910390a2612821565b8573ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb8712888784888860405161281895949392919061634e565b60405180910390a25b8091505095945050505050565b5f65ffffffffffff801682111561287f576030826040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526004016128769291906163e6565b60405180910390fd5b819050919050565b5f80835f018054905090505f808290506005831115612908575f6128aa84613ce3565b846128b59190615e85565b90506128c3875f0182613dd9565b5f015f9054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1610156128f657809150612906565b600181612903919061640d565b92505b505b5f612917875f01878585613deb565b90505f811461296657612938875f016001836129339190615e85565b613dd9565b5f0160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff16612968565b5f5b94505050505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360085f9054906101000a900465ffffffffffff16826040516129b8929190616440565b60405180910390a18060085f6101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b5f80825190506034811015612a00576001915050612b29565b5f6014820384015190507f2370726f706f7365723d3078000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff19168173ffffffffffffffffffffffffffffffffffffffff191614612a6a57600192505050612b29565b5f80602884612a799190615e85565b90505b83811015612af3575f80612aac888481518110612a9c57612a9b615cb4565b5b602001015160f81c60f81b613e60565b9150915081612ac45760019650505050505050612b29565b8060ff1660048573ffffffffffffffffffffffffffffffffffffffff16901b1793505050806001019050612a7c565b508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161493505050505b92915050565b5f612b438686868680519060200120611d42565b905084518651141580612b5857508351865114155b80612b6357505f8651145b15612bac578551845186516040517f447b05d0000000000000000000000000000000000000000000000000000000008152600401612ba3939291906150d0565b60405180910390fd5b5f60045f8381526020019081526020015f205f0160149054906101000a900465ffffffffffff1665ffffffffffff1614612c2b5780612bea8261124a565b5f801b6040517f31b75e4d000000000000000000000000000000000000000000000000000000008152600401612c2293929190616232565b60405180910390fd5b5f612c3461123c565b612c3c611a92565b65ffffffffffff16612c4e919061640d565b90505f612c59610da6565b90505f60045f8581526020019081526020015f20905084815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612cb98361282e565b815f0160146101000a81548165ffffffffffff021916908365ffffffffffff160217905550612ce782613ef7565b815f01601a6101000a81548163ffffffff021916908363ffffffff1602179055507f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084868b8b8d5167ffffffffffffffff811115612d4857612d47614ac5565b5b604051908082528060200260200182016040528015612d7b57816020015b6060815260200190600190039081612d665790505b508c89898b612d8a919061640d565b8e604051612da09998979695949392919061656a565b60405180910390a150505095945050505050565b6060612de95f7f0000000000000000000000000000000000000000000000000000000000000000613f4e90919063ffffffff16565b905090565b6060612e2460017f0000000000000000000000000000000000000000000000000000000000000000613f4e90919063ffffffff16565b905090565b5f612e334361282e565b905090565b5f612e41611ed9565b73ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b8152600401612e7b929190616618565b602060405180830381865afa158015612e96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eba9190616653565b90509392505050565b5f80825f018054905090505f8114612f1b57612eed835f01600183612ee89190615e85565b613dd9565b5f0160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff16612f1d565b5f5b915050919050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051612f7792919061667e565b60405180910390a180600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60019050919050565b5f600754905090565b606082612fea57612fe582613ffb565b612ff2565b819050612ff3565b5b92915050565b5f8163ffffffff1603613043575f6040517ff1cfbf0500000000000000000000000000000000000000000000000000000000815260040161303a91906166de565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828600860069054906101000a900463ffffffff1682604051613086929190616727565b60405180910390a180600860066101000a81548163ffffffff021916908363ffffffff16021790555050565b606060405180602001604052805f815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461600754826040516130fb92919061620b565b60405180910390a18060078190555050565b5f613116611b1d565b61311f83611673565b613127611ed9565b73ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b815260040161315f919061493d565b602060405180830381865afa15801561317a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061319e9190616653565b6131a8919061674e565b6131b291906167bc565b9050919050565b365f8036915091509091565b5f80825f015f9054906101000a90046fffffffffffffffffffffffffffffffff169050825f0160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff1603613264576040517f75e52f4f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826001015f826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020019081526020015f20549150826001015f826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020019081526020015f205f905560018101835f015f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050919050565b5f79ffffffffffffffffffffffffffffffffffffffffffffffffffff801682111561337f5760d0826040517f6dfcc650000000000000000000000000000000000000000000000000000000008152600401613376929190616825565b60405180910390fd5b819050919050565b5f80613396855f01858561403f565b91509150935093915050565b5f80600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa15801561340e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134329190616653565b90505f61343e846143a7565b9050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888885f866040518663ffffffff1660e01b81526004016134a2959493929190616887565b602060405180830381865afa1580156134bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134e19190616901565b600c5f8a81526020019081526020015f2081905550600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb08888885f86886040518763ffffffff1660e01b815260040161355a9695949392919061692c565b5f604051808303815f87803b158015613571575f80fd5b505af1158015613583573d5f803e3d5ffd5b5050505061359b8242613596919061640d565b61282e565b9250505095945050505050565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686865f6135f3886143a7565b6040518763ffffffff1660e01b8152600401613613959493929190616887565b5f604051808303818588803b15801561362a575f80fd5b505af115801561363c573d5f803e3d5ffd5b5050505050600c5f8681526020019081526020015f205f90555050505050565b5f8060045f8481526020019081526020015f2090505f815f01601e9054906101000a900460ff1690505f825f01601f9054906101000a900460ff16905081156136ab57600793505050506137ae565b80156136bd57600293505050506137ae565b5f6136c7866111e2565b90505f810361370d57856040517f6ad06075000000000000000000000000000000000000000000000000000000008152600401613704919061493d565b60405180910390fd5b5f613716611a92565b65ffffffffffff169050808210613734575f955050505050506137ae565b5f61373e88611c4f565b905081811061375657600196505050505050506137ae565b61375f886143c4565b1580613771575061376f88614408565b155b1561378557600396505050505050506137ae565b5f61378f89611b8b565b036137a357600496505050505050506137ae565b600596505050505050505b919050565b5f806137c18686868661442f565b90505f600c5f8381526020019081526020015f205490505f801b811461387d57600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c4d252f5826040518263ffffffff1660e01b815260040161383b9190614fed565b5f604051808303815f87803b158015613852575f80fd5b505af1158015613864573d5f803e3d5ffd5b50505050600c5f8381526020019081526020015f205f90555b8192505050949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561390557507f000000000000000000000000000000000000000000000000000000000000000046145b15613932577f0000000000000000000000000000000000000000000000000000000000000000905061393d565b61393a614511565b90505b90565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f60418451036139c0575f805f602087015192506040870151915060608701515f1a90506139b2888285856145a6565b9550955095505050506139ce565b5f600285515f1b9250925092505b9250925092565b5f805f8573ffffffffffffffffffffffffffffffffffffffff168585604051602401613a029291906169a0565b604051602081830303815290604052631626ba7e60e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051613a5491906169fe565b5f60405180830381855afa9150503d805f8114613a8c576040519150601f19603f3d011682016040523d82523d5f602084013e613a91565b606091505b5091509150818015613aa557506020815110155b8015613ae95750631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681806020019051810190613ae79190616901565b145b925050509392505050565b5f60095f8781526020019081526020015f209050806003015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615613b9657846040517f71c6af49000000000000000000000000000000000000000000000000000000008152600401613b8d9190614a7a565b60405180910390fd5b6001816003015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f6002811115613c0057613bff615006565b5b60ff168460ff1603613c2a5782815f015f828254613c1e919061640d565b92505081905550613cdb565b60016002811115613c3e57613c3d615006565b5b60ff168460ff1603613c695782816001015f828254613c5d919061640d565b92505081905550613cda565b600280811115613c7c57613c7b615006565b5b60ff168460ff1603613ca75782816002015f828254613c9b919061640d565b92505081905550613cd9565b6040517f06b337c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b505050505050565b5f808203613cf3575f9050613dd4565b5f6001613cff8461468d565b901c6001901b90506001818481613d1957613d1861678f565b5b048201901c90506001818481613d3257613d3161678f565b5b048201901c90506001818481613d4b57613d4a61678f565b5b048201901c90506001818481613d6457613d6361678f565b5b048201901c90506001818481613d7d57613d7c61678f565b5b048201901c90506001818481613d9657613d9561678f565b5b048201901c90506001818481613daf57613dae61678f565b5b048201901c9050613dd081828581613dca57613dc961678f565b5b04614764565b9150505b919050565b5f825f528160205f2001905092915050565b5f5b81831015613e55575f613e00848461477c565b90508465ffffffffffff16613e158783613dd9565b5f015f9054906101000a900465ffffffffffff1665ffffffffffff161115613e3f57809250613e4f565b600181613e4c919061640d565b93505b50613ded565b819050949350505050565b5f805f8360f81c90508060ff16602f108015613e7f5750603a8160ff16105b15613e94576001603082039250925050613ef2565b8060ff166040108015613eaa575060478160ff16105b15613ebf576001603782039250925050613ef2565b8060ff166060108015613ed5575060678160ff16105b15613eea576001605782039250925050613ef2565b5f8092509250505b915091565b5f63ffffffff8016821115613f46576020826040517f6dfcc650000000000000000000000000000000000000000000000000000000008152600401613f3d929190616a4d565b60405180910390fd5b819050919050565b606060ff5f1b8314613f6a57613f63836147a1565b9050613ff5565b818054613f7690615c2d565b80601f0160208091040260200160405190810160405280929190818152602001828054613fa290615c2d565b8015613fed5780601f10613fc457610100808354040283529160200191613fed565b820191905f5260205f20905b815481529060010190602001808311613fd057829003601f168201915b505050505090505b92915050565b5f8151111561400d5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f858054905090505f8111156142bf575f614068876001846140639190615e85565b613dd9565b6040518060400160405290815f82015f9054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020015f820160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff168152505090508565ffffffffffff16815f015165ffffffffffff161115614153576040517f2520601d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8565ffffffffffff16815f015165ffffffffffff16036141d557846141848860018561417f9190615e85565b613dd9565b5f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506142ae565b8660405180604001604052808865ffffffffffff1681526020018779ffffffffffffffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a81548165ffffffffffff021916908365ffffffffffff1602179055506020820151815f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80602001518593509350505061439f565b8560405180604001604052808765ffffffffffff1681526020018679ffffffffffffffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a81548165ffffffffffff021916908365ffffffffffff1602179055506020820151815f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505f8492509250505b935093915050565b5f813060601b6bffffffffffffffffffffffff1916189050919050565b5f8060095f8481526020019081526020015f209050806002015481600101546143ed919061640d565b6143fe6143f9856111e2565b611ec8565b1115915050919050565b5f8060095f8481526020019081526020015f209050805f0154816001015411915050919050565b5f8061443d86868686611d42565b90506144a18161444d6007612167565b6144576006612167565b6144616002612167565b60018060078081111561447757614476615006565b5b6144819190616a74565b600261448d9190616bd7565b6144979190615e85565b5f1b18181861218b565b50600160045f8381526020019081526020015f205f01601f6101000a81548160ff0219169083151502179055507f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c816040516144fd919061493d565b60405180910390a180915050949350505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000463060405160200161458b959493929190616c21565b60405160208183030381529060405280519060200120905090565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c11156145e2575f600385925092509250614683565b5f6001888888886040515f81526020016040526040516146059493929190616c72565b6020604051602081039080840390855afa158015614625573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603614676575f60015f801b93509350935050614683565b805f805f1b935093509350505b9450945094915050565b5f805f90505f608084901c11156146ac57608083901c92506080810190505b5f604084901c11156146c657604083901c92506040810190505b5f602084901c11156146e057602083901c92506020810190505b5f601084901c11156146fa57601083901c92506010810190505b5f600884901c111561471457600883901c92506008810190505b5f600484901c111561472e57600483901c92506004810190505b5f600284901c111561474857600283901c92506002810190505b5f600184901c111561475b576001810190505b80915050919050565b5f8183106147725781614774565b825b905092915050565b5f600282841861478c91906167bc565b828416614799919061640d565b905092915050565b60605f6147ad83614813565b90505f602067ffffffffffffffff8111156147cb576147ca614ac5565b5b6040519080825280601f01601f1916602001820160405280156147fd5781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b5f8060ff835f1c169050601f811115614858576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6148a681614872565b81146148b0575f80fd5b50565b5f813590506148c18161489d565b92915050565b5f602082840312156148dc576148db61486a565b5b5f6148e9848285016148b3565b91505092915050565b5f8115159050919050565b614906816148f2565b82525050565b5f60208201905061491f5f8301846148fd565b92915050565b5f819050919050565b61493781614925565b82525050565b5f6020820190506149505f83018461492e565b92915050565b61495f81614925565b8114614969575f80fd5b50565b5f8135905061497a81614956565b92915050565b5f602082840312156149955761499461486a565b5b5f6149a28482850161496c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6149ed826149ab565b6149f781856149b5565b9350614a078185602086016149c5565b614a10816149d3565b840191505092915050565b5f6020820190508181035f830152614a3381846149e3565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614a6482614a3b565b9050919050565b614a7481614a5a565b82525050565b5f602082019050614a8d5f830184614a6b565b92915050565b614a9c81614a5a565b8114614aa6575f80fd5b50565b5f81359050614ab781614a93565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b614afb826149d3565b810181811067ffffffffffffffff82111715614b1a57614b19614ac5565b5b80604052505050565b5f614b2c614861565b9050614b388282614af2565b919050565b5f67ffffffffffffffff821115614b5757614b56614ac5565b5b614b60826149d3565b9050602081019050919050565b828183375f83830152505050565b5f614b8d614b8884614b3d565b614b23565b905082815260208101848484011115614ba957614ba8614ac1565b5b614bb4848285614b6d565b509392505050565b5f82601f830112614bd057614bcf614abd565b5b8135614be0848260208601614b7b565b91505092915050565b5f805f8060808587031215614c0157614c0061486a565b5b5f614c0e87828801614aa9565b9450506020614c1f87828801614aa9565b9350506040614c308782880161496c565b925050606085013567ffffffffffffffff811115614c5157614c5061486e565b5b614c5d87828801614bbc565b91505092959194509250565b614c7281614872565b82525050565b5f602082019050614c8b5f830184614c69565b92915050565b5f67ffffffffffffffff821115614cab57614caa614ac5565b5b602082029050602081019050919050565b5f80fd5b5f614cd2614ccd84614c91565b614b23565b90508083825260208201905060208402830185811115614cf557614cf4614cbc565b5b835b81811015614d1e5780614d0a8882614aa9565b845260208401935050602081019050614cf7565b5050509392505050565b5f82601f830112614d3c57614d3b614abd565b5b8135614d4c848260208601614cc0565b91505092915050565b5f67ffffffffffffffff821115614d6f57614d6e614ac5565b5b602082029050602081019050919050565b5f614d92614d8d84614d55565b614b23565b90508083825260208201905060208402830185811115614db557614db4614cbc565b5b835b81811015614dde5780614dca888261496c565b845260208401935050602081019050614db7565b5050509392505050565b5f82601f830112614dfc57614dfb614abd565b5b8135614e0c848260208601614d80565b91505092915050565b5f67ffffffffffffffff821115614e2f57614e2e614ac5565b5b602082029050602081019050919050565b5f614e52614e4d84614e15565b614b23565b90508083825260208201905060208402830185811115614e7557614e74614cbc565b5b835b81811015614ebc57803567ffffffffffffffff811115614e9a57614e99614abd565b5b808601614ea78982614bbc565b85526020850194505050602081019050614e77565b5050509392505050565b5f82601f830112614eda57614ed9614abd565b5b8135614eea848260208601614e40565b91505092915050565b5f819050919050565b614f0581614ef3565b8114614f0f575f80fd5b50565b5f81359050614f2081614efc565b92915050565b5f805f8060808587031215614f3e57614f3d61486a565b5b5f85013567ffffffffffffffff811115614f5b57614f5a61486e565b5b614f6787828801614d28565b945050602085013567ffffffffffffffff811115614f8857614f8761486e565b5b614f9487828801614de8565b935050604085013567ffffffffffffffff811115614fb557614fb461486e565b5b614fc187828801614ec6565b9250506060614fd287828801614f12565b91505092959194509250565b614fe781614ef3565b82525050565b5f6020820190506150005f830184614fde565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6008811061504457615043615006565b5b50565b5f81905061505482615033565b919050565b5f61506382615047565b9050919050565b61507381615059565b82525050565b5f60208201905061508c5f83018461506a565b92915050565b5f80604083850312156150a8576150a761486a565b5b5f6150b58582860161496c565b92505060206150c685828601614aa9565b9150509250929050565b5f6060820190506150e35f83018661492e565b6150f0602083018561492e565b6150fd604083018461492e565b949350505050565b5f60ff82169050919050565b61511a81615105565b8114615124575f80fd5b50565b5f8135905061513581615111565b92915050565b5f80604083850312156151515761515061486a565b5b5f61515e8582860161496c565b925050602061516f85828601615127565b9150509250929050565b5f80fd5b5f8083601f84011261519257615191614abd565b5b8235905067ffffffffffffffff8111156151af576151ae615179565b5b6020830191508360018202830111156151cb576151ca614cbc565b5b9250929050565b5f805f805f805f60c0888a0312156151ed576151ec61486a565b5b5f6151fa8a828b0161496c565b975050602061520b8a828b01615127565b965050604061521c8a828b01614aa9565b955050606088013567ffffffffffffffff81111561523d5761523c61486e565b5b6152498a828b0161517d565b9450945050608088013567ffffffffffffffff81111561526c5761526b61486e565b5b6152788a828b01614bbc565b92505060a088013567ffffffffffffffff8111156152995761529861486e565b5b6152a58a828b01614bbc565b91505092959891949750929550565b5f805f805f608086880312156152cd576152cc61486a565b5b5f6152da8882890161496c565b95505060206152eb88828901615127565b945050604086013567ffffffffffffffff81111561530c5761530b61486e565b5b6153188882890161517d565b9350935050606086013567ffffffffffffffff81111561533b5761533a61486e565b5b61534788828901614bbc565b9150509295509295909350565b5f65ffffffffffff82169050919050565b61536e81615354565b8114615378575f80fd5b50565b5f8135905061538981615365565b92915050565b5f602082840312156153a4576153a361486a565b5b5f6153b18482850161537b565b91505092915050565b5f805f80606085870312156153d2576153d161486a565b5b5f6153df8782880161496c565b94505060206153f087828801615127565b935050604085013567ffffffffffffffff8111156154115761541061486e565b5b61541d8782880161517d565b925092505092959194509250565b5f67ffffffffffffffff82111561544557615444614ac5565b5b61544e826149d3565b9050602081019050919050565b5f61546d6154688461542b565b614b23565b90508281526020810184848401111561548957615488614ac1565b5b615494848285614b6d565b509392505050565b5f82601f8301126154b0576154af614abd565b5b81356154c084826020860161545b565b91505092915050565b5f805f80608085870312156154e1576154e061486a565b5b5f85013567ffffffffffffffff8111156154fe576154fd61486e565b5b61550a87828801614d28565b945050602085013567ffffffffffffffff81111561552b5761552a61486e565b5b61553787828801614de8565b935050604085013567ffffffffffffffff8111156155585761555761486e565b5b61556487828801614ec6565b925050606085013567ffffffffffffffff8111156155855761558461486e565b5b6155918782880161549c565b91505092959194509250565b5f602082840312156155b2576155b161486a565b5b5f6155bf84828501614aa9565b91505092915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6155fc816155c8565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61563481614925565b82525050565b5f615645838361562b565b60208301905092915050565b5f602082019050919050565b5f61566782615602565b615671818561560c565b935061567c8361561c565b805f5b838110156156ac578151615693888261563a565b975061569e83615651565b92505060018101905061567f565b5085935050505092915050565b5f60e0820190506156cc5f83018a6155f3565b81810360208301526156de81896149e3565b905081810360408301526156f281886149e3565b9050615701606083018761492e565b61570e6080830186614a6b565b61571b60a0830185614fde565b81810360c083015261572d818461565d565b905098975050505050505050565b5f805f80608085870312156157535761575261486a565b5b5f6157608782880161496c565b945050602061577187828801615127565b935050604061578287828801614aa9565b925050606085013567ffffffffffffffff8111156157a3576157a261486e565b5b6157af87828801614bbc565b91505092959194509250565b6157c481615354565b82525050565b5f6020820190506157dd5f8301846157bb565b92915050565b5f805f606084860312156157fa576157f961486a565b5b5f61580786828701614aa9565b93505060206158188682870161496c565b925050604084013567ffffffffffffffff8111156158395761583861486e565b5b61584586828701614bbc565b9150509250925092565b5f61585982614a3b565b9050919050565b5f61586a8261584f565b9050919050565b61587a81615860565b8114615884575f80fd5b50565b5f8135905061589581615871565b92915050565b5f602082840312156158b0576158af61486a565b5b5f6158bd84828501615887565b91505092915050565b5f805f805f60a086880312156158df576158de61486a565b5b5f6158ec88828901614aa9565b95505060206158fd88828901614aa9565b945050604086013567ffffffffffffffff81111561591e5761591d61486e565b5b61592a88828901614de8565b935050606086013567ffffffffffffffff81111561594b5761594a61486e565b5b61595788828901614de8565b925050608086013567ffffffffffffffff8111156159785761597761486e565b5b61598488828901614bbc565b9150509295509295909350565b5f8083601f8401126159a6576159a5614abd565b5b8235905067ffffffffffffffff8111156159c3576159c2615179565b5b6020830191508360018202830111156159df576159de614cbc565b5b9250929050565b5f805f80606085870312156159fe576159fd61486a565b5b5f615a0b87828801614aa9565b9450506020615a1c8782880161496c565b935050604085013567ffffffffffffffff811115615a3d57615a3c61486e565b5b615a4987828801615991565b925092505092959194509250565b5f63ffffffff82169050919050565b615a6f81615a57565b8114615a79575f80fd5b50565b5f81359050615a8a81615a66565b92915050565b5f60208284031215615aa557615aa461486a565b5b5f615ab284828501615a7c565b91505092915050565b5f8060408385031215615ad157615ad061486a565b5b5f615ade85828601614aa9565b9250506020615aef8582860161496c565b9150509250929050565b5f805f805f60a08688031215615b1257615b1161486a565b5b5f615b1f88828901614aa9565b9550506020615b3088828901614aa9565b9450506040615b418882890161496c565b9350506060615b528882890161496c565b925050608086013567ffffffffffffffff811115615b7357615b7261486e565b5b615b7f88828901614bbc565b9150509295509295909350565b5f819050919050565b5f615baf615baa615ba584614a3b565b615b8c565b614a3b565b9050919050565b5f615bc082615b95565b9050919050565b5f615bd182615bb6565b9050919050565b615be181615bc7565b82525050565b5f602082019050615bfa5f830184615bd8565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680615c4457607f821691505b602082108103615c5757615c56615c00565b5b50919050565b5f615c77615c72615c6d84615354565b615b8c565b614925565b9050919050565b615c8781615c5d565b82525050565b5f604082019050615ca05f83018561492e565b615cad6020830184615c7e565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f615cf3615cee8461542b565b614b23565b905082815260208101848484011115615d0f57615d0e614ac1565b5b615d1a8482856149c5565b509392505050565b5f82601f830112615d3657615d35614abd565b5b8151615d46848260208601615ce1565b91505092915050565b5f60208284031215615d6457615d6361486a565b5b5f82015167ffffffffffffffff811115615d8157615d8061486e565b5b615d8d84828501615d22565b91505092915050565b5f81905092915050565b5f615dab8385615d96565b9350615db8838584614b6d565b82840190509392505050565b5f615dd0828486615da0565b91508190509392505050565b615de581615105565b82525050565b5f60e082019050615dfe5f83018a614fde565b615e0b602083018961492e565b615e186040830188615ddc565b615e256060830187614a6b565b615e32608083018661492e565b615e3f60a0830185614fde565b615e4c60c0830184614fde565b98975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f615e8f82614925565b9150615e9a83614925565b9250828203905081811115615eb257615eb1615e58565b5b92915050565b5f615ec282615354565b9150615ecd83615354565b9250828203905065ffffffffffff811115615eeb57615eea615e58565b5b92915050565b5f606082019050615f045f830186614a6b565b615f11602083018561492e565b615f1e604083018461492e565b949350505050565b5f60a082019050615f395f830188614fde565b615f46602083018761492e565b615f536040830186615ddc565b615f606060830185614a6b565b615f6d608083018461492e565b9695505050505050565b5f81519050615f8581615365565b92915050565b5f60208284031215615fa057615f9f61486a565b5b5f615fad84828501615f77565b91505092915050565b5f615fc082615354565b9150615fcb83615354565b9250828201905065ffffffffffff811115615fe957615fe8615e58565b5b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61602181614a5a565b82525050565b5f6160328383616018565b60208301905092915050565b5f602082019050919050565b5f61605482615fef565b61605e8185615ff9565b935061606983616009565b805f5b838110156160995781516160808882616027565b975061608b8361603e565b92505060018101905061606c565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6160f3826160cf565b6160fd81856160d9565b935061610d8185602086016149c5565b616116816149d3565b840191505092915050565b5f61612c83836160e9565b905092915050565b5f602082019050919050565b5f61614a826160a6565b61615481856160b0565b935083602082028501616166856160c0565b805f5b858110156161a157848403895281516161828582616121565b945061618d83616134565b925060208a01995050600181019050616169565b50829750879550505050505092915050565b5f6080820190508181035f8301526161cb818761604a565b905081810360208301526161df818661565d565b905081810360408301526161f38185616140565b90506162026060830184614fde565b95945050505050565b5f60408201905061621e5f83018561492e565b61622b602083018461492e565b9392505050565b5f6060820190506162455f83018661492e565b616252602083018561506a565b61625f6040830184614fde565b949350505050565b616270816148f2565b811461627a575f80fd5b50565b5f8151905061628b81616267565b92915050565b5f602082840312156162a6576162a561486a565b5b5f6162b38482850161627d565b91505092915050565b5f6080820190506162cf5f83018761492e565b6162dc6020830186615ddc565b6162e9604083018561492e565b81810360608301526162fb81846149e3565b905095945050505050565b5f82825260208201905092915050565b5f616320826160cf565b61632a8185616306565b935061633a8185602086016149c5565b616343816149d3565b840191505092915050565b5f60a0820190506163615f83018861492e565b61636e6020830187615ddc565b61637b604083018661492e565b818103606083015261638d81856149e3565b905081810360808301526163a18184616316565b90509695505050505050565b5f819050919050565b5f6163d06163cb6163c6846163ad565b615b8c565b615105565b9050919050565b6163e0816163b6565b82525050565b5f6040820190506163f95f8301856163d7565b616406602083018461492e565b9392505050565b5f61641782614925565b915061642283614925565b925082820190508082111561643a57616439615e58565b5b92915050565b5f6040820190506164535f830185615c7e565b6164606020830184615c7e565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f82825260208201905092915050565b5f6164aa826149ab565b6164b48185616490565b93506164c48185602086016149c5565b6164cd816149d3565b840191505092915050565b5f6164e383836164a0565b905092915050565b5f602082019050919050565b5f61650182616467565b61650b8185616471565b93508360208202850161651d85616481565b805f5b85811015616558578484038952815161653985826164d8565b9450616544836164eb565b925060208a01995050600181019050616520565b50829750879550505050505092915050565b5f6101208201905061657e5f83018c61492e565b61658b602083018b614a6b565b818103604083015261659d818a61604a565b905081810360608301526165b1818961565d565b905081810360808301526165c581886164f7565b905081810360a08301526165d98187616140565b90506165e860c083018661492e565b6165f560e083018561492e565b81810361010083015261660881846149e3565b90509a9950505050505050505050565b5f60408201905061662b5f830185614a6b565b616638602083018461492e565b9392505050565b5f8151905061664d81614956565b92915050565b5f602082840312156166685761666761486a565b5b5f6166758482850161663f565b91505092915050565b5f6040820190506166915f830185614a6b565b61669e6020830184614a6b565b9392505050565b5f819050919050565b5f6166c86166c36166be846166a5565b615b8c565b614925565b9050919050565b6166d8816166ae565b82525050565b5f6020820190506166f15f8301846166cf565b92915050565b5f61671161670c61670784615a57565b615b8c565b614925565b9050919050565b616721816166f7565b82525050565b5f60408201905061673a5f830185616718565b6167476020830184616718565b9392505050565b5f61675882614925565b915061676383614925565b925082820261677181614925565b9150828204841483151761678857616787615e58565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6167c682614925565b91506167d183614925565b9250826167e1576167e061678f565b5b828204905092915050565b5f819050919050565b5f61680f61680a616805846167ec565b615b8c565b615105565b9050919050565b61681f816167f5565b82525050565b5f6040820190506168385f830185616816565b616845602083018461492e565b9392505050565b5f815f1b9050919050565b5f61687161686c616867846166a5565b61684c565b614ef3565b9050919050565b61688181616857565b82525050565b5f60a0820190508181035f83015261689f818861604a565b905081810360208301526168b3818761565d565b905081810360408301526168c78186616140565b90506168d66060830185616878565b6168e36080830184614fde565b9695505050505050565b5f815190506168fb81614efc565b92915050565b5f602082840312156169165761691561486a565b5b5f616923848285016168ed565b91505092915050565b5f60c0820190508181035f830152616944818961604a565b90508181036020830152616958818861565d565b9050818103604083015261696c8187616140565b905061697b6060830186616878565b6169886080830185614fde565b61699560a083018461492e565b979650505050505050565b5f6040820190506169b35f830185614fde565b81810360208301526169c58184616316565b90509392505050565b5f6169d8826160cf565b6169e28185615d96565b93506169f28185602086016149c5565b80840191505092915050565b5f616a0982846169ce565b915081905092915050565b5f819050919050565b5f616a37616a32616a2d84616a14565b615b8c565b615105565b9050919050565b616a4781616a1d565b82525050565b5f604082019050616a605f830185616a3e565b616a6d602083018461492e565b9392505050565b5f616a7e82615105565b9150616a8983615105565b9250828201905060ff811115616aa257616aa1615e58565b5b92915050565b5f8160011c9050919050565b5f808291508390505b6001851115616afd57808604811115616ad957616ad8615e58565b5b6001851615616ae85780820291505b8081029050616af685616aa8565b9450616abd565b94509492505050565b5f82616b155760019050616bd0565b81616b22575f9050616bd0565b8160018114616b385760028114616b4257616b71565b6001915050616bd0565b60ff841115616b5457616b53615e58565b5b8360020a915084821115616b6b57616b6a615e58565b5b50616bd0565b5060208310610133831016604e8410600b8410161715616ba65782820a905083811115616ba157616ba0615e58565b5b616bd0565b616bb38484846001616ab4565b92509050818404811115616bca57616bc9615e58565b5b81810290505b9392505050565b5f616be182614925565b9150616bec83615105565b9250616c197fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484616b06565b905092915050565b5f60a082019050616c345f830188614fde565b616c416020830187614fde565b616c4e6040830186614fde565b616c5b606083018561492e565b616c686080830184614a6b565b9695505050505050565b5f608082019050616c855f830187614fde565b616c926020830186615ddc565b616c9f6040830185614fde565b616cac6060830184614fde565b9594505050505056fea2646970667358221220471c208304acea3054fd5039e7773c86282be71dcf4100ca1f8b478f208e066f64736f6c634300081a0033" + +export const DAO_ABI = [ + { + inputs: [ + { + internalType: "contract IVotes", + name: "_token", + type: "address" + }, + { + internalType: "contract TimelockController", + name: "_timelock", + type: "address" + } + ], + stateMutability: "nonpayable", + type: "constructor" + }, + { + inputs: [], + name: "CheckpointUnorderedInsertion", + type: "error" + }, + { + inputs: [], + name: "FailedInnerCall", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "voter", + type: "address" + } + ], + name: "GovernorAlreadyCastVote", + type: "error" + }, + { + inputs: [ + { + internalType: "uint256", + name: "proposalId", + type: "uint256" + } + ], + name: "GovernorAlreadyQueuedProposal", + type: "error" + }, + { + inputs: [], + name: "GovernorDisabledDeposit", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "proposer", + type: "address" + }, + { + internalType: "uint256", + name: "votes", + type: "uint256" + }, + { + internalType: "uint256", + name: "threshold", + type: "uint256" + } + ], + name: "GovernorInsufficientProposerVotes", + type: "error" + }, + { + inputs: [ + { + internalType: "uint256", + name: "targets", + type: "uint256" + }, + { + internalType: "uint256", + name: "calldatas", + type: "uint256" + }, + { + internalType: "uint256", + name: "values", + type: "uint256" + } + ], + name: "GovernorInvalidProposalLength", + type: "error" + }, + { + inputs: [ + { + internalType: "uint256", + name: "quorumNumerator", + type: "uint256" + }, + { + internalType: "uint256", + name: "quorumDenominator", + type: "uint256" + } + ], + name: "GovernorInvalidQuorumFraction", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "voter", + type: "address" + } + ], + name: "GovernorInvalidSignature", + type: "error" + }, + { + inputs: [], + name: "GovernorInvalidVoteType", + type: "error" + }, + { + inputs: [ + { + internalType: "uint256", + name: "votingPeriod", + type: "uint256" + } + ], + name: "GovernorInvalidVotingPeriod", + type: "error" + }, + { + inputs: [ + { + internalType: "uint256", + name: "proposalId", + type: "uint256" + } + ], + name: "GovernorNonexistentProposal", + type: "error" + }, + { + inputs: [ + { + internalType: "uint256", + name: "proposalId", + type: "uint256" + } + ], + name: "GovernorNotQueuedProposal", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address" + } + ], + name: "GovernorOnlyExecutor", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address" + } + ], + name: "GovernorOnlyProposer", + type: "error" + }, + { + inputs: [], + name: "GovernorQueueNotImplemented", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "proposer", + type: "address" + } + ], + name: "GovernorRestrictedProposer", + type: "error" + }, + { + inputs: [ + { + internalType: "uint256", + name: "proposalId", + type: "uint256" + }, + { + internalType: "enum IGovernor.ProposalState", + name: "current", + type: "uint8" + }, + { + internalType: "bytes32", + name: "expectedStates", + type: "bytes32" + } + ], + name: "GovernorUnexpectedProposalState", + type: "error" + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address" + }, + { + internalType: "uint256", + name: "currentNonce", + type: "uint256" + } + ], + name: "InvalidAccountNonce", + type: "error" + }, + { + inputs: [], + name: "InvalidShortString", + type: "error" + }, + { + inputs: [], + name: "QueueEmpty", + type: "error" + }, + { + inputs: [], + name: "QueueFull", + type: "error" + }, + { + inputs: [ + { + internalType: "uint8", + name: "bits", + type: "uint8" + }, + { + internalType: "uint256", + name: "value", + type: "uint256" + } + ], + name: "SafeCastOverflowedUintDowncast", + type: "error" + }, + { + inputs: [ + { + internalType: "string", + name: "str", + type: "string" + } + ], + name: "StringTooLong", + type: "error" + }, + { + anonymous: false, + inputs: [], + name: "EIP712DomainChanged", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "proposalId", + type: "uint256" + } + ], + name: "ProposalCanceled", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "proposalId", + type: "uint256" + }, + { + indexed: false, + internalType: "address", + name: "proposer", + type: "address" + }, + { + indexed: false, + internalType: "address[]", + name: "targets", + type: "address[]" + }, + { + indexed: false, + internalType: "uint256[]", + name: "values", + type: "uint256[]" + }, + { + indexed: false, + internalType: "string[]", + name: "signatures", + type: "string[]" + }, + { + indexed: false, + internalType: "bytes[]", + name: "calldatas", + type: "bytes[]" + }, + { + indexed: false, + internalType: "uint256", + name: "voteStart", + type: "uint256" + }, + { + indexed: false, + internalType: "uint256", + name: "voteEnd", + type: "uint256" + }, + { + indexed: false, + internalType: "string", + name: "description", + type: "string" + } + ], + name: "ProposalCreated", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "proposalId", + type: "uint256" + } + ], + name: "ProposalExecuted", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "proposalId", + type: "uint256" + }, + { + indexed: false, + internalType: "uint256", + name: "etaSeconds", + type: "uint256" + } + ], + name: "ProposalQueued", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldProposalThreshold", + type: "uint256" + }, + { + indexed: false, + internalType: "uint256", + name: "newProposalThreshold", + type: "uint256" + } + ], + name: "ProposalThresholdSet", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldQuorumNumerator", + type: "uint256" + }, + { + indexed: false, + internalType: "uint256", + name: "newQuorumNumerator", + type: "uint256" + } + ], + name: "QuorumNumeratorUpdated", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "oldTimelock", + type: "address" + }, + { + indexed: false, + internalType: "address", + name: "newTimelock", + type: "address" + } + ], + name: "TimelockChange", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "voter", + type: "address" + }, + { + indexed: false, + internalType: "uint256", + name: "proposalId", + type: "uint256" + }, + { + indexed: false, + internalType: "uint8", + name: "support", + type: "uint8" + }, + { + indexed: false, + internalType: "uint256", + name: "weight", + type: "uint256" + }, + { + indexed: false, + internalType: "string", + name: "reason", + type: "string" + } + ], + name: "VoteCast", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "voter", + type: "address" + }, + { + indexed: false, + internalType: "uint256", + name: "proposalId", + type: "uint256" + }, + { + indexed: false, + internalType: "uint8", + name: "support", + type: "uint8" + }, + { + indexed: false, + internalType: "uint256", + name: "weight", + type: "uint256" + }, + { + indexed: false, + internalType: "string", + name: "reason", + type: "string" + }, + { + indexed: false, + internalType: "bytes", + name: "params", + type: "bytes" + } + ], + name: "VoteCastWithParams", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldVotingDelay", + type: "uint256" + }, + { + indexed: false, + internalType: "uint256", + name: "newVotingDelay", + type: "uint256" + } + ], + name: "VotingDelaySet", + type: "event" + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldVotingPeriod", + type: "uint256" + }, + { + indexed: false, + internalType: "uint256", + name: "newVotingPeriod", + type: "uint256" + } + ], + name: "VotingPeriodSet", + type: "event" + }, + { + inputs: [], + name: "BALLOT_TYPEHASH", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "CLOCK_MODE", + outputs: [ + { + internalType: "string", + name: "", + type: "string" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "COUNTING_MODE", + outputs: [ + { + internalType: "string", + name: "", + type: "string" + } + ], + stateMutability: "pure", + type: "function" + }, + { + inputs: [], + name: "EXTENDED_BALLOT_TYPEHASH", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "address[]", + name: "targets", + type: "address[]" + }, + { + internalType: "uint256[]", + name: "values", + type: "uint256[]" + }, + { + internalType: "bytes[]", + name: "calldatas", + type: "bytes[]" + }, + { + internalType: "bytes32", + name: "descriptionHash", + type: "bytes32" + } + ], + name: "cancel", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "proposalId", + type: "uint256" + }, + { + internalType: "uint8", + name: "support", + type: "uint8" + } + ], + name: "castVote", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "proposalId", + type: "uint256" + }, + { + internalType: "uint8", + name: "support", + type: "uint8" + }, + { + internalType: "address", + name: "voter", + type: "address" + }, + { + internalType: "bytes", + name: "signature", + type: "bytes" + } + ], + name: "castVoteBySig", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "proposalId", + type: "uint256" + }, + { + internalType: "uint8", + name: "support", + type: "uint8" + }, + { + internalType: "string", + name: "reason", + type: "string" + } + ], + name: "castVoteWithReason", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "proposalId", + type: "uint256" + }, + { + internalType: "uint8", + name: "support", + type: "uint8" + }, + { + internalType: "string", + name: "reason", + type: "string" + }, + { + internalType: "bytes", + name: "params", + type: "bytes" + } + ], + name: "castVoteWithReasonAndParams", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "proposalId", + type: "uint256" + }, + { + internalType: "uint8", + name: "support", + type: "uint8" + }, + { + internalType: "address", + name: "voter", + type: "address" + }, + { + internalType: "string", + name: "reason", + type: "string" + }, + { + internalType: "bytes", + name: "params", + type: "bytes" + }, + { + internalType: "bytes", + name: "signature", + type: "bytes" + } + ], + name: "castVoteWithReasonAndParamsBySig", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [], + name: "clock", + outputs: [ + { + internalType: "uint48", + name: "", + type: "uint48" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "eip712Domain", + outputs: [ + { + internalType: "bytes1", + name: "fields", + type: "bytes1" + }, + { + internalType: "string", + name: "name", + type: "string" + }, + { + internalType: "string", + name: "version", + type: "string" + }, + { + internalType: "uint256", + name: "chainId", + type: "uint256" + }, + { + internalType: "address", + name: "verifyingContract", + type: "address" + }, + { + internalType: "bytes32", + name: "salt", + type: "bytes32" + }, + { + internalType: "uint256[]", + name: "extensions", + type: "uint256[]" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "address[]", + name: "targets", + type: "address[]" + }, + { + internalType: "uint256[]", + name: "values", + type: "uint256[]" + }, + { + internalType: "bytes[]", + name: "calldatas", + type: "bytes[]" + }, + { + internalType: "bytes32", + name: "descriptionHash", + type: "bytes32" + } + ], + name: "execute", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "payable", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address" + }, + { + internalType: "uint256", + name: "timepoint", + type: "uint256" + } + ], + name: "getVotes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address" + }, + { + internalType: "uint256", + name: "timepoint", + type: "uint256" + }, + { + internalType: "bytes", + name: "params", + type: "bytes" + } + ], + name: "getVotesWithParams", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "proposalId", + type: "uint256" + }, + { + internalType: "address", + name: "account", + type: "address" + } + ], + name: "hasVoted", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "address[]", + name: "targets", + type: "address[]" + }, + { + internalType: "uint256[]", + name: "values", + type: "uint256[]" + }, + { + internalType: "bytes[]", + name: "calldatas", + type: "bytes[]" + }, + { + internalType: "bytes32", + name: "descriptionHash", + type: "bytes32" + } + ], + name: "hashProposal", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "pure", + type: "function" + }, + { + inputs: [], + name: "name", + outputs: [ + { + internalType: "string", + name: "", + type: "string" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address" + } + ], + name: "nonces", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address" + }, + { + internalType: "address", + name: "", + type: "address" + }, + { + internalType: "uint256[]", + name: "", + type: "uint256[]" + }, + { + internalType: "uint256[]", + name: "", + type: "uint256[]" + }, + { + internalType: "bytes", + name: "", + type: "bytes" + } + ], + name: "onERC1155BatchReceived", + outputs: [ + { + internalType: "bytes4", + name: "", + type: "bytes4" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address" + }, + { + internalType: "address", + name: "", + type: "address" + }, + { + internalType: "uint256", + name: "", + type: "uint256" + }, + { + internalType: "uint256", + name: "", + type: "uint256" + }, + { + internalType: "bytes", + name: "", + type: "bytes" + } + ], + name: "onERC1155Received", + outputs: [ + { + internalType: "bytes4", + name: "", + type: "bytes4" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address" + }, + { + internalType: "address", + name: "", + type: "address" + }, + { + internalType: "uint256", + name: "", + type: "uint256" + }, + { + internalType: "bytes", + name: "", + type: "bytes" + } + ], + name: "onERC721Received", + outputs: [ + { + internalType: "bytes4", + name: "", + type: "bytes4" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "proposalId", + type: "uint256" + } + ], + name: "proposalDeadline", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "proposalId", + type: "uint256" + } + ], + name: "proposalEta", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "proposalId", + type: "uint256" + } + ], + name: "proposalNeedsQueuing", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "proposalId", + type: "uint256" + } + ], + name: "proposalProposer", + outputs: [ + { + internalType: "address", + name: "", + type: "address" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "proposalId", + type: "uint256" + } + ], + name: "proposalSnapshot", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "proposalThreshold", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "proposalId", + type: "uint256" + } + ], + name: "proposalVotes", + outputs: [ + { + internalType: "uint256", + name: "againstVotes", + type: "uint256" + }, + { + internalType: "uint256", + name: "forVotes", + type: "uint256" + }, + { + internalType: "uint256", + name: "abstainVotes", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "address[]", + name: "targets", + type: "address[]" + }, + { + internalType: "uint256[]", + name: "values", + type: "uint256[]" + }, + { + internalType: "bytes[]", + name: "calldatas", + type: "bytes[]" + }, + { + internalType: "string", + name: "description", + type: "string" + } + ], + name: "propose", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "address[]", + name: "targets", + type: "address[]" + }, + { + internalType: "uint256[]", + name: "values", + type: "uint256[]" + }, + { + internalType: "bytes[]", + name: "calldatas", + type: "bytes[]" + }, + { + internalType: "bytes32", + name: "descriptionHash", + type: "bytes32" + } + ], + name: "queue", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "blockNumber", + type: "uint256" + } + ], + name: "quorum", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "quorumDenominator", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "timepoint", + type: "uint256" + } + ], + name: "quorumNumerator", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "quorumNumerator", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "target", + type: "address" + }, + { + internalType: "uint256", + name: "value", + type: "uint256" + }, + { + internalType: "bytes", + name: "data", + type: "bytes" + } + ], + name: "relay", + outputs: [], + stateMutability: "payable", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "newProposalThreshold", + type: "uint256" + } + ], + name: "setProposalThreshold", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "uint48", + name: "newVotingDelay", + type: "uint48" + } + ], + name: "setVotingDelay", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "uint32", + name: "newVotingPeriod", + type: "uint32" + } + ], + name: "setVotingPeriod", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "proposalId", + type: "uint256" + } + ], + name: "state", + outputs: [ + { + internalType: "enum IGovernor.ProposalState", + name: "", + type: "uint8" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "bytes4", + name: "interfaceId", + type: "bytes4" + } + ], + name: "supportsInterface", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "timelock", + outputs: [ + { + internalType: "address", + name: "", + type: "address" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "token", + outputs: [ + { + internalType: "contract IERC5805", + name: "", + type: "address" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "newQuorumNumerator", + type: "uint256" + } + ], + name: "updateQuorumNumerator", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [ + { + internalType: "contract TimelockController", + name: "newTimelock", + type: "address" + } + ], + name: "updateTimelock", + outputs: [], + stateMutability: "nonpayable", + type: "function" + }, + { + inputs: [], + name: "version", + outputs: [ + { + internalType: "string", + name: "", + type: "string" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "votingDelay", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "votingPeriod", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + }, + { + stateMutability: "payable", + type: "receive" + } +] + +export const wrapperAbiGlobal = [ + { + inputs: [ + { + components: [ + { + internalType: "string", + name: "name", + type: "string" + }, + { + internalType: "string", + name: "symbol", + type: "string" + }, + { + internalType: "string", + name: "description", + type: "string" + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8" + }, + { + internalType: "uint256", + name: "executionDelay", + type: "uint256" + }, + { + internalType: "address[]", + name: "initialMembers", + type: "address[]" + }, + { + internalType: "uint256[]", + name: "initialAmounts", + type: "uint256[]" + }, + { + internalType: "string[]", + name: "keys", + type: "string[]" + }, + { + internalType: "string[]", + name: "values", + type: "string[]" + } + ], + internalType: "struct WrapperContract.DaoParams", + name: "params", + type: "tuple" + } + ], + name: "deployDAOwithToken", + outputs: [], + stateMutability: "payable", + type: "function" + }, + { + inputs: [ + { + internalType: "address", + name: "_tokenFactory", + type: "address" + }, + { + internalType: "address", + name: "_timelockFactory", + type: "address" + }, + { + internalType: "address", + name: "_daoFactory", + type: "address" + } + ], + stateMutability: "nonpayable", + type: "constructor" + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "dao", + type: "address" + }, + { + indexed: false, + internalType: "address", + name: "token", + type: "address" + }, + { + indexed: false, + internalType: "address[]", + name: "initialMembers", + type: "address[]" + }, + { + indexed: false, + internalType: "uint256[]", + name: "initialAmounts", + type: "uint256[]" + }, + { + indexed: false, + internalType: "string", + name: "name", + type: "string" + }, + { + indexed: false, + internalType: "string", + name: "symbol", + type: "string" + }, + { + indexed: false, + internalType: "string", + name: "description", + type: "string" + }, + { + indexed: false, + internalType: "uint256", + name: "executionDelay", + type: "uint256" + }, + { + indexed: false, + internalType: "address", + name: "registry", + type: "address" + }, + { + indexed: false, + internalType: "string[]", + name: "keys", + type: "string[]" + }, + { + indexed: false, + internalType: "string[]", + name: "values", + type: "string[]" + } + ], + name: "NewDaoCreated", + type: "event" + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + name: "deployedDAOs", + outputs: [ + { + internalType: "address", + name: "", + type: "address" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + name: "deployedRegistries", + outputs: [ + { + internalType: "address", + name: "", + type: "address" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + name: "deployedTimelocks", + outputs: [ + { + internalType: "address", + name: "", + type: "address" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + name: "deployedTokens", + outputs: [ + { + internalType: "address", + name: "", + type: "address" + } + ], + stateMutability: "view", + type: "function" + }, + { + inputs: [], + name: "getNumberOfDAOs", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + } + ], + stateMutability: "view", + type: "function" + } +] diff --git a/src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx b/src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx index 4336105b..da89d64b 100644 --- a/src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx +++ b/src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx @@ -1,6 +1,18 @@ +import { ethers } from "ethers" import { create } from "zustand" import { STEPS } from "modules/etherlink/config" import { useHistory } from "react-router-dom" +import HbEvmAbi from "assets/abis/hb_evm.json" +import HbDaoAbi from "assets/abis/hb_dao.json" +import HbTimelockAbi from "assets/abis/hb_timelock.json" +import HbWrapperAbi from "assets/abis/hb_wrapper.json" + +import { useCallback, useState } from "react" +import { useTezos } from "services/beacon/hooks/useTezos" +import { DAO_ABI, DAO_BYTECODE, wrapperAbiGlobal } from "./temp-config" + +// const DAO_ABI = HbDaoAbi.output.abi +// const DAO_BYTECODE = HbDaoAbi.output.bytecode interface EvmDaoCreateStore { currentStep: number @@ -81,16 +93,146 @@ const useEvmDaoCreateZustantStore = create((set, get) => ({ })) const useEvmDaoCreateStore = () => { + const [isDeploying, setIsDeploying] = useState(false) const data = useEvmDaoCreateZustantStore() const history = useHistory() + const { etherlink } = useTezos() + const initialMembers = ["0x1E4f6Bbb0448ad06b7b777BBBe6909385d477EE1"] + const initialAmounts = [1000] + const minDelay = 0 + const minVotingDelay = 4 + const proposalThreshhold = 1 + const quorumRequired = 1 + + const proposers = [] as string[] + const executors = [] as string[] + + const deployDao = useCallback(async () => { + const daoData = data.data + + try { + const tokenFactory = new ethers.ContractFactory(HbEvmAbi.abi, HbEvmAbi.bytecode, etherlink.signer) + const timelockFactory = new ethers.ContractFactory(HbTimelockAbi.abi, HbTimelockAbi.bytecode, etherlink.signer) + const daoFactory = new ethers.ContractFactory(HbDaoAbi.abi, HbDaoAbi.bytecode, etherlink.signer) + + const token = await tokenFactory.deploy("MyToken", "MTK", 3, initialMembers, initialAmounts) + await token.waitForDeployment() + console.log("Token deployed at:", token.target) + + const deployedToken = new ethers.Contract(token.target, HbEvmAbi.abi, etherlink.signer) + const setDelegateTx = await deployedToken.delegate(etherlink.signer.address) + await setDelegateTx.wait() + console.log("Token delegate set at:", etherlink.signer.address) + + console.log("Deploying TimeLockController contract...") + + const timeLock = await timelockFactory.deploy(minDelay, proposers, executors, etherlink.signer.address) + await timeLock.waitForDeployment() + console.log("TimeLockController deployed at:", timeLock.target) + + const hbDao = await daoFactory.deploy( + deployedToken.target, + timeLock.target, + "AKDAO", + minDelay, + minVotingDelay, + proposalThreshhold, + quorumRequired + ) + await hbDao.waitForDeployment() + console.log("HomebaseDAO deployed at:", hbDao.target) + } catch (e) { + console.error("Error deploying DAO", e) + return null + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [data.data]) + + const deployDaoWrapper = useCallback(async () => { + const daoData = data.data + + try { + const wrapperFactory = new ethers.ContractFactory(HbWrapperAbi.abi, HbWrapperAbi.bytecode, etherlink.signer) + const wrapper = await wrapperFactory.deploy( + "AK DAO1", // DAO Name + "AKD", // DAO Symbol + "About DAO1", // DAO Description + "3", // Token Decimals + "6", // Execution Delay in minutes + initialMembers, // Initial Members + [ + ...initialAmounts, // Members 1 Token Allocation + "5", // voting delay in minutes + "10", // voting duration in minutes (e.g.10 minutes) + "1", // proposal threshold (1% of total supply) + "4" // quorum (4% of total supply) + ], + ["RKEY"], // Registry Keys + ["RVALUE"] // Registry Values + ) + await wrapper.waitForDeployment() + const wrapperAddress = await wrapper.getAddress() + console.log("Wrapper deployed at:", wrapperAddress) + + // const contract = await factory.deploy( + // "AK DAO1", // DAO Name + // "AKD", // DAO Symbol + // "About DAO1", // DAO Description + // "3", // Token Decimals + // "6", // Execution Delay in minutes + // ["0x1E4f6Bbb0448ad06b7b777BBBe6909385d477EE1"], // Initial Members + // [ + // "1000", // Members 1 Token Allocation + // "5", // voting delay in minutes + // "10", // voting duration in minutes (e.g.10 minutes) + // "1", // proposal threshold (1% of total supply) + // "4" // quorum (4% of total supply) + // ], + // ["RKEY"], // Registry Keys + // ["RVALUE"] // Registry Values + // ) + // const contract = await factory.deploy( + // "AK DAO1", // DAO Name + // "AKD", // DAO Symbol + // "About DAO1", // DAO Description + // "3", // Token Decimals + // "6", // Execution Delay in minutes + // ["0x1E4f6Bbb0448ad06b7b777BBBe6909385d477EE1"], // Initial Members + // [ + // "1000", // Members 1 Token Allocation + // "5", // voting delay in minutes + // "10", // voting duration in minutes (e.g.10 minutes) + // "1", // proposal threshold (1% of total supply) + // "4" // quorum (4% of total supply) + // ], + // ["RKEY"], // Registry Keys + // ["RVALUE"] // Registry Values + // ) + + // await contract.waitForDeployment() + // const contractAddress = await contract.getAddress() + // alert("Contract deployed at: " + contractAddress) + // return contractAddress + } catch (error) { + console.error("Error deploying DAO", error) + return null + } + }, [data.data, etherlink.signer]) + const isFinalStep = data.currentStep === STEPS.length - 1 + return { ...data, + deployDao, next: { - text: "Next", + text: isFinalStep ? "Deploy" : "Next", handler: () => { - const nextStep = data.next.handler() - if (nextStep) { - history.push(nextStep) + if (isFinalStep) { + deployDao() + } else { + const nextStep = data.next.handler() + if (nextStep) { + history.push(nextStep) + } } } }, diff --git a/src/services/contracts/token/hooks/useToken.ts b/src/services/contracts/token/hooks/useToken.ts index 9f13d031..339cbd2b 100644 --- a/src/services/contracts/token/hooks/useToken.ts +++ b/src/services/contracts/token/hooks/useToken.ts @@ -20,13 +20,14 @@ export const useTokenOriginate = (tokenData: TokenContractParams) => { const { tezos, connect, network, account, etherlink } = useTezos() const provider = etherlink.provider const signer = etherlink.signer + console.log({ provider }) const openNotification = useNotification() const result = useMutation, Error, TokenContractParams>( async ({ tokenDistribution, tokenSettings }) => { console.log({ tokenDistribution, tokenSettings, network }) - console.log({ provider }) + if (network.startsWith("etherlink")) { try { console.log("Deployer", signer?.getAddress()) diff --git a/src/services/wagmi/context.tsx b/src/services/wagmi/context.tsx index 7f812607..ef4bb04e 100644 --- a/src/services/wagmi/context.tsx +++ b/src/services/wagmi/context.tsx @@ -10,6 +10,7 @@ import { useParams } from "react-router-dom" import { ProposalStatus } from "services/services/dao/mappers/proposal/types" import { useTezos } from "services/beacon/hooks/useTezos" import dayjs from "dayjs" +import { ethers } from "ethers" interface EtherlinkType { isConnected: boolean @@ -53,8 +54,13 @@ const useEtherlinkDao = ({ network }: { network: string }) => { const [daoData, setDaoData] = useState([]) const [daoSelected, setDaoSelected] = useState({}) + const [daoRegistryDetails, setDaoRegistryDetails] = useState<{ + balance: string + }>({ balance: "0" }) + const [daoProposals, setDaoProposals] = useState([]) const [daoProposalSelected, setDaoProposalSelected] = useState({}) + const [daoMembers, setDaoMembers] = useState([]) const { data: firestoreData, loading, fetchCollection } = useFirestoreStore() @@ -114,12 +120,26 @@ const useEtherlinkDao = ({ network }: { network: string }) => { if (daoSelected.id && firebaseRootCollection) { fetchCollection(`${firebaseRootCollection}/${daoSelected.id}/proposals`) fetchCollection(`${firebaseRootCollection}/${daoSelected.id}/members`) + console.log({ daoSelected }) + // TODO: Replace this with proper service + fetch(`https://testnet.explorer.etherlink.com/api/v2/addresses/${daoSelected.registryAddress}`) + .then(res => res.json()) + .then(data => { + const tokenDecimals = daoSelected.decimals + const coinBalance = data?.coin_balance + const ethBalance = ethers.formatEther(coinBalance) + setDaoRegistryDetails({ + balance: ethBalance + }) + console.log("Treasury Data", ethBalance) + }) } }, [daoSelected, fetchCollection, firebaseRootCollection]) return { daos: daoData, daoSelected, + daoRegistryDetails, daoProposals, daoProposalSelected, daoMembers, @@ -203,6 +223,7 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children daos, isLoadingDaos, daoSelected, + daoRegistryDetails, daoProposals, isLoadingDaoProposals, daoProposalSelected, @@ -235,6 +256,7 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children isLoadingDaos, isLoadingDaoProposals, daoSelected, + daoRegistryDetails, daoProposals, daoProposalSelected, daoMembers, From f6f5e7712ca353e305b1ac57c847260f1a0e8419 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Wed, 18 Dec 2024 21:16:52 +0530 Subject: [PATCH 29/36] DAO Registry page --- .../etherlink/components/EvmDaoVoting.tsx | 270 ------------- src/modules/etherlink/config.ts | 14 +- .../{components => creator}/EvmDaoBasics.tsx | 107 +++-- .../EvmDaoMembership.tsx | 11 +- .../{components => creator}/EvmDaoQuorum.tsx | 0 .../etherlink/creator/EvmDaoRegistry.tsx | 144 +++++++ .../{components => creator}/EvmDaoSummary.tsx | 0 .../etherlink/creator/EvmDaoVoting.tsx | 275 +++++++++++++ src/modules/etherlink/layout.tsx | 2 +- .../hooks/useEvmDaoCreateStore.tsx | 367 +++++++++--------- src/services/wagmi/context.tsx | 24 +- 11 files changed, 717 insertions(+), 497 deletions(-) delete mode 100644 src/modules/etherlink/components/EvmDaoVoting.tsx rename src/modules/etherlink/{components => creator}/EvmDaoBasics.tsx (68%) rename src/modules/etherlink/{components => creator}/EvmDaoMembership.tsx (89%) rename src/modules/etherlink/{components => creator}/EvmDaoQuorum.tsx (100%) create mode 100644 src/modules/etherlink/creator/EvmDaoRegistry.tsx rename src/modules/etherlink/{components => creator}/EvmDaoSummary.tsx (100%) create mode 100644 src/modules/etherlink/creator/EvmDaoVoting.tsx diff --git a/src/modules/etherlink/components/EvmDaoVoting.tsx b/src/modules/etherlink/components/EvmDaoVoting.tsx deleted file mode 100644 index bd4e9c08..00000000 --- a/src/modules/etherlink/components/EvmDaoVoting.tsx +++ /dev/null @@ -1,270 +0,0 @@ -import { Grid, styled, Tooltip, Typography, withStyles } from "@material-ui/core" -import { InfoRounded } from "@material-ui/icons" -import { DescriptionText } from "components/ui/DaoCreator" -import { TitleBlock } from "modules/common/TitleBlock" -import React from "react" -import { Field, Formik, Form } from "formik" -import { TextField } from "formik-material-ui" - -const TimeBox = styled(Grid)(({ theme }) => ({ - background: theme.palette.primary.dark, - borderRadius: 8, - width: 72, - minHeight: 59, - marginBottom: 16, - display: "grid", - [theme.breakpoints.down("sm")]: { - width: 160 - } -})) - -const TimeText = styled(Typography)({ - marginTop: -20, - marginLeft: 16, - fontWeight: 300 -}) - -const CustomTooltip = styled(Tooltip)({ - marginLeft: 8 -}) - -const InfoIconInput = styled(InfoRounded)(({ theme }) => ({ - cursor: "default", - color: theme.palette.secondary.light, - height: 16, - width: 16, - marginLeft: 8 -})) - -const InputContainer = styled(Grid)({ - paddingRight: 15, - ["@media (max-width:1167px)"]: { - paddingRight: 0 - } -}) - -const CustomFormikTextField = withStyles({ - root: { - "& input": { - textAlign: "center" - } - } -})(TextField) - -const styles = { - voting: { - marginTop: 6, - marginBottom: 16, - fontWeight: 400, - fontSize: 18, - width: "75%" - } -} - -interface EvmDaoVotingProps { - onSubmit?: (values: any) => void - initialValues?: any -} - -const initialFormValues = { - votingBlocksDay: 0, - votingBlocksHours: 0, - votingBlocksMinutes: 0, - proposalFlushBlocksDay: 0, - proposalFlushBlocksHours: 0, - proposalFlushBlocksMinutes: 0, - proposalExpiryBlocksDay: 0, - proposalExpiryBlocksHours: 0, - proposalExpiryBlocksMinutes: 0 -} - -export const EvmDaoVoting: React.FC = ({ onSubmit, initialValues = initialFormValues }) => { - const handleSubmit = (values: any) => { - if (onSubmit) { - onSubmit(values) - } - } - - return ( -
- - These settings will define the voting configuration for your DAO. - - } - /> - - - {({ isSubmitting }) => ( -
- - - - - Voting Delay - - - - - - - - - - - - days - - - - - - hours - - - - - - minutes - - - - - - - - Voting Duration - - - - - - - - - - - - days - - - - - - hours - - - - - - minutes - - - - - - - - Execution Delay - - - - - - - - - - - - days - - - - - - hours - - - - - - minutes - - - - - - )} -
-
- ) -} diff --git a/src/modules/etherlink/config.ts b/src/modules/etherlink/config.ts index f4685058..53d30d71 100644 --- a/src/modules/etherlink/config.ts +++ b/src/modules/etherlink/config.ts @@ -1,8 +1,9 @@ -import { EvmDaoBasics } from "./components/EvmDaoBasics" -import { EvmDaoMembership } from "./components/EvmDaoMembership" -import { EvmDaoQuorum } from "./components/EvmDaoQuorum" -import { EvmDaoSummary } from "./components/EvmDaoSummary" -import { EvmDaoVoting } from "./components/EvmDaoVoting" +import { EvmDaoRegistry } from "./creator/EvmDaoRegistry" +import { EvmDaoBasics } from "./creator/EvmDaoBasics" +import { EvmDaoMembership } from "./creator/EvmDaoMembership" +import { EvmDaoQuorum } from "./creator/EvmDaoQuorum" +import { EvmDaoSummary } from "./creator/EvmDaoSummary" +import { EvmDaoVoting } from "./creator/EvmDaoVoting" export const STEPS = [ { title: "DAO Template", index: 0, path: "template", component: EvmDaoBasics }, @@ -10,7 +11,8 @@ export const STEPS = [ { title: "Proposals & Voting", index: 2, path: "voting", component: EvmDaoVoting }, { title: "Quorum", index: 3, path: "quorum", component: EvmDaoQuorum }, { title: "Membership", index: 4, path: "membership", component: EvmDaoMembership }, - { title: "Review & Deploy", index: 5, path: "summary", component: EvmDaoSummary } + { title: "Registry", index: 5, path: "registry", component: EvmDaoRegistry }, + { title: "Review & Deploy", index: 6, path: "summary", component: EvmDaoSummary } ] export const urlToStepMap: Record = { diff --git a/src/modules/etherlink/components/EvmDaoBasics.tsx b/src/modules/etherlink/creator/EvmDaoBasics.tsx similarity index 68% rename from src/modules/etherlink/components/EvmDaoBasics.tsx rename to src/modules/etherlink/creator/EvmDaoBasics.tsx index 3ba80ac1..151e0ec7 100644 --- a/src/modules/etherlink/components/EvmDaoBasics.tsx +++ b/src/modules/etherlink/creator/EvmDaoBasics.tsx @@ -1,4 +1,4 @@ -import { Field, Form, FormikErrors, getIn } from "formik" +import { Form, FormikErrors } from "formik" import { Formik } from "formik" import { Box } from "@mui/material" import { TitleBlock } from "modules/common/TitleBlock" @@ -6,19 +6,43 @@ import { DescriptionText, SecondContainer, CustomInputContainer, - CustomFormikTextField, InfoIconInput, TextareaContainer, MetadataContainer, CustomTextarea } from "components/ui/DaoCreator" import React from "react" -import { Link } from "@material-ui/core" +import { Link, TextField, withStyles } from "@material-ui/core" import { Grid, Typography, useMediaQuery, useTheme, InputAdornment, Tooltip } from "@material-ui/core" import { ErrorText } from "modules/creator/token/ui" import { validateEvmTokenAddress } from "../utils" import { InfoIcon } from "modules/explorer/components/styled/InfoIcon" +import useEvmDaoCreateStore from "services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore" + +const CustomFormikTextField = withStyles({ + root: { + "& .MuiInput-root": { + fontWeight: 300, + textAlign: "initial" + }, + "& .MuiInputBase-input": { + textAlign: "initial" + }, + "& .MuiInputBase-root": { + textWeight: 300 + }, + "& .MuiInput-underline:before": { + borderBottom: "none !important" + }, + "& .MuiInput-underline:hover:before": { + borderBottom: "none !important" + }, + "& .MuiInput-underline:after": { + borderBottom: "none !important" + } + } +})(TextField) interface EvmDaoBasicsProps { // Add props as needed @@ -83,6 +107,9 @@ const validateForm = (values: EvmDaoSettings) => { export const EvmDaoBasics: React.FC = () => { const theme = useTheme() const isMobile = useMediaQuery(theme.breakpoints.down("sm")) + const { data: daoData, setFieldValue, getIn } = useEvmDaoCreateStore() + + console.log({ daoData }) const saveStepInfo = (values: EvmDaoSettings, { setSubmitting }: { setSubmitting: (b: boolean) => void }) => { const newValues: EvmDaoSettings = { ...values } @@ -125,7 +152,7 @@ export const EvmDaoBasics: React.FC = () => { onSubmit={saveStepInfo} initialValues={orgSettings} > - {({ submitForm, isSubmitting, setFieldValue, values, errors, touched, setFieldTouched }) => { + {({ errors, touched }) => { return (
<> @@ -136,13 +163,17 @@ export const EvmDaoBasics: React.FC = () => { DAO Name{" "} - + // value={daoData?.name} + defaultValue={daoData?.name} + onChange={(e: React.ChangeEvent) => { + console.log("Setting DAO Name to", e.target.value) + setFieldValue("name", e.target.value) + }} + /> {errors.name && touched.name ? {errors.name} : null} @@ -152,14 +183,15 @@ export const EvmDaoBasics: React.FC = () => { Ticker Symbol{" "} - setFieldTouched("governanceToken.symbol")} - inputProps={{ - maxLength: 36 + type="text" + placeholder="ETH" + defaultValue={daoData?.governanceToken.symbol} + inputProps={{ maxLength: 36 }} + onChange={(e: React.ChangeEvent) => { + console.log("Setting DAO Symbol to", e.target.value) + setFieldValue("governanceToken.symbol", e.target.value) }} /> @@ -173,11 +205,11 @@ export const EvmDaoBasics: React.FC = () => { Token Decimals{" "} - @@ -190,6 +222,10 @@ export const EvmDaoBasics: React.FC = () => { ) }} + onChange={(e: React.ChangeEvent) => { + console.log("Setting DAO Token Decimals to", e.target.value) + setFieldValue("governanceToken.tokenDecimals", e.target.value) + }} /> {errors.governanceToken?.tokenDecimals && touched.governanceToken?.tokenDecimals ? ( @@ -198,28 +234,25 @@ export const EvmDaoBasics: React.FC = () => { - - + + DAO Description + + + - - {() => ( - { - setFieldValue("description", newValue.target.value) - }} - /> - )} - - - - + { + setFieldValue("description", newValue.target.value) + }} + /> {errors.description && touched.description ? {errors.description} : null} diff --git a/src/modules/etherlink/components/EvmDaoMembership.tsx b/src/modules/etherlink/creator/EvmDaoMembership.tsx similarity index 89% rename from src/modules/etherlink/components/EvmDaoMembership.tsx rename to src/modules/etherlink/creator/EvmDaoMembership.tsx index 360304d3..f7b01cad 100644 --- a/src/modules/etherlink/components/EvmDaoMembership.tsx +++ b/src/modules/etherlink/creator/EvmDaoMembership.tsx @@ -1,6 +1,6 @@ import { useState } from "react" import { TextField } from "@mui/material" -import { IconButton, styled } from "@material-ui/core" +import { IconButton, styled, Typography } from "@material-ui/core" import { Button } from "components/ui/Button" import { Add, RemoveCircleOutline } from "@material-ui/icons" import { Box } from "@material-ui/core" @@ -74,6 +74,15 @@ export const EvmDaoMembership = () => { } /> + + + Total Tokens:{" "} + {members.reduce( + (acc, member) => parseFloat(acc.toString()) + parseFloat(member.amountOfTokens.toString()), + 0 + )} + + {members.map((member, index) => ( { + const { data, setFieldValue } = useEvmDaoCreateStore() + const [entries, setEntries] = useState( + Object.keys(data?.registry).length !== 0 + ? Object.entries(data.registry).map(([key, value]) => ({ key, value: value as string })) + : [{ key: "", value: "" }] + ) + + const handleEntryChange = (index: number, field: keyof RegistryEntry, value: string) => { + const newEntries = [...entries] + newEntries[index] = { ...newEntries[index], [field]: value } + setEntries(newEntries) + + // Update the registry object in the store + const registryObject = newEntries.reduce((acc, entry) => { + if (entry.key) { + acc[entry.key] = entry.value + } + return acc + }, {} as Record) + + setFieldValue("registry", registryObject) + } + + const handleAddEntry = () => { + setEntries([...entries, { key: "", value: "" }]) + } + + const handleRemoveEntry = (index: number) => { + const newEntries = entries.filter((_, i) => i !== index) + setEntries(newEntries) + + // Update the registry object in the store + const registryObject = newEntries.reduce((acc, entry) => { + if (entry.key) { + acc[entry.key] = entry.value + } + return acc + }, {} as Record) + + setFieldValue("registry", registryObject) + } + + return ( + + + Add key-value pairs to your DAO's registry. This can include information like roles, mission statements, or + any other metadata. + + } + /> + + {entries.map((entry, index) => ( + + + handleEntryChange(index, "key", e.target.value)} + /> + + + handleEntryChange(index, "value", e.target.value)} + /> + + {index >= 1 && ( + handleRemoveEntry(index)} size="small"> + + + )} + {index === 0 && } + + ))} + + + + + ) +} diff --git a/src/modules/etherlink/components/EvmDaoSummary.tsx b/src/modules/etherlink/creator/EvmDaoSummary.tsx similarity index 100% rename from src/modules/etherlink/components/EvmDaoSummary.tsx rename to src/modules/etherlink/creator/EvmDaoSummary.tsx diff --git a/src/modules/etherlink/creator/EvmDaoVoting.tsx b/src/modules/etherlink/creator/EvmDaoVoting.tsx new file mode 100644 index 00000000..29efa841 --- /dev/null +++ b/src/modules/etherlink/creator/EvmDaoVoting.tsx @@ -0,0 +1,275 @@ +import { Grid, styled, Tooltip, Typography, withStyles } from "@material-ui/core" +import { InfoRounded } from "@material-ui/icons" +import { DescriptionText } from "components/ui/DaoCreator" +import { TitleBlock } from "modules/common/TitleBlock" +import React from "react" +import { TextField } from "@material-ui/core" +import useEvmDaoCreateStore from "services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore" + +const TimeBox = styled(Grid)(({ theme }) => ({ + background: theme.palette.primary.dark, + borderRadius: 8, + width: 72, + minHeight: 59, + marginBottom: 16, + display: "grid", + [theme.breakpoints.down("sm")]: { + width: 160 + } +})) + +const TimeText = styled(Typography)({ + marginTop: -20, + marginLeft: 16, + fontWeight: 300 +}) + +const CustomTooltip = styled(Tooltip)({ + marginLeft: 8 +}) + +const InfoIconInput = styled(InfoRounded)(({ theme }) => ({ + cursor: "default", + color: theme.palette.secondary.light, + height: 16, + width: 16, + marginLeft: 8 +})) + +const InputContainer = styled(Grid)({ + paddingRight: 15, + ["@media (max-width:1167px)"]: { + paddingRight: 0 + } +}) + +const StyledTextField = withStyles({ + root: { + "& input": { + textAlign: "center", + color: "#fff" + } + } +})(TextField) + +const styles = { + voting: { + marginTop: 6, + marginBottom: 16, + fontWeight: 400, + fontSize: 18, + width: "75%" + } +} + +interface EvmDaoVotingProps { + onSubmit?: (values: any) => void + initialValues?: any +} + +const initialFormValues = { + votingBlocksDay: 0, + votingBlocksHours: 0, + votingBlocksMinutes: 0, + proposalFlushBlocksDay: 0, + proposalFlushBlocksHours: 0, + proposalFlushBlocksMinutes: 0, + proposalExpiryBlocksDay: 0, + proposalExpiryBlocksHours: 0, + proposalExpiryBlocksMinutes: 0 +} + +export const EvmDaoVoting: React.FC = ({ onSubmit, initialValues = initialFormValues }) => { + const { data: daoData, touched, errors, setFieldValue } = useEvmDaoCreateStore() + const handleSubmit = (values: any) => { + if (onSubmit) { + onSubmit(values) + } + } + + return ( +
+ + These settings will define the voting configuration for your DAO. + + } + /> + + + + + + Voting Delay + + + + + + + + + + setFieldValue("voting.votingBlocksDay", e.target.value)} + /> + + days + + + + setFieldValue("voting.votingBlocksHours", e.target.value)} + /> + + hours + + + + setFieldValue("voting.votingBlocksMinutes", e.target.value)} + /> + + minutes + + + + + + + + Voting Duration + + + + + + + + + + setFieldValue("voting.proposalFlushBlocksDay", e.target.value)} + /> + + days + + + + setFieldValue("voting.proposalFlushBlocksHours", e.target.value)} + /> + + hours + + + + setFieldValue("voting.proposalFlushBlocksMinutes", e.target.value)} + /> + + minutes + + + + + + + + Execution Delay + + + + + + + + + + setFieldValue("voting.proposalExpiryBlocksDay", e.target.value)} + /> + + days + + + + setFieldValue("voting.proposalExpiryBlocksHours", e.target.value)} + /> + + hours + + + + setFieldValue("voting.proposalExpiryBlocksMinutes", e.target.value)} + /> + + minutes + + + + +
+ ) +} diff --git a/src/modules/etherlink/layout.tsx b/src/modules/etherlink/layout.tsx index 5604ebf8..04542ea1 100644 --- a/src/modules/etherlink/layout.tsx +++ b/src/modules/etherlink/layout.tsx @@ -1,4 +1,4 @@ -import React, { useContext, useEffect } from "react" +import React from "react" import { Box, Grid, Step, StepLabel, useMediaQuery, useTheme, Link } from "@material-ui/core" import ProgressBar from "react-customizable-progressbar" import { useHistory } from "react-router" diff --git a/src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx b/src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx index da89d64b..a3c109bc 100644 --- a/src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx +++ b/src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx @@ -1,24 +1,22 @@ import { ethers } from "ethers" import { create } from "zustand" + +import { persist, createJSONStorage } from "zustand/middleware" + import { STEPS } from "modules/etherlink/config" import { useHistory } from "react-router-dom" -import HbEvmAbi from "assets/abis/hb_evm.json" -import HbDaoAbi from "assets/abis/hb_dao.json" -import HbTimelockAbi from "assets/abis/hb_timelock.json" import HbWrapperAbi from "assets/abis/hb_wrapper.json" -import { useCallback, useState } from "react" +import { useCallback, useContext, useState } from "react" import { useTezos } from "services/beacon/hooks/useTezos" -import { DAO_ABI, DAO_BYTECODE, wrapperAbiGlobal } from "./temp-config" - -// const DAO_ABI = HbDaoAbi.output.abi -// const DAO_BYTECODE = HbDaoAbi.output.bytecode +import { EtherlinkContext } from "services/wagmi/context" interface EvmDaoCreateStore { currentStep: number data: Record loading: Record - error: Record + errors: Record + touched: Record getIn: (field: string) => any setFieldValue: (field: string, value: any) => void next: { @@ -31,203 +29,218 @@ interface EvmDaoCreateStore { } } -const useEvmDaoCreateZustantStore = create((set, get) => ({ - currentStep: 0, - data: { - name: "", - symbol: "", - description: "", - administrator: "", - governanceToken: { - address: "", - symbol: "", - tokenDecimals: 0 - }, - quorum: { - returnedTokenPercentage: 0 - }, - members: [{ address: "", amountOfTokens: 0 }], - voting: { - votingBlocksDay: 0, - votingBlocksWeek: 0 - }, - registry: {} - }, - getIn: (field: string) => { - if (field.includes(".")) { - const [parent, child] = field.split(".") - return get().data[parent][child] - } - return get().data[field] - }, - setFieldValue: (field: string, value: any) => { - if (field.includes(".")) { - const [parent, child] = field.split(".") - set({ data: { ...get().data, [parent]: { ...get().data[parent], [child]: value } } }) - } else { - set({ data: { ...get().data, [field]: value } }) - } - }, - next: { - text: "Next", - handler: () => { - const { currentStep } = get() - if (currentStep === STEPS.length - 1) return - console.log("Moving to Next Step", currentStep) - set({ currentStep: currentStep + 1 }) - return STEPS[currentStep + 1]?.path - } - }, - prev: { - text: "Back", - handler: () => { - const { currentStep } = get() - if (currentStep === 0) return - console.log("Moving to Previous Step", currentStep) - set({ currentStep: currentStep - 1 }) - return STEPS[currentStep - 1]?.path +const useEvmDaoCreateZustantStore = create()( + persist( + (set, get) => ({ + currentStep: 0, + data: { + name: "", + symbol: "", + description: "", + administrator: "", + governanceToken: { + address: "", + symbol: "", + tokenDecimals: 0 + }, + quorum: { + returnedTokenPercentage: 0, + proposalThresholdPercentage: 0 + }, + members: [{ address: "", amountOfTokens: 0 }], + voting: { + votingBlocksDay: 0, + votingBlocksHours: 0, + votingBlocksMinutes: 0, + proposalFlushBlocksDay: 0, + proposalFlushBlocksHours: 0, + proposalFlushBlocksMinutes: 0, + proposalExpiryBlocksDay: 0, + proposalExpiryBlocksHours: 0, + proposalExpiryBlocksMinutes: 0 + }, + registry: {} + }, + getIn: (field: string) => { + if (field.includes(".")) { + const [parent, child] = field.split(".") + return get().data[parent][child] + } + return get().data[field] + }, + setFieldValue: (field: string, value: any) => { + if (field.includes(".")) { + const [parent, child] = field.split(".") + set({ + data: { + ...get().data, + [parent]: { + ...(get().data[parent] || {}), + [child]: value + } + }, + touched: { + ...get().touched, + [parent]: { + ...(get().touched[parent] || {}), + [child]: true + } + } + }) + } else { + set({ + data: { ...get().data, [field]: value }, + touched: { ...get().touched, [field]: true } + }) + } + }, + next: { + text: "Next", + handler: () => { + const { currentStep } = get() + if (currentStep === STEPS.length - 1) return + console.log("Moving to Next Step", currentStep) + set({ currentStep: currentStep + 1 }) + return STEPS[currentStep + 1]?.path + } + }, + prev: { + text: "Back", + handler: () => { + const { currentStep } = get() + if (currentStep === 0) return + console.log("Moving to Previous Step", currentStep) + set({ currentStep: currentStep - 1 }) + return STEPS[currentStep - 1]?.path + } + }, + loading: {}, + touched: { + name: false, + symbol: false, + description: false, + administrator: false, + governanceToken: { + address: false, + symbol: false, + tokenDecimals: false + } + }, + errors: { + name: "", + symbol: "", + description: "", + administrator: "", + governanceToken: { + address: "", + symbol: "", + tokenDecimals: 0 + } + } + }), + { + name: "evm-dao-create-store", + partialize: state => ({ + data: state.data, + touched: state.touched, + errors: state.errors + }), + storage: createJSONStorage(() => localStorage) } - }, - loading: {}, - error: {} -})) + ) +) const useEvmDaoCreateStore = () => { const [isDeploying, setIsDeploying] = useState(false) const data = useEvmDaoCreateZustantStore() const history = useHistory() + const { contractData } = useContext(EtherlinkContext) + const wrapperAddress = contractData?.wrapper const { etherlink } = useTezos() - const initialMembers = ["0x1E4f6Bbb0448ad06b7b777BBBe6909385d477EE1"] - const initialAmounts = [1000] - const minDelay = 0 - const minVotingDelay = 4 - const proposalThreshhold = 1 - const quorumRequired = 1 - const proposers = [] as string[] - const executors = [] as string[] - - const deployDao = useCallback(async () => { + const deployDaoWithWrapper = useCallback(async () => { const daoData = data.data - + // console.log({ daoData }) + // return try { - const tokenFactory = new ethers.ContractFactory(HbEvmAbi.abi, HbEvmAbi.bytecode, etherlink.signer) - const timelockFactory = new ethers.ContractFactory(HbTimelockAbi.abi, HbTimelockAbi.bytecode, etherlink.signer) - const daoFactory = new ethers.ContractFactory(HbDaoAbi.abi, HbDaoAbi.bytecode, etherlink.signer) - - const token = await tokenFactory.deploy("MyToken", "MTK", 3, initialMembers, initialAmounts) - await token.waitForDeployment() - console.log("Token deployed at:", token.target) - - const deployedToken = new ethers.Contract(token.target, HbEvmAbi.abi, etherlink.signer) - const setDelegateTx = await deployedToken.delegate(etherlink.signer.address) - await setDelegateTx.wait() - console.log("Token delegate set at:", etherlink.signer.address) - - console.log("Deploying TimeLockController contract...") + // Get wrapper factory + const samplePayload = [ + "SundayX", // DAO Name + "SUNX", // DAO Symbol + "Getting ready for the week.", // DAO Description + 2, // Token Decimals + 60, // Execution Delay in seconds + ["0xa9F8F9C0bf3188cEDdb9684ae28655187552bAE9", "0xA6A40E0b6DB5a6f808703DBe91DbE50B7FC1fa3E"], // Initial Members + [ + 5000000, // Member 1 Token Allocation + 3450000, // Member 2 Token Allocation + 2, // Voting Delay in minutes + 3, // Voting Duration in minutes + 4000, // Proposal Threshold (1% of total supply) + 50 // Quorum (4% of total supply) + ], + ["Founder", "Mission"], // Registry Keys + ["Alice", "Promote Decentralization"] // Registry Values + ] + setIsDeploying(true) + const totalTokenSupply = daoData.members.reduce((acc: number, member: any) => acc + member.amountOfTokens, 0) + const proposalThreshhold = (daoData.quorum.proposalThresholdPercentage / 100) * totalTokenSupply + const quorumThreshold = (daoData.quorum.returnedTokenPercentage / 100) * totalTokenSupply - const timeLock = await timelockFactory.deploy(minDelay, proposers, executors, etherlink.signer.address) - await timeLock.waitForDeployment() - console.log("TimeLockController deployed at:", timeLock.target) + const executationDelayinSeconds = + daoData.voting.proposalExpiryBlocksDay * 24 * 60 * 60 + + daoData.voting.proposalExpiryBlocksHours * 60 * 60 + + daoData.voting.proposalExpiryBlocksMinutes * 60 - const hbDao = await daoFactory.deploy( - deployedToken.target, - timeLock.target, - "AKDAO", - minDelay, - minVotingDelay, - proposalThreshhold, - quorumRequired - ) - await hbDao.waitForDeployment() - console.log("HomebaseDAO deployed at:", hbDao.target) - } catch (e) { - console.error("Error deploying DAO", e) - return null - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [data.data]) + const votingDelayInMinutes = + daoData.voting.votingBlocksDay * 24 * 60 + + daoData.voting.votingBlocksHours * 60 + + daoData.voting.votingBlocksMinutes - const deployDaoWrapper = useCallback(async () => { - const daoData = data.data + const votingDurationInMinutes = + daoData.voting.proposalFlushBlocksDay * 24 * 60 + + daoData.voting.proposalFlushBlocksHours * 60 + + daoData.voting.proposalFlushBlocksMinutes - try { - const wrapperFactory = new ethers.ContractFactory(HbWrapperAbi.abi, HbWrapperAbi.bytecode, etherlink.signer) - const wrapper = await wrapperFactory.deploy( - "AK DAO1", // DAO Name - "AKD", // DAO Symbol - "About DAO1", // DAO Description - "3", // Token Decimals - "6", // Execution Delay in minutes - initialMembers, // Initial Members - [ - ...initialAmounts, // Members 1 Token Allocation - "5", // voting delay in minutes - "10", // voting duration in minutes (e.g.10 minutes) - "1", // proposal threshold (1% of total supply) - "4" // quorum (4% of total supply) + const wrapperFactory: ethers.Contract = new ethers.Contract(wrapperAddress, HbWrapperAbi.abi, etherlink.signer) + const wrapper: ethers.Contract = await wrapperFactory.deployDAOwithToken({ + name: daoData.name, + symbol: daoData.governanceToken.symbol, + description: daoData.description, + decimals: daoData.governanceToken.tokenDecimals, + executionDelay: executationDelayinSeconds, + initialMembers: daoData.members.map((member: any) => member.address), + initialAmounts: [ + ...daoData.members.map((member: any) => member.amountOfTokens), + votingDelayInMinutes, + votingDurationInMinutes, + proposalThreshhold, + quorumThreshold ], - ["RKEY"], // Registry Keys - ["RVALUE"] // Registry Values - ) - await wrapper.waitForDeployment() - const wrapperAddress = await wrapper.getAddress() - console.log("Wrapper deployed at:", wrapperAddress) + keys: Object.keys(daoData.registry), + values: Object.values(daoData.registry) + }) - // const contract = await factory.deploy( - // "AK DAO1", // DAO Name - // "AKD", // DAO Symbol - // "About DAO1", // DAO Description - // "3", // Token Decimals - // "6", // Execution Delay in minutes - // ["0x1E4f6Bbb0448ad06b7b777BBBe6909385d477EE1"], // Initial Members - // [ - // "1000", // Members 1 Token Allocation - // "5", // voting delay in minutes - // "10", // voting duration in minutes (e.g.10 minutes) - // "1", // proposal threshold (1% of total supply) - // "4" // quorum (4% of total supply) - // ], - // ["RKEY"], // Registry Keys - // ["RVALUE"] // Registry Values - // ) - // const contract = await factory.deploy( - // "AK DAO1", // DAO Name - // "AKD", // DAO Symbol - // "About DAO1", // DAO Description - // "3", // Token Decimals - // "6", // Execution Delay in minutes - // ["0x1E4f6Bbb0448ad06b7b777BBBe6909385d477EE1"], // Initial Members - // [ - // "1000", // Members 1 Token Allocation - // "5", // voting delay in minutes - // "10", // voting duration in minutes (e.g.10 minutes) - // "1", // proposal threshold (1% of total supply) - // "4" // quorum (4% of total supply) - // ], - // ["RKEY"], // Registry Keys - // ["RVALUE"] // Registry Values - // ) + console.log("Transaction sent:", wrapper.hash) - // await contract.waitForDeployment() - // const contractAddress = await contract.getAddress() - // alert("Contract deployed at: " + contractAddress) - // return contractAddress + const receipt = await wrapper.wait() + console.log("Transaction confirmed:", receipt) } catch (error) { console.error("Error deploying DAO", error) return null } - }, [data.data, etherlink.signer]) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [data.data, etherlink.signer, wrapperAddress]) const isFinalStep = data.currentStep === STEPS.length - 1 return { ...data, - deployDao, + isDeploying, next: { text: isFinalStep ? "Deploy" : "Next", handler: () => { if (isFinalStep) { - deployDao() + deployDaoWithWrapper() } else { const nextStep = data.next.handler() if (nextStep) { diff --git a/src/services/wagmi/context.tsx b/src/services/wagmi/context.tsx index ef4bb04e..2d833a30 100644 --- a/src/services/wagmi/context.tsx +++ b/src/services/wagmi/context.tsx @@ -51,7 +51,7 @@ const useEtherlinkDao = ({ network }: { network: string }) => { const [isLoadingDaos, setIsLoadingDaos] = useState(!!firebaseRootCollection) const [isLoadingDaoProposals, setIsLoadingDaoProposals] = useState(true) - + const [contractData, setContractData] = useState([]) const [daoData, setDaoData] = useState([]) const [daoSelected, setDaoSelected] = useState({}) const [daoRegistryDetails, setDaoRegistryDetails] = useState<{ @@ -64,7 +64,10 @@ const useEtherlinkDao = ({ network }: { network: string }) => { const [daoMembers, setDaoMembers] = useState([]) const { data: firestoreData, loading, fetchCollection } = useFirestoreStore() + console.log({ contractData }) + useEffect(() => { + fetchCollection("contracts") if (firebaseRootCollection) { // Trigger DAO Loading Request fetchCollection(firebaseRootCollection) @@ -86,6 +89,14 @@ const useEtherlinkDao = ({ network }: { network: string }) => { setDaoData(firestoreData[firebaseRootCollection]) setIsLoadingDaos(false) } + + if (firestoreData?.["contracts"]) { + const isTestnet = firebaseRootCollection?.toLowerCase().includes("testnet") + const contractDataForNetwork = firestoreData["contracts"]?.find((contract: any) => + contract.id?.toLowerCase().includes(isTestnet ? "testnet" : "mainnet") + ) + setContractData(contractDataForNetwork) + } const daoProposalKey = `${firebaseRootCollection}/${daoSelected.id}/proposals` if (firestoreData?.[daoProposalKey]) { setDaoProposals( @@ -98,13 +109,13 @@ const useEtherlinkDao = ({ network }: { network: string }) => { return { ...firebaseProposal, status: getStatusByHistory(firebaseProposal.statusHistory), - statusHistoryMap: Object.entries(firebaseProposal.statusHistory).map( - ([status, timestamp]: [string, any]) => ({ + statusHistoryMap: Object.entries(firebaseProposal.statusHistory) + .map(([status, timestamp]: [string, any]) => ({ status, timestamp: timestamp?.seconds as unknown as number, timestamp_human: dayjs.unix(timestamp?.seconds as unknown as number).format("MMM DD, YYYY HH:mm:ss") - }) - ), + })) + .sort((a, b) => b.timestamp - a.timestamp), votingExpiresAt: votingExpiresAt } }) @@ -137,6 +148,7 @@ const useEtherlinkDao = ({ network }: { network: string }) => { }, [daoSelected, fetchCollection, firebaseRootCollection]) return { + contractData, daos: daoData, daoSelected, daoRegistryDetails, @@ -220,6 +232,7 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children }, [chain?.name, network]) const { + contractData, daos, isLoadingDaos, daoSelected, @@ -252,6 +265,7 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children setOpen(true) // connect({ config: wagmiConfig }) }, + contractData, daos, isLoadingDaos, isLoadingDaoProposals, From 047501c0563666853b452dfe213437dcc3895a59 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Wed, 18 Dec 2024 21:37:53 +0530 Subject: [PATCH 30/36] Improved DAO Creator flow --- .../components/creator/EvmDaoVoting.tsx | 275 ++++++++++++++++++ src/modules/etherlink/config.ts | 3 +- .../etherlink/creator/EvmDaoTemplate.tsx | 118 ++++++++ .../hooks/useEvmDaoCreateStore.tsx | 2 + 4 files changed, 397 insertions(+), 1 deletion(-) create mode 100644 src/modules/etherlink/components/creator/EvmDaoVoting.tsx create mode 100644 src/modules/etherlink/creator/EvmDaoTemplate.tsx diff --git a/src/modules/etherlink/components/creator/EvmDaoVoting.tsx b/src/modules/etherlink/components/creator/EvmDaoVoting.tsx new file mode 100644 index 00000000..29efa841 --- /dev/null +++ b/src/modules/etherlink/components/creator/EvmDaoVoting.tsx @@ -0,0 +1,275 @@ +import { Grid, styled, Tooltip, Typography, withStyles } from "@material-ui/core" +import { InfoRounded } from "@material-ui/icons" +import { DescriptionText } from "components/ui/DaoCreator" +import { TitleBlock } from "modules/common/TitleBlock" +import React from "react" +import { TextField } from "@material-ui/core" +import useEvmDaoCreateStore from "services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore" + +const TimeBox = styled(Grid)(({ theme }) => ({ + background: theme.palette.primary.dark, + borderRadius: 8, + width: 72, + minHeight: 59, + marginBottom: 16, + display: "grid", + [theme.breakpoints.down("sm")]: { + width: 160 + } +})) + +const TimeText = styled(Typography)({ + marginTop: -20, + marginLeft: 16, + fontWeight: 300 +}) + +const CustomTooltip = styled(Tooltip)({ + marginLeft: 8 +}) + +const InfoIconInput = styled(InfoRounded)(({ theme }) => ({ + cursor: "default", + color: theme.palette.secondary.light, + height: 16, + width: 16, + marginLeft: 8 +})) + +const InputContainer = styled(Grid)({ + paddingRight: 15, + ["@media (max-width:1167px)"]: { + paddingRight: 0 + } +}) + +const StyledTextField = withStyles({ + root: { + "& input": { + textAlign: "center", + color: "#fff" + } + } +})(TextField) + +const styles = { + voting: { + marginTop: 6, + marginBottom: 16, + fontWeight: 400, + fontSize: 18, + width: "75%" + } +} + +interface EvmDaoVotingProps { + onSubmit?: (values: any) => void + initialValues?: any +} + +const initialFormValues = { + votingBlocksDay: 0, + votingBlocksHours: 0, + votingBlocksMinutes: 0, + proposalFlushBlocksDay: 0, + proposalFlushBlocksHours: 0, + proposalFlushBlocksMinutes: 0, + proposalExpiryBlocksDay: 0, + proposalExpiryBlocksHours: 0, + proposalExpiryBlocksMinutes: 0 +} + +export const EvmDaoVoting: React.FC = ({ onSubmit, initialValues = initialFormValues }) => { + const { data: daoData, touched, errors, setFieldValue } = useEvmDaoCreateStore() + const handleSubmit = (values: any) => { + if (onSubmit) { + onSubmit(values) + } + } + + return ( +
+ + These settings will define the voting configuration for your DAO. + + } + /> + + + + + + Voting Delay + + + + + + + + + + setFieldValue("voting.votingBlocksDay", e.target.value)} + /> + + days + + + + setFieldValue("voting.votingBlocksHours", e.target.value)} + /> + + hours + + + + setFieldValue("voting.votingBlocksMinutes", e.target.value)} + /> + + minutes + + + + + + + + Voting Duration + + + + + + + + + + setFieldValue("voting.proposalFlushBlocksDay", e.target.value)} + /> + + days + + + + setFieldValue("voting.proposalFlushBlocksHours", e.target.value)} + /> + + hours + + + + setFieldValue("voting.proposalFlushBlocksMinutes", e.target.value)} + /> + + minutes + + + + + + + + Execution Delay + + + + + + + + + + setFieldValue("voting.proposalExpiryBlocksDay", e.target.value)} + /> + + days + + + + setFieldValue("voting.proposalExpiryBlocksHours", e.target.value)} + /> + + hours + + + + setFieldValue("voting.proposalExpiryBlocksMinutes", e.target.value)} + /> + + minutes + + + + +
+ ) +} diff --git a/src/modules/etherlink/config.ts b/src/modules/etherlink/config.ts index 53d30d71..bb9c3006 100644 --- a/src/modules/etherlink/config.ts +++ b/src/modules/etherlink/config.ts @@ -4,9 +4,10 @@ import { EvmDaoMembership } from "./creator/EvmDaoMembership" import { EvmDaoQuorum } from "./creator/EvmDaoQuorum" import { EvmDaoSummary } from "./creator/EvmDaoSummary" import { EvmDaoVoting } from "./creator/EvmDaoVoting" +import { EvmDaoTemplate } from "./creator/EvmDaoTemplate" export const STEPS = [ - { title: "DAO Template", index: 0, path: "template", component: EvmDaoBasics }, + { title: "DAO Template", index: 0, path: "template", component: EvmDaoTemplate }, { title: "DAO Basics", index: 1, path: "dao", component: EvmDaoBasics }, { title: "Proposals & Voting", index: 2, path: "voting", component: EvmDaoVoting }, { title: "Quorum", index: 3, path: "quorum", component: EvmDaoQuorum }, diff --git a/src/modules/etherlink/creator/EvmDaoTemplate.tsx b/src/modules/etherlink/creator/EvmDaoTemplate.tsx new file mode 100644 index 00000000..0e4bcbcc --- /dev/null +++ b/src/modules/etherlink/creator/EvmDaoTemplate.tsx @@ -0,0 +1,118 @@ +import React, { useState } from "react" +import { Grid, styled, Typography, Box, useMediaQuery, useTheme, makeStyles } from "@material-ui/core" +import { useHistory } from "react-router" + +import { ReactComponent as LiteIcon } from "assets/img/lite-dao.svg" +import { ReactComponent as FullIcon } from "assets/img/full-dao.svg" + +import { TitleBlock } from "modules/common/TitleBlock" +import useEvmDaoCreateStore from "services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore" + +const LambdaCustomBox = styled(Grid)(({ theme }) => ({ + "height": 273, + "marginTop": 30, + "background": "#2F3438", + "borderRadius": 8, + "maxWidth": 342, + "width": "-webkit-fill-available", + "textAlign": "start", + "cursor": "pointer", + "paddingBottom": 0, + "flexBasis": "47%", + "padding": "33px 38px 0px", + "&:hover": { + border: "3px solid rgba(129, 254, 183, 0.4)", + padding: "30px 35px 0px" + }, + ["@media (max-width:1167px)"]: { + marginBottom: 20, + marginTop: 0 + } +})) + +const styles = makeStyles({ + selected: { + border: "3px solid rgba(129, 254, 183, 0.4)", + paddingBottom: 0, + padding: "30px 35px 0px" + } +}) + +const ErrorText = styled(Typography)({ + display: "block", + fontSize: 14, + color: "red", + marginTop: 8 +}) + +const BoxTitle = styled(Typography)({ + fontSize: 18, + fontWeight: 600, + fontFamily: "Roboto Flex", + marginBottom: 10 +}) + +const BoxDescription = styled(Typography)({ + fontWeight: 300, + fontSize: 18, + lineHeight: "160%", + alignSelf: "stretch" +}) + +type DaoTemplate = "full" | "lite" + +export const EvmDaoTemplate = (): JSX.Element => { + const theme = useTheme() + const style = styles() + const { data: daoData, setFieldValue } = useEvmDaoCreateStore() + const selectedTemplate = daoData.template + const isMobileSmall = useMediaQuery(theme.breakpoints.down("xs")) + const [error, setError] = useState(false) + + const handleTemplateSelect = (template: DaoTemplate) => { + setError(false) + setFieldValue("template", template) + } + + return ( + + + + handleTemplateSelect("full")} + className={selectedTemplate === "full" ? style.selected : ""} + > + + Full DAO + + Contract interaction. Transfer assets based on vote outcomes. + + + + handleTemplateSelect("lite")} + className={selectedTemplate === "lite" ? style.selected : ""} + > + + Lite DAO + + Off-chain weighted voting. Multiple voting strategies. No treasury. + + + + {error && Must select a template in order to continue} + + ) +} diff --git a/src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx b/src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx index a3c109bc..a5e03ce2 100644 --- a/src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx +++ b/src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx @@ -35,6 +35,7 @@ const useEvmDaoCreateZustantStore = create()( currentStep: 0, data: { name: "", + template: "full", symbol: "", description: "", administrator: "", @@ -239,6 +240,7 @@ const useEvmDaoCreateStore = () => { next: { text: isFinalStep ? "Deploy" : "Next", handler: () => { + if (data.data.template === "lite") return history.push("/lite") if (isFinalStep) { deployDaoWithWrapper() } else { From db9009a1978241d7c222bc615ea344ffd2adac6c Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Wed, 18 Dec 2024 22:56:01 +0530 Subject: [PATCH 31/36] WIP - User Page --- .../explorer/EtherlinkDAO/EvmUserPage.tsx | 133 +- src/modules/etherlink/explorer/index.tsx | 13 +- .../components/EthTransferFundsForm.tsx | 2 +- .../etherlinkDAO/hooks/temp-config.ts | 1875 ----------------- .../etherlinkDAO/hooks/useEvmDaoOps.tsx | 63 + src/services/wagmi/context.tsx | 38 +- 6 files changed, 222 insertions(+), 1902 deletions(-) delete mode 100644 src/services/contracts/etherlinkDAO/hooks/temp-config.ts create mode 100644 src/services/contracts/etherlinkDAO/hooks/useEvmDaoOps.tsx diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmUserPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmUserPage.tsx index f4c565f1..274ab29c 100644 --- a/src/modules/etherlink/explorer/EtherlinkDAO/EvmUserPage.tsx +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmUserPage.tsx @@ -1,3 +1,134 @@ +import React, { useContext } from "react" +import { Box, Grid, styled, Typography } from "@material-ui/core" +import { Button } from "components/ui/Button" +import { HowToVote, People } from "@material-ui/icons" +import { useTezos } from "services/beacon/hooks/useTezos" +import { EtherlinkContext } from "services/wagmi/context" +import { useEvmDaoOps } from "services/contracts/etherlinkDAO/hooks/useEvmDaoOps" + +const StatsContainer = styled(Grid)({ + marginBottom: "40px", + display: "flex", + gap: "20px" +}) + +const StatBox = styled(Box)({ + padding: "20px", + background: "#2F3438", + borderRadius: "8px", + flex: 1, + minWidth: 0 +}) + +const StatLabel = styled(Typography)({ + color: "#9E9E9E", + fontSize: "14px", + marginBottom: "8px" +}) + +const StatValue = styled(Typography)({ + color: "#fff", + fontSize: "24px", + fontWeight: 500 +}) + +const DelegationBox = styled(Box)(({ theme }) => ({ + background: "#2F3438", + borderRadius: "8px", + padding: "32px", + marginBottom: "20px", + display: "flex", + flexDirection: "column", + alignItems: "center", + textAlign: "center", + gap: "16px" +})) + +const AddressDisplay = styled(Typography)({ + color: "#fff", + fontSize: "14px", + fontFamily: "monospace", + marginBottom: "20px" +}) + +const DelegationTitle = styled(Typography)({ + fontSize: "24px", + color: "#fff", + marginBottom: "16px" +}) + +const DelegationDescription = styled(Typography)({ + color: "#9E9E9E", + fontSize: "16px", + marginBottom: "24px" +}) + export const EvmUserPage = () => { - return
User
+ const { daoSelected } = useContext(EtherlinkContext) + const { daoDelegate, signer, userTokenBalance, userVotingWeight } = useEvmDaoOps() + const userAddress = signer?.address + const votingWeight = userVotingWeight + const personalBalance = userTokenBalance + const proposalsCreated = 0 + const votesCast = 0 + + return ( + + {userAddress} + + + + Voting Weight + {votingWeight} + + + Personal {daoSelected?.symbol} Balance + {personalBalance} + + + Proposals Created + {proposalsCreated} + + + Votes Cast + {votesCast} + + + + + Delegation settings + + + You can either delegate your vote or accept delegations, but not both at the same time. + + + + + + + DELEGATE YOUR VOTE + + If you can't or don't want to take part in the governance process, your voting privilege may be forwarded + to another member of your choosing. + + + + + + + + + VOTE DIRECTLY + + This also allows other members to delegate their vote to you, so that you may participate in the + governance process on their behalf. + + Only voting on your behalf + + + + + ) } diff --git a/src/modules/etherlink/explorer/index.tsx b/src/modules/etherlink/explorer/index.tsx index ba31393a..8efeafc9 100644 --- a/src/modules/etherlink/explorer/index.tsx +++ b/src/modules/etherlink/explorer/index.tsx @@ -1,15 +1,5 @@ import React, { useContext, useState } from "react" -import { - Grid, - Typography, - useTheme, - useMediaQuery, - TableCell, - TableBody, - TableContainer, - Table, - TableRow -} from "@material-ui/core" +import { Grid, Typography, useTheme, useMediaQuery } from "@material-ui/core" import { SmallButton } from "../../common/SmallButton" @@ -23,7 +13,6 @@ import { TitleText } from "components/ui/TitleText" import { EtherlinkContext } from "services/wagmi/context" import { EvmDaoStatsRow } from "../components/EvmDaoStatsRow" import { EvmDaoSettingModal } from "../components/EvmDaoSettingsModal" -import { CopyButton } from "components/ui/CopyButton" import { EvmTreasuryTable } from "../components/EvmTreasuryTable" export const EtherlinkDAOOverview: React.FC = () => { diff --git a/src/modules/explorer/components/EthTransferFundsForm.tsx b/src/modules/explorer/components/EthTransferFundsForm.tsx index 18c474a6..af9fe918 100644 --- a/src/modules/explorer/components/EthTransferFundsForm.tsx +++ b/src/modules/explorer/components/EthTransferFundsForm.tsx @@ -2,7 +2,6 @@ import React, { useState } from "react" import { Box } from "@mui/material" import { ResponsiveDialog } from "./ResponsiveDialog" import { ProposalFormInput } from "./ProposalFormInput" -import { Controller } from "react-hook-form" import { Grid, TextField, Paper, styled, useTheme, useMediaQuery } from "@material-ui/core" import { Autocomplete } from "@material-ui/lab" import { SendButton } from "./ProposalFormSendButton" @@ -72,6 +71,7 @@ const EthTransferFundsForm: React.FC = ({ open, handle renderInput={params => ( { + const [tokenContract, setTokenContract] = useState(null) + const { etherlink } = useTezos() + const { daoSelected } = useContext(EtherlinkContext) + const [userVotingWeight, setUserVotingWeight] = useState(0) + const [userTokenBalance, setUserTokenBalance] = useState(0) + + const daoDelegate = useCallback( + async (targetAddress: string) => { + if (!daoSelected) return + const govContract = new ethers.Contract(daoSelected.token, HbTokenAbi.abi, etherlink.signer) + const tx = await govContract.delegate({ + delegatee: targetAddress + }) + console.log("Transaction sent:", tx.hash) + const receipt = await tx.wait() + console.log("Transaction confirmed:", receipt) + return receipt + }, + [daoSelected, etherlink.signer] + ) + + useEffect(() => { + if (!etherlink?.signer || !tokenContract) return + const getUserTokenBalance = async () => { + const balance = await tokenContract.balanceOf(etherlink?.signer?.address) + const balanceActual = Number(balance) / Math.pow(10, daoSelected?.decimals) + console.log("User Balance", balanceActual) + setUserTokenBalance(balanceActual) + } + const getUserVotingWeight = async () => { + const weight = await tokenContract.getVotes(etherlink?.signer?.address) + const weightActual = Number(weight) / Math.pow(10, daoSelected?.decimals) + console.log("User Voting Weight", weightActual) + setUserVotingWeight(weightActual) + } + getUserTokenBalance() + getUserVotingWeight() + }, [daoSelected?.decimals, daoSelected?.token, etherlink.signer, tokenContract]) + + useEffect(() => { + if (!etherlink?.signer || !daoSelected?.token) return + setTokenContract(new ethers.Contract(daoSelected?.token, HbTokenAbi.abi, etherlink.signer)) + }, [daoSelected?.token, etherlink.signer]) + + return { + signer: etherlink?.signer, + userTokenBalance, + userVotingWeight, + // TODO: Maybe remove + loggedInUser: { + address: etherlink?.signer?.address + }, + daoDelegate + } +} diff --git a/src/services/wagmi/context.tsx b/src/services/wagmi/context.tsx index 2d833a30..8867b4a5 100644 --- a/src/services/wagmi/context.tsx +++ b/src/services/wagmi/context.tsx @@ -1,12 +1,12 @@ -import React, { useState, createContext, ReactNode, useMemo, useRef, useEffect } from "react" +import React, { useState, createContext, ReactNode, useMemo, useRef, useEffect, useCallback } from "react" import { useSwitchChain, useAccount as useWagmiAccount, useConnect as useWagmiConnect } from "wagmi" import { disconnect as disconnectEtherlink } from "@wagmi/core" import { config as wagmiConfig } from "services/wagmi/config" import { etherlink, etherlinkTestnet } from "wagmi/chains" -import { useSIWE, useModal, SIWESession } from "connectkit" +import { useModal } from "connectkit" import { useEthersProvider, useEthersSigner } from "./ethers" import useFirestoreStore from "services/contracts/etherlinkDAO/hooks/useFirestoreStore" -import { useParams } from "react-router-dom" +import HbTokenAbi from "assets/abis/hb_evm.json" import { ProposalStatus } from "services/services/dao/mappers/proposal/types" import { useTezos } from "services/beacon/hooks/useTezos" import dayjs from "dayjs" @@ -53,7 +53,22 @@ const useEtherlinkDao = ({ network }: { network: string }) => { const [isLoadingDaoProposals, setIsLoadingDaoProposals] = useState(true) const [contractData, setContractData] = useState([]) const [daoData, setDaoData] = useState([]) - const [daoSelected, setDaoSelected] = useState({}) + const [daoSelected, setDaoSelected] = useState<{ + id: string + address: string + name: string + symbol: string + decimals: number + description: string + token: string + registryAddress: string + treasuryAddress: string + proposalThreshold: string + totalSupply: string + registry: Record + votingDuration: number + votingDelayInMinutes: number + } | null>(null) const [daoRegistryDetails, setDaoRegistryDetails] = useState<{ balance: string }>({ balance: "0" }) @@ -64,8 +79,6 @@ const useEtherlinkDao = ({ network }: { network: string }) => { const [daoMembers, setDaoMembers] = useState([]) const { data: firestoreData, loading, fetchCollection } = useFirestoreStore() - console.log({ contractData }) - useEffect(() => { fetchCollection("contracts") if (firebaseRootCollection) { @@ -82,10 +95,6 @@ const useEtherlinkDao = ({ network }: { network: string }) => { console.log("Firestore Data", firestoreData) if (!firebaseRootCollection) return if (firestoreData?.[firebaseRootCollection]) { - // firestoreData[firebaseRootCollection]?.forEach((dao: any) => { - // console.log("DAOTreasury", dao.id, Object.values(dao.treasury)) - // }) - setDaoData(firestoreData[firebaseRootCollection]) setIsLoadingDaos(false) } @@ -97,7 +106,10 @@ const useEtherlinkDao = ({ network }: { network: string }) => { ) setContractData(contractDataForNetwork) } + if (!daoSelected?.id) return const daoProposalKey = `${firebaseRootCollection}/${daoSelected.id}/proposals` + const daoMembersKey = `${firebaseRootCollection}/${daoSelected?.id}/members` + if (firestoreData?.[daoProposalKey]) { setDaoProposals( firestoreData[daoProposalKey] @@ -121,14 +133,14 @@ const useEtherlinkDao = ({ network }: { network: string }) => { }) ) } - const daoMembersKey = `${firebaseRootCollection}/${daoSelected.id}/members` + if (firestoreData?.[daoMembersKey]) { setDaoMembers(firestoreData[daoMembersKey]) } - }, [daoSelected.id, daoSelected?.votingDuration, firebaseRootCollection, firestoreData]) + }, [daoSelected?.id, daoSelected?.votingDuration, firebaseRootCollection, firestoreData]) useEffect(() => { - if (daoSelected.id && firebaseRootCollection) { + if (daoSelected?.id && firebaseRootCollection) { fetchCollection(`${firebaseRootCollection}/${daoSelected.id}/proposals`) fetchCollection(`${firebaseRootCollection}/${daoSelected.id}/members`) console.log({ daoSelected }) From dff97c128d70bbcfd84b139c874c5eea9dc993ea Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Thu, 19 Dec 2024 23:42:06 +0530 Subject: [PATCH 32/36] WIP - OnChain DAO Ops --- src/components/ui/NextButton.tsx | 10 + src/components/ui/StyledTextField.tsx | 32 ++ .../creator/components/NavigationBar.tsx | 9 +- src/modules/creator/token/router.tsx | 6 +- .../components/creator/EvmDaoVoting.tsx | 275 ------------------ .../etherlink/creator/EvmDaoMembership.tsx | 30 +- .../explorer/EtherlinkDAO/EvmUserPage.tsx | 9 +- .../EvmProposals/EvmPropContractCall.tsx | 0 .../EvmProposals/EvmPropDaoConfig.tsx | 0 .../EvmProposals/EvmPropEditRegistry.tsx | 0 .../explorer/EvmProposals/EvmPropTokenOps.tsx | 0 .../EvmProposals/EvmPropTransferAssets.tsx | 125 ++++++++ .../explorer/EvmProposalsActionDialog.tsx | 193 ++++++++++++ .../components/ProposalActionsDialog.tsx | 72 +---- .../pages/DAO/components/SettingsDialog.tsx | 1 + src/modules/lite/components/BackButton.tsx | 6 +- .../etherlinkDAO/hooks/useEvmDaoOps.tsx | 9 +- .../etherlinkDAO/hooks/useEvmProposalOps.tsx | 260 +++++++++++++++++ 18 files changed, 647 insertions(+), 390 deletions(-) create mode 100644 src/components/ui/NextButton.tsx create mode 100644 src/components/ui/StyledTextField.tsx delete mode 100644 src/modules/etherlink/components/creator/EvmDaoVoting.tsx create mode 100644 src/modules/etherlink/explorer/EvmProposals/EvmPropContractCall.tsx create mode 100644 src/modules/etherlink/explorer/EvmProposals/EvmPropDaoConfig.tsx create mode 100644 src/modules/etherlink/explorer/EvmProposals/EvmPropEditRegistry.tsx create mode 100644 src/modules/etherlink/explorer/EvmProposals/EvmPropTokenOps.tsx create mode 100644 src/modules/etherlink/explorer/EvmProposals/EvmPropTransferAssets.tsx create mode 100644 src/modules/etherlink/explorer/EvmProposalsActionDialog.tsx create mode 100644 src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx diff --git a/src/components/ui/NextButton.tsx b/src/components/ui/NextButton.tsx new file mode 100644 index 00000000..b4950ac3 --- /dev/null +++ b/src/components/ui/NextButton.tsx @@ -0,0 +1,10 @@ +import { MainButton } from "modules/common/MainButton" +import { styled } from "@material-ui/core" + +export const NextButton = styled(MainButton)(({ theme }) => ({ + textAlign: "center", + float: "right", + cursor: "pointer", + background: theme.palette.secondary.light, + padding: "8px 16px" +})) diff --git a/src/components/ui/StyledTextField.tsx b/src/components/ui/StyledTextField.tsx new file mode 100644 index 00000000..9dbe3be2 --- /dev/null +++ b/src/components/ui/StyledTextField.tsx @@ -0,0 +1,32 @@ +import { TextField } from "@mui/material" +import { styled } from "@mui/material/styles" + +export const StyledTextField = styled(TextField)({ + "& .MuiInput-root": { + color: "#fff", + paddingBottom: "4px" + }, + "& label": { + color: "#fff" + }, + "& label.Mui-focused": { + color: "#fff" + }, + "& .MuiInput-underline:before": { + borderBottomColor: "#ccc" + }, + "& .MuiInput-underline:after": { + borderBottomColor: "#fff" + }, + "& .MuiOutlinedInput-root": { + "& fieldset": { + borderColor: "#fff" + }, + "&:hover fieldset": { + borderColor: "#fff" + }, + "&.Mui-focused fieldset": { + borderColor: "#fff" + } + } +}) diff --git a/src/modules/creator/components/NavigationBar.tsx b/src/modules/creator/components/NavigationBar.tsx index c74bac0b..eb8bcafb 100644 --- a/src/modules/creator/components/NavigationBar.tsx +++ b/src/modules/creator/components/NavigationBar.tsx @@ -4,6 +4,7 @@ import { ArrowBackIos } from "@material-ui/icons" import { NavigationBarProps } from "modules/creator/state" import { MainButton } from "modules/common/MainButton" +import { NextButton } from "components/ui/NextButton" const Footer = styled(Grid)(({ theme }) => ({ background: theme.palette.primary.main, @@ -28,14 +29,6 @@ const BackButton = styled(Paper)({ width: "fit-content" }) -const NextButton = styled(MainButton)(({ theme }) => ({ - textAlign: "center", - float: "right", - cursor: "pointer", - background: theme.palette.secondary.light, - padding: "8px 16px" -})) - const BackButtonIcon = styled(ArrowBackIos)(({ theme }) => ({ color: theme.palette.secondary.light, fontSize: 12, diff --git a/src/modules/creator/token/router.tsx b/src/modules/creator/token/router.tsx index 1b950b26..05eee247 100644 --- a/src/modules/creator/token/router.tsx +++ b/src/modules/creator/token/router.tsx @@ -1,5 +1,5 @@ import React from "react" -import { Redirect, Route, Switch, useRouteMatch } from "react-router-dom" +import { Redirect, Route, Switch, useHistory, useRouteMatch } from "react-router-dom" import { TezosTokenDeployment } from "./tezos" import { ConfigContract as TezosConfigContract } from "./tezos/steps/Config" import { ContractDistribution as TezosContractDistribution } from "./tezos/steps/Distribution" @@ -15,10 +15,14 @@ import { DeploymentProvider as TezosDeploymentProvider } from "./tezos/state/con export const TokenDeploymentRouter = (): JSX.Element => { const { network } = useTezos() + const history = useHistory() const match = useRouteMatch() console.log("Network from token router", network) if (network.startsWith("etherlink")) { + if (history.location.pathname === "/creator") { + return + } return ( diff --git a/src/modules/etherlink/components/creator/EvmDaoVoting.tsx b/src/modules/etherlink/components/creator/EvmDaoVoting.tsx deleted file mode 100644 index 29efa841..00000000 --- a/src/modules/etherlink/components/creator/EvmDaoVoting.tsx +++ /dev/null @@ -1,275 +0,0 @@ -import { Grid, styled, Tooltip, Typography, withStyles } from "@material-ui/core" -import { InfoRounded } from "@material-ui/icons" -import { DescriptionText } from "components/ui/DaoCreator" -import { TitleBlock } from "modules/common/TitleBlock" -import React from "react" -import { TextField } from "@material-ui/core" -import useEvmDaoCreateStore from "services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore" - -const TimeBox = styled(Grid)(({ theme }) => ({ - background: theme.palette.primary.dark, - borderRadius: 8, - width: 72, - minHeight: 59, - marginBottom: 16, - display: "grid", - [theme.breakpoints.down("sm")]: { - width: 160 - } -})) - -const TimeText = styled(Typography)({ - marginTop: -20, - marginLeft: 16, - fontWeight: 300 -}) - -const CustomTooltip = styled(Tooltip)({ - marginLeft: 8 -}) - -const InfoIconInput = styled(InfoRounded)(({ theme }) => ({ - cursor: "default", - color: theme.palette.secondary.light, - height: 16, - width: 16, - marginLeft: 8 -})) - -const InputContainer = styled(Grid)({ - paddingRight: 15, - ["@media (max-width:1167px)"]: { - paddingRight: 0 - } -}) - -const StyledTextField = withStyles({ - root: { - "& input": { - textAlign: "center", - color: "#fff" - } - } -})(TextField) - -const styles = { - voting: { - marginTop: 6, - marginBottom: 16, - fontWeight: 400, - fontSize: 18, - width: "75%" - } -} - -interface EvmDaoVotingProps { - onSubmit?: (values: any) => void - initialValues?: any -} - -const initialFormValues = { - votingBlocksDay: 0, - votingBlocksHours: 0, - votingBlocksMinutes: 0, - proposalFlushBlocksDay: 0, - proposalFlushBlocksHours: 0, - proposalFlushBlocksMinutes: 0, - proposalExpiryBlocksDay: 0, - proposalExpiryBlocksHours: 0, - proposalExpiryBlocksMinutes: 0 -} - -export const EvmDaoVoting: React.FC = ({ onSubmit, initialValues = initialFormValues }) => { - const { data: daoData, touched, errors, setFieldValue } = useEvmDaoCreateStore() - const handleSubmit = (values: any) => { - if (onSubmit) { - onSubmit(values) - } - } - - return ( -
- - These settings will define the voting configuration for your DAO. - - } - /> - - - - - - Voting Delay - - - - - - - - - - setFieldValue("voting.votingBlocksDay", e.target.value)} - /> - - days - - - - setFieldValue("voting.votingBlocksHours", e.target.value)} - /> - - hours - - - - setFieldValue("voting.votingBlocksMinutes", e.target.value)} - /> - - minutes - - - - - - - - Voting Duration - - - - - - - - - - setFieldValue("voting.proposalFlushBlocksDay", e.target.value)} - /> - - days - - - - setFieldValue("voting.proposalFlushBlocksHours", e.target.value)} - /> - - hours - - - - setFieldValue("voting.proposalFlushBlocksMinutes", e.target.value)} - /> - - minutes - - - - - - - - Execution Delay - - - - - - - - - - setFieldValue("voting.proposalExpiryBlocksDay", e.target.value)} - /> - - days - - - - setFieldValue("voting.proposalExpiryBlocksHours", e.target.value)} - /> - - hours - - - - setFieldValue("voting.proposalExpiryBlocksMinutes", e.target.value)} - /> - - minutes - - - - -
- ) -} diff --git a/src/modules/etherlink/creator/EvmDaoMembership.tsx b/src/modules/etherlink/creator/EvmDaoMembership.tsx index f7b01cad..8b49208a 100644 --- a/src/modules/etherlink/creator/EvmDaoMembership.tsx +++ b/src/modules/etherlink/creator/EvmDaoMembership.tsx @@ -7,40 +7,12 @@ import { Box } from "@material-ui/core" import { DescriptionText } from "components/ui/DaoCreator" import { TitleBlock } from "modules/common/TitleBlock" import useEvmDaoCreateStore from "services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore" +import { StyledTextField } from "components/ui/StyledTextField" interface Member { address: string amountOfTokens: number } -const StyledTextField = styled(TextField)({ - "& .MuiInput-root": { - color: "#fff", - paddingBottom: "4px" - }, - "& label": { - color: "#fff" - }, - "& label.Mui-focused": { - color: "#fff" - }, - "& .MuiInput-underline:before": { - borderBottomColor: "#ccc" - }, - "& .MuiInput-underline:after": { - borderBottomColor: "#fff" - }, - "& .MuiOutlinedInput-root": { - "& fieldset": { - borderColor: "#fff" - }, - "&:hover fieldset": { - borderColor: "#fff" - }, - "&.Mui-focused fieldset": { - borderColor: "#fff" - } - } -}) export const EvmDaoMembership = () => { const { data, setFieldValue } = useEvmDaoCreateStore() diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmUserPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmUserPage.tsx index 274ab29c..e0fc5d63 100644 --- a/src/modules/etherlink/explorer/EtherlinkDAO/EvmUserPage.tsx +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmUserPage.tsx @@ -65,12 +65,11 @@ const DelegationDescription = styled(Typography)({ export const EvmUserPage = () => { const { daoSelected } = useContext(EtherlinkContext) - const { daoDelegate, signer, userTokenBalance, userVotingWeight } = useEvmDaoOps() + const { daoDelegate, signer, userTokenBalance, userVotingWeight, proposalCreatedCount, proposalVotedCount } = + useEvmDaoOps() const userAddress = signer?.address const votingWeight = userVotingWeight const personalBalance = userTokenBalance - const proposalsCreated = 0 - const votesCast = 0 return ( @@ -87,11 +86,11 @@ export const EvmUserPage = () => { Proposals Created - {proposalsCreated} + {proposalCreatedCount} Votes Cast - {votesCast} + {proposalVotedCount} diff --git a/src/modules/etherlink/explorer/EvmProposals/EvmPropContractCall.tsx b/src/modules/etherlink/explorer/EvmProposals/EvmPropContractCall.tsx new file mode 100644 index 00000000..e69de29b diff --git a/src/modules/etherlink/explorer/EvmProposals/EvmPropDaoConfig.tsx b/src/modules/etherlink/explorer/EvmProposals/EvmPropDaoConfig.tsx new file mode 100644 index 00000000..e69de29b diff --git a/src/modules/etherlink/explorer/EvmProposals/EvmPropEditRegistry.tsx b/src/modules/etherlink/explorer/EvmProposals/EvmPropEditRegistry.tsx new file mode 100644 index 00000000..e69de29b diff --git a/src/modules/etherlink/explorer/EvmProposals/EvmPropTokenOps.tsx b/src/modules/etherlink/explorer/EvmProposals/EvmPropTokenOps.tsx new file mode 100644 index 00000000..e69de29b diff --git a/src/modules/etherlink/explorer/EvmProposals/EvmPropTransferAssets.tsx b/src/modules/etherlink/explorer/EvmProposals/EvmPropTransferAssets.tsx new file mode 100644 index 00000000..3241c0b8 --- /dev/null +++ b/src/modules/etherlink/explorer/EvmProposals/EvmPropTransferAssets.tsx @@ -0,0 +1,125 @@ +import React from "react" +import { Grid, styled, Typography, MenuItem, IconButton, TextField } from "@material-ui/core" +import { Add as AddIcon, RemoveCircleOutline } from "@material-ui/icons" +import { useEvmProposalOps } from "services/contracts/etherlinkDAO/hooks/useEvmProposalOps" + +const TransactionContainer = styled(Grid)({ + marginBottom: "20px" +}) + +const AddButton = styled(Grid)({ + background: "#2F3438", + padding: "12px", + borderRadius: "4px", + cursor: "pointer", + display: "flex", + alignItems: "center", + justifyContent: "center", + marginTop: "16px" +}) + +const InputContainer = styled(Grid)({ + background: "#2F3438", + padding: "16px", + borderRadius: "4px", + marginBottom: "8px" +}) + +const RemoveButton = styled(IconButton)({ + color: "#FF4D4D", + padding: "4px" +}) + +const StyledTextField = styled(TextField)({ + "& .MuiOutlinedInput-root": { + "color": "white", + "& fieldset": { + borderColor: "rgba(255, 255, 255, 0.23)" + } + }, + "& .MuiInputLabel-root": { + color: "rgba(255, 255, 255, 0.7)" + } +}) + +interface Transaction { + assetType: string + recipient: string + amount: string +} + +export const EvmPropTransferAssets: React.FC = () => { + const { transferAssets, setTransferAssets } = useEvmProposalOps() + + const onUpdateTransaction = (index: number, field: keyof Transaction, value: string) => { + const transactions = [...transferAssets.transactions] + transactions[index][field] = value + setTransferAssets(transactions) + } + + const onAddTransaction = () => { + const transactions = [...transferAssets.transactions] + transactions.push({ assetType: "XTZ", recipient: "", amount: "" }) + setTransferAssets(transactions) + } + + const onRemoveTransaction = (index: number) => { + const transactions = [...transferAssets.transactions] + transactions.splice(index, 1) + setTransferAssets(transactions) + } + + return ( + + {transferAssets.transactions.map((transaction: any, index: number) => ( + + + + onUpdateTransaction(index, "assetType", e.target.value)} + > + XTZ + + + + onUpdateTransaction(index, "recipient", e.target.value)} + /> + + + onUpdateTransaction(index, "amount", e.target.value)} + /> + + + {index > 0 && ( + onRemoveTransaction(index)}> + + + )} + + + + ))} + + + + Add Transaction + + + ) +} diff --git a/src/modules/etherlink/explorer/EvmProposalsActionDialog.tsx b/src/modules/etherlink/explorer/EvmProposalsActionDialog.tsx new file mode 100644 index 00000000..77d31356 --- /dev/null +++ b/src/modules/etherlink/explorer/EvmProposalsActionDialog.tsx @@ -0,0 +1,193 @@ +import { Box, Container, Grid, styled, TextField, useMediaQuery, useTheme } from "@material-ui/core" +import { Typography } from "@material-ui/core" +import { NextButton } from "components/ui/NextButton" +import { StyledTextField } from "components/ui/StyledTextField" +import EthChangeConfigProposalForm from "modules/explorer/components/EthChangeConfigProposalForm" +import EthContractCallForm from "modules/explorer/components/EthContractCallForm" +import EthTransferFundsForm from "modules/explorer/components/EthTransferFundsForm" +import { ResponsiveDialog } from "modules/explorer/components/ResponsiveDialog" +import { BackButton } from "modules/lite/components/BackButton" +import { Choices } from "modules/lite/explorer/components/Choices" +import { useState } from "react" +import { useEvmProposalOps } from "services/contracts/etherlinkDAO/hooks/useEvmProposalOps" +import { EvmPropTransferAssets } from "./EvmProposals/EvmPropTransferAssets" + +const ProposalContainer = styled(Grid)(({ theme }) => ({ + boxSizing: "border-box", + padding: "0px 15px", + [theme.breakpoints.down("md")]: { + marginTop: 30 + } +})) + +// TODO: Move this to a shared component +const OptionContainer = styled(Grid)(({ theme }) => ({ + "minHeight": 80, + "background": theme.palette.primary.main, + "borderRadius": 8, + "padding": "35px 42px", + "marginBottom": 16, + "cursor": "pointer", + "height": 110, + "&:hover:enabled": { + background: theme.palette.secondary.dark, + scale: 1.01, + transition: "0.15s ease-in" + } +})) + +const ActionText = styled(Typography)(({ theme }) => ({ + fontWeight: 400, + fontSize: 20, + marginBottom: 8 +})) + +const ActionDescriptionText = styled(Typography)(({ theme }) => ({ + fontWeight: 300, + fontSize: 16 +})) + +const TitleContainer = styled(Grid)({ + marginBottom: 24 +}) + +const evmProposalOptions = [ + { + label: "Off-Chain Debate", + description: "Post a thesis and have tokenized arguments around it", + modal: "off_chain_debate", + is_disabled: true + }, + { + label: "Transfer Assets", + description: "Propose a transfer of assets from the DAO treasury", + modal: "transfer_assets" + }, + { + label: "Edit Registry", + description: "Change an entry or add a new one", + modal: "edit_registry" + }, + { + label: "Contract Call", + description: "Propose a call to an external contract", + modal: "contract_call" + }, + { + label: "Change Config", + description: "Propose changes to the DAO configuration", + modal: "change_config" + }, + { + label: "Token Operation", + description: "Propose a token operation", + modal: "token_operation" + } +] + +export const EvmProposalsActionDialog = ({ open, handleClose }: { open: boolean; handleClose: () => void }) => { + const theme = useTheme() + const { isLoading, currentStep, metadata, setMetadataFieldValue, setCurrentStep, nextStep, prevStep } = + useEvmProposalOps() + const isMobileSmall = useMediaQuery(theme.breakpoints.down("sm")) + const proposalTitle = evmProposalOptions.find(option => option.modal === metadata.type)?.label + + return ( + <> + + + Select Proposal Type + + + {evmProposalOptions.map((option, index) => ( + setMetadataFieldValue("type", option.modal as any)} + > + + {option.label} + + {option.description} + + + + ))} + + + + setMetadataFieldValue("type", "")} + title={proposalTitle} + > + + + setMetadataFieldValue("title", e.target.value)} + /> + setMetadataFieldValue("description", e.target.value)} + /> + + setMetadataFieldValue("discussionUrl", e.target.value)} + /> + + + + {nextStep.text} + + + + + {/* setModalOpen(false)} /> */} + {/* setModalOpen(false)} /> */} + + setMetadataFieldValue("type", "")} + title="Transfer Assets" + > + + + + + {nextStep.text} + + + {/* setModalOpen(false)} /> */} + + + ) +} diff --git a/src/modules/explorer/components/ProposalActionsDialog.tsx b/src/modules/explorer/components/ProposalActionsDialog.tsx index a799b012..01ee54a1 100644 --- a/src/modules/explorer/components/ProposalActionsDialog.tsx +++ b/src/modules/explorer/components/ProposalActionsDialog.tsx @@ -14,10 +14,8 @@ import { useDAO } from "services/services/dao/hooks/useDAO" import { ProposalCreatorModal } from "modules/lite/explorer/pages/CreateProposal/ProposalCreatorModal" import { useIsProposalButtonDisabled } from "services/contracts/baseDAO/hooks/useCycleInfo" import { ProposalFormContainer } from "./ProposalForm" -import EthContractCallForm from "./EthContractCallForm" -import EthChangeConfigProposalForm from "./EthChangeConfigProposalForm" -import EthTransferFundsForm from "./EthTransferFundsForm" import { useQueryParams } from "../hooks/useQueryParams" +import { EvmProposalsActionDialog } from "modules/etherlink/explorer/EvmProposalsActionDialog" type RecursivePartial = { [P in keyof T]?: RecursivePartial @@ -31,6 +29,7 @@ type Values = { export type ProposalFormDefaultValues = RecursivePartial +// TODO: Move this to a shared component const OptionContainer = styled(Grid)(({ theme }) => ({ "minHeight": 80, "background": theme.palette.primary.main, @@ -38,7 +37,7 @@ const OptionContainer = styled(Grid)(({ theme }) => ({ "padding": "35px 42px", "marginBottom": 16, "cursor": "pointer", - "height": 80, + "height": 110, "&:hover:enabled": { background: theme.palette.secondary.dark, scale: 1.01, @@ -398,69 +397,6 @@ const ProposalActionsDialogForTezos: React.FC<{ ) } -const ProposalActionsDialogForEtherlink: React.FC<{ - open: boolean - handleClose: () => void - queryType?: string -}> = ({ open, handleClose, queryType }) => { - const theme = useTheme() - const isMobileSmall = useMediaQuery(theme.breakpoints.down("sm")) - const [modalOpen, setModalOpen] = useState<"transfer_funds" | "change_config" | "contract_call" | boolean>(false) - return ( - <> - - - Select Proposal Type - - - {[ - { - label: "Off-Chain Debate", - description: "Post a thesis and have tokenized arguments around it", - modal: "off_chain_debate" - }, - { - label: "Transfer Funds", - description: "Propose a transfer of funds from the DAO treasury", - modal: "transfer_funds" - }, - { - label: "Edit Registry", - description: "Change an entry or add a new one", - modal: "edit_registry" - }, - { - label: "Contract Call", - description: "Propose a call to an external contract", - modal: "contract_call" - }, - { - label: "Change Config", - description: "Propose changes to the DAO configuration", - modal: "change_config" - }, - { - label: "Token Operation", - description: "Propose a token operation", - modal: "token_operation" - } - ].map((option, index) => ( - setModalOpen(option.modal as any)}> - - {option.label} - {option.description} - - - ))} - - - setModalOpen(false)} /> - setModalOpen(false)} /> - setModalOpen(false)} /> - - ) -} - export const ProposalActionsDialog: React.FC<{ open: boolean; handleClose: () => void; queryType?: string }> = ({ open, handleClose, @@ -470,7 +406,7 @@ export const ProposalActionsDialog: React.FC<{ open: boolean; handleClose: () => const { data } = useDAO(daoId) return data?.data.network.startsWith("etherlink") ? ( - + ) : ( ) diff --git a/src/modules/explorer/pages/DAO/components/SettingsDialog.tsx b/src/modules/explorer/pages/DAO/components/SettingsDialog.tsx index 4186ff39..20383dc4 100644 --- a/src/modules/explorer/pages/DAO/components/SettingsDialog.tsx +++ b/src/modules/explorer/pages/DAO/components/SettingsDialog.tsx @@ -22,6 +22,7 @@ type Values = { export type ProposalFormDefaultValues = RecursivePartial +// TODO: Move this to a shared component const OptionContainer = styled(Grid)(({ theme }) => ({ "minHeight": 80, "background": theme.palette.primary.main, diff --git a/src/modules/lite/components/BackButton.tsx b/src/modules/lite/components/BackButton.tsx index 3c164cbb..92dc00a3 100644 --- a/src/modules/lite/components/BackButton.tsx +++ b/src/modules/lite/components/BackButton.tsx @@ -3,13 +3,13 @@ import { Grid, Typography } from "@material-ui/core" import { ArrowBackIosOutlined } from "@material-ui/icons" import { useHistory } from "react-router" -export const BackButton: React.FC = () => { +export const BackButton: React.FC<{ onClick?: () => void }> = ({ onClick }) => { const navigate = useHistory() return ( navigate.goBack()} + style={{ gap: 15, cursor: "pointer", marginBottom: 23, width: "fit-content" }} + onClick={() => (onClick ? onClick() : navigate.goBack())} alignItems="center" > diff --git a/src/services/contracts/etherlinkDAO/hooks/useEvmDaoOps.tsx b/src/services/contracts/etherlinkDAO/hooks/useEvmDaoOps.tsx index 8d725a7f..0d530679 100644 --- a/src/services/contracts/etherlinkDAO/hooks/useEvmDaoOps.tsx +++ b/src/services/contracts/etherlinkDAO/hooks/useEvmDaoOps.tsx @@ -8,9 +8,14 @@ import HbTokenAbi from "assets/abis/hb_evm.json" export const useEvmDaoOps = () => { const [tokenContract, setTokenContract] = useState(null) const { etherlink } = useTezos() - const { daoSelected } = useContext(EtherlinkContext) + const loggedInUserAddress = etherlink?.signer?.address + const { daoSelected, daoMembers } = useContext(EtherlinkContext) const [userVotingWeight, setUserVotingWeight] = useState(0) const [userTokenBalance, setUserTokenBalance] = useState(0) + const selectedUser = daoMembers?.find((member: any) => member.address === loggedInUserAddress) + + const proposalCreatedCount = selectedUser?.proposalsCreated?.length || 0 + const proposalVotedCount = selectedUser?.proposalsVoted?.length || 0 const daoDelegate = useCallback( async (targetAddress: string) => { @@ -54,6 +59,8 @@ export const useEvmDaoOps = () => { signer: etherlink?.signer, userTokenBalance, userVotingWeight, + proposalCreatedCount, + proposalVotedCount, // TODO: Maybe remove loggedInUser: { address: etherlink?.signer?.address diff --git a/src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx b/src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx new file mode 100644 index 00000000..af0f72e8 --- /dev/null +++ b/src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx @@ -0,0 +1,260 @@ +import { ethers } from "ethers" +import { create } from "zustand" +import { persist, createJSONStorage } from "zustand/middleware" + +import { useCallback, useContext, useEffect, useMemo, useState } from "react" +import { useTezos } from "services/beacon/hooks/useTezos" +import { EtherlinkContext } from "services/wagmi/context" + +import HbTokenAbi from "assets/abis/hb_evm.json" +import HbDaoAbi from "assets/abis/hb_dao.json" + +const proposalInterfaces = [ + { + interface: "function editRegistry(string key, string Value)", + name: "editRegistry" + }, + { + interface: "function mint(address to, uint256 amount)", + name: "mint" + }, + { + interface: "function burn(address from, uint256 amount)", + name: "burn" + }, + { + interface: "function transferETH(address to, uint256 amount)", + name: "transferETH" + }, + { + interface: "function transferERC20(address token, address to, uint256 amount)", + name: "transferERC20" + }, + { + interface: "function transferERC721(address token, address to, uint256 tokenId)", + name: "transferERC721" + }, + { + interface: "function updateQuorumNumerator(uint256 newQuorumNumerator)", + name: "updateQuorumNumerator" + }, + { + interface: "function setVotingDelay(uint256 newVotingDelay)", + name: "setVotingDelay" + }, + { + interface: "function setVotingPeriod(uint256 newVotingPeriod)", + name: "setVotingPeriod" + }, + { + interface: "function setProposalThreshold(uint256 newProposalThreshold)", + name: "setProposalThreshold" + } +] + +interface EvmProposalCreateStore { + currentStep: number + setCurrentStep: (step: number) => void + metadata: { + type: "off_chain_debate" | "transfer_assets" | "edit_registry" | "contract_call" | "change_config" | "" + title: string + description: string + discussionUrl: string + } + transferAssets: { + transactions: any + } + createProposalPayload: { + targets: any[] + values: any[] + calldatas: any[] + description: string + } + setTransferAssets: (transactions: any[]) => void + getMetadata: () => EvmProposalCreateStore["metadata"] + getMetadataFieldValue: (field: keyof EvmProposalCreateStore["metadata"]) => string + setMetadataFieldValue: (field: keyof EvmProposalCreateStore["metadata"], value: string) => void + setCreateProposalFieldValues: (field: keyof EvmProposalCreateStore["createProposalPayload"], value: string) => void +} + +const useEvmProposalCreateZustantStore = create()( + persist( + (set, get) => ({ + currentStep: 0, + setCurrentStep: (step: number) => { + set({ currentStep: step }) + }, + metadata: { + type: "", + title: "", + description: "", + discussionUrl: "" + }, + createProposalPayload: { + targets: [], + values: [], // Will be always ["0","0","0"] + calldatas: [], + description: "" + }, + transferAssets: { + transactions: [ + { + assetType: "XTZ", + recipient: "", + amount: "" + } + ] + }, + setTransferAssets: (transactions: any[]) => { + const payload = { + transferAssets: { transactions }, + createProposalPayload: { + targets: Object.keys(transactions).map((key: any) => transactions[key].recipient), + values: Object.keys(transactions).map((key: any) => transactions[key].amount), + calldatas: [], + description: "" + } + } + set(payload) + }, + getMetadata: () => { + return get().metadata + }, + getMetadataFieldValue: (field: keyof EvmProposalCreateStore["metadata"]) => { + return get().metadata[field] + }, + setMetadataFieldValue: (field: keyof EvmProposalCreateStore["metadata"], value: string) => { + const payload = { + metadata: { ...get().metadata, [field]: value } + } as any + + if (field === "type" && value !== "") { + payload["currentStep"] = 1 + } + if (field === "type" && value === "") { + payload["currentStep"] = 0 + } + set(payload) + }, + setCreateProposalFieldValues: (field: keyof EvmProposalCreateStore["createProposalPayload"], value: string) => { + const payload = { + createProposalPayload: { ...get().createProposalPayload, [field]: value } + } as any + set(payload) + } + }), + { + name: "evm-proposal-create-store", + storage: createJSONStorage(() => localStorage) + } + ) +) + +export const useEvmProposalOps = () => { + const [isLoading, setIsLoading] = useState(false) + const { etherlink } = useTezos() + const { daoSelected } = useContext(EtherlinkContext) + + const zustantStore = useEvmProposalCreateZustantStore() + const currentStep = zustantStore.currentStep + const proposalType = zustantStore.getMetadataFieldValue("type") + + const daoContract = useMemo(() => { + return new ethers.Contract(daoSelected?.token, HbDaoAbi.abi, etherlink.signer) + }, [daoSelected?.token, etherlink.signer]) + + console.log("currentStep", currentStep, proposalType) + + const createProposal = useCallback( + async (payload: Record) => { + if (!daoSelected || !daoContract) return + + const tx = await daoContract.propose(payload) + console.log("Proposal transaction sent:", tx.hash) + const receipt = await tx.wait() + console.log("Proposal transaction confirmed:", receipt) + return receipt + }, + [daoSelected, daoContract] + ) + + const castVote = useCallback( + async (proposalId: number, support: boolean) => { + if (!daoContract) return + + const tx = await daoContract.castVote(proposalId, support) + console.log("Vote transaction sent:", tx.hash) + const receipt = await tx.wait() + console.log("Vote transaction confirmed:", receipt) + return receipt + }, + [daoContract] + ) + + const executeProposal = useCallback( + async (proposalId: number) => { + if (!daoContract) return + + const tx = await daoContract.execute(proposalId) + console.log("Execute transaction sent:", tx.hash) + const receipt = await tx.wait() + console.log("Execute transaction confirmed:", receipt) + return receipt + }, + [daoContract] + ) + + const nextStep = { + text: isLoading ? "Please wait..." : "Next", + handler: () => { + const iface = new ethers.Interface(["function transferETH(address to, uint256 amount)"]) + const encodedData = iface.encodeFunctionData("transferETH", [ + "0xa9F8F9C0bf3188cEDdb9684ae28655187552bAE9", + ethers.parseEther("1") + ]) + console.log( + "encodedData", + ethers.parseEther("1"), + encodedData, + encodedData === + "0x7b1a4909000000000000000000000000a9f8f9c0bf3188ceddb9684ae28655187552bae90000000000000000000000000000000000000000000000000de0b6b3a7640000" + ) + return + if (currentStep == 0) { + zustantStore.setCurrentStep(currentStep + 1) + } else if (currentStep == 1) { + zustantStore.setCurrentStep(currentStep + 1) + // "${p.name}0|||0${p.type}0|||0${p.description}0|||0${p.externalResource}" + const metadata = zustantStore.getMetadata() + const descriptionType = metadata.type === "transfer_assets" ? "transfer" : "off_chain_debate" + const description = `${metadata.title}0|||0${metadata.type}0|||0${metadata.description}0|||0${metadata.discussionUrl}` + zustantStore.setCreateProposalFieldValues("description", description) + } else { + // At Step 2 we call the Contract + setIsLoading(true) + createProposal(zustantStore.createProposalPayload).then(() => { + setIsLoading(false) + }) + } + } + } + + const prevStep = { + text: "Back", + handler: () => { + zustantStore.setCurrentStep(zustantStore.currentStep - 1) + } + } + + return { + isLoading, + setIsLoading, + createProposal, + castVote, + executeProposal, + signer: etherlink?.signer, + nextStep, + prevStep, + ...zustantStore + } +} From b8bb9cd029dc021dad1659319fe22990986a5b75 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Fri, 20 Dec 2024 11:41:52 +0530 Subject: [PATCH 33/36] Proposal Pages --- .vscode/settings.json | 3 + src/components/ui/StyledTextField.tsx | 44 ++++- .../etherlink/creator/EvmDaoQuorum.tsx | 6 +- .../EvmProposals/EvmPropContractCall.tsx | 60 ++++++ .../EvmProposals/EvmPropDaoConfig.tsx | 186 ++++++++++++++++++ .../EvmProposals/EvmPropEditRegistry.tsx | 46 +++++ .../explorer/EvmProposals/EvmPropTokenOps.tsx | 142 +++++++++++++ .../EvmProposals/EvmPropTransferAssets.tsx | 19 +- .../explorer/EvmProposalsActionDialog.tsx | 32 ++- .../etherlinkDAO/hooks/useEvmProposalOps.tsx | 182 +++++++++++++---- 10 files changed, 653 insertions(+), 67 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 903520d7..4018e082 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,5 +7,8 @@ "editor.defaultFormatterOld": "dbaeumer.vscode-eslint", "[javascript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" } } diff --git a/src/components/ui/StyledTextField.tsx b/src/components/ui/StyledTextField.tsx index 9dbe3be2..509f0c15 100644 --- a/src/components/ui/StyledTextField.tsx +++ b/src/components/ui/StyledTextField.tsx @@ -1,5 +1,37 @@ import { TextField } from "@mui/material" -import { styled } from "@mui/material/styles" +// import { styled } from "@mui/material/styles" + +// export const StyledTextField = styled(TextField)({ +// "& .MuiInput-root": { +// color: "#fff", +// paddingBottom: "4px" +// }, +// "& label": { +// color: "#fff" +// }, +// "& label.Mui-focused": { +// color: "#fff" +// }, +// "& .MuiInput-underline:before": { +// borderBottomColor: "#ccc" +// }, +// "& .MuiInput-underline:after": { +// borderBottomColor: "#fff" +// }, +// "& .MuiOutlinedInput-root": { +// "& fieldset": { +// borderColor: "#fff" +// }, +// "&:hover fieldset": { +// borderColor: "#fff" +// }, +// "&.Mui-focused fieldset": { +// borderColor: "#fff" +// } +// } +// }) +// import { TextField } from "@material-ui/core" +import { styled } from "@material-ui/core/styles" export const StyledTextField = styled(TextField)({ "& .MuiInput-root": { @@ -12,13 +44,11 @@ export const StyledTextField = styled(TextField)({ "& label.Mui-focused": { color: "#fff" }, - "& .MuiInput-underline:before": { - borderBottomColor: "#ccc" - }, "& .MuiInput-underline:after": { borderBottomColor: "#fff" }, "& .MuiOutlinedInput-root": { + "color": "#fff", "& fieldset": { borderColor: "#fff" }, @@ -28,5 +58,11 @@ export const StyledTextField = styled(TextField)({ "&.Mui-focused fieldset": { borderColor: "#fff" } + }, + "& .MuiInputLabel-root": { + color: "rgba(255, 255, 255, 0.7)" + }, + "& .MuiInput-underline:before": { + borderBottomColor: "#ccc" } }) diff --git a/src/modules/etherlink/creator/EvmDaoQuorum.tsx b/src/modules/etherlink/creator/EvmDaoQuorum.tsx index 48616bc0..c5ef92d8 100644 --- a/src/modules/etherlink/creator/EvmDaoQuorum.tsx +++ b/src/modules/etherlink/creator/EvmDaoQuorum.tsx @@ -7,11 +7,7 @@ import { TitleBlock } from "modules/common/TitleBlock" import React, { useRef } from "react" import useEvmDaoCreateStore from "services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore" -interface EvmDaoQuorumProps { - // Add props as needed -} - -export const EvmDaoQuorum: React.FC = () => { +export const EvmDaoQuorum: React.FC = () => { const theme = useTheme() const isMobile = useMediaQuery(theme.breakpoints.down("sm")) const { data, getIn, setFieldValue } = useEvmDaoCreateStore() diff --git a/src/modules/etherlink/explorer/EvmProposals/EvmPropContractCall.tsx b/src/modules/etherlink/explorer/EvmProposals/EvmPropContractCall.tsx index e69de29b..6d691934 100644 --- a/src/modules/etherlink/explorer/EvmProposals/EvmPropContractCall.tsx +++ b/src/modules/etherlink/explorer/EvmProposals/EvmPropContractCall.tsx @@ -0,0 +1,60 @@ +import React from "react" +import { Grid, styled } from "@material-ui/core" +import { StyledTextField } from "components/ui/StyledTextField" +import { useEvmProposalOps } from "services/contracts/etherlinkDAO/hooks/useEvmProposalOps" + +const InputContainer = styled(Grid)({ + background: "#2F3438", + padding: "16px", + borderRadius: "4px", + marginBottom: "8px" +}) + +export const EvmPropContractCall: React.FC = () => { + const { daoContractCall, setDaoContractCall } = useEvmProposalOps() + return ( + + + setDaoContractCall("targetAddress", e.target.value)} + /> + + + setDaoContractCall("value", e.target.value)} + /> + + + setDaoContractCall("functionDefinition", e.target.value)} + /> + + + setDaoContractCall("callData", e.target.value)} + /> + + + ) +} diff --git a/src/modules/etherlink/explorer/EvmProposals/EvmPropDaoConfig.tsx b/src/modules/etherlink/explorer/EvmProposals/EvmPropDaoConfig.tsx index e69de29b..9b84d2b0 100644 --- a/src/modules/etherlink/explorer/EvmProposals/EvmPropDaoConfig.tsx +++ b/src/modules/etherlink/explorer/EvmProposals/EvmPropDaoConfig.tsx @@ -0,0 +1,186 @@ +import React, { useState } from "react" +import { Grid, styled, Typography, Slider, Box } from "@material-ui/core" +import { StyledTextField } from "components/ui/StyledTextField" +import { + Timeline as TimelineIcon, + HowToVote as HowToVoteIcon, + Schedule as ScheduleIcon, + AccountBalance as AccountBalanceIcon, + ArrowBack as ArrowBackIcon +} from "@material-ui/icons" +import { useEvmProposalOps } from "services/contracts/etherlinkDAO/hooks/useEvmProposalOps" +import { StyledSliderWithValue } from "components/ui/StyledSlider" + +const OptionContainer = styled(Grid)({ + "background": "#2F3438", + "padding": "20px", + "borderRadius": "8px", + "cursor": "pointer", + "height": "100%", + "&:hover": { + background: "#3F444A" + } +}) + +const IconContainer = styled(Box)({ + marginBottom: "16px" +}) + +const BackButton = styled(Grid)({ + display: "flex", + alignItems: "center", + cursor: "pointer", + marginBottom: "24px" +}) + +const TimeInputContainer = styled(Grid)({ + "& > div": { + marginRight: "16px" + } +}) + +const ConfigOption = ({ + icon, + title, + description, + onClick +}: { + icon: React.ReactNode + title: string + description: string + onClick: () => void +}) => ( + + + {icon} + + {title} + + {description} + + +) + +const TimeInput = ({ label, onChange }: { label: string; onChange: (field: string, value: string) => void }) => ( + + {label} + + onChange("days", e.target.value)} + style={{ marginRight: "16px" }} + /> + onChange("hours", e.target.value)} + style={{ marginRight: "16px" }} + /> + onChange("minutes", e.target.value)} + style={{ marginRight: "16px" }} + /> + + +) + +export const EvmPropDaoConfig = () => { + const { currentStep, daoConfig, setDaoConfig } = useEvmProposalOps() + + const renderSelectedOption = () => { + switch (daoConfig.type) { + case "quorumNumerator": + return ( + <> + + Change the minimum required participation for a proposal to pass + + { + setDaoConfig("quorumNumerator", newValue || 0) + }} + /> + + ) + case "votingDelay": + return ( + <> + + Change the wait time between posting a proposal and the start of voting + + setDaoConfig("votingDelay", value)} /> + + ) + case "votingPeriod": + return ( + <> + + Change how long voting lasts + + setDaoConfig("votingPeriod", value)} + /> + + ) + case "proposalThreshold": + return ( + <> + + Change the minimum amount of Token ownership required to submit a proposal + + setDaoConfig("proposalThreshold", e.target.value)} + /> + + ) + default: + return null + } + } + + if (currentStep == 3) return {renderSelectedOption()} + + return ( + + } + title="Quorum" + description="Change the minimum required participation for a proposal to pass" + onClick={() => setDaoConfig("quorumNumerator")} + /> + } + title="Voting Delay" + description="Change the wait time between posting a proposal and the start of voting" + onClick={() => setDaoConfig("votingDelay")} + /> + + } + title="Voting Period" + description="Change how long voting lasts" + onClick={() => setDaoConfig("votingPeriod")} + /> + + } + title="Proposal Threshold" + description="Change the minimum amount of Token ownership required to submit a proposal" + onClick={() => setDaoConfig("proposalThreshold")} + /> + + ) +} diff --git a/src/modules/etherlink/explorer/EvmProposals/EvmPropEditRegistry.tsx b/src/modules/etherlink/explorer/EvmProposals/EvmPropEditRegistry.tsx index e69de29b..bc107698 100644 --- a/src/modules/etherlink/explorer/EvmProposals/EvmPropEditRegistry.tsx +++ b/src/modules/etherlink/explorer/EvmProposals/EvmPropEditRegistry.tsx @@ -0,0 +1,46 @@ +import React from "react" +import { Grid, styled } from "@material-ui/core" +import { useEvmProposalOps } from "services/contracts/etherlinkDAO/hooks/useEvmProposalOps" +import { StyledTextField } from "components/ui/StyledTextField" + +const InputContainer = styled(Grid)({ + background: "#2F3438", + padding: "16px", + borderRadius: "4px", + marginBottom: "8px" +}) + +export const EvmPropEditRegistry: React.FC = () => { + const { daoRegistry, setDaoRegistry } = useEvmProposalOps() + + const handleKeyChange = (value: string) => { + setDaoRegistry("key", value) + } + + const handleValueChange = (value: string) => { + setDaoRegistry("value", value) + } + + return ( + + + handleKeyChange(e.target.value)} + /> + + + handleValueChange(e.target.value)} + /> + + + ) +} diff --git a/src/modules/etherlink/explorer/EvmProposals/EvmPropTokenOps.tsx b/src/modules/etherlink/explorer/EvmProposals/EvmPropTokenOps.tsx index e69de29b..11150c5c 100644 --- a/src/modules/etherlink/explorer/EvmProposals/EvmPropTokenOps.tsx +++ b/src/modules/etherlink/explorer/EvmProposals/EvmPropTokenOps.tsx @@ -0,0 +1,142 @@ +import { Grid, Typography, Box, Container, styled } from "@material-ui/core" +import AddCircleIcon from "@mui/icons-material/AddCircle" +import RemoveCircleIcon from "@mui/icons-material/RemoveCircle" +import { useEvmProposalOps } from "services/contracts/etherlinkDAO/hooks/useEvmProposalOps" +import { StyledTextField } from "components/ui/StyledTextField" + +const OptionContainer = styled(Grid)({ + "background": "#2F3438", + "padding": "20px", + "borderRadius": "8px", + "cursor": "pointer", + "height": "100%", + "&:hover": { + background: "#3F444A" + } +}) + +const IconContainer = styled(Box)({ + marginBottom: "16px" +}) + +const ConfigOption = ({ + icon, + title, + description, + onClick +}: { + icon: React.ReactNode + title: string + description: string + onClick: () => void +}) => ( + + + {icon} + + {title} + + {description} + + +) + +const EvmPropTokenOps = () => { + const { currentStep, daoTokenOps, setDaoTokenOps } = useEvmProposalOps() + + if (currentStep === 3 && daoTokenOps.type === "mint") { + return ( + + + + + Enter the recipient address and amount to mint + + + setDaoTokenOps("mint", { + to: e.target.value, + amount: daoTokenOps.mint.amount + }) + } + style={{ marginBottom: "16px" }} + /> + + setDaoTokenOps("mint", { + to: daoTokenOps.mint.to, + amount: e.target.value + }) + } + /> + + + ) + } + + if (currentStep === 3 && daoTokenOps.type === "burn") { + return ( + + + + + Enter the recipient address and amount to burn + + + setDaoTokenOps("burn", { + to: e.target.value, + amount: daoTokenOps.burn.amount + }) + } + style={{ marginBottom: "16px" }} + /> + + setDaoTokenOps("burn", { + to: daoTokenOps.mint.to, + amount: e.target.value + }) + } + /> + + + ) + } + return ( + + } + title="Mint" + description="Mint tokens to a specified address" + onClick={() => setDaoTokenOps("mint")} + /> + } + title="Burn" + description="Burn tokens from a specified address" + onClick={() => setDaoTokenOps("burn")} + /> + + ) +} + +export default EvmPropTokenOps diff --git a/src/modules/etherlink/explorer/EvmProposals/EvmPropTransferAssets.tsx b/src/modules/etherlink/explorer/EvmProposals/EvmPropTransferAssets.tsx index 3241c0b8..077ec588 100644 --- a/src/modules/etherlink/explorer/EvmProposals/EvmPropTransferAssets.tsx +++ b/src/modules/etherlink/explorer/EvmProposals/EvmPropTransferAssets.tsx @@ -2,6 +2,7 @@ import React from "react" import { Grid, styled, Typography, MenuItem, IconButton, TextField } from "@material-ui/core" import { Add as AddIcon, RemoveCircleOutline } from "@material-ui/icons" import { useEvmProposalOps } from "services/contracts/etherlinkDAO/hooks/useEvmProposalOps" +import { StyledTextField } from "components/ui/StyledTextField" const TransactionContainer = styled(Grid)({ marginBottom: "20px" @@ -30,18 +31,6 @@ const RemoveButton = styled(IconButton)({ padding: "4px" }) -const StyledTextField = styled(TextField)({ - "& .MuiOutlinedInput-root": { - "color": "white", - "& fieldset": { - borderColor: "rgba(255, 255, 255, 0.23)" - } - }, - "& .MuiInputLabel-root": { - color: "rgba(255, 255, 255, 0.7)" - } -}) - interface Transaction { assetType: string recipient: string @@ -79,7 +68,7 @@ export const EvmPropTransferAssets: React.FC = () => { select fullWidth label="Asset Type" - variant="outlined" + variant="standard" value={transaction.assetType} onChange={e => onUpdateTransaction(index, "assetType", e.target.value)} > @@ -90,7 +79,7 @@ export const EvmPropTransferAssets: React.FC = () => { onUpdateTransaction(index, "recipient", e.target.value)} /> @@ -100,7 +89,7 @@ export const EvmPropTransferAssets: React.FC = () => { fullWidth label="Amount" type="number" - variant="outlined" + variant="standard" value={transaction.amount} onChange={e => onUpdateTransaction(index, "amount", e.target.value)} /> diff --git a/src/modules/etherlink/explorer/EvmProposalsActionDialog.tsx b/src/modules/etherlink/explorer/EvmProposalsActionDialog.tsx index 77d31356..f0e7845b 100644 --- a/src/modules/etherlink/explorer/EvmProposalsActionDialog.tsx +++ b/src/modules/etherlink/explorer/EvmProposalsActionDialog.tsx @@ -7,10 +7,13 @@ import EthContractCallForm from "modules/explorer/components/EthContractCallForm import EthTransferFundsForm from "modules/explorer/components/EthTransferFundsForm" import { ResponsiveDialog } from "modules/explorer/components/ResponsiveDialog" import { BackButton } from "modules/lite/components/BackButton" -import { Choices } from "modules/lite/explorer/components/Choices" -import { useState } from "react" + import { useEvmProposalOps } from "services/contracts/etherlinkDAO/hooks/useEvmProposalOps" import { EvmPropTransferAssets } from "./EvmProposals/EvmPropTransferAssets" +import { EvmPropEditRegistry } from "./EvmProposals/EvmPropEditRegistry" +import { EvmPropContractCall } from "./EvmProposals/EvmPropContractCall" +import { EvmPropDaoConfig } from "./EvmProposals/EvmPropDaoConfig" +import EvmPropTokenOps from "./EvmProposals/EvmPropTokenOps" const ProposalContainer = styled(Grid)(({ theme }) => ({ boxSizing: "border-box", @@ -85,6 +88,23 @@ const evmProposalOptions = [ } ] +const renderModal = (modal: string) => { + switch (modal) { + case "transfer_assets": + return + case "edit_registry": + return + case "contract_call": + return + case "change_config": + return + case "token_operation": + return + default: + return null + } +} + export const EvmProposalsActionDialog = ({ open, handleClose }: { open: boolean; handleClose: () => void }) => { const theme = useTheme() const { isLoading, currentStep, metadata, setMetadataFieldValue, setCurrentStep, nextStep, prevStep } = @@ -170,23 +190,19 @@ export const EvmProposalsActionDialog = ({ open, handleClose }: { open: boolean; - {/* setModalOpen(false)} /> */} - {/* setModalOpen(false)} /> */} - = 2} onClose={() => setMetadataFieldValue("type", "")} title="Transfer Assets" > - + {renderModal(metadata.type)} {nextStep.text} - {/* setModalOpen(false)} /> */} ) diff --git a/src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx b/src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx index af0f72e8..6c06d335 100644 --- a/src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx +++ b/src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx @@ -11,43 +11,43 @@ import HbDaoAbi from "assets/abis/hb_dao.json" const proposalInterfaces = [ { - interface: "function editRegistry(string key, string Value)", + interface: ["function editRegistry(string key, string Value)"], name: "editRegistry" }, { - interface: "function mint(address to, uint256 amount)", + interface: ["function mint(address to, uint256 amount)"], name: "mint" }, { - interface: "function burn(address from, uint256 amount)", + interface: ["function burn(address from, uint256 amount)"], name: "burn" }, { - interface: "function transferETH(address to, uint256 amount)", + interface: ["function transferETH(address to, uint256 amount)"], name: "transferETH" }, { - interface: "function transferERC20(address token, address to, uint256 amount)", + interface: ["function transferERC20(address token, address to, uint256 amount)"], name: "transferERC20" }, { - interface: "function transferERC721(address token, address to, uint256 tokenId)", + interface: ["function transferERC721(address token, address to, uint256 tokenId)"], name: "transferERC721" }, { - interface: "function updateQuorumNumerator(uint256 newQuorumNumerator)", + interface: ["function updateQuorumNumerator(uint256 newQuorumNumerator)"], name: "updateQuorumNumerator" }, { - interface: "function setVotingDelay(uint256 newVotingDelay)", + interface: ["function setVotingDelay(uint256 newVotingDelay)"], name: "setVotingDelay" }, { - interface: "function setVotingPeriod(uint256 newVotingPeriod)", + interface: ["function setVotingPeriod(uint256 newVotingPeriod)"], name: "setVotingPeriod" }, { - interface: "function setProposalThreshold(uint256 newProposalThreshold)", + interface: ["function setProposalThreshold(uint256 newProposalThreshold)"], name: "setProposalThreshold" } ] @@ -64,6 +64,11 @@ interface EvmProposalCreateStore { transferAssets: { transactions: any } + daoRegistry: { + key: string + value: string + } + setDaoRegistry: (type: "key" | "value", value: string) => void createProposalPayload: { targets: any[] values: any[] @@ -71,10 +76,40 @@ interface EvmProposalCreateStore { description: string } setTransferAssets: (transactions: any[]) => void + daoContractCall: { + targetAddress: string + value: string + functionDefinition: string + callData: string + } + setDaoContractCall: (type: "targetAddress" | "value" | "functionDefinition" | "callData", value: string) => void + daoConfig: { + type: "quorumNumerator" | "votingDelay" | "votingPeriod" | "proposalThreshold" | "" + quorumNumerator: string + votingDelay: string + votingPeriod: string + proposalThreshold: string + } + setDaoConfig: (type: "quorumNumerator" | "votingDelay" | "votingPeriod" | "proposalThreshold", value?: string) => void + daoTokenOps: { + type: "mint" | "burn" | "" + mint: { + to: string + amount: string + } + burn: { + from: string + amount: string + } + } + setDaoTokenOps: (type: "mint" | "burn", value?: any) => void getMetadata: () => EvmProposalCreateStore["metadata"] getMetadataFieldValue: (field: keyof EvmProposalCreateStore["metadata"]) => string setMetadataFieldValue: (field: keyof EvmProposalCreateStore["metadata"], value: string) => void - setCreateProposalFieldValues: (field: keyof EvmProposalCreateStore["createProposalPayload"], value: string) => void + setCreateProposalFieldValues: ( + field: keyof EvmProposalCreateStore["createProposalPayload"], + value: string | string[] + ) => void } const useEvmProposalCreateZustantStore = create()( @@ -106,17 +141,83 @@ const useEvmProposalCreateZustantStore = create()( ] }, setTransferAssets: (transactions: any[]) => { + const selectedInterface = proposalInterfaces.find(p => p.name === "transferETH") + if (!selectedInterface) return + const iface = new ethers.Interface(selectedInterface.interface) + const callData: string[] = [] + transactions + .filter( + (transaction: any) => + transaction.recipient?.length > 0 && + transaction.amount > 0 && + transaction.recipient && + ethers.isAddress(transaction.recipient) + ) + .forEach((transaction: any) => { + callData.push( + iface.encodeFunctionData(selectedInterface.name, [ + transaction.recipient, + ethers.parseEther(transaction.amount) + ]) + ) + }) const payload = { transferAssets: { transactions }, createProposalPayload: { - targets: Object.keys(transactions).map((key: any) => transactions[key].recipient), - values: Object.keys(transactions).map((key: any) => transactions[key].amount), - calldatas: [], - description: "" + targets: Object.keys(transactions).map((key: any) => "0x18CA3b7277e25b952834911B1c2e9a9AB4436cA3"), // DAO Treasury Address + // targets: Object.keys(transactions).map((key: any) => transactions[key].recipient), + values: Object.keys(transactions).map((key: any) => "0"), + calldatas: callData, + description: get().createProposalPayload.description } } set(payload) }, + daoRegistry: { + key: "", + value: "" + }, + setDaoRegistry: (type: "key" | "value", value: string) => { + set({ daoRegistry: { ...get().daoRegistry, [type]: value } }) + }, + daoContractCall: { + targetAddress: "", + value: "", + functionDefinition: "", + callData: "" + }, + setDaoContractCall: (type: "targetAddress" | "value" | "functionDefinition" | "callData", value: string) => { + set({ daoContractCall: { ...get().daoContractCall, [type]: value } }) + }, + daoConfig: { + type: "", + quorumNumerator: "", + votingDelay: "", + votingPeriod: "", + proposalThreshold: "" + }, + setDaoConfig: ( + type: "quorumNumerator" | "votingDelay" | "votingPeriod" | "proposalThreshold", + value?: string + ) => { + if (!value) return set({ daoConfig: { ...get().daoConfig, type }, currentStep: 3 }) + set({ daoConfig: { ...get().daoConfig, [type]: value } }) + }, + daoTokenOps: { + type: "", + mint: { + to: "", + amount: "" + }, + burn: { + from: "", + amount: "" + } + }, + setDaoTokenOps: (type: "mint" | "burn", value?: any) => { + if (!value) return set({ daoTokenOps: { ...get().daoTokenOps, type }, currentStep: 3 }) + set({ daoTokenOps: { ...get().daoTokenOps, [type]: value } }) + }, getMetadata: () => { return get().metadata }, @@ -136,7 +237,10 @@ const useEvmProposalCreateZustantStore = create()( } set(payload) }, - setCreateProposalFieldValues: (field: keyof EvmProposalCreateStore["createProposalPayload"], value: string) => { + setCreateProposalFieldValues: ( + field: keyof EvmProposalCreateStore["createProposalPayload"], + value: string | string[] + ) => { const payload = { createProposalPayload: { ...get().createProposalPayload, [field]: value } } as any @@ -160,8 +264,9 @@ export const useEvmProposalOps = () => { const proposalType = zustantStore.getMetadataFieldValue("type") const daoContract = useMemo(() => { - return new ethers.Contract(daoSelected?.token, HbDaoAbi.abi, etherlink.signer) - }, [daoSelected?.token, etherlink.signer]) + console.log("DaoContract", daoSelected?.address, HbDaoAbi.abi) + return new ethers.Contract(daoSelected?.address, HbDaoAbi.abi, etherlink.signer) + }, [daoSelected?.address, etherlink.signer]) console.log("currentStep", currentStep, proposalType) @@ -169,7 +274,7 @@ export const useEvmProposalOps = () => { async (payload: Record) => { if (!daoSelected || !daoContract) return - const tx = await daoContract.propose(payload) + const tx = await daoContract.propose(...Object.values(payload)) console.log("Proposal transaction sent:", tx.hash) const receipt = await tx.wait() console.log("Proposal transaction confirmed:", receipt) @@ -207,32 +312,39 @@ export const useEvmProposalOps = () => { const nextStep = { text: isLoading ? "Please wait..." : "Next", handler: () => { - const iface = new ethers.Interface(["function transferETH(address to, uint256 amount)"]) - const encodedData = iface.encodeFunctionData("transferETH", [ - "0xa9F8F9C0bf3188cEDdb9684ae28655187552bAE9", - ethers.parseEther("1") - ]) - console.log( - "encodedData", - ethers.parseEther("1"), - encodedData, - encodedData === - "0x7b1a4909000000000000000000000000a9f8f9c0bf3188ceddb9684ae28655187552bae90000000000000000000000000000000000000000000000000de0b6b3a7640000" - ) - return + // const selectedInterface = proposalInterfaces.find(p => p.name === "transferETH") + // if (!selectedInterface) return + // console.log("selectedInterface", selectedInterface) + // const iface = new ethers.Interface(selectedInterface.interface) + // const encodedData = iface.encodeFunctionData(selectedInterface.name, [ + // "0xa9F8F9C0bf3188cEDdb9684ae28655187552bAE9", + // ethers.parseEther("1") + // ]) + // console.log( + // "encodedData", + // ethers.parseEther("1"), + // encodedData, + // encodedData === + // "0x7b1a4909000000000000000000000000a9f8f9c0bf3188ceddb9684ae28655187552bae90000000000000000000000000000000000000000000000000de0b6b3a7640000" + // ) + // return if (currentStep == 0) { zustantStore.setCurrentStep(currentStep + 1) } else if (currentStep == 1) { zustantStore.setCurrentStep(currentStep + 1) // "${p.name}0|||0${p.type}0|||0${p.description}0|||0${p.externalResource}" const metadata = zustantStore.getMetadata() - const descriptionType = metadata.type === "transfer_assets" ? "transfer" : "off_chain_debate" - const description = `${metadata.title}0|||0${metadata.type}0|||0${metadata.description}0|||0${metadata.discussionUrl}` + const description = `${metadata.title}0|||0${ + metadata.type === "transfer_assets" ? "transfer" : metadata.type + }0|||0${metadata.description}0|||0${metadata.discussionUrl}` zustantStore.setCreateProposalFieldValues("description", description) } else { // At Step 2 we call the Contract setIsLoading(true) - createProposal(zustantStore.createProposalPayload).then(() => { + + console.log("zustantStore.createProposalPayload", zustantStore.createProposalPayload) + createProposal(zustantStore.createProposalPayload).then((createdProposal: any) => { + console.log("createdProposal", createdProposal) setIsLoading(false) }) } From 2f7f77639af0990b9381ecbdb0c4cbd7f5a41441 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Fri, 20 Dec 2024 20:40:18 +0530 Subject: [PATCH 34/36] WIP - DAO Created --- .../components/EvmDaoProposalList.tsx | 3 +- .../components/EvmProposalDetailCard.tsx | 4 +- .../components/EvmProposalVoteDetail.tsx | 22 +- .../components/EvmProposalVoterList.tsx | 211 ++++++++++++++ src/modules/etherlink/config.ts | 142 ++++++++++ .../etherlink/creator/EvmDaoQuorum.tsx | 10 +- .../explorer/EtherlinkDAO/EvmMembersPage.tsx | 5 +- .../EtherlinkDAO/EvmProposalDetailsPage.tsx | 31 +-- .../EtherlinkDAO/EvmProposalsPage.tsx | 122 +++++++- .../EvmProposals/EvmPropDaoConfig.tsx | 133 +++++---- .../explorer/EvmProposals/EvmPropTokenOps.tsx | 24 +- .../explorer/EvmProposalsActionDialog.tsx | 49 +--- src/modules/etherlink/explorer/router.tsx | 2 +- src/modules/etherlink/layout.tsx | 2 +- .../explorer/components/StatusBadge.tsx | 6 +- .../explorer/pages/Proposals/index.tsx | 109 +------- src/modules/home/hooks/useQueryParam.tsx | 21 ++ .../lite/explorer/components/VotesDialog.tsx | 4 +- .../hooks/useEvmDaoCreateStore.tsx | 36 ++- .../etherlinkDAO/hooks/useEvmDaoOps.tsx | 33 ++- .../etherlinkDAO/hooks/useEvmProposalOps.tsx | 262 +++++++++++++----- .../etherlinkDAO/hooks/useFirestoreStore.tsx | 1 - src/services/wagmi/context.tsx | 142 ++++++++-- 23 files changed, 1011 insertions(+), 363 deletions(-) create mode 100644 src/modules/etherlink/components/EvmProposalVoterList.tsx create mode 100644 src/modules/home/hooks/useQueryParam.tsx diff --git a/src/modules/etherlink/components/EvmDaoProposalList.tsx b/src/modules/etherlink/components/EvmDaoProposalList.tsx index d471ced0..981ae24c 100644 --- a/src/modules/etherlink/components/EvmDaoProposalList.tsx +++ b/src/modules/etherlink/components/EvmDaoProposalList.tsx @@ -29,7 +29,6 @@ interface Props { showFooter?: boolean rightItem?: (proposal: Proposal) => React.ReactElement showFullList?: boolean - filters: undefined } interface ProposalObj { @@ -37,7 +36,7 @@ interface ProposalObj { proposal: Proposal | Poll } -export const EvmDaoProposalList: React.FC = ({ proposals, showFullList = true, filters = undefined }) => { +export const EvmDaoProposalList: React.FC = ({ proposals, showFullList = true }) => { const [currentPage, setCurrentPage] = useState(0) const [offset, setOffset] = useState(0) const offsetLimit = 50 diff --git a/src/modules/etherlink/components/EvmProposalDetailCard.tsx b/src/modules/etherlink/components/EvmProposalDetailCard.tsx index e63c4cb1..1bffd925 100644 --- a/src/modules/etherlink/components/EvmProposalDetailCard.tsx +++ b/src/modules/etherlink/components/EvmProposalDetailCard.tsx @@ -13,6 +13,7 @@ import { useNotification } from "modules/common/hooks/useNotification" import ReactHtmlParser from "react-html-parser" import { EtherlinkContext } from "services/wagmi/context" import { Badge } from "components/ui/Badge" +import { StatusBadge } from "modules/explorer/components/StatusBadge" const LogoItem = styled("img")(({ theme }) => ({ cursor: "pointer", @@ -173,7 +174,8 @@ export const EvmProposalDetailCard: React.FC<{ poll: Poll | undefined }> = ({ po justifyContent={isMobileSmall ? "center" : "flex-start"} > - + + {/* */} diff --git a/src/modules/etherlink/components/EvmProposalVoteDetail.tsx b/src/modules/etherlink/components/EvmProposalVoteDetail.tsx index 29a9fafb..5030389c 100644 --- a/src/modules/etherlink/components/EvmProposalVoteDetail.tsx +++ b/src/modules/etherlink/components/EvmProposalVoteDetail.tsx @@ -15,6 +15,7 @@ import { DownloadCsvFile } from "modules/lite/explorer/components/DownloadCsvFil import { EtherlinkContext } from "services/wagmi/context" import { LinearProgress } from "components/ui/LinearProgress" import { formatNumber } from "modules/explorer/utils/FormatNumber" +import { useEvmDaoOps } from "services/contracts/etherlinkDAO/hooks/useEvmDaoOps" const Container = styled(Grid)(({ theme }) => ({ background: theme.palette.primary.main, @@ -97,10 +98,11 @@ export const EvmProposalVoteDetail: React.FC<{ }> = ({ poll, choices, token }) => { const theme = useTheme() const isMobileSmall = useMediaQuery(theme.breakpoints.down("xs")) - const [open, setOpen] = React.useState(false) + const { network } = useTezos() const [turnout, setTurnout] = useState() const [votes, setVotes] = useState([]) + const { showProposalVoterList, setShowProposalVoterList } = useEvmDaoOps() const { daoSelected, daoProposalSelected } = useContext(EtherlinkContext) const tokenData = useMemo( () => ({ @@ -115,20 +117,12 @@ export const EvmProposalVoteDetail: React.FC<{ const totalVoteCount = daoProposalSelected?.votesFor + daoProposalSelected?.votesAgainst const handleClickOpen = () => { - setVotes(choices.filter(elem => elem.walletAddresses.length > 0)) - setOpen(true) - } - - const handleClose = () => { - setOpen(false) + setShowProposalVoterList(true) + console.log("Setting to true") + // setVotes(choices.filter(elem => elem.walletAddresses.length > 0)) } - const formatConfig = { - average: true, - mantissa: 1, - thousandSeparated: true, - trimMantissa: true - } + console.log({ showProposalVoterList }) useMemo(async () => { if (token && tokenData) { @@ -284,7 +278,7 @@ export const EvmProposalVoteDetail: React.FC<{ /> */} - + {/* Quorum */} diff --git a/src/modules/etherlink/components/EvmProposalVoterList.tsx b/src/modules/etherlink/components/EvmProposalVoterList.tsx new file mode 100644 index 00000000..5a71f2ad --- /dev/null +++ b/src/modules/etherlink/components/EvmProposalVoterList.tsx @@ -0,0 +1,211 @@ +import { Grid, DialogContent, styled, TableBody, Typography } from "@material-ui/core" +import { TableHead, useMediaQuery, useTheme } from "@material-ui/core" +import { Table } from "@material-ui/core" +import { TableCell } from "@material-ui/core" +import { TableRow } from "@material-ui/core" +import { Blockie } from "modules/common/Blockie" +import { AddressText } from "modules/creator/token/ui" +import { ResponsiveDialog } from "modules/explorer/components/ResponsiveDialog" + +import { toShortAddress } from "services/contracts/utils" +import { EVM_PROPOSAL_CHOICES } from "../config" +import { useContext, useState } from "react" +import { EtherlinkContext } from "services/wagmi/context" +import { FileCopyOutlined } from "@material-ui/icons" +import ReactPaginate from "react-paginate" +import { useEvmDaoOps } from "services/contracts/etherlinkDAO/hooks/useEvmDaoOps" + +const CopyIcon = styled(FileCopyOutlined)({ + marginLeft: 8, + cursor: "pointer" +}) + +const Container = styled(Grid)({ + gap: 16, + padding: 16 +}) + +const Header = styled(Typography)(({ theme }) => ({ + color: theme.palette.primary.light, + fontWeight: 300 +})) + +const CustomContent = styled(DialogContent)(({ theme }) => ({ + padding: 0, + display: "grid", + marginTop: 24, + [theme.breakpoints.down("sm")]: { + marginTop: 0, + display: "inline", + paddingTop: "0px !important" + } +})) + +const VotesRow = styled(Typography)(({ theme }) => ({ + cursor: "default", + display: "block", + whiteSpace: "nowrap", + overflow: "hidden", + textOverflow: "ellipsis", + padding: ".5rem 1rem", + width: 400, + [theme.breakpoints.down("sm")]: { + width: 200, + textAlign: "center" + } +})) + +const StyledTableCell = styled(TableCell)({ + "fontWeight": 300, + "& p": { + fontWeight: 300 + } +}) +const StyledTableRow = styled(TableRow)(({ theme }) => ({ + "&:nth-of-type(odd)": { + backgroundColor: theme.palette.action.hover + }, + // hide last border + "&:last-child td, &:last-child th": { + border: 0 + } +})) + +export const EvmProposalVoterList = () => { + const [currentPage, setCurrentPage] = useState(0) + + const theme = useTheme() + const isMobileSmall = useMediaQuery(theme.breakpoints.down("sm")) + const { copyAddress, showProposalVoterList, setShowProposalVoterList } = useEvmDaoOps() + const { daoProposalSelected, daoProposalVoters } = useContext(EtherlinkContext) + + const listOfVotes = [] as any[] + + const handlePageClick = (event: { selected: number }) => { + setCurrentPage(event.selected) + } + const handleClose = () => { + setShowProposalVoterList(false) + } + + const pageCount = Math.ceil(daoProposalSelected?.totalVoteCount / 10) + console.log("XXX", { showProposalVoterList, daoProposalVoters }) + + return ( +
+ + +
+ {!isMobileSmall ? ( + + + Address + Option + Votes + + + ) : null} + + + {daoProposalVoters + ? daoProposalVoters.map((row: any) => { + return isMobileSmall ? ( + + + +
Address
+
+ + + {toShortAddress(row.voter)} + copyAddress(row.voter)} color="secondary" fontSize="inherit" /> + +
{" "} + + +
Option
+
+ + + {" "} + {row.option} + + +
{" "} + + +
Weight
+
+ + + {row.weight} + + +
{" "} +
+ ) : ( + + + + + {toShortAddress(row.voter)} + copyAddress(row.voter)} color="secondary" fontSize="inherit" /> + + {" "} + + + {" "} + {row.option === 1 ? "Yes" : "No"} + + + + {" "} + + {row.weight} + + + + ) + }) + : null} + {!listOfVotes ? No info : null} +
+
+ + + + + {/* + + */} + +
+ ) +} diff --git a/src/modules/etherlink/config.ts b/src/modules/etherlink/config.ts index bb9c3006..d84e21ab 100644 --- a/src/modules/etherlink/config.ts +++ b/src/modules/etherlink/config.ts @@ -16,6 +16,148 @@ export const STEPS = [ { title: "Review & Deploy", index: 6, path: "summary", component: EvmDaoSummary } ] +export const EvmProposalOptions = [ + { + label: "Off-Chain Debate", + description: "Post a thesis and have tokenized arguments around it", + modal: "off_chain_debate", + is_disabled: true + }, + { + label: "Transfer Assets", + description: "Propose a transfer of assets from the DAO treasury", + modal: "transfer_assets", + proposal_type: () => "transfer", + last_step: 2, + interface: { + transferETH: { + interface: ["function transferETH(address to, uint256 amount)"], + name: "transferETH" + } + } + }, + { + label: "Edit Registry", + description: "Change an entry or add a new one", + modal: "edit_registry", + proposal_type: () => "registry", + last_step: 2, + interface: { + editRegistry: { + interface: ["function editRegistry(string key, string Value)"], + name: "editRegistry" + } + } + }, + { + label: "Contract Call", + description: "Propose a call to an external contract", + modal: "contract_call", + last_step: 2, + proposal_type: () => "contract call" + }, + { + label: "Change Config", + description: "Propose changes to the DAO configuration", + modal: "change_config", + proposal_type: (type: "quorum" | "voting delay" | "voting period" | "proposal threshold") => `${type}`, + last_step: 3, + interface: { + updateQuorumNumerator: { + interface: ["function updateQuorumNumerator(uint256 newQuorumNumerator)"], + name: "updateQuorumNumerator" + }, + setVotingDelay: { + interface: ["function setVotingDelay(uint256 newVotingDelay)"], + name: "setVotingDelay" + }, + setVotingPeriod: { + interface: ["function setVotingPeriod(uint256 newVotingPeriod)"], + name: "setVotingPeriod" + }, + setProposalThreshold: { + interface: ["function setProposalThreshold(uint256 newProposalThreshold)"], + name: "setProposalThreshold" + } + } + }, + { + label: "Token Operation", + description: "Propose a token operation", + modal: "token_operation", + proposal_type: (type: "Burn" | "Mint", tokenSymbol: string) => `${type}${tokenSymbol}`, + last_step: 3, + interface: { + mint: { + interface: ["function mint(address to, uint256 amount)"], + name: "mint" + }, + burn: { + interface: ["function burn(address from, uint256 amount)"], + name: "burn" + } + } + } +] + +export const proposalInterfaces = [ + { + interface: ["function editRegistry(string key, string Value)"], + name: "editRegistry" + }, + { + interface: ["function mint(address to, uint256 amount)"], + name: "mint" + }, + { + interface: ["function burn(address from, uint256 amount)"], + name: "burn" + }, + { + interface: ["function transferETH(address to, uint256 amount)"], + name: "transferETH" + }, + { + interface: ["function transferERC20(address token, address to, uint256 amount)"], + name: "transferERC20" + }, + { + interface: ["function transferERC721(address token, address to, uint256 tokenId)"], + name: "transferERC721" + }, + { + interface: ["function updateQuorumNumerator(uint256 newQuorumNumerator)"], + name: "updateQuorumNumerator" + }, + { + interface: ["function setVotingDelay(uint256 newVotingDelay)"], + name: "setVotingDelay" + }, + { + interface: ["function setVotingPeriod(uint256 newVotingPeriod)"], + name: "setVotingPeriod" + }, + { + interface: ["function setProposalThreshold(uint256 newProposalThreshold)"], + name: "setProposalThreshold" + } +] + +export const EVM_PROPOSAL_CHOICES = [ + { + name: "For", + pollID: "1", + walletAddresses: [], + selected: true + }, + { + name: "Against", + pollID: "2", + walletAddresses: [], + selected: false + } +] + export const urlToStepMap: Record = { template: 0, dao: 1, diff --git a/src/modules/etherlink/creator/EvmDaoQuorum.tsx b/src/modules/etherlink/creator/EvmDaoQuorum.tsx index c5ef92d8..a6918adf 100644 --- a/src/modules/etherlink/creator/EvmDaoQuorum.tsx +++ b/src/modules/etherlink/creator/EvmDaoQuorum.tsx @@ -45,7 +45,15 @@ export const EvmDaoQuorum: React.FC = () => {
- + { + setFieldValue("quorum.proposalThreshold", Number(e.target.value)) + }} + />
diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmMembersPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmMembersPage.tsx index 28310365..ca331c4b 100644 --- a/src/modules/etherlink/explorer/EtherlinkDAO/EvmMembersPage.tsx +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmMembersPage.tsx @@ -6,11 +6,12 @@ import { useContext } from "react" import { VotingPowerWidget } from "modules/etherlink/components/VotingPowerWidget" export const EvmMembersPage = () => { - const { daoMembers } = useContext(EtherlinkContext) + const { daoMembers, daoSelected } = useContext(EtherlinkContext) + const decimals = daoSelected?.decimals || 0 const daoMemberData = daoMembers?.map((member: any) => ({ address: member.address, votingWeight: member.votingWeight, - personalBalance: member.personalBalance, + personalBalance: member.personalBalance / 10 ** decimals, proposalsCreated: member.proposalsCreated, proposalsVoted: member.proposalsVoted })) diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx index e3378443..1eae4c5a 100644 --- a/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx @@ -1,22 +1,25 @@ -import { ArrowBackIosOutlined } from "@mui/icons-material" import { GridContainer } from "modules/common/GridContainer" import { Button, Grid, Typography, useMediaQuery, useTheme } from "@mui/material" import { PageContainer } from "components/ui/DaoCreator" -import { ProposalDetailCard } from "modules/lite/explorer/components/ProposalDetailCard" import { useContext, useEffect } from "react" import { useParams } from "react-router-dom" import { EtherlinkContext } from "services/wagmi/context" -import { ProposalStatus } from "services/services/dao/mappers/proposal/types" import { EvmProposalDetailCard } from "modules/etherlink/components/EvmProposalDetailCard" -import { ChoiceItemSelected } from "modules/lite/explorer/components/ChoiceItemSelected" import { EvmProposalVoteDetail } from "modules/etherlink/components/EvmProposalVoteDetail" -import { TitleText } from "components/ui/TitleText" import { EvmProposalCountdown } from "modules/etherlink/components/EvmProposalCountdown" +import { EVM_PROPOSAL_CHOICES } from "modules/etherlink/config" +import { EvmProposalVoterList } from "modules/etherlink/components/EvmProposalVoterList" + export const EvmProposalDetailsPage = () => { const params = useParams() as { proposalId: string } const proposalId = params?.proposalId const { daoSelected, daoProposalSelected, selectDaoProposal } = useContext(EtherlinkContext) + + // const daoSelected = {} + // const daoProposalSelected = {} + // const selectDaoProposal = () => {} + const theme = useTheme() const isMobileSmall = useMediaQuery(theme.breakpoints.down("sm")) @@ -24,22 +27,7 @@ export const EvmProposalDetailsPage = () => { selectDaoProposal(proposalId) }, [proposalId, selectDaoProposal]) - const choices = [ - { - name: "For", - pollID: "1", - walletAddresses: [], - selected: true - }, - { - name: "Against", - pollID: "1", - walletAddresses: [], - selected: false - } - ] - - console.log("daoProposalSelected", daoProposalSelected) + const choices = EVM_PROPOSAL_CHOICES return (
@@ -103,6 +91,7 @@ export const EvmProposalDetailsPage = () => { +
) } diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalsPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalsPage.tsx index ed9f917b..ad7a76df 100644 --- a/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalsPage.tsx +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalsPage.tsx @@ -1,5 +1,123 @@ -import { EtherlinkProposals } from "modules/explorer/pages/Proposals" +import { useMemo, useState } from "react" +import { useContext } from "react" +import { useEtherlinkDAOID } from "../router" +import { EtherlinkContext } from "services/wagmi/context" +import { Grid, MenuItem, Typography, useTheme } from "@material-ui/core" +import { TitleText } from "components/ui/TitleText" +import { HeroContainer } from "components/ui/HeroContainer" +import { SmallButton } from "modules/common/SmallButton" +import { EvmDaoProposalList } from "modules/etherlink/components/EvmDaoProposalList" +import { ProposalActionsDialog } from "modules/explorer/components/ProposalActionsDialog" +import Select, { SelectChangeEvent } from "@mui/material/Select" +import { useQueryParam } from "modules/home/hooks/useQueryParam" export const EvmProposalsPage = () => { - return + const daoId = useEtherlinkDAOID() + const [proposalType, setProposalType] = useQueryParam("type") + const [proposalStatus, setProposalStatus] = useQueryParam("status") + + // TODO: Replace useContext with a useEtherlinkProvider + const { daoProposals } = useContext(EtherlinkContext) + // const { data, cycleInfo } = useDAO(daoId) + // const { data: proposals } = useProposals(daoId) + const theme = useTheme() + // const isMobileSmall = useMediaQuery(theme.breakpoints.down("xs")) + const [openDialog, setOpenDialog] = useState(false) + console.log({ daoProposals }) + const handleCloseModal = () => { + setOpenDialog(false) + } + + const filteredProposals = useMemo(() => { + if (proposalType === "all" && proposalStatus === "all") return daoProposals + if (!proposalType && !proposalStatus) return daoProposals + + return daoProposals?.filter((proposal: any) => { + if (proposalType && proposalType !== "all" && proposal.type === proposalType) return true + if (proposalStatus && proposalStatus !== "all" && proposal.status === proposalStatus) return true + return false + }) + }, [daoProposals, proposalType, proposalStatus]) + + return ( + <> + + Proposals + + + + + + + + Type + + + + + + Status + + + + + + {daoProposals?.length || 0} Proposals + + + + setOpenDialog(true)}> + New Proposal + + + + + + + + + + ) } diff --git a/src/modules/etherlink/explorer/EvmProposals/EvmPropDaoConfig.tsx b/src/modules/etherlink/explorer/EvmProposals/EvmPropDaoConfig.tsx index 9b84d2b0..e394c60e 100644 --- a/src/modules/etherlink/explorer/EvmProposals/EvmPropDaoConfig.tsx +++ b/src/modules/etherlink/explorer/EvmProposals/EvmPropDaoConfig.tsx @@ -1,4 +1,4 @@ -import React, { useState } from "react" +import React, { useContext, useEffect, useMemo, useState } from "react" import { Grid, styled, Typography, Slider, Box } from "@material-ui/core" import { StyledTextField } from "components/ui/StyledTextField" import { @@ -10,6 +10,7 @@ import { } from "@material-ui/icons" import { useEvmProposalOps } from "services/contracts/etherlinkDAO/hooks/useEvmProposalOps" import { StyledSliderWithValue } from "components/ui/StyledSlider" +import { EtherlinkContext } from "services/wagmi/context" const OptionContainer = styled(Grid)({ "background": "#2F3438", @@ -26,19 +27,6 @@ const IconContainer = styled(Box)({ marginBottom: "16px" }) -const BackButton = styled(Grid)({ - display: "flex", - alignItems: "center", - cursor: "pointer", - marginBottom: "24px" -}) - -const TimeInputContainer = styled(Grid)({ - "& > div": { - marginRight: "16px" - } -}) - const ConfigOption = ({ icon, title, @@ -61,38 +49,82 @@ const ConfigOption = ({
) -const TimeInput = ({ label, onChange }: { label: string; onChange: (field: string, value: string) => void }) => ( - - {label} - - onChange("days", e.target.value)} - style={{ marginRight: "16px" }} - /> - onChange("hours", e.target.value)} - style={{ marginRight: "16px" }} - /> - onChange("minutes", e.target.value)} - style={{ marginRight: "16px" }} - /> - - -) +const TimeInput = ({ + label, + defaultValue, + onChange +}: { + label: string + defaultValue: { days: number; hours: number; minutes: number } + onChange: (valueInMinutes: string) => void +}) => { + const [days, setDays] = useState(defaultValue.days) + const [hours, setHours] = useState(defaultValue.hours) + const [minutes, setMinutes] = useState(defaultValue.minutes) + + useEffect(() => { + let totalMinutes = 0 + if (!isNaN(days)) totalMinutes += days * 1440 + if (!isNaN(hours)) totalMinutes += hours * 60 + if (!isNaN(minutes)) totalMinutes += minutes + console.log("totalMinutes", totalMinutes) + onChange(totalMinutes.toString()) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [days, hours, minutes]) + + return ( + + {label} + + setDays(Number(e.target.value))} + style={{ marginRight: "16px" }} + /> + setHours(Number(e.target.value))} + style={{ marginRight: "16px" }} + /> + setMinutes(Number(e.target.value))} + style={{ marginRight: "16px" }} + /> + + + ) +} export const EvmPropDaoConfig = () => { + const { daoSelected } = useContext(EtherlinkContext) const { currentStep, daoConfig, setDaoConfig } = useEvmProposalOps() + const defaultVotingDelay = useMemo(() => { + return { + days: Math.floor(Number(daoConfig.votingDelay) / 86400), + hours: Math.floor((Number(daoConfig.votingDelay) % 86400) / 3600), + minutes: Math.floor((Number(daoConfig.votingDelay) % 3600) / 60) + } + }, [daoConfig.votingDelay]) + + const defaultVotingPeriod = useMemo(() => { + return { + days: Math.floor(Number(daoConfig.votingPeriod) / 86400), + hours: Math.floor((Number(daoConfig.votingPeriod) % 86400) / 3600), + minutes: Math.floor((Number(daoConfig.votingPeriod) % 3600) / 60) + } + }, [daoConfig.votingPeriod]) + const renderSelectedOption = () => { switch (daoConfig.type) { case "quorumNumerator": @@ -115,7 +147,11 @@ export const EvmPropDaoConfig = () => { Change the wait time between posting a proposal and the start of voting - setDaoConfig("votingDelay", value)} /> + setDaoConfig("votingDelay", value)} + /> ) case "votingPeriod": @@ -126,7 +162,8 @@ export const EvmPropDaoConfig = () => { setDaoConfig("votingPeriod", value)} + defaultValue={defaultVotingPeriod} + onChange={value => setDaoConfig("votingPeriod", value)} /> ) @@ -159,27 +196,27 @@ export const EvmPropDaoConfig = () => { icon={} title="Quorum" description="Change the minimum required participation for a proposal to pass" - onClick={() => setDaoConfig("quorumNumerator")} + onClick={() => setDaoConfig("quorumNumerator", undefined, daoSelected?.address)} /> } title="Voting Delay" description="Change the wait time between posting a proposal and the start of voting" - onClick={() => setDaoConfig("votingDelay")} + onClick={() => setDaoConfig("votingDelay", undefined, daoSelected?.address)} /> } title="Voting Period" description="Change how long voting lasts" - onClick={() => setDaoConfig("votingPeriod")} + onClick={() => setDaoConfig("votingPeriod", undefined, daoSelected?.address)} /> } title="Proposal Threshold" description="Change the minimum amount of Token ownership required to submit a proposal" - onClick={() => setDaoConfig("proposalThreshold")} + onClick={() => setDaoConfig("proposalThreshold", undefined, daoSelected?.address)} />
) diff --git a/src/modules/etherlink/explorer/EvmProposals/EvmPropTokenOps.tsx b/src/modules/etherlink/explorer/EvmProposals/EvmPropTokenOps.tsx index 11150c5c..8bc1f87d 100644 --- a/src/modules/etherlink/explorer/EvmProposals/EvmPropTokenOps.tsx +++ b/src/modules/etherlink/explorer/EvmProposals/EvmPropTokenOps.tsx @@ -3,6 +3,8 @@ import AddCircleIcon from "@mui/icons-material/AddCircle" import RemoveCircleIcon from "@mui/icons-material/RemoveCircle" import { useEvmProposalOps } from "services/contracts/etherlinkDAO/hooks/useEvmProposalOps" import { StyledTextField } from "components/ui/StyledTextField" +import { useContext } from "react" +import { EtherlinkContext } from "services/wagmi/context" const OptionContainer = styled(Grid)({ "background": "#2F3438", @@ -42,6 +44,8 @@ const ConfigOption = ({ ) const EvmPropTokenOps = () => { + const { daoSelected } = useContext(EtherlinkContext) + console.log("EvmPropTokenOps", daoSelected) const { currentStep, daoTokenOps, setDaoTokenOps } = useEvmProposalOps() if (currentStep === 3 && daoTokenOps.type === "mint") { @@ -56,11 +60,11 @@ const EvmPropTokenOps = () => { fullWidth label="Recipient Address" variant="standard" - value={daoTokenOps.mint.to} + value={daoTokenOps.mint?.to} onChange={e => setDaoTokenOps("mint", { to: e.target.value, - amount: daoTokenOps.mint.amount + amount: daoTokenOps.mint?.amount }) } style={{ marginBottom: "16px" }} @@ -70,10 +74,10 @@ const EvmPropTokenOps = () => { label="Amount" type="number" variant="standard" - value={daoTokenOps.mint.amount} + value={daoTokenOps.mint?.amount} onChange={e => setDaoTokenOps("mint", { - to: daoTokenOps.mint.to, + to: daoTokenOps.mint?.to, amount: e.target.value }) } @@ -95,11 +99,11 @@ const EvmPropTokenOps = () => { fullWidth label="Recipient Address" variant="standard" - value={daoTokenOps.mint.to} + value={daoTokenOps.burn?.to} onChange={e => setDaoTokenOps("burn", { to: e.target.value, - amount: daoTokenOps.burn.amount + amount: daoTokenOps.burn?.amount }) } style={{ marginBottom: "16px" }} @@ -109,10 +113,10 @@ const EvmPropTokenOps = () => { label="Amount" type="number" variant="standard" - value={daoTokenOps.mint.amount} + value={daoTokenOps.burn?.amount} onChange={e => setDaoTokenOps("burn", { - to: daoTokenOps.mint.to, + to: daoTokenOps.burn?.to, amount: e.target.value }) } @@ -127,13 +131,13 @@ const EvmPropTokenOps = () => { icon={} title="Mint" description="Mint tokens to a specified address" - onClick={() => setDaoTokenOps("mint")} + onClick={() => setDaoTokenOps("mint", undefined, daoSelected?.symbol, daoSelected?.token)} /> } title="Burn" description="Burn tokens from a specified address" - onClick={() => setDaoTokenOps("burn")} + onClick={() => setDaoTokenOps("burn", undefined, daoSelected?.symbol, daoSelected?.token)} />
) diff --git a/src/modules/etherlink/explorer/EvmProposalsActionDialog.tsx b/src/modules/etherlink/explorer/EvmProposalsActionDialog.tsx index f0e7845b..e03a4561 100644 --- a/src/modules/etherlink/explorer/EvmProposalsActionDialog.tsx +++ b/src/modules/etherlink/explorer/EvmProposalsActionDialog.tsx @@ -14,14 +14,7 @@ import { EvmPropEditRegistry } from "./EvmProposals/EvmPropEditRegistry" import { EvmPropContractCall } from "./EvmProposals/EvmPropContractCall" import { EvmPropDaoConfig } from "./EvmProposals/EvmPropDaoConfig" import EvmPropTokenOps from "./EvmProposals/EvmPropTokenOps" - -const ProposalContainer = styled(Grid)(({ theme }) => ({ - boxSizing: "border-box", - padding: "0px 15px", - [theme.breakpoints.down("md")]: { - marginTop: 30 - } -})) +import { EvmProposalOptions } from "../config" // TODO: Move this to a shared component const OptionContainer = styled(Grid)(({ theme }) => ({ @@ -54,40 +47,6 @@ const TitleContainer = styled(Grid)({ marginBottom: 24 }) -const evmProposalOptions = [ - { - label: "Off-Chain Debate", - description: "Post a thesis and have tokenized arguments around it", - modal: "off_chain_debate", - is_disabled: true - }, - { - label: "Transfer Assets", - description: "Propose a transfer of assets from the DAO treasury", - modal: "transfer_assets" - }, - { - label: "Edit Registry", - description: "Change an entry or add a new one", - modal: "edit_registry" - }, - { - label: "Contract Call", - description: "Propose a call to an external contract", - modal: "contract_call" - }, - { - label: "Change Config", - description: "Propose changes to the DAO configuration", - modal: "change_config" - }, - { - label: "Token Operation", - description: "Propose a token operation", - modal: "token_operation" - } -] - const renderModal = (modal: string) => { switch (modal) { case "transfer_assets": @@ -110,7 +69,7 @@ export const EvmProposalsActionDialog = ({ open, handleClose }: { open: boolean; const { isLoading, currentStep, metadata, setMetadataFieldValue, setCurrentStep, nextStep, prevStep } = useEvmProposalOps() const isMobileSmall = useMediaQuery(theme.breakpoints.down("sm")) - const proposalTitle = evmProposalOptions.find(option => option.modal === metadata.type)?.label + const proposalTitle = EvmProposalOptions.find(option => option.modal === metadata.type)?.label return ( <> @@ -119,7 +78,7 @@ export const EvmProposalsActionDialog = ({ open, handleClose }: { open: boolean; Select Proposal Type - {evmProposalOptions.map((option, index) => ( + {EvmProposalOptions.map((option, index) => ( = 2} onClose={() => setMetadataFieldValue("type", "")} - title="Transfer Assets" + title={proposalTitle} > {renderModal(metadata.type)} diff --git a/src/modules/etherlink/explorer/router.tsx b/src/modules/etherlink/explorer/router.tsx index 2be65153..fd9e4c74 100644 --- a/src/modules/etherlink/explorer/router.tsx +++ b/src/modules/etherlink/explorer/router.tsx @@ -30,7 +30,7 @@ const EtherlinkDAORouteContent: React.FC = ({ children }) => { const [state, setState] = useState(DAOState.FOUND) const history = useHistory() - console.log("etherlink/router.tsx", { daoId, isLoading, data }) + // console.log("etherlink/router.tsx", { daoId, isLoading, data }) useEffect(() => { ;(async () => { diff --git a/src/modules/etherlink/layout.tsx b/src/modules/etherlink/layout.tsx index 04542ea1..74775ecf 100644 --- a/src/modules/etherlink/layout.tsx +++ b/src/modules/etherlink/layout.tsx @@ -74,7 +74,7 @@ export const EvmDaoCreatorLayout: React.FC = ({ children }) => { - {step < 6 && } + {step < STEPS.length && } diff --git a/src/modules/explorer/components/StatusBadge.tsx b/src/modules/explorer/components/StatusBadge.tsx index f809aa25..7c44e402 100644 --- a/src/modules/explorer/components/StatusBadge.tsx +++ b/src/modules/explorer/components/StatusBadge.tsx @@ -73,8 +73,8 @@ export const Badge = styled(Grid)(({ status }: { status: ProposalStatus | "all"; "minWidth": 87, "textAlign": "center", "padding": "4px 16px", - "background": statusColors(status).background, - "color": statusColors(status).color, + "background": statusColors(status)?.background, + "color": statusColors(status)?.color, "& > div": { height: "100%" } @@ -90,7 +90,7 @@ export const StatusBadge: React.FC<{ status: ProposalStatus | "all" } & GridProp - {statusColors(status).text} + {statusColors(status)?.text} diff --git a/src/modules/explorer/pages/Proposals/index.tsx b/src/modules/explorer/pages/Proposals/index.tsx index 82f4f99b..b7e5fabb 100644 --- a/src/modules/explorer/pages/Proposals/index.tsx +++ b/src/modules/explorer/pages/Proposals/index.tsx @@ -1,6 +1,5 @@ import React, { useCallback, useState, useContext, useEffect } from "react" -import { Button, Grid, MenuItem, styled, Theme, Typography, useMediaQuery, useTheme } from "@material-ui/core" -import Select, { SelectChangeEvent } from "@mui/material/Select" +import { Button, Grid, styled, Theme, Typography, useMediaQuery, useTheme } from "@material-ui/core" import { useDAO } from "services/services/dao/hooks/useDAO" import { useProposals } from "services/services/dao/hooks/useProposals" @@ -25,9 +24,7 @@ import DeleteIcon from "@mui/icons-material/Delete" import FilterAltIcon from "@mui/icons-material/FilterAlt" import { FilterProposalsDialog } from "modules/explorer/components/FiltersDialog" import { Filters } from "../User/components/UserMovements" -import { useEtherlinkDAOID } from "modules/etherlink/explorer/router" -import { EtherlinkContext } from "services/wagmi/context" -import { EvmDaoProposalList } from "modules/etherlink/components/EvmDaoProposalList" +import { EvmProposalsPage } from "modules/etherlink/explorer/EtherlinkDAO/EvmProposalsPage" const FiltersContainer = styled(Grid)({ marginTop: 45, @@ -337,106 +334,10 @@ const TezosProposals = () => { ) } -export const EtherlinkProposals = () => { - const daoId = useEtherlinkDAOID() - // TODO: Replace useContext with a useEtherlinkProvider - const { daoProposals } = useContext(EtherlinkContext) - // const { data, cycleInfo } = useDAO(daoId) - // const { data: proposals } = useProposals(daoId) - const theme = useTheme() - // const isMobileSmall = useMediaQuery(theme.breakpoints.down("xs")) - const [openDialog, setOpenDialog] = useState(false) - console.log({ daoProposals }) - const handleCloseModal = () => { - setOpenDialog(false) - } - - return ( - <> - - Proposals - - - - - - - - Type - - - - - - Status - - - - - - {daoProposals?.length || 0} Proposals - - - - setOpenDialog(true)}> - New Proposal - - - - - - - - - - ) -} +export const EtherlinkProposals = () => {} export const Proposals: React.FC = () => { const daoId = useDAOID() - const { data, cycleInfo } = useDAO(daoId) - return data?.data.network.startsWith("etherlink") ? : + const { data } = useDAO(daoId) + return data?.data.network.startsWith("etherlink") ? : } diff --git a/src/modules/home/hooks/useQueryParam.tsx b/src/modules/home/hooks/useQueryParam.tsx new file mode 100644 index 00000000..e2a3db45 --- /dev/null +++ b/src/modules/home/hooks/useQueryParam.tsx @@ -0,0 +1,21 @@ +import { useLocation, useHistory } from "react-router-dom" + +// TODO: remove hook on path change +export const useQueryParam = (param: string) => { + const location = useLocation() + const history = useHistory() + const searchParams = new URLSearchParams(location.search) + const paramValue = searchParams.get(param) + + const setValue = (value: string | null) => { + const newSearchParams = new URLSearchParams(searchParams) + if (value === null) { + newSearchParams.delete(param) + } else { + newSearchParams.set(param, value) + } + history.push({ search: newSearchParams.toString() }) + } + + return [paramValue, setValue] as const +} diff --git a/src/modules/lite/explorer/components/VotesDialog.tsx b/src/modules/lite/explorer/components/VotesDialog.tsx index 15bac205..bff15731 100644 --- a/src/modules/lite/explorer/components/VotesDialog.tsx +++ b/src/modules/lite/explorer/components/VotesDialog.tsx @@ -4,7 +4,6 @@ import { DialogContent, styled, Typography, - Button, Grid, useTheme, useMediaQuery, @@ -12,8 +11,7 @@ import { TableBody, TableRow, TableHead, - TableCell, - makeStyles + TableCell } from "@material-ui/core" import { toShortAddress } from "services/contracts/utils" import { FileCopyOutlined } from "@material-ui/icons" diff --git a/src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx b/src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx index a5e03ce2..510b354a 100644 --- a/src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx +++ b/src/services/contracts/etherlinkDAO/hooks/useEvmDaoCreateStore.tsx @@ -166,8 +166,8 @@ const useEvmDaoCreateStore = () => { try { // Get wrapper factory const samplePayload = [ - "SundayX", // DAO Name - "SUNX", // DAO Symbol + "SundayZ", // DAO Name + "SUNZ", // DAO Symbol "Getting ready for the week.", // DAO Description 2, // Token Decimals 60, // Execution Delay in seconds @@ -177,16 +177,16 @@ const useEvmDaoCreateStore = () => { 3450000, // Member 2 Token Allocation 2, // Voting Delay in minutes 3, // Voting Duration in minutes - 4000, // Proposal Threshold (1% of total supply) - 50 // Quorum (4% of total supply) + 4000, // Proposal Threshold (mamount of + 50 // Quorum (In Percentage 50 for 50% of total supply) ], ["Founder", "Mission"], // Registry Keys ["Alice", "Promote Decentralization"] // Registry Values ] setIsDeploying(true) const totalTokenSupply = daoData.members.reduce((acc: number, member: any) => acc + member.amountOfTokens, 0) - const proposalThreshhold = (daoData.quorum.proposalThresholdPercentage / 100) * totalTokenSupply - const quorumThreshold = (daoData.quorum.returnedTokenPercentage / 100) * totalTokenSupply + const proposalThreshhold = daoData.quorum.proposalThreshold + const quorumThreshold = daoData.quorum.returnedTokenPercentage const executationDelayinSeconds = daoData.voting.proposalExpiryBlocksDay * 24 * 60 * 60 + @@ -203,29 +203,35 @@ const useEvmDaoCreateStore = () => { daoData.voting.proposalFlushBlocksHours * 60 + daoData.voting.proposalFlushBlocksMinutes - const wrapperFactory: ethers.Contract = new ethers.Contract(wrapperAddress, HbWrapperAbi.abi, etherlink.signer) - const wrapper: ethers.Contract = await wrapperFactory.deployDAOwithToken({ + const daoCreateObject = { name: daoData.name, symbol: daoData.governanceToken.symbol, description: daoData.description, - decimals: daoData.governanceToken.tokenDecimals, + decimals: parseInt(daoData.governanceToken.tokenDecimals), executionDelay: executationDelayinSeconds, initialMembers: daoData.members.map((member: any) => member.address), initialAmounts: [ - ...daoData.members.map((member: any) => member.amountOfTokens), - votingDelayInMinutes, - votingDurationInMinutes, - proposalThreshhold, - quorumThreshold + ...daoData.members.map( + (member: any) => parseInt(member.amountOfTokens) * 10 ** Number(daoData.governanceToken.tokenDecimals) + ), + parseInt(votingDelayInMinutes), + parseInt(votingDurationInMinutes), + isNaN(proposalThreshhold) ? 0 : Number(proposalThreshhold), + isNaN(quorumThreshold) ? 0 : Number(quorumThreshold) ], keys: Object.keys(daoData.registry), values: Object.values(daoData.registry) - }) + } + const daoCreatePayload = Object.values(daoCreateObject) + console.log({ daoCreatePayload, samplePayload }) + const wrapperFactory: ethers.Contract = new ethers.Contract(wrapperAddress, HbWrapperAbi.abi, etherlink.signer) + const wrapper: ethers.Contract = await wrapperFactory.deployDAOwithToken(daoCreatePayload) console.log("Transaction sent:", wrapper.hash) const receipt = await wrapper.wait() console.log("Transaction confirmed:", receipt) + history.push("/explorer/daos") } catch (error) { console.error("Error deploying DAO", error) return null diff --git a/src/services/contracts/etherlinkDAO/hooks/useEvmDaoOps.tsx b/src/services/contracts/etherlinkDAO/hooks/useEvmDaoOps.tsx index 0d530679..34540f2c 100644 --- a/src/services/contracts/etherlinkDAO/hooks/useEvmDaoOps.tsx +++ b/src/services/contracts/etherlinkDAO/hooks/useEvmDaoOps.tsx @@ -1,15 +1,30 @@ import { ethers } from "ethers" +import { create } from "zustand" import { useCallback, useContext, useEffect, useRef, useState } from "react" import { useTezos } from "services/beacon/hooks/useTezos" import { EtherlinkContext } from "services/wagmi/context" import HbTokenAbi from "assets/abis/hb_evm.json" +import { useNotification } from "modules/common/hooks/useNotification" + +interface EvmDaoOpsStore { + showProposalVoterList: boolean + setShowProposalVoterList: (value: boolean) => void +} + +const useEvmDaoOpsStore = create()((set, get) => ({ + showProposalVoterList: false, + setShowProposalVoterList: (value: boolean) => set({ showProposalVoterList: value }) +})) export const useEvmDaoOps = () => { const [tokenContract, setTokenContract] = useState(null) const { etherlink } = useTezos() + const { showProposalVoterList, setShowProposalVoterList } = useEvmDaoOpsStore() + const openNotification = useNotification() + const loggedInUserAddress = etherlink?.signer?.address - const { daoSelected, daoMembers } = useContext(EtherlinkContext) + const { daoSelected, daoMembers, daoProposalSelected } = useContext(EtherlinkContext) const [userVotingWeight, setUserVotingWeight] = useState(0) const [userTokenBalance, setUserTokenBalance] = useState(0) const selectedUser = daoMembers?.find((member: any) => member.address === loggedInUserAddress) @@ -17,6 +32,15 @@ export const useEvmDaoOps = () => { const proposalCreatedCount = selectedUser?.proposalsCreated?.length || 0 const proposalVotedCount = selectedUser?.proposalsVoted?.length || 0 + const copyAddress = (address: string) => { + navigator.clipboard.writeText(address) + openNotification({ + message: "Address copied!", + autoHideDuration: 2000, + variant: "info" + }) + } + const daoDelegate = useCallback( async (targetAddress: string) => { if (!daoSelected) return @@ -32,6 +56,8 @@ export const useEvmDaoOps = () => { [daoSelected, etherlink.signer] ) + console.log("YYY", { showProposalVoterList }) + useEffect(() => { if (!etherlink?.signer || !tokenContract) return const getUserTokenBalance = async () => { @@ -65,6 +91,9 @@ export const useEvmDaoOps = () => { loggedInUser: { address: etherlink?.signer?.address }, - daoDelegate + daoDelegate, + copyAddress, + showProposalVoterList, + setShowProposalVoterList } } diff --git a/src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx b/src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx index 6c06d335..bf08a697 100644 --- a/src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx +++ b/src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx @@ -8,49 +8,23 @@ import { EtherlinkContext } from "services/wagmi/context" import HbTokenAbi from "assets/abis/hb_evm.json" import HbDaoAbi from "assets/abis/hb_dao.json" +import { useNotification } from "modules/common/hooks/useNotification" +import { EvmProposalOptions, proposalInterfaces } from "modules/etherlink/config" +import { useHistory } from "react-router-dom" -const proposalInterfaces = [ - { - interface: ["function editRegistry(string key, string Value)"], - name: "editRegistry" - }, - { - interface: ["function mint(address to, uint256 amount)"], - name: "mint" - }, - { - interface: ["function burn(address from, uint256 amount)"], - name: "burn" - }, - { - interface: ["function transferETH(address to, uint256 amount)"], - name: "transferETH" - }, - { - interface: ["function transferERC20(address token, address to, uint256 amount)"], - name: "transferERC20" - }, - { - interface: ["function transferERC721(address token, address to, uint256 tokenId)"], - name: "transferERC721" - }, - { - interface: ["function updateQuorumNumerator(uint256 newQuorumNumerator)"], - name: "updateQuorumNumerator" - }, - { - interface: ["function setVotingDelay(uint256 newVotingDelay)"], - name: "setVotingDelay" - }, - { - interface: ["function setVotingPeriod(uint256 newVotingPeriod)"], - name: "setVotingPeriod" - }, - { - interface: ["function setProposalThreshold(uint256 newProposalThreshold)"], - name: "setProposalThreshold" - } -] +function getDaoConfigType(type: string) { + if (type === "quorumNumerator") return "quorum" + if (type === "votingDelay") return "voting delay" + if (type === "votingPeriod") return "voting period" + if (type === "proposalThreshold") return "proposal threshold" + return "" +} + +function getDaoTokenOpsType(type: string, tokenSymbol: string) { + if (type === "mint") return `Mint${tokenSymbol}` + if (type === "burn") return `Burn${tokenSymbol}` + return "" +} interface EvmProposalCreateStore { currentStep: number @@ -75,6 +49,7 @@ interface EvmProposalCreateStore { calldatas: any[] description: string } + setCreateProposalPayload: (payload: any) => void setTransferAssets: (transactions: any[]) => void daoContractCall: { targetAddress: string @@ -85,25 +60,35 @@ interface EvmProposalCreateStore { setDaoContractCall: (type: "targetAddress" | "value" | "functionDefinition" | "callData", value: string) => void daoConfig: { type: "quorumNumerator" | "votingDelay" | "votingPeriod" | "proposalThreshold" | "" + address: string quorumNumerator: string votingDelay: string votingPeriod: string proposalThreshold: string } - setDaoConfig: (type: "quorumNumerator" | "votingDelay" | "votingPeriod" | "proposalThreshold", value?: string) => void + setDaoConfig: ( + type: "quorumNumerator" | "votingDelay" | "votingPeriod" | "proposalThreshold", + value?: string, + address?: string + ) => void daoTokenOps: { type: "mint" | "burn" | "" + token: { + symbol: string + address: string + } mint: { to: string amount: string } burn: { - from: string + to: string amount: string } } - setDaoTokenOps: (type: "mint" | "burn", value?: any) => void + setDaoTokenOps: (type: "mint" | "burn", value?: any, tokenSymbol?: string, tokenAddress?: string) => void getMetadata: () => EvmProposalCreateStore["metadata"] + setMetadata: (metadata: EvmProposalCreateStore["metadata"]) => void getMetadataFieldValue: (field: keyof EvmProposalCreateStore["metadata"]) => string setMetadataFieldValue: (field: keyof EvmProposalCreateStore["metadata"], value: string) => void setCreateProposalFieldValues: ( @@ -125,12 +110,18 @@ const useEvmProposalCreateZustantStore = create()( description: "", discussionUrl: "" }, + setMetadata: (metadata: EvmProposalCreateStore["metadata"]) => { + set({ metadata }) + }, createProposalPayload: { targets: [], values: [], // Will be always ["0","0","0"] calldatas: [], description: "" }, + setCreateProposalPayload: (payload: any) => { + set({ createProposalPayload: payload }) + }, transferAssets: { transactions: [ { @@ -178,7 +169,18 @@ const useEvmProposalCreateZustantStore = create()( value: "" }, setDaoRegistry: (type: "key" | "value", value: string) => { - set({ daoRegistry: { ...get().daoRegistry, [type]: value } }) + const selectedPropType = EvmProposalOptions.find(p => p.modal === "edit_registry") + const selectedInterface = selectedPropType?.interface?.editRegistry + if (!selectedInterface) return console.log("No interface found") + const iface = new ethers.Interface(selectedInterface.interface) + const encodedData = iface.encodeFunctionData(selectedInterface.name, [ + get().daoRegistry.key, + get().daoRegistry.value + ]) + set({ + daoRegistry: { ...get().daoRegistry, [type]: value }, + createProposalPayload: { ...get().createProposalPayload, calldatas: [encodedData] } + }) }, daoContractCall: { targetAddress: "", @@ -191,6 +193,7 @@ const useEvmProposalCreateZustantStore = create()( }, daoConfig: { type: "", + address: "", quorumNumerator: "", votingDelay: "", votingPeriod: "", @@ -198,25 +201,104 @@ const useEvmProposalCreateZustantStore = create()( }, setDaoConfig: ( type: "quorumNumerator" | "votingDelay" | "votingPeriod" | "proposalThreshold", - value?: string + value?: string, + daoAddress?: string ) => { - if (!value) return set({ daoConfig: { ...get().daoConfig, type }, currentStep: 3 }) - set({ daoConfig: { ...get().daoConfig, [type]: value } }) + if (!value && daoAddress) { + const proposalDescription = get().createProposalPayload.description + const proposalDescriptionSplit = proposalDescription.split("0|||0") + proposalDescriptionSplit[1] = getDaoConfigType(type) + const description = proposalDescriptionSplit.join("0|||0") + return set({ + daoConfig: { ...get().daoConfig, type, address: daoAddress }, + createProposalPayload: { ...get().createProposalPayload, description }, + currentStep: 3 + }) + } + const payload = { daoConfig: { ...get().daoConfig, [type]: value } } as any + // TODO: handle this within next handler + // let ifaceDef, iface: any, encodedData: any + // if (type === "quorumNumerator") { + // ifaceDef = proposalInterfaces.find(p => p.name === "updateQuorumNumerator") + // if (!ifaceDef) return + // iface = new ethers.Interface(ifaceDef.interface) + // encodedData = iface.encodeFunctionData(ifaceDef.name, [value]) + // } + // if (type === "votingDelay") { + // ifaceDef = proposalInterfaces.find(p => p.name === "setVotingDelay") + // if (!ifaceDef) return + // iface = new ethers.Interface(ifaceDef.interface) + // encodedData = iface.encodeFunctionData(ifaceDef.name, [value]) + // } + // if (type === "votingPeriod") { + // ifaceDef = proposalInterfaces.find(p => p.name === "setVotingPeriod") + // if (!ifaceDef) return + // iface = new ethers.Interface(ifaceDef.interface) + // encodedData = iface.encodeFunctionData(ifaceDef.name, [value]) + // } + // if (type === "proposalThreshold") { + // ifaceDef = proposalInterfaces.find(p => p.name === "setProposalThreshold") + // if (!ifaceDef) return + // iface = new ethers.Interface(ifaceDef.interface) + // encodedData = iface.encodeFunctionData(ifaceDef.name, [value]) + // } + + // payload.createProposalPayload = { + // ...get().createProposalPayload, + // targets: [daoSelected?.registryAddress], + // values: [0], + // calldatas: [encodedData], + // description: get().createProposalPayload.description + // } + set(payload) }, daoTokenOps: { type: "", + token: { + symbol: "", + address: "" + }, mint: { to: "", amount: "" }, burn: { - from: "", + to: "", amount: "" } }, - setDaoTokenOps: (type: "mint" | "burn", value?: any) => { - if (!value) return set({ daoTokenOps: { ...get().daoTokenOps, type }, currentStep: 3 }) - set({ daoTokenOps: { ...get().daoTokenOps, [type]: value } }) + setDaoTokenOps: (type: "mint" | "burn", value?: any, tokenSymbol?: string, tokenAddress?: string) => { + console.log("setDaoTokenOps", type, value, tokenSymbol) + if (!value && tokenSymbol && tokenAddress) { + const proposalDescription = get().createProposalPayload.description + const proposalDescriptionSplit = proposalDescription.split("0|||0") + proposalDescriptionSplit[1] = getDaoTokenOpsType(type, tokenSymbol) + const description = proposalDescriptionSplit.join("0|||0") + console.log("new description", description) + return set({ + daoTokenOps: { ...get().daoTokenOps, type, token: { symbol: tokenSymbol, address: tokenAddress } }, + createProposalPayload: { ...get().createProposalPayload, description }, + currentStep: 3 + }) + } + const selectedInterface = proposalInterfaces.find(p => p.name === "transferERC20") + if (!selectedInterface) return + const payload = { daoTokenOps: { ...get().daoTokenOps, [type]: value } } as any + const iface = new ethers.Interface(selectedInterface.interface) + const targetAddress = get().daoTokenOps[type]?.to + const targetAmount = get().daoTokenOps[type]?.amount + if (ethers.isAddress(targetAddress) && targetAmount && !isNaN(Number(targetAmount))) { + const encodedData = iface.encodeFunctionData(selectedInterface.name, [ + get().daoTokenOps.token.address, + targetAddress, + ethers.parseEther(targetAmount) + ]) + payload.createProposalPayload = { + ...get().createProposalPayload, + calldatas: [encodedData] + } + } + set(payload) }, getMetadata: () => { return get().metadata @@ -258,13 +340,16 @@ export const useEvmProposalOps = () => { const [isLoading, setIsLoading] = useState(false) const { etherlink } = useTezos() const { daoSelected } = useContext(EtherlinkContext) + const router = useHistory() const zustantStore = useEvmProposalCreateZustantStore() + const openNotification = useNotification() const currentStep = zustantStore.currentStep const proposalType = zustantStore.getMetadataFieldValue("type") const daoContract = useMemo(() => { console.log("DaoContract", daoSelected?.address, HbDaoAbi.abi) + if (!daoSelected?.address || !etherlink.signer) return return new ethers.Contract(daoSelected?.address, HbDaoAbi.abi, etherlink.signer) }, [daoSelected?.address, etherlink.signer]) @@ -328,25 +413,70 @@ export const useEvmProposalOps = () => { // "0x7b1a4909000000000000000000000000a9f8f9c0bf3188ceddb9684ae28655187552bae90000000000000000000000000000000000000000000000000de0b6b3a7640000" // ) // return + const selectedOption = EvmProposalOptions.find((p: any) => p.modal === proposalType) as any if (currentStep == 0) { - zustantStore.setCurrentStep(currentStep + 1) - } else if (currentStep == 1) { - zustantStore.setCurrentStep(currentStep + 1) - // "${p.name}0|||0${p.type}0|||0${p.description}0|||0${p.externalResource}" + zustantStore.setCurrentStep(1) + } + // Setting up Proposal Title, Details and Link + else if (currentStep == 1) { const metadata = zustantStore.getMetadata() - const description = `${metadata.title}0|||0${ - metadata.type === "transfer_assets" ? "transfer" : metadata.type - }0|||0${metadata.description}0|||0${metadata.discussionUrl}` - zustantStore.setCreateProposalFieldValues("description", description) - } else { + // "${p.name}0|||0${p.type}0|||0${p.description}0|||0${p.externalResource}" + if (selectedOption?.last_step === 2) { + const proposalType = selectedOption?.proposal_type() + const description = `${metadata.title}0|||0${proposalType}0|||0${metadata.description}0|||0${metadata.discussionUrl}` + zustantStore.setCreateProposalPayload({ + ...zustantStore.createProposalPayload, + targets: [daoSelected?.registryAddress], + values: [0], + description: description + }) + } else { + zustantStore.setCreateProposalFieldValues( + "description", + `${metadata.title}0|||0UNKNOWN0|||0${metadata.description}0|||0${metadata.discussionUrl}` + ) + } + zustantStore.setCurrentStep(currentStep + 1) + } else if (currentStep === selectedOption?.last_step) { // At Step 2 we call the Contract - setIsLoading(true) + // setIsLoading(true) console.log("zustantStore.createProposalPayload", zustantStore.createProposalPayload) - createProposal(zustantStore.createProposalPayload).then((createdProposal: any) => { - console.log("createdProposal", createdProposal) - setIsLoading(false) + const { closeSnackbar } = openNotification({ + message: "Creating Proposal...", + variant: "success" }) + + createProposal(zustantStore.createProposalPayload) + .then((createdProposal: any) => { + console.log("createdProposal", createdProposal) + setIsLoading(false) + zustantStore.setCurrentStep(0) + zustantStore.setCreateProposalPayload({ + targets: [], + values: [], + calldatas: [], + description: "" + }) + zustantStore.setMetadata({ + type: "", + title: "", + description: "", + discussionUrl: "" + }) + router.push(`/explorer/etherlink/dao/${daoSelected?.address}/proposals`) + }) + .catch(err => { + console.log("Error creating proposal", err) + openNotification({ + message: `Error creating proposal: ${err.message}`, + variant: "error", + autoHideDuration: 3000 + }) + }) + .finally(() => { + closeSnackbar() + }) } } } diff --git a/src/services/contracts/etherlinkDAO/hooks/useFirestoreStore.tsx b/src/services/contracts/etherlinkDAO/hooks/useFirestoreStore.tsx index 34cd0fb7..1f13bee8 100644 --- a/src/services/contracts/etherlinkDAO/hooks/useFirestoreStore.tsx +++ b/src/services/contracts/etherlinkDAO/hooks/useFirestoreStore.tsx @@ -46,7 +46,6 @@ const useFirestoreStore = create((set, get) => ({ // collectionRef = collection(docRef, pathSegments[pathSegments.length - 1]) // const docRef = doc(db, pathSegments[0], pathSegments[1]) - console.log("collectionName", "daosEtherlink-Testnet/0x3d0bd8fe6126fb2dcedcf872eaa2631fe1c759c6/proposals") console.log("collectionName_Input", collectionName) collectionRef = collection(db, collectionName) // const snapshot = await getDocs(collectionRef) diff --git a/src/services/wagmi/context.tsx b/src/services/wagmi/context.tsx index 8867b4a5..ed60c70b 100644 --- a/src/services/wagmi/context.tsx +++ b/src/services/wagmi/context.tsx @@ -6,11 +6,12 @@ import { etherlink, etherlinkTestnet } from "wagmi/chains" import { useModal } from "connectkit" import { useEthersProvider, useEthersSigner } from "./ethers" import useFirestoreStore from "services/contracts/etherlinkDAO/hooks/useFirestoreStore" -import HbTokenAbi from "assets/abis/hb_evm.json" import { ProposalStatus } from "services/services/dao/mappers/proposal/types" -import { useTezos } from "services/beacon/hooks/useTezos" + import dayjs from "dayjs" import { ethers } from "ethers" +import BigNumber from "bignumber.js" +import { Timestamp } from "firebase/firestore" interface EtherlinkType { isConnected: boolean @@ -67,7 +68,8 @@ const useEtherlinkDao = ({ network }: { network: string }) => { totalSupply: string registry: Record votingDuration: number - votingDelayInMinutes: number + votingDelay: number + quorum: number } | null>(null) const [daoRegistryDetails, setDaoRegistryDetails] = useState<{ balance: string @@ -75,10 +77,22 @@ const useEtherlinkDao = ({ network }: { network: string }) => { const [daoProposals, setDaoProposals] = useState([]) const [daoProposalSelected, setDaoProposalSelected] = useState({}) + const [daoProposalVoters, setDaoProposalVoters] = useState< + { + cast: Timestamp + option: number + reason?: string + voter: string + weight: string + }[] + >([]) const [daoMembers, setDaoMembers] = useState([]) const { data: firestoreData, loading, fetchCollection } = useFirestoreStore() + // console.log({ firestoreData }) + + console.log({ daoProposals, daoSelected }) useEffect(() => { fetchCollection("contracts") if (firebaseRootCollection) { @@ -109,26 +123,77 @@ const useEtherlinkDao = ({ network }: { network: string }) => { if (!daoSelected?.id) return const daoProposalKey = `${firebaseRootCollection}/${daoSelected.id}/proposals` const daoMembersKey = `${firebaseRootCollection}/${daoSelected?.id}/members` + const daoProposalVotesKey = `${firebaseRootCollection}/${daoSelected?.id}/proposals/${daoProposalSelected?.id}/votes` if (firestoreData?.[daoProposalKey]) { + const timeNow = dayjs() setDaoProposals( firestoreData[daoProposalKey] ?.sort((a: any, b: any) => b.createdAt - a.createdAt) .map(firebaseProposal => { + const votesInFavor = new BigNumber(firebaseProposal?.inFavor) + const votesAgainst = new BigNumber(firebaseProposal?.against) + + const totalVotes = votesInFavor.plus(votesAgainst) + const totalVoteCount = parseInt(firebaseProposal?.votesFor) + parseInt(firebaseProposal?.votesAgainst) + const totalSupply = new BigNumber(daoSelected?.totalSupply ?? "1") + const votesPercentage = totalVotes.div(totalSupply).times(100) + console.log("votesPercentage", firebaseProposal?.title, votesPercentage.toString()) + const proposalCreatedAt = dayjs.unix(firebaseProposal.createdAt?.seconds as unknown as number) - const votingDelayInMinutes = daoSelected?.votingDuration || 1 + const votingDelayInMinutes = daoSelected?.votingDelay || 1 + const votingDurationInMinutes = daoSelected?.votingDuration || 1 const votingExpiresAt = proposalCreatedAt.add(votingDelayInMinutes, "minutes") + const activeStartTimestamp = proposalCreatedAt.add(votingDelayInMinutes, "minutes") + const votingEndTimestamp = activeStartTimestamp.add(votingDurationInMinutes, "minutes") + + // Flutter Refernce + // if (votePercentage < org.quorum) { + // newStatus = ProposalStatus.noQuorum; // or "no quorum" in getStatus() + // statusHistory.clear(); + // statusHistory.addAll({"pending": start}); + // statusHistory.addAll({"active": activeStart}); + // statusHistory.addAll({"no quorum": votingEnd}); + // status = "no quorum"; + // return newStatus; + // } + const statusHistoryMap = Object.entries(firebaseProposal.statusHistory) + .map(([status, timestamp]: [string, any]) => ({ + status, + timestamp: timestamp?.seconds as unknown as number, + timestamp_human: dayjs.unix(timestamp?.seconds as unknown as number).format("MMM DD, YYYY HH:mm:ss") + })) + .sort((a, b) => b.timestamp - a.timestamp) + + statusHistoryMap.push({ + status: "active", + timestamp: activeStartTimestamp.unix(), + timestamp_human: activeStartTimestamp.format("MMM DD, YYYY HH:mm:ss") + }) + + console.log({ + votesPercentage: votesPercentage.toFormat(2), + quorum: daoSelected?.quorum, + votingEndTimestamp, + timeNow + }) + if (votesPercentage.lt(daoSelected?.quorum) && votingEndTimestamp.isBefore(timeNow)) { + statusHistoryMap.push({ + status: "no quorum", + timestamp: votingEndTimestamp.unix(), + timestamp_human: votingEndTimestamp.format("MMM DD, YYYY HH:mm") + }) + } return { ...firebaseProposal, - status: getStatusByHistory(firebaseProposal.statusHistory), - statusHistoryMap: Object.entries(firebaseProposal.statusHistory) - .map(([status, timestamp]: [string, any]) => ({ - status, - timestamp: timestamp?.seconds as unknown as number, - timestamp_human: dayjs.unix(timestamp?.seconds as unknown as number).format("MMM DD, YYYY HH:mm:ss") - })) - .sort((a, b) => b.timestamp - a.timestamp), - votingExpiresAt: votingExpiresAt + status: getStatusByHistory(firebaseProposal.statusHistory, { + votesPercentage, + daoQuorum: daoSelected?.quorum + }), + statusHistoryMap: statusHistoryMap.sort((a, b) => b.timestamp - a.timestamp), + votingExpiresAt: votingExpiresAt, + totalVotes: totalVotes, + totalVoteCount } }) ) @@ -137,7 +202,11 @@ const useEtherlinkDao = ({ network }: { network: string }) => { if (firestoreData?.[daoMembersKey]) { setDaoMembers(firestoreData[daoMembersKey]) } - }, [daoSelected?.id, daoSelected?.votingDuration, firebaseRootCollection, firestoreData]) + + if (firestoreData?.[daoProposalVotesKey]) { + setDaoProposalVoters(firestoreData[daoProposalVotesKey]) + } + }, [daoProposalSelected?.id, daoSelected, daoSelected?.votingDuration, firebaseRootCollection, firestoreData]) useEffect(() => { if (daoSelected?.id && firebaseRootCollection) { @@ -156,8 +225,17 @@ const useEtherlinkDao = ({ network }: { network: string }) => { }) console.log("Treasury Data", ethBalance) }) + + if (daoProposalSelected?.id) { + fetchCollection(`${firebaseRootCollection}/${daoSelected?.id}/proposals/${daoProposalSelected?.id}/votes`) + } } - }, [daoSelected, fetchCollection, firebaseRootCollection]) + }, [daoProposalSelected?.id, daoSelected, fetchCollection, firebaseRootCollection]) + + // useEffect(() => { + // if (!daoProposalSelected?.id) return + // fetchCollection(`${firebaseRootCollection}/${daoSelected?.id}/proposals/${daoProposalSelected?.id}/voters`) + // }, [daoProposalSelected, daoSelected, fetchCollection, firebaseRootCollection]) return { contractData, @@ -167,6 +245,7 @@ const useEtherlinkDao = ({ network }: { network: string }) => { daoProposals, daoProposalSelected, daoMembers, + daoProposalVoters, selectDaoProposal: (proposalId: string) => { const proposal = daoProposals.find((proposal: any) => proposal.id === proposalId) if (proposal) { @@ -186,18 +265,37 @@ const useEtherlinkDao = ({ network }: { network: string }) => { } // TODO: @ashutoshpw, handle more statuus and move to utils -const getStatusByHistory = (history: { active: number; executable: number; passed: number; pending: number }) => { +const getStatusByHistory = ( + history: { active: Timestamp; executable: Timestamp; passed: Timestamp; pending: Timestamp }, + { + votesPercentage, + daoQuorum + }: { + votesPercentage: BigNumber + daoQuorum: number + } +) => { + const timeNow = dayjs() const statuses = Object.keys(history) - const status = statuses.reduce((maxStatus, currentStatus) => { - return history[currentStatus as keyof typeof history] > history[maxStatus as keyof typeof history] - ? currentStatus - : maxStatus - }) + console.log({ statuses, history }) + const status = statuses + .filter(x => dayjs(history[x as keyof typeof history].seconds).isBefore(timeNow)) + .reduce((maxStatus, currentStatus) => { + console.log("statuses", maxStatus, currentStatus) + + if (history[currentStatus as keyof typeof history].seconds > history[maxStatus as keyof typeof history].seconds) { + return currentStatus + } + return maxStatus + }) // TODO: @ashutoshpw, handle more statuses switch (status) { case "active": return ProposalStatus.ACTIVE case "pending": + if (votesPercentage.lt(daoQuorum)) { + return ProposalStatus.NO_QUORUM + } return ProposalStatus.PENDING case "rejected": return ProposalStatus.REJECTED @@ -253,6 +351,7 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children isLoadingDaoProposals, daoProposalSelected, daoMembers, + daoProposalVoters, selectDaoProposal, selectDao } = useEtherlinkDao({ @@ -286,6 +385,7 @@ export const EtherlinkProvider: React.FC<{ children: ReactNode }> = ({ children daoProposals, daoProposalSelected, daoMembers, + daoProposalVoters, selectDaoProposal, selectDao, disconnect: () => disconnectEtherlink(wagmiConfig), From d1cd9230cd0bb34a5addc5f0746f5283031e5028 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Fri, 20 Dec 2024 22:07:50 +0530 Subject: [PATCH 35/36] WIP - Votes are being casted now --- .../components/EvmProposalCountdown.tsx | 18 +++- .../EtherlinkDAO/EvmProposalDetailsPage.tsx | 66 ++++++++++++-- .../explorer/EtherlinkDAO/EvmUserPage.tsx | 86 ++++++++++++++++++- .../etherlinkDAO/hooks/useEvmDaoOps.tsx | 10 ++- .../etherlinkDAO/hooks/useEvmProposalOps.tsx | 69 +++++++-------- src/services/wagmi/context.tsx | 28 ++++-- 6 files changed, 218 insertions(+), 59 deletions(-) diff --git a/src/modules/etherlink/components/EvmProposalCountdown.tsx b/src/modules/etherlink/components/EvmProposalCountdown.tsx index 330c3cf5..8cfb7e07 100644 --- a/src/modules/etherlink/components/EvmProposalCountdown.tsx +++ b/src/modules/etherlink/components/EvmProposalCountdown.tsx @@ -3,7 +3,7 @@ import { Timer } from "@mui/icons-material" import { Box } from "@mui/material" import { Typography } from "@mui/material" import dayjs from "dayjs" -import React, { useContext, useEffect, useState } from "react" +import React, { useContext, useEffect, useMemo, useState } from "react" import { EtherlinkContext } from "services/wagmi/context" import { GridContainer } from "modules/common/GridContainer" @@ -18,6 +18,20 @@ export const EvmProposalCountdown = () => { const [timeLeft, setTimeLeft] = useState({ days: 0, hours: 0, minutes: 0, seconds: 0 }) const { daoProposalSelected } = useContext(EtherlinkContext) const targetDate = daoProposalSelected?.votingExpiresAt + const votingStartTimestamp = daoProposalSelected?.votingStartTimestamp + const votingExpiresAt = daoProposalSelected?.votingExpiresAt + + const timerLabel = useMemo(() => { + const timeNow = dayjs() + if (votingStartTimestamp?.isAfter(timeNow)) { + return "Voting starts in" + } + if (votingExpiresAt?.isAfter(timeNow) && votingStartTimestamp?.isBefore(timeNow)) { + return "Time left to vote" + } + + return "Voting concluded" + }, [votingStartTimestamp, votingExpiresAt]) useEffect(() => { const calculateTimeLeft = () => { @@ -78,7 +92,7 @@ export const EvmProposalCountdown = () => { - Time Left to Vote + {timerLabel} diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx index 1eae4c5a..8a536eab 100644 --- a/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx @@ -1,7 +1,7 @@ import { GridContainer } from "modules/common/GridContainer" import { Button, Grid, Typography, useMediaQuery, useTheme } from "@mui/material" import { PageContainer } from "components/ui/DaoCreator" -import { useContext, useEffect } from "react" +import { useContext, useEffect, useState } from "react" import { useParams } from "react-router-dom" import { EtherlinkContext } from "services/wagmi/context" import { EvmProposalDetailCard } from "modules/etherlink/components/EvmProposalDetailCard" @@ -9,16 +9,19 @@ import { EvmProposalVoteDetail } from "modules/etherlink/components/EvmProposalV import { EvmProposalCountdown } from "modules/etherlink/components/EvmProposalCountdown" import { EVM_PROPOSAL_CHOICES } from "modules/etherlink/config" import { EvmProposalVoterList } from "modules/etherlink/components/EvmProposalVoterList" +import { ThumbDownAlt } from "@mui/icons-material" +import { ThumbUpAlt } from "@mui/icons-material" +import { useNotification } from "modules/common/hooks/useNotification" +import { useEvmProposalOps } from "services/contracts/etherlinkDAO/hooks/useEvmProposalOps" export const EvmProposalDetailsPage = () => { + const [isCastingVote, setIsCastingVote] = useState(false) + const openNotification = useNotification() const params = useParams() as { proposalId: string } const proposalId = params?.proposalId const { daoSelected, daoProposalSelected, selectDaoProposal } = useContext(EtherlinkContext) - - // const daoSelected = {} - // const daoProposalSelected = {} - // const selectDaoProposal = () => {} + const { castVote } = useEvmProposalOps() const theme = useTheme() const isMobileSmall = useMediaQuery(theme.breakpoints.down("sm")) @@ -36,8 +39,57 @@ export const EvmProposalDetailsPage = () => { - - + + + + + + + + {choices && choices.length > 0 ? ( diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmUserPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmUserPage.tsx index e0fc5d63..a40ff638 100644 --- a/src/modules/etherlink/explorer/EtherlinkDAO/EvmUserPage.tsx +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmUserPage.tsx @@ -1,10 +1,13 @@ -import React, { useContext } from "react" +import React, { useContext, useEffect, useState } from "react" +import { ethers } from "ethers" import { Box, Grid, styled, Typography } from "@material-ui/core" import { Button } from "components/ui/Button" import { HowToVote, People } from "@material-ui/icons" import { useTezos } from "services/beacon/hooks/useTezos" import { EtherlinkContext } from "services/wagmi/context" import { useEvmDaoOps } from "services/contracts/etherlinkDAO/hooks/useEvmDaoOps" +import { ResponsiveDialog } from "modules/explorer/components/ResponsiveDialog" +import { StyledTextField } from "components/ui/StyledTextField" const StatsContainer = styled(Grid)({ marginBottom: "40px", @@ -64,12 +67,31 @@ const DelegationDescription = styled(Typography)({ }) export const EvmUserPage = () => { - const { daoSelected } = useContext(EtherlinkContext) + const [isLoading, setIsLoading] = useState(false) + const [delegateToAddress, setDelegateToAddress] = useState("") + const [delegateDialogOpen, setDelegateDialogOpen] = useState(false) + const [isValidDelegateAddress, setIsValidDelegateAddress] = useState(false) + + const { daoMembers, daoSelected } = useContext(EtherlinkContext) + const { daoDelegate, signer, userTokenBalance, userVotingWeight, proposalCreatedCount, proposalVotedCount } = useEvmDaoOps() + const selfMember = daoMembers?.find((member: any) => member.address === signer?.address) + console.log("selfMember", selfMember) const userAddress = signer?.address const votingWeight = userVotingWeight const personalBalance = userTokenBalance + const userDelegate = selfMember?.delegate + const isSelfDelegated = userDelegate === signer?.address + const isDelegatedToOther = userDelegate?.length > 0 && userDelegate !== signer?.address + + useEffect(() => { + if (ethers.isAddress(delegateToAddress)) { + setIsValidDelegateAddress(true) + } else { + setIsValidDelegateAddress(false) + } + }, [delegateToAddress, setIsValidDelegateAddress]) return ( @@ -110,7 +132,7 @@ export const EvmUserPage = () => { If you can't or don't want to take part in the governance process, your voting privilege may be forwarded to another member of your choosing. - @@ -124,8 +146,64 @@ export const EvmUserPage = () => { This also allows other members to delegate their vote to you, so that you may participate in the governance process on their behalf. - Only voting on your behalf + + {isSelfDelegated ? ( + Only voting on your behalf + ) : ( + + )} + + { + setDelegateDialogOpen(false) + }} + title="Delegate Voting Power" + > + + + Delegate your voting power to another member of the DAO. + + + setDelegateToAddress(e.target.value)} + value={delegateToAddress} + /> + + + + + + diff --git a/src/services/contracts/etherlinkDAO/hooks/useEvmDaoOps.tsx b/src/services/contracts/etherlinkDAO/hooks/useEvmDaoOps.tsx index 34540f2c..300cf6a0 100644 --- a/src/services/contracts/etherlinkDAO/hooks/useEvmDaoOps.tsx +++ b/src/services/contracts/etherlinkDAO/hooks/useEvmDaoOps.tsx @@ -7,6 +7,11 @@ import { EtherlinkContext } from "services/wagmi/context" import HbTokenAbi from "assets/abis/hb_evm.json" import { useNotification } from "modules/common/hooks/useNotification" +/** + * + * delete - token->delete + */ + interface EvmDaoOpsStore { showProposalVoterList: boolean setShowProposalVoterList: (value: boolean) => void @@ -44,10 +49,9 @@ export const useEvmDaoOps = () => { const daoDelegate = useCallback( async (targetAddress: string) => { if (!daoSelected) return + console.log("Delegating to ", targetAddress) const govContract = new ethers.Contract(daoSelected.token, HbTokenAbi.abi, etherlink.signer) - const tx = await govContract.delegate({ - delegatee: targetAddress - }) + const tx = await govContract.delegate(targetAddress) console.log("Transaction sent:", tx.hash) const receipt = await tx.wait() console.log("Transaction confirmed:", receipt) diff --git a/src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx b/src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx index bf08a697..3b739e68 100644 --- a/src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx +++ b/src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx @@ -217,39 +217,40 @@ const useEvmProposalCreateZustantStore = create()( } const payload = { daoConfig: { ...get().daoConfig, [type]: value } } as any // TODO: handle this within next handler - // let ifaceDef, iface: any, encodedData: any - // if (type === "quorumNumerator") { - // ifaceDef = proposalInterfaces.find(p => p.name === "updateQuorumNumerator") - // if (!ifaceDef) return - // iface = new ethers.Interface(ifaceDef.interface) - // encodedData = iface.encodeFunctionData(ifaceDef.name, [value]) - // } - // if (type === "votingDelay") { - // ifaceDef = proposalInterfaces.find(p => p.name === "setVotingDelay") - // if (!ifaceDef) return - // iface = new ethers.Interface(ifaceDef.interface) - // encodedData = iface.encodeFunctionData(ifaceDef.name, [value]) - // } - // if (type === "votingPeriod") { - // ifaceDef = proposalInterfaces.find(p => p.name === "setVotingPeriod") - // if (!ifaceDef) return - // iface = new ethers.Interface(ifaceDef.interface) - // encodedData = iface.encodeFunctionData(ifaceDef.name, [value]) - // } - // if (type === "proposalThreshold") { - // ifaceDef = proposalInterfaces.find(p => p.name === "setProposalThreshold") - // if (!ifaceDef) return - // iface = new ethers.Interface(ifaceDef.interface) - // encodedData = iface.encodeFunctionData(ifaceDef.name, [value]) - // } + console.log("setting dao config", type, value) + let ifaceDef, iface: any, encodedData: any + if (type === "quorumNumerator") { + ifaceDef = proposalInterfaces.find(p => p.name === "updateQuorumNumerator") + if (!ifaceDef) return + iface = new ethers.Interface(ifaceDef.interface) + encodedData = iface.encodeFunctionData(ifaceDef.name, [value?.toString()]) + } + if (type === "votingDelay") { + ifaceDef = proposalInterfaces.find(p => p.name === "setVotingDelay") + if (!ifaceDef) return + iface = new ethers.Interface(ifaceDef.interface) + encodedData = iface.encodeFunctionData(ifaceDef.name, [value?.toString()]) + } + if (type === "votingPeriod") { + ifaceDef = proposalInterfaces.find(p => p.name === "setVotingPeriod") + if (!ifaceDef) return + iface = new ethers.Interface(ifaceDef.interface) + encodedData = iface.encodeFunctionData(ifaceDef.name, [value]) + } + if (type === "proposalThreshold") { + ifaceDef = proposalInterfaces.find(p => p.name === "setProposalThreshold") + if (!ifaceDef) return + iface = new ethers.Interface(ifaceDef.interface) + encodedData = iface.encodeFunctionData(ifaceDef.name, [value]) + } - // payload.createProposalPayload = { - // ...get().createProposalPayload, - // targets: [daoSelected?.registryAddress], - // values: [0], - // calldatas: [encodedData], - // description: get().createProposalPayload.description - // } + payload.createProposalPayload = { + ...get().createProposalPayload, + targets: [get().daoConfig.address], + values: [0], + calldatas: [encodedData], + description: get().createProposalPayload.description + } set(payload) }, daoTokenOps: { @@ -370,9 +371,9 @@ export const useEvmProposalOps = () => { const castVote = useCallback( async (proposalId: number, support: boolean) => { - if (!daoContract) return + if (!daoContract || !proposalId) return alert("No dao contract or proposal id") - const tx = await daoContract.castVote(proposalId, support) + const tx = await daoContract.castVote(proposalId?.toString(), support ? 1 : 0) console.log("Vote transaction sent:", tx.hash) const receipt = await tx.wait() console.log("Vote transaction confirmed:", receipt) diff --git a/src/services/wagmi/context.tsx b/src/services/wagmi/context.tsx index ed60c70b..9a10f9b2 100644 --- a/src/services/wagmi/context.tsx +++ b/src/services/wagmi/context.tsx @@ -186,11 +186,14 @@ const useEtherlinkDao = ({ network }: { network: string }) => { } return { ...firebaseProposal, - status: getStatusByHistory(firebaseProposal.statusHistory, { + status: getStatusByHistory(statusHistoryMap, { votesPercentage, + votingExpiresAt, + activeStartTimestamp, daoQuorum: daoSelected?.quorum }), statusHistoryMap: statusHistoryMap.sort((a, b) => b.timestamp - a.timestamp), + votingStartTimestamp: activeStartTimestamp, votingExpiresAt: votingExpiresAt, totalVotes: totalVotes, totalVoteCount @@ -266,34 +269,41 @@ const useEtherlinkDao = ({ network }: { network: string }) => { // TODO: @ashutoshpw, handle more statuus and move to utils const getStatusByHistory = ( - history: { active: Timestamp; executable: Timestamp; passed: Timestamp; pending: Timestamp }, + history: { status: string; timestamp: number; timestamp_human: string }[], { votesPercentage, + votingExpiresAt, + activeStartTimestamp, daoQuorum }: { votesPercentage: BigNumber + votingExpiresAt: dayjs.Dayjs + activeStartTimestamp: dayjs.Dayjs daoQuorum: number } ) => { const timeNow = dayjs() - const statuses = Object.keys(history) - console.log({ statuses, history }) - const status = statuses - .filter(x => dayjs(history[x as keyof typeof history].seconds).isBefore(timeNow)) + + const status = history + .filter(x => dayjs(x.timestamp).isBefore(timeNow)) .reduce((maxStatus, currentStatus) => { console.log("statuses", maxStatus, currentStatus) - if (history[currentStatus as keyof typeof history].seconds > history[maxStatus as keyof typeof history].seconds) { + if (currentStatus.timestamp > maxStatus.timestamp) { return currentStatus } return maxStatus }) + + if (activeStartTimestamp.isAfter(timeNow) && votingExpiresAt.isBefore(timeNow)) { + return ProposalStatus.ACTIVE + } // TODO: @ashutoshpw, handle more statuses - switch (status) { + switch (status.status) { case "active": return ProposalStatus.ACTIVE case "pending": - if (votesPercentage.lt(daoQuorum)) { + if (votesPercentage.lt(daoQuorum) && votingExpiresAt.isBefore(timeNow)) { return ProposalStatus.NO_QUORUM } return ProposalStatus.PENDING From 8cbb96c81cffd07a0861d1ef21d480df734e2429 Mon Sep 17 00:00:00 2001 From: Ashutosh Kumar Date: Sat, 21 Dec 2024 10:03:49 +0530 Subject: [PATCH 36/36] onchain dao etherlink --- .../components/EvmDaoProposalList.tsx | 5 + .../components/EvmDaoSettingsModal.tsx | 2 +- .../components/EvmProposalCountdown.tsx | 11 +- .../components/EvmProposalDetail.tsx | 0 .../components/EvmProposalVoteDetail.tsx | 15 +- src/modules/etherlink/config.ts | 19 + .../EtherlinkDAO/EvmProposalDetailsPage.tsx | 325 ++++++++++++------ src/modules/etherlink/utils.ts | 321 ++++++++++++++++- .../etherlinkDAO/hooks/useEvmProposalOps.tsx | 76 +++- src/services/wagmi/context.tsx | 106 +++++- 10 files changed, 730 insertions(+), 150 deletions(-) delete mode 100644 src/modules/etherlink/components/EvmProposalDetail.tsx diff --git a/src/modules/etherlink/components/EvmDaoProposalList.tsx b/src/modules/etherlink/components/EvmDaoProposalList.tsx index 981ae24c..50176d8e 100644 --- a/src/modules/etherlink/components/EvmDaoProposalList.tsx +++ b/src/modules/etherlink/components/EvmDaoProposalList.tsx @@ -45,6 +45,11 @@ export const EvmDaoProposalList: React.FC = ({ proposals, showFullList = const [isLoading, setIsLoading] = useState(false) console.log("EvmDaoProposalList", proposals) + console.log( + "EvmDaoProposalListX", + proposals?.filter((p: any) => p.proposalData?.length > 0).map((p: any) => p.type) + ) + const pageCount = Math.ceil(proposals ? proposals.length / offsetLimit : 0) // Invoke when user click to request another page. diff --git a/src/modules/etherlink/components/EvmDaoSettingsModal.tsx b/src/modules/etherlink/components/EvmDaoSettingsModal.tsx index 0f9e6d70..cb4016e6 100644 --- a/src/modules/etherlink/components/EvmDaoSettingsModal.tsx +++ b/src/modules/etherlink/components/EvmDaoSettingsModal.tsx @@ -90,7 +90,7 @@ export const EvmDaoSettingModal: React.FC<{ value: daoSelected?.votingDelay }, { - key: "Execution Delay (minutes)", + key: "Execution Delay (seconds)", value: daoSelected?.executionDelay } ] diff --git a/src/modules/etherlink/components/EvmProposalCountdown.tsx b/src/modules/etherlink/components/EvmProposalCountdown.tsx index 8cfb7e07..1a92bbee 100644 --- a/src/modules/etherlink/components/EvmProposalCountdown.tsx +++ b/src/modules/etherlink/components/EvmProposalCountdown.tsx @@ -6,6 +6,7 @@ import dayjs from "dayjs" import React, { useContext, useEffect, useMemo, useState } from "react" import { EtherlinkContext } from "services/wagmi/context" import { GridContainer } from "modules/common/GridContainer" +import { ProposalStatus } from "services/services/dao/mappers/proposal/types" interface TimeLeft { days: number @@ -30,8 +31,12 @@ export const EvmProposalCountdown = () => { return "Time left to vote" } + if (daoProposalSelected?.status === ProposalStatus.PASSED) { + return "Execution available in" + } + return "Voting concluded" - }, [votingStartTimestamp, votingExpiresAt]) + }, [votingStartTimestamp, votingExpiresAt, daoProposalSelected?.status]) useEffect(() => { const calculateTimeLeft = () => { @@ -88,8 +93,8 @@ export const EvmProposalCountdown = () => { ) return ( - - + + {timerLabel} diff --git a/src/modules/etherlink/components/EvmProposalDetail.tsx b/src/modules/etherlink/components/EvmProposalDetail.tsx deleted file mode 100644 index e69de29b..00000000 diff --git a/src/modules/etherlink/components/EvmProposalVoteDetail.tsx b/src/modules/etherlink/components/EvmProposalVoteDetail.tsx index 5030389c..e77c7d68 100644 --- a/src/modules/etherlink/components/EvmProposalVoteDetail.tsx +++ b/src/modules/etherlink/components/EvmProposalVoteDetail.tsx @@ -3,7 +3,6 @@ import React, { useContext, useEffect, useMemo, useState } from "react" import { Button, Grid, styled, Theme, Typography, useMediaQuery, useTheme } from "@material-ui/core" import { GridContainer } from "modules/common/GridContainer" -import { VotesDialog } from "modules/lite/explorer/components/VotesDialog" import { Poll } from "models/Polls" import { Choice } from "models/Choice" import ProgressBar from "react-customizable-progressbar" @@ -11,11 +10,10 @@ import ProgressBar from "react-customizable-progressbar" import { useTezos } from "services/beacon/hooks/useTezos" import { getTurnoutValue } from "services/utils/utils" import { useTokenDelegationSupported } from "services/contracts/token/hooks/useTokenDelegationSupported" -import { DownloadCsvFile } from "modules/lite/explorer/components/DownloadCsvFile" import { EtherlinkContext } from "services/wagmi/context" import { LinearProgress } from "components/ui/LinearProgress" -import { formatNumber } from "modules/explorer/utils/FormatNumber" import { useEvmDaoOps } from "services/contracts/etherlinkDAO/hooks/useEvmDaoOps" +import { EVM_PROPOSAL_CHOICES } from "../config" const Container = styled(Grid)(({ theme }) => ({ background: theme.palette.primary.main, @@ -93,12 +91,11 @@ const HistoryValue = styled(Typography)({ export const EvmProposalVoteDetail: React.FC<{ poll: Poll | undefined - choices: Choice[] token: any -}> = ({ poll, choices, token }) => { +}> = ({ poll, token }) => { const theme = useTheme() const isMobileSmall = useMediaQuery(theme.breakpoints.down("xs")) - + const choices = EVM_PROPOSAL_CHOICES const { network } = useTezos() const [turnout, setTurnout] = useState() const [votes, setVotes] = useState([]) @@ -122,8 +119,6 @@ export const EvmProposalVoteDetail: React.FC<{ // setVotes(choices.filter(elem => elem.walletAddresses.length > 0)) } - console.log({ showProposalVoterList }) - useMemo(async () => { if (token && tokenData) { const value = await getTurnoutValue( @@ -139,7 +134,7 @@ export const EvmProposalVoteDetail: React.FC<{ } }, [poll, network, token, tokenData, totalVoteCount]) - const votesQuorumPercentage = 50 + const votesQuorumPercentage = daoProposalSelected?.votesWeightPercentage console.log({ daoProposalSelected }) @@ -278,7 +273,7 @@ export const EvmProposalVoteDetail: React.FC<{ /> */} - + {/* Quorum */} diff --git a/src/modules/etherlink/config.ts b/src/modules/etherlink/config.ts index d84e21ab..9d10dbb7 100644 --- a/src/modules/etherlink/config.ts +++ b/src/modules/etherlink/config.ts @@ -100,44 +100,63 @@ export const EvmProposalOptions = [ } ] +// TODO: Ensure tags are unique export const proposalInterfaces = [ { + tags: ["registry"], interface: ["function editRegistry(string key, string Value)"], name: "editRegistry" }, { + tags: ["token"], interface: ["function mint(address to, uint256 amount)"], name: "mint" }, { + tags: ["token"], interface: ["function burn(address from, uint256 amount)"], name: "burn" }, { + tags: ["transfer"], interface: ["function transferETH(address to, uint256 amount)"], name: "transferETH" }, { + tags: ["token", "mint", "burn"], interface: ["function transferERC20(address token, address to, uint256 amount)"], name: "transferERC20" }, { + tags: ["token"], interface: ["function transferERC721(address token, address to, uint256 tokenId)"], name: "transferERC721" }, { + tags: ["quorum"], + label: "Update Quorum", + unit: "%", interface: ["function updateQuorumNumerator(uint256 newQuorumNumerator)"], name: "updateQuorumNumerator" }, { + tags: ["voting delay"], + label: "Update Voting Delay", + unit: "seconds", interface: ["function setVotingDelay(uint256 newVotingDelay)"], name: "setVotingDelay" }, { + tags: ["voting period"], + label: "Update Voting Period", + unit: "seconds", interface: ["function setVotingPeriod(uint256 newVotingPeriod)"], name: "setVotingPeriod" }, { + tags: ["proposal threshold"], + label: "Update Proposal Threshold", + unit: "tokens", interface: ["function setProposalThreshold(uint256 newProposalThreshold)"], name: "setProposalThreshold" } diff --git a/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx b/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx index 8a536eab..5a8c8a3c 100644 --- a/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx +++ b/src/modules/etherlink/explorer/EtherlinkDAO/EvmProposalDetailsPage.tsx @@ -1,5 +1,5 @@ import { GridContainer } from "modules/common/GridContainer" -import { Button, Grid, Typography, useMediaQuery, useTheme } from "@mui/material" +import { Button, Grid, TableRow, TableBody, Table, Typography, useMediaQuery, useTheme, TableCell } from "@mui/material" import { PageContainer } from "components/ui/DaoCreator" import { useContext, useEffect, useState } from "react" import { useParams } from "react-router-dom" @@ -7,21 +7,148 @@ import { EtherlinkContext } from "services/wagmi/context" import { EvmProposalDetailCard } from "modules/etherlink/components/EvmProposalDetailCard" import { EvmProposalVoteDetail } from "modules/etherlink/components/EvmProposalVoteDetail" import { EvmProposalCountdown } from "modules/etherlink/components/EvmProposalCountdown" -import { EVM_PROPOSAL_CHOICES } from "modules/etherlink/config" import { EvmProposalVoterList } from "modules/etherlink/components/EvmProposalVoterList" import { ThumbDownAlt } from "@mui/icons-material" import { ThumbUpAlt } from "@mui/icons-material" import { useNotification } from "modules/common/hooks/useNotification" import { useEvmProposalOps } from "services/contracts/etherlinkDAO/hooks/useEvmProposalOps" +import { ProposalStatus } from "services/services/dao/mappers/proposal/types" -export const EvmProposalDetailsPage = () => { +const RenderProposalAction = () => { + const { daoProposalSelected } = useContext(EtherlinkContext) const [isCastingVote, setIsCastingVote] = useState(false) const openNotification = useNotification() + const { castVote, queueForExecution, executeProposal } = useEvmProposalOps() + + if (daoProposalSelected?.status === ProposalStatus.PASSED) { + return ( + + + + ) + } + + if (daoProposalSelected?.status === ProposalStatus.EXECUTABLE) { + return ( + + + + ) + } + + if (daoProposalSelected?.status === ProposalStatus.EXECUTED) { + return ( + + + + ) + } + + if (daoProposalSelected?.status === ProposalStatus.ACTIVE) { + return ( + <> + + + + + + + + + ) + } + + return ( + + + Proposal is not active +
+ (No Quorum) +
+
+ ) +} + +export const EvmProposalDetailsPage = () => { const params = useParams() as { proposalId: string } const proposalId = params?.proposalId const { daoSelected, daoProposalSelected, selectDaoProposal } = useContext(EtherlinkContext) - const { castVote } = useEvmProposalOps() const theme = useTheme() const isMobileSmall = useMediaQuery(theme.breakpoints.down("sm")) @@ -30,8 +157,6 @@ export const EvmProposalDetailsPage = () => { selectDaoProposal(proposalId) }, [proposalId, selectDaoProposal]) - const choices = EVM_PROPOSAL_CHOICES - return (
@@ -39,111 +164,97 @@ export const EvmProposalDetailsPage = () => { - - - - - - - - - - - {choices && choices.length > 0 ? ( - - - {/* {[choices].map((choice, index) => { - return ( - {}} - /> - ) - })} */} - - {/* {poll?.isActive === ProposalStatus.ACTIVE ? ( - - ) : null} */} - - ) : null} - + + - - {/* {poll && poll !== undefined ? ( - - ) : null} */} - + + + - + + + + + + Proposal Data + + + {daoProposalSelected?.proposalData?.map( + ({ parameter, value }: { parameter: string; value: string }, idx: number) => { + return ( + + + + + + Parameter + + + {parameter} + + + + + Value + + + {value} + + + +
+
+ ) + } + )} +
+
+
) } + +const UnusedBlock = ({ choices, isMobileSmall }: { choices: any; isMobileSmall: boolean }) => ( + + {choices && choices.length > 0 ? ( + + + {/* {[choices].map((choice, index) => { + return ( + {}} + /> + ) + })} */} + + {/* {poll?.isActive === ProposalStatus.ACTIVE ? ( + + ) : null} */} + + ) : null} + +) diff --git a/src/modules/etherlink/utils.ts b/src/modules/etherlink/utils.ts index 11c96800..d6d1f5a9 100644 --- a/src/modules/etherlink/utils.ts +++ b/src/modules/etherlink/utils.ts @@ -1,7 +1,324 @@ +import { ethers, FunctionFragment } from "ethers" +import { proposalInterfaces } from "./config" + export const isInvalidEvmAddress = (address: string) => { - return true + return !ethers.isAddress(address) } export const validateEvmTokenAddress = (address: string) => { - return true + return ethers.isAddress(address) +} + +export const getCallDataFromBytes = (bytes: any) => { + const cdBytes = bytes.toUint8Array() + const hexString = Array.from(cdBytes) + .map((byte: unknown) => (byte as number).toString(16).padStart(2, "0")) + .join("") + return `0x${hexString}` +} + +export function parseTransactionHash(input: string): string { + // Equivalent to input.substring(2, input.length - 1) + input = input.substring(2, input.length - 1) + + const byteValues: number[] = [] + + for (let i = 0; i < input.length; i++) { + if (input[i] === "\\" && input[i + 1] === "x") { + // Extract the two hex characters following '\x' + const hexValue = input.substring(i + 2, i + 4) + byteValues.push(parseInt(hexValue, 16)) + i += 3 // Skip past the processed '\xNN' sequence + } else { + // Add ASCII code for literal characters + byteValues.push(input.charCodeAt(i)) + } + } + + // Convert bytes to hex string with zero-padding + const hexString = byteValues.map(byte => byte.toString(16).padStart(2, "0")).join("") + + return hexString +} + +export const getCallDataForProposal = ( + proposalType: + | "quorum" + | "voting delay" + | "voting period" + | "proposal threshold" + | "quorumNumerator" + | "votingDelay" + | "votingPeriod" + | "proposalThreshold", + { + title, + description, + externalResource + }: { + title: string + description: string + externalResource: string + }, + value: any +) => { + let ifaceDef, iface: any, encodedData: any + + if (["quorum", "quorumNumerator"].includes(proposalType)) { + ifaceDef = proposalInterfaces.find(p => p.name === "updateQuorumNumerator") + if (!ifaceDef) return + iface = new ethers.Interface(ifaceDef.interface) + encodedData = iface.encodeFunctionData(ifaceDef.name, [value]) + } + if (["voting delay", "votingDelay"].includes(proposalType)) { + ifaceDef = proposalInterfaces.find(p => p.name === "setVotingDelay") + if (!ifaceDef) return + iface = new ethers.Interface(ifaceDef.interface) + encodedData = iface.encodeFunctionData(ifaceDef.name, [value]) + } + if (["voting period", "votingPeriod"].includes(proposalType)) { + ifaceDef = proposalInterfaces.find(p => p.name === "setVotingPeriod") + if (!ifaceDef) return + iface = new ethers.Interface(ifaceDef.interface) + encodedData = iface.encodeFunctionData(ifaceDef.name, [value]) + } + if (["proposal threshold", "proposalThreshold"].includes(proposalType)) { + ifaceDef = proposalInterfaces.find(p => p.name === "setProposalThreshold") + if (!ifaceDef) return + iface = new ethers.Interface(ifaceDef.interface) + encodedData = iface.encodeFunctionData(ifaceDef.name, [value]) + } + return encodedData +} + +export function decodeCalldataWithEthers(functionAbi: string, callDataHex: string, isRetry = false): any { + // try { + // const callDataHexValue = !callDataHex?.startsWith("0x") ? `0x${callDataHex}` : callDataHex + // const selector = callDataHexValue.slice(0, 10) // "0xa9059cbb" + // console.log("decodeCalldataWithEthers:Function Selector:", selector) + + // const paramTypes = ["address", "uint256", "uint8"] + // const argsData = "0x" + callDataHexValue.slice(10) + // console.log("decodeCalldataWithEthers:Args Data:", argsData) + + // const decodedArgs = ethers.AbiCoder.defaultAbiCoder().decode(paramTypes, argsData) + // console.log("decodeCalldataWithEthers:Decoded Args:", decodedArgs) + + // return { decoded: [], functionName: "", decodedData: [] } + // } catch (error) { + // console.log("error:decodeCalldataWithEthers", functionAbi, callDataHex, error) + // return { decoded: [], functionName: "", decodedData: [] } + // } + + const callDataHexValue = callDataHex.startsWith("0x") ? callDataHex : `0x${callDataHex}` + + try { + const iface = new ethers.Interface([functionAbi]) + const decoded = iface.decodeFunctionData(functionAbi, callDataHexValue) + const functionName = iface.getFunction(functionAbi)?.name + return { decoded, functionName, decodedData: convertBigIntToString(decoded) } + } catch (error) { + if (isRetry) { + console.log("error:decodeCalldataWithEthers", { + functionAbi, + callDataHexValue, + error + }) + return { decoded: [], functionName: "", decodedData: [] } + } + + return decodeCalldataWithEthers(functionAbi, callDataHex, true) + } +} + +// TODO: Remove this function later +export function decodeFunctionParameters(functionAbi: FunctionFragment | string, hexString: string): any[] { + if (typeof functionAbi === "string") { + functionAbi = FunctionFragment.from(functionAbi) + } + + // Utility function to convert hex string to Uint8Array + const hexToBytes = (hex: string): Uint8Array => { + return ethers.getBytes(hex) + } + + // Utility function to convert a subset of bytes to BigInt + const bytesToBigInt = (bytes: Uint8Array): bigint => { + return BigInt("0x" + Buffer.from(bytes).toString("hex")) + } + + // Convert the hex string to bytes + const dataBytes: Uint8Array = hexToBytes(hexString) + + // Remove the first 4 bytes (function selector) + const dataWithoutSelector: Uint8Array = dataBytes.slice(4) + + // Initialize decoding variables + let offset = 0 + const decodedParams: any[] = [] + + for (const param of functionAbi.inputs) { + const paramType = param.type + + if (paramType === "string") { + // String type decoding (dynamic) + + // Read the 32-byte offset + const paramOffsetBytes = dataWithoutSelector.slice(offset, offset + 32) + const paramOffset: bigint = bytesToBigInt(paramOffsetBytes) + const paramOffsetInt = Number(paramOffset) + + // Decode length of the string + const lengthBytes = dataWithoutSelector.slice(paramOffsetInt, paramOffsetInt + 32) + const length: bigint = bytesToBigInt(lengthBytes) + const lengthInt = Number(length) + + // Extract the actual string data + const stringBytes = dataWithoutSelector.slice(paramOffsetInt + 32, paramOffsetInt + 32 + lengthInt) + const decodedString = ethers.toUtf8String(stringBytes) + + decodedParams.push(decodedString) + } else if (paramType === "address") { + // Address type decoding (last 20 bytes of the 32-byte slot) + const addressBytes = dataWithoutSelector.slice(offset + 12, offset + 32) + const addressHex = ethers.hexlify(addressBytes) + const checksumAddress = ethers.getAddress(addressHex) + + decodedParams.push(checksumAddress) + } else if (paramType.startsWith("uint") || paramType.startsWith("int")) { + // Uint or Int type decoding (entire 32 bytes) + const uintBytes = dataWithoutSelector.slice(offset, offset + 32) + const uintValue = bytesToBigInt(uintBytes).toString() + + decodedParams.push(uintValue) + } else { + throw new Error(`Unsupported parameter type: ${paramType}`) + } + + // Move to the next 32-byte slot + offset += 32 + } + + return decodedParams +} + +export function convertBigIntToString(obj: unknown): unknown { + if (typeof obj === "bigint") { + return obj.toString() + } else if (Array.isArray(obj)) { + return obj.map(convertBigIntToString) + } else if (obj && typeof obj === "object") { + const newObj: Record = {} + for (const [key, value] of Object.entries(obj)) { + newObj[key] = convertBigIntToString(value) + } + return newObj + } + return obj +} + +export function decodeFunctionParametersLegacy(functionAbiString: string, hexString: string): any[] { + const functionAbi = FunctionFragment.from(functionAbiString) + console.log("functionAbi", functionAbi) + // Helper function to convert a hex string to a Uint8Array + function hexToBytes(hex: string): Uint8Array { + if (hex.startsWith("0x")) { + hex = hex.slice(2) + } + if (hex.length % 2 !== 0) { + hex = "0" + hex + } + const bytes = new Uint8Array(hex.length / 2) + for (let i = 0; i < bytes.length; i++) { + bytes[i] = parseInt(hex.substr(i * 2, 2), 16) + } + return bytes + } + + // Helper function to convert a Uint8Array to a BigInt + function bytesToBigInt(bytes: Uint8Array): bigint { + let value = BigInt(0) + for (let i = 0; i < bytes.length; i++) { + value = (value << BigInt(8)) + BigInt(bytes[i]) + } + return value + } + + // Helper function to convert a Uint8Array to a hex string + function bytesToHex(bytes: Uint8Array): string { + return Array.from(bytes) + .map(b => b.toString(16).padStart(2, "0")) + .join("") + } + + try { + // Convert the hex string to bytes + const dataBytes = hexToBytes(hexString) + + // Ensure the data is at least 4 bytes for the function selector + if (dataBytes.length < 4) { + throw new Error("Hex string is too short to contain a function selector.") + } + + // Remove the first 4 bytes (function selector) + const dataWithoutSelector = dataBytes.slice(4) + + // Initialize decoding variables + let offset = 0 + const decodedParams: any[] = [] + + for (const param of functionAbi.inputs) { + switch (param.type) { + case "string": { + // Decode the offset to the string data + const paramOffsetBytes = dataWithoutSelector.slice(offset, offset + 32) + const paramOffset = Number(bytesToBigInt(paramOffsetBytes)) + + // Decode the length of the string + const lengthBytes = dataWithoutSelector.slice(paramOffset, paramOffset + 32) + const length = Number(bytesToBigInt(lengthBytes)) + + // Extract the actual string data + const stringBytes = dataWithoutSelector.slice(paramOffset + 32, paramOffset + 32 + length) + const decoder = new TextDecoder() + const decodedString = decoder.decode(stringBytes) + + decodedParams.push(decodedString) + break + } + + case "address": { + // Decode the address (last 20 bytes of the 32-byte slot) + const addressBytes = dataWithoutSelector.slice(offset + 12, offset + 32) + const addressHex = "0x" + bytesToHex(addressBytes) + decodedParams.push(addressHex) + break + } + + default: + if (param.type.startsWith("uint")) { + // Decode unsigned integers (e.g., uint256) + const uintBytes = dataWithoutSelector.slice(offset, offset + 32) + const uintValue = bytesToHex(uintBytes) + // const uintValueHex = ethers.hexlify(uintBytes) + // const uintValueBigNumber = ethers.toNumber(uintValueHex) + // const uintValueBigNumberX = ethers.toNumber(uintBytes) + decodedParams.push({ + value: uintValue, + bytes: uintBytes + }) + } else { + throw new Error(`Unsupported parameter type: ${param.type}`) + } + } + + // Move to the next 32-byte slot + offset += 32 + } + + return decodedParams + } catch (error) { + console.log("error:decodeFunctionParametersLegacy", { functionAbiString, hexString, error }) + return [] + } } diff --git a/src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx b/src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx index 3b739e68..169953e5 100644 --- a/src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx +++ b/src/services/contracts/etherlinkDAO/hooks/useEvmProposalOps.tsx @@ -218,6 +218,7 @@ const useEvmProposalCreateZustantStore = create()( const payload = { daoConfig: { ...get().daoConfig, [type]: value } } as any // TODO: handle this within next handler console.log("setting dao config", type, value) + // TODO: Replace this with getCallDataForProposal let ifaceDef, iface: any, encodedData: any if (type === "quorumNumerator") { ifaceDef = proposalInterfaces.find(p => p.name === "updateQuorumNumerator") @@ -340,7 +341,7 @@ const useEvmProposalCreateZustantStore = create()( export const useEvmProposalOps = () => { const [isLoading, setIsLoading] = useState(false) const { etherlink } = useTezos() - const { daoSelected } = useContext(EtherlinkContext) + const { daoSelected, daoProposalSelected } = useContext(EtherlinkContext) const router = useHistory() const zustantStore = useEvmProposalCreateZustantStore() @@ -354,7 +355,38 @@ export const useEvmProposalOps = () => { return new ethers.Contract(daoSelected?.address, HbDaoAbi.abi, etherlink.signer) }, [daoSelected?.address, etherlink.signer]) - console.log("currentStep", currentStep, proposalType) + const getProposalExecutionMetadata = useCallback(() => { + if (!daoContract || !daoProposalSelected?.id || !daoSelected?.address) + return alert("No dao contract or proposal id") + + const concatenatedDescription = [ + daoProposalSelected.title, + daoProposalSelected.type, + daoProposalSelected.description, + daoProposalSelected.externalResource + ].join("0|||0") + + const encodedInput = ethers.toUtf8Bytes(concatenatedDescription) + const keccakHash = ethers.keccak256(encodedInput) + const hashHex = keccakHash + console.log(`queueForExecution: Keccak-256 hash: ${hashHex}`) + const callData = daoProposalSelected?.callDataPlain?.[0] + const expectedCallData = "0x06f3f9e6000000000000000000000000000000000000000000000000000000000000000f" + console.log(`queueForExecution: callData: ${callData}`, expectedCallData) + return { + calldata: [callData], + hashHex: hashHex + } + }, [ + daoContract, + daoProposalSelected?.callDataPlain, + daoProposalSelected.description, + daoProposalSelected.externalResource, + daoProposalSelected?.id, + daoProposalSelected.title, + daoProposalSelected.type, + daoSelected?.address + ]) const createProposal = useCallback( async (payload: Record) => { @@ -382,18 +414,35 @@ export const useEvmProposalOps = () => { [daoContract] ) - const executeProposal = useCallback( - async (proposalId: number) => { - if (!daoContract) return + const queueForExecution = useCallback(async () => { + if (!daoContract || !daoProposalSelected?.id || !daoSelected?.address) + return alert("No dao contract or proposal id") - const tx = await daoContract.execute(proposalId) - console.log("Execute transaction sent:", tx.hash) - const receipt = await tx.wait() - console.log("Execute transaction confirmed:", receipt) - return receipt - }, - [daoContract] - ) + const metadata = getProposalExecutionMetadata() + if (!metadata) return alert("Could not get proposal metadata") + console.log("proposalAction metadata", daoSelected?.address, metadata) + const tx = await daoContract.queue([daoSelected?.address], [0], metadata.calldata, metadata.hashHex) + console.log("Queue transaction sent:", tx.hash) + + const receipt = await tx.wait() + console.log("Queue transaction confirmed:", receipt) + + return receipt + }, [daoContract, daoProposalSelected?.id, daoSelected?.address, getProposalExecutionMetadata]) + + const executeProposal = useCallback(async () => { + if (!daoContract) return + + const metadata = getProposalExecutionMetadata() + if (!metadata) return alert("Could not get proposal metadata") + + const tx = await daoContract.execute([daoSelected?.address], [0], metadata.calldata, metadata.hashHex) + console.log("Execute transaction sent:", tx.hash) + + const receipt = await tx.wait() + console.log("Execute transaction confirmed:", receipt) + return receipt + }, [daoContract, daoSelected?.address, getProposalExecutionMetadata]) const nextStep = { text: isLoading ? "Please wait..." : "Next", @@ -494,6 +543,7 @@ export const useEvmProposalOps = () => { setIsLoading, createProposal, castVote, + queueForExecution, executeProposal, signer: etherlink?.signer, nextStep, diff --git a/src/services/wagmi/context.tsx b/src/services/wagmi/context.tsx index 9a10f9b2..534ccd12 100644 --- a/src/services/wagmi/context.tsx +++ b/src/services/wagmi/context.tsx @@ -12,6 +12,13 @@ import dayjs from "dayjs" import { ethers } from "ethers" import BigNumber from "bignumber.js" import { Timestamp } from "firebase/firestore" +import { + decodeCalldataWithEthers, + decodeFunctionParametersLegacy, + getCallDataFromBytes, + parseTransactionHash +} from "modules/etherlink/utils" +import { proposalInterfaces } from "modules/etherlink/config" interface EtherlinkType { isConnected: boolean @@ -67,9 +74,10 @@ const useEtherlinkDao = ({ network }: { network: string }) => { proposalThreshold: string totalSupply: string registry: Record - votingDuration: number - votingDelay: number + votingDuration: number // in minutes + votingDelay: number // in minutes quorum: number + executionDelay: number // in seconds } | null>(null) const [daoRegistryDetails, setDaoRegistryDetails] = useState<{ balance: string @@ -87,6 +95,11 @@ const useEtherlinkDao = ({ network }: { network: string }) => { }[] >([]) + console.log( + "AllCallData", + daoProposals?.map((x: any) => x.callDataPlain?.[0]) + ) + const [daoMembers, setDaoMembers] = useState([]) const { data: firestoreData, loading, fetchCollection } = useFirestoreStore() @@ -133,11 +146,14 @@ const useEtherlinkDao = ({ network }: { network: string }) => { .map(firebaseProposal => { const votesInFavor = new BigNumber(firebaseProposal?.inFavor) const votesAgainst = new BigNumber(firebaseProposal?.against) + const votesInFavorWeight = new BigNumber(firebaseProposal?.inFavor) const totalVotes = votesInFavor.plus(votesAgainst) const totalVoteCount = parseInt(firebaseProposal?.votesFor) + parseInt(firebaseProposal?.votesAgainst) const totalSupply = new BigNumber(daoSelected?.totalSupply ?? "1") const votesPercentage = totalVotes.div(totalSupply).times(100) + const daoMinimumQuorum = new BigNumber(daoSelected?.quorum ?? "0") + const daoTotalVotingWeight = new BigNumber(daoSelected?.totalSupply ?? "0") console.log("votesPercentage", firebaseProposal?.title, votesPercentage.toString()) const proposalCreatedAt = dayjs.unix(firebaseProposal.createdAt?.seconds as unknown as number) @@ -161,42 +177,70 @@ const useEtherlinkDao = ({ network }: { network: string }) => { .map(([status, timestamp]: [string, any]) => ({ status, timestamp: timestamp?.seconds as unknown as number, - timestamp_human: dayjs.unix(timestamp?.seconds as unknown as number).format("MMM DD, YYYY HH:mm:ss") + timestamp_human: dayjs.unix(timestamp?.seconds as unknown as number).format("MMM DD, YYYY hh:mm A") })) .sort((a, b) => b.timestamp - a.timestamp) statusHistoryMap.push({ status: "active", timestamp: activeStartTimestamp.unix(), - timestamp_human: activeStartTimestamp.format("MMM DD, YYYY HH:mm:ss") + timestamp_human: activeStartTimestamp.format("MMM DD, YYYY hh:mm A") }) - console.log({ - votesPercentage: votesPercentage.toFormat(2), - quorum: daoSelected?.quorum, - votingEndTimestamp, - timeNow - }) + if (votesInFavorWeight.div(daoTotalVotingWeight).times(100).gt(daoMinimumQuorum)) { + statusHistoryMap.push({ + status: "passed", + timestamp: votingEndTimestamp.unix(), + timestamp_human: votingEndTimestamp.format("MMM DD, YYYY hh:mm A") + }) + } + + const statusQueued = statusHistoryMap.find(x => x.status === "queued") + if (statusQueued) { + const executionDelayInSeconds = daoSelected?.executionDelay || 0 + const proposalExecutableAt = statusQueued.timestamp + executionDelayInSeconds + console.log("proposalExecutableAt", proposalExecutableAt, timeNow.unix()) + if (proposalExecutableAt < timeNow.unix()) { + statusHistoryMap.push({ + status: "executable", + timestamp: proposalExecutableAt, + timestamp_human: dayjs.unix(proposalExecutableAt).format("MMM DD, YYYY hh:mm A") + }) + } + } + if (votesPercentage.lt(daoSelected?.quorum) && votingEndTimestamp.isBefore(timeNow)) { statusHistoryMap.push({ status: "no quorum", timestamp: votingEndTimestamp.unix(), - timestamp_human: votingEndTimestamp.format("MMM DD, YYYY HH:mm") + timestamp_human: votingEndTimestamp.format("MMM DD, YYYY hh:mm A") }) } + console.log({ statusHistoryMap }) + + const callDatas = firebaseProposal?.callDatas + const callDataPlain = callDatas?.map((x: any) => getCallDataFromBytes(x)) + return { ...firebaseProposal, + callDataPlain, status: getStatusByHistory(statusHistoryMap, { votesPercentage, votingExpiresAt, activeStartTimestamp, - daoQuorum: daoSelected?.quorum + daoQuorum: daoSelected?.quorum, + executionDelayInSeconds: daoSelected?.executionDelay }), + proposalData: [], statusHistoryMap: statusHistoryMap.sort((a, b) => b.timestamp - a.timestamp), votingStartTimestamp: activeStartTimestamp, votingExpiresAt: votingExpiresAt, totalVotes: totalVotes, - totalVoteCount + totalVoteCount, + votesWeightPercentage: Number(votesPercentage.toFixed(2)), + txHash: firebaseProposal?.executionHash + ? `https://testnet.explorer.etherlink.com/tx/0x${parseTransactionHash(firebaseProposal?.executionHash)}` + : "" } }) ) @@ -252,6 +296,31 @@ const useEtherlinkDao = ({ network }: { network: string }) => { selectDaoProposal: (proposalId: string) => { const proposal = daoProposals.find((proposal: any) => proposal.id === proposalId) if (proposal) { + const proposalInterface = proposalInterfaces.find((x: any) => { + let fbType = proposal?.type?.toLowerCase() + if (fbType?.startsWith("mint")) fbType = "mint" + if (fbType?.startsWith("burn")) fbType = "burn" + return x.tags?.includes(fbType) + }) + const functionAbi = proposalInterface?.interface?.[0] as string + if (!functionAbi) return [] + + const proposalData = proposalInterface + ? proposal?.callDataPlain?.map((callData: any) => { + const formattedCallData = callData.startsWith("0x") ? callData : `0x${callData}` + const decodedDataPair = decodeCalldataWithEthers(functionAbi, formattedCallData) + const decodedDataPairLegacy = decodeFunctionParametersLegacy(functionAbi, formattedCallData) + const functionName = decodedDataPair?.functionName + const functionParams = decodedDataPair?.decodedData + const proposalInterface = proposalInterfaces.find((x: any) => x.name === functionName) + + const label = proposalInterface?.label + console.log("decodedDataPair", decodedDataPair, functionName, functionParams) + console.log("decodedDataPairLegacy", decodedDataPairLegacy) + return { parameter: label || functionName, value: functionParams.join(", ") } + }) + : [] + proposal.proposalData = proposalData setDaoProposalSelected(proposal) } }, @@ -274,12 +343,14 @@ const getStatusByHistory = ( votesPercentage, votingExpiresAt, activeStartTimestamp, - daoQuorum + daoQuorum, + executionDelayInSeconds }: { votesPercentage: BigNumber votingExpiresAt: dayjs.Dayjs activeStartTimestamp: dayjs.Dayjs daoQuorum: number + executionDelayInSeconds: number } ) => { const timeNow = dayjs() @@ -295,11 +366,16 @@ const getStatusByHistory = ( return maxStatus }) + console.log("getStatusByHistory", { status, history }) if (activeStartTimestamp.isAfter(timeNow) && votingExpiresAt.isBefore(timeNow)) { return ProposalStatus.ACTIVE } // TODO: @ashutoshpw, handle more statuses switch (status.status) { + case "queued": + return ProposalStatus.PASSED + case "passed": + return ProposalStatus.PASSED case "active": return ProposalStatus.ACTIVE case "pending": @@ -311,6 +387,8 @@ const getStatusByHistory = ( return ProposalStatus.REJECTED case "accepted": return ProposalStatus.ACTIVE + case "executable": + return ProposalStatus.EXECUTABLE case "executed": return ProposalStatus.EXECUTED default: