diff --git a/asset-manifest.json b/asset-manifest.json index d213f0bc8..5c4d72769 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -7,8 +7,8 @@ "static/js/2.46aee897.chunk.js": "/static/js/2.46aee897.chunk.js", "static/js/2.46aee897.chunk.js.map": "/static/js/2.46aee897.chunk.js.map", "main.css": "/static/css/main.1369a069.chunk.css", - "main.js": "/static/js/main.79313368.chunk.js", - "main.js.map": "/static/js/main.79313368.chunk.js.map", + "main.js": "/static/js/main.a51842c6.chunk.js", + "main.js.map": "/static/js/main.a51842c6.chunk.js.map", "runtime-main.js": "/static/js/runtime-main.b2531083.js", "runtime-main.js.map": "/static/js/runtime-main.b2531083.js.map", "static/css/5.7fc9bc2b.chunk.css": "/static/css/5.7fc9bc2b.chunk.css", @@ -75,6 +75,6 @@ "static/css/5.7fc9bc2b.chunk.css", "static/js/5.dfc4a0aa.chunk.js", "static/css/main.1369a069.chunk.css", - "static/js/main.79313368.chunk.js" + "static/js/main.a51842c6.chunk.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index 445602f0c..18a0483bb 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -Tribute
\ No newline at end of file +Tribute
\ No newline at end of file diff --git a/static/js/main.79313368.chunk.js b/static/js/main.79313368.chunk.js deleted file mode 100644 index 018a223c0..000000000 --- a/static/js/main.79313368.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this["webpackJsonptribute-ui"]=this["webpackJsonptribute-ui"]||[]).push([[3],{104:function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var r=n(1),a=n(212);function c(){return Object(r.useContext)(a.a)}},106:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var r=n(0);function a(){return Object(r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true","data-icon":"times","data-prefix":"fal",viewBox:"0 0 320 512",children:Object(r.jsx)("path",{fill:"currentColor",d:"M193.94 256L296.5 153.44l21.15-21.15c3.12-3.12 3.12-8.19 0-11.31l-22.63-22.63c-3.12-3.12-8.19-3.12-11.31 0L160 222.06 36.29 98.34c-3.12-3.12-8.19-3.12-11.31 0L2.34 120.97c-3.12 3.12-3.12 8.19 0 11.31L126.06 256 2.34 379.71c-3.12 3.12-3.12 8.19 0 11.31l22.63 22.63c3.12 3.12 8.19 3.12 11.31 0L160 289.94 262.56 392.5l21.15 21.15c3.12 3.12 8.19 3.12 11.31 0l22.63-22.63c3.12-3.12 3.12-8.19 0-11.31L193.94 256z"})})}},11:function(e,t,n){"use strict";(function(e){n.d(t,"m",(function(){return V})),n.d(t,"C",(function(){return W})),n.d(t,"g",(function(){return Y})),n.d(t,"s",(function(){return H})),n.d(t,"c",(function(){return K})),n.d(t,"d",(function(){return z})),n.d(t,"k",(function(){return q})),n.d(t,"o",(function(){return J})),n.d(t,"n",(function(){return $})),n.d(t,"J",(function(){return Z})),n.d(t,"j",(function(){return ee})),n.d(t,"h",(function(){return te})),n.d(t,"b",(function(){return ne})),n.d(t,"I",(function(){return re})),n.d(t,"e",(function(){return ae})),n.d(t,"B",(function(){return ce})),n.d(t,"v",(function(){return se})),n.d(t,"q",(function(){return oe})),n.d(t,"A",(function(){return ie})),n.d(t,"t",(function(){return ue})),n.d(t,"i",(function(){return de})),n.d(t,"a",(function(){return le})),n.d(t,"y",(function(){return be})),n.d(t,"f",(function(){return je})),n.d(t,"F",(function(){return fe})),n.d(t,"l",(function(){return Oe})),n.d(t,"G",(function(){return pe})),n.d(t,"z",(function(){return he})),n.d(t,"x",(function(){return me})),n.d(t,"u",(function(){return ve})),n.d(t,"E",(function(){return xe})),n.d(t,"H",(function(){return Ne})),n.d(t,"w",(function(){return ge})),n.d(t,"p",(function(){return Ee})),n.d(t,"D",(function(){return Ae})),n.d(t,"r",(function(){return we}));var r,a,c,s,o,i,u,d,l,b,j,f,O,p,h,m,v,x,N,g,E,A,w=n(8),I=n(436),y=n(135),C=n(269),D=n(464);Object(I.config)({path:Object(C.resolve)(e,"../.env")});var S=Object({NODE_ENV:"production",PUBLIC_URL:"",WDS_SOCKET_HOST:void 0,WDS_SOCKET_PATH:void 0,WDS_SOCKET_PORT:void 0,FAST_REFRESH:!0,REACT_APP_COUPON_API_URL:"https://coupon.dev.openlaw.io",REACT_APP_SNAPSHOT_SPACE:"tribute",REACT_APP_DAO_REGISTRY_CONTRACT_ADDRESS:"0xf5af0d9c3e4091a48925902eaAB2982e44E7a4C5",REACT_APP_SNAPSHOT_HUB_API_URL:"https://snapshot-hub-erc712.dev.thelao.io",REACT_APP_ENVIRONMENT:"development",REACT_APP_INFURA_PROJECT_ID_DEV:"d77d55afab36442eb530fac5e2a27ed1",REACT_APP_MULTICALL_CONTRACT_ADDRESS:"0xde0Ca6340FDE1906B3c4c1A2bdEE060933e4b253",REACT_APP_GRAPH_API_URL:"https://api.thegraph.com/subgraphs/name/openlawteam/tribute-dev"}),_=S.REACT_APP_DAO_REGISTRY_CONTRACT_ADDRESS,k=S.REACT_APP_DEFAULT_CHAIN_NAME_LOCAL,T=S.REACT_APP_ENVIRONMENT,R=S.REACT_APP_GRAPH_API_URL,P=S.REACT_APP_INFURA_PROJECT_ID_DEV,F=S.REACT_APP_INFURA_PROJECT_ID_LOCAL,L=S.REACT_APP_INFURA_PROJECT_ID_PROD,M=S.REACT_APP_MULTICALL_CONTRACT_ADDRESS,B=S.REACT_APP_SNAPSHOT_HUB_API_URL,G=S.REACT_APP_COUPON_API_URL,U=S.REACT_APP_SNAPSHOT_SPACE,V=T,W="localhost"===V?"/snapshot-hub":B,Y=G,H=R,K={MAINNET:1,ROPSTEN:3,RINKEBY:4,GOERLI:5,KOVAN:42,GANACHE:1337},z=(r={},Object(w.a)(r,K.MAINNET,"Main Ethereum Network"),Object(w.a)(r,K.ROPSTEN,"Ropsten Test Network"),Object(w.a)(r,K.RINKEBY,"Rinkeby Test Network"),Object(w.a)(r,K.GOERLI,"G\xf6rli Test Network"),Object(w.a)(r,K.KOVAN,"Kovan Test Network"),Object(w.a)(r,K.GANACHE,"Ganache Test Network"),r),q="production"===T?K.MAINNET:"development"===T?K.RINKEBY:k?K[k]:K.GANACHE,J=(a={},Object(w.a)(a,K.MAINNET,"https://etherscan.io"),Object(w.a)(a,K.ROPSTEN,"https://ropsten.etherscan.io"),Object(w.a)(a,K.RINKEBY,"https://rinkeby.etherscan.io"),Object(w.a)(a,K.GOERLI,"https://goerli.etherscan.io"),Object(w.a)(a,K.KOVAN,"https://kovan.etherscan.io"),a),Q=(c={},Object(w.a)(c,K.MAINNET,"wss://mainnet.infura.io/ws/v3"),Object(w.a)(c,K.ROPSTEN,"wss://ropsten.infura.io/ws/v3"),Object(w.a)(c,K.RINKEBY,"wss://rinkeby.infura.io/ws/v3"),Object(w.a)(c,K.GOERLI,"wss://goerli.infura.io/ws/v3"),Object(w.a)(c,K.KOVAN,"wss://kovan.infura.io/ws/v3"),c),X="production"===T?L:"development"===T?P:F,$=Q[q]?"".concat(Q[q],"/").concat(X):q===K.GANACHE?"ws://127.0.0.1:7545":"",Z={injected:{display:{name:"MetaMask",description:"Connect with the provider in your Browser"},package:null},walletconnect:{display:{name:"WalletConnect",description:"Connect with your mobile wallet"},package:D.a,options:{infuraId:X,qrcodeModalOptions:{mobileLinks:Object(y.isMobile)()?["rainbow","metamask","argent","trust"]:[]}}}},ee=_,te=(s={},Object(w.a)(s,K.MAINNET,""),Object(w.a)(s,K.ROPSTEN,""),Object(w.a)(s,K.RINKEBY,"0x392E9D1c7FaE6C62853e089466FFAE3F0a93c680"),Object(w.a)(s,K.GOERLI,""),Object(w.a)(s,K.KOVAN,""),Object(w.a)(s,K.GANACHE,"0x6d92a8E4aB80adcBbFDA44ef69fe847f82def641"),s),ne=(o={},Object(w.a)(o,K.MAINNET,""),Object(w.a)(o,K.ROPSTEN,""),Object(w.a)(o,K.RINKEBY,"0x0d316BAa42a0538f2aAca3F08D368FE9C4A87A7A"),Object(w.a)(o,K.GOERLI,""),Object(w.a)(o,K.KOVAN,""),Object(w.a)(o,K.GANACHE,"0xcD1639FD072113CC86e15f65f1505C6D58Aa7412"),o),re=(i={},Object(w.a)(i,K.MAINNET,""),Object(w.a)(i,K.ROPSTEN,""),Object(w.a)(i,K.RINKEBY,"0xf0D4BC92F8aD06CC163B96459787Dd563aAFC1f7"),Object(w.a)(i,K.GOERLI,""),Object(w.a)(i,K.KOVAN,""),Object(w.a)(i,K.GANACHE,"0xcF34FFFBba648719DAe106202674949f1679772B"),u={},Object(w.a)(u,K.MAINNET,""),Object(w.a)(u,K.ROPSTEN,""),Object(w.a)(u,K.RINKEBY,"0x69Bd1bE55Fff22bE1d5468dFf1a6d0a184c520F7"),Object(w.a)(u,K.GOERLI,""),Object(w.a)(u,K.KOVAN,""),Object(w.a)(u,K.GANACHE,"0x862d71d6E9Be8a7495EfEBa6f2b657b00E629c95"),d={},Object(w.a)(d,K.MAINNET,""),Object(w.a)(d,K.ROPSTEN,""),Object(w.a)(d,K.RINKEBY,"0xc9415afc432CC56912f54682cC2Ea80ADdE1a89B"),Object(w.a)(d,K.GOERLI,""),Object(w.a)(d,K.KOVAN,""),Object(w.a)(d,K.GANACHE,"0xfB4E7C2FD8Ceb2757D2C4cE4749ebE326fc369D4"),d),ae=(l={},Object(w.a)(l,K.MAINNET,""),Object(w.a)(l,K.ROPSTEN,""),Object(w.a)(l,K.RINKEBY,"0x92866ac08edFEAA8C52dEF0c12926FA7E95df8fB"),Object(w.a)(l,K.GOERLI,""),Object(w.a)(l,K.KOVAN,""),Object(w.a)(l,K.GANACHE,"0x65CaCA9F2638Fb2B245E9694f00343F0b6CB6F77"),l),ce=(b={},Object(w.a)(b,K.MAINNET,""),Object(w.a)(b,K.ROPSTEN,""),Object(w.a)(b,K.RINKEBY,"0xD3C2cE38c905B9207e35D7EcE51c17b22EAb4afe"),Object(w.a)(b,K.GOERLI,""),Object(w.a)(b,K.KOVAN,""),Object(w.a)(b,K.GANACHE,"0x314C824Ea4586798DF8B46121E881Defa40CB47E"),b),se=(j={},Object(w.a)(j,K.MAINNET,""),Object(w.a)(j,K.ROPSTEN,""),Object(w.a)(j,K.RINKEBY,"0x03BE4284E9F3E7d1fd19cB0442713609105db7E7"),Object(w.a)(j,K.GOERLI,""),Object(w.a)(j,K.KOVAN,""),Object(w.a)(j,K.GANACHE,"0xeD025b5BA14b8f3A085057b9D7Baa13998343aA8"),j),oe=(f={},Object(w.a)(f,K.MAINNET,""),Object(w.a)(f,K.ROPSTEN,""),Object(w.a)(f,K.RINKEBY,"0xA007fc56f540670F6ba17FD2b3B931FC72A7820a"),Object(w.a)(f,K.GOERLI,""),Object(w.a)(f,K.KOVAN,""),Object(w.a)(f,K.GANACHE,"0x4a7A5946567672c577EaF2b866BCeBc177E455E8"),f),ie=(O={},Object(w.a)(O,K.MAINNET,""),Object(w.a)(O,K.ROPSTEN,""),Object(w.a)(O,K.RINKEBY,"0x6fA3f2BC09fB13091BF40C6920a9251B72348456"),Object(w.a)(O,K.GOERLI,""),Object(w.a)(O,K.KOVAN,""),Object(w.a)(O,K.GANACHE,"0x4e1Ccf6Bca8d14B670478d8C4e2aEc9f6277A7f5"),O),ue=(p={},Object(w.a)(p,K.MAINNET,""),Object(w.a)(p,K.ROPSTEN,""),Object(w.a)(p,K.RINKEBY,"0xf6F042cB61E409dbFE34A5fbC76Db334B7a93364"),Object(w.a)(p,K.GOERLI,""),Object(w.a)(p,K.KOVAN,""),Object(w.a)(p,K.GANACHE,"0x72a011Aa67F8214a146A162A99B322017ad763fD"),p),de=(h={},Object(w.a)(h,K.MAINNET,""),Object(w.a)(h,K.ROPSTEN,""),Object(w.a)(h,K.RINKEBY,"0x35B3babfB8FF455903f6e89cEaa83140e09495F9"),Object(w.a)(h,K.GOERLI,""),Object(w.a)(h,K.KOVAN,""),Object(w.a)(h,K.GANACHE,"0x4d4243f2d605282CBd27C8391f05b77316d1a561"),h),le=(m={},Object(w.a)(m,K.MAINNET,""),Object(w.a)(m,K.ROPSTEN,""),Object(w.a)(m,K.RINKEBY,"0xed65eD0c561E77597E4D8472be1b4b184c31Fde4"),Object(w.a)(m,K.GOERLI,""),Object(w.a)(m,K.KOVAN,""),Object(w.a)(m,K.GANACHE,"0xA8EA078cF1D3837a025329c46A4E0F441Cb2eE87"),m),be=(v={},Object(w.a)(v,K.MAINNET,""),Object(w.a)(v,K.ROPSTEN,""),Object(w.a)(v,K.RINKEBY,"0xc69DF0C3855A6CaBF0c5983bD504770E5BFA8e84"),Object(w.a)(v,K.GOERLI,""),Object(w.a)(v,K.KOVAN,""),Object(w.a)(v,K.GANACHE,"0x538a4f00d64d2597717cAAd4D01C963317e3Ae40"),v),je=(x={},Object(w.a)(x,K.MAINNET,""),Object(w.a)(x,K.ROPSTEN,""),Object(w.a)(x,K.RINKEBY,"0xb5935758c16B785d3749F20D65F5B501578dCb1c"),Object(w.a)(x,K.GOERLI,""),Object(w.a)(x,K.KOVAN,""),Object(w.a)(x,K.GANACHE,"0x9A2E533FBa58Ec8b0dA34438154C48E295C80576"),x),fe=(N={},Object(w.a)(N,K.MAINNET,""),Object(w.a)(N,K.ROPSTEN,""),Object(w.a)(N,K.RINKEBY,"0xD0dCB66d60f6EbF838e22423f58B01D6F7a60187"),Object(w.a)(N,K.GOERLI,""),Object(w.a)(N,K.KOVAN,""),Object(w.a)(N,K.GANACHE,"0xa7D723BFc4deC341da03E70Af4026B3926b1E8Db"),N),Oe=(g={},Object(w.a)(g,K.MAINNET,""),Object(w.a)(g,K.ROPSTEN,""),Object(w.a)(g,K.RINKEBY,"0xB54D48D8471839D670C0e24548A7CfEA78bB1879"),Object(w.a)(g,K.GOERLI,""),Object(w.a)(g,K.KOVAN,""),Object(w.a)(g,K.GANACHE,"0x6749b9151B654A77ddA3Fa8f2b259E0E592065F6"),g),pe=(E={},Object(w.a)(E,K.MAINNET,""),Object(w.a)(E,K.ROPSTEN,""),Object(w.a)(E,K.RINKEBY,"0x939Fd23C38496aB54fa4BD0b2ED535DE100f7d8F"),Object(w.a)(E,K.GOERLI,""),Object(w.a)(E,K.KOVAN,""),Object(w.a)(E,K.GANACHE,"0x4Df3729e7B952EBE6d18b52132D2A8af2F2D167A"),E),he=(A={},Object(w.a)(A,K.MAINNET,""),Object(w.a)(A,K.ROPSTEN,""),Object(w.a)(A,K.RINKEBY,"0xDfbe754ec9c2aA26ac2f429CfcEd819910eF5926"),Object(w.a)(A,K.GOERLI,""),Object(w.a)(A,K.KOVAN,""),Object(w.a)(A,K.GANACHE,"0xae02a075290D2efD74F0D3fE2DfE64831320855a"),A),me=M,ve="0x000000000000000000000000000000000000dead",xe="0x000000000000000000000000000000000000babe",Ne="0x00000000000000000000000000000000000FF1CE",ge="0x00000000000000000000000000000000DECAFBAD",Ee="0x0000000000000000000000000000000000000000",Ae=U,we="production"===T?1e4:5e3}).call(this,"/")},12:function(e,t,n){"use strict";function r(e,t){var n=void 0!==t?e.filter((function(e){return e!==t})):e;return n[Math.floor(Math.random()*n.length)]}n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return c})),n.d(t,"c",(function(){return s})),n.d(t,"d",(function(){return o})),n.d(t,"e",(function(){return i})),n.d(t,"f",(function(){return d})),n.d(t,"g",(function(){return l})),n.d(t,"h",(function(){return p})),n.d(t,"i",(function(){return O})),n.d(t,"j",(function(){return v})),n.d(t,"k",(function(){return x})),n.d(t,"l",(function(){return N.a}));var a=n(4);function c(){var e=function(){},t=window.__REACT_DEVTOOLS_GLOBAL_HOOK__;if("object"===typeof t)for(var n=0,r=Object.entries(t);n0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=e+1-t;return Object(m.a)(Array(n)).map((function(e,n){return t+n}))}var x=function(e){return e.toString().replace(/,/g,"")};var N=n(201);n(25)},136:function(e,t,n){"use strict";n.d(t,"a",(function(){return I})),n.d(t,"b",(function(){return T})),n.d(t,"c",(function(){return W})),n.d(t,"d",(function(){return K})),n.d(t,"e",(function(){return z}));var r=n(2),a=n.n(r),c=n(3),s=n(5),o=n(4),i=n(22),u=n(14),d=n(1),l=n(11),b=n(32),j=n(42),f=n(7),O=n(51),p=n(12),h=n(57),m=n(36),v=n(15),x=n(69),N=n(30),g=n(50),E=n(24),A=n(41),w=n(0);function I(e){var t,n=e.adapterName,r=e.proposal,I=r.daoProposalVotingAdapter,y=r.snapshotProposal,C=Object(d.useState)(f.f.STANDBY),D=Object(o.a)(C,2),S=D[0],_=D[1],k=Object(d.useState)(),T=Object(o.a)(k,2),R=T[0],P=T[1],F=Object(u.c)((function(e){var t;return null===(t=e.contracts.BankExtensionContract)||void 0===t?void 0:t.contractAddress})),L=Object(u.c)((function(e){var t;return null===(t=e.contracts.BankExtensionContract)||void 0===t?void 0:t.instance.methods})),M=Object(u.c)((function(e){var t;return null===(t=e.contracts.BankExtensionContract)||void 0===t?void 0:t.abi.find((function(e){return"getPriorAmount"===e.name}))})),B=Object(u.c)((function(e){var t;return null===(t=e.contracts.DaoRegistryContract)||void 0===t?void 0:t.contractAddress})),G=null===(t=Object(u.c)((function(e){var t;return null===(t=e.contracts.DaoRegistryContract)||void 0===t?void 0:t.abi})))||void 0===t?void 0:t.find((function(e){return"getMemberAddress"===e.name})),U=Object(u.c)((function(e){return e.contracts})),V=Object(v.f)(),W=V.account,Y=V.provider,H=V.web3Instance,K=Object(v.a)(),z=K.txEtherscanURL,q=K.txIsPromptOpen,J=K.txSend,Q=K.txStatus,X=Object(m.g)(),$=X.isDisabled,Z=X.openWhyDisabledModal,ee=X.WhyDisabledModal,te=Object(v.b)().fast,ne=null===I||void 0===I?void 0:I.getWeb3VotingAdapterContract().methods,re=S===f.f.AWAITING_CONFIRM||S===f.f.PENDING||Q===f.f.AWAITING_CONFIRM||Q===f.f.PENDING,ae=Q===f.f.FULFILLED&&S===f.f.FULFILLED,ce=re||ae||q;function se(){return(se=Object(s.a)(a.a.mark((function e(){var t,r,s,o,u,d,m,v,x,N,g,E,A,w,I,C,D,S,k,T,R,V,K;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,B){e.next=3;break}throw new Error("No DAO Registry address was found.");case 3:if(F){e.next=5;break}throw new Error("No Bank Extension address was found.");case 5:if(G){e.next=7;break}throw new Error("No ABI for `getMemberAddress` was found.");case 7:if(M){e.next=9;break}throw new Error("No ABI for `getPriorAmount` was found.");case 9:if(y){e.next=11;break}throw new Error("No Snapshot proposal was found.");case 11:if(y.votes){e.next=13;break}throw new Error("No Snapshot proposal votes Array was found.");case 13:if(ne){e.next=15;break}throw new Error('No "OffchainVotingContract" methods were found.');case 15:if(H){e.next=17;break}throw new Error("No Web3 instance was found.");case 17:return _(f.f.AWAITING_CONFIRM),r=y.idInDAO,s=y.msg.payload.snapshot.toString(),o=Object(b.d)(n,U),e.next=23,L.getPriorAmount(l.E,l.w,s).call();case 23:return u=e.sent,d=Object(p.j)(Number(u)-1,0).map((function(e){return[B,G,[e.toString()]]})),e.next=27,Object(b.j)({calls:d,web3Instance:H});case 27:return m=e.sent,v=m.map((function(e){return[F,M,[e,l.H,s]]})),e.next=31,Object(b.j)({calls:v,web3Instance:H});case 31:return x=e.sent,N=m.map((function(e,t){var n,a=Object.values((null===(n=y.votes)||void 0===n?void 0:n.find((function(t){return Object(p.i)(e)===Object(p.i)(Object.values(t)[0].msg.payload.metadata.memberAddress)})))||{})[0];return Object(i.createVote)({proposalId:r,sig:(null===a||void 0===a?void 0:a.sig)||"0x",timestamp:a?Number(a.msg.timestamp):0,voteYes:(null===a||void 0===a?void 0:a.msg.payload.choice)===i.VoteChoicesIndex.Yes,weight:a?x[t]:"0"})})),e.next=35,Object(i.prepareVoteResult)({actionId:o,chainId:l.k,daoAddress:B,votes:N});case 35:return g=e.sent,E=g.voteResultTree,A=g.result,w=E.getHexRoot(),I=A[A.length-1],e.next=42,ne.getBadNodeError(B,r,!0,w,s,0,I).call();case 42:if(C=e.sent,Number(C)===j.a.OK){e.next=45;break}throw new Error("Cannot submit off-chain voting result. Node has an error: ".concat(j.a[C],"."));case 45:return D=Object(i.getVoteResultRootDomainDefinition)(B,o,l.k),S=D.domain,k=D.types,T=JSON.stringify({domain:S,message:{root:w},primaryType:h.a,types:k}),e.next=49,Object(i.signMessage)(Y,W,T);case 49:return R=e.sent,e.next=52,Object(O.b)(w);case 52:if(e.t2=t=e.sent,e.t1=null===e.t2,e.t1){e.next=56;break}e.t1=void 0===t;case 56:if(!e.t1){e.next=60;break}e.t3=void 0,e.next=61;break;case 60:e.t3=t.merkle_root.length;case 61:if(e.t0=e.t3,e.t0){e.next=64;break}e.t0="";case 64:if(e.t4=e.t0,e.t4>0){e.next=69;break}return e.next=69,Object(O.g)({actionId:o,chainId:l.k,steps:A,merkleRoot:w,verifyingContract:B});case 69:return _(f.f.FULFILLED),V=[B,r,w,I,R],K=Object(c.a)({from:W||""},te?{gasPrice:te}:null),e.next=74,J("submitVoteResult",ne,V,K);case 74:e.next=80;break;case 76:e.prev=76,e.t5=e.catch(0),P(e.t5),_(f.f.REJECTED);case 80:case"end":return e.stop()}}),e,null,[[0,76]])})))).apply(this,arguments)}return Object(w.jsxs)(w.Fragment,{children:[Object(w.jsxs)("div",{children:[Object(w.jsx)("button",{className:"proposaldetails__button",disabled:$||ce,onClick:$||ce?function(){}:function(){return se.apply(this,arguments)},children:re?Object(w.jsx)(A.a,{}):ae?"Done":"Submit Vote Result"}),Object(w.jsx)(N.a,{error:R,renderText:"Something went wrong"}),ce&&Object(w.jsx)("div",{className:"form__submit-status-container",children:function(){if(Q===f.f.AWAITING_CONFIRM||S===f.f.AWAITING_CONFIRM)return"Awaiting your confirmation\u2026";switch(Q){case f.f.PENDING:return Object(w.jsxs)(w.Fragment,{children:[Object(w.jsx)(x.a,{intervalMs:2e3,messages:h.b,useFirstItemStart:!0,render:function(e){return Object(w.jsx)(E.a,{children:e},e)}}),Object(w.jsx)(g.a,{url:z,isPending:!0})]});case f.f.FULFILLED:return Object(w.jsxs)(w.Fragment,{children:[Object(w.jsx)("div",{children:"Result submitted!"}),Object(w.jsx)(g.a,{url:z})]});default:return null}}()}),$&&Object(w.jsx)("button",{className:"button--help-centered",onClick:Z,children:"Why is submitting disabled?"})]}),Object(w.jsx)(ee,{title:"Why is this disabled?"})]})}var y=n(8),C=n(9),D=n(46),S=C.a.FULFILLED,_=C.a.PENDING,k=C.a.REJECTED;function T(e){var t=e.adapterName,n=e.proposal,r=n.snapshotProposal,l=n.refetchProposalOrDraft,b=Object(d.useState)(),j=Object(o.a)(b,2),h=j[0],x=j[1],g=Object(d.useState)(),E=Object(o.a)(g,2),A=E[0],I=E[1],C=Object(d.useRef)({addressIsDelegatedMessage:"",alreadyVotedMessage:"",fetchingMembershipAtSnapshotMessage:"",noMembershipAtSnapshotMessage:"",undeterminedMembershipAtSnapshotMessage:""}),T=Object(u.c)((function(e){var t;return null===(t=e.connectedMember)||void 0===t?void 0:t.delegateKey})),R=Object(u.c)((function(e){var t;return null===(t=e.connectedMember)||void 0===t?void 0:t.isAddressDelegated})),P=Object(u.c)((function(e){var t;return null===(t=e.connectedMember)||void 0===t?void 0:t.memberAddress})),F=Object(v.f)().account,L=Object(D.h)(),M=L.signAndSendVote,B=L.voteDataStatus,G=Object(O.c)(null===r||void 0===r?void 0:r.votes,F||""),U=Object(m.g)(),V=U.isDisabled,W=U.openWhyDisabledModal,Y=U.setOtherDisabledReasons,H=U.WhyDisabledModal,K=Object(m.h)(P,null===r||void 0===r?void 0:r.msg.payload.snapshot),q=K.hasMembershipAtSnapshot,J=K.memberUnitsAtSnapshotError,Q=K.memberUnitsAtSnapshotStatus,X=null===r||void 0===r?void 0:r.msg.payload.snapshot,$=(null===r||void 0===r?void 0:r.idInDAO)||"",Z=(null===r||void 0===r?void 0:r.idInSnapshot)||"",ee=B===f.f.AWAITING_CONFIRM||B===f.f.PENDING,te=B===f.f.FULFILLED,ne=V||(ee||te),re=ee?h:void 0,ae=A||J;function ce(){return(ce=Object(s.a)(a.a.mark((function e(n){return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,$){e.next=3;break}throw new Error("No proposal hash was found.");case 3:if(Z){e.next=5;break}throw new Error("No proposal ID was found.");case 5:return x(i.VoteChoices[n]),e.next=8,M(Object(c.a)(Object(c.a)({},t?{adapterName:t}:void 0),{},{partialVoteData:{choice:n},proposalIdInDAO:$,proposalIdInSnapshot:Z}));case 8:return e.next=10,l();case 10:e.next=15;break;case 12:e.prev=12,e.t0=e.catch(0),I(e.t0);case 15:case"end":return e.stop()}}),e,null,[[0,12]])})))).apply(this,arguments)}function se(e,t){C.current=Object(c.a)(Object(c.a)({},C.current),{},Object(y.a)({},e,t))}return Object(d.useEffect)((function(){var e;T&&se("addressIsDelegatedMessage",R?(e=T,"Your member address is delegated to ".concat(Object(p.l)(e,7),". You must use that address to vote.")):""),se("alreadyVotedMessage",G?"You have already voted.":""),se("noMembershipAtSnapshotMessage",q||Q!==S?"":"You were not a member when the proposal was sponsored at snapshot ".concat(X,".")),se("fetchingMembershipAtSnapshotMessage",Q===_?"We are waiting on your membership status for when this proposal was sponsored at snapshot ".concat(X,"."):""),se("undeterminedMembershipAtSnapshotMessage",Q===k?"Something went wrong. Your membership status when this proposal was sponsored at snapshot ".concat(X," cannot be determined."):""),Y(Object.values(C.current))}),[T,q,R,Q,Y,X,G]),Object(w.jsxs)(w.Fragment,{children:[Object(w.jsx)(z,{onClick:ne?function(){}:function(e){return ce.apply(this,arguments)},buttonProps:{disabled:ne,"aria-disabled":ne},voteChosen:G,voteProgress:re}),V&&Object(w.jsx)("button",{className:"button--help-centered",onClick:W,children:"Why is voting disabled?"}),Object(w.jsx)(N.a,{error:ae,renderText:"Something went wrong"}),Object(w.jsx)(H,{title:"Why is voting disabled?"})]})}var R=n(59);function P(e){var t=e.countdownFrom,n=e.renderCountdownText,r=e.showDaysOnly,a=Object(p.f)(t),c=a.days,s=a.hours,o=a.minutes,i=a.seconds,u=null===n||void 0===n?void 0:n({days:c,formatTimePeriod:F,hours:s,minutes:o,seconds:i,showDaysOnly:r}),d=F;return u||(c>2&&r?"~".concat(c," days"):c>0?"".concat(d(c,"day")," : ").concat(d(s,"hr")," : ").concat(d(o,"min")):s>0?"".concat(d(s,"hr")," : ").concat(d(o,"min")):o>0?"".concat(d(o,"min")," : ").concat(d(i,"sec")):Object(w.jsx)("span",{className:"color-brightsalmon",children:d(i,"sec")}))}function F(e,t){var n=0===e||e>1?"".concat(t,"s"):t;return"".concat(e," ").concat(n)}function L(e){var t=e.endedLabel,n=e.endLabel,r=e.endPeriodMs,a=e.renderCountdownText,c=e.startLabel,s=e.startPeriodMs,i=Object(d.useState)(),u=Object(o.a)(i,2),l=u[0],b=u[1],j=new Date(s),f=new Date(r);return Object(d.useEffect)((function(){var e=setInterval((function(){b(new Date)}),1e3);return function(){clearInterval(e)}}),[]),l?l0)return"".concat(r(t,"day")," : ").concat(r(n,"hr"))}var U=Object(w.jsx)("span",{children:"Grace period:"}),V={duration:150};function W(e){var t=e.countdownGracePeriodEndMs,n=void 0===t?0:t,r=e.countdownGracePeriodStartMs,a=void 0===r?0:r,c=e.countdownVotingEndMs,s=void 0===c?0:c,o=e.countdownVotingStartMs,i=void 0===o?0:o,u=e.onGracePeriodChange,l=e.onVotingPeriodChange,b=e.proposalId,j=e.renderStatus,f=e.votingResult,O=Object(m.i)(i/1e3,s/1e3),p=O.hasTimeEnded,h=O.hasTimeStarted,v=O.timeStartEndInitReady,x=Object(m.i)(a/1e3,n/1e3),N=x.hasTimeEnded,g=x.hasTimeStarted,E=x.timeStartEndInitReady,A=E&&g&&!N,I=(null===f||void 0===f?void 0:f.No.units)||0,y=(null===f||void 0===f?void 0:f.totalUnits)||0,C=(null===f||void 0===f?void 0:f.Yes.units)||0,D=p?C>I:void 0,S=null===j||void 0===j?void 0:j({countdownGracePeriodEndMs:n,countdownGracePeriodStartMs:a,countdownVotingEndMs:s,countdownVotingStartMs:i,didVotePassSimpleMajority:D,gracePeriodStartEndInitReady:E,hasGracePeriodEnded:N,hasGracePeriodStarted:g,hasVotingEnded:p,hasVotingStarted:h,votingStartEndInitReady:v});return Object(d.useEffect)((function(){v&&(null===l||void 0===l||l({hasVotingStarted:h,hasVotingEnded:p,proposalId:b,votingStartEndInitReady:v}))}),[p,h,l,b,v]),Object(d.useEffect)((function(){E&&(null===u||void 0===u||u({hasGracePeriodEnded:N,hasGracePeriodStarted:g,proposalId:b,gracePeriodStartEndInitReady:E}))}),[E,N,g,u,b]),Object(w.jsx)(B,{hasVotingEnded:p,noUnits:I,renderStatus:function(){return S||(v?A?"":D?"Approved":!1===D?"Failed":void 0:Object(w.jsx)(R.a,{ariaLabel:"Getting off-chain voting status",fadeInProps:V,intervalMs:200}))},renderTimer:function(e){return v&&h&&!p?Object(w.jsx)(e,{endPeriodMs:s,renderCountdownText:G,startPeriodMs:i}):A?Object(w.jsx)(e,{endLabel:U,endPeriodMs:n||0,renderCountdownText:G,startPeriodMs:a||0}):void 0},totalUnits:y,yesUnits:C})}function Y(e){return Object(w.jsx)("svg",Object(c.a)(Object(c.a)({xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",width:"18",height:"18",viewBox:"0 0 512 512"},e),{},{children:Object(w.jsx)("path",{fill:"currentColor",d:"M435.848 83.466L172.804 346.51l-96.652-96.652c-4.686-4.686-12.284-4.686-16.971 0l-28.284 28.284c-4.686 4.686-4.686 12.284 0 16.971l133.421 133.421c4.686 4.686 12.284 4.686 16.971 0l299.813-299.813c4.686-4.686 4.686-12.284 0-16.971l-28.284-28.284c-4.686-4.686-12.284-4.686-16.97 0z"})}))}function H(e,t){return(e/t*100).toFixed(2).replace(/\.00$/,"")}function K(e){var t=e.yesUnits,n=void 0===t?0:t,r=e.noUnits,a=void 0===r?0:r,c=e.totalUnits,s=e.votingExpired,o=e.showPercentages,i=c?H(n,c):"0",u=c?H(a,c):"0";return Object(w.jsxs)("div",{className:"votingbar-container",children:[Object(w.jsxs)("div",{className:"votingbar",children:[Object(w.jsx)("div",{className:"votingbar__segment--yes","aria-label":"".concat(i,"% yes votes"),style:{width:"".concat(i,"%")}}),Object(w.jsx)("div",{className:"votingbar__segment--no","aria-label":"".concat(u,"% no votes"),style:{width:"".concat(u,"%")}})]}),Object(w.jsx)("div",{className:"votingbar__percentages",children:o&&Object(w.jsxs)(w.Fragment,{children:[s&&n>a&&Object(w.jsx)("span",{className:"yes-check",children:Object(w.jsx)(Y,{"aria-label":"Vote has passed"})}),Object(w.jsxs)("span",{className:"yes-percent",children:[i,"%"]}),Object(w.jsxs)("span",{className:"no-percent",children:[u,"%"]}),s&&n<=a&&Object(w.jsx)("span",{className:"no-check",children:Object(w.jsx)(Y,{"aria-label":"Vote has failed"})})]})})]})}function z(e){var t=e.buttonProps,n=e.onClick,r=e.voteChosen,a=e.voteProgress;function s(e){return a===e?{"aria-label":"Voting ".concat(e," \u2026")}:{}}function o(e){return a===e?Object(w.jsx)(A.a,{"aria-label":"Currently voting ".concat(e,"..."),role:"img"}):r===e?"Voted ".concat(e):"Vote ".concat(e)}function u(e){return function(){n(e)}}function d(e,t){return r===e?Object(w.jsxs)(w.Fragment,{children:[Object(w.jsx)(Y,{"aria-label":t})," "]}):""}return Object(w.jsxs)(w.Fragment,{children:[Object(w.jsxs)("button",Object(c.a)(Object(c.a)(Object(c.a)({},t),s(i.VoteChoices.Yes)),{},{className:"proposaldetails__button",onClick:u(i.VoteChoices.Yes),children:[d(i.VoteChoices.Yes,"You voted yes"),o(i.VoteChoices.Yes)]})),Object(w.jsxs)("button",Object(c.a)(Object(c.a)(Object(c.a)({},t),s(i.VoteChoices.No)),{},{className:"proposaldetails__button",onClick:u(i.VoteChoices.No),children:[d(i.VoteChoices.No,"You voted no"),o(i.VoteChoices.No)]}))]})}},15:function(e,t,n){"use strict";n.d(t,"a",(function(){return j})),n.d(t,"b",(function(){return g})),n.d(t,"c",(function(){return w})),n.d(t,"d",(function(){return I})),n.d(t,"e",(function(){return D})),n.d(t,"f",(function(){return l.a}));n(34);var r=n(2),a=n.n(r),c=n(5),s=n(4),o=n(1);var i=n(11),u=n(32),d=n(12),l=n(104),b=n(7);function j(){var e=Object(o.useState)(),t=Object(s.a)(e,2),n=t[0],r=t[1],j=Object(o.useState)(""),f=Object(s.a)(j,2),O=f[0],p=f[1],h=Object(o.useState)(!1),m=Object(s.a)(h,2),v=m[0],x=m[1],N=Object(o.useState)(),g=Object(s.a)(N,2),E=g[0],A=g[1],w=Object(o.useState)(b.f.STANDBY),I=Object(s.a)(w,2),y=I[0],C=I[1],D=Object(l.a)().networkId;function S(e){return function(t){C(b.f.PENDING),x(!1),D&&D!==i.c.GANACHE&&p("".concat(i.o[D],"/tx/").concat(t)),e&&e(t)}}function _(){return(_=Object(c.a)(a.a.mark((function e(){var t,n,c,s,o,i=arguments;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:for(t=Object(d.c)(),e.prev=1,r(void 0),p(""),C(b.f.AWAITING_CONFIRM),x(!0),n=i.length,c=new Array(n),s=0;s0&&void 0!==arguments[0]?arguments[0]:v,t=arguments.length>1?arguments[1]:void 0,n=t.type,r=t.payload;switch(n){case a.CONNECT_WEB3MODAL:var c=r||{},s=c.provider,o=c.networkId,i=c.account,u=c.connected,l=c.web3Instance;return Object(d.a)(Object(d.a)({},e),{},{account:i,connected:u,networkId:o,provider:s,web3Instance:l});case a.DEACTIVATE_PROVIDER_WEB3MODAL:return v;case a.ERROR_WEB3MODAL:var b=r||{},j=b.error;return Object(d.a)(Object(d.a)({},e),{},{error:j});case a.INITIAL_CACHED_CONNECTOR_CHECK_STATUS:var f=r||{},O=f.initialCachedConnectorCheckStatus;return Object(d.a)(Object(d.a)({},e),{},{initialCachedConnectorCheckStatus:O});case a.NEW_WEB3MODAL:var p=r||{},h=p.web3Modal;return{web3Modal:h};case a.UPDATE_ACCOUNT:var m=r||{},x=m.account;return Object(d.a)(Object(d.a)({},e),{},{account:x});default:return v}}function N(e){var t,n,r=e.defaultChain,s=e.defaultTheme,b=e.onBeforeConnect,f=e.onBeforeDisconnect,v=e.providerOptions,N=Object(l.useReducer)(x,{initialCachedConnectorCheckStatus:p.a.STANDBY}),g=Object(u.a)(N,2),E=g[0],A=g[1],w=s,I=r||h.k,y=Object(l.useCallback)(_,[b,E.web3Modal]),C=Object(l.useCallback)((function(e){var t,n;if(!(null===(t=E.web3Modal)||void 0===t?void 0:t.cachedProvider))return;y(null===(n=E.web3Modal)||void 0===n?void 0:n.cachedProvider)}),[y,null===(t=E.web3Modal)||void 0===t?void 0:t.cachedProvider]);function D(e){var t=Object(u.a)(e,1)[0];A({type:a.UPDATE_ACCOUNT,payload:{account:t}})}function S(){return(S=Object(i.a)(o.a.mark((function e(t,n){var r;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=a.INITIAL_CACHED_CONNECTOR_CHECK_STATUS,"string"===typeof t){e.next=3;break}return e.abrupt("return");case 3:if(A({type:r,payload:{initialCachedConnectorCheckStatus:p.a.PENDING}}),!t){e.next=7;break}return e.next=7,n(t);case 7:A({type:r,payload:{initialCachedConnectorCheckStatus:p.a.FULFILLED}});case 8:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function _(e){return k.apply(this,arguments)}function k(){return(k=Object(i.a)(o.a.mark((function e(t){var n,r,s,i,d;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,E.web3Modal){e.next=3;break}return e.abrupt("return");case 3:return e.next=5,E.web3Modal.connectTo(t);case 5:return n=e.sent,r=new j.a(n),e.next=9,r.eth.getAccounts();case 9:return s=e.sent,i=Object(u.a)(s,1),d=i[0],e.next=14,null===b||void 0===b?void 0:b();case 14:return e.t0=A,e.t1=a.CONNECT_WEB3MODAL,e.t2=d,e.next=19,r.eth.net.getId();case 19:e.t3=e.sent,e.t4=n,e.t5=r,e.t6={account:e.t2,connected:!0,networkId:e.t3,provider:e.t4,web3Instance:e.t5},e.t7={type:e.t1,payload:e.t6},(0,e.t0)(e.t7),e.next=30;break;case 27:e.prev=27,e.t8=e.catch(0),A({type:a.ERROR_WEB3MODAL,payload:{error:{connectorId:t,error:new Error("Failed to connect to ".concat(t,".")),type:c.CONNECT}}});case 30:case"end":return e.stop()}}),e,null,[[0,27]])})))).apply(this,arguments)}function T(){return(T=Object(i.a)(o.a.mark((function e(){var t,n,r,s;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,null===(t=E.provider)||void 0===t||null===(n=t.close)||void 0===n?void 0:n.call(t);case 3:if(e.t0=E.web3Modal,!e.t0){e.next=7;break}return e.next=7,E.web3Modal.clearCachedProvider();case 7:return e.next=9,null===f||void 0===f?void 0:f();case 9:A({type:a.DEACTIVATE_PROVIDER_WEB3MODAL}),e.next=16;break;case 12:e.prev=12,e.t1=e.catch(0),s=(null===(r=E.web3Modal)||void 0===r?void 0:r.cachedProvider)||"",A({type:a.ERROR_WEB3MODAL,payload:{error:{connectorId:s,error:new Error("Failed to disconnect from ".concat(s||"provider",".")),type:c.DISCONNECT}}});case 16:case"end":return e.stop()}}),e,null,[[0,12]])})))).apply(this,arguments)}return Object(l.useEffect)((function(){var e,t,n=E.provider;return null===n||void 0===n||null===(e=n.on)||void 0===e||e.call(n,"accountsChanged",D),null===n||void 0===n||null===(t=n.on)||void 0===t||t.call(n,"chainChanged",C),function(){var e,t;null===n||void 0===n||null===(e=n.removeListener)||void 0===e||e.call(n,"accountsChanged",D),null===n||void 0===n||null===(t=n.removeListener)||void 0===t||t.call(n,"chainChanged",C)}}),[C,E.provider]),Object(l.useEffect)((function(){E.web3Modal||A({type:a.NEW_WEB3MODAL,payload:{web3Modal:new O.a({cacheProvider:!0,network:m.c[m.b[I]],providerOptions:v,theme:w})}})}),[v,E.web3Modal,I,w]),Object(l.useEffect)((function(){var e;E.initialCachedConnectorCheckStatus!==p.a.FULFILLED&&E.initialCachedConnectorCheckStatus!==p.a.PENDING&&function(e,t){S.apply(this,arguments)}(null===(e=E.web3Modal)||void 0===e?void 0:e.cachedProvider,y)}),[y,E.initialCachedConnectorCheckStatus,null===(n=E.web3Modal)||void 0===n?void 0:n.cachedProvider]),Object(d.a)(Object(d.a)({},E),{},{connectWeb3Modal:_,disconnectWeb3Modal:function(){return T.apply(this,arguments)},providerOptions:v})}},20:function(e,t,n){"use strict";n.d(t,"A",(function(){return r.d})),n.d(t,"w",(function(){return r.c})),n.d(t,"y",(function(){return a.c})),n.d(t,"z",(function(){return a.d})),n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return h})),n.d(t,"c",(function(){return m})),n.d(t,"d",(function(){return v})),n.d(t,"e",(function(){return x})),n.d(t,"f",(function(){return N})),n.d(t,"g",(function(){return g})),n.d(t,"h",(function(){return E})),n.d(t,"i",(function(){return A})),n.d(t,"j",(function(){return w})),n.d(t,"k",(function(){return I})),n.d(t,"l",(function(){return y})),n.d(t,"m",(function(){return C})),n.d(t,"n",(function(){return D})),n.d(t,"o",(function(){return S})),n.d(t,"p",(function(){return _})),n.d(t,"q",(function(){return k})),n.d(t,"r",(function(){return T})),n.d(t,"s",(function(){return R})),n.d(t,"t",(function(){return P})),n.d(t,"u",(function(){return F})),n.d(t,"v",(function(){return L})),n.d(t,"x",(function(){return M})),n.d(t,"D",(function(){return B})),n.d(t,"G",(function(){return G})),n.d(t,"H",(function(){return U})),n.d(t,"Q",(function(){return Y})),n.d(t,"C",(function(){return H})),n.d(t,"S",(function(){return K})),n.d(t,"J",(function(){return z})),n.d(t,"N",(function(){return q})),n.d(t,"B",(function(){return J})),n.d(t,"O",(function(){return Q})),n.d(t,"I",(function(){return X})),n.d(t,"R",(function(){return $})),n.d(t,"M",(function(){return Z})),n.d(t,"L",(function(){return ee})),n.d(t,"E",(function(){return te})),n.d(t,"T",(function(){return ne})),n.d(t,"F",(function(){return re})),n.d(t,"P",(function(){return ae})),n.d(t,"K",(function(){return ce})),n.d(t,"U",(function(){return se})),n.d(t,"V",(function(){return ue.b}));var r=n(175),a=n(176),c=n(3),s=n(61),o=n(2),i=n.n(o),u=n(5),d=n(7),l=n(11),b=n(32),j=n(17),f=n(202),O=["type"],p="CLEAR_CONTRACTS",h="CONTRACT_BANK_ADAPTER",m="CONTRACT_BANK_EXTENSION",v="CONTRACT_BANK_FACTORY",x="CONTRACT_CONFIGURATION",N="CONTRACT_COUPON_ONBOARDING",g="CONTRACT_DAO_FACTORY",E="CONTRACT_DAO_REGISTRY",A="CONTRACT_DAO_REGISTRY_ADAPTER",w="CONTRACT_DISTRIBUTE",I="CONTRACT_ERC20_EXTENSION",y="CONTRACT_FINANCING",C="CONTRACT_GUILDKICK",D="CONTRACT_MANAGING",S="CONTRACT_NFT_ADAPTER",_="CONTRACT_NFT_EXTENSION",k="CONTRACT_ONBOARDING",T="CONTRACT_RAGEQUIT",R="CONTRACT_TRIBUTE",P="CONTRACT_TRIBUTE_NFT",F="CONTRACT_VOTING",L="CONTRACT_VOTING_OP_ROLLUP";function M(){return{type:p}}function B(e){return function(){var t=Object(u.a)(i.a.mark((function t(r){var a,c,s,o,u;return i.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(t.prev=0,!e){t.next=10;break}return t.next=4,n.e(13).then(n.t.bind(null,951,3));case 4:a=t.sent,c=a.default,s=c,o=l.b[l.k],u=new e.eth.Contract(s,o),r(oe({type:v,abi:s,contractAddress:o,instance:u}));case 10:t.next=15;break;case 12:throw t.prev=12,t.t0=t.catch(0),t.t0;case 15:case"end":return t.stop()}}),t,null,[[0,12]])})));return function(e){return t.apply(this,arguments)}}()}function G(e){return function(){var t=Object(u.a)(i.a.mark((function t(r){var a,c,s,o,u;return i.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(t.prev=0,!e){t.next=10;break}return t.next=4,n.e(16).then(n.t.bind(null,952,3));case 4:a=t.sent,c=a.default,s=c,o=l.h[l.k],u=new e.eth.Contract(s,o),r(oe({type:g,abi:s,contractAddress:o,instance:u}));case 10:t.next=15;break;case 12:throw t.prev=12,t.t0=t.catch(0),t.t0;case 15:case"end":return t.stop()}}),t,null,[[0,12]])})));return function(e){return t.apply(this,arguments)}}()}function U(e){return function(){var t=Object(u.a)(i.a.mark((function t(r){var a,c,s,o,u;return i.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(t.prev=0,!e){t.next=12;break}return t.next=4,n.e(17).then(n.t.bind(null,953,3));case 4:if(a=t.sent,c=a.default,s=c,o=l.j){t.next=10;break}throw new Error("No DAO Registry contract address was found.");case 10:u=new e.eth.Contract(s,o),r(oe({type:E,abi:s,contractAddress:o,instance:u}));case 12:t.next=17;break;case 14:throw t.prev=14,t.t0=t.catch(0),t.t0;case 17:case"end":return t.stop()}}),t,null,[[0,14]])})));return function(e){return t.apply(this,arguments)}}()}function V(e,t){return ie({actionType:F,adapterOrExtensionName:d.a.voting,adapterNameForRedux:j.c.VotingContract,contractAddress:t,lazyImport:function(){return n.e(2).then(n.t.bind(null,954,3))},web3Instance:e})}function W(e,t){return ie({actionType:L,adapterOrExtensionName:d.a.voting,adapterNameForRedux:j.c.OffchainVotingContract,contractAddress:t,lazyImport:function(){return n.e(1).then(n.t.bind(null,955,3))},web3Instance:e})}function Y(e,t){return ie({actionType:k,adapterNameForRedux:j.a.ONBOARDING,adapterOrExtensionName:d.a.onboarding,contractAddress:t,lazyImport:function(){return n.e(27).then(n.t.bind(null,956,3))},web3Instance:e})}function H(e,t){return ie({actionType:m,adapterNameForRedux:j.b.BANK,adapterOrExtensionName:d.c.bank,contractAddress:t,isExtension:!0,lazyImport:function(){return n.e(12).then(n.t.bind(null,957,3))},web3Instance:e})}function K(e,t){return ie({actionType:R,adapterNameForRedux:j.a.TRIBUTE,adapterOrExtensionName:d.a.tribute,contractAddress:t,lazyImport:function(){return n.e(29).then(n.t.bind(null,958,3))},web3Instance:e})}function z(e,t){return ie({actionType:w,adapterNameForRedux:j.a.DISTRIBUTE,adapterOrExtensionName:d.a.distribute,contractAddress:t,lazyImport:function(){return n.e(19).then(n.t.bind(null,959,3))},web3Instance:e})}function q(e,t){return ie({actionType:D,adapterNameForRedux:j.a.MANAGING,adapterOrExtensionName:d.a.managing,contractAddress:t,lazyImport:function(){return n.e(23).then(n.t.bind(null,960,3))},web3Instance:e})}function J(e,t){return ie({actionType:h,adapterNameForRedux:j.a.BANK,adapterOrExtensionName:d.a.bank,contractAddress:t,lazyImport:function(){return n.e(11).then(n.t.bind(null,961,3))},web3Instance:e})}function Q(e,t){return ie({actionType:S,adapterNameForRedux:j.a.NFT,adapterOrExtensionName:d.a.nft,contractAddress:t,lazyImport:function(){return n.e(25).then(n.t.bind(null,962,3))},web3Instance:e})}function X(e,t){return ie({actionType:A,adapterNameForRedux:j.a.DAO_REGISTRY,adapterOrExtensionName:d.a.dao_registry,contractAddress:t,lazyImport:function(){return n.e(18).then(n.t.bind(null,963,3))},web3Instance:e})}function $(e,t){return ie({actionType:T,adapterNameForRedux:j.a.RAGEQUIT,adapterOrExtensionName:d.a.ragequit,contractAddress:t,lazyImport:function(){return n.e(28).then(n.t.bind(null,964,3))},web3Instance:e})}function Z(e,t){return ie({actionType:C,adapterNameForRedux:j.a.GUILDKICK,adapterOrExtensionName:d.a.guildkick,contractAddress:t,lazyImport:function(){return n.e(22).then(n.t.bind(null,965,3))},web3Instance:e})}function ee(e,t){return ie({actionType:y,adapterNameForRedux:j.a.FINANCING,adapterOrExtensionName:d.a.financing,contractAddress:t,lazyImport:function(){return n.e(21).then(n.t.bind(null,966,3))},web3Instance:e})}function te(e,t){return ie({actionType:x,adapterNameForRedux:j.a.CONFIGURATION,adapterOrExtensionName:d.a.configuration,contractAddress:t,lazyImport:function(){return n.e(14).then(n.t.bind(null,967,3))},web3Instance:e})}function ne(e,t){return ie({actionType:P,adapterNameForRedux:j.a.TRIBUTE_NFT,adapterOrExtensionName:d.a.tribute_nft,contractAddress:t,lazyImport:function(){return n.e(30).then(n.t.bind(null,968,3))},web3Instance:e})}function re(e,t){return ie({actionType:N,adapterNameForRedux:j.a.COUPON_ONBOARDING,adapterOrExtensionName:d.a.coupon_onboarding,contractAddress:t,lazyImport:function(){return n.e(15).then(n.t.bind(null,969,3))},web3Instance:e})}function ae(e,t){return ie({actionType:_,adapterNameForRedux:j.b.NFT,adapterOrExtensionName:d.c.nft,contractAddress:t,isExtension:!0,lazyImport:function(){return n.e(26).then(n.t.bind(null,970,3))},web3Instance:e})}function ce(e,t){return ie({actionType:I,adapterNameForRedux:j.b.ERC20,adapterOrExtensionName:d.c.erc20,contractAddress:t,isExtension:!0,lazyImport:function(){return n.e(20).then(n.t.bind(null,971,3))},web3Instance:e})}function se(e,t){return function(){var n=Object(u.a)(i.a.mark((function n(r,a){var c,s,o;return i.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(n.prev=0,!e){n.next=29;break}if(a().contracts.DaoRegistryContract){n.next=6;break}return console.warn("Please init the DaoRegistry contract before the voting contract."),n.abrupt("return");case 6:if(c="",!(s=t||"")){n.next=12;break}return n.next=11,Object(b.h)(s,e);case 11:c=n.sent;case 12:if(s||c){n.next=19;break}return n.next=15,Object(b.c)(d.a.voting,null===(o=a().contracts.DaoRegistryContract)||void 0===o?void 0:o.instance);case 15:return s=n.sent,n.next=18,Object(b.h)(s,e);case 18:c=n.sent;case 19:n.t0=c,n.next="VotingContract"===n.t0?22:"OffchainVotingContract"===n.t0?25:28;break;case 22:return n.next=24,V(e,s)(r,a);case 24:return n.abrupt("return",n.sent);case 25:return n.next=27,W(e,s)(r,a);case 27:return n.abrupt("return",n.sent);case 28:throw new Error("Voting contract name could not be found.");case 29:n.next=34;break;case 31:n.prev=31,n.t1=n.catch(0),console.warn("The voting contract could not be found in the DAO. Are you sure you meant to add this contract's ABI?");case 34:case"end":return n.stop()}}),n,null,[[0,31]])})));return function(e,t){return n.apply(this,arguments)}}()}function oe(e){var t=e.type,n=Object(s.a)(e,O);return Object(c.a)({type:t},n)}function ie(e){var t=e.actionType,n=e.adapterNameForRedux,r=e.adapterOrExtensionName,a=e.contractAddress,c=e.isExtension,s=void 0!==c&&c,o=e.lazyImport,d=e.web3Instance;return function(){var e=Object(u.a)(i.a.mark((function e(c,u){var l,j,O,p,h,m;return i.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,o();case 3:if(O=e.sent,p=O.default,h=p,e.t0=a,e.t0){e.next=18;break}if(!s){e.next=14;break}return e.next=11,Object(f.a)(r,null===(l=u().contracts.DaoRegistryContract)||void 0===l?void 0:l.instance);case 11:e.t1=e.sent,e.next=17;break;case 14:return e.next=16,Object(b.c)(r,null===(j=u().contracts.DaoRegistryContract)||void 0===j?void 0:j.instance);case 16:e.t1=e.sent;case 17:e.t0=e.t1;case 18:m=e.t0,c(oe({type:t,abi:h,contractAddress:m,adapterOrExtensionName:n,instance:new d.eth.Contract(h,m)})),e.next=25;break;case 22:e.prev=22,e.t2=e.catch(0),console.warn('The contract "'.concat(r,"\" could not be found in the DAO. Are you sure you meant to add this contract's ABI?"));case 25:case"end":return e.stop()}}),e,null,[[0,22]])})));return function(t,n){return e.apply(this,arguments)}}()}var ue=n(203)},201:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var r=n(85);function a(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:5;if(null===e||"undefined"===typeof e)return"---";if(Object(r.a)(e)){var n=e.substring(0,t),a=e.substring(e.length-3);return n+"..."+a}return e}},202:function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var r=n(2),a=n.n(r),c=n(5),s=n(64),o=n.n(s);function i(e,t){return u.apply(this,arguments)}function u(){return(u=Object(c.a)(a.a.mark((function e(t,n){return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,n){e.next=3;break}throw new Error("No DaoRegistry contract instance provided.");case 3:return e.next=5,n.methods.getExtensionAddress(o.a.utils.sha3(t)).call();case 5:return e.abrupt("return",e.sent);case 8:throw e.prev=8,e.t0=e.catch(0),e.t0;case 11:case"end":return e.stop()}}),e,null,[[0,8]])})))).apply(this,arguments)}},203:function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"b",(function(){return c}));var r=n(3),a="SET_SUBGRAPH_NETWORK_STATUS";function c(e){return Object(r.a)({type:a},e)}},205:function(e,t,n){"use strict";n.d(t,"a",(function(){return l}));var r=n(4),a=n(3),c=n(1),s=n(24),o=n(0),i=["",".",".","."],u={position:"absolute"},d={height:1,width:1};function l(e){var t=e.ariaLabel,n=e.intervalMs,l=void 0===n?1e3:n,b=e.fadeInProps,j=Object(a.a)(Object(a.a)({},b),{},{inline:!0}),f=Object(c.useState)(1),O=Object(r.a)(f,2),p=O[0],h=O[1];return Object(c.useEffect)((function(){var e=setInterval((function(){return h((function(e){return(e+1)%i.length}))}),l);return function(){clearInterval(e)}}),[l]),Object(o.jsxs)(o.Fragment,{children:[Object(o.jsxs)("span",{"aria-label":t,style:u,children:[Object(o.jsx)("span",{children:p>=0&&i[0]}),Object(o.jsx)("span",{children:p>=1&&Object(o.jsx)(s.a,Object(a.a)(Object(a.a)({},j),{},{children:i[1]}))}),Object(o.jsx)("span",{children:p>=2&&Object(o.jsx)(s.a,Object(a.a)(Object(a.a)({},j),{},{children:i[2]}))}),Object(o.jsx)("span",{children:p>=3&&Object(o.jsx)(s.a,Object(a.a)(Object(a.a)({},j),{},{children:i[3]}))})]}),Object(o.jsx)("span",{style:d,children:"\xa0"})]})}},206:function(e,t,n){"use strict";n.d(t,"a",(function(){return _}));var r=n(2),a=n.n(r),c=n(34),s=n(5),o=n(3),i=n(4),u=n(1),d=n(14),l=n(22),b=n(9),j=n(32),f=n(11),O=n(57),p=n(46),h=n(15),m=n(36),v=n(7),x=n(69),N=n(30),g=n(50),E=n(24),A=n(41),w=n(0),I=b.a.FULFILLED,y=v.f.AWAITING_CONFIRM,C=v.f.FULFILLED,D=v.f.PENDING,S=O.c;function _(e){var t=e.checkApplicant,n=e.proposal,r=n.snapshotDraft,b=n.snapshotProposal,v=n.refetchProposalOrDraft,_=b||{msg:{payload:{}}},k=_.msg,T=k.payload,R=T.choices,P=void 0===R?S:R,F=T.name,L=void 0===F?"":F,M=T.body,B=void 0===M?"":M,G=T.start,U=void 0===G?0:G,V=T.end,W=void 0===V?0:V,Y=T.snapshot,H=void 0===Y?0:Y,K=k.timestamp,z=void 0===K?"":K,q=_.sig,J=void 0===q?"":q,Q=Object(u.useState)(((null===b||void 0===b?void 0:b.sig.length)||"")>0),X=Object(i.a)(Q,2),$=X[0],Z=X[1],ee=Object(u.useRef)({body:B,choices:P,end:W,name:L,sig:J,snapshot:H,space:f.D||"",start:U,timestamp:z}),te=Object(u.useState)(),ne=Object(i.a)(te,2),re=ne[0],ae=ne[1],ce=Object(u.useRef)({invalidApplicantMessage:""}),se=Object(d.c)((function(e){return e.contracts})),oe=Object(d.c)((function(e){var t;return null===(t=e.contracts.DaoRegistryContract)||void 0===t?void 0:t.contractAddress})),ie=Object(h.f)(),ue=ie.account,de=ie.web3Instance,le=Object(h.a)(),be=le.txEtherscanURL,je=le.txIsPromptOpen,fe=le.txSend,Oe=le.txStatus,pe=Object(m.g)(),he=pe.isDisabled,me=pe.openWhyDisabledModal,ve=pe.WhyDisabledModal,xe=pe.setOtherDisabledReasons,Ne=Object(p.i)(),ge=Ne.proposalSignAndSendStatus,Ee=Ne.signAndSendProposal,Ae=Object(h.b)().fast,we=Object(p.a)(t),Ie=we.checkApplicantError,ye=we.checkApplicantInvalidMsg,Ce=we.checkApplicantStatus,De=we.isApplicantValid,Se=Oe===y||Oe===D||ge===y||ge===D,_e=$?Oe===C:Oe===C&&ge===C,ke=Se||_e||je;function Te(){return(Te=Object(s.a)(a.a.mark((function e(){var t,n,s,i,u,d,f,O,p,h,m,x,N,g,E,A,w,I,y,C,D,S,_,k,T,R,P,F,L;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,oe){e.next=3;break}throw new Error("No DAO Registry address was found.");case 3:if(i=(null===(t=r||b)||void 0===t?void 0:t.actionId)||"",u=Object(j.e)(i,se)){e.next=7;break}throw Error("No contract was found for action id ".concat(i,"."));case 7:if(d=(null===(n=r||b)||void 0===n?void 0:n.idInDAO)||"",f=null===(s=(null===r||void 0===r?void 0:r.msg.payload)||(null===b||void 0===b?void 0:b.msg.payload))||void 0===s?void 0:s.metadata.submitActionArgs,$||!r){e.next=18;break}return O=r.msg,p=O.payload,h=p.name,m=p.body,x=p.metadata,N=O.timestamp,e.next=13,Ee({partialProposalData:{name:h,body:m,metadata:x,timestamp:N},adapterAddress:u.contractAddress,type:l.SnapshotType.proposal});case 13:g=e.sent,E=g.data,A=g.signature,ee.current={body:E.payload.body,choices:E.payload.choices,end:E.payload.end,name:E.payload.name,sig:A,snapshot:E.payload.snapshot,space:E.space,start:E.payload.start,timestamp:E.timestamp},Z(!0);case 18:return w=ee.current,I=w.body,y=w.choices,C=w.end,D=w.name,S=w.sig,_=w.snapshot,k=w.space,T=w.start,R=w.timestamp,P=Object(l.prepareVoteProposalData)({payload:{body:I,choices:y,end:C,name:D,snapshot:_.toString(),start:T},sig:S,space:k,timestamp:parseInt(R)},de),F=[oe,d].concat(Object(c.a)(f||[]),[P]),L=Object(o.a)({from:ue||""},Ae?{gasPrice:Ae}:null),e.next=24,fe("submitProposal",u.instance.methods,F,L);case 24:v(),e.next=30;break;case 27:e.prev=27,e.t0=e.catch(0),ae(e.t0);case 30:case"end":return e.stop()}}),e,null,[[0,27]])})))).apply(this,arguments)}return Object(u.useEffect)((function(){t&&Ce===I&&(!De&&ye&&(ce.current=Object(o.a)(Object(o.a)({},ce.current),{},{invalidApplicantMessage:ye})),xe(Object.values(ce.current)))}),[t,ye,Ce,De,xe]),Ie&&console.warn("Error checking if the applicant address is valid: ".concat(Ie.message)),Object(w.jsxs)(w.Fragment,{children:[Object(w.jsxs)("div",{children:[Object(w.jsx)("button",{className:"proposaldetails__button",disabled:he||ke,onClick:he||ke?function(){}:function(){return Te.apply(this,arguments)},children:Se?Object(w.jsx)(A.a,{}):_e?"Done":"Sponsor"}),Object(w.jsx)(N.a,{error:re,renderText:"Something went wrong"}),ke&&Object(w.jsx)("div",{className:"form__submit-status-container",children:function(){if(Oe===y||ge===y)return"Awaiting your confirmation\u2026";switch(Oe){case D:return Object(w.jsxs)(w.Fragment,{children:[Object(w.jsx)(x.a,{intervalMs:2e3,messages:O.b,useFirstItemStart:!0,render:function(e){return Object(w.jsx)(E.a,{children:e},e)}}),Object(w.jsx)(g.a,{url:be,isPending:!0})]});case C:return Object(w.jsxs)(w.Fragment,{children:[Object(w.jsx)("div",{children:"Proposal submitted!"}),Object(w.jsx)(g.a,{url:be})]});default:return null}}()}),he&&Object(w.jsx)("button",{className:"button--help-centered",onClick:me,children:"Why is sponsoring disabled?"})]}),Object(w.jsx)(ve,{title:"Why is sponsoring disabled?"})]})}},212:function(e,t,n){"use strict";n.d(t,"a",(function(){return l})),n.d(t,"b",(function(){return b}));var r=n(4),a=n(1),c=n(64),s=n.n(c),o=n(178),i=n(9),u=n(11),d=n(0),l=Object(a.createContext)({});function b(e){var t,n=e.children,c=e.defaultChain,b=e.defaultTheme,j=void 0===b?o.a.DARK:b,f=e.onBeforeConnect,O=e.onBeforeDisconnect,p=e.providerOptions,h=Object(a.useRef)(new s.a(new s.a.providers.WebsocketProvider(u.n))),m=Object(a.useState)(),v=Object(r.a)(m,2),x=v[0],N=v[1],g={defaultChain:c,defaultTheme:j,onBeforeConnect:f,onBeforeDisconnect:O,providerOptions:p},E=Object(o.b)(g),A=E.account,w=E.connected,I=E.connectWeb3Modal,y=E.disconnectWeb3Modal,C=E.error,D=E.initialCachedConnectorCheckStatus,S=E.networkId,_=void 0===S?x:S,k=E.provider,T=void 0===k?null===(t=h.current)||void 0===t?void 0:t.currentProvider:k,R=E.web3Instance,P=void 0===R?h.current:R,F=E.web3Modal;Object(a.useEffect)((function(){var e;w||D!==i.a.FULFILLED||(null===(e=h.current)||void 0===e||e.eth.net.getId().then(N).catch((function(){return N(void 0)})))}),[w,D]);var L={account:A,connected:w,connectWeb3Modal:I,disconnectWeb3Modal:y,error:C,initialCachedConnectorCheckStatus:D,networkId:_,provider:T,providerOptions:p,web3Instance:P,web3Modal:F};return Object(d.jsx)(l.Provider,{value:L,children:n})}},24:function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var r=n(3),a=(n(1),n(930)),c=n(0),s=function(e){return{transition:"opacity ".concat(e.duration||300,"ms cubic-bezier(0, 0.69, 0.32, 0.64)"),opacity:0}},o={entering:{opacity:0},entered:{opacity:1},exiting:{opacity:0},exited:{opacity:0}};function i(e){var t=e.inline;return Object(c.jsx)(a.a,{appear:!0,in:void 0===e.show||e.show,timeout:e.duration||300,children:function(n){return t?Object(c.jsx)("span",{style:Object(r.a)(Object(r.a)({},s(e)),o[n]),children:e.children}):Object(c.jsx)("div",{style:Object(r.a)(Object(r.a)({},s(e)),o[n]),children:e.children})}})}},30:function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(3),a=n(4),c=n(1),s=n(12),o=n(24),i=n(0);function u(e){var t=e.error,n=e.renderText,u=Object(c.useState)(!1),d=Object(a.a)(u,2),l=d[0],b=d[1],j="function"!==typeof t&&(4001===(null===t||void 0===t?void 0:t.code)||/^(the )?user rejected (the )?request$/g.test(Object(s.i)((null===t||void 0===t?void 0:t.message)||""))),f="string"===typeof n?n:n(),O="string"===typeof n&&"function"!==typeof t&&Object(s.i)(n)===Object(s.i)((null===t||void 0===t?void 0:t.message)||"");return!t||j?null:Object(i.jsx)(o.a,{children:Object(i.jsxs)("div",{className:"text-center",children:[Object(i.jsx)("p",{className:"error-message",children:f}),t&&!O&&Object(i.jsxs)("details",Object(r.a)(Object(r.a)({},e.detailsProps),{},{children:[Object(i.jsx)("summary",{"aria-expanded":l,className:"error-message",onClick:function(){return b(!l)},style:{cursor:"pointer",outline:"none"},children:Object(i.jsx)("small",{children:"Details"})}),Object(i.jsx)("p",{className:"error-message",children:Object(i.jsx)("small",{children:"function"===typeof t?t():t.message})})]}))]})})}},32:function(e,t,n){"use strict";n.d(t,"b",(function(){return d})),n.d(t,"c",(function(){return f})),n.d(t,"d",(function(){return m})),n.d(t,"e",(function(){return N})),n.d(t,"f",(function(){return g})),n.d(t,"a",(function(){return v})),n.d(t,"g",(function(){return A})),n.d(t,"h",(function(){return I})),n.d(t,"i",(function(){return C})),n.d(t,"j",(function(){return _}));var r=n(2),a=n.n(r),c=n(3),s=n(34),o=n(5),i=n(122),u=n.n(i);function d(e,t,n,r,a){return l.apply(this,arguments)}function l(){return(l=Object(o.a)(a.a.mark((function e(t,n,r,i,d){return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",new Promise(function(){var e=Object(o.a)(a.a.mark((function e(o,l){var b,j,f,O;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,b=u.a,j=n[t],e.next=5,j.apply(void 0,Object(s.a)(r)).estimateGas({from:i.from,value:i.value});case 5:return f=e.sent,O=new b(f).decimalPlaces(0,u.a.ROUND_DOWN).toNumber(),e.next=9,j.apply(void 0,Object(s.a)(r)).send(Object(c.a)(Object(c.a)({},i),{},{gas:O})).on("transactionHash",(function(e){d&&d(e)})).on("receipt",(function(e){o(e)})).on("error",(function(e){l(e)}));case 9:e.next=14;break;case 11:e.prev=11,e.t0=e.catch(0),l(e.t0);case 14:case"end":return e.stop()}}),e,null,[[0,11]])})));return function(t,n){return e.apply(this,arguments)}}()));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var b=n(64),j=n.n(b);function f(e,t){return O.apply(this,arguments)}function O(){return(O=Object(o.a)(a.a.mark((function e(t,n){return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,n){e.next=3;break}throw new Error("No DaoRegistry contract instance provided.");case 3:return e.next=5,n.methods.getAdapterAddress(j.a.utils.sha3(t)).call();case 5:return e.abrupt("return",e.sent);case 8:throw e.prev=8,e.t0=e.catch(0),e.t0;case 11:case"end":return e.stop()}}),e,null,[[0,8]])})))).apply(this,arguments)}var p=n(7);function h(e){try{var t=null===e||void 0===e?void 0:e.contractAddress;if(!t)throw new Error("Contract address was not found in the store.");return t}catch(n){throw n}}function m(e,t){try{switch(e){case p.a.configuration:return"";case p.a.distribute:return h(t.DistributeContract);case p.a.financing:case p.a.guildkick:return"";case p.a.managing:return h(t.ManagingContract);case p.a.onboarding:return h(t.OnboardingContract);case p.a.ragequit:return"";case p.a.tribute:return h(t.TributeContract);case p.a.tribute_nft:return h(t.TributeNFTContract);case p.a.voting:return h(t.VotingContract);default:throw new Error("Contract address was not found in the store.")}}catch(n){throw n}}var v,x=n(12);function N(e,t){try{var n=Object.values(t).find((function(t){return(null===t||void 0===t?void 0:t.contractAddress)&&Object(x.i)(t.contractAddress)===Object(x.i)(e)}));if(!n)throw new Error("Contract was not found in the store.");return n}catch(r){throw r}}function g(e,t){return E.apply(this,arguments)}function E(){return(E=Object(o.a)(a.a.mark((function e(t,n){return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,n){e.next=3;break}throw new Error("No DaoRegistry contract instance provided.");case 3:return e.next=5,n.methods.getConfiguration(j.a.utils.sha3(t)).call();case 5:return e.abrupt("return",e.sent);case 8:throw e.prev=8,e.t0=e.catch(0),e.t0;case 11:case"end":return e.stop()}}),e,null,[[0,8]])})))).apply(this,arguments)}function A(e){return w.apply(this,arguments)}function w(){return(w=Object(o.a)(a.a.mark((function e(t){var n,r;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,t){e.next=3;break}throw new Error("No DaoRegistry contract instance provided.");case 3:return n=t.methods,e.next=6,n.state().call();case 6:return r=e.sent,e.abrupt("return",0===Number(r)?v.CREATION:v.READY);case 10:throw e.prev=10,e.t0=e.catch(0),e.t0;case 13:case"end":return e.stop()}}),e,null,[[0,10]])})))).apply(this,arguments)}!function(e){e.CREATION="CREATION",e.READY="READY"}(v||(v={}));n(202);function I(e,t){return y.apply(this,arguments)}function y(){return(y=Object(o.a)(a.a.mark((function e(t,r){var c,s;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,n.e(0).then(n.t.bind(null,949,3));case 3:return c=e.sent,s=c.default,e.next=7,new r.eth.Contract(s,t).methods.getAdapterName().call();case 7:return e.abrupt("return",e.sent);case 10:throw e.prev=10,e.t0=e.catch(0),e.t0;case 13:case"end":return e.stop()}}),e,null,[[0,10]])})))).apply(this,arguments)}function C(e,t){return e===Math.log2(Number(t)+1)-1}var D=n(4),S=n(11);function _(e){return k.apply(this,arguments)}function k(){return(k=Object(o.a)(a.a.mark((function e(t){var r,c,s,o,i,u,d,l,b,j;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=t.blockNumber,c=void 0===r?"latest":r,s=t.calls,o=t.web3Instance,e.next=3,n.e(24).then(n.t.bind(null,950,3));case 3:if(i=e.sent,u=i.default,S.x){e.next=8;break}return console.error("No Multicall address was found. Are you sure it is set?"),e.abrupt("return");case 8:return e.prev=8,d=new o.eth.Contract(u,S.x),l=d.methods,e.next=12,l.aggregate(s.map((function(e){var t=Object(D.a)(e,3),n=t[0],r=t[1],a=t[2];return[n.toLowerCase(),o.eth.abi.encodeFunctionCall(r,a)]}))).call({},c);case 12:return b=e.sent,j=b.returnData,e.abrupt("return",j.map((function(e,t){var n=s[t][1].outputs||[],r=o.eth.abi.decodeParameters(n,e);return 1===r.__length__&&void 0!==r[0]?r[0]:o.eth.abi.decodeParameters(n||[],e)})));case 17:throw e.prev=17,e.t0=e.catch(8),e.t0;case 20:case"end":return e.stop()}}),e,null,[[8,17]])})))).apply(this,arguments)}},35:function(e,t,n){"use strict";var r,a,c,s;n.d(t,"b",(function(){return r})),n.d(t,"c",(function(){return a})),n.d(t,"a",(function(){return c})),n.d(t,"d",(function(){return s})),function(e){e[e.GOERLI=5]="GOERLI",e[e.KOVAN=42]="KOVAN",e[e.RINKEBY=4]="RINKEBY",e[e.ROPSTEN=3]="ROPSTEN",e[e.MAINNET=1]="MAINNET"}(r||(r={})),function(e){e.GOERLI="goerli",e.KOVAN="kovan",e.RINKEBY="rinkeby",e.ROPSTEN="ropsten",e.MAINNET="mainnet"}(a||(a={})),function(e){e.REQUIRED="This field is required.",e.INVALID_BYTES32="The value is not a bytes32.",e.INVALID_BYTES32_ARRAY="The value is not a comma-separated bytes32 format, ie. 0x...,0x...",e.INVALID_EMAIL="The email address is invalid.",e.INVALID_ETHEREUM_ADDRESS="The ethereum address is invalid.",e.INVALID_NUMBER="The value is not a number.",e.INVALID_NUMBER_ARRAY="The value is not a comma-separated number format, ie. 42,5,124"}(c||(c={})),function(e){e.FAILED="Failed",e.PASSED="Passed",e.REQUESTS="Proposals",e.VOTING="Voting"}(s||(s={}))},36:function(e,t,n){"use strict";n.d(t,"a",(function(){return c})),n.d(t,"b",(function(){return i})),n.d(t,"c",(function(){return b})),n.d(t,"d",(function(){return x})),n.d(t,"e",(function(){return E})),n.d(t,"f",(function(){return A})),n.d(t,"g",(function(){return S})),n.d(t,"h",(function(){return G})),n.d(t,"i",(function(){return H}));var r=n(4),a=n(1);function c(){var e=Object(a.useState)(),t=Object(r.a)(e,2),n=t[0],c=t[1],s=Object(a.useRef)(!1);return Object(a.useEffect)((function(){return s.current=!0,!n&&c(new AbortController),function(){s.current=!1,n&&n.abort()}}),[n]),{abortController:n,isMountedRef:s}}var s={count:0};function o(e,t){switch(t.type){case"increment":return{count:e.count+1};default:return e}}function i(){var e=Object(a.useReducer)(o,s),t=Object(r.a)(e,2),n=t[0],c=t[1];return[n.count,c]}var u=n(946),d=n(14),l=n(92);function b(){var e=Object(d.c)((function(e){return e.contracts.DaoRegistryContract})),t=Object(u.a)(l.b,{variables:{id:null===e||void 0===e?void 0:e.contractAddress.toLowerCase()}}),n=Object(r.a)(t,2),c=n[0],s=n[1],o=s.called,i=s.loading,b=s.data,j=s.error,f=Object(a.useState)(),O=Object(r.a)(f,2),p=O[0],h=O[1],m=Object(a.useState)(),v=Object(r.a)(m,2),x=v[0],N=v[1],g=Object(a.useCallback)((function(){try{if(!i&&b){if(h(b.tributeDaos[0]),0===b.tributeDaos.length)throw new Error('"'.concat(null===e||void 0===e?void 0:e.contractAddress,'" dao address not found.'))}else if(j)throw new Error('"'.concat(null===e||void 0===e?void 0:e.contractAddress,'" is not a valid dao address.'))}catch(j){N(j)}}),[null===e||void 0===e?void 0:e.contractAddress,b,j,i]);return Object(a.useEffect)((function(){o||c()}),[o,c]),Object(a.useEffect)((function(){!i&&(null===e||void 0===e?void 0:e.contractAddress)&&g()}),[null===e||void 0===e?void 0:e.contractAddress,g,i]),{dao:p,gqlError:x}}var j=n(2),f=n.n(j),O=n(5),p=n(9),h=n(32),m=n(15),v=[];function x(e){var t=Object(d.c)((function(e){var t;return null===(t=e.contracts.DaoRegistryContract)||void 0===t?void 0:t.contractAddress})),n=Object(d.c)((function(e){var t;return null===(t=e.contracts.DaoRegistryContract)||void 0===t?void 0:t.abi})),c=Object(a.useState)(v),s=Object(r.a)(c,2),o=s[0],i=s[1],u=Object(a.useState)(p.a.STANDBY),l=Object(r.a)(u,2),b=l[0],j=l[1],x=Object(a.useState)(),N=Object(r.a)(x,2),g=N[0],E=N[1],A=Object(m.f)().web3Instance,w=null===n||void 0===n?void 0:n.find((function(e){return"getConfiguration"===e.name}));function I(){return(I=Object(O.a)(f.a.mark((function e(t){var n,r,a,c,s;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.abi,r=t.configKeys,a=t.contractAddress,c=t.web3Instance,e.prev=1,s=r.map((function(e){return[a,n,[c.utils.sha3(e)||""]]})),E(void 0),j(p.a.PENDING),e.t0=i,e.next=8,Object(h.j)({calls:s,web3Instance:c});case 8:e.t1=e.sent,(0,e.t0)(e.t1),j(p.a.FULFILLED),e.next=18;break;case 13:e.prev=13,e.t2=e.catch(1),i(v),j(p.a.REJECTED),E(e.t2);case 18:case"end":return e.stop()}}),e,null,[[1,13]])})))).apply(this,arguments)}return Object(a.useEffect)((function(){t&&w&&A&&function(e){I.apply(this,arguments)}({abi:w,configKeys:e,contractAddress:t,web3Instance:A})}),[e,t,w,A]),{daoConfigurations:o,daoConfigurationsError:g,daoConfigurationsStatus:b}}var N=n(96),g=n(11);function E(){var e=Object(d.c)((function(e){return e.contracts.DaoRegistryContract})),t=Object(d.c)((function(e){return e.contracts.BankExtensionContract})),n=Object(d.c)((function(e){return e.subgraphNetworkStatus.status})),c=Object(u.a)(l.b,{variables:{id:null===e||void 0===e?void 0:e.contractAddress.toLowerCase()}}),s=Object(r.a)(c,2),o=s[0],i=s[1],b=i.called,j=i.loading,h=i.data,m=i.error,v=Object(a.useState)(),x=Object(r.a)(v,2),E=x[0],A=x[1],w=Object(a.useState)(p.a.STANDBY),I=Object(r.a)(w,2),y=I[0],C=I[1],D=Object(a.useState)(),S=Object(r.a)(D,2),_=S[0],k=S[1],T=Object(a.useCallback)((function(){return P.apply(this,arguments)}),[t]),R=Object(a.useCallback)((function(){try{if(C(p.a.PENDING),!j&&h){var e=h.tributeDaos[0].totalUnits;A(Number(e)),C(p.a.FULFILLED)}else if(m)throw new Error(m.message)}catch(m){console.log("subgraph query error: ".concat(m.message)),T()}}),[h,m,T,j]);function P(){return(P=Object(O.a)(f.a.mark((function e(){var n;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,C(p.a.PENDING),e.next=6,t.instance.methods.balanceOf(g.E,g.H).call();case 6:n=e.sent,A(Number(n)),C(p.a.FULFILLED),e.next=17;break;case 11:e.prev=11,e.t0=e.catch(2),console.log(e.t0),A(void 0),k(e.t0),C(p.a.REJECTED);case 17:case"end":return e.stop()}}),e,null,[[2,11]])})))).apply(this,arguments)}return Object(a.useEffect)((function(){b||o()}),[b,o]),Object(a.useEffect)((function(){n===N.a.OK?!j&&(null===e||void 0===e?void 0:e.contractAddress)&&R():T()}),[null===e||void 0===e?void 0:e.contractAddress,T,R,j,n]),{totalUnits:E,totalUnitsError:_,totalUnitsStatus:y}}function A(){var e=Object(a.useRef)(!1);return Object(a.useEffect)((function(){return e.current=!0,function(){e.current=!1}}),[]),{isMountedRef:e}}var w=n(152),I=n.n(w),y=n(24),C=n(106),D=n(0);function S(e){var t=(e||{}).skipIsActiveMemberCheck,n=void 0!==t&&t,c=Object(a.useState)([]),s=Object(r.a)(c,2),o=s[0],i=s[1],u=Object(a.useState)(!1),l=Object(r.a)(u,2),b=l[0],j=l[1],f=Object(d.c)((function(e){var t;return null===(t=e.connectedMember)||void 0===t?void 0:t.isActiveMember})),O=Object(m.f)().connected,p=o&&o.find((function(e){return e})),h=function(){if(!O)return"Your wallet is not connected.";if(!f&&!n)return"Either you are not a member, or your membership is not active.";return p||""}(),v=!!h||!!p,x=!(!v||!h),N=Object(a.useCallback)((function(e){if(!x)return null;var t=e.title;return Object(D.jsx)(I.a,{ariaHideApp:!1,className:"modal-container",isOpen:b,onRequestClose:function(){j(!1)},overlayClassName:"modal-overlay",role:"dialog",style:{overlay:{zIndex:1e3}},children:Object(D.jsx)(y.a,{children:Object(D.jsxs)("div",{className:"modal",children:[Object(D.jsx)("button",{className:"modal__close-button modal__close-button--icon",onClick:function(){j(!1)},children:Object(D.jsx)(C.a,{})}),Object(D.jsxs)("div",{className:"card",children:[Object(D.jsx)("h2",{className:"modal__title",children:t||"Why disabled?"}),Object(D.jsx)("p",{children:h})]})]})})})}),[x,h,b]),g=Object(a.useCallback)((function(e){i(e.filter(Boolean))}),[]);return{disabledReason:h,isDisabled:v,openWhyDisabledModal:function(){j(!0)},setOtherDisabledReasons:g,WhyDisabledModal:N}}var _=n(122),k=n.n(_),T=p.a.STANDBY,R=p.a.PENDING,P=p.a.FULFILLED,F=p.a.REJECTED,L="production"===g.m?15e3:5e3;function M(e){return B.apply(this,arguments)}function B(){return(B=Object(O.a)(f.a.mark((function e(t){var n,r,a,c,s,o,i;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.block,r=t.blockOffset,a=void 0===r?2:r,c=t.isMountedRef,s=t.pollInterval,o=void 0===s?L:s,i=t.web3Instance,e.abrupt("return",new Promise(function(){var e=Object(O.a)(f.a.mark((function e(t,r){var s,u;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return s=function(e,t){return t-e>=Math.abs(a)},e.prev=1,e.t0=s,e.t1=n,e.next=6,i.eth.getBlockNumber();case 6:if(e.t2=e.sent,!(0,e.t0)(e.t1,e.t2)){e.next=10;break}return t(!0),e.abrupt("return");case 10:e.next=16;break;case 12:return e.prev=12,e.t3=e.catch(1),r(e.t3),e.abrupt("return");case 16:u=setInterval(Object(O.a)(f.a.mark((function e(){return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,null===c||void 0===c?void 0:c.current){e.next=4;break}return clearInterval(u),e.abrupt("return");case 4:return e.t0=s,e.t1=n,e.next=8,i.eth.getBlockNumber();case 8:if(e.t2=e.sent,!(0,e.t0)(e.t1,e.t2)){e.next=12;break}clearInterval(u),t(!0);case 12:e.next=18;break;case 14:e.prev=14,e.t3=e.catch(0),clearInterval(u),r(e.t3);case 18:case"end":return e.stop()}}),e,null,[[0,14]])}))),o);case 17:case"end":return e.stop()}}),e,null,[[1,12]])})));return function(t,n){return e.apply(this,arguments)}}()));case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function G(e,t,n){var c=n||{},s=c.blockCheckOffset,o=c.currentBlockPollIntervalMs,i=Object(d.c)((function(e){var t;return null===(t=e.contracts.BankExtensionContract)||void 0===t?void 0:t.instance.methods})),u=Object(a.useState)(),l=Object(r.a)(u,2),b=l[0],j=l[1],p=Object(a.useState)(!1),h=Object(r.a)(p,2),v=h[0],x=h[1],N=Object(a.useState)(),E=Object(r.a)(N,2),w=E[0],I=E[1],y=Object(a.useState)(T),C=Object(r.a)(y,2),D=C[0],S=C[1],_=Object(m.f)().web3Instance,L=A().isMountedRef,B=Object(a.useCallback)((function(e){return G.apply(this,arguments)}),[L]);function G(){return(G=Object(O.a)(f.a.mark((function e(t){var n,r,a,c,s,o,i;return f.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.bankExtensionMethods,r=t.blockCheckOffset,a=t.currentBlockPollIntervalMs,c=t.memberAddress,s=t.snapshot,o=t.web3Instance,e.prev=1,I(void 0),S(R),e.next=6,M({block:s,blockOffset:r,isMountedRef:L,pollInterval:a,web3Instance:o});case 6:return e.next=8,n.getPriorAmount(c,g.H,s).call();case 8:if(i=e.sent,L.current){e.next=11;break}return e.abrupt("return");case 11:j(i),x(new k.a(i).isGreaterThan(new k.a(0))),S(P),e.next=24;break;case 16:if(e.prev=16,e.t0=e.catch(1),L.current){e.next=20;break}return e.abrupt("return");case 20:x(!1),j(void 0),I(e.t0),S(F);case 24:case"end":return e.stop()}}),e,null,[[1,16]])})))).apply(this,arguments)}return Object(a.useEffect)((function(){e&&t&&i&&_&&B({bankExtensionMethods:i,blockCheckOffset:s,currentBlockPollIntervalMs:o,memberAddress:e,snapshot:t,web3Instance:_})}),[i,s,o,B,e,t,_]),{hasMembershipAtSnapshot:v,memberUnitsAtSnapshot:b,memberUnitsAtSnapshotError:w,memberUnitsAtSnapshotStatus:D}}n(153);var U=p.a.FULFILLED,V=p.a.PENDING,W=p.a.STANDBY;function Y(e){return Object.values(e).every((function(e){return e===U}))}function H(e,t){var n=Object(a.useRef)({start:W,end:W}),c=Object(a.useState)(!1),s=Object(r.a)(c,2),o=s[0],i=s[1],u=Object(a.useState)(!1),d=Object(r.a)(u,2),l=d[0],b=d[1],j=Object(a.useState)(Y(n.current)),f=Object(r.a)(j,2),O=f[0],p=f[1],h=void 0===e||void 0===t||e<=0||t<=0;return Object(a.useEffect)((function(){if(!o&&!h){p((function(){return n.current.start=V,Y(n.current)}));var t=setInterval((function(){var t=Math.floor(Date.now()/1e3)>(null!==e&&void 0!==e?e:0);i(t),n.current.start!==U&&p((function(){return n.current.start=U,Y(n.current)}))}),1e3);return function(){t&&clearInterval(t)}}p((function(){return n.current.start=U,Y(n.current)}))}),[o,h,e]),Object(a.useEffect)((function(){if(!l&&!h){p((function(){return n.current.end=V,Y(n.current)}));var e=setInterval((function(){var e=Math.ceil(Date.now()/1e3)>(null!==t&&void 0!==t?t:0);b(e),n.current.end!==U&&p((function(){return n.current.end=U,Y(n.current)}))}),1e3);return function(){e&&clearInterval(e)}}p((function(){return n.current.end=U,Y(n.current)}))}),[t,l,h]),{hasTimeStarted:o,hasTimeEnded:l,timeStartEndInitReady:O}}},39:function(e,t,n){"use strict";n.d(t,"b",(function(){return r})),n.d(t,"c",(function(){return a})),n.d(t,"a",(function(){return c})),n.d(t,"d",(function(){return s}));var r,a,c,s;n(22),n(17);!function(e){e[e.EXISTS=0]="EXISTS",e[e.SPONSORED=1]="SPONSORED",e[e.PROCESSED=2]="PROCESSED"}(r||(r={})),function(e){e.Submit="Submit",e.Sponsor="Sponsor",e.OffchainVoting="OffchainVoting",e.OffchainVotingSubmitResult="OffchainVotingSubmitResult",e.OffchainVotingGracePeriod="OffchainVotingGracePeriod",e.OnchainVoting="OnchainVoting",e.Process="Process",e.Completed="Completed"}(a||(a={})),function(e){e[e.NOT_STARTED=0]="NOT_STARTED",e[e.IN_PROGRESS=1]="IN_PROGRESS",e[e.DONE=2]="DONE",e[e.FAILED=3]="FAILED"}(c||(c={})),function(e){e.Governance="Governance"}(s||(s={}))},41:function(e,t,n){"use strict";var r=n(4),a=n(61),c=n(3),s=n(1),o=n(0),i=["showAfterMs","text","textProps"];function u(e){return Object(o.jsx)("div",Object(c.a)({className:"loader"},e))}t.a=function(e){var t=e.showAfterMs,n=e.text,d=e.textProps,l=Object(a.a)(e,i),b=Object(s.useState)(!1),j=Object(r.a)(b,2),f=j[0],O=j[1];return Object(s.useEffect)((function(){var e=t&&setTimeout((function(){return O(!0)}),t);return function(){e&&clearTimeout(e)}}),[t]),(!t||t&&f)&&e.text?Object(o.jsxs)("div",{className:"loader-container",children:[Object(o.jsx)(u,Object(c.a)({},l)),Object(o.jsx)("span",Object(c.a)(Object(c.a)({className:"loader__text"},d),{},{children:n}))]}):(!t||t&&f)&&!e.text?Object(o.jsx)(u,Object(c.a)({},l)):null}},42:function(e,t,n){"use strict";var r,a;n.d(t,"b",(function(){return r})),n.d(t,"a",(function(){return a})),function(e){e[e.NOT_STARTED=0]="NOT_STARTED",e[e.TIE=1]="TIE",e[e.PASS=2]="PASS",e[e.NOT_PASS=3]="NOT_PASS",e[e.IN_PROGRESS=4]="IN_PROGRESS",e[e.GRACE_PERIOD=5]="GRACE_PERIOD"}(r||(r={})),function(e){e[e.OK=0]="OK",e[e.WRONG_PROPOSAL_ID=1]="WRONG_PROPOSAL_ID",e[e.INVALID_CHOICE=2]="INVALID_CHOICE",e[e.AFTER_VOTING_PERIOD=3]="AFTER_VOTING_PERIOD",e[e.BAD_SIGNATURE=4]="BAD_SIGNATURE",e[e.INDEX_OUT_OF_BOUND=5]="INDEX_OUT_OF_BOUND"}(a||(a={}))},435:function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var r=n(1),a=n(0),c=Object(r.lazy)((function(){return n.e(6).then(n.bind(null,972))})),s=Object(r.lazy)((function(){return n.e(7).then(n.bind(null,973))})),o={injected:Object(a.jsx)(c,{}),walletconnect:Object(a.jsx)(s,{})};function i(e){var t=e.providerName;return t&&o[t]?Object(a.jsx)(r.Suspense,{fallback:null,children:Object(a.jsx)("span",{className:"walletconnect__wallet-icon",children:o[t]})}):null}},459:function(e){e.exports=JSON.parse('[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"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":"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":"amount","type":"uint256"}],"name":"approve","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"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]')},46:function(e,t,n){"use strict";n.d(t,"a",(function(){return O})),n.d(t,"b",(function(){return h})),n.d(t,"c",(function(){return w})),n.d(t,"d",(function(){return T})),n.d(t,"f",(function(){return G})),n.d(t,"g",(function(){return U})),n.d(t,"e",(function(){return Z})),n.d(t,"h",(function(){return ne})),n.d(t,"i",(function(){return re}));var r=n(2),a=n.n(r),c=n(5),s=n(4),o=n(1),i=n(14),u=n(457),d=n.n(u),l=n(9),b=n(32),j=n(15),f=n(12);function O(e){var t=Object(i.c)((function(e){return e.contracts.DaoRegistryContract})),n=Object(o.useState)(),r=Object(s.a)(n,2),u=r[0],O=r[1],p=Object(o.useState)(),h=Object(s.a)(p,2),m=h[0],v=h[1],x=Object(o.useState)(l.a.STANDBY),N=Object(s.a)(x,2),g=N[0],E=N[1],A=Object(o.useState)(),w=Object(s.a)(A,2),I=w[0],y=w[1],C=Object(j.f)().web3Instance,D=d()(e),S=Object(o.useCallback)((function(){return _.apply(this,arguments)}),[t,e,C]);function _(){return(_=Object(c.a)(a.a.mark((function n(){var r,c,o,i,u,d,j,p,h,m,x,N,g,A;return a.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(e&&t&&C){n.next=2;break}return n.abrupt("return");case 2:return n.prev=2,E(l.a.PENDING),r=Object(f.l)(e,7),c=t.abi,o=t.contractAddress,i=c.find((function(e){return"isNotReservedAddress"===e.name})),u=[o,i,[e]],d=c.find((function(e){return"isNotZeroAddress"===e.name})),j=[o,d,[e]],p=c.find((function(e){return"getAddressIfDelegated"===e.name})),h=[u,j,[o,p,[e]]],n.next=15,Object(b.j)({calls:h,web3Instance:C});case 15:m=n.sent,x=Object(s.a)(m,3),N=x[0],g=x[1],A=x[2],N?g?Object(f.i)(e)!==Object(f.i)(A)?(y(!1),v("The applicant address ".concat(r," is already in use as a delegate key. The address must be removed as a delegate before it can become a member."))):(y(!0),v(void 0)):(y(!1),v("The applicant address ".concat(r," is invalid."))):(y(!1),v("The applicant address ".concat(r," is invalid because it is a DAO reserved address."))),E(l.a.FULFILLED),n.next=30;break;case 24:n.prev=24,n.t0=n.catch(2),y(void 0),v(void 0),O(n.t0),E(l.a.REJECTED);case 30:case"end":return n.stop()}}),n,null,[[2,24]])})))).apply(this,arguments)}return Object(o.useEffect)((function(){D&&!e&&(O(void 0),v(void 0),y(void 0),E(l.a.STANDBY)),e&&S()}),[e,S,D]),{checkApplicantError:u,checkApplicantInvalidMsg:m,checkApplicantStatus:g,isApplicantValid:I}}var p=[];function h(e){var t=Object(i.c)((function(e){var t;return null===(t=e.contracts.DaoRegistryContract)||void 0===t?void 0:t.abi.find((function(e){return"proposals"===e.name}))})),n=Object(i.c)((function(e){var t;return null===(t=e.contracts.DaoRegistryContract)||void 0===t?void 0:t.contractAddress})),r=Object(o.useState)(p),u=Object(s.a)(r,2),d=u[0],f=u[1],O=Object(o.useState)(l.a.STANDBY),h=Object(s.a)(O,2),m=h[0],v=h[1],x=Object(o.useState)(),N=Object(s.a)(x,2),g=N[0],E=N[1],A=Object(j.f)().web3Instance;function w(){return(w=Object(c.a)(a.a.mark((function e(t){var n,r,c,s,o,i,u;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.proposalIds,r=t.proposalsAbi,c=t.registryAddress,s=t.web3Instance,e.prev=1,n.length){e.next=4;break}return e.abrupt("return");case 4:if((o=n.filter(s.utils.isHexStrict)).length){e.next=9;break}return v(l.a.FULFILLED),f([]),e.abrupt("return");case 9:return v(l.a.PENDING),E(void 0),i=o.map((function(e){return[c,r,[e]]})),e.next=14,Object(b.j)({calls:i,web3Instance:s});case 14:u=e.sent,f(o.map((function(e,t){return[e,u[t]]}))),v(l.a.FULFILLED),e.next=24;break;case 19:e.prev=19,e.t0=e.catch(1),f(p),E(e.t0),v(l.a.REJECTED);case 24:case"end":return e.stop()}}),e,null,[[1,19]])})))).apply(this,arguments)}return Object(o.useEffect)((function(){e.length&&t&&n&&A&&function(e){w.apply(this,arguments)}({proposalIds:e,proposalsAbi:t,registryAddress:n,web3Instance:A})}),[e,t,n,A]),{daoProposals:d,daoProposalsStatus:m,daoProposalsError:g}}var m=n(458),v=n(34),x=n(8),N=n(22),g=n(11),E=n(36),A=n(7);function w(e){var t=Object(i.c)((function(e){var t;return null===(t=e.contracts.BankExtensionContract)||void 0===t?void 0:t.abi})),n=Object(i.c)((function(e){var t;return null===(t=e.contracts.BankExtensionContract)||void 0===t?void 0:t.contractAddress})),r=Object(o.useState)([]),u=Object(s.a)(r,2),d=u[0],f=u[1],O=Object(o.useState)(l.a.STANDBY),p=Object(s.a)(O,2),h=p[0],w=p[1],I=Object(o.useState)(),y=Object(s.a)(I,2),C=y[0],D=y[1],S=Object(j.f)().web3Instance,_=Object(E.f)().isMountedRef,k=null===t||void 0===t?void 0:t.find((function(e){return"getPriorAmount"===e.name})),T=Object(o.useCallback)((function(e){return R.apply(this,arguments)}),[]);function R(){return(R=Object(c.a)(a.a.mark((function e(t){var n,r,c,o,i,u,d,l,j,f,O,p,h;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.bankAddress,r=t.getPriorAmountABI,c=t.snapshot,o=t.voterAddressesAndChoices,i=t.web3Instance,e.prev=1,u={},Object(x.a)(u,A.e.Yes,{percentage:0,units:0}),Object(x.a)(u,A.e.No,{percentage:0,units:0}),Object(x.a)(u,"totalUnits",0),d=u,l=[n,r,[g.E,g.H,c.toString()]],j=o.map((function(e){var t=Object(s.a)(e,1)[0];return[n,r,[t,g.H,c.toString()]]})),f=[l].concat(Object(v.a)(j)),e.next=8,Object(b.j)({calls:f,web3Instance:i});case 8:return O=e.sent,p=Object(m.a)(O),h=p[0],p.slice(1).forEach((function(e,t){var n=N.VoteChoicesIndex[o[t][1]]===N.VoteChoicesIndex[N.VoteChoicesIndex.Yes]?A.e.Yes:A.e.No;d[n].units+=Number(e)})),d[A.e.Yes].percentage=d[A.e.Yes].units/Number(h)*100,d[A.e.No].percentage=d[A.e.No].units/Number(h)*100,d.totalUnits=Number(h),e.abrupt("return",d);case 19:throw e.prev=19,e.t0=e.catch(1),e.t0;case 22:case"end":return e.stop()}}),e,null,[[1,19]])})))).apply(this,arguments)}return Object(o.useEffect)((function(){var t=Array.isArray(e)?e:[e];if(n&&k&&t.length&&S){w(l.a.PENDING);var r=t.map(function(){var e=Object(c.a)(a.a.mark((function e(t){var r,c,s,o,i,u;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(c=null===t||void 0===t?void 0:t.msg.payload.snapshot,(s=null===t||void 0===t?void 0:t.idInSnapshot)&&c){e.next=4;break}return e.abrupt("return");case 4:if((o=null===t||void 0===t||null===(r=t.votes)||void 0===r?void 0:r.map((function(e){var t=e[Object.keys(e)[0]];return[t.msg.payload.metadata.memberAddress,t.msg.payload.choice]})))&&o.length){e.next=7;break}return e.abrupt("return");case 7:return i=Object.entries(Object.fromEntries(o)),e.prev=8,e.next=11,T({bankAddress:n,getPriorAmountABI:k,snapshot:c,voterAddressesAndChoices:i,web3Instance:S});case 11:return u=e.sent,e.abrupt("return",[s,u]);case 15:return e.prev=15,e.t0=e.catch(8),e.abrupt("return");case 18:case"end":return e.stop()}}),e,null,[[8,15]])})));return function(t){return e.apply(this,arguments)}}());Promise.all(r).then((function(e){return e.filter((function(e){return e}))})).then((function(e){_.current&&(w(l.a.FULFILLED),f(e),D(void 0))})).catch((function(e){_.current&&(w(l.a.REJECTED),f([]),D(e))}))}}),[n,k,T,_,e,S]),{offchainVotingResults:d,offchainVotingResultsError:C,offchainVotingResultsStatus:h}}var I=n(3),y=n(54),C=n(51),D=[];function S(e){var t=Object(i.c)((function(e){var t;return null===(t=e.contracts.DaoRegistryContract)||void 0===t?void 0:t.contractAddress})),r=Object(i.c)((function(e){var t;return null===(t=e.contracts.DaoRegistryContract)||void 0===t?void 0:t.abi})),u=Object(j.f)().web3Instance,d=Object(o.useState)(D),f=Object(s.a)(d,2),O=f[0],p=f[1],h=Object(o.useState)(),m=Object(s.a)(h,2),v=m[0],x=m[1],N=Object(o.useState)(l.a.STANDBY),g=Object(s.a)(N,2),E=g[0],A=g[1],w=Object(o.useCallback)((function(){return I.apply(this,arguments)}),[e,r,t,u]);function I(){return(I=Object(c.a)(a.a.mark((function s(){var o,i,d,j,f,O,h,m,v,N,g,E;return a.a.wrap((function(s){for(;;)switch(s.prev=s.next){case 0:if(e.length&&r&&t&&u){s.next=2;break}return s.abrupt("return");case 2:if((o=e.filter(u.utils.isHexStrict)).length){s.next=7;break}return p(D),A(l.a.FULFILLED),s.abrupt("return");case 7:if(s.prev=7,i=r.find((function(e){return"votingAdapter"===e.name}))){s.next=11;break}throw new Error('No "votingAdapter" ABI function was found in the DAO registry ABI.');case 11:return d=o.map((function(e){return[t,i,[e]]})),A(l.a.PENDING),s.next=15,Object(b.j)({calls:d,web3Instance:u});case 15:return j=s.sent,s.next=18,n.e(0).then(n.t.bind(null,949,3));case 18:if(f=s.sent,O=f.default,h=O.find((function(e){return"getAdapterName"===e.name}))){s.next=23;break}throw new Error('No "getAdapterName" ABI function was found in the IVoting ABI.');case 23:if(m=o.filter((function(e,t){return j[t]!==y.a})),(v=j.filter((function(e){return e!==y.a}))).length){s.next=29;break}return p(D),A(l.a.FULFILLED),s.abrupt("return");case 29:return N=v.map((function(e){return[e,h,[]]})),s.next=32,Object(b.j)({calls:N,web3Instance:u});case 32:return g=s.sent,s.next=35,Promise.all(m.map(function(){var e=Object(c.a)(a.a.mark((function e(t,n){var r,c;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(C.d)(g[n]);case 2:return r=e.sent,c=v[n],e.abrupt("return",[t,{votingAdapterName:g[n],votingAdapterAddress:c,getVotingAdapterABI:function(){return r},getWeb3VotingAdapterContract:function(){return new u.eth.Contract(r,c)}}]);case 5:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}()));case 35:E=s.sent,p(E),A(l.a.FULFILLED),s.next=45;break;case 40:s.prev=40,s.t0=s.catch(7),A(l.a.REJECTED),p([]),x(s.t0);case 45:case"end":return s.stop()}}),s,null,[[7,40]])})))).apply(this,arguments)}return Object(o.useEffect)((function(){w()}),[w]),{proposalsVotingAdapters:O,proposalsVotingAdaptersError:v,proposalsVotingAdaptersStatus:E}}var _="Something went wrong while getting the proposal.",k="Proposal was not found.";function T(e,t){var n,r=Object(o.useState)(),i=Object(s.a)(r,1)[0],u=Object(o.useState)(),d=Object(s.a)(u,2),b=d[0],j=d[1],f=Object(o.useState)(),O=Object(s.a)(f,2),p=O[0],h=O[1],m=Object(o.useState)(!1),v=Object(s.a)(m,2),x=v[0],A=v[1],w=Object(o.useState)(),y=Object(s.a)(w,2),C=y[0],D=y[1],T=Object(o.useState)(l.a.STANDBY),R=Object(s.a)(T,2),P=R[0],F=R[1],L=Object(o.useState)([e]),M=Object(s.a)(L,2),B=M[0],G=M[1],U=Object(o.useState)(l.a.STANDBY),V=Object(s.a)(U,2),W=V[0],Y=V[1],H=Object(o.useState)(),K=Object(s.a)(H,2),z=K[0],q=K[1],J=Object(E.a)(),Q=J.abortController,X=J.isMountedRef,$=Object(E.b)(),Z=Object(s.a)($,2),ee=Z[0],te=Z[1],ne=S(B),re=ne.proposalsVotingAdapters,ae=ne.proposalsVotingAdaptersError,ce=ne.proposalsVotingAdaptersStatus,se=Object(o.useCallback)((function(){return le.apply(this,arguments)}),[null===Q||void 0===Q?void 0:Q.signal,e,X]),oe=Object(o.useCallback)((function(){return be.apply(this,arguments)}),[null===Q||void 0===Q?void 0:Q.signal,e,X,t]),ie=Object(o.useCallback)((function(){return je.apply(this,arguments)}),[se,oe]),ue=p?N.SnapshotType.proposal:b?N.SnapshotType.draft:void 0,de=b||p?{daoProposal:i,daoProposalVotingAdapter:null===(n=re[0])||void 0===n?void 0:n[1],getCommonSnapshotProposalData:function(){switch(ue){case N.SnapshotType.draft:return b;case N.SnapshotType.proposal:return p;default:return}},refetchProposalOrDraft:function(){te({type:"increment"})},snapshotDraft:b,snapshotProposal:p,snapshotType:ue}:void 0;function le(){return(le=Object(c.a)(a.a.mark((function t(){var n,r,c,s;return a.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,F(l.a.PENDING),t.next=4,fetch("".concat(g.C,"/api/").concat(g.D,"/draft/").concat(e),{signal:null===Q||void 0===Q?void 0:Q.signal});case 4:if((n=t.sent).ok){t.next=7;break}throw new Error(_);case 7:return t.next=9,n.json();case 9:if(r=t.sent,X.current){t.next=12;break}return t.abrupt("return");case 12:if(r&&Object.keys(r).length){t.next=15;break}throw A(!0),new Error(k);case 15:return c=Object.keys(r)[0],s=Object(I.a)({idInDAO:c,idInSnapshot:c},r[c]),F(l.a.FULFILLED),j(s),t.abrupt("return",s);case 22:if(t.prev=22,t.t0=t.catch(0),X.current){t.next=26;break}return t.abrupt("return");case 26:F(l.a.REJECTED),D(t.t0);case 28:case"end":return t.stop()}}),t,null,[[0,22]])})))).apply(this,arguments)}function be(){return(be=Object(c.a)(a.a.mark((function n(){var r,c,s,o,i,u;return a.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.prev=0,F(l.a.PENDING),n.next=4,fetch("".concat(g.C,"/api/").concat(g.D,"/proposal/").concat(e,"?searchUniqueDraftId=true&includeVotes=true"),{signal:null===Q||void 0===Q?void 0:Q.signal});case 4:if((c=n.sent).ok){n.next=9;break}if(t!==N.SnapshotType.proposal){n.next=8;break}throw new Error(_);case 8:return n.abrupt("return");case 9:return n.next=11,c.json();case 11:if(s=n.sent,X.current){n.next=14;break}return n.abrupt("return");case 14:if(s&&Object.keys(s).length){n.next=19;break}if(t!==N.SnapshotType.proposal){n.next=18;break}throw A(!0),new Error(k);case 18:return n.abrupt("return");case 19:return o=Object.keys(s)[0],i=(null===(r=s[o])||void 0===r?void 0:r.data.erc712DraftHash)||o,u=Object(I.a)({idInDAO:i,idInSnapshot:o},s[o]),F(l.a.FULFILLED),h(u),n.abrupt("return",u);case 27:if(n.prev=27,n.t0=n.catch(0),X.current){n.next=31;break}return n.abrupt("return");case 31:F(l.a.REJECTED),D(n.t0);case 33:case"end":return n.stop()}}),n,null,[[0,27]])})))).apply(this,arguments)}function je(){return(je=Object(c.a)(a.a.mark((function e(){var t,n;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,oe();case 2:if(t=e.sent){e.next=9;break}return e.next=6,se();case 6:return n=e.sent,j(n),e.abrupt("return");case 9:h(t);case 10:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return Object(o.useEffect)((function(){if(null===Q||void 0===Q?void 0:Q.signal)switch(t){case N.SnapshotType.draft:se();break;case N.SnapshotType.proposal:oe();break;default:ie()}}),[null===Q||void 0===Q?void 0:Q.signal,se,oe,ie,ee,t]),Object(o.useEffect)((function(){0!==ee&&G([e])}),[e,ee]),Object(o.useEffect)((function(){var e=l.a.STANDBY,t=l.a.PENDING,n=l.a.FULFILLED,r=l.a.REJECTED,a=[P,ce];P!==e?a.some((function(e){return e===t}))&&0===ee?Y(t):a.every((function(e){return e===n}))?Y(n):P!==n||ce!==n||re.length?a.some((function(e){return e===r}))&&Y(r):Y(n):Y(e)}),[P,re.length,ce,ee]),Object(o.useEffect)((function(){q([C,ae].find((function(e){return e})))}),[C,ae]),{proposalData:de,proposalError:z,proposalNotFound:x,proposalStatus:W}}var R=n(17);var P=[];function F(e){return L.apply(this,arguments)}function L(){return(L=Object(c.a)(a.a.mark((function e(t){var n,r,c,o;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,n="".concat(g.C,"/api/").concat(g.D),e.next=4,fetch("".concat(n,"/drafts/").concat(t));case 4:if((r=e.sent).ok){e.next=7;break}throw new Error("Something went wrong while fetching the Snapshot drafts.");case 7:return e.next=9,r.json();case 9:return c=e.sent,o=Object.entries(c).filter((function(e){var t=Object(s.a)(e,2);t[0];return!1===t[1].data.sponsored})),e.abrupt("return",o);case 14:throw e.prev=14,e.t0=e.catch(0),e.t0;case 17:case"end":return e.stop()}}),e,null,[[0,14]])})))).apply(this,arguments)}function M(e){return B.apply(this,arguments)}function B(){return(B=Object(c.a)(a.a.mark((function e(t){var n,r,c,o;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,n="".concat(g.C,"/api/").concat(g.D),e.next=4,fetch("".concat(n,"/proposals/").concat(t,"?includeVotes=true"));case 4:if((r=e.sent).ok){e.next=7;break}throw new Error("Something went wrong while fetching the Snapshot proposals.");case 7:return e.next=9,r.json();case 9:return c=e.sent,o=Object.entries(c).map((function(e){var t=Object(s.a)(e,2),n=t[0],r=t[1];return[r.data.erc712DraftHash||n,r]})),e.abrupt("return",o);case 14:throw e.prev=14,e.t0=e.catch(0),e.t0;case 17:case"end":return e.stop()}}),e,null,[[0,14]])})))).apply(this,arguments)}function G(e){var t=e.adapterName,n=e.includeProposalsExistingOnlyOffchain,r=void 0!==n&&n,u=Object(o.useState)(),d=Object(s.a)(u,2),O=d[0],p=d[1],m=Object(o.useState)(P),g=Object(s.a)(m,2),E=g[0],A=g[1],w=Object(o.useState)(l.a.STANDBY),y=Object(s.a)(w,2),C=y[0],D=y[1],_=Object(o.useState)(),k=Object(s.a)(_,2),T=k[0],L=k[1],B=Object(o.useState)(P),G=Object(s.a)(B,2),V=G[0],W=G[1],Y=Object(o.useState)(P),H=Object(s.a)(Y,2),K=H[0],z=H[1],q=Object(o.useState)(l.a.STANDBY),J=Object(s.a)(q,2),Q=J[0],X=J[1],$=Object(o.useState)(),Z=Object(s.a)($,2),ee=Z[0],te=Z[1],ne=Object(i.c)((function(e){return e.contracts})),re=h(Object(o.useMemo)((function(){return E.map((function(e){return e[0]}))}),[E])),ae=re.daoProposals,ce=re.daoProposalsError,se=re.daoProposalsStatus,oe=S(V),ie=oe.proposalsVotingAdapters,ue=oe.proposalsVotingAdaptersError,de=oe.proposalsVotingAdaptersStatus,le=U(ie),be=le.proposalsVotingState,je=le.proposalsVotingStateError,fe=le.proposalsVotingStateStatus,Oe=function(e){var t=Object(i.c)((function(e){var t;return null===(t=e.contracts.DaoRegistryContract)||void 0===t?void 0:t.contractAddress})),n=Object(i.c)((function(e){var t;return null===(t=e.contracts.DaoRegistryContract)||void 0===t?void 0:t.abi})),r=Object(j.f)().web3Instance,u=Object(o.useState)([]),d=Object(s.a)(u,2),f=d[0],O=d[1],p=Object(o.useState)(),h=Object(s.a)(p,2),m=h[0],v=h[1],N=Object(o.useState)(l.a.STANDBY),g=Object(s.a)(N,2),E=g[0],A=g[1],w=Object(o.useCallback)((function(){return I.apply(this,arguments)}),[e,n,t,r]);function I(){return(I=Object(c.a)(a.a.mark((function o(){var i,u,d;return a.a.wrap((function(o){for(;;)switch(o.prev=o.next){case 0:if(e.length&&n&&t&&r){o.next=2;break}return o.abrupt("return");case 2:if((i=e.filter((function(e){var t=Object(s.a)(e,1)[0];return r.utils.isHexStrict(t)}))).length){o.next=7;break}return A(l.a.FULFILLED),O([]),o.abrupt("return");case 7:return o.prev=7,A(l.a.PENDING),o.next=11,Promise.all(i.map(function(){var e=Object(c.a)(a.a.mark((function e(n){var r,c,o,i,u,d;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=Object(s.a)(n,2),c=r[0],o=r[1],i=o.votingAdapterAddress,u=o.getVotingAdapterABI,d=o.votingAdapterName,e.t0=i,e.next=4,y(d,u());case 4:return e.t1=e.sent,e.t2=[t,c],e.abrupt("return",[e.t0,e.t1,e.t2]);case 7:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()));case 11:return u=o.sent,o.next=14,Object(b.j)({calls:u,web3Instance:r});case 14:d=o.sent,A(l.a.FULFILLED),O(i.map((function(e,t){var n=Object(s.a)(e,2),r=n[0],a=n[1].votingAdapterName;return[r,Object(x.a)({},a,d[t])]}))),o.next=24;break;case 19:o.prev=19,o.t0=o.catch(7),A(l.a.REJECTED),O([]),v(o.t0);case 24:case"end":return o.stop()}}),o,null,[[7,19]])})))).apply(this,arguments)}function y(e,t){return C.apply(this,arguments)}function C(){return(C=Object(c.a)(a.a.mark((function e(t,n){var r,c;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:e.prev=0,e.t0=t,e.next=e.t0===R.c.OffchainVotingContract?4:e.t0===R.c.VotingContract?8:12;break;case 4:if(r=n.find((function(e){return"votes"===e.name}))){e.next=7;break}throw new Error('No "votes" function ABI was found for "'.concat(t,'".'));case 7:return e.abrupt("return",r);case 8:if(c=n.find((function(e){return"votes"===e.name}))){e.next=11;break}throw new Error('No "votes" function ABI was found for "'.concat(t,'".'));case 11:return e.abrupt("return",c);case 12:throw new Error('No voting adapter name was found for "'.concat(t,'".'));case 13:e.next=18;break;case 15:throw e.prev=15,e.t1=e.catch(0),e.t1;case 18:case"end":return e.stop()}}),e,null,[[0,15]])})))).apply(this,arguments)}return Object(o.useEffect)((function(){w()}),[w]),{proposalsVotes:f,proposalsVotesError:m,proposalsVotesStatus:E}}(ie),pe=Oe.proposalsVotes,he=Oe.proposalsVotesError,me=Oe.proposalsVotesStatus;function ve(){return(ve=Object(c.a)(a.a.mark((function e(t){var n,r,c;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,D(l.a.PENDING),L(void 0),e.next=5,F(t);case 5:return n=e.sent,e.next=8,M(t);case 8:if(r=e.sent,(c=[].concat(Object(v.a)(n),Object(v.a)(r))).length){e.next=13;break}return D(l.a.FULFILLED),e.abrupt("return");case 13:A(c),D(l.a.FULFILLED),e.next=22;break;case 17:e.prev=17,e.t0=e.catch(0),D(l.a.REJECTED),A(P),L(e.t0);case 22:case"end":return e.stop()}}),e,null,[[0,17]])})))).apply(this,arguments)}return Object(o.useEffect)((function(){var e,n,r=null===(e=Object.entries(ne).find((function(e){var n=Object(s.a)(e,2),r=(n[0],n[1]);return(null===r||void 0===r?void 0:r.adapterOrExtensionName)===t})))||void 0===e||null===(n=e[1])||void 0===n?void 0:n.contractAddress;p(r)}),[O,t,ne]),Object(o.useEffect)((function(){O&&function(e){ve.apply(this,arguments)}(O)}),[O]),Object(o.useEffect)((function(){if(ae.length)return W(r?ae.map((function(e){return Object(s.a)(e,1)[0]})):ae.filter((function(e){var t=Object(s.a)(e,2);t[0];return"0"!==t[1].flags})).map((function(e){return Object(s.a)(e,1)[0]})))}),[ae,r]),Object(o.useEffect)((function(){if(Q===l.a.FULFILLED){var e=V.map((function(e){var t,n,r,a=ae.find((function(t){var n=Object(s.a)(t,1)[0];return Object(f.i)(n)===Object(f.i)(e)}))||[],c=Object(s.a)(a,2)[1],o=E.find((function(t){var n=Object(s.a)(t,1)[0];return Object(f.i)(n)===Object(f.i)(e)}))||[],i=Object(s.a)(o,2),u=i[0],d=i[1],l=(null===d||void 0===d?void 0:d.msg.type)===N.SnapshotType.draft,b=u&&l?Object(I.a)(Object(I.a)({},d),{},{idInDAO:e,idInSnapshot:u}):void 0,j=u&&!l?Object(I.a)(Object(I.a)({},d),{},{idInDAO:e,idInSnapshot:u}):void 0,O=null===(t=ie.find((function(t){var n=Object(s.a)(t,1)[0];return Object(f.i)(n)===Object(f.i)(e)})))||void 0===t?void 0:t[1],p=null===(n=be.find((function(t){var n=Object(s.a)(t,1)[0];return Object(f.i)(n)===Object(f.i)(e)})))||void 0===n?void 0:n[1];return{daoProposal:c,daoProposalVote:null===(r=pe.find((function(t){var n=Object(s.a)(t,1)[0];return Object(f.i)(e)===Object(f.i)(n)})))||void 0===r?void 0:r[1],daoProposalVotingAdapter:O,daoProposalVotingState:p,idInDAO:e,snapshotDraft:b,snapshotProposal:j,snapshotType:l?N.SnapshotType.draft:N.SnapshotType.proposal,getCommonSnapshotProposalData:function(){},refetchProposalOrDraft:function(){}}})).filter((function(e){return e.snapshotDraft||e.snapshotProposal}));z(e)}}),[V,ae,Q,pe,ie,be,E]),Object(o.useEffect)((function(){var e=l.a.STANDBY,t=l.a.PENDING,n=l.a.FULFILLED,r=l.a.REJECTED,a=[se,de,fe,me,C];C!==e?a.some((function(e){return e===t}))?X(t):a.every((function(e){return e===n}))?X(n):(C!==n||E.length)&&(de!==n||ie.length)?a.some((function(e){return e===r}))&&X(r):X(n):X(e)}),[V.length,se,me,ie,de,fe,E.length,C]),Object(o.useEffect)((function(){te([ce,he,ue,je,T].find((function(e){return e})))}),[ce,he,ue,je,T]),{proposals:K,proposalsError:ee,proposalsStatus:Q}}function U(e){var t=Object(i.c)((function(e){var t;return null===(t=e.contracts.DaoRegistryContract)||void 0===t?void 0:t.contractAddress})),r=Object(j.f)().web3Instance,u=Object(o.useState)([]),d=Object(s.a)(u,2),f=d[0],O=d[1],p=Object(o.useState)(),h=Object(s.a)(p,2),m=h[0],v=h[1],x=Object(o.useState)(l.a.STANDBY),N=Object(s.a)(x,2),g=N[0],E=N[1],A=Object(o.useCallback)((function(){return w.apply(this,arguments)}),[e,t,r]);function w(){return(w=Object(c.a)(a.a.mark((function c(){var o,i,u,d,j;return a.a.wrap((function(a){for(;;)switch(a.prev=a.next){case 0:if(t&&e.length&&r){a.next=2;break}return a.abrupt("return");case 2:if((o=e.filter((function(e){var t=Object(s.a)(e,1)[0];return r.utils.isHexStrict(t)}))).length){a.next=6;break}return E(l.a.FULFILLED),a.abrupt("return");case 6:return a.prev=6,a.next=9,n.e(0).then(n.t.bind(null,949,3));case 9:if(i=a.sent.default,u=i.find((function(e){return"voteResult"===e.name}))){a.next=13;break}throw new Error('No "voteResult" ABI function was found on the "IVoting" contract.');case 13:return d=o.map((function(e){var n=Object(s.a)(e,2),r=n[0];return[n[1].votingAdapterAddress,u,[t,r]]})),E(l.a.PENDING),a.next=17,Object(b.j)({calls:d,web3Instance:r});case 17:j=a.sent,E(l.a.FULFILLED),O(o.map((function(e,t){return[Object(s.a)(e,1)[0],j[t]]}))),a.next=27;break;case 22:a.prev=22,a.t0=a.catch(6),E(l.a.REJECTED),O([]),v(a.t0);case 27:case"end":return a.stop()}}),c,null,[[6,22]])})))).apply(this,arguments)}return Object(o.useEffect)((function(){A()}),[A]),{proposalsVotingState:f,proposalsVotingStateError:m,proposalsVotingStateStatus:g}}var V=n(25),W=n(39),Y=n(42),H=W.c.Completed,K=W.c.OffchainVotingGracePeriod,z=W.c.OffchainVotingSubmitResult,q=W.c.OffchainVoting,J=W.c.Process,Q=W.c.Sponsor,X=W.c.Submit,$="production"===g.m?15e3:5e3;function Z(e){var t=e.countdownVotingEndSeconds,n=void 0===t?0:t,r=e.countdownVotingStartSeconds,u=void 0===r?0:r,d=e.pollInterval,l=void 0===d?$:d,O=e.proposal,p=e.useCountdownToCheckInVoting,h=void 0!==p&&p,m=Object(j.f)().web3Instance,v=Object(i.c)((function(e){var t;return null===(t=e.contracts.DaoRegistryContract)||void 0===t?void 0:t.contractAddress})),x=Object(i.c)((function(e){var t;return null===(t=e.contracts.DaoRegistryContract)||void 0===t?void 0:t.abi})),N=Object(o.useState)(),g=Object(s.a)(N,2),A=g[0],w=g[1],I=Object(o.useState)(!1),D=Object(s.a)(I,2),S=D[0],_=D[1],k=Object(o.useState)(),T=Object(s.a)(k,2),R=T[0],P=T[1],F=Object(o.useState)(),L=Object(s.a)(F,2),M=L[0],B=L[1],G=Object(o.useState)(),U=Object(s.a)(G,2),Z=U[0],ee=U[1],te=Object(o.useState)(),ne=Object(s.a)(te,2),re=ne[0],ae=ne[1],ce=Object(o.useRef)(),se=Object(o.useRef)(!1),oe=Object(E.i)(u,n),ie=oe.hasTimeStarted,ue=oe.hasTimeEnded,de=oe.timeStartEndInitReady,le=S&&(!h||de),be=O.daoProposalVotingAdapter,je=O.snapshotDraft,fe=O.snapshotProposal,Oe=(null===je||void 0===je?void 0:je.idInDAO)||(null===fe||void 0===fe?void 0:fe.idInDAO),pe=!!R&&Object(C.e)(W.b.EXISTS,R.flags),he=!!R&&Object(C.e)(W.b.SPONSORED,R.flags),me=!!R&&Object(C.e)(W.b.PROCESSED,R.flags),ve=null===be||void 0===be?void 0:be.votingAdapterAddress,xe=null===be||void 0===be?void 0:be.getVotingAdapterABI(),Ne=Object(V.isAddress)((null===M||void 0===M?void 0:M.reporter)||"")&&Object(f.i)((null===M||void 0===M?void 0:M.reporter)||"")!==y.a,ge=h?ie&&!ue:Y.b[Z||""]===Y.b[Y.b.IN_PROGRESS],Ee=Y.b[Z||""]===Y.b[Y.b.GRACE_PERIOD],Ae=Object(o.useCallback)((function(){return we.apply(this,arguments)}),[be,x,v,xe,ve,Oe,m]);function we(){return(we=Object(c.a)(a.a.mark((function e(){var t,n,r,c,o,i,u,d,l,j,f,O;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,x&&v&&Oe&&m){e.next=3;break}return e.abrupt("return");case 3:if(t=x.filter((function(e){return"proposals"===e.name}))[0],be){e.next=13;break}return e.next=7,Object(b.j)({calls:[[v,t,[Oe]]],web3Instance:m});case 7:return n=e.sent,r=Object(s.a)(n,1),c=r[0],P(c),_(!0),e.abrupt("return",c);case 13:if(xe&&ve){e.next=15;break}return e.abrupt("return");case 15:return o=xe.filter((function(e){return"voteResult"===e.name}))[0],i=xe.filter((function(e){return"votes"===e.name}))[0],u=[[v,t,[Oe]],[ve,i,[v,Oe]],[ve,o,[v,Oe]]],e.next=20,Object(b.j)({calls:u,web3Instance:m});case 20:return d=e.sent,l=Object(s.a)(d,3),j=l[0],f=l[1],O=l[2],P(j),B(f),ee(O),_(!0),e.abrupt("return",{proposal:j,voteResult:O,votes:f});case 32:throw e.prev=32,e.t0=e.catch(0),e.t0;case 35:case"end":return e.stop()}}),e,null,[[0,32]])})))).apply(this,arguments)}function Ie(){ce.current&&(clearInterval(ce.current),ce.current=void 0)}return Object(o.useEffect)((function(){S||Ae().catch((function(e){ae(e)}))}),[Ae,S]),Object(o.useEffect)((function(){me&&(se.current=!0),Ie();var e=setInterval(Object(c.a)(a.a.mark((function e(){return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,se.current&&Ie(),e.next=4,Ae();case 4:e.next=10;break;case 6:e.prev=6,e.t0=e.catch(0),Ie(),ae(e.t0);case 10:case"end":return e.stop()}}),e,null,[[0,6]])}))),l);ce.current=e}),[me,l,Ae]),Object(o.useEffect)((function(){return me&&Ie(),function(){Ie()}}),[me]),Object(o.useEffect)((function(){if(le){var e=void 0===A;pe||he||me||A!==X&&!e?!pe||ge||A!==X&&!e?!he||!ge||Ne||A!==X&&A!==Q&&!e?!he||ge||Ne||A!==q&&!e?he&&!ge&&Ne&&Ee&&(A===z||e)?w(K):!he||ge||!Ne||Ee||A!==K&&!e?!me||A!==J&&!e||w(H):w(J):w(z):w(q):w(Q):w(X)}else w(void 0)}),[pe,me,he,A,le,ge,Ee,Ne]),{daoProposal:R,daoProposalVote:M,daoProposalVoteResult:Z,proposalFlowStatusError:re,status:A,stopPollingForStatus:Ie}}var ee=n(57),te=n(104);function ne(){var e=Object(i.c)((function(e){var t;return null===(t=e.contracts.DaoRegistryContract)||void 0===t?void 0:t.contractAddress})),t=Object(i.c)((function(e){return e.contracts})),n=Object(i.c)((function(e){var t;return null===(t=e.connectedMember)||void 0===t?void 0:t.memberAddress})),r=Object(te.a)(),u=r.account,d=r.provider,l=r.web3Instance,j=Object(o.useState)(),f=Object(s.a)(j,2),O=f[0],p=f[1],h=Object(o.useState)(),m=Object(s.a)(h,2),v=m[0],x=m[1],E=Object(o.useState)(A.f.STANDBY),w=Object(s.a)(E,2),C=w[0],D=w[1];function S(){return(S=Object(c.a)(a.a.mark((function r(c){var s,o,i,j,f,O,h,m,v,E,w,C,S,_,k,T,R,P,F,L,M,B;return a.a.wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(s=c.partialVoteData,o=c.adapterName,i=c.proposalIdInDAO,j=c.proposalIdInSnapshot,r.prev=1,l){r.next=4;break}throw new Error("No Web3 instance was found.");case 4:if(u){r.next=6;break}throw new Error("No account was found.");case 6:if(n){r.next=8;break}throw new Error("No member address was found.");case 8:if(e){r.next=10;break}throw new Error('No "DaoRegistry" address was found.');case 10:if(g.C){r.next=12;break}throw new Error('No "SNAPSHOT_HUB_API_URL" was found.');case 12:if(g.D){r.next=14;break}throw new Error('No Snapshot "SPACE" was found.');case 14:return D(A.f.AWAITING_CONFIRM),f=o?Object(b.d)(o,t):y.a,O=s.choice,h=s.metadata,m=void 0===h?{}:h,r.next=19,Object(N.getSpace)(g.C,g.D);case 19:return v=r.sent,E=v.data,w={chainId:g.k,choice:O,metadata:Object(I.a)(Object(I.a)({},m),{},{memberAddress:n})},C={proposalId:i,space:g.D,token:E.token},r.next=25,Object(N.buildVoteMessage)(w,C,g.C);case 25:return S=r.sent,_=Object(N.prepareVoteMessage)({timestamp:S.timestamp,payload:{proposalId:S.payload.proposalId,choice:N.VoteChoicesIndex[O]}}),k=Object(N.getDomainDefinition)(Object(I.a)(Object(I.a)({},_),{},{type:N.SnapshotType.vote}),e,f,g.k),T=k.domain,R=k.types,P=JSON.stringify({types:R,domain:T,primaryType:ee.a,message:_}),r.next=31,Object(N.signMessage)(d,u,P);case 31:return F=r.sent,D(A.f.PENDING),r.next=35,Object(N.submitMessage)(g.C,u,Object(I.a)(Object(I.a)({},S),{},{payload:Object(I.a)(Object(I.a)({},S.payload),{},{proposalId:j})}),F,{actionId:T.actionId,chainId:T.chainId,verifyingContract:T.verifyingContract,message:_});case 35:return L=r.sent,M=L.data,B={data:S,signature:F,uniqueId:M.uniqueId},D(A.f.FULFILLED),p(B),r.abrupt("return",B);case 43:throw r.prev=43,r.t0=r.catch(1),D(A.f.REJECTED),x(r.t0),r.t0;case 48:case"end":return r.stop()}}),r,null,[[1,43]])})))).apply(this,arguments)}return{signAndSendVote:function(e){return S.apply(this,arguments)},voteData:O,voteDataError:v,voteDataStatus:C}}function re(){var e=Object(i.c)((function(e){var t;return null===(t=e.contracts.DaoRegistryContract)||void 0===t?void 0:t.contractAddress})),t=Object(i.c)((function(e){var t;return null===(t=e.contracts.DaoRegistryContract)||void 0===t?void 0:t.instance})),n=Object(i.c)((function(e){return e.contracts})),r=Object(te.a)(),u=r.account,d=r.provider,l=r.web3Instance,j=Object(o.useState)(),f=Object(s.a)(j,2),O=f[0],p=f[1],h=Object(o.useState)(),m=Object(s.a)(h,2),v=m[0],x=m[1],E=Object(o.useState)(A.f.STANDBY),w=Object(s.a)(E,2),C=w[0],D=w[1];function S(e){return _.apply(this,arguments)}function _(){return(_=Object(c.a)(a.a.mark((function e(n){var r,c;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(g.C){e.next=2;break}throw new Error('No "SNAPSHOT_HUB_API_URL" was found.');case 2:if(l){e.next=4;break}throw new Error("No Web3 instance was found.");case 4:return e.next=6,l.eth.getBlockNumber();case 6:return r=e.sent,e.t0=parseInt,e.next=10,Object(b.f)(A.b.offchainVotingVotingPeriod,t);case 10:return e.t1=e.sent,c=(0,e.t0)(e.t1),e.next=14,Object(N.buildProposalMessage)(Object(I.a)(Object(I.a)({},n),{},{votingTimeSeconds:c,snapshot:r}),g.C);case 14:return e.abrupt("return",e.sent);case 15:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function k(){return(k=Object(c.a)(a.a.mark((function t(r){var c,s,o,i,j,f,O,h,m,v,E,w,C,_,k,T,R,P,F,L,M,B;return a.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(c=r.partialProposalData,s=r.adapterAddress,o=r.adapterName,i=r.type,t.prev=1,u){t.next=4;break}throw new Error("No account was found to send.");case 4:if(l){t.next=6;break}throw new Error("No Web3 instance was found.");case 6:if(e){t.next=8;break}throw new Error('No "DaoRegistry" address was found.');case 8:if(g.C){t.next=10;break}throw new Error('No "SNAPSHOT_HUB_API_URL" was found.');case 10:if(g.D){t.next=12;break}throw new Error('No Snapshot "SPACE" was found.');case 12:if(i===N.SnapshotType.draft||i===N.SnapshotType.proposal){t.next=14;break}throw new Error('Handling for type "vote" is not implemented.');case 14:return D(A.f.AWAITING_CONFIRM),j=s||(o?Object(b.d)(o,n):y.a),f=c.body,O=c.name,h=c.metadata,m=c.timestamp,t.next=19,Object(N.getSpace)(g.C,g.D);case 19:if(v=t.sent,E=v.data,w={name:O,body:f,metadata:h,token:E.token,space:g.D},i!==N.SnapshotType.draft){t.next=28;break}return t.next=25,Object(N.buildDraftMessage)(w,g.C);case 25:t.t0=t.sent,t.next=31;break;case 28:return t.next=30,S(Object(I.a)(Object(I.a)({},w),{},{timestamp:m}));case 30:t.t0=t.sent;case 31:return C=t.t0,_=i===N.SnapshotType.draft?Object(N.prepareDraftMessage)(C):Object(N.prepareProposalMessage)(C),k=Object(N.getDomainDefinition)(Object(I.a)(Object(I.a)({},_),{},{type:i}),e,j,g.k),T=k.domain,R=k.types,P=JSON.stringify({types:R,domain:T,primaryType:ee.a,message:_}),t.next=37,Object(N.signMessage)(d,u,P);case 37:return F=t.sent,D(A.f.PENDING),t.next=41,Object(N.submitMessage)(g.C,u,C,F,{actionId:T.actionId,chainId:T.chainId,verifyingContract:T.verifyingContract,message:_});case 41:return L=t.sent,M=L.data,B={data:C,signature:F,uniqueId:M.uniqueId,uniqueIdDraft:M.uniqueIdDraft||""},D(A.f.FULFILLED),p(B),t.abrupt("return",B);case 49:throw t.prev=49,t.t1=t.catch(1),D(A.f.REJECTED),x(t.t1),t.t1;case 54:case"end":return t.stop()}}),t,null,[[1,49]])})))).apply(this,arguments)}return{proposalData:O,proposalSignAndSendError:v,proposalSignAndSendStatus:C,signAndSendProposal:function(e){return k.apply(this,arguments)}}}},484:function(e,t){},50:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var r=n(0);function a(e){var t=e.url,n=e.isPending,a=void 0!==n&&n;return Object(r.jsx)("small",{children:Object(r.jsx)("a",{href:t,rel:"noopener noreferrer",target:"_blank",children:a?"view progress":"view transaction"})})}},51:function(e,t,n){"use strict";function r(e){var t=e.gracePeriodLength,n=e.gracePeriodStartingTime,r=e.votePeriodLength,a=e.voteStartingTime,c=1e3,s=function(e){return Number(e||0)},o=s(n)*c,i=s(a)*c;return{voteEndMs:i+s(r)*c,voteStartMs:i,gracePeriodEndMs:o+s(t)*c,gracePeriodStartMs:o}}n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return i})),n.d(t,"c",(function(){return f})),n.d(t,"d",(function(){return p})),n.d(t,"e",(function(){return m})),n.d(t,"f",(function(){return x})),n.d(t,"g",(function(){return N}));var a=n(2),c=n.n(a),s=n(5),o=n(11);function i(e){return u.apply(this,arguments)}function u(){return(u=Object(s.a)(c.a.mark((function e(t){var n;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch("".concat(o.C,"/api/").concat(o.D,"/offchain_proof/").concat(t));case 3:if(404!==(n=e.sent).status){e.next=6;break}return e.abrupt("return",void 0);case 6:if(n.ok){e.next=8;break}throw new Error("Something went wrong while getting the off-chain vote proof.");case 8:return e.next=10,n.json();case 10:return e.abrupt("return",e.sent);case 13:throw e.prev=13,e.t0=e.catch(0),e.t0;case 16:case"end":return e.stop()}}),e,null,[[0,13]])})))).apply(this,arguments)}var d=n(4),l=n(22),b=n(12),j=n(7);function f(e,t){var n=(e||[]).find((function(e){return Object.entries(e).find((function(e){var n=Object(d.a)(e,2),r=n[0];n[1];return Object(b.i)(r)===Object(b.i)(t||"")}))}));if(n)return Object.entries(n)[0][1].msg.payload.choice===l.VoteChoicesIndex.Yes?j.e.Yes:j.e.No}var O=n(17);function p(e){return h.apply(this,arguments)}function h(){return(h=Object(s.a)(c.a.mark((function e(t){var r,a,s,o;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:e.prev=0,e.t0=t,e.next=e.t0===O.c.OffchainVotingContract?4:e.t0===O.c.VotingContract?9:14;break;case 4:return e.next=6,n.e(1).then(n.t.bind(null,955,3));case 6:return r=e.sent,a=r.default,e.abrupt("return",a);case 9:return e.next=11,n.e(2).then(n.t.bind(null,954,3));case 11:return s=e.sent,o=s.default,e.abrupt("return",o);case 14:throw new Error('No voting adapter name was found for "'.concat(t,'".'));case 15:e.next=20;break;case 17:throw e.prev=17,e.t1=e.catch(0),e.t1;case 20:case"end":return e.stop()}}),e,null,[[0,17]])})))).apply(this,arguments)}function m(e,t){return e===Math.log2(Number(t)+1)-1}var v=n(42);function x(e,t){return v.b[t]===v.b[e]}function N(e){return g.apply(this,arguments)}function g(){return(g=Object(s.a)(c.a.mark((function e(t){return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch("".concat(o.C,"/api/").concat(o.D,"/offchain_proofs"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});case 3:if(e.sent.ok){e.next=6;break}throw new Error("Something went wrong while submitting the off-chain vote proof.");case 6:e.next=11;break;case 8:throw e.prev=8,e.t0=e.catch(0),e.t0;case 11:case"end":return e.stop()}}),e,null,[[0,8]])})))).apply(this,arguments)}},527:function(e,t){},529:function(e,t){},54:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var r="0x0000000000000000000000000000000000000000"},553:function(e,t){},555:function(e,t){},568:function(e,t){},569:function(e,t){},57:function(e,t,n){"use strict";n.d(t,"c",(function(){return a})),n.d(t,"a",(function(){return c})),n.d(t,"b",(function(){return s}));var r=n(7),a=[r.e.Yes,r.e.No],c="Message",s=["Submitting\u2026","Working\u2026","DAOing\u2026","Getting closer\u2026","Dreaming of ETH\u2026"]},59:function(e,t,n){"use strict";var r=n(205);n.d(t,"a",(function(){return r.a}))},590:function(e,t){},592:function(e,t){},69:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var r=n(4),a=n(1),c=n(12);function s(e){var t=e.intervalMs,n=e.messages,s=e.useFirstItemStart?n[0]:Object(c.a)(n),o=Object(a.useState)(s),i=Object(r.a)(o,2),u=i[0],d=i[1];return Object(a.useEffect)((function(){var e=setInterval((function(){return d((function(e){return Object(c.a)(n,e)}))}),t);return function(){clearInterval(e)}}),[t,n]),e.render(u)}},695:function(e,t){},7:function(e,t,n){"use strict";var r,a,c,s,o,i;n.d(t,"d",(function(){return r})),n.d(t,"a",(function(){return a})),n.d(t,"c",(function(){return c})),n.d(t,"b",(function(){return s})),n.d(t,"e",(function(){return o})),n.d(t,"f",(function(){return i})),function(e){e[e.EXISTS=0]="EXISTS"}(r||(r={})),function(e){e.bank="bank",e.configuration="configuration",e.coupon_onboarding="coupon-onboarding",e.dao_registry="daoRegistry",e.distribute="distribute",e.financing="financing",e.guildkick="guildkick",e.managing="managing",e.nft="nft",e.onboarding="onboarding",e.ragequit="ragequit",e.tribute="tribute",e.tribute_nft="tribute-nft",e.voting="voting"}(a||(a={})),function(e){e.bank="bank",e.erc20="erc20-ext",e.nft="nft"}(c||(c={})),function(e){e.offchainVotingGracePeriod="offchainvoting.gracePeriod",e.offchainVotingStakingAmount="offchainvoting.stakingAmount",e.offchainVotingVotingPeriod="offchainvoting.votingPeriod",e.onboardingChunkSize="onboarding.chunkSize",e.onboardingMaximumChunks="onboarding.maximumChunks",e.onboardingUnitsPerChunk="onboarding.unitsPerChunk",e.onboardingTokenAddr="onboarding.tokenAddr",e.votingGracePeriod="voting.gracePeriod",e.votingStakingAmount="voting.stakingAmount",e.votingVotingPeriod="voting.votingPeriod"}(s||(s={})),function(e){e.Yes="Yes",e.No="No"}(o||(o={})),function(e){e.STANDBY="STANDBY",e.AWAITING_CONFIRM="AWAITING_CONFIRM",e.PENDING="PENDING",e.FULFILLED="FULFILLED",e.REJECTED="REJECTED"}(i||(i={}))},702:function(e,t){},719:function(e,t){},720:function(e,t){},77:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var r=n(4),a=n(1),c=n(0);function s(e){var t=e.showAfterMs,n=Object(a.useState)(!1),s=Object(r.a)(n,2),o=s[0],i=s[1];return Object(a.useEffect)((function(){var e=t&&setTimeout((function(){return i(!0)}),t);return function(){e&&clearTimeout(e)}}),[t]),!t||t&&o?Object(c.jsx)("div",{className:"loader--large","aria-label":"Loading content..."}):null}},790:function(e,t){},791:function(e,t){},814:function(e,t){},85:function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var r=n(64),a=n.n(r),c=function(e){return a.a.utils.isAddress(e)}},896:function(e,t){},9:function(e,t,n){"use strict";var r;n.d(t,"a",(function(){return r})),function(e){e.STANDBY="STANDBY",e.PENDING="PENDING",e.FULFILLED="FULFILLED",e.REJECTED="REJECTED"}(r||(r={}))},919:function(e,t,n){},92:function(e,t,n){"use strict";n.d(t,"b",(function(){return u})),n.d(t,"a",(function(){return d})),n.d(t,"c",(function(){return l})),n.d(t,"d",(function(){return b})),n.d(t,"e",(function(){return p}));var r,a,c,s,o=n(120),i=n(149),u=Object(i.a)(r||(r=Object(o.a)(["\n query GetDao($id: ID) {\n tributeDaos(where: {id: $id}) {\n id # dao address\n daoAddress\n name\n totalUnits\n }\n }\n"]))),d=Object(i.a)(a||(a=Object(o.a)(["\n query GetAdaptersAndExtensions($daoAddress: String) {\n tributeDaos(where: {daoAddress: $daoAddress}) {\n daoAddress\n adapters {\n id\n acl\n adapterId\n adapterAddress\n }\n extensions {\n id\n extensionId\n extensionAddress\n }\n }\n }\n"]))),l=Object(i.a)(c||(c=Object(o.a)(["\n query GetMembers($daoAddress: String) {\n tributeDaos(where: {daoAddress: $daoAddress}) {\n members(orderBy: createdAt, orderDirection: desc) {\n createdAt\n address: memberAddress\n delegateKey\n isDelegated\n units\n didFullyRagequit\n }\n }\n }\n"]))),b=Object(i.a)(s||(s=Object(o.a)(["\n query GetTokenHolderBalances($tokenAddress: String) {\n tokens(where: {tokenAddress: $tokenAddress}) {\n symbol\n tokenAddress\n holders {\n balance\n member {\n id\n delegateKey\n }\n }\n }\n }\n"]))),j=n(447),f=n(20),O=n(96);function p(e){return Object(j.a)((function(t){var n=t.networkError;n&&(e.getState().subgraphNetworkStatus.status!==O.a.ERR&&(e.dispatch(Object(f.V)({status:O.a.ERR})),console.error("[Subgraph network error]: ".concat(n))));n||e.getState().subgraphNetworkStatus.status!==O.a.OK&&e.dispatch(Object(f.V)({status:O.a.OK}))}))}},923:function(e,t,n){"use strict";n.r(t),n.d(t,"getApolloClient",(function(){return Lr}));var r=n(34),a=n(112),c=n(14),s=n(40),o=n(922),i=n(268),u=n(150),d=n(945),l=n(924),b=n(11),j=n(20),f=n(12),O=n(92),p=n(137),h=n(450),m=n(451),v=n(3),x=n(61),N=n(175),g=["type"],E=null;function A(e,t){return Object(v.a)(Object(v.a)({},e),t)}function w(){return E}var I=n(176),y={isOpen:!1};function C(e){return Object(v.a)(Object(v.a)({},e),{},{isOpen:!1})}function D(e){return Object(v.a)(Object(v.a)({},e),{},{isOpen:!0})}var S=["type"],_={BankAdapterContract:null,BankExtensionContract:null,BankFactoryContract:null,ConfigurationContract:null,CouponOnboardingContract:null,DaoFactoryContract:null,DaoRegistryAdapterContract:null,DaoRegistryContract:null,DistributeContract:null,ERC20ExtensionContract:null,FinancingContract:null,GuildBankContract:null,ManagingContract:null,NFTAdapterContract:null,NFTExtensionContract:null,OnboardingContract:null,RagequitContract:null,TributeContract:null,TributeNFTContract:null,VotingContract:null};function k(e){return Object(v.a)(Object(v.a)({},e),_)}function T(e,t){return Object(v.a)(Object(v.a)({},e),{},{BankFactoryContract:Object(v.a)({},t)})}function R(e,t){return Object(v.a)(Object(v.a)({},e),{},{DaoFactoryContract:Object(v.a)({},t)})}function P(e,t){return Object(v.a)(Object(v.a)({},e),{},{DaoRegistryContract:Object(v.a)({},t)})}function F(e,t){return Object(v.a)(Object(v.a)({},e),{},{DaoRegistryAdapterContract:Object(v.a)({},t)})}function L(e,t){return Object(v.a)(Object(v.a)({},e),{},{BankExtensionContract:Object(v.a)({},t)})}function M(e,t){return Object(v.a)(Object(v.a)({},e),{},{ConfigurationContract:Object(v.a)({},t)})}function B(e,t){return Object(v.a)(Object(v.a)({},e),{},{DistributeContract:Object(v.a)({},t)})}function G(e,t){return Object(v.a)(Object(v.a)({},e),{},{FinancingContract:Object(v.a)({},t)})}function U(e,t){return Object(v.a)(Object(v.a)({},e),{},{GuildBankContract:Object(v.a)({},t)})}function V(e,t){return Object(v.a)(Object(v.a)({},e),{},{OnboardingContract:Object(v.a)({},t)})}function W(e,t){return Object(v.a)(Object(v.a)({},e),{},{RagequitContract:Object(v.a)({},t)})}function Y(e,t){return Object(v.a)(Object(v.a)({},e),{},{TributeContract:Object(v.a)({},t)})}function H(e,t){return Object(v.a)(Object(v.a)({},e),{},{VotingContract:Object(v.a)({},t)})}function K(e,t){return Object(v.a)(Object(v.a)({},e),{},{ManagingContract:Object(v.a)({},t)})}function z(e,t){return Object(v.a)(Object(v.a)({},e),{},{BankAdapterContract:Object(v.a)({},t)})}function q(e,t){return Object(v.a)(Object(v.a)({},e),{},{NFTAdapterContract:Object(v.a)({},t)})}function J(e,t){return Object(v.a)(Object(v.a)({},e),{},{TributeNFTContract:Object(v.a)({},t)})}function Q(e,t){return Object(v.a)(Object(v.a)({},e),{},{CouponOnboardingContract:Object(v.a)({},t)})}function X(e,t){return Object(v.a)(Object(v.a)({},e),{},{NFTExtensionContract:Object(v.a)({},t)})}function $(e,t){return Object(v.a)(Object(v.a)({},e),{},{ERC20ExtensionContract:Object(v.a)({},t)})}var Z=n(203),ee=n(96),te=["type"],ne={status:ee.a.OK};function re(e,t){return Object(v.a)(Object(v.a)({},e),t)}var ae=Object(p.combineReducers)({connectModal:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:y,t=arguments.length>1?arguments[1]:void 0,n=t.type;switch(n){case I.a:return C(e);case I.b:return D(e);default:return e}},connectedMember:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:E,t=arguments.length>1?arguments[1]:void 0,n=t.type,r=Object(x.a)(t,g);switch(n){case N.b:return A(e,r);case N.a:return w();default:return e}},contracts:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:_,t=arguments.length>1?arguments[1]:void 0,n=t.type,r=Object(x.a)(t,S);switch(n){case j.a:return k(e);case j.b:return z(e,r);case j.c:return L(e,r);case j.d:return T(e,r);case j.e:return M(e,r);case j.f:return Q(e,r);case j.g:return R(e,r);case j.h:return P(e,r);case j.i:return F(e,r);case j.j:return B(e,r);case j.k:return $(e,r);case j.l:return G(e,r);case j.m:return U(e,r);case j.n:return K(e,r);case j.o:return q(e,r);case j.p:return X(e,r);case j.q:return V(e,r);case j.r:return W(e,r);case j.s:return Y(e,r);case j.t:return J(e,r);case j.u:case j.v:return H(e,r);default:return e}},subgraphNetworkStatus:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ne,t=arguments.length>1?arguments[1]:void 0,n=t.type,r=Object(x.a)(t,te);switch(n){case Z.a:return re(e,r);default:return e}}}),ce=Object(p.createStore)(ae,Object(h.composeWithDevTools)(Object(p.applyMiddleware)(m.a))),se=n(58),oe=n(1),ie=n.n(oe),ue=n(0);function de(e){return Object(ue.jsx)("svg",Object(v.a)(Object(v.a)({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 12 14"},e),{},{children:Object(ue.jsx)("g",{fillRule:"evenodd",stroke:"none",strokeWidth:"1",children:Object(ue.jsx)("g",{transform:"translate(-737 -124)",children:Object(ue.jsx)("g",{transform:"translate(596 124)",children:Object(ue.jsx)("path",{fill:"currentColor",d:"M151.166.8h-8.679c-.733 0-1.344.611-1.344 1.345v8.8c0 .734.611 1.345 1.344 1.345h7.395l-.366-1.223.855.795.795.733 1.405 1.223V2.145c-.06-.734-.61-1.345-1.405-1.345zm-2.506 8.495s-.244-.306-.428-.55c.49-.122.917-.367 1.161-.795a2.065 2.065 0 01-.733.367c-.306.122-.611.245-.917.306a4.039 4.039 0 01-1.71 0 6.007 6.007 0 01-.979-.306 1.83 1.83 0 01-.489-.244s-.06 0-.06-.061c-.123-.062-.184-.123-.184-.123.305.367.672.673 1.161.795-.183.244-.428.55-.428.55a2.579 2.579 0 01-2.017-.978c0-1.344.367-2.628.917-3.79.55-.427 1.161-.671 1.834-.671l.06.06c-.61.184-1.222.429-1.71.856l.366-.183c.49-.183.978-.367 1.467-.428h.122a4.947 4.947 0 011.345 0c.672.061 1.344.306 1.955.611a5.299 5.299 0 00-1.65-.855l.061-.122c.673.06 1.284.244 1.834.672.611 1.161.917 2.506.917 3.789-.367.733-1.1 1.1-1.895 1.1zm-2.995-3.056c-.427-.06-.733.245-.794.673-.061.427.244.733.672.794.428.061.734-.244.795-.672v-.061c0-.367-.306-.734-.673-.734zm2.384 0c-.428-.06-.733.245-.795.673-.06.427.245.733.673.794.427.061.733-.244.794-.672v-.061c0-.367-.305-.734-.672-.734z"})})})})}))}var le,be=n(18),je=n(21),fe=n(29),Oe=n(28),pe=function(e){Object(fe.a)(n,e);var t=Object(Oe.a)(n);function n(){return Object(be.a)(this,n),t.apply(this,arguments)}return Object(je.a)(n,[{key:"render",value:function(){return Object(ue.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true","data-icon":"github","data-prefix":"fab",viewBox:"0 0 496 512",children:Object(ue.jsx)("path",{fill:"currentColor",d:"M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"})})}}]),n}(ie.a.Component),he=function(e){Object(fe.a)(n,e);var t=Object(Oe.a)(n);function n(){return Object(be.a)(this,n),t.apply(this,arguments)}return Object(je.a)(n,[{key:"render",value:function(){return Object(ue.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true","data-icon":"medium","data-prefix":"fab",viewBox:"0 0 448 512",children:Object(ue.jsx)("path",{fill:"currentColor",d:"M0 32v448h448V32H0zm372.2 106.1l-24 23c-2.1 1.6-3.1 4.2-2.7 6.7v169.3c-.4 2.6.6 5.2 2.7 6.7l23.5 23v5.1h-118V367l24.3-23.6c2.4-2.4 2.4-3.1 2.4-6.7V199.8l-67.6 171.6h-9.1L125 199.8v115c-.7 4.8 1 9.7 4.4 13.2l31.6 38.3v5.1H71.2v-5.1l31.6-38.3c3.4-3.5 4.9-8.4 4.1-13.2v-133c.4-3.7-1-7.3-3.8-9.8L75 138.1V133h87.3l67.4 148L289 133.1h83.2v5z"})})}}]),n}(ie.a.Component);function me(){return Object(ue.jsxs)("div",{className:"socialmedia",children:[Object(ue.jsx)("a",{href:le.MEDIUM,target:"_blank",rel:"noopener noreferrer",children:Object(ue.jsx)(he,{})}),Object(ue.jsx)("a",{href:le.DISCORD,target:"_blank",rel:"noopener noreferrer",children:Object(ue.jsx)(de,{})}),Object(ue.jsx)("a",{href:le.GITHUB,target:"_blank",rel:"noopener noreferrer",children:Object(ue.jsx)(pe,{})})]})}function ve(){return Object(ue.jsx)("div",{className:"footer",children:Object(ue.jsx)(me,{})})}!function(e){e.DISCORD="#",e.GITHUB="https://github.com/search?q=org%3Aopenlawteam+tribute-ui+OR+tribute-contracts+in%3Aname&type=repositories",e.MEDIUM="#"}(le||(le={}));var xe=n(4),Ne=n(15),ge=n(9),Ee=Object(oe.lazy)((function(){return n.e(9).then(n.bind(null,975))}));function Ae(){var e=Object(c.c)((function(e){return e.connectModal.isOpen})),t=Object(oe.useState)({isOpen:e,onRequestClose:function(){f(Object(j.y)())}}),n=Object(xe.a)(t,2),r=n[0],a=n[1],s=Object(Ne.f)(),o=s.account,i=s.connected,u=s.initialCachedConnectorCheckStatus,d=s.web3Instance,l=Object(Ne.d)().isDefaultChain,b=Object(Ne.e)(o,null===d||void 0===d?void 0:d.currentProvider),f=Object(c.b)(),O=Object(se.g)().pathname;return Object(oe.useEffect)((function(){a((function(t){return Object(v.a)(Object(v.a)({},t),{},{isOpen:e})}))}),[e]),Object(oe.useEffect)((function(){u===ge.a.FULFILLED&&f(!(!i||l&&!b)?Object(j.z)():Object(j.y)())}),[i,f,u,l,b,O]),e?Object(ue.jsx)(oe.Suspense,{fallback:null,children:Object(ue.jsx)(Ee,{maybeContractWallet:b,modalProps:r})}):null}var we=n(453);function Ie(){return Object(ue.jsxs)(we.a,{children:[Object(ue.jsx)("title",{children:"Tribute"}),Object(ue.jsx)("meta",{name:"description",content:"A modular DAO framework developed and coordinated by its members"})]})}function ye(e){return Object(ue.jsx)("div",{className:"logo ".concat(e.size?"logo--".concat(e.size):""),children:"TRIBUTE"})}function Ce(){return Object(ue.jsx)("div",{className:"logo-container logo-container--center",children:Object(ue.jsx)(ye,{size:"small"})})}function De(){return Object(ue.jsx)("div",{className:"logo-container logo-container--header",children:Object(ue.jsx)(ye,{size:"medium"})})}function Se(){return Object(ue.jsx)("div",{className:"logo-container logo-container--center",children:Object(ue.jsx)(ye,{size:"large"})})}var _e=n(930),ke=n(465),Te=n(152),Re=n.n(Te);function Pe(){return Object(ue.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true","data-icon":"bars","data-prefix":"fal",viewBox:"0 0 448 512",children:Object(ue.jsx)("path",{fill:"currentColor",d:"M442 114H6a6 6 0 01-6-6V84a6 6 0 016-6h436a6 6 0 016 6v24a6 6 0 01-6 6zm0 160H6a6 6 0 01-6-6v-24a6 6 0 016-6h436a6 6 0 016 6v24a6 6 0 01-6 6zm0 160H6a6 6 0 01-6-6v-24a6 6 0 016-6h436a6 6 0 016 6v24a6 6 0 01-6 6z"})})}var Fe=n(106),Le=n(135),Me=n(435);function Be(e){var t=e.customWalletText,n=e.showWalletETHBadge,r=void 0===n||n,a=Object(Ne.f)(),s=a.account,o=a.connected,i=a.web3Modal,u=Object(Ne.d)().isDefaultChain,d=Object(c.b)(),l=!1===u;return Object(ue.jsxs)("button",{className:"walletconnect__connect-button \n ".concat(l&&o?"walletconnect__connect-button--error":""),onClick:function(){d(Object(j.z)())},children:[Object(ue.jsx)("span",{className:"connect-button-text ".concat(o?"connect-button-text--ethAddress":""),children:t?"function"===typeof t?t({account:s,connected:o,isMobile:Object(Le.isMobile)()}):t:s?Object(f.l)(s):"Connect"}),l&&o&&Object(ue.jsx)("span",{children:"Wrong Network"}),r&&Object(ue.jsx)(Me.a,{providerName:null===i||void 0===i?void 0:i.cachedProvider})]})}var Ge=n(24),Ue=n(2),Ve=n.n(Ue),We=n(5);function Ye(){var e=Object(c.c)((function(e){var t;return null===(t=e.contracts)||void 0===t?void 0:t.ERC20ExtensionContract})),t=Object(oe.useState)(),n=Object(xe.a)(t,2),r=n[0],a=n[1],s=Object(oe.useState)(ge.a.STANDBY),o=Object(xe.a)(s,2),i=o[0],u=o[1],d=Object(oe.useState)(),l=Object(xe.a)(d,2),b=l[0],j=l[1],f=Object(oe.useCallback)((function(){return O.apply(this,arguments)}),[e]);function O(){return(O=Object(We.a)(Ve.a.mark((function t(){var n,r;return Ve.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(e){t.next=2;break}return t.abrupt("return");case 2:return t.prev=2,u(ge.a.PENDING),t.next=6,e.instance.methods.symbol().call();case 6:return n=t.sent,t.next=9,e.instance.methods.decimals().call();case 9:r=t.sent,a({address:e.contractAddress,symbol:n,decimals:Number(r),image:"".concat(window.location.origin,"/favicon.ico")}),u(ge.a.FULFILLED),t.next=20;break;case 14:t.prev=14,t.t0=t.catch(2),console.log(t.t0),a(void 0),j(t.t0),u(ge.a.REJECTED);case 20:case"end":return t.stop()}}),t,null,[[2,14]])})))).apply(this,arguments)}return Object(oe.useEffect)((function(){f()}),[f]),{daoTokenDetails:r,daoTokenDetailsError:b,daoTokenDetailsStatus:i}}var He=n(946);var Ke=["customStyles"],ze="".concat(window.location.origin,"/favicon.ico");function qe(e){var t=e.customStyles,n=Object(x.a)(e,Ke),r=Object(oe.useState)(),a=Object(xe.a)(r,2),s=a[0],o=a[1],i=Object(oe.useState)(),u=Object(xe.a)(i,2),d=u[0],l=u[1],j=Object(oe.useState)(""),p=Object(xe.a)(j,2),h=p[0],m=p[1],N=function(){var e=Object(c.c)((function(e){var t;return null===(t=e.contracts)||void 0===t?void 0:t.ERC20ExtensionContract})),t=Object(c.c)((function(e){return e.connectedMember})),n=Object(He.a)(O.d,{variables:{tokenAddress:null===e||void 0===e?void 0:e.contractAddress.toLowerCase()}}),r=Object(xe.a)(n,2),a=r[0],s=r[1],o=s.called,i=s.loading,u=s.data,d=s.error,l=s.startPolling,b=s.stopPolling,j=Object(oe.useState)(),f=Object(xe.a)(j,2),p=f[0],h=f[1],m=Object(oe.useState)(),v=Object(xe.a)(m,2),x=v[0],N=v[1],g=Object(oe.useCallback)((function(){try{if(!i&&u){if(h(u.tokens[0]),0===u.tokens.length)throw new Error('"'.concat(null===e||void 0===e?void 0:e.contractAddress,'" erc20 address not found.'))}else if(d)throw new Error('"'.concat(null===e||void 0===e?void 0:e.contractAddress,'" is not a valid erc20 address.'))}catch(d){N(d)}}),[null===e||void 0===e?void 0:e.contractAddress,u,d,i]);return Object(oe.useEffect)((function(){o||a()}),[o,a]),Object(oe.useEffect)((function(){!i&&(null===e||void 0===e?void 0:e.contractAddress)&&g()}),[null===e||void 0===e?void 0:e.contractAddress,g,i]),Object(oe.useEffect)((function(){t&&l&&l(2e3);var e=b&&setTimeout(b,1e4);return function(){e&&clearTimeout(e)}}),[t,l,b]),{tokenHolderBalances:p,gqlError:x}}().tokenHolderBalances,g=Object(Ne.f)(),E=g.account,A=g.networkId,w=Object(oe.useCallback)((function(){try{(e=ze,fetch(e).then((function(e){return e.blob()})).then((function(e){return new Promise((function(t,n){var r=new FileReader;r.onloadend=function(){return t(r.result)},r.onerror=n,r.readAsDataURL(e)}))}))).then((function(e){e&&l(e)}))}catch(t){console.log(t)}var e}),[]);return Object(oe.useEffect)((function(){if(o(void 0),E&&N){var e=N.holders,t=N.symbol,n=N.tokenAddress,r=null===e||void 0===e?void 0:e.find((function(e){var t;return(null===(t=e.member)||void 0===t?void 0:t.id.toLowerCase())===E.toLowerCase()}));r&&o({balance:r.balance,tokenAddress:n,symbol:t}),E&&A&&m("".concat(b.o[A],"/token/").concat(n,"?a=").concat(E)),w()}}),[E,A,N,w]),s?Object(ue.jsx)(Ge.a,{children:Object(ue.jsxs)("a",{className:"daotokenholder__button",rel:"noopener noreferrer",target:"_blank",href:h,style:Object(v.a)(Object(v.a)({},n),t),children:[Object(ue.jsx)("span",{className:"daotokenholder__balance",children:Object(f.e)(s.balance)}),Object(ue.jsx)("span",{className:"daotokenholder__symbol",children:s.symbol}),d&&Object(ue.jsx)("img",{src:d,alt:"Token Icon"})]})}):Object(ue.jsx)(ue.Fragment,{})}var Je={transition:"0.1s"},Qe={entering:{right:"-300px"},entered:{right:0},exiting:{right:0,opacity:0},exited:{right:"-300px",opacity:0}},Xe={entering:{right:0,opacity:1},entered:{right:"-300px",opacity:1},exiting:{right:"-300px",opacity:1},exited:{right:0,opacity:1}};function $e(){return Object(ue.jsx)("nav",{role:"navigation",id:"navigation",children:Object(ue.jsxs)("ul",{className:"nav__list","data-testid":"nav__list",children:[Object(ue.jsx)("li",{tabIndex:0,children:Object(ue.jsx)(s.c,{to:"/membership",children:Object(ue.jsx)("span",{children:"Membership"})})}),Object(ue.jsx)("li",{tabIndex:0,children:Object(ue.jsx)(s.c,{to:"/governance",children:Object(ue.jsx)("span",{children:"Governance"})})}),Object(ue.jsx)("li",{tabIndex:0,children:Object(ue.jsx)(s.c,{to:"/transfers",children:Object(ue.jsx)("span",{children:"Transfer"})})}),Object(ue.jsx)("li",{tabIndex:0,children:Object(ue.jsx)(s.c,{to:"/tributes",children:Object(ue.jsx)("span",{children:"Tribute"})})})]})})}function Ze(){var e=Object(c.c)((function(e){return e.connectedMember})),t=Object(oe.useState)(!1),n=Object(xe.a)(t,2),r=n[0],a=n[1],o=Object(oe.useState)(Qe),i=Object(xe.a)(o,2),u=i[0],d=i[1],l=Object(Ne.f)().account,b=Object(oe.useRef)();Object(oe.useEffect)((function(){return function(){b.current&&clearTimeout(b.current)}}),[]);var j=!(!l||!(null===e||void 0===e?void 0:e.isActiveMember)),f=!(!l||!(null===e||void 0===e?void 0:e.isActiveMember)||l.toLowerCase()!==(null===e||void 0===e?void 0:e.memberAddress.toLowerCase()));function O(e){if(!e)return d(Xe),b.current=setTimeout((function(){return a(e)}),500),function(){return b.current&&clearTimeout(b.current)};a(e),d(Qe)}return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{tabIndex:0,className:"nav__hamburger-wrapper",children:Object(ue.jsx)("div",{className:"nav__hamburger","aria-label":"Menu","aria-controls":"navigation",onClick:function(e){e.preventDefault(),O(!0)},children:Object(ue.jsx)(Pe,{})})}),Object(ue.jsx)(Re.a,{ariaHideApp:!1,className:"nav-modal-container",isOpen:r,onRequestClose:function(){O(!1)},overlayClassName:"nav-modal-overlay",role:"dialog",style:{overlay:{zIndex:"99"}},children:Object(ue.jsx)(_e.a,{appear:!0,in:r,timeout:200,children:function(e){return Object(ue.jsx)("nav",{role:"navigation",id:"navigation",children:Object(ue.jsxs)("div",{style:Object(v.a)(Object(v.a)({},Je),u[e]),className:"nav-modal",children:[Object(ue.jsx)("button",{className:"modal__close-button modal__close-button--icon",onClick:function(e){e.preventDefault(),O(!1)},children:Object(ue.jsx)(Fe.a,{})}),Object(ue.jsx)(Ce,{}),Object(ue.jsx)("div",{className:"nav-modal__walletconnect-button-container",children:Object(ue.jsx)(Be,{})}),Object(ue.jsxs)("ul",{className:"nav__list",children:[Object(ue.jsx)("li",{onClick:function(){O(!1)},children:Object(ue.jsx)(s.c,{to:"/membership",children:Object(ue.jsx)("span",{children:"Membership"})})}),Object(ue.jsx)("li",{onClick:function(){O(!1)},children:Object(ue.jsx)(s.c,{to:"/governance",children:Object(ue.jsx)("span",{children:"Governance"})})}),Object(ue.jsx)("li",{onClick:function(){O(!1)},children:Object(ue.jsx)(s.c,{to:"/transfers",children:Object(ue.jsx)("span",{children:"Transfer"})})}),Object(ue.jsx)("li",{onClick:function(){O(!1)},children:Object(ue.jsx)(s.c,{to:"/tributes",children:Object(ue.jsx)("span",{children:"Tribute"})})}),f&&Object(ue.jsx)("li",{onClick:function(){O(!1)},children:Object(ue.jsx)(s.c,{to:"/members/".concat(l),children:Object(ue.jsx)("span",{children:"Profile"})})}),j&&Object(ue.jsx)("li",{onClick:function(){O(!1)},children:Object(ue.jsx)(s.c,{to:"/dao-manager",children:Object(ue.jsx)("span",{children:"Manage DAO"})})})]})]})})}})})]})}function et(){return Object(ue.jsx)(ke.a,{query:"(max-width: 62em)",children:function(e){return Object(ue.jsx)("div",{className:"nav-header",children:Object(ue.jsxs)("div",{className:"nav-header__menu-container",children:[Object(ue.jsx)($e,{}),Object(ue.jsx)(qe,{border:"1px solid #c3d6dc"}),Object(ue.jsx)(Ze,{}),Object(ue.jsx)("div",{className:"nav-header__walletconnect-button-container",children:Object(ue.jsx)(Be,{})})]})})}})}function tt(){function e(e){return Object(ue.jsx)(s.b,{to:"/",children:e.children})}return Object(ue.jsxs)("header",{className:"header",children:[Object(ue.jsx)(e,{children:Object(ue.jsx)(De,{})}),Object(ue.jsx)("div",{className:"header__nav-container",children:Object(ue.jsx)(et,{})})]})}var nt=n(8),rt=n(17),at=n(64),ct=n.n(at);function st(e){return t=e,ct.a.utils.sha3(t);var t}function ot(e){var t;return{acl:it((t={},Object(nt.a)(t,rt.b.BANK,{}),Object(nt.a)(t,rt.a.CONFIGURATION,{SUBMIT_PROPOSAL:!0,PROCESS_PROPOSAL:!0,SPONSOR_PROPOSAL:!0,SET_CONFIGURATION:!0}),Object(nt.a)(t,rt.a.DISTRIBUTE,{SUBMIT_PROPOSAL:!0,SPONSOR_PROPOSAL:!0,PROCESS_PROPOSAL:!0,INTERNAL_TRANSFER:!0}),Object(nt.a)(t,rt.a.EXECUTION,{}),Object(nt.a)(t,rt.a.TRIBUTE,{SUBMIT_PROPOSAL:!0,SPONSOR_PROPOSAL:!0,PROCESS_PROPOSAL:!0,NEW_MEMBER:!0,ADD_TO_BALANCE:!0,REGISTER_NEW_TOKEN:!0}),Object(nt.a)(t,rt.a.FINANCING,{SUBMIT_PROPOSAL:!0,SPONSOR_PROPOSAL:!0,PROCESS_PROPOSAL:!0,ADD_TO_BALANCE:!0,SUB_FROM_BALANCE:!0}),Object(nt.a)(t,rt.a.GUILDKICK,{SUBMIT_PROPOSAL:!0,SPONSOR_PROPOSAL:!0,PROCESS_PROPOSAL:!0,SUB_FROM_BALANCE:!0,ADD_TO_BALANCE:!0,JAIL_MEMBER:!0,UNJAIL_MEMBER:!0,INTERNAL_TRANSFER:!0}),Object(nt.a)(t,rt.a.MANAGING,{SUBMIT_PROPOSAL:!0,PROCESS_PROPOSAL:!0,SPONSOR_PROPOSAL:!0,REMOVE_ADAPTER:!0,ADD_ADAPTER:!0}),Object(nt.a)(t,rt.a.OFFCHAINVOTING,{}),Object(nt.a)(t,rt.a.ONBOARDING,{SUBMIT_PROPOSAL:!0,SPONSOR_PROPOSAL:!0,PROCESS_PROPOSAL:!0,ADD_TO_BALANCE:!0,UPDATE_DELEGATE_KEY:!0,NEW_MEMBER:!0}),Object(nt.a)(t,rt.a.NONVOTING_ONBOARDING,{}),Object(nt.a)(t,rt.a.RAGEQUIT,{SUB_FROM_BALANCE:!0,JAIL_MEMBER:!0,UNJAIL_MEMBER:!0,INTERNAL_TRANSFER:!0}),Object(nt.a)(t,rt.a.VOTING,{}),Object(nt.a)(t,rt.a.BANK,{WITHDRAW:!0,SUB_FROM_BALANCE:!0,UPDATE_TOKEN:!0}),Object(nt.a)(t,rt.a.NFT,{COLLECT_NFT:!0}),Object(nt.a)(t,rt.a.COUPON_ONBOARDING,{SUBMIT_PROPOSAL:!1,ADD_TO_BALANCE:!0,UPDATE_DELEGATE_KEY:!1,NEW_MEMBER:!0}),Object(nt.a)(t,rt.a.TRIBUTE_NFT,{SUBMIT_PROPOSAL:!0,NEW_MEMBER:!0,ADD_TO_BALANCE:!0,COLLECT_NFT:!0}),Object(nt.a)(t,rt.b.NFT,{WITHDRAW_NFT:!0,COLLECT_NFT:!0,INTERNAL_TRANSFER:!0}),Object(nt.a)(t,rt.a.DAO_REGISTRY,{UPDATE_DELEGATE_KEY:!0}),t)[e])}}function it(e){var t=[e.ADD_ADAPTER,e.REMOVE_ADAPTER,e.JAIL_MEMBER,e.UNJAIL_MEMBER,e.SUBMIT_PROPOSAL,e.SPONSOR_PROPOSAL,e.PROCESS_PROPOSAL,e.UPDATE_DELEGATE_KEY,e.SET_CONFIGURATION,e.ADD_EXTENSION,e.REMOVE_EXTENSION,e.NEW_MEMBER],n=[e.TRANSFER_NFT];return function(e){return e.map((function(e,t){return void 0!==e?Math.pow(2,t):0})).reduce((function(e,t){return e+t}))}([].concat(t,n))}var ut=[{name:rt.a.CONFIGURATION,adapterId:st(rt.a.CONFIGURATION),contractAddress:b.e[b.k],abiFunctionName:"submitConfigurationProposal",description:"Manages storing and retrieving per-DAO settings required by shared adapters."},{name:rt.a.DISTRIBUTE,adapterId:st(rt.a.DISTRIBUTE),contractAddress:b.l[b.k],abiFunctionName:"submitProposal",description:"Allows the members to distribute funds to one or all members of the DAO."},{name:rt.a.FINANCING,adapterId:st(rt.a.FINANCING),contractAddress:b.q[b.k],abiFunctionName:"createFinancingRequest",description:"Allows individuals and/or organizations to request funds to finance their projects, and the members of the DAO have the power to vote and decide which projects should be funded."},{name:rt.a.GUILDKICK,adapterId:st(rt.a.GUILDKICK),contractAddress:b.t[b.k],abiFunctionName:"submitKickProposal",description:"Gives the members the freedom to choose which individuals or organizations should really be part of the DAO."},{name:rt.a.MANAGING,adapterId:st(rt.a.MANAGING),contractAddress:b.v[b.k],abiFunctionName:"submitProposal",description:"Enhances the DAO capabilities by adding/updating the DAO Adapters through a voting process."},{name:rt.a.ONBOARDING,adapterId:st(rt.a.ONBOARDING),contractAddress:b.A[b.k],abiFunctionName:"configureDao",description:"Triggers the process of minting internal tokens in exchange of a specific token at a fixed price."},{name:rt.a.RAGEQUIT,adapterId:st(rt.a.RAGEQUIT),contractAddress:b.B[b.k],abiFunctionName:"ragequit",description:"Gives the members the freedom to choose when it is the best time to exit the DAO for any given reason."},{name:rt.a.TRIBUTE,adapterId:st(rt.a.TRIBUTE),contractAddress:b.F[b.k],abiFunctionName:"configureDao",description:"Allows potential and existing DAO members to contribute any amount of ERC-20 tokens to the DAO in exchange for any amount of DAO internal tokens."},{name:rt.a.TRIBUTE_NFT,adapterId:st(rt.a.TRIBUTE_NFT),contractAddress:b.G[b.k],abiFunctionName:"provideTributeNFT",description:"Allows potential DAO members to contribute a registered ERC-721 asset to the DAO in exchange for any amount of DAO units."},{options:[{name:rt.a.VOTING,displayName:rt.a.OFFCHAINVOTING,adapterId:st(rt.a.VOTING),contractAddress:b.z[b.k],abiFunctionName:"configureDao",description:"Adds the offchain voting governance process to the DAO to support gasless voting.",setAclToExtensionForAdapter:!0},{name:rt.a.VOTING,displayName:rt.a.VOTING,adapterId:st(rt.a.VOTING),contractAddress:b.I[b.k],abiFunctionName:"configureDao",description:"Adds the simple on chain voting governance process to the DAO.",setAclToExtensionForAdapter:!0}],optionDefaultTarget:rt.a.VOTING},{name:rt.a.BANK,adapterId:st(rt.a.BANK),contractAddress:b.a[b.k],abiFunctionName:"withdraw",description:"Allows the members to withdraw their funds from the DAO bank."},{name:rt.a.NFT,adapterId:st(rt.a.NFT),contractAddress:b.y[b.k],abiFunctionName:"collect",description:"Transfers ownership of an NFT to the DAO collection."},{name:rt.a.COUPON_ONBOARDING,adapterId:st(rt.a.COUPON_ONBOARDING),contractAddress:b.f[b.k],abiFunctionName:"configureDao",description:"Provides a way to onboard an initial group of members quickly without requiring multiple proposals."},{name:rt.a.DAO_REGISTRY,adapterId:st(rt.a.DAO_REGISTRY),contractAddress:b.i[b.k],abiFunctionName:"updateDelegateKey",description:"Allows the member to update delegate key."}],dt=n(32),lt=["DaoRegistryContract"];function bt(){var e=Object(c.c)((function(e){return e.contracts})),t=e.DaoRegistryContract,n=Object(x.a)(e,lt),r=Object(He.a)(O.a,{pollInterval:b.r,variables:{daoAddress:null===t||void 0===t?void 0:t.contractAddress.toLowerCase()}}),a=Object(xe.a)(r,2),s=a[0],o=a[1],i=o.called,u=o.data,d=o.error,l=Object(oe.useState)(),j=Object(xe.a)(l,2),f=j[0],p=j[1],h=Object(oe.useState)(),m=Object(xe.a)(h,2),N=m[0],g=m[1],E=Object(oe.useState)(ge.a.STANDBY),A=Object(xe.a)(E,2),w=A[0],I=A[1],y=Object(oe.useCallback)((function(e,t){var n=[],r=[],a=function(t){return e.find((function(e){var n;return(null===(n=e.adapterId)||void 0===n?void 0:n.toLowerCase())===(null===t||void 0===t?void 0:t.toLowerCase())}))},c=function(e){return t.find((function(t){var n;return(null===(n=t.extensionId)||void 0===n?void 0:n.toLowerCase())===(null===e||void 0===e?void 0:e.toLowerCase())}))};return ut.forEach((function(e){if(null===e||void 0===e?void 0:e.isExtension){var t=c(e.extensionId);t?n.push(Object(v.a)(Object(v.a)(Object(v.a)({},t),e),{},{name:e.name,description:e.description})):r.push(Object(v.a)(Object(v.a)({},e),{},{name:e.name,description:e.description}))}else if(null===e||void 0===e?void 0:e.options){var s=null===e||void 0===e?void 0:e.options.some((function(e){return!e.isExtension&&a(e.adapterId)})),o=null===e||void 0===e?void 0:e.options.some((function(e){return e.isExtension&&c(e.extensionId)}));if(s||o){var i,u=!1;null===e||void 0===e||null===(i=e.options)||void 0===i||i.forEach((function(e){if(!u)if(null===e||void 0===e?void 0:e.isExtension){var t=c(e.extensionId);if(t)return n.push(Object(v.a)(Object(v.a)(Object(v.a)({},t),e),{},{name:e.name,description:e.description})),void(u=!0);r.push(Object(v.a)(Object(v.a)({},e),{},{name:e.name,description:e.description}))}else{var s=a(e.adapterId);if(s)return n.push(Object(v.a)(Object(v.a)(Object(v.a)({},s),e),{},{name:e.name,description:e.description})),void(u=!0);r.push(Object(v.a)(Object(v.a)({},e),{},{name:e.name,description:e.description}))}}))}else r.push(e)}else{var d=a(e.adapterId);d?n.push(Object(v.a)(Object(v.a)(Object(v.a)({},d),e),{},{name:e.name,description:e.description})):r.push(Object(v.a)(Object(v.a)({},e),{},{name:e.name,description:e.description}))}})),{registeredList:n,unRegisteredList:r}}),[]);return Object(oe.useEffect)((function(){i||s()}),[i,s]),Object(oe.useEffect)((function(){if(null===t||void 0===t?void 0:t.contractAddress)try{if(I(ge.a.PENDING),u){var e=u.tributeDaos[0],n=e.adapters,r=e.extensions,a=y(n,r),c=a.registeredList,s=a.unRegisteredList;p(c),g(s),I(ge.a.FULFILLED)}else if(d)throw new Error(d.message)}catch(d){p(void 0),g(void 0),I(ge.a.REJECTED)}}),[t,u,d,y]),{adapterExtensionStatus:w,getAdapterOrExtensionFromRedux:function(e){return Object.keys(n).map((function(e){return n[e]})).filter((function(e){return e})).filter((function(t){return t.adapterOrExtensionName===e}))[0]},registeredAdaptersOrExtensions:f,unRegisteredAdaptersOrExtensions:N}}var jt,ft=n(35);function Ot(){var e=Object(Ne.d)().defaultChain;return{isParamInputValid:function(t,n){var r=t.toString();return n===jt.ADDRESS?function(t){try{return!!t&&(ct.a.utils.checkAddressChecksum(t,e)||ct.a.utils.isAddress(t,e))}catch(n){return!1}}(r):n===jt.BYTES32?function(e){try{return!!e&&(66===e.length&&ct.a.utils.isHex(e))}catch(t){return!1}}(r):n===jt.BYTES32_ARRAY?function(e){try{return Array.from(e.split(",")).every((function(e){return 66===e.length&&ct.a.utils.isHex(e)}))}catch(t){return!1}}(r):n===jt.UINT256?function(e){return!isNaN(Number(e))}(r):n!==jt.UINT256_ARRAY||function(e){return Array.from(e.split(",")).every((function(e){return Number(e)}))}(r)},getFormFieldError:function(e){return e===jt.ADDRESS?ft.a.INVALID_ETHEREUM_ADDRESS:e===jt.BYTES32?ft.a.INVALID_BYTES32:e===jt.BYTES32_ARRAY?ft.a.INVALID_BYTES32_ARRAY:e===jt.UINT256?ft.a.INVALID_NUMBER:e===jt.UINT256_ARRAY?ft.a.INVALID_NUMBER_ARRAY:ft.a.REQUIRED},formatInputByType:function(e,t){return t===jt.BYTES32_ARRAY?Array.from(e.split(",")):t===jt.UINT256_ARRAY?Array.from(e.split(",").map((function(e){return Number(e)}))):t===jt.UINT256?Number(e):e}}}!function(e){e.ADDRESS="address",e.BYTES32="bytes32",e.BYTES32_ARRAY="bytes32[]",e.UINT256="uint256",e.UINT256_ARRAY="uint256[]"}(jt||(jt={}));var pt=n(36);function ht(e){var t=e.adapterOrExtension,n=e.defaultTarget,r=e.renderActions,a=e.renderCheckboxAction,c=Object(oe.useState)(n||null),s=Object(xe.a)(c,2),o=s[0],i=s[1],u=Object(oe.useState)({}),d=Object(xe.a)(u,2),l=d[0],b=d[1];return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsxs)("div",{className:"adapter-extension__inner-wrapper ",children:[a({selectedTargetOption:o}),Object(ue.jsxs)("div",{className:"adapter-extension__info",children:[Object(ue.jsxs)("span",{className:"adapter-extension__name",children:[null===t||void 0===t?void 0:t.optionDefaultTarget,(null===t||void 0===t?void 0:t.isExtension)&&"(EXTENSION)"]}),Object(ue.jsxs)("select",{className:"select",onChange:function(e){var n=e.target.value;i(n);var r=null===t||void 0===t?void 0:t.options.find((function(e){return e.displayName===n}));b(r)},children:[Object(ue.jsxs)("option",{value:"",disabled:null!==o,children:["Select a ",null===t||void 0===t?void 0:t.optionDefaultTarget," type\u2026"]},"adapterOrExtensionSelect"),null===t||void 0===t?void 0:t.options.map((function(e){return Object(ue.jsx)("option",{value:e.displayName,children:e.displayName.toUpperCase()},e.displayName)}))]}),function(e){if(!e)return null;try{var n=(null===t||void 0===t?void 0:t.options.find((function(t){return t.displayName===e})).description)||"";return Object(ue.jsx)("span",{className:"adapter-extension__desc",children:n})}catch(r){console.warn(r)}}(o)]})]}),r({selectedTargetOption:o,selectedTargetOptionProps:l})]})}var mt=n(93),vt=n(7),xt=n(54),Nt=n(30),gt=["error"];function Et(e){var t=e.error,n=Object(x.a)(e,gt);return Object(ue.jsx)(ue.Fragment,{children:t&&Object(ue.jsx)(Ge.a,{children:Object(ue.jsx)("p",Object(v.a)(Object(v.a)({},n),{},{className:"error-message ".concat(n.className||""),children:t}))})})}var At=n(41);function wt(e){var t=e.abiConfigurationInputs,n=e.abiMethodName,r=e.adapterOrExtension,a=e.closeHandler,s=Object(c.c)((function(e){return e.contracts})).DaoRegistryContract,o=Object(oe.useState)(),i=Object(xe.a)(o,2),u=i[0],d=i[1],l=Object(oe.useState)(vt.f.STANDBY),b=Object(xe.a)(l,2),j=b[0],O=b[1],p=Object(oe.useState)(vt.f.STANDBY),h=Object(xe.a)(p,2),m=h[0],x=h[1],N=Object(Ne.a)(),g=N.txError,E=N.txIsPromptOpen,A=N.txSend,w=N.txStatus,I=Object(Ne.b)().fast,y=Object(Ne.f)(),C=y.connected,D=y.account,S=Ot(),_=S.isParamInputValid,k=S.getFormFieldError,T=S.formatInputByType,R=bt().getAdapterOrExtensionFromRedux,P=Object(mt.a)({mode:"onBlur",reValidateMode:"onChange"}),F=P.errors,L=P.formState,M=P.getValues,B=P.setValue,G=P.register,U=P.trigger,V=u||g,W=C&&D,Y=(null===r||void 0===r?void 0:r.isExtension)?"extension":"adapter",H=L.isValid,K=(w===vt.f.AWAITING_CONFIRM||w===vt.f.PENDING)&&(j===vt.f.AWAITING_CONFIRM||j===vt.f.PENDING),z=(w===vt.f.AWAITING_CONFIRM||w===vt.f.PENDING)&&(m===vt.f.AWAITING_CONFIRM||m===vt.f.PENDING),q=w===vt.f.FULFILLED&&j===vt.f.FULFILLED,J=w===vt.f.FULFILLED&&m===vt.f.FULFILLED,Q=(K||q)&&E,X=(z||J)&&E;function $(){return($=Object(We.a)(Ve.a.mark((function e(){var t,n,c;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(s){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,x(vt.f.AWAITING_CONFIRM),t=[null===r||void 0===r?void 0:r.extensionId],n=[null===r||void 0===r?void 0:r.adapterId,xt.a,0,[],[]],c=Object(v.a)({from:D||""},I?{gasPrice:I}:null),e.next=9,A((null===r||void 0===r?void 0:r.isExtension)?"removeExtension":"replaceAdapter",s.instance.methods,(null===r||void 0===r?void 0:r.isExtension)?t:n,c);case 9:x(vt.f.FULFILLED),a&&setTimeout((function(){a()}),3e3),e.next=17;break;case 13:e.prev=13,e.t0=e.catch(2),d(e.t0),x(vt.f.REJECTED);case 17:case"end":return e.stop()}}),e,null,[[2,13]])})))).apply(this,arguments)}function Z(){return(Z=Object(We.a)(Ve.a.mark((function e(a){var c,s,o,i,u;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,O(vt.f.PENDING),c=R(null===r||void 0===r?void 0:r.name),s=c.contractAddress,o=c.instance.methods,W){e.next=5;break}throw new Error("No user account was found. Please make sure your wallet is connected.");case 5:if(s){e.next=7;break}throw new Error("No ".concat(null===r||void 0===r?void 0:r.name," contract found."));case 7:if(D){e.next=9;break}throw new Error("No account found.");case 9:return i=[],null===t||void 0===t||t.forEach((function(e){var t=Object.entries(a).find((function(t){return t[0]===e.name}));if(t){var n=T(t[1],e.type);i.push(n)}})),u=Object(v.a)({from:D||""},I?{gasPrice:I}:null),O(vt.f.AWAITING_CONFIRM),e.next=15,A(n,o,i,u);case 15:O(vt.f.FULFILLED),e.next=22;break;case 18:e.prev=18,e.t0=e.catch(0),d(e.t0),O(vt.f.REJECTED);case 22:case"end":return e.stop()}}),e,null,[[0,18]])})))).apply(this,arguments)}return Object(ue.jsxs)("form",{className:"form",onSubmit:function(e){return e.preventDefault()},children:[t&&t.map((function(e){return Object(ue.jsxs)("div",{className:"form__input-row",children:[Object(ue.jsx)("label",{className:"form__input-row-label",children:e.name}),Object(ue.jsxs)("div",{className:"form__input-row-fieldwrap",children:[Object(ue.jsx)("input",{"aria-describedby":"error-".concat(e.name),"aria-invalid":F[e.name]?"true":"false",name:e.name,placeholder:e.type,type:"text",onChange:function(){return B(e.name[0],M()[e.name])},ref:G({validate:function(t){return""===t?ft.a.REQUIRED:!!_(t,e.type)||k(e.type)}}),disabled:Q}),Object(ue.jsx)(Et,{error:Object(f.g)(e.name,F),id:"error-".concat(e.name)})]})]},e.name)})),Object(ue.jsx)("button",{className:"button",disabled:Q||X,onClick:function(){Q||(H?function(e){Z.apply(this,arguments)}(M()):U())},type:"submit",children:K?Object(ue.jsx)(At.a,{}):q?"Done":"Submit"}),V&&Object(ue.jsx)("div",{className:"form__submit-error-container",children:Object(ue.jsx)(Nt.a,{renderText:"Something went wrong while submitting the adapter configuration.",error:V})}),Object(ue.jsxs)("div",{className:"adapter-extension__remove",children:[Object(ue.jsxs)("p",{children:["Delete this ",Y,". Once you delete this"," ",Y,", it can be re-added if the DAO isn't finalized."]}),Object(ue.jsx)("button",{className:"button--secondary",disabled:X||Q,onClick:function(){return J?{}:function(){return $.apply(this,arguments)}()},children:z?Object(ue.jsx)(At.a,{}):J?"Done":"Remove"})]})]})}var It=n(151);function yt(e){var t=e.abiMethodName,n=e.adapterOrExtension,r=e.configurationInputs,a=e.isOpen,c=e.closeHandler;return Object(ue.jsx)(It.a,{keyProp:"adapter-extension-configuration",modalClassNames:"adapter-extension-configure-modal",isOpen:a,isOpenHandler:function(){c()},children:Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("span",{className:"modal__close-button",onClick:function(){c()},children:Object(ue.jsx)(Fe.a,{})}),Object(ue.jsx)("h1",{children:null===n||void 0===n?void 0:n.name.toUpperCase()}),Object(ue.jsx)("p",{children:null===n||void 0===n?void 0:n.description}),Object(ue.jsx)(wt,{abiConfigurationInputs:r,abiMethodName:t,adapterOrExtension:n,closeHandler:c})]})})}var Ct,Dt=["size"];function St(e){var t=e.size,n=Object(x.a)(e,Dt);return Object(ue.jsxs)(oe.Fragment,{children:[Object(ue.jsx)("input",Object(v.a)(Object(v.a)({},n),{},{"aria-checked":n.checked,checked:n.checked,className:"checkbox-input ".concat(n.className||""," "),id:n.id,name:n.name,onChange:n.onChange,type:"checkbox"})),Object(ue.jsxs)("label",{className:"checkbox-label",htmlFor:n.id,children:[Object(ue.jsx)("span",{className:"checkbox-box ".concat(t||Ct.SMALL)}),Object(ue.jsx)("span",{className:"checkbox-text",children:n.label})]})]})}!function(e){e.LARGE="large",e.SMALL="small"}(Ct||(Ct={}));var _t=n(57),kt=n(59),Tt=n(69),Rt=n(50);function Pt(e){var t=e.isOpen,n=e.closeHandler,r=Object(oe.useState)(),a=Object(xe.a)(r,2),s=a[0],o=a[1],i=Object(c.c)((function(e){return e.contracts})).DaoRegistryContract,u=Object(Ne.a)(),d=u.txError,l=u.txEtherscanURL,b=u.txIsPromptOpen,j=u.txSend,O=u.txStatus,p=Object(Ne.b)().fast,h=Object(pt.c)().dao,m=Object(Ne.f)(),x=m.connected,N=m.account,g=x&&N,E=O===vt.f.AWAITING_CONFIRM||O===vt.f.PENDING,A=O===vt.f.FULFILLED,w=E||A||b,I=s||d;function y(){return(y=Object(We.a)(Ve.a.mark((function e(){var t;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,g){e.next=3;break}throw new Error("No user account was found. Please make sure your wallet is connected.");case 3:if(i){e.next=5;break}throw new Error("No DAO Registry contract was found.");case 5:return t=Object(v.a)({from:N||""},p?{gasPrice:p}:null),e.next=9,j("finalizeDao",i.instance.methods,[],t);case 9:n&&setTimeout((function(){n()}),3e3),e.next=15;break;case 12:e.prev=12,e.t0=e.catch(0),o(e.t0);case 15:case"end":return e.stop()}}),e,null,[[0,12]])})))).apply(this,arguments)}return Object(ue.jsx)(It.a,{keyProp:"adapter-extension-finalize",isOpen:t,isOpenHandler:function(){n()},children:Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("span",{className:"modal__close-button",onClick:function(){n()},children:Object(ue.jsx)(Fe.a,{})}),Object(ue.jsx)("h1",{children:"Finalize"}),Object(ue.jsxs)("h2",{children:[h&&h.name," ",Object(ue.jsx)("small",{children:h&&Object(f.l)(h.daoAddress,7)})]}),Object(ue.jsx)("p",{children:"After your DAO is finalized you will need to submit a proposal to make changes."}),Object(ue.jsx)("button",{className:"button",disabled:w,onClick:function(){w||function(){y.apply(this,arguments)}()},type:"submit",children:E?Object(ue.jsx)(At.a,{}):A?"Done":"Submit"}),w&&Object(ue.jsx)("div",{className:"form__submit-status-container",children:function(){switch(O){case vt.f.AWAITING_CONFIRM:return Object(ue.jsxs)(ue.Fragment,{children:["Awaiting your confirmation",Object(ue.jsx)(kt.a,{})]});case vt.f.PENDING:return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)(Tt.a,{intervalMs:2e3,messages:_t.b,useFirstItemStart:!0,render:function(e){return Object(ue.jsx)(Ge.a,{children:e},e)}}),Object(ue.jsx)(Rt.a,{url:l,isPending:!0})]});case vt.f.FULFILLED:return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{children:"Finalized!"}),Object(ue.jsx)(Rt.a,{url:l})]});default:return null}}()}),I&&Object(ue.jsx)("div",{className:"form__submit-error-container",children:Object(ue.jsx)(Nt.a,{renderText:"Something went wrong while trying to finalize the DAO.",error:I})})]})})}var Ft,Lt=["children"],Mt=function(e){var t=e.children,n=Object(x.a)(e,Lt);return Object(ue.jsx)("div",Object(v.a)(Object(v.a)({style:{position:"relative"}},n),{},{children:t}))};function Bt(){var e=Object(c.c)((function(e){return e.contracts})),t=e.DaoRegistryContract,n=e.DaoFactoryContract,r=Object(c.c)((function(e){var t;return null===(t=e.connectedMember)||void 0===t?void 0:t.isActiveMember})),a=Object(oe.useState)(""),s=Object(xe.a)(a,2),o=s[0],i=s[1],u=Object(oe.useState)(),d=Object(xe.a)(u,2),l=d[0],b=d[1],O=Object(oe.useState)(),p=Object(xe.a)(O,2),h=p[0],m=p[1],x=Object(oe.useState)(),N=Object(xe.a)(x,2),g=N[0],E=N[1],A=Object(oe.useState)(),w=Object(xe.a)(A,2),I=w[0],y=w[1],C=Object(oe.useState)(!1),D=Object(xe.a)(C,2),S=D[0],_=D[1],k=Object(oe.useState)(!1),T=Object(xe.a)(k,2),R=T[0],P=T[1],F=Object(oe.useState)(!1),L=Object(xe.a)(F,2),M=L[0],B=L[1],G=Object(oe.useState)(0),U=Object(xe.a)(G,2),V=U[0],W=U[1],Y=Object(oe.useState)(),H=Object(xe.a)(Y,2),K=H[0],z=H[1],q=Object(oe.useState)(),J=Object(xe.a)(q,2),Q=J[0],X=J[1],$=Object(oe.useState)(),Z=Object(xe.a)($,2),ee=Z[0],te=Z[1],ne=Object(oe.useState)(),re=Object(xe.a)(ne,2),ae=re[0],ce=re[1],se=Object(Ne.d)().defaultChainError,ie=Object(Ne.f)(),de=ie.connected,le=ie.account,be=ie.web3Instance,je=Object(pt.c)(),fe=je.dao,Oe=je.gqlError,pe=bt(),he=pe.adapterExtensionStatus,me=pe.getAdapterOrExtensionFromRedux,ve=pe.registeredAdaptersOrExtensions,Ee=pe.unRegisteredAdaptersOrExtensions,Ae=function(){var e=Object(c.b)();function t(){return(t=Object(We.a)(Ve.a.mark((function t(n,r){return Ve.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:t.t0=n,t.next=t.t0===rt.a.CONFIGURATION?3:t.t0===rt.a.FINANCING?6:t.t0===rt.a.GUILDKICK?9:t.t0===rt.a.MANAGING?12:t.t0===rt.a.RAGEQUIT?15:t.t0===rt.a.BANK?18:t.t0===rt.b.NFT?21:t.t0===rt.a.ONBOARDING?24:t.t0===rt.a.TRIBUTE?27:t.t0===rt.a.DISTRIBUTE?30:t.t0===rt.a.VOTING?33:t.t0===rt.a.COUPON_ONBOARDING?36:t.t0===rt.a.TRIBUTE_NFT?39:t.t0===rt.a.NFT?42:t.t0===rt.a.DAO_REGISTRY?45:t.t0===rt.b.ERC20?48:51;break;case 3:return t.next=5,e(Object(j.E)(r));case 5:return t.abrupt("break",51);case 6:return t.next=8,e(Object(j.L)(r));case 8:return t.abrupt("break",51);case 9:return t.next=11,e(Object(j.M)(r));case 11:return t.abrupt("break",51);case 12:return t.next=14,e(Object(j.N)(r));case 14:return t.abrupt("break",51);case 15:return t.next=17,e(Object(j.R)(r));case 17:return t.abrupt("break",51);case 18:return t.next=20,e(Object(j.B)(r));case 20:return t.abrupt("break",51);case 21:return t.next=23,e(Object(j.P)(r));case 23:return t.abrupt("break",51);case 24:return t.next=26,e(Object(j.Q)(r));case 26:return t.abrupt("break",51);case 27:return t.next=29,e(Object(j.S)(r));case 29:return t.abrupt("break",51);case 30:return t.next=32,e(Object(j.J)(r));case 32:return t.abrupt("break",51);case 33:return t.next=35,e(Object(j.U)(r));case 35:return t.abrupt("break",51);case 36:return t.next=38,e(Object(j.F)(r));case 38:return t.abrupt("break",51);case 39:return t.next=41,e(Object(j.T)(r));case 41:return t.abrupt("break",51);case 42:return t.next=44,e(Object(j.O)(r));case 44:return t.abrupt("break",51);case 45:return t.next=47,e(Object(j.I)(r));case 47:return t.abrupt("break",51);case 48:return t.next=50,e(Object(j.K)(r));case 50:return t.abrupt("break",51);case 51:case"end":return t.stop()}}),t)})))).apply(this,arguments)}return{initAdapterExtensionContract:function(e,n){return t.apply(this,arguments)}}}().initAdapterExtensionContract,we=Object(Ne.a)().txSend,Ie=Object(Ne.b)().fast,ye=Object(pt.g)(),Ce=ye.isDisabled,De=ye.openWhyDisabledModal,Se=ye.setOtherDisabledReasons,_e=ye.WhyDisabledModal,ke=de&&le,Te=fe,Re=l===dt.a.READY,Pe=he===ge.a.REJECTED&&void 0===ve&&void 0===Ee,Fe=he===ge.a.PENDING,Le=0===(null===Ee||void 0===Ee?void 0:Ee.length),Me=Object(oe.useCallback)((function(){return Be.apply(this,arguments)}),[t,null===fe||void 0===fe?void 0:fe.name,Se]);function Be(){return(Be=Object(We.a)(Ve.a.mark((function e(){var n,r;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,n="".concat(null===fe||void 0===fe?void 0:fe.name," is already finalized"),e.next=6,Object(dt.g)(t.instance);case 6:r=e.sent,b(r),r===dt.a.READY&&Se([n]),e.next=14;break;case 11:e.prev=11,e.t0=e.catch(2),b(void 0);case 14:case"end":return e.stop()}}),e,null,[[2,11]])})))).apply(this,arguments)}function Ge(e){new Promise((function(t,n){try{t(me(e.name).contractAddress)}catch(a){var r=e.contractAddress;r?t(r):n(a)}})).then((function(t){Ye(t,e.name,"ADAPTER")})).catch((function(t){console.warn('Dao adapter contract not found, try adding the default "'.concat(e.name,'" contract'))}))}function Ue(e){new Promise((function(t,n){try{t(me(e.name).contractAddress)}catch(a){var r=e.contractAddress;r?t(r):n(a)}})).then((function(t){Ye(t,e.name,"EXTENSION")})).catch((function(t){console.warn('Dao extension contract not found, try adding the default "'.concat(e.name,'" contract'),t)}))}function Ye(e,t,n){return He.apply(this,arguments)}function He(){return(He=Object(We.a)(Ve.a.mark((function e(n,r,a){var c,s,o,i,u,d,l;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(y(void 0),t){e.next=3;break}throw new Error("No DAO Registry contract was found.");case 3:if(be){e.next=5;break}throw new Error("No Web3 instance was found.");case 5:if(e.prev=5,te((function(e){return Object(v.a)(Object(v.a)({},e),{},Object(nt.a)({},r,!0))})),n){e.next=9;break}throw new Error("".concat(a," address must not be empty"));case 9:return c=st(r),s=ot(r),o=s.acl,i="ADAPTER"===a?[c,n,o,[],[]]:[c,n,le],u=Object(v.a)({from:le||""},Ie?{gasPrice:Ie}:null),d="ADAPTER"===a?"replaceAdapter":"addExtension",e.next=16,we(d,t.instance.methods,i,u);case 16:te((function(e){return Object(v.a)(Object(v.a)({},e),{},Object(nt.a)({},r,!1))})),m((function(e){return Object(v.a)(Object(v.a)({},e),{},Object(nt.a)({},r,!0))})),Ae(r,be),e.next=26;break;case 21:e.prev=21,e.t0=e.catch(5),te((function(e){return Object(v.a)(Object(v.a)({},e),{},Object(nt.a)({},r,!1))})),l=new Error(e.t0&&4001===(null===e.t0||void 0===e.t0?void 0:e.t0.code)?e.t0.message:"Unable to add ".concat(r," ").concat(a,"; ").concat(e.t0)),y(l);case 26:case"end":return e.stop()}}),e,null,[[5,21]])})))).apply(this,arguments)}function Ke(){return(Ke=Object(We.a)(Ve.a.mark((function e(){var t,r,a,c,s,o,i,u,d;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(y(void 0),n){e.next=3;break}throw new Error("DaoFactoryContract not found");case 3:if(be){e.next=5;break}throw new Error("No Web3 instance was found.");case 5:for(a in e.prev=5,t=[],r=function(e){if(K[e]){var n=ut.filter((function(t){return t.name===e}))[0],r=n.adapterId,a=n.contractAddress;if(!a){var c=me(e);a=null===c||void 0===c?void 0:c.contractAddress}var s=ot(e).acl;r&&a&&(t.push([r,a,s]),te((function(t){return Object(v.a)(Object(v.a)({},t),{},Object(nt.a)({},e,!0))})))}},K)r(a);return c=[null===fe||void 0===fe?void 0:fe.daoAddress,t],s=Object(v.a)({from:le||""},Ie?{gasPrice:Ie}:null),e.next=13,we("addAdapters",n.instance.methods,c,s);case 13:for(o in K)K[o]&&o&&Ae(o,be);e.next=23;break;case 16:for(d in e.prev=16,e.t0=e.catch(5),i=new Error(e.t0&&4001===(null===e.t0||void 0===e.t0?void 0:e.t0.code)?e.t0.message:"Unable to add adapters; ".concat(e.t0)),y(i),qe(!1),u=function(e){te((function(t){return Object(v.a)(Object(v.a)({},t),{},Object(nt.a)({},e,!1))}))},K)u(d);case 23:case"end":return e.stop()}}),e,null,[[5,16]])})))).apply(this,arguments)}function ze(){return(ze=Object(We.a)(Ve.a.mark((function e(t){var n,r,a,c,s,o;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(y(void 0),e.prev=1,n=t.abiFunctionName,r=t.name,n){e.next=5;break}throw new Error("ABI function not found for ".concat(r));case 5:a=me(r),c=a.abi,s=c.filter((function(e){return e.name===n}))[0].inputs,i(n),X(t),E(s),_(!0),e.next=17;break;case 13:e.prev=13,e.t0=e.catch(1),o=new Error(e.t0&&4001===(null===e.t0||void 0===e.t0?void 0:e.t0.code)?e.t0.message:"".concat(t.name," contract not found")),y(o);case 17:case"end":return e.stop()}}),e,null,[[1,13]])})))).apply(this,arguments)}function qe(e){B(e);var t=function(t){z((function(n){return Object(v.a)(Object(v.a)({},n),{},Object(nt.a)({},t,e))}))};for(var n in K)t(n)}return Object(oe.useEffect)((function(){Me()}),[Me,t]),Object(oe.useEffect)((function(){B(!1),Ee&&Ee&&(null===Ee||void 0===Ee||Ee.forEach((function(e){!(null===e||void 0===e?void 0:e.options)&&!e.isExtension&&z((function(t){return Object(v.a)(Object(v.a)({},t),{},Object(nt.a)({},e.name,!1))}))})))}),[Ce,Ee]),Object(oe.useEffect)((function(){K&&W(Object.values(K).filter((function(e){return!0===e})).length)}),[K]),ke&&r&&!se?Object(ue.jsx)(Gt,{children:Object(ue.jsxs)("div",{className:"adaptermanager",children:[!fe&&Oe?(window.scrollTo({top:0,left:200,behavior:"smooth"}),Object(ue.jsx)(Nt.a,{error:Oe,renderText:"Something went wrong"})):fe?Object(ue.jsxs)("h3",{children:[fe.name," ",Object(ue.jsx)("small",{children:Object(f.l)(fe.daoAddress,7)})]}):void 0,I?(window.scrollTo({top:0,left:200,behavior:"smooth"}),Object(ue.jsx)(Nt.a,{error:I,renderText:"Something went wrong"})):Object(ue.jsx)(ue.Fragment,{}),Object(ue.jsx)("p",{children:"Nulla aliquet porttitor venenatis. Donec a dui et dui fringilla consectetur id nec massa. Aliquam erat volutpat. Sed ut dui ut lacus dictum fermentum vel tincidunt neque. Sed sed lacinia..."}),Object(ue.jsxs)("div",{className:"adapter-extension__selection",children:[Object(ue.jsx)("div",{children:Object(ue.jsx)(St,{"data-testid":"selectall",role:"checkbox",id:"selectall",label:"".concat(V," selected"),checked:!0===M,disabled:Ce||Pe||Le||!Te,name:"selectall",size:Ct.LARGE,onChange:function(e){qe(e.target.checked)}})}),Object(ue.jsx)("div",{children:Object(ue.jsx)("button",{className:"button--secondary",disabled:0===V||Ce,onClick:function(){return Ke.apply(this,arguments)},children:"Add selected"})})]}),Fe&&Object(ue.jsx)("div",{className:"adapter-extension__loader",children:Object(ue.jsx)(At.a,{text:"Loading data from subgraph..."})}),Pe&&Object(ue.jsx)("p",{children:"No adapters/extensions available"}),Te&&Ee&&(null===Ee||void 0===Ee?void 0:Ee.length)>0&&Ee.map((function(e,t){return Object(ue.jsx)("div",{className:"adapter-extension__grid unregistered",children:(null===e||void 0===e?void 0:e.options)?Object(ue.jsx)(ht,{adapterOrExtension:e,renderCheckboxAction:function(t){var n=t.selectedTargetOption;return Object(ue.jsx)(ue.Fragment,{children:Object(ue.jsx)("div",{className:"adapter-extension__checkbox",children:Object(ue.jsx)(St,{id:n||"empty",label:"",checked:n&&K&&!0===K[n]||!1,disabled:Ce||null===n||(null===e||void 0===e?void 0:e.isExtension),name:n||"",size:Ct.LARGE,onChange:function(e){n&&function(e){var t=e.event,n=e.selectedTargetOption;z((function(e){return Object(v.a)(Object(v.a)({},e),{},Object(nt.a)({},n,t.target.checked))}))}({event:e,selectedTargetOption:n})}})})})},renderActions:function(e){var t=e.selectedTargetOption,n=e.selectedTargetOptionProps;return Object(ue.jsx)(ue.Fragment,{children:Object(ue.jsx)("div",{className:"adapter-extension__add",children:Object(ue.jsx)("button",{className:"button--secondary",disabled:null===t||ee&&ee[n.name]||Ce,onClick:function(){return(null===n||void 0===n?void 0:n.isExtension)?Ue(n):Ge(n)},children:ee&&ee[n.name]?Object(ue.jsx)(At.a,{}):h&&h[n.name]?"Done":"Add"})})})}}):Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsxs)("div",{className:"adapter-extension__inner-wrapper ",children:[Object(ue.jsx)("div",{className:"adapter-extension__checkbox",children:!(null===e||void 0===e?void 0:e.isExtension)&&Object(ue.jsx)(St,{id:e.name,label:"",checked:K&&!0===K[e.name]||!1,disabled:Ce,name:e.name,size:Ct.LARGE,onChange:function(t){z((function(n){return Object(v.a)(Object(v.a)({},n),{},Object(nt.a)({},e.name,t.target.checked))}))}})}),Object(ue.jsxs)("div",{className:"adapter-extension__info",children:[Object(ue.jsxs)("span",{className:"adapter-extension__name",children:[e.name," ",(null===e||void 0===e?void 0:e.isExtension)&&"(EXTENSION)"]}),Object(ue.jsx)("span",{className:"adapter-extension__desc",children:e.description})]})]}),Object(ue.jsx)("div",{className:"adapter-extension__add",children:Object(ue.jsx)("button",{className:"button--secondary",disabled:ee&&ee[e.name]||h&&h[e.name]||Ce,onClick:function(){return(null===e||void 0===e?void 0:e.isExtension)?Ue(e):Ge(e)},children:ee&&ee[e.name]?Object(ue.jsx)(At.a,{}):h&&h[e.name]?"Done":"Add"})})]})},t)})),Te&&ve&&(null===ve||void 0===ve?void 0:ve.length)>0&&ve.map((function(e,t){return Object(ue.jsxs)("div",{className:"adapter-extension__grid registered",children:[Object(ue.jsxs)("div",{className:"adapter-extension__info",children:[Object(ue.jsxs)("span",{className:"adapter-extension__name",children:[e.name," ",(null===e||void 0===e?void 0:e.isExtension)&&"(EXTENSION)"]}),Object(ue.jsx)("span",{className:"adapter-extension__desc",children:e.description})]}),Object(ue.jsx)("div",{className:"adapter-extension__configure",children:Object(ue.jsx)("button",{className:"button--secondary",disabled:Ce||(null===e||void 0===e?void 0:e.isExtension),onClick:function(){return function(e){return ze.apply(this,arguments)}(e)},children:"Configure"})})]},"".concat(e.id,"-").concat(t))})),Ce&&Object(ue.jsx)("div",{children:Object(ue.jsx)("button",{className:"button--help",onClick:function(){De(),ce(Ft.CONFIGURATION_REASON)},children:Ft.CONFIGURATION_REASON})}),Object(ue.jsxs)("div",{className:"adapter-adapter-extension__finalize",children:[Object(ue.jsx)("p",{children:"If you're happy with your setup, you can finalize your DAO. After your DAO is finalized you will need to submit a proposal to make changes."}),Object(ue.jsx)("div",{children:Object(ue.jsx)("button",{"data-testid":"finalizedao",className:"button--secondary finalize",disabled:Pe||!Te||Re,onClick:function(){return P(!0)},children:"Finalize Dao"})}),Ce&&Object(ue.jsx)("div",{children:Object(ue.jsx)("button",{className:"button--help",onClick:function(){De(),ce(Ft.FINALIZED_REASON)},children:Ft.FINALIZED_REASON})}),Object(ue.jsx)(_e,{title:ae})]}),S&&Object(ue.jsx)(yt,{abiMethodName:o,adapterOrExtension:Q,configurationInputs:g,isOpen:S,closeHandler:function(){_(!1)}}),R&&Object(ue.jsx)(Pt,{isOpen:R,closeHandler:function(){P(!1),Me()}})]})}):Object(ue.jsx)(Gt,{children:Object(ue.jsx)("div",{className:"adapter-extension__unauthorized-message",children:Object(ue.jsx)("p",{children:ke?se?se.message:r?void 0:"Either you are not a member, or your membership is not active.":"Connect your wallet to manage the DAO adapters and extensions."})})})}function Gt(e){return Object(ue.jsx)(Mt,{className:"section-wrapper",children:Object(ue.jsxs)(Ge.a,{children:[Object(ue.jsx)("div",{className:"titlebar",children:Object(ue.jsx)("h2",{className:"titlebar__title",children:"Adapter/Extension Manager"})}),e.children]})})}!function(e){e.FINALIZED_REASON="Why is finalizing disabled?",e.CONFIGURATION_REASON="Why are configurations disabled?"}(Ft||(Ft={}));var Ut,Vt=n(22),Wt=n(39),Yt=n(46),Ht=n(213);function Kt(e){var t=e.value;return t?Object(ue.jsxs)("details",{children:[Object(ue.jsx)("summary",{style:{cursor:"pointer",outline:"none"},children:Object(ue.jsx)("small",{children:"Preview Markdown"})}),Object(ue.jsx)("div",{style:{marginTop:"1em"},children:Object(ue.jsx)(Ht.a,{children:t})})]}):null}function zt(){var e=Object(c.c)((function(e){var t;return null===(t=e.connectedMember)||void 0===t?void 0:t.isActiveMember})),t=Object(oe.useState)(),n=Object(xe.a)(t,2),r=n[0],a=n[1],s=Object(Ne.f)(),o=s.connected,i=s.account,u=Object(Yt.i)(),d=u.proposalSignAndSendStatus,l=u.signAndSendProposal,b=Object(Ne.d)().defaultChainError,j=Object(mt.a)({mode:"onBlur",reValidateMode:"onChange"}),O=Object(se.f)(),p=j.errors,h=j.getValues,m=j.register,v=j.trigger,x=j.watch,N=o&&i,g=d===vt.f.AWAITING_CONFIRM||d===vt.f.PENDING,E=d===vt.f.FULFILLED,A=g||E;function w(e){return I.apply(this,arguments)}function I(){return(I=Object(We.a)(Ve.a.mark((function e(t){var n,r;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,l({partialProposalData:{name:t.title,body:t.description,metadata:{type:Wt.d.Governance}},type:Vt.SnapshotType.proposal});case 3:n=e.sent,r=n.uniqueId,O.push("/governance/".concat(r)),e.next=11;break;case 8:e.prev=8,e.t0=e.catch(0),a(e.t0);case 11:case"end":return e.stop()}}),e,null,[[0,8]])})))).apply(this,arguments)}return N&&e&&!b?Object(ue.jsx)(qt,{children:Object(ue.jsxs)("form",{className:"form",onSubmit:function(e){return e.preventDefault()},children:[Object(ue.jsxs)("div",{className:"form__input-row",children:[Object(ue.jsx)("label",{className:"form__input-row-label",htmlFor:Ut.title,children:"Title"}),Object(ue.jsxs)("div",{className:"form__input-row-fieldwrap",children:[Object(ue.jsx)("input",{"aria-describedby":"error-".concat(Ut.title),"aria-invalid":p.title?"true":"false",id:Ut.title,name:Ut.title,ref:m({required:ft.a.REQUIRED}),type:"text",disabled:A}),Object(ue.jsx)(Et,{error:Object(f.g)(Ut.title,p),id:"error-".concat(Ut.title)})]})]}),Object(ue.jsxs)("div",{className:"form__textarea-row",children:[Object(ue.jsx)("label",{className:"form__input-row-label",htmlFor:Ut.description,children:"Description"}),Object(ue.jsxs)("div",{className:"form__input-row-fieldwrap",children:[Object(ue.jsx)("textarea",{"aria-describedby":"error-".concat(Ut.description),"aria-invalid":p.description?"true":"false",id:Ut.description,name:Ut.description,placeholder:"Say something about your governance proposal...",ref:m({required:ft.a.REQUIRED}),disabled:A}),Object(ue.jsx)(Et,{error:Object(f.g)(Ut.description,p),id:"error-".concat(Ut.description)}),Object(ue.jsx)(Kt,{value:x(Ut.description)})]})]}),Object(ue.jsx)("button",{"aria-label":g?"Submitting your proposal...":"",className:"button",disabled:A,onClick:Object(We.a)(Ve.a.mark((function e(){return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!A){e.next=2;break}return e.abrupt("return");case 2:return e.next=4,v();case 4:if(e.sent){e.next=6;break}return e.abrupt("return");case 6:w(h());case 7:case"end":return e.stop()}}),e)}))),type:"submit",children:g?Object(ue.jsx)(At.a,{}):E?"Done":"Submit"}),A&&Object(ue.jsx)("div",{className:"form__submit-status-container",children:function(){switch(d){case vt.f.AWAITING_CONFIRM:return Object(ue.jsxs)(ue.Fragment,{children:["Awaiting your confirmation",Object(ue.jsx)(kt.a,{intervalMs:500})]});case vt.f.PENDING:return Object(ue.jsxs)(ue.Fragment,{children:["Submitting",Object(ue.jsx)(kt.a,{intervalMs:500})]});case vt.f.FULFILLED:return"Done!";default:return""}}()}),r&&Object(ue.jsx)("div",{className:"form__submit-error-container",children:Object(ue.jsx)(Nt.a,{renderText:"Something went wrong while submitting the proposal.",error:r})})]})}):Object(ue.jsx)(qt,{children:Object(ue.jsx)("div",{className:"form__description--unauthorized",children:Object(ue.jsx)("p",{children:N?b?b.message:e?void 0:"Either you are not a member, or your membership is not active.":"Connect your wallet to submit a governance proposal."})})})}function qt(e){return Object(ue.jsx)(Mt,{className:"section-wrapper",children:Object(ue.jsxs)(Ge.a,{children:[Object(ue.jsx)("div",{className:"titlebar",children:Object(ue.jsx)("h2",{className:"titlebar__title",children:"Governance Proposal"})}),Object(ue.jsxs)("div",{className:"form-wrapper",children:[Object(ue.jsx)("div",{className:"form__description",children:Object(ue.jsx)("p",{children:"Nulla aliquet porttitor venenatis. Donec a dui et dui fringilla consectetur id nec massa. Aliquam erat volutpat. Sed ut dui ut lacus dictum fermentum vel tincidunt neque. Sed sed lacinia..."})}),e.children]})]})})}!function(e){e.title="title",e.description="description"}(Ut||(Ut={}));var Jt,Qt=n(25),Xt=n(85);function $t(){var e=Object(Ne.d)().defaultChainError,t=Object(Ne.f)(),n=t.connected,r=t.account,a=t.web3Instance,c=Object(Yt.i)(),s=c.proposalData,o=c.proposalSignAndSendError,i=c.proposalSignAndSendStatus,u=c.signAndSendProposal,d=Object(mt.a)({mode:"onBlur",reValidateMode:"onChange"}),l=Object(se.f)(),j=Object(oe.useState)(),O=Object(xe.a)(j,2),p=O[0],h=O[1],m=Object(oe.useState)(),v=Object(xe.a)(m,2),x=v[0],N=v[1],g=d.errors,E=d.getValues,A=d.setValue,w=d.register,I=d.trigger,y=(0,d.watch)(Jt.ethAddress),C=p||o,D=n&&r,S=i===vt.f.AWAITING_CONFIRM||i===vt.f.PENDING,_=i===vt.f.FULFILLED,k=S||_,T=Object(Yt.a)(y),R=T.checkApplicantError,P=T.checkApplicantInvalidMsg,F=T.checkApplicantStatus,L=T.isApplicantValid,M=Object(oe.useCallback)((function(){return B.apply(this,arguments)}),[r,a]);function B(){return(B=Object(We.a)(Ve.a.mark((function e(){var t;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a&&r){e.next=3;break}return N(void 0),e.abrupt("return");case 3:return e.prev=3,e.next=6,a.eth.getBalance(r);case 6:t=e.sent,N(a.utils.fromWei(t,"ether")),e.next=13;break;case 10:e.prev=10,e.t0=e.catch(3),N(void 0);case 13:case"end":return e.stop()}}),e,null,[[3,10]])})))).apply(this,arguments)}function G(e){return U.apply(this,arguments)}function U(){return(U=Object(We.a)(Ve.a.mark((function e(t){var n,a,c,o,i,d,j,O,p,m,v;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,D){e.next=3;break}throw new Error("No user account was found. Please make sure your wallet is connected.");case 3:if(r){e.next=5;break}throw new Error("No account found.");case 5:if(R&&console.warn("Error checking if the applicant address is valid: ".concat(R.message)),F!==ge.a.FULFILLED||L||!P){e.next=8;break}throw new Error(P);case 8:if(n=(null===s||void 0===s?void 0:s.uniqueId)||"",a=t.ethAddress,c=t.ethAmount,o=Object(Qt.toChecksumAddress)(a),i=Object(Qt.toWei)(Object(f.k)(c),"ether"),d=Object(Qt.toChecksumAddress)(r),j={tributeAmount:c,tributeAmountUnit:"ETH"},O=[o,b.H,i],n){e.next=22;break}return p=Object(f.i)(a)===Object(f.i)(r)?"Membership for ".concat(Object(f.l)(o,7),"."):"Membership proposal from ".concat(Object(f.l)(d,7)," for applicant ").concat(Object(f.l)(o,7),"."),e.next=19,u({partialProposalData:{name:o,body:p,metadata:{proposalAmountValues:j,submitActionArgs:O,accountAuthorizedToProcessPassedProposal:d}},adapterName:vt.a.onboarding,type:Vt.SnapshotType.draft});case 19:m=e.sent,v=m.uniqueId,n=v;case 22:l.push("/membership/".concat(n)),e.next=28;break;case 25:e.prev=25,e.t0=e.catch(0),h(e.t0);case 28:case"end":return e.stop()}}),e,null,[[0,25]])})))).apply(this,arguments)}return Object(oe.useEffect)((function(){M()}),[M]),Object(oe.useEffect)((function(){A(Jt.ethAddress,r)}),[r,A]),!D||e?Object(ue.jsx)(Zt,{children:Object(ue.jsx)("div",{className:"form__description--unauthorized",children:Object(ue.jsx)("p",{children:D?e?e.message:void 0:"Connect your wallet to submit a membership proposal."})})}):Object(ue.jsx)(Zt,{children:Object(ue.jsxs)("form",{className:"form",onSubmit:function(e){return e.preventDefault()},children:[Object(ue.jsxs)("div",{className:"form__input-row",children:[Object(ue.jsx)("label",{className:"form__input-row-label",htmlFor:Jt.ethAddress,children:"Applicant Address"}),Object(ue.jsxs)("div",{className:"form__input-row-fieldwrap",children:[Object(ue.jsx)("input",{"aria-describedby":"error-".concat(Jt.ethAddress),"aria-invalid":g.ethAddress?"true":"false",id:Jt.ethAddress,name:Jt.ethAddress,ref:w({validate:function(e){return e?!!Object(Xt.a)(e)||ft.a.INVALID_ETHEREUM_ADDRESS:ft.a.REQUIRED}}),type:"text",disabled:k}),Object(ue.jsx)(Et,{error:Object(f.g)(Jt.ethAddress,g),id:"error-".concat(Jt.ethAddress)})]})]}),Object(ue.jsxs)("div",{className:"form__input-row",children:[Object(ue.jsx)("label",{className:"form__input-row-label",htmlFor:Jt.ethAmount,children:"Amount"}),Object(ue.jsxs)("div",{className:"form__input-row-fieldwrap--narrow",children:[Object(ue.jsxs)("div",{className:"input__suffix-wrap",children:[Object(ue.jsx)("input",{className:"input__suffix","aria-describedby":"error-".concat(Jt.ethAmount),"aria-invalid":g.ethAmount?"true":"false",id:Jt.ethAmount,name:Jt.ethAmount,onChange:function(){return A(Jt.ethAmount,Object(f.e)(E().ethAmount))},ref:w({validate:function(e){var t=Number(Object(f.k)(e));return""===e?ft.a.REQUIRED:isNaN(t)?ft.a.INVALID_NUMBER:t<=0?"The value must be greater than 0 ETH.":!(t>=Number(x))||"Insufficient funds."}}),type:"text",disabled:k}),Object(ue.jsx)("div",{className:"input__suffix-item",children:"ETH"})]}),Object(ue.jsx)(Et,{error:Object(f.g)(Jt.ethAmount,g),id:"error-".concat(Jt.ethAmount)})]}),Object(ue.jsxs)("div",{className:"form__input-addon",children:["available: ",Object(ue.jsx)("span",{children:x?Number.isInteger(Number(x))?x:Object(f.d)(Number(x)):"---"})]})]}),Object(ue.jsx)("button",{"aria-label":S?"Submitting your proposal.":"",className:"button",disabled:k,onClick:Object(We.a)(Ve.a.mark((function e(){return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!k){e.next=2;break}return e.abrupt("return");case 2:return e.next=4,I();case 4:if(e.sent){e.next=6;break}return e.abrupt("return");case 6:G(E());case 7:case"end":return e.stop()}}),e)}))),type:"submit",children:S?Object(ue.jsx)(At.a,{}):_?"Done":"Submit"}),k&&Object(ue.jsx)("div",{className:"form__submit-status-container",children:function(){switch(i){case vt.f.AWAITING_CONFIRM:return Object(ue.jsxs)(ue.Fragment,{children:["Awaiting your confirmation",Object(ue.jsx)(kt.a,{intervalMs:500})]});case vt.f.PENDING:return Object(ue.jsxs)(ue.Fragment,{children:["Submitting",Object(ue.jsx)(kt.a,{intervalMs:500})]});case vt.f.FULFILLED:return"Done!";default:return""}}()}),C&&Object(ue.jsx)("div",{className:"form__submit-error-container",children:Object(ue.jsx)(Nt.a,{renderText:"Something went wrong while submitting the proposal.",error:C})})]})})}function Zt(e){return Object(ue.jsx)(Mt,{className:"section-wrapper",children:Object(ue.jsxs)(Ge.a,{children:[Object(ue.jsx)("div",{className:"titlebar",children:Object(ue.jsx)("h2",{className:"titlebar__title",children:"Join"})}),Object(ue.jsxs)("div",{className:"form-wrapper",children:[Object(ue.jsx)("div",{className:"form__description",children:Object(ue.jsx)("p",{children:"Nulla aliquet porttitor venenatis. Donec a dui et dui fringilla consectetur id nec massa. Aliquam erat volutpat. Sed ut dui ut lacus dictum fermentum vel tincidunt neque. Sed sed lacinia..."})}),e.children]})]})})}!function(e){e.ethAddress="ethAddress",e.ethAmount="ethAmount"}(Jt||(Jt={}));var en,tn,nn=n(459);function rn(){var e=Object(c.c)((function(e){var t;return null===(t=e.contracts)||void 0===t?void 0:t.DistributeContract})),t=Object(c.c)((function(e){var t;return null===(t=e.contracts)||void 0===t?void 0:t.DaoRegistryContract})),n=Object(c.c)((function(e){var t;return null===(t=e.contracts)||void 0===t?void 0:t.BankExtensionContract})),a=Object(c.c)((function(e){var t;return null===(t=e.connectedMember)||void 0===t?void 0:t.isActiveMember})),s=Object(Ne.d)().defaultChainError,o=Object(Ne.f)(),i=o.connected,u=o.account,d=o.web3Instance,l=Object(Ne.b)().fast,j=Object(Ne.a)(),O=j.txError,p=j.txEtherscanURL,h=j.txIsPromptOpen,m=j.txSend,x=j.txStatus,N=Object(Yt.i)(),g=N.proposalData,E=N.proposalSignAndSendStatus,A=N.signAndSendProposal,w=Object(mt.a)({mode:"onBlur",reValidateMode:"onChange"}),I=Object(se.f)(),y=Object(oe.useState)(),C=Object(xe.a)(y,2),D=C[0],S=C[1],_=Object(oe.useState)(),k=Object(xe.a)(_,2),T=k[0],R=k[1],P=Object(oe.useState)(),F=Object(xe.a)(P,2),L=F[0],M=F[1],B=w.errors,G=w.getValues,U=w.setValue,V=w.register,W=w.trigger,Y=w.watch,H="all members"===Y("type"),K=Y("selectedToken"),z=D||O,q=i&&u,J=nn,Q=x===vt.f.AWAITING_CONFIRM||x===vt.f.PENDING||E===vt.f.AWAITING_CONFIRM||E===vt.f.PENDING,X=x===vt.f.FULFILLED&&E===vt.f.FULFILLED,$=Q||X||h,Z=Object(oe.useCallback)((function(){return te.apply(this,arguments)}),[n,u,J,d]),ee=Object(oe.useCallback)((function(){return ne.apply(this,arguments)}),[u,K]);function te(){return(te=Object(We.a)(Ve.a.mark((function e(){var t,a,c,s,o,i,l,j,f,O,p,h,m,x,N,g,E,A,w,I,y,C,D,S,_,k,T;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(u&&n&&d){e.next=3;break}return R(void 0),e.abrupt("return");case 3:return e.prev=3,t=n.abi,a=n.contractAddress,c=n.instance.methods,e.next=7,c.nbTokens().call();case 7:if(s=e.sent,!(Number(s)<1)){e.next=12;break}R([]),e.next=44;break;case 12:return o=[],i=t.find((function(e){return"getToken"===e.name})),l=Object(r.a)(Array(Number(s)).keys()).map((function(e){return[a,i,[e.toString()]]})),e.next=17,Object(dt.j)({calls:l,web3Instance:d});case 17:return j=e.sent,f=t.find((function(e){return"balanceOf"===e.name})),O=j.map((function(e){return[a,f,[b.u,e]]})),e.next=22,Object(dt.j)({calls:O,web3Instance:d});case 22:if(p=e.sent,h=j.map((function(e,t){return{address:e,daoBalance:p[t]}})).filter((function(e){return Object(Qt.toBN)(e.daoBalance).gt(Object(Qt.toBN)(0))})),(m=h.find((function(e){return e.address===b.p})))&&o.push(Object(v.a)(Object(v.a)({},m),{},{name:"Ether",symbol:"ETH",decimals:18})),!((x=h.filter((function(e){return e.address!==b.p}))).length>0)){e.next=43;break}return N=J.find((function(e){return"name"===e.name})),g=x.map((function(e){return[e.address,N,[]]})),E=J.find((function(e){return"symbol"===e.name})),A=x.map((function(e){return[e.address,E,[]]})),w=J.find((function(e){return"decimals"===e.name})),I=x.map((function(e){return[e.address,w,[]]})),y=[].concat(Object(r.a)(g),Object(r.a)(A),Object(r.a)(I)),e.next=37,Object(dt.j)({calls:y,web3Instance:d});case 37:for(C=e.sent,D=[];C.length;)D.push(C.splice(0,x.length));S=D[0],_=D[1],k=D[2],T=x.map((function(e,t){return Object(v.a)(Object(v.a)({},e),{},{name:S[t],symbol:_[t],decimals:k[t]})})).sort((function(e,t){return e.name.localeCompare(t.name)})),o=[].concat(Object(r.a)(o),Object(r.a)(T));case 43:R(o);case 44:e.next=50;break;case 46:e.prev=46,e.t0=e.catch(3),console.error(e.t0),R(void 0);case 50:case"end":return e.stop()}}),e,null,[[3,46]])})))).apply(this,arguments)}function ne(){return(ne=Object(We.a)(Ve.a.mark((function e(){var t,n,r,a,c,s,o,i;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(u&&K){e.next=3;break}return M(void 0),e.abrupt("return");case 3:try{t=JSON.parse(K),n=t.daoBalance,r=Object(Qt.toBN)(n),a=t.decimals,c=Object(Qt.toBN)(10).pow(Object(Qt.toBN)(a)),s=r.div(c),o=r.mod(c),i=o.eq(Object(Qt.toBN)(0))?s.toString():"".concat(s.toString(),".").concat(o.toString()),M(i)}catch(d){console.error(d),M(void 0)}case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function re(e){return ae.apply(this,arguments)}function ae(){return(ae=Object(We.a)(Ve.a.mark((function n(r){var a,c,s,o,i,j,O,p,h,x,N,E,w,y,C,D,_,k,T,R,P,F,L,M,B,G,U,V;return Ve.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(n.prev=0,q){n.next=3;break}throw new Error("No user account was found. Please make sure your wallet is connected.");case 3:if(e){n.next=5;break}throw new Error("No DistributeContract found.");case 5:if(t){n.next=7;break}throw new Error("No DaoRegistryContract found.");case 7:if(u){n.next=9;break}throw new Error("No account found.");case 9:if(d){n.next=11;break}throw new Error("No Web3 instance was found.");case 11:if(a=r.selectedToken,c=r.memberAddress,s=r.amount,o=r.notes,i=Object(Qt.toChecksumAddress)(c),j=JSON.parse(a),O=j.symbol,p=j.decimals,(h=j.address)===b.p?x=Object(Qt.toWei)(Object(f.k)(s),"ether"):(N=Object(Qt.toBN)(10).pow(Object(Qt.toBN)(p)),E=Object(Qt.toBN)(Object(f.k)(s)).mul(N),x=E.toString()),w=(null===g||void 0===g?void 0:g.uniqueId)||"",y=null===g||void 0===g?void 0:g.data,C=(null===g||void 0===g?void 0:g.signature)||"",D=H?"Transfer to all members pro rata.":"Transfer to ".concat(Object(f.l)(i,7),"."),_={transferAmount:s,transferAmountUnit:O},w){n.next=34;break}return k=o?"".concat(D,"\n").concat(o):D,T=H?"All members":i,R=Math.floor(Date.now()/1e3),n.next=27,A({partialProposalData:{name:T,body:k,metadata:{proposalAmountValues:_,isTypeAllMembers:H},timestamp:R.toString()},adapterName:vt.a.distribute,type:Vt.SnapshotType.proposal});case 27:P=n.sent,F=P.uniqueId,L=P.data,M=P.signature,w=F,y=L,C=M;case 34:return B=H?xt.a:i,G=y?Object(Vt.prepareVoteProposalData)({payload:{name:y.payload.name,body:y.payload.body,choices:y.payload.choices,snapshot:y.payload.snapshot.toString(),start:y.payload.start,end:y.payload.end},sig:C,space:y.space,timestamp:parseInt(y.timestamp)},d):"",U=[t.contractAddress,w,B,h,x,G],V=Object(v.a)({from:u||""},l?{gasPrice:l}:null),n.next=40,m("submitProposal",e.instance.methods,U,V);case 40:I.push("/transfers/".concat(w)),n.next=46;break;case 43:n.prev=43,n.t0=n.catch(0),S(n.t0);case 46:case"end":return n.stop()}}),n,null,[[0,43]])})))).apply(this,arguments)}function ce(e){return ie.apply(this,arguments)}function ie(){return(ie=Object(We.a)(Ve.a.mark((function e(t){var r;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n){e.next=3;break}return console.error("No BankExtensionContract found."),e.abrupt("return",!1);case 3:return e.next=5,n.instance.methods.balanceOf(t,b.H).call();case 5:return r=e.sent,e.abrupt("return",Object(Qt.toBN)(r).gt(Object(Qt.toBN)(0)));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return Object(oe.useEffect)((function(){Z()}),[Z]),Object(oe.useEffect)((function(){ee()}),[ee]),q&&!s&&a?Object(ue.jsx)(an,{children:Object(ue.jsxs)("form",{className:"form",onSubmit:function(e){return e.preventDefault()},children:[Object(ue.jsxs)("div",{className:"form__input-row",children:[Object(ue.jsx)("label",{className:"form__input-row-label",children:"Type"}),Object(ue.jsx)("div",{className:"form__input-row-fieldwrap",children:Object(ue.jsxs)("select",{name:en.type,ref:V,disabled:$,children:[Object(ue.jsx)("option",{value:"single member",children:"Single member"}),Object(ue.jsx)("option",{value:"all members",children:"All members"})]})})]}),!H&&Object(ue.jsxs)("div",{className:"form__input-row",children:[Object(ue.jsx)("label",{className:"form__input-row-label",children:"Member Address"}),Object(ue.jsxs)("div",{className:"form__input-row-fieldwrap",children:[Object(ue.jsx)("input",{"aria-describedby":"error-".concat(en.memberAddress),"aria-invalid":B.memberAddress?"true":"false",name:en.memberAddress,ref:V({validate:function(){var e=Object(We.a)(Ve.a.mark((function e(t){return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t){e.next=4;break}e.t0=ft.a.REQUIRED,e.next=17;break;case 4:if(Object(Xt.a)(t)){e.next=8;break}e.t1=ft.a.INVALID_ETHEREUM_ADDRESS,e.next=16;break;case 8:return e.next=10,ce(t);case 10:if(e.sent){e.next=14;break}e.t2="The address is not an active member with membership tokens.",e.next=15;break;case 14:e.t2=!0;case 15:e.t1=e.t2;case 16:e.t0=e.t1;case 17:return e.abrupt("return",e.t0);case 18:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()}),type:"text",disabled:$}),Object(ue.jsx)(Et,{error:Object(f.g)(en.memberAddress,B),id:"error-".concat(en.memberAddress)})]})]}),Object(ue.jsxs)("div",{className:"form__input-row",children:[Object(ue.jsx)("label",{className:"form__input-row-label",children:"Asset"}),Object(ue.jsxs)("div",{className:"form__input-row-fieldwrap",children:[Object(ue.jsxs)("select",{"aria-describedby":"error-".concat(en.selectedToken),"aria-invalid":B.selectedToken?"true":"false",name:en.selectedToken,ref:V({validate:function(e){return!T||T.length<1?"No tokens available for distribution.":!!e||ft.a.REQUIRED}}),disabled:$,children:[Object(ue.jsx)("option",{value:"",children:"Select from DAO assets"}),null===T||void 0===T?void 0:T.map((function(e){return Object(ue.jsx)("option",{value:JSON.stringify(e),children:"".concat(e.name," (").concat(e.symbol,")")},e.address)}))]}),Object(ue.jsx)(Et,{error:Object(f.g)(en.selectedToken,B),id:"error-".concat(en.selectedToken)})]})]}),Object(ue.jsxs)("div",{className:"form__input-row",children:[Object(ue.jsx)("label",{className:"form__input-row-label",children:"Amount"}),Object(ue.jsxs)("div",{className:"form__input-row-fieldwrap--narrow",children:[Object(ue.jsxs)("div",{className:"input__suffix-wrap",children:[Object(ue.jsx)("input",{className:"input__suffix","aria-describedby":"error-".concat(en.amount),"aria-invalid":B.amount?"true":"false",name:en.amount,onChange:function(){return U(en.amount,Object(f.e)(G().amount))},ref:V({validate:function(e){var t=Number(Object(f.k)(e)),n=K&&JSON.parse(K),r=(null===n||void 0===n?void 0:n.address)===b.p;return""===e?ft.a.REQUIRED:isNaN(t)?ft.a.INVALID_NUMBER:t<=0?"The value must be greater than 0.":t>Number(L)?"Insufficient funds.":!!r||(!!Number.isInteger(t)||"The value must be an integer for an ERC20 token.")}}),type:"text",disabled:$}),Object(ue.jsx)("div",{className:"input__suffix-item",children:K&&JSON.parse(K).symbol||"___"})]}),Object(ue.jsx)(Et,{error:Object(f.g)(en.amount,B),id:"error-".concat(en.amount)}),Object(ue.jsx)("div",{className:"form__input-description",children:H?"If the proposal passes, this total amount will be distributed pro rata to all members' internal accounts, based on the current number of membership tokens held by each member.":"If the proposal passes, this amount will be distributed to the member's internal account."})]}),Object(ue.jsxs)("div",{className:"form__input-addon",children:["available: ",Object(ue.jsx)("span",{children:L?Number.isInteger(Number(L))?L:Object(f.d)(Number(L)):"---"})]})]}),Object(ue.jsxs)("div",{className:"form__textarea-row",children:[Object(ue.jsx)("label",{className:"form__input-row-label",children:"Notes"}),Object(ue.jsx)("div",{className:"form__input-row-fieldwrap",children:Object(ue.jsx)("textarea",{name:en.notes,placeholder:"Transactions purpose...",ref:V,disabled:$})})]}),Object(ue.jsx)("button",{className:"button",disabled:$,onClick:Object(We.a)(Ve.a.mark((function e(){return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!$){e.next=2;break}return e.abrupt("return");case 2:return e.next=4,W();case 4:if(e.sent){e.next=6;break}return e.abrupt("return");case 6:re(G());case 7:case"end":return e.stop()}}),e)}))),type:"submit",children:Q?Object(ue.jsx)(At.a,{}):X?"Done":"Submit"}),$&&Object(ue.jsx)("div",{className:"form__submit-status-container",children:function(){if(x===vt.f.AWAITING_CONFIRM||E===vt.f.AWAITING_CONFIRM)return"Awaiting your confirmation\u2026";switch(x){case vt.f.PENDING:return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)(Tt.a,{intervalMs:2e3,messages:_t.b,useFirstItemStart:!0,render:function(e){return Object(ue.jsx)(Ge.a,{children:e},e)}}),Object(ue.jsx)(Rt.a,{url:p,isPending:!0})]});case vt.f.FULFILLED:return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{children:"Proposal submitted!"}),Object(ue.jsx)(Rt.a,{url:p})]});default:return null}}()}),z&&Object(ue.jsx)("div",{className:"form__submit-error-container",children:Object(ue.jsx)(Nt.a,{renderText:"Something went wrong while submitting the proposal.",error:z})})]})}):Object(ue.jsx)(an,{children:Object(ue.jsx)("div",{className:"form__description--unauthorized",children:Object(ue.jsx)("p",{children:q?s?s.message:a?void 0:"Either you are not a member, or your membership is not active.":"Connect your wallet to submit a transfer proposal."})})})}function an(e){return Object(ue.jsx)(Mt,{className:"section-wrapper",children:Object(ue.jsxs)(Ge.a,{children:[Object(ue.jsx)("div",{className:"titlebar",children:Object(ue.jsx)("h2",{className:"titlebar__title",children:"Transfer Proposal"})}),Object(ue.jsxs)("div",{className:"form-wrapper",children:[Object(ue.jsx)("div",{className:"form__description",children:Object(ue.jsx)("p",{children:"Nulla aliquet porttitor venenatis. Donec a dui et dui fringilla consectetur id nec massa. Aliquam erat volutpat. Sed ut dui ut lacus dictum fermentum vel tincidunt neque. Sed sed lacinia..."})}),e.children]})]})})}function cn(){var e=Object(c.c)((function(e){var t;return null===(t=e.contracts)||void 0===t?void 0:t.ERC20ExtensionContract})),t=Object(Ne.d)().defaultChainError,r=Object(Ne.f)(),a=r.connected,s=r.account,o=r.web3Instance,i=Object(Yt.i)(),u=i.proposalData,d=i.proposalSignAndSendError,l=i.proposalSignAndSendStatus,j=i.signAndSendProposal,O=Object(mt.a)({mode:"onBlur",reValidateMode:"onChange"}),p=Object(se.f)(),h=Object(oe.useState)(),m=Object(xe.a)(h,2),v=m[0],x=m[1],N=Object(oe.useState)(),g=Object(xe.a)(N,2),E=g[0],A=g[1],w=Object(oe.useState)(),I=Object(xe.a)(w,2),y=I[0],C=I[1],D=Object(oe.useState)(),S=Object(xe.a)(D,2),_=S[0],k=S[1],T=O.errors,R=O.getValues,P=O.setValue,F=O.register,L=O.trigger,M=O.watch,B=M(tn.erc20Address),G=M(tn.applicantAddress),U=v||d,V=a&&s,W=l===vt.f.AWAITING_CONFIRM||l===vt.f.PENDING,Y=l===vt.f.FULFILLED,H=W||Y,K=Object(Yt.a)(G),z=K.checkApplicantError,q=K.checkApplicantInvalidMsg,J=K.checkApplicantStatus,Q=K.isApplicantValid,X=Object(oe.useCallback)((function(){return ee.apply(this,arguments)}),[B,o]),$=Object(oe.useCallback)((function(){return te.apply(this,arguments)}),[s,_]),Z=Object(oe.useCallback)((function(){return ne.apply(this,arguments)}),[s,_]);function ee(){return(ee=Object(We.a)(Ve.a.mark((function e(){var t,r,a,c;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(o&&B){e.next=3;break}return k(void 0),e.abrupt("return");case 3:return e.prev=3,e.next=6,Promise.resolve().then(n.t.bind(null,459,3));case 6:t=e.sent,r=t.default,a=r,c=new o.eth.Contract(a,B),k(c),e.next=17;break;case 13:e.prev=13,e.t0=e.catch(3),console.error(e.t0),k(void 0);case 17:case"end":return e.stop()}}),e,null,[[3,13]])})))).apply(this,arguments)}function te(){return(te=Object(We.a)(Ve.a.mark((function e(){var t,n;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(s&&_){e.next=3;break}return C(void 0),e.abrupt("return");case 3:return e.prev=3,e.next=6,_.methods.symbol().call();case 6:return t=e.sent,e.next=9,_.methods.decimals().call();case 9:n=e.sent,C({symbol:t,decimals:Number(n)}),e.next=17;break;case 13:e.prev=13,e.t0=e.catch(3),console.error(e.t0),C(void 0);case 17:case"end":return e.stop()}}),e,null,[[3,13]])})))).apply(this,arguments)}function ne(){return(ne=Object(We.a)(Ve.a.mark((function e(){var t,n,r,a,c,o,i;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(s&&_){e.next=3;break}return A(void 0),e.abrupt("return");case 3:return e.prev=3,e.next=6,_.methods.balanceOf(s).call();case 6:return t=e.sent,n=Object(Qt.toBN)(t),e.next=10,_.methods.decimals().call();case 10:r=e.sent,a=Object(Qt.toBN)(10).pow(Object(Qt.toBN)(r)),c=n.div(a),o=n.mod(a),i=o.eq(Object(Qt.toBN)(0))?c.toString():"".concat(c.toString(),".").concat(o.toString()),A(i),e.next=22;break;case 18:e.prev=18,e.t0=e.catch(3),console.error(e.t0),A(void 0);case 22:case"end":return e.stop()}}),e,null,[[3,18]])})))).apply(this,arguments)}function re(){return ae.apply(this,arguments)}function ae(){return(ae=Object(We.a)(Ve.a.mark((function t(){return Ve.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(e){t.next=4;break}return t.abrupt("return","UNITS");case 4:return t.prev=4,t.next=7,e.instance.methods.symbol().call();case 7:return t.abrupt("return",t.sent);case 10:return t.prev=10,t.t0=t.catch(4),console.log(t.t0),t.abrupt("return","UNITS");case 14:case"end":return t.stop()}}),t,null,[[4,10]])})))).apply(this,arguments)}function ce(e){return ie.apply(this,arguments)}function ie(){return(ie=Object(We.a)(Ve.a.mark((function e(t){var n,r,a,c,o,i,d,l,O,h,m,v,N,g,E,A,w;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,V){e.next=3;break}throw new Error("No user account was found. Please make sure your wallet is connected.");case 3:if(s){e.next=5;break}throw new Error("No account found.");case 5:if(_){e.next=7;break}throw new Error("No ERC20Contract found.");case 7:if(y){e.next=9;break}throw new Error("No ERC20 details found.");case 9:if(z&&console.warn("Error checking if the applicant address is valid: ".concat(z.message)),J!==ge.a.FULFILLED||Q||!q){e.next=12;break}throw new Error(q);case 12:if(n=t.applicantAddress,r=t.erc20Address,a=t.tributeAmount,c=t.requestAmount,o=t.description,i=Object(Qt.toBN)(10).pow(Object(Qt.toBN)(y.decimals)),d=Object(Qt.toBN)(Object(f.k)(a)).mul(i),l=Object(f.k)(c),O=Object(Qt.toChecksumAddress)(n),h=Object(Qt.toChecksumAddress)(s),m=(null===u||void 0===u?void 0:u.uniqueId)||""){e.next=35;break}return v=Object(f.i)(n)===Object(f.i)(s)?"Tribute from ".concat(Object(f.l)(O,7),"."):"Tribute from ".concat(Object(f.l)(h,7)," for applicant ").concat(Object(f.l)(O,7),"."),N=o?"".concat(v,"\n").concat(o):v,e.t0=c,e.next=25,re();case 25:return e.t1=e.sent,e.t2=a,e.t3=y.symbol,g={requestAmount:e.t0,requestAmountUnit:e.t1,tributeAmount:e.t2,tributeAmountUnit:e.t3},E=[O,b.H,l,Object(Qt.toChecksumAddress)(r),d.toString(),h],e.next=32,j({partialProposalData:{name:O,body:N,metadata:{proposalAmountValues:g,submitActionArgs:E,accountAuthorizedToProcessPassedProposal:h}},adapterName:vt.a.tribute,type:Vt.SnapshotType.draft});case 32:A=e.sent,w=A.uniqueId,m=w;case 35:p.push("/tributes/".concat(m)),e.next=41;break;case 38:e.prev=38,e.t4=e.catch(0),x(e.t4);case 41:case"end":return e.stop()}}),e,null,[[0,38]])})))).apply(this,arguments)}return Object(oe.useEffect)((function(){X()}),[X]),Object(oe.useEffect)((function(){$()}),[$]),Object(oe.useEffect)((function(){Z()}),[Z]),Object(oe.useEffect)((function(){P(tn.applicantAddress,s)}),[s,P]),!V||t?Object(ue.jsx)(sn,{children:Object(ue.jsx)("div",{className:"form__description--unauthorized",children:Object(ue.jsx)("p",{children:V?t?t.message:void 0:"Connect your wallet to submit a tribute proposal."})})}):Object(ue.jsx)(sn,{children:Object(ue.jsxs)("form",{className:"form",onSubmit:function(e){return e.preventDefault()},children:[Object(ue.jsxs)("div",{className:"form__input-row",children:[Object(ue.jsx)("label",{className:"form__input-row-label",children:"Applicant Address"}),Object(ue.jsxs)("div",{className:"form__input-row-fieldwrap",children:[Object(ue.jsx)("input",{"aria-describedby":"error-".concat(tn.applicantAddress),"aria-invalid":T.applicantAddress?"true":"false",name:tn.applicantAddress,ref:F({validate:function(e){return e?!!Object(Xt.a)(e)||ft.a.INVALID_ETHEREUM_ADDRESS:ft.a.REQUIRED}}),type:"text",disabled:H}),Object(ue.jsx)(Et,{error:Object(f.g)(tn.applicantAddress,T),id:"error-".concat(tn.applicantAddress)})]})]}),Object(ue.jsxs)("div",{className:"form__input-row",children:[Object(ue.jsx)("label",{className:"form__input-row-label",children:"ERC20 Address"}),Object(ue.jsxs)("div",{className:"form__input-row-fieldwrap",children:[Object(ue.jsx)("input",{"aria-describedby":"error-".concat(tn.erc20Address),"aria-invalid":T.erc20Address?"true":"false",name:tn.erc20Address,ref:F({validate:function(e){return e?!!Object(Xt.a)(e)||ft.a.INVALID_ETHEREUM_ADDRESS:ft.a.REQUIRED}}),type:"text",disabled:H}),Object(ue.jsx)(Et,{error:Object(f.g)(tn.erc20Address,T),id:"error-".concat(tn.erc20Address)})]})]}),Object(ue.jsxs)("div",{className:"form__input-row",children:[Object(ue.jsx)("label",{className:"form__input-row-label",children:"Amount"}),Object(ue.jsxs)("div",{className:"form__input-row-fieldwrap--narrow",children:[Object(ue.jsxs)("div",{className:"input__suffix-wrap",children:[Object(ue.jsx)("input",{className:"input__suffix","aria-describedby":"error-".concat(tn.tributeAmount),"aria-invalid":T.tributeAmount?"true":"false",name:tn.tributeAmount,onChange:function(){return P(tn.tributeAmount,Object(f.e)(R().tributeAmount))},ref:F({validate:function(e){var t=Number(Object(f.k)(e));return""===e?ft.a.REQUIRED:isNaN(t)?ft.a.INVALID_NUMBER:t<=0?"The value must be greater than 0.":t>Number(E)?"Insufficient funds.":!!Number.isInteger(t)||"The value must be an integer for an ERC20 token."}}),type:"text",disabled:H}),Object(ue.jsx)("div",{className:"input__suffix-item",children:(null===y||void 0===y?void 0:y.symbol)||"___"})]}),Object(ue.jsx)(Et,{error:Object(f.g)(tn.tributeAmount,T),id:"error-".concat(tn.tributeAmount)}),Object(ue.jsx)("div",{className:"form__input-description",children:"This amount will be held in escrow pending a member vote. If the proposal passes, the funds will automatically be sent to the DAO. If the proposal fails, the funds will be refunded to you."})]}),Object(ue.jsxs)("div",{className:"form__input-addon",children:["available: ",Object(ue.jsx)("span",{children:E?Number.isInteger(Number(E))?E:Object(f.d)(Number(E)):"---"})]})]}),Object(ue.jsxs)("div",{className:"form__input-row",children:[Object(ue.jsx)("label",{className:"form__input-row-label",children:"Request Amount"}),Object(ue.jsxs)("div",{className:"form__input-row-fieldwrap--narrow",children:[Object(ue.jsx)("input",{"aria-describedby":"error-".concat(tn.requestAmount),"aria-invalid":T.requestAmount?"true":"false",name:tn.requestAmount,onChange:function(){return P(tn.requestAmount,Object(f.e)(R().requestAmount))},ref:F({validate:function(e){var t=Number(Object(f.k)(e));return""===e?ft.a.REQUIRED:isNaN(t)?ft.a.INVALID_NUMBER:!(t<0)||"The value must be at least 0."}}),type:"text",disabled:H}),Object(ue.jsx)(Et,{error:Object(f.g)(tn.requestAmount,T),id:"error-".concat(tn.requestAmount)}),Object(ue.jsx)("div",{className:"form__input-description",children:"This is the amount of DAO membership tokens you are requesting be sent to the Applicant Address in exchange for your tribute."})]})]}),Object(ue.jsxs)("div",{className:"form__textarea-row",children:[Object(ue.jsx)("label",{className:"form__input-row-label",children:"Description"}),Object(ue.jsx)("div",{className:"form__input-row-fieldwrap",children:Object(ue.jsx)("textarea",{name:tn.description,placeholder:"Say something about your tribute...",ref:F,disabled:H})})]}),Object(ue.jsx)("button",{className:"button",disabled:H,onClick:Object(We.a)(Ve.a.mark((function e(){return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!H){e.next=2;break}return e.abrupt("return");case 2:return e.next=4,L();case 4:if(e.sent){e.next=6;break}return e.abrupt("return");case 6:ce(R());case 7:case"end":return e.stop()}}),e)}))),type:"submit",children:W?Object(ue.jsx)(At.a,{}):Y?"Done":"Submit"}),H&&Object(ue.jsx)("div",{className:"form__submit-status-container",children:function(){switch(l){case vt.f.AWAITING_CONFIRM:return Object(ue.jsxs)(ue.Fragment,{children:["Awaiting your confirmation",Object(ue.jsx)(kt.a,{intervalMs:500})]});case vt.f.PENDING:return Object(ue.jsxs)(ue.Fragment,{children:["Submitting",Object(ue.jsx)(kt.a,{intervalMs:500})]});case vt.f.FULFILLED:return"Done!";default:return""}}()}),U&&Object(ue.jsx)("div",{className:"form__submit-error-container",children:Object(ue.jsx)(Nt.a,{renderText:"Something went wrong while submitting the proposal.",error:U})})]})})}function sn(e){return Object(ue.jsx)(Mt,{className:"section-wrapper",children:Object(ue.jsxs)(Ge.a,{children:[Object(ue.jsx)("div",{className:"titlebar",children:Object(ue.jsx)("h2",{className:"titlebar__title",children:"Tribute Proposal"})}),Object(ue.jsxs)("div",{className:"form-wrapper",children:[Object(ue.jsx)("div",{className:"form__description",children:Object(ue.jsx)("p",{children:"Nulla aliquet porttitor venenatis. Donec a dui et dui fringilla consectetur id nec massa. Aliquam erat volutpat. Sed ut dui ut lacus dictum fermentum vel tincidunt neque. Sed sed lacinia..."})}),e.children]})]})})}!function(e){e.type="type",e.selectedToken="selectedToken",e.memberAddress="memberAddress",e.amount="amount",e.notes="notes"}(en||(en={})),function(e){e.applicantAddress="applicantAddress",e.erc20Address="erc20Address",e.tributeAmount="tributeAmount",e.requestAmount="requestAmount",e.description="description"}(tn||(tn={}));var on=n(460),un=n.n(on),dn=(n(918),Object(oe.memo)((function(){return Object(ue.jsxs)("div",{className:"cube","data-testid":"cube","data-aos":"fade-up","data-aos-delay":"150",children:[Object(ue.jsx)("div",{className:"cube__segment--top"}),Object(ue.jsx)("div",{className:"cube__segment--left"}),Object(ue.jsx)("div",{className:"cube__segment--right"})]})})));function ln(){return Object(ue.jsxs)("div",{"data-testid":"get-started-header",className:"landing__header",children:[Object(ue.jsx)(me,{}),Object(ue.jsx)(Ze,{})]})}function bn(){var e=Object(se.f)();return Object(oe.useEffect)((function(){un.a.init({duration:800,offset:40,delay:120,mirror:!1,once:!0})}),[]),Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)(ln,{}),Object(ue.jsx)(Mt,{className:"section-wrapper",children:Object(ue.jsxs)(Ge.a,{children:[Object(ue.jsx)(Se,{}),Object(ue.jsxs)("div",{className:"landing",children:[Object(ue.jsx)("div",{className:"landing__subtitle",children:"A next generation DAO framework"}),Object(ue.jsx)("div",{className:"landing__img",children:Object(ue.jsx)(dn,{})}),Object(ue.jsx)("div",{className:"landing__button",children:Object(ue.jsx)("button",{className:"button",onClick:function(){e.push("/join")},children:"Join"})})]})]})})]})}var jn=n(136);function fn(e){var t,n=e.proposal,r=n.snapshotProposal,a=1e3*Number((null===r||void 0===r?void 0:r.msg.payload.start)||0),c=1e3*Number((null===r||void 0===r?void 0:r.msg.payload.end)||0),s=Object(oe.useState)({hasVotingStarted:!1,hasVotingEnded:!1,votingStartEndInitReady:!1}),o=Object(xe.a)(s,2),i=o[0],u=o[1],d=Object(Yt.c)(r).offchainVotingResults,l=Object(oe.useCallback)((function(e){u(e)}),[]),b=null===(t=d[0])||void 0===t?void 0:t[1],j=i.hasVotingEnded,f=i.hasVotingStarted,O=i.votingStartEndInitReady;return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)(jn.c,{countdownVotingEndMs:c,countdownVotingStartMs:a,onVotingPeriodChange:l,votingResult:b}),O&&f&&!j&&Object(ue.jsx)(jn.b,{proposal:n})]})}var On=n(77);function pn(){return Object(ue.jsx)(Mt,{className:"section-wrapper",children:Object(ue.jsx)(Ge.a,{children:Object(ue.jsx)("div",{style:{textAlign:"center",fontSize:"5rem"},children:Object(ue.jsxs)("h3",{children:["4",Object(ue.jsx)("span",{className:"pulse",role:"img","aria-label":"404, not found",style:{display:"inline-block"},children:"\ud83d\ude35"}),"4"]})})})})}function hn(e){var t=e.proposal,n=e.renderAmountBadge,r=e.renderActions,a=t.getCommonSnapshotProposalData();return a?Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{className:"proposaldetails__header",children:"Proposal Details"}),Object(ue.jsxs)("div",{className:"proposaldetails",children:[Object(ue.jsxs)("div",{className:"proposaldetails__content",children:[Object(ue.jsx)("h3",{children:Object(f.l)(a.msg.payload.name||"",7)}),Object(ue.jsx)(Ht.a,{children:a.msg.payload.body})]}),Object(ue.jsxs)("div",{className:"proposaldetails__status",children:[n&&n(),r()]})]})]}):null}function mn(){var e=Object(se.h)().proposalId,t=Object(Yt.d)(e,Vt.SnapshotType.proposal),n=t.proposalData,r=t.proposalError,a=t.proposalNotFound,c=t.proposalStatus,s=Object(Ne.d)().defaultChainError,o=r||s;return c===ge.a.PENDING&&!o?Object(ue.jsx)(vn,{children:Object(ue.jsx)("div",{className:"loader--large-container",children:Object(ue.jsx)(On.a,{})})}):a?Object(ue.jsx)(vn,{children:Object(ue.jsx)(pn,{})}):o?Object(ue.jsx)(vn,{children:Object(ue.jsx)("div",{className:"text-center",children:Object(ue.jsx)(Nt.a,{error:o,renderText:"Something went wrong while getting the proposal."})})}):n?Object(ue.jsx)(vn,{children:Object(ue.jsx)(hn,{proposal:n,renderActions:function(){return Object(ue.jsx)(fn,{proposal:n})}})}):Object(ue.jsx)(ue.Fragment,{})}function vn(e){var t=Object(se.f)();return Object(ue.jsx)(Mt,{className:"section-wrapper",children:Object(ue.jsxs)(Ge.a,{children:[Object(ue.jsxs)("div",{className:"titlebar",children:[Object(ue.jsx)("h2",{className:"titlebar__title",children:"Governance"}),Object(ue.jsx)("button",{className:"titlebar__action",onClick:function(e){e.preventDefault(),t.push("/governance")},children:"View all"})]}),e.children]})})}var xn=n(461),Nn=n(462),gn="View Proposal",En=n.n(Nn)()()(xn.a);function An(e){var t=e.buttonText,n=void 0===t?gn:t,r=e.proposalOnClickId,a=e.linkPath,c=e.onClick,o=e.name,i=e.renderStatus,u=Object(se.f)().location,d="/"===u.pathname?"":u.pathname,l="function"===typeof a?a(r):a||"".concat(d,"/").concat(r);return Object(ue.jsx)(s.b,{className:"proposalcard__link",to:l,onClick:function(){null===c||void 0===c||c(r)},children:Object(ue.jsxs)("div",{className:"proposalcard",children:[Object(ue.jsx)("h3",{className:"proposalcard__title",children:function(e){return Object(Xt.a)(e)?Object(f.l)(e,7):Object(ue.jsx)(En,{text:e,maxLine:1,ellipsis:"...",trimRight:!0,basedOn:"letters"})}(o)}),i&&i(),Object(ue.jsx)("button",{className:"proposalcard__button",children:n||gn})]})})}function wn(e){var t=e.actionId,n=void 0===t?xt.a:t,r=e.onProposalClick,a=void 0===r?function(){}:r,c=e.proposalLinkPath,s=e.renderProposalCard,o=Object(oe.useState)([]),i=Object(xe.a)(o,2),u=i[0],d=i[1],l=Object(oe.useState)({failedProposals:[],passedProposals:[],votingProposals:[]}),j=Object(xe.a)(l,2),O=j[0],p=j[1],h=function(e){var t=e.actionId,n=void 0===t?xt.a:t,r=Object(oe.useState)([]),a=Object(xe.a)(r,2),c=a[0],s=a[1],o=Object(oe.useState)(),i=Object(xe.a)(o,2),u=i[0],d=i[1],l=Object(oe.useState)(ge.a.STANDBY),j=Object(xe.a)(l,2),f=j[0],O=j[1],p=Object(pt.f)().isMountedRef,h=Object(oe.useCallback)((function(){return N.apply(this,arguments)}),[n,p]);function m(e){return x.apply(this,arguments)}function x(){return(x=Object(We.a)(Ve.a.mark((function e(t){var n,r,a;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,n="".concat(b.C,"/api/").concat(b.D),e.next=4,fetch("".concat(n,"/proposals/").concat(t,"?includeVotes=true"));case 4:if((r=e.sent).ok){e.next=7;break}throw new Error("Something went wrong while fetching the Snapshot proposals.");case 7:return e.next=9,r.json();case 9:return a=e.sent,e.abrupt("return",Object.entries(a).map((function(e){var t=Object(xe.a)(e,2),n=t[0],r=t[1];return{daoProposal:void 0,snapshotDraft:void 0,snapshotProposal:Object(v.a)(Object(v.a)({},r),{},{idInSnapshot:n,idInDAO:""}),getCommonSnapshotProposalData:function(){},refetchProposalOrDraft:function(){},snapshotType:Vt.SnapshotType.proposal}})));case 13:throw e.prev=13,e.t0=e.catch(0),e.t0;case 16:case"end":return e.stop()}}),e,null,[[0,13]])})))).apply(this,arguments)}function N(){return(N=Object(We.a)(Ve.a.mark((function e(){var t;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,O(ge.a.PENDING),e.next=4,m(n);case 4:if(t=e.sent,p.current){e.next=7;break}return e.abrupt("return");case 7:O(ge.a.FULFILLED),s(t),e.next=18;break;case 11:if(e.prev=11,e.t0=e.catch(0),p.current){e.next=15;break}return e.abrupt("return");case 15:O(ge.a.REJECTED),s([]),d(e.t0);case 18:case"end":return e.stop()}}),e,null,[[0,11]])})))).apply(this,arguments)}return Object(oe.useEffect)((function(){h()}),[h]),{governanceProposals:c,governanceProposalsError:u,governanceProposalsStatus:f}}({actionId:n}),m=h.governanceProposals,x=h.governanceProposalsError,N=h.governanceProposalsStatus,g=Object(Yt.c)(u),E=g.offchainVotingResults,A=g.offchainVotingResultsError,w=g.offchainVotingResultsStatus,I=Object(Ne.d)().defaultChainError,y=O.failedProposals,C=O.passedProposals,D=O.votingProposals,S=N===ge.a.STANDBY||N===ge.a.PENDING||w===ge.a.STANDBY&&u.length>0||w===ge.a.PENDING,_=x||A||I;function k(e){return e.map((function(e){var t,n=e.snapshotProposal,r=null===n||void 0===n?void 0:n.idInSnapshot,o=(null===n||void 0===n?void 0:n.msg.payload.name)||"",i=1e3*Number((null===n||void 0===n?void 0:n.msg.payload.start)||0),u=1e3*Number((null===n||void 0===n?void 0:n.msg.payload.end)||0);if(!r)return null;var d=null===(t=E.find((function(e){var t=Object(xe.a)(e,2),n=t[0];t[1];return Object(f.i)(n)===Object(f.i)(r)})))||void 0===t?void 0:t[1];return s?Object(ue.jsx)(oe.Fragment,{children:s({proposalData:e,votingResult:d})},r):Object(ue.jsx)(An,{name:o,linkPath:c,onClick:a,proposalOnClickId:r,renderStatus:function(){return Object(ue.jsx)(jn.c,{votingResult:d,countdownVotingEndMs:u,countdownVotingStartMs:i})}},r)}))}return Object(oe.useEffect)((function(){d(m.map((function(e){return e.snapshotProposal})))}),[m]),Object(oe.useEffect)((function(){if(N===ge.a.FULFILLED){var e={failedProposals:[],passedProposals:[],votingProposals:[]};m.forEach((function(t){var n,r;if(((null===(n=t.snapshotProposal)||void 0===n?void 0:n.msg.payload.end)||0)a.No.units;c?e.passedProposals.push(t):c||e.failedProposals.push(t)}else e.votingProposals.push(t)})),p((function(t){return Object(v.a)(Object(v.a)({},t),e)}))}}),[m,N,E]),S&&!_?Object(ue.jsx)("div",{className:"loader--large-container",children:Object(ue.jsx)(On.a,{})}):m.length||Object.values(O).flatMap((function(e){return e})).length||N!==ge.a.FULFILLED?_?Object(ue.jsx)("div",{className:"text-center",children:Object(ue.jsx)(Nt.a,{error:_,renderText:"Something went wrong while getting the proposals."})}):Object(ue.jsxs)("div",{className:"grid--fluid grid-container",children:[D.length>0&&Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{className:"grid__header",children:ft.d.VOTING}),Object(ue.jsx)("div",{className:"grid__cards",children:k(D)})]}),C.length>0&&Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{className:"grid__header",children:ft.d.PASSED}),Object(ue.jsx)("div",{className:"grid__cards",children:k(C)})]}),y.length>0&&Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{className:"grid__header",children:ft.d.FAILED}),Object(ue.jsx)("div",{className:"grid__cards",children:k(y)})]})]}):Object(ue.jsx)("p",{className:"text-center",children:"No proposals, yet!"})}function In(){return Object(ue.jsx)(yn,{children:Object(ue.jsx)(wn,{actionId:xt.a,proposalLinkPath:function(e){return"/governance/".concat(e)}})})}function yn(e){var t=Object(se.f)();return Object(ue.jsx)(Mt,{className:"section-wrapper",children:Object(ue.jsxs)(Ge.a,{children:[Object(ue.jsxs)("div",{className:"titlebar",children:[Object(ue.jsx)("h2",{className:"titlebar__title",children:"Governance"}),Object(ue.jsx)("button",{className:"titlebar__action",onClick:function(e){e.preventDefault(),t.push("/governance-proposal")},children:"New Proposal"})]}),e.children]})})}var Cn=["createdAt","didFullyRagequit"];function Dn(){var e=Object(c.c)((function(e){return e.contracts.DaoRegistryContract})),t=Object(c.c)((function(e){return e.contracts.BankExtensionContract})),n=Object(c.c)((function(e){return e.subgraphNetworkStatus.status})),a=Object(Ne.f)().web3Instance,s=Object(He.a)(O.c,{variables:{daoAddress:null===e||void 0===e?void 0:e.contractAddress.toLowerCase()}}),o=Object(xe.a)(s,2),i=o[0],u=o[1],d=u.called,l=u.loading,j=u.data,p=u.error,h=Object(oe.useState)([]),m=Object(xe.a)(h,2),N=m[0],g=m[1],E=Object(oe.useState)(ge.a.STANDBY),A=Object(xe.a)(E,2),w=A[0],I=A[1],y=Object(oe.useState)(),C=Object(xe.a)(y,2),D=C[0],S=C[1],_=Object(oe.useCallback)((function(){return T.apply(this,arguments)}),[t,e,a]),k=Object(oe.useCallback)((function(){try{if(I(ge.a.PENDING),!l&&j){var e=j.tributeDaos[0].members.filter((function(e){return!e.didFullyRagequit})).map((function(e){e.createdAt,e.didFullyRagequit;var t=Object(x.a)(e,Cn);return Object(v.a)(Object(v.a)({},t),{},{address:Object(Qt.toChecksumAddress)(e.address),delegateKey:Object(Qt.toChecksumAddress)(e.delegateKey)})}));I(ge.a.FULFILLED),g(e)}else if(p)throw new Error(p.message)}catch(p){console.log("subgraph query error: ".concat(p.message)),_()}}),[j,p,_,l]);function T(){return(T=Object(We.a)(Ve.a.mark((function n(){var c,s,o,i,u,d,l,j,O,p,h,m,v,x,N,E,A;return Ve.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(e&&t&&a){n.next=2;break}return n.abrupt("return");case 2:return n.prev=2,I(ge.a.PENDING),c=e.abi,s=e.contractAddress,o=e.instance.methods,n.next=7,o.getNbMembers().call();case 7:if(i=n.sent,!(Number(i)>0)){n.next=28;break}return u=c.find((function(e){return"getMemberAddress"===e.name})),d=Object(r.a)(Array(Number(i)).keys()).map((function(e){return[s,u,[e.toString()]]})),n.next=13,Object(dt.j)({calls:d,web3Instance:a});case 13:return l=n.sent,j=c.find((function(e){return"memberAddressesByDelegatedKey"===e.name})),O=l.map((function(e){return[s,j,[e]]})),n.next=18,Object(dt.j)({calls:O,web3Instance:a});case 18:return p=n.sent,h=t.abi,m=t.contractAddress,v=h.find((function(e){return"balanceOf"===e.name})),x=p.map((function(e){return[m,v,[e,b.H]]})),n.next=24,Object(dt.j)({calls:x,web3Instance:a});case 24:N=n.sent,E=l.map((function(e,t){return{address:e,delegateKey:p[t],isDelegated:Object(f.i)(e)!==Object(f.i)(p[t]),units:N[t]}})),A=E.filter((function(e){return Object(Qt.toBN)(e.units).gt(Object(Qt.toBN)(0))})).reverse(),g(A);case 28:I(ge.a.FULFILLED),n.next=36;break;case 31:n.prev=31,n.t0=n.catch(2),I(ge.a.REJECTED),g([]),S(n.t0);case 36:case"end":return n.stop()}}),n,null,[[2,31]])})))).apply(this,arguments)}return Object(oe.useEffect)((function(){d||i()}),[d,i]),Object(oe.useEffect)((function(){n===ee.a.OK?!l&&(null===e||void 0===e?void 0:e.contractAddress)&&k():_()}),[null===e||void 0===e?void 0:e.contractAddress,_,k,l,n]),{members:N,membersError:D,membersStatus:w}}var Sn,_n,kn,Tn=n(201);function Rn(e){return Object(ue.jsx)("svg",Object(v.a)(Object(v.a)({"aria-hidden":"true",focusable:"false","data-icon":"copy",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512"},e),{},{children:Object(ue.jsx)("path",{fill:"currentColor",d:"M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"})}))}function Pn(e){return Object(ue.jsx)("svg",Object(v.a)(Object(v.a)({"aria-hidden":"true",focusable:"false","data-icon":"wallet",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512"},e),{},{children:Object(ue.jsx)("path",{fill:"currentColor",d:"M461.2 128H80c-8.84 0-16-7.16-16-16s7.16-16 16-16h384c8.84 0 16-7.16 16-16 0-26.51-21.49-48-48-48H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h397.2c28.02 0 50.8-21.53 50.8-48V176c0-26.47-22.78-48-50.8-48zM416 336c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z"})}))}function Fn(e){var t=e.daoTokenDetails;function n(){return(n=Object(We.a)(Ve.a.mark((function e(){return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,e.next=5,window.ethereum.request({method:"wallet_watchAsset",params:{type:"ERC20",options:t}});case 5:e.next=10;break;case 7:e.prev=7,e.t0=e.catch(2),console.log(e.t0);case 10:case"end":return e.stop()}}),e,null,[[2,7]])})))).apply(this,arguments)}return t?Object(ue.jsxs)("div",{children:["Token: ",Object(ue.jsx)("span",{children:Object(Tn.a)(t.address,7)}),Object(ue.jsx)("div",{className:"daotoken__tooltip",children:Object(ue.jsxs)("button",{className:"daotoken__button",onClick:function(){if(t){var e=document.createElement("input");document.body.appendChild(e),e.setAttribute("value",t.address),e.select(),document.execCommand("copy"),document.body.removeChild(e),document.getElementById("copyTooltip").innerHTML="copied!"}},onMouseLeave:function(){document.getElementById("copyTooltip").innerHTML="copy address"},children:[Object(ue.jsx)("span",{className:"daotoken__tooltiptext",id:"copyTooltip",children:"copy address"}),Object(ue.jsx)(Rn,{})]})}),Object(ue.jsx)("div",{className:"daotoken__tooltip",children:Object(ue.jsxs)("button",{className:"daotoken__button",onClick:function(){return n.apply(this,arguments)},children:[Object(ue.jsx)("span",{className:"daotoken__tooltiptext",children:"add to wallet"}),Object(ue.jsx)(Pn,{})]})})]}):Object(ue.jsx)(ue.Fragment,{})}function Ln(e){return Object(ue.jsx)("svg",Object(v.a)(Object(v.a)({"aria-hidden":"true",focusable:"false","data-icon":"user",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512"},e),{},{children:Object(ue.jsx)("path",{fill:"currentColor",d:"M313.6 304c-28.7 0-42.5 16-89.6 16-47.1 0-60.8-16-89.6-16C60.2 304 0 364.2 0 438.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-25.6c0-74.2-60.2-134.4-134.4-134.4zM400 464H48v-25.6c0-47.6 38.8-86.4 86.4-86.4 14.6 0 38.3 16 89.6 16 51.7 0 74.9-16 89.6-16 47.6 0 86.4 38.8 86.4 86.4V464zM224 288c79.5 0 144-64.5 144-144S303.5 0 224 0 80 64.5 80 144s64.5 144 144 144zm0-240c52.9 0 96 43.1 96 96s-43.1 96-96 96-96-43.1-96-96 43.1-96 96-96z"})}))}function Mn(e){var t=e.isOpen,n=e.closeHandler,r=e.currentStep,a=Object(c.c)((function(e){return e.contracts.DaoRegistryContract})),s=Object(c.c)((function(e){return e.contracts.DaoRegistryAdapterContract})),o=Object(c.c)((function(e){return e.connectedMember})),i=Object(Ne.f)(),u=i.account,d=i.web3Instance,l=Object(Ne.b)().fast,b=Object(Ne.a)(),O=b.txError,p=b.txEtherscanURL,h=b.txIsPromptOpen,m=b.txSend,x=b.txStatus,N=Object(mt.a)({mode:"onBlur",reValidateMode:"onChange"}),g=Object(c.b)(),E=Object(oe.useState)(),A=Object(xe.a)(E,2),w=A[0],I=A[1],y=N.errors,C=N.getValues,D=N.register,S=N.trigger,_=N.watch,k=x===vt.f.AWAITING_CONFIRM||x===vt.f.PENDING,T=x===vt.f.FULFILLED,R=k||T||h,P=w||O,F=_(kn.delegateAddress),L=_(kn.confirmDelegation),M=!F||!L,B={setDelegation:function(){return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{className:"modal__title",children:"Delegate"}),Object(ue.jsx)("p",{children:"Transfer your voting rights"}),Object(ue.jsx)("div",{className:"delegation-modal__arrow-down",children:"\u2193"}),Object(ue.jsxs)("form",{className:"form",onSubmit:function(e){return e.preventDefault()},children:[Object(ue.jsx)("div",{className:"form__input-row",children:Object(ue.jsxs)("div",{className:"form__input-row-fieldwrap",children:[Object(ue.jsx)("input",{"aria-describedby":"error-".concat(kn.delegateAddress),"aria-invalid":y.delegateAddress?"true":"false",name:kn.delegateAddress,ref:D({validate:function(e){return e?!(!Object(Xt.a)(e)||e===xt.a)||ft.a.INVALID_ETHEREUM_ADDRESS:ft.a.REQUIRED}}),type:"text",disabled:R,placeholder:"Enter delegate address"}),Object(f.g)(kn.delegateAddress,y).includes("invalid")&&Object(ue.jsx)(Et,{error:Object(f.g)(kn.delegateAddress,y),id:"error-".concat(kn.delegateAddress)})]})}),Object(ue.jsx)("div",{className:"form__input-row",style:{marginTop:0},children:Object(ue.jsxs)("div",{className:"form__input-row-fieldwrap",children:[Object(ue.jsx)("input",{className:"checkbox-input","aria-describedby":"error-".concat(kn.confirmDelegation),"aria-invalid":y.confirmDelegation?"true":"false",id:kn.confirmDelegation,name:kn.confirmDelegation,ref:D({required:ft.a.REQUIRED}),type:"checkbox",disabled:R}),Object(ue.jsxs)("label",{className:"checkbox-label",htmlFor:kn.confirmDelegation,children:[Object(ue.jsx)("span",{className:"checkbox-box ".concat(Ct.SMALL)}),Object(ue.jsx)("span",{className:"checkbox-text",children:"Confirm delegation to the above address. You can revoke this at any time from your profile."})]})]})}),Object(ue.jsx)("button",{"aria-label":k?"Updating your delegate key...":"",className:"button",disabled:R||M,onClick:Object(We.a)(Ve.a.mark((function e(){return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!R){e.next=2;break}return e.abrupt("return");case 2:return e.next=4,S();case 4:if(e.sent){e.next=6;break}return e.abrupt("return");case 6:G(C());case 7:case"end":return e.stop()}}),e)}))),type:"submit",children:k?Object(ue.jsx)(At.a,{}):T?"Done":"Confirm"}),R&&Object(ue.jsx)("div",{className:"form__submit-status-container",children:Y()}),P&&Object(ue.jsx)("div",{className:"form__submit-error-container",children:Object(ue.jsx)(Nt.a,{renderText:"Something went wrong with your delegation.",error:P})})]})]})},revokeDelegation:function(){if(o)return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{className:"modal__title",children:"Revoke Delegation"}),Object(ue.jsx)("p",{children:Object(f.l)(o.delegateKey,7)}),Object(ue.jsx)("div",{className:"delegation-modal__arrow-down",children:"\u2193"}),Object(ue.jsxs)("p",{children:[Object(ue.jsx)(Ln,{}),"Back to you"]}),Object(ue.jsx)("div",{className:"delegation-modal__text",children:"You'll be able to resume voting from your account. You can delegate again at any time from your profile."}),Object(ue.jsx)("button",{"aria-label":k?"Updating your delegate key...":"",className:"button",disabled:R,onClick:V,children:k?Object(ue.jsx)(At.a,{}):T?"Done":"Confirm"}),R&&Object(ue.jsx)("div",{className:"form__submit-status-container",children:Y()}),P&&Object(ue.jsx)("div",{className:"form__submit-error-container",children:Object(ue.jsx)(Nt.a,{renderText:"Something went wrong with your revocation.",error:P})})]});return Object(ue.jsx)(ue.Fragment,{})}};function G(e){return U.apply(this,arguments)}function U(){return(U=Object(We.a)(Ve.a.mark((function e(t){var r,c,o,i;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,a){e.next=3;break}throw new Error("No DAO Registry contract was found.");case 3:if(s){e.next=5;break}throw new Error("No DAO Registry Adapter contract was found.");case 5:if(u){e.next=7;break}throw new Error("No account found.");case 7:if(d){e.next=9;break}throw new Error("No Web3 instance was found.");case 9:return r=t.delegateAddress,c=[a.contractAddress,Object(Qt.toChecksumAddress)(r)],o=Object(v.a)({from:u||""},l?{gasPrice:l}:null),e.next=14,m("updateDelegateKey",s.instance.methods,c,o);case 14:e.sent&&setTimeout(Object(We.a)(Ve.a.mark((function e(){return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,g(Object(j.A)({account:u,daoRegistryContract:a,web3Instance:d}));case 2:n();case 3:case"end":return e.stop()}}),e)}))),2e3),e.next=24;break;case 18:e.prev=18,e.t0=e.catch(0),console.log(e.t0),i=e.t0,(e.t0.message.includes("cannot overwrite existing delegated keys")||e.t0.message.includes("address already taken as delegated key"))&&(i=new Error("The provided address cannot be another member or already in use as a delegate.")),I(i);case 24:case"end":return e.stop()}}),e,null,[[0,18]])})))).apply(this,arguments)}function V(){return W.apply(this,arguments)}function W(){return(W=Object(We.a)(Ve.a.mark((function e(){var t,r;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,a){e.next=3;break}throw new Error("No DAO Registry contract was found.");case 3:if(s){e.next=5;break}throw new Error("No DAO Registry Adapter contract was found.");case 5:if(u){e.next=7;break}throw new Error("No account found.");case 7:if(d){e.next=9;break}throw new Error("No Web3 instance was found.");case 9:return t=[a.contractAddress,Object(Qt.toChecksumAddress)(u)],r=Object(v.a)({from:u||""},l?{gasPrice:l}:null),e.next=13,m("updateDelegateKey",s.instance.methods,t,r);case 13:e.sent&&setTimeout(Object(We.a)(Ve.a.mark((function e(){return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,g(Object(j.A)({account:u,daoRegistryContract:a,web3Instance:d}));case 2:n();case 3:case"end":return e.stop()}}),e)}))),2e3),e.next=21;break;case 17:e.prev=17,e.t0=e.catch(0),console.log(e.t0),I(e.t0);case 21:case"end":return e.stop()}}),e,null,[[0,17]])})))).apply(this,arguments)}function Y(){switch(x){case vt.f.AWAITING_CONFIRM:return"Awaiting your confirmation\u2026";case vt.f.PENDING:return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)(Tt.a,{intervalMs:2e3,messages:_t.b,useFirstItemStart:!0,render:function(e){return Object(ue.jsx)(Ge.a,{children:e},e)}}),Object(ue.jsx)(Rt.a,{url:p,isPending:!0})]});case vt.f.FULFILLED:return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{children:"Submitted!"}),Object(ue.jsx)(Rt.a,{url:p})]});default:return null}}return Object(ue.jsxs)(It.a,{keyProp:"delegation",isOpen:t,isOpenHandler:function(){},modalClassNames:"delegation-modal",children:[Object(ue.jsx)("span",{className:"modal__close-button",onClick:function(){n()},children:Object(ue.jsx)(Fe.a,{})}),B[r]()]})}function Bn(){var e=Object(c.c)((function(e){return e.connectedMember})),t=Object(oe.useState)(_n.SET_DELEGATION),n=Object(xe.a)(t,2),r=n[0],a=n[1],s=Object(oe.useState)(""),o=Object(xe.a)(s,2),i=o[0],u=o[1],d=Object(oe.useState)(!1),l=Object(xe.a)(d,2),b=l[0],j=l[1],O=Object(oe.useCallback)((function(){return p.apply(this,arguments)}),[e]);function p(){return(p=Object(We.a)(Ve.a.mark((function t(){var n,r;return Ve.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(t.prev=0,e){t.next=3;break}throw new Error("No connected account found.");case 3:n=e.isAddressDelegated?_n.REVOKE_DELEGATION:_n.SET_DELEGATION,a(n),r=e.isAddressDelegated?Sn.REVOKE_DELEGATION:Sn.DELEGATE_VOTES,u(r),t.next=12;break;case 9:t.prev=9,t.t0=t.catch(0),console.log(t.t0);case 12:case"end":return t.stop()}}),t,null,[[0,9]])})))).apply(this,arguments)}return Object(oe.useEffect)((function(){O()}),[O]),e?Object(ue.jsxs)(ue.Fragment,{children:[""!==i&&Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{className:"memberprofile__action-description",children:e.isAddressDelegated?Object(ue.jsxs)(ue.Fragment,{children:["Your voting rights have been delegated to"," ",Object(ue.jsx)("span",{className:"delegation__delegate-address-text",children:Object(f.l)(e.delegateKey,7)}),". You can revoke this at any time."]}):Object(ue.jsx)(ue.Fragment,{children:"You can delegate your voting rights to a different ETH address. The address cannot be another member or already in use as a delegate."})}),Object(ue.jsx)("button",{className:"memberprofile__action-button",onClick:function(){return j(!0)},children:i})]}),b&&Object(ue.jsx)(Mn,{isOpen:b,closeHandler:function(){j(!1)},currentStep:r})]}):Object(ue.jsx)(ue.Fragment,{})}function Gn(){var e=Dn(),t=e.members,n=e.membersError,r=e.membersStatus,a=Object(Ne.d)().defaultChainError,c=Object(Ne.f)().account,s=Ye(),o=s.daoTokenDetails,i=s.daoTokenDetailsStatus,u=Object(pt.e)(),d=u.totalUnits,l=u.totalUnitsStatus,b=Object(se.h)().ethereumAddress,j=Object(oe.useState)(),O=Object(xe.a)(j,2),p=O[0],h=O[1],m=Object(oe.useState)(!1),v=Object(xe.a)(m,2),x=v[0],N=v[1];Object(oe.useEffect)((function(){if(r===ge.a.FULFILLED){var e=t.find((function(e){return Object(f.i)(e.address)===Object(f.i)(b)}));h(e),e||N(!0)}}),[b,t,r]);var g=r===ge.a.STANDBY||r===ge.a.PENDING||i===ge.a.STANDBY||i===ge.a.PENDING||l===ge.a.STANDBY||l===ge.a.PENDING,E=r===ge.a.FULFILLED,A=n||a,w=!(!c||!p||Object(f.i)(c)!==Object(f.i)(p.address)),I=p&&"number"===typeof d?(Number(p.units)/d*100).toFixed(2):"";return g&&!A?Object(ue.jsx)(Un,{children:Object(ue.jsx)("div",{className:"loader--large-container",children:Object(ue.jsx)(On.a,{})})}):A?Object(ue.jsx)(Un,{children:Object(ue.jsx)("div",{className:"text-center",children:Object(ue.jsx)(Nt.a,{error:A,renderText:"Something went wrong while getting the member."})})}):x&&E?Object(ue.jsx)(Un,{children:Object(ue.jsx)("div",{className:"text-center error-message",children:Object(ue.jsx)("p",{children:"Member not found."})})}):Object(ue.jsx)(Un,{children:p?Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{className:"memberprofile__header",children:"Member Profile"}),Object(ue.jsxs)("div",{className:"proposaldetails",children:[Object(ue.jsxs)("div",{className:"memberprofile__left-column",children:[Object(ue.jsx)("h3",{children:Object(f.l)(p.address,7)}),function(){if(p)return Object(ue.jsxs)("div",{children:[Object(ue.jsx)("div",{className:"memberprofile__info-item",children:o?Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{children:"DAO Tokens"}),Object(ue.jsx)("div",{children:"".concat(Object(f.e)(p.units)," ").concat(o.symbol||"tokens")}),w&&Object(ue.jsx)("small",{children:Object(ue.jsx)(Fn,{daoTokenDetails:o})})]}):Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{children:"Membership Units"}),Object(ue.jsx)("div",{children:Object(f.e)(p.units)})]})}),Object(ue.jsxs)("div",{className:"memberprofile__info-item",children:[Object(ue.jsx)("div",{children:"Voting Weight"}),Object(ue.jsx)("div",{children:"".concat(I,"%")})]})]})}()]}),Object(ue.jsx)("div",{className:"memberprofile__right-column",children:w?Object(ue.jsx)("div",{children:Object(ue.jsxs)("div",{className:"memberprofile__action",children:[Object(ue.jsx)("div",{className:"memberprofile__action-header",children:"Delegation"}),Object(ue.jsx)(Bn,{})]})}):Object(ue.jsx)("div",{className:"memberprofile__actions-unavailable",children:"Connect your wallet with this member address to view available actions."})})]})]}):Object(ue.jsx)(ue.Fragment,{})})}function Un(e){var t=Object(se.f)();return Object(ue.jsx)(Mt,{className:"section-wrapper",children:Object(ue.jsxs)(Ge.a,{children:[Object(ue.jsxs)("div",{className:"titlebar",children:[Object(ue.jsx)("h2",{className:"titlebar__title",children:"Members"}),Object(ue.jsx)("button",{className:"titlebar__action",onClick:function(e){e.preventDefault(),t.push("/members")},children:"View all"})]}),e.children]})})}!function(e){e.DELEGATE_VOTES="Delegate Votes",e.REVOKE_DELEGATION="Revoke Delegation"}(Sn||(Sn={})),function(e){e.SET_DELEGATION="setDelegation",e.REVOKE_DELEGATION="revokeDelegation"}(_n||(_n={})),function(e){e.delegateAddress="delegateAddress",e.confirmDelegation="confirmDelegation"}(kn||(kn={}));function Vn(e){var t=e.member,n=e.to,r=void 0===n?"#":n,a=Object(Ne.f)().account;return Object(ue.jsx)(s.b,{className:"membercard__link",to:r,children:Object(ue.jsx)("div",{className:"membercard ".concat(a&&a.toLowerCase()===t.address.toLowerCase()?"membercard--connected-account":""),children:Object(ue.jsx)("h3",{className:"membercard__title",children:Object(f.l)(t.address,7)})})})}function Wn(){var e=Dn(),t=e.members,n=e.membersError,r=e.membersStatus,a=Object(Ne.d)().defaultChainError,c=r===ge.a.STANDBY||r===ge.a.PENDING,s=r===ge.a.FULFILLED,o=n||a;return c&&!o?Object(ue.jsx)(Yn,{children:Object(ue.jsx)("div",{className:"loader--large-container",children:Object(ue.jsx)(On.a,{})})}):o?Object(ue.jsx)(Yn,{children:Object(ue.jsx)("div",{className:"text-center",children:Object(ue.jsx)(Nt.a,{error:o,renderText:"Something went wrong while getting the members."})})}):!Object.values(t).length&&s?Object(ue.jsx)(Yn,{children:Object(ue.jsx)("p",{className:"text-center",children:"No members, yet!"})}):Object(ue.jsx)(Yn,{children:Object(ue.jsx)("div",{className:"grid--fluid grid-container",children:Object(ue.jsxs)("div",{children:[Object(ue.jsx)("div",{className:"grid__header",children:"Active Members"}),Object(ue.jsx)("div",{className:"grid__cards",children:function(e){return e.map((function(e){return Object(ue.jsx)(Vn,{to:"/members/".concat(e.address),member:e},e.address)}))}(t)})]})})})}function Yn(e){return Object(ue.jsx)(Mt,{className:"section-wrapper",children:Object(ue.jsxs)(Ge.a,{children:[Object(ue.jsx)("div",{className:"titlebar",children:Object(ue.jsx)("h2",{className:"titlebar__title",children:"Members"})}),e.children]})})}var Hn=n(51),Kn=n(42),zn=[vt.b.offchainVotingVotingPeriod,vt.b.offchainVotingGracePeriod];function qn(e){var t=e.adapterName,n=e.onProposalClick,r=void 0===n?function(){}:n,a=e.proposalLinkPath,c=e.renderProposalCard,s=e.includeProposalsExistingOnlyOffchain,o=void 0!==s&&s,i=Object(oe.useState)([]),u=Object(xe.a)(i,2),d=u[0],l=u[1],b=Object(oe.useState)({failedProposals:[],nonsponsoredProposals:[],passedProposals:[],votingProposals:[]}),j=Object(xe.a)(b,2),O=j[0],p=j[1],h=Object(pt.d)(zn),m=Object(xe.a)(h.daoConfigurations,2),x=m[0],N=m[1],g=Object(Yt.f)({adapterName:t,includeProposalsExistingOnlyOffchain:o}),E=g.proposals,A=g.proposalsError,w=g.proposalsStatus,I=Object(Yt.c)(d),y=I.offchainVotingResults,C=I.offchainVotingResultsError,D=I.offchainVotingResultsStatus,S=Object(Ne.d)().defaultChainError,_=O.failedProposals,k=O.nonsponsoredProposals,T=O.passedProposals,R=O.votingProposals,P=w===ge.a.STANDBY||w===ge.a.PENDING||D===ge.a.STANDBY&&d.length>0||D===ge.a.PENDING,F=A||C||S;function L(e){return e.map((function(e){var t,n=e.daoProposalVote,s=e.daoProposalVotingAdapter,o=e.snapshotDraft,i=e.snapshotProposal,u=(null===o||void 0===o?void 0:o.idInDAO)||(null===i||void 0===i?void 0:i.idInDAO),d=null===s||void 0===s?void 0:s.votingAdapterName,l=0,b=0,j=0,O=0;switch(d){case rt.c.OffchainVotingContract:var p=(null===n||void 0===n?void 0:n[rt.c.OffchainVotingContract])||{},h=p.startingTime,m=p.gracePeriodStartingTime,v=Object(Hn.a)({gracePeriodLength:N,gracePeriodStartingTime:m,votePeriodLength:x,voteStartingTime:h});l=v.gracePeriodEndMs,b=v.gracePeriodStartMs,j=v.voteEndMs,O=v.voteStartMs}if(!u)return null;if(c)return Object(ue.jsx)(oe.Fragment,{children:c({proposalData:e})},u);var g=(null===o||void 0===o?void 0:o.msg.payload.name)||(null===i||void 0===i?void 0:i.msg.payload.name)||"",E=null===(t=y.find((function(e){var t=Object(xe.a)(e,2),n=t[0];t[1];return Object(f.i)(n)===Object(f.i)(u)})))||void 0===t?void 0:t[1];return Object(ue.jsx)(An,{linkPath:a,name:g,onClick:r,proposalOnClickId:u,renderStatus:function(){switch(d){case rt.c.OffchainVotingContract:return Object(ue.jsx)(jn.c,{countdownGracePeriodEndMs:l,countdownGracePeriodStartMs:b,countdownVotingEndMs:j,countdownVotingStartMs:O,votingResult:E});default:return Object(ue.jsx)(ue.Fragment,{})}}},u)}))}return Object(oe.useEffect)((function(){l(E.map((function(e){return e.snapshotProposal})))}),[E]),Object(oe.useEffect)((function(){if(w===ge.a.FULFILLED){var e={failedProposals:[],nonsponsoredProposals:[],passedProposals:[],votingProposals:[]};E.forEach((function(t){var n,r,a,c,s=t.daoProposal,i=t.daoProposalVotingState,u=t.daoProposalVote;if(s){var d=0===(null===(n=t.snapshotProposal)||void 0===n||null===(r=n.votes)||void 0===r?void 0:r.length),l=void 0!==i&&(Object(Hn.f)(Kn.b.GRACE_PERIOD,i)||Object(Hn.f)(Kn.b.TIE,i))&&Object(Hn.e)(Wt.b.SPONSORED,s.flags)&&(null===u||void 0===u||null===(a=u.OffchainVotingContract)||void 0===a?void 0:a.reporter)===xt.a;if(void 0!==i)if(void 0!==i&&Object(Hn.f)(Kn.b.PASS,i)&&(Object(Hn.e)(Wt.b.SPONSORED,s.flags)||Object(Hn.e)(Wt.b.PROCESSED,s.flags)))e.passedProposals.push(t);else{var b=null===(c=y.find((function(e){var n,r=Object(xe.a)(e,2),a=r[0];r[1];return Object(f.i)(a)===Object(f.i)((null===(n=t.snapshotProposal)||void 0===n?void 0:n.idInDAO)||"")})))||void 0===c?void 0:c[1],j=!!b&&b.Yes.units>b.No.units;l&&!1===d&&j?e.votingProposals.push(t):void 0===i||!Object(Hn.f)(Kn.b.NOT_PASS,i)&&!Object(Hn.f)(Kn.b.TIE,i)||!Object(Hn.e)(Wt.b.SPONSORED,s.flags)&&!Object(Hn.e)(Wt.b.PROCESSED,s.flags)?void 0!==i&&l&&d?e.failedProposals.push(t):void 0===i||!l||j?void 0!==i&&(Object(Hn.f)(Kn.b.GRACE_PERIOD,i)||Object(Hn.f)(Kn.b.IN_PROGRESS,i))&&Object(Hn.e)(Wt.b.SPONSORED,s.flags)&&e.votingProposals.push(t):e.failedProposals.push(t):e.failedProposals.push(t)}else(o||Object(Hn.e)(Wt.b.EXISTS,s.flags))&&e.nonsponsoredProposals.push(t)}})),p((function(t){return Object(v.a)(Object(v.a)({},t),e)}))}}),[o,y,E,w]),P&&!F?Object(ue.jsx)("div",{className:"loader--large-container",children:Object(ue.jsx)(On.a,{})}):F?Object(ue.jsx)("div",{className:"text-center",children:Object(ue.jsx)(Nt.a,{error:F,renderText:"Something went wrong while getting the proposals."})}):Object.values(O).flatMap((function(e){return e})).length||w!==ge.a.FULFILLED?Object(ue.jsxs)("div",{className:"grid--fluid grid-container",children:[R.length>0&&Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{className:"grid__header",children:ft.d.VOTING}),Object(ue.jsx)("div",{className:"grid__cards",children:L(R)})]}),k.length>0&&Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{className:"grid__header",children:ft.d.REQUESTS}),Object(ue.jsx)("div",{className:"grid__cards",children:L(k)})]}),T.length>0&&Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{className:"grid__header",children:ft.d.PASSED}),Object(ue.jsx)("div",{className:"grid__cards",children:L(T)})]}),_.length>0&&Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{className:"grid__header",children:ft.d.FAILED}),Object(ue.jsx)("div",{className:"grid__cards",children:L(_)})]})]}):Object(ue.jsx)("p",{className:"text-center",children:"No proposals, yet!"})}function Jn(){return Object(ue.jsx)(Qn,{children:Object(ue.jsx)(qn,{adapterName:rt.a.ONBOARDING,proposalLinkPath:function(e){return"/membership/".concat(e)},includeProposalsExistingOnlyOffchain:!0})})}function Qn(e){var t=Object(se.f)();return Object(ue.jsx)(Mt,{className:"section-wrapper",children:Object(ue.jsxs)(Ge.a,{children:[Object(ue.jsxs)("div",{className:"titlebar",children:[Object(ue.jsx)("h2",{className:"titlebar__title",children:"Membership"}),Object(ue.jsx)("button",{className:"titlebar__action",onClick:function(e){e.preventDefault(),t.push("/members")},children:"View members"})]}),e.children]})})}var Xn={skipIsActiveMemberCheck:!0};function $n(e){var t=e.disabled,n=e.proposal.snapshotProposal,r=Object(oe.useState)(),a=Object(xe.a)(r,2),s=a[0],o=a[1],i=Object(oe.useState)(),u=Object(xe.a)(i,2),d=u[0],l=u[1],b=Object(oe.useRef)({notProposerMessage:""}),f=Object(c.c)((function(e){var t;return null===(t=e.contracts)||void 0===t?void 0:t.OnboardingContract})),O=Object(c.c)((function(e){return e.contracts.DaoRegistryContract})),p=Object(Ne.f)(),h=p.account,m=p.web3Instance,x=Object(Ne.a)(),N=x.txEtherscanURL,g=x.txIsPromptOpen,E=x.txSend,A=x.txStatus,w=Object(pt.g)(Xn),I=w.isDisabled,y=w.openWhyDisabledModal,C=w.WhyDisabledModal,D=w.setOtherDisabledReasons,S=Object(Ne.b)().fast,_=Ye().daoTokenDetails,k=Object(c.b)(),T=A===vt.f.AWAITING_CONFIRM||A===vt.f.PENDING,R=A===vt.f.FULFILLED,P=T||R||g,F=I||P||t,L=Object(oe.useCallback)((function(){return M.apply(this,arguments)}),[f,null===O||void 0===O?void 0:O.contractAddress,n]);function M(){return(M=Object(We.a)(Ve.a.mark((function e(){var t;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,n&&f){e.next=3;break}return e.abrupt("return");case 3:return e.next=5,f.instance.methods.proposals(null===O||void 0===O?void 0:O.contractAddress,n.idInDAO).call();case 5:t=e.sent,l(t.amount),e.next=13;break;case 9:e.prev=9,e.t0=e.catch(0),console.error(e.t0),l(void 0);case 13:case"end":return e.stop()}}),e,null,[[0,9]])})))).apply(this,arguments)}function B(){return(B=Object(We.a)(Ve.a.mark((function e(){var t,r;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,O){e.next=3;break}throw new Error("No DAO Registry contract was found.");case 3:if(n){e.next=5;break}throw new Error("No Snapshot proposal was found.");case 5:if(f){e.next=7;break}throw new Error("No OnboardingContract found.");case 7:if(h){e.next=9;break}throw new Error("No account found.");case 9:if(m){e.next=11;break}throw new Error("No Web3 instance was found.");case 11:return t=[O.contractAddress,n.idInDAO],r=Object(v.a)({from:h||"",value:d},S?{gasPrice:S}:null),e.next=15,E("processProposal",f.instance.methods,t,r);case 15:if(!e.sent){e.next=22;break}return e.next=19,k(Object(j.A)({account:h,daoRegistryContract:O,web3Instance:m}));case 19:if(h.toLowerCase()!==n.msg.payload.metadata.submitActionArgs[0].toLowerCase()){e.next=22;break}return e.next=22,G();case 22:e.next=27;break;case 24:e.prev=24,e.t0=e.catch(0),o(e.t0);case 27:case"end":return e.stop()}}),e,null,[[0,24]])})))).apply(this,arguments)}function G(){return U.apply(this,arguments)}function U(){return(U=Object(We.a)(Ve.a.mark((function e(){return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(_){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,e.next=5,window.ethereum.request({method:"wallet_watchAsset",params:{type:"ERC20",options:_}});case 5:e.next=10;break;case 7:e.prev=7,e.t0=e.catch(2),console.log(e.t0);case 10:case"end":return e.stop()}}),e,null,[[2,7]])})))).apply(this,arguments)}return Object(oe.useEffect)((function(){L()}),[L]),Object(oe.useEffect)((function(){var e=n.msg.payload.metadata.accountAuthorizedToProcessPassedProposal;e&&h&&(b.current=Object(v.a)(Object(v.a)({},b.current),{},{notProposerMessage:e.toLowerCase()!==h.toLowerCase()?"Only the original proposer can process the proposal.":""})),D(Object.values(b.current))}),[h,D,n]),Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsxs)("div",{children:[Object(ue.jsx)("button",{className:"proposaldetails__button",disabled:F,onClick:F?function(){}:function(){return B.apply(this,arguments)},children:T?Object(ue.jsx)(At.a,{}):R?"Done":"Process"}),Object(ue.jsx)(Nt.a,{error:s,renderText:"Something went wrong"}),P&&Object(ue.jsx)("div",{className:"form__submit-status-container",children:function(){switch(A){case vt.f.AWAITING_CONFIRM:return Object(ue.jsxs)(ue.Fragment,{children:["Confirm to process the proposal",Object(ue.jsx)(kt.a,{})]});case vt.f.PENDING:return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)(Tt.a,{intervalMs:2e3,messages:_t.b,useFirstItemStart:!0,render:function(e){return Object(ue.jsx)(Ge.a,{children:e},e)}}),Object(ue.jsx)(Rt.a,{url:N,isPending:!0})]});case vt.f.FULFILLED:return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{children:"Proposal submitted!"}),Object(ue.jsx)(Rt.a,{url:N})]});default:return null}}()}),I&&Object(ue.jsx)("button",{className:"button--help-centered",onClick:y,children:"Why is processing disabled?"})]}),Object(ue.jsx)(C,{title:"Why is processing disabled?"})]})}var Zn=Object(oe.lazy)((function(){return n.e(8).then(n.bind(null,976))})),er={duration:150},tr={display:"inline-block",width:"100%",fontSize:"1.5rem"};function nr(e){var t,n=e.adapterName,r=e.proposal,a=e.renderAction,s=Object(c.c)((function(e){var t;return null===(t=e.contracts.VotingContract)||void 0===t?void 0:t.adapterOrExtensionName})),o=(null===(t=r.daoProposalVotingAdapter)||void 0===t?void 0:t.votingAdapterName)||s;return Object(ue.jsx)(oe.Suspense,{fallback:Object(ue.jsx)("span",{className:"text-center",style:tr,children:Object(ue.jsx)(kt.a,{intervalMs:200,fadeInProps:er})}),children:function(){if(!o)return Object(ue.jsx)(ue.Fragment,{});switch(o){case rt.c.OffchainVotingContract:return Object(ue.jsx)(Zn,{adapterName:n,proposal:r,renderAction:a});case rt.c.VotingContract:return Object(ue.jsx)(ue.Fragment,{});default:return Object(ue.jsx)(Nt.a,{error:new Error('"'.concat(o,'" is not a valid voting adapter name.')),renderText:"Something went wrong"})}}()})}var rr=n(206);function ar(e){var t=e.amount,n=e.amountUnit,r=e.amount2,a=e.amount2Unit;return Object(ue.jsx)("div",{className:"proposaldetails__amount",children:Object(ue.jsxs)("span",{children:["".concat(t," ").concat(n),r&&Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("br",{}),Object(ue.jsx)("small",{children:"for"}),Object(ue.jsx)("br",{}),"".concat(r," ").concat(a)]})]})})}function cr(){var e=Object(se.h)().proposalId,t=Object(Yt.d)(e),n=t.proposalData,r=t.proposalError,a=t.proposalNotFound,c=t.proposalStatus,s=Object(Ne.d)().defaultChainError,o=r||s;function i(e){var t=e.OffchainVotingContract,n=t.daoProposalVoteResult,r=t.proposal,a=t.status;if(a===Wt.c.Submit){var c=r.snapshotDraft,s=null===c||void 0===c?void 0:c.msg.payload.metadata.submitActionArgs[0];return Object(ue.jsx)(rr.a,{checkApplicant:s,proposal:r})}return a===Wt.c.Process||a===Wt.c.OffchainVotingGracePeriod?n&&Kn.b[n]!==Kn.b[Kn.b.PASS]?Object(ue.jsx)(ue.Fragment,{}):Object(ue.jsx)($n,{disabled:a===Wt.c.OffchainVotingGracePeriod,proposal:r}):null}if(c===ge.a.PENDING&&!o)return Object(ue.jsx)(sr,{children:Object(ue.jsx)("div",{className:"loader--large-container",children:Object(ue.jsx)(On.a,{})})});if(a)return Object(ue.jsx)(sr,{children:Object(ue.jsx)(pn,{})});if(o)return Object(ue.jsx)(sr,{children:Object(ue.jsx)("div",{className:"text-center",children:Object(ue.jsx)(Nt.a,{error:o,renderText:"Something went wrong while getting the proposal."})})});if(n){var u=n.getCommonSnapshotProposalData(),d="\u2014",l="";try{var b=null===u||void 0===u?void 0:u.msg.payload.metadata.proposalAmountValues;d=b.tributeAmount,l=b.tributeAmountUnit}catch(o){d="\u2014",l=""}return Object(ue.jsx)(sr,{children:Object(ue.jsx)(hn,{proposal:n,renderAmountBadge:function(){return Object(ue.jsx)(ar,{amount:d,amountUnit:l})},renderActions:function(){return Object(ue.jsx)(nr,{adapterName:vt.a.onboarding,proposal:n,renderAction:i})}})})}return Object(ue.jsx)(ue.Fragment,{})}function sr(e){var t=Object(se.f)();return Object(ue.jsx)(Mt,{className:"section-wrapper",children:Object(ue.jsxs)(Ge.a,{children:[Object(ue.jsxs)("div",{className:"titlebar",children:[Object(ue.jsx)("h2",{className:"titlebar__title",children:"Membership"}),Object(ue.jsx)("button",{className:"titlebar__action",onClick:function(e){e.preventDefault(),t.push("/membership")},children:"View all"})]}),e.children]})})}function or(e){var t=e.showAfterMs,n=Object(oe.useState)(!1),r=Object(xe.a)(n,2),a=r[0],c=r[1];return Object(oe.useEffect)((function(){var e=t&&setTimeout((function(){return c(!0)}),t);return function(){e&&clearTimeout(e)}}),[t]),!t||t&&a?Object(ue.jsx)("div",{className:"loader--emoji",children:Object(ue.jsx)("span",{role:"img","aria-label":"Loading content...",children:e.emoji})}):null}var ir=n(205),ur=n(153),dr={skipIsActiveMemberCheck:!0};function lr(e){var t=e.redeemables,n=e.daoTokenDetails;return Object(ue.jsx)(jr,{children:Object(ue.jsx)(br,{redeemable:t[0],daoTokenDetails:n})})}function br(e){var t=e.redeemable,n=e.daoTokenDetails,r=Object(oe.useRef)({invalidApplicantMessage:""}),a=Object(ur.b)(),c=a.redeemCoupon,s=a.submitStatus,o=a.submitError,i=a.txStatus,u=a.txEtherscanURL,d=a.txIsPromptOpen,l=Object(pt.g)(dr),b=l.isDisabled,j=l.openWhyDisabledModal,O=l.WhyDisabledModal,p=l.setOtherDisabledReasons,h=Object(Yt.a)(t.recipient),m=h.checkApplicantError,x=h.checkApplicantInvalidMsg,N=h.checkApplicantStatus,g=h.isApplicantValid,E=s===ur.a.PENDING||i===vt.f.AWAITING_CONFIRM||i===vt.f.PENDING,A=s===ur.a.FULFILLED||i===vt.f.FULFILLED||t.isRedeemd,w=E||A||d;return Object(oe.useEffect)((function(){t.recipient&&(m&&console.warn("Error checking if the applicant address '".concat(t.recipient,"' is valid: ").concat(m.message)),N===ge.a.FULFILLED&&!g&&x&&(r.current=Object(v.a)(Object(v.a)({},r.current),{},{invalidApplicantMessage:x})),p(Object.values(r.current)))}),[m,x,N,g,t.recipient,p]),Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsxs)("div",{className:"redeemcard redeemcard__content ".concat(A?"fireworks":""," "),children:[Object(ue.jsxs)("p",{className:"redeemcard__recipient",children:["Recipient:"," ",Object(f.l)(Object(Qt.toChecksumAddress)(t.recipient),7)]}),Object(ue.jsxs)("p",{className:"redeemcard__unit",children:[Object(f.e)(t.amount),Object(ue.jsx)("sup",{children:Object(ue.jsx)("small",{children:(null===n||void 0===n?void 0:n.symbol)||"tokens"})})]}),Object(ue.jsx)(Fn,{daoTokenDetails:n}),A&&Object(ue.jsx)("p",{className:"redeemcard__redeemed",children:Object(ue.jsx)("span",{className:"pulse",role:"img","aria-label":"Redeemed!",style:{display:"inline-block"},children:"\ud83e\udd73"})}),Object(ue.jsx)("button",{className:"button",style:{marginTop:A?"1rem":"1.5rem"},onClick:Object(We.a)(Ve.a.mark((function e(){return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c(t,n);case 2:case"end":return e.stop()}}),e)}))),disabled:b||w,children:E?Object(ue.jsx)(At.a,{}):A?"Redeemed!":"Redeem"}),w&&!t.isRedeemd&&Object(ue.jsx)("div",{className:"form__submit-status-container",style:{marginTop:"1rem"},children:function(){switch(i){case vt.f.AWAITING_CONFIRM:return Object(ue.jsxs)(ue.Fragment,{children:["Awaiting your confirmation",Object(ue.jsx)(ir.a,{})]});case vt.f.PENDING:return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)(Tt.a,{intervalMs:2e3,messages:_t.b,useFirstItemStart:!0,render:function(e){return Object(ue.jsx)(Ge.a,{children:e},e)}}),Object(ue.jsx)(Rt.a,{url:u,isPending:!0})]});case vt.f.FULFILLED:return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{children:"Finalized!"}),Object(ue.jsx)(Rt.a,{url:u})]});default:return null}}()}),b&&Object(ue.jsx)("button",{className:"button--help-centered",onClick:j,style:{margin:"1rem auto 0"},children:"Why is redeeming disabled?"}),o&&Object(ue.jsx)("div",{className:"form__submit-error-container",children:Object(ue.jsx)(Nt.a,{renderText:"Something went wrong while redeeming the coupon.",error:o})})]}),Object(ue.jsx)(O,{title:"Why is redeeming disabled?"})]})}function jr(e){return Object(ue.jsx)(Ge.a,{children:Object(ue.jsx)("div",{className:"grid--fluid grid-container",children:e.children})})}function fr(){var e=Object(oe.useState)([]),t=Object(xe.a)(e,2),n=t[0],r=t[1],a=Object(oe.useState)(ge.a.STANDBY),c=Object(xe.a)(a,2),s=c[0],o=c[1],i=Object(Ne.f)(),u=i.connected,d=i.account,l=Object(Ne.d)().defaultChainError,j=Object(pt.a)(),f=j.abortController,O=j.isMountedRef,p=Ye(),h=p.daoTokenDetails,m=p.daoTokenDetailsStatus,v=Object(se.g)(),x=new URLSearchParams(v.search).get("coupon"),N=s===ge.a.STANDBY||s===ge.a.PENDING||m===ge.a.STANDBY||m===ge.a.PENDING,g=Object(oe.useCallback)((function(){return E.apply(this,arguments)}),[null===f||void 0===f?void 0:f.signal,x,O]);function E(){return(E=Object(We.a)(Ve.a.mark((function e(){var t,n;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,null===f||void 0===f?void 0:f.signal){e.next=3;break}return e.abrupt("return");case 3:return o(ge.a.PENDING),e.next=6,fetch("".concat(b.g,"/api/coupon/redeem"),{method:"POST",body:JSON.stringify({signature:x}),headers:{"Content-Type":"application/json"},signal:f.signal});case 6:if(t=e.sent,O.current){e.next=9;break}return e.abrupt("return");case 9:return e.next=11,t.json();case 11:n=e.sent,r(n),o(ge.a.FULFILLED),e.next=21;break;case 16:if(e.prev=16,e.t0=e.catch(0),O.current){e.next=20;break}return e.abrupt("return");case 20:o(ge.a.REJECTED);case 21:case"end":return e.stop()}}),e,null,[[0,16]])})))).apply(this,arguments)}return Object(oe.useEffect)((function(){d&&u&&!l&&g()}),[d,u,g,l]),u?l?Object(ue.jsx)(Or,{children:Object(ue.jsx)("p",{className:"color-brightsalmon",children:l.message})}):u&&N?Object(ue.jsxs)(Or,{children:[Object(ue.jsx)(or,{emoji:"\ud83c\udf9f"}),Object(ue.jsx)("p",{children:"Checking\u2026 please wait."})]}):void 0!==x&&x?n&&n.length?Object(ue.jsx)(Or,{children:Object(ue.jsx)(lr,{daoTokenDetails:h,redeemables:n})}):Object(ue.jsx)(Or,{children:Object(ue.jsx)("p",{className:"color-brightsalmon",children:"Coupon not found."})}):Object(ue.jsx)(Or,{children:Object(ue.jsx)("p",{className:"color-brightsalmon",children:"Coupon signature missing."})}):Object(ue.jsx)(Or,{children:Object(ue.jsx)("p",{className:"color-brightsalmon",children:"Connect your wallet to view the coupon."})})}function Or(e){return Object(ue.jsx)(Mt,{className:"section-wrapper",children:Object(ue.jsxs)(Ge.a,{children:[Object(ue.jsx)("div",{className:"titlebar",children:Object(ue.jsx)("h2",{className:"titlebar__title",children:"Redeem Coupon"})}),Object(ue.jsxs)("div",{className:"form-wrapper",children:[Object(ue.jsx)("div",{className:"form__description",children:Object(ue.jsx)("p",{children:"Redeem coupon to issue the membership tokens."})}),e.children]})]})})}function pr(e){var t=e.proposal.snapshotProposal,n=Object(oe.useState)(),r=Object(xe.a)(n,2),a=r[0],s=r[1],o=Object(oe.useRef)({alreadyCompletedMessage:""}),i=Object(c.c)((function(e){var t;return null===(t=e.contracts)||void 0===t?void 0:t.DistributeContract})),u=Object(c.c)((function(e){return e.contracts.DaoRegistryContract})),d=Object(Ne.f)(),l=d.account,b=d.web3Instance,f=Object(Ne.a)(),O=f.txEtherscanURL,p=f.txIsPromptOpen,h=f.txSend,m=f.txStatus,x=Object(pt.g)(),N=x.isDisabled,g=x.openWhyDisabledModal,E=x.WhyDisabledModal,A=x.setOtherDisabledReasons,w=Object(Ne.b)().fast,I=Object(c.b)(),y=m===vt.f.AWAITING_CONFIRM||m===vt.f.PENDING,C=m===vt.f.FULFILLED,D=y||C||p,S=N||D;function _(){return(_=Object(We.a)(Ve.a.mark((function e(){var n,r,a,c;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,u){e.next=3;break}throw new Error("No DAO Registry contract was found.");case 3:if(t){e.next=5;break}throw new Error("No Snapshot proposal was found.");case 5:if(i){e.next=7;break}throw new Error("No DistributeContract found.");case 7:if(l){e.next=9;break}throw new Error("No account found.");case 9:if(b){e.next=11;break}throw new Error("No Web3 instance was found.");case 11:if(n="0",!(null===t||void 0===t?void 0:t.msg.payload.metadata.isTypeAllMembers)){e.next=24;break}return e.prev=14,e.next=17,u.instance.methods.getNbMembers().call();case 17:r=e.sent,n=r.toString(),e.next=24;break;case 21:throw e.prev=21,e.t0=e.catch(14),new Error("Error while retrieving number of DAO members");case 24:return a=[u.contractAddress,n],c=Object(v.a)({from:l||""},w?{gasPrice:w}:null),e.next=28,h("distribute",i.instance.methods,a,c);case 28:if(!e.sent){e.next=32;break}return e.next=32,I(Object(j.A)({account:l,daoRegistryContract:u,web3Instance:b}));case 32:e.next=37;break;case 34:e.prev=34,e.t1=e.catch(0),s(e.t1);case 37:case"end":return e.stop()}}),e,null,[[0,34],[14,21]])})))).apply(this,arguments)}return Object(oe.useEffect)((function(){function e(){return(e=Object(We.a)(Ve.a.mark((function e(){var n;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,t){e.next=3;break}throw new Error("No Snapshot proposal was found.");case 3:if(u){e.next=5;break}throw new Error("No DAO Registry contract was found.");case 5:if(i){e.next=7;break}throw new Error("No DistributeContract found.");case 7:return e.next=9,i.instance.methods.distributions(u.contractAddress,t.idInDAO).call();case 9:n=e.sent,o.current=Object(v.a)(Object(v.a)({},o.current),{},{alreadyCompletedMessage:Wt.a[n.status]!==Wt.a[Wt.a.IN_PROGRESS]?"The transfer has already been completed.":""}),e.next=16;break;case 13:e.prev=13,e.t0=e.catch(0),console.error(e.t0);case 16:A(Object.values(o.current));case 17:case"end":return e.stop()}}),e,null,[[0,13]])})))).apply(this,arguments)}!function(){e.apply(this,arguments)}()}),[i,u,A,t]),Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsxs)("div",{children:[Object(ue.jsx)("button",{className:"proposaldetails__button",disabled:S,onClick:S?function(){}:function(){return _.apply(this,arguments)},children:y?Object(ue.jsx)(At.a,{}):C?"Transfer done":"Transfer assets"}),Object(ue.jsx)(Nt.a,{error:a,renderText:"Something went wrong"}),D&&Object(ue.jsx)("div",{className:"form__submit-status-container",children:function(){switch(m){case vt.f.AWAITING_CONFIRM:return Object(ue.jsxs)(ue.Fragment,{children:["Confirm to transfer assets",Object(ue.jsx)(kt.a,{})]});case vt.f.PENDING:return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)(Tt.a,{intervalMs:2e3,messages:_t.b,useFirstItemStart:!0,render:function(e){return Object(ue.jsx)(Ge.a,{children:e},e)}}),Object(ue.jsx)(Rt.a,{url:O,isPending:!0})]});case vt.f.FULFILLED:return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{children:"Assets transferred!"}),Object(ue.jsx)(Rt.a,{url:O})]});default:return null}}()}),N&&Object(ue.jsx)("button",{className:"button--help-centered",onClick:g,children:"Why is action disabled?"})]}),Object(ue.jsx)(E,{title:"Why is transfer disabled?"})]})}function hr(){var e=Object(se.h)().proposalId,t=Object(Yt.d)(e),n=t.proposalData,r=t.proposalError,a=t.proposalNotFound,c=t.proposalStatus,s=Object(Ne.d)().defaultChainError,o=r||s;function i(e){var t=e.OffchainVotingContract,n=t.daoProposalVoteResult,r=t.proposal;return t.status===Wt.c.Completed&&n&&Kn.b[n]===Kn.b[Kn.b.PASS]?Object(ue.jsx)(pr,{proposal:r}):null}if(c===ge.a.PENDING&&!o)return Object(ue.jsx)(mr,{children:Object(ue.jsx)("div",{className:"loader--large-container",children:Object(ue.jsx)(On.a,{})})});if(a)return Object(ue.jsx)(mr,{children:Object(ue.jsx)(pn,{})});if(o)return Object(ue.jsx)(mr,{children:Object(ue.jsx)("div",{className:"text-center",children:Object(ue.jsx)(Nt.a,{error:o,renderText:"Something went wrong."})})});if(n){var u=n.getCommonSnapshotProposalData(),d="\u2014",l="";try{var b=null===u||void 0===u?void 0:u.msg.payload.metadata.proposalAmountValues;d=b.transferAmount,l=b.transferAmountUnit}catch(o){d="\u2014",l=""}return Object(ue.jsx)(mr,{children:Object(ue.jsx)(hn,{proposal:n,renderAmountBadge:function(){return Object(ue.jsx)(ar,{amount:d,amountUnit:l})},renderActions:function(){return Object(ue.jsx)(nr,{adapterName:vt.a.distribute,proposal:n,renderAction:i})}})})}return Object(ue.jsx)(ue.Fragment,{})}function mr(e){var t=Object(se.f)();return Object(ue.jsx)(Mt,{className:"section-wrapper",children:Object(ue.jsxs)(Ge.a,{children:[Object(ue.jsxs)("div",{className:"titlebar",children:[Object(ue.jsx)("h2",{className:"titlebar__title",children:"Transfers"}),Object(ue.jsx)("button",{className:"titlebar__action",onClick:function(e){e.preventDefault(),t.push("/transfers")},children:"View all"})]}),e.children]})})}function vr(){return Object(ue.jsx)(xr,{children:Object(ue.jsx)(qn,{adapterName:rt.a.DISTRIBUTE,proposalLinkPath:function(e){return"/transfers/".concat(e)}})})}function xr(e){var t=Object(se.f)();return Object(ue.jsx)(Mt,{className:"section-wrapper",children:Object(ue.jsxs)(Ge.a,{children:[Object(ue.jsxs)("div",{className:"titlebar",children:[Object(ue.jsx)("h2",{className:"titlebar__title",children:"Transfers"}),Object(ue.jsx)("button",{className:"titlebar__action",onClick:function(e){e.preventDefault(),t.push("/transfer")},children:"Make Transfer"})]}),e.children]})})}var Nr={skipIsActiveMemberCheck:!0};function gr(e){var t=e.disabled,r=e.proposal.snapshotProposal,a=Object(oe.useState)(),s=Object(xe.a)(a,2),o=s[0],i=s[1],u=Object(oe.useState)(),d=Object(xe.a)(u,2),l=d[0],b=d[1],f=Object(oe.useRef)({notProposerMessage:""}),O=Object(c.c)((function(e){var t;return null===(t=e.contracts)||void 0===t?void 0:t.TributeContract})),p=Object(c.c)((function(e){return e.contracts.DaoRegistryContract})),h=Object(Ne.f)(),m=h.account,x=h.web3Instance,N=Object(Ne.a)(),g=N.txEtherscanURL,E=N.txIsPromptOpen,A=N.txSend,w=N.txStatus,I=Object(Ne.a)(),y=I.txEtherscanURL,C=I.txIsPromptOpen,D=I.txSend,S=I.txStatus,_=Object(pt.g)(Nr),k=_.isDisabled,T=_.openWhyDisabledModal,R=_.WhyDisabledModal,P=_.setOtherDisabledReasons,F=Object(Ne.b)().fast,L=Ye().daoTokenDetails,M=Object(c.b)(),B=w===vt.f.AWAITING_CONFIRM||w===vt.f.PENDING||S===vt.f.AWAITING_CONFIRM||S===vt.f.PENDING,G=w===vt.f.FULFILLED,U=B||G||E||C,V=k||U||t,W=Object(oe.useCallback)((function(){return Y.apply(this,arguments)}),[O,null===p||void 0===p?void 0:p.contractAddress,r]);function Y(){return(Y=Object(We.a)(Ve.a.mark((function e(){var t,n,a;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,r&&O){e.next=3;break}return e.abrupt("return");case 3:return e.next=5,O.instance.methods.proposals(null===p||void 0===p?void 0:p.contractAddress,r.idInDAO).call();case 5:t=e.sent,n=t.token,a=t.tributeAmount,b({tokenAddress:n,tributeAmount:a}),e.next=14;break;case 10:e.prev=10,e.t0=e.catch(0),console.error(e.t0),b(void 0);case 14:case"end":return e.stop()}}),e,null,[[0,10]])})))).apply(this,arguments)}function H(){return K.apply(this,arguments)}function K(){return(K=Object(We.a)(Ve.a.mark((function e(){var t,r,a,c,s,o,i,u,d,b,j,f,p;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,l){e.next=3;break}throw new Error("No Tribute proposal details found.");case 3:if(O){e.next=5;break}throw new Error("No TributeContract found.");case 5:if(m){e.next=7;break}throw new Error("No account found.");case 7:if(x){e.next=9;break}throw new Error("No Web3 instance was found.");case 9:return t=l.tokenAddress,r=l.tributeAmount,e.next=12,Promise.resolve().then(n.t.bind(null,459,3));case 12:return a=e.sent,c=a.default,s=c,o=new x.eth.Contract(s,t),e.next=18,o.methods.allowance(m,O.contractAddress).call();case 18:if(i=e.sent,u=Object(Qt.toBN)(r),d=Object(Qt.toBN)(i),!u.gt(d)){e.next=34;break}return e.prev=22,b=u.sub(d),j=d.add(b),f=[O.contractAddress,j.toString()],p=Object(v.a)({from:m||""},F?{gasPrice:F}:null),e.next=29,D("approve",o.methods,f,p);case 29:e.next=34;break;case 31:throw e.prev=31,e.t0=e.catch(22),e.t0;case 34:e.next=39;break;case 36:throw e.prev=36,e.t1=e.catch(0),e.t1;case 39:case"end":return e.stop()}}),e,null,[[0,36],[22,31]])})))).apply(this,arguments)}function z(){return(z=Object(We.a)(Ve.a.mark((function e(){var t,n;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,p){e.next=3;break}throw new Error("No DAO Registry contract was found.");case 3:if(r){e.next=5;break}throw new Error("No Snapshot proposal was found.");case 5:if(O){e.next=7;break}throw new Error("No TributeContract found.");case 7:if(m){e.next=9;break}throw new Error("No account found.");case 9:if(x){e.next=11;break}throw new Error("No Web3 instance was found.");case 11:return e.next=13,H();case 13:return t=[p.contractAddress,r.idInDAO],n=Object(v.a)({from:m||""},F?{gasPrice:F}:null),e.next=17,A("processProposal",O.instance.methods,t,n);case 17:if(!e.sent){e.next=24;break}return e.next=21,M(Object(j.A)({account:m,daoRegistryContract:p,web3Instance:x}));case 21:if(m.toLowerCase()!==r.msg.payload.metadata.submitActionArgs[0].toLowerCase()){e.next=24;break}return e.next=24,q();case 24:e.next=29;break;case 26:e.prev=26,e.t0=e.catch(0),i(e.t0);case 29:case"end":return e.stop()}}),e,null,[[0,26]])})))).apply(this,arguments)}function q(){return J.apply(this,arguments)}function J(){return(J=Object(We.a)(Ve.a.mark((function e(){return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(L){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,e.next=5,window.ethereum.request({method:"wallet_watchAsset",params:{type:"ERC20",options:L}});case 5:e.next=10;break;case 7:e.prev=7,e.t0=e.catch(2),console.log(e.t0);case 10:case"end":return e.stop()}}),e,null,[[2,7]])})))).apply(this,arguments)}return Object(oe.useEffect)((function(){W()}),[W]),Object(oe.useEffect)((function(){var e=r.msg.payload.metadata.accountAuthorizedToProcessPassedProposal;e&&m&&(f.current=Object(v.a)(Object(v.a)({},f.current),{},{notProposerMessage:e.toLowerCase()!==m.toLowerCase()?"Only the original proposer can process the proposal.":""})),P(Object.values(f.current))}),[m,P,r]),Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsxs)("div",{children:[Object(ue.jsx)("button",{className:"proposaldetails__button",disabled:V,onClick:V?function(){}:function(){return z.apply(this,arguments)},children:B?Object(ue.jsx)(At.a,{}):G?"Done":"Process"}),Object(ue.jsx)(Nt.a,{error:o,renderText:"Something went wrong"}),U&&Object(ue.jsx)("div",{className:"form__submit-status-container",children:function(){if(S===vt.f.AWAITING_CONFIRM)return Object(ue.jsxs)(ue.Fragment,{children:["Confirm to transfer your tokens",Object(ue.jsx)(kt.a,{})]});if(S===vt.f.PENDING)return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsxs)("div",{children:["Approving your tokens for transfer",Object(ue.jsx)(kt.a,{})]}),Object(ue.jsx)(Rt.a,{url:y,isPending:!0})]});switch(w){case vt.f.AWAITING_CONFIRM:return Object(ue.jsxs)(ue.Fragment,{children:["Confirm to process the proposal",Object(ue.jsx)(kt.a,{})]});case vt.f.PENDING:return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)(Tt.a,{intervalMs:2e3,messages:_t.b,useFirstItemStart:!0,render:function(e){return Object(ue.jsx)(Ge.a,{children:e},e)}}),Object(ue.jsx)(Rt.a,{url:g,isPending:!0})]});case vt.f.FULFILLED:return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)("div",{children:"Proposal submitted!"}),Object(ue.jsx)(Rt.a,{url:g})]});default:return null}}()}),k&&Object(ue.jsx)("button",{className:"button--help-centered",onClick:T,children:"Why is processing disabled?"})]}),Object(ue.jsx)(R,{title:"Why is processing disabled?"})]})}var Er="\u2014";function Ar(){var e=Object(se.h)().proposalId,t=Object(Yt.d)(e),n=t.proposalData,r=t.proposalError,a=t.proposalNotFound,c=t.proposalStatus,s=Object(Ne.d)().defaultChainError,o=r||s;function i(e){var t=e.OffchainVotingContract,n=t.daoProposalVoteResult,r=t.proposal,a=t.status;if(a===Wt.c.Submit){var c=r.snapshotDraft,s=null===c||void 0===c?void 0:c.msg.payload.metadata.submitActionArgs[0];return Object(ue.jsx)(rr.a,{checkApplicant:s,proposal:r})}return a===Wt.c.Process||a===Wt.c.OffchainVotingGracePeriod?n&&Kn.b[n]!==Kn.b[Kn.b.PASS]?Object(ue.jsx)(ue.Fragment,{}):Object(ue.jsx)(gr,{disabled:a===Wt.c.OffchainVotingGracePeriod,proposal:r}):null}if(c===ge.a.PENDING&&!o)return Object(ue.jsx)(wr,{children:Object(ue.jsx)("div",{className:"loader--large-container",children:Object(ue.jsx)(On.a,{})})});if(a)return Object(ue.jsx)(wr,{children:Object(ue.jsx)(pn,{})});if(o)return Object(ue.jsx)(wr,{children:Object(ue.jsx)("div",{className:"text-center",children:Object(ue.jsx)(Nt.a,{error:o,renderText:"Something went wrong."})})});if(n){var u=n.getCommonSnapshotProposalData(),d=Er,l="",b=Er,j="";try{var f=null===u||void 0===u?void 0:u.msg.payload.metadata.proposalAmountValues;d=f.tributeAmount,l=f.tributeAmountUnit,b=f.requestAmount,j=f.requestAmountUnit}catch(o){d=Er,l="",b=Er,j=""}return Object(ue.jsx)(wr,{children:Object(ue.jsx)(hn,{proposal:n,renderAmountBadge:function(){return Object(ue.jsx)(ar,{amount:d,amountUnit:l,amount2:b,amount2Unit:j})},renderActions:function(){return Object(ue.jsx)(nr,{adapterName:vt.a.tribute,proposal:n,renderAction:i})}})})}return Object(ue.jsx)(ue.Fragment,{})}function wr(e){var t=Object(se.f)();return Object(ue.jsx)(Mt,{className:"section-wrapper",children:Object(ue.jsxs)(Ge.a,{children:[Object(ue.jsxs)("div",{className:"titlebar",children:[Object(ue.jsx)("h2",{className:"titlebar__title",children:"Tributes"}),Object(ue.jsx)("button",{className:"titlebar__action",onClick:function(e){e.preventDefault(),t.push("/tributes")},children:"View all"})]}),e.children]})})}function Ir(){return Object(ue.jsx)(yr,{children:Object(ue.jsx)(qn,{adapterName:rt.a.TRIBUTE,proposalLinkPath:function(e){return"/tributes/".concat(e)},includeProposalsExistingOnlyOffchain:!0})})}function yr(e){var t=Object(se.f)();return Object(ue.jsx)(Mt,{className:"section-wrapper",children:Object(ue.jsxs)(Ge.a,{children:[Object(ue.jsxs)("div",{className:"titlebar",children:[Object(ue.jsx)("h2",{className:"titlebar__title",children:"Tributes"}),Object(ue.jsx)("button",{className:"titlebar__action",onClick:function(e){e.preventDefault(),t.push("/tribute")},children:"Provide Tribute"})]}),e.children]})})}var Cr,Dr=":proposalId";function Sr(){return Object(ue.jsx)(se.c,{children:[Object(ue.jsx)(se.a,{exact:!0,path:"/",render:function(){return Object(ue.jsx)(bn,{})}},"splash"),Object(ue.jsx)(se.a,{exact:!0,path:"/join",render:function(){return Object(ue.jsx)($t,{})}},"join"),Object(ue.jsx)(se.a,{exact:!0,path:"/membership",render:function(){return Object(ue.jsx)(Jn,{})}},"membership"),Object(ue.jsx)(se.a,{exact:!0,path:"/membership/".concat(Dr),render:function(){return Object(ue.jsx)(cr,{})}},"membership-details"),Object(ue.jsx)(se.a,{exact:!0,path:"/transfer",render:function(){return Object(ue.jsx)(rn,{})}},"transfer"),Object(ue.jsx)(se.a,{exact:!0,path:"/transfers",render:function(){return Object(ue.jsx)(vr,{})}},"transfers"),Object(ue.jsx)(se.a,{exact:!0,path:"/transfers/".concat(Dr),render:function(){return Object(ue.jsx)(hr,{})}},"transfer-details"),Object(ue.jsx)(se.a,{exact:!0,path:"/tribute",render:function(){return Object(ue.jsx)(cn,{})}},"tribute"),Object(ue.jsx)(se.a,{exact:!0,path:"/tributes",render:function(){return Object(ue.jsx)(Ir,{})}},"tributes"),Object(ue.jsx)(se.a,{exact:!0,path:"/tributes/".concat(Dr),render:function(){return Object(ue.jsx)(Ar,{})}},"tribute-details"),Object(ue.jsx)(se.a,{exact:!0,path:"/governance-proposal",render:function(){return Object(ue.jsx)(zt,{})}},"governance-proposal"),Object(ue.jsx)(se.a,{exact:!0,path:"/governance",render:function(){return Object(ue.jsx)(In,{})}},"governance-proposals"),Object(ue.jsx)(se.a,{exact:!0,path:"/governance/".concat(Dr),render:function(){return Object(ue.jsx)(mn,{})}},"governance-proposal-details"),Object(ue.jsx)(se.a,{exact:!0,path:"/members",render:function(){return Object(ue.jsx)(Wn,{})}},"members"),Object(ue.jsx)(se.a,{exact:!0,path:"/members/:ethereumAddress",render:function(){return Object(ue.jsx)(Gn,{})}},"member-profile"),Object(ue.jsx)(se.a,{exact:!0,path:"/dao-manager",render:function(){return Object(ue.jsx)(Bt,{})}},"dao-manager"),Object(ue.jsx)(se.a,{exact:!0,path:"/redeem",render:function(){return Object(ue.jsx)(fr,{})}},"redeem"),Object(ue.jsx)(se.a,{component:pn},"no-match")]})}function _r(e){var t=Object(se.g)().pathname,n=(e||{}).renderMainContent,r=Object(ue.jsx)("main",{children:n?n():Object(ue.jsx)(Sr,{})});return Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)(Ie,{}),"/"===t?Object(ue.jsx)(ue.Fragment,{children:r}):Object(ue.jsxs)(ue.Fragment,{children:[Object(ue.jsx)(tt,{}),r,Object(ue.jsx)(ve,{})]}),Object(ue.jsx)(Ae,{})]})}function kr(e){var t=e.render,n=Object(c.c)((function(e){return e.contracts.DaoRegistryContract})),r=Object(oe.useState)(),a=Object(xe.a)(r,2),s=a[0],o=a[1],i=Object(oe.useState)(!1),u=Object(xe.a)(i,2),d=u[0],l=u[1],f=Object(oe.useState)(Object(nt.a)({},Cr.initSnapshotAPI,ge.a.STANDBY)),O=Object(xe.a)(f,2),p=O[0],h=O[1],m=Object(Ne.f)(),x=m.account,N=m.web3Instance,g=Object(Ne.d)().isDefaultChain,E=Object(pt.f)().isMountedRef,A=Object(Ne.c)(),w=Object(c.b)(),I=Object(oe.useCallback)((function(){return S.apply(this,arguments)}),[A,g,N]),y=Object(oe.useCallback)((function(){return _.apply(this,arguments)}),[x,n,w,g,N]),C=Object(oe.useCallback)((function(){return D.apply(this,arguments)}),[E]);function D(){return(D=Object(We.a)(Ve.a.mark((function e(){var t;return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,b.C){e.next=3;break}throw new Error("No Snapshot Hub API URL was found.");case 3:return e.next=5,Object(Vt.getApiStatus)(b.C);case 5:if(t=e.sent,t.data.version){e.next=9;break}throw new Error("Snapshot API is not ready.");case 9:if(E.current){e.next=11;break}return e.abrupt("return");case 11:h((function(e){return Object(v.a)(Object(v.a)({},e),{},Object(nt.a)({},Cr.initSnapshotAPI,ge.a.FULFILLED))})),e.next=19;break;case 14:if(e.prev=14,e.t0=e.catch(0),E.current){e.next=18;break}return e.abrupt("return");case 18:o(new Error("Snapshot API is not responding."));case 19:case"end":return e.stop()}}),e,null,[[0,14]])})))).apply(this,arguments)}function S(){return(S=Object(We.a)(Ve.a.mark((function e(){return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,g&&N){e.next=3;break}return e.abrupt("return");case 3:return e.next=5,A({web3Instance:N});case 5:e.next=10;break;case 7:e.prev=7,e.t0=e.catch(0),o(e.t0);case 10:case"end":return e.stop()}}),e,null,[[0,7]])})))).apply(this,arguments)}function _(){return(_=Object(We.a)(Ve.a.mark((function e(){return Ve.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,x&&n&&g&&N){e.next=3;break}return e.abrupt("return");case 3:return e.next=5,w(Object(j.A)({account:x,daoRegistryContract:n,web3Instance:N}));case 5:e.next=10;break;case 7:e.prev=7,e.t0=e.catch(0),o(e.t0);case 10:case"end":return e.stop()}}),e,null,[[0,7]])})))).apply(this,arguments)}return Object(oe.useEffect)((function(){l(Object.values(p).every((function(e){return e===ge.a.FULFILLED})))}),[p]),Object(oe.useEffect)((function(){I()}),[I,N]),Object(oe.useEffect)((function(){y()}),[y]),Object(oe.useEffect)((function(){C()}),[C]),t({error:s,isInitComplete:d})}function Tr(e){var t=e.error;return Object(ue.jsxs)(Ge.a,{children:[Object(ue.jsx)("div",{style:{padding:"2em 1em 1em",textAlign:"center"},children:Object(ue.jsxs)("h1",{style:{fontSize:"2rem"},children:[Object(ue.jsx)("span",{className:"pulse",role:"img","aria-label":"Emoji with eyes crossed out.",style:{display:"inline-block"},children:"\ud83d\ude35"})," ","Oops, something went wrong."]})}),Object(ue.jsx)("div",{style:{textAlign:"center",maxWidth:600,display:"block",margin:"0 auto"},children:Object(ue.jsx)(Nt.a,{error:t,renderText:""})})]})}!function(e){e.initSnapshotAPI="initSnapshotAPI"}(Cr||(Cr={}));var Rr=function(e){e&&e instanceof Function&&n.e(10).then(n.bind(null,974)).then((function(t){var n=t.getCLS,r=t.getFID,a=t.getFCP,c=t.getLCP,s=t.getTTFB;n(e),r(e),a(e),c(e),s(e)}))},Pr=n(212),Fr=(n(919),document.getElementById("root"));"production"===b.m&&Object(f.b)(),window.ethereum&&window.ethereum.autoRefreshOnNetworkChange&&(window.ethereum.autoRefreshOnNetworkChange=!1);var Lr=function(e){return new i.a({link:Object(u.concat)(Object(O.e)(e),new d.a({uri:function(e){var t=e.operationName;return"".concat(b.s,"?").concat(t)}})),cache:new l.a({typePolicies:{Adapter:{fields:{adapters:{merge:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1?arguments[1]:void 0;return[].concat(Object(r.a)(e),Object(r.a)(t))}}}},Extension:{fields:{extensions:{merge:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1?arguments[1]:void 0;return[].concat(Object(r.a)(e),Object(r.a)(t))}}}}}})})};null!==Fr&&Object(a.render)(Object(ue.jsx)(c.a,{store:ce,children:Object(ue.jsx)(s.a,{children:Object(ue.jsx)(Pr.b,{onBeforeDisconnect:function(){ce.dispatch(Object(j.w)()),ce.dispatch(Object(j.x)())},onBeforeConnect:function(){ce.dispatch(Object(j.x)())},providerOptions:b.J,children:Object(ue.jsx)(o.a,{client:Lr(ce),children:Object(ue.jsx)(kr,{render:function(e){var t=e.error,n=e.isInitComplete;return t?Object(ue.jsx)(_r,{renderMainContent:function(){return Object(ue.jsx)(Tr,{error:t})}}):n?Object(ue.jsx)(_r,{}):null}})})})})}),Fr),Rr()},96:function(e,t,n){"use strict";var r;n.d(t,"a",(function(){return r})),function(e){e.OK="OK",e.ERR="ERR"}(r||(r={}))}},[[923,4,5]]]); -//# sourceMappingURL=main.79313368.chunk.js.map \ No newline at end of file diff --git a/static/js/main.79313368.chunk.js.map b/static/js/main.79313368.chunk.js.map deleted file mode 100644 index 1bb93d9ca..000000000 --- a/static/js/main.79313368.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["components/web3/hooks/useWeb3Modal.ts","assets/svg/TimesSVG.tsx","config.ts","util/helpers/chooseRandom.ts","util/helpers/disableReactDevTools.ts","util/helpers/dontCloseWindowWarning.ts","util/helpers/formatDecimal.ts","util/helpers/formatNumber.ts","util/helpers/getTimeRemaining.ts","util/helpers/getValidationError.ts","util/helpers/normalizeString.ts","util/helpers/isPossibleContractWallet.ts","util/helpers/numberRangeArray.ts","util/helpers/stripFormatNumber.ts","components/proposals/voting/OffchainOpRollupVotingSubmitResultAction.tsx","components/proposals/voting/OffchainVotingAction.tsx","components/proposals/ProposalPeriodCountdown.tsx","assets/svg/StopwatchSVG.tsx","components/proposals/voting/VotingStatus.tsx","components/proposals/voting/OffchainVotingStatus.tsx","assets/svg/CheckSVG.tsx","components/proposals/voting/SquareRootVotingBar.tsx","components/proposals/voting/VotingActionButtons.tsx","components/web3/hooks/useContractSend.ts","components/web3/hooks/useETHGasPrice.ts","components/web3/hooks/useInitContracts.ts","components/web3/hooks/useIsDefaultChain.ts","components/web3/hooks/useMaybeContractWallet.ts","components/common/Modal.tsx","hooks/useRedeemCoupon.ts","components/adapters-extensions/enums.ts","store/connectedMember/actions.ts","store/connectModal/actions.ts","components/web3/hooks/useWeb3ModalManager.ts","store/contracts/actions.ts","util/helpers/truncateEthAddress.ts","components/web3/helpers/getExtensionAddress.ts","store/subgraphNetworkStatus/actions.ts","components/feedback/CycleEllipsis.tsx","components/proposals/SubmitAction.tsx","components/web3/Web3ModalManager.tsx","components/common/FadeIn.tsx","components/common/ErrorMessageWithDetails.tsx","components/web3/helpers/contractSend.ts","components/web3/helpers/getAdapterAddress.ts","components/web3/helpers/getAdapterAddressFromContracts.ts","components/web3/helpers/getDaoState.ts","components/web3/helpers/getContractByAddress.ts","components/web3/helpers/getDAOConfigEntry.ts","components/web3/helpers/getVotingAdapterName.ts","components/web3/helpers/hasFlag.ts","components/web3/helpers/multicall.ts","util/enums.ts","hooks/useAbortController.ts","hooks/useCounter.ts","hooks/useDao.ts","hooks/useDaoConfigurations.ts","hooks/useDaoTotalUnits.ts","hooks/useIsMounted.ts","hooks/useMemberActionDisabled.tsx","hooks/useMemberUnitsAtSnapshot.ts","hooks/useTimeStartEnd.ts","components/proposals/types.ts","components/feedback/Loader.tsx","components/proposals/voting/types.ts","components/web3/WalletIcon.tsx","components/proposals/hooks/useCheckApplicant.ts","components/proposals/hooks/useDaoProposals.ts","components/proposals/hooks/useOffchainVotingResults.ts","components/proposals/hooks/useProposalsVotingAdapter.ts","components/proposals/hooks/useProposalOrDraft.ts","components/proposals/hooks/useProposals.ts","components/proposals/hooks/useProposalsVotes.ts","components/proposals/hooks/useProposalsVotingState.ts","components/proposals/hooks/useProposalWithOffchainVoteStatus.ts","components/proposals/hooks/useSignAndSendVote.ts","components/proposals/hooks/useSignAndSubmitProposal.ts","components/web3/EtherscanURL.tsx","components/proposals/helpers/calculateVotingTimeRanges.ts","components/proposals/helpers/getOffchainVotingProof.ts","components/proposals/helpers/getVoteChosen.ts","components/proposals/helpers/getVotingAdapterABI.ts","components/proposals/helpers/proposalHasFlag.ts","components/proposals/helpers/proposalHasVotingState.ts","components/proposals/helpers/submitOffchainVotingProof.ts","util/constants.ts","components/web3/config.ts","components/feedback/index.ts","components/feedback/CycleMessage.tsx","components/web3/types.ts","components/feedback/LoaderLarge.tsx","util/validation.ts","util/types.ts","gql/queryDao.ts","gql/queryAdaptersAndExtensions.ts","gql/queryMembers.ts","gql/queryTokenHolderBalances.ts","gql/handleSubgraphError.ts","store/connectedMember/reducers.ts","store/connectModal/reducers.ts","store/contracts/reducers.ts","store/subgraphNetworkStatus/reducers.ts","store/reducers.ts","store/index.ts","assets/svg/DiscordSVG.tsx","components/common/SocialMedia.tsx","assets/svg/GitHubSVG.tsx","assets/svg/MediumSVG.tsx","components/Footer.tsx","GlobalConnectWalletModal.tsx","Head.tsx","components/logo/Logo.tsx","components/logo/index.tsx","assets/svg/HamburgerSVG.tsx","components/web3/Web3ModalButton.tsx","components/dao-token/hooks/useDaoTokenDetails.ts","components/dao-token/DaoTokenHolder.tsx","components/dao-token/hooks/useTokenHolderBalances.ts","components/Nav.tsx","components/Header.tsx","components/adapters-extensions/helpers.ts","components/adapters-extensions/config.ts","components/adapters-extensions/hooks/useAdaptersOrExtensions.ts","components/adapters-extensions/hooks/useValidation.ts","components/adapters-extensions/AdapterOrExtensionSelectTarget.tsx","components/common/InputError.tsx","components/adapters-extensions/ConfigurationForm.tsx","components/adapters-extensions/ConfigurationModal.tsx","components/common/Checkbox.tsx","components/adapters-extensions/FinalizeModal.tsx","components/adapters-extensions/AdapterOrExtensionManager.tsx","components/common/Wrap.tsx","components/adapters-extensions/hooks/useInitAdapterExtensionContracts.ts","pages/governance/CreateGovernanceProposal.tsx","components/common/PreviewInputMarkdown.tsx","pages/membership/CreateMembershipProposal.tsx","pages/transfers/CreateTransferProposal.tsx","pages/tributes/CreateTributeProposal.tsx","pages/start/GetStarted.tsx","components/governance/GovernanceActions.tsx","pages/subpages/NotFound.tsx","components/proposals/ProposalDetails.tsx","pages/governance/GovernanceProposalDetails.tsx","components/proposals/ProposalCard.tsx","components/governance/GovernanceProposalsList.tsx","components/governance/hooks/useGovernanceProposals.ts","pages/governance/GovernanceProposals.tsx","pages/members/hooks/useMembers.ts","pages/members/Delegation.tsx","assets/svg/CopySVG.tsx","assets/svg/WalletSVG.tsx","components/dao-token/DaoToken.tsx","assets/svg/UserSVG.tsx","pages/members/MemberProfile.tsx","pages/members/MemberCard.tsx","pages/members/Members.tsx","components/proposals/Proposals.tsx","pages/membership/Membership.tsx","components/proposals/ProcessActionMembership.tsx","components/proposals/ProposalActions.tsx","components/proposals/ProposalAmount.tsx","pages/membership/MembershipDetails.tsx","components/feedback/LoaderWithEmoji.tsx","pages/redeem/RedeemManager.tsx","pages/redeem/Redeem.tsx","components/proposals/PostProcessActionTransfer.tsx","pages/transfers/TransferDetails.tsx","pages/transfers/Transfers.tsx","components/proposals/ProcessActionTribute.tsx","pages/tributes/TributeDetails.tsx","pages/tributes/Tributes.tsx","Routes.tsx","Init.tsx","App.tsx","InitError.tsx","reportWebVitals.ts","index.tsx","store/subgraphNetworkStatus/types.ts"],"names":["useWeb3Modal","useContext","Web3ModalContext","TimesSVG","xmlns","viewBox","fill","d","dotenvConfig","path","resolve","__dirname","process","REACT_APP_DAO_REGISTRY_CONTRACT_ADDRESS","REACT_APP_DEFAULT_CHAIN_NAME_LOCAL","REACT_APP_ENVIRONMENT","REACT_APP_GRAPH_API_URL","REACT_APP_INFURA_PROJECT_ID_DEV","REACT_APP_INFURA_PROJECT_ID_LOCAL","REACT_APP_INFURA_PROJECT_ID_PROD","REACT_APP_MULTICALL_CONTRACT_ADDRESS","REACT_APP_SNAPSHOT_HUB_API_URL","REACT_APP_COUPON_API_URL","REACT_APP_SNAPSHOT_SPACE","ENVIRONMENT","SNAPSHOT_HUB_API_URL","COUPON_API_URL","GRAPH_API_URL","CHAINS","MAINNET","ROPSTEN","RINKEBY","GOERLI","KOVAN","GANACHE","CHAIN_NAME_FULL","DEFAULT_CHAIN","ETHERSCAN_URLS","INFURA_WS_URLS","INFURA_PROJECT_ID","ETHEREUM_PROVIDER_URL","WALLETCONNECT_PROVIDER_OPTIONS","injected","display","name","description","package","walletconnect","WalletConnectProvider","options","infuraId","qrcodeModalOptions","mobileLinks","isMobile","DAO_REGISTRY_CONTRACT_ADDRESS","DAO_FACTORY_CONTRACT_ADDRESS","BANK_FACTORY_CONTRACT_ADDRESS","VOTING_CONTRACT_ADDRESS","CONFIGURATION_CONTRACT_ADDRESS","RAGEQUIT_CONTRACT_ADDRESS","MANAGING_CONTRACT_ADDRESS","FINANCING_CONTRACT_ADDRESS","ONBOARDING_CONTRACT_ADDRESS","GUILDKICK_CONTRACT_ADDRESS","DAO_REGISTRY_ADAPTER_CONTRACT_ADDRESS","BANK_ADAPTER_CONTRACT_ADDRESS","NFT_ADAPTER_CONTRACT_ADDRESS","COUPONONBOARDING_CONTRACT_ADDRESS","TRIBUTE_CONTRACT_ADDRESS","DISTRIBUTE_CONTRACT_ADDRESS","TRIBUTE_NFT_CONTRACT_ADDRESS","OFFCHAINVOTING_CONTRACT_ADDRESS","MULTICALL_CONTRACT_ADDRESS","GUILD_ADDRESS","TOTAL_ADDRESS","UNITS_ADDRESS","MEMBER_COUNT_ADDRESS","ETH_TOKEN_ADDRESS","SPACE","GQL_QUERY_POLLING_INTERVAL","chooseRandom","array","doNotChooseItem","arrayToUse","undefined","filter","a","Math","floor","random","length","disableReactDevTools","noop","DEV_TOOLS","window","__REACT_DEVTOOLS_GLOBAL_HOOK__","Object","entries","key","value","dontCloseWindowWarning","callback","event","preventDefault","returnValue","addEventListener","removeEventListener","formatDecimal","n","toFixed","formatNumber","regEx","RegExp","toString","replace","DEFAULT_REMAINING","days","hours","minutes","seconds","total","getTimeRemaining","endTime","nowDate","Date","getTime","getValidationError","field","errors","message","normalizeString","stringToNormalize","toLowerCase","trim","isPossibleContractWallet","address","provider","getCode","bytecode","addressIsExernallyOwnedAccount","numberRangeArray","size","startAt","adjustedSize","Array","map","_","i","stripFormatNumber","OffchainOpRollupVotingSubmitResultAction","props","adapterName","proposal","daoProposalVotingAdapter","snapshotProposal","useState","Web3TxStatus","STANDBY","signatureStatus","setSignatureStatus","submitError","setSubmitError","bankExtensionAddress","useSelector","s","contracts","BankExtensionContract","contractAddress","bankExtensionMethods","instance","methods","getPriorAmountABI","abi","find","ai","daoRegistryAddress","DaoRegistryContract","getMemberAddressABI","account","web3Instance","useContractSend","txEtherscanURL","txIsPromptOpen","txSend","txStatus","useMemberActionDisabled","isDisabled","openWhyDisabledModal","WhyDisabledModal","fastGasPrice","useETHGasPrice","fast","votingAdapterMethods","getWeb3VotingAdapterContract","isInProcess","AWAITING_CONFIRM","PENDING","isDone","FULFILLED","isInProcessOrDone","Error","votes","proposalHash","idInDAO","snapshot","msg","payload","adapterAddress","getAdapterAddressFromContracts","getPriorAmount","call","numberOfDAOMembersAtSnapshot","getMemberAddressCalls","Number","memberIndex","multicall","calls","memberAddresses","memberBalanceCalls","m","memberBalancesAtSnapshot","memberAddress","voteData","values","v","metadata","createVote","proposalId","sig","timestamp","voteYes","choice","VoteChoicesIndex","Yes","weight","prepareVoteResult","actionId","chainId","daoAddress","voteResultTree","result","voteResultTreeHexRoot","getHexRoot","resultNodeLast","getBadNodeError","getBadNodeErrorResponse","BadNodeError","OK","getVoteResultRootDomainDefinition","domain","types","messageParams","JSON","stringify","root","primaryType","PRIMARY_TYPE_ERC712","signMessage","signature","getOffchainVotingProof","merkle_root","submitOffchainVotingProof","steps","merkleRoot","verifyingContract","submitVoteResultArguments","txArguments","from","gasPrice","REJECTED","className","disabled","onClick","Loader","ErrorMessageWithDetails","error","renderText","CycleMessage","intervalMs","messages","TX_CYCLE_MESSAGES","useFirstItemStart","render","FadeIn","EtherscanURL","url","isPending","renderSubmitStatus","title","AsyncStatus","OffchainVotingAction","refetchProposalOrDraft","voteChoiceClicked","setVoteChoiceClicked","votingDisabledReasonsRef","useRef","addressIsDelegatedMessage","alreadyVotedMessage","fetchingMembershipAtSnapshotMessage","noMembershipAtSnapshotMessage","undeterminedMembershipAtSnapshotMessage","delegateAddress","connectedMember","delegateKey","isAddressDelegated","useSignAndSendVote","signAndSendVote","voteDataStatus","voteChosen","getVoteChosen","setOtherDisabledReasons","useMemberUnitsAtSnapshot","hasMembershipAtSnapshot","memberUnitsAtSnapshotError","memberUnitsAtSnapshotStatus","snapshotProposalId","idInSnapshot","isSubmitDisabled","voteChoiceProgress","VoteChoices","partialVoteData","proposalIdInDAO","proposalIdInSnapshot","setDisabledReasonHelper","current","useEffect","truncateEthAddress","VotingActionButtons","buttonProps","voteProgress","displayCountdown","countdownFrom","renderCountdownText","showDaysOnly","renderedCountdownText","formatTimePeriod","format","time","period","formattedPeriod","ProposalPeriodCountdown","endedLabel","endLabel","endPeriodMs","startLabel","startPeriodMs","currentDate","setCurrentDate","startDate","endDate","interval","setInterval","clearInterval","StopwatchSVG","width","height","version","id","stroke","strokeWidth","fillRule","xlinkHref","VotingStatus","hasVotingEnded","noUnits","renderStatus","renderTimer","showPercentages","totalUnits","yesUnits","renderedStatus","role","SquareRootVotingBar","votingExpired","gracePeriodLabel","cycleEllipsisFadeInProps","duration","OffchainVotingStatus","countdownGracePeriodEndMs","countdownGracePeriodStartMs","countdownVotingEndMs","countdownVotingStartMs","onGracePeriodChange","onVotingPeriodChange","votingResult","useTimeStartEnd","hasTimeEnded","hasVotingStarted","hasTimeStarted","votingStartEndInitReady","timeStartEndInitReady","hasGracePeriodEnded","hasGracePeriodStarted","gracePeriodStartEndInitReady","isGracePeriodActive","No","units","didVotePassSimpleMajority","renderedStatusFromProp","ariaLabel","fadeInProps","ProposalPeriodComponent","CheckSVG","xmlnsXlink","getUnitsPercent","percentYes","percentNo","style","getButtonARIALabel","getButtonText","handleClick","renderVotedCheck","txError","setTxError","setTxEtherscanURL","setTxIsPromptOpen","txReceipt","setTxReceipt","setTxStatus","networkId","handleOnTxProcess","txHash","unsubscribeDontCloseWindow","contractSendParams","contractSend","receipt","convertGasToWEI","gasStationPrice","toWei","BigNumber","INITIAL_GAS_PRICES","average","fastest","safeLow","ignoreEnvironment","gasPrices","setGasPrices","gasPriceError","setGasPriceError","gasPriceStatus","setGasPriceStatus","useAbortController","abortController","isMountedRef","shouldExitIfNotProduction","signal","fetch","then","response","ok","json","jsonResponse","catch","abort","useInitContracts","dispatch","useDispatch","initContractDaoRegistry","initContractDaoFactory","initContractBankFactory","initContractConfiguration","initContractFinancing","initContractGuildKick","initContractManaging","initContractRagequit","initContractBankAdapter","initContractBankExtension","initContractOnboarding","initContractTribute","initContractDistribute","initRegisteredVotingAdapter","initContractTributeNFT","initContractNFTExtension","initContractNFTAdapter","initContractCouponOnboarding","initContractDaoRegistryAdapter","initContractERC20Extension","useCallback","useIsDefaultChain","connected","defaultChainError","setDefaultChainError","defaultChain","isDefaultChain","INITIAL_MAYBE_CONTRACT_WALLET_STATE","useMaybeContractWallet","web3Provider","maybeContractWallet","setMaybeContractWallet","useIsMounted","handleIsPossibleContractWalletCached","Web3Provider","Modal","children","isOpen","isOpenHandler","keyProp","modalClassNames","styleProps","ariaHideApp","onRequestClose","overlayClassName","overlay","zIndex","FetchStatus","useRedeemCoupon","daoRegistryContract","couponOnboardingContract","CouponOnboardingContract","submitStatus","setSubmitStatus","redeemableCoupon","erc20Details","applicantAddressToChecksum","toChecksumAddress","recipient","redeemCouponArguments","String","amount","nonce","method","body","headers","getConnectedMember","addTokenToWallet","ethereum","request","params","type","console","log","redeemCoupon","DaoAdapterConstants","DaoExtensionConstants","VotingAdapterName","SET_CONNECTED_MEMBER","CLEAR_CONNECTED_MEMBER","daoRegistryMethods","getAddressIfDelegatedABI","membersABI","isActiveMemberABI","getCurrentDelegateKeyABI","clearConnectedMember","addressIfDelegated","memberFlag","isActiveMember","currentDelegateKey","doesMemberExist","hasFlag","MemberFlag","EXISTS","BURN_ADDRESS","CONNECT_MODAL_CLOSE","CONNECT_MODAL_OPEN","connectModalClose","connectModalOpen","DefaultTheme","ActionType","Web3ModalErrorType","INITIAL_STATE","reducer","state","CONNECT_WEB3MODAL","DEACTIVATE_PROVIDER_WEB3MODAL","ERROR_WEB3MODAL","INITIAL_CACHED_CONNECTOR_CHECK_STATUS","initialCachedConnectorCheckStatus","NEW_WEB3MODAL","web3Modal","UPDATE_ACCOUNT","useWeb3ModalManager","defaultTheme","onBeforeConnect","onBeforeDisconnect","providerOptions","useReducer","web3ModalTheme","web3ModalChain","connectWeb3ModalCached","connectWeb3Modal","chainChangedCallbackCached","_chainIdHex","cachedProvider","accountsChangedCallback","connectorId","connectCallback","statusAction","connectTo","Web3","eth","getAccounts","net","getId","CONNECT","close","clearCachedProvider","DISCONNECT","on","removeListener","Web3Modal","cacheProvider","network","NetworkNames","NetworkIDs","theme","attemptUpdateFromCachedConnector","disconnectWeb3Modal","CLEAR_CONTRACTS","CONTRACT_BANK_ADAPTER","CONTRACT_BANK_EXTENSION","CONTRACT_BANK_FACTORY","CONTRACT_CONFIGURATION","CONTRACT_COUPON_ONBOARDING","CONTRACT_DAO_FACTORY","CONTRACT_DAO_REGISTRY","CONTRACT_DAO_REGISTRY_ADAPTER","CONTRACT_DISTRIBUTE","CONTRACT_ERC20_EXTENSION","CONTRACT_FINANCING","CONTRACT_GUILDKICK","CONTRACT_MANAGING","CONTRACT_NFT_ADAPTER","CONTRACT_NFT_EXTENSION","CONTRACT_ONBOARDING","CONTRACT_RAGEQUIT","CONTRACT_TRIBUTE","CONTRACT_TRIBUTE_NFT","CONTRACT_VOTING","CONTRACT_VOTING_OP_ROLLUP","clearContracts","lazyBankFactoryABI","default","bankFactoryContract","Contract","createContractAction","lazyDaoFactoryABI","daoFactoryContract","lazyDaoRegistryABI","initContractVoting","initContractThunkFactory","actionType","adapterOrExtensionName","ContractAdapterNames","voting","adapterNameForRedux","VotingContract","lazyImport","initContractVotingOpRollup","OffchainVotingContract","ONBOARDING","onboarding","BANK","ContractExtensionNames","bank","isExtension","TRIBUTE","tribute","DISTRIBUTE","distribute","MANAGING","managing","NFT","nft","DAO_REGISTRY","dao_registry","RAGEQUIT","ragequit","GUILDKICK","guildkick","FINANCING","financing","CONFIGURATION","configuration","TRIBUTE_NFT","tribute_nft","COUPON_ONBOARDING","coupon_onboarding","ERC20","erc20","getState","warn","votingAdapterName","getVotingAdapterName","getAdapterAddress","lazyABI","contractABI","getExtensionAddress","addr","maxLength","isEthAddressValid","firstSegment","substring","secondPart","extensionName","daoContractInstance","utils","sha3","SET_SUBGRAPH_NETWORK_STATUS","setSubgraphNetworkStatus","MESSAGES","rootStyles","position","nbspStyles","CycleEllipsis","fadeInPropsMerged","inline","upToIndex","setUpToIndex","intervalId","prevIndex","WEB3_TX_FULFILLED","defaultChoices","VOTE_CHOICES","SubmitAction","checkApplicant","snapshotDraft","choices","proposalChoices","proposalName","proposalBody","start","proposalStart","end","proposalEnd","proposalSnapshot","proposalTimestamp","proposalSig","snapshotProposalSubmitted","setSnapshotProposalSubmitted","proposalDataForDaoRef","space","actionDisabledReasonsRef","invalidApplicantMessage","useSignAndSubmitProposal","proposalSignAndSendStatus","signAndSendProposal","useCheckApplicant","checkApplicantError","checkApplicantInvalidMsg","checkApplicantStatus","isApplicantValid","contract","getContractByAddress","idForDAO","submitActionArgs","draftName","draftBody","draftMetadata","draftTimestamp","partialProposalData","SnapshotType","data","preparedVoteVerificationBytes","prepareVoteProposalData","parseInt","submitArguments","createContext","Web3ModalManager","DARK","defaultWeb3InstanceRef","providers","WebsocketProvider","defaultWeb3NetID","setDefaultWeb3NetID","web3ModalProviderArguments","currentProvider","web3ModalContext","Provider","defaultStyle","transition","opacity","transitionStyles","entering","entered","exiting","exited","appear","in","show","timeout","isExpanded","setIsExpanded","isWalletRejectedRequest","code","test","textToDisplay","areErrorMessageAndTextStringSame","detailsProps","cursor","outline","methodName","contractInstanceMethods","methodArguments","onProcess","Promise","reject","BN","estimateGas","gas","gastoBN","decimalPlaces","ROUND_DOWN","toNumber","send","getContractAddressOrThrow","DistributeContract","ManagingContract","OnboardingContract","TributeContract","TributeNFTContract","DaoState","c","getDAOConfigEntry","configKey","getConfiguration","getDaoState","CREATION","READY","lazyIVotingABI","getAdapterName","flagToCheck","daoProposalFlag","log2","blockNumber","lazyMulticallABI","multicallMethods","aggregate","encodeFunctionCall","returnData","hexString","outputsABIItem","outputs","decodedOutputs","decodeParameters","__length__","FormFieldErrors","ProposalHeaderNames","setAbortController","AbortController","initialState","count","action","useCounter","useDao","useLazyQuery","GET_DAO","variables","getDao","called","loading","dao","setDao","gqlError","setGqlError","getDaoRegistryCallback","tributeDaos","INITIAL_CONFIG_ENTRIES","useDaoConfigurations","configKeys","daoRegistryABI","daoConfigurations","setDaoConfigurations","daoConfigurationsStatus","setDaoConfigurationsStatus","daoConfigurationsError","setDaoConfigurationsError","getConfigurationABI","ck","handleGetConfigurations","useDaoTotalUnits","subgraphNetworkStatus","status","getDaoFromSubgraphResult","setTotalUnits","totalUnitsStatus","setTotalUnitsStatus","totalUnitsError","setTotalUnitsError","getTotalUnitsFromExtensionCached","getTotalUnitsFromSubgraphCached","balanceOf","SubgraphNetworkStatus","skipIsActiveMemberCheck","otherDisabledReasons","shouldShowWhyModal","setShouldShowWhyModal","otherReasonNext","r","disabledReason","getDisabledReason","canShowDisabledReason","WhyDisabledModalCached","handleSetOtherDisabledReasonsCached","otherReasons","Boolean","DEFAULT_POLL_INTERVAL_MS","pollUntilBlockInPast","block","blockOffset","pollInterval","blockOffsetCheck","currentBlock","abs","getBlockNumber","blockCheckOffset","currentBlockPollIntervalMs","memberUnitsAtSnapshot","setMemberUnitsAtSnapshot","setHasMembershipAtSnapshot","setMemberUnitsAtSnapshotError","setMemberUnitsAtSnapshotStatus","handleGetPriorUnitsAmountCached","isGreaterThan","areAllAsyncReady","asyncMapping","every","startSeconds","endSeconds","startEndStatusRef","setHasTimeStarted","setHasTimeEnded","setTimeStartEndInitReady","shouldNotCheck","intervalID","hasStartedCheck","now","hasEndedCheck","ceil","ProposalFlag","ProposalFlowStatus","DistributionStatus","SnapshotMetadataType","Spinner","showAfterMs","text","textProps","loaderProps","showLoaderAfterMs","setShowLoaderAfterMs","timeoutId","setTimeout","clearTimeout","VotingState","MetaMaskSVG","lazy","WalletConnectSVG","walletIconMap","WalletIcon","providerName","fallback","setCheckApplicantError","setCheckApplicantInvalidMsg","setCheckApplicantStatus","setIsApplicantValid","prevAddress","usePreviousDistinct","checkApplicantValidityCached","truncatedAddress","getIsNotReservedAddressABI","item","isNotReservedAddressCall","getIsNotZeroAddressABI","isNotZeroAddressCall","getGetAddressIfDelegatedABI","isNotReservedAddressResult","isNotZeroAddressResult","getAddressIfDelegatedResult","INITIAL_DAO_PROPOSAL_ENTRIES","useDaoProposals","proposalIds","proposalsAbi","registryAddress","daoProposals","setDaoProposals","daoProposalsStatus","setDaoProposalsStatus","daoProposalsError","setDaoProposalsError","safeProposalIds","isHexStrict","proposals","handleGetDaoProposals","useOffchainVotingResults","bankABI","bankAddress","votingResults","setVotingResults","offchainVotingResultsStatus","setOffchainVotingResultsStatus","offchainVotingResultsError","setOffchainVotingResultsError","getUnitsPerChoiceCached","voterAddressesAndChoices","percentage","results","totalUnitsCall","unitsCalls","totalUnitsResult","forEach","proposalsToMap","isArray","votingResultPromises","p","voterEntries","vote","keys","fromEntries","all","offchainVotingResults","INITIAL_VOTING_ADAPTERS","useProposalsVotingAdapter","registryABI","proposalsVotingAdapters","setProposalsVotingAdapters","proposalsVotingAdaptersError","setProposalsVotingAdaptersError","proposalsVotingAdaptersStatus","setProposalsVotingAdaptersStatus","getProposalsVotingAdaptersOnchainCached","votingAdapterABI","votingAdapterCalls","votingAdapterAddressResults","getAdapterNameABI","filteredProposalIds","_id","filteredVotingAdapterAddressResults","votingAdapterNameCalls","votingAdapterAddress","adapterNameResults","getVotingAdapterABI","votingAdaptersToSet","ERROR_PROPOSAL","ERROR_PROPOSAL_NOT_FOUND","useProposalOrDraft","daoProposal","setSnapshotDraft","setSnapshotProposal","proposalNotFound","setProposalNotFound","proposalError","setProposalError","proposalStatus","setProposalStatus","proposalVotingAdapterId","setProposalVotingAdapterId","proposalInclusiveStatus","setProposalInclusiveStatus","proposalInclusiveError","setProposalInclusiveError","refetchCount","updateRefetchCount","handleGetDraftCached","handleGetProposalCached","handleGetProposalOrDraftCached","snapshotType","draft","proposalData","getCommonSnapshotProposalData","responseJSON","idKey","erc712DraftHash","statuses","some","e","INITIAL_ARRAY","getSnapshotDraftsByAdapterAddress","baseURL","drafts","draftsJSON","draftEntries","sponsored","getSnapshotProposalsByAdapterAddress","proposalsJSON","proposalEntries","useProposals","includeProposalsExistingOnlyOffchain","setAdapterAddress","snapshotDraftAndProposals","setSnapshotDraftAndProposals","snapshotDraftAndProposalsStatus","setSnapshotDraftAndProposalsStatus","snapshotDraftAndProposalsError","setSnapshotDraftAndProposalsError","daoProposalIdsToUse","setDaoProposalIdsToUse","setProposals","proposalsInclusiveStatus","setProposalsInclusiveStatus","proposalsInclusiveError","setProposalsInclusiveError","useMemo","useProposalsVotingState","proposalsVotingState","proposalsVotingStateError","proposalsVotingStateStatus","proposalVotingAdapters","proposalsVotes","setProposalsVotes","proposalsVotesError","setProposalsVotesError","proposalsVotesStatus","setProposalsVotesStatus","getProposalsVotesOnchainCached","safeProposalVotingAdapters","getVotesDataABI","votesDataCalls","votesDataResults","offchainVotesDataABI","votingVotesDataABI","useProposalsVotes","snapshotDraftEntries","snapshotProposalEntries","mergedEntries","handleGetAllSnapshotDraftsAndProposals","flags","proposalsToSet","daoProposalId","snapshotId","snapshotDataId","snapshotData","isSnapshotDraft","proposalIdVotingAdapter","daoProposalVotingState","proposalIdVotingState","daoProposalVote","proposalIdVotes","proposalsError","proposalsStatus","setProposaslsVotingState","setProposalsVotingStateError","setProposalsVotingStateStatus","getProposalsVotingStateOnchainCached","votingResultAbi","proposalsVotingStateResult","Completed","OffchainVotingGracePeriod","OffchainVotingSubmitResult","OffchainVoting","Process","Sponsor","Submit","useProposalWithOffchainVoteStatus","countdownVotingEndSeconds","countdownVotingStartSeconds","useCountdownToCheckInVoting","setStatus","initComplete","setInitComplete","setDAOProposal","setDAOProposalVote","daoProposalVoteResult","setDAOProposalVoteResult","proposalFlowStatusError","setProposalFlowStatusError","pollingIntervalIdRef","stopPollingRef","initialAsyncChecksCompleted","atExistsInDAO","proposalHasFlag","atSponsoredInDAO","SPONSORED","atProcessedInDAO","PROCESSED","offchainVotingAddress","offchainVotingABI","offchainResultSubmitted","isAddress","reporter","isInVoting","IN_PROGRESS","isInVotingGracePeriod","GRACE_PERIOD","getStatusFromContractCached","proposalsABI","voteResultABI","voteABI","voteResult","handleStopPollingForStatus","isStatusInitial","stopPollingForStatus","setVoteData","voteDataError","setVoteDataError","setVoteDataStatus","getSpace","snapshotSpace","voteProposalData","token","buildVoteMessage","erc712Message","prepareVoteMessage","getDomainDefinition","dataToSign","submitMessage","dataToReturn","uniqueId","daoRegistryInstance","setProposalData","proposalSignAndSendError","setProposalSignAndSendError","setProposalSignAndSendStatus","buildProposalMessageHelper","commonData","ContractDAOConfigKeys","offchainVotingVotingPeriod","votingTimeSeconds","buildProposalMessage","buildDraftMessage","prepareDraftMessage","prepareProposalMessage","uniqueIdDraft","href","rel","target","calculateVotingTimeRanges","gracePeriodLength","gracePeriodStartingTime","votePeriodLength","voteStartingTime","MS_MULTIPLIER","gracePeriodStartMs","voteStartMs","voteEndMs","gracePeriodEndMs","merkleRootHex","voteEntry","ve","lazyOffchainVotingABI","lazyVotingABI","proposalHasVotingState","votingStateToCheck","votingState","INITIAL_ITEM","activeMessage","setActiveMessage","prevMessage","LoaderLarge","ethAddress","gql","GET_ADAPTERS_AND_EXTENSIONS","GET_MEMBERS","GET_TOKEN_HOLDER_BALANCES","handleSubgraphError","store","onError","networkError","ERR","setConnectedMemberReducer","clearConnectedMemberReducer","BankAdapterContract","BankFactoryContract","ConfigurationContract","DaoFactoryContract","DaoRegistryAdapterContract","ERC20ExtensionContract","FinancingContract","GuildBankContract","NFTAdapterContract","NFTExtensionContract","RagequitContract","contractBankFactory","contractDAOFactory","contractDAORegistry","contractDaoRegistryAdapter","contractBankExtension","contractConfiguration","contractDistribute","contractFinancing","contractGuildBank","contractOnboarding","contractRagequit","contractTribute","contractVoting","contractManaging","contractBankAdapter","contractNFTAdapter","contractTributeNFT","contractCouponOnboarding","contractNFTExtension","contractERC20Extension","combineReducers","connectModal","createStore","rootReducer","composeWithDevTools","applyMiddleware","thunk","DiscordSVG","transform","SocialMediaLinks","GitHubSVG","React","Component","MediumSVG","SocialMedia","MEDIUM","DISCORD","GITHUB","Footer","ConnectWalletModal","GlobalConnectWalletModal","isConnectModalOpen","modalProps","setModalProps","pathname","useLocation","prevState","Head","Helmet","content","Logo","ModalLogo","LeftLogo","CenterLogo","HamburgerSVG","ConnectWalletButton","customWalletText","showWalletETHBadge","isWrongNetwork","useDaoTokenDetails","daoTokenDetails","setDaoTokenDetails","daoTokenDetailsStatus","setDaoTokenDetailsStatus","daoTokenDetailsError","setDaoTokenDetailsError","getDaoTokenDetailsCached","symbol","decimals","image","location","origin","DaoTokenHolder","customStyles","badgeStyles","tokenHolder","setTokenHolder","tokenImageUrl","setTokenImageURL","tokenEtherscanURL","setTokenEtherscanURL","tokenHolderBalances","erc20ExtensionContract","tokenAddress","getTokenHolderBalances","startPolling","stopPolling","setTokenHolderBalances","getTokenBalanceCallback","tokens","pollingTimeoutId","useTokenHolderBalances","getTokenImageCallback","blob","reader","FileReader","onloadend","onerror","readAsDataURL","dataUrl","holders","holderData","holder","member","balance","src","alt","transitionOpeningStyles","right","transitionClosingStyles","NavLinks","tabIndex","to","NavHamburger","shouldShowMenuModal","setShouldShowMenuModal","setTransitionStyles","closeMenuRef","isCurrentMemberOrDelegateConnected","isCurrentMemberConnected","handleMenuModalClose","Transition","Nav","query","_matches","border","Header","RenderLogo","getAdapterOrExtensionId","getAccessControlLayer","acl","accessFlags","SUBMIT_PROPOSAL","PROCESS_PROPOSAL","SPONSOR_PROPOSAL","SET_CONFIGURATION","INTERNAL_TRANSFER","EXECUTION","NEW_MEMBER","ADD_TO_BALANCE","REGISTER_NEW_TOKEN","SUB_FROM_BALANCE","JAIL_MEMBER","UNJAIL_MEMBER","REMOVE_ADAPTER","ADD_ADAPTER","OFFCHAINVOTING","UPDATE_DELEGATE_KEY","NONVOTING_ONBOARDING","VOTING","WITHDRAW","UPDATE_TOKEN","COLLECT_NFT","WITHDRAW_NFT","ADAPTER_ACCESS_FLAGS","ADD_EXTENSION","REMOVE_EXTENSION","EXTENSION_ACCESS_FLAGS","TRANSFER_NFT","idx","reduce","b","entry","defaultAdaptersAndExtensions","adapterId","abiFunctionName","displayName","setAclToExtensionForAdapter","optionDefaultTarget","useAdaptersOrExtensions","adapterExtensionContracts","getRegisteredAdaptersAndExtensions","registeredAdaptersOrExtensions","setRegisteredAdaptersOrExtensions","unRegisteredAdaptersOrExtensions","setUnRegisteredAdaptersOrExtensions","adapterExtensionStatus","setAdapterExtensionStatus","getAdaptersAndExtensionsCached","registeredDaoAdapters","registeredDaoExtensions","registeredList","unRegisteredList","getAdapterFromGql","adapter","getExtensionFromGql","extensionId","extension","adapterOrExtension","gqlExtension","push","maybeSomeAdapters","maybeSomeExtensions","shouldSkip","option","gqlAdapter","adapters","extensions","getAdapterOrExtensionFromRedux","ae","ParamType","useValidation","isParamInputValid","paramInput","paramType","parameter","ADDRESS","checkAddressChecksum","isAddressValid","BYTES32","isHex","isBytes32Valid","BYTES32_ARRAY","split","isBytes32ArrayValid","UINT256","isNaN","isUint256Valid","UINT256_ARRAY","isUint256ArrayValid","getFormFieldError","INVALID_ETHEREUM_ADDRESS","INVALID_BYTES32","INVALID_BYTES32_ARRAY","INVALID_NUMBER","INVALID_NUMBER_ARRAY","REQUIRED","formatInputByType","inputValue","inputType","AdapterExtensionSelectTarget","defaultTarget","renderActions","renderCheckboxAction","selectedTargetOption","setSelectedTargetOption","selectedTargetOptionProps","setSelectedTargetOptionProps","onChange","selectedTargetProps","selectedOption","toUpperCase","renderDescription","InputError","restProps","ConfigurationForm","abiConfigurationInputs","abiMethodName","closeHandler","configureAdapterStatus","setConfigureAdapterStatus","removeStatus","setRemoveStatus","form","useForm","mode","reValidateMode","formState","getValues","setValue","register","trigger","configureAdapterError","isConnected","adapterOrExtensionText","isValid","isConfigureInProcess","isRemoveInProcess","isConfigureDone","isRemoveDone","isConfigureInProcessOrDone","isRemoveInProcessOrDone","removeExtensionArgument","removeAdapterArguments","adapterConfigArguments","abiInput","formattedValue","onSubmit","input","placeholder","ref","validate","handleSubmit","handleRemove","ConfigurationModal","configurationInputs","CheckboxSize","Checkbox","checked","htmlFor","SMALL","label","FinalizeModal","finalizeError","finalizeDao","WhyDisableModalTitles","Wrap","rest","AdapterOrExtensionManager","setABIMethodName","daoState","setDaoState","setIsDone","inputParameters","setInputParameters","openConfigureModal","setOpenConfigureModal","openFinalizeModal","setOpenFinalizeModal","selectAll","setSelectAll","selectionCount","setSelectionCount","selections","setSelections","configureAdapterOrExtension","setConfigureAdapterOrExtension","setIsInProcess","whyDisabledReason","setWhyDisabledReason","initAdapterExtensionContract","adapterExtensionName","useInitAdapterExtensionContracts","isDAOExisting","isDAOReady","isUnavailable","isLoading","nothingToAdd","checkDaoStateCached","finalizedMessage","daoRegistryState","handleAddAdapter","addAdapterOrExtension","handleAddExtension","adapterOrExtensionAddress","adapterOrExtensionType","adapterOrExtensionId","addAdapterOrExtensionArguments","txSendMethod","errorMessage","adaptersArguments","adapterContractAddress","contractAddressFromRedux","addAdaptersArguments","checkboxesSelection","inputs","RenderWrapper","scrollTo","top","left","behavior","LARGE","handleSelectTargetChange","handleConfigure","CONFIGURATION_REASON","FINALIZED_REASON","Fields","PreviewInputMarkdown","marginTop","CreateGovernanceProposal","history","useHistory","watch","Governance","required","CreateMembershipProposal","userAccountBalance","setUserAccountBalance","ethAddressValue","createMemberError","getUserAccountBalanceCached","getBalance","accountBalanceInWei","fromWei","ethAmount","ethAddressToChecksum","ethAmountInWei","proposerAddressToChecksum","proposalAmountValues","tributeAmount","tributeAmountUnit","accountAuthorizedToProcessPassedProposal","isInteger","CreateTransferProposal","daoTokens","setDaoTokens","selectedTokenBalance","setSelectedTokenBalance","isTypeAllMembers","selectedTokenValue","createTransferError","erc20ABI","ERC20ABI","getDaoTokensCached","getSelectedTokenBalanceCached","bankMethods","nbTokens","parsedAndSortedTokens","getTokenABI","getTokenCalls","index","fetchedTokens","balanceOfABI","getDaoTokenBalanceCalls","daoTokenBalances","tokensArray","daoBalance","tokenObj","toBN","gt","ethToken","erc20Tokens","nameABI","nameCalls","symbolABI","symbolCalls","decimalsABI","decimalsCalls","erc20DetailsCalls","chunkedResults","splice","names","symbols","parsedAndSortedERC20Tokens","sort","localeCompare","selectedTokenObj","parse","balanceBN","divisor","pow","beforeDecimal","div","afterDecimal","mod","balanceReadable","eq","selectedToken","notes","memberAddressToChecksum","amountArg","multiplier","amountWithDecimals","mul","bodyIntro","transferAmount","transferAmountUnit","returnSignature","memberAddressArg","transferArguments","isActiveMemberWithUnits","unitsBalance","amountToNumber","isSelectedTokenEth","CreateTributeProposal","userERC20Balance","setUserERC20Balance","setERC20Details","erc20Contract","setERC20Contract","erc20AddressValue","erc20Address","applicantAddressValue","applicantAddress","createTributeError","getERC20ContractCached","getERC20DetailsCached","getUserERC20BalanceCached","lazyERC20ABI","getRequestAmountUnit","requestAmount","tributeAmountWithDecimals","requestAmountArg","requestAmountUnit","TributeCube","memo","GetStartedHeader","GetStarted","AOS","init","offset","delay","mirror","once","GovernanceActions","votingStartMs","votingEndMs","votingPeriodData","setVotingPeriodData","handleOnVotingPeriodChangeCached","votingPeriodProps","NotFound","textAlign","fontSize","ProposalDetails","renderAmountBadge","GovernanceProposalDetails","useParams","DEFAULT_BUTTON_TEXT","ResponsiveEllipsis","responsiveHOC","LinesEllipsis","ProposalCard","buttonText","proposalOnClickId","linkPath","maxLine","ellipsis","trimRight","basedOn","renderName","GovernanceProposalsList","onProposalClick","proposalLinkPath","renderProposalCard","proposalsForVotingResults","setProposalsForVotingResults","failedProposals","passedProposals","votingProposals","filteredProposals","setFilteredProposals","governanceProposals","setGovernanceProposals","governanceProposalsError","setGovernanceProposalsError","governanceProposalsStatus","setGovernanceProposalsStatus","handleGetProposalsCached","getSnapshotProposalsByActionId","useGovernanceProposals","renderProposalCards","offchainResult","gp","filteredProposalsToSet","didPassSimpleMajority","flatMap","PASSED","FAILED","GovernanceProposals","useMembers","getMembersFromSubgraphResult","members","setMembers","membersStatus","setMembersStatus","membersError","setMembersError","getMembersFromRegistryCached","getMembersFromSubgraphCached","filteredMembersWithDetails","didFullyRagequit","createdAt","parsedMember","getNbMembers","nbMembers","memberAddressesByDelegatedKeyABI","memberAddressesByDelegatedKeyCalls","memberAddressesByDelegatedKey","unitsBalanceOfCalls","unitsBalances","membersWithDetails","isDelegated","reverse","DelegationStatus","DelegationStep","CopySVG","focusable","ArrowsSVG","DaoToken","copyText","document","createElement","appendChild","setAttribute","select","execCommand","removeChild","getElementById","innerHTML","onMouseLeave","UserSVG","DelegationModal","currentStep","daoRegistryAdapterContract","delegateError","delegateAddressValue","confirmDelegationValue","confirmDelegation","isFormFieldEmpty","setDelegation","includes","handleConfirmDelegation","revokeDelegation","handleRevokeDelegation","updateDelegateKeyArguments","parsedError","Delegation","SET_DELEGATION","setCurrentStep","delegationStatus","setDelegationStatus","showDelegationModal","setShowDelegationModal","fetchDelegationInfoCached","REVOKE_DELEGATION","DELEGATE_VOTES","MemberProfile","ethereumAddress","memberDetails","setMemberDetails","memberNotFound","setMemberNotFound","activeMember","isLoadingDone","votingWeight","renderMemberInfo","MemberCard","Members","renderMemberCards","configurationKeysToGet","offchainVotingGracePeriod","Proposals","nonsponsoredProposals","offchainVotingPeriod","offchainGracePeriod","startingTime","times","voteState","votesData","noSnapshotVotes","offchainResultNotYetSubmitted","TIE","PASS","NOT_PASS","REQUESTS","Membership","useMemberActionDisabledProps","ProcessActionMembership","propsDisabled","membershipProposalAmount","setMembershipProposalAmount","notProposerMessage","areSomeDisabled","getMembershipProposalAmountCached","proposalDetails","processArguments","ProposalWithOffchainVoteActions","cycleEllipsisStyles","ProposalActions","renderAction","daoVotingAdapterName","ProposalAmount","amountUnit","amount2","amount2Unit","MembershipDetails","applicant","LoaderWithEmoji","emoji","RedeemManager","redeemables","RedeemCard","redeemable","isRedeemd","margin","RedeemCoupon","setReedemableCoupon","couponStatus","setCouponStatus","coupon","URLSearchParams","search","get","checkBySigOrAddrCached","coupons","PostProcessActionTransfer","alreadyCompletedMessage","toIndexArg","distributeArguments","distributions","distributeProposal","getActionDisabledReasons","TransferDetails","Transfers","ProcessActionTribute","tributeProposalDetails","setTributeProposalDetails","txEtherscanURLTokenApprove","txIsPromptOpenTokenApprove","txSendTokenApprove","txStatusTokenApprove","getTributeProposalDetailsCached","handleSubmitTokenApprove","erc20Instance","allowance","tributeAmountBN","allowanceBN","difference","sub","approveValue","add","tokenApproveArguments","PLACEHOLDER","TributeDetails","Tributes","ProcessName","proposalIdParameter","Routes","exact","component","App","renderMainContent","mainContent","Init","setError","isInitComplete","setIsInitComplete","initSnapshotAPI","processReadyMap","setProcessReadyMap","initContracts","handleInitContractsCached","handleGetMemberCached","handleGetSnapshotAPIStatusCached","getSnapshotAPIStatus","fs","InitError","padding","maxWidth","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","autoRefreshOnNetworkChange","getApolloClient","ApolloClient","link","concat","HttpLink","uri","operationName","cache","InMemoryCache","typePolicies","Adapter","fields","merge","existing","incoming","Extension","ApolloProvider","client"],"mappings":"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","file":"static/js/main.79313368.chunk.js","sourcesContent":["import {useContext} from 'react';\n\nimport {Web3ModalContextValue, Web3ModalContext} from '../Web3ModalManager';\n\n/**\n * useWeb3Modal(): Web3ModalContextValue\n *\n * Internal hook to access wallet connectivity and connected state.\n *\n * @example\n * const {account, connected, networkId, ...} = useWeb3Modal();\n */\nexport function useWeb3Modal(): Web3ModalContextValue {\n return useContext(Web3ModalContext);\n}\n","export default function TimesSVG() {\n return (\n \n \n \n );\n}\n","import {config as dotenvConfig} from 'dotenv';\nimport {IProviderOptions} from 'web3modal';\nimport {isMobile} from '@walletconnect/browser-utils';\nimport {resolve} from 'path';\nimport WalletConnectProvider from '@walletconnect/web3-provider';\n\nimport {EnvironmentName} from './util/types';\n\ndotenvConfig({path: resolve(__dirname, '../.env')});\n\n/**\n * Global DApp Config\n */\n\nconst {\n REACT_APP_DAO_REGISTRY_CONTRACT_ADDRESS,\n REACT_APP_DEFAULT_CHAIN_NAME_LOCAL,\n REACT_APP_ENVIRONMENT,\n REACT_APP_GRAPH_API_URL,\n REACT_APP_INFURA_PROJECT_ID_DEV,\n REACT_APP_INFURA_PROJECT_ID_LOCAL,\n REACT_APP_INFURA_PROJECT_ID_PROD,\n REACT_APP_MULTICALL_CONTRACT_ADDRESS,\n REACT_APP_SNAPSHOT_HUB_API_URL,\n REACT_APP_COUPON_API_URL,\n REACT_APP_SNAPSHOT_SPACE,\n} = process.env;\n\nexport const ENVIRONMENT = REACT_APP_ENVIRONMENT as EnvironmentName | undefined;\n\n/**\n * SNAPSHOT_HUB_API_URL\n *\n * @note For `ENVIRONMENT=localhost` we need to use CRA's local proxy\n * so that we can communicate with our develop Snapshot Hub API\n * without any CORS issues.\n *\n * @see src/setupProxy.js\n */\nexport const SNAPSHOT_HUB_API_URL: string | undefined =\n ENVIRONMENT === 'localhost'\n ? '/snapshot-hub'\n : REACT_APP_SNAPSHOT_HUB_API_URL;\n\nexport const COUPON_API_URL: string | undefined = REACT_APP_COUPON_API_URL;\n\n// The Graph API URL\nexport const GRAPH_API_URL = REACT_APP_GRAPH_API_URL;\n\n// Network IDs, when users change wallet networks\nexport const CHAINS = {\n MAINNET: 1,\n ROPSTEN: 3,\n RINKEBY: 4,\n GOERLI: 5,\n KOVAN: 42,\n GANACHE: 1337,\n};\n\n// Network names for modal messaging\nexport const CHAIN_NAME_FULL = {\n [CHAINS.MAINNET]: 'Main Ethereum Network',\n [CHAINS.ROPSTEN]: 'Ropsten Test Network',\n [CHAINS.RINKEBY]: 'Rinkeby Test Network',\n [CHAINS.GOERLI]: 'Görli Test Network',\n [CHAINS.KOVAN]: 'Kovan Test Network',\n [CHAINS.GANACHE]: 'Ganache Test Network',\n};\n\nexport const DEFAULT_CHAIN =\n REACT_APP_ENVIRONMENT === 'production'\n ? CHAINS.MAINNET\n : REACT_APP_ENVIRONMENT === 'development'\n ? CHAINS.RINKEBY\n : REACT_APP_DEFAULT_CHAIN_NAME_LOCAL // Set this to change local development chain\n ? CHAINS[REACT_APP_DEFAULT_CHAIN_NAME_LOCAL]\n : CHAINS.GANACHE; // Defaults to a Ganache private network (1337)\n\nexport const ETHERSCAN_URLS: {[chainId: number]: string} = {\n [CHAINS.MAINNET]: `https://etherscan.io`,\n [CHAINS.ROPSTEN]: `https://ropsten.etherscan.io`,\n [CHAINS.RINKEBY]: `https://rinkeby.etherscan.io`,\n [CHAINS.GOERLI]: `https://goerli.etherscan.io`,\n [CHAINS.KOVAN]: `https://kovan.etherscan.io`,\n};\n\nexport const INFURA_WS_URLS: {[chainId: number]: string} = {\n [CHAINS.MAINNET]: `wss://mainnet.infura.io/ws/v3`,\n [CHAINS.ROPSTEN]: `wss://ropsten.infura.io/ws/v3`,\n [CHAINS.RINKEBY]: `wss://rinkeby.infura.io/ws/v3`,\n [CHAINS.GOERLI]: `wss://goerli.infura.io/ws/v3`,\n [CHAINS.KOVAN]: `wss://kovan.infura.io/ws/v3`,\n};\n\n// Infura Project Id\nexport const INFURA_PROJECT_ID =\n REACT_APP_ENVIRONMENT === 'production'\n ? REACT_APP_INFURA_PROJECT_ID_PROD\n : REACT_APP_ENVIRONMENT === 'development'\n ? REACT_APP_INFURA_PROJECT_ID_DEV\n : REACT_APP_INFURA_PROJECT_ID_LOCAL;\n\n// Ethereum Provider URL\nexport const ETHEREUM_PROVIDER_URL: string = INFURA_WS_URLS[DEFAULT_CHAIN]\n ? `${INFURA_WS_URLS[DEFAULT_CHAIN]}/${INFURA_PROJECT_ID}`\n : DEFAULT_CHAIN === CHAINS.GANACHE\n ? /**\n * Ganache over WebSocket should work. @note Is not tested, yet.\n * Attempting to be consistent with a WebSocket URL to avoid more logic.\n *\n * @link https://www.trufflesuite.com/docs/truffle/reference/configuration#networks\n */\n 'ws://127.0.0.1:7545'\n : '';\n\n/**\n * Wallet Connect config\n */\n\n/**\n * Tell Web3modal what providers we have available.\n *\n * The built-in web browser provider (only one can exist at a time),\n * MetaMask, Brave or Opera is added automatically by Web3modal\n */\nexport const WALLETCONNECT_PROVIDER_OPTIONS: IProviderOptions = {\n // Injected providers\n injected: {\n display: {\n name: 'MetaMask',\n description: 'Connect with the provider in your Browser',\n },\n package: null,\n },\n // WalletConnect provider\n walletconnect: {\n display: {\n name: 'WalletConnect',\n description: 'Connect with your mobile wallet',\n },\n package: WalletConnectProvider,\n options: {\n infuraId: INFURA_PROJECT_ID, // required\n qrcodeModalOptions: {\n mobileLinks: isMobile()\n ? ['rainbow', 'metamask', 'argent', 'trust']\n : [],\n },\n },\n },\n};\n\n/**\n * CORE CONTRACTS\n * @note as per https://github.com/openlawteam/tribute-contracts#architecture\n *\n * - DAO Registry (@note uses dao address for the contract address)\n * - DAO Factory\n */\n\n// If developing locally, include your DaoRegistry contract address in your `.env` file.\nexport const DAO_REGISTRY_CONTRACT_ADDRESS =\n REACT_APP_DAO_REGISTRY_CONTRACT_ADDRESS;\n\nexport const DAO_FACTORY_CONTRACT_ADDRESS = {\n [CHAINS.MAINNET]: '',\n [CHAINS.ROPSTEN]: '',\n [CHAINS.RINKEBY]: '0x392E9D1c7FaE6C62853e089466FFAE3F0a93c680',\n [CHAINS.GOERLI]: '',\n [CHAINS.KOVAN]: '',\n [CHAINS.GANACHE]: '0x6d92a8E4aB80adcBbFDA44ef69fe847f82def641',\n};\n\nexport const BANK_FACTORY_CONTRACT_ADDRESS = {\n [CHAINS.MAINNET]: '',\n [CHAINS.ROPSTEN]: '',\n [CHAINS.RINKEBY]: '0x0d316BAa42a0538f2aAca3F08D368FE9C4A87A7A',\n [CHAINS.GOERLI]: '',\n [CHAINS.KOVAN]: '',\n [CHAINS.GANACHE]: '0xcD1639FD072113CC86e15f65f1505C6D58Aa7412',\n};\n\n// @todo\nexport const NFT_COLLECTION_FACTORY_CONTRACT_ADDRESS = {\n [CHAINS.MAINNET]: '',\n [CHAINS.ROPSTEN]: '',\n [CHAINS.RINKEBY]: '0xf0D4BC92F8aD06CC163B96459787Dd563aAFC1f7',\n [CHAINS.GOERLI]: '',\n [CHAINS.KOVAN]: '',\n [CHAINS.GANACHE]: '0xcF34FFFBba648719DAe106202674949f1679772B',\n};\n\n// @todo\nexport const ERC20_TOKEN_FACTORY_CONTRACT_ADDRESS = {\n [CHAINS.MAINNET]: '',\n [CHAINS.ROPSTEN]: '',\n [CHAINS.RINKEBY]: '0x69Bd1bE55Fff22bE1d5468dFf1a6d0a184c520F7',\n [CHAINS.GOERLI]: '',\n [CHAINS.KOVAN]: '',\n [CHAINS.GANACHE]: '0x862d71d6E9Be8a7495EfEBa6f2b657b00E629c95',\n};\n\n/**\n * ADAPTER CONTRACTS\n * @note as per https://github.com/openlawteam/tribute-contracts#architecture\n *\n * - Configuration\n * - CouponOnboardingContract\n * - Managing\n * - Onboarding\n * - Voting\n * - Offchain voting\n * - Financing\n * - Tribute\n * - Distribute\n * - Rage quit\n * - Guild kick\n * - BankAdapter\n * - TributeNFT\n * - NFTAdapter\n * - DaoRegistryAdapter\n */\n\nexport const VOTING_CONTRACT_ADDRESS = {\n [CHAINS.MAINNET]: '',\n [CHAINS.ROPSTEN]: '',\n [CHAINS.RINKEBY]: '0xc9415afc432CC56912f54682cC2Ea80ADdE1a89B',\n [CHAINS.GOERLI]: '',\n [CHAINS.KOVAN]: '',\n [CHAINS.GANACHE]: '0xfB4E7C2FD8Ceb2757D2C4cE4749ebE326fc369D4',\n};\n\nexport const CONFIGURATION_CONTRACT_ADDRESS = {\n [CHAINS.MAINNET]: '',\n [CHAINS.ROPSTEN]: '',\n [CHAINS.RINKEBY]: '0x92866ac08edFEAA8C52dEF0c12926FA7E95df8fB',\n [CHAINS.GOERLI]: '',\n [CHAINS.KOVAN]: '',\n [CHAINS.GANACHE]: '0x65CaCA9F2638Fb2B245E9694f00343F0b6CB6F77',\n};\n\nexport const RAGEQUIT_CONTRACT_ADDRESS = {\n [CHAINS.MAINNET]: '',\n [CHAINS.ROPSTEN]: '',\n [CHAINS.RINKEBY]: '0xD3C2cE38c905B9207e35D7EcE51c17b22EAb4afe',\n [CHAINS.GOERLI]: '',\n [CHAINS.KOVAN]: '',\n [CHAINS.GANACHE]: '0x314C824Ea4586798DF8B46121E881Defa40CB47E',\n};\n\nexport const MANAGING_CONTRACT_ADDRESS = {\n [CHAINS.MAINNET]: '',\n [CHAINS.ROPSTEN]: '',\n [CHAINS.RINKEBY]: '0x03BE4284E9F3E7d1fd19cB0442713609105db7E7',\n [CHAINS.GOERLI]: '',\n [CHAINS.KOVAN]: '',\n [CHAINS.GANACHE]: '0xeD025b5BA14b8f3A085057b9D7Baa13998343aA8',\n};\n\nexport const FINANCING_CONTRACT_ADDRESS = {\n [CHAINS.MAINNET]: '',\n [CHAINS.ROPSTEN]: '',\n [CHAINS.RINKEBY]: '0xA007fc56f540670F6ba17FD2b3B931FC72A7820a',\n [CHAINS.GOERLI]: '',\n [CHAINS.KOVAN]: '',\n [CHAINS.GANACHE]: '0x4a7A5946567672c577EaF2b866BCeBc177E455E8',\n};\n\nexport const ONBOARDING_CONTRACT_ADDRESS = {\n [CHAINS.MAINNET]: '',\n [CHAINS.ROPSTEN]: '',\n [CHAINS.RINKEBY]: '0x6fA3f2BC09fB13091BF40C6920a9251B72348456',\n [CHAINS.GOERLI]: '',\n [CHAINS.KOVAN]: '',\n [CHAINS.GANACHE]: '0x4e1Ccf6Bca8d14B670478d8C4e2aEc9f6277A7f5',\n};\n\nexport const GUILDKICK_CONTRACT_ADDRESS = {\n [CHAINS.MAINNET]: '',\n [CHAINS.ROPSTEN]: '',\n [CHAINS.RINKEBY]: '0xf6F042cB61E409dbFE34A5fbC76Db334B7a93364',\n [CHAINS.GOERLI]: '',\n [CHAINS.KOVAN]: '',\n [CHAINS.GANACHE]: '0x72a011Aa67F8214a146A162A99B322017ad763fD',\n};\n\nexport const DAO_REGISTRY_ADAPTER_CONTRACT_ADDRESS = {\n [CHAINS.MAINNET]: '',\n [CHAINS.ROPSTEN]: '',\n [CHAINS.RINKEBY]: '0x35B3babfB8FF455903f6e89cEaa83140e09495F9',\n [CHAINS.GOERLI]: '',\n [CHAINS.KOVAN]: '',\n [CHAINS.GANACHE]: '0x4d4243f2d605282CBd27C8391f05b77316d1a561',\n};\n\nexport const BANK_ADAPTER_CONTRACT_ADDRESS = {\n [CHAINS.MAINNET]: '',\n [CHAINS.ROPSTEN]: '',\n [CHAINS.RINKEBY]: '0xed65eD0c561E77597E4D8472be1b4b184c31Fde4',\n [CHAINS.GOERLI]: '',\n [CHAINS.KOVAN]: '',\n [CHAINS.GANACHE]: '0xA8EA078cF1D3837a025329c46A4E0F441Cb2eE87',\n};\n\nexport const NFT_ADAPTER_CONTRACT_ADDRESS = {\n [CHAINS.MAINNET]: '',\n [CHAINS.ROPSTEN]: '',\n [CHAINS.RINKEBY]: '0xc69DF0C3855A6CaBF0c5983bD504770E5BFA8e84',\n [CHAINS.GOERLI]: '',\n [CHAINS.KOVAN]: '',\n [CHAINS.GANACHE]: '0x538a4f00d64d2597717cAAd4D01C963317e3Ae40',\n};\n\nexport const COUPONONBOARDING_CONTRACT_ADDRESS = {\n [CHAINS.MAINNET]: '',\n [CHAINS.ROPSTEN]: '',\n [CHAINS.RINKEBY]: '0xb5935758c16B785d3749F20D65F5B501578dCb1c',\n [CHAINS.GOERLI]: '',\n [CHAINS.KOVAN]: '',\n [CHAINS.GANACHE]: '0x9A2E533FBa58Ec8b0dA34438154C48E295C80576',\n};\n\nexport const TRIBUTE_CONTRACT_ADDRESS = {\n [CHAINS.MAINNET]: '',\n [CHAINS.ROPSTEN]: '',\n [CHAINS.RINKEBY]: '0xD0dCB66d60f6EbF838e22423f58B01D6F7a60187',\n [CHAINS.GOERLI]: '',\n [CHAINS.KOVAN]: '',\n [CHAINS.GANACHE]: '0xa7D723BFc4deC341da03E70Af4026B3926b1E8Db',\n};\n\nexport const DISTRIBUTE_CONTRACT_ADDRESS = {\n [CHAINS.MAINNET]: '',\n [CHAINS.ROPSTEN]: '',\n [CHAINS.RINKEBY]: '0xB54D48D8471839D670C0e24548A7CfEA78bB1879',\n [CHAINS.GOERLI]: '',\n [CHAINS.KOVAN]: '',\n [CHAINS.GANACHE]: '0x6749b9151B654A77ddA3Fa8f2b259E0E592065F6',\n};\n\nexport const TRIBUTE_NFT_CONTRACT_ADDRESS = {\n [CHAINS.MAINNET]: '',\n [CHAINS.ROPSTEN]: '',\n [CHAINS.RINKEBY]: '0x939Fd23C38496aB54fa4BD0b2ED535DE100f7d8F',\n [CHAINS.GOERLI]: '',\n [CHAINS.KOVAN]: '',\n [CHAINS.GANACHE]: '0x4Df3729e7B952EBE6d18b52132D2A8af2F2D167A',\n};\n\nexport const OFFCHAINVOTING_CONTRACT_ADDRESS = {\n [CHAINS.MAINNET]: '',\n [CHAINS.ROPSTEN]: '',\n [CHAINS.RINKEBY]: '0xDfbe754ec9c2aA26ac2f429CfcEd819910eF5926',\n [CHAINS.GOERLI]: '',\n [CHAINS.KOVAN]: '',\n [CHAINS.GANACHE]: '0xae02a075290D2efD74F0D3fE2DfE64831320855a',\n};\n\n// If developing locally, include your Multicall contract address in your `.env` file.\nexport const MULTICALL_CONTRACT_ADDRESS = REACT_APP_MULTICALL_CONTRACT_ADDRESS;\n\n/**\n * These addresses are important as the contracts use them in their configs.\n *\n * @todo Remove and get from the chain/subgraph?\n *\n * @see https://github.com/openlawteam/tribute-contracts/blob/9e0e03616a00e41e666351e146ee109b9fe37fb2/utils/DaoFactory.js\n */\nexport const GUILD_ADDRESS: string =\n '0x000000000000000000000000000000000000dead';\nexport const TOTAL_ADDRESS: string =\n '0x000000000000000000000000000000000000babe';\nexport const UNITS_ADDRESS: string =\n '0x00000000000000000000000000000000000FF1CE';\nexport const LOOT_ADDRESS: string =\n '0x00000000000000000000000000000000B105F00D';\nexport const MEMBER_COUNT_ADDRESS: string =\n '0x00000000000000000000000000000000DECAFBAD';\nexport const ETH_TOKEN_ADDRESS: string =\n '0x0000000000000000000000000000000000000000';\nexport const DAI_TOKEN_ADDRESS: string =\n '0x95b58a6bff3d14b7db2f5cb5f0ad413dc2940658';\n\n/**\n * `SPACE` is used inside Snapshot Hub for matching a `space`\n * with its own proposals and votes.\n */\nexport const SPACE: string | undefined = REACT_APP_SNAPSHOT_SPACE;\n\n/**\n * POLLING INTERVAL FOR GQL QUERIES\n * localhost | development - ms, poll every 5sec = 5000\n * production - ms, poll every 10sec = 10000\n */\nexport const GQL_QUERY_POLLING_INTERVAL: number =\n REACT_APP_ENVIRONMENT === 'production' ? 10000 : 5000;\n","/**\n * chooseRandom\n *\n * Choose a random item from an array.\n *\n * @param {array} array - The array to choose from.\n * @param doNotChooseItem - An item to not choose (e.g. previously chosen item)\n */\nexport function chooseRandom(array: T[], doNotChooseItem?: T) {\n const arrayToUse =\n doNotChooseItem !== undefined\n ? array.filter((a) => a !== doNotChooseItem)\n : array;\n\n return arrayToUse[Math.floor(Math.random() * arrayToUse.length)];\n}\n","/**\n * disableReactDevTools\n *\n * Run before the app mounts to disable React dev tools.\n * Ideally, this is run conditionally based on environment.\n *\n * @see: https://github.com/facebook/react-devtools/issues/191#issuecomment-443607190\n */\nexport function disableReactDevTools() {\n const noop = (): void => undefined;\n const DEV_TOOLS = (window as any).__REACT_DEVTOOLS_GLOBAL_HOOK__;\n\n if (typeof DEV_TOOLS === 'object') {\n for (const [key, value] of Object.entries(DEV_TOOLS)) {\n DEV_TOOLS[key] = typeof value === 'function' ? noop : null;\n }\n }\n}\n","/**\n * dontCloseWindowWarning\n *\n * Warns user not to close the window.\n *\n * @returns {() => void} unsubscribe function to stop listening, and the callback from firing.\n */\nexport function dontCloseWindowWarning(): () => void {\n // @see: https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload#Example\n const callback = (event: BeforeUnloadEvent) => {\n // Cancel the event\n event.preventDefault();\n // Chrome requires returnValue to be set\n event.returnValue = '';\n };\n\n window.addEventListener('beforeunload', callback);\n\n return function unsubscribe() {\n window.removeEventListener('beforeunload', callback);\n };\n}\n","/**\n * formatDecimal\n *\n * A simple formatter with respect for dynamic decimal places\n * from `toFixed(2)` to `toFixed(4)`. If the number provided\n * is less than `0.01`, then `toFixed(4)` is used, else `toFixed(2)`.\n *\n * This may not work for all cases where the number is tiny, as it could\n * result in `\"0.0000\"`.\n *\n * @param {number} n\n * @returns {string} A `.toFixed()` representation of the decimal number.\n */\nexport function formatDecimal(n: number): string {\n return n < 0.01 ? n.toFixed(4) : n.toFixed(2);\n}\n","/**\n * formatNumber\n *\n * Formats a number (U.S. region) with commas (e.g. 1000 -> 1,000).\n *\n * @param {string | number} value\n * @returns {string}\n *\n * @todo maybe a more friendly way via Intl API in JS core?\n */\nexport const formatNumber = (value: number | string): string => {\n const regEx = new RegExp(/(\\d)(?=(\\d{3})+(?:\\.\\d+)?$)/g);\n return typeof value === 'number'\n ? value.toString().replace(/,/g, '').replace(regEx, '$1,')\n : value.replace(/,/g, '').replace(regEx, '$1,');\n};\n","type TimeRemaining = {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n total: number;\n};\n\nconst DEFAULT_REMAINING: TimeRemaining = {\n days: 0,\n hours: 0,\n minutes: 0,\n seconds: 0,\n total: 0,\n};\n\nexport function getTimeRemaining(endTime: Date): TimeRemaining {\n const nowDate: Date = new Date();\n\n if (endTime <= nowDate) {\n return DEFAULT_REMAINING;\n }\n\n const total: number = endTime.getTime() - nowDate.getTime();\n const seconds: number = Math.floor((total / 1000) % 60);\n const minutes: number = Math.floor((total / 1000 / 60) % 60);\n const hours: number = Math.floor((total / (1000 * 60 * 60)) % 24);\n const days: number = Math.floor(total / (1000 * 60 * 60 * 24));\n\n return {\n days,\n hours,\n minutes,\n seconds,\n total,\n };\n}\n","/**\n * getValidationError\n *\n * Used with react-hook-form (mostly to solve a TS incorrect behavior)\n * Gets the associated error message with a field.\n *\n * @param {string} field\n * @param {Record} errors\n * @returns string\n */\nexport function getValidationError(\n field: string,\n errors: Record\n): string {\n return errors[field] && 'message' in errors[field]\n ? (errors[field].message as string)\n : '';\n}\n","/**\n * normalizeString\n *\n * Converts string case to lowerCase and trims whitespace.\n *\n * @param {string} stringToNormalize\n * @returns {string} The normalized string lowercased and trimmed.\n */\nexport function normalizeString(stringToNormalize: string): string {\n return stringToNormalize.toLowerCase().trim();\n}\n","import {providers} from 'ethers';\n\nimport {normalizeString} from './normalizeString';\n\n/**\n * isPossibleContractWallet\n *\n * When passing a connected ethereum address, if there is bytecode at the address,\n * there is a good chance that it's a contract wallet. This is not 100% accurate, but it's\n * good enough to make a guess and do something trivial in the UI.\n *\n * @param address\n * @param provider\n * @returns `boolean`\n */\nexport async function isPossibleContractWallet(\n /**\n * Ethereum wallet address to check\n */\n address: string,\n /**\n * Ethers provider\n *\n * E.g. `new JsonRpcProvider(...)`\n */\n provider: providers.Provider\n): Promise {\n try {\n const bytecode = await provider.getCode(normalizeString(address));\n\n // It's a bit easier to detect an EOA (typical public/private key crypto wallet)\n const addressIsExernallyOwnedAccount: boolean =\n !bytecode ||\n bytecode === '0x' ||\n bytecode === '0x0' ||\n bytecode === '0x00';\n\n return addressIsExernallyOwnedAccount === false;\n } catch (error) {\n throw error;\n }\n}\n","/**\n * numberRangeArray\n *\n * Outputs an array sequence of numbers given a total size and starting offset.\n * e.g. Years 1920..2002\n *\n * @param {size} number - Maximum number and last value of array. Default is 1.\n * @param {startAt} number - Offset to begin from. Default is 0.\n * @returns {number[]}\n */\nexport function numberRangeArray(size = 1, startAt = 0): number[] {\n const adjustedSize = size + 1 - startAt;\n\n return [...Array(adjustedSize)].map((_, i) => startAt + i);\n}\n","/**\n * stripFormatNumber\n *\n * Strips a number string formatting (via `formatNumber`) (e.g. 10,000 -> 10000).\n *\n * @param {string} value Number string to strip formatting (via `formatNumber`) from.\n * @returns {string} A Number string without any formatting form `formatNumber`.\n *\n * @todo maybe a more friendly way via Intl API in JS core?\n */\nexport const stripFormatNumber = (value: string): string =>\n value.toString().replace(/,/g, '');\n","import {\n createVote,\n getVoteResultRootDomainDefinition,\n prepareVoteResult,\n signMessage,\n VoteChoicesIndex,\n} from '@openlaw/snapshot-js-erc712';\nimport {\n ToStepNodeResult,\n VoteEntry,\n} from '@openlaw/snapshot-js-erc712/dist/types';\nimport {useSelector} from 'react-redux';\nimport {useState} from 'react';\n\nimport {\n DEFAULT_CHAIN,\n MEMBER_COUNT_ADDRESS,\n TOTAL_ADDRESS,\n UNITS_ADDRESS,\n} from '../../../config';\nimport {\n getAdapterAddressFromContracts,\n multicall,\n MulticallTuple,\n} from '../../web3/helpers';\nimport {BadNodeError} from './types';\nimport {ContractAdapterNames, Web3TxStatus} from '../../web3/types';\nimport {getOffchainVotingProof, submitOffchainVotingProof} from '../helpers';\nimport {normalizeString, numberRangeArray} from '../../../util/helpers';\nimport {PRIMARY_TYPE_ERC712, TX_CYCLE_MESSAGES} from '../../web3/config';\nimport {ProposalData} from '../types';\nimport {StoreState} from '../../../store/types';\nimport {useMemberActionDisabled} from '../../../hooks';\nimport {useWeb3Modal, useContractSend, useETHGasPrice} from '../../web3/hooks';\nimport CycleMessage from '../../feedback/CycleMessage';\nimport ErrorMessageWithDetails from '../../common/ErrorMessageWithDetails';\nimport EtherscanURL from '../../web3/EtherscanURL';\nimport FadeIn from '../../common/FadeIn';\nimport Loader from '../../feedback/Loader';\n\ntype OffchainVotingSubmitResultActionProps = {\n adapterName: ContractAdapterNames;\n proposal: ProposalData;\n};\n\ntype SubmitVoteResultArguments = [\n daoAddress: string,\n proposalId: string,\n resultRoot: string,\n lastResult: ToStepNodeResult,\n rootSig: string\n];\n\nexport function OffchainOpRollupVotingSubmitResultAction(\n props: OffchainVotingSubmitResultActionProps\n) {\n const {\n adapterName,\n proposal: {daoProposalVotingAdapter, snapshotProposal},\n } = props;\n\n /**\n * State\n */\n\n const [signatureStatus, setSignatureStatus] = useState(\n Web3TxStatus.STANDBY\n );\n const [submitError, setSubmitError] = useState();\n\n /**\n * Selectors\n */\n\n const bankExtensionAddress = useSelector(\n (s: StoreState) => s.contracts.BankExtensionContract?.contractAddress\n );\n const bankExtensionMethods = useSelector(\n (s: StoreState) => s.contracts.BankExtensionContract?.instance.methods\n );\n const getPriorAmountABI = useSelector((s: StoreState) =>\n s.contracts.BankExtensionContract?.abi.find(\n (ai) => ai.name === 'getPriorAmount'\n )\n );\n const daoRegistryAddress = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract?.contractAddress\n );\n const getMemberAddressABI = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract?.abi\n )?.find((ai) => ai.name === 'getMemberAddress');\n\n const contracts = useSelector((s: StoreState) => s.contracts);\n\n /**\n * Our hooks\n */\n\n const {account, provider, web3Instance} = useWeb3Modal();\n\n const {txEtherscanURL, txIsPromptOpen, txSend, txStatus} = useContractSend();\n\n const {isDisabled, openWhyDisabledModal, WhyDisabledModal} =\n useMemberActionDisabled();\n\n const {fast: fastGasPrice} = useETHGasPrice();\n\n /**\n * Variables\n */\n\n const votingAdapterMethods =\n daoProposalVotingAdapter?.getWeb3VotingAdapterContract().methods;\n\n const isInProcess =\n signatureStatus === Web3TxStatus.AWAITING_CONFIRM ||\n signatureStatus === Web3TxStatus.PENDING ||\n txStatus === Web3TxStatus.AWAITING_CONFIRM ||\n txStatus === Web3TxStatus.PENDING;\n\n const isDone =\n txStatus === Web3TxStatus.FULFILLED &&\n signatureStatus === Web3TxStatus.FULFILLED;\n\n const isInProcessOrDone = isInProcess || isDone || txIsPromptOpen;\n\n /**\n * Functions\n */\n\n async function handleSubmit() {\n try {\n if (!daoRegistryAddress) {\n throw new Error('No DAO Registry address was found.');\n }\n\n if (!bankExtensionAddress) {\n throw new Error('No Bank Extension address was found.');\n }\n\n if (!getMemberAddressABI) {\n throw new Error('No ABI for `getMemberAddress` was found.');\n }\n\n if (!getPriorAmountABI) {\n throw new Error('No ABI for `getPriorAmount` was found.');\n }\n\n if (!snapshotProposal) {\n throw new Error('No Snapshot proposal was found.');\n }\n\n if (!snapshotProposal.votes) {\n throw new Error('No Snapshot proposal votes Array was found.');\n }\n\n if (!votingAdapterMethods) {\n throw new Error('No \"OffchainVotingContract\" methods were found.');\n }\n\n if (!web3Instance) {\n throw new Error('No Web3 instance was found.');\n }\n\n setSignatureStatus(Web3TxStatus.AWAITING_CONFIRM);\n\n const {idInDAO: proposalHash} = snapshotProposal;\n\n const snapshot: string = snapshotProposal.msg.payload.snapshot.toString();\n\n const adapterAddress = getAdapterAddressFromContracts(\n adapterName,\n contracts\n );\n\n // Get total number of potential and admitted members in the DAO at the snapshot\n const numberOfDAOMembersAtSnapshot: string = await bankExtensionMethods\n .getPriorAmount(TOTAL_ADDRESS, MEMBER_COUNT_ADDRESS, snapshot)\n .call();\n\n const getMemberAddressCalls: MulticallTuple[] = numberRangeArray(\n Number(numberOfDAOMembersAtSnapshot) - 1,\n 0\n ).map(\n (memberIndex): MulticallTuple => [\n daoRegistryAddress,\n getMemberAddressABI,\n [memberIndex.toString()],\n ]\n );\n\n // Get all member addresses in the DAO based on the member count\n const memberAddresses: string[] = await multicall({\n calls: getMemberAddressCalls,\n web3Instance,\n });\n\n const memberBalanceCalls: MulticallTuple[] = memberAddresses.map(\n (m): MulticallTuple => [\n bankExtensionAddress,\n getPriorAmountABI,\n [m, UNITS_ADDRESS, snapshot],\n ]\n );\n\n // Get all member balances\n const memberBalancesAtSnapshot: string[] = await multicall({\n calls: memberBalanceCalls,\n web3Instance,\n });\n\n // Create vote entries\n const votes: VoteEntry[] = memberAddresses.map((memberAddress, i) => {\n const voteData = Object.values(\n snapshotProposal.votes?.find(\n (v) =>\n normalizeString(memberAddress) ===\n normalizeString(\n Object.values(v)[0].msg.payload.metadata.memberAddress\n )\n ) || {}\n )[0];\n\n // Create votes based on whether `voteData` was found for `memberAddress`\n return createVote({\n proposalId: proposalHash,\n sig: voteData?.sig || '0x',\n timestamp: voteData ? Number(voteData.msg.timestamp) : 0,\n voteYes: voteData?.msg.payload.choice === VoteChoicesIndex.Yes,\n weight: voteData ? memberBalancesAtSnapshot[i] : '0',\n });\n });\n\n // Prepare vote Result\n const {voteResultTree, result} = await prepareVoteResult({\n actionId: adapterAddress,\n chainId: DEFAULT_CHAIN,\n daoAddress: daoRegistryAddress,\n votes,\n });\n\n const voteResultTreeHexRoot: string = voteResultTree.getHexRoot();\n // The last of the result node tree steps\n const resultNodeLast: ToStepNodeResult = result[result.length - 1];\n\n // Validate the vote result node by calling the contract\n const getBadNodeErrorResponse: number = await votingAdapterMethods\n .getBadNodeError(\n daoRegistryAddress,\n proposalHash,\n // `bool submitNewVote`\n true,\n voteResultTreeHexRoot,\n snapshot,\n // `gracePeriodStartingTime` should be `0` as `submitNewVote` is `true`\n 0,\n resultNodeLast\n )\n .call();\n\n if (Number(getBadNodeErrorResponse) !== BadNodeError.OK) {\n throw new Error(\n `Cannot submit off-chain voting result. Node has an error: ${BadNodeError[getBadNodeErrorResponse]}.`\n );\n }\n\n // Prepare to sign root hex result\n const {domain, types} = getVoteResultRootDomainDefinition(\n daoRegistryAddress,\n adapterAddress,\n DEFAULT_CHAIN\n );\n\n const messageParams: string = JSON.stringify({\n domain,\n message: {root: voteResultTreeHexRoot},\n primaryType: PRIMARY_TYPE_ERC712,\n types,\n });\n\n // Sign root hex result message\n const signature: string = await signMessage(\n provider,\n account,\n messageParams\n );\n\n // Check if off-chain proof has already been submitted\n const snapshotOffchainProofExists: boolean =\n ((await getOffchainVotingProof(voteResultTreeHexRoot))?.merkle_root\n .length || '') > 0;\n\n /**\n * Send off-chain vote proof silently to Snapshot Hub for storage and later use.\n *\n * We're piggy-backing off of the signature async call's status, instead of setting another status.\n * E.g. It may confuse the user if we were to display text saying we're \"submitting\n * off-chain proof\", or something to this effect, for a second or two.\n */\n if (!snapshotOffchainProofExists) {\n await submitOffchainVotingProof({\n actionId: adapterAddress,\n chainId: DEFAULT_CHAIN,\n steps: result,\n merkleRoot: voteResultTreeHexRoot,\n verifyingContract: daoRegistryAddress,\n });\n }\n\n setSignatureStatus(Web3TxStatus.FULFILLED);\n\n const submitVoteResultArguments: SubmitVoteResultArguments = [\n daoRegistryAddress,\n proposalHash,\n voteResultTreeHexRoot,\n resultNodeLast,\n signature,\n ];\n\n const txArguments = {\n from: account || '',\n ...(fastGasPrice ? {gasPrice: fastGasPrice} : null),\n };\n\n // Send the tx\n await txSend(\n 'submitVoteResult',\n votingAdapterMethods,\n submitVoteResultArguments,\n txArguments\n );\n } catch (error) {\n setSubmitError(error);\n setSignatureStatus(Web3TxStatus.REJECTED);\n }\n }\n\n function renderSubmitStatus(): React.ReactNode {\n // Either Snapshot or chain tx\n if (\n txStatus === Web3TxStatus.AWAITING_CONFIRM ||\n signatureStatus === Web3TxStatus.AWAITING_CONFIRM\n ) {\n return 'Awaiting your confirmation\\u2026';\n }\n\n // Only for chain tx\n switch (txStatus) {\n case Web3TxStatus.PENDING:\n return (\n <>\n {\n return {message};\n }}\n />\n\n \n \n );\n case Web3TxStatus.FULFILLED:\n return (\n <>\n
Result submitted!
\n\n \n \n );\n default:\n return null;\n }\n }\n\n /**\n * Render\n */\n\n return (\n <>\n
\n {} : handleSubmit}>\n {isInProcess ? : isDone ? 'Done' : 'Submit Vote Result'}\n \n\n \n\n {/* SUBMIT STATUS */}\n {isInProcessOrDone && (\n
\n {renderSubmitStatus()}\n
\n )}\n\n {isDisabled && (\n \n Why is submitting disabled?\n \n )}\n
\n\n \n \n );\n}\n","import {useEffect, useRef, useState} from 'react';\nimport {useSelector} from 'react-redux';\nimport {VoteChoices} from '@openlaw/snapshot-js-erc712';\n\nimport {\n useMemberActionDisabled,\n useMemberUnitsAtSnapshot,\n} from '../../../hooks';\nimport {AsyncStatus} from '../../../util/types';\nimport {ContractAdapterNames, Web3TxStatus} from '../../web3/types';\nimport {getVoteChosen} from '../helpers';\nimport {ProposalData} from '../types';\nimport {StoreState} from '../../../store/types';\nimport {truncateEthAddress} from '../../../util/helpers';\nimport {useSignAndSendVote} from '../hooks';\nimport {useWeb3Modal} from '../../web3/hooks';\nimport {VotingActionButtons} from '.';\nimport ErrorMessageWithDetails from '../../common/ErrorMessageWithDetails';\n\ntype OffchainVotingActionProps = {\n adapterName?: ContractAdapterNames;\n proposal: ProposalData;\n};\n\ntype VotingDisabledReasons = {\n addressIsDelegatedMessage: string;\n alreadyVotedMessage: string;\n fetchingMembershipAtSnapshotMessage: string;\n noMembershipAtSnapshotMessage: string;\n undeterminedMembershipAtSnapshotMessage: string;\n};\n\nconst {FULFILLED, PENDING, REJECTED} = AsyncStatus;\n\nconst getDelegatedAddressMessage = (a: string) =>\n `Your member address is delegated to ${truncateEthAddress(\n a,\n 7\n )}. You must use that address to vote.`;\n\n/**\n * OffchainVotingAction\n *\n * An off-chain voting action component which facilitates submitting to Snapshot Hub.\n *\n * @returns {JSX.Element}\n */\nexport function OffchainVotingAction(\n props: OffchainVotingActionProps\n): JSX.Element | null {\n const {\n adapterName,\n proposal: {snapshotProposal, refetchProposalOrDraft},\n } = props;\n\n /**\n * State\n */\n\n const [voteChoiceClicked, setVoteChoiceClicked] = useState();\n const [submitError, setSubmitError] = useState();\n\n /**\n * Refs\n */\n\n const votingDisabledReasonsRef = useRef({\n addressIsDelegatedMessage: '',\n alreadyVotedMessage: '',\n fetchingMembershipAtSnapshotMessage: '',\n noMembershipAtSnapshotMessage: '',\n undeterminedMembershipAtSnapshotMessage: '',\n });\n\n /**\n * Selectors\n */\n\n const delegateAddress = useSelector(\n (s: StoreState) => s.connectedMember?.delegateKey\n );\n\n const isAddressDelegated = useSelector(\n (s: StoreState) => s.connectedMember?.isAddressDelegated\n );\n\n const memberAddress = useSelector(\n (s: StoreState) => s.connectedMember?.memberAddress\n );\n\n /**\n * Our hooks\n */\n\n const {account} = useWeb3Modal();\n const {signAndSendVote, voteDataStatus} = useSignAndSendVote();\n const voteChosen = getVoteChosen(snapshotProposal?.votes, account || '');\n\n const {\n isDisabled,\n openWhyDisabledModal,\n setOtherDisabledReasons,\n WhyDisabledModal,\n } = useMemberActionDisabled();\n\n const {\n hasMembershipAtSnapshot,\n memberUnitsAtSnapshotError,\n memberUnitsAtSnapshotStatus,\n } = useMemberUnitsAtSnapshot(\n memberAddress,\n snapshotProposal?.msg.payload.snapshot\n );\n\n /**\n * Variables\n */\n\n const snapshot: number | undefined = snapshotProposal?.msg.payload.snapshot;\n const proposalHash: string = snapshotProposal?.idInDAO || '';\n const snapshotProposalId: string = snapshotProposal?.idInSnapshot || '';\n\n const isInProcess =\n voteDataStatus === Web3TxStatus.AWAITING_CONFIRM ||\n voteDataStatus === Web3TxStatus.PENDING;\n\n const isDone = voteDataStatus === Web3TxStatus.FULFILLED;\n\n const isInProcessOrDone = isInProcess || isDone;\n\n const isSubmitDisabled = isDisabled || isInProcessOrDone;\n\n const voteChoiceProgress: VoteChoices | undefined = isInProcess\n ? voteChoiceClicked\n : undefined;\n\n const error: Error | undefined = submitError || memberUnitsAtSnapshotError;\n\n /**\n * Effects\n */\n\n useEffect(() => {\n // 1. Determine and set local reasons why voting would be disabled\n\n // Reason: address is delegated\n if (delegateAddress) {\n setDisabledReasonHelper(\n 'addressIsDelegatedMessage',\n isAddressDelegated ? getDelegatedAddressMessage(delegateAddress) : ''\n );\n }\n\n // Reason: already voted\n setDisabledReasonHelper(\n 'alreadyVotedMessage',\n voteChosen ? 'You have already voted.' : ''\n );\n\n // Reason: did not hold membership by snapshot\n setDisabledReasonHelper(\n 'noMembershipAtSnapshotMessage',\n !hasMembershipAtSnapshot && memberUnitsAtSnapshotStatus === FULFILLED\n ? `You were not a member when the proposal was sponsored at snapshot ${snapshot}.`\n : ''\n );\n\n // Reason: determining membership by snapshot\n setDisabledReasonHelper(\n 'fetchingMembershipAtSnapshotMessage',\n memberUnitsAtSnapshotStatus === PENDING\n ? `We are waiting on your membership status for when this proposal was sponsored at snapshot ${snapshot}.`\n : ''\n );\n\n // Reason: cannot determine membership by snapshot\n setDisabledReasonHelper(\n 'undeterminedMembershipAtSnapshotMessage',\n memberUnitsAtSnapshotStatus === REJECTED\n ? `Something went wrong. Your membership status when this proposal was sponsored at snapshot ${snapshot} cannot be determined.`\n : ''\n );\n\n // 2. Set reasons\n setOtherDisabledReasons(Object.values(votingDisabledReasonsRef.current));\n }, [\n delegateAddress,\n hasMembershipAtSnapshot,\n isAddressDelegated,\n memberUnitsAtSnapshotStatus,\n setOtherDisabledReasons,\n snapshot,\n voteChosen,\n ]);\n\n /**\n * Functions\n */\n\n async function handleSubmitVote(choice: VoteChoices) {\n try {\n if (!proposalHash) {\n throw new Error('No proposal hash was found.');\n }\n\n if (!snapshotProposalId) {\n throw new Error('No proposal ID was found.');\n }\n\n setVoteChoiceClicked(VoteChoices[choice]);\n\n await signAndSendVote({\n ...(adapterName ? {adapterName} : undefined),\n partialVoteData: {choice},\n proposalIdInDAO: proposalHash,\n proposalIdInSnapshot: snapshotProposalId,\n });\n\n // Refetch to show the vote the user submitted\n await refetchProposalOrDraft();\n } catch (error) {\n setSubmitError(error);\n }\n }\n\n function setDisabledReasonHelper(\n key: keyof VotingDisabledReasons,\n message: string\n ): void {\n votingDisabledReasonsRef.current = {\n ...votingDisabledReasonsRef.current,\n\n [key]: message,\n };\n }\n\n return (\n <>\n {} : handleSubmitVote}\n buttonProps={{\n disabled: isSubmitDisabled,\n 'aria-disabled': isSubmitDisabled,\n }}\n voteChosen={voteChosen}\n voteProgress={voteChoiceProgress}\n />\n\n {isDisabled && (\n \n Why is voting disabled?\n \n )}\n\n \n\n \n \n );\n}\n","import {useEffect, useState} from 'react';\n\nimport {getTimeRemaining} from '../../util/helpers';\n\nexport type RenderCountdownTextProps = {\n formatTimePeriod: typeof formatTimePeriod;\n showDaysOnly?: boolean;\n} & Pick<\n ReturnType,\n 'days' | 'hours' | 'minutes' | 'seconds'\n>;\n\ntype ProposalPeriodCountdownProps = {\n endedLabel?: React.ReactNode;\n endLabel?: React.ReactNode;\n endPeriodMs: number;\n renderCountdownText?: (p: RenderCountdownTextProps) => React.ReactNode;\n startLabel?: React.ReactNode;\n startPeriodMs: number;\n};\n\nfunction displayCountdown({\n countdownFrom,\n renderCountdownText,\n showDaysOnly,\n}: {\n countdownFrom: Date;\n renderCountdownText?: ProposalPeriodCountdownProps['renderCountdownText'];\n showDaysOnly?: boolean;\n}): string | React.ReactNode {\n const {days, hours, minutes, seconds} = getTimeRemaining(countdownFrom);\n\n const renderedCountdownText = renderCountdownText?.({\n days,\n formatTimePeriod,\n hours,\n minutes,\n seconds,\n showDaysOnly,\n });\n\n const format = formatTimePeriod;\n\n // Custom\n if (renderedCountdownText) {\n return renderedCountdownText;\n }\n\n // days\n if (days > 2 && showDaysOnly) {\n return `~${days} days`;\n }\n\n // days : hrs : min\n if (days > 0) {\n return `${format(days, 'day')} : ${format(hours, 'hr')} : ${format(\n minutes,\n 'min'\n )}`;\n }\n\n // hrs : min\n if (hours > 0) {\n return `${format(hours, 'hr')} : ${format(minutes, 'min')}`;\n }\n\n // min : sec\n if (minutes > 0) {\n return `${format(minutes, 'min')} : ${format(seconds, 'sec')}`;\n }\n\n // sec\n return {format(seconds, 'sec')};\n}\n\nfunction formatTimePeriod(time: number, period: 'day' | 'hr' | 'min' | 'sec') {\n const formattedPeriod = time === 0 || time > 1 ? `${period}s` : period;\n\n return `${time} ${formattedPeriod}`;\n}\n\nexport default function ProposalPeriodCountdown(\n props: ProposalPeriodCountdownProps\n) {\n const {\n endedLabel,\n endLabel,\n endPeriodMs,\n renderCountdownText,\n startLabel,\n startPeriodMs,\n } = props;\n\n /**\n * State\n */\n\n const [currentDate, setCurrentDate] = useState();\n\n /**\n * Variables\n */\n\n const startDate: Date = new Date(startPeriodMs);\n const endDate: Date = new Date(endPeriodMs);\n\n /**\n * Effects\n */\n\n // Every current `Date` each 1000ms (1 second)\n useEffect(() => {\n const interval = setInterval(() => {\n setCurrentDate(new Date());\n }, 1000);\n\n return function cleanup() {\n clearInterval(interval);\n };\n }, []);\n\n /**\n * Render\n */\n\n if (!currentDate) return null;\n\n // If time period has not yet started\n if (currentDate < startDate) {\n return (\n
\n \n {startLabel || 'Starts:'}{' '}\n \n {displayCountdown({\n countdownFrom: startDate,\n renderCountdownText,\n showDaysOnly: true,\n })}\n \n \n
\n );\n }\n\n // If time period is happening now\n if (currentDate < endDate) {\n return (\n
\n \n {endLabel || 'Ends:'}{' '}\n \n {displayCountdown({countdownFrom: endDate, renderCountdownText})}\n \n \n
\n );\n }\n\n // Default fallthrough: time period has ended\n return (\n
\n {endedLabel || 'Ended'}\n
\n );\n}\n","import {SVGAttributes} from 'react';\n\nexport default function StopwatchSVG(props: SVGAttributes) {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n}\n","import React from 'react';\n\nimport {SquareRootVotingBar} from '.';\nimport ProposalPeriodCountdown from '../ProposalPeriodCountdown';\nimport StopwatchSVG from '../../../assets/svg/StopwatchSVG';\n\ntype VotingStatusProps = {\n hasVotingEnded: boolean;\n /**\n * A render prop to display status to before / after the clock timer is shown.\n */\n renderStatus: () => React.ReactNode;\n /**\n * A render prop: display the `ProposalPeriod` timer.\n * `renderTimer` Provides `ProposalPeriod` component as an argument.\n *\n * Passing the `ProposalPeriod` component via the render prop\n * gives the opportunity to easily show a timer for voting, or grace period, for example,\n * without adding more props.\n */\n renderTimer: (component: typeof ProposalPeriodCountdown) => React.ReactNode;\n /**\n * Set to `false` to hide percentage data under the voting progress bar.\n * Defaults to `true`.\n */\n showPercentages?: boolean;\n noUnits: Parameters[0]['noUnits'];\n totalUnits: Parameters[0]['totalUnits'];\n yesUnits: Parameters[0]['yesUnits'];\n};\n\nexport function VotingStatus(props: VotingStatusProps) {\n const {\n hasVotingEnded,\n noUnits,\n renderStatus,\n renderTimer,\n showPercentages = true,\n totalUnits,\n yesUnits,\n } = props;\n\n const renderedStatus = renderStatus();\n\n return (\n <>\n
\n \n\n {renderedStatus && (\n {renderedStatus}\n )}\n\n {renderTimer(ProposalPeriodCountdown)}\n
\n\n {/* VOTES */}\n \n \n );\n}\n","import {useEffect} from 'react';\n\nimport {CycleEllipsis} from '../../feedback';\nimport {RenderCountdownTextProps} from '../ProposalPeriodCountdown';\nimport {useTimeStartEnd} from '../../../hooks';\nimport {VotingResult} from '../types';\nimport {VotingStatus} from './VotingStatus';\n\nexport type OffchainVotingStatusRenderStatusProps = {\n countdownGracePeriodEndMs: OffchainVotingStatusProps['countdownGracePeriodEndMs'];\n countdownGracePeriodStartMs: OffchainVotingStatusProps['countdownGracePeriodStartMs'];\n countdownVotingEndMs: OffchainVotingStatusProps['countdownVotingEndMs'];\n countdownVotingStartMs: OffchainVotingStatusProps['countdownVotingStartMs'];\n didVotePassSimpleMajority: boolean | undefined;\n gracePeriodStartEndInitReady: boolean;\n hasGracePeriodEnded: boolean;\n hasGracePeriodStarted: boolean;\n hasVotingEnded: boolean;\n hasVotingStarted: boolean;\n votingStartEndInitReady: boolean;\n};\n\nexport type OnGracePeriodChangeProps = {\n hasGracePeriodEnded: boolean;\n hasGracePeriodStarted: boolean;\n /**\n * Helpful if responding to events for multiple proposals\n */\n proposalId?: string;\n gracePeriodStartEndInitReady: boolean;\n};\n\nexport type OnVotingPeriodChangeProps = {\n hasVotingEnded: boolean;\n hasVotingStarted: boolean;\n /**\n * Helpful if responding to events for multiple proposals\n */\n proposalId?: string;\n votingStartEndInitReady: boolean;\n};\n\ntype OffchainVotingStatusProps = {\n /**\n * Voting start time\n * i.e. calculated from the `OffchainVoting` contract's vote's start time, or Snapshot proposal's start time\n */\n countdownVotingStartMs: number | undefined;\n /**\n * Voting end time\n * i.e. calculated from the `OffchainVoting` contract's vote's end time, or Snapshot proposal's end time\n */\n countdownVotingEndMs: number | undefined;\n /**\n * Grace period start time\n * i.e. calculated from the `OffchainVoting` contract's vote's start time, or Snapshot proposal's start time\n */\n countdownGracePeriodStartMs?: number;\n /**\n * Grace period end time\n * i.e. calculated from the `OffchainVoting` contract's vote's end time, or Snapshot proposal's end time\n */\n countdownGracePeriodEndMs?: number;\n /**\n * An optional callback to run on grace period time changes\n */\n onGracePeriodChange?: (p: OnGracePeriodChangeProps) => void;\n /**\n * An optional callback to run on voting time changes\n */\n onVotingPeriodChange?: (p: OnVotingPeriodChangeProps) => void;\n /**\n * An optional proposal ID if working with multiple proposals (i.e. listing).\n * Helps when repsonding to events from callbacks like `onVotingPeriodChange` and `onGracePeriodChange`.\n */\n proposalId?: string;\n /**\n * Render a custom status\n */\n renderStatus?: (p: OffchainVotingStatusRenderStatusProps) => React.ReactNode;\n /**\n * A single proposal's `VotingResult` (i.e. as provided by `useOffchainVotingResults`)\n */\n votingResult: VotingResult | undefined;\n};\n\nfunction renderCountdownText({\n days,\n hours,\n formatTimePeriod: format,\n}: RenderCountdownTextProps) {\n if (days > 0) {\n return `${format(days, 'day')} : ${format(hours, 'hr')}`;\n }\n}\n\n// Grace period label\nconst gracePeriodLabel = Grace period:;\n\nconst cycleEllipsisFadeInProps = {duration: 150};\n\n/**\n * OffchainVotingStatus\n *\n * A read-only component to show voting status information.\n *\n * @param {OffchainVotingStatusProps} props\n * @returns {JSX.Element}\n */\nexport function OffchainVotingStatus({\n countdownGracePeriodEndMs = 0,\n countdownGracePeriodStartMs = 0,\n countdownVotingEndMs = 0,\n countdownVotingStartMs = 0,\n onGracePeriodChange,\n onVotingPeriodChange,\n proposalId,\n renderStatus,\n votingResult,\n}: OffchainVotingStatusProps): JSX.Element {\n /**\n * Our hooks\n */\n\n const {\n hasTimeEnded: hasVotingEnded,\n hasTimeStarted: hasVotingStarted,\n timeStartEndInitReady: votingStartEndInitReady,\n } = useTimeStartEnd(\n countdownVotingStartMs / 1000,\n countdownVotingEndMs / 1000\n );\n\n const {\n hasTimeEnded: hasGracePeriodEnded,\n hasTimeStarted: hasGracePeriodStarted,\n timeStartEndInitReady: gracePeriodStartEndInitReady,\n } = useTimeStartEnd(\n countdownGracePeriodStartMs / 1000,\n countdownGracePeriodEndMs / 1000\n );\n\n /**\n * Variables\n */\n\n const isGracePeriodActive: boolean =\n gracePeriodStartEndInitReady &&\n hasGracePeriodStarted &&\n !hasGracePeriodEnded;\n\n const noUnits: number = votingResult?.No.units || 0;\n const totalUnits: number = votingResult?.totalUnits || 0;\n const yesUnits: number = votingResult?.Yes.units || 0;\n\n // We use `undefined` to indicate that the result has not yet been determined.\n const didVotePassSimpleMajority: boolean | undefined = hasVotingEnded\n ? yesUnits > noUnits\n : undefined;\n\n const renderedStatusFromProp = renderStatus?.({\n countdownGracePeriodEndMs,\n countdownGracePeriodStartMs,\n countdownVotingEndMs,\n countdownVotingStartMs,\n didVotePassSimpleMajority,\n gracePeriodStartEndInitReady,\n hasGracePeriodEnded,\n hasGracePeriodStarted,\n hasVotingEnded,\n hasVotingStarted,\n votingStartEndInitReady,\n });\n\n /**\n * Effects\n */\n\n // When voting times are updated, call the `onVotingPeriodChange` callback\n useEffect(() => {\n if (!votingStartEndInitReady) return;\n\n onVotingPeriodChange?.({\n hasVotingStarted,\n hasVotingEnded,\n proposalId,\n votingStartEndInitReady,\n });\n }, [\n hasVotingEnded,\n hasVotingStarted,\n onVotingPeriodChange,\n proposalId,\n votingStartEndInitReady,\n ]);\n\n // When voting times are updated, call the `onGracePeriodChange` callback\n useEffect(() => {\n if (!gracePeriodStartEndInitReady) return;\n\n onGracePeriodChange?.({\n hasGracePeriodEnded,\n hasGracePeriodStarted,\n proposalId,\n gracePeriodStartEndInitReady,\n });\n }, [\n gracePeriodStartEndInitReady,\n hasGracePeriodEnded,\n hasGracePeriodStarted,\n onGracePeriodChange,\n proposalId,\n ]);\n\n /**\n * Functions\n */\n\n function renderOffchainVotingStatus(): React.ReactNode {\n // Render status from prop\n if (renderedStatusFromProp) {\n return renderedStatusFromProp;\n }\n\n // Loading\n if (!votingStartEndInitReady) {\n return (\n \n );\n }\n\n // If in grace period, do not show a status.\n if (isGracePeriodActive) {\n return '';\n }\n\n // If passed on voting period ended\n if (didVotePassSimpleMajority) {\n return 'Approved';\n }\n\n // If failed on voting period ended\n if (didVotePassSimpleMajority === false) {\n return 'Failed';\n }\n }\n\n function renderTimer(\n ProposalPeriodComponent: Parameters<\n Parameters[0]['renderTimer']\n >[0]\n ): React.ReactNode {\n // Vote countdown timer\n if (votingStartEndInitReady && hasVotingStarted && !hasVotingEnded) {\n return (\n \n );\n }\n\n // Grace period countdown timer\n if (isGracePeriodActive) {\n return (\n \n );\n }\n }\n\n /**\n * Render\n */\n\n return (\n \n );\n}\n","import {SVGAttributes} from 'react';\n\nexport default function CheckSVG(props: SVGAttributes) {\n return (\n \n \n \n );\n}\n","import CheckSVG from '../../../assets/svg/CheckSVG';\n\ntype SquareRootVotingBarProps = {\n /**\n * Allow values to not be set as they may not be ready\n */\n yesUnits: number | undefined;\n /**\n * Allow values to not be set as they may not be ready\n */\n noUnits: number | undefined;\n /**\n * Allow values to not be set as they may not be ready\n */\n totalUnits: number | undefined;\n votingExpired: boolean;\n showPercentages: boolean;\n};\n\n/**\n * Provides a formatted number string for display as a percentage.\n * Two decimal places are used, unless the decimals are `.00`,\n * then they are removed.\n *\n * E.g. 50%; 50.77%; 0%\n *\n * @param units\n * @param totalUnits\n * @returns `string`\n */\nfunction getUnitsPercent(units: number, totalUnits: number): string {\n return ((units / totalUnits) * 100).toFixed(2).replace(/\\.00$/, '');\n}\n\nexport function SquareRootVotingBar({\n yesUnits = 0,\n noUnits = 0,\n totalUnits,\n votingExpired,\n showPercentages,\n}: SquareRootVotingBarProps) {\n /**\n * Variables\n */\n\n const percentYes = totalUnits ? getUnitsPercent(yesUnits, totalUnits) : '0';\n const percentNo = totalUnits ? getUnitsPercent(noUnits, totalUnits) : '0';\n\n /**\n * Render\n */\n\n return (\n
\n
\n {/* YES */}\n \n\n {/* NO */}\n \n
\n\n
\n {showPercentages && (\n <>\n {/* YES */}\n {votingExpired && yesUnits > noUnits && (\n \n \n \n )}\n {percentYes}%\n\n {/* NO */}\n {percentNo}%\n {votingExpired && yesUnits <= noUnits && (\n \n \n \n )}\n \n )}\n
\n
\n );\n}\n","import React, {ButtonHTMLAttributes} from 'react';\nimport {VoteChoices} from '@openlaw/snapshot-js-erc712';\n\nimport CheckSVG from '../../../assets/svg/CheckSVG';\nimport Loader from '../../feedback/Loader';\n\ntype VotingActionButtonsProps = {\n /**\n * Common \n\n \n {renderVotedCheck(VoteChoices.No, 'You voted no')}\n {getButtonText(VoteChoices.No)}\n \n \n );\n}\n","import {useState} from 'react';\nimport {TransactionReceipt} from 'web3-core/types';\n\nimport {CHAINS, ETHERSCAN_URLS} from '../../../config';\nimport {contractSend} from '../helpers';\nimport {dontCloseWindowWarning} from '../../../util/helpers';\nimport {useWeb3Modal} from './useWeb3Modal';\nimport {Web3TxStatus} from '../types';\n\ntype UseContractSendReturn = {\n txError: Error | undefined;\n txEtherscanURL: string;\n txIsPromptOpen: boolean;\n txReceipt: TransactionReceipt | undefined;\n txSend: (\n ...p: Parameters\n ) => Promise;\n txStatus: Web3TxStatus;\n};\n\n/**\n * useContractSend\n *\n * A React hook which encapsulates the call and related values of `contractSend`.\n *\n * @returns {UseContractSendReturn}\n */\nexport function useContractSend(): UseContractSendReturn {\n const [txError, setTxError] = useState();\n const [txEtherscanURL, setTxEtherscanURL] = useState('');\n const [txIsPromptOpen, setTxIsPromptOpen] = useState(false);\n const [txReceipt, setTxReceipt] = useState();\n const [txStatus, setTxStatus] = useState(Web3TxStatus.STANDBY);\n\n /**\n * Our hooks\n */\n\n const {networkId} = useWeb3Modal();\n\n /**\n * Functions\n */\n\n function handleOnTxProcess(callback?: (txh: string) => void) {\n return (txHash: string) => {\n setTxStatus(Web3TxStatus.PENDING);\n setTxIsPromptOpen(false);\n\n // Ganache transactions do not show on Etherscan.\n if (networkId && networkId !== CHAINS.GANACHE) {\n setTxEtherscanURL(`${ETHERSCAN_URLS[networkId]}/tx/${txHash}`);\n }\n\n callback && callback(txHash);\n };\n }\n\n async function txSend(\n ...contractSendParams: Parameters\n ) {\n // Activate \"don't close window\" warning\n const unsubscribeDontCloseWindow = dontCloseWindowWarning();\n\n try {\n // Reset state in case trying again after error.\n setTxError(undefined);\n setTxEtherscanURL('');\n\n setTxStatus(Web3TxStatus.AWAITING_CONFIRM);\n setTxIsPromptOpen(true);\n\n // Intercept the on process callback to allow us to set our internal state.\n contractSendParams[4] = handleOnTxProcess(contractSendParams[4]);\n\n const receipt = await contractSend(...contractSendParams);\n\n setTxReceipt(receipt);\n setTxStatus(Web3TxStatus.FULFILLED);\n\n unsubscribeDontCloseWindow();\n\n return receipt;\n } catch (error) {\n setTxError(error);\n setTxStatus(Web3TxStatus.REJECTED);\n setTxIsPromptOpen(false);\n\n unsubscribeDontCloseWindow();\n\n throw error;\n }\n }\n\n return {\n txError,\n txEtherscanURL,\n txIsPromptOpen,\n txReceipt,\n txSend,\n txStatus,\n };\n}\n","import {useEffect, useState} from 'react';\nimport {toWei} from 'web3-utils';\nimport BigNumber from 'bignumber.js';\n\nimport {AsyncStatus} from '../../../util/types';\nimport {ENVIRONMENT} from '../../../config';\nimport {useAbortController} from '../../../hooks';\n\ntype GasStationResponse = {\n average: number;\n avgWait: number;\n block_time: number;\n blockNum: number;\n fast: number;\n fastest: number;\n fastestWait: number;\n fastWait: number;\n gasPriceRange: Record;\n safeLow: number;\n safeLowWait: number;\n speed: number;\n};\n\ntype GasPrices = {\n average: string | undefined;\n fast: string | undefined;\n fastest: string | undefined;\n safeLow: string | undefined;\n};\n\ntype UseETHGasPriceReturn = GasPrices & {\n gasPriceError: Error | undefined;\n gasPriceStatus: AsyncStatus;\n};\n\nconst URL = 'https://ethgasstation.info/json/ethgasAPI.json';\n\n/**\n * To prepare the provided ETHGasStation values for conversion from Gwei->wei,\n * first divide by `10`, per the API docs.\n *\n * @see https://docs.ethgasstation.info/gas-price#gas-price\n */\nfunction convertGasToWEI(gasStationPrice: number) {\n const gasPriceToWEI: string = toWei(\n new BigNumber((gasStationPrice / 10).toFixed(4)).toString(),\n 'Gwei'\n );\n\n return gasPriceToWEI;\n}\n\nconst INITIAL_GAS_PRICES: GasPrices = {\n average: undefined,\n fast: undefined,\n fastest: undefined,\n safeLow: undefined,\n};\n\n/**\n * useETHGasPrice\n *\n * Returns the latest mainnet gas prices, converted to WEI string from ETHGasStation.\n *\n * @returns {UseETHGasPriceReturn}\n * @see https://ethgasstation.info/json/ethgasAPI.json\n */\nexport function useETHGasPrice(props?: {\n ignoreEnvironment?: boolean;\n}): UseETHGasPriceReturn {\n const {ignoreEnvironment = false} = props || {};\n\n /**\n * State\n */\n\n const [gasPrices, setGasPrices] = useState(INITIAL_GAS_PRICES);\n const [gasPriceError, setGasPriceError] = useState();\n\n const [gasPriceStatus, setGasPriceStatus] = useState(\n AsyncStatus.STANDBY\n );\n\n /**\n * Our hooks\n */\n\n const {abortController, isMountedRef} = useAbortController();\n\n /**\n * Variables\n */\n\n /**\n * Sometimes using mainnet gas prices for testnets won't work well with wallets.\n */\n const shouldExitIfNotProduction: boolean =\n ignoreEnvironment === false && ENVIRONMENT !== 'production';\n\n /**\n * Effects\n */\n\n useEffect(() => {\n if (!abortController?.signal) return;\n if (shouldExitIfNotProduction) return;\n\n setGasPriceError(undefined);\n setGasPriceStatus(AsyncStatus.PENDING);\n\n fetch(URL, {signal: abortController.signal})\n .then((response) => {\n if (!isMountedRef.current) return;\n\n if (!response.ok) {\n throw new Error(\n 'Something went wrong while getting the latest gas price.'\n );\n }\n\n setGasPriceStatus(AsyncStatus.FULFILLED);\n\n return response.json();\n })\n .then((jsonResponse: GasStationResponse) => {\n if (!isMountedRef.current) return;\n\n const {average, fast, fastest, safeLow} = jsonResponse;\n\n setGasPrices({\n average: convertGasToWEI(average),\n fast: convertGasToWEI(fast),\n fastest: convertGasToWEI(fastest),\n safeLow: convertGasToWEI(safeLow),\n });\n })\n .catch((error) => {\n if (!isMountedRef.current) return;\n\n setGasPriceError(error);\n setGasPrices(INITIAL_GAS_PRICES);\n setGasPriceStatus(AsyncStatus.REJECTED);\n });\n\n return () => {\n abortController.abort();\n };\n }, [abortController, isMountedRef, shouldExitIfNotProduction]);\n\n /**\n * Result\n */\n\n return {...gasPrices, gasPriceError, gasPriceStatus};\n}\n","import {useCallback} from 'react';\nimport {useDispatch} from 'react-redux';\nimport Web3 from 'web3';\n\nimport {\n initContractBankAdapter,\n initContractBankExtension,\n initContractBankFactory,\n initContractConfiguration,\n initContractCouponOnboarding,\n initContractDaoFactory,\n initContractDaoRegistry,\n initContractDaoRegistryAdapter,\n initContractDistribute,\n initContractERC20Extension,\n initContractFinancing,\n initContractGuildKick,\n initContractManaging,\n initContractNFTAdapter,\n initContractNFTExtension,\n initContractOnboarding,\n initContractRagequit,\n initContractTribute,\n initContractTributeNFT,\n initRegisteredVotingAdapter,\n} from '../../../store/actions';\nimport {ReduxDispatch} from '../../../store/types';\n\n/**\n * useInitContracts\n *\n * Initiates all contracts used in the app.\n *\n * @todo Use subgraph to pass the address to each init function, so it skips chain calls.\n */\nexport function useInitContracts(): (data: {\n web3Instance: Web3;\n}) => Promise {\n /**\n * Their hooks\n */\n\n const dispatch = useDispatch();\n\n /**\n * Cached callbacks\n */\n\n const initContractsCached = useCallback(initContracts, [dispatch]);\n\n /**\n * Init contracts\n */\n async function initContracts({web3Instance}: {web3Instance: Web3}) {\n try {\n // Must init registry first\n await dispatch(initContractDaoRegistry(web3Instance));\n\n await dispatch(initContractDaoFactory(web3Instance));\n await dispatch(initContractBankFactory(web3Instance));\n await dispatch(initContractConfiguration(web3Instance));\n await dispatch(initContractFinancing(web3Instance));\n await dispatch(initContractGuildKick(web3Instance));\n await dispatch(initContractManaging(web3Instance));\n await dispatch(initContractRagequit(web3Instance));\n await dispatch(initContractBankAdapter(web3Instance));\n await dispatch(initContractBankExtension(web3Instance));\n await dispatch(initContractManaging(web3Instance));\n await dispatch(initContractOnboarding(web3Instance));\n await dispatch(initContractTribute(web3Instance));\n await dispatch(initContractDistribute(web3Instance));\n await dispatch(initRegisteredVotingAdapter(web3Instance));\n await dispatch(initContractTributeNFT(web3Instance));\n await dispatch(initContractNFTExtension(web3Instance));\n await dispatch(initContractNFTAdapter(web3Instance));\n await dispatch(initContractCouponOnboarding(web3Instance));\n await dispatch(initContractDaoRegistryAdapter(web3Instance));\n await dispatch(initContractERC20Extension(web3Instance));\n } catch (error) {\n throw error;\n }\n }\n\n return initContractsCached;\n}\n","import {useEffect, useState} from 'react';\n\nimport {CHAIN_NAME_FULL, DEFAULT_CHAIN} from '../../../config';\nimport {useWeb3Modal} from './useWeb3Modal';\n\ntype UseIsDefaultChainReturn = {\n /**\n * The default chain of the app\n */\n defaultChain: number;\n /**\n * Any error derived from detecting the default chain\n */\n defaultChainError: Error | undefined;\n /**\n * Specifies if the curently connected chain matches the app's default chain\n */\n isDefaultChain: boolean;\n};\n\n/**\n * useIsDefaultChain\n *\n * Checks if the connected account it connected to the default chain.\n *\n * @returns UseIsDefaultChainReturn\n */\nexport function useIsDefaultChain(): UseIsDefaultChainReturn {\n /**\n * Our hooks\n */\n\n const {networkId, connected} = useWeb3Modal();\n\n /**\n * State\n */\n\n const [defaultChainError, setDefaultChainError] = useState();\n\n /**\n * Effects\n */\n\n // Determine `defaultChainError`\n useEffect(() => {\n // User is already connected to a wallet, and chain is incorrect.\n if (connected && networkId !== DEFAULT_CHAIN) {\n setDefaultChainError(\n new Error(`Please connect to the ${CHAIN_NAME_FULL[DEFAULT_CHAIN]}.`)\n );\n\n return;\n }\n\n // Reset error after successful checks.\n setDefaultChainError(undefined);\n }, [connected, networkId]);\n\n return {\n defaultChain: DEFAULT_CHAIN,\n defaultChainError,\n isDefaultChain: networkId === DEFAULT_CHAIN,\n };\n}\n","import {provider} from 'web3-core/types';\nimport {useCallback, useEffect, useState} from 'react';\nimport {Web3Provider} from '@ethersproject/providers';\n\nimport {isPossibleContractWallet} from '../../../util/helpers';\nimport Web3 from 'web3';\nimport {useIsMounted} from '../../../hooks';\n\nconst INITIAL_MAYBE_CONTRACT_WALLET_STATE: boolean = false;\n\nexport function useMaybeContractWallet(\n account: string | undefined,\n web3Provider: Web3['currentProvider'] | undefined\n): boolean {\n /**\n * State\n */\n\n const [maybeContractWallet, setMaybeContractWallet] = useState(\n INITIAL_MAYBE_CONTRACT_WALLET_STATE\n );\n\n /**\n * Our hooks\n */\n\n const {isMountedRef} = useIsMounted();\n\n /**\n * Cached callbacks\n */\n\n const handleIsPossibleContractWalletCached = useCallback(\n handleIsPossibleContractWallet,\n [isMountedRef]\n );\n\n /**\n * Effects\n */\n\n useEffect(() => {\n if (!web3Provider || !account) return;\n\n handleIsPossibleContractWalletCached(account, web3Provider);\n }, [account, handleIsPossibleContractWalletCached, web3Provider]);\n\n /**\n * Functions\n */\n\n async function handleIsPossibleContractWallet(\n account: string,\n web3Provider: provider\n ): Promise {\n try {\n const response = await isPossibleContractWallet(\n account,\n /**\n * Web3 `provider` doesn't provide the correct types to satisfy `Web3Provider`,\n * but this does work.\n */\n new Web3Provider(web3Provider as any)\n );\n\n if (!isMountedRef.current) return;\n\n setMaybeContractWallet(response);\n } catch (error) {\n if (!isMountedRef.current) return;\n\n setMaybeContractWallet(INITIAL_MAYBE_CONTRACT_WALLET_STATE);\n }\n }\n\n /**\n * Return\n */\n\n return maybeContractWallet;\n}\n","import ReactModal from 'react-modal';\n\nimport FadeIn from './FadeIn';\n\ntype ModalProps = {\n children: React.ReactNode;\n isOpen: boolean;\n isOpenHandler: (isOpen: boolean) => void;\n keyProp: string;\n modalClassNames?: string;\n styleProps?: Record;\n};\n\nexport default function Modal({\n children,\n isOpen,\n isOpenHandler,\n keyProp,\n modalClassNames,\n styleProps,\n}: ModalProps) {\n return (\n {\n isOpenHandler(isOpen);\n }}\n overlayClassName=\"modal-overlay\"\n role=\"dialog\"\n style={\n {\n overlay: {zIndex: '99'},\n ...styleProps,\n } as any\n }>\n \n
{children}
\n
\n \n );\n}\n","import {useState} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {toChecksumAddress} from 'web3-utils';\n\nimport {\n useContractSend,\n useETHGasPrice,\n useIsDefaultChain,\n useWeb3Modal,\n} from '../components/web3/hooks';\nimport {COUPON_API_URL} from '../config';\nimport {ERC20RegisterDetails} from '../components/dao-token/DaoToken';\nimport {getConnectedMember} from '../store/actions';\nimport {ReduxDispatch, StoreState} from '../store/types';\nimport {Web3TxStatus} from '../components/web3/types';\nimport {normalizeString} from '../util/helpers';\n\nexport enum FetchStatus {\n STANDBY = 'STANDBY',\n PENDING = 'PENDING',\n FULFILLED = 'FULFILLED',\n REJECTED = 'REJECTED',\n}\n\ntype RedeemCouponArguments = [\n string, // `dao`\n string, // `authorizedMember`\n string, // `amount`\n number, // `nonce`\n string // `signature`\n];\n\ntype ReturnUseRedeemCoupon = {\n isInProcessOrDone: boolean;\n redeemCoupon: (\n {redeemableCoupon}: Record,\n erc20Details?: ERC20RegisterDetails\n ) => Promise;\n submitStatus: FetchStatus;\n submitError: Error | undefined;\n txStatus: Web3TxStatus;\n txError: Error | undefined;\n txEtherscanURL: string;\n txIsPromptOpen: boolean;\n};\n\nexport function useRedeemCoupon(): ReturnUseRedeemCoupon {\n /**\n * Selectors\n */\n\n const daoRegistryContract = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract\n );\n const couponOnboardingContract = useSelector(\n (s: StoreState) => s.contracts.CouponOnboardingContract\n );\n\n /**\n * State\n */\n\n const [submitError, setSubmitError] = useState();\n const [submitStatus, setSubmitStatus] = useState(\n FetchStatus.STANDBY\n );\n\n /**\n * Our hooks\n */\n\n const {fast: fastGasPrice} = useETHGasPrice();\n const {account, web3Instance} = useWeb3Modal();\n const {defaultChainError} = useIsDefaultChain();\n const {txError, txEtherscanURL, txIsPromptOpen, txSend, txStatus} =\n useContractSend();\n\n /**\n * Their hooks\n */\n\n const dispatch = useDispatch();\n\n /**\n * Variables\n */\n\n const isInProcessOrDone =\n submitStatus === FetchStatus.PENDING ||\n submitStatus === FetchStatus.FULFILLED;\n\n /**\n * Functions\n */\n\n async function handleRedeemCoupon(\n redeemableCoupon: Record,\n erc20Details?: ERC20RegisterDetails\n ) {\n try {\n if (defaultChainError) {\n throw new Error('Wrong network connected.');\n }\n\n if (!redeemableCoupon) {\n throw new Error('No coupon data was found.');\n }\n\n if (!account) {\n throw new Error('No account found.');\n }\n\n if (!daoRegistryContract) {\n throw new Error('No DAO Registry contract was found.');\n }\n\n if (!couponOnboardingContract) {\n throw new Error('No Coupon Onboarding contract was found.');\n }\n\n if (!web3Instance) {\n throw new Error('No Web3 instance was found.');\n }\n\n setSubmitStatus(FetchStatus.PENDING);\n\n const applicantAddressToChecksum = toChecksumAddress(\n redeemableCoupon.recipient\n );\n\n // initiate tx\n const redeemCouponArguments: RedeemCouponArguments = [\n daoRegistryContract.contractAddress,\n applicantAddressToChecksum,\n String(redeemableCoupon.amount),\n Number(redeemableCoupon.nonce),\n redeemableCoupon.signature,\n ];\n\n const txArguments = {\n from: account || '',\n ...(fastGasPrice ? {gasPrice: fastGasPrice} : null),\n };\n\n // Execute contract call for `redeemCoupon`\n const txReceipt = await txSend(\n 'redeemCoupon',\n couponOnboardingContract.instance.methods,\n redeemCouponArguments,\n txArguments\n );\n\n if (txReceipt) {\n // update the db and send email\n const response = await fetch(`${COUPON_API_URL}/api/coupon/redeem`, {\n method: 'PATCH',\n body: JSON.stringify({\n // search by signature\n signature: redeemableCoupon.signature,\n }),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error('Something went wrong while updating the coupon.');\n }\n\n setSubmitStatus(FetchStatus.FULFILLED);\n\n // if connected account is the coupon recipient\n if (\n normalizeString(redeemableCoupon.recipient) ===\n normalizeString(account)\n ) {\n // re-fetch member\n await dispatch(\n getConnectedMember({\n account,\n daoRegistryContract,\n web3Instance,\n })\n );\n\n // suggest adding DAO token to wallet\n await addTokenToWallet(erc20Details);\n }\n }\n } catch (error) {\n setSubmitError(error);\n setSubmitStatus(FetchStatus.REJECTED);\n }\n }\n\n async function addTokenToWallet(erc20Details?: ERC20RegisterDetails) {\n if (!erc20Details) return;\n\n try {\n await window.ethereum.request({\n method: 'wallet_watchAsset',\n params: {\n type: 'ERC20',\n options: erc20Details,\n },\n });\n } catch (error) {\n console.log(error);\n }\n }\n\n return {\n isInProcessOrDone,\n redeemCoupon: handleRedeemCoupon,\n submitError,\n submitStatus,\n txStatus,\n txError,\n txEtherscanURL,\n txIsPromptOpen,\n };\n}\n","/**\n * DaoConstants as defined in the solidity DaoConstants.sol contract\n * and the available adapters as detailed here:\n * https://github.com/openlawteam/tribute-contracts\n */\nexport enum DaoAdapterConstants {\n BANK = 'bank',\n CONFIGURATION = 'configuration',\n COUPON_ONBOARDING = 'coupon-onboarding',\n DAO_REGISTRY = 'daoRegistry',\n DISTRIBUTE = 'distribute',\n EXECUTION = 'execution',\n FINANCING = 'financing',\n GUILDKICK = 'guildkick',\n MANAGING = 'managing',\n NFT = 'nft',\n NONVOTING_ONBOARDING = 'nonvoting-onboarding',\n OFFCHAINVOTING = 'offchainvoting',\n ONBOARDING = 'onboarding',\n RAGEQUIT = 'ragequit',\n TRIBUTE = 'tribute',\n TRIBUTE_NFT = 'tribute-nft',\n VOTING = 'voting',\n}\n\nexport enum DaoExtensionConstants {\n BANK = 'bank',\n ERC20 = 'erc20-ext',\n NFT = 'nft',\n}\n\n/**\n * Voting adapter names as defined in the solidity voting adapter contracts\n * i.e. `string public constant ADAPTER_NAME = \"VotingContract\"`.\n *\n * @link https://github.com/openlawteam/tribute-contracts/blob/master/contracts/adapters/voting\n */\nexport enum VotingAdapterName {\n OffchainVotingContract = 'OffchainVotingContract',\n VotingContract = 'VotingContract',\n}\n","import {Dispatch} from 'redux';\nimport Web3 from 'web3';\n\nimport {BURN_ADDRESS} from '../../util/constants';\nimport {ConnectedMemberState} from '../connectedMember/types';\nimport {ContractsStateEntry} from '../contracts/types';\nimport {hasFlag, multicall} from '../../components/web3/helpers';\nimport {MemberFlag} from '../../components/web3/types';\nimport {normalizeString} from '../../util/helpers';\n\nexport const SET_CONNECTED_MEMBER = 'SET_CONNECTED_MEMBER';\nexport const CLEAR_CONNECTED_MEMBER = 'CLEAR_CONNECTED_MEMBER';\n\n/**\n * getConnectedMember\n *\n * Gets information about a connected address from the DAO's `members`.\n * If the user is not a member, the defaults for a non-existent member of the DAO are returned (e.g. \"0x000000...\")\n * and `isActiveMember` will be `false`.\n *\n * The reason state is set for both a member and a non-member\n * is to ensure we're not too restrictive in our Dapp logic and\n * letting the contract do its job.\n */\nexport function getConnectedMember({\n account,\n daoRegistryContract,\n web3Instance,\n}: {\n account: string;\n daoRegistryContract: ContractsStateEntry;\n web3Instance: Web3;\n}) {\n return async function (dispatch: Dispatch) {\n const daoRegistryMethods = daoRegistryContract?.instance.methods;\n const daoRegistryAddress = daoRegistryContract?.contractAddress;\n\n const getAddressIfDelegatedABI = daoRegistryContract?.abi.find(\n (ai) => ai.name === 'getAddressIfDelegated'\n );\n const membersABI = daoRegistryContract?.abi.find(\n (ai) => ai.name === 'members'\n );\n const isActiveMemberABI = daoRegistryContract?.abi.find(\n (ai) => ai.name === 'isActiveMember'\n );\n const getCurrentDelegateKeyABI = daoRegistryContract?.abi.find(\n (ai) => ai.name === 'getCurrentDelegateKey'\n );\n\n if (\n !account ||\n !daoRegistryAddress ||\n !daoRegistryMethods ||\n !getAddressIfDelegatedABI ||\n !getCurrentDelegateKeyABI ||\n !isActiveMemberABI ||\n !membersABI\n ) {\n dispatch(clearConnectedMember());\n\n return;\n }\n\n try {\n /**\n * @link https://github.com/openlawteam/tribute-contracts/blob/master/docs/core/DaoRegistry.md\n */\n\n const [\n addressIfDelegated,\n memberFlag,\n isActiveMember,\n currentDelegateKey,\n ] = await multicall({\n calls: [\n [daoRegistryAddress, getAddressIfDelegatedABI, [account]],\n [daoRegistryAddress, membersABI, [account]],\n [\n daoRegistryAddress,\n isActiveMemberABI,\n [daoRegistryAddress, account],\n ],\n [daoRegistryAddress, getCurrentDelegateKeyABI, [account]],\n ],\n web3Instance,\n });\n\n // A member can exist in the DAO, yet not be an active member (has units > 0)\n const doesMemberExist: boolean = hasFlag(MemberFlag.EXISTS, memberFlag);\n\n // Is this address known to the DAO?\n const delegateKey: string =\n isActiveMember || doesMemberExist ? currentDelegateKey : BURN_ADDRESS;\n\n // Is this address known to the DAO?\n const memberAddress: string =\n isActiveMember || doesMemberExist ? addressIfDelegated : BURN_ADDRESS;\n\n const isAddressDelegated: boolean =\n normalizeString(account) === normalizeString(memberAddress) &&\n normalizeString(account) !== normalizeString(delegateKey);\n\n dispatch(\n setConnectedMember({\n delegateKey,\n isAddressDelegated,\n isActiveMember,\n memberAddress,\n })\n );\n } catch (error) {\n dispatch(clearConnectedMember());\n\n throw error;\n }\n };\n}\n\nexport function setConnectedMember(payload: ConnectedMemberState) {\n return {type: SET_CONNECTED_MEMBER, ...payload};\n}\n\nexport function clearConnectedMember() {\n return {type: CLEAR_CONNECTED_MEMBER};\n}\n","export const CONNECT_MODAL_CLOSE = 'CONNECT_MODAL_CLOSE';\nexport const CONNECT_MODAL_OPEN = 'CONNECT_MODAL_OPEN';\n\nexport function connectModalClose() {\n return {type: CONNECT_MODAL_CLOSE};\n}\n\nexport function connectModalOpen() {\n return {type: CONNECT_MODAL_OPEN};\n}\n","import {useReducer, useCallback, useEffect} from 'react';\nimport Web3 from 'web3';\nimport Web3Modal, {IProviderOptions} from 'web3modal';\n\nimport {AsyncStatus} from '../../../util/types';\nimport {DEFAULT_CHAIN} from '../../../config';\nimport {NetworkNames, NetworkIDs} from '../../../util/enums';\n\nexport enum DefaultTheme {\n DARK = 'dark',\n LIGHT = 'light',\n}\n\nenum ActionType {\n CONNECT_WEB3MODAL,\n DEACTIVATE_PROVIDER_WEB3MODAL,\n ERROR_WEB3MODAL,\n INITIAL_CACHED_CONNECTOR_CHECK_STATUS,\n NEW_WEB3MODAL,\n UPDATE_ACCOUNT,\n}\n\ninterface Action {\n type: ActionType;\n payload?: Partial;\n}\n\nexport enum Web3ModalErrorType {\n CONNECT = 'CONNECT',\n DISCONNECT = 'DISCONNECT',\n}\n\nexport type Web3ModalError = {\n connectorId: string;\n error: Error;\n type: Web3ModalErrorType;\n};\n\ntype Web3ModalManagerState = {\n account?: undefined | string;\n connected?: boolean;\n error?: Web3ModalError;\n initialCachedConnectorCheckStatus?: AsyncStatus;\n networkId?: number;\n provider?: any;\n web3Instance?: Web3;\n web3Modal?: Web3Modal;\n};\n\ninterface Web3ModalManagerInterface {\n defaultChain?: number;\n defaultTheme?: DefaultTheme;\n onBeforeDisconnect?: () => void;\n onBeforeConnect?: () => void;\n providerOptions: IProviderOptions;\n}\n\ntype UseWeb3ModalManagerReturn = {\n connectWeb3Modal: (connectorId: string) => Promise;\n disconnectWeb3Modal: () => Promise;\n providerOptions: Web3ModalManagerInterface['providerOptions'];\n} & Web3ModalManagerState;\n\nconst INITIAL_STATE = {};\n\nfunction reducer(\n state: Web3ModalManagerState = INITIAL_STATE,\n {type, payload}: Action\n): Web3ModalManagerState {\n switch (type) {\n case ActionType.CONNECT_WEB3MODAL: {\n const {provider, networkId, account, connected, web3Instance} =\n payload || {};\n\n return {\n ...state,\n account,\n connected,\n networkId,\n provider,\n web3Instance,\n };\n }\n\n case ActionType.DEACTIVATE_PROVIDER_WEB3MODAL: {\n return INITIAL_STATE;\n }\n\n case ActionType.ERROR_WEB3MODAL: {\n const {error} = payload || {};\n\n return {\n ...state,\n error,\n };\n }\n\n case ActionType.INITIAL_CACHED_CONNECTOR_CHECK_STATUS: {\n const {initialCachedConnectorCheckStatus} = payload || {};\n\n return {\n ...state,\n initialCachedConnectorCheckStatus,\n };\n }\n\n case ActionType.NEW_WEB3MODAL: {\n const {web3Modal} = payload || {};\n return {web3Modal};\n }\n\n case ActionType.UPDATE_ACCOUNT: {\n const {account} = payload || {};\n\n return {\n ...state,\n account,\n };\n }\n\n default:\n return INITIAL_STATE;\n }\n}\n\nexport default function useWeb3ModalManager({\n defaultChain,\n defaultTheme,\n onBeforeConnect,\n onBeforeDisconnect,\n providerOptions,\n}: Web3ModalManagerInterface): UseWeb3ModalManagerReturn {\n /**\n * Reducers\n */\n\n const [state, dispatch] = useReducer(reducer, {\n initialCachedConnectorCheckStatus: AsyncStatus.STANDBY,\n });\n\n /**\n * Variables\n */\n\n const web3ModalTheme = defaultTheme;\n const web3ModalChain: number = defaultChain || DEFAULT_CHAIN;\n\n /**\n * Cached callbacks\n */\n\n const connectWeb3ModalCached = useCallback(connectWeb3Modal, [\n onBeforeConnect,\n state.web3Modal,\n ]);\n\n const chainChangedCallbackCached = useCallback(chainChangedCallback, [\n connectWeb3ModalCached,\n state.web3Modal?.cachedProvider,\n ]);\n\n /**\n * Effects\n */\n\n useEffect(() => {\n const provider = state.provider;\n\n // Subscribe to accounts change\n provider?.on?.('accountsChanged', accountsChangedCallback);\n\n // Subscribe to chainId change\n provider?.on?.('chainChanged', chainChangedCallbackCached);\n\n return () => {\n // Remove listeners on unmount\n provider?.removeListener?.('accountsChanged', accountsChangedCallback);\n provider?.removeListener?.('chainChanged', chainChangedCallbackCached);\n };\n }, [chainChangedCallbackCached, state.provider]);\n\n // Init Web3Modal\n useEffect(() => {\n if (state.web3Modal) return;\n\n dispatch({\n type: ActionType.NEW_WEB3MODAL,\n payload: {\n web3Modal: new Web3Modal({\n cacheProvider: true, // optional\n network: NetworkNames[NetworkIDs[web3ModalChain]], // optional\n providerOptions, // required\n theme: web3ModalTheme, // optional; `light` or `dark`. `dark` is default\n }),\n },\n });\n }, [providerOptions, state.web3Modal, web3ModalChain, web3ModalTheme]);\n\n // Attempt to initialise connection to a cached provider\n useEffect(() => {\n // If the initial check has ran, or is running, exit.\n if (\n state.initialCachedConnectorCheckStatus === AsyncStatus.FULFILLED ||\n state.initialCachedConnectorCheckStatus === AsyncStatus.PENDING\n ) {\n return;\n }\n\n attemptUpdateFromCachedConnector(\n state.web3Modal?.cachedProvider,\n connectWeb3ModalCached\n );\n }, [\n connectWeb3ModalCached,\n state.initialCachedConnectorCheckStatus,\n state.web3Modal?.cachedProvider,\n ]);\n\n /**\n * Functions\n */\n\n function accountsChangedCallback([account]: string[]) {\n dispatch({\n type: ActionType.UPDATE_ACCOUNT,\n payload: {\n account,\n },\n });\n }\n\n function chainChangedCallback(_chainIdHex: string) {\n if (!state.web3Modal?.cachedProvider) return;\n\n connectWeb3ModalCached(state.web3Modal?.cachedProvider);\n }\n\n /**\n * attemptUpdateFromCachedConnector\n *\n * Will attempt to connect if a `connectorId` (e.g. `\"injected\"`)\n * and cached provider (via `localStorage`) is available.\n *\n * @param connectorId `String | undefined`\n * @param connectCallback `Function` callback which dispatches an action to connect\n * @returns void\n */\n async function attemptUpdateFromCachedConnector(\n connectorId: string | undefined,\n connectCallback: (cid: string) => Promise\n ): Promise {\n const statusAction = ActionType.INITIAL_CACHED_CONNECTOR_CHECK_STATUS;\n\n /**\n * Wait for the `state.web3Modal` object to be available, as `cachedProvider`\n * defaults to an empty `String` if not set.\n */\n if (typeof connectorId !== 'string') return;\n\n dispatch({\n type: statusAction,\n payload: {initialCachedConnectorCheckStatus: AsyncStatus.PENDING},\n });\n\n if (connectorId) {\n // @note Does not throw\n await connectCallback(connectorId);\n }\n\n dispatch({\n type: statusAction,\n payload: {initialCachedConnectorCheckStatus: AsyncStatus.FULFILLED},\n });\n }\n\n /**\n * Connect to a specfic wallet; get account assets and\n * subscribe to provider events\n */\n async function connectWeb3Modal(connectorId: string): Promise {\n try {\n if (!state.web3Modal) return;\n\n const provider = await state.web3Modal.connectTo(connectorId);\n\n const web3Instance: Web3 = new Web3(provider);\n\n // Get index `0` account\n const [account] = await web3Instance.eth.getAccounts();\n\n // Run callback if provided\n await onBeforeConnect?.();\n\n dispatch({\n type: ActionType.CONNECT_WEB3MODAL,\n payload: {\n account,\n connected: true,\n networkId: await web3Instance.eth.net.getId(),\n provider,\n web3Instance,\n },\n });\n } catch (error) {\n dispatch({\n type: ActionType.ERROR_WEB3MODAL,\n payload: {\n error: {\n connectorId,\n error: new Error(`Failed to connect to ${connectorId}.`),\n type: Web3ModalErrorType.CONNECT,\n },\n },\n });\n }\n }\n\n /**\n * Disconnect wallet button pressed.\n */\n async function disconnectWeb3Modal(): Promise {\n try {\n await state.provider?.close?.();\n\n // If the cached provider is not cleared,\n // WalletConnect will default to the existing session\n // and does not allow to re-scan the QR code with a new wallet.\n // Depending on your use case you may want or want not his behaviour.\n state.web3Modal && (await state.web3Modal.clearCachedProvider());\n\n // Run callback if provided\n await onBeforeDisconnect?.();\n\n // Reset all state\n dispatch({type: ActionType.DEACTIVATE_PROVIDER_WEB3MODAL});\n } catch (error) {\n const connectorId: string = state.web3Modal?.cachedProvider || '';\n\n dispatch({\n type: ActionType.ERROR_WEB3MODAL,\n payload: {\n error: {\n connectorId,\n error: new Error(\n `Failed to disconnect from ${connectorId || 'provider'}.`\n ),\n type: Web3ModalErrorType.DISCONNECT,\n },\n },\n });\n }\n }\n\n return {\n ...state,\n connectWeb3Modal,\n disconnectWeb3Modal,\n providerOptions,\n };\n}\n","import Web3 from 'web3';\nimport {AbiItem} from 'web3-utils/types';\nimport {Dispatch} from 'redux';\n\nimport {\n ContractAdapterNames,\n ContractExtensionNames,\n} from '../../components/web3/types';\nimport {\n DEFAULT_CHAIN,\n BANK_FACTORY_CONTRACT_ADDRESS,\n DAO_FACTORY_CONTRACT_ADDRESS,\n DAO_REGISTRY_CONTRACT_ADDRESS,\n} from '../../config';\nimport {\n getAdapterAddress,\n getVotingAdapterName,\n} from '../../components/web3/helpers';\nimport {\n DaoAdapterConstants,\n DaoExtensionConstants,\n VotingAdapterName,\n} from '../../components/adapters-extensions/enums';\nimport {ContractsStateEntry} from './types';\nimport {getExtensionAddress} from '../../components/web3/helpers/getExtensionAddress';\nimport {StoreState} from '../types';\n\ntype ContractAction =\n | typeof CLEAR_CONTRACTS\n | typeof CONTRACT_BANK_ADAPTER\n | typeof CONTRACT_BANK_EXTENSION\n | typeof CONTRACT_BANK_FACTORY\n | typeof CONTRACT_CONFIGURATION\n | typeof CONTRACT_COUPON_ONBOARDING\n | typeof CONTRACT_DAO_FACTORY\n | typeof CONTRACT_DAO_REGISTRY\n | typeof CONTRACT_DAO_REGISTRY_ADAPTER\n | typeof CONTRACT_DISTRIBUTE\n | typeof CONTRACT_ERC20_EXTENSION\n | typeof CONTRACT_FINANCING\n | typeof CONTRACT_GUILDKICK\n | typeof CONTRACT_MANAGING\n | typeof CONTRACT_NFT_ADAPTER\n | typeof CONTRACT_NFT_EXTENSION\n | typeof CONTRACT_ONBOARDING\n | typeof CONTRACT_RAGEQUIT\n | typeof CONTRACT_TRIBUTE\n | typeof CONTRACT_TRIBUTE_NFT\n | typeof CONTRACT_VOTING\n | typeof CONTRACT_VOTING_OP_ROLLUP;\n\nexport const CLEAR_CONTRACTS = 'CLEAR_CONTRACTS';\nexport const CONTRACT_BANK_ADAPTER = 'CONTRACT_BANK_ADAPTER';\nexport const CONTRACT_BANK_EXTENSION = 'CONTRACT_BANK_EXTENSION';\nexport const CONTRACT_BANK_FACTORY = 'CONTRACT_BANK_FACTORY';\nexport const CONTRACT_CONFIGURATION = 'CONTRACT_CONFIGURATION';\nexport const CONTRACT_COUPON_ONBOARDING = 'CONTRACT_COUPON_ONBOARDING';\nexport const CONTRACT_DAO_FACTORY = 'CONTRACT_DAO_FACTORY';\nexport const CONTRACT_DAO_REGISTRY = 'CONTRACT_DAO_REGISTRY';\nexport const CONTRACT_DAO_REGISTRY_ADAPTER = 'CONTRACT_DAO_REGISTRY_ADAPTER';\nexport const CONTRACT_DISTRIBUTE = 'CONTRACT_DISTRIBUTE';\nexport const CONTRACT_ERC20_EXTENSION = 'CONTRACT_ERC20_EXTENSION';\nexport const CONTRACT_FINANCING = 'CONTRACT_FINANCING';\nexport const CONTRACT_GUILDKICK = 'CONTRACT_GUILDKICK';\nexport const CONTRACT_MANAGING = 'CONTRACT_MANAGING';\nexport const CONTRACT_NFT_ADAPTER = 'CONTRACT_NFT_ADAPTER';\nexport const CONTRACT_NFT_EXTENSION = 'CONTRACT_NFT_EXTENSION';\nexport const CONTRACT_ONBOARDING = 'CONTRACT_ONBOARDING';\nexport const CONTRACT_RAGEQUIT = 'CONTRACT_RAGEQUIT';\nexport const CONTRACT_TRIBUTE = 'CONTRACT_TRIBUTE';\nexport const CONTRACT_TRIBUTE_NFT = 'CONTRACT_TRIBUTE_NFT';\nexport const CONTRACT_VOTING = 'CONTRACT_VOTING';\nexport const CONTRACT_VOTING_OP_ROLLUP = 'CONTRACT_VOTING_OP_ROLLUP';\n\nexport function clearContracts(): Record<'type', typeof CLEAR_CONTRACTS> {\n return {\n type: CLEAR_CONTRACTS,\n };\n}\n\nexport function initContractBankFactory(web3Instance: Web3) {\n return async function (dispatch: Dispatch) {\n try {\n if (web3Instance) {\n const {default: lazyBankFactoryABI} = await import(\n '../../truffle-contracts/BankFactory.json'\n );\n const bankFactoryContract: AbiItem[] = lazyBankFactoryABI as any;\n const contractAddress = BANK_FACTORY_CONTRACT_ADDRESS[DEFAULT_CHAIN];\n const instance = new web3Instance.eth.Contract(\n bankFactoryContract,\n contractAddress\n );\n\n dispatch(\n createContractAction({\n type: CONTRACT_BANK_FACTORY,\n abi: bankFactoryContract,\n contractAddress,\n instance,\n })\n );\n }\n } catch (error) {\n throw error;\n }\n };\n}\n\nexport function initContractDaoFactory(web3Instance: Web3) {\n return async function (dispatch: Dispatch) {\n try {\n if (web3Instance) {\n const {default: lazyDaoFactoryABI} = await import(\n '../../truffle-contracts/DaoFactory.json'\n );\n const daoFactoryContract: AbiItem[] = lazyDaoFactoryABI as any;\n const contractAddress = DAO_FACTORY_CONTRACT_ADDRESS[DEFAULT_CHAIN];\n const instance = new web3Instance.eth.Contract(\n daoFactoryContract,\n contractAddress\n );\n\n dispatch(\n createContractAction({\n type: CONTRACT_DAO_FACTORY,\n abi: daoFactoryContract,\n contractAddress,\n instance,\n })\n );\n }\n } catch (error) {\n throw error;\n }\n };\n}\n\nexport function initContractDaoRegistry(web3Instance: Web3) {\n return async function (dispatch: Dispatch) {\n try {\n if (web3Instance) {\n const {default: lazyDaoRegistryABI} = await import(\n '../../truffle-contracts/DaoRegistry.json'\n );\n\n const daoRegistryContract: AbiItem[] = lazyDaoRegistryABI as any;\n const contractAddress = DAO_REGISTRY_CONTRACT_ADDRESS;\n\n if (!contractAddress) {\n throw new Error('No DAO Registry contract address was found.');\n }\n\n const instance = new web3Instance.eth.Contract(\n daoRegistryContract,\n contractAddress\n );\n\n dispatch(\n createContractAction({\n type: CONTRACT_DAO_REGISTRY,\n abi: daoRegistryContract,\n contractAddress,\n instance,\n })\n );\n }\n } catch (error) {\n throw error;\n }\n };\n}\n\nexport function initContractVoting(\n web3Instance: Web3,\n contractAddress?: string\n) {\n return initContractThunkFactory({\n actionType: CONTRACT_VOTING,\n adapterOrExtensionName: ContractAdapterNames.voting,\n adapterNameForRedux: VotingAdapterName.VotingContract,\n contractAddress,\n lazyImport: () => import('../../truffle-contracts/VotingContract.json'),\n web3Instance,\n });\n}\n\nexport function initContractVotingOpRollup(\n web3Instance: Web3,\n contractAddress?: string\n) {\n return initContractThunkFactory({\n actionType: CONTRACT_VOTING_OP_ROLLUP,\n adapterOrExtensionName: ContractAdapterNames.voting,\n adapterNameForRedux: VotingAdapterName.OffchainVotingContract,\n contractAddress,\n lazyImport: () =>\n import('../../truffle-contracts/OffchainVotingContract.json'),\n web3Instance,\n });\n}\n\nexport function initContractOnboarding(\n web3Instance: Web3,\n contractAddress?: string\n) {\n return initContractThunkFactory({\n actionType: CONTRACT_ONBOARDING,\n adapterNameForRedux: DaoAdapterConstants.ONBOARDING,\n adapterOrExtensionName: ContractAdapterNames.onboarding,\n contractAddress,\n lazyImport: () => import('../../truffle-contracts/OnboardingContract.json'),\n web3Instance,\n });\n}\n\nexport function initContractBankExtension(\n web3Instance: Web3,\n contractAddress?: string\n) {\n return initContractThunkFactory({\n actionType: CONTRACT_BANK_EXTENSION,\n adapterNameForRedux: DaoExtensionConstants.BANK,\n adapterOrExtensionName: ContractExtensionNames.bank,\n contractAddress,\n isExtension: true,\n lazyImport: () => import('../../truffle-contracts/BankExtension.json'),\n web3Instance,\n });\n}\n\nexport function initContractTribute(\n web3Instance: Web3,\n contractAddress?: string\n) {\n return initContractThunkFactory({\n actionType: CONTRACT_TRIBUTE,\n adapterNameForRedux: DaoAdapterConstants.TRIBUTE,\n adapterOrExtensionName: ContractAdapterNames.tribute,\n contractAddress,\n lazyImport: () => import('../../truffle-contracts/TributeContract.json'),\n web3Instance,\n });\n}\n\nexport function initContractDistribute(\n web3Instance: Web3,\n contractAddress?: string\n) {\n return initContractThunkFactory({\n actionType: CONTRACT_DISTRIBUTE,\n adapterNameForRedux: DaoAdapterConstants.DISTRIBUTE,\n adapterOrExtensionName: ContractAdapterNames.distribute,\n contractAddress,\n lazyImport: () => import('../../truffle-contracts/DistributeContract.json'),\n web3Instance,\n });\n}\n\nexport function initContractManaging(\n web3Instance: Web3,\n contractAddress?: string\n) {\n return initContractThunkFactory({\n actionType: CONTRACT_MANAGING,\n adapterNameForRedux: DaoAdapterConstants.MANAGING,\n adapterOrExtensionName: ContractAdapterNames.managing,\n contractAddress,\n lazyImport: () => import('../../truffle-contracts/ManagingContract.json'),\n web3Instance,\n });\n}\n\nexport function initContractBankAdapter(\n web3Instance: Web3,\n contractAddress?: string\n) {\n return initContractThunkFactory({\n actionType: CONTRACT_BANK_ADAPTER,\n adapterNameForRedux: DaoAdapterConstants.BANK,\n adapterOrExtensionName: ContractAdapterNames.bank,\n contractAddress,\n lazyImport: () =>\n import('../../truffle-contracts/BankAdapterContract.json'),\n web3Instance,\n });\n}\n\nexport function initContractNFTAdapter(\n web3Instance: Web3,\n contractAddress?: string\n) {\n return initContractThunkFactory({\n actionType: CONTRACT_NFT_ADAPTER,\n adapterNameForRedux: DaoAdapterConstants.NFT,\n adapterOrExtensionName: ContractAdapterNames.nft,\n contractAddress,\n lazyImport: () => import('../../truffle-contracts/NFTAdapterContract.json'),\n web3Instance,\n });\n}\n\nexport function initContractDaoRegistryAdapter(\n web3Instance: Web3,\n contractAddress?: string\n) {\n return initContractThunkFactory({\n actionType: CONTRACT_DAO_REGISTRY_ADAPTER,\n adapterNameForRedux: DaoAdapterConstants.DAO_REGISTRY,\n adapterOrExtensionName: ContractAdapterNames.dao_registry,\n contractAddress,\n lazyImport: () =>\n import('../../truffle-contracts/DaoRegistryAdapterContract.json'),\n web3Instance,\n });\n}\n\nexport function initContractRagequit(\n web3Instance: Web3,\n contractAddress?: string\n) {\n return initContractThunkFactory({\n actionType: CONTRACT_RAGEQUIT,\n adapterNameForRedux: DaoAdapterConstants.RAGEQUIT,\n adapterOrExtensionName: ContractAdapterNames.ragequit,\n contractAddress,\n lazyImport: () => import('../../truffle-contracts/RagequitContract.json'),\n web3Instance,\n });\n}\n\nexport function initContractGuildKick(\n web3Instance: Web3,\n contractAddress?: string\n) {\n return initContractThunkFactory({\n actionType: CONTRACT_GUILDKICK,\n adapterNameForRedux: DaoAdapterConstants.GUILDKICK,\n adapterOrExtensionName: ContractAdapterNames.guildkick,\n contractAddress,\n lazyImport: () => import('../../truffle-contracts/GuildKickContract.json'),\n web3Instance,\n });\n}\n\nexport function initContractFinancing(\n web3Instance: Web3,\n contractAddress?: string\n) {\n return initContractThunkFactory({\n actionType: CONTRACT_FINANCING,\n adapterNameForRedux: DaoAdapterConstants.FINANCING,\n adapterOrExtensionName: ContractAdapterNames.financing,\n contractAddress,\n lazyImport: () => import('../../truffle-contracts/FinancingContract.json'),\n web3Instance,\n });\n}\n\nexport function initContractConfiguration(\n web3Instance: Web3,\n contractAddress?: string\n) {\n return initContractThunkFactory({\n actionType: CONTRACT_CONFIGURATION,\n adapterNameForRedux: DaoAdapterConstants.CONFIGURATION,\n adapterOrExtensionName: ContractAdapterNames.configuration,\n contractAddress,\n lazyImport: () =>\n import('../../truffle-contracts/ConfigurationContract.json'),\n web3Instance,\n });\n}\n\nexport function initContractTributeNFT(\n web3Instance: Web3,\n contractAddress?: string\n) {\n return initContractThunkFactory({\n actionType: CONTRACT_TRIBUTE_NFT,\n adapterNameForRedux: DaoAdapterConstants.TRIBUTE_NFT,\n adapterOrExtensionName: ContractAdapterNames.tribute_nft,\n contractAddress,\n lazyImport: () => import('../../truffle-contracts/TributeNFTContract.json'),\n web3Instance,\n });\n}\n\nexport function initContractCouponOnboarding(\n web3Instance: Web3,\n contractAddress?: string\n) {\n return initContractThunkFactory({\n actionType: CONTRACT_COUPON_ONBOARDING,\n adapterNameForRedux: DaoAdapterConstants.COUPON_ONBOARDING,\n adapterOrExtensionName: ContractAdapterNames.coupon_onboarding,\n contractAddress,\n lazyImport: () =>\n import('../../truffle-contracts/CouponOnboardingContract.json'),\n web3Instance,\n });\n}\n\nexport function initContractNFTExtension(\n web3Instance: Web3,\n contractAddress?: string\n) {\n return initContractThunkFactory({\n actionType: CONTRACT_NFT_EXTENSION,\n adapterNameForRedux: DaoExtensionConstants.NFT,\n adapterOrExtensionName: ContractExtensionNames.nft,\n contractAddress,\n isExtension: true,\n lazyImport: () => import('../../truffle-contracts/NFTExtension.json'),\n web3Instance,\n });\n}\n\nexport function initContractERC20Extension(\n web3Instance: Web3,\n contractAddress?: string\n) {\n return initContractThunkFactory({\n actionType: CONTRACT_ERC20_EXTENSION,\n adapterNameForRedux: DaoExtensionConstants.ERC20,\n adapterOrExtensionName: ContractExtensionNames.erc20,\n contractAddress,\n isExtension: true,\n lazyImport: () => import('../../truffle-contracts/ERC20Extension.json'),\n web3Instance,\n });\n}\n\n/**\n * Inits the currently registered `voting` contract.\n *\n * @note The DaoRegistry and Managing contracts must be initialised beforehand.\n */\nexport function initRegisteredVotingAdapter(\n web3Instance: Web3,\n contractAddress?: string\n) {\n return async function (dispatch: Dispatch, getState: () => StoreState) {\n try {\n if (web3Instance) {\n const daoRegistryContract = getState().contracts.DaoRegistryContract;\n\n if (!daoRegistryContract) {\n console.warn(\n 'Please init the DaoRegistry contract before the voting contract.'\n );\n return;\n }\n\n let votingAdapterName: string = '';\n let address: string = contractAddress || '';\n\n if (address) {\n votingAdapterName = await getVotingAdapterName(address, web3Instance);\n }\n\n if (!address && !votingAdapterName) {\n address = await getAdapterAddress(\n ContractAdapterNames.voting,\n getState().contracts.DaoRegistryContract?.instance\n );\n\n votingAdapterName = await getVotingAdapterName(address, web3Instance);\n }\n\n /**\n * @todo Move voting adapter enum names (see contracts: `ADAPTER_NAME`)\n * to an appropriate adapter config file.\n */\n switch (votingAdapterName) {\n case 'VotingContract':\n return await initContractVoting(web3Instance, address)(\n dispatch,\n getState\n );\n case 'OffchainVotingContract':\n return await initContractVotingOpRollup(web3Instance, address)(\n dispatch,\n getState\n );\n default:\n throw new Error('Voting contract name could not be found.');\n }\n }\n } catch (error) {\n console.warn(\n `The voting contract could not be found in the DAO. Are you sure you meant to add this contract's ABI?`\n );\n }\n };\n}\n\nexport function createContractAction({\n type,\n ...payload\n}: {\n type: ContractAction;\n} & ContractsStateEntry) {\n return {\n type,\n ...payload,\n };\n}\n\nexport function initContractThunkFactory({\n actionType,\n adapterNameForRedux,\n adapterOrExtensionName,\n contractAddress,\n isExtension = false,\n lazyImport,\n web3Instance,\n}: {\n actionType: ContractAction;\n adapterOrExtensionName: ContractAdapterNames | ContractExtensionNames;\n /**\n * The name to be shown in Redux state as `adapterOrExtensionName`.\n */\n adapterNameForRedux?: ContractsStateEntry['adapterOrExtensionName'];\n contractAddress?: string;\n /**\n * If set to `true` an Extenion address will be searched for instead of an Adapter.\n */\n isExtension?: boolean;\n /**\n * Provide a Dynamic Import wrapped in a function.\n *\n * e.g. `() => import('./path/to/import')`\n */\n lazyImport: () => any;\n web3Instance: Web3;\n}) {\n // Return a Redux Thunk\n return async function (dispatch: Dispatch, getState: () => StoreState) {\n try {\n const {default: lazyABI} = await lazyImport();\n\n const contractABI: AbiItem[] = lazyABI as any;\n\n const address =\n contractAddress ||\n (isExtension\n ? await getExtensionAddress(\n adapterOrExtensionName as unknown as ContractExtensionNames,\n getState().contracts.DaoRegistryContract?.instance\n )\n : await getAdapterAddress(\n adapterOrExtensionName as unknown as ContractAdapterNames,\n getState().contracts.DaoRegistryContract?.instance\n ));\n\n dispatch(\n createContractAction({\n type: actionType,\n abi: contractABI,\n contractAddress: address,\n adapterOrExtensionName: adapterNameForRedux,\n instance: new web3Instance.eth.Contract(contractABI, address),\n })\n );\n } catch (error) {\n // Warn instead of throwing as we want the Dapp to fail gracefully.\n console.warn(\n `The contract \"${adapterOrExtensionName}\" could not be found in the DAO. Are you sure you meant to add this contract's ABI?`\n );\n }\n };\n}\n","import {isEthAddressValid} from '../validation';\n\n/**\n * truncateEthAddress\n *\n * Truncates Ethereum address.\n *\n * @param {string} addr\n * @param {number} [maxLength=5]\n * @returns {string}\n */\nexport function truncateEthAddress(\n addr: string,\n maxLength: number = 5\n): string {\n if (addr === null || typeof addr === 'undefined') return '---';\n\n if (isEthAddressValid(addr)) {\n const firstSegment = addr.substring(0, maxLength);\n const secondPart = addr.substring(addr.length - 3);\n return firstSegment + '...' + secondPart;\n } else {\n // in case string argument is not actually an Ethereum address\n return addr;\n }\n}\n","import Web3 from 'web3';\n\nimport {ContractsStateEntry} from '../../../store/contracts/types';\nimport {ContractExtensionNames} from '../types';\n\nexport async function getExtensionAddress(\n extensionName: ContractExtensionNames,\n daoContractInstance: ContractsStateEntry['instance'] | undefined\n): Promise {\n try {\n if (!daoContractInstance) {\n throw new Error('No DaoRegistry contract instance provided.');\n }\n\n return await daoContractInstance.methods\n .getExtensionAddress(Web3.utils.sha3(extensionName))\n .call();\n } catch (error) {\n throw error;\n }\n}\n","import {SubgraphNetworkStatusState} from './types';\n\nexport const SET_SUBGRAPH_NETWORK_STATUS = 'SET_SUBGRAPH_NETWORK_STATUS';\n\nexport function setSubgraphNetworkStatus(payload: SubgraphNetworkStatusState) {\n return {type: SET_SUBGRAPH_NETWORK_STATUS, ...payload};\n}\n","import React, {useState, useEffect, CSSProperties} from 'react';\nimport FadeIn from '../common/FadeIn';\n\ntype CycleEllipsisProps = {\n ariaLabel?: string;\n /**\n * What is the interval of cycling the message?\n */\n intervalMs?: number;\n /**\n * Optional settings for the inner `` component.\n */\n fadeInProps?: Parameters[0];\n};\n\nconst MESSAGES = ['', '.', '.', '.'];\nconst rootStyles = {position: 'absolute'} as CSSProperties;\nconst nbspStyles = {\n height: 1,\n width: 1,\n} as CSSProperties;\n\nexport function CycleEllipsis(props: CycleEllipsisProps) {\n const {ariaLabel, intervalMs = 1000, fadeInProps} = props;\n const fadeInPropsMerged = {...fadeInProps, inline: true};\n\n const [upToIndex, setUpToIndex] = useState(1);\n\n useEffect(() => {\n const intervalId = setInterval(\n () => setUpToIndex((prevIndex) => (prevIndex + 1) % MESSAGES.length),\n intervalMs\n );\n\n return () => {\n clearInterval(intervalId);\n };\n }, [intervalMs]);\n\n return (\n <>\n \n {upToIndex >= 0 && MESSAGES[0]}\n \n {upToIndex >= 1 && (\n {MESSAGES[1]}\n )}\n \n \n {upToIndex >= 2 && (\n {MESSAGES[2]}\n )}\n \n \n {upToIndex >= 3 && (\n {MESSAGES[3]}\n )}\n \n \n {/* @note Keep as it's an alignment fallback in certain CSS situations when no other text is a sibiling */}\n  \n \n );\n}\n","import {useState, useRef, useEffect} from 'react';\nimport {useSelector} from 'react-redux';\nimport {\n CoreProposalVoteChoices,\n prepareVoteProposalData,\n SnapshotType,\n} from '@openlaw/snapshot-js-erc712';\n\nimport {AsyncStatus} from '../../util/types';\nimport {getContractByAddress} from '../web3/helpers';\nimport {ProposalData} from './types';\nimport {SPACE} from '../../config';\nimport {StoreState} from '../../store/types';\nimport {TX_CYCLE_MESSAGES, VOTE_CHOICES} from '../web3/config';\nimport {useCheckApplicant, useSignAndSubmitProposal} from './hooks';\nimport {useContractSend, useETHGasPrice, useWeb3Modal} from '../web3/hooks';\nimport {useMemberActionDisabled} from '../../hooks';\nimport {Web3TxStatus} from '../web3/types';\nimport CycleMessage from '../feedback/CycleMessage';\nimport ErrorMessageWithDetails from '../common/ErrorMessageWithDetails';\nimport EtherscanURL from '../web3/EtherscanURL';\nimport FadeIn from '../common/FadeIn';\nimport Loader from '../feedback/Loader';\n\ntype SubmitArguments = [\n string, // `dao`\n string, // `proposalId`\n ...any[],\n string // `proposal data`\n];\n\ntype SubmitActionProps = {\n checkApplicant?: string;\n proposal: ProposalData;\n};\n\ntype ActionDisabledReasons = {\n invalidApplicantMessage: string;\n};\n\ntype ProposalDataForDao = {\n body: string;\n choices: CoreProposalVoteChoices;\n end: number;\n name: string;\n sig: string;\n snapshot: number;\n space: string;\n start: number;\n timestamp: string;\n};\n\nconst {FULFILLED} = AsyncStatus;\nconst {AWAITING_CONFIRM, FULFILLED: WEB3_TX_FULFILLED, PENDING} = Web3TxStatus;\nconst defaultChoices: CoreProposalVoteChoices = VOTE_CHOICES;\n\nexport default function SubmitAction(props: SubmitActionProps) {\n const {\n checkApplicant,\n proposal: {snapshotDraft, snapshotProposal, refetchProposalOrDraft},\n } = props;\n\n /**\n * Default proposal data for submission to the DAO.\n * This will be used for `proposalDataForDaoRef`.\n */\n const {\n msg: {\n payload: {\n choices: proposalChoices = defaultChoices,\n name: proposalName = '',\n body: proposalBody = '',\n start: proposalStart = 0,\n end: proposalEnd = 0,\n snapshot: proposalSnapshot = 0,\n },\n timestamp: proposalTimestamp = '',\n },\n sig: proposalSig = '',\n } = snapshotProposal || {msg: {payload: {}}};\n\n /**\n * State\n */\n\n const [snapshotProposalSubmitted, setSnapshotProposalSubmitted] =\n useState((snapshotProposal?.sig.length || '') > 0);\n\n const proposalDataForDaoRef = useRef({\n body: proposalBody,\n choices: proposalChoices,\n end: proposalEnd,\n name: proposalName,\n sig: proposalSig,\n snapshot: proposalSnapshot,\n space: SPACE || '',\n start: proposalStart,\n timestamp: proposalTimestamp,\n });\n\n const [submitError, setSubmitError] = useState();\n\n /**\n * Refs\n */\n\n const actionDisabledReasonsRef = useRef({\n invalidApplicantMessage: '',\n });\n\n /**\n * Selectors\n */\n\n const contracts = useSelector((s: StoreState) => s.contracts);\n\n const daoRegistryAddress = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract?.contractAddress\n );\n\n /**\n * Our hooks\n */\n\n const {account, web3Instance} = useWeb3Modal();\n\n const {txEtherscanURL, txIsPromptOpen, txSend, txStatus} = useContractSend();\n\n const {\n isDisabled,\n openWhyDisabledModal,\n WhyDisabledModal,\n setOtherDisabledReasons,\n } = useMemberActionDisabled();\n\n const {proposalSignAndSendStatus, signAndSendProposal} =\n useSignAndSubmitProposal();\n\n const {fast: fastGasPrice} = useETHGasPrice();\n\n const {\n checkApplicantError,\n checkApplicantInvalidMsg,\n checkApplicantStatus,\n isApplicantValid,\n } = useCheckApplicant(checkApplicant);\n\n /**\n * Variables\n */\n\n const isInProcess =\n txStatus === AWAITING_CONFIRM ||\n txStatus === PENDING ||\n proposalSignAndSendStatus === AWAITING_CONFIRM ||\n proposalSignAndSendStatus === PENDING;\n\n const isDone = snapshotProposalSubmitted\n ? txStatus === WEB3_TX_FULFILLED\n : txStatus === WEB3_TX_FULFILLED &&\n proposalSignAndSendStatus === WEB3_TX_FULFILLED;\n\n const isInProcessOrDone = isInProcess || isDone || txIsPromptOpen;\n\n /**\n * Effects\n */\n\n useEffect(() => {\n if (checkApplicant && checkApplicantStatus === FULFILLED) {\n // 1. Determine and set reasons why action would be disabled\n\n /**\n * Reason: If the applicant address is invalid (see `useCheckApplicant`\n * hook for reasons) the `submitProposal` smart contract transaction will\n * fail.\n */\n if (!isApplicantValid && checkApplicantInvalidMsg) {\n actionDisabledReasonsRef.current = {\n ...actionDisabledReasonsRef.current,\n invalidApplicantMessage: checkApplicantInvalidMsg,\n };\n }\n\n // 2. Set reasons\n setOtherDisabledReasons(Object.values(actionDisabledReasonsRef.current));\n }\n }, [\n checkApplicant,\n checkApplicantInvalidMsg,\n checkApplicantStatus,\n isApplicantValid,\n setOtherDisabledReasons,\n ]);\n\n /**\n * Functions\n */\n\n async function handleSubmit() {\n try {\n if (!daoRegistryAddress) {\n throw new Error('No DAO Registry address was found.');\n }\n\n const actionId: string =\n (snapshotDraft || snapshotProposal)?.actionId || '';\n\n const contract = getContractByAddress(actionId, contracts);\n\n if (!contract) {\n throw Error(`No contract was found for action id ${actionId}.`);\n }\n\n const idForDAO: string =\n (snapshotDraft || snapshotProposal)?.idInDAO || '';\n\n const submitActionArgs: any[] = (\n snapshotDraft?.msg.payload || snapshotProposal?.msg.payload\n )?.metadata.submitActionArgs;\n\n // If the Snapshot Proposal has not yet been submitted to Snapshot Hub\n if (!snapshotProposalSubmitted && snapshotDraft) {\n const {\n msg: {\n payload: {\n name: draftName,\n body: draftBody,\n metadata: draftMetadata,\n },\n timestamp: draftTimestamp,\n },\n } = snapshotDraft;\n\n // Sign and submit draft for snapshot-hub\n const {data, signature} = await signAndSendProposal({\n partialProposalData: {\n name: draftName,\n body: draftBody,\n metadata: draftMetadata,\n timestamp: draftTimestamp,\n },\n adapterAddress: contract.contractAddress,\n type: SnapshotType.proposal,\n });\n\n // Set the proposal data for submission to the DAO\n proposalDataForDaoRef.current = {\n body: data.payload.body,\n choices: data.payload.choices,\n end: data.payload.end,\n name: data.payload.name,\n sig: signature,\n snapshot: data.payload.snapshot,\n space: data.space,\n start: data.payload.start,\n timestamp: data.timestamp,\n };\n\n setSnapshotProposalSubmitted(true);\n }\n\n const {body, choices, end, name, sig, snapshot, space, start, timestamp} =\n proposalDataForDaoRef.current;\n\n /**\n * Prepare `data` argument for submission to DAO\n *\n * For information about which data the smart contract needs for signature verification (e.g. `hashMessage`):\n * @link https://github.com/openlawteam/tribute-contracts/blob/master/contracts/adapters/voting/OffchainVoting.sol\n */\n const preparedVoteVerificationBytes = prepareVoteProposalData(\n {\n payload: {\n body,\n choices,\n end,\n name,\n snapshot: snapshot.toString(),\n start,\n },\n sig,\n space,\n timestamp: parseInt(timestamp),\n },\n web3Instance\n );\n\n const submitArguments: SubmitArguments = [\n daoRegistryAddress,\n idForDAO,\n ...(submitActionArgs || []),\n preparedVoteVerificationBytes,\n ];\n\n const txArguments = {\n from: account || '',\n ...(fastGasPrice ? {gasPrice: fastGasPrice} : null),\n };\n\n await txSend(\n 'submitProposal',\n contract.instance.methods,\n submitArguments,\n txArguments\n );\n\n // Update the proposal\n refetchProposalOrDraft();\n } catch (error) {\n setSubmitError(error);\n }\n }\n\n /**\n * Render\n */\n\n function renderSubmitStatus(): React.ReactNode {\n // Either Snapshot or chain tx\n if (\n txStatus === AWAITING_CONFIRM ||\n proposalSignAndSendStatus === AWAITING_CONFIRM\n ) {\n return 'Awaiting your confirmation\\u2026';\n }\n\n // Only for chain tx\n switch (txStatus) {\n case PENDING:\n return (\n <>\n {\n return {message};\n }}\n />\n\n \n \n );\n case WEB3_TX_FULFILLED:\n return (\n <>\n
Proposal submitted!
\n\n \n \n );\n default:\n return null;\n }\n }\n\n /**\n * Log-out check applicant error\n *\n * @todo Use logging service\n */\n if (checkApplicantError) {\n console.warn(\n `Error checking if the applicant address is valid: ${checkApplicantError.message}`\n );\n }\n\n return (\n <>\n
\n {} : handleSubmit}>\n {isInProcess ? : isDone ? 'Done' : 'Sponsor'}\n \n\n \n\n {/* SUBMIT STATUS */}\n\n {isInProcessOrDone && (\n
\n {renderSubmitStatus()}\n
\n )}\n\n {isDisabled && (\n \n Why is sponsoring disabled?\n \n )}\n
\n\n \n \n );\n}\n","import {createContext, useEffect, useRef, useState} from 'react';\nimport Web3 from 'web3';\nimport Web3Modal, {IProviderOptions} from 'web3modal';\n\nimport useWeb3ModalManager, {\n DefaultTheme,\n Web3ModalError,\n} from './hooks/useWeb3ModalManager';\nimport {AsyncStatus} from '../../util/types';\nimport {ETHEREUM_PROVIDER_URL} from '../../config';\n\ntype Web3ModalProviderArguments = {\n defaultChain?: number;\n defaultTheme?: DefaultTheme;\n /**\n * Optional: Any action to take after disconnecting from an Ethereum provider.\n */\n onBeforeDisconnect?: Parameters<\n typeof useWeb3ModalManager\n >[0]['onBeforeDisconnect'];\n /**\n * Optional: Any action to take before connecting to an Ethereum provider.\n */\n onBeforeConnect?: Parameters<\n typeof useWeb3ModalManager\n >[0]['onBeforeConnect'];\n providerOptions: IProviderOptions; // required\n};\n\ntype Web3ModalManagerProps = {\n children: JSX.Element;\n} & Web3ModalProviderArguments;\n\nexport type Web3ModalContextValue = {\n account: string | undefined;\n connected: boolean | undefined;\n connectWeb3Modal: (providerName: string) => void;\n disconnectWeb3Modal: () => void;\n error: Web3ModalError | undefined;\n initialCachedConnectorCheckStatus: AsyncStatus | undefined;\n networkId: number | undefined;\n provider: any;\n providerOptions: IProviderOptions;\n web3Instance: Web3 | undefined;\n web3Modal: Web3Modal | undefined;\n};\n\nexport const Web3ModalContext = createContext(\n {} as Web3ModalContextValue\n);\n\n/**\n * Web3ModalManager\n *\n * A provider for the `web3modal` wallet connection, provides access to\n * the wallet states, enables connections and disconnections.\n *\n * @example\n * \n * ...\n * \n *\n * @param children: React.JSX\n * @param defaultChain?: number\n * @param defaultTheme?: DefaultTheme; default is `dark`\n * @param providerOptions: Record\n */\n\nexport default function Web3ModalManager({\n children,\n defaultChain,\n defaultTheme = DefaultTheme.DARK,\n onBeforeConnect,\n onBeforeDisconnect,\n providerOptions,\n}: Web3ModalManagerProps) {\n /**\n * Refs\n */\n\n const defaultWeb3InstanceRef = useRef(\n new Web3(new Web3.providers.WebsocketProvider(ETHEREUM_PROVIDER_URL))\n );\n\n /**\n * State\n */\n\n const [defaultWeb3NetID, setDefaultWeb3NetID] = useState<\n number | undefined\n >();\n\n /**\n * Variables\n */\n\n const web3ModalProviderArguments: Web3ModalProviderArguments = {\n defaultChain,\n defaultTheme,\n onBeforeConnect,\n onBeforeDisconnect,\n providerOptions,\n };\n\n /**\n * Our hooks\n */\n\n const {\n account,\n connected,\n connectWeb3Modal,\n disconnectWeb3Modal,\n error,\n initialCachedConnectorCheckStatus,\n networkId = defaultWeb3NetID,\n provider = defaultWeb3InstanceRef.current?.currentProvider,\n web3Instance = defaultWeb3InstanceRef.current,\n web3Modal,\n } = useWeb3ModalManager(web3ModalProviderArguments);\n\n /**\n * Effects\n */\n\n // Set network ID when using `defaultWeb3InstanceRef` (i.e. not connected to a wallet)\n useEffect(() => {\n if (\n !connected &&\n initialCachedConnectorCheckStatus === AsyncStatus.FULFILLED\n ) {\n defaultWeb3InstanceRef.current?.eth.net\n .getId()\n .then(setDefaultWeb3NetID)\n .catch(() => setDefaultWeb3NetID(undefined));\n }\n }, [connected, initialCachedConnectorCheckStatus]);\n\n /**\n * Render\n */\n\n const web3ModalContext: Web3ModalContextValue = {\n account,\n connected,\n connectWeb3Modal,\n disconnectWeb3Modal,\n error,\n initialCachedConnectorCheckStatus,\n networkId,\n provider,\n providerOptions,\n web3Instance,\n web3Modal,\n };\n\n return (\n \n {children}\n \n );\n}\n","// see: http://reactcommunity.org/react-transition-group/transition\nimport React from 'react';\nimport {Transition} from 'react-transition-group';\n\ntype FadeInProps = {\n children?: React.ReactNode;\n duration?: number;\n /**\n * Defaults to `true`\n */\n show?: boolean;\n /**\n * Renders a `` wrapper where the animation CSS is applied.\n */\n inline?: boolean;\n};\n\nconst DEFAULT_DURATION = 300;\n\nconst defaultStyle = (props: FadeInProps) => ({\n transition: `opacity ${\n props.duration || 300\n }ms cubic-bezier(0, 0.69, 0.32, 0.64)`,\n opacity: 0,\n});\n\nconst transitionStyles: Record = {\n entering: {opacity: 0},\n entered: {opacity: 1},\n exiting: {opacity: 0},\n exited: {opacity: 0},\n};\n\nexport default function FadeIn(props: FadeInProps) {\n const {inline} = props;\n\n return (\n \n {(transition) =>\n inline ? (\n \n {props.children}\n \n ) : (\n \n {props.children}\n \n )\n }\n \n );\n}\n","import {useState} from 'react';\n\nimport {MetaMaskRPCError} from '../../util/types';\nimport {normalizeString} from '../../util/helpers';\nimport FadeIn from './FadeIn';\n\ntype ErrorMessageWithDetailsProps = {\n detailsProps?: React.DetailsHTMLAttributes;\n error: Error | (() => React.ReactElement) | undefined;\n renderText: (() => React.ReactElement) | string;\n};\n\nexport default function ErrorMessageWithDetails(\n props: ErrorMessageWithDetailsProps\n) {\n const {error, renderText} = props;\n\n /**\n * State\n */\n\n const [isExpanded, setIsExpanded] = useState(false);\n\n /**\n * Variables\n */\n\n /**\n * Some wallets will provide proper error codes. The `4001` is a \"user rejected transaction\".\n *\n * @link https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1193.md#provider-errors\n */\n const isWalletRejectedRequest =\n typeof error !== 'function' &&\n ((error as MetaMaskRPCError)?.code === 4001 ||\n /^(the )?user rejected (the )?request$/g.test(\n normalizeString(error?.message || '')\n ));\n\n const textToDisplay: React.ReactNode =\n typeof renderText === 'string' ? renderText : renderText();\n\n const areErrorMessageAndTextStringSame: boolean =\n typeof renderText === 'string' &&\n typeof error !== 'function' &&\n normalizeString(renderText) === normalizeString(error?.message || '')\n ? true\n : false;\n\n /**\n * Render\n */\n\n if (!error || isWalletRejectedRequest) return null;\n\n return (\n \n
\n

{textToDisplay}

\n\n {error && !areErrorMessageAndTextStringSame && (\n
\n setIsExpanded(!isExpanded)}\n style={{cursor: 'pointer', outline: 'none'}}>\n Details\n \n\n

\n \n {typeof error === 'function' ? error() : error.message}\n \n

\n
\n )}\n
\n
\n );\n}\n","import {Contract, SendOptions} from 'web3-eth-contract/types';\nimport {TransactionReceipt} from 'web3-core/types';\nimport BigNumber from 'bignumber.js';\n\n/**\n * contractSend\n *\n * Returns the resolved transaction receipt or error\n *\n * @param {string} methodName\n * @param {Record} contractInstanceMethods An object of the methods for the Web3 contract instance.\n * @param {any[]} methodArguments An array of any arguments for the contract's method.\n * @param {Record} txArguments\n * @param {(txHash: string) => void} onProcess Callback which runs after a txHash has been received,\n * but before the transaction is complete.\n * @returns {Promise} Resolved or rejected transaction.\n */\nexport async function contractSend(\n methodName: string,\n contractInstanceMethods: typeof Contract.prototype.methods,\n methodArguments: any[],\n txArguments: SendOptions,\n onProcess?: (txHash: string) => void\n): Promise {\n // Promisify so we can both `reject()` inside .on('error') and from transactions.\n return new Promise(async (resolve, reject) => {\n try {\n const BN = BigNumber;\n const method = contractInstanceMethods[methodName];\n\n // estimate gas limit for transaction\n const gas = await method(...methodArguments).estimateGas({\n from: txArguments.from,\n value: txArguments.value,\n });\n\n const gastoBN = new BN(gas)\n .decimalPlaces(0, BigNumber.ROUND_DOWN)\n .toNumber();\n\n await method(...methodArguments)\n .send({\n ...txArguments,\n gas: gastoBN,\n })\n .on('transactionHash', function (txHash: string) {\n // Call onProcess with transaction hash\n onProcess && onProcess(txHash);\n })\n .on('receipt', function (receipt: TransactionReceipt) {\n // resolve on transaction receipt; contains event returnValues\n resolve(receipt);\n })\n .on('error', (error: Error) => {\n // reject on transaction error\n reject(error);\n });\n } catch (error) {\n // reject on estimate gas or transaction error\n reject(error);\n }\n });\n}\n","import Web3 from 'web3';\n\nimport {ContractsStateEntry} from '../../../store/contracts/types';\nimport {ContractAdapterNames} from '../types';\n\nexport async function getAdapterAddress(\n adapterName: ContractAdapterNames,\n daoContractInstance: ContractsStateEntry['instance'] | undefined\n): Promise {\n try {\n if (!daoContractInstance) {\n throw new Error('No DaoRegistry contract instance provided.');\n }\n\n return await daoContractInstance.methods\n .getAdapterAddress(Web3.utils.sha3(adapterName))\n .call();\n } catch (error) {\n throw error;\n }\n}\n","import {ContractAdapterNames} from '../types';\nimport {ContractsStateEntry} from '../../../store/contracts/types';\nimport {StoreState} from '../../../store/types';\n\nfunction getContractAddressOrThrow(\n contract: ContractsStateEntry | null\n): string {\n try {\n const address = contract?.contractAddress;\n\n if (!address) {\n throw new Error(`Contract address was not found in the store.`);\n }\n\n return address;\n } catch (error) {\n throw error;\n }\n}\n\n/**\n * getAdapterAddressFromContracts\n *\n * Gets an adapter's address by its name (`type ContractAdapterNames`) from the Redux contracts state slice.\n *\n * @param {string} name\n * @param {StoreState['contracts']} contracts\n */\nexport function getAdapterAddressFromContracts(\n name: ContractAdapterNames,\n contracts: StoreState['contracts']\n): string {\n try {\n switch (name) {\n case ContractAdapterNames.configuration:\n return '';\n case ContractAdapterNames.distribute:\n return getContractAddressOrThrow(contracts.DistributeContract);\n case ContractAdapterNames.financing:\n return '';\n case ContractAdapterNames.guildkick:\n return '';\n case ContractAdapterNames.managing:\n return getContractAddressOrThrow(contracts.ManagingContract);\n case ContractAdapterNames.onboarding:\n return getContractAddressOrThrow(contracts.OnboardingContract);\n case ContractAdapterNames.ragequit:\n return '';\n case ContractAdapterNames.tribute:\n return getContractAddressOrThrow(contracts.TributeContract);\n case ContractAdapterNames.tribute_nft:\n return getContractAddressOrThrow(contracts.TributeNFTContract);\n case ContractAdapterNames.voting:\n return getContractAddressOrThrow(contracts.VotingContract);\n default:\n throw new Error(`Contract address was not found in the store.`);\n }\n } catch (error) {\n throw error;\n }\n}\n","import {ContractsStateEntry} from '../../../store/contracts/types';\n\nexport enum DaoState {\n CREATION = 'CREATION',\n READY = 'READY',\n}\n\nexport async function getDaoState(\n daoContractInstance: ContractsStateEntry['instance'] | undefined\n): Promise {\n try {\n if (!daoContractInstance) {\n throw new Error('No DaoRegistry contract instance provided.');\n }\n\n const daoRegistryMethods = daoContractInstance.methods;\n const state = await daoRegistryMethods.state().call();\n\n return Number(state) === 0 ? DaoState.CREATION : DaoState.READY;\n } catch (error) {\n throw error;\n }\n}\n","import {ContractsStateEntry} from '../../../store/contracts/types';\nimport {normalizeString} from '../../../util/helpers';\nimport {StoreState} from '../../../store/types';\n\n/**\n * getContractByAddress\n *\n * Gets a Contract from the Redux contracts state slice by its `contractAddress`, or throws an Error.\n * A use case for this would be when using ERC712 signing data `actionId` to get\n * the appropriate Contract for submitting on-chain transactions.\n *\n * @param {string} address\n * @param {StoreState['contracts']} contracts\n */\nexport function getContractByAddress(\n address: string,\n contracts: StoreState['contracts']\n): ContractsStateEntry {\n try {\n const contract = Object.values(contracts).find(\n (c) =>\n c?.contractAddress &&\n normalizeString(c.contractAddress) === normalizeString(address)\n );\n\n if (!contract) {\n throw new Error(`Contract was not found in the store.`);\n }\n\n return contract;\n } catch (error) {\n throw error;\n }\n}\n","import Web3 from 'web3';\n\nimport {ContractsStateEntry} from '../../../store/contracts/types';\nimport {ContractDAOConfigKeys} from '../types';\n\nexport async function getDAOConfigEntry(\n configKey: ContractDAOConfigKeys,\n daoContractInstance: ContractsStateEntry['instance'] | undefined\n): Promise {\n try {\n if (!daoContractInstance) {\n throw new Error('No DaoRegistry contract instance provided.');\n }\n\n return await daoContractInstance.methods\n .getConfiguration(Web3.utils.sha3(configKey))\n .call();\n } catch (error) {\n throw error;\n }\n}\n","import {AbiItem} from 'web3-utils/types';\nimport {VotingAdapterName} from '../../adapters-extensions/enums';\nimport Web3 from 'web3';\n\nexport async function getVotingAdapterName(\n address: string,\n web3Instance: Web3\n): Promise {\n try {\n const {default: lazyIVotingABI} = await import(\n '../../../truffle-contracts/IVoting.json'\n );\n\n return await new web3Instance.eth.Contract(\n lazyIVotingABI as AbiItem[],\n address\n ).methods\n .getAdapterName()\n .call();\n } catch (error) {\n throw error;\n }\n}\n","import {MemberFlag} from '../types';\nimport {ProposalFlag} from '../../proposals/types';\n\n/**\n * hasFlag\n *\n * A quicker alternative than calling `getProposalFlag` or `getMemberFlag` using `Multicall` for every possiblity.\n *\n * @todo Though this is faster, we may want to switch to using the contract and Multicall instead of re-creating the logic.\n *\n * @param flagToCheck\n * @param daoProposalFlag\n * @returns {boolean}\n *\n * @see `ProposalFlag` `DaoRegistry.sol`\n * @see `getFlag` `DaoConstants.sol`\n * @see `setFlag` `DaoConstants.sol`\n */\nexport function hasFlag(\n flagToCheck: ProposalFlag | MemberFlag,\n daoProposalFlag: number | string\n): boolean {\n return flagToCheck === Math.log2(Number(daoProposalFlag) + 1) - 1;\n}\n","import Web3 from 'web3';\nimport {AbiItem} from 'web3-utils/types';\n\nimport {MULTICALL_CONTRACT_ADDRESS} from '../../../config';\n\nexport type MulticallTuple = [\n contractAddress: string,\n functionABI: AbiItem,\n parameters: string[]\n];\n\nexport async function multicall({\n blockNumber = 'latest',\n calls,\n web3Instance,\n}: {\n /**\n * Defaults to `latest`\n */\n blockNumber?: number | string | ReturnType;\n calls: MulticallTuple[];\n web3Instance: Web3;\n}) {\n const {default: lazyMulticallABI} = await import(\n '../../../truffle-contracts/Multicall.json'\n );\n\n // Let's `console.error` and exit instead of throwing.\n if (!MULTICALL_CONTRACT_ADDRESS) {\n console.error('No Multicall address was found. Are you sure it is set?');\n return;\n }\n\n try {\n const {methods: multicallMethods} = new web3Instance.eth.Contract(\n lazyMulticallABI as AbiItem[],\n MULTICALL_CONTRACT_ADDRESS\n );\n\n const {returnData} = await multicallMethods\n .aggregate(\n calls.map(([address, abi, params]) => [\n address.toLowerCase(),\n web3Instance.eth.abi.encodeFunctionCall(abi, params),\n ])\n )\n .call({}, blockNumber);\n\n return returnData.map((hexString: string, i: number) => {\n const outputsABIItem = calls[i][1].outputs || [];\n const decodedOutputs = web3Instance.eth.abi.decodeParameters(\n outputsABIItem,\n hexString\n );\n\n // Output as single result\n if (\n decodedOutputs.__length__ === 1 &&\n decodedOutputs['0'] !== undefined\n ) {\n return decodedOutputs['0'];\n }\n\n return web3Instance.eth.abi.decodeParameters(\n outputsABIItem || [],\n hexString\n );\n });\n } catch (error) {\n throw error;\n }\n}\n","/**\n * FOR HIGH REUSE ENUMS\n *\n * For any other more specific enum types, co-locate them in either:\n *\n * 1) The actual code file.\n * 2) In a type file in the location of the code files which mainly use the types.\n *\n * @see https://kentcdodds.com/blog/colocation\n */\n\n/**\n * @see https://chainid.network/\n */\nexport enum NetworkIDs {\n GOERLI = 5,\n KOVAN = 42,\n RINKEBY = 4,\n ROPSTEN = 3,\n MAINNET = 1,\n}\n\n/**\n * @see https://chainid.network/\n */\nexport enum NetworkNames {\n GOERLI = 'goerli',\n KOVAN = 'kovan',\n RINKEBY = 'rinkeby',\n ROPSTEN = 'ropsten',\n MAINNET = 'mainnet',\n}\n\nexport enum FormFieldErrors {\n REQUIRED = 'This field is required.',\n INVALID_BYTES32 = 'The value is not a bytes32.',\n INVALID_BYTES32_ARRAY = 'The value is not a comma-separated bytes32 format, ie. 0x...,0x...',\n INVALID_EMAIL = 'The email address is invalid.',\n INVALID_ETHEREUM_ADDRESS = 'The ethereum address is invalid.',\n INVALID_NUMBER = 'The value is not a number.',\n INVALID_NUMBER_ARRAY = 'The value is not a comma-separated number format, ie. 42,5,124',\n}\n\nexport enum ProposalHeaderNames {\n FAILED = 'Failed',\n PASSED = 'Passed',\n REQUESTS = 'Proposals',\n VOTING = 'Voting',\n}\n","import {useState, useEffect, useRef} from 'react';\n\ntype UseAbortControllerReturn = {\n abortController: AbortController | undefined;\n isMountedRef: React.MutableRefObject;\n};\n\n/**\n * useAbortController\n *\n * Provides an `AbortController` to cancel requests.\n * Also provides a helper `isMountedRef` to see if the React component has\n * been unmounted and therefore should not run any setting of state.\n */\nexport function useAbortController(): UseAbortControllerReturn {\n /**\n * State\n */\n\n const [abortController, setAbortController] = useState();\n\n /**\n * Refs\n */\n\n const isMountedRef = useRef(false);\n\n /**\n * Effects\n */\n\n useEffect(() => {\n isMountedRef.current = true;\n\n !abortController && setAbortController(new AbortController());\n\n return () => {\n isMountedRef.current = false;\n\n abortController && abortController.abort();\n };\n }, [abortController]);\n\n return {\n abortController,\n isMountedRef,\n };\n}\n","import {useReducer} from 'react';\n\ntype CounterState = {\n count: number;\n};\n\ntype CounterAction = {\n type: 'increment';\n};\n\ntype CounterReturn = [number, React.Dispatch];\n\nconst initialState = {count: 0};\n\nfunction reducer(state: CounterState, action: CounterAction) {\n switch (action.type) {\n case 'increment':\n return {count: state.count + 1};\n default:\n return state;\n }\n}\n\n/**\n * useCounter\n *\n * A counter which is kept track of via a reducer.\n *\n * @note This is mainly to use inside a custom hook's callback resulting in a\n * changed dependency for consumer's useEffect when a consumer higher up wants to trigger a \"re-run\"\n * (i.e. re-fetch, refresh some data), similarly to dispatching a Redux action again to update the state.\n */\nexport function useCounter(): CounterReturn {\n const [state, dispatch] = useReducer(reducer, initialState);\n\n return [state.count, dispatch];\n}\n","import {useCallback, useEffect, useState} from 'react';\nimport {useLazyQuery} from '@apollo/react-hooks';\n\nimport {StoreState} from '../store/types';\nimport {useSelector} from 'react-redux';\n\nimport {GET_DAO} from '../gql';\n\ntype UseDaoReturn = {\n dao: Record | undefined;\n gqlError: Error | undefined;\n};\n\n/**\n * useDao\n *\n * This component queries The Graph API to get data on the dao\n *\n * @returns {UseDaoReturn}\n */\nexport function useDao(): UseDaoReturn {\n const daoRegistryContract = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract\n );\n\n const [getDao, {called, loading, data, error}] = useLazyQuery(GET_DAO, {\n variables: {id: daoRegistryContract?.contractAddress.toLowerCase()},\n });\n\n const [dao, setDao] = useState | undefined>();\n const [gqlError, setGqlError] = useState();\n\n const getDaoRegistryCallback = useCallback(getDaoRegistry, [\n daoRegistryContract?.contractAddress,\n data,\n error,\n loading,\n ]);\n\n useEffect(() => {\n if (!called) {\n getDao();\n }\n }, [called, getDao]);\n\n useEffect(() => {\n if (!loading && daoRegistryContract?.contractAddress) {\n getDaoRegistryCallback();\n }\n }, [daoRegistryContract?.contractAddress, getDaoRegistryCallback, loading]);\n\n function getDaoRegistry() {\n try {\n if (!loading && data) {\n setDao(data.tributeDaos[0]);\n\n if (data.tributeDaos.length === 0) {\n const error = new Error(\n `\"${daoRegistryContract?.contractAddress}\" dao address not found.`\n );\n\n throw error;\n }\n } else {\n if (error) {\n const error = new Error(\n `\"${daoRegistryContract?.contractAddress}\" is not a valid dao address.`\n );\n\n throw error;\n }\n }\n } catch (error) {\n setGqlError(error);\n }\n }\n\n return {dao, gqlError};\n}\n","import {AbiItem} from 'web3-utils/types';\nimport {useEffect, useState} from 'react';\nimport {useSelector} from 'react-redux';\nimport Web3 from 'web3';\n\nimport {AsyncStatus} from '../util/types';\nimport {ContractDAOConfigKeys} from '../components/web3/types';\nimport {multicall, MulticallTuple} from '../components/web3/helpers';\nimport {StoreState} from '../store/types';\nimport {useWeb3Modal} from '../components/web3/hooks';\n\ntype ConfigEntriesReturn = {\n daoConfigurations: string[];\n daoConfigurationsError: Error | undefined;\n daoConfigurationsStatus: AsyncStatus;\n};\n\nconst INITIAL_CONFIG_ENTRIES: ConfigEntriesReturn['daoConfigurations'] = [];\n\n/**\n * useDaoConfigurations\n *\n * Pass in an array of plain text DAO configuration names to get\n * and the hook will return their values in an array, in the same order.\n *\n * @param configKeys\n * @returns `ConfigEntriesReturn`\n */\nexport function useDaoConfigurations(\n /**\n * The keys of any configuration settings to get from the DAO.\n */\n configKeys: ContractDAOConfigKeys[]\n): ConfigEntriesReturn {\n /**\n * Selectors\n */\n\n const daoRegistryAddress = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract?.contractAddress\n );\n\n const daoRegistryABI = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract?.abi\n );\n\n /**\n * State\n */\n\n const [daoConfigurations, setDaoConfigurations] = useState<\n ConfigEntriesReturn['daoConfigurations']\n >(INITIAL_CONFIG_ENTRIES);\n\n const [daoConfigurationsStatus, setDaoConfigurationsStatus] = useState<\n ConfigEntriesReturn['daoConfigurationsStatus']\n >(AsyncStatus.STANDBY);\n\n const [daoConfigurationsError, setDaoConfigurationsError] =\n useState();\n\n /**\n * Our hooks\n */\n\n const {web3Instance} = useWeb3Modal();\n\n /**\n * Variables\n */\n\n const getConfigurationABI = daoRegistryABI?.find(\n (ai) => ai.name === 'getConfiguration'\n );\n\n /**\n * Effects\n */\n\n // Handle getting the configurations\n useEffect(() => {\n if (!daoRegistryAddress || !getConfigurationABI || !web3Instance) {\n return;\n }\n\n handleGetConfigurations({\n abi: getConfigurationABI,\n configKeys,\n contractAddress: daoRegistryAddress,\n web3Instance,\n });\n }, [configKeys, daoRegistryAddress, getConfigurationABI, web3Instance]);\n\n /**\n * Functions\n */\n\n async function handleGetConfigurations({\n abi,\n configKeys,\n contractAddress,\n web3Instance,\n }: {\n configKeys: ContractDAOConfigKeys[];\n contractAddress: string;\n abi: AbiItem;\n web3Instance: Web3;\n }) {\n try {\n const calls: MulticallTuple[] = configKeys.map((ck) => [\n contractAddress,\n abi,\n [web3Instance.utils.sha3(ck) || ''],\n ]);\n\n setDaoConfigurationsError(undefined);\n setDaoConfigurationsStatus(AsyncStatus.PENDING);\n\n setDaoConfigurations(await multicall({calls, web3Instance}));\n\n setDaoConfigurationsStatus(AsyncStatus.FULFILLED);\n } catch (error) {\n setDaoConfigurations(INITIAL_CONFIG_ENTRIES);\n setDaoConfigurationsStatus(AsyncStatus.REJECTED);\n setDaoConfigurationsError(error);\n }\n }\n\n return {\n daoConfigurations,\n daoConfigurationsError,\n daoConfigurationsStatus,\n };\n}\n","import {useCallback, useEffect, useState} from 'react';\nimport {useLazyQuery} from '@apollo/react-hooks';\nimport {useSelector} from 'react-redux';\n\nimport {AsyncStatus} from '../util/types';\nimport {StoreState} from '../store/types';\nimport {SubgraphNetworkStatus} from '../store/subgraphNetworkStatus/types';\nimport {GET_DAO} from '../gql';\nimport {TOTAL_ADDRESS, UNITS_ADDRESS} from '../config';\n\ntype UseDaoTotalUnitsReturn = {\n totalUnits: number | undefined;\n totalUnitsError: Error | undefined;\n totalUnitsStatus: AsyncStatus;\n};\n\n/**\n * useDaoTotalUnits\n *\n * Gets DAO total units from subgraph with direct onchain fallback.\n *\n * @returns {UseDaoTotalUnitsReturn}\n */\nexport function useDaoTotalUnits(): UseDaoTotalUnitsReturn {\n /**\n * Selectors\n */\n\n const DaoRegistryContract = useSelector(\n (state: StoreState) => state.contracts.DaoRegistryContract\n );\n const BankExtensionContract = useSelector(\n (state: StoreState) => state.contracts.BankExtensionContract\n );\n const subgraphNetworkStatus = useSelector(\n (state: StoreState) => state.subgraphNetworkStatus.status\n );\n\n /**\n * GQL Query\n */\n\n const [getDaoFromSubgraphResult, {called, loading, data, error}] =\n useLazyQuery(GET_DAO, {\n variables: {\n id: DaoRegistryContract?.contractAddress.toLowerCase(),\n },\n });\n\n /**\n * State\n */\n\n const [totalUnits, setTotalUnits] = useState();\n const [totalUnitsStatus, setTotalUnitsStatus] = useState(\n AsyncStatus.STANDBY\n );\n const [totalUnitsError, setTotalUnitsError] = useState();\n\n /**\n * Cached callbacks\n */\n\n const getTotalUnitsFromExtensionCached = useCallback(\n getTotalUnitsFromExtension,\n [BankExtensionContract]\n );\n\n const getTotalUnitsFromSubgraphCached = useCallback(\n getTotalUnitsFromSubgraph,\n [data, error, getTotalUnitsFromExtensionCached, loading]\n );\n\n /**\n * Effects\n */\n\n useEffect(() => {\n if (!called) {\n getDaoFromSubgraphResult();\n }\n }, [called, getDaoFromSubgraphResult]);\n\n useEffect(() => {\n if (subgraphNetworkStatus === SubgraphNetworkStatus.OK) {\n if (!loading && DaoRegistryContract?.contractAddress) {\n getTotalUnitsFromSubgraphCached();\n }\n } else {\n // If there is a subgraph network error fallback to fetching totalUnits\n // directly from smart contract\n getTotalUnitsFromExtensionCached();\n }\n }, [\n DaoRegistryContract?.contractAddress,\n getTotalUnitsFromExtensionCached,\n getTotalUnitsFromSubgraphCached,\n loading,\n subgraphNetworkStatus,\n ]);\n\n /**\n * Functions\n */\n\n function getTotalUnitsFromSubgraph() {\n try {\n setTotalUnitsStatus(AsyncStatus.PENDING);\n\n if (!loading && data) {\n // extract totalUnits from gql data\n const {totalUnits} = data.tributeDaos[0] as Record;\n setTotalUnits(Number(totalUnits));\n setTotalUnitsStatus(AsyncStatus.FULFILLED);\n } else {\n if (error) {\n throw new Error(error.message);\n }\n }\n } catch (error) {\n // If there is a subgraph query error fallback to fetching totalUnits\n // directly from smart contract\n console.log(`subgraph query error: ${error.message}`);\n getTotalUnitsFromExtensionCached();\n }\n }\n\n async function getTotalUnitsFromExtension() {\n if (!BankExtensionContract) {\n return;\n }\n\n try {\n setTotalUnitsStatus(AsyncStatus.PENDING);\n\n const totalUnits = await BankExtensionContract.instance.methods\n .balanceOf(TOTAL_ADDRESS, UNITS_ADDRESS)\n .call();\n\n setTotalUnits(Number(totalUnits));\n setTotalUnitsStatus(AsyncStatus.FULFILLED);\n } catch (error) {\n console.log(error);\n setTotalUnits(undefined);\n setTotalUnitsError(error);\n setTotalUnitsStatus(AsyncStatus.REJECTED);\n }\n }\n\n return {totalUnits, totalUnitsError, totalUnitsStatus};\n}\n","import {useEffect, useRef} from 'react';\n\ntype UseIsMountedReturn = {\n isMountedRef: React.MutableRefObject;\n};\n\n/**\n * useIsMounted\n *\n * A hook that returns a React Ref which tells if the component is mounted, or not.\n * This is helpful when needing to stop state updates in hooks with effects.\n */\nexport function useIsMounted(): UseIsMountedReturn {\n /**\n * Refs\n */\n\n const isMountedRef = useRef(false);\n\n /**\n * Effects\n */\n\n useEffect(() => {\n isMountedRef.current = true;\n\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n return {\n isMountedRef,\n };\n}\n","import React, {useCallback, useState} from 'react';\nimport ReactModal from 'react-modal';\n\nimport {StoreState} from '../store/types';\nimport {useSelector} from 'react-redux';\nimport {useWeb3Modal} from '../components/web3/hooks';\nimport FadeIn from '../components/common/FadeIn';\nimport TimesSVG from '../assets/svg/TimesSVG';\n\n/**\n * Props should be cached somehow to prevent a new object\n * making the hook re-render each time the parent re-renders,\n * causing a continuous loop.\n */\ntype UseMemberActionDisabledProps = {\n /**\n * Allows the active member check to be skipped.\n * e.g. A tx does not require the account to be a member.\n */\n skipIsActiveMemberCheck?: boolean;\n};\n\ntype UseMemberActionDisabledReturn = {\n disabledReason: string;\n isDisabled: boolean;\n openWhyDisabledModal: () => void;\n setOtherDisabledReasons: (r: string[]) => void;\n WhyDisabledModal: (p: WhyDisabledModalProps) => JSX.Element | null;\n};\n\ntype WhyDisabledModalProps = {\n title?: string;\n};\n\n/**\n * useMemberActionDisabled\n *\n * This component covers the most common cases for why a member action button should be disabled.\n * More reasons for disabling the button can be added via props using `setOtherDisabledReasons`.\n *\n * @param {ProposalActionWhyDisabledProps} props\n * @returns {UseMemberActionDisabledReturn}\n */\nexport function useMemberActionDisabled(\n props?: UseMemberActionDisabledProps\n): UseMemberActionDisabledReturn {\n const {skipIsActiveMemberCheck = false} = props || {};\n\n /**\n * State\n */\n\n const [otherDisabledReasons, setOtherDisabledReasons] = useState(\n []\n );\n const [shouldShowWhyModal, setShouldShowWhyModal] = useState(false);\n\n /**\n * Selectors\n */\n\n const isActiveMember = useSelector(\n (s: StoreState) => s.connectedMember?.isActiveMember\n );\n\n /**\n * Our hooks\n */\n\n const {connected} = useWeb3Modal();\n\n /**\n * Variables\n */\n\n // Get the first index of other reasons.\n const otherReasonNext =\n otherDisabledReasons && otherDisabledReasons.find((r) => r);\n const disabledReason = getDisabledReason();\n const isDisabled =\n (disabledReason ? true : false) || (otherReasonNext ? true : false);\n const canShowDisabledReason = isDisabled && disabledReason ? true : false;\n\n /**\n * Cached callbacks\n */\n\n const WhyDisabledModalCached = useCallback(WhyDisabledModal, [\n canShowDisabledReason,\n disabledReason,\n shouldShowWhyModal,\n ]);\n\n const handleSetOtherDisabledReasonsCached = useCallback(\n handleSetOtherDisabledReasons,\n []\n );\n\n /**\n * Functions\n */\n\n function handleSetOtherDisabledReasons(otherReasons: string[]) {\n setOtherDisabledReasons(otherReasons.filter(Boolean));\n }\n\n function getDisabledReason() {\n if (!connected) {\n return 'Your wallet is not connected.';\n }\n\n if (!isActiveMember && !skipIsActiveMemberCheck) {\n return 'Either you are not a member, or your membership is not active.';\n }\n\n return otherReasonNext || '';\n }\n\n function handleOpenWhyDisabledModal() {\n setShouldShowWhyModal(true);\n }\n\n function WhyDisabledModal(props: WhyDisabledModalProps): JSX.Element | null {\n if (!canShowDisabledReason) return null;\n\n const {title} = props;\n\n return (\n {\n setShouldShowWhyModal(false);\n }}\n overlayClassName=\"modal-overlay\"\n role=\"dialog\"\n style={{overlay: {zIndex: 1000}}}>\n \n
\n {\n setShouldShowWhyModal(false);\n }}>\n \n \n
\n

{title || 'Why disabled?'}

\n

{disabledReason}

\n
\n
\n
\n \n );\n }\n\n return {\n disabledReason,\n isDisabled,\n openWhyDisabledModal: handleOpenWhyDisabledModal,\n setOtherDisabledReasons: handleSetOtherDisabledReasonsCached,\n WhyDisabledModal: WhyDisabledModalCached,\n };\n}\n","import {useCallback, useEffect, useState} from 'react';\nimport {useSelector} from 'react-redux';\nimport BigNumber from 'bignumber.js';\nimport Web3 from 'web3';\n\nimport {AsyncStatus} from '../util/types';\nimport {ENVIRONMENT, UNITS_ADDRESS} from '../config';\nimport {StoreState} from '../store/types';\nimport {useIsMounted} from './useIsMounted';\nimport {useWeb3Modal} from '../components/web3/hooks';\n\ntype UseMemberUnitsAtSnapshotReturn = {\n /**\n * Was the member to check a member of the DAO at the\n * requested snapshot?\n */\n hasMembershipAtSnapshot: boolean;\n /**\n * Member units as a `string`.\n * Convert to a `BigNumber`, if needed for calculation.\n */\n memberUnitsAtSnapshot: string | undefined;\n memberUnitsAtSnapshotError: Error | undefined;\n memberUnitsAtSnapshotStatus: AsyncStatus;\n};\n\nconst {STANDBY, PENDING, FULFILLED, REJECTED} = AsyncStatus;\n\nconst DEFAULT_POLL_INTERVAL_MS: number =\n ENVIRONMENT === 'production' ? 15000 : 5000;\n\nconst DEFAULT_BLOCK_CHECK_OFFSET: number = 2;\n\n/**\n * In order for `getPriorAmount` to return without reverting,\n * we must be sending a block number from the past.\n *\n * We must poll to wait until the block is in the past.\n * We could poll `getPriorAmount` until it does not revert, but\n * doing this could hide other errors.\n *\n * @param number `blockToCompare`\n * @param Web3 `web3Instance`\n * @returns `boolean`\n * @see `getPriorAmount` in `tribute-contracts`\n */\nasync function pollUntilBlockInPast({\n block,\n blockOffset = DEFAULT_BLOCK_CHECK_OFFSET,\n isMountedRef,\n pollInterval = DEFAULT_POLL_INTERVAL_MS,\n web3Instance,\n}: {\n block: number;\n blockOffset?: number;\n isMountedRef?: React.MutableRefObject;\n pollInterval?: number;\n web3Instance: Web3;\n}) {\n return new Promise(async (resolve, reject) => {\n /**\n * Uses a positive block offset to check if the difference between `block` provided\n * and `currentBlock` is at least at or greater than the `blockOffset`.\n *\n * This is used to limit errors from `getPriorAmount` when the block is not in the past.\n * If we set an offset, it helps to mitigate issues where the fetched block number\n * and the `block.number in the contract are not yet aligned.\n */\n const blockOffsetCheck = (block: number, currentBlock: number): boolean => {\n const blockDifference: number = currentBlock - block;\n\n return blockDifference >= Math.abs(blockOffset);\n };\n\n // Check immediately\n try {\n if (blockOffsetCheck(block, await web3Instance.eth.getBlockNumber())) {\n resolve(true);\n\n return;\n }\n } catch (error) {\n reject(error);\n\n return;\n }\n\n // If the initial check did not succeed, begin to poll.\n const intervalId = setInterval(async () => {\n try {\n if (!isMountedRef?.current) {\n clearInterval(intervalId);\n\n return;\n }\n\n if (blockOffsetCheck(block, await web3Instance.eth.getBlockNumber())) {\n clearInterval(intervalId);\n resolve(true);\n }\n } catch (error) {\n clearInterval(intervalId);\n reject(error);\n }\n }, pollInterval);\n });\n}\n\nexport function useMemberUnitsAtSnapshot(\n memberAddress: string | undefined,\n snapshot: number | undefined,\n options?: {\n blockCheckOffset?: number;\n currentBlockPollIntervalMs?: number;\n }\n): UseMemberUnitsAtSnapshotReturn {\n const {blockCheckOffset, currentBlockPollIntervalMs} = options || {};\n\n /**\n * Selectors\n */\n\n const bankExtensionMethods = useSelector(\n (s: StoreState) => s.contracts.BankExtensionContract?.instance.methods\n );\n\n /**\n * State\n */\n\n const [memberUnitsAtSnapshot, setMemberUnitsAtSnapshot] = useState();\n\n const [hasMembershipAtSnapshot, setHasMembershipAtSnapshot] =\n useState(false);\n\n const [memberUnitsAtSnapshotError, setMemberUnitsAtSnapshotError] =\n useState();\n\n const [memberUnitsAtSnapshotStatus, setMemberUnitsAtSnapshotStatus] =\n useState(STANDBY);\n\n /**\n * Our hooks\n */\n\n const {web3Instance} = useWeb3Modal();\n const {isMountedRef} = useIsMounted();\n\n /**\n * Cached Callbacks\n */\n\n const handleGetPriorUnitsAmountCached = useCallback(\n handleGetPriorUnitsAmount,\n [isMountedRef]\n );\n\n /**\n * Effects\n */\n\n useEffect(() => {\n // These parameters may be arriving async and not ready, yet.\n if (!memberAddress || !snapshot || !bankExtensionMethods || !web3Instance) {\n return;\n }\n\n handleGetPriorUnitsAmountCached({\n bankExtensionMethods,\n blockCheckOffset,\n currentBlockPollIntervalMs,\n memberAddress,\n snapshot,\n web3Instance,\n });\n }, [\n bankExtensionMethods,\n blockCheckOffset,\n currentBlockPollIntervalMs,\n handleGetPriorUnitsAmountCached,\n memberAddress,\n snapshot,\n web3Instance,\n ]);\n\n /**\n * Functions\n */\n\n async function handleGetPriorUnitsAmount({\n bankExtensionMethods,\n blockCheckOffset,\n currentBlockPollIntervalMs,\n memberAddress,\n snapshot,\n web3Instance,\n }: {\n bankExtensionMethods: any;\n blockCheckOffset?: number;\n currentBlockPollIntervalMs?: number;\n memberAddress: string;\n snapshot: number;\n web3Instance: Web3;\n }): Promise {\n try {\n // Reset any error\n setMemberUnitsAtSnapshotError(undefined);\n setMemberUnitsAtSnapshotStatus(PENDING);\n\n /**\n * Poll until we are at a block in the past.\n *\n * For example, in governance votes, this can be an issue for anyone trying\n * to vote in the same block as the proposal's snapshot,\n * as `getPriorAmount` will revert if `blockToCheck >= block.number`.\n *\n * This is not an issue with on-chain proposals.\n */\n await pollUntilBlockInPast({\n block: snapshot,\n blockOffset: blockCheckOffset,\n isMountedRef,\n pollInterval: currentBlockPollIntervalMs,\n web3Instance,\n });\n\n const memberUnitsAtSnapshot: string = await bankExtensionMethods\n .getPriorAmount(memberAddress, UNITS_ADDRESS, snapshot)\n .call();\n\n if (!isMountedRef.current) return;\n\n setMemberUnitsAtSnapshot(memberUnitsAtSnapshot);\n\n setHasMembershipAtSnapshot(\n new BigNumber(memberUnitsAtSnapshot).isGreaterThan(new BigNumber(0))\n );\n\n setMemberUnitsAtSnapshotStatus(FULFILLED);\n } catch (error) {\n if (!isMountedRef.current) return;\n\n setHasMembershipAtSnapshot(false);\n setMemberUnitsAtSnapshot(undefined);\n setMemberUnitsAtSnapshotError(error);\n setMemberUnitsAtSnapshotStatus(REJECTED);\n }\n }\n\n return {\n hasMembershipAtSnapshot,\n memberUnitsAtSnapshot,\n memberUnitsAtSnapshotError,\n memberUnitsAtSnapshotStatus,\n };\n}\n","import {useEffect, useRef, useState} from 'react';\n\nimport {AsyncStatus} from '../util/types';\n\ntype UseTimeStartEndReturn = {\n hasTimeEnded: boolean;\n hasTimeStarted: boolean;\n /**\n * Informs if the initial async checks have run.\n * This helps to tame UI false-positives that can arise when\n * using only booleans to check status.\n */\n timeStartEndInitReady: boolean;\n};\n\ntype StartEndStatus = {start: AsyncStatus; end: AsyncStatus};\n\nconst {FULFILLED, PENDING, STANDBY} = AsyncStatus;\n\nfunction areAllAsyncReady(asyncMapping: Record) {\n return Object.values(asyncMapping).every((s) => s === FULFILLED);\n}\n\n/**\n * Provides `boolean` results when time starts and ends.\n *\n * If either `startSeconds` or `endSeconds` are `undefined`, or `<= 0`\n * the checks will never run; only `timeStartEndInitReady` will ever be `true`.\n *\n * @param startSeconds\n * @param endSeconds\n * @returns `UseTimeStartEndReturn`\n */\nexport function useTimeStartEnd(\n startSeconds: number | undefined,\n endSeconds: number | undefined\n): UseTimeStartEndReturn {\n /**\n * Refs\n */\n\n const startEndStatusRef = useRef({\n start: STANDBY,\n end: STANDBY,\n });\n\n /**\n * State\n */\n\n const [hasTimeStarted, setHasTimeStarted] = useState(false);\n const [hasTimeEnded, setHasTimeEnded] = useState(false);\n\n const [timeStartEndInitReady, setTimeStartEndInitReady] = useState(\n areAllAsyncReady(startEndStatusRef.current)\n );\n\n /**\n * Variables\n */\n\n const shouldNotCheck: boolean =\n startSeconds === undefined ||\n endSeconds === undefined ||\n startSeconds <= 0 ||\n endSeconds <= 0;\n\n /**\n * Effects\n */\n\n // Actively check if time has started\n useEffect(() => {\n if (hasTimeStarted || shouldNotCheck) {\n setTimeStartEndInitReady(() => {\n startEndStatusRef.current.start = FULFILLED;\n return areAllAsyncReady(startEndStatusRef.current);\n });\n\n return;\n }\n\n setTimeStartEndInitReady(() => {\n startEndStatusRef.current.start = PENDING;\n return areAllAsyncReady(startEndStatusRef.current);\n });\n\n // Check if time has started every 1 second\n const intervalID = setInterval(() => {\n const hasStartedCheck: boolean =\n Math.floor(Date.now() / 1000) > (startSeconds ?? 0);\n\n setHasTimeStarted(hasStartedCheck);\n\n // The interval async process has run once\n if (startEndStatusRef.current.start !== FULFILLED) {\n setTimeStartEndInitReady(() => {\n startEndStatusRef.current.start = FULFILLED;\n return areAllAsyncReady(startEndStatusRef.current);\n });\n }\n }, 1000);\n\n return function cleanup() {\n if (intervalID) {\n clearInterval(intervalID);\n }\n };\n }, [hasTimeStarted, shouldNotCheck, startSeconds]);\n\n // Actively check if time has ended\n useEffect(() => {\n if (hasTimeEnded || shouldNotCheck) {\n setTimeStartEndInitReady(() => {\n startEndStatusRef.current.end = FULFILLED;\n return areAllAsyncReady(startEndStatusRef.current);\n });\n\n return;\n }\n\n setTimeStartEndInitReady(() => {\n startEndStatusRef.current.end = PENDING;\n return areAllAsyncReady(startEndStatusRef.current);\n });\n\n // Check if time has ended every 1 second\n const intervalID = setInterval(() => {\n const hasEndedCheck: boolean =\n Math.ceil(Date.now() / 1000) > (endSeconds ?? 0);\n\n setHasTimeEnded(hasEndedCheck);\n\n // The interval async process has run once\n if (startEndStatusRef.current.end !== FULFILLED) {\n setTimeStartEndInitReady(() => {\n startEndStatusRef.current.end = FULFILLED;\n return areAllAsyncReady(startEndStatusRef.current);\n });\n }\n }, 1000);\n\n return function cleanup() {\n if (intervalID) {\n clearInterval(intervalID);\n }\n };\n }, [endSeconds, hasTimeEnded, shouldNotCheck]);\n\n return {\n hasTimeStarted,\n hasTimeEnded,\n timeStartEndInitReady,\n };\n}\n","import {\n SnapshotDraftData,\n SnapshotProposalData,\n SnapshotDraftResponseData,\n SnapshotProposalResponseData,\n SnapshotType,\n VoteChoices,\n} from '@openlaw/snapshot-js-erc712';\nimport {AbiItem} from 'web3-utils/types';\nimport {Contract} from 'web3-eth-contract/types';\n\nimport {ContractAdapterNames} from '../web3/types';\nimport {VotingAdapterName} from '../adapters-extensions/enums';\nimport {VotingState} from './voting/types';\n\n/**\n * ENUMS\n */\n\n/**\n * Mapping of DaoRegistry proposal flags.\n * This should match the enum (including order) in the `DaoRegistry`. If it does not match,\n * the results of checking the proposal's state via flag will be wrong.\n *\n * @see `ProposalFlag` `DaoRegistry.sol`\n * @see `getFlag` `DaoConstants.sol`\n * @see `setFlag` `DaoConstants.sol`\n */\nexport enum ProposalFlag {\n EXISTS,\n SPONSORED,\n PROCESSED,\n}\n\n// @todo Need more information about the vote challenge flow.\nexport enum ProposalFlowStatus {\n Submit = 'Submit',\n Sponsor = 'Sponsor',\n OffchainVoting = 'OffchainVoting',\n OffchainVotingSubmitResult = 'OffchainVotingSubmitResult',\n OffchainVotingGracePeriod = 'OffchainVotingGracePeriod',\n OnchainVoting = 'OnchainVoting',\n Process = 'Process',\n Completed = 'Completed',\n}\n\n/**\n * @see `Distribute.sol` in tribute-contracts\n */\nexport enum DistributionStatus {\n NOT_STARTED,\n IN_PROGRESS,\n DONE,\n FAILED,\n}\n\n/**\n * This is an internal type we use for sending to Snapshot Hub via\n * `metadata: {}` to indicate the proposal is only meant for xyz.\n *\n * @note Only set the `metadata.type` in the case where the proposal's usage\n * cannot be determined by the `actionId` (adapter address) alone.\n */\nexport enum SnapshotMetadataType {\n Governance = 'Governance',\n}\n\n/**\n * TYPES\n */\n\nexport type Proposal = {\n adapterAddress: string;\n flags: string; // unint256 of Proposal's current flag\n};\n\n// Arguments for an optional render prop for `` and its child action wrapping components.\nexport type RenderActionPropArguments = {\n [VotingAdapterName.OffchainVotingContract]: {\n adapterName: ContractAdapterNames;\n // An enum name (`string`) of the DAO proposal's `VotingState` index\n daoProposalVoteResult: typeof VotingState[any] | undefined;\n daoProposalVote: OffchainVotingAdapterVote | undefined;\n gracePeriodStartMs: number | undefined;\n gracePeriodEndMs: number | undefined;\n proposal: ProposalData;\n status: ProposalFlowStatus | undefined;\n };\n};\n\n// @todo Change the type to be precise\nexport type SubgraphProposal = Record;\n\n/**\n * We augment the response data to add a few helpful data pieces.\n */\nexport type SnapshotDraft = {\n /**\n * The ID used to reference the DAO.\n */\n idInDAO: string;\n /**\n * An ID helper to reference the Draft hash\n */\n idInSnapshot: string;\n} & SnapshotDraftResponseData;\n\n/**\n * We augment the response data to add a few helpful data pieces.\n */\nexport type SnapshotProposal = {\n /**\n * The ID used to reference the DAO.\n */\n idInDAO: string;\n /**\n * An ID helper to reference the Proposal hash\n */\n idInSnapshot: string;\n} & SnapshotProposalResponseData;\n\n/**\n * Common data shared between a Snapshot Drafts and Proposals.\n * Helpful when we need to display information which is accessible on both.\n */\nexport type SnapshotProposalCommon = SnapshotDraft | SnapshotProposal;\n\nexport type ProposalData = {\n // @todo Make non-nullable?\n idInDAO?: string;\n // @todo Make non-nullable?\n daoProposalVotingAdapter?: ProposalVotingAdapterData;\n // @todo Make non-nullable?\n daoProposalVote?: ProposalVotesData;\n // @todo Make non-nullable?\n daoProposalVotingState?: VotingState;\n daoProposal: Proposal | undefined;\n /**\n * Data for either a Draft or Proposal which is shared between the two types.\n */\n getCommonSnapshotProposalData: () => SnapshotProposalCommon | undefined;\n refetchProposalOrDraft: () => void;\n snapshotDraft: SnapshotDraft | undefined;\n snapshotProposal: SnapshotProposal | undefined;\n snapshotType: ProposalOrDraftSnapshotType | undefined;\n};\n\n/**\n * A conditional helper type for determining which data shape to use.\n *\n * @link https://www.typescriptlang.org/docs/handbook/2/conditional-types.html\n */\nexport type ProposalOrDraftSnapshotData =\n | SnapshotDraftResponseData\n | SnapshotProposalResponseData;\n\nexport type ProposalOrDraftSnapshotType =\n | SnapshotType.proposal\n | SnapshotType.draft;\n\n/**\n * A conditional helper type for determining which data shape to use based on the `ProposalOrDraftSnapshotType`.\n *\n * @link https://www.typescriptlang.org/docs/handbook/2/conditional-types.html\n */\nexport type ProposalOrDraftSignDataFromType<\n T extends ProposalOrDraftSnapshotType\n> = T extends SnapshotType.proposal ? SnapshotProposalData : SnapshotDraftData;\n\n/**\n * Voting.sol->Voting\n *\n * @link https://github.com/openlawteam/tribute-contracts/blob/master/contracts/adapters/voting/Voting.sol\n */\nexport type VotingAdapterVotes = {\n blockNumber: string;\n nbNo: string;\n nbYes: string;\n startingTime: string;\n};\n\n/**\n * OffchainVoting.sol->Voting\n *\n * @link https://github.com/openlawteam/tribute-contracts/blob/master/contracts/adapters/voting/OffchainVoting.sol\n */\nexport type OffchainVotingAdapterVote = {\n fallbackVotesCount: string;\n forceFailed: boolean;\n gracePeriodStartingTime: string;\n index: string;\n isChallenged: boolean;\n nbNo: string;\n nbYes: string;\n reporter: string;\n resultRoot: string;\n snapshot: string;\n startingTime: string;\n};\n\n/**\n * VotingResult\n *\n * A custom result we build to deliver to components.\n * It should accommodate all types of yes/no voting (i.e. on-chain, off-chain).\n */\n\nexport type VoteChoiceResult = {\n percentage: number;\n units: number;\n};\n\nexport type VotingResult = {\n [VoteChoices.Yes]: VoteChoiceResult;\n [VoteChoices.No]: VoteChoiceResult;\n totalUnits: number;\n};\n\n/**\n * Proposal's voting adapter data\n */\nexport type ProposalVotingAdapterData = {\n votingAdapterName: VotingAdapterName;\n votingAdapterAddress: string;\n /**\n * Get the ABI for the proposal.\n * The object is not included inline to\n * save from repetitive data (some ABIs can be large).\n */\n getVotingAdapterABI: () => AbiItem[];\n // Helper to use the Web3 Contract directly\n getWeb3VotingAdapterContract: () => Contract;\n};\n\nexport type ProposalVotingAdapterTuple = [\n proposalId: string,\n votingAdapterData: ProposalVotingAdapterData\n];\n\n/**\n * Proposal on-chain votes data\n *\n * @see `useProposalsVotes`\n */\nexport type ProposalVotesData = {\n [VotingAdapterName.OffchainVotingContract]?: OffchainVotingAdapterVote;\n [VotingAdapterName.VotingContract]?: VotingAdapterVotes;\n};\n","import React, {useEffect, useState} from 'react';\n\ninterface IProps {\n // Show spinner after some time has elapsed.\n // Prevents the \"sudden spinner\" UI/UX no-no.\n // Esp. if we could have cached data.\n showAfterMs?: number;\n text?: string;\n textProps?: {[key: string]: any};\n}\n\nfunction Spinner(props: Partial) {\n return
;\n}\n\nconst Loader = (\n props: IProps & React.PropsWithoutRef\n) => {\n const {showAfterMs, text, textProps, ...loaderProps} = props;\n const [showLoaderAfterMs, setShowLoaderAfterMs] = useState(false);\n\n useEffect(() => {\n /* 200ms is approx. the time a user will notice a stalled, blank screen */\n const timeoutId =\n showAfterMs && setTimeout(() => setShowLoaderAfterMs(true), showAfterMs);\n\n return function cleanup() {\n timeoutId && clearTimeout(timeoutId);\n };\n }, [showAfterMs]);\n\n return (!showAfterMs || (showAfterMs && showLoaderAfterMs)) && props.text ? (\n
\n \n \n {text}\n \n
\n ) : (!showAfterMs || (showAfterMs && showLoaderAfterMs)) && !props.text ? (\n \n ) : null;\n};\n\nexport default Loader;\n","import {ToStepNodeResult} from '@openlaw/snapshot-js-erc712/dist/types';\n\n/**\n * @see `IVoting.sol` in tribute-contracts\n */\nexport enum VotingState {\n NOT_STARTED,\n TIE,\n PASS,\n NOT_PASS,\n IN_PROGRESS,\n GRACE_PERIOD,\n}\n\n/**\n * @see `OffchainVoting.sol->getBadNodeError` in tribute-contracts\n */\nexport enum BadNodeError {\n OK,\n WRONG_PROPOSAL_ID,\n INVALID_CHOICE,\n AFTER_VOTING_PERIOD,\n BAD_SIGNATURE,\n INDEX_OUT_OF_BOUND,\n}\n\n/**\n * Response when calling `GET snapshot-hub/api/:space/offchain_proof/:merkle_root`\n */\nexport type SnapshotOffchainProofResponse = {\n merkle_root: string;\n space: string;\n steps: ToStepNodeResult[];\n};\n","import {lazy, Suspense} from 'react';\n\ntype WalletIconProps = {\n providerName: string | undefined;\n};\n\n/**\n * Lazy load SVG's\n */\n\nconst MetaMaskSVG = lazy(() => import('../../assets/svg/MetaMaskSVG'));\n\nconst WalletConnectSVG = lazy(\n () => import('../../assets/svg/WalletConnectSVG')\n);\n\n// Mapping of provider name to lazy component\nconst walletIconMap: Record = {\n injected: ,\n walletconnect: ,\n};\n\nexport function WalletIcon({\n providerName,\n}: WalletIconProps): JSX.Element | null {\n if (!providerName || !walletIconMap[providerName]) return null;\n\n return (\n \n \n {walletIconMap[providerName]}\n \n \n );\n}\n","import {useState, useEffect, useCallback} from 'react';\nimport {useSelector} from 'react-redux';\nimport usePreviousDistinct from 'react-use/lib/usePreviousDistinct';\nimport {AbiItem} from 'web3-utils';\n\nimport {AsyncStatus} from '../../../util/types';\nimport {StoreState} from '../../../store/types';\nimport {multicall, MulticallTuple} from '../../../components/web3/helpers';\nimport {useWeb3Modal} from '../../../components/web3/hooks';\nimport {normalizeString, truncateEthAddress} from '../../../util/helpers';\n\ntype UseCheckApplicantReturn = {\n checkApplicantError: Error | undefined;\n checkApplicantInvalidMsg: string | undefined;\n checkApplicantStatus: AsyncStatus;\n isApplicantValid: boolean | undefined;\n};\n\n/**\n * useCheckApplicant\n *\n * Checks if the provided applicant address is valid to become a potential new member.\n *\n * @export\n * @param {string} [address]\n * @returns {UseCheckApplicantReturn}\n */\nexport function useCheckApplicant(address?: string): UseCheckApplicantReturn {\n /**\n * Selectors\n */\n\n const DaoRegistryContract = useSelector(\n (state: StoreState) => state.contracts.DaoRegistryContract\n );\n\n /**\n * State\n */\n\n const [checkApplicantError, setCheckApplicantError] = useState();\n\n const [checkApplicantInvalidMsg, setCheckApplicantInvalidMsg] =\n useState();\n\n const [checkApplicantStatus, setCheckApplicantStatus] = useState(\n AsyncStatus.STANDBY\n );\n\n const [isApplicantValid, setIsApplicantValid] = useState();\n\n /**\n * Our hooks\n */\n\n const {web3Instance} = useWeb3Modal();\n\n /**\n * Their hooks\n */\n\n const prevAddress = usePreviousDistinct(address);\n\n /**\n * Cached callbacks\n */\n\n const checkApplicantValidityCached = useCallback(checkApplicantValidity, [\n DaoRegistryContract,\n address,\n web3Instance,\n ]);\n\n /**\n * Effects\n */\n\n useEffect(() => {\n // Reset state if no address is detected\n if (prevAddress && !address) {\n setCheckApplicantError(undefined);\n setCheckApplicantInvalidMsg(undefined);\n setIsApplicantValid(undefined);\n setCheckApplicantStatus(AsyncStatus.STANDBY);\n }\n\n if (address) {\n checkApplicantValidityCached();\n }\n }, [address, checkApplicantValidityCached, prevAddress]);\n\n /**\n * Functions\n */\n\n async function checkApplicantValidity() {\n if (!address || !DaoRegistryContract || !web3Instance) return;\n\n try {\n setCheckApplicantStatus(AsyncStatus.PENDING);\n\n const truncatedAddress = truncateEthAddress(address, 7);\n\n const {abi: daoRegistryABI, contractAddress: daoRegistryAddress} =\n DaoRegistryContract;\n\n // Build calls to DaoRegistry contract (which includes relevant DaoConstants functions)\n const getIsNotReservedAddressABI = daoRegistryABI.find(\n (item) => item.name === 'isNotReservedAddress'\n );\n const isNotReservedAddressCall: MulticallTuple = [\n daoRegistryAddress,\n getIsNotReservedAddressABI as AbiItem,\n [address],\n ];\n\n const getIsNotZeroAddressABI = daoRegistryABI.find(\n (item) => item.name === 'isNotZeroAddress'\n );\n const isNotZeroAddressCall: MulticallTuple = [\n daoRegistryAddress,\n getIsNotZeroAddressABI as AbiItem,\n [address],\n ];\n\n const getGetAddressIfDelegatedABI = daoRegistryABI.find(\n (item) => item.name === 'getAddressIfDelegated'\n );\n const getAddressIfDelegatedCall: MulticallTuple = [\n daoRegistryAddress,\n getGetAddressIfDelegatedABI as AbiItem,\n [address],\n ];\n\n const calls = [\n isNotReservedAddressCall,\n isNotZeroAddressCall,\n getAddressIfDelegatedCall,\n ];\n\n const [\n isNotReservedAddressResult,\n isNotZeroAddressResult,\n getAddressIfDelegatedResult,\n ]: [boolean, boolean, string] = await multicall({calls, web3Instance});\n\n if (!isNotReservedAddressResult) {\n // Applicant address cannot be a reserved address.\n setIsApplicantValid(false);\n setCheckApplicantInvalidMsg(\n `The applicant address ${truncatedAddress} is invalid because it is a DAO reserved address.`\n );\n } else if (!isNotZeroAddressResult) {\n // Applicant address cannot be 0x0 address.\n setIsApplicantValid(false);\n setCheckApplicantInvalidMsg(\n `The applicant address ${truncatedAddress} is invalid.`\n );\n } else if (\n normalizeString(address) !==\n normalizeString(getAddressIfDelegatedResult)\n ) {\n // Applicant address cannot already be in use as a delegate key.\n setIsApplicantValid(false);\n setCheckApplicantInvalidMsg(\n `The applicant address ${truncatedAddress} is already in use as a delegate key. The address must be removed as a delegate before it can become a member.`\n );\n } else {\n setIsApplicantValid(true);\n setCheckApplicantInvalidMsg(undefined);\n }\n\n setCheckApplicantStatus(AsyncStatus.FULFILLED);\n } catch (error) {\n setIsApplicantValid(undefined);\n setCheckApplicantInvalidMsg(undefined);\n setCheckApplicantError(error);\n setCheckApplicantStatus(AsyncStatus.REJECTED);\n }\n }\n\n return {\n checkApplicantError,\n checkApplicantInvalidMsg,\n checkApplicantStatus,\n isApplicantValid,\n };\n}\n","import {AbiItem} from 'web3-utils/types';\nimport {useEffect, useState} from 'react';\nimport {useSelector} from 'react-redux';\nimport Web3 from 'web3';\n\nimport {AsyncStatus} from '../../../util/types';\nimport {multicall, MulticallTuple} from '../../web3/helpers';\nimport {Proposal} from '../types';\nimport {StoreState} from '../../../store/types';\nimport {useWeb3Modal} from '../../web3/hooks';\n\ntype DaoProposalEntries = [proposalId: string, proposal: Proposal][];\n\ntype UseDaoProposalsReturn = {\n daoProposals: DaoProposalEntries;\n daoProposalsStatus: AsyncStatus;\n daoProposalsError: Error | undefined;\n};\n\nconst INITIAL_DAO_PROPOSAL_ENTRIES: DaoProposalEntries = [];\n\n/**\n * useDaoProposals\n *\n * Gets `proposals` by their id from the DAO via `multicall`.\n *\n * @param proposalIds\n * @returns `UseDaoProposalsReturn`\n */\nexport function useDaoProposals(proposalIds: string[]): UseDaoProposalsReturn {\n /**\n * Selectors\n */\n\n const proposalsAbi = useSelector((s: StoreState) =>\n s.contracts.DaoRegistryContract?.abi.find((a) => a.name === 'proposals')\n );\n\n const registryAddress = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract?.contractAddress\n );\n\n /**\n * State\n */\n\n const [daoProposals, setDaoProposals] = useState(\n INITIAL_DAO_PROPOSAL_ENTRIES\n );\n\n const [daoProposalsStatus, setDaoProposalsStatus] = useState(\n AsyncStatus.STANDBY\n );\n\n const [daoProposalsError, setDaoProposalsError] = useState();\n\n /**\n * Our hooks\n */\n\n const {web3Instance} = useWeb3Modal();\n\n /**\n * Effects\n */\n\n useEffect(() => {\n if (\n !proposalIds.length ||\n !proposalsAbi ||\n !registryAddress ||\n !web3Instance\n ) {\n return;\n }\n\n handleGetDaoProposals({\n proposalIds,\n proposalsAbi,\n registryAddress,\n web3Instance,\n });\n }, [proposalIds, proposalsAbi, registryAddress, web3Instance]);\n\n /**\n * Functions\n */\n\n async function handleGetDaoProposals({\n proposalIds,\n proposalsAbi,\n registryAddress,\n web3Instance,\n }: {\n proposalIds: string[];\n proposalsAbi: AbiItem;\n registryAddress: string;\n web3Instance: Web3;\n }) {\n try {\n if (!proposalIds.length) return;\n\n // Only use hex (more specifically `bytes32`) id's\n const safeProposalIds = proposalIds.filter(\n web3Instance.utils.isHexStrict\n );\n\n if (!safeProposalIds.length) {\n setDaoProposalsStatus(AsyncStatus.FULFILLED);\n setDaoProposals([]);\n\n return;\n }\n\n setDaoProposalsStatus(AsyncStatus.PENDING);\n // Reset error\n setDaoProposalsError(undefined);\n\n const calls: MulticallTuple[] = safeProposalIds.map((id) => [\n registryAddress,\n proposalsAbi,\n [id],\n ]);\n\n const proposals = await multicall({\n calls,\n web3Instance,\n });\n\n setDaoProposals(safeProposalIds.map((id, i) => [id, proposals[i]]));\n setDaoProposalsStatus(AsyncStatus.FULFILLED);\n } catch (error) {\n setDaoProposals(INITIAL_DAO_PROPOSAL_ENTRIES);\n setDaoProposalsError(error);\n setDaoProposalsStatus(AsyncStatus.REJECTED);\n }\n }\n\n return {\n daoProposals,\n daoProposalsStatus,\n daoProposalsError,\n };\n}\n","import {AbiItem} from 'web3-utils/types';\nimport {useCallback, useEffect, useState} from 'react';\nimport {useSelector} from 'react-redux';\nimport {VoteChoicesIndex} from '@openlaw/snapshot-js-erc712';\nimport Web3 from 'web3';\n\nimport {AsyncStatus} from '../../../util/types';\nimport {multicall, MulticallTuple} from '../../web3/helpers';\nimport {SnapshotProposal, VotingResult} from '../types';\nimport {StoreState} from '../../../store/types';\nimport {UNITS_ADDRESS, TOTAL_ADDRESS} from '../../../config';\nimport {useIsMounted} from '../../../hooks';\nimport {useWeb3Modal} from '../../web3/hooks';\nimport {VoteChoices} from '../../web3/types';\n\ntype OffchainVotingResultEntries = [\n proposalHash: string,\n votingResult: VotingResult\n][];\n\ntype UseOffchainVotingResultsReturn = {\n offchainVotingResults: OffchainVotingResultEntries;\n offchainVotingResultsError: Error | undefined;\n offchainVotingResultsStatus: AsyncStatus;\n};\n\n/**\n * @todo Polling\n */\nexport function useOffchainVotingResults(\n /**\n * Accepts a single `SnapshotProposal` or `SnapshotProposal[]`\n */\n proposals: (SnapshotProposal | undefined) | (SnapshotProposal | undefined)[]\n): UseOffchainVotingResultsReturn {\n /**\n * Selectors\n */\n\n const bankABI = useSelector(\n (s: StoreState) => s.contracts.BankExtensionContract?.abi\n );\n const bankAddress = useSelector(\n (s: StoreState) => s.contracts.BankExtensionContract?.contractAddress\n );\n\n /**\n * State\n */\n\n const [votingResults, setVotingResults] =\n useState([]);\n\n const [offchainVotingResultsStatus, setOffchainVotingResultsStatus] =\n useState(AsyncStatus.STANDBY);\n\n const [offchainVotingResultsError, setOffchainVotingResultsError] = useState<\n Error | undefined\n >();\n\n /**\n * Our hooks\n */\n\n const {web3Instance} = useWeb3Modal();\n const {isMountedRef} = useIsMounted();\n\n /**\n * Variables\n */\n\n const getPriorAmountABI = bankABI?.find(\n (item) => item.name === 'getPriorAmount'\n );\n\n /**\n * Cached callbacks\n */\n\n const getUnitsPerChoiceCached = useCallback(\n getUnitsPerChoiceFromContract,\n []\n );\n\n /**\n * Effects\n */\n\n // Build result entries of `OffchainVotingResultEntries`\n useEffect(() => {\n const proposalsToMap = Array.isArray(proposals) ? proposals : [proposals];\n\n if (\n !bankAddress ||\n !getPriorAmountABI ||\n !proposalsToMap.length ||\n !web3Instance\n ) {\n return;\n }\n\n setOffchainVotingResultsStatus(AsyncStatus.PENDING);\n\n const votingResultPromises = proposalsToMap.map(async (p) => {\n const snapshot = p?.msg.payload.snapshot;\n const idInSnapshot = p?.idInSnapshot;\n\n if (!idInSnapshot || !snapshot) return;\n\n const voterEntries = p?.votes?.map((v): [string, number] => {\n const vote = v[Object.keys(v)[0]];\n\n return [\n /**\n * Must be the true member's address for calculating voting power.\n * This value is (or at least should be) derived from `OffchainVoting.memberAddressesByDelegatedKey`.\n */\n vote.msg.payload.metadata.memberAddress,\n vote.msg.payload.choice,\n ];\n });\n\n if (!voterEntries || !voterEntries.length) return;\n\n // Dedupe any duplicate addresses to be safe.\n const voterAddressesAndChoices = Object.entries(\n Object.fromEntries(voterEntries)\n );\n\n try {\n const result = await getUnitsPerChoiceCached({\n bankAddress,\n getPriorAmountABI,\n snapshot,\n voterAddressesAndChoices,\n web3Instance,\n });\n\n return [idInSnapshot, result];\n } catch (error) {\n return;\n }\n });\n\n Promise.all(votingResultPromises)\n .then((p) => p.filter((p) => p) as OffchainVotingResultEntries)\n .then((r) => {\n if (!isMountedRef.current) return;\n\n setOffchainVotingResultsStatus(AsyncStatus.FULFILLED);\n setVotingResults(r);\n setOffchainVotingResultsError(undefined);\n })\n .catch((error) => {\n if (!isMountedRef.current) return;\n\n setOffchainVotingResultsStatus(AsyncStatus.REJECTED);\n setVotingResults([]);\n setOffchainVotingResultsError(error);\n });\n }, [\n bankAddress,\n getPriorAmountABI,\n getUnitsPerChoiceCached,\n isMountedRef,\n proposals,\n web3Instance,\n ]);\n\n /**\n * Functions\n */\n\n async function getUnitsPerChoiceFromContract({\n bankAddress,\n getPriorAmountABI,\n snapshot,\n voterAddressesAndChoices,\n web3Instance,\n }: {\n bankAddress: string;\n getPriorAmountABI: AbiItem;\n snapshot: number;\n voterAddressesAndChoices: [string, number][];\n web3Instance: Web3;\n }): Promise {\n try {\n // Create results object to set later\n const results = {\n [VoteChoices.Yes]: {\n percentage: 0,\n units: 0,\n },\n [VoteChoices.No]: {\n percentage: 0,\n units: 0,\n },\n totalUnits: 0,\n };\n\n // Build a call for total units\n const totalUnitsCall: MulticallTuple = [\n bankAddress,\n getPriorAmountABI,\n [\n TOTAL_ADDRESS, // account\n UNITS_ADDRESS, // tokenAddr\n snapshot.toString(), // blockNumber\n ],\n ];\n\n // Build calls to Bank contract\n const unitsCalls = voterAddressesAndChoices.map(\n ([address]): MulticallTuple => [\n bankAddress,\n getPriorAmountABI,\n [\n address, // account\n UNITS_ADDRESS, // tokenAddr\n snapshot.toString(), // blockNumber\n ],\n ]\n );\n\n const calls = [totalUnitsCall, ...unitsCalls];\n\n const [totalUnitsResult, ...votingResults]: string[] = await multicall({\n calls,\n web3Instance,\n });\n\n // Set Units values for choices\n votingResults.forEach((units, i) => {\n const isYes =\n VoteChoicesIndex[voterAddressesAndChoices[i][1]] ===\n VoteChoicesIndex[VoteChoicesIndex.Yes];\n const choice = isYes ? VoteChoices.Yes : VoteChoices.No;\n\n results[choice].units += Number(units);\n });\n\n // Set percentages\n results[VoteChoices.Yes].percentage =\n (results[VoteChoices.Yes].units / Number(totalUnitsResult)) * 100;\n\n results[VoteChoices.No].percentage =\n (results[VoteChoices.No].units / Number(totalUnitsResult)) * 100;\n\n // Set total units\n results.totalUnits = Number(totalUnitsResult);\n\n return results;\n } catch (error) {\n throw error;\n }\n }\n\n return {\n offchainVotingResults: votingResults,\n offchainVotingResultsError,\n offchainVotingResultsStatus,\n };\n}\n","import {useCallback, useEffect, useState} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {AsyncStatus} from '../../../util/types';\nimport {BURN_ADDRESS} from '../../../util/constants';\nimport {getVotingAdapterABI} from '../helpers';\nimport {multicall, MulticallTuple} from '../../web3/helpers';\nimport {ProposalVotingAdapterData} from '../types';\nimport {StoreState} from '../../../store/types';\nimport {useWeb3Modal} from '../../web3/hooks';\nimport {VotingAdapterName} from '../../adapters-extensions/enums';\n\ntype ProposalVotingAdapterTuple = [\n proposalId: string,\n votingAdapterData: ProposalVotingAdapterData\n];\n\ntype UseProposalsVotingAdapterReturn = {\n proposalsVotingAdapters: ProposalVotingAdapterTuple[];\n proposalsVotingAdaptersError: Error | undefined;\n proposalsVotingAdaptersStatus: AsyncStatus;\n};\n\nconst INITIAL_VOTING_ADAPTERS: ProposalVotingAdapterTuple[] = [];\n\n/**\n * Fetch voting adapter data for proposals by DAO proposal id.\n * Only returns data for proposals of which voting adapters have been assigned (i.e. sponsored).\n *\n * @param {string[]}\n * @returns {UseProposalsVotingAdapterReturn}\n */\nexport function useProposalsVotingAdapter(\n proposalIds: string[]\n): UseProposalsVotingAdapterReturn {\n /**\n * Selectors\n */\n\n const registryAddress = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract?.contractAddress\n );\n const registryABI = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract?.abi\n );\n\n /**\n * Our hooks\n */\n\n const {web3Instance} = useWeb3Modal();\n\n /**\n * State\n */\n\n const [proposalsVotingAdapters, setProposalsVotingAdapters] = useState<\n ProposalVotingAdapterTuple[]\n >(INITIAL_VOTING_ADAPTERS);\n\n const [proposalsVotingAdaptersError, setProposalsVotingAdaptersError] =\n useState();\n\n const [proposalsVotingAdaptersStatus, setProposalsVotingAdaptersStatus] =\n useState(AsyncStatus.STANDBY);\n\n /**\n * Cached callbacks\n */\n\n const getProposalsVotingAdaptersOnchainCached = useCallback(\n getProposalsVotingAdaptersOnchain,\n [proposalIds, registryABI, registryAddress, web3Instance]\n );\n\n /**\n * Effects\n */\n\n useEffect(() => {\n getProposalsVotingAdaptersOnchainCached();\n }, [getProposalsVotingAdaptersOnchainCached]);\n\n /**\n * Functions\n */\n\n async function getProposalsVotingAdaptersOnchain(): Promise {\n if (\n !proposalIds.length ||\n !registryABI ||\n !registryAddress ||\n !web3Instance\n ) {\n return;\n }\n\n // Only use hex (more specifically `bytes32`) id's\n const safeProposalIds = proposalIds.filter(web3Instance.utils.isHexStrict);\n\n if (!safeProposalIds.length) {\n setProposalsVotingAdapters(INITIAL_VOTING_ADAPTERS);\n setProposalsVotingAdaptersStatus(AsyncStatus.FULFILLED);\n\n return;\n }\n\n try {\n const votingAdapterABI = registryABI.find(\n (ai) => ai.name === 'votingAdapter'\n );\n\n if (!votingAdapterABI) {\n throw new Error(\n 'No \"votingAdapter\" ABI function was found in the DAO registry ABI.'\n );\n }\n\n // `DaoRegistry.votingAdapter` calls\n const votingAdapterCalls: MulticallTuple[] = safeProposalIds.map((id) => [\n registryAddress,\n votingAdapterABI,\n [id],\n ]);\n\n setProposalsVotingAdaptersStatus(AsyncStatus.PENDING);\n\n const votingAdapterAddressResults: string[] = await multicall({\n calls: votingAdapterCalls,\n web3Instance,\n });\n\n const {default: lazyIVotingABI} = await import(\n '../../../truffle-contracts/IVoting.json'\n );\n\n const getAdapterNameABI = (lazyIVotingABI as typeof registryABI).find(\n (ai) => ai.name === 'getAdapterName'\n );\n\n if (!getAdapterNameABI) {\n throw new Error(\n 'No \"getAdapterName\" ABI function was found in the IVoting ABI.'\n );\n }\n\n /**\n * Filter out `safeProposalIds` which are not sponsored (i.e. voting adapter address === `BURN_ADDRESS`).\n * Filter out `votingAdapterAddressResults` which equal the `BURN_ADDRESS`.\n *\n * This ensures these two arrays maintain the same length as they rely on indexes for the\n * proposals to match up to the array of `multicall` results.\n */\n\n const filteredProposalIds = safeProposalIds.filter(\n (_id, i) => votingAdapterAddressResults[i] !== BURN_ADDRESS\n );\n\n const filteredVotingAdapterAddressResults =\n votingAdapterAddressResults.filter((a) => a !== BURN_ADDRESS);\n\n /**\n * Exit early if there's no voting adapter addresses.\n * It means no proposals were found to be sponsored\n */\n if (!filteredVotingAdapterAddressResults.length) {\n setProposalsVotingAdapters(INITIAL_VOTING_ADAPTERS);\n setProposalsVotingAdaptersStatus(AsyncStatus.FULFILLED);\n\n return;\n }\n\n const votingAdapterNameCalls: MulticallTuple[] =\n filteredVotingAdapterAddressResults.map((votingAdapterAddress) => [\n votingAdapterAddress,\n getAdapterNameABI,\n [],\n ]);\n\n const adapterNameResults: VotingAdapterName[] = await multicall({\n calls: votingAdapterNameCalls,\n web3Instance,\n });\n\n const votingAdaptersToSet = await Promise.all(\n filteredProposalIds.map(\n async (id, i): Promise => {\n const votingAdapterABI = await getVotingAdapterABI(\n adapterNameResults[i]\n );\n const votingAdapterAddress = filteredVotingAdapterAddressResults[i];\n\n return [\n id,\n {\n votingAdapterName: adapterNameResults[i],\n votingAdapterAddress,\n getVotingAdapterABI: () => votingAdapterABI,\n getWeb3VotingAdapterContract: () =>\n new web3Instance.eth.Contract(\n votingAdapterABI,\n votingAdapterAddress\n ),\n },\n ];\n }\n )\n );\n\n setProposalsVotingAdapters(votingAdaptersToSet);\n setProposalsVotingAdaptersStatus(AsyncStatus.FULFILLED);\n } catch (error) {\n setProposalsVotingAdaptersStatus(AsyncStatus.REJECTED);\n setProposalsVotingAdapters([]);\n setProposalsVotingAdaptersError(error);\n }\n }\n\n return {\n proposalsVotingAdapters,\n proposalsVotingAdaptersError,\n proposalsVotingAdaptersStatus,\n };\n}\n","import {useCallback, useEffect, useState} from 'react';\nimport {\n SnapshotDraftResponse,\n SnapshotProposalResponse,\n SnapshotType,\n} from '@openlaw/snapshot-js-erc712';\n\nimport {\n Proposal,\n ProposalData,\n ProposalOrDraftSnapshotType,\n SnapshotDraft,\n SnapshotProposal,\n SnapshotProposalCommon,\n} from '../types';\nimport {AsyncStatus} from '../../../util/types';\nimport {SNAPSHOT_HUB_API_URL, SPACE} from '../../../config';\nimport {useAbortController, useCounter} from '../../../hooks';\nimport {useProposalsVotingAdapter} from './useProposalsVotingAdapter';\n\ntype UseProposalReturn = {\n proposalData: ProposalData | undefined;\n proposalError: Error | undefined;\n proposalNotFound: boolean;\n proposalStatus: AsyncStatus;\n};\n\nconst ERROR_PROPOSAL: string =\n 'Something went wrong while getting the proposal.';\nconst ERROR_PROPOSAL_NOT_FOUND: string = 'Proposal was not found.';\n\n/**\n * useProposalOrDraft\n *\n * Fetches a snapshot-hub `proposal` or `draft` type by an ID string.\n *\n * If no `type` argument is provided it will search first for a\n * `proposal`, then if not found, search for a `draft`.\n *\n * @todo Fetch subgraph proposal on mount before a draft or proposal has been fetched.\n *\n * @param {string} id A draft's or a proposal's ID to search for.\n * @param {SnapshotType?} type An optional snapshot-hub `type` to search by.\n * @returns {UseProposalReturn}\n */\nexport function useProposalOrDraft(\n id: string,\n type?: ProposalOrDraftSnapshotType\n): UseProposalReturn {\n /**\n * State\n */\n\n /**\n * @todo Get subgraph data using useLazyQuery\n * @link https://www.apollographql.com/docs/react/data/queries/#executing-queries-manually\n */\n\n const [daoProposal /* setDAOProposal */] = useState();\n const [snapshotDraft, setSnapshotDraft] = useState();\n const [snapshotProposal, setSnapshotProposal] = useState();\n const [proposalNotFound, setProposalNotFound] = useState(false);\n const [proposalError, setProposalError] = useState();\n const [proposalStatus, setProposalStatus] = useState(\n AsyncStatus.STANDBY\n );\n const [proposalVotingAdapterId, setProposalVotingAdapterId] = useState<\n string[]\n >([id]);\n\n // The overall status of the async data being fetched\n const [proposalInclusiveStatus, setProposalInclusiveStatus] =\n useState(AsyncStatus.STANDBY);\n\n // Any error of the async data being fetched\n const [proposalInclusiveError, setProposalInclusiveError] = useState();\n\n /**\n * Our hooks\n */\n\n const {abortController, isMountedRef} = useAbortController();\n\n const [refetchCount, updateRefetchCount] = useCounter();\n\n /**\n * Fetch on-chain voting adapter data for proposals.\n * Only returns data for proposals of which voting adapters have been assigned (i.e. sponsored).\n */\n const {\n proposalsVotingAdapters,\n proposalsVotingAdaptersError,\n proposalsVotingAdaptersStatus,\n } = useProposalsVotingAdapter(proposalVotingAdapterId);\n\n /**\n * Cached callbacks\n */\n\n const handleGetDraftCached = useCallback(handleGetDraft, [\n abortController?.signal,\n id,\n isMountedRef,\n ]);\n\n const handleGetProposalCached = useCallback(handleGetProposal, [\n abortController?.signal,\n id,\n isMountedRef,\n type,\n ]);\n\n const handleGetProposalOrDraftCached = useCallback(handleGetProposalOrDraft, [\n handleGetDraftCached,\n handleGetProposalCached,\n ]);\n\n /**\n * Variables\n */\n\n const snapshotType: ProposalOrDraftSnapshotType | undefined = snapshotProposal\n ? SnapshotType.proposal\n : snapshotDraft\n ? SnapshotType.draft\n : undefined;\n\n /**\n * We need to at least have Snapshot data to provide the proposal,\n * otherwise we will have nothing to show the user.\n */\n const proposalData: UseProposalReturn['proposalData'] =\n snapshotDraft || snapshotProposal\n ? {\n // idInDAO: '',\n daoProposal,\n daoProposalVotingAdapter: proposalsVotingAdapters[0]?.[1],\n getCommonSnapshotProposalData,\n refetchProposalOrDraft,\n snapshotDraft,\n snapshotProposal,\n snapshotType,\n }\n : undefined;\n\n /**\n * Effects\n */\n\n useEffect(() => {\n if (!abortController?.signal) return;\n\n switch (type) {\n case SnapshotType.draft:\n handleGetDraftCached();\n break;\n case SnapshotType.proposal:\n handleGetProposalCached();\n break;\n default:\n handleGetProposalOrDraftCached();\n break;\n }\n }, [\n abortController?.signal,\n handleGetDraftCached,\n handleGetProposalCached,\n handleGetProposalOrDraftCached,\n // Required in order to refetch\n refetchCount,\n type,\n ]);\n\n useEffect(() => {\n if (refetchCount === 0) return;\n\n /**\n * Provide a different Array reference to force a re-render\n * of the `useProposalsVotingAdapter` hook. If the `id` argument changes,\n * that's fine as well, but it's unlikely.\n */\n setProposalVotingAdapterId([id]);\n }, [id, refetchCount]);\n\n // Set overall async status\n useEffect(() => {\n const {STANDBY, PENDING, FULFILLED, REJECTED} = AsyncStatus;\n const statuses = [proposalStatus, proposalsVotingAdaptersStatus];\n\n /**\n * Standby\n *\n * The other statuses rely on a Snapshot Hub proposal or draft being fetched,\n * so it's only in `STANDBY` at the point the proposals have\n * not yet been fetched.\n */\n if (proposalStatus === STANDBY) {\n setProposalInclusiveStatus(STANDBY);\n\n return;\n }\n\n /**\n * Pending\n *\n * Do not trigger pending requests (UI may show loader) for refetches (meant to be silent).\n */\n if (statuses.some((s) => s === PENDING) && refetchCount === 0) {\n setProposalInclusiveStatus(PENDING);\n\n return;\n }\n\n // Fulfilled\n if (statuses.every((s) => s === FULFILLED)) {\n setProposalInclusiveStatus(FULFILLED);\n\n return;\n }\n\n // Fulfilled: checked for DAO proposals' voting adapters and none were returned - not sponsored\n if (\n proposalStatus === FULFILLED &&\n proposalsVotingAdaptersStatus === FULFILLED &&\n !proposalsVotingAdapters.length\n ) {\n setProposalInclusiveStatus(FULFILLED);\n\n return;\n }\n\n // Rejected\n if (statuses.some((s) => s === REJECTED)) {\n setProposalInclusiveStatus(REJECTED);\n\n return;\n }\n }, [\n proposalStatus,\n proposalsVotingAdapters.length,\n proposalsVotingAdaptersStatus,\n refetchCount,\n ]);\n\n // Set any error from async calls\n useEffect(() => {\n const errors = [proposalError, proposalsVotingAdaptersError];\n\n setProposalInclusiveError(errors.find((e) => e));\n }, [proposalError, proposalsVotingAdaptersError]);\n\n /**\n * Functions\n */\n\n async function handleGetDraft(): Promise {\n try {\n setProposalStatus(AsyncStatus.PENDING);\n\n const response = await fetch(\n `${SNAPSHOT_HUB_API_URL}/api/${SPACE}/draft/${id}`,\n {signal: abortController?.signal}\n );\n\n if (!response.ok) {\n throw new Error(ERROR_PROPOSAL);\n }\n\n const responseJSON: SnapshotDraftResponse = await response.json();\n\n if (!isMountedRef.current) return;\n\n // @note API does not provide a 404\n if (!responseJSON || !Object.keys(responseJSON).length) {\n setProposalNotFound(true);\n\n throw new Error(ERROR_PROPOSAL_NOT_FOUND);\n }\n\n const idKey = Object.keys(responseJSON)[0];\n // Get the `SnapshotDraftResponseData` by the address key of the single result.\n const draft: SnapshotDraft = {\n idInDAO: idKey,\n idInSnapshot: idKey,\n ...responseJSON[idKey],\n };\n\n setProposalStatus(AsyncStatus.FULFILLED);\n setSnapshotDraft(draft);\n\n return draft;\n } catch (error) {\n if (!isMountedRef.current) return;\n\n setProposalStatus(AsyncStatus.REJECTED);\n setProposalError(error);\n }\n }\n\n async function handleGetProposal(): Promise {\n try {\n setProposalStatus(AsyncStatus.PENDING);\n\n /**\n * @note `searchUniqueDraftId` includes the draft id in the search for the proposal\n * as a Tribute proposal's ID hash could be the Snapshot Draft's ID.\n */\n const response = await fetch(\n `${SNAPSHOT_HUB_API_URL}/api/${SPACE}/proposal/${id}?searchUniqueDraftId=true&includeVotes=true`,\n {signal: abortController?.signal}\n );\n\n if (!response.ok) {\n /**\n * If `type` is set then we know we can determine `handleGetDraft`\n * will not be called after in `handleGetProposalOrDraft`.\n */\n if (type === SnapshotType.proposal) {\n throw new Error(ERROR_PROPOSAL);\n }\n\n return;\n }\n\n const responseJSON: SnapshotProposalResponse = await response.json();\n\n if (!isMountedRef.current) return;\n\n // @note API does not provide a 404\n if (!responseJSON || !Object.keys(responseJSON).length) {\n /**\n * If `type` is set then we know we can determine `handleGetDraft`\n * will not be called after in `handleGetProposalOrDraft`.\n */\n if (type === SnapshotType.proposal) {\n setProposalNotFound(true);\n throw new Error(ERROR_PROPOSAL_NOT_FOUND);\n }\n\n return;\n }\n\n const idKey = Object.keys(responseJSON)[0];\n // Determine ID submitted to DAO, i.e. if there's a Draft ID hash, we should use that.\n const proposalId: string =\n responseJSON[idKey]?.data.erc712DraftHash || idKey;\n // Get the `SnapshotProposalResponseData` by the address key of the single result.\n const proposal: SnapshotProposal = {\n idInDAO: proposalId,\n idInSnapshot: idKey,\n ...responseJSON[idKey],\n };\n\n setProposalStatus(AsyncStatus.FULFILLED);\n setSnapshotProposal(proposal);\n\n return proposal;\n } catch (error) {\n if (!isMountedRef.current) return;\n\n setProposalStatus(AsyncStatus.REJECTED);\n setProposalError(error);\n }\n }\n\n /**\n * Searches all possible combinations to return a proposal or a draft:\n *\n * 1. Search for a proposal (including by using the `id` as the Draft's ID hash via `searchUniqueDraftId`)\n * 2. Search for a draft, if nothing is returned for a proposal.\n */\n async function handleGetProposalOrDraft() {\n // 1. Attempt to search for a proposal.\n const proposal = await handleGetProposalCached();\n\n if (!proposal) {\n // 2. If not found, attempt a search for a draft.\n const draft = await handleGetDraftCached();\n\n setSnapshotDraft(draft);\n\n return;\n }\n\n setSnapshotProposal(proposal);\n }\n\n /**\n * getCommonSnapshotProposalData\n *\n * @returns `SnapshotProposalCommon | undefined` Data for either a Draft or Proposal which is shared between the two types.\n */\n function getCommonSnapshotProposalData(): SnapshotProposalCommon | undefined {\n switch (snapshotType) {\n case SnapshotType.draft:\n return snapshotDraft;\n case SnapshotType.proposal:\n return snapshotProposal;\n default:\n return undefined;\n }\n }\n\n function refetchProposalOrDraft(): void {\n updateRefetchCount({type: 'increment'});\n }\n\n return {\n proposalData,\n proposalError: proposalInclusiveError,\n proposalNotFound,\n proposalStatus: proposalInclusiveStatus,\n };\n}\n","import {useEffect, useMemo, useState} from 'react';\nimport {useSelector} from 'react-redux';\nimport {\n SnapshotDraftResponse,\n SnapshotDraftResponseData,\n SnapshotProposalResponse,\n SnapshotProposalResponseData,\n SnapshotType,\n} from '@openlaw/snapshot-js-erc712';\n\nimport {AsyncStatus} from '../../../util/types';\nimport {DaoAdapterConstants} from '../../adapters-extensions/enums';\nimport {normalizeString} from '../../../util/helpers';\nimport {ProposalData, SnapshotDraft, SnapshotProposal} from '../types';\nimport {SNAPSHOT_HUB_API_URL, SPACE} from '../../../config';\nimport {StoreState} from '../../../store/types';\nimport {useDaoProposals, useProposalsVotingState} from '.';\nimport {useProposalsVotes} from './useProposalsVotes';\nimport {useProposalsVotingAdapter} from './useProposalsVotingAdapter';\n\ntype UseProposalsReturn = {\n proposals: ProposalData[];\n proposalsStatus: AsyncStatus;\n proposalsError: Error | undefined;\n};\n\ntype SnapshotDraftAndProposalEntries = [\n string,\n SnapshotDraftResponseData | SnapshotProposalResponseData\n][];\n\nconst INITIAL_ARRAY: any[] = [];\n\n// Gets Drafts (unsponsored Proposals) from Snapshot Hub\nasync function getSnapshotDraftsByAdapterAddress(\n adapterAddress: string\n): Promise<[string, SnapshotDraftResponseData][]> {\n try {\n const baseURL = `${SNAPSHOT_HUB_API_URL}/api/${SPACE}`;\n\n const drafts = await fetch(`${baseURL}/drafts/${adapterAddress}`);\n\n if (!drafts.ok) {\n throw new Error(\n 'Something went wrong while fetching the Snapshot drafts.'\n );\n }\n\n const draftsJSON: SnapshotDraftResponse = await drafts.json();\n\n // Get Drafts which have not yet been sponsored (Proposal created)\n const draftEntries = Object.entries(draftsJSON).filter(\n ([_, d]) => d.data.sponsored === false\n );\n\n return draftEntries;\n } catch (error) {\n throw error;\n }\n}\n\n// Gets Proposals from Snapshot Hub\nasync function getSnapshotProposalsByAdapterAddress(\n adapterAddress: string\n): Promise<[string, SnapshotProposalResponseData][]> {\n try {\n const baseURL = `${SNAPSHOT_HUB_API_URL}/api/${SPACE}`;\n\n const proposals = await fetch(\n `${baseURL}/proposals/${adapterAddress}?includeVotes=true`\n );\n\n if (!proposals.ok) {\n throw new Error(\n 'Something went wrong while fetching the Snapshot proposals.'\n );\n }\n\n const proposalsJSON: SnapshotProposalResponse = await proposals.json();\n\n /**\n * Re-map entries setting the correct id used for the `proposalId` in the DAO.\n * If it has a draft hash, then this is what was submitted to the DAO, most likely (e.g. submit proposal)\n */\n const proposalEntries = Object.entries(proposalsJSON).map(\n ([id, p]): [string, SnapshotProposalResponseData] => [\n p.data.erc712DraftHash || id,\n p,\n ]\n );\n\n return proposalEntries;\n } catch (error) {\n throw error;\n }\n}\n\n/**\n * useProposals\n *\n * @param {string} adapterName Name of the adapter contract to get proposals for.\n * @param {string} includeProposalsExistingOnlyOffchain To handle proposal types where the first step is creating a snapshot draft/offchain proposal only (no onchain proposal exists).\n * @returns `UseProposalsReturn` An object with the proposals, and the current async status.\n */\nexport function useProposals({\n adapterName,\n includeProposalsExistingOnlyOffchain = false,\n}: {\n adapterName: DaoAdapterConstants;\n includeProposalsExistingOnlyOffchain?: boolean;\n}): UseProposalsReturn {\n /**\n * State\n */\n\n const [adapterAddress, setAdapterAddress] = useState();\n\n const [snapshotDraftAndProposals, setSnapshotDraftAndProposals] =\n useState(INITIAL_ARRAY);\n\n const [snapshotDraftAndProposalsStatus, setSnapshotDraftAndProposalsStatus] =\n useState(AsyncStatus.STANDBY);\n\n const [snapshotDraftAndProposalsError, setSnapshotDraftAndProposalsError] =\n useState();\n\n const [daoProposalIdsToUse, setDaoProposalIdsToUse] =\n useState(INITIAL_ARRAY);\n\n const [proposals, setProposals] = useState(INITIAL_ARRAY);\n\n // The overall status of the async data being fetched\n const [proposalsInclusiveStatus, setProposalsInclusiveStatus] =\n useState(AsyncStatus.STANDBY);\n\n // Any error of the async data being fetched\n const [proposalsInclusiveError, setProposalsInclusiveError] =\n useState();\n\n /**\n * Selectors\n */\n\n const contracts = useSelector((s: StoreState) => s.contracts);\n\n /**\n * Memo\n */\n\n const snapshotDraftAndProposalsIds: string[] = useMemo(\n () => snapshotDraftAndProposals.map((e) => e[0]),\n [snapshotDraftAndProposals]\n );\n\n /**\n * Our hooks\n */\n\n /**\n * Fetch DAO proposals, if there are `snapshotDraftAndProposals`.\n *\n * Dependent upon `snapshotDraftAndProposals`.\n */\n const {daoProposals, daoProposalsError, daoProposalsStatus} = useDaoProposals(\n snapshotDraftAndProposalsIds\n );\n\n /**\n * Fetch on-chain voting adapter data for proposals of which voting adapters have been assigned (i.e. sponsored).\n *\n * Dependent upon `daoProposals`.\n */\n const {\n proposalsVotingAdapters,\n proposalsVotingAdaptersError,\n proposalsVotingAdaptersStatus,\n } = useProposalsVotingAdapter(daoProposalIdsToUse);\n\n /**\n * Fetch on-chain voting state for proposals of which voting adapters have been assigned (i.e. sponsored).\n *\n * Dependent upon `useProposalsVotingAdapter`.\n */\n const {\n proposalsVotingState,\n proposalsVotingStateError,\n proposalsVotingStateStatus,\n } = useProposalsVotingState(proposalsVotingAdapters);\n\n /**\n * Fetch on-chain votes data for proposals of which voting adapters have been assigned (i.e. sponsored)\n *\n * Dependent upon `useProposalsVotingAdapter`.\n */\n const {proposalsVotes, proposalsVotesError, proposalsVotesStatus} =\n useProposalsVotes(proposalsVotingAdapters);\n\n /**\n * Effects\n */\n\n // Get and set the adapter address\n useEffect(() => {\n // @note We don't use the helper function as we don't want it to throw here.\n const address = Object.entries(contracts).find(\n ([_, c]) => c?.adapterOrExtensionName === adapterName\n )?.[1]?.contractAddress;\n\n setAdapterAddress(address);\n }, [adapterAddress, adapterName, contracts]);\n\n // Get and set all Snapshot drafts and proposal entries\n useEffect(() => {\n if (!adapterAddress) return;\n\n handleGetAllSnapshotDraftsAndProposals(adapterAddress);\n }, [adapterAddress]);\n\n // Set the DAO proposal IDs we want to work with\n useEffect(() => {\n if (!daoProposals.length) return;\n\n if (includeProposalsExistingOnlyOffchain) {\n // Do not filter-out proposals which exist only off-chain\n return setDaoProposalIdsToUse(daoProposals.map(([id]) => id));\n }\n\n // Filter-out proposals which do not exist onchain\n return setDaoProposalIdsToUse(\n daoProposals.filter(([_, p]) => p.flags !== '0').map(([id]) => id)\n );\n }, [daoProposals, includeProposalsExistingOnlyOffchain]);\n\n // Set `proposals` with any returned data, once overall `AsyncStatus` equals `FULFILLED`\n useEffect(() => {\n if (proposalsInclusiveStatus !== AsyncStatus.FULFILLED) {\n return;\n }\n\n const proposalsToSet = daoProposalIdsToUse\n .map((id): ProposalData => {\n const [, daoProposal] =\n daoProposals.find(\n ([daoProposalId]) =>\n normalizeString(daoProposalId) === normalizeString(id)\n ) || [];\n\n const [snapshotDataId, snapshotData] =\n snapshotDraftAndProposals.find(\n ([snapshotId]) =>\n normalizeString(snapshotId) === normalizeString(id)\n ) || [];\n\n const isSnapshotDraft: boolean =\n snapshotData?.msg.type === SnapshotType.draft;\n\n const snapshotDraft: SnapshotDraft | undefined =\n snapshotDataId && isSnapshotDraft\n ? {\n ...(snapshotData as SnapshotDraft),\n // @todo Rename to `idForDAO` as it is more accurate, as the ID may not yet exist in the DAO.\n idInDAO: id,\n idInSnapshot: snapshotDataId,\n }\n : undefined;\n\n const snapshotProposal: SnapshotProposal | undefined =\n snapshotDataId && !isSnapshotDraft\n ? {\n ...(snapshotData as SnapshotProposal),\n // @todo Rename to `idForDAO` as it is more accurate, as the ID may not yet exist in the DAO.\n idInDAO: id,\n idInSnapshot: snapshotDataId,\n }\n : undefined;\n\n const daoProposalVotingAdapter = proposalsVotingAdapters.find(\n ([proposalIdVotingAdapter]) =>\n normalizeString(proposalIdVotingAdapter) === normalizeString(id)\n )?.[1];\n\n const daoProposalVotingState = proposalsVotingState.find(\n ([proposalIdVotingState]) =>\n normalizeString(proposalIdVotingState) === normalizeString(id)\n )?.[1];\n\n const daoProposalVote = proposalsVotes.find(\n ([proposalIdVotes]) =>\n normalizeString(id) === normalizeString(proposalIdVotes)\n )?.[1];\n\n return {\n daoProposal,\n daoProposalVote,\n daoProposalVotingAdapter,\n daoProposalVotingState,\n /**\n * @todo Work to remove `idInDAO` on the root. Don't think we use this?\n */\n idInDAO: id,\n snapshotDraft,\n snapshotProposal,\n snapshotType: isSnapshotDraft\n ? SnapshotType.draft\n : SnapshotType.proposal,\n\n // @todo Make type optional\n getCommonSnapshotProposalData: () => undefined,\n // @todo Make type optional\n refetchProposalOrDraft: () => {},\n };\n })\n .filter((p) => p.snapshotDraft || p.snapshotProposal);\n\n // Set proposals\n setProposals(proposalsToSet);\n }, [\n daoProposalIdsToUse,\n daoProposals,\n proposalsInclusiveStatus,\n proposalsVotes,\n proposalsVotingAdapters,\n proposalsVotingState,\n snapshotDraftAndProposals,\n ]);\n\n // Set overall async status\n useEffect(() => {\n const {STANDBY, PENDING, FULFILLED, REJECTED} = AsyncStatus;\n\n const statuses = [\n daoProposalsStatus,\n proposalsVotingAdaptersStatus,\n proposalsVotingStateStatus,\n proposalsVotesStatus,\n snapshotDraftAndProposalsStatus,\n ];\n\n /**\n * Standby\n *\n * The other statuses rely on Snapshot drafts and proposals being fetched,\n * so it's only in `STANDBY` at the point the Snapshot data has\n * not yet been fetched.\n */\n if (snapshotDraftAndProposalsStatus === STANDBY) {\n setProposalsInclusiveStatus(STANDBY);\n\n return;\n }\n\n // Pending\n if (statuses.some((s) => s === PENDING)) {\n setProposalsInclusiveStatus(PENDING);\n\n return;\n }\n\n // Fulfilled\n if (statuses.every((s) => s === FULFILLED)) {\n setProposalsInclusiveStatus(FULFILLED);\n\n return;\n }\n\n /**\n * Fulfilled: no `snapshotDraftAndProposals` were found.\n *\n * Since the other data-fetching hooks rely on `snapshotDraftAndProposals`\n * their statuses will be in `STANDBY` if `snapshotDraftAndProposals` is empty.\n */\n if (\n snapshotDraftAndProposalsStatus === FULFILLED &&\n !snapshotDraftAndProposals.length\n ) {\n setProposalsInclusiveStatus(FULFILLED);\n\n return;\n }\n\n /**\n * Fulfilled: No data was returned after running `useProposalsVotingAdapter`.\n *\n * The hooks `useProposalsVotingState`, `useProposalsVotes` are dependent upon `proposalsVotingAdapters`,\n * so if there is no data, at this point, it's safe to return `FULFILLED`.\n */\n if (\n proposalsVotingAdaptersStatus === FULFILLED &&\n !proposalsVotingAdapters.length\n ) {\n setProposalsInclusiveStatus(FULFILLED);\n\n return;\n }\n\n // Rejected\n if (statuses.some((s) => s === REJECTED)) {\n setProposalsInclusiveStatus(REJECTED);\n\n return;\n }\n }, [\n daoProposalIdsToUse.length,\n daoProposalsStatus,\n proposalsVotesStatus,\n proposalsVotingAdapters,\n proposalsVotingAdaptersStatus,\n proposalsVotingStateStatus,\n snapshotDraftAndProposals.length,\n snapshotDraftAndProposalsStatus,\n ]);\n\n // Set any error from async calls\n useEffect(() => {\n setProposalsInclusiveError(\n [\n daoProposalsError,\n proposalsVotesError,\n proposalsVotingAdaptersError,\n proposalsVotingStateError,\n snapshotDraftAndProposalsError,\n ].find((e) => e)\n );\n }, [\n daoProposalsError,\n proposalsVotesError,\n proposalsVotingAdaptersError,\n proposalsVotingStateError,\n snapshotDraftAndProposalsError,\n ]);\n\n /**\n * Functions\n */\n\n async function handleGetAllSnapshotDraftsAndProposals(\n adapterAddress: string\n ) {\n try {\n setSnapshotDraftAndProposalsStatus(AsyncStatus.PENDING);\n // Reset error\n setSnapshotDraftAndProposalsError(undefined);\n\n const snapshotDraftEntries = await getSnapshotDraftsByAdapterAddress(\n adapterAddress\n );\n\n const snapshotProposalEntries =\n await getSnapshotProposalsByAdapterAddress(adapterAddress);\n\n const mergedEntries = [\n ...snapshotDraftEntries,\n ...snapshotProposalEntries,\n ];\n\n if (!mergedEntries.length) {\n setSnapshotDraftAndProposalsStatus(AsyncStatus.FULFILLED);\n\n return;\n }\n\n setSnapshotDraftAndProposals(mergedEntries);\n setSnapshotDraftAndProposalsStatus(AsyncStatus.FULFILLED);\n } catch (error) {\n setSnapshotDraftAndProposalsStatus(AsyncStatus.REJECTED);\n setSnapshotDraftAndProposals(INITIAL_ARRAY);\n setSnapshotDraftAndProposalsError(error);\n }\n }\n\n return {\n proposals,\n proposalsError: proposalsInclusiveError,\n proposalsStatus: proposalsInclusiveStatus,\n };\n}\n","import {useCallback, useEffect, useState} from 'react';\nimport {useSelector} from 'react-redux';\nimport {AbiItem} from 'web3-utils/types';\n\nimport {AsyncStatus} from '../../../util/types';\nimport {multicall, MulticallTuple} from '../../web3/helpers';\nimport {ProposalVotesData, ProposalVotingAdapterTuple} from '../types';\nimport {StoreState} from '../../../store/types';\nimport {useWeb3Modal} from '../../web3/hooks';\nimport {VotingAdapterName} from '../../adapters-extensions/enums';\n\ntype ProposalsVotesTuple = [\n proposalId: string,\n /**\n * For each proposal, each result is stored under its adapter name.\n */\n adapterData: ProposalVotesData\n];\n\ntype UseProposalsVotesReturn = {\n proposalsVotes: ProposalsVotesTuple[];\n proposalsVotesError: Error | undefined;\n proposalsVotesStatus: AsyncStatus;\n};\n\nexport function useProposalsVotes(\n /**\n * A tuple of proposal id's and voting adapter data.\n * This data is returned by `useProposalsVotingAdapter`.\n */\n proposalVotingAdapters: ProposalVotingAdapterTuple[]\n): UseProposalsVotesReturn {\n /**\n * Selectors\n */\n\n const registryAddress = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract?.contractAddress\n );\n const registryABI = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract?.abi\n );\n\n /**\n * Our hooks\n */\n\n const {web3Instance} = useWeb3Modal();\n\n /**\n * State\n */\n\n const [proposalsVotes, setProposalsVotes] = useState(\n []\n );\n const [proposalsVotesError, setProposalsVotesError] = useState();\n const [proposalsVotesStatus, setProposalsVotesStatus] = useState(\n AsyncStatus.STANDBY\n );\n\n /**\n * Cached callbacks\n */\n\n const getProposalsVotesOnchainCached = useCallback(getProposalsVotesOnchain, [\n proposalVotingAdapters,\n registryABI,\n registryAddress,\n web3Instance,\n ]);\n\n /**\n * Effects\n */\n\n useEffect(() => {\n getProposalsVotesOnchainCached();\n }, [getProposalsVotesOnchainCached]);\n\n /**\n * Functions\n */\n\n async function getProposalsVotesOnchain() {\n if (\n !proposalVotingAdapters.length ||\n !registryABI ||\n !registryAddress ||\n !web3Instance\n ) {\n return;\n }\n\n // Only use hex (more specifically `bytes32`) id's\n const safeProposalVotingAdapters = proposalVotingAdapters.filter(([id]) =>\n web3Instance.utils.isHexStrict(id)\n );\n\n if (!safeProposalVotingAdapters.length) {\n setProposalsVotesStatus(AsyncStatus.FULFILLED);\n setProposalsVotes([]);\n\n return;\n }\n\n try {\n setProposalsVotesStatus(AsyncStatus.PENDING);\n\n // Build votes results\n const votesDataCalls: MulticallTuple[] = await Promise.all(\n safeProposalVotingAdapters.map(\n async ([\n proposalId,\n {votingAdapterAddress, getVotingAdapterABI, votingAdapterName},\n ]): Promise => [\n votingAdapterAddress,\n await getVotesDataABI(votingAdapterName, getVotingAdapterABI()),\n /**\n * We build the call arguments the same way for the different voting adapters\n * (i.e. [dao, proposalId]). If we need to change this we can move it to another function.\n */\n [registryAddress, proposalId],\n ]\n )\n );\n\n const votesDataResults = await multicall({\n calls: votesDataCalls,\n web3Instance,\n });\n\n setProposalsVotesStatus(AsyncStatus.FULFILLED);\n setProposalsVotes(\n safeProposalVotingAdapters.map(\n ([proposalId, {votingAdapterName}], i) => [\n proposalId,\n {\n [votingAdapterName]: votesDataResults[i],\n },\n ]\n )\n );\n } catch (error) {\n setProposalsVotesStatus(AsyncStatus.REJECTED);\n setProposalsVotes([]);\n setProposalsVotesError(error);\n }\n }\n\n /**\n * getVotesDataABI\n *\n * Gets the ABI for the public mapping getter of voting data.\n *\n * @param {VotingAdapterName} votingAdapterName\n * @returns {Promise}\n */\n async function getVotesDataABI(\n votingAdapterName: VotingAdapterName,\n votingAdapterABI: AbiItem[]\n ): Promise {\n try {\n switch (votingAdapterName) {\n case VotingAdapterName.OffchainVotingContract:\n const offchainVotesDataABI = votingAdapterABI.find(\n (ai) => ai.name === 'votes'\n );\n\n if (!offchainVotesDataABI) {\n throw new Error(\n `No \"votes\" function ABI was found for \"${votingAdapterName}\".`\n );\n }\n\n return offchainVotesDataABI;\n\n case VotingAdapterName.VotingContract:\n const votingVotesDataABI = votingAdapterABI.find(\n (ai) => ai.name === 'votes'\n );\n\n if (!votingVotesDataABI) {\n throw new Error(\n `No \"votes\" function ABI was found for \"${votingAdapterName}\".`\n );\n }\n\n return votingVotesDataABI;\n\n default:\n throw new Error(\n `No voting adapter name was found for \"${votingAdapterName}\".`\n );\n }\n } catch (error) {\n throw error;\n }\n }\n\n return {\n proposalsVotes,\n proposalsVotesError,\n proposalsVotesStatus,\n };\n}\n","import {useCallback, useEffect, useState} from 'react';\nimport {useSelector} from 'react-redux';\nimport {AbiItem} from 'web3-utils/types';\n\nimport {AsyncStatus} from '../../../util/types';\nimport {multicall, MulticallTuple} from '../../web3/helpers';\nimport {ProposalVotingAdapterTuple} from '../types';\nimport {StoreState} from '../../../store/types';\nimport {useWeb3Modal} from '../../web3/hooks';\nimport {VotingState} from '../voting/types';\n\ntype ProposalsVotingStateTuples = [\n proposalId: string,\n votingState: VotingState\n][];\n\ntype UseProposalsVotingStateReturn = {\n proposalsVotingState: ProposalsVotingStateTuples;\n proposalsVotingStateError: Error | undefined;\n proposalsVotingStateStatus: AsyncStatus;\n};\n\nexport function useProposalsVotingState(\n /**\n * A tuple of proposal id's and voting adapter data.\n * This data is returned by `useProposalsVotingAdapter`.\n */\n proposalVotingAdapters: ProposalVotingAdapterTuple[]\n): UseProposalsVotingStateReturn {\n /**\n * Selectors\n */\n\n const registryAddress = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract?.contractAddress\n );\n\n /**\n * Our hooks\n */\n\n const {web3Instance} = useWeb3Modal();\n\n /**\n * State\n */\n\n const [proposalsVotingState, setProposaslsVotingState] =\n useState([]);\n\n const [proposalsVotingStateError, setProposalsVotingStateError] =\n useState();\n\n const [proposalsVotingStateStatus, setProposalsVotingStateStatus] =\n useState(AsyncStatus.STANDBY);\n\n /**\n * Cached callbacks\n */\n\n const getProposalsVotingStateOnchainCached = useCallback(\n getProposalsVotingStateOnchain,\n [proposalVotingAdapters, registryAddress, web3Instance]\n );\n\n /**\n * Effects\n */\n\n useEffect(() => {\n getProposalsVotingStateOnchainCached();\n }, [getProposalsVotingStateOnchainCached]);\n\n /**\n * Functions\n */\n\n async function getProposalsVotingStateOnchain() {\n if (!registryAddress || !proposalVotingAdapters.length || !web3Instance) {\n return;\n }\n\n // Only use hex (more specifically `bytes32`) id's\n const safeProposalVotingAdapters = proposalVotingAdapters.filter(([id]) =>\n web3Instance.utils.isHexStrict(id)\n );\n\n if (!safeProposalVotingAdapters.length) {\n setProposalsVotingStateStatus(AsyncStatus.FULFILLED);\n\n return;\n }\n\n try {\n const lazyIVotingABI = (\n await import('../../../truffle-contracts/IVoting.json')\n ).default as AbiItem[];\n\n const votingResultAbi = lazyIVotingABI.find(\n (ai) => ai.name === 'voteResult'\n );\n\n if (!votingResultAbi) {\n throw new Error(\n 'No \"voteResult\" ABI function was found on the \"IVoting\" contract.'\n );\n }\n\n const calls: MulticallTuple[] = safeProposalVotingAdapters.map(\n ([proposalId, {votingAdapterAddress}]) => [\n votingAdapterAddress,\n votingResultAbi,\n [registryAddress, proposalId],\n ]\n );\n\n setProposalsVotingStateStatus(AsyncStatus.PENDING);\n\n const proposalsVotingStateResult = await multicall({\n calls,\n web3Instance,\n });\n\n setProposalsVotingStateStatus(AsyncStatus.FULFILLED);\n setProposaslsVotingState(\n safeProposalVotingAdapters.map(([proposalId], i) => [\n proposalId,\n proposalsVotingStateResult[i],\n ])\n );\n } catch (error) {\n setProposalsVotingStateStatus(AsyncStatus.REJECTED);\n setProposaslsVotingState([]);\n setProposalsVotingStateError(error);\n }\n }\n\n return {\n proposalsVotingState,\n proposalsVotingStateError,\n proposalsVotingStateStatus,\n };\n}\n","import {useSelector} from 'react-redux';\nimport {useCallback, useEffect, useRef, useState} from 'react';\nimport {isAddress} from 'web3-utils';\n\nimport {\n ProposalFlowStatus,\n ProposalData,\n ProposalFlag,\n OffchainVotingAdapterVote,\n} from '../types';\nimport {BURN_ADDRESS} from '../../../util/constants';\nimport {ENVIRONMENT} from '../../../config';\nimport {multicall, MulticallTuple} from '../../web3/helpers';\nimport {normalizeString} from '../../../util/helpers';\nimport {proposalHasFlag} from '../helpers';\nimport {StoreState} from '../../../store/types';\nimport {useTimeStartEnd} from '../../../hooks';\nimport {useWeb3Modal} from '../../web3/hooks';\nimport {VotingState} from '../voting/types';\n\ntype UseProposalWithOffchainVoteStatusReturn = {\n daoProposal: {adapterAddress: string; flags: number} | undefined;\n daoProposalVote: OffchainVotingAdapterVote | undefined;\n /**\n * An enum name (`string`) of the DAO proposal's `VotingState` index\n */\n daoProposalVoteResult: typeof VotingState[any] | undefined;\n proposalFlowStatusError: Error | undefined;\n status: ProposalFlowStatus | undefined;\n stopPollingForStatus: () => void;\n};\n\ntype UseProposalWithOffchainVoteStatusProps = {\n /**\n * Voting start time if `useCountdownToCheckInVoting: true`\n * i.e. calculated from the `OffchainVoting` contract's vote's start time, or Snapshot proposal's start time.\n *\n * If not available and/or determined, use `0`.\n */\n countdownVotingStartSeconds?: number;\n /**\n * Voting end time if `useCountdownToCheckInVoting: true`\n * i.e. calculated from the `OffchainVoting` contract's vote's end time, or Snapshot proposal's end time\n *\n * If not available and/or determined, use `0`.\n */\n countdownVotingEndSeconds?: number;\n proposal: ProposalData;\n /**\n * Defaults to `DEFAULT_POLL_INTERVAL_MS`:\n * - Production: 15000ms\n * - Development: 5000ms\n */\n pollInterval?: number;\n /**\n * If `true` \"in voting\" will be determined by an internal timer using\n * `countdownVotingStartSeconds` and `countdownVotingEndSeconds`, and not by the\n * contract's `VotingState`.\n */\n useCountdownToCheckInVoting?: boolean;\n};\n\nconst {\n Completed,\n OffchainVotingGracePeriod,\n OffchainVotingSubmitResult,\n OffchainVoting,\n Process,\n Sponsor,\n Submit,\n} = ProposalFlowStatus;\n\nconst DEFAULT_POLL_INTERVAL_MS: number =\n ENVIRONMENT === 'production' ? 15000 : 5000;\n\n/**\n * Derives where in the \"proposal flow\" a proposal currently is.\n *\n * Most flow states are derived from the contract.\n * Determing whether a proposal is in voting works a bit differently, depending\n * on which vote start and end times are to be used (i.e. Snapshot proposal vs. Contract proposal).\n *\n * Therefore, we pass these two timing values as props to be more agnostic.\n *\n * @param UseProposalWithOffchainVoteStatusProps\n * @returns `UseProposalWithOffchainVoteStatusReturn`\n */\nexport function useProposalWithOffchainVoteStatus({\n countdownVotingEndSeconds = 0,\n countdownVotingStartSeconds = 0,\n pollInterval = DEFAULT_POLL_INTERVAL_MS,\n proposal,\n useCountdownToCheckInVoting = false,\n}: UseProposalWithOffchainVoteStatusProps): UseProposalWithOffchainVoteStatusReturn {\n /**\n * Selectors\n */\n\n const {web3Instance} = useWeb3Modal();\n\n const daoRegistryAddress = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract?.contractAddress\n );\n\n const daoRegistryABI = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract?.abi\n );\n\n /**\n * State\n */\n\n const [status, setStatus] = useState();\n\n const [initComplete, setInitComplete] = useState(false);\n\n const [daoProposal, setDAOProposal] =\n useState();\n\n const [daoProposalVote, setDAOProposalVote] =\n useState();\n\n const [daoProposalVoteResult, setDAOProposalVoteResult] =\n useState<\n UseProposalWithOffchainVoteStatusReturn['daoProposalVoteResult']\n >();\n\n const [proposalFlowStatusError, setProposalFlowStatusError] =\n useState();\n\n /**\n * Refs\n */\n\n const pollingIntervalIdRef = useRef();\n const stopPollingRef = useRef(false);\n\n /**\n * Our hooks\n */\n\n const {\n hasTimeStarted: hasVotingStarted,\n hasTimeEnded: hasVotingEnded,\n timeStartEndInitReady,\n } = useTimeStartEnd(countdownVotingStartSeconds, countdownVotingEndSeconds);\n\n /**\n * Variables\n */\n\n const initialAsyncChecksCompleted: boolean =\n initComplete &&\n (useCountdownToCheckInVoting ? timeStartEndInitReady : true);\n\n const {daoProposalVotingAdapter, snapshotDraft, snapshotProposal} = proposal;\n const proposalId = snapshotDraft?.idInDAO || snapshotProposal?.idInDAO;\n\n const atExistsInDAO = daoProposal\n ? proposalHasFlag(ProposalFlag.EXISTS, daoProposal.flags)\n : false;\n\n const atSponsoredInDAO = daoProposal\n ? proposalHasFlag(ProposalFlag.SPONSORED, daoProposal.flags)\n : false;\n\n const atProcessedInDAO = daoProposal\n ? proposalHasFlag(ProposalFlag.PROCESSED, daoProposal.flags)\n : false;\n\n const offchainVotingAddress = daoProposalVotingAdapter?.votingAdapterAddress;\n const offchainVotingABI = daoProposalVotingAdapter?.getVotingAdapterABI();\n\n /**\n * Check if vote result was submitted.\n * We can do this by checking if `reporter` and `resultRoot` has been set.\n *\n * @see `submitVoteResult` in tribute-contracts off-chain voting adapters\n */\n const offchainResultSubmitted: boolean =\n isAddress(daoProposalVote?.reporter || '') &&\n normalizeString(daoProposalVote?.reporter || '') !== BURN_ADDRESS;\n\n const isInVotingFromTimer: boolean = hasVotingStarted && !hasVotingEnded;\n\n const isInVoting: boolean = useCountdownToCheckInVoting\n ? isInVotingFromTimer\n : VotingState[daoProposalVoteResult || ''] ===\n VotingState[VotingState.IN_PROGRESS];\n\n const isInVotingGracePeriod: boolean =\n VotingState[daoProposalVoteResult || ''] ===\n VotingState[VotingState.GRACE_PERIOD];\n\n /**\n * Cached callbacks\n */\n\n const getStatusFromContractCached = useCallback(getStatusFromContract, [\n daoProposalVotingAdapter,\n daoRegistryABI,\n daoRegistryAddress,\n offchainVotingABI,\n offchainVotingAddress,\n proposalId,\n web3Instance,\n ]);\n\n /**\n * Effects\n */\n\n // Get status as soon as possible.\n useEffect(() => {\n if (initComplete) {\n return;\n }\n\n getStatusFromContractCached().catch((error) => {\n setProposalFlowStatusError(error);\n });\n }, [getStatusFromContractCached, initComplete]);\n\n // Poll for status, etc.\n useEffect(() => {\n /**\n * Stop polling if processed:\n * Set our ref to be accessed inside of the polling interval callback\n */\n if (atProcessedInDAO) {\n stopPollingRef.current = true;\n }\n\n // Clear any previous intervals\n handleStopPollingForStatus();\n\n // Then, poll every `x` Ms\n const intervalId = setInterval(async () => {\n try {\n if (stopPollingRef.current) {\n handleStopPollingForStatus();\n }\n\n await getStatusFromContractCached();\n } catch (error) {\n handleStopPollingForStatus();\n\n setProposalFlowStatusError(error);\n }\n }, pollInterval);\n\n pollingIntervalIdRef.current = intervalId;\n }, [atProcessedInDAO, pollInterval, getStatusFromContractCached]);\n\n // Stop polling if propsal is processed, or on unmount.\n useEffect(() => {\n if (atProcessedInDAO) {\n handleStopPollingForStatus();\n }\n\n // Cleanup polling on unmount\n return function cleanup() {\n handleStopPollingForStatus();\n };\n }, [atProcessedInDAO]);\n\n // Determine the `status`\n useEffect(() => {\n // Status: cannot yet be determined\n if (!initialAsyncChecksCompleted) {\n setStatus(undefined);\n\n return;\n }\n\n const isStatusInitial: boolean = status === undefined;\n\n // Status: Submit\n if (\n !atExistsInDAO &&\n !atSponsoredInDAO &&\n !atProcessedInDAO &&\n (status === Submit || isStatusInitial)\n ) {\n setStatus(Submit);\n\n return;\n }\n\n /**\n * Status: Sponsor\n *\n * This may never occur for many adapter's proposals as submit and sponsor\n * take place in 1 transaction.\n */\n if (\n atExistsInDAO &&\n !isInVoting &&\n (status === Submit || isStatusInitial)\n ) {\n setStatus(Sponsor);\n\n return;\n }\n\n // Status: Off-Chain Voting\n if (\n atSponsoredInDAO &&\n isInVoting &&\n !offchainResultSubmitted &&\n (status === Submit || status === Sponsor || isStatusInitial)\n ) {\n setStatus(OffchainVoting);\n\n return;\n }\n\n // Status: Ready to Submit Vote Result\n if (\n atSponsoredInDAO &&\n !isInVoting &&\n !offchainResultSubmitted &&\n (status === OffchainVoting || isStatusInitial)\n ) {\n setStatus(OffchainVotingSubmitResult);\n\n return;\n }\n\n // Status: Grace period\n if (\n atSponsoredInDAO &&\n !isInVoting &&\n offchainResultSubmitted &&\n isInVotingGracePeriod &&\n (status === OffchainVotingSubmitResult || isStatusInitial)\n ) {\n setStatus(OffchainVotingGracePeriod);\n\n return;\n }\n\n // Status: Process\n if (\n atSponsoredInDAO &&\n !isInVoting &&\n offchainResultSubmitted &&\n !isInVotingGracePeriod &&\n (status === OffchainVotingGracePeriod || isStatusInitial)\n ) {\n setStatus(Process);\n\n return;\n }\n\n // Status: Processed (completed)\n if (atProcessedInDAO && (status === Process || isStatusInitial)) {\n setStatus(Completed);\n\n return;\n }\n }, [\n atExistsInDAO,\n atProcessedInDAO,\n atSponsoredInDAO,\n status,\n initialAsyncChecksCompleted,\n isInVoting,\n isInVotingGracePeriod,\n offchainResultSubmitted,\n ]);\n\n /**\n * Functions\n */\n\n async function getStatusFromContract(): Promise<\n | Partial<{\n proposal: typeof daoProposal;\n voteResult: typeof daoProposalVoteResult;\n votes: typeof daoProposalVote;\n }>\n | undefined\n > {\n try {\n if (\n !daoRegistryABI ||\n !daoRegistryAddress ||\n !proposalId ||\n !web3Instance\n ) {\n return;\n }\n\n const proposalsABI = daoRegistryABI.filter(\n (item) => item.name === 'proposals'\n )[0];\n\n /**\n * If there is no voting adapter (i.e. the proposal is not yet sponsored)\n * then only call the DAO for the proposal data and exit early.\n */\n if (!daoProposalVotingAdapter) {\n const [proposal] = await multicall({\n calls: [\n // DAO proposals call\n [daoRegistryAddress, proposalsABI, [proposalId]],\n ],\n web3Instance,\n });\n\n setDAOProposal(proposal);\n // Set last\n setInitComplete(true);\n\n return proposal;\n }\n\n if (!offchainVotingABI || !offchainVotingAddress) return;\n\n const voteResultABI = offchainVotingABI.filter(\n (item) => item.name === 'voteResult'\n )[0];\n\n const voteABI = offchainVotingABI.filter(\n (item) => item.name === 'votes'\n )[0];\n\n const calls: MulticallTuple[] = [\n // DAO proposals call\n [daoRegistryAddress, proposalsABI, [proposalId]],\n // Vote data call\n [offchainVotingAddress, voteABI, [daoRegistryAddress, proposalId]],\n // Vote result (state) call\n [\n offchainVotingAddress,\n voteResultABI,\n [daoRegistryAddress, proposalId],\n ],\n ];\n\n const [proposal, votes, voteResult] = await multicall({\n calls,\n web3Instance,\n });\n\n setDAOProposal(proposal);\n setDAOProposalVote(votes);\n setDAOProposalVoteResult(voteResult);\n // Set last\n setInitComplete(true);\n\n return {\n proposal,\n voteResult,\n votes,\n };\n } catch (error) {\n throw error;\n }\n }\n\n function handleStopPollingForStatus() {\n if (pollingIntervalIdRef.current) {\n clearInterval(pollingIntervalIdRef.current);\n\n pollingIntervalIdRef.current = undefined;\n }\n }\n\n /**\n * Return\n */\n\n return {\n daoProposal,\n daoProposalVote,\n daoProposalVoteResult,\n proposalFlowStatusError,\n status,\n stopPollingForStatus: handleStopPollingForStatus,\n };\n}\n","import {useState} from 'react';\nimport {useSelector} from 'react-redux';\nimport {\n buildVoteMessage,\n getDomainDefinition,\n getSpace,\n prepareVoteMessage,\n signMessage,\n SnapshotMessageVote,\n SnapshotSubmitBaseReturn,\n SnapshotType,\n SnapshotVoteData,\n SnapshotVoteProposal,\n submitMessage,\n VoteChoicesIndex,\n} from '@openlaw/snapshot-js-erc712';\n\nimport {BURN_ADDRESS} from '../../../util/constants';\nimport {ContractAdapterNames, Web3TxStatus} from '../../web3/types';\nimport {DEFAULT_CHAIN, SNAPSHOT_HUB_API_URL, SPACE} from '../../../config';\nimport {getAdapterAddressFromContracts} from '../../web3/helpers';\nimport {PRIMARY_TYPE_ERC712} from '../../web3/config';\nimport {StoreState} from '../../../store/types';\nimport {useWeb3Modal} from '../../web3/hooks/useWeb3Modal';\n\ntype SignAndSendVoteDataParam = {\n choice: SnapshotMessageVote['choice'];\n metadata?: Record;\n};\n\ntype UseSignAndSendVoteReturn = {\n signAndSendVote: (data: {\n partialVoteData: SignAndSendVoteDataParam;\n // e.g. Governance does not have an adpater name\n adapterName?: ContractAdapterNames;\n proposalIdInDAO: SnapshotVoteData['payload']['proposalId'];\n proposalIdInSnapshot: string;\n }) => Promise;\n voteData: SignAndSendVoteReturn | undefined;\n voteDataError: Error | undefined;\n voteDataStatus: Web3TxStatus;\n};\n\ntype SignAndSendVoteReturn = {\n data: SnapshotVoteData;\n signature: string;\n uniqueId: SnapshotSubmitBaseReturn['uniqueId'];\n};\n\n/**\n * useSignAndSendVote\n *\n * React hook which prepares proposal data for submission\n * to Snapshot and Tribute and signs it (ERC712)\n *\n * @returns {Promise} An object with the proposal data and the ERC712 signature string.\n */\nexport function useSignAndSendVote(): UseSignAndSendVoteReturn {\n /**\n * Selectors\n */\n\n const daoRegistryAddress = useSelector(\n (state: StoreState) => state.contracts.DaoRegistryContract?.contractAddress\n );\n\n const contracts = useSelector((s: StoreState) => s.contracts);\n\n const memberAddress = useSelector(\n (s: StoreState) => s.connectedMember?.memberAddress\n );\n\n /**\n * Our hooks\n */\n\n const {account, provider, web3Instance} = useWeb3Modal();\n\n /**\n * State\n */\n\n const [voteData, setVoteData] = useState();\n const [voteDataError, setVoteDataError] = useState();\n const [voteDataStatus, setVoteDataStatus] = useState(\n Web3TxStatus.STANDBY\n );\n\n /**\n * Functions\n */\n\n /**\n * signAndSendVote\n *\n * Builds the vote data for submission to Snapshot and signs it (ERC712).\n *\n * @param {SignAndSendVoteDataParam}\n * @param {adapterName} ContractAdapterNames - An adapter's contract address this data is related to.\n * @note Does not accept voting adapter names.\n * @param {SnapshotVoteData['payload']['proposalHash']} proposalHash - The unique hash of the proposal from snapshot-hub.\n * @returns {Promise} An object with the vote data and the ERC712 signature string.\n */\n async function signAndSendVote({\n partialVoteData,\n adapterName,\n proposalIdInDAO,\n proposalIdInSnapshot,\n }: {\n partialVoteData: SignAndSendVoteDataParam;\n // e.g. Governance does not have an adpater name\n adapterName?: ContractAdapterNames;\n /**\n * This is the hash of the content as submitted to the DAO.\n * The hash should be the same as the Snapshot draft's, or\n * proposal's (if not submitted as a draft), ID.\n *\n * We need to make sure this matches what has been submitted to\n * the DAO for later signature verifications.\n */\n proposalIdInDAO: SnapshotVoteData['payload']['proposalId'];\n /**\n * Must match a `proposal` type's ID in Snapshot so a `vote` may be attached.\n */\n proposalIdInSnapshot: string;\n }): Promise {\n try {\n if (!web3Instance) {\n throw new Error('No Web3 instance was found.');\n }\n\n if (!account) {\n throw new Error('No account was found.');\n }\n\n if (!memberAddress) {\n throw new Error('No member address was found.');\n }\n\n if (!daoRegistryAddress) {\n throw new Error('No \"DaoRegistry\" address was found.');\n }\n\n if (!SNAPSHOT_HUB_API_URL) {\n throw new Error('No \"SNAPSHOT_HUB_API_URL\" was found.');\n }\n\n if (!SPACE) {\n throw new Error('No Snapshot \"SPACE\" was found.');\n }\n\n setVoteDataStatus(Web3TxStatus.AWAITING_CONFIRM);\n\n const adapterAddress = adapterName\n ? getAdapterAddressFromContracts(adapterName, contracts)\n : BURN_ADDRESS;\n\n const {choice, metadata = {}} = partialVoteData;\n\n const {data: snapshotSpace} = await getSpace(SNAPSHOT_HUB_API_URL, SPACE);\n\n const voteData: SnapshotMessageVote = {\n chainId: DEFAULT_CHAIN,\n choice,\n metadata: {\n ...metadata,\n /**\n * Must be the true member's address for calculating voting power.\n * It's safest to use our helper Redux value `memberAddress: string`,\n * as it uses `OffchainVoting.memberAddressesByDelegatedKey`.\n */\n memberAddress,\n },\n };\n\n const voteProposalData: SnapshotVoteProposal = {\n proposalId: proposalIdInDAO,\n space: SPACE,\n token: snapshotSpace.token,\n };\n\n // 1. Check proposal type and get appropriate message\n const message = await buildVoteMessage(\n voteData,\n voteProposalData,\n SNAPSHOT_HUB_API_URL\n );\n\n const erc712Message = prepareVoteMessage({\n timestamp: message.timestamp,\n payload: {\n proposalId: message.payload.proposalId,\n choice: VoteChoicesIndex[choice],\n },\n });\n\n const {domain, types} = getDomainDefinition(\n {...erc712Message, type: SnapshotType.vote},\n daoRegistryAddress,\n adapterAddress,\n DEFAULT_CHAIN\n );\n\n const dataToSign = JSON.stringify({\n types: types,\n domain: domain,\n primaryType: PRIMARY_TYPE_ERC712,\n message: erc712Message,\n });\n\n const signature: string = await signMessage(\n provider,\n account,\n dataToSign\n );\n\n setVoteDataStatus(Web3TxStatus.PENDING);\n\n // 3. Send data to snapshot-hub\n const {data} = await submitMessage(\n SNAPSHOT_HUB_API_URL,\n account,\n {\n ...message,\n payload: {...message.payload, proposalId: proposalIdInSnapshot},\n },\n signature,\n {\n actionId: domain.actionId,\n chainId: domain.chainId,\n verifyingContract: domain.verifyingContract,\n message: erc712Message,\n }\n );\n\n const dataToReturn = {\n data: message,\n signature,\n uniqueId: data.uniqueId,\n };\n\n setVoteDataStatus(Web3TxStatus.FULFILLED);\n setVoteData(dataToReturn);\n\n return dataToReturn;\n } catch (error) {\n setVoteDataStatus(Web3TxStatus.REJECTED);\n setVoteDataError(error);\n\n throw error;\n }\n }\n\n return {\n signAndSendVote,\n voteData,\n voteDataError,\n voteDataStatus,\n };\n}\n","import {useState} from 'react';\nimport {useSelector} from 'react-redux';\nimport {\n buildDraftMessage,\n buildProposalMessage,\n getDomainDefinition,\n getSpace,\n prepareDraftMessage,\n prepareProposalMessage,\n signMessage,\n SnapshotMessageBase,\n SnapshotMessageProposal,\n SnapshotProposalData,\n SnapshotSubmitBaseReturn,\n SnapshotSubmitProposalReturn,\n SnapshotType,\n submitMessage,\n} from '@openlaw/snapshot-js-erc712';\n\nimport {\n ContractAdapterNames,\n ContractDAOConfigKeys,\n Web3TxStatus,\n} from '../../web3/types';\nimport {DEFAULT_CHAIN, SNAPSHOT_HUB_API_URL, SPACE} from '../../../config';\nimport {\n getAdapterAddressFromContracts,\n getDAOConfigEntry,\n} from '../../web3/helpers';\nimport {PRIMARY_TYPE_ERC712} from '../../web3/config';\nimport {\n ProposalOrDraftSignDataFromType,\n ProposalOrDraftSnapshotType,\n} from '../types';\nimport {StoreState} from '../../../store/types';\nimport {useWeb3Modal} from '../../web3/hooks/useWeb3Modal';\nimport {BURN_ADDRESS} from '../../../util/constants';\n\ntype SignAndSendData = {\n partialProposalData: PrepareAndSignProposalDataParam;\n adapterAddress?: string;\n adapterName?: ContractAdapterNames;\n type: T;\n};\n\ntype PrepareAndSignProposalDataParam = {\n body: SnapshotProposalData['payload']['body'];\n name: SnapshotProposalData['payload']['name'];\n metadata: SnapshotProposalData['payload']['metadata'];\n /**\n * Helpful for Proposal types when hashes between created Drafts\n * and yet to be created Proposals need to match.\n */\n timestamp?: SnapshotProposalData['timestamp'];\n};\n\ntype UseSignAndSubmitProposalReturn = {\n signAndSendProposal: (\n d: SignAndSendData\n ) => Promise>;\n proposalData: SignAndSendProposalReturn | undefined;\n proposalSignAndSendError: Error | undefined;\n proposalSignAndSendStatus: Web3TxStatus;\n};\n\ntype SignAndSendProposalReturn = {\n data: ProposalOrDraftSignDataFromType;\n signature: string;\n uniqueId: SnapshotSubmitBaseReturn['uniqueId'];\n uniqueIdDraft: SnapshotSubmitProposalReturn['uniqueIdDraft'];\n};\n\n/**\n * useSignAndSubmitProposal\n *\n * React hook which prepares proposal data for submission\n * to Snapshot and Tribute and signs it (ERC712)\n *\n * @returns {Promise} An object with the proposal data and the ERC712 signature string.\n */\nexport function useSignAndSubmitProposal<\n T extends ProposalOrDraftSnapshotType\n>(): UseSignAndSubmitProposalReturn {\n /**\n * Selectors\n */\n\n const daoRegistryAddress = useSelector(\n (state: StoreState) => state.contracts.DaoRegistryContract?.contractAddress\n );\n const daoRegistryInstance = useSelector(\n (state: StoreState) => state.contracts.DaoRegistryContract?.instance\n );\n const contracts = useSelector((state: StoreState) => state.contracts);\n\n /**\n * Our hooks\n */\n\n const {account, provider, web3Instance} = useWeb3Modal();\n\n /**\n * State\n */\n\n const [proposalData, setProposalData] =\n useState>();\n const [proposalSignAndSendError, setProposalSignAndSendError] =\n useState();\n const [proposalSignAndSendStatus, setProposalSignAndSendStatus] =\n useState(Web3TxStatus.STANDBY);\n\n /**\n * Functions\n */\n\n /**\n * A wrapper to clearly separate the running of functions\n * specific to Proposals.\n *\n * @param {SnapshotMessageBase & Partial} commonData\n * @returns {Promise}\n */\n async function buildProposalMessageHelper(\n commonData: SnapshotMessageBase & Partial\n ): Promise {\n if (!SNAPSHOT_HUB_API_URL) {\n throw new Error('No \"SNAPSHOT_HUB_API_URL\" was found.');\n }\n\n if (!web3Instance) {\n throw new Error('No Web3 instance was found.');\n }\n\n const snapshot: number = await web3Instance.eth.getBlockNumber();\n\n const votingTimeSeconds: number = parseInt(\n await getDAOConfigEntry(\n ContractDAOConfigKeys.offchainVotingVotingPeriod,\n daoRegistryInstance\n )\n );\n\n return await buildProposalMessage(\n {\n ...commonData,\n votingTimeSeconds,\n snapshot,\n },\n SNAPSHOT_HUB_API_URL\n );\n }\n\n /**\n * signAndSendProposal\n *\n * Builds the proposal data for submission to Tribute and Snapshot and signs it (ERC712).\n *\n * @returns {Promise} An object with the proposal data, signature string, and propsal hash(es) from snapshot-hub.\n */\n async function signAndSendProposal({\n partialProposalData,\n adapterAddress,\n adapterName,\n type,\n }: SignAndSendData): Promise> {\n try {\n if (!account) {\n throw new Error('No account was found to send.');\n }\n\n if (!web3Instance) {\n throw new Error('No Web3 instance was found.');\n }\n\n if (!daoRegistryAddress) {\n throw new Error('No \"DaoRegistry\" address was found.');\n }\n\n if (!SNAPSHOT_HUB_API_URL) {\n throw new Error('No \"SNAPSHOT_HUB_API_URL\" was found.');\n }\n\n if (!SPACE) {\n throw new Error('No Snapshot \"SPACE\" was found.');\n }\n\n if (type !== SnapshotType.draft && type !== SnapshotType.proposal) {\n throw new Error('Handling for type \"vote\" is not implemented.');\n }\n\n setProposalSignAndSendStatus(Web3TxStatus.AWAITING_CONFIRM);\n\n const actionId = adapterAddress\n ? adapterAddress\n : adapterName\n ? getAdapterAddressFromContracts(adapterName, contracts)\n : BURN_ADDRESS;\n\n const {body, name, metadata, timestamp} = partialProposalData;\n\n const {data: snapshotSpace} = await getSpace(SNAPSHOT_HUB_API_URL, SPACE);\n\n const commonData: SnapshotMessageBase = {\n name,\n body,\n metadata,\n token: snapshotSpace.token,\n space: SPACE,\n };\n\n // 1. Check proposal type and prepare appropriate message\n const message = (\n type === SnapshotType.draft\n ? await buildDraftMessage(commonData, SNAPSHOT_HUB_API_URL)\n : await buildProposalMessageHelper({\n ...commonData,\n timestamp,\n })\n ) as ProposalOrDraftSignDataFromType;\n\n // 2. Prepare signing data. Snapshot and the contracts will verify this same data against the signature.\n const erc712Message =\n type === SnapshotType.draft\n ? prepareDraftMessage(message)\n : prepareProposalMessage(message as SnapshotProposalData);\n\n const {domain, types} = getDomainDefinition(\n {...erc712Message, type},\n daoRegistryAddress,\n actionId,\n DEFAULT_CHAIN\n );\n\n const dataToSign = JSON.stringify({\n types,\n domain,\n primaryType: PRIMARY_TYPE_ERC712,\n message: erc712Message,\n });\n\n // 3. Sign data\n const signature = await signMessage(provider, account, dataToSign);\n\n setProposalSignAndSendStatus(Web3TxStatus.PENDING);\n\n // 3. Send data to snapshot-hub\n const {data} = await submitMessage(\n SNAPSHOT_HUB_API_URL,\n account,\n message,\n signature,\n {\n actionId: domain.actionId,\n chainId: domain.chainId,\n verifyingContract: domain.verifyingContract,\n message: erc712Message,\n }\n );\n\n const dataToReturn = {\n data: message,\n signature,\n uniqueId: data.uniqueId,\n uniqueIdDraft: data.uniqueIdDraft || '',\n };\n\n setProposalSignAndSendStatus(Web3TxStatus.FULFILLED);\n setProposalData(dataToReturn);\n\n return dataToReturn;\n } catch (error) {\n setProposalSignAndSendStatus(Web3TxStatus.REJECTED);\n setProposalSignAndSendError(error);\n\n throw error;\n }\n }\n\n return {\n proposalData,\n proposalSignAndSendError,\n proposalSignAndSendStatus,\n signAndSendProposal,\n };\n}\n","type EtherscanURLProps = {\n url: string;\n isPending?: boolean;\n};\n\nexport default function EtherscanURL(props: EtherscanURLProps) {\n const {url, isPending = false} = props;\n\n return (\n \n \n {isPending ? 'view progress' : 'view transaction'}\n \n \n );\n}\n","export function calculateVotingTimeRanges({\n gracePeriodLength,\n gracePeriodStartingTime,\n votePeriodLength,\n voteStartingTime,\n}: {\n gracePeriodLength: string | undefined;\n gracePeriodStartingTime: string | undefined;\n votePeriodLength: string | undefined;\n voteStartingTime: string | undefined;\n}): {\n gracePeriodEndMs: number;\n gracePeriodStartMs: number;\n voteEndMs: number;\n voteStartMs: number;\n} {\n const MS_MULTIPLIER: number = 1000;\n const toNumber = (value: string | undefined): number => Number(value || 0);\n\n const gracePeriodStartMs: number =\n toNumber(gracePeriodStartingTime) * MS_MULTIPLIER;\n\n const voteStartMs: number = toNumber(voteStartingTime) * MS_MULTIPLIER;\n\n return {\n voteEndMs: voteStartMs + toNumber(votePeriodLength) * MS_MULTIPLIER,\n voteStartMs,\n gracePeriodEndMs:\n gracePeriodStartMs + toNumber(gracePeriodLength) * MS_MULTIPLIER,\n gracePeriodStartMs,\n };\n}\n","import {SNAPSHOT_HUB_API_URL, SPACE} from '../../../config';\nimport {SnapshotOffchainProofResponse} from '../voting/types';\n\n/**\n * getOffchainVotingProof\n *\n * Gets a Merkle hex root's steps from Snapshot Hub\n * for verification.\n *\n * @link https://github.com/openlawteam/snapshot-hub\n */\nexport async function getOffchainVotingProof(\n merkleRootHex: string\n): Promise {\n try {\n const response = await fetch(\n `${SNAPSHOT_HUB_API_URL}/api/${SPACE}/offchain_proof/${merkleRootHex}`\n );\n\n // Return empty if not found\n if (response.status === 404) {\n return undefined;\n }\n\n // Some other error occured\n if (!response.ok) {\n throw new Error(\n 'Something went wrong while getting the off-chain vote proof.'\n );\n }\n\n return await response.json();\n } catch (error) {\n throw error;\n }\n}\n","import {VoteChoicesIndex} from '@openlaw/snapshot-js-erc712';\n\nimport {normalizeString} from '../../../util/helpers';\nimport {SnapshotProposal} from '../types';\nimport {VoteChoices} from '../../web3/types';\n\nexport function getVoteChosen(\n votes: SnapshotProposal['votes'],\n account: string\n): VoteChoices | undefined {\n const voteEntry = (votes || []).find((ve) =>\n Object.entries(ve).find(\n ([address, _voteData]) =>\n normalizeString(address) === normalizeString(account || '')\n )\n );\n\n if (voteEntry) {\n const voteData = Object.entries(voteEntry)[0][1];\n const choice = voteData.msg.payload.choice;\n\n return choice === VoteChoicesIndex.Yes ? VoteChoices.Yes : VoteChoices.No;\n }\n\n return undefined;\n}\n","import {AbiItem} from 'web3-utils/types';\n\nimport {VotingAdapterName} from '../../adapters-extensions/enums';\n\n/**\n * getVotingAdapterABI\n *\n * Gets the ABI for a voting adapter by the adapter's adapter name.\n *\n * @param {VotingAdapterName} votingAdapterName\n * @returns {Promise}\n */\nexport async function getVotingAdapterABI(\n votingAdapterName: VotingAdapterName\n): Promise {\n try {\n switch (votingAdapterName) {\n // Off-chain optimistic rollup\n case VotingAdapterName.OffchainVotingContract:\n const {default: lazyOffchainVotingABI} = await import(\n '../../../truffle-contracts/OffchainVotingContract.json'\n );\n\n return lazyOffchainVotingABI as AbiItem[];\n\n // On-chain voting\n case VotingAdapterName.VotingContract:\n const {default: lazyVotingABI} = await import(\n '../../../truffle-contracts/VotingContract.json'\n );\n\n return lazyVotingABI as AbiItem[];\n\n default:\n throw new Error(\n `No voting adapter name was found for \"${votingAdapterName}\".`\n );\n }\n } catch (error) {\n throw error;\n }\n}\n","import {ProposalFlag} from '../types';\n\n/**\n * proposalHasFlag\n *\n * @param flagToCheck\n * @param daoProposalFlag\n * @returns {boolean}\n *\n * @see `ProposalFlag` `DaoRegistry.sol`\n * @see `getFlag` `DaoConstants.sol`\n * @see `setFlag` `DaoConstants.sol`\n */\nexport function proposalHasFlag(\n flagToCheck: ProposalFlag,\n daoProposalFlag: number | string\n): boolean {\n return flagToCheck === Math.log2(Number(daoProposalFlag) + 1) - 1;\n}\n","import {VotingState} from '../voting/types';\n\nexport function proposalHasVotingState(\n votingStateToCheck: VotingState,\n votingState: number | string\n): boolean {\n return VotingState[votingState] === VotingState[votingStateToCheck];\n}\n","import {SNAPSHOT_HUB_API_URL, SPACE} from '../../../config';\nimport {ToStepNodeResult} from '@openlaw/snapshot-js-erc712/dist/types';\n\ntype SubmitOffchainVotingProofArguments = {\n /**\n * DAO Adapter address\n */\n actionId: string;\n /**\n * Blockchain network ID\n */\n chainId: number;\n /**\n * Hex string of the Merkle root\n */\n merkleRoot: string;\n /**\n * An array of Merkle tree steps\n */\n steps: ToStepNodeResult[];\n /**\n * DAO Registry address\n */\n verifyingContract: string;\n};\n\n/**\n * submitOffchainVotingProof\n *\n * Submits a Merkle hex root and its steps to Snapshot Hub\n * for verification and storage (if successful).\n *\n * The API endpoint does not have any return data, only a `201` response.\n *\n * @link https://github.com/openlawteam/snapshot-hub\n */\nexport async function submitOffchainVotingProof(\n data: SubmitOffchainVotingProofArguments\n): Promise {\n try {\n const response = await fetch(\n `${SNAPSHOT_HUB_API_URL}/api/${SPACE}/offchain_proofs`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(data),\n }\n );\n\n if (!response.ok) {\n throw new Error(\n 'Something went wrong while submitting the off-chain vote proof.'\n );\n }\n } catch (error) {\n throw error;\n }\n}\n","/**\n * BURN_ADDRESS\n *\n * - e.g. Helpful when detecting no address.\n * - e.g. Helpful for ERC-712 signatures which have no action id (like Governance).\n */\nexport const BURN_ADDRESS: '0x0000000000000000000000000000000000000000' =\n '0x0000000000000000000000000000000000000000';\n","import {CoreProposalVoteChoices} from '@openlaw/snapshot-js-erc712';\nimport {VoteChoices} from './types';\n\n/**\n * WEB3 CONFIG for TRIBUTE\n */\n\n// Vote choices should be \"yes\", \"no\" unless Tribute contracts change.\nexport const VOTE_CHOICES: CoreProposalVoteChoices = [\n VoteChoices.Yes,\n VoteChoices.No,\n];\n\n// When signing data this is the `primaryType` key's value which is part of the data to sign.\nexport const PRIMARY_TYPE_ERC712 = 'Message';\n\nexport const TX_CYCLE_MESSAGES: string[] = [\n 'Submitting\\u2026',\n 'Working\\u2026',\n 'DAOing\\u2026',\n 'Getting closer\\u2026',\n 'Dreaming of ETH\\u2026',\n];\n","export * from './CycleEllipsis';\n","import React, {useState, useEffect} from 'react';\n\nimport {chooseRandom} from '../../util/helpers';\n\ntype CycleMessageProps = {\n /**\n * Use the first item as the default.\n */\n useFirstItemStart?: boolean;\n /**\n * What is the interval of cycling the message?\n */\n intervalMs: number;\n /**\n * Provide multiple strings to cycle through.\n */\n messages: string[];\n /**\n * Render a React Element.\n * activeMessage is passed in.\n */\n render: (m: string) => React.ReactElement;\n};\n\nexport default function CycleMessage(props: CycleMessageProps) {\n const {intervalMs, messages, useFirstItemStart} = props;\n\n // Default item at start.\n const INITIAL_ITEM = useFirstItemStart\n ? messages[0]\n : chooseRandom(messages);\n\n const [activeMessage, setActiveMessage] = useState(INITIAL_ITEM);\n\n useEffect(() => {\n const intervalId = setInterval(\n () =>\n setActiveMessage((prevMessage) =>\n chooseRandom(messages, prevMessage)\n ),\n intervalMs\n );\n\n return () => {\n clearInterval(intervalId);\n };\n }, [intervalMs, messages]);\n\n return props.render(activeMessage);\n}\n","/**\n * WEB3 TYPES\n */\n\n// ...\n\n/**\n * WEB3 ENUMS\n */\n\n/**\n * Mapping of DaoRegistry member flags.\n * This should match the enum (including order) in the `DaoRegistry`. If it does not match,\n * the results of checking the proposal's state via flag will be wrong.\n *\n * @see `MemberFlag` `DaoRegistry.sol`\n * @see `getFlag` `DaoConstants.sol`\n * @see `setFlag` `DaoConstants.sol`\n */\nexport enum MemberFlag {\n EXISTS,\n}\n\n/**\n * Should match tribute-contracts constants\n *\n * @todo Add other extensions as needs arise\n */\nexport enum ContractAdapterNames {\n bank = 'bank',\n configuration = 'configuration',\n coupon_onboarding = 'coupon-onboarding',\n dao_registry = 'daoRegistry',\n distribute = 'distribute',\n financing = 'financing',\n guildkick = 'guildkick',\n managing = 'managing',\n nft = 'nft',\n onboarding = 'onboarding',\n ragequit = 'ragequit',\n tribute = 'tribute',\n tribute_nft = 'tribute-nft',\n voting = 'voting',\n}\n\n/**\n * Should match tribute-contracts constants\n *\n * @todo Add other extensions as needs arise\n */\nexport enum ContractExtensionNames {\n bank = 'bank',\n erc20 = 'erc20-ext',\n nft = 'nft',\n}\n\n/**\n * Should match tribute-contracts constants\n *\n * @todo Add other extensions as needs arise\n */\nexport enum ContractDAOConfigKeys {\n offchainVotingGracePeriod = 'offchainvoting.gracePeriod',\n offchainVotingStakingAmount = 'offchainvoting.stakingAmount',\n offchainVotingVotingPeriod = 'offchainvoting.votingPeriod',\n onboardingChunkSize = 'onboarding.chunkSize',\n onboardingMaximumChunks = 'onboarding.maximumChunks',\n onboardingUnitsPerChunk = 'onboarding.unitsPerChunk',\n onboardingTokenAddr = 'onboarding.tokenAddr',\n votingGracePeriod = 'voting.gracePeriod',\n votingStakingAmount = 'voting.stakingAmount',\n votingVotingPeriod = 'voting.votingPeriod',\n}\n\nexport enum VoteChoices {\n Yes = 'Yes',\n No = 'No',\n}\n\nexport enum Web3TxStatus {\n STANDBY = 'STANDBY',\n AWAITING_CONFIRM = 'AWAITING_CONFIRM',\n PENDING = 'PENDING',\n FULFILLED = 'FULFILLED',\n REJECTED = 'REJECTED',\n}\n","import {useState, useEffect} from 'react';\n\ntype LoaderLargeProps = {\n // Show waiting effect after some time has elapsed. Prevents the \"sudden\n // spinner\" UI/UX no-no. Esp. if we could have cached data.\n showAfterMs?: number;\n};\n\nexport default function LoaderLarge(props: LoaderLargeProps) {\n const {showAfterMs} = props;\n const [showLoaderAfterMs, setShowLoaderAfterMs] = useState(false);\n\n useEffect(() => {\n /* 200ms is approx. the time a user will notice a stalled, blank screen */\n const timeoutId =\n showAfterMs && setTimeout(() => setShowLoaderAfterMs(true), showAfterMs);\n\n return function cleanup() {\n timeoutId && clearTimeout(timeoutId);\n };\n }, [showAfterMs]);\n\n return !showAfterMs || (showAfterMs && showLoaderAfterMs) ? (\n
\n ) : null;\n}\n","import Web3 from 'web3';\n\nexport const hasValue = (value: string) => (value !== '' ? true : false);\n\nexport const isEmailValid = (email: string) =>\n /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i.test(email);\n\nexport const isEthAddressValid = (ethAddress: string) =>\n Web3.utils.isAddress(ethAddress);\n","/**\n * FOR HIGH REUSE TYPES\n *\n * For any other more specific types, co-locate them in either:\n *\n * 1) The actual code file.\n * 2) In a type file in the location of the code files which mainly use the types.\n *\n * @see https://kentcdodds.com/blog/colocation\n */\n\nexport type EnvironmentName = 'localhost' | 'development' | 'production';\n\nexport enum AsyncStatus {\n STANDBY = 'STANDBY',\n PENDING = 'PENDING',\n FULFILLED = 'FULFILLED',\n REJECTED = 'REJECTED',\n}\n\nexport interface MetaMaskRPCError extends Error {\n code: number;\n}\n","import {gql} from '@apollo/client';\n\nexport const GET_DAO = gql`\n query GetDao($id: ID) {\n tributeDaos(where: {id: $id}) {\n id # dao address\n daoAddress\n name\n totalUnits\n }\n }\n`;\n","import {gql} from '@apollo/client';\n\nexport const GET_ADAPTERS_AND_EXTENSIONS = gql`\n query GetAdaptersAndExtensions($daoAddress: String) {\n tributeDaos(where: {daoAddress: $daoAddress}) {\n daoAddress\n adapters {\n id\n acl\n adapterId\n adapterAddress\n }\n extensions {\n id\n extensionId\n extensionAddress\n }\n }\n }\n`;\n","import {gql} from '@apollo/client';\n\nexport const GET_MEMBERS = gql`\n query GetMembers($daoAddress: String) {\n tributeDaos(where: {daoAddress: $daoAddress}) {\n members(orderBy: createdAt, orderDirection: desc) {\n createdAt\n address: memberAddress\n delegateKey\n isDelegated\n units\n didFullyRagequit\n }\n }\n }\n`;\n","import {gql} from '@apollo/client';\n\nexport const GET_TOKEN_HOLDER_BALANCES = gql`\n query GetTokenHolderBalances($tokenAddress: String) {\n tokens(where: {tokenAddress: $tokenAddress}) {\n symbol\n tokenAddress\n holders {\n balance\n member {\n id\n delegateKey\n }\n }\n }\n }\n`;\n","import {ApolloLink} from '@apollo/client';\nimport {onError} from '@apollo/client/link/error';\nimport {Store} from 'redux';\n\nimport {setSubgraphNetworkStatus} from '../store/actions';\nimport {SubgraphNetworkStatus} from '../store/subgraphNetworkStatus/types';\nimport {StoreState} from '../store/types';\n\n/**\n * handleSubgraphError\n *\n * Handles an error from The Graph's GQL server at the Apollo\n * Link level.\n *\n * Handles network errors from The Graph's GQL server.\n *\n * About network errors from the Apollo Docs:\n *\n * \"Network errors occur \"These are errors encountered while attempting\n * to communicate with your GraphQL server, usually resulting in a\n * 4xx or 5xx response status code (and no data).\"\n *\n * We do not handle GQL errors that arise from individual queries.\n * Perhaps it best to handle those inside of the concerned components\n * (i.e. IF query error || subgraph is down THEN fallback)\n *\n * About GQL errors from the Apollo Docs:\n *\n * - Syntax errors (e.g., a query was malformed)\n * - Validation errors (e.g., a query included a schema field that doesn't exist)\n * - Resolver errors (e.g., an error occurred while attempting to populate a query field)\n *\n * @param {Store} store\n * @returns {ApolloLink}\n * @link https://www.apollographql.com/docs/react/data/error-handling\n */\nexport function handleSubgraphError(store: Store): ApolloLink {\n return onError(({/* graphQLErrors */ networkError}) => {\n if (networkError) {\n const reduxStateNotYetSet =\n (store.getState() as StoreState).subgraphNetworkStatus.status !==\n SubgraphNetworkStatus.ERR;\n\n if (reduxStateNotYetSet) {\n store.dispatch(\n setSubgraphNetworkStatus({status: SubgraphNetworkStatus.ERR})\n );\n\n // Show error once\n console.error(`[Subgraph network error]: ${networkError}`);\n }\n }\n\n // Reset when there's no more network error\n if (!networkError) {\n const reduxStateNotYetSet =\n (store.getState() as StoreState).subgraphNetworkStatus.status !==\n SubgraphNetworkStatus.OK;\n\n if (reduxStateNotYetSet) {\n store.dispatch(\n setSubgraphNetworkStatus({status: SubgraphNetworkStatus.OK})\n );\n }\n }\n });\n}\n","import {CLEAR_CONNECTED_MEMBER, SET_CONNECTED_MEMBER} from './actions';\nimport {ConnectedMemberState} from './types';\n\nconst INITIAL_STATE = null;\n\nexport default function reducer(\n state: ConnectedMemberState = INITIAL_STATE,\n action: any\n) {\n const {type, ...payload} = action;\n\n switch (type) {\n case SET_CONNECTED_MEMBER:\n return setConnectedMemberReducer(state, payload);\n case CLEAR_CONNECTED_MEMBER:\n return clearConnectedMemberReducer();\n default:\n return state;\n }\n}\n\nfunction setConnectedMemberReducer(\n state: Partial,\n payload: Record\n) {\n return {...state, ...payload};\n}\n\nfunction clearConnectedMemberReducer() {\n return INITIAL_STATE;\n}\n","import {CONNECT_MODAL_CLOSE, CONNECT_MODAL_OPEN} from './actions';\nimport {ConnectModalState} from './types';\n\nconst INITIAL_STATE = {\n isOpen: false,\n};\n\nexport default function reducer(\n state: ConnectModalState = INITIAL_STATE,\n action: any\n) {\n const {type} = action;\n\n switch (type) {\n case CONNECT_MODAL_CLOSE:\n return connectModalClose(state);\n case CONNECT_MODAL_OPEN:\n return connectModalOpen(state);\n default:\n return state;\n }\n}\n\nfunction connectModalClose(\n state: Partial\n): ConnectModalState {\n return {...state, isOpen: false};\n}\n\nfunction connectModalOpen(\n state: Partial\n): ConnectModalState {\n return {...state, isOpen: true};\n}\n","import {\n CLEAR_CONTRACTS,\n CONTRACT_BANK_ADAPTER,\n CONTRACT_BANK_EXTENSION,\n CONTRACT_BANK_FACTORY,\n CONTRACT_CONFIGURATION,\n CONTRACT_COUPON_ONBOARDING,\n CONTRACT_DAO_FACTORY,\n CONTRACT_DAO_REGISTRY_ADAPTER,\n CONTRACT_DAO_REGISTRY,\n CONTRACT_DISTRIBUTE,\n CONTRACT_ERC20_EXTENSION,\n CONTRACT_FINANCING,\n CONTRACT_GUILDKICK,\n CONTRACT_MANAGING,\n CONTRACT_NFT_ADAPTER,\n CONTRACT_NFT_EXTENSION,\n CONTRACT_ONBOARDING,\n CONTRACT_RAGEQUIT,\n CONTRACT_TRIBUTE_NFT,\n CONTRACT_TRIBUTE,\n CONTRACT_VOTING_OP_ROLLUP,\n CONTRACT_VOTING,\n} from '../actions';\nimport {ContractsState} from './types';\n\nconst initialState = {\n BankAdapterContract: null,\n BankExtensionContract: null,\n BankFactoryContract: null,\n ConfigurationContract: null,\n CouponOnboardingContract: null,\n DaoFactoryContract: null,\n DaoRegistryAdapterContract: null,\n DaoRegistryContract: null,\n DistributeContract: null,\n ERC20ExtensionContract: null,\n FinancingContract: null,\n GuildBankContract: null,\n ManagingContract: null,\n NFTAdapterContract: null,\n NFTExtensionContract: null,\n OnboardingContract: null,\n RagequitContract: null,\n TributeContract: null,\n TributeNFTContract: null,\n VotingContract: null,\n};\n\nexport default function reducer(\n state: ContractsState = initialState,\n action: any\n) {\n const {type, ...payload} = action;\n\n switch (type) {\n case CLEAR_CONTRACTS:\n return clearContracts(state);\n case CONTRACT_BANK_ADAPTER:\n return contractBankAdapter(state, payload);\n case CONTRACT_BANK_EXTENSION:\n return contractBankExtension(state, payload);\n case CONTRACT_BANK_FACTORY:\n return contractBankFactory(state, payload);\n case CONTRACT_CONFIGURATION:\n return contractConfiguration(state, payload);\n case CONTRACT_COUPON_ONBOARDING:\n return contractCouponOnboarding(state, payload);\n case CONTRACT_DAO_FACTORY:\n return contractDAOFactory(state, payload);\n case CONTRACT_DAO_REGISTRY:\n return contractDAORegistry(state, payload);\n case CONTRACT_DAO_REGISTRY_ADAPTER:\n return contractDaoRegistryAdapter(state, payload);\n case CONTRACT_DISTRIBUTE:\n return contractDistribute(state, payload);\n case CONTRACT_ERC20_EXTENSION:\n return contractERC20Extension(state, payload);\n case CONTRACT_FINANCING:\n return contractFinancing(state, payload);\n case CONTRACT_GUILDKICK:\n return contractGuildBank(state, payload);\n case CONTRACT_MANAGING:\n return contractManaging(state, payload);\n case CONTRACT_NFT_ADAPTER:\n return contractNFTAdapter(state, payload);\n case CONTRACT_NFT_EXTENSION:\n return contractNFTExtension(state, payload);\n case CONTRACT_ONBOARDING:\n return contractOnboarding(state, payload);\n case CONTRACT_RAGEQUIT:\n return contractRagequit(state, payload);\n case CONTRACT_TRIBUTE:\n return contractTribute(state, payload);\n case CONTRACT_TRIBUTE_NFT:\n return contractTributeNFT(state, payload);\n case CONTRACT_VOTING:\n return contractVoting(state, payload);\n case CONTRACT_VOTING_OP_ROLLUP:\n return contractVoting(state, payload);\n\n default:\n return state;\n }\n}\n\nfunction clearContracts(state: ContractsState) {\n return {...state, ...initialState};\n}\n\nfunction contractBankFactory(state: ContractsState, payload: any) {\n return {...state, BankFactoryContract: {...payload}};\n}\n\nfunction contractDAOFactory(state: ContractsState, payload: any) {\n return {...state, DaoFactoryContract: {...payload}};\n}\n\nfunction contractDAORegistry(state: ContractsState, payload: any) {\n return {...state, DaoRegistryContract: {...payload}};\n}\n\nfunction contractDaoRegistryAdapter(\n state: ContractsState,\n payload: any\n): ContractsState {\n return {...state, DaoRegistryAdapterContract: {...payload}};\n}\n\nfunction contractBankExtension(\n state: ContractsState,\n payload: any\n): ContractsState {\n return {...state, BankExtensionContract: {...payload}};\n}\n\nfunction contractConfiguration(state: ContractsState, payload: any) {\n return {...state, ConfigurationContract: {...payload}};\n}\n\nfunction contractDistribute(\n state: ContractsState,\n payload: any\n): ContractsState {\n return {...state, DistributeContract: {...payload}};\n}\n\nfunction contractFinancing(state: ContractsState, payload: any) {\n return {...state, FinancingContract: {...payload}};\n}\n\nfunction contractGuildBank(state: ContractsState, payload: any) {\n return {...state, GuildBankContract: {...payload}};\n}\n\nfunction contractOnboarding(state: ContractsState, payload: any) {\n return {...state, OnboardingContract: {...payload}};\n}\n\nfunction contractRagequit(state: ContractsState, payload: any) {\n return {...state, RagequitContract: {...payload}};\n}\n\nfunction contractTribute(state: ContractsState, payload: any): ContractsState {\n return {...state, TributeContract: {...payload}};\n}\n\nfunction contractVoting(state: ContractsState, payload: any): ContractsState {\n return {...state, VotingContract: {...payload}};\n}\n\nfunction contractManaging(state: ContractsState, payload: any): ContractsState {\n return {...state, ManagingContract: {...payload}};\n}\n\nfunction contractBankAdapter(\n state: ContractsState,\n payload: any\n): ContractsState {\n return {...state, BankAdapterContract: {...payload}};\n}\n\nfunction contractNFTAdapter(\n state: ContractsState,\n payload: any\n): ContractsState {\n return {...state, NFTAdapterContract: {...payload}};\n}\n\nfunction contractTributeNFT(\n state: ContractsState,\n payload: any\n): ContractsState {\n return {...state, TributeNFTContract: {...payload}};\n}\n\nfunction contractCouponOnboarding(\n state: ContractsState,\n payload: any\n): ContractsState {\n return {...state, CouponOnboardingContract: {...payload}};\n}\n\nfunction contractNFTExtension(\n state: ContractsState,\n payload: any\n): ContractsState {\n return {...state, NFTExtensionContract: {...payload}};\n}\n\nfunction contractERC20Extension(\n state: ContractsState,\n payload: any\n): ContractsState {\n return {...state, ERC20ExtensionContract: {...payload}};\n}\n","import {SET_SUBGRAPH_NETWORK_STATUS} from './actions';\nimport {SubgraphNetworkStatus, SubgraphNetworkStatusState} from './types';\n\nconst INITIAL_STATE = {\n status: SubgraphNetworkStatus.OK,\n};\n\nexport default function reducer(\n state: SubgraphNetworkStatusState = INITIAL_STATE,\n action: any\n) {\n const {type, ...payload} = action;\n\n switch (type) {\n case SET_SUBGRAPH_NETWORK_STATUS:\n return setSubgraphNetworkStatus(state, payload);\n default:\n return state;\n }\n}\n\nfunction setSubgraphNetworkStatus(\n state: Partial,\n payload: Record\n) {\n return {...state, ...payload};\n}\n","import {combineReducers} from 'redux';\n\nimport connectedMember from './connectedMember/reducers';\nimport connectModal from './connectModal/reducers';\nimport contracts from './contracts/reducers';\nimport subgraphNetworkStatus from './subgraphNetworkStatus/reducers';\n\nexport default combineReducers({\n connectModal,\n connectedMember,\n contracts,\n subgraphNetworkStatus,\n});\n","import {applyMiddleware, createStore} from 'redux';\nimport {composeWithDevTools} from 'redux-devtools-extension/logOnlyInProduction';\nimport thunk from 'redux-thunk';\n\nimport rootReducer from './reducers';\n\nexport const store = createStore(\n rootReducer,\n composeWithDevTools(applyMiddleware(thunk))\n);\n","import React from 'react';\n\nexport default function DiscordSVG(props: React.SVGAttributes) {\n return (\n \n \n \n \n \n \n \n \n \n );\n}\n","import DiscordSVG from '../../assets/svg/DiscordSVG';\nimport GitHubSVG from '../../assets/svg/GitHubSVG';\nimport MediumSVG from '../../assets/svg/MediumSVG';\n\n// @todo Add missing URLs when available\nenum SocialMediaLinks {\n DISCORD = '#',\n // query params search sepcifically for openlawteam/tribute-ui and\n // openlawteam/tribute-contracts\n GITHUB = 'https://github.com/search?q=org%3Aopenlawteam+tribute-ui+OR+tribute-contracts+in%3Aname&type=repositories',\n MEDIUM = '#',\n}\n\nexport default function SocialMedia() {\n return (\n
\n \n \n \n \n \n \n \n \n \n
\n );\n}\n","import React from 'react';\n\nclass GitHubSVG extends React.Component {\n render() {\n return (\n \n \n \n );\n }\n}\n\nexport default GitHubSVG;\n","import React from 'react';\n\nclass MediumSVG extends React.Component {\n render() {\n return (\n \n \n \n );\n }\n}\n\nexport default MediumSVG;\n","import SocialMedia from './common/SocialMedia';\n\nexport default function Footer() {\n return (\n
\n \n
\n );\n}\n","import {lazy, Suspense, useState} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {useEffect} from 'react';\n\nimport {\n useIsDefaultChain,\n useMaybeContractWallet,\n useWeb3Modal,\n} from './components/web3/hooks';\nimport {AsyncStatus} from './util/types';\nimport {connectModalClose, connectModalOpen} from './store/actions';\nimport {StoreState} from './store/types';\nimport {useLocation} from 'react-router-dom';\n\n/**\n * Lazy load ConnectWalletModal only when open\n */\nconst ConnectWalletModal = lazy(\n () => import('./components/web3/ConnectWalletModal')\n);\n\nexport default function GlobalConnectWalletModal() {\n /**\n * Selectors\n */\n\n const isConnectModalOpen: boolean = useSelector(\n ({connectModal}: StoreState) => connectModal.isOpen\n );\n\n /**\n * State\n */\n\n const [modalProps, setModalProps] = useState<\n Parameters[0]['modalProps']\n >({\n isOpen: isConnectModalOpen,\n onRequestClose: () => {\n dispatch(connectModalClose());\n },\n });\n\n /**\n * Our hooks\n */\n\n const {account, connected, initialCachedConnectorCheckStatus, web3Instance} =\n useWeb3Modal();\n\n const {isDefaultChain} = useIsDefaultChain();\n\n const maybeContractWallet = useMaybeContractWallet(\n account,\n web3Instance?.currentProvider\n );\n\n /**\n * Their hooks\n */\n\n const dispatch = useDispatch();\n const {pathname} = useLocation();\n\n /**\n * Effects\n */\n\n useEffect(() => {\n setModalProps((prevState) => ({...prevState, isOpen: isConnectModalOpen}));\n }, [isConnectModalOpen]);\n\n /**\n * Effects\n */\n\n /**\n * Will automatically re-show the modal (on app `pathname` change) only when:\n * - If wrong chain\n * - If smart contract wallet\n */\n useEffect(() => {\n if (initialCachedConnectorCheckStatus === AsyncStatus.FULFILLED) {\n const shouldAutomaticallyOpenModal: boolean =\n connected && (!isDefaultChain || maybeContractWallet) ? true : false;\n\n shouldAutomaticallyOpenModal\n ? dispatch(connectModalOpen())\n : dispatch(connectModalClose());\n }\n }, [\n connected,\n dispatch,\n initialCachedConnectorCheckStatus,\n isDefaultChain,\n maybeContractWallet,\n pathname,\n ]);\n\n /**\n * Render\n */\n\n if (!isConnectModalOpen) return null;\n\n return (\n \n \n \n );\n}\n","import {Helmet} from 'react-helmet';\n\nexport default function Head() {\n return (\n \n Tribute\n \n \n );\n}\n","interface LogoProps {\n size?: 'small' | 'medium' | 'large' | '';\n}\n\nexport default function Logo(props: LogoProps) {\n return (\n
\n TRIBUTE\n
\n );\n}\n","import React from 'react';\n\nimport Logo from './Logo';\n\n/**\n * ModalLogo\n * This component is used for modal menu\n */\nexport function ModalLogo() {\n return (\n
\n \n
\n );\n}\n\n/**\n * LeftLogo\n * This component is used for main pages\n */\nexport function LeftLogo() {\n return (\n
\n \n
\n );\n}\n\n/**\n * CenterLogo\n * This component is used for splash page\n */\nexport function CenterLogo() {\n return (\n
\n \n
\n );\n}\n","export default function HamburgerSVG() {\n return (\n \n \n \n );\n}\n","import {isMobile} from '@walletconnect/browser-utils';\nimport {useDispatch} from 'react-redux';\n\nimport {connectModalOpen} from '../../store/actions';\nimport {truncateEthAddress} from '../../util/helpers';\nimport {useIsDefaultChain} from './hooks';\nimport {useWeb3Modal} from './hooks';\nimport {WalletIcon} from './';\n\ntype CustomWalletTextProps = {\n account: ReturnType['account'];\n connected: ReturnType['connected'];\n isMobile: ReturnType;\n};\n\ntype ConnectWalletButtonProps = {\n customWalletText?: ((o: CustomWalletTextProps) => string) | string;\n showWalletETHBadge?: boolean;\n};\n\nexport default function ConnectWalletButton({\n customWalletText,\n // Defaults to `true`\n showWalletETHBadge = true,\n}: ConnectWalletButtonProps): JSX.Element {\n /**\n * Our hooks\n */\n\n const {account, connected, web3Modal} = useWeb3Modal();\n\n const {isDefaultChain} = useIsDefaultChain();\n\n /**\n * Their hooks\n */\n\n const dispatch = useDispatch();\n\n /**\n * Variables\n */\n\n const isWrongNetwork: boolean = isDefaultChain === false;\n\n /**\n * Functions\n */\n\n function getWalletText(): string {\n if (customWalletText) {\n return typeof customWalletText === 'function'\n ? customWalletText({account, connected, isMobile: isMobile()})\n : customWalletText;\n }\n\n if (account) {\n return truncateEthAddress(account);\n }\n\n return 'Connect';\n }\n\n /**\n * Return\n */\n\n return (\n {\n dispatch(connectModalOpen());\n }}>\n \n {getWalletText()}\n \n\n {isWrongNetwork && connected && Wrong Network}\n\n {showWalletETHBadge && (\n \n )}\n \n );\n}\n","import {useCallback, useEffect, useState} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {StoreState} from '../../../store/types';\nimport {ERC20RegisterDetails} from '../DaoToken';\nimport {AsyncStatus} from '../../../util/types';\n\ntype UseDaoTokenDetailsReturn = {\n daoTokenDetails: ERC20RegisterDetails | undefined;\n daoTokenDetailsError: Error | undefined;\n daoTokenDetailsStatus: AsyncStatus;\n};\n\n/**\n * useDaoTokenDetails\n *\n * Gets DAO token details from ERC20Extension contract.\n *\n * @returns {UseDaoTokenDetailsReturn}\n */\nexport function useDaoTokenDetails(): UseDaoTokenDetailsReturn {\n /**\n * Selectors\n */\n\n const ERC20ExtensionContract = useSelector(\n (state: StoreState) => state.contracts?.ERC20ExtensionContract\n );\n\n /**\n * State\n */\n\n const [daoTokenDetails, setDaoTokenDetails] =\n useState();\n const [daoTokenDetailsStatus, setDaoTokenDetailsStatus] =\n useState(AsyncStatus.STANDBY);\n const [daoTokenDetailsError, setDaoTokenDetailsError] = useState();\n\n /**\n * Cached callbacks\n */\n\n const getDaoTokenDetailsCached = useCallback(getDaoTokenDetails, [\n ERC20ExtensionContract,\n ]);\n\n /**\n * Effects\n */\n\n useEffect(() => {\n getDaoTokenDetailsCached();\n }, [getDaoTokenDetailsCached]);\n\n /**\n * Functions\n */\n\n async function getDaoTokenDetails() {\n if (!ERC20ExtensionContract) return;\n\n try {\n setDaoTokenDetailsStatus(AsyncStatus.PENDING);\n\n const symbol = await ERC20ExtensionContract.instance.methods\n .symbol()\n .call();\n const decimals = await ERC20ExtensionContract.instance.methods\n .decimals()\n .call();\n\n setDaoTokenDetails({\n address: ERC20ExtensionContract.contractAddress,\n symbol,\n decimals: Number(decimals),\n image: `${window.location.origin}/favicon.ico`,\n });\n\n setDaoTokenDetailsStatus(AsyncStatus.FULFILLED);\n } catch (error) {\n console.log(error);\n setDaoTokenDetails(undefined);\n setDaoTokenDetailsError(error);\n setDaoTokenDetailsStatus(AsyncStatus.REJECTED);\n }\n }\n\n return {daoTokenDetails, daoTokenDetailsError, daoTokenDetailsStatus};\n}\n","import {useCallback, useEffect, useState} from 'react';\n\nimport FadeIn from '../../components/common/FadeIn';\nimport {useWeb3Modal} from '../../components/web3/hooks';\nimport {useTokenHolderBalances} from './hooks';\nimport {formatNumber} from '../../util/helpers';\nimport {ETHERSCAN_URLS} from '../../config';\n\nexport type ERC20HolderDetails = {\n symbol: string;\n balance: number;\n tokenAddress: string;\n};\n\ntype DaoTokenHolderProps = {\n backgroundColor?: string;\n border?: string;\n color?: string;\n customStyles?: Record;\n};\n\nconst image = `${window.location.origin}/favicon.ico`;\n\nconst toDataURL = (url: string) =>\n fetch(url)\n .then((response) => response.blob())\n .then(\n (blob) =>\n new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result);\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n })\n );\n\nexport default function DaoTokenHolder({\n customStyles,\n ...badgeStyles\n}: DaoTokenHolderProps): JSX.Element {\n /**\n * State\n */\n\n const [tokenHolder, setTokenHolder] = useState();\n const [tokenImageUrl, setTokenImageURL] = useState();\n const [tokenEtherscanURL, setTokenEtherscanURL] = useState('');\n\n /**\n * Our hooks\n */\n\n const {tokenHolderBalances} = useTokenHolderBalances();\n const {account, networkId} = useWeb3Modal();\n\n /**\n * Cached callbacks\n */\n\n const getTokenImageCallback = useCallback(getTokenImage, []);\n\n /**\n * Effects\n */\n\n useEffect(() => {\n setTokenHolder(undefined);\n\n if (account && tokenHolderBalances) {\n const {holders, symbol, tokenAddress} = tokenHolderBalances;\n\n const holderData = holders?.find(\n (holder: any) =>\n holder.member?.id.toLowerCase() === account.toLowerCase()\n );\n\n holderData &&\n setTokenHolder({\n balance: holderData.balance,\n tokenAddress,\n symbol,\n });\n\n account &&\n networkId &&\n setTokenEtherscanURL(\n `${ETHERSCAN_URLS[networkId]}/token/${tokenAddress}?a=${account}`\n );\n\n getTokenImageCallback();\n }\n }, [account, networkId, tokenHolderBalances, getTokenImageCallback]);\n\n /**\n * Functions\n */\n\n function getTokenImage() {\n try {\n toDataURL(image).then((dataUrl: any) => {\n dataUrl && setTokenImageURL(dataUrl);\n });\n } catch (error) {\n console.log(error);\n }\n }\n\n /**\n * Render\n */\n\n if (tokenHolder) {\n return (\n \n \n \n {formatNumber(tokenHolder.balance)}\n \n {tokenHolder.symbol}\n\n {tokenImageUrl && \"Token}\n \n \n );\n }\n\n return <>;\n}\n","import {useCallback, useEffect, useState} from 'react';\nimport {useSelector} from 'react-redux';\nimport {useLazyQuery} from '@apollo/react-hooks';\n\nimport {StoreState} from '../../../store/types';\nimport {GET_TOKEN_HOLDER_BALANCES} from '../../../gql';\n\ntype UseTokenHolderBalancesReturn = {\n tokenHolderBalances: Record | undefined;\n gqlError: Error | undefined;\n};\n\n/**\n * useTokenHolderBalances\n *\n * This component queries The Graph API to get data on the token holders\n *\n * @returns {UseTokenHolderBalancesReturn}\n */\nexport function useTokenHolderBalances(): UseTokenHolderBalancesReturn {\n /**\n * Selectors\n */\n\n const erc20ExtensionContract = useSelector(\n (s: StoreState) => s.contracts?.ERC20ExtensionContract\n );\n\n const connectedMember = useSelector((s: StoreState) => s.connectedMember);\n\n /**\n * GQL Query\n */\n\n const [\n getTokenHolderBalances,\n {called, loading, data, error, startPolling, stopPolling},\n ] = useLazyQuery(GET_TOKEN_HOLDER_BALANCES, {\n variables: {\n tokenAddress: erc20ExtensionContract?.contractAddress.toLowerCase(),\n },\n });\n\n /**\n * State\n */\n\n const [tokenHolderBalances, setTokenHolderBalances] = useState<\n Record | undefined\n >();\n const [gqlError, setGqlError] = useState();\n\n /**\n * Cached callbacks\n */\n\n const getTokenBalanceCallback = useCallback(getTokenBalance, [\n erc20ExtensionContract?.contractAddress,\n data,\n error,\n loading,\n ]);\n\n /**\n * Effects\n */\n\n useEffect(() => {\n if (!called) {\n getTokenHolderBalances();\n }\n }, [called, getTokenHolderBalances]);\n\n useEffect(() => {\n if (!loading && erc20ExtensionContract?.contractAddress) {\n getTokenBalanceCallback();\n }\n }, [\n erc20ExtensionContract?.contractAddress,\n getTokenBalanceCallback,\n loading,\n ]);\n\n // When the `SET_CONNECTED_MEMBER` redux action is dispatched in other\n // components (to refetch the connected user's member status info) the\n // `useSelector` hook above will return a new `connectedMember` object. By\n // default, the `useEffect` hook uses a strict equality comparison which will\n // consider the new object a changed value (even if the individual fields are\n // the same from the previous `connectedMember` store state). This change is\n // used to trigger a refresh of the `GET_TOKEN_HOLDER_BALANCES` query result\n // so any change to the connected token holder's balance can be shown in the\n // nav badge without having to do a page reload.\n useEffect(() => {\n // a single refetch may not be enough to catch any token balance change so\n // we poll but only for a short time period\n connectedMember && startPolling && startPolling(2000);\n\n const pollingTimeoutId = stopPolling && setTimeout(stopPolling, 10000);\n\n return function cleanup() {\n pollingTimeoutId && clearTimeout(pollingTimeoutId);\n };\n }, [connectedMember, startPolling, stopPolling]);\n\n /**\n * Functions\n */\n\n function getTokenBalance() {\n try {\n if (!loading && data) {\n setTokenHolderBalances(data.tokens[0]);\n if (data.tokens.length === 0) {\n const error = new Error(\n `\"${erc20ExtensionContract?.contractAddress}\" erc20 address not found.`\n );\n throw error;\n }\n } else {\n if (error) {\n const error = new Error(\n `\"${erc20ExtensionContract?.contractAddress}\" is not a valid erc20 address.`\n );\n\n throw error;\n }\n }\n } catch (error) {\n setGqlError(error);\n }\n }\n\n return {tokenHolderBalances, gqlError};\n}\n","import {NavLink} from 'react-router-dom';\nimport {Transition} from 'react-transition-group';\nimport {useSelector} from 'react-redux';\nimport {useState, useEffect, useRef} from 'react';\nimport Media from 'react-media';\nimport ReactModal from 'react-modal';\n\nimport {ModalLogo} from './logo';\nimport {StoreState} from '../store/types';\nimport {useWeb3Modal} from './web3/hooks';\nimport HamburgerSVG from '../assets/svg/HamburgerSVG';\nimport TimesSVG from '../assets/svg/TimesSVG';\nimport Web3ModalButton from './web3/Web3ModalButton';\nimport DaoTokenHolder from './dao-token/DaoTokenHolder';\n\n// see: http://reactcommunity.org/react-transition-group/transition\nconst duration = 200;\n\nconst defaultStyle = {\n transition: '0.1s',\n};\n\nconst transitionOpeningStyles: Record = {\n entering: {right: '-300px'},\n entered: {right: 0},\n exiting: {right: 0, opacity: 0},\n exited: {right: '-300px', opacity: 0},\n};\n\nconst transitionClosingStyles: Record = {\n entering: {right: 0, opacity: 1},\n entered: {right: '-300px', opacity: 1},\n exiting: {right: '-300px', opacity: 1},\n exited: {right: 0, opacity: 1},\n};\n\nexport function NavLinks() {\n return (\n \n );\n}\n\nexport function NavHamburger() {\n /**\n * Selectors\n */\n\n const connectedMember = useSelector((s: StoreState) => s.connectedMember);\n\n /**\n * State\n */\n\n const [shouldShowMenuModal, setShouldShowMenuModal] = useState(false);\n const [transitionStyles, setTransitionStyles] = useState>(\n transitionOpeningStyles\n );\n\n /**\n * Our hooks\n */\n\n const {account} = useWeb3Modal();\n\n /**\n * Refs\n */\n\n const closeMenuRef = useRef();\n\n /**\n * Effects\n */\n\n useEffect(() => {\n // Clean up on unmount\n return () => {\n closeMenuRef.current && clearTimeout(closeMenuRef.current);\n };\n }, []);\n\n /**\n * Variables\n */\n\n const isCurrentMemberOrDelegateConnected: boolean =\n account && connectedMember?.isActiveMember ? true : false;\n const isCurrentMemberConnected: boolean =\n account &&\n connectedMember?.isActiveMember &&\n account.toLowerCase() === connectedMember?.memberAddress.toLowerCase()\n ? true\n : false;\n\n /**\n * Functions\n */\n\n function handleMenuModalClose(close: boolean) {\n // delay transition for closing\n if (close) {\n setShouldShowMenuModal(close);\n setTransitionStyles(transitionOpeningStyles);\n } else {\n setTransitionStyles(transitionClosingStyles);\n closeMenuRef.current = setTimeout(\n () => setShouldShowMenuModal(close),\n 500\n );\n return () => closeMenuRef.current && clearTimeout(closeMenuRef.current);\n }\n }\n\n /**\n * Render\n */\n\n return (\n <>\n
\n {\n event.preventDefault();\n handleMenuModalClose(true);\n }}>\n \n
\n
\n\n {/** MODAL MENU */}\n {\n handleMenuModalClose(false);\n }}\n overlayClassName=\"nav-modal-overlay\"\n role=\"dialog\"\n style={{overlay: {zIndex: '99'}} as any}>\n \n {(transition) => (\n
\n \n )}\n \n \n \n );\n}\n\nexport default function Nav() {\n /**\n * Render\n */\n\n return (\n \n {(_matches: boolean) => (\n
\n
\n {/* NAV */}\n \n \n \n
\n \n
\n
\n
\n )}\n
\n );\n}\n","import {Link} from 'react-router-dom';\n\nimport {LeftLogo} from './logo';\nimport Nav from './Nav';\n\nexport default function Header() {\n /**\n * Functions\n */\n\n // Render the location with a link\n function RenderLogo(props: React.PropsWithChildren) {\n return {props.children};\n }\n\n /**\n * Render\n */\n\n return (\n
\n \n \n \n\n
\n
\n
\n );\n}\n","import Web3 from 'web3';\n\nimport {DaoAdapterConstants, DaoExtensionConstants} from './enums';\nimport {AclFlag} from './types';\n\nexport function getAdapterOrExtensionId(\n adapterName: DaoAdapterConstants | DaoExtensionConstants\n): string {\n return sha3(adapterName) as string;\n}\n\n/**\n * getAccessControlLayer\n *\n * @param adapterName\n */\nexport function getAccessControlLayer(\n adapterOrExtensionName: string\n): Record {\n const adapterAndExtensionFlags: Record<\n | DaoAdapterConstants\n | DaoExtensionConstants.BANK\n | DaoExtensionConstants.NFT,\n any\n > = {\n [DaoExtensionConstants.BANK]: {},\n [DaoAdapterConstants.CONFIGURATION]: {\n SUBMIT_PROPOSAL: true,\n PROCESS_PROPOSAL: true,\n SPONSOR_PROPOSAL: true,\n SET_CONFIGURATION: true,\n },\n [DaoAdapterConstants.DISTRIBUTE]: {\n SUBMIT_PROPOSAL: true,\n SPONSOR_PROPOSAL: true,\n PROCESS_PROPOSAL: true,\n INTERNAL_TRANSFER: true,\n },\n [DaoAdapterConstants.EXECUTION]: {},\n [DaoAdapterConstants.TRIBUTE]: {\n SUBMIT_PROPOSAL: true,\n SPONSOR_PROPOSAL: true,\n PROCESS_PROPOSAL: true,\n NEW_MEMBER: true,\n ADD_TO_BALANCE: true,\n REGISTER_NEW_TOKEN: true,\n },\n [DaoAdapterConstants.FINANCING]: {\n SUBMIT_PROPOSAL: true,\n SPONSOR_PROPOSAL: true,\n PROCESS_PROPOSAL: true,\n ADD_TO_BALANCE: true,\n SUB_FROM_BALANCE: true,\n },\n [DaoAdapterConstants.GUILDKICK]: {\n SUBMIT_PROPOSAL: true,\n SPONSOR_PROPOSAL: true,\n PROCESS_PROPOSAL: true,\n SUB_FROM_BALANCE: true,\n ADD_TO_BALANCE: true,\n JAIL_MEMBER: true,\n UNJAIL_MEMBER: true,\n INTERNAL_TRANSFER: true,\n },\n [DaoAdapterConstants.MANAGING]: {\n SUBMIT_PROPOSAL: true,\n PROCESS_PROPOSAL: true,\n SPONSOR_PROPOSAL: true,\n REMOVE_ADAPTER: true,\n ADD_ADAPTER: true,\n },\n [DaoAdapterConstants.OFFCHAINVOTING]: {},\n [DaoAdapterConstants.ONBOARDING]: {\n SUBMIT_PROPOSAL: true,\n SPONSOR_PROPOSAL: true,\n PROCESS_PROPOSAL: true,\n ADD_TO_BALANCE: true,\n UPDATE_DELEGATE_KEY: true,\n NEW_MEMBER: true,\n },\n [DaoAdapterConstants.NONVOTING_ONBOARDING]: {},\n [DaoAdapterConstants.RAGEQUIT]: {\n SUB_FROM_BALANCE: true,\n JAIL_MEMBER: true,\n UNJAIL_MEMBER: true,\n INTERNAL_TRANSFER: true,\n },\n [DaoAdapterConstants.VOTING]: {},\n [DaoAdapterConstants.BANK]: {\n WITHDRAW: true,\n SUB_FROM_BALANCE: true,\n UPDATE_TOKEN: true,\n },\n [DaoAdapterConstants.NFT]: {\n COLLECT_NFT: true,\n },\n [DaoAdapterConstants.COUPON_ONBOARDING]: {\n SUBMIT_PROPOSAL: false,\n ADD_TO_BALANCE: true,\n UPDATE_DELEGATE_KEY: false,\n NEW_MEMBER: true,\n },\n [DaoAdapterConstants.TRIBUTE_NFT]: {\n SUBMIT_PROPOSAL: true,\n NEW_MEMBER: true,\n ADD_TO_BALANCE: true,\n COLLECT_NFT: true,\n },\n [DaoExtensionConstants.NFT]: {\n WITHDRAW_NFT: true,\n COLLECT_NFT: true,\n INTERNAL_TRANSFER: true,\n },\n [DaoAdapterConstants.DAO_REGISTRY]: {\n UPDATE_DELEGATE_KEY: true,\n },\n };\n\n const flags = adapterAndExtensionFlags[adapterOrExtensionName];\n\n return {acl: accessFlags(flags)};\n}\n\n/**\n * === INTERNAL HELPER FUNCTIONS ===\n */\n\n/**\n * accessFlags()\n *\n * @param flags\n */\nfunction accessFlags(flags: Record): number {\n const ADAPTER_ACCESS_FLAGS = [\n flags.ADD_ADAPTER,\n flags.REMOVE_ADAPTER,\n flags.JAIL_MEMBER,\n flags.UNJAIL_MEMBER,\n flags.SUBMIT_PROPOSAL,\n flags.SPONSOR_PROPOSAL,\n flags.PROCESS_PROPOSAL,\n flags.UPDATE_DELEGATE_KEY,\n flags.SET_CONFIGURATION,\n flags.ADD_EXTENSION,\n flags.REMOVE_EXTENSION,\n flags.NEW_MEMBER,\n ];\n const EXTENSION_ACCESS_FLAGS = [flags.TRANSFER_NFT];\n\n const values: boolean[] = [\n ...ADAPTER_ACCESS_FLAGS,\n ...EXTENSION_ACCESS_FLAGS,\n ];\n\n return entry(values) as number;\n}\n\n/**\n * sha3()\n *\n * @returns string | null\n * @param value\n */\nfunction sha3(value: string): string | null {\n return Web3.utils.sha3(value);\n}\n\n/**\n * entry()\n *\n * @param values\n */\nfunction entry(values: Boolean[]): number {\n return values\n .map((v: any, idx: number) => (v !== undefined ? 2 ** idx : 0))\n .reduce((a: any, b: any) => a + b);\n}\n","import {DaoAdapterConstants /*DaoExtensionConstants*/} from './enums';\nimport {getAdapterOrExtensionId} from './helpers';\n\nimport {\n BANK_ADAPTER_CONTRACT_ADDRESS,\n CONFIGURATION_CONTRACT_ADDRESS,\n COUPONONBOARDING_CONTRACT_ADDRESS,\n DAO_REGISTRY_ADAPTER_CONTRACT_ADDRESS,\n DEFAULT_CHAIN,\n DISTRIBUTE_CONTRACT_ADDRESS,\n FINANCING_CONTRACT_ADDRESS,\n GUILDKICK_CONTRACT_ADDRESS,\n MANAGING_CONTRACT_ADDRESS,\n NFT_ADAPTER_CONTRACT_ADDRESS,\n // NFT_EXTENSION_CONTRACT_ADDRESS,\n OFFCHAINVOTING_CONTRACT_ADDRESS,\n ONBOARDING_CONTRACT_ADDRESS,\n RAGEQUIT_CONTRACT_ADDRESS,\n TRIBUTE_CONTRACT_ADDRESS,\n TRIBUTE_NFT_CONTRACT_ADDRESS,\n VOTING_CONTRACT_ADDRESS,\n} from '../../config';\n\ntype AdapterProps = {\n abiFunctionName: string;\n adapterId?: string;\n contractAddress: string;\n description: string;\n extensionId?: string;\n name: string;\n /**\n * Sets the access control for a particular adapter (by address)\n * to a specific extension. Both adapter and extension need to be\n * already registered to the DAO.\n *\n * We call the `setAclToExtensionForAdapter` function from the\n * DaoRegistry, and set the access for each adapter based on this flag\n */\n setAclToExtensionForAdapter?: boolean;\n};\n\nexport type AdaptersAndExtensionsType = {\n isExtension?: boolean;\n options?: Omit<\n AdapterProps,\n | 'abiFunctionName'\n | 'adapterId'\n | 'contractAddress'\n | 'description'\n | 'extensionId'\n | 'name'\n | 'setAclToExtensionForAdapter'\n >;\n optionDefaultTarget?: DaoAdapterConstants;\n} & Partial;\n\n/**\n * @note README [IMPORTANT]\n *\n * HOW TO ADD A NEW DEFAULT ADAPTER OR EXTENSION\n *\n * 1. Add the new contract address to the `./src/config.ts`\n * list ie: _CONTRACT_ADDRESS\n *\n * 2. Create a new object in the following variable `defaultAdaptersAndExtensions`\n * - Extensions: must have the key/value pair set `isExtension: true`\n * - Choosing an adapter/extension from a group: must be defined within a nested `options` key\n */\nexport const defaultAdaptersAndExtensions: AdaptersAndExtensionsType[] = [\n {\n name: DaoAdapterConstants.CONFIGURATION,\n adapterId: getAdapterOrExtensionId(DaoAdapterConstants.CONFIGURATION),\n contractAddress: CONFIGURATION_CONTRACT_ADDRESS[DEFAULT_CHAIN],\n abiFunctionName: 'submitConfigurationProposal',\n description:\n 'Manages storing and retrieving per-DAO settings required by shared adapters.',\n },\n {\n name: DaoAdapterConstants.DISTRIBUTE,\n adapterId: getAdapterOrExtensionId(DaoAdapterConstants.DISTRIBUTE),\n contractAddress: DISTRIBUTE_CONTRACT_ADDRESS[DEFAULT_CHAIN],\n abiFunctionName: 'submitProposal',\n description:\n 'Allows the members to distribute funds to one or all members of the DAO.',\n },\n {\n name: DaoAdapterConstants.FINANCING,\n adapterId: getAdapterOrExtensionId(DaoAdapterConstants.FINANCING),\n contractAddress: FINANCING_CONTRACT_ADDRESS[DEFAULT_CHAIN],\n abiFunctionName: 'createFinancingRequest',\n description:\n 'Allows individuals and/or organizations to request funds to finance their projects, and the members of the DAO have the power to vote and decide which projects should be funded.',\n },\n {\n name: DaoAdapterConstants.GUILDKICK,\n adapterId: getAdapterOrExtensionId(DaoAdapterConstants.GUILDKICK),\n contractAddress: GUILDKICK_CONTRACT_ADDRESS[DEFAULT_CHAIN],\n abiFunctionName: 'submitKickProposal',\n description:\n 'Gives the members the freedom to choose which individuals or organizations should really be part of the DAO.',\n },\n {\n name: DaoAdapterConstants.MANAGING,\n adapterId: getAdapterOrExtensionId(DaoAdapterConstants.MANAGING),\n contractAddress: MANAGING_CONTRACT_ADDRESS[DEFAULT_CHAIN],\n abiFunctionName: 'submitProposal',\n description:\n 'Enhances the DAO capabilities by adding/updating the DAO Adapters through a voting process.',\n },\n {\n name: DaoAdapterConstants.ONBOARDING,\n adapterId: getAdapterOrExtensionId(DaoAdapterConstants.ONBOARDING),\n contractAddress: ONBOARDING_CONTRACT_ADDRESS[DEFAULT_CHAIN],\n abiFunctionName: 'configureDao',\n description:\n 'Triggers the process of minting internal tokens in exchange of a specific token at a fixed price.',\n },\n {\n name: DaoAdapterConstants.RAGEQUIT,\n adapterId: getAdapterOrExtensionId(DaoAdapterConstants.RAGEQUIT),\n contractAddress: RAGEQUIT_CONTRACT_ADDRESS[DEFAULT_CHAIN],\n abiFunctionName: 'ragequit',\n description:\n 'Gives the members the freedom to choose when it is the best time to exit the DAO for any given reason.',\n },\n {\n name: DaoAdapterConstants.TRIBUTE,\n adapterId: getAdapterOrExtensionId(DaoAdapterConstants.TRIBUTE),\n contractAddress: TRIBUTE_CONTRACT_ADDRESS[DEFAULT_CHAIN],\n abiFunctionName: 'configureDao',\n description:\n 'Allows potential and existing DAO members to contribute any amount of ERC-20 tokens to the DAO in exchange for any amount of DAO internal tokens.',\n },\n {\n name: DaoAdapterConstants.TRIBUTE_NFT,\n adapterId: getAdapterOrExtensionId(DaoAdapterConstants.TRIBUTE_NFT),\n contractAddress: TRIBUTE_NFT_CONTRACT_ADDRESS[DEFAULT_CHAIN],\n abiFunctionName: 'provideTributeNFT',\n description:\n 'Allows potential DAO members to contribute a registered ERC-721 asset to the DAO in exchange for any amount of DAO units.',\n },\n {\n options: [\n {\n name: DaoAdapterConstants.VOTING,\n displayName: DaoAdapterConstants.OFFCHAINVOTING,\n adapterId: getAdapterOrExtensionId(DaoAdapterConstants.VOTING),\n contractAddress: OFFCHAINVOTING_CONTRACT_ADDRESS[DEFAULT_CHAIN],\n abiFunctionName: 'configureDao',\n description:\n 'Adds the offchain voting governance process to the DAO to support gasless voting.',\n setAclToExtensionForAdapter: true,\n },\n {\n name: DaoAdapterConstants.VOTING,\n displayName: DaoAdapterConstants.VOTING,\n adapterId: getAdapterOrExtensionId(DaoAdapterConstants.VOTING),\n contractAddress: VOTING_CONTRACT_ADDRESS[DEFAULT_CHAIN],\n abiFunctionName: 'configureDao',\n description:\n 'Adds the simple on chain voting governance process to the DAO.',\n setAclToExtensionForAdapter: true,\n },\n ],\n optionDefaultTarget: DaoAdapterConstants.VOTING,\n },\n {\n name: DaoAdapterConstants.BANK,\n adapterId: getAdapterOrExtensionId(DaoAdapterConstants.BANK),\n contractAddress: BANK_ADAPTER_CONTRACT_ADDRESS[DEFAULT_CHAIN],\n abiFunctionName: 'withdraw',\n description:\n 'Allows the members to withdraw their funds from the DAO bank.',\n },\n {\n name: DaoAdapterConstants.NFT,\n adapterId: getAdapterOrExtensionId(DaoAdapterConstants.NFT),\n contractAddress: NFT_ADAPTER_CONTRACT_ADDRESS[DEFAULT_CHAIN],\n abiFunctionName: 'collect',\n description: 'Transfers ownership of an NFT to the DAO collection.',\n },\n {\n name: DaoAdapterConstants.COUPON_ONBOARDING,\n adapterId: getAdapterOrExtensionId(DaoAdapterConstants.COUPON_ONBOARDING),\n contractAddress: COUPONONBOARDING_CONTRACT_ADDRESS[DEFAULT_CHAIN],\n abiFunctionName: 'configureDao',\n description:\n 'Provides a way to onboard an initial group of members quickly without requiring multiple proposals.',\n },\n {\n name: DaoAdapterConstants.DAO_REGISTRY,\n adapterId: getAdapterOrExtensionId(DaoAdapterConstants.DAO_REGISTRY),\n contractAddress: DAO_REGISTRY_ADAPTER_CONTRACT_ADDRESS[DEFAULT_CHAIN],\n abiFunctionName: 'updateDelegateKey',\n description: 'Allows the member to update delegate key.',\n },\n // {\n // isExtension: true,\n // name: DaoExtensionConstants.NFT,\n // extensionId: getAdapterOrExtensionId(DaoExtensionConstants.NFT),\n // contractAddress: NFT_EXTENSION_CONTRACT_ADDRESS[DEFAULT_CHAIN],\n // abiFunctionName: 'registerPotentialNewNFT',\n // description:\n // 'Adds to the DAO the capability of managing and curate a collection of standard NFTs.',\n // },\n];\n","import {useCallback, useEffect, useState} from 'react';\nimport {useLazyQuery} from '@apollo/react-hooks';\nimport {useSelector} from 'react-redux';\n\nimport {StoreState} from '../../../store/types';\nimport {AsyncStatus} from '../../../util/types';\nimport {Adapters, Extensions} from '../types';\n\nimport {GET_ADAPTERS_AND_EXTENSIONS} from '../../../gql';\n\nimport {\n defaultAdaptersAndExtensions,\n AdaptersAndExtensionsType,\n} from '../config';\nimport {GQL_QUERY_POLLING_INTERVAL} from '../../../config';\n\nimport {DaoAdapterConstants, DaoExtensionConstants} from '../enums';\n\nexport type AdapterType = {\n __typename: string;\n id: string;\n acl: string;\n adapterId: string;\n adapterAddress: string;\n};\n\nexport type ExtensionType = {\n __typename: string;\n id: string;\n extensionId: string;\n extensionAddress: string;\n};\n\ntype UseAdaptersOrExtensionsReturn = {\n adapterExtensionStatus: AsyncStatus;\n getAdapterOrExtensionFromRedux: (\n adapterName: DaoAdapterConstants | DaoExtensionConstants\n ) => Record;\n registeredAdaptersOrExtensions: AdapterType[] | undefined;\n unRegisteredAdaptersOrExtensions: Adapters[] | undefined;\n};\n\nexport type AdaptersType = AdapterType & Adapters;\nexport type ExtensionsType = ExtensionType & Extensions;\n\n/**\n * useAdaptersOrExtensions\n *\n * This component queries The Graph API to get the daos adapters.\n * It returns the available adapters filtered by a search on the current dao.\n *\n * @returns {UseAdaptersOrExtensionsReturn}\n */\nexport function useAdaptersOrExtensions(): UseAdaptersOrExtensionsReturn {\n /**\n * Selectors\n */\n const {DaoRegistryContract, ...adapterExtensionContracts} = useSelector(\n (s: StoreState) => s.contracts\n );\n\n /**\n * Their hooks\n */\n const [getRegisteredAdaptersAndExtensions, {called, data, error}] =\n useLazyQuery(GET_ADAPTERS_AND_EXTENSIONS, {\n pollInterval: GQL_QUERY_POLLING_INTERVAL,\n variables: {\n daoAddress: DaoRegistryContract?.contractAddress.toLowerCase(),\n },\n });\n\n /**\n * State\n */\n const [registeredAdaptersOrExtensions, setRegisteredAdaptersOrExtensions] =\n useState();\n const [\n unRegisteredAdaptersOrExtensions,\n setUnRegisteredAdaptersOrExtensions,\n ] = useState();\n const [adapterExtensionStatus, setAdapterExtensionStatus] =\n useState(AsyncStatus.STANDBY);\n\n const getAdaptersAndExtensionsCached = useCallback(\n getAdaptersAndExtensions,\n []\n );\n\n useEffect(() => {\n if (!called) {\n getRegisteredAdaptersAndExtensions();\n }\n }, [called, getRegisteredAdaptersAndExtensions]);\n\n // Get adapters and extensions from GQL\n useEffect(() => {\n if (!DaoRegistryContract?.contractAddress) return;\n\n try {\n setAdapterExtensionStatus(AsyncStatus.PENDING);\n\n if (data) {\n // extract adapters and extensions from gql data\n const {adapters, extensions} = data.tributeDaos[0] as Record<\n string,\n any\n >;\n\n // create a list of registered and un-registered adapters and extensions\n const {registeredList, unRegisteredList} =\n getAdaptersAndExtensionsCached(adapters, extensions);\n\n setRegisteredAdaptersOrExtensions(registeredList);\n setUnRegisteredAdaptersOrExtensions(unRegisteredList);\n\n // done; lets set status to fulfilled\n setAdapterExtensionStatus(AsyncStatus.FULFILLED);\n } else {\n if (error) {\n throw new Error(error.message);\n }\n }\n } catch (error) {\n setRegisteredAdaptersOrExtensions(undefined);\n setUnRegisteredAdaptersOrExtensions(undefined);\n\n setAdapterExtensionStatus(AsyncStatus.REJECTED);\n }\n }, [DaoRegistryContract, data, error, getAdaptersAndExtensionsCached]);\n\n /**\n * getAdaptersAndExtensions\n *\n * Find all registered and un-registered adapters and extensions\n *\n * @param registeredDaoAdapters\n * @param registeredDaoExtensions\n */\n function getAdaptersAndExtensions(\n registeredDaoAdapters: any,\n registeredDaoExtensions: any\n ): Record {\n //@todo types\n\n let registeredList: AdaptersAndExtensionsType[] = [];\n let unRegisteredList: AdaptersAndExtensionsType[] = [];\n\n const getAdapterFromGql = (adapterId: string) => {\n return registeredDaoAdapters.find(\n (adapter: AdaptersAndExtensionsType) => {\n return adapter.adapterId?.toLowerCase() === adapterId?.toLowerCase();\n }\n );\n };\n\n const getExtensionFromGql = (extensionId: string) => {\n return registeredDaoExtensions.find(\n (extension: AdaptersAndExtensionsType) => {\n return (\n extension.extensionId?.toLowerCase() === extensionId?.toLowerCase()\n );\n }\n );\n };\n\n defaultAdaptersAndExtensions.forEach(\n (adapterOrExtension: AdaptersAndExtensionsType | any) => {\n if (adapterOrExtension?.isExtension) {\n // Add an extenaion\n\n const gqlExtension = getExtensionFromGql(\n adapterOrExtension.extensionId\n );\n\n if (gqlExtension) {\n registeredList.push({\n ...gqlExtension,\n ...adapterOrExtension,\n name: adapterOrExtension.name as DaoAdapterConstants,\n description: adapterOrExtension.description,\n } as AdaptersAndExtensionsType);\n } else {\n unRegisteredList.push({\n ...adapterOrExtension,\n name: adapterOrExtension.name as DaoAdapterConstants,\n description: adapterOrExtension.description,\n } as AdaptersAndExtensionsType);\n }\n } else if (adapterOrExtension?.options) {\n // Check options for adapters and extensions\n\n // dry-run check to see if any of the options have already been registered\n const maybeSomeAdapters = adapterOrExtension?.options.some(\n (s: any) => {\n return !s.isExtension && getAdapterFromGql(s.adapterId);\n }\n );\n\n // dry-run check to see if any of the options have already been registered\n const maybeSomeExtensions = adapterOrExtension?.options.some(\n (s: any) => {\n return s.isExtension && getExtensionFromGql(s.extensionId);\n }\n );\n\n // this means an adapter or extension has already been\n // added from the options\n if (maybeSomeAdapters || maybeSomeExtensions) {\n let shouldSkip = false;\n\n adapterOrExtension?.options?.forEach((option: any) => {\n if (shouldSkip) {\n return;\n }\n\n if (option?.isExtension) {\n const gqlExtension = getExtensionFromGql(option.extensionId);\n\n if (gqlExtension) {\n registeredList.push({\n ...gqlExtension,\n ...option,\n name: option.name as DaoAdapterConstants,\n description: option.description,\n } as AdaptersAndExtensionsType);\n\n shouldSkip = true;\n return;\n } else {\n unRegisteredList.push({\n ...option,\n name: option.name as DaoAdapterConstants,\n description: option.description,\n } as AdaptersAndExtensionsType);\n }\n } else {\n const gqlAdapter = getAdapterFromGql(option.adapterId);\n if (gqlAdapter) {\n registeredList.push({\n ...gqlAdapter,\n ...option,\n name: option.name as DaoAdapterConstants,\n description: option.description,\n } as AdaptersAndExtensionsType);\n\n shouldSkip = true;\n return;\n } else {\n unRegisteredList.push({\n ...option,\n name: option.name as DaoAdapterConstants,\n description: option.description,\n } as AdaptersAndExtensionsType);\n }\n }\n });\n } else {\n // just add the options as a nested object;\n // this will trigger the dropdown to display the options\n unRegisteredList.push(adapterOrExtension);\n }\n } else {\n // Add an adapter\n const gqlAdapter = getAdapterFromGql(adapterOrExtension.adapterId);\n\n if (gqlAdapter) {\n registeredList.push({\n ...gqlAdapter,\n ...adapterOrExtension,\n name: adapterOrExtension.name as DaoAdapterConstants,\n description: adapterOrExtension.description,\n } as AdaptersAndExtensionsType);\n } else {\n unRegisteredList.push({\n ...adapterOrExtension,\n name: adapterOrExtension.name as DaoAdapterConstants,\n description: adapterOrExtension.description,\n } as AdaptersAndExtensionsType);\n }\n }\n }\n );\n\n return {\n registeredList,\n unRegisteredList,\n };\n }\n\n /**\n * getAdapterOrExtensionFromRedux\n *\n * @param adapterOrExtensionName DaoAdapterConstants\n */\n function getAdapterOrExtensionFromRedux(\n adapterOrExtensionName: DaoAdapterConstants | DaoExtensionConstants\n ): Record {\n return Object.keys(adapterExtensionContracts)\n .map((ae) => adapterExtensionContracts[ae])\n .filter((ae) => ae) // filter out any `null` objects\n .filter((ae) => ae.adapterOrExtensionName === adapterOrExtensionName)[0];\n }\n\n return {\n adapterExtensionStatus,\n getAdapterOrExtensionFromRedux,\n registeredAdaptersOrExtensions,\n unRegisteredAdaptersOrExtensions,\n };\n}\n","import Web3 from 'web3';\n\nimport {FormFieldErrors} from '../../../util/enums';\nimport {useIsDefaultChain} from '../../web3/hooks';\n\ntype ValidationType =\n | 'address'\n | 'bytes32'\n | 'bytes32[]'\n | 'uint256'\n | 'uint256[]';\n\nexport type ParamInputType = string | string[] | number | number[];\n\nexport enum ParamType {\n ADDRESS = 'address',\n BYTES32 = 'bytes32',\n BYTES32_ARRAY = 'bytes32[]',\n UINT256 = 'uint256',\n UINT256_ARRAY = 'uint256[]',\n}\n\ntype UseValidationReturn = {\n isParamInputValid: (\n paramInput: ParamInputType,\n paramType: ValidationType\n ) => boolean;\n getFormFieldError: (paramType: ValidationType) => string | FormFieldErrors;\n formatInputByType: (inputValue: any, inputType: ParamType) => string;\n};\n\n/**\n * useValidation\n *\n * This hook validates the input values for the ABI parameters.\n *\n * @returns {UseValidationReturn}\n */\nexport function useValidation(): UseValidationReturn {\n /**\n * Hooks\n */\n const {defaultChain} = useIsDefaultChain();\n\n function isParamInputValid(\n paramInput: ParamInputType,\n paramType: ValidationType\n ): boolean {\n const parameter: string = paramInput.toString();\n\n const isValid: boolean =\n paramType === ParamType.ADDRESS\n ? isAddressValid(parameter)\n : paramType === ParamType.BYTES32\n ? isBytes32Valid(parameter)\n : paramType === ParamType.BYTES32_ARRAY\n ? isBytes32ArrayValid(parameter)\n : paramType === ParamType.UINT256\n ? isUint256Valid(parameter)\n : paramType === ParamType.UINT256_ARRAY\n ? isUint256ArrayValid(parameter)\n : true;\n\n return isValid;\n }\n\n function getFormFieldError(\n paramType: ValidationType\n ): string | FormFieldErrors {\n return paramType === ParamType.ADDRESS\n ? FormFieldErrors.INVALID_ETHEREUM_ADDRESS\n : paramType === ParamType.BYTES32\n ? FormFieldErrors.INVALID_BYTES32\n : paramType === ParamType.BYTES32_ARRAY\n ? FormFieldErrors.INVALID_BYTES32_ARRAY\n : paramType === ParamType.UINT256\n ? FormFieldErrors.INVALID_NUMBER\n : paramType === ParamType.UINT256_ARRAY\n ? FormFieldErrors.INVALID_NUMBER_ARRAY\n : FormFieldErrors.REQUIRED;\n }\n\n /**\n * isAddressValid()\n *\n * @returns boolean\n * @param parameter string\n */\n function isAddressValid(parameter: string): boolean {\n try {\n if (!parameter) return false;\n\n return (\n Web3.utils.checkAddressChecksum(parameter, defaultChain) ||\n Web3.utils.isAddress(parameter, defaultChain)\n );\n } catch (error) {\n return false;\n }\n }\n\n /**\n * isBytes32Valid()\n *\n * @returns boolean\n * @param parameter string\n */\n function isBytes32Valid(parameter: string): boolean {\n try {\n if (!parameter) return false;\n\n return parameter.length === 66 && Web3.utils.isHex(parameter);\n } catch (error) {\n return false;\n }\n }\n\n /**\n * isBytes32ArrayValid()\n *\n * @returns boolean\n * @param parameter string\n */\n function isBytes32ArrayValid(parameter: string): boolean {\n try {\n return Array.from(parameter.split(',')).every(\n (p) => p.length === 66 && Web3.utils.isHex(p)\n );\n } catch (error) {\n return false;\n }\n }\n\n /**\n * isUint256Valid\n *\n * @returns boolean\n * @param parameter string\n */\n function isUint256Valid(parameter: string): boolean {\n return !isNaN(Number(parameter));\n }\n\n /**\n * isUint256ArrayValid()\n *\n * @returns boolean\n * @param parameter string\n */\n function isUint256ArrayValid(parameter: string): boolean {\n return Array.from(parameter.split(',')).every((p) => Number(p));\n }\n\n function formatInputByType(inputValue: any, inputType: any) {\n const formatBytes32Array = (): string[] =>\n Array.from(inputValue.split(','));\n const formatUint256Array = (): number[] => {\n return Array.from(inputValue.split(',').map((i: string) => Number(i)));\n };\n\n return inputType === ParamType.BYTES32_ARRAY\n ? formatBytes32Array()\n : inputType === ParamType.UINT256_ARRAY\n ? formatUint256Array()\n : inputType === ParamType.UINT256\n ? Number(inputValue)\n : inputValue;\n }\n\n return {\n isParamInputValid,\n getFormFieldError,\n formatInputByType,\n };\n}\n","import React, {useState} from 'react';\n\nimport {DaoAdapterConstants, DaoExtensionConstants} from './enums';\n\ntype AdapterExtensionTarget =\n | DaoAdapterConstants\n | DaoExtensionConstants\n | null;\n\ntype AdapterExtensionSelectTargetRenderActionsArgs = {\n selectedTargetOption: AdapterExtensionTarget;\n selectedTargetOptionProps: any;\n};\n\ntype AdapterExtensionSelectTargetProps = {\n defaultTarget?: AdapterExtensionTarget;\n adapterOrExtension: Record;\n renderActions: (\n a: AdapterExtensionSelectTargetRenderActionsArgs\n ) => JSX.Element | null;\n renderCheckboxAction: (a: {\n selectedTargetOption: AdapterExtensionTarget;\n }) => JSX.Element | null;\n};\n\n/**\n * AdapterExtensionSelectTarget\n *\n * Displays a drop-down confirm list with options to\n * choose to from the defined list of options in `./config.ts`\n\n *\n * @param {AdapterExtensionSelectTargetProps} props\n * @returns {JSX.Element}\n */\nexport default function AdapterExtensionSelectTarget(\n props: AdapterExtensionSelectTargetProps\n) {\n const {\n adapterOrExtension,\n defaultTarget,\n renderActions,\n renderCheckboxAction,\n } = props;\n\n /**\n * State\n */\n\n const [selectedTargetOption, setSelectedTargetOption] =\n useState(defaultTarget || null);\n\n const [selectedTargetOptionProps, setSelectedTargetOptionProps] =\n useState({});\n\n /**\n * Functions\n */\n\n function handleSelectTargetChange(\n event: React.ChangeEvent\n ) {\n const {value} = event.target;\n\n setSelectedTargetOption(value as AdapterExtensionTarget);\n\n const selectedTargetProps: string = adapterOrExtension?.options.find(\n (selectedOption: any) => selectedOption.displayName === value\n );\n\n setSelectedTargetOptionProps(selectedTargetProps);\n }\n\n function renderDescription(\n selectedTargetOption: DaoAdapterConstants | DaoExtensionConstants | null\n ) {\n if (!selectedTargetOption) return null;\n\n try {\n const description: string =\n adapterOrExtension?.options.find(\n (selectedOption: any) =>\n selectedOption.displayName === selectedTargetOption\n ).description || '';\n\n return {description};\n } catch (error) {\n console.warn(error);\n }\n }\n\n return (\n <>\n
\n {/* CHECKBOX ACTIONS */}\n {renderCheckboxAction({selectedTargetOption})}\n\n
\n {/* ADAPTER/EXTENSION TARGET DEFAULT NAME */}\n \n {adapterOrExtension?.optionDefaultTarget}\n {adapterOrExtension?.isExtension && '(EXTENSION)'}\n \n\n {/* CHOOSE ADAPTER/EXTENSION TARGET */}\n \n\n {renderDescription(selectedTargetOption)}\n
\n
\n\n {/* BUTTON ACTIONS */}\n {renderActions({selectedTargetOption, selectedTargetOptionProps})}\n \n );\n}\n","import React from 'react';\n\nimport FadeIn from './FadeIn';\n\ntype InputErrorProps = {\n error: string;\n};\n\nexport default function InputError(\n props: InputErrorProps & React.HtmlHTMLAttributes\n) {\n const {error, ...restProps} = props;\n\n return (\n <>\n {error && (\n \n \n {error}\n

\n
\n )}\n \n );\n}\n","import {useState} from 'react';\nimport {useForm} from 'react-hook-form';\nimport {useSelector} from 'react-redux';\nimport {AbiItem} from 'web3-utils/types';\n\nimport {DaoAdapterConstants} from './enums';\nimport {AdaptersOrExtensions} from './types';\nimport {StoreState} from '../../store/types';\nimport {Web3TxStatus} from '../web3/types';\nimport {FormFieldErrors} from '../../util/enums';\nimport {getValidationError} from '../../util/helpers';\nimport {BURN_ADDRESS} from '../../util/constants';\nimport {useContractSend, useETHGasPrice, useWeb3Modal} from '../web3/hooks';\nimport {useAdaptersOrExtensions, useValidation} from './hooks';\nimport {ParamInputType, ParamType} from './hooks/useValidation';\n\nimport ErrorMessageWithDetails from '../common/ErrorMessageWithDetails';\nimport InputError from '../common/InputError';\nimport Loader from '../feedback/Loader';\n\ntype ConfigurationFormProps = {\n abiConfigurationInputs: Record | undefined;\n abiMethodName: string;\n adapterOrExtension: Pick | undefined;\n closeHandler?: () => void;\n};\n\ntype RemoveExtensionArgument = [\n //`extensionId`\n string\n];\n\ntype RemoveAdapterArguments = [\n // `adapterId`\n string,\n // set to `BURN_ADDRESS` zero address\n string,\n // acl set to `0` - no access/permissions\n number,\n // keys\n [],\n // values\n []\n];\n\nexport default function ConfigurationForm({\n abiConfigurationInputs,\n abiMethodName,\n adapterOrExtension,\n closeHandler,\n}: ConfigurationFormProps) {\n /**\n * Selectors\n */\n const {DaoRegistryContract} = useSelector(\n (state: StoreState) => state.contracts\n );\n\n /**\n * State\n */\n const [submitError, setSubmitError] = useState();\n const [configureAdapterStatus, setConfigureAdapterStatus] =\n useState(Web3TxStatus.STANDBY);\n const [removeStatus, setRemoveStatus] = useState(\n Web3TxStatus.STANDBY\n );\n\n /**\n * Hooks\n */\n const {\n txError,\n // txEtherscanURL,\n txIsPromptOpen,\n txSend,\n txStatus,\n } = useContractSend();\n const {fast: fastGasPrice} = useETHGasPrice();\n const {connected, account} = useWeb3Modal();\n const {isParamInputValid, getFormFieldError, formatInputByType} =\n useValidation();\n const {getAdapterOrExtensionFromRedux} = useAdaptersOrExtensions();\n\n /**\n * Their hooks\n */\n const form = useForm>({\n mode: 'onBlur',\n reValidateMode: 'onChange',\n });\n\n /**\n * Variables\n */\n const {errors, formState, getValues, setValue, register, trigger} = form;\n const configureAdapterError = submitError || txError;\n const isConnected = connected && account;\n const adapterOrExtensionText = adapterOrExtension?.isExtension\n ? 'extension'\n : 'adapter';\n\n /**\n * @note From the docs: \"Read the formState before render to subscribe the form state through Proxy\"\n * @see https://react-hook-form.com/api#formState\n */\n const {isValid} = formState;\n\n const isConfigureInProcess =\n (txStatus === Web3TxStatus.AWAITING_CONFIRM ||\n txStatus === Web3TxStatus.PENDING) &&\n (configureAdapterStatus === Web3TxStatus.AWAITING_CONFIRM ||\n configureAdapterStatus === Web3TxStatus.PENDING);\n const isRemoveInProcess =\n (txStatus === Web3TxStatus.AWAITING_CONFIRM ||\n txStatus === Web3TxStatus.PENDING) &&\n (removeStatus === Web3TxStatus.AWAITING_CONFIRM ||\n removeStatus === Web3TxStatus.PENDING);\n\n const isConfigureDone =\n txStatus === Web3TxStatus.FULFILLED &&\n configureAdapterStatus === Web3TxStatus.FULFILLED;\n const isRemoveDone =\n txStatus === Web3TxStatus.FULFILLED &&\n removeStatus === Web3TxStatus.FULFILLED;\n\n const isConfigureInProcessOrDone =\n (isConfigureInProcess || isConfigureDone) && txIsPromptOpen;\n const isRemoveInProcessOrDone =\n (isRemoveInProcess || isRemoveDone) && txIsPromptOpen;\n\n /**\n * handleRemove()\n */\n async function handleRemove(): Promise {\n if (!DaoRegistryContract) return;\n\n try {\n setRemoveStatus(Web3TxStatus.AWAITING_CONFIRM);\n\n const removeExtensionArgument: RemoveExtensionArgument = [\n adapterOrExtension?.extensionId,\n ];\n\n const removeAdapterArguments: RemoveAdapterArguments = [\n adapterOrExtension?.adapterId,\n BURN_ADDRESS,\n 0,\n [],\n [],\n ];\n\n const txArguments = {\n from: account || '',\n ...(fastGasPrice ? {gasPrice: fastGasPrice} : null),\n };\n\n // Execute contract call to `removeExtension` or `replaceAdapter`\n await txSend(\n adapterOrExtension?.isExtension ? 'removeExtension' : 'replaceAdapter',\n DaoRegistryContract.instance.methods,\n adapterOrExtension?.isExtension\n ? removeExtensionArgument\n : removeAdapterArguments,\n txArguments\n );\n\n setRemoveStatus(Web3TxStatus.FULFILLED);\n\n // Close modal\n closeHandler &&\n setTimeout(() => {\n closeHandler();\n // @todo Display closing modal message\n }, 3000);\n } catch (error) {\n setSubmitError(error);\n setRemoveStatus(Web3TxStatus.REJECTED);\n }\n }\n\n /**\n * handleSubmit()\n * @param values\n */\n async function handleSubmit(values: Record) {\n try {\n setConfigureAdapterStatus(Web3TxStatus.PENDING);\n\n const {\n contractAddress,\n instance: {methods},\n } = getAdapterOrExtensionFromRedux(\n adapterOrExtension?.name as DaoAdapterConstants\n );\n\n if (!isConnected) {\n throw new Error(\n 'No user account was found. Please make sure your wallet is connected.'\n );\n }\n\n if (!contractAddress) {\n throw new Error(`No ${adapterOrExtension?.name} contract found.`);\n }\n\n if (!account) {\n throw new Error('No account found.');\n }\n\n let adapterConfigArguments: Array = [];\n // construct method arguments\n abiConfigurationInputs?.forEach((abiInput: AbiItem) => {\n const inputValue = Object.entries(values).find(\n (v: any) => v[0] === abiInput.name\n );\n\n if (inputValue) {\n const formattedValue: ParamInputType = formatInputByType(\n inputValue[1] as ParamInputType,\n abiInput.type as ParamType\n );\n\n adapterConfigArguments.push(formattedValue);\n }\n });\n\n const txArguments = {\n from: account || '',\n ...(fastGasPrice ? {gasPrice: fastGasPrice} : null),\n };\n\n setConfigureAdapterStatus(Web3TxStatus.AWAITING_CONFIRM);\n\n // Execute contract call\n await txSend(abiMethodName, methods, adapterConfigArguments, txArguments);\n\n setConfigureAdapterStatus(Web3TxStatus.FULFILLED);\n } catch (error) {\n // Set any errors from Web3 utils or explicitly set above.\n setSubmitError(error);\n setConfigureAdapterStatus(Web3TxStatus.REJECTED);\n }\n }\n\n return (\n
e.preventDefault()}>\n {/* INPUT PARAMETERS */}\n {abiConfigurationInputs &&\n abiConfigurationInputs.map((input: Record) => (\n
\n \n
\n \n setValue(input.name[0], getValues()[input.name])\n }\n ref={register({\n validate: (value: string): string | boolean => {\n return value === ''\n ? FormFieldErrors.REQUIRED\n : isParamInputValid(value, input.type)\n ? true\n : getFormFieldError(input.type);\n },\n })}\n disabled={isConfigureInProcessOrDone}\n />\n\n \n
\n
\n ))}\n\n {/* SUBMIT */}\n {\n if (isConfigureInProcessOrDone) return;\n\n if (!isValid) {\n trigger();\n return;\n }\n\n handleSubmit(getValues());\n }}\n type=\"submit\">\n {isConfigureInProcess ? (\n \n ) : isConfigureDone ? (\n 'Done'\n ) : (\n 'Submit'\n )}\n \n\n {/* SUBMIT ERROR */}\n {configureAdapterError && (\n
\n \n
\n )}\n\n {/** REMOVE EXTENSION BUTTON - @todo only show if DAO isn't finalized */}\n
\n

\n Delete this {adapterOrExtensionText}. Once you delete this{' '}\n {adapterOrExtensionText}, it can be re-added if the DAO isn't\n finalized.\n

\n (isRemoveDone ? {} : handleRemove())}>\n {isRemoveInProcess ? : isRemoveDone ? 'Done' : 'Remove'}\n \n
\n \n );\n}\n","import {AdaptersOrExtensions} from './types';\nimport ConfigurationForm from './ConfigurationForm';\nimport Modal from '../common/Modal';\n\nimport TimesSVG from '../../assets/svg/TimesSVG';\n\ntype ConfigurationModalProps = {\n abiMethodName: string;\n adapterOrExtension: AdaptersOrExtensions | undefined;\n configurationInputs: Record | undefined;\n isOpen: boolean;\n closeHandler: () => void;\n};\n\nexport default function ConfigurationModal({\n abiMethodName,\n adapterOrExtension,\n configurationInputs,\n isOpen,\n closeHandler,\n}: ConfigurationModalProps) {\n return (\n {\n closeHandler();\n }}>\n {/* MODEL CLOSE BUTTON */}\n <>\n {\n closeHandler();\n }}>\n \n \n\n

{adapterOrExtension?.name.toUpperCase()}

\n

{adapterOrExtension?.description}

\n\n \n \n \n );\n}\n","import React, {Fragment} from 'react';\n\ninterface IProps {\n checked: boolean;\n id: string;\n label: string;\n name: string;\n onChange: (event: React.ChangeEvent) => void;\n}\n\ntype OtherProps = {[key: string]: any; size?: CheckboxSize};\n\nexport enum CheckboxSize {\n LARGE = 'large',\n SMALL = 'small',\n}\n\nexport default function Checkbox({size, ...props}: IProps & OtherProps) {\n return (\n \n \n\n \n \n );\n}\n","import {useState} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {StoreState} from '../../store/types';\nimport {Web3TxStatus} from '../web3/types';\nimport {useContractSend, useETHGasPrice, useWeb3Modal} from '../web3/hooks';\nimport {useDao} from '../../hooks';\nimport {truncateEthAddress} from '../../util/helpers';\nimport {TX_CYCLE_MESSAGES} from '../web3/config';\n\nimport {CycleEllipsis} from '../feedback';\nimport Modal from '../common/Modal';\nimport Loader from '../feedback/Loader';\nimport TimesSVG from '../../assets/svg/TimesSVG';\nimport CycleMessage from '../feedback/CycleMessage';\nimport EtherscanURL from '../web3/EtherscanURL';\nimport ErrorMessageWithDetails from '../common/ErrorMessageWithDetails';\nimport FadeIn from '../common/FadeIn';\n\ntype FinalizeModalProps = {\n isOpen: boolean;\n closeHandler: () => void;\n};\n\nexport default function FinalizeModal({\n isOpen,\n closeHandler,\n}: FinalizeModalProps) {\n /**\n * State\n */\n const [submitError, setSubmitError] = useState();\n\n /**\n * Selectors\n */\n const {DaoRegistryContract} = useSelector(\n (state: StoreState) => state.contracts\n );\n\n /**\n * Hooks\n */\n const {txError, txEtherscanURL, txIsPromptOpen, txSend, txStatus} =\n useContractSend();\n const {fast: fastGasPrice} = useETHGasPrice();\n const {dao} = useDao();\n const {connected, account} = useWeb3Modal();\n\n /**\n * Variables\n */\n const TIMEOUT_INTERVAL = 3000;\n const isConnected = connected && account;\n const isInProcess =\n txStatus === Web3TxStatus.AWAITING_CONFIRM ||\n txStatus === Web3TxStatus.PENDING;\n const isDone = txStatus === Web3TxStatus.FULFILLED;\n const isInProcessOrDone = isInProcess || isDone || txIsPromptOpen;\n const finalizeError = submitError || txError;\n\n function renderSubmitStatus(): React.ReactNode {\n // Only for chain tx\n switch (txStatus) {\n case Web3TxStatus.AWAITING_CONFIRM:\n return (\n <>\n Awaiting your confirmation\n \n \n );\n case Web3TxStatus.PENDING:\n return (\n <>\n {\n return {message};\n }}\n />\n\n \n \n );\n case Web3TxStatus.FULFILLED:\n return (\n <>\n
{'Finalized!'}
\n\n \n \n );\n default:\n return null;\n }\n }\n\n function configureExtensions() {\n // @todo if any adapters have the `setAclToExtensionForAdapter` flag set we need to call\n // `configureExtension(\n // DaoRegistry dao,\n // address extension,\n // Adapter[] calldata adapters\n // )` to set the permission for those adapters for the bank before finalizing the DAO\n /**\n * STEPS\n * - get all added adapters from the subgraph\n * - check the `setAclToExtensionForAdapter` flag against the added adpaters\n * - set the permission for any adapters that are required\n */\n }\n\n async function finalizeDao(): Promise {\n try {\n if (!isConnected) {\n throw new Error(\n 'No user account was found. Please make sure your wallet is connected.'\n );\n }\n\n if (!DaoRegistryContract) {\n throw new Error('No DAO Registry contract was found.');\n }\n\n // @todo set permissions for adapters\n configureExtensions();\n\n const txArguments = {\n from: account || '',\n ...(fastGasPrice ? {gasPrice: fastGasPrice} : null),\n };\n\n // Execute contract call for `finalizeDao`\n await txSend(\n 'finalizeDao',\n DaoRegistryContract.instance.methods,\n [],\n txArguments\n );\n\n // Close modal\n closeHandler &&\n setTimeout(() => {\n closeHandler();\n }, TIMEOUT_INTERVAL);\n } catch (error) {\n setSubmitError(error);\n }\n }\n\n return (\n {\n closeHandler();\n }}>\n {/* MODEL CLOSE BUTTON */}\n <>\n {\n closeHandler();\n }}>\n \n \n\n

Finalize

\n

\n {dao && dao.name}{' '}\n {dao && truncateEthAddress(dao.daoAddress, 7)}\n

\n

\n After your DAO is finalized you will need to submit a proposal to make\n changes.\n

\n\n {/* SUBMIT */}\n {\n if (isInProcessOrDone) return;\n\n finalizeDao();\n }}\n type=\"submit\">\n {isInProcess ? : isDone ? 'Done' : 'Submit'}\n \n\n {/* SUBMIT STATUS */}\n\n {isInProcessOrDone && (\n
\n {renderSubmitStatus()}\n
\n )}\n\n {/* SUBMIT ERROR */}\n {finalizeError && (\n
\n \n
\n )}\n \n \n );\n}\n","import {useCallback, useEffect, useState} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {StoreState} from '../../store/types';\nimport {AsyncStatus} from '../../util/types';\nimport {\n AddAdapterArguments,\n AddAdaptersArguments,\n AddExtensionArguments,\n AdaptersOrExtensions,\n} from './types';\n\nimport {DaoAdapterConstants, DaoExtensionConstants} from './enums';\n\nimport {\n defaultAdaptersAndExtensions,\n AdaptersAndExtensionsType,\n} from './config';\n\nimport {getAdapterOrExtensionId, getAccessControlLayer} from './helpers';\nimport {getDaoState, DaoState} from '../web3/helpers';\nimport {truncateEthAddress} from '../../util/helpers';\n\nimport {\n useAdaptersOrExtensions,\n useInitAdapterExtensionContracts,\n} from './hooks';\nimport {useDao, useMemberActionDisabled} from '../../hooks';\nimport {\n useContractSend,\n useETHGasPrice,\n useWeb3Modal,\n useIsDefaultChain,\n} from '../web3/hooks';\n\nimport AdapterExtensionSelectTarget from './AdapterOrExtensionSelectTarget';\nimport ConfigurationModal from './ConfigurationModal';\nimport Checkbox, {CheckboxSize} from '../common/Checkbox';\nimport ErrorMessageWithDetails from '../common/ErrorMessageWithDetails';\nimport FadeIn from '../common/FadeIn';\nimport FinalizeModal from './FinalizeModal';\nimport Loader from '../feedback/Loader';\nimport Wrap from '../common/Wrap';\n\nenum WhyDisableModalTitles {\n FINALIZED_REASON = 'Why is finalizing disabled?',\n CONFIGURATION_REASON = 'Why are configurations disabled?',\n}\n/**\n * AdapterOrExtensionManager()\n *\n * This components lists all the registered and unregistered adapters/extensions\n * from the list of available adapters in the `defaultAdaptersAndExtensions` in `./config.ts`\n *\n * It allows for adding unreigsterd adapters and extensions, configurating\n * registered adapters and extensions, and finalizing the DAO.\n *\n * @note it is not possible to manage the adapters/extensions if the DAO is finalized.\n */\nexport default function AdapterOrExtensionManager() {\n /**\n * Selectors\n */\n const {DaoRegistryContract, DaoFactoryContract} = useSelector(\n (s: StoreState) => s.contracts\n );\n const isActiveMember = useSelector(\n (s: StoreState) => s.connectedMember?.isActiveMember\n );\n\n /**\n * States\n */\n const [abiMethodName, setABIMethodName] = useState('');\n const [daoState, setDaoState] = useState();\n const [isDone, setIsDone] = useState | undefined>();\n const [inputParameters, setInputParameters] = useState>();\n const [submitError, setSubmitError] = useState();\n const [openConfigureModal, setOpenConfigureModal] = useState(false);\n const [openFinalizeModal, setOpenFinalizeModal] = useState(false);\n const [selectAll, setSelectAll] = useState(false);\n const [selectionCount, setSelectionCount] = useState(0);\n const [selections, setSelections] = useState<\n Record | undefined\n >();\n const [configureAdapterOrExtension, setConfigureAdapterOrExtension] =\n useState();\n const [isInProcess, setIsInProcess] = useState<\n Record | undefined\n >();\n const [whyDisabledReason, setWhyDisabledReason] = useState<\n WhyDisableModalTitles | undefined\n >();\n\n /**\n * Hooks\n */\n const {defaultChainError} = useIsDefaultChain();\n const {connected, account, web3Instance} = useWeb3Modal();\n const {dao, gqlError} = useDao();\n const {\n adapterExtensionStatus,\n getAdapterOrExtensionFromRedux,\n registeredAdaptersOrExtensions,\n unRegisteredAdaptersOrExtensions,\n } = useAdaptersOrExtensions();\n const {initAdapterExtensionContract} = useInitAdapterExtensionContracts();\n\n const {txSend} = useContractSend();\n const {fast: fastGasPrice} = useETHGasPrice();\n const {\n isDisabled,\n openWhyDisabledModal,\n setOtherDisabledReasons,\n WhyDisabledModal,\n } = useMemberActionDisabled();\n\n /**\n * Variables\n */\n const isConnected = connected && account;\n const isDAOExisting: Record | undefined = dao;\n const isDAOReady: boolean = daoState === DaoState.READY;\n const isUnavailable: boolean =\n adapterExtensionStatus === AsyncStatus.REJECTED &&\n registeredAdaptersOrExtensions === undefined &&\n unRegisteredAdaptersOrExtensions === undefined;\n const isLoading: boolean = adapterExtensionStatus === AsyncStatus.PENDING;\n const nothingToAdd = unRegisteredAdaptersOrExtensions?.length === 0;\n // @todo track the prior selection of a dropdown target\n // let priorSelectedTargetOption: DaoAdapterConstants | null = null;\n\n /**\n * Cached callbacks\n */\n const checkDaoStateCached = useCallback(checkDaoState, [\n DaoRegistryContract,\n dao?.name,\n setOtherDisabledReasons,\n ]);\n\n /**\n * Effects\n */\n // Check the Dao state\n useEffect(() => {\n checkDaoStateCached();\n }, [checkDaoStateCached, DaoRegistryContract]);\n\n useEffect(() => {\n // Set the select all check to false by default\n setSelectAll(false);\n\n if (!unRegisteredAdaptersOrExtensions) return;\n\n /**\n * @note Select all functionality is for adding adapters only.\n * Extensions must be added separately.\n *\n * Sets the initial checkbox selections for non-registered adapters to `false`\n * and sets the `Select All` checkbox to disabled if no adapters are available\n */\n unRegisteredAdaptersOrExtensions &&\n unRegisteredAdaptersOrExtensions?.forEach(\n (adapterOrExtension: Record) => {\n // only add a selection if it doesn't have nested `options`\n // and if it's not an extension\n !adapterOrExtension?.options &&\n !adapterOrExtension.isExtension &&\n setSelections((prevState: Record | undefined) => ({\n ...prevState,\n [adapterOrExtension.name]: false,\n }));\n }\n );\n }, [isDisabled, unRegisteredAdaptersOrExtensions]);\n\n // Updates checkbox selection counter when user selects a checkbox\n useEffect(() => {\n selections &&\n setSelectionCount(\n Object.values(selections).filter((adapter: boolean) => adapter === true)\n .length\n );\n }, [selections]);\n\n /**\n * Functions\n */\n async function checkDaoState() {\n if (!DaoRegistryContract) {\n return;\n }\n\n try {\n const finalizedMessage = `${dao?.name} is already finalized`;\n\n const daoRegistryState = await getDaoState(DaoRegistryContract.instance);\n setDaoState(daoRegistryState);\n\n daoRegistryState === DaoState.READY &&\n setOtherDisabledReasons([finalizedMessage]);\n } catch (error) {\n setDaoState(undefined);\n }\n }\n\n /**\n * handleAddAdapter\n *\n * Handles adding an `adapter`\n *\n * @param adapter\n */\n function handleAddAdapter(adapter: Record): void {\n const adapterOrExtensionAddress = new Promise((resolve, reject) => {\n try {\n // Get contract address\n const {contractAddress} = getAdapterOrExtensionFromRedux(\n adapter.name as DaoAdapterConstants\n );\n\n resolve(contractAddress);\n } catch (error) {\n // try and get the default contract address from the arg `adapter`\n const contractAddress = adapter.contractAddress;\n\n if (contractAddress) {\n resolve(contractAddress);\n } else {\n reject(error);\n }\n }\n });\n\n adapterOrExtensionAddress\n .then((contractAddress: string) => {\n addAdapterOrExtension(contractAddress, adapter.name, 'ADAPTER');\n })\n .catch((error) => {\n console.warn(\n `Dao adapter contract not found, try adding the default \"${adapter.name}\" contract`\n );\n });\n }\n\n /**\n * handleAddExtension\n *\n * Handle adding an `extension`\n * @param extension\n */\n function handleAddExtension(extension: any): void {\n const adapterOrExtensionAddress = new Promise((resolve, reject) => {\n try {\n // Get contract address\n const {contractAddress} = getAdapterOrExtensionFromRedux(\n extension.name as DaoExtensionConstants\n );\n\n resolve(contractAddress);\n } catch (error) {\n // try and get the default contract address\n // from the arg `adapter` or `extension`\n const contractAddress = extension.contractAddress;\n\n if (contractAddress) {\n resolve(contractAddress);\n } else {\n reject(error);\n }\n }\n });\n\n adapterOrExtensionAddress\n .then((contractAddress: string) => {\n addAdapterOrExtension(contractAddress, extension.name, 'EXTENSION');\n })\n .catch((error) => {\n console.warn(\n `Dao extension contract not found, try adding the default \"${extension.name}\" contract`,\n error\n );\n });\n }\n\n async function addAdapterOrExtension(\n adapterOrExtensionAddress: string,\n adapterOrExtensionName: DaoAdapterConstants | DaoExtensionConstants,\n adapterOrExtensionType: 'ADAPTER' | 'EXTENSION'\n ): Promise {\n setSubmitError(undefined);\n\n if (!DaoRegistryContract) {\n throw new Error('No DAO Registry contract was found.');\n }\n\n if (!web3Instance) {\n throw new Error('No Web3 instance was found.');\n }\n\n try {\n setIsInProcess((prevState) => ({\n ...prevState,\n [adapterOrExtensionName]: true,\n }));\n\n if (!adapterOrExtensionAddress) {\n throw new Error(`${adapterOrExtensionType} address must not be empty`);\n }\n\n // 1. Get the bytes32 hash of the adapter name\n const adapterOrExtensionId = getAdapterOrExtensionId(\n adapterOrExtensionName\n );\n\n // 2. Get adapters access control layer (acl)\n // these are the functions the adapter will have access to\n const {acl} = getAccessControlLayer(adapterOrExtensionName);\n\n // 3. Contract the function arguments base of its type\n const addAdapterOrExtensionArguments:\n | AddAdapterArguments\n | AddExtensionArguments =\n adapterOrExtensionType === 'ADAPTER'\n ? ([\n adapterOrExtensionId,\n adapterOrExtensionAddress,\n acl,\n [],\n [],\n ] as AddAdapterArguments)\n : ([\n adapterOrExtensionId,\n adapterOrExtensionAddress,\n account,\n ] as AddExtensionArguments);\n\n const txArguments = {\n from: account || '',\n ...(fastGasPrice ? {gasPrice: fastGasPrice} : null),\n };\n\n const txSendMethod =\n adapterOrExtensionType === 'ADAPTER'\n ? 'replaceAdapter'\n : 'addExtension';\n\n // Execute contract call for `addAdapter` or `addExtension`\n await txSend(\n txSendMethod,\n DaoRegistryContract.instance.methods,\n addAdapterOrExtensionArguments,\n txArguments\n );\n\n setIsInProcess((prevState) => ({\n ...prevState,\n [adapterOrExtensionName]: false,\n }));\n setIsDone((prevState) => ({\n ...prevState,\n [adapterOrExtensionName]: true,\n }));\n\n // init adapter/extension contracts\n initAdapterExtensionContract(adapterOrExtensionName, web3Instance);\n } catch (error) {\n setIsInProcess((prevState) => ({\n ...prevState,\n [adapterOrExtensionName]: false,\n }));\n\n const errorMessage = new Error(\n error && error?.code === 4001\n ? error.message\n : `Unable to add ${adapterOrExtensionName} ${adapterOrExtensionType}; ${error}`\n );\n setSubmitError(errorMessage);\n }\n }\n\n /**\n * handleAddSelectedAdapters()\n *\n * This function only adds adapters, not extensions\n */\n async function handleAddSelectedAdapters(): Promise {\n setSubmitError(undefined);\n\n if (!DaoFactoryContract) {\n throw new Error('DaoFactoryContract not found');\n }\n\n if (!web3Instance) {\n throw new Error('No Web3 instance was found.');\n }\n\n try {\n let adaptersArguments: AddAdaptersArguments[] = [];\n\n // Set the `Add` button states to true for all selected adapters\n for (const adapterName in selections) {\n if (selections[adapterName]) {\n // Get adapterOrExtensionId from `defaultAdaptersAndExtensions`\n const {adapterId, contractAddress}: AdaptersAndExtensionsType =\n defaultAdaptersAndExtensions.filter(\n (a: AdaptersAndExtensionsType) => a.name === adapterName\n )[0];\n\n let adapterContractAddress = contractAddress;\n\n if (!adapterContractAddress) {\n // Get adapter contract address from redux\n let contractAddressFromRedux = getAdapterOrExtensionFromRedux(\n adapterName as DaoAdapterConstants\n );\n\n adapterContractAddress = contractAddressFromRedux?.contractAddress;\n }\n\n // Get adapters access control layer (acl)\n // these are the functions the adapter will have access to\n const {acl} = getAccessControlLayer(adapterName);\n\n // skip if `adapterId` or `adapterContractAddress` are undefined\n if (adapterId && adapterContractAddress) {\n adaptersArguments.push([\n adapterId,\n adapterContractAddress,\n acl,\n ] as AddAdaptersArguments);\n\n setIsInProcess((prevState) => ({\n ...prevState,\n [adapterName]: true,\n }));\n }\n }\n }\n\n const addAdaptersArguments: [string, AddAdaptersArguments[]] = [\n dao?.daoAddress,\n adaptersArguments,\n ];\n\n const txArguments = {\n from: account || '',\n ...(fastGasPrice ? {gasPrice: fastGasPrice} : null),\n };\n\n // Execute contract call for `addAdapters`\n await txSend(\n 'addAdapters',\n DaoFactoryContract.instance.methods,\n addAdaptersArguments,\n txArguments\n );\n\n // init adapter contracts to the store for all added adapters\n for (const adapterName in selections) {\n if (selections[adapterName]) {\n adapterName &&\n initAdapterExtensionContract(\n adapterName as DaoAdapterConstants,\n web3Instance\n );\n }\n }\n } catch (error) {\n const errorMessage = new Error(\n error && error?.code === 4001\n ? error.message\n : `Unable to add adapters; ${error}`\n );\n setSubmitError(errorMessage);\n\n // reset all the checkboxes for the selected adapters\n checkboxesSelection(false);\n // reset all the buttons for the selected adapters\n for (const adapterName in selections) {\n setIsInProcess((prevState) => ({\n ...prevState,\n [adapterName]: false,\n }));\n }\n }\n }\n\n /**\n * configureAdapter\n *\n * @param adapter\n */\n async function handleConfigure(\n adapterOrExtension: AdaptersOrExtensions\n ): Promise {\n setSubmitError(undefined);\n\n try {\n const {abiFunctionName, name} = adapterOrExtension;\n\n if (!abiFunctionName) {\n throw new Error(`ABI function not found for ${name}`);\n }\n\n // Get adapters/extension ABI\n const {abi} = getAdapterOrExtensionFromRedux(name);\n // Get adapters/extension configure function input parameters\n const {inputs} = abi.filter(\n (p: Record) => p.name === abiFunctionName\n )[0];\n\n setABIMethodName(abiFunctionName);\n setConfigureAdapterOrExtension(adapterOrExtension);\n setInputParameters(inputs);\n setOpenConfigureModal(true);\n } catch (error) {\n const errorMessage = new Error(\n error && error?.code === 4001\n ? error.message\n : `${adapterOrExtension.name} contract not found`\n );\n setSubmitError(errorMessage);\n }\n }\n\n // Handles the select all checkbox event\n function handleOnChange(event: React.ChangeEvent): void {\n checkboxesSelection(event.target.checked);\n }\n\n function checkboxesSelection(checked: boolean): void {\n // Update the select all checkbox\n setSelectAll(checked);\n\n // Update all un-registered adapters only\n for (const key in selections) {\n setSelections((s) => ({\n ...s,\n [key]: checked,\n }));\n }\n }\n\n function handleSelectTargetChange({event, selectedTargetOption}: any): void {\n // @todo Remove previously selected target if its from an `options` list\n // update the prior selected target to track the change\n // so we can remove the old target from checkbox `selections`\n\n setSelections((s) => ({\n ...s,\n [selectedTargetOption]: event.target.checked,\n }));\n }\n\n function renderDaoName() {\n if (!dao && gqlError) {\n window.scrollTo({\n top: 0,\n left: 200,\n behavior: 'smooth',\n });\n\n return (\n \n );\n }\n\n if (dao) {\n return (\n

\n {dao.name} {truncateEthAddress(dao.daoAddress, 7)}\n

\n );\n }\n }\n\n function renderErrorMessage() {\n if (submitError) {\n window.scrollTo({\n top: 0,\n left: 200,\n behavior: 'smooth',\n });\n\n return (\n \n );\n } else {\n return <>;\n }\n }\n\n function getUnauthorizedMessage() {\n // user is not connected\n if (!isConnected) {\n return 'Connect your wallet to manage the DAO adapters and extensions.';\n }\n\n // user is on wrong network\n if (defaultChainError) {\n return defaultChainError.message;\n }\n\n // user is not an active member\n if (!isActiveMember) {\n return 'Either you are not a member, or your membership is not active.';\n }\n }\n\n /**\n * Render\n */\n\n // Render unauthorized message\n if (!isConnected || !isActiveMember || defaultChainError) {\n return (\n \n
\n

{getUnauthorizedMessage()}

\n
\n
\n );\n }\n\n /* @todo\n * disable when selection is processing\n * disable when there are no more unused adapters to select\n */\n return (\n \n
\n {renderDaoName()}\n {renderErrorMessage()}\n

\n Nulla aliquet porttitor venenatis. Donec a dui et dui fringilla\n consectetur id nec massa. Aliquam erat volutpat. Sed ut dui ut lacus\n dictum fermentum vel tincidunt neque. Sed sed lacinia...\n

\n
\n
\n \n
\n
\n \n Add selected\n \n
\n
\n\n {isLoading && (\n
\n \n
\n )}\n {isUnavailable &&

No adapters/extensions available

}\n\n {/** UNUSED ADAPTERS AND EXTENSIONS TO ADD */}\n {isDAOExisting &&\n unRegisteredAdaptersOrExtensions &&\n unRegisteredAdaptersOrExtensions?.length > 0 &&\n unRegisteredAdaptersOrExtensions.map(\n (adapterOrExtension: Record, idx: number) => (\n
\n {/** RENDER ADAPTER/EXTENSION DROPDOWN */}\n {adapterOrExtension?.options ? (\n {\n return (\n <>\n
\n {\n selectedTargetOption &&\n handleSelectTargetChange({\n event,\n selectedTargetOption,\n });\n }}\n />\n
\n \n );\n }}\n renderActions={({\n selectedTargetOption,\n selectedTargetOptionProps,\n }) => {\n return (\n <>\n
\n \n selectedTargetOptionProps?.isExtension\n ? handleAddExtension(\n selectedTargetOptionProps\n )\n : handleAddAdapter(selectedTargetOptionProps)\n }>\n {isInProcess &&\n isInProcess[selectedTargetOptionProps.name] ? (\n \n ) : isDone &&\n isDone[selectedTargetOptionProps.name] ? (\n 'Done'\n ) : (\n 'Add'\n )}\n \n
\n \n );\n }}\n />\n ) : (\n <>\n {/** RENDER ADAPTER/EXTENSION */}\n
\n
\n {!adapterOrExtension?.isExtension && (\n {\n setSelections((s) => ({\n ...s,\n [adapterOrExtension.name]: event.target.checked,\n }));\n }}\n />\n )}\n
\n\n
\n \n {adapterOrExtension.name}{' '}\n {adapterOrExtension?.isExtension && '(EXTENSION)'}\n \n \n {adapterOrExtension.description}\n \n
\n
\n\n
\n \n adapterOrExtension?.isExtension\n ? handleAddExtension(adapterOrExtension)\n : handleAddAdapter(adapterOrExtension)\n }>\n {isInProcess && isInProcess[adapterOrExtension.name] ? (\n \n ) : isDone && isDone[adapterOrExtension.name] ? (\n 'Done'\n ) : (\n 'Add'\n )}\n \n
\n \n )}\n
\n )\n )}\n\n {/** USED ADAPTERS/EXTENSIONS TO CONFIGURE OR REMOVE */}\n {isDAOExisting &&\n registeredAdaptersOrExtensions &&\n registeredAdaptersOrExtensions?.length > 0 &&\n registeredAdaptersOrExtensions.map(\n (adapterOrExtension: Record, idx: number) => (\n \n
\n \n {adapterOrExtension.name}{' '}\n {adapterOrExtension?.isExtension && '(EXTENSION)'}\n \n \n {adapterOrExtension.description}\n \n
\n\n
\n \n handleConfigure(\n adapterOrExtension as AdaptersOrExtensions\n )\n }>\n Configure\n \n
\n
\n )\n )}\n\n {isDisabled && (\n
\n {\n openWhyDisabledModal();\n setWhyDisabledReason(\n WhyDisableModalTitles.CONFIGURATION_REASON\n );\n }}>\n {WhyDisableModalTitles.CONFIGURATION_REASON}\n \n
\n )}\n\n
\n

\n If you're happy with your setup, you can finalize your DAO. After\n your DAO is finalized you will need to submit a proposal to make\n changes.\n

\n
\n setOpenFinalizeModal(true)}>\n Finalize Dao\n \n
\n\n {isDisabled && (\n
\n {\n openWhyDisabledModal();\n\n setWhyDisabledReason(WhyDisableModalTitles.FINALIZED_REASON);\n }}>\n {WhyDisableModalTitles.FINALIZED_REASON}\n \n
\n )}\n\n \n
\n\n {openConfigureModal && (\n {\n setOpenConfigureModal(false);\n }}\n />\n )}\n\n {openFinalizeModal && (\n {\n setOpenFinalizeModal(false);\n\n // check the state of the dao\n checkDaoStateCached();\n }}\n />\n )}\n \n
\n );\n}\n\nfunction RenderWrapper(props: React.PropsWithChildren): JSX.Element {\n /**\n * Render\n */\n\n return (\n \n \n
\n

Adapter/Extension Manager

\n
\n\n {/* RENDER CHILDREN */}\n {props.children}\n
\n
\n );\n}\n","import React, {ReactNode} from 'react';\n\ninterface WrapProps {\n children: ReactNode;\n className?: string;\n}\n\nconst Wrap = ({\n children,\n ...rest\n}: WrapProps & React.HTMLAttributes) => (\n
\n {children}\n
\n);\n\nexport default Wrap;\n","import {useDispatch} from 'react-redux';\nimport Web3 from 'web3';\n\nimport {\n initContractBankAdapter,\n initContractConfiguration,\n initContractCouponOnboarding,\n initContractDaoRegistryAdapter,\n initContractDistribute,\n initContractERC20Extension,\n initContractFinancing,\n initContractGuildKick,\n initContractManaging,\n initContractNFTAdapter,\n initContractNFTExtension,\n initContractOnboarding,\n initContractRagequit,\n initContractTribute,\n initContractTributeNFT,\n initRegisteredVotingAdapter,\n} from '../../../store/actions';\n\nimport {DaoAdapterConstants, DaoExtensionConstants} from '../enums';\nimport {ReduxDispatch} from '../../../store/types';\n\ntype UseInitAdapterExtensionContractsReturn = {\n initAdapterExtensionContract: (\n adapterExtensionName: DaoAdapterConstants | DaoExtensionConstants,\n web3Instance: Web3\n ) => void;\n};\n\nexport function useInitAdapterExtensionContracts(): UseInitAdapterExtensionContractsReturn {\n /**\n * Their hooks\n */\n\n const dispatch = useDispatch();\n\n /**\n * Functions\n */\n\n async function initAdapterExtensionContract(\n adapterExtensionName: DaoAdapterConstants | DaoExtensionConstants,\n web3Instance: Web3\n ) {\n switch (adapterExtensionName) {\n case DaoAdapterConstants.CONFIGURATION:\n await dispatch(initContractConfiguration(web3Instance));\n break;\n case DaoAdapterConstants.FINANCING:\n await dispatch(initContractFinancing(web3Instance));\n break;\n case DaoAdapterConstants.GUILDKICK:\n await dispatch(initContractGuildKick(web3Instance));\n break;\n case DaoAdapterConstants.MANAGING:\n await dispatch(initContractManaging(web3Instance));\n break;\n case DaoAdapterConstants.RAGEQUIT:\n await dispatch(initContractRagequit(web3Instance));\n break;\n case DaoAdapterConstants.BANK:\n await dispatch(initContractBankAdapter(web3Instance));\n break;\n case DaoExtensionConstants.NFT:\n await dispatch(initContractNFTExtension(web3Instance));\n break;\n case DaoAdapterConstants.ONBOARDING:\n await dispatch(initContractOnboarding(web3Instance));\n break;\n case DaoAdapterConstants.TRIBUTE:\n await dispatch(initContractTribute(web3Instance));\n break;\n case DaoAdapterConstants.DISTRIBUTE:\n await dispatch(initContractDistribute(web3Instance));\n break;\n case DaoAdapterConstants.VOTING:\n await dispatch(initRegisteredVotingAdapter(web3Instance));\n break;\n case DaoAdapterConstants.COUPON_ONBOARDING:\n await dispatch(initContractCouponOnboarding(web3Instance));\n break;\n case DaoAdapterConstants.TRIBUTE_NFT:\n await dispatch(initContractTributeNFT(web3Instance));\n break;\n case DaoAdapterConstants.NFT:\n await dispatch(initContractNFTAdapter(web3Instance));\n break;\n case DaoAdapterConstants.DAO_REGISTRY:\n await dispatch(initContractDaoRegistryAdapter(web3Instance));\n break;\n case DaoExtensionConstants.ERC20:\n await dispatch(initContractERC20Extension(web3Instance));\n break;\n }\n }\n\n return {\n initAdapterExtensionContract,\n };\n}\n","import React, {useState} from 'react';\nimport {useForm} from 'react-hook-form';\nimport {useHistory} from 'react-router';\nimport {useSelector} from 'react-redux';\nimport {SnapshotType} from '@openlaw/snapshot-js-erc712';\n\nimport {CycleEllipsis} from '../../components/feedback';\nimport {FormFieldErrors} from '../../util/enums';\nimport {getValidationError} from '../../util/helpers';\nimport {SnapshotMetadataType} from '../../components/proposals/types';\nimport {StoreState} from '../../store/types';\nimport {useSignAndSubmitProposal} from '../../components/proposals/hooks';\nimport {useWeb3Modal, useIsDefaultChain} from '../../components/web3/hooks';\nimport {Web3TxStatus} from '../../components/web3/types';\nimport ErrorMessageWithDetails from '../../components/common/ErrorMessageWithDetails';\nimport FadeIn from '../../components/common/FadeIn';\nimport InputError from '../../components/common/InputError';\nimport Loader from '../../components/feedback/Loader';\nimport PreviewInputMarkdown from '../../components/common/PreviewInputMarkdown';\nimport Wrap from '../../components/common/Wrap';\n\nenum Fields {\n title = 'title',\n description = 'description',\n}\n\ntype FormInputs = {\n title: string;\n description: string;\n};\n\nexport default function CreateGovernanceProposal() {\n /**\n * Selectors\n */\n\n const isActiveMember = useSelector(\n (s: StoreState) => s.connectedMember?.isActiveMember\n );\n\n /**\n * State\n */\n\n const [submitError, setSubmitError] = useState();\n\n /**\n * Our hooks\n */\n\n const {connected, account} = useWeb3Modal();\n const {proposalSignAndSendStatus, signAndSendProposal} =\n useSignAndSubmitProposal();\n const {defaultChainError} = useIsDefaultChain();\n\n /**\n * Their hooks\n */\n\n const form = useForm({\n mode: 'onBlur',\n reValidateMode: 'onChange',\n });\n const history = useHistory();\n\n /**\n * Variables\n */\n\n const {errors, getValues, register, trigger, watch} = form;\n const isConnected = connected && account;\n const isInProcess =\n proposalSignAndSendStatus === Web3TxStatus.AWAITING_CONFIRM ||\n proposalSignAndSendStatus === Web3TxStatus.PENDING;\n\n const isDone = proposalSignAndSendStatus === Web3TxStatus.FULFILLED;\n const isInProcessOrDone = isInProcess || isDone;\n\n /**\n * Functions\n */\n\n function getUnauthorizedMessage() {\n // user is not connected\n if (!isConnected) {\n return 'Connect your wallet to submit a governance proposal.';\n }\n\n // user is on wrong network\n if (defaultChainError) {\n return defaultChainError.message;\n }\n\n // user is not an active member\n if (!isActiveMember) {\n return 'Either you are not a member, or your membership is not active.';\n }\n }\n\n async function handleSubmit(values: FormInputs) {\n try {\n // Sign and submit proposal for Snapshot Hub\n const {uniqueId} = await signAndSendProposal({\n partialProposalData: {\n name: values.title,\n body: values.description,\n metadata: {\n type: SnapshotMetadataType.Governance,\n },\n },\n type: SnapshotType.proposal,\n });\n\n // Go to newly creatd governance proposal's page\n history.push(`/governance/${uniqueId}`);\n } catch (error) {\n setSubmitError(error);\n }\n }\n\n function renderSubmitStatus(): React.ReactNode {\n switch (proposalSignAndSendStatus) {\n case Web3TxStatus.AWAITING_CONFIRM:\n return (\n <>\n Awaiting your confirmation\n \n \n );\n case Web3TxStatus.PENDING:\n return (\n <>\n Submitting\n \n \n );\n case Web3TxStatus.FULFILLED:\n return 'Done!';\n default:\n return '';\n }\n }\n\n /**\n * Render\n */\n\n // Render unauthorized message\n if (!isConnected || !isActiveMember || defaultChainError) {\n return (\n \n
\n

{getUnauthorizedMessage()}

\n
\n
\n );\n }\n\n return (\n \n
e.preventDefault()}>\n {/* PROPOSAL TITLE */}\n
\n \n
\n \n\n \n
\n
\n\n {/* PROPOSAL DESCRIPTION */}\n
\n \n
\n \n\n \n\n \n
\n
\n\n {/* SUBMIT */}\n {\n if (isInProcessOrDone) return;\n\n if (!(await trigger())) {\n return;\n }\n\n handleSubmit(getValues());\n }}\n type=\"submit\">\n {isInProcess ? : isDone ? 'Done' : 'Submit'}\n \n\n {/* SUBMIT STATUS */}\n {isInProcessOrDone && (\n
\n {renderSubmitStatus()}\n
\n )}\n\n {/* SUBMIT ERROR */}\n {submitError && (\n
\n \n
\n )}\n \n
\n );\n}\n\nfunction RenderWrapper(props: React.PropsWithChildren): JSX.Element {\n return (\n \n \n
\n

Governance Proposal

\n
\n\n
\n
\n

\n Nulla aliquet porttitor venenatis. Donec a dui et dui fringilla\n consectetur id nec massa. Aliquam erat volutpat. Sed ut dui ut\n lacus dictum fermentum vel tincidunt neque. Sed sed lacinia...\n

\n
\n\n {/* RENDER CHILDREN */}\n {props.children}\n
\n
\n
\n );\n}\n","import Markdown from 'markdown-to-jsx';\n\ntype PreviewInputMarkdownProps = {\n value: string;\n};\n\nexport default function PreviewInputMarkdown(props: PreviewInputMarkdownProps) {\n const {value} = props;\n\n if (!value) return null;\n\n return (\n
\n \n Preview Markdown\n \n\n
\n {value}\n
\n
\n );\n}\n","import React, {useState, useCallback, useEffect} from 'react';\nimport {SnapshotType} from '@openlaw/snapshot-js-erc712';\nimport {useForm} from 'react-hook-form';\nimport {toWei, toChecksumAddress} from 'web3-utils';\nimport {useHistory} from 'react-router-dom';\n\nimport {\n getValidationError,\n stripFormatNumber,\n formatNumber,\n formatDecimal,\n truncateEthAddress,\n normalizeString,\n} from '../../util/helpers';\nimport {useIsDefaultChain, useWeb3Modal} from '../../components/web3/hooks';\nimport {ContractAdapterNames, Web3TxStatus} from '../../components/web3/types';\nimport {FormFieldErrors} from '../../util/enums';\nimport {isEthAddressValid} from '../../util/validation';\nimport {AsyncStatus} from '../../util/types';\nimport {UNITS_ADDRESS} from '../../config';\nimport {CycleEllipsis} from '../../components/feedback';\nimport {\n useCheckApplicant,\n useSignAndSubmitProposal,\n} from '../../components/proposals/hooks';\nimport ErrorMessageWithDetails from '../../components/common/ErrorMessageWithDetails';\nimport FadeIn from '../../components/common/FadeIn';\nimport InputError from '../../components/common/InputError';\nimport Loader from '../../components/feedback/Loader';\nimport Wrap from '../../components/common/Wrap';\n\nenum Fields {\n ethAddress = 'ethAddress',\n ethAmount = 'ethAmount',\n}\n\ntype FormInputs = {\n ethAddress: string;\n ethAmount: string;\n};\n\ntype SubmitActionArguments = [\n string, // `applicant`\n string, // `tokenToMint`\n string // `tokenAmount`\n];\n\nexport default function CreateMembershipProposal() {\n /**\n * Our hooks\n */\n\n const {defaultChainError} = useIsDefaultChain();\n const {connected, account, web3Instance} = useWeb3Modal();\n const {\n proposalData,\n proposalSignAndSendError,\n proposalSignAndSendStatus,\n signAndSendProposal,\n } = useSignAndSubmitProposal();\n\n /**\n * Their hooks\n */\n\n const form = useForm({\n mode: 'onBlur',\n reValidateMode: 'onChange',\n });\n const history = useHistory();\n\n /**\n * State\n */\n\n const [submitError, setSubmitError] = useState();\n const [userAccountBalance, setUserAccountBalance] = useState();\n\n /**\n * Variables\n */\n\n const {errors, getValues, setValue, register, trigger, watch} = form;\n\n const ethAddressValue = watch(Fields.ethAddress);\n\n const createMemberError = submitError || proposalSignAndSendError;\n const isConnected = connected && account;\n\n const isInProcess =\n proposalSignAndSendStatus === Web3TxStatus.AWAITING_CONFIRM ||\n proposalSignAndSendStatus === Web3TxStatus.PENDING;\n\n const isDone = proposalSignAndSendStatus === Web3TxStatus.FULFILLED;\n\n const isInProcessOrDone = isInProcess || isDone;\n\n const {\n checkApplicantError,\n checkApplicantInvalidMsg,\n checkApplicantStatus,\n isApplicantValid,\n } = useCheckApplicant(ethAddressValue);\n\n /**\n * Cached callbacks\n */\n\n const getUserAccountBalanceCached = useCallback(getUserAccountBalance, [\n account,\n web3Instance,\n ]);\n\n /**\n * Effects\n */\n\n useEffect(() => {\n getUserAccountBalanceCached();\n }, [getUserAccountBalanceCached]);\n\n // Set the value of `ethAddress` if the `account` changes\n useEffect(() => {\n setValue(Fields.ethAddress, account);\n }, [account, setValue]);\n\n /**\n * Functions\n */\n\n async function getUserAccountBalance() {\n if (!web3Instance || !account) {\n setUserAccountBalance(undefined);\n return;\n }\n\n try {\n // Ether wallet balance\n const accountBalanceInWei = await web3Instance.eth.getBalance(account);\n setUserAccountBalance(\n web3Instance.utils.fromWei(accountBalanceInWei, 'ether')\n );\n } catch (error) {\n setUserAccountBalance(undefined);\n }\n }\n\n async function handleSubmit(values: FormInputs) {\n try {\n if (!isConnected) {\n throw new Error(\n 'No user account was found. Please make sure your wallet is connected.'\n );\n }\n\n if (!account) {\n throw new Error('No account found.');\n }\n\n if (checkApplicantError) {\n // Just log the error (don't throw) because it is not a blocker for the\n // snapshot draft to be submitted. The applicant address validity will\n // be checked again when the proposal is submitted onchain.\n console.warn(\n `Error checking if the applicant address is valid: ${checkApplicantError.message}`\n );\n }\n\n if (\n checkApplicantStatus === AsyncStatus.FULFILLED &&\n !isApplicantValid &&\n checkApplicantInvalidMsg\n ) {\n throw new Error(checkApplicantInvalidMsg);\n }\n\n // Maybe set proposal ID from previous attempt\n let proposalId: string = proposalData?.uniqueId || '';\n\n const {ethAddress, ethAmount} = values;\n const ethAddressToChecksum = toChecksumAddress(ethAddress);\n const ethAmountInWei = toWei(stripFormatNumber(ethAmount), 'ether');\n const proposerAddressToChecksum = toChecksumAddress(account);\n\n // Values needed to display relevant proposal amounts in the proposal\n // details page are set in the snapshot draft metadata. (We can no longer\n // rely on getting this data from onchain because the proposal may not\n // exist there yet.)\n const proposalAmountValues = {\n tributeAmount: ethAmount,\n tributeAmountUnit: 'ETH',\n };\n\n // Arguments needed to submit the proposal onchain are set in the snapshot\n // draft metadata.\n const submitActionArgs: SubmitActionArguments = [\n ethAddressToChecksum,\n UNITS_ADDRESS,\n ethAmountInWei,\n ];\n\n // Only submit to snapshot if there is not already a proposal ID returned from a previous attempt.\n if (!proposalId) {\n const body =\n normalizeString(ethAddress) === normalizeString(account)\n ? `Membership for ${truncateEthAddress(ethAddressToChecksum, 7)}.`\n : `Membership proposal from ${truncateEthAddress(\n proposerAddressToChecksum,\n 7\n )} for applicant ${truncateEthAddress(ethAddressToChecksum, 7)}.`;\n\n // Sign and submit draft for snapshot-hub\n const {uniqueId} = await signAndSendProposal({\n partialProposalData: {\n name: ethAddressToChecksum,\n body,\n metadata: {\n proposalAmountValues,\n submitActionArgs,\n accountAuthorizedToProcessPassedProposal:\n proposerAddressToChecksum,\n },\n },\n adapterName: ContractAdapterNames.onboarding,\n type: SnapshotType.draft,\n });\n\n proposalId = uniqueId;\n }\n\n // go to MembershipDetails page for newly created member proposal\n history.push(`/membership/${proposalId}`);\n } catch (error) {\n // Set any errors from Web3 utils or explicitly set above.\n setSubmitError(error);\n }\n }\n\n function renderSubmitStatus(): React.ReactNode {\n switch (proposalSignAndSendStatus) {\n case Web3TxStatus.AWAITING_CONFIRM:\n return (\n <>\n Awaiting your confirmation\n \n \n );\n case Web3TxStatus.PENDING:\n return (\n <>\n Submitting\n \n \n );\n case Web3TxStatus.FULFILLED:\n return 'Done!';\n default:\n return '';\n }\n }\n\n function renderUserAccountBalance() {\n if (!userAccountBalance) {\n return '---';\n }\n\n const isBalanceInt = Number.isInteger(Number(userAccountBalance));\n return isBalanceInt\n ? userAccountBalance\n : formatDecimal(Number(userAccountBalance));\n }\n\n function getUnauthorizedMessage() {\n // user is not connected\n if (!isConnected) {\n return 'Connect your wallet to submit a membership proposal.';\n }\n\n // user is on wrong network\n if (defaultChainError) {\n return defaultChainError.message;\n }\n }\n\n /**\n * Render\n */\n\n // Render unauthorized message\n if (!isConnected || defaultChainError) {\n return (\n \n
\n

{getUnauthorizedMessage()}

\n
\n
\n );\n }\n\n return (\n \n
e.preventDefault()}>\n {/* ETH ADDRESS */}\n
\n \n
\n {/* @note We don't need the default value as it's handled in the useEffect above. */}\n {\n return !ethAddress\n ? FormFieldErrors.REQUIRED\n : !isEthAddressValid(ethAddress)\n ? FormFieldErrors.INVALID_ETHEREUM_ADDRESS\n : true;\n },\n })}\n type=\"text\"\n disabled={isInProcessOrDone}\n />\n\n \n
\n
\n\n {/* ETH AMOUNT */}\n
\n \n
\n
\n \n setValue(\n Fields.ethAmount,\n formatNumber(getValues().ethAmount)\n )\n }\n ref={register({\n validate: (value: string): string | boolean => {\n const amount = Number(stripFormatNumber(value));\n\n return value === ''\n ? FormFieldErrors.REQUIRED\n : isNaN(amount)\n ? FormFieldErrors.INVALID_NUMBER\n : amount <= 0\n ? 'The value must be greater than 0 ETH.'\n : amount >= Number(userAccountBalance)\n ? 'Insufficient funds.'\n : true;\n },\n })}\n type=\"text\"\n disabled={isInProcessOrDone}\n />\n
ETH
\n
\n\n \n
\n
\n available: {renderUserAccountBalance()}\n
\n
\n\n {/* SUBMIT */}\n {\n if (isInProcessOrDone) return;\n\n if (!(await trigger())) {\n return;\n }\n\n handleSubmit(getValues());\n }}\n type=\"submit\">\n {isInProcess ? : isDone ? 'Done' : 'Submit'}\n \n\n {/* SUBMIT STATUS */}\n {isInProcessOrDone && (\n
\n {renderSubmitStatus()}\n
\n )}\n\n {/* SUBMIT ERROR */}\n {createMemberError && (\n
\n \n
\n )}\n \n
\n );\n}\n\nfunction RenderWrapper(props: React.PropsWithChildren): JSX.Element {\n /**\n * Render\n */\n\n return (\n \n \n
\n

Join

\n
\n\n
\n
\n

\n Nulla aliquet porttitor venenatis. Donec a dui et dui fringilla\n consectetur id nec massa. Aliquam erat volutpat. Sed ut dui ut\n lacus dictum fermentum vel tincidunt neque. Sed sed lacinia...\n

\n
\n\n {/* RENDER CHILDREN */}\n {props.children}\n
\n
\n
\n );\n}\n","import React, {useState, useCallback, useEffect} from 'react';\nimport {\n SnapshotType,\n SnapshotProposalData,\n prepareVoteProposalData,\n} from '@openlaw/snapshot-js-erc712';\nimport {useForm} from 'react-hook-form';\nimport {useSelector} from 'react-redux';\nimport {useHistory} from 'react-router-dom';\nimport {toBN, AbiItem, toWei, toChecksumAddress} from 'web3-utils';\n\nimport {ETH_TOKEN_ADDRESS, GUILD_ADDRESS, UNITS_ADDRESS} from '../../config';\nimport {\n getValidationError,\n stripFormatNumber,\n formatNumber,\n formatDecimal,\n truncateEthAddress,\n} from '../../util/helpers';\nimport {\n useContractSend,\n useETHGasPrice,\n useIsDefaultChain,\n useWeb3Modal,\n} from '../../components/web3/hooks';\nimport {ContractAdapterNames, Web3TxStatus} from '../../components/web3/types';\nimport {FormFieldErrors} from '../../util/enums';\nimport {isEthAddressValid} from '../../util/validation';\nimport {BURN_ADDRESS} from '../../util/constants';\nimport {StoreState} from '../../store/types';\nimport {TX_CYCLE_MESSAGES} from '../../components/web3/config';\nimport {multicall, MulticallTuple} from '../../components/web3/helpers';\nimport {useSignAndSubmitProposal} from '../../components/proposals/hooks';\nimport CycleMessage from '../../components/feedback/CycleMessage';\nimport ErrorMessageWithDetails from '../../components/common/ErrorMessageWithDetails';\nimport FadeIn from '../../components/common/FadeIn';\nimport InputError from '../../components/common/InputError';\nimport Loader from '../../components/feedback/Loader';\nimport Wrap from '../../components/common/Wrap';\nimport EtherscanURL from '../../components/web3/EtherscanURL';\nimport {default as ERC20ABI} from '../../truffle-contracts/ERC20.json';\n\nenum Fields {\n type = 'type',\n selectedToken = 'selectedToken',\n memberAddress = 'memberAddress',\n amount = 'amount',\n notes = 'notes',\n}\n\ntype FormInputs = {\n type: string;\n selectedToken: string;\n memberAddress: string;\n amount: string;\n notes: string;\n};\n\ntype TransferArguments = [\n string, // `dao`\n string, // `proposalId`\n string, // `unitHolderAddr`\n string, // `token`\n string, // `amount`\n string // `data`\n];\n\ntype InitialTokenDetails = {\n address: string;\n daoBalance: string;\n};\n\ntype TokenDetails = InitialTokenDetails & {\n name: string;\n symbol: string;\n decimals: number;\n};\n\nexport default function CreateTransferProposal() {\n /**\n * Selectors\n */\n\n const DistributeContract = useSelector(\n (state: StoreState) => state.contracts?.DistributeContract\n );\n const DaoRegistryContract = useSelector(\n (state: StoreState) => state.contracts?.DaoRegistryContract\n );\n const BankExtensionContract = useSelector(\n (state: StoreState) => state.contracts?.BankExtensionContract\n );\n const isActiveMember = useSelector(\n (s: StoreState) => s.connectedMember?.isActiveMember\n );\n\n /**\n * Our hooks\n */\n\n const {defaultChainError} = useIsDefaultChain();\n const {connected, account, web3Instance} = useWeb3Modal();\n const {fast: fastGasPrice} = useETHGasPrice();\n const {txError, txEtherscanURL, txIsPromptOpen, txSend, txStatus} =\n useContractSend();\n const {proposalData, proposalSignAndSendStatus, signAndSendProposal} =\n useSignAndSubmitProposal();\n\n /**\n * Their hooks\n */\n\n const form = useForm({\n mode: 'onBlur',\n reValidateMode: 'onChange',\n });\n const history = useHistory();\n\n /**\n * State\n */\n\n const [submitError, setSubmitError] = useState();\n const [daoTokens, setDaoTokens] = useState();\n const [selectedTokenBalance, setSelectedTokenBalance] = useState();\n\n /**\n * Variables\n */\n\n const {errors, getValues, setValue, register, trigger, watch} = form;\n const typeValue = watch('type');\n const isTypeAllMembers = typeValue === 'all members';\n const selectedTokenValue = watch('selectedToken');\n\n const createTransferError = submitError || txError;\n const isConnected = connected && account;\n const erc20ABI: AbiItem[] = ERC20ABI as any;\n\n const isInProcess =\n txStatus === Web3TxStatus.AWAITING_CONFIRM ||\n txStatus === Web3TxStatus.PENDING ||\n proposalSignAndSendStatus === Web3TxStatus.AWAITING_CONFIRM ||\n proposalSignAndSendStatus === Web3TxStatus.PENDING;\n\n const isDone =\n txStatus === Web3TxStatus.FULFILLED &&\n proposalSignAndSendStatus === Web3TxStatus.FULFILLED;\n\n const isInProcessOrDone = isInProcess || isDone || txIsPromptOpen;\n\n /**\n * Cached callbacks\n */\n\n const getDaoTokensCached = useCallback(getDaoTokens, [\n BankExtensionContract,\n account,\n erc20ABI,\n web3Instance,\n ]);\n\n const getSelectedTokenBalanceCached = useCallback(getSelectedTokenBalance, [\n account,\n selectedTokenValue,\n ]);\n\n /**\n * Effects\n */\n\n useEffect(() => {\n getDaoTokensCached();\n }, [getDaoTokensCached]);\n\n useEffect(() => {\n getSelectedTokenBalanceCached();\n }, [getSelectedTokenBalanceCached]);\n\n /**\n * Functions\n */\n\n async function getDaoTokens() {\n if (!account || !BankExtensionContract || !web3Instance) {\n setDaoTokens(undefined);\n return;\n }\n\n try {\n const {\n abi: bankABI,\n contractAddress: bankAddress,\n instance: {methods: bankMethods},\n } = BankExtensionContract;\n\n const nbTokens = await bankMethods.nbTokens().call();\n\n if (Number(nbTokens) < 1) {\n setDaoTokens([]);\n } else {\n let parsedAndSortedTokens: TokenDetails[] = [];\n\n // Build calls to get DAO token list with details\n const getTokenABI = bankABI.find((item) => item.name === 'getToken');\n const getTokenCalls = [...Array(Number(nbTokens)).keys()].map(\n (index): MulticallTuple => [\n bankAddress,\n getTokenABI as AbiItem,\n [index.toString()],\n ]\n );\n const fetchedTokens: string[] = await multicall({\n calls: getTokenCalls,\n web3Instance,\n });\n\n const balanceOfABI = bankABI.find((item) => item.name === 'balanceOf');\n const getDaoTokenBalanceCalls = fetchedTokens.map(\n (token): MulticallTuple => [\n bankAddress,\n balanceOfABI as AbiItem,\n [GUILD_ADDRESS, token],\n ]\n );\n const daoTokenBalances: string[] = await multicall({\n calls: getDaoTokenBalanceCalls,\n web3Instance,\n });\n\n const tokensArray: InitialTokenDetails[] = fetchedTokens\n .map((token, index) => ({\n address: token,\n daoBalance: daoTokenBalances[index],\n }))\n // Don't need to include tokens that have 0 balance\n .filter((tokenObj) => toBN(tokenObj.daoBalance).gt(toBN(0)));\n\n const ethToken = tokensArray.find(\n (token) => token.address === ETH_TOKEN_ADDRESS\n );\n if (ethToken) {\n parsedAndSortedTokens.push({\n ...ethToken,\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n });\n }\n\n // Filter out Ether to handle ERC20 tokens\n const erc20Tokens = tokensArray.filter(\n (token) => token.address !== ETH_TOKEN_ADDRESS\n );\n\n if (erc20Tokens.length > 0) {\n const nameABI = erc20ABI.find((item) => item.name === 'name');\n const nameCalls = erc20Tokens.map(\n (token): MulticallTuple => [\n token.address as string,\n nameABI as AbiItem,\n [],\n ]\n );\n const symbolABI = erc20ABI.find((item) => item.name === 'symbol');\n const symbolCalls = erc20Tokens.map(\n (token): MulticallTuple => [\n token.address as string,\n symbolABI as AbiItem,\n [],\n ]\n );\n const decimalsABI = erc20ABI.find((item) => item.name === 'decimals');\n const decimalsCalls = erc20Tokens.map(\n (token): MulticallTuple => [\n token.address as string,\n decimalsABI as AbiItem,\n [],\n ]\n );\n const erc20DetailsCalls = [\n ...nameCalls,\n ...symbolCalls,\n ...decimalsCalls,\n ];\n let results = await multicall({\n calls: erc20DetailsCalls,\n web3Instance,\n });\n let chunkedResults = [];\n while (results.length) {\n chunkedResults.push(results.splice(0, erc20Tokens.length));\n }\n const [names, symbols, decimals] = chunkedResults;\n\n const parsedAndSortedERC20Tokens = erc20Tokens\n .map((token, index) => ({\n ...token,\n name: names[index],\n symbol: symbols[index],\n decimals: decimals[index],\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n\n parsedAndSortedTokens = [\n ...parsedAndSortedTokens,\n ...parsedAndSortedERC20Tokens,\n ];\n }\n\n setDaoTokens(parsedAndSortedTokens);\n }\n } catch (error) {\n console.error(error);\n setDaoTokens(undefined);\n }\n }\n\n async function getSelectedTokenBalance() {\n if (!account || !selectedTokenValue) {\n setSelectedTokenBalance(undefined);\n return;\n }\n\n try {\n const selectedTokenObj = JSON.parse(selectedTokenValue);\n const balance = selectedTokenObj.daoBalance;\n const balanceBN = toBN(balance);\n const decimals = selectedTokenObj.decimals;\n const divisor = toBN(10).pow(toBN(decimals));\n const beforeDecimal = balanceBN.div(divisor);\n const afterDecimal = balanceBN.mod(divisor);\n const balanceReadable = afterDecimal.eq(toBN(0))\n ? beforeDecimal.toString()\n : `${beforeDecimal.toString()}.${afterDecimal.toString()}`;\n\n setSelectedTokenBalance(balanceReadable);\n } catch (error) {\n console.error(error);\n setSelectedTokenBalance(undefined);\n }\n }\n\n async function handleSubmit(values: FormInputs) {\n try {\n if (!isConnected) {\n throw new Error(\n 'No user account was found. Please make sure your wallet is connected.'\n );\n }\n\n if (!DistributeContract) {\n throw new Error('No DistributeContract found.');\n }\n\n if (!DaoRegistryContract) {\n throw new Error('No DaoRegistryContract found.');\n }\n\n if (!account) {\n throw new Error('No account found.');\n }\n\n if (!web3Instance) {\n throw new Error('No Web3 instance was found.');\n }\n\n const {selectedToken, memberAddress, amount, notes} = values;\n const memberAddressToChecksum = toChecksumAddress(memberAddress);\n const selectedTokenObj = JSON.parse(selectedToken);\n const {symbol, decimals, address: tokenAddress} = selectedTokenObj;\n let amountArg;\n if (tokenAddress === ETH_TOKEN_ADDRESS) {\n amountArg = toWei(stripFormatNumber(amount), 'ether');\n } else {\n const multiplier = toBN(10).pow(toBN(decimals));\n const amountWithDecimals = toBN(stripFormatNumber(amount)).mul(\n multiplier\n );\n amountArg = amountWithDecimals.toString();\n }\n\n // Maybe set proposal info from previous attempt\n let proposalId: string = proposalData?.uniqueId || '';\n let data: SnapshotProposalData | undefined = proposalData?.data;\n let signature: string = proposalData?.signature || '';\n\n const bodyIntro = isTypeAllMembers\n ? 'Transfer to all members pro rata.'\n : `Transfer to ${truncateEthAddress(memberAddressToChecksum, 7)}.`;\n\n // Values needed to display relevant proposal amounts in the proposal\n // details page are set in the snapshot draft metadata. (We can no longer\n // rely on getting this data from onchain because the proposal may not\n // exist there yet.)\n const proposalAmountValues = {\n transferAmount: amount,\n transferAmountUnit: symbol,\n };\n\n // Only submit to snapshot if there is not already a proposal ID returned from a previous attempt.\n if (!proposalId) {\n const body = notes ? `${bodyIntro}\\n${notes}` : bodyIntro;\n const name = isTypeAllMembers ? 'All members' : memberAddressToChecksum;\n const now = Math.floor(Date.now() / 1000);\n\n // Sign and submit proposal for snapshot-hub\n const {\n uniqueId,\n data: returnData,\n signature: returnSignature,\n } = await signAndSendProposal({\n partialProposalData: {\n name,\n body,\n metadata: {\n proposalAmountValues,\n isTypeAllMembers,\n },\n timestamp: now.toString(),\n },\n adapterName: ContractAdapterNames.distribute,\n type: SnapshotType.proposal,\n });\n\n proposalId = uniqueId;\n data = returnData;\n signature = returnSignature;\n }\n\n const memberAddressArg = isTypeAllMembers\n ? BURN_ADDRESS // 0x0 address indicates distribution to all active members\n : memberAddressToChecksum;\n /**\n * Prepare `data` argument for submission to DAO\n *\n * For information about which data the smart contract needs for signature verification (e.g. `hashMessage`):\n * @link https://github.com/openlawteam/tribute-contracts/blob/master/contracts/adapters/voting/OffchainVoting.sol\n */\n const preparedVoteVerificationBytes = data\n ? prepareVoteProposalData(\n {\n payload: {\n name: data.payload.name,\n body: data.payload.body,\n choices: data.payload.choices,\n snapshot: data.payload.snapshot.toString(),\n start: data.payload.start,\n end: data.payload.end,\n },\n sig: signature,\n space: data.space,\n timestamp: parseInt(data.timestamp),\n },\n web3Instance\n )\n : '';\n\n const transferArguments: TransferArguments = [\n DaoRegistryContract.contractAddress,\n proposalId,\n memberAddressArg,\n tokenAddress,\n amountArg,\n preparedVoteVerificationBytes,\n ];\n\n const txArguments = {\n from: account || '',\n ...(fastGasPrice ? {gasPrice: fastGasPrice} : null),\n };\n\n // Execute contract call for `submitProposal`\n await txSend(\n 'submitProposal',\n DistributeContract.instance.methods,\n transferArguments,\n txArguments\n );\n\n // go to TransferDetails page for newly created transfer proposal\n history.push(`/transfers/${proposalId}`);\n } catch (error) {\n // Set any errors from Web3 utils or explicitly set above.\n setSubmitError(error);\n }\n }\n\n function renderSubmitStatus(): React.ReactNode {\n // Either Snapshot or chain tx\n if (\n txStatus === Web3TxStatus.AWAITING_CONFIRM ||\n proposalSignAndSendStatus === Web3TxStatus.AWAITING_CONFIRM\n ) {\n return 'Awaiting your confirmation\\u2026';\n }\n\n // Only for chain tx\n switch (txStatus) {\n case Web3TxStatus.PENDING:\n return (\n <>\n {\n return {message};\n }}\n />\n\n \n \n );\n case Web3TxStatus.FULFILLED:\n return (\n <>\n
Proposal submitted!
\n\n \n \n );\n default:\n return null;\n }\n }\n\n function renderSelectedTokenBalance() {\n if (!selectedTokenBalance) {\n return '---';\n }\n\n const isBalanceInt = Number.isInteger(Number(selectedTokenBalance));\n return isBalanceInt\n ? selectedTokenBalance\n : formatDecimal(Number(selectedTokenBalance));\n }\n\n function getUnauthorizedMessage() {\n // user is not connected\n if (!isConnected) {\n return 'Connect your wallet to submit a transfer proposal.';\n }\n\n // user is on wrong network\n if (defaultChainError) {\n return defaultChainError.message;\n }\n\n // user is not an active member\n if (!isActiveMember) {\n return 'Either you are not a member, or your membership is not active.';\n }\n }\n\n async function isActiveMemberWithUnits(address: string) {\n if (!BankExtensionContract) {\n console.error('No BankExtensionContract found.');\n return false;\n }\n\n const unitsBalance = await BankExtensionContract.instance.methods\n .balanceOf(address, UNITS_ADDRESS)\n .call();\n\n return toBN(unitsBalance).gt(toBN(0));\n }\n\n /**\n * Render\n */\n\n // Render unauthorized message\n if (!isConnected || defaultChainError || !isActiveMember) {\n return (\n \n
\n

{getUnauthorizedMessage()}

\n
\n
\n );\n }\n\n return (\n \n
e.preventDefault()}>\n {/* TYPE */}\n
\n \n
\n \n \n \n \n
\n
\n\n {/* MEMBER ADDRESS */}\n {!isTypeAllMembers && (\n
\n \n
\n => {\n return !memberAddress\n ? FormFieldErrors.REQUIRED\n : !isEthAddressValid(memberAddress)\n ? FormFieldErrors.INVALID_ETHEREUM_ADDRESS\n : !(await isActiveMemberWithUnits(memberAddress))\n ? 'The address is not an active member with membership tokens.'\n : true;\n },\n })}\n type=\"text\"\n disabled={isInProcessOrDone}\n />\n\n \n
\n
\n )}\n\n {/* SELECTED TOKEN */}\n
\n \n
\n {\n return !daoTokens || daoTokens.length < 1\n ? 'No tokens available for distribution.'\n : !token\n ? FormFieldErrors.REQUIRED\n : true;\n },\n })}\n disabled={isInProcessOrDone}>\n \n {daoTokens?.map((token) => (\n {`${token.name} (${token.symbol})`}\n ))}\n \n\n \n
\n
\n\n {/* AMOUNT */}\n
\n \n
\n
\n \n setValue(Fields.amount, formatNumber(getValues().amount))\n }\n ref={register({\n validate: (amount: string): string | boolean => {\n const amountToNumber = Number(stripFormatNumber(amount));\n const selectedTokenObj =\n selectedTokenValue && JSON.parse(selectedTokenValue);\n const isSelectedTokenEth =\n selectedTokenObj?.address === ETH_TOKEN_ADDRESS;\n\n return amount === ''\n ? FormFieldErrors.REQUIRED\n : isNaN(amountToNumber)\n ? FormFieldErrors.INVALID_NUMBER\n : amountToNumber <= 0\n ? 'The value must be greater than 0.'\n : amountToNumber > Number(selectedTokenBalance)\n ? 'Insufficient funds.'\n : isSelectedTokenEth\n ? true\n : !Number.isInteger(amountToNumber)\n ? 'The value must be an integer for an ERC20 token.'\n : true;\n },\n })}\n type=\"text\"\n disabled={isInProcessOrDone}\n />\n\n
\n {(selectedTokenValue &&\n JSON.parse(selectedTokenValue).symbol) ||\n '___'}\n
\n
\n\n \n\n
\n {isTypeAllMembers\n ? \"If the proposal passes, this total amount will be distributed pro rata to all members' internal accounts, based on the current number of membership tokens held by each member.\"\n : \"If the proposal passes, this amount will be distributed to the member's internal account.\"}\n
\n
\n\n
\n available: {renderSelectedTokenBalance()}\n
\n
\n\n {/* NOTES */}\n
\n \n
\n \n
\n
\n\n {/* SUBMIT */}\n {\n if (isInProcessOrDone) return;\n\n if (!(await trigger())) {\n return;\n }\n\n handleSubmit(getValues());\n }}\n type=\"submit\">\n {isInProcess ? : isDone ? 'Done' : 'Submit'}\n \n\n {/* SUBMIT STATUS */}\n {isInProcessOrDone && (\n
\n {renderSubmitStatus()}\n
\n )}\n\n {/* SUBMIT ERROR */}\n {createTransferError && (\n
\n \n
\n )}\n \n
\n );\n}\n\nfunction RenderWrapper(props: React.PropsWithChildren): JSX.Element {\n /**\n * Render\n */\n\n return (\n \n \n
\n

Transfer Proposal

\n
\n\n
\n
\n

\n Nulla aliquet porttitor venenatis. Donec a dui et dui fringilla\n consectetur id nec massa. Aliquam erat volutpat. Sed ut dui ut\n lacus dictum fermentum vel tincidunt neque. Sed sed lacinia...\n

\n
\n\n {/* RENDER CHILDREN */}\n {props.children}\n
\n
\n
\n );\n}\n","import {useState, useCallback, useEffect} from 'react';\nimport {useSelector} from 'react-redux';\nimport {SnapshotType} from '@openlaw/snapshot-js-erc712';\nimport {useForm} from 'react-hook-form';\nimport {useHistory} from 'react-router-dom';\nimport {Contract as Web3Contract} from 'web3-eth-contract/types';\nimport {toBN, AbiItem, toChecksumAddress} from 'web3-utils';\n\nimport {\n getValidationError,\n stripFormatNumber,\n formatNumber,\n formatDecimal,\n normalizeString,\n truncateEthAddress,\n} from '../../util/helpers';\nimport {useIsDefaultChain, useWeb3Modal} from '../../components/web3/hooks';\nimport {ContractAdapterNames, Web3TxStatus} from '../../components/web3/types';\nimport {FormFieldErrors} from '../../util/enums';\nimport {isEthAddressValid} from '../../util/validation';\nimport {AsyncStatus} from '../../util/types';\nimport {UNITS_ADDRESS} from '../../config';\nimport {StoreState} from '../../store/types';\nimport {\n useCheckApplicant,\n useSignAndSubmitProposal,\n} from '../../components/proposals/hooks';\nimport {CycleEllipsis} from '../../components/feedback';\nimport ErrorMessageWithDetails from '../../components/common/ErrorMessageWithDetails';\nimport FadeIn from '../../components/common/FadeIn';\nimport InputError from '../../components/common/InputError';\nimport Loader from '../../components/feedback/Loader';\nimport Wrap from '../../components/common/Wrap';\n\nenum Fields {\n applicantAddress = 'applicantAddress',\n erc20Address = 'erc20Address',\n tributeAmount = 'tributeAmount',\n requestAmount = 'requestAmount',\n description = 'description',\n}\n\ntype FormInputs = {\n applicantAddress: string;\n erc20Address: string;\n tributeAmount: string;\n requestAmount: string;\n description: string;\n};\n\ntype SubmitActionArguments = [\n string, // `applicant`\n string, // `tokenToMint`\n string, // `requestAmount`\n string, // `tokenAddr`\n string, // `tributeAmount`\n string // `tributeTokenOwner`\n];\n\ntype ERC20Details = {\n symbol: string;\n decimals: number;\n};\n\nexport default function CreateTributeProposal() {\n /**\n * Selectors\n */\n\n const ERC20ExtensionContract = useSelector(\n (state: StoreState) => state.contracts?.ERC20ExtensionContract\n );\n\n /**\n * Our hooks\n */\n\n const {defaultChainError} = useIsDefaultChain();\n const {connected, account, web3Instance} = useWeb3Modal();\n const {\n proposalData,\n proposalSignAndSendError,\n proposalSignAndSendStatus,\n signAndSendProposal,\n } = useSignAndSubmitProposal();\n\n /**\n * Their hooks\n */\n\n const form = useForm({\n mode: 'onBlur',\n reValidateMode: 'onChange',\n });\n const history = useHistory();\n\n /**\n * State\n */\n\n const [submitError, setSubmitError] = useState();\n const [userERC20Balance, setUserERC20Balance] = useState();\n const [erc20Details, setERC20Details] = useState();\n const [erc20Contract, setERC20Contract] = useState();\n\n /**\n * Variables\n */\n\n const {errors, getValues, setValue, register, trigger, watch} = form;\n\n const erc20AddressValue = watch(Fields.erc20Address);\n\n const applicantAddressValue = watch(Fields.applicantAddress);\n\n const createTributeError = submitError || proposalSignAndSendError;\n\n const isConnected = connected && account;\n\n const isInProcess =\n proposalSignAndSendStatus === Web3TxStatus.AWAITING_CONFIRM ||\n proposalSignAndSendStatus === Web3TxStatus.PENDING;\n\n const isDone = proposalSignAndSendStatus === Web3TxStatus.FULFILLED;\n\n const isInProcessOrDone = isInProcess || isDone;\n\n const {\n checkApplicantError,\n checkApplicantInvalidMsg,\n checkApplicantStatus,\n isApplicantValid,\n } = useCheckApplicant(applicantAddressValue);\n\n /**\n * Cached callbacks\n */\n\n const getERC20ContractCached = useCallback(getERC20Contract, [\n erc20AddressValue,\n web3Instance,\n ]);\n\n const getERC20DetailsCached = useCallback(getERC20Details, [\n account,\n erc20Contract,\n ]);\n\n const getUserERC20BalanceCached = useCallback(getUserERC20Balance, [\n account,\n erc20Contract,\n ]);\n\n /**\n * Effects\n */\n\n useEffect(() => {\n getERC20ContractCached();\n }, [getERC20ContractCached]);\n\n useEffect(() => {\n getERC20DetailsCached();\n }, [getERC20DetailsCached]);\n\n useEffect(() => {\n getUserERC20BalanceCached();\n }, [getUserERC20BalanceCached]);\n\n // Set the value of `applicantAddress` if the `account` changes\n useEffect(() => {\n setValue(Fields.applicantAddress, account);\n }, [account, setValue]);\n\n /**\n * Functions\n */\n\n async function getERC20Contract() {\n if (!web3Instance || !erc20AddressValue) {\n setERC20Contract(undefined);\n return;\n }\n\n try {\n const {default: lazyERC20ABI} = await import(\n '../../truffle-contracts/ERC20.json'\n );\n const erc20Contract: AbiItem[] = lazyERC20ABI as any;\n const instance = new web3Instance.eth.Contract(\n erc20Contract,\n erc20AddressValue\n );\n setERC20Contract(instance);\n } catch (error) {\n console.error(error);\n setERC20Contract(undefined);\n }\n }\n\n async function getERC20Details() {\n if (!account || !erc20Contract) {\n setERC20Details(undefined);\n return;\n }\n\n try {\n const symbol = await erc20Contract.methods.symbol().call();\n const decimals = await erc20Contract.methods.decimals().call();\n setERC20Details({symbol, decimals: Number(decimals)});\n } catch (error) {\n console.error(error);\n setERC20Details(undefined);\n }\n }\n\n async function getUserERC20Balance() {\n if (!account || !erc20Contract) {\n setUserERC20Balance(undefined);\n return;\n }\n\n try {\n const balance = await erc20Contract.methods.balanceOf(account).call();\n const balanceBN = toBN(balance);\n const decimals = await erc20Contract.methods.decimals().call();\n const divisor = toBN(10).pow(toBN(decimals));\n const beforeDecimal = balanceBN.div(divisor);\n const afterDecimal = balanceBN.mod(divisor);\n const balanceReadable = afterDecimal.eq(toBN(0))\n ? beforeDecimal.toString()\n : `${beforeDecimal.toString()}.${afterDecimal.toString()}`;\n\n setUserERC20Balance(balanceReadable);\n } catch (error) {\n console.error(error);\n setUserERC20Balance(undefined);\n }\n }\n\n async function getRequestAmountUnit() {\n if (!ERC20ExtensionContract) {\n return 'UNITS';\n } else {\n try {\n return await ERC20ExtensionContract.instance.methods.symbol().call();\n } catch (error) {\n console.log(error);\n return 'UNITS';\n }\n }\n }\n\n async function handleSubmit(values: FormInputs) {\n try {\n if (!isConnected) {\n throw new Error(\n 'No user account was found. Please make sure your wallet is connected.'\n );\n }\n\n if (!account) {\n throw new Error('No account found.');\n }\n\n if (!erc20Contract) {\n throw new Error('No ERC20Contract found.');\n }\n\n if (!erc20Details) {\n throw new Error('No ERC20 details found.');\n }\n\n if (checkApplicantError) {\n // Just log the error (don't throw) because it is not a blocker for the\n // snapshot draft to be submitted. The applicant address validity will\n // be checked again when the proposal is submitted onchain.\n console.warn(\n `Error checking if the applicant address is valid: ${checkApplicantError.message}`\n );\n }\n\n if (\n checkApplicantStatus === AsyncStatus.FULFILLED &&\n !isApplicantValid &&\n checkApplicantInvalidMsg\n ) {\n throw new Error(checkApplicantInvalidMsg);\n }\n\n const {\n applicantAddress,\n erc20Address,\n tributeAmount,\n requestAmount,\n description,\n } = values;\n const multiplier = toBN(10).pow(toBN(erc20Details.decimals));\n const tributeAmountWithDecimals = toBN(\n stripFormatNumber(tributeAmount)\n ).mul(multiplier);\n const requestAmountArg = stripFormatNumber(requestAmount);\n const applicantAddressToChecksum = toChecksumAddress(applicantAddress);\n const proposerAddressToChecksum = toChecksumAddress(account);\n\n // Maybe set proposal ID from previous attempt\n let proposalId: string = proposalData?.uniqueId || '';\n\n // Only submit to snapshot if there is not already a proposal ID returned from a previous attempt.\n if (!proposalId) {\n const bodyIntro =\n normalizeString(applicantAddress) === normalizeString(account)\n ? `Tribute from ${truncateEthAddress(\n applicantAddressToChecksum,\n 7\n )}.`\n : `Tribute from ${truncateEthAddress(\n proposerAddressToChecksum,\n 7\n )} for applicant ${truncateEthAddress(\n applicantAddressToChecksum,\n 7\n )}.`;\n const body = description ? `${bodyIntro}\\n${description}` : bodyIntro;\n\n // Values needed to display relevant proposal amounts in the proposal\n // details page are set in the snapshot draft metadata. (We can no\n // longer rely on getting this data from onchain because the proposal\n // may not exist there yet.)\n const proposalAmountValues = {\n requestAmount,\n requestAmountUnit: await getRequestAmountUnit(),\n tributeAmount,\n tributeAmountUnit: erc20Details.symbol,\n };\n\n // Arguments needed to submit the proposal onchain are set in the\n // snapshot draft metadata.\n const submitActionArgs: SubmitActionArguments = [\n applicantAddressToChecksum,\n UNITS_ADDRESS,\n requestAmountArg,\n toChecksumAddress(erc20Address),\n tributeAmountWithDecimals.toString(),\n proposerAddressToChecksum,\n ];\n\n // Sign and submit draft for snapshot-hub\n const {uniqueId} = await signAndSendProposal({\n partialProposalData: {\n name: applicantAddressToChecksum,\n body,\n metadata: {\n proposalAmountValues,\n submitActionArgs,\n accountAuthorizedToProcessPassedProposal:\n proposerAddressToChecksum,\n },\n },\n adapterName: ContractAdapterNames.tribute,\n type: SnapshotType.draft,\n });\n\n proposalId = uniqueId;\n }\n\n // go to TributeDetails page for newly created tribute proposal\n history.push(`/tributes/${proposalId}`);\n } catch (error) {\n // Set any errors from Web3 utils or explicitly set above.\n setSubmitError(error);\n }\n }\n\n function renderSubmitStatus(): React.ReactNode {\n switch (proposalSignAndSendStatus) {\n case Web3TxStatus.AWAITING_CONFIRM:\n return (\n <>\n Awaiting your confirmation\n \n \n );\n case Web3TxStatus.PENDING:\n return (\n <>\n Submitting\n \n \n );\n case Web3TxStatus.FULFILLED:\n return 'Done!';\n default:\n return '';\n }\n }\n\n function renderUserERC20Balance() {\n if (!userERC20Balance) {\n return '---';\n }\n\n const isBalanceInt = Number.isInteger(Number(userERC20Balance));\n return isBalanceInt\n ? userERC20Balance\n : formatDecimal(Number(userERC20Balance));\n }\n\n function getUnauthorizedMessage() {\n // user is not connected\n if (!isConnected) {\n return 'Connect your wallet to submit a tribute proposal.';\n }\n\n // user is on wrong network\n if (defaultChainError) {\n return defaultChainError.message;\n }\n }\n\n /**\n * Render\n */\n\n // Render unauthorized message\n if (!isConnected || defaultChainError) {\n return (\n \n
\n

{getUnauthorizedMessage()}

\n
\n
\n );\n }\n\n return (\n \n
e.preventDefault()}>\n {/* APPLICANT ADDRESS */}\n
\n \n
\n {/* @note We don't need the default value as it's handled in the useEffect above. */}\n {\n return !applicantAddress\n ? FormFieldErrors.REQUIRED\n : !isEthAddressValid(applicantAddress)\n ? FormFieldErrors.INVALID_ETHEREUM_ADDRESS\n : true;\n },\n })}\n type=\"text\"\n disabled={isInProcessOrDone}\n />\n\n \n
\n
\n\n {/* ERC20 ADDRESS */}\n
\n \n
\n {\n return !erc20Address\n ? FormFieldErrors.REQUIRED\n : !isEthAddressValid(erc20Address)\n ? FormFieldErrors.INVALID_ETHEREUM_ADDRESS\n : true;\n },\n })}\n type=\"text\"\n disabled={isInProcessOrDone}\n />\n\n \n
\n
\n\n {/* TRIBUTE AMOUNT */}\n
\n \n
\n
\n \n setValue(\n Fields.tributeAmount,\n formatNumber(getValues().tributeAmount)\n )\n }\n ref={register({\n validate: (tributeAmount: string): string | boolean => {\n const amount = Number(stripFormatNumber(tributeAmount));\n\n return tributeAmount === ''\n ? FormFieldErrors.REQUIRED\n : isNaN(amount)\n ? FormFieldErrors.INVALID_NUMBER\n : amount <= 0\n ? 'The value must be greater than 0.'\n : amount > Number(userERC20Balance)\n ? 'Insufficient funds.'\n : !Number.isInteger(amount)\n ? 'The value must be an integer for an ERC20 token.'\n : true;\n },\n })}\n type=\"text\"\n disabled={isInProcessOrDone}\n />\n\n
\n {erc20Details?.symbol || '___'}\n
\n
\n\n \n\n
\n This amount will be held in escrow pending a member vote. If the\n proposal passes, the funds will automatically be sent to the DAO.\n If the proposal fails, the funds will be refunded to you.\n
\n
\n\n
\n available: {renderUserERC20Balance()}\n
\n
\n\n {/* REQUEST AMOUNT */}\n
\n \n
\n \n setValue(\n Fields.requestAmount,\n formatNumber(getValues().requestAmount)\n )\n }\n ref={register({\n validate: (requestAmount: string): string | boolean => {\n const amount = Number(stripFormatNumber(requestAmount));\n\n return requestAmount === ''\n ? FormFieldErrors.REQUIRED\n : isNaN(amount)\n ? FormFieldErrors.INVALID_NUMBER\n : amount < 0\n ? 'The value must be at least 0.'\n : true;\n },\n })}\n type=\"text\"\n disabled={isInProcessOrDone}\n />\n\n \n\n
\n This is the amount of DAO membership tokens you are requesting be\n sent to the Applicant Address in exchange for your tribute.\n
\n
\n
\n\n {/* DESCRIPTION */}\n
\n \n
\n \n
\n
\n\n {/* SUBMIT */}\n {\n if (isInProcessOrDone) return;\n\n if (!(await trigger())) {\n return;\n }\n\n handleSubmit(getValues());\n }}\n type=\"submit\">\n {isInProcess ? : isDone ? 'Done' : 'Submit'}\n \n\n {/* SUBMIT STATUS */}\n {isInProcessOrDone && (\n
\n {renderSubmitStatus()}\n
\n )}\n\n {/* SUBMIT ERROR */}\n {createTributeError && (\n
\n \n
\n )}\n \n
\n );\n}\n\nfunction RenderWrapper(props: React.PropsWithChildren): JSX.Element {\n /**\n * Render\n */\n\n return (\n \n \n
\n

Tribute Proposal

\n
\n\n
\n
\n

\n Nulla aliquet porttitor venenatis. Donec a dui et dui fringilla\n consectetur id nec massa. Aliquam erat volutpat. Sed ut dui ut\n lacus dictum fermentum vel tincidunt neque. Sed sed lacinia...\n

\n
\n\n {/* RENDER CHILDREN */}\n {props.children}\n
\n
\n
\n );\n}\n","import {memo, useEffect} from 'react';\nimport {useHistory} from 'react-router-dom';\nimport AOS from 'aos';\nimport '../../../node_modules/aos/dist/aos.css';\n\nimport {CenterLogo} from '../../components/logo';\nimport {NavHamburger} from '../../components/Nav';\nimport FadeIn from '../../components/common/FadeIn';\nimport SocialMedia from '../../components/common/SocialMedia';\nimport Wrap from '../../components/common/Wrap';\n\nconst TributeCube = memo(() => {\n return (\n \n
\n
\n
\n \n );\n});\n\nfunction GetStartedHeader() {\n return (\n
\n \n \n
\n );\n}\n\nexport default function GetStarted() {\n /**\n * Their hooks\n */\n\n const history = useHistory();\n\n /**\n * Effects\n */\n\n useEffect(() => {\n AOS.init({\n duration: 800,\n offset: 40,\n delay: 120,\n mirror: false,\n once: true,\n });\n }, []);\n\n /**\n * Render\n */\n\n return (\n <>\n \n \n \n \n\n
\n
\n A next generation DAO framework\n
\n\n
\n \n
\n\n
\n {\n history.push('/join');\n }}>\n Join\n \n
\n
\n
\n
\n \n );\n}\n","import {useCallback, useState} from 'react';\n\nimport {\n OffchainVotingAction,\n OffchainVotingStatus,\n OnVotingPeriodChangeProps,\n} from '../proposals/voting';\nimport {ProposalData} from '../proposals/types';\nimport {useOffchainVotingResults} from '../proposals/hooks';\n\ntype GovernanceActionsProps = {\n proposal: ProposalData;\n};\n\nexport function GovernanceActions(props: GovernanceActionsProps) {\n const {proposal} = props;\n const {snapshotProposal} = proposal;\n\n const votingStartMs: number | undefined =\n Number(snapshotProposal?.msg.payload.start || 0) * 1000;\n\n const votingEndMs: number =\n Number(snapshotProposal?.msg.payload.end || 0) * 1000;\n\n /**\n * State\n */\n\n const [votingPeriodData, setVotingPeriodData] =\n useState({\n hasVotingStarted: false,\n hasVotingEnded: false,\n votingStartEndInitReady: false,\n });\n\n /**\n * Our hooks\n */\n\n const {offchainVotingResults} = useOffchainVotingResults(snapshotProposal);\n\n /**\n * Cached callbacks\n */\n\n const handleOnVotingPeriodChangeCached = useCallback(\n handleOnVotingPeriodChange,\n []\n );\n\n /**\n * Variables\n */\n\n const votingResult = offchainVotingResults[0]?.[1];\n\n const {hasVotingEnded, hasVotingStarted, votingStartEndInitReady} =\n votingPeriodData;\n\n /**\n * Functions\n */\n\n function handleOnVotingPeriodChange(\n votingPeriodProps: OnVotingPeriodChangeProps\n ) {\n setVotingPeriodData(votingPeriodProps);\n }\n\n /**\n * Render\n */\n\n return (\n <>\n \n\n {votingStartEndInitReady && hasVotingStarted && !hasVotingEnded && (\n \n )}\n \n );\n}\n","import React from 'react';\n\nimport Wrap from '../../components/common/Wrap';\nimport FadeIn from '../../components/common/FadeIn';\n\nexport default function NotFound() {\n return (\n \n \n
\n

\n 4\n \n 😵\n \n 4\n

\n
\n
\n
\n );\n}\n","import {ProposalData} from './types';\n\nimport {truncateEthAddress} from '../../util/helpers';\nimport Markdown from 'markdown-to-jsx';\n\ntype ProposalDetailsProps = {\n proposal: ProposalData;\n /**\n * A render prop to render amount(s) badge.\n */\n renderAmountBadge?: () => React.ReactNode;\n /**\n * A render prop to render any action button flows for a proposal.\n */\n renderActions: () => React.ReactNode;\n};\n\nexport default function ProposalDetails(props: ProposalDetailsProps) {\n const {proposal, renderAmountBadge, renderActions} = props;\n\n const commonData = proposal.getCommonSnapshotProposalData();\n\n /**\n * Render\n */\n\n if (!commonData) {\n return null;\n }\n\n return (\n <>\n
Proposal Details
\n
\n {/* PROPOSAL NAME (an address in most cases) AND BODY */}\n
\n

\n {/* @note If the proposal title is not an address it will fall back to a normal, non-truncated string. */}\n {truncateEthAddress(commonData.msg.payload.name || '', 7)}\n

\n\n {commonData.msg.payload.body}\n
\n\n {/* SIDEBAR */}\n
\n {/* AMOUNT(S) IF RELEVANT FOR PROPOSAL */}\n {renderAmountBadge && renderAmountBadge()}\n\n {/* SPONSOR & VOTING ACTIONS */}\n {renderActions()}\n
\n
\n \n );\n}\n","import {SnapshotType} from '@openlaw/snapshot-js-erc712';\nimport React from 'react';\nimport {useHistory, useParams} from 'react-router-dom';\n\nimport {AsyncStatus} from '../../util/types';\nimport {GovernanceActions} from '../../components/governance';\nimport {useIsDefaultChain} from '../../components/web3/hooks';\nimport {useProposalOrDraft} from '../../components/proposals/hooks';\nimport ErrorMessageWithDetails from '../../components/common/ErrorMessageWithDetails';\nimport FadeIn from '../../components/common/FadeIn';\nimport LoaderLarge from '../../components/feedback/LoaderLarge';\nimport NotFound from '../subpages/NotFound';\nimport ProposalDetails from '../../components/proposals/ProposalDetails';\nimport Wrap from '../../components/common/Wrap';\n\nexport default function GovernanceProposalDetails() {\n /**\n * Their hooks\n */\n\n // Get hash for fetching the proposal.\n const {proposalId} = useParams<{proposalId: string}>();\n\n /**\n * Our hooks\n */\n\n const {proposalData, proposalError, proposalNotFound, proposalStatus} =\n useProposalOrDraft(proposalId, SnapshotType.proposal);\n\n const {defaultChainError} = useIsDefaultChain();\n\n /**\n * Variables\n */\n\n const isLoading: boolean = proposalStatus === AsyncStatus.PENDING;\n const error: Error | undefined = proposalError || defaultChainError;\n\n /**\n * Render\n */\n\n // Render loading\n if (isLoading && !error) {\n return (\n \n
\n \n
\n
\n );\n }\n\n // Render 404 no proposal found\n if (proposalNotFound) {\n return (\n \n \n \n );\n }\n\n // Render error\n if (error) {\n return (\n \n
\n \n
\n
\n );\n }\n\n // Render proposal\n if (proposalData) {\n return (\n \n }\n />\n \n );\n }\n\n // Render nothing. Should never reach this case.\n return <>;\n}\n\nfunction RenderWrapper(props: React.PropsWithChildren): JSX.Element {\n /**\n * Their hooks\n */\n\n const history = useHistory();\n\n /**\n * Functions\n */\n\n function viewAll(event: React.MouseEvent) {\n event.preventDefault();\n\n history.push('/governance');\n }\n\n /**\n * Render\n */\n\n return (\n \n \n
\n

Governance

\n\n \n
\n\n {/* RENDER CHILDREN */}\n {props.children}\n
\n
\n );\n}\n","import {Link, useHistory} from 'react-router-dom';\nimport LinesEllipsis from 'react-lines-ellipsis';\nimport responsiveHOC from 'react-lines-ellipsis/lib/responsiveHOC';\n\nimport {isEthAddressValid} from '../../util/validation';\nimport {truncateEthAddress} from '../../util/helpers';\n\ntype ProposalCardProps = {\n buttonText?: string;\n /**\n * The path to link to. Defaults to `${location.pathname}/${proposalOnClickId}`.\n */\n linkPath?: string | ((id: string) => string);\n /**\n * Take arbitrary actions on click\n */\n onClick?: (proposalOnClickId: string) => void;\n /**\n * The ID for the proposal to be used for navigation.\n * As there can be a few different options, it's best to provide it\n * explicitly.\n */\n proposalOnClickId: string;\n name: string;\n /**\n * Render a custom status via render prop\n */\n renderStatus?: () => React.ReactNode;\n};\n\nconst DEFAULT_BUTTON_TEXT: string = 'View Proposal';\n\nconst ResponsiveEllipsis = responsiveHOC()(LinesEllipsis);\n\n/**\n * Shows a preview of a proposal's details\n *\n * @param {ProposalCardProps} props\n * @returns {JSX.Element}\n */\nexport default function ProposalCard(props: ProposalCardProps): JSX.Element {\n const {\n buttonText = DEFAULT_BUTTON_TEXT,\n proposalOnClickId,\n linkPath,\n onClick,\n name,\n renderStatus,\n } = props;\n\n /**\n * Their hooks\n */\n\n const {location} = useHistory();\n\n /**\n * Variables\n */\n\n const pathname: string = location.pathname === '/' ? '' : location.pathname;\n\n const path: string =\n typeof linkPath === 'function'\n ? linkPath(proposalOnClickId)\n : linkPath || `${pathname}/${proposalOnClickId}`;\n\n /**\n * Functions\n */\n\n function handleClick() {\n onClick?.(proposalOnClickId);\n }\n\n function renderName(name: string) {\n if (isEthAddressValid(name)) {\n return truncateEthAddress(name, 7);\n } else {\n return (\n \n );\n }\n }\n\n /**\n * Render\n */\n\n return (\n \n
\n {/* TITLE */}\n

{renderName(name)}

\n\n {/* E.G. VOTING PROGRESS STATUS AND BAR */}\n {renderStatus && renderStatus()}\n\n {/**\n * BUTTON (no click handler)\n *\n * @todo Set to a `` as `\n
\n \n );\n}\n","import React, {Fragment, useEffect, useState} from 'react';\n\nimport {AsyncStatus} from '../../util/types';\nimport {BURN_ADDRESS} from '../../util/constants';\nimport {normalizeString} from '../../util/helpers';\nimport {OffchainVotingStatus} from '../proposals/voting';\nimport {ProposalData, VotingResult} from '../proposals/types';\nimport {ProposalHeaderNames} from '../../util/enums';\nimport {useGovernanceProposals} from './hooks';\nimport {useIsDefaultChain} from '../web3/hooks';\nimport {useOffchainVotingResults} from '../proposals/hooks';\nimport ErrorMessageWithDetails from '../common/ErrorMessageWithDetails';\nimport LoaderLarge from '../feedback/LoaderLarge';\nimport ProposalCard from '../proposals/ProposalCard';\n\ntype GovernanceProposalsListProps = {\n /**\n * The `actionId` to get proposals for in Snapshot Hub.\n */\n actionId?: string;\n /**\n * Optionally provide a click handler for `ProposalCard`.\n * The proposal's id (in Snapshot) will be provided as an argument.\n * Defaults to noop: `() => {}`\n */\n onProposalClick?: (id: string) => void;\n /**\n * The path to link to. Defaults to `${location.pathname}/${proposalOnClickId}`.\n */\n proposalLinkPath?: Parameters['0']['linkPath'];\n /**\n * Optionally render a custom proposal card.\n */\n renderProposalCard?: (data: {\n proposalData: ProposalData;\n votingResult?: VotingResult;\n }) => React.ReactNode;\n};\n\ntype FilteredProposals = {\n failedProposals: ProposalData[];\n passedProposals: ProposalData[];\n votingProposals: ProposalData[];\n};\n\nexport default function GovernanceProposalsList(\n props: GovernanceProposalsListProps\n): JSX.Element {\n const {\n actionId = BURN_ADDRESS,\n onProposalClick = () => {},\n proposalLinkPath,\n renderProposalCard,\n } = props;\n\n /**\n * State\n */\n\n const [proposalsForVotingResults, setProposalsForVotingResults] = useState<\n ProposalData['snapshotProposal'][]\n >([]);\n const [filteredProposals, setFilteredProposals] = useState(\n {\n failedProposals: [],\n passedProposals: [],\n votingProposals: [],\n }\n );\n\n /**\n * Our hooks\n */\n\n const {\n governanceProposals,\n governanceProposalsError,\n governanceProposalsStatus,\n } = useGovernanceProposals({\n actionId,\n });\n\n const {\n offchainVotingResults,\n offchainVotingResultsError,\n offchainVotingResultsStatus,\n } = useOffchainVotingResults(proposalsForVotingResults);\n\n const {defaultChainError} = useIsDefaultChain();\n\n /**\n * Variables\n */\n\n const {failedProposals, passedProposals, votingProposals} = filteredProposals;\n\n const isLoading: boolean =\n governanceProposalsStatus === AsyncStatus.STANDBY ||\n governanceProposalsStatus === AsyncStatus.PENDING ||\n // Getting ready to fetch using `useOffchainVotingResults`; helps to show continuous loader.\n (offchainVotingResultsStatus === AsyncStatus.STANDBY &&\n proposalsForVotingResults.length > 0) ||\n offchainVotingResultsStatus === AsyncStatus.PENDING;\n\n const error: Error | undefined =\n governanceProposalsError || offchainVotingResultsError || defaultChainError;\n\n /**\n * Effects\n */\n\n useEffect(() => {\n setProposalsForVotingResults(\n governanceProposals.map((gp) => gp.snapshotProposal)\n );\n }, [governanceProposals]);\n\n // Separate proposals into categories: voting, passed, failed\n useEffect(() => {\n if (governanceProposalsStatus !== AsyncStatus.FULFILLED) return;\n\n const filteredProposalsToSet: FilteredProposals = {\n failedProposals: [],\n passedProposals: [],\n votingProposals: [],\n };\n\n governanceProposals.forEach((p) => {\n const end = p.snapshotProposal?.msg.payload.end || 0;\n const hasVoteEnded = end < Math.ceil(Date.now() / 1000);\n\n // voting proposal\n if (!hasVoteEnded) {\n filteredProposalsToSet.votingProposals.push(p);\n\n return;\n }\n\n const offchainResult = offchainVotingResults.find(\n ([proposalHash, _result]) =>\n normalizeString(proposalHash) ===\n normalizeString(p.snapshotProposal?.idInSnapshot || '')\n )?.[1];\n\n // Did the vote pass by a simple majority?\n const didPassSimpleMajority: boolean = offchainResult\n ? offchainResult.Yes.units > offchainResult.No.units\n : false;\n\n // passed proposal\n if (didPassSimpleMajority) {\n filteredProposalsToSet.passedProposals.push(p);\n\n return;\n }\n\n // failed proposal\n if (!didPassSimpleMajority) {\n filteredProposalsToSet.failedProposals.push(p);\n\n return;\n }\n });\n\n setFilteredProposals((prevState) => ({\n ...prevState,\n ...filteredProposalsToSet,\n }));\n }, [governanceProposals, governanceProposalsStatus, offchainVotingResults]);\n\n /**\n * Functions\n */\n\n function renderProposalCards(\n proposals: ProposalData[]\n ): React.ReactNode | null {\n return proposals.map((proposal) => {\n const {snapshotProposal} = proposal;\n const proposalId = snapshotProposal?.idInSnapshot;\n const proposalName = snapshotProposal?.msg.payload.name || '';\n\n const votingStartMs: number =\n Number(snapshotProposal?.msg.payload.start || 0) * 1000;\n\n const votingEndMs: number =\n Number(snapshotProposal?.msg.payload.end || 0) * 1000;\n\n if (!proposalId) return null;\n\n const offchainResult = offchainVotingResults.find(\n ([proposalHash, _result]) =>\n normalizeString(proposalHash) === normalizeString(proposalId)\n )?.[1];\n\n if (renderProposalCard) {\n return (\n \n {renderProposalCard({\n proposalData: proposal,\n votingResult: offchainResult,\n })}\n \n );\n }\n\n return (\n (\n \n )}\n />\n );\n });\n }\n\n /**\n * Render\n */\n\n // Render loading\n if (isLoading && !error) {\n return (\n
\n \n
\n );\n }\n\n // Render no proposals\n if (\n !governanceProposals.length &&\n !Object.values(filteredProposals).flatMap((p) => p).length &&\n governanceProposalsStatus === AsyncStatus.FULFILLED\n ) {\n return

No proposals, yet!

;\n }\n\n // Render error\n if (error) {\n return (\n
\n \n
\n );\n }\n\n return (\n
\n {/* VOTING PROPOSALS */}\n {votingProposals.length > 0 && (\n <>\n
{ProposalHeaderNames.VOTING}
\n
\n {renderProposalCards(votingProposals)}\n
\n \n )}\n\n {/* PASSED PROPOSALS */}\n {passedProposals.length > 0 && (\n <>\n
{ProposalHeaderNames.PASSED}
\n
\n {renderProposalCards(passedProposals)}\n
\n \n )}\n\n {/* FAILED PROPOSALS */}\n {failedProposals.length > 0 && (\n <>\n
{ProposalHeaderNames.FAILED}
\n
\n {renderProposalCards(failedProposals)}\n
\n \n )}\n
\n );\n}\n","import {useCallback, useEffect, useState} from 'react';\nimport {\n SnapshotProposalResponse,\n SnapshotType,\n} from '@openlaw/snapshot-js-erc712';\n\nimport {AsyncStatus} from '../../../util/types';\nimport {BURN_ADDRESS} from '../../../util/constants';\nimport {ProposalData} from '../../proposals/types';\nimport {SNAPSHOT_HUB_API_URL, SPACE} from '../../../config';\nimport {useIsMounted} from '../../../hooks';\n\ntype UseGovernanceProposalsReturn = {\n governanceProposals: ProposalData[];\n governanceProposalsStatus: AsyncStatus;\n governanceProposalsError: Error | undefined;\n};\n\n/**\n * useGovernanceProposals\n *\n * Provides an array of id->proposal tuples of governance-style proposals which are not submitted on-chain.\n *\n * @param {{actionId : string}}\n * - `actionId`: Name of the ERC-712 `actionId` to get Governance proposals by. Defaults to `BURN_ADDRESS`.\n * @returns `UseGovernanceProposalsReturn` An object with the governance proposals, and the current async status.\n */\nexport function useGovernanceProposals({\n actionId = BURN_ADDRESS,\n}: {\n actionId?: string;\n}): UseGovernanceProposalsReturn {\n /**\n * State\n */\n\n const [governanceProposals, setGovernanceProposals] = useState<\n ProposalData[]\n >([]);\n const [governanceProposalsError, setGovernanceProposalsError] =\n useState();\n const [governanceProposalsStatus, setGovernanceProposalsStatus] =\n useState(AsyncStatus.STANDBY);\n\n /**\n * Our hooks\n */\n\n const {isMountedRef} = useIsMounted();\n\n /**\n * Cached callbacks\n */\n\n const handleGetProposalsCached = useCallback(handleGetProposals, [\n actionId,\n isMountedRef,\n ]);\n\n /**\n * Effects\n */\n\n useEffect(() => {\n handleGetProposalsCached();\n }, [handleGetProposalsCached]);\n\n /**\n * Functions\n */\n\n /**\n * Gets Proposals from Snapshot Hub\n */\n async function getSnapshotProposalsByActionId(\n actionId: string\n ): Promise {\n try {\n const baseURL = `${SNAPSHOT_HUB_API_URL}/api/${SPACE}`;\n\n const proposals = await fetch(\n `${baseURL}/proposals/${actionId}?includeVotes=true`\n );\n\n if (!proposals.ok) {\n throw new Error(\n 'Something went wrong while fetching the Snapshot proposals.'\n );\n }\n\n const proposalsJSON: SnapshotProposalResponse = await proposals.json();\n\n /**\n * @note The id of the proposal is used and we do not consider any Draft id,\n * as we do for Snapshot->on-chain proposals.\n *\n * @todo Fix type of return so we don't need to add so many empty key/value pairs.\n */\n return Object.entries(proposalsJSON).map(\n ([id, snapshotProposal]): ProposalData => ({\n daoProposal: undefined,\n snapshotDraft: undefined,\n snapshotProposal: {\n ...snapshotProposal,\n idInSnapshot: id,\n idInDAO: '',\n },\n getCommonSnapshotProposalData: () => undefined,\n refetchProposalOrDraft: () => undefined,\n snapshotType: SnapshotType.proposal,\n })\n );\n } catch (error) {\n throw error;\n }\n }\n\n async function handleGetProposals() {\n try {\n setGovernanceProposalsStatus(AsyncStatus.PENDING);\n\n const snapshotProposalEntries = await getSnapshotProposalsByActionId(\n actionId\n );\n\n if (!isMountedRef.current) return;\n\n setGovernanceProposalsStatus(AsyncStatus.FULFILLED);\n setGovernanceProposals(snapshotProposalEntries);\n } catch (error) {\n if (!isMountedRef.current) return;\n\n setGovernanceProposalsStatus(AsyncStatus.REJECTED);\n setGovernanceProposals([]);\n setGovernanceProposalsError(error);\n }\n }\n\n return {\n governanceProposals,\n governanceProposalsError,\n governanceProposalsStatus,\n };\n}\n","import React from 'react';\nimport {useHistory} from 'react-router-dom';\n\nimport {BURN_ADDRESS} from '../../util/constants';\nimport FadeIn from '../../components/common/FadeIn';\nimport GovernanceProposalsList from '../../components/governance/GovernanceProposalsList';\nimport Wrap from '../../components/common/Wrap';\n\nexport default function GovernanceProposals() {\n /**\n * Functions\n */\n\n function proposalLinkPath(id: string) {\n return `/governance/${id}`;\n }\n\n /**\n * Render\n */\n\n return (\n \n \n \n );\n}\n\nfunction RenderWrapper(props: React.PropsWithChildren): JSX.Element {\n /**\n * Their hooks\n */\n\n const history = useHistory();\n\n /**\n * Functions\n */\n\n function goToNewProposal(event: React.MouseEvent) {\n event.preventDefault();\n history.push('/governance-proposal');\n }\n\n /**\n * Render\n */\n\n return (\n \n \n
\n

Governance

\n \n
\n\n {/* RENDER CHILDREN */}\n {props.children}\n
\n
\n );\n}\n","import {useCallback, useEffect, useState} from 'react';\nimport {useLazyQuery} from '@apollo/react-hooks';\nimport {useSelector} from 'react-redux';\nimport {AbiItem, toBN, toChecksumAddress} from 'web3-utils';\n\nimport {AsyncStatus} from '../../../util/types';\nimport {GET_MEMBERS} from '../../../gql';\nimport {Member} from '../types';\nimport {multicall, MulticallTuple} from '../../../components/web3/helpers';\nimport {normalizeString} from '../../../util/helpers';\nimport {StoreState} from '../../../store/types';\nimport {SubgraphNetworkStatus} from '../../../store/subgraphNetworkStatus/types';\nimport {UNITS_ADDRESS} from '../../../config';\nimport {useWeb3Modal} from '../../../components/web3/hooks';\n\ntype UseMembersReturn = {\n members: Member[];\n membersError: Error | undefined;\n membersStatus: AsyncStatus;\n};\n\n/**\n * useMembers\n *\n * Gets DAO members from subgraph with direct onchain fallback.\n *\n * @returns {UseMembersReturn} An object with the members and the current async status.\n */\nexport default function useMembers(): UseMembersReturn {\n /**\n * Selectors\n */\n\n const DaoRegistryContract = useSelector(\n (state: StoreState) => state.contracts.DaoRegistryContract\n );\n const BankExtensionContract = useSelector(\n (state: StoreState) => state.contracts.BankExtensionContract\n );\n const subgraphNetworkStatus = useSelector(\n (state: StoreState) => state.subgraphNetworkStatus.status\n );\n\n /**\n * Our hooks\n */\n\n const {web3Instance} = useWeb3Modal();\n\n /**\n * GQL Query\n */\n\n const [getMembersFromSubgraphResult, {called, loading, data, error}] =\n useLazyQuery(GET_MEMBERS, {\n variables: {\n daoAddress: DaoRegistryContract?.contractAddress.toLowerCase(),\n },\n });\n\n /**\n * State\n */\n\n const [members, setMembers] = useState([]);\n const [membersStatus, setMembersStatus] = useState(\n AsyncStatus.STANDBY\n );\n const [membersError, setMembersError] = useState();\n\n /**\n * Cached callbacks\n */\n\n const getMembersFromRegistryCached = useCallback(getMembersFromRegistry, [\n BankExtensionContract,\n DaoRegistryContract,\n web3Instance,\n ]);\n\n const getMembersFromSubgraphCached = useCallback(getMembersFromSubgraph, [\n data,\n error,\n getMembersFromRegistryCached,\n loading,\n ]);\n\n /**\n * Effects\n */\n\n useEffect(() => {\n if (!called) {\n getMembersFromSubgraphResult();\n }\n }, [called, getMembersFromSubgraphResult]);\n\n useEffect(() => {\n if (subgraphNetworkStatus === SubgraphNetworkStatus.OK) {\n if (!loading && DaoRegistryContract?.contractAddress) {\n getMembersFromSubgraphCached();\n }\n } else {\n // If there is a subgraph network error fallback to fetching members info\n // directly from smart contracts\n getMembersFromRegistryCached();\n }\n }, [\n DaoRegistryContract?.contractAddress,\n getMembersFromRegistryCached,\n getMembersFromSubgraphCached,\n loading,\n subgraphNetworkStatus,\n ]);\n\n /**\n * Functions\n */\n\n function getMembersFromSubgraph() {\n try {\n setMembersStatus(AsyncStatus.PENDING);\n\n if (!loading && data) {\n // extract members from gql data\n const {members} = data.tributeDaos[0] as Record;\n // Filter out any member that has fully ragequit (no positive balance in\n // UNITS)\n const filteredMembers = members.filter(\n (member: Record) => !member.didFullyRagequit\n );\n const filteredMembersWithDetails = filteredMembers.map(\n (member: Record) => {\n // remove gql data that is no longer needed\n const {createdAt, didFullyRagequit, ...parsedMember} = member;\n\n return {\n ...parsedMember,\n // use formatted addresses\n address: toChecksumAddress(member.address),\n delegateKey: toChecksumAddress(member.delegateKey),\n };\n }\n );\n\n setMembersStatus(AsyncStatus.FULFILLED);\n setMembers(filteredMembersWithDetails);\n } else {\n if (error) {\n throw new Error(error.message);\n }\n }\n } catch (error) {\n // If there is a subgraph query error fallback to fetching members info\n // directly from smart contracts\n console.log(`subgraph query error: ${error.message}`);\n getMembersFromRegistryCached();\n }\n }\n\n async function getMembersFromRegistry() {\n if (!DaoRegistryContract || !BankExtensionContract || !web3Instance) {\n return;\n }\n\n try {\n setMembersStatus(AsyncStatus.PENDING);\n\n const {\n abi: daoRegistryABI,\n contractAddress: daoRegistryAddress,\n instance: {methods: daoRegistryMethods},\n } = DaoRegistryContract;\n\n const nbMembers = await daoRegistryMethods.getNbMembers().call();\n\n if (Number(nbMembers) > 0) {\n // Build calls to get list of member addresses\n const getMemberAddressABI = daoRegistryABI.find(\n (item) => item.name === 'getMemberAddress'\n );\n const getMemberAddressCalls = [...Array(Number(nbMembers)).keys()].map(\n (index): MulticallTuple => [\n daoRegistryAddress,\n getMemberAddressABI as AbiItem,\n [index.toString()],\n ]\n );\n const memberAddresses: string[] = await multicall({\n calls: getMemberAddressCalls,\n web3Instance,\n });\n\n // Build calls to get list of member addresses by delegated key\n const memberAddressesByDelegatedKeyABI = daoRegistryABI.find(\n (item) => item.name === 'memberAddressesByDelegatedKey'\n );\n const memberAddressesByDelegatedKeyCalls = memberAddresses.map(\n (address): MulticallTuple => [\n daoRegistryAddress,\n memberAddressesByDelegatedKeyABI as AbiItem,\n [address],\n ]\n );\n const memberAddressesByDelegatedKey: string[] = await multicall({\n calls: memberAddressesByDelegatedKeyCalls,\n web3Instance,\n });\n\n // Build calls to get member balances in UNITS\n const {abi: bankABI, contractAddress: bankAddress} =\n BankExtensionContract;\n\n const balanceOfABI = bankABI.find((item) => item.name === 'balanceOf');\n const unitsBalanceOfCalls = memberAddressesByDelegatedKey.map(\n (address): MulticallTuple => [\n bankAddress,\n balanceOfABI as AbiItem,\n [address, UNITS_ADDRESS],\n ]\n );\n const unitsBalances: string[] = await multicall({\n calls: unitsBalanceOfCalls,\n web3Instance,\n });\n\n const membersWithDetails = memberAddresses.map((address, index) => ({\n address,\n delegateKey: memberAddressesByDelegatedKey[index],\n isDelegated:\n normalizeString(address) !==\n normalizeString(memberAddressesByDelegatedKey[index]),\n units: unitsBalances[index],\n }));\n\n // Filter out any member addresses that don't have a positive balance in\n // UNITS\n const filteredMembersWithDetails = membersWithDetails\n .filter((member) => toBN(member.units).gt(toBN(0)))\n // display in descending order of when the member joined (e.g., newest\n // member first)\n .reverse();\n\n setMembers(filteredMembersWithDetails);\n }\n\n setMembersStatus(AsyncStatus.FULFILLED);\n } catch (error) {\n setMembersStatus(AsyncStatus.REJECTED);\n setMembers([]);\n setMembersError(error);\n }\n }\n\n return {members, membersError, membersStatus};\n}\n","import {useState, useEffect, useCallback} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {useForm} from 'react-hook-form';\nimport {toChecksumAddress} from 'web3-utils';\n\nimport {\n useWeb3Modal,\n useContractSend,\n useETHGasPrice,\n} from '../../components/web3/hooks';\nimport {Web3TxStatus} from '../../components/web3/types';\nimport {TX_CYCLE_MESSAGES} from '../../components/web3/config';\nimport EtherscanURL from '../../components/web3/EtherscanURL';\nimport {FormFieldErrors} from '../../util/enums';\nimport {isEthAddressValid} from '../../util/validation';\nimport {getValidationError, truncateEthAddress} from '../../util/helpers';\nimport {BURN_ADDRESS} from '../../util/constants';\nimport {getConnectedMember} from '../../store/actions';\nimport {ReduxDispatch, StoreState} from '../../store/types';\nimport {CheckboxSize} from '../../components/common/Checkbox';\nimport Loader from '../../components/feedback/Loader';\nimport CycleMessage from '../../components/feedback/CycleMessage';\nimport Modal from '../../components/common/Modal';\nimport TimesSVG from '../../assets/svg/TimesSVG';\nimport UserSVG from '../../assets/svg/UserSVG';\nimport FadeIn from '../../components/common/FadeIn';\nimport InputError from '../../components/common/InputError';\nimport ErrorMessageWithDetails from '../../components/common/ErrorMessageWithDetails';\n\nenum DelegationStatus {\n DELEGATE_VOTES = 'Delegate Votes',\n REVOKE_DELEGATION = 'Revoke Delegation',\n}\n\nenum DelegationStep {\n SET_DELEGATION = 'setDelegation',\n REVOKE_DELEGATION = 'revokeDelegation',\n}\n\nenum Fields {\n delegateAddress = 'delegateAddress',\n confirmDelegation = 'confirmDelegation',\n}\n\ntype Steps = 'setDelegation' | 'revokeDelegation';\n\ntype StepsType = {[S in Steps]: () => JSX.Element};\n\ntype FormInputs = {\n delegateAddress: string;\n confirmDelegation: boolean;\n};\n\ntype UpdateDelegateKeyArguments = [\n string, // `dao`\n string // `delegateKey`\n];\n\ntype DelegationModalProps = {\n isOpen: boolean;\n closeHandler: () => void;\n currentStep: string;\n};\n\nfunction DelegationModal({\n isOpen,\n closeHandler,\n currentStep,\n}: DelegationModalProps): JSX.Element {\n /**\n * Selectors\n */\n\n const daoRegistryContract = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract\n );\n const daoRegistryAdapterContract = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryAdapterContract\n );\n const connectedMember = useSelector((s: StoreState) => s.connectedMember);\n\n /**\n * Our hooks\n */\n\n const {account, web3Instance} = useWeb3Modal();\n const {fast: fastGasPrice} = useETHGasPrice();\n const {txError, txEtherscanURL, txIsPromptOpen, txSend, txStatus} =\n useContractSend();\n\n /**\n * Their hooks\n */\n\n const form = useForm({\n mode: 'onBlur',\n reValidateMode: 'onChange',\n });\n const dispatch = useDispatch();\n\n /**\n * State\n */\n\n const [submitError, setSubmitError] = useState();\n\n /**\n * Variables\n */\n\n const {errors, getValues, register, trigger, watch} = form;\n const isInProcess =\n txStatus === Web3TxStatus.AWAITING_CONFIRM ||\n txStatus === Web3TxStatus.PENDING;\n const isDone = txStatus === Web3TxStatus.FULFILLED;\n const isInProcessOrDone = isInProcess || isDone || txIsPromptOpen;\n const delegateError = submitError || txError;\n\n const delegateAddressValue = watch(Fields.delegateAddress);\n const confirmDelegationValue = watch(Fields.confirmDelegation);\n const isFormFieldEmpty = !delegateAddressValue || !confirmDelegationValue;\n const steps: StepsType = {\n setDelegation: renderSetDelegation,\n revokeDelegation: renderRevokeDelegation,\n };\n\n /**\n * Functions\n */\n\n function renderCurrentStep() {\n return steps[currentStep]();\n }\n\n function renderSetDelegation() {\n return (\n <>\n {/* TITLE */}\n
Delegate
\n\n

Transfer your voting rights

\n
\n
e.preventDefault()}>\n {/* DELEGATE ADDRESS */}\n
\n
\n {\n return !delegateAddress\n ? FormFieldErrors.REQUIRED\n : !isEthAddressValid(delegateAddress) ||\n delegateAddress === BURN_ADDRESS\n ? FormFieldErrors.INVALID_ETHEREUM_ADDRESS\n : true;\n },\n })}\n type=\"text\"\n disabled={isInProcessOrDone}\n placeholder=\"Enter delegate address\"\n />\n\n {getValidationError(Fields.delegateAddress, errors).includes(\n 'invalid'\n ) && (\n \n )}\n
\n
\n\n {/* CONFIRM DELEGATION */}\n
\n
\n \n\n \n \n \n Confirm delegation to the above address. You can revoke this\n at any time from your profile.\n \n \n
\n
\n\n {/* SUBMIT */}\n {\n if (isInProcessOrDone) return;\n\n if (!(await trigger())) {\n return;\n }\n\n handleConfirmDelegation(getValues());\n }}\n type=\"submit\">\n {isInProcess ? : isDone ? 'Done' : 'Confirm'}\n \n\n {/* SUBMIT STATUS */}\n {isInProcessOrDone && (\n
\n {renderSubmitStatus()}\n
\n )}\n\n {/* SUBMIT ERROR */}\n {delegateError && (\n
\n \n
\n )}\n \n \n );\n }\n\n function renderRevokeDelegation() {\n if (connectedMember) {\n return (\n <>\n {/* TITLE */}\n
Revoke Delegation
\n\n

{truncateEthAddress(connectedMember.delegateKey, 7)}

\n
\n

\n \n Back to you\n

\n
\n You'll be able to resume voting from your account. You can\n delegate again at any time from your profile.\n
\n\n {/* SUBMIT */}\n \n {isInProcess ? : isDone ? 'Done' : 'Confirm'}\n \n\n {/* SUBMIT STATUS */}\n {isInProcessOrDone && (\n
\n {renderSubmitStatus()}\n
\n )}\n\n {/* SUBMIT ERROR */}\n {delegateError && (\n
\n \n
\n )}\n \n );\n }\n\n return <>;\n }\n\n async function handleConfirmDelegation(values: FormInputs) {\n try {\n if (!daoRegistryContract) {\n throw new Error('No DAO Registry contract was found.');\n }\n\n if (!daoRegistryAdapterContract) {\n throw new Error('No DAO Registry Adapter contract was found.');\n }\n\n if (!account) {\n throw new Error('No account found.');\n }\n\n if (!web3Instance) {\n throw new Error('No Web3 instance was found.');\n }\n\n const {delegateAddress} = values;\n\n const updateDelegateKeyArguments: UpdateDelegateKeyArguments = [\n daoRegistryContract.contractAddress,\n toChecksumAddress(delegateAddress),\n ];\n\n const txArguments = {\n from: account || '',\n ...(fastGasPrice ? {gasPrice: fastGasPrice} : null),\n };\n\n // Execute contract call for `updateDelegateKey`\n const tx = await txSend(\n 'updateDelegateKey',\n daoRegistryAdapterContract.instance.methods,\n updateDelegateKeyArguments,\n txArguments\n );\n\n if (tx) {\n setTimeout(async () => {\n // re-fetch member\n await dispatch(\n getConnectedMember({\n account,\n daoRegistryContract,\n web3Instance,\n })\n );\n\n closeHandler();\n }, 2000);\n }\n } catch (error) {\n console.log(error);\n let parsedError = error;\n\n if (\n error.message.includes('cannot overwrite existing delegated keys') ||\n error.message.includes('address already taken as delegated key')\n ) {\n parsedError = new Error(\n 'The provided address cannot be another member or already in use as a delegate.'\n );\n }\n\n setSubmitError(parsedError);\n }\n }\n\n async function handleRevokeDelegation() {\n try {\n if (!daoRegistryContract) {\n throw new Error('No DAO Registry contract was found.');\n }\n\n if (!daoRegistryAdapterContract) {\n throw new Error('No DAO Registry Adapter contract was found.');\n }\n\n if (!account) {\n throw new Error('No account found.');\n }\n\n if (!web3Instance) {\n throw new Error('No Web3 instance was found.');\n }\n\n const updateDelegateKeyArguments: UpdateDelegateKeyArguments = [\n daoRegistryContract.contractAddress,\n toChecksumAddress(account),\n ];\n\n const txArguments = {\n from: account || '',\n ...(fastGasPrice ? {gasPrice: fastGasPrice} : null),\n };\n\n // Execute contract call for `updateDelegateKey`\n const tx = await txSend(\n 'updateDelegateKey',\n daoRegistryAdapterContract.instance.methods,\n updateDelegateKeyArguments,\n txArguments\n );\n\n if (tx) {\n setTimeout(async () => {\n // re-fetch member\n await dispatch(\n getConnectedMember({\n account,\n daoRegistryContract,\n web3Instance,\n })\n );\n\n closeHandler();\n }, 2000);\n }\n } catch (error) {\n console.log(error);\n\n setSubmitError(error);\n }\n }\n\n function renderSubmitStatus(): React.ReactNode {\n switch (txStatus) {\n case Web3TxStatus.AWAITING_CONFIRM:\n return 'Awaiting your confirmation\\u2026';\n case Web3TxStatus.PENDING:\n return (\n <>\n {\n return {message};\n }}\n />\n\n \n \n );\n case Web3TxStatus.FULFILLED:\n return (\n <>\n
Submitted!
\n\n \n \n );\n default:\n return null;\n }\n }\n\n /**\n * Render\n */\n\n return (\n {}}\n modalClassNames=\"delegation-modal\">\n {/* MODEL CLOSE BUTTON */}\n {\n closeHandler();\n }}>\n \n \n {renderCurrentStep()}\n \n );\n}\n\nexport default function Delegation() {\n /**\n * Selectors\n */\n\n const connectedMember = useSelector((s: StoreState) => s.connectedMember);\n\n /**\n * State\n */\n\n const [currentStep, setCurrentStep] = useState(\n DelegationStep.SET_DELEGATION\n );\n const [delegationStatus, setDelegationStatus] = useState('');\n const [showDelegationModal, setShowDelegationModal] =\n useState(false);\n\n /**\n * Cached callbacks\n */\n\n const fetchDelegationInfoCached = useCallback(fetchDelegationInfo, [\n connectedMember,\n ]);\n\n /**\n * Effects\n */\n\n useEffect(() => {\n fetchDelegationInfoCached();\n }, [fetchDelegationInfoCached]);\n\n /**\n * Functions\n */\n\n async function fetchDelegationInfo() {\n try {\n if (!connectedMember) {\n throw new Error('No connected account found.');\n }\n\n const currentStep = connectedMember.isAddressDelegated\n ? DelegationStep.REVOKE_DELEGATION\n : DelegationStep.SET_DELEGATION;\n setCurrentStep(currentStep);\n\n const delegationStatus = connectedMember.isAddressDelegated\n ? DelegationStatus.REVOKE_DELEGATION\n : DelegationStatus.DELEGATE_VOTES;\n setDelegationStatus(delegationStatus);\n } catch (error) {\n console.log(error);\n }\n }\n\n /**\n * Render\n */\n\n if (connectedMember) {\n return (\n <>\n {delegationStatus !== '' && (\n <>\n
\n {connectedMember.isAddressDelegated ? (\n // CURRENT DELEGATION\n <>\n Your voting rights have been delegated to{' '}\n \n {truncateEthAddress(connectedMember.delegateKey, 7)}\n \n . You can revoke this at any time.\n \n ) : (\n <>\n You can delegate your voting rights to a different ETH\n address. The address cannot be another member or already in\n use as a delegate.\n \n )}\n
\n\n {/* OPEN DELEGATION MODAL BUTTON */}\n setShowDelegationModal(true)}>\n {delegationStatus}\n \n \n )}\n\n {showDelegationModal && (\n {\n setShowDelegationModal(false);\n }}\n currentStep={currentStep}\n />\n )}\n \n );\n }\n\n return <>;\n}\n","import {SVGAttributes} from 'react';\n\nexport default function CopySVG(props: SVGAttributes) {\n return (\n \n \n \n );\n}\n","import React from 'react';\n\nexport default function ArrowsSVG(props: React.SVGAttributes) {\n return (\n \n \n \n );\n}\n","import {truncateEthAddress} from '../../util/helpers/truncateEthAddress';\nimport CopySVG from '../../assets/svg/CopySVG';\nimport WalletSVG from '../../assets/svg/WalletSVG';\n\nexport type ERC20RegisterDetails = {\n address: string;\n symbol: string;\n decimals: number;\n image: string;\n};\n\ntype DaoTokenProps = {\n daoTokenDetails?: ERC20RegisterDetails;\n};\n\nexport default function DaoToken({\n daoTokenDetails,\n}: DaoTokenProps): JSX.Element {\n /**\n * Functions\n */\n\n async function addTokenToWallet() {\n if (!daoTokenDetails) return;\n\n try {\n await window.ethereum.request({\n method: 'wallet_watchAsset',\n params: {\n type: 'ERC20',\n options: daoTokenDetails,\n },\n });\n } catch (error) {\n console.log(error);\n }\n }\n\n function copyAddressToClipboard() {\n if (!daoTokenDetails) return;\n\n const copyText = document.createElement('input');\n document.body.appendChild(copyText);\n copyText.setAttribute('value', daoTokenDetails.address);\n copyText.select();\n document.execCommand('copy');\n document.body.removeChild(copyText);\n\n const tooltip = document.getElementById('copyTooltip');\n (tooltip as HTMLElement).innerHTML = 'copied!';\n }\n\n function resetCopyTooltip() {\n const tooltip = document.getElementById('copyTooltip');\n (tooltip as HTMLElement).innerHTML = 'copy address';\n }\n\n /**\n * Render\n */\n\n if (daoTokenDetails) {\n return (\n
\n Token: {truncateEthAddress(daoTokenDetails.address, 7)}\n
\n \n \n copy address\n \n \n \n
\n
\n \n
\n
\n );\n }\n\n return <>;\n}\n","import {SVGAttributes} from 'react';\n\nexport default function UserSVG(props: SVGAttributes) {\n return (\n \n \n \n );\n}\n","import {useEffect, useState} from 'react';\nimport {useHistory, useParams} from 'react-router-dom';\n\nimport {AsyncStatus} from '../../util/types';\nimport {Member} from './types';\nimport {\n truncateEthAddress,\n normalizeString,\n formatNumber,\n} from '../../util/helpers';\nimport {useIsDefaultChain, useWeb3Modal} from '../../components/web3/hooks';\nimport ErrorMessageWithDetails from '../../components/common/ErrorMessageWithDetails';\nimport FadeIn from '../../components/common/FadeIn';\nimport LoaderLarge from '../../components/feedback/LoaderLarge';\nimport useMembers from './hooks/useMembers';\nimport Wrap from '../../components/common/Wrap';\nimport {useDaoTokenDetails} from '../../components/dao-token/hooks';\nimport DaoToken from '../../components/dao-token/DaoToken';\nimport {useDaoTotalUnits} from '../../hooks';\nimport Delegation from './Delegation';\n\nexport default function MemberProfile() {\n /**\n * Our hooks\n */\n\n const {members, membersError, membersStatus} = useMembers();\n const {defaultChainError} = useIsDefaultChain();\n const {account} = useWeb3Modal();\n const {daoTokenDetails, daoTokenDetailsStatus} = useDaoTokenDetails();\n const {totalUnits, totalUnitsStatus} = useDaoTotalUnits();\n\n /**\n * Their hooks\n */\n\n // Get ethereumAddress for fetching the member.\n const {ethereumAddress} = useParams<{ethereumAddress: string}>();\n\n /**\n * State\n */\n\n const [memberDetails, setMemberDetails] = useState();\n const [memberNotFound, setMemberNotFound] = useState(false);\n\n /**\n * Effects\n */\n\n useEffect(() => {\n if (membersStatus !== AsyncStatus.FULFILLED) return;\n\n const activeMember = members.find(\n (member) =>\n normalizeString(member.address) === normalizeString(ethereumAddress)\n );\n\n setMemberDetails(activeMember);\n if (!activeMember) {\n setMemberNotFound(true);\n }\n }, [ethereumAddress, members, membersStatus]);\n\n /**\n * Variables\n */\n\n const isLoading: boolean =\n membersStatus === AsyncStatus.STANDBY ||\n membersStatus === AsyncStatus.PENDING ||\n daoTokenDetailsStatus === AsyncStatus.STANDBY ||\n daoTokenDetailsStatus === AsyncStatus.PENDING ||\n totalUnitsStatus === AsyncStatus.STANDBY ||\n totalUnitsStatus === AsyncStatus.PENDING;\n const isLoadingDone: boolean = membersStatus === AsyncStatus.FULFILLED;\n const error: Error | undefined = membersError || defaultChainError;\n const isCurrentMemberConnected: boolean =\n account &&\n memberDetails &&\n normalizeString(account) === normalizeString(memberDetails.address)\n ? true\n : false;\n const votingWeight =\n memberDetails && typeof totalUnits === 'number'\n ? ((Number(memberDetails.units) / totalUnits) * 100).toFixed(2)\n : '';\n\n /**\n * Functions\n */\n\n function renderMemberInfo() {\n if (!memberDetails) return;\n\n return (\n
\n
\n {daoTokenDetails ? (\n <>\n
DAO Tokens
\n
{`${formatNumber(memberDetails.units)} ${\n daoTokenDetails.symbol || 'tokens'\n }`}
\n {isCurrentMemberConnected && (\n \n \n \n )}\n \n ) : (\n <>\n
Membership Units
\n
{formatNumber(memberDetails.units)}
\n \n )}\n
\n
\n
Voting Weight
\n
{`${votingWeight}%`}
\n
\n
\n );\n }\n\n function renderMemberActions() {\n if (isCurrentMemberConnected) {\n return (\n
\n
\n
Delegation
\n \n
\n
\n );\n } else {\n return (\n
\n Connect your wallet with this member address to view available\n actions.\n
\n );\n }\n }\n\n /**\n * Render\n */\n\n // Render loading\n if (isLoading && !error) {\n return (\n \n
\n \n
\n
\n );\n }\n\n // Render error\n if (error) {\n return (\n \n
\n \n
\n
\n );\n }\n\n // Render no member found\n if (memberNotFound && isLoadingDone) {\n return (\n \n
\n

Member not found.

\n
\n
\n );\n }\n\n return (\n \n {memberDetails ? (\n <>\n
Member Profile
\n
\n {/* LEFT COLUMN */}\n\n
\n {/* MEMBER ADDRESS */}\n

{truncateEthAddress(memberDetails.address, 7)}

\n\n {/* MEMBER INFO */}\n {renderMemberInfo()}\n
\n\n {/* RIGHT COLUMN */}\n
\n {/* MEMBER ACTIONS */}\n {renderMemberActions()}\n
\n
\n \n ) : (\n // Render nothing. Should never reach this case.\n <>\n )}\n
\n );\n}\n\nfunction RenderWrapper(props: React.PropsWithChildren): JSX.Element {\n /**\n * Their hooks\n */\n\n const history = useHistory();\n\n /**\n * Functions\n */\n\n function viewAll(event: React.MouseEvent) {\n event.preventDefault();\n history.push('/members');\n }\n\n /**\n * Render\n */\n\n return (\n \n \n
\n

Members

\n \n
\n\n {/* RENDER CHILDREN */}\n {props.children}\n
\n
\n );\n}\n","import {Link} from 'react-router-dom';\nimport {Member} from './types';\n\nimport {truncateEthAddress} from '../../util/helpers';\nimport {useWeb3Modal} from '../../components/web3/hooks';\n\ntype MemberCardProps = {\n member: Member;\n to?: string;\n};\n\nconst DEFAULT_CARD_LINK: string = '#';\n\n/**\n * Shows a preview of a members's profile\n *\n * @param {MemberCardProps} props\n * @returns {JSX.Element}\n */\nexport default function MemberCard(props: MemberCardProps): JSX.Element {\n const {member, to = DEFAULT_CARD_LINK} = props;\n\n /**\n * Our hooks\n */\n\n const {account} = useWeb3Modal();\n\n /**\n * Render\n */\n\n return (\n \n \n {/* TITLE */}\n

\n {truncateEthAddress(member.address, 7)}\n

\n \n \n );\n}\n","import {AsyncStatus} from '../../util/types';\nimport {Member} from './types';\nimport {useIsDefaultChain} from '../../components/web3/hooks';\nimport ErrorMessageWithDetails from '../../components/common/ErrorMessageWithDetails';\nimport FadeIn from '../../components/common/FadeIn';\nimport LoaderLarge from '../../components/feedback/LoaderLarge';\nimport MemberCard from './MemberCard';\nimport useMembers from './hooks/useMembers';\nimport Wrap from '../../components/common/Wrap';\n\nexport default function Members() {\n /**\n * Our hooks\n */\n\n const {members, membersError, membersStatus} = useMembers();\n const {defaultChainError} = useIsDefaultChain();\n\n /**\n * Variables\n */\n\n const isLoading: boolean =\n membersStatus === AsyncStatus.STANDBY ||\n membersStatus === AsyncStatus.PENDING;\n\n const isLoadingDone: boolean = membersStatus === AsyncStatus.FULFILLED;\n\n const error: Error | undefined = membersError || defaultChainError;\n\n /**\n * Functions\n */\n\n function renderMemberCards(members: Member[]) {\n return members.map((member) => {\n return (\n \n );\n });\n }\n\n /**\n * Render\n */\n\n // Render loading\n if (isLoading && !error) {\n return (\n \n
\n \n
\n
\n );\n }\n\n // Render error\n if (error) {\n return (\n \n
\n \n
\n
\n );\n }\n\n // Render no members\n if (!Object.values(members).length && isLoadingDone) {\n return (\n \n

No members, yet!

\n
\n );\n }\n\n return (\n \n
\n {/* ACTIVE MEMBERS */}\n
\n
Active Members
\n
{renderMemberCards(members)}
\n
\n
\n
\n );\n}\n\nfunction RenderWrapper(props: React.PropsWithChildren): JSX.Element {\n /**\n * Render\n */\n\n return (\n \n \n
\n

Members

\n
\n {/* RENDER CHILDREN */}\n {props.children}\n
\n
\n );\n}\n","import React, {Fragment, useEffect, useState} from 'react';\n\nimport {\n DaoAdapterConstants,\n VotingAdapterName,\n} from '../adapters-extensions/enums';\nimport {\n calculateVotingTimeRanges,\n proposalHasFlag,\n proposalHasVotingState,\n} from './helpers';\nimport {AsyncStatus} from '../../util/types';\nimport {BURN_ADDRESS} from '../../util/constants';\nimport {ContractDAOConfigKeys} from '../web3/types';\nimport {normalizeString} from '../../util/helpers';\nimport {OffchainVotingStatus} from './voting';\nimport {ProposalData, ProposalFlag} from './types';\nimport {ProposalHeaderNames} from '../../util/enums';\nimport {useDaoConfigurations} from '../../hooks';\nimport {useIsDefaultChain} from '../web3/hooks';\nimport {useProposals, useOffchainVotingResults} from './hooks';\nimport {VotingState} from './voting/types';\nimport ErrorMessageWithDetails from '../common/ErrorMessageWithDetails';\nimport LoaderLarge from '../feedback/LoaderLarge';\nimport ProposalCard from './ProposalCard';\n\ntype ProposalsProps = {\n adapterName: DaoAdapterConstants;\n /**\n * Optionally provide a click handler for `ProposalCard`.\n * The proposal's id (in the DAO) will be provided as an argument.\n * Defaults to noop: `() => {}`\n */\n onProposalClick?: (id: string) => void;\n /**\n * The path to link to. Defaults to `${location.pathname}/${proposalOnClickId}`.\n */\n proposalLinkPath?: Parameters['0']['linkPath'];\n /**\n * Optionally render a custom proposal card.\n */\n renderProposalCard?: (data: {proposalData: ProposalData}) => React.ReactNode;\n /**\n * To handle proposal types where the first step is creating a snapshot\n * draft/offchain proposal only (no onchain proposal exists)\n */\n includeProposalsExistingOnlyOffchain?: boolean;\n};\n\ntype FilteredProposals = {\n failedProposals: ProposalData[];\n nonsponsoredProposals: ProposalData[];\n passedProposals: ProposalData[];\n votingProposals: ProposalData[];\n};\n\nconst configurationKeysToGet: ContractDAOConfigKeys[] = [\n ContractDAOConfigKeys.offchainVotingVotingPeriod,\n ContractDAOConfigKeys.offchainVotingGracePeriod,\n];\n\nexport default function Proposals(props: ProposalsProps): JSX.Element {\n const {\n adapterName,\n onProposalClick = () => {},\n proposalLinkPath,\n renderProposalCard,\n includeProposalsExistingOnlyOffchain = false,\n } = props;\n\n /**\n * State\n */\n\n const [proposalsForVotingResults, setProposalsForVotingResults] = useState<\n ProposalData['snapshotProposal'][]\n >([]);\n\n const [filteredProposals, setFilteredProposals] = useState(\n {\n failedProposals: [],\n nonsponsoredProposals: [],\n passedProposals: [],\n votingProposals: [],\n }\n );\n\n /**\n * Our hooks\n */\n\n const {\n daoConfigurations: [offchainVotingPeriod, offchainGracePeriod],\n } = useDaoConfigurations(configurationKeysToGet);\n\n const {proposals, proposalsError, proposalsStatus} = useProposals({\n adapterName,\n includeProposalsExistingOnlyOffchain,\n });\n\n const {\n offchainVotingResults,\n offchainVotingResultsError,\n offchainVotingResultsStatus,\n } = useOffchainVotingResults(proposalsForVotingResults);\n\n const {defaultChainError} = useIsDefaultChain();\n\n /**\n * Variables\n */\n\n const {\n failedProposals,\n nonsponsoredProposals,\n passedProposals,\n votingProposals,\n } = filteredProposals;\n\n const isLoading: boolean =\n proposalsStatus === AsyncStatus.STANDBY ||\n proposalsStatus === AsyncStatus.PENDING ||\n // Getting ready to fetch using `useOffchainVotingResults`; helps to show\n // continuous loader.\n (offchainVotingResultsStatus === AsyncStatus.STANDBY &&\n proposalsForVotingResults.length > 0) ||\n offchainVotingResultsStatus === AsyncStatus.PENDING;\n\n const error: Error | undefined =\n proposalsError || offchainVotingResultsError || defaultChainError;\n\n /**\n * Effects\n */\n\n useEffect(() => {\n setProposalsForVotingResults(proposals.map((p) => p.snapshotProposal));\n }, [proposals]);\n\n // Separate proposals into categories: non-sponsored, voting, passed, failed\n useEffect(() => {\n if (proposalsStatus !== AsyncStatus.FULFILLED) return;\n\n const filteredProposalsToSet: FilteredProposals = {\n failedProposals: [],\n nonsponsoredProposals: [],\n passedProposals: [],\n votingProposals: [],\n };\n\n proposals.forEach((p) => {\n const {\n daoProposal,\n daoProposalVotingState: voteState,\n daoProposalVote: votesData,\n } = p;\n\n if (!daoProposal) return;\n\n const noSnapshotVotes: boolean = p.snapshotProposal?.votes?.length === 0;\n\n const offchainResultNotYetSubmitted: boolean =\n voteState !== undefined &&\n (proposalHasVotingState(VotingState.GRACE_PERIOD, voteState) ||\n proposalHasVotingState(VotingState.TIE, voteState)) &&\n proposalHasFlag(ProposalFlag.SPONSORED, daoProposal.flags) &&\n votesData?.OffchainVotingContract?.reporter === BURN_ADDRESS;\n\n // Non-sponsored proposal\n if (voteState === undefined) {\n if (includeProposalsExistingOnlyOffchain) {\n filteredProposalsToSet.nonsponsoredProposals.push(p);\n } else if (proposalHasFlag(ProposalFlag.EXISTS, daoProposal.flags)) {\n filteredProposalsToSet.nonsponsoredProposals.push(p);\n }\n\n return;\n }\n\n // Passed proposal\n if (\n voteState !== undefined &&\n proposalHasVotingState(VotingState.PASS, voteState) &&\n (proposalHasFlag(ProposalFlag.SPONSORED, daoProposal.flags) ||\n proposalHasFlag(ProposalFlag.PROCESSED, daoProposal.flags))\n ) {\n filteredProposalsToSet.passedProposals.push(p);\n\n return;\n }\n\n const offchainResult = offchainVotingResults.find(\n ([proposalHash, _result]) =>\n normalizeString(proposalHash) ===\n normalizeString(p.snapshotProposal?.idInDAO || '')\n )?.[1];\n\n // Did the vote pass by a simple majority?\n const didPassSimpleMajority: boolean = offchainResult\n ? offchainResult.Yes.units > offchainResult.No.units\n : false;\n\n /**\n * Voting proposal: voting has ended, off-chain result was not submitted,\n * and there are votes with a passing result (need to submit to get true\n * \"passed\" result).\n *\n * @note For now, we can assume across all adapters that if the vote did\n * not pass then the result does not need to be submitted (proposal would\n * fall back to \"failed\" logic).\n *\n * @note Should be placed before \"failed\" logic.\n */\n if (\n offchainResultNotYetSubmitted &&\n noSnapshotVotes === false &&\n didPassSimpleMajority\n ) {\n filteredProposalsToSet.votingProposals.push(p);\n\n return;\n }\n\n // Failed proposal\n if (\n voteState !== undefined &&\n (proposalHasVotingState(VotingState.NOT_PASS, voteState) ||\n proposalHasVotingState(VotingState.TIE, voteState)) &&\n (proposalHasFlag(ProposalFlag.SPONSORED, daoProposal.flags) ||\n proposalHasFlag(ProposalFlag.PROCESSED, daoProposal.flags))\n ) {\n filteredProposalsToSet.failedProposals.push(p);\n\n return;\n }\n\n // Failed proposal: no Snapshot votes\n if (\n voteState !== undefined &&\n offchainResultNotYetSubmitted &&\n noSnapshotVotes\n ) {\n filteredProposalsToSet.failedProposals.push(p);\n\n return;\n }\n\n // Failed proposal: result not submitted; vote did not pass\n if (\n voteState !== undefined &&\n offchainResultNotYetSubmitted &&\n !didPassSimpleMajority\n ) {\n filteredProposalsToSet.failedProposals.push(p);\n\n return;\n }\n\n // Voting proposal\n if (\n voteState !== undefined &&\n (proposalHasVotingState(VotingState.GRACE_PERIOD, voteState) ||\n proposalHasVotingState(VotingState.IN_PROGRESS, voteState)) &&\n proposalHasFlag(ProposalFlag.SPONSORED, daoProposal.flags)\n ) {\n filteredProposalsToSet.votingProposals.push(p);\n\n return;\n }\n });\n\n setFilteredProposals((prevState) => ({\n ...prevState,\n ...filteredProposalsToSet,\n }));\n }, [\n includeProposalsExistingOnlyOffchain,\n offchainVotingResults,\n proposals,\n proposalsStatus,\n ]);\n\n /**\n * Functions\n */\n\n function renderProposalCards(\n proposals: ProposalData[]\n ): React.ReactNode | null {\n return proposals.map((proposal) => {\n const {\n daoProposalVote,\n daoProposalVotingAdapter,\n snapshotDraft,\n snapshotProposal,\n } = proposal;\n\n const proposalId = snapshotDraft?.idInDAO || snapshotProposal?.idInDAO;\n const votingAdapterName = daoProposalVotingAdapter?.votingAdapterName;\n\n let gracePeriodEndMs: number = 0;\n let gracePeriodStartMs: number = 0;\n let voteEndMs: number = 0;\n let voteStartMs: number = 0;\n\n switch (votingAdapterName) {\n case VotingAdapterName.OffchainVotingContract:\n const {startingTime, gracePeriodStartingTime} =\n daoProposalVote?.[VotingAdapterName.OffchainVotingContract] || {};\n\n const times = calculateVotingTimeRanges({\n gracePeriodLength: offchainGracePeriod,\n gracePeriodStartingTime,\n votePeriodLength: offchainVotingPeriod,\n voteStartingTime: startingTime,\n });\n\n gracePeriodEndMs = times.gracePeriodEndMs;\n gracePeriodStartMs = times.gracePeriodStartMs;\n voteEndMs = times.voteEndMs;\n voteStartMs = times.voteStartMs;\n\n break;\n\n // @todo On-chain Voting\n // case VotingAdapterName.VotingContract:\n // return <>\n default:\n break;\n }\n\n if (!proposalId) return null;\n\n if (renderProposalCard) {\n return (\n \n {renderProposalCard({proposalData: proposal})}\n \n );\n }\n\n const proposalName =\n snapshotDraft?.msg.payload.name ||\n snapshotProposal?.msg.payload.name ||\n '';\n\n const votingResult = offchainVotingResults.find(\n ([proposalHash, _result]) =>\n normalizeString(proposalHash) === normalizeString(proposalId)\n )?.[1];\n\n return (\n {\n switch (votingAdapterName) {\n case VotingAdapterName.OffchainVotingContract:\n return (\n \n );\n // @todo On-chain Voting\n // case VotingAdapterName.VotingContract:\n // return <>\n default:\n return <>;\n }\n }}\n />\n );\n });\n }\n\n /**\n * Render\n */\n\n // Render loading\n if (isLoading && !error) {\n return (\n
\n \n
\n );\n }\n\n // Render error\n if (error) {\n return (\n
\n \n
\n );\n }\n\n // Render no proposals\n if (\n !Object.values(filteredProposals).flatMap((p) => p).length &&\n proposalsStatus === AsyncStatus.FULFILLED\n ) {\n return

No proposals, yet!

;\n }\n\n // Render proposals\n return (\n
\n {/* VOTING PROPOSALS */}\n {votingProposals.length > 0 && (\n <>\n
{ProposalHeaderNames.VOTING}
\n
\n {renderProposalCards(votingProposals)}\n
\n \n )}\n\n {/* PENDING PROPOSALS (DRAFTS, NOT SPONSORED) */}\n {nonsponsoredProposals.length > 0 && (\n <>\n
{ProposalHeaderNames.REQUESTS}
\n
\n {renderProposalCards(nonsponsoredProposals)}\n
\n \n )}\n\n {/* PASSED PROPOSALS */}\n {passedProposals.length > 0 && (\n <>\n
{ProposalHeaderNames.PASSED}
\n
\n {renderProposalCards(passedProposals)}\n
\n \n )}\n\n {/* FAILED PROPOSALS */}\n {failedProposals.length > 0 && (\n <>\n
{ProposalHeaderNames.FAILED}
\n
\n {renderProposalCards(failedProposals)}\n
\n \n )}\n
\n );\n}\n","import React from 'react';\nimport {useHistory} from 'react-router-dom';\n\nimport {DaoAdapterConstants} from '../../components/adapters-extensions/enums';\nimport FadeIn from '../../components/common/FadeIn';\nimport Proposals from '../../components/proposals/Proposals';\nimport Wrap from '../../components/common/Wrap';\n\nexport default function Membership() {\n /**\n * Functions\n */\n\n function proposalLinkPath(id: string) {\n return `/membership/${id}`;\n }\n\n /**\n * Render\n */\n\n return (\n \n \n \n );\n}\n\nfunction RenderWrapper(props: React.PropsWithChildren): JSX.Element {\n /**\n * Their hooks\n */\n\n const history = useHistory();\n\n /**\n * Functions\n */\n\n function viewMembers(event: React.MouseEvent) {\n event.preventDefault();\n history.push('/members');\n }\n\n /**\n * Render\n */\n\n return (\n \n \n
\n

Membership

\n \n
\n\n {/* RENDER CHILDREN */}\n {props.children}\n
\n
\n );\n}\n","import {useState, useRef, useEffect, useCallback} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {CycleEllipsis} from '../feedback';\nimport {useDaoTokenDetails} from '../dao-token/hooks';\nimport {getConnectedMember} from '../../store/actions';\nimport {ProposalData, SnapshotProposal} from './types';\nimport {ReduxDispatch, StoreState} from '../../store/types';\nimport {TX_CYCLE_MESSAGES} from '../web3/config';\nimport {useContractSend, useETHGasPrice, useWeb3Modal} from '../web3/hooks';\nimport {useMemberActionDisabled} from '../../hooks';\nimport {Web3TxStatus} from '../web3/types';\nimport CycleMessage from '../feedback/CycleMessage';\nimport ErrorMessageWithDetails from '../common/ErrorMessageWithDetails';\nimport EtherscanURL from '../web3/EtherscanURL';\nimport FadeIn from '../common/FadeIn';\nimport Loader from '../feedback/Loader';\n\ntype ProcessArguments = [\n string, // `dao`\n string // `proposalId`\n];\n\ntype ProcessActionMembershipProps = {\n disabled?: boolean;\n proposal: ProposalData;\n};\n\ntype ActionDisabledReasons = {\n notProposerMessage: string;\n};\n\n/**\n * Cached outside the component to prevent infinite re-renders.\n *\n * The same can be accomplished inside the component using\n * `useState`, `useRef`, etc., depending on the use case.\n */\nconst useMemberActionDisabledProps = {\n // Anyone can process a proposal - it's just a question of gas payment.\n skipIsActiveMemberCheck: true,\n};\n\nexport default function ProcessActionMembership(\n props: ProcessActionMembershipProps\n) {\n const {\n disabled: propsDisabled,\n proposal: {snapshotProposal},\n } = props;\n\n /**\n * State\n */\n\n const [submitError, setSubmitError] = useState();\n const [membershipProposalAmount, setMembershipProposalAmount] =\n useState();\n\n /**\n * Refs\n */\n\n const actionDisabledReasonsRef = useRef({\n notProposerMessage: '',\n });\n\n /**\n * Selectors\n */\n\n const OnboardingContract = useSelector(\n (s: StoreState) => s.contracts?.OnboardingContract\n );\n const daoRegistryContract = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract\n );\n\n /**\n * Our hooks\n */\n\n const {account, web3Instance} = useWeb3Modal();\n const {txEtherscanURL, txIsPromptOpen, txSend, txStatus} = useContractSend();\n const {\n isDisabled,\n openWhyDisabledModal,\n WhyDisabledModal,\n setOtherDisabledReasons,\n } = useMemberActionDisabled(useMemberActionDisabledProps);\n const {fast: fastGasPrice} = useETHGasPrice();\n const {daoTokenDetails} = useDaoTokenDetails();\n\n /**\n * Their hooks\n */\n\n const dispatch = useDispatch();\n\n /**\n * Variables\n */\n\n const isInProcess =\n txStatus === Web3TxStatus.AWAITING_CONFIRM ||\n txStatus === Web3TxStatus.PENDING;\n const isDone = txStatus === Web3TxStatus.FULFILLED;\n const isInProcessOrDone = isInProcess || isDone || txIsPromptOpen;\n const areSomeDisabled = isDisabled || isInProcessOrDone || propsDisabled;\n\n /**\n * Cached callbacks\n */\n\n const getMembershipProposalAmountCached = useCallback(\n getMembershipProposalAmount,\n [OnboardingContract, daoRegistryContract?.contractAddress, snapshotProposal]\n );\n\n /**\n * Effects\n */\n\n useEffect(() => {\n getMembershipProposalAmountCached();\n }, [getMembershipProposalAmountCached]);\n\n useEffect(() => {\n // 1. Determine and set reasons why action would be disabled\n\n // Reason: For some proposal types, a passed proposal can only be\n // processed by its original proposer (e.g., the owner of the asset to be\n // transferred)\n\n // Proposals with this restriction will have this value stored in its\n // snapshot metadata.\n const {accountAuthorizedToProcessPassedProposal} = (\n snapshotProposal as SnapshotProposal\n ).msg.payload.metadata;\n\n if (accountAuthorizedToProcessPassedProposal && account) {\n actionDisabledReasonsRef.current = {\n ...actionDisabledReasonsRef.current,\n notProposerMessage:\n accountAuthorizedToProcessPassedProposal.toLowerCase() !==\n account.toLowerCase()\n ? 'Only the original proposer can process the proposal.'\n : '',\n };\n }\n\n // 2. Set reasons\n setOtherDisabledReasons(Object.values(actionDisabledReasonsRef.current));\n }, [account, setOtherDisabledReasons, snapshotProposal]);\n\n /**\n * Functions\n */\n\n async function getMembershipProposalAmount() {\n try {\n if (!snapshotProposal || !OnboardingContract) return;\n\n const proposalDetails = await OnboardingContract.instance.methods\n .proposals(\n daoRegistryContract?.contractAddress,\n snapshotProposal.idInDAO\n )\n .call();\n\n setMembershipProposalAmount(proposalDetails.amount);\n } catch (error) {\n console.error(error);\n setMembershipProposalAmount(undefined);\n }\n }\n\n async function handleSubmit() {\n try {\n if (!daoRegistryContract) {\n throw new Error('No DAO Registry contract was found.');\n }\n\n if (!snapshotProposal) {\n throw new Error('No Snapshot proposal was found.');\n }\n\n if (!OnboardingContract) {\n throw new Error('No OnboardingContract found.');\n }\n\n if (!account) {\n throw new Error('No account found.');\n }\n\n if (!web3Instance) {\n throw new Error('No Web3 instance was found.');\n }\n\n const processArguments: ProcessArguments = [\n daoRegistryContract.contractAddress,\n snapshotProposal.idInDAO,\n ];\n\n const txArguments = {\n from: account || '',\n value: membershipProposalAmount,\n ...(fastGasPrice ? {gasPrice: fastGasPrice} : null),\n };\n\n const tx = await txSend(\n 'processProposal',\n OnboardingContract.instance.methods,\n processArguments,\n txArguments\n );\n\n if (tx) {\n // re-fetch member\n await dispatch(\n getConnectedMember({\n account,\n daoRegistryContract,\n web3Instance,\n })\n );\n\n // if connected account is the applicant (the address that will receive\n // the membership units) suggest adding DAO token to wallet\n if (\n account.toLowerCase() ===\n snapshotProposal.msg.payload.metadata.submitActionArgs[0].toLowerCase()\n ) {\n await addTokenToWallet();\n }\n }\n } catch (error) {\n setSubmitError(error);\n }\n }\n\n async function addTokenToWallet() {\n if (!daoTokenDetails) return;\n\n try {\n await window.ethereum.request({\n method: 'wallet_watchAsset',\n params: {\n type: 'ERC20',\n options: daoTokenDetails,\n },\n });\n } catch (error) {\n console.log(error);\n }\n }\n\n /**\n * Render\n */\n\n function renderSubmitStatus(): React.ReactNode {\n // process proposal transaction statuses\n switch (txStatus) {\n case Web3TxStatus.AWAITING_CONFIRM:\n return (\n <>\n Confirm to process the proposal\n \n \n );\n case Web3TxStatus.PENDING:\n return (\n <>\n {\n return {message};\n }}\n />\n\n \n \n );\n case Web3TxStatus.FULFILLED:\n return (\n <>\n
Proposal submitted!
\n\n \n \n );\n default:\n return null;\n }\n }\n\n return (\n <>\n
\n {} : handleSubmit}>\n {isInProcess ? : isDone ? 'Done' : 'Process'}\n \n\n \n\n {/* SUBMIT STATUS */}\n\n {isInProcessOrDone && (\n
\n {renderSubmitStatus()}\n
\n )}\n\n {isDisabled && (\n \n Why is processing disabled?\n \n )}\n
\n\n \n \n );\n}\n","import {lazy, Suspense} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {ContractAdapterNames} from '../web3/types';\nimport {CycleEllipsis} from '../feedback';\nimport {ProposalData, RenderActionPropArguments} from './types';\nimport {StoreState} from '../../store/types';\nimport {VotingAdapterName} from '../adapters-extensions/enums';\nimport ErrorMessageWithDetails from '../common/ErrorMessageWithDetails';\n\ntype ProposalActionsProps = {\n adapterName: ContractAdapterNames;\n proposal: ProposalData;\n /**\n * A render prop which can render any action desired.\n * It is passed inner state and data from\n * the child action wrapper component.\n *\n * - If it renders `null`, it will fall back to the component's actions.\n * - If it renders `<>` (`React.Fragment`) then nothing is shown in the UI.\n */\n renderAction?: (data: RenderActionPropArguments) => React.ReactNode;\n};\n\n/**\n * Lazy load action component tree\n */\nconst ProposalWithOffchainVoteActions = lazy(\n () => import('./ProposalWithOffchainVoteActions')\n);\n\nconst fadeInProps = {duration: 150};\nconst cycleEllipsisStyles = {\n display: 'inline-block',\n width: '100%',\n fontSize: '1.5rem',\n};\n\n/**\n * ProposalActions\n *\n * A container for various propsal action flows.\n * Which flow is chosen is determined by either the proposal's,\n * or the DAO's, voting adapter name.\n *\n * @param {ProposalActionsProps} props\n * @returns {JSX.Element}\n */\nexport default function ProposalActions(\n props: ProposalActionsProps\n): JSX.Element {\n const {adapterName, proposal, renderAction} = props;\n\n /**\n * Selectors\n */\n\n const daoVotingAdapterName = useSelector(\n (s: StoreState) => s.contracts.VotingContract?.adapterOrExtensionName\n ) as VotingAdapterName | undefined;\n\n /**\n * Variables\n */\n\n // Use the proposal's voting adapter (has been sponsored), or fall back to the DAO's (not-yet-sponsored).\n const votingAdapterName: VotingAdapterName | undefined =\n proposal.daoProposalVotingAdapter?.votingAdapterName ||\n daoVotingAdapterName;\n\n /**\n * Functions\n */\n\n function renderActions() {\n if (!votingAdapterName) {\n return <>;\n }\n\n switch (votingAdapterName) {\n case VotingAdapterName.OffchainVotingContract:\n return (\n \n );\n\n // @todo On-chain Voting\n case VotingAdapterName.VotingContract:\n return <>;\n\n default:\n return (\n \n );\n }\n }\n\n /**\n * Render\n */\n\n return (\n \n \n \n }>\n {renderActions()}\n \n );\n}\n","type ProposalAmountProps = {\n amount: string;\n amountUnit: string;\n amount2?: string;\n amount2Unit?: string;\n};\n\nexport default function ProposalAmount(props: ProposalAmountProps) {\n const {amount, amountUnit, amount2, amount2Unit} = props;\n\n /**\n * Render\n */\n\n return (\n
\n \n {`${amount} ${amountUnit}`}\n {/* assumes second amount is value requested from the DAO */}\n {amount2 && (\n <>\n
\n for\n
\n {`${amount2} ${amount2Unit}`}\n \n )}\n
\n
\n );\n}\n","import React from 'react';\nimport {useHistory, useParams} from 'react-router-dom';\n\nimport {\n ProposalFlowStatus,\n RenderActionPropArguments,\n} from '../../components/proposals/types';\nimport {AsyncStatus} from '../../util/types';\nimport {ContractAdapterNames} from '../../components/web3/types';\nimport {useIsDefaultChain} from '../../components/web3/hooks';\nimport {useProposalOrDraft} from '../../components/proposals/hooks';\nimport {VotingState} from '../../components/proposals/voting/types';\nimport ErrorMessageWithDetails from '../../components/common/ErrorMessageWithDetails';\nimport FadeIn from '../../components/common/FadeIn';\nimport LoaderLarge from '../../components/feedback/LoaderLarge';\nimport NotFound from '../subpages/NotFound';\nimport ProcessActionMembership from '../../components/proposals/ProcessActionMembership';\nimport ProposalActions from '../../components/proposals/ProposalActions';\nimport SubmitAction from '../../components/proposals/SubmitAction';\nimport ProposalAmount from '../../components/proposals/ProposalAmount';\nimport ProposalDetails from '../../components/proposals/ProposalDetails';\nimport Wrap from '../../components/common/Wrap';\n\nconst PLACEHOLDER = '\\u2014'; /* em dash */\n\nexport default function MembershipDetails() {\n /**\n * @todo\n *\n * 1. Fetch proposal by ID from the subgraph.\n * 2. Determine if sponsored\n * 3. Get Snapshot data\n * 3.1 If sponsored, get data about proposal from Snapshot (use flag to also search by draft hash).\n * 3.2 If not sponsored, get data about draft from Snapshot.\n */\n\n /**\n * Their hooks\n */\n\n // Get hash for fetching the proposal.\n const {proposalId} = useParams<{proposalId: string}>();\n\n /**\n * @todo Get subgraph proposal and determine if it has been sponsored\n * so we know how to search snapshot-hub.\n */\n\n // ...\n\n /**\n * Our hooks\n */\n\n // @todo Use dynamic `SnapshotType` depending on subgraph data for `type` arg.\n const {proposalData, proposalError, proposalNotFound, proposalStatus} =\n useProposalOrDraft(proposalId);\n\n const {defaultChainError} = useIsDefaultChain();\n\n /**\n * Variables\n */\n\n const isLoading: boolean = proposalStatus === AsyncStatus.PENDING;\n const error: Error | undefined = proposalError || defaultChainError;\n\n /**\n * Functions\n */\n\n // Render any adapter-specific actions\n function renderAction(data: RenderActionPropArguments): React.ReactNode {\n const {\n OffchainVotingContract: {daoProposalVoteResult, proposal, status},\n } = data;\n\n // Submit/Sponsor button (for proposals that have not been submitted onchain yet)\n if (status === ProposalFlowStatus.Submit) {\n const {snapshotDraft} = proposal;\n const applicant = snapshotDraft?.msg.payload.metadata.submitActionArgs[0];\n\n return ;\n }\n\n // Process button\n if (\n status === ProposalFlowStatus.Process ||\n status === ProposalFlowStatus.OffchainVotingGracePeriod\n ) {\n if (\n daoProposalVoteResult &&\n VotingState[daoProposalVoteResult] !== VotingState[VotingState.PASS]\n ) {\n // Return a React.Fragment to hide the process button if proposal failed.\n return <>;\n }\n\n return (\n \n );\n }\n\n // Return `null` to signal to use default actions\n return null;\n }\n\n /**\n * Render\n */\n\n // Render loading\n if (isLoading && !error) {\n return (\n \n
\n \n
\n
\n );\n }\n\n // Render 404 no proposal found\n if (proposalNotFound) {\n return (\n \n \n \n );\n }\n\n // Render error\n if (error) {\n return (\n \n
\n \n
\n
\n );\n }\n\n // Render proposal\n if (proposalData) {\n const commonData = proposalData.getCommonSnapshotProposalData();\n\n // Handle just in case metadata was not properly set\n let tributeAmount = PLACEHOLDER;\n let tributeAmountUnit = '';\n try {\n ({tributeAmount, tributeAmountUnit} =\n commonData?.msg.payload.metadata.proposalAmountValues);\n } catch (error) {\n tributeAmount = PLACEHOLDER;\n tributeAmountUnit = '';\n }\n\n return (\n \n (\n \n )}\n renderActions={() => (\n \n )}\n />\n \n );\n }\n\n // Render nothing. Should never reach this case.\n return <>;\n}\n\nfunction RenderWrapper(props: React.PropsWithChildren): JSX.Element {\n /**\n * Their hooks\n */\n\n const history = useHistory();\n\n /**\n * Functions\n */\n\n function goToAll(event: React.MouseEvent) {\n event.preventDefault();\n\n history.push('/membership');\n }\n\n /**\n * Render\n */\n\n return (\n \n \n
\n

Membership

\n \n
\n\n {/* RENDER CHILDREN */}\n {props.children}\n
\n
\n );\n}\n","import {useState, useEffect} from 'react';\n\ntype LoaderWithEmojiProps = {\n emoji: string;\n // Show waiting effect after some time has elapsed. Prevents the \"sudden\n // spinner\" UI/UX no-no. Esp. if we could have cached data.\n showAfterMs?: number;\n};\n\nexport default function LoaderWithEmoji(props: LoaderWithEmojiProps) {\n const {showAfterMs} = props;\n const [showLoaderAfterMs, setShowLoaderAfterMs] = useState(false);\n\n useEffect(() => {\n /* 200ms is approx. the time a user will notice a stalled, blank screen */\n const timeoutId =\n showAfterMs && setTimeout(() => setShowLoaderAfterMs(true), showAfterMs);\n\n return function cleanup() {\n timeoutId && clearTimeout(timeoutId);\n };\n }, [showAfterMs]);\n\n return !showAfterMs || (showAfterMs && showLoaderAfterMs) ? (\n
\n \n {props.emoji}\n \n
\n ) : null;\n}\n","import {useRef, useEffect} from 'react';\nimport {toChecksumAddress} from 'web3-utils';\n\nimport {CycleEllipsis} from '../../components/feedback/CycleEllipsis';\nimport CycleMessage from '../../components/feedback/CycleMessage';\nimport EtherscanURL from '../../components/web3/EtherscanURL';\nimport ErrorMessageWithDetails from '../../components/common/ErrorMessageWithDetails';\nimport FadeIn from '../../components/common/FadeIn';\nimport Loader from '../../components/feedback/Loader';\nimport DaoToken, {\n ERC20RegisterDetails,\n} from '../../components/dao-token/DaoToken';\nimport {useCheckApplicant} from '../../components/proposals/hooks';\nimport {useRedeemCoupon, FetchStatus} from '../../hooks/useRedeemCoupon';\nimport {useMemberActionDisabled} from '../../hooks';\nimport {formatNumber, truncateEthAddress} from '../../util/helpers';\nimport {Web3TxStatus} from '../../components/web3/types';\nimport {TX_CYCLE_MESSAGES} from '../../components/web3/config';\nimport {AsyncStatus} from '../../util/types';\n\ntype RedeemManagerProps = {\n redeemables: Record;\n daoTokenDetails?: ERC20RegisterDetails;\n};\n\ntype RedeemCardProps = {\n redeemable: Record;\n daoTokenDetails?: ERC20RegisterDetails;\n};\n\ntype ActionDisabledReasons = {\n invalidApplicantMessage: string;\n};\n\n/**\n * Cached outside the component to prevent infinite re-renders.\n *\n * The same can be accomplished inside the component using\n * `useState`, `useRef`, etc., depending on the use case.\n */\nconst useMemberActionDisabledProps = {\n // Anyone can process a proposal - it's just a question of gas payment.\n skipIsActiveMemberCheck: true,\n};\n\nexport default function RedeemManager({\n redeemables,\n daoTokenDetails,\n}: RedeemManagerProps) {\n /**\n * Render\n */\n\n // show the redeem card, if only one coupon available\n return (\n \n \n \n );\n}\n\nfunction RedeemCard({redeemable, daoTokenDetails}: RedeemCardProps) {\n /**\n * Refs\n */\n\n const actionDisabledReasonsRef = useRef({\n invalidApplicantMessage: '',\n });\n\n /**\n * Our hooks\n */\n\n const {\n redeemCoupon,\n submitStatus,\n submitError,\n txStatus,\n txEtherscanURL,\n txIsPromptOpen,\n } = useRedeemCoupon();\n\n const {\n isDisabled,\n openWhyDisabledModal,\n WhyDisabledModal,\n setOtherDisabledReasons,\n } = useMemberActionDisabled(useMemberActionDisabledProps);\n\n const {\n checkApplicantError,\n checkApplicantInvalidMsg,\n checkApplicantStatus,\n isApplicantValid,\n } = useCheckApplicant(redeemable.recipient);\n\n /**\n * Variables\n */\n\n const isInProcess =\n submitStatus === FetchStatus.PENDING ||\n txStatus === Web3TxStatus.AWAITING_CONFIRM ||\n txStatus === Web3TxStatus.PENDING;\n const isDone =\n submitStatus === FetchStatus.FULFILLED ||\n txStatus === Web3TxStatus.FULFILLED ||\n redeemable.isRedeemd;\n const isInProcessOrDone = isInProcess || isDone || txIsPromptOpen;\n\n /**\n * Effects\n */\n\n useEffect(() => {\n if (redeemable.recipient) {\n // 1. Determine and set reasons why action would be disabled\n\n // Reason: If the applicant address is invalid (see `useCheckApplicant`\n // hook for reasons) the `submitProposal` smart contract transaction will\n // fail.\n if (checkApplicantError) {\n console.warn(\n `Error checking if the applicant address '${redeemable.recipient}' is valid: ${checkApplicantError.message}`\n );\n }\n\n if (\n checkApplicantStatus === AsyncStatus.FULFILLED &&\n !isApplicantValid &&\n checkApplicantInvalidMsg\n ) {\n actionDisabledReasonsRef.current = {\n ...actionDisabledReasonsRef.current,\n invalidApplicantMessage: checkApplicantInvalidMsg,\n };\n }\n\n // 2. Set reasons\n setOtherDisabledReasons(Object.values(actionDisabledReasonsRef.current));\n }\n }, [\n checkApplicantError,\n checkApplicantInvalidMsg,\n checkApplicantStatus,\n isApplicantValid,\n redeemable.recipient,\n setOtherDisabledReasons,\n ]);\n\n /**\n * Functions\n */\n\n function renderSubmitStatus(): React.ReactNode {\n // Only for chain tx\n switch (txStatus) {\n case Web3TxStatus.AWAITING_CONFIRM:\n return (\n <>\n Awaiting your confirmation\n \n \n );\n case Web3TxStatus.PENDING:\n return (\n <>\n {\n return {message};\n }}\n />\n\n \n \n );\n case Web3TxStatus.FULFILLED:\n return (\n <>\n
{'Finalized!'}
\n\n \n \n );\n default:\n return null;\n }\n }\n\n /**\n * Render\n */\n\n return (\n <>\n \n

\n Recipient:{' '}\n {truncateEthAddress(toChecksumAddress(redeemable.recipient), 7)}\n

\n

\n {formatNumber(redeemable.amount)}\n \n {daoTokenDetails?.symbol || 'tokens'}\n \n

\n\n \n\n {isDone && (\n

\n \n 🥳\n \n

\n )}\n\n {\n await redeemCoupon(redeemable, daoTokenDetails);\n }}\n disabled={isDisabled || isInProcessOrDone}>\n {isInProcess ? : isDone ? 'Redeemed!' : 'Redeem'}\n \n\n {/* SUBMIT STATUS */}\n {isInProcessOrDone && !redeemable.isRedeemd && (\n \n {renderSubmitStatus()}\n \n )}\n\n {isDisabled && (\n \n Why is redeeming disabled?\n \n )}\n\n {/* SUBMIT ERROR */}\n {submitError && (\n
\n \n
\n )}\n \n\n \n \n );\n}\n\nfunction RenderWrapper(props: React.PropsWithChildren): JSX.Element {\n return (\n \n
\n {/* RENDER CHILDREN */}\n {props.children}\n
\n
\n );\n}\n","import {useCallback, useEffect, useState} from 'react';\nimport {useLocation} from 'react-router-dom';\n\nimport {AsyncStatus} from '../../util/types';\nimport {COUPON_API_URL} from '../../config';\nimport {useAbortController} from '../../hooks';\nimport {useIsDefaultChain, useWeb3Modal} from '../../components/web3/hooks';\nimport FadeIn from '../../components/common/FadeIn';\nimport LoaderWithEmoji from '../../components/feedback/LoaderWithEmoji';\nimport RedeemManager from './RedeemManager';\nimport Wrap from '../../components/common/Wrap';\nimport {useDaoTokenDetails} from '../../components/dao-token/hooks';\n\ntype RedeemCouponType = {\n amount: number;\n dao: {daoAddress: string};\n isRedeemed: boolean;\n nonce: number;\n recipient: string;\n signature: string;\n};\n\nexport default function RedeemCoupon() {\n /**\n * State\n */\n\n const [redeemableCoupon, setReedemableCoupon] = useState(\n []\n );\n const [couponStatus, setCouponStatus] = useState(\n AsyncStatus.STANDBY\n );\n\n /**\n * Our hooks\n */\n\n const {connected, account} = useWeb3Modal();\n const {defaultChainError} = useIsDefaultChain();\n const {abortController, isMountedRef} = useAbortController();\n const {daoTokenDetails, daoTokenDetailsStatus} = useDaoTokenDetails();\n\n /**\n * Their hooks\n */\n\n const location = useLocation<{coupon: string}>();\n\n /**\n * Variables\n */\n\n const coupon = new URLSearchParams(location.search).get('coupon');\n\n const isInProcess =\n couponStatus === AsyncStatus.STANDBY ||\n couponStatus === AsyncStatus.PENDING ||\n daoTokenDetailsStatus === AsyncStatus.STANDBY ||\n daoTokenDetailsStatus === AsyncStatus.PENDING;\n\n /**\n * Cached callbacks\n */\n\n const checkBySigOrAddrCached = useCallback(checkBySigOrAddr, [\n abortController?.signal,\n coupon,\n isMountedRef,\n ]);\n\n /**\n * Effects\n */\n\n useEffect(() => {\n if (!account || !connected || defaultChainError) return;\n\n checkBySigOrAddrCached();\n }, [account, connected, checkBySigOrAddrCached, defaultChainError]);\n\n /**\n * Functions\n */\n\n // check using signature or eth addr\n async function checkBySigOrAddr() {\n try {\n if (!abortController?.signal) return;\n\n setCouponStatus(AsyncStatus.PENDING);\n\n // handle adding new authorized user to thee `auth` tbl\n const response = await fetch(`${COUPON_API_URL}/api/coupon/redeem`, {\n method: 'POST',\n body: JSON.stringify({\n signature: coupon,\n }),\n headers: {\n 'Content-Type': 'application/json',\n },\n signal: abortController.signal,\n });\n\n if (!isMountedRef.current) return;\n\n const coupons = await response.json();\n\n setReedemableCoupon(coupons);\n setCouponStatus(AsyncStatus.FULFILLED);\n } catch (error) {\n if (!isMountedRef.current) return;\n\n setCouponStatus(AsyncStatus.REJECTED);\n }\n }\n\n /**\n * Render\n */\n\n // check if user doesn't have a connected wallet\n if (!connected) {\n return (\n \n

\n Connect your wallet to view the coupon.\n

\n
\n );\n }\n\n if (defaultChainError) {\n return (\n \n

{defaultChainError.message}

\n
\n );\n }\n\n if (connected && isInProcess) {\n return (\n \n \n

Checking… please wait.

\n
\n );\n }\n\n if (coupon === undefined || !coupon) {\n return (\n \n

Coupon signature missing.

\n
\n );\n }\n\n if (!redeemableCoupon || !redeemableCoupon.length) {\n return (\n \n

Coupon not found.

\n
\n );\n }\n\n return (\n \n \n \n );\n}\n\nfunction RenderWrapper(props: React.PropsWithChildren): JSX.Element {\n return (\n \n \n
\n

Redeem Coupon

\n
\n\n
\n
\n

Redeem coupon to issue the membership tokens.

\n
\n\n {/* RENDER CHILDREN */}\n {props.children}\n
\n
\n
\n );\n}\n","import React, {useEffect, useState, useRef} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {CycleEllipsis} from '../feedback';\nimport {getConnectedMember} from '../../store/actions';\nimport {ProposalData, DistributionStatus} from './types';\nimport {ReduxDispatch, StoreState} from '../../store/types';\nimport {TX_CYCLE_MESSAGES} from '../web3/config';\nimport {useContractSend, useETHGasPrice, useWeb3Modal} from '../web3/hooks';\nimport {useMemberActionDisabled} from '../../hooks';\nimport {Web3TxStatus} from '../web3/types';\nimport CycleMessage from '../feedback/CycleMessage';\nimport ErrorMessageWithDetails from '../common/ErrorMessageWithDetails';\nimport EtherscanURL from '../web3/EtherscanURL';\nimport FadeIn from '../common/FadeIn';\nimport Loader from '../feedback/Loader';\n\ntype DistributeArguments = [\n string, // `dao`\n string // `toIndex`\n];\n\ntype PostProcessActionTransferProps = {\n proposal: ProposalData;\n};\n\ntype ActionDisabledReasons = {\n alreadyCompletedMessage: string;\n};\n\nexport default function PostProcessActionTransfer(\n props: PostProcessActionTransferProps\n) {\n const {\n proposal: {snapshotProposal},\n } = props;\n\n /**\n * State\n */\n\n const [submitError, setSubmitError] = useState();\n\n /**\n * Refs\n */\n\n const actionDisabledReasonsRef = useRef({\n alreadyCompletedMessage: '',\n });\n\n /**\n * Selectors\n */\n\n const DistributeContract = useSelector(\n (s: StoreState) => s.contracts?.DistributeContract\n );\n const daoRegistryContract = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract\n );\n\n /**\n * Our hooks\n */\n\n const {account, web3Instance} = useWeb3Modal();\n const {txEtherscanURL, txIsPromptOpen, txSend, txStatus} = useContractSend();\n const {\n isDisabled,\n openWhyDisabledModal,\n WhyDisabledModal,\n setOtherDisabledReasons,\n } = useMemberActionDisabled();\n const {fast: fastGasPrice} = useETHGasPrice();\n\n /**\n * Their hooks\n */\n\n const dispatch = useDispatch();\n\n /**\n * Variables\n */\n\n const isInProcess =\n txStatus === Web3TxStatus.AWAITING_CONFIRM ||\n txStatus === Web3TxStatus.PENDING;\n const isDone = txStatus === Web3TxStatus.FULFILLED;\n const isInProcessOrDone = isInProcess || isDone || txIsPromptOpen;\n const areSomeDisabled = isDisabled || isInProcessOrDone;\n\n /**\n * Effects\n */\n\n useEffect(() => {\n async function getActionDisabledReasons() {\n // 1. Determine and set reasons why action would be disabled\n\n // Reason: distribution already completed\n try {\n if (!snapshotProposal) {\n throw new Error('No Snapshot proposal was found.');\n }\n if (!daoRegistryContract) {\n throw new Error('No DAO Registry contract was found.');\n }\n if (!DistributeContract) {\n throw new Error('No DistributeContract found.');\n }\n\n const distributeProposal = await DistributeContract.instance.methods\n .distributions(\n daoRegistryContract.contractAddress,\n snapshotProposal.idInDAO\n )\n .call();\n\n actionDisabledReasonsRef.current = {\n ...actionDisabledReasonsRef.current,\n alreadyCompletedMessage:\n DistributionStatus[distributeProposal.status] !==\n DistributionStatus[DistributionStatus.IN_PROGRESS]\n ? 'The transfer has already been completed.'\n : '',\n };\n } catch (error) {\n console.error(error);\n }\n\n // 2. Set reasons\n setOtherDisabledReasons(Object.values(actionDisabledReasonsRef.current));\n }\n\n getActionDisabledReasons();\n }, [\n DistributeContract,\n daoRegistryContract,\n setOtherDisabledReasons,\n snapshotProposal,\n ]);\n\n /**\n * Functions\n */\n\n async function handleSubmit() {\n try {\n if (!daoRegistryContract) {\n throw new Error('No DAO Registry contract was found.');\n }\n\n if (!snapshotProposal) {\n throw new Error('No Snapshot proposal was found.');\n }\n\n if (!DistributeContract) {\n throw new Error('No DistributeContract found.');\n }\n\n if (!account) {\n throw new Error('No account found.');\n }\n\n if (!web3Instance) {\n throw new Error('No Web3 instance was found.');\n }\n\n let toIndexArg = '0';\n const isTypeAllMembers =\n snapshotProposal?.msg.payload.metadata.isTypeAllMembers;\n if (isTypeAllMembers) {\n try {\n const nbMembers = await daoRegistryContract.instance.methods\n .getNbMembers()\n .call();\n toIndexArg = nbMembers.toString();\n } catch (error) {\n throw new Error('Error while retrieving number of DAO members');\n }\n }\n\n const distributeArguments: DistributeArguments = [\n daoRegistryContract.contractAddress,\n toIndexArg,\n ];\n\n const txArguments = {\n from: account || '',\n ...(fastGasPrice ? {gasPrice: fastGasPrice} : null),\n };\n\n const tx = await txSend(\n 'distribute',\n DistributeContract.instance.methods,\n distributeArguments,\n txArguments\n );\n\n if (tx) {\n // re-fetch member\n await dispatch(\n getConnectedMember({\n account,\n daoRegistryContract,\n web3Instance,\n })\n );\n }\n } catch (error) {\n setSubmitError(error);\n }\n }\n\n /**\n * Render\n */\n\n function renderSubmitStatus(): React.ReactNode {\n // distribute transaction statuses\n switch (txStatus) {\n case Web3TxStatus.AWAITING_CONFIRM:\n return (\n <>\n Confirm to transfer assets\n \n \n );\n case Web3TxStatus.PENDING:\n return (\n <>\n {\n return {message};\n }}\n />\n\n \n \n );\n case Web3TxStatus.FULFILLED:\n return (\n <>\n
Assets transferred!
\n\n \n \n );\n default:\n return null;\n }\n }\n\n return (\n <>\n
\n {} : handleSubmit}>\n {isInProcess ? (\n \n ) : isDone ? (\n 'Transfer done'\n ) : (\n 'Transfer assets'\n )}\n \n\n \n\n {/* SUBMIT STATUS */}\n\n {isInProcessOrDone && (\n
\n {renderSubmitStatus()}\n
\n )}\n\n {isDisabled && (\n \n Why is action disabled?\n \n )}\n
\n\n \n \n );\n}\n","import React from 'react';\nimport {useHistory, useParams} from 'react-router-dom';\n\nimport {\n ProposalFlowStatus,\n RenderActionPropArguments,\n} from '../../components/proposals/types';\nimport {AsyncStatus} from '../../util/types';\nimport {ContractAdapterNames} from '../../components/web3/types';\nimport {useIsDefaultChain} from '../../components/web3/hooks';\nimport {useProposalOrDraft} from '../../components/proposals/hooks';\nimport {VotingState} from '../../components/proposals/voting/types';\nimport ErrorMessageWithDetails from '../../components/common/ErrorMessageWithDetails';\nimport FadeIn from '../../components/common/FadeIn';\nimport LoaderLarge from '../../components/feedback/LoaderLarge';\nimport NotFound from '../subpages/NotFound';\nimport PostProcessActionTransfer from '../../components/proposals/PostProcessActionTransfer';\nimport ProposalActions from '../../components/proposals/ProposalActions';\nimport ProposalAmount from '../../components/proposals/ProposalAmount';\nimport ProposalDetails from '../../components/proposals/ProposalDetails';\nimport Wrap from '../../components/common/Wrap';\n\nconst PLACEHOLDER = '\\u2014'; /* em dash */\n\nexport default function TransferDetails() {\n /**\n * @todo\n *\n * 1. Fetch proposal by ID from the subgraph.\n * 2. Determine if sponsored\n * 3. Get Snapshot data\n * 3.1 If sponsored, get data about proposal from Snapshot (use flag to also search by draft hash).\n * 3.2 If not sponsored, get data about draft from Snapshot.\n */\n\n /**\n * Their hooks\n */\n\n // Get hash for fetching the proposal.\n const {proposalId} = useParams<{proposalId: string}>();\n\n /**\n * @todo Get subgraph proposal and determine if it has been sponsored\n * so we know how to search snapshot-hub.\n */\n\n // ...\n\n /**\n * Our hooks\n */\n\n // @todo Use dynamic `SnapshotType` depending on subgraph data for `type` arg.\n const {proposalData, proposalError, proposalNotFound, proposalStatus} =\n useProposalOrDraft(proposalId);\n\n const {defaultChainError} = useIsDefaultChain();\n\n /**\n * Variables\n */\n\n const isLoading: boolean = proposalStatus === AsyncStatus.PENDING;\n const error: Error | undefined = proposalError || defaultChainError;\n\n /**\n * Functions\n */\n\n // Render any adapter-specific actions\n function renderAction(data: RenderActionPropArguments): React.ReactNode {\n const {\n OffchainVotingContract: {daoProposalVoteResult, proposal, status},\n } = data;\n\n // The Distribute adapter has an additional action after a passed proposal\n // is processed to handle the actual asset distribution.\n if (\n status === ProposalFlowStatus.Completed &&\n daoProposalVoteResult &&\n VotingState[daoProposalVoteResult] === VotingState[VotingState.PASS]\n ) {\n return ;\n }\n\n // Return `null` to signal to use default actions\n return null;\n }\n\n /**\n * Render\n */\n\n // Render loading\n if (isLoading && !error) {\n return (\n \n
\n \n
\n
\n );\n }\n\n // Render 404 no proposal found\n if (proposalNotFound) {\n return (\n \n \n \n );\n }\n\n // Render error\n if (error) {\n return (\n \n
\n \n
\n
\n );\n }\n\n // Render proposal\n if (proposalData) {\n const commonData = proposalData.getCommonSnapshotProposalData();\n\n // Handle just in case metadata was not properly set\n let transferAmount = PLACEHOLDER;\n let transferAmountUnit = '';\n try {\n ({transferAmount, transferAmountUnit} =\n commonData?.msg.payload.metadata.proposalAmountValues);\n } catch (error) {\n transferAmount = PLACEHOLDER;\n transferAmountUnit = '';\n }\n\n return (\n \n (\n \n )}\n renderActions={() => (\n \n )}\n />\n \n );\n }\n\n // Render nothing. Should never reach this case.\n return <>;\n}\n\nfunction RenderWrapper(props: React.PropsWithChildren): JSX.Element {\n /**\n * Their hooks\n */\n\n const history = useHistory();\n\n /**\n * Functions\n */\n\n function goToAll(event: React.MouseEvent) {\n event.preventDefault();\n\n history.push('/transfers');\n }\n\n /**\n * Render\n */\n\n return (\n \n \n
\n

Transfers

\n \n
\n\n {/* RENDER CHILDREN */}\n {props.children}\n
\n
\n );\n}\n","import React from 'react';\nimport {useHistory} from 'react-router-dom';\n\nimport {DaoAdapterConstants} from '../../components/adapters-extensions/enums';\nimport FadeIn from '../../components/common/FadeIn';\nimport Proposals from '../../components/proposals/Proposals';\nimport Wrap from '../../components/common/Wrap';\n\nexport default function Transfers() {\n /**\n * Functions\n */\n\n function proposalLinkPath(id: string) {\n return `/transfers/${id}`;\n }\n\n /**\n * Render\n */\n\n return (\n \n \n \n );\n}\n\nfunction RenderWrapper(props: React.PropsWithChildren): JSX.Element {\n /**\n * Their hooks\n */\n\n const history = useHistory();\n\n /**\n * Functions\n */\n\n function goToNewProposal(event: React.MouseEvent) {\n event.preventDefault();\n history.push('/transfer');\n }\n\n /**\n * Render\n */\n\n return (\n \n \n
\n

Transfers

\n \n
\n\n {/* RENDER CHILDREN */}\n {props.children}\n
\n
\n );\n}\n","import {useState, useRef, useEffect, useCallback} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {toBN, AbiItem} from 'web3-utils';\n\nimport {CycleEllipsis} from '../feedback';\nimport {useDaoTokenDetails} from '../dao-token/hooks';\nimport {getConnectedMember} from '../../store/actions';\nimport {ProposalData, SnapshotProposal} from './types';\nimport {ReduxDispatch, StoreState} from '../../store/types';\nimport {TX_CYCLE_MESSAGES} from '../web3/config';\nimport {useContractSend, useETHGasPrice, useWeb3Modal} from '../web3/hooks';\nimport {useMemberActionDisabled} from '../../hooks';\nimport {Web3TxStatus} from '../web3/types';\nimport CycleMessage from '../feedback/CycleMessage';\nimport ErrorMessageWithDetails from '../common/ErrorMessageWithDetails';\nimport EtherscanURL from '../web3/EtherscanURL';\nimport FadeIn from '../common/FadeIn';\nimport Loader from '../feedback/Loader';\n\ntype ProcessArguments = [\n string, // `dao`\n string // `proposalId`\n];\n\ntype TokenApproveArguments = [\n string, // `spender`\n string // `value`\n];\n\ntype TributeProposalDetails = {\n tokenAddress: string;\n tributeAmount: string;\n};\n\ntype ProcessActionTributeProps = {\n disabled?: boolean;\n proposal: ProposalData;\n};\n\ntype ActionDisabledReasons = {\n notProposerMessage: string;\n};\n\n/**\n * Cached outside the component to prevent infinite re-renders.\n *\n * The same can be accomplished inside the component using\n * `useState`, `useRef`, etc., depending on the use case.\n */\nconst useMemberActionDisabledProps = {\n // Anyone can process a proposal - it's just a question of gas payment.\n skipIsActiveMemberCheck: true,\n};\n\nexport default function ProcessActionTribute(props: ProcessActionTributeProps) {\n const {\n disabled: propsDisabled,\n proposal: {snapshotProposal},\n } = props;\n\n /**\n * State\n */\n\n const [submitError, setSubmitError] = useState();\n const [tributeProposalDetails, setTributeProposalDetails] =\n useState();\n\n /**\n * Refs\n */\n\n const actionDisabledReasonsRef = useRef({\n notProposerMessage: '',\n });\n\n /**\n * Selectors\n */\n\n const TributeContract = useSelector(\n (s: StoreState) => s.contracts?.TributeContract\n );\n const daoRegistryContract = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract\n );\n\n /**\n * Our hooks\n */\n\n const {account, web3Instance} = useWeb3Modal();\n const {txEtherscanURL, txIsPromptOpen, txSend, txStatus} = useContractSend();\n const {\n txEtherscanURL: txEtherscanURLTokenApprove,\n txIsPromptOpen: txIsPromptOpenTokenApprove,\n txSend: txSendTokenApprove,\n txStatus: txStatusTokenApprove,\n } = useContractSend();\n const {\n isDisabled,\n openWhyDisabledModal,\n WhyDisabledModal,\n setOtherDisabledReasons,\n } = useMemberActionDisabled(useMemberActionDisabledProps);\n const {fast: fastGasPrice} = useETHGasPrice();\n const {daoTokenDetails} = useDaoTokenDetails();\n\n /**\n * Their hooks\n */\n\n const dispatch = useDispatch();\n\n /**\n * Variables\n */\n\n const isInProcess =\n txStatus === Web3TxStatus.AWAITING_CONFIRM ||\n txStatus === Web3TxStatus.PENDING ||\n txStatusTokenApprove === Web3TxStatus.AWAITING_CONFIRM ||\n txStatusTokenApprove === Web3TxStatus.PENDING;\n const isDone = txStatus === Web3TxStatus.FULFILLED;\n const isInProcessOrDone =\n isInProcess || isDone || txIsPromptOpen || txIsPromptOpenTokenApprove;\n const areSomeDisabled = isDisabled || isInProcessOrDone || propsDisabled;\n\n /**\n * Cached callbacks\n */\n\n const getTributeProposalDetailsCached = useCallback(\n getTributeProposalDetails,\n [TributeContract, daoRegistryContract?.contractAddress, snapshotProposal]\n );\n\n /**\n * Effects\n */\n\n useEffect(() => {\n getTributeProposalDetailsCached();\n }, [getTributeProposalDetailsCached]);\n\n useEffect(() => {\n // 1. Determine and set reasons why action would be disabled\n\n // Reason: For some proposal types, a passed proposal can only be\n // processed by its original proposer (e.g., the owner of the asset to be\n // transferred)\n\n // Proposals with this restriction will have this value stored in its\n // snapshot metadata.\n const {accountAuthorizedToProcessPassedProposal} = (\n snapshotProposal as SnapshotProposal\n ).msg.payload.metadata;\n\n if (accountAuthorizedToProcessPassedProposal && account) {\n actionDisabledReasonsRef.current = {\n ...actionDisabledReasonsRef.current,\n notProposerMessage:\n accountAuthorizedToProcessPassedProposal.toLowerCase() !==\n account.toLowerCase()\n ? 'Only the original proposer can process the proposal.'\n : '',\n };\n }\n\n // 2. Set reasons\n setOtherDisabledReasons(Object.values(actionDisabledReasonsRef.current));\n }, [account, setOtherDisabledReasons, snapshotProposal]);\n\n /**\n * Functions\n */\n\n async function getTributeProposalDetails() {\n try {\n if (!snapshotProposal || !TributeContract) return;\n\n const proposalDetails = await TributeContract.instance.methods\n .proposals(\n daoRegistryContract?.contractAddress,\n snapshotProposal.idInDAO\n )\n .call();\n const {token: tokenAddress, tributeAmount} = proposalDetails;\n\n setTributeProposalDetails({tokenAddress, tributeAmount});\n } catch (error) {\n console.error(error);\n setTributeProposalDetails(undefined);\n }\n }\n\n async function handleSubmitTokenApprove() {\n try {\n if (!tributeProposalDetails) {\n throw new Error('No Tribute proposal details found.');\n }\n\n if (!TributeContract) {\n throw new Error('No TributeContract found.');\n }\n\n if (!account) {\n throw new Error('No account found.');\n }\n\n if (!web3Instance) {\n throw new Error('No Web3 instance was found.');\n }\n\n const {tokenAddress, tributeAmount} = tributeProposalDetails;\n\n const {default: lazyERC20ABI} = await import(\n '../../truffle-contracts/ERC20.json'\n );\n const erc20Contract: AbiItem[] = lazyERC20ABI as any;\n const erc20Instance = new web3Instance.eth.Contract(\n erc20Contract,\n tokenAddress\n );\n\n // Value to check if adapter is allowed to spend amount of tribute tokens\n // on behalf of owner. If allowance is not sufficient, the owner will approve the adapter to spend the amount of\n // tokens needed for the owner to provide the full tribute amount.\n const allowance = await erc20Instance.methods\n .allowance(account, TributeContract.contractAddress)\n .call();\n\n const tributeAmountBN = toBN(tributeAmount);\n const allowanceBN = toBN(allowance);\n\n if (tributeAmountBN.gt(allowanceBN)) {\n try {\n const difference = tributeAmountBN.sub(allowanceBN);\n const approveValue = allowanceBN.add(difference);\n const tokenApproveArguments: TokenApproveArguments = [\n TributeContract.contractAddress,\n approveValue.toString(),\n ];\n const txArguments = {\n from: account || '',\n ...(fastGasPrice ? {gasPrice: fastGasPrice} : null),\n };\n\n // Execute contract call for `approve`\n await txSendTokenApprove(\n 'approve',\n erc20Instance.methods,\n tokenApproveArguments,\n txArguments\n );\n } catch (error) {\n throw error;\n }\n }\n } catch (error) {\n throw error;\n }\n }\n\n async function handleSubmit() {\n try {\n if (!daoRegistryContract) {\n throw new Error('No DAO Registry contract was found.');\n }\n\n if (!snapshotProposal) {\n throw new Error('No Snapshot proposal was found.');\n }\n\n if (!TributeContract) {\n throw new Error('No TributeContract found.');\n }\n\n if (!account) {\n throw new Error('No account found.');\n }\n\n if (!web3Instance) {\n throw new Error('No Web3 instance was found.');\n }\n\n await handleSubmitTokenApprove();\n\n const processArguments: ProcessArguments = [\n daoRegistryContract.contractAddress,\n snapshotProposal.idInDAO,\n ];\n\n const txArguments = {\n from: account || '',\n ...(fastGasPrice ? {gasPrice: fastGasPrice} : null),\n };\n\n const tx = await txSend(\n 'processProposal',\n TributeContract.instance.methods,\n processArguments,\n txArguments\n );\n\n if (tx) {\n // re-fetch member\n await dispatch(\n getConnectedMember({\n account,\n daoRegistryContract,\n web3Instance,\n })\n );\n\n // if connected account is the applicant (the address that will receive\n // the membership units) suggest adding DAO token to wallet\n if (\n account.toLowerCase() ===\n snapshotProposal.msg.payload.metadata.submitActionArgs[0].toLowerCase()\n ) {\n await addTokenToWallet();\n }\n }\n } catch (error) {\n setSubmitError(error);\n }\n }\n\n async function addTokenToWallet() {\n if (!daoTokenDetails) return;\n\n try {\n await window.ethereum.request({\n method: 'wallet_watchAsset',\n params: {\n type: 'ERC20',\n options: daoTokenDetails,\n },\n });\n } catch (error) {\n console.log(error);\n }\n }\n\n /**\n * Render\n */\n\n function renderSubmitStatus(): React.ReactNode {\n // token approve transaction statuses\n if (txStatusTokenApprove === Web3TxStatus.AWAITING_CONFIRM) {\n return (\n <>\n Confirm to transfer your tokens\n \n \n );\n }\n\n if (txStatusTokenApprove === Web3TxStatus.PENDING) {\n return (\n <>\n
\n Approving your tokens for transfer\n \n
\n \n \n );\n }\n\n // process proposal transaction statuses\n switch (txStatus) {\n case Web3TxStatus.AWAITING_CONFIRM:\n return (\n <>\n Confirm to process the proposal\n \n \n );\n case Web3TxStatus.PENDING:\n return (\n <>\n {\n return {message};\n }}\n />\n\n \n \n );\n case Web3TxStatus.FULFILLED:\n return (\n <>\n
Proposal submitted!
\n\n \n \n );\n default:\n return null;\n }\n }\n\n return (\n <>\n
\n {} : handleSubmit}>\n {isInProcess ? : isDone ? 'Done' : 'Process'}\n \n\n \n\n {/* SUBMIT STATUS */}\n\n {isInProcessOrDone && (\n
\n {renderSubmitStatus()}\n
\n )}\n\n {isDisabled && (\n \n Why is processing disabled?\n \n )}\n
\n\n \n \n );\n}\n","import React from 'react';\nimport {useHistory, useParams} from 'react-router-dom';\n\nimport {\n RenderActionPropArguments,\n ProposalFlowStatus,\n} from '../../components/proposals/types';\nimport {AsyncStatus} from '../../util/types';\nimport {ContractAdapterNames} from '../../components/web3/types';\nimport {useIsDefaultChain} from '../../components/web3/hooks';\nimport {useProposalOrDraft} from '../../components/proposals/hooks';\nimport {VotingState} from '../../components/proposals/voting/types';\nimport ErrorMessageWithDetails from '../../components/common/ErrorMessageWithDetails';\nimport FadeIn from '../../components/common/FadeIn';\nimport LoaderLarge from '../../components/feedback/LoaderLarge';\nimport NotFound from '../subpages/NotFound';\nimport ProcessActionTribute from '../../components/proposals/ProcessActionTribute';\nimport ProposalActions from '../../components/proposals/ProposalActions';\nimport SubmitAction from '../../components/proposals/SubmitAction';\nimport ProposalAmount from '../../components/proposals/ProposalAmount';\nimport ProposalDetails from '../../components/proposals/ProposalDetails';\nimport Wrap from '../../components/common/Wrap';\n\nconst PLACEHOLDER = '\\u2014'; /* em dash */\n\nexport default function TributeDetails() {\n /**\n * @todo\n *\n * 1. Fetch proposal by ID from the subgraph.\n * 2. Determine if sponsored\n * 3. Get Snapshot data\n * 3.1 If sponsored, get data about proposal from Snapshot (use flag to also search by draft hash).\n * 3.2 If not sponsored, get data about draft from Snapshot.\n */\n\n /**\n * Their hooks\n */\n\n // Get hash for fetching the proposal.\n const {proposalId} = useParams<{proposalId: string}>();\n\n /**\n * @todo Get subgraph proposal and determine if it has been sponsored\n * so we know how to search snapshot-hub.\n */\n\n // ...\n\n /**\n * Our hooks\n */\n\n // @todo Use dynamic `SnapshotType` depending on subgraph data for `type` arg.\n const {proposalData, proposalError, proposalNotFound, proposalStatus} =\n useProposalOrDraft(proposalId);\n\n const {defaultChainError} = useIsDefaultChain();\n\n /**\n * Variables\n */\n\n const isLoading: boolean = proposalStatus === AsyncStatus.PENDING;\n const error: Error | undefined = proposalError || defaultChainError;\n\n /**\n * Functions\n */\n\n // Render any adapter-specific actions\n function renderAction(data: RenderActionPropArguments): React.ReactNode {\n const {\n OffchainVotingContract: {daoProposalVoteResult, proposal, status},\n } = data;\n\n // Submit/Sponsor button (for proposals that have not been submitted onchain yet)\n if (status === ProposalFlowStatus.Submit) {\n const {snapshotDraft} = proposal;\n const applicant = snapshotDraft?.msg.payload.metadata.submitActionArgs[0];\n\n return ;\n }\n\n // Process button\n if (\n status === ProposalFlowStatus.Process ||\n status === ProposalFlowStatus.OffchainVotingGracePeriod\n ) {\n if (\n daoProposalVoteResult &&\n VotingState[daoProposalVoteResult] !== VotingState[VotingState.PASS]\n ) {\n // Return a React.Fragment to hide the process button if proposal failed.\n return <>;\n }\n\n return (\n \n );\n }\n\n // Return `null` to signal to use default actions\n return null;\n }\n\n /**\n * Render\n */\n\n // Render loading\n if (isLoading && !error) {\n return (\n \n
\n \n
\n
\n );\n }\n\n // Render 404 no proposal found\n if (proposalNotFound) {\n return (\n \n \n \n );\n }\n\n // Render error\n if (error) {\n return (\n \n
\n \n
\n
\n );\n }\n\n // Render proposal\n if (proposalData) {\n const commonData = proposalData.getCommonSnapshotProposalData();\n\n // Handle just in case metadata was not properly set\n let tributeAmount = PLACEHOLDER;\n let tributeAmountUnit = '';\n let requestAmount = PLACEHOLDER;\n let requestAmountUnit = '';\n try {\n ({tributeAmount, tributeAmountUnit, requestAmount, requestAmountUnit} =\n commonData?.msg.payload.metadata.proposalAmountValues);\n } catch (error) {\n tributeAmount = PLACEHOLDER;\n tributeAmountUnit = '';\n requestAmount = PLACEHOLDER;\n requestAmountUnit = '';\n }\n\n return (\n \n (\n \n )}\n renderActions={() => (\n \n )}\n />\n \n );\n }\n\n // Render nothing. Should never reach this case.\n return <>;\n}\n\nfunction RenderWrapper(props: React.PropsWithChildren): JSX.Element {\n /**\n * Their hooks\n */\n\n const history = useHistory();\n\n /**\n * Functions\n */\n\n function goToAll(event: React.MouseEvent) {\n event.preventDefault();\n\n history.push('/tributes');\n }\n\n /**\n * Render\n */\n\n return (\n \n \n
\n

Tributes

\n \n
\n\n {/* RENDER CHILDREN */}\n {props.children}\n
\n
\n );\n}\n","import React from 'react';\nimport {useHistory} from 'react-router-dom';\n\nimport {DaoAdapterConstants} from '../../components/adapters-extensions/enums';\nimport FadeIn from '../../components/common/FadeIn';\nimport Proposals from '../../components/proposals/Proposals';\nimport Wrap from '../../components/common/Wrap';\n\nexport default function Tributes() {\n /**\n * Functions\n */\n\n function proposalLinkPath(id: string) {\n return `/tributes/${id}`;\n }\n\n /**\n * Render\n */\n\n return (\n \n \n \n );\n}\n\nfunction RenderWrapper(props: React.PropsWithChildren): JSX.Element {\n /**\n * Their hooks\n */\n\n const history = useHistory();\n\n /**\n * Functions\n */\n\n function goToNewProposal(event: React.MouseEvent) {\n event.preventDefault();\n history.push('/tribute');\n }\n\n /**\n * Render\n */\n\n return (\n \n \n
\n

Tributes

\n \n
\n\n {/* RENDER CHILDREN */}\n {props.children}\n
\n
\n );\n}\n","import {Route, Switch} from 'react-router-dom';\n\nimport AdapterOrExtensionManager from './components/adapters-extensions/AdapterOrExtensionManager';\nimport CreateGovernanceProposal from './pages/governance/CreateGovernanceProposal';\nimport CreateMembershipProposal from './pages/membership/CreateMembershipProposal';\nimport CreateTransferProposal from './pages/transfers/CreateTransferProposal';\nimport CreateTributeProposal from './pages/tributes/CreateTributeProposal';\nimport GetStarted from './pages/start/GetStarted';\nimport GovernanceProposalDetails from './pages/governance/GovernanceProposalDetails';\nimport GovernanceProposals from './pages/governance/GovernanceProposals';\nimport MemberProfile from './pages/members/MemberProfile';\nimport Members from './pages/members/Members';\nimport Membership from './pages/membership/Membership';\nimport MembershipDetails from './pages/membership/MembershipDetails';\nimport NotFound from './pages/subpages/NotFound';\nimport Redeem from './pages/redeem/Redeem';\nimport TransferDetails from './pages/transfers/TransferDetails';\nimport Transfers from './pages/transfers/Transfers';\nimport TributeDetails from './pages/tributes/TributeDetails';\nimport Tributes from './pages/tributes/Tributes';\n\nconst proposalIdParameter: string = ':proposalId';\n\nexport default function Routes() {\n return (\n \n {[\n // Index page\n } />,\n }\n />,\n }\n />,\n }\n />,\n }\n />,\n }\n />,\n }\n />,\n }\n />,\n }\n />,\n }\n />,\n }\n />,\n }\n />,\n }\n />,\n }\n />,\n }\n />,\n }\n />,\n } />,\n // 404 component (note: does not redirect to a route to maintain original path)\n ,\n ]}\n \n );\n}\n","import React, {useCallback, useEffect, useState} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {getApiStatus as getSnapshotAPIStatus} from '@openlaw/snapshot-js-erc712';\n\nimport {AsyncStatus} from './util/types';\nimport {getConnectedMember} from './store/actions';\nimport {ReduxDispatch, StoreState} from './store/types';\nimport {SNAPSHOT_HUB_API_URL} from './config';\nimport {useInitContracts, useIsDefaultChain} from './components/web3/hooks';\nimport {useIsMounted} from './hooks';\nimport {useWeb3Modal} from './components/web3/hooks';\n\ntype InitPropsRenderProps = {\n error: Error | undefined;\n isInitComplete: boolean;\n};\n\ntype InitProps = {\n render: (p: InitPropsRenderProps) => React.ReactElement | null;\n};\n\n/**\n * Register any new async process names here.\n * It is mainly to check their progress before rendering.\n *\n * If the app is not dependent on a process before starting\n * do not add it here.\n */\nenum ProcessName {\n initSnapshotAPI = 'initSnapshotAPI',\n}\n\n/**\n * Init Component\n *\n * Init will run any designated sync/async\n * setup processes and then render any child component\n * upon completion.\n *\n * In our case the children prop component to render is our app.\n *\n * @param {InitProps} props\n */\nexport default function Init(props: InitProps) {\n const {render} = props;\n\n /**\n * Selectors\n */\n\n const daoRegistryContract = useSelector(\n (s: StoreState) => s.contracts.DaoRegistryContract\n );\n\n /**\n * State\n */\n\n const [error, setError] = useState();\n const [isInitComplete, setIsInitComplete] = useState(false);\n const [processReadyMap, setProcessReadyMap] = useState<\n Record\n >({\n [ProcessName.initSnapshotAPI]: AsyncStatus.STANDBY,\n });\n\n /**\n * Our hooks\n */\n\n const {account, web3Instance} = useWeb3Modal();\n const {isDefaultChain} = useIsDefaultChain();\n const {isMountedRef} = useIsMounted();\n const initContracts = useInitContracts();\n\n /**\n * Their hooks\n */\n\n const dispatch = useDispatch();\n\n /**\n * Cached callbacks\n */\n\n const handleInitContractsCached = useCallback(handleInitContracts, [\n initContracts,\n isDefaultChain,\n web3Instance,\n ]);\n\n const handleGetMemberCached = useCallback(handleGetMember, [\n account,\n daoRegistryContract,\n dispatch,\n isDefaultChain,\n web3Instance,\n ]);\n\n const handleGetSnapshotAPIStatusCached = useCallback(\n handleGetSnapshotAPIStatus,\n [isMountedRef]\n );\n\n /**\n * Effects\n */\n\n useEffect(() => {\n setIsInitComplete(\n Object.values(processReadyMap).every((fs) => fs === AsyncStatus.FULFILLED)\n );\n }, [processReadyMap]);\n\n useEffect(() => {\n handleInitContractsCached();\n }, [handleInitContractsCached, web3Instance]);\n\n useEffect(() => {\n handleGetMemberCached();\n }, [handleGetMemberCached]);\n\n useEffect(() => {\n handleGetSnapshotAPIStatusCached();\n }, [handleGetSnapshotAPIStatusCached]);\n\n /**\n * Functions\n */\n\n async function handleGetSnapshotAPIStatus() {\n try {\n if (!SNAPSHOT_HUB_API_URL) {\n throw new Error('No Snapshot Hub API URL was found.');\n }\n\n const {data} = await getSnapshotAPIStatus(SNAPSHOT_HUB_API_URL);\n\n // Choosing a slice of the data to make sure we have a response, not just 200 OK.\n if (!data.version) {\n throw new Error('Snapshot API is not ready.');\n }\n\n if (!isMountedRef.current) return;\n\n setProcessReadyMap((p) => ({\n ...p,\n [ProcessName.initSnapshotAPI]: AsyncStatus.FULFILLED,\n }));\n } catch (error) {\n if (!isMountedRef.current) return;\n\n setError(new Error('Snapshot API is not responding.'));\n }\n }\n\n async function handleInitContracts() {\n try {\n if (!isDefaultChain || !web3Instance) {\n return;\n }\n\n await initContracts({web3Instance});\n } catch (error) {\n setError(error);\n }\n }\n\n async function handleGetMember() {\n try {\n if (\n !account ||\n !daoRegistryContract ||\n !isDefaultChain ||\n !web3Instance\n ) {\n return;\n }\n\n await dispatch(\n getConnectedMember({\n account,\n daoRegistryContract,\n web3Instance,\n })\n );\n } catch (error) {\n setError(error);\n }\n }\n\n // Render children\n return render({error, isInitComplete});\n}\n","import {useLocation} from 'react-router-dom';\n\nimport Footer from './components/Footer';\nimport GlobalConnectWalletModal from './GlobalConnectWalletModal';\nimport Head from './Head';\nimport Header from './components/Header';\nimport Routes from './Routes';\n\ntype AppProps = {\n /**\n * Optionally provide a component to render for the main content.\n */\n renderMainContent?: () => React.ReactNode;\n};\n\nexport default function App(props?: AppProps) {\n /**\n * Their hooks\n */\n\n const {pathname} = useLocation();\n\n /**\n * Variables\n */\n\n const {renderMainContent} = props || {};\n\n const mainContent: React.ReactNode = (\n
{renderMainContent ? renderMainContent() : }
\n );\n\n /**\n * Functions\n */\n\n function renderContent() {\n // The index path has its own template\n if (pathname === '/') {\n return <>{mainContent};\n }\n\n // Render default template\n return (\n <>\n
\n {mainContent}\n