[
  {
    "path": ".gitignore",
    "content": "/target\n/classes\n/checkouts\npom.xml\npom.xml.asc\n*.jar\n*.class\n/.lein-*\n/.nrepl-port\n.hgignore\n.hg/\n.idea\ncontribution.iml\n/figwheel_server.log\n/resources/public/js/compiled/\n/test-fig-out/\n/test-fig-compiled/\n/test-compiled/\n/node_modules/\npackage-lock.json\npackage.json\n/tests/\nresources/public/css/"
  },
  {
    "path": ".travis.yml",
    "content": "language: clojure\nscript: echo \"JUST DEPLOYING\"\nnotifications:\n  email:\n  recipients:\n  - juan@district0x.io\n  slack:\n    on_success: always\n    on_failure: always\n    rooms:\n    - district0x:53vhalUfg0MitsQwzjP5PWdd#travis-ci\nenv:\n  global:\n  - secure: xt6stp9H+jVZuCdL2Hmc4AGv6N4rbooy9cLXPY7N7v6Q9QGnOtOV+mIZkGxI1P3OYE1m+fKW1lEAynxIkJgVOkNlp+JLF279PZaWYrmpHwueX33ElYd8BQelmlYev84jWT4OmFhinWWzfoQHoBTYTpc1bLp/xIlhrFrANLiB4wThq4t+cZcpk3srjcxFL8xS2V6sHzJzBxu637W5vYV7deuHR0pMZJfmxfL252zzMtZYYKxi+3NnFh1gTg8v+w0Whre7elNd7Obq9JypnMjWZRVQ7WnFKQFKZr09cQ3NhuGtA069/Cju9f70cZDnySRxegZ8EZFPhl9tOOjTcagque4eOuylLtRkop3DE4i0xBvptxrXystdPk1nexJimOeZYjukklVRULVRUsTOF7k5g1lriIszPYg+3bIvKRWVFFOrpq47Cud87horbj0Pij+wlmwCNFGkq1lfGMTIN7IUpAC0e3QTzyoBZyEcRn4hSWmbDUvq9C23ZAQuSVbEDcbkt6Xudoyl3O6egGVxRe4Wv552xMNmp57W/vUWhcotzqCyucXYlcQnimyVgy7jKlG7Jn61AyHT7hQMw0qAo99S2vhytJqt+LDrnWLACJ6MhaoKQSmGFvVN96sUXtcEwsmrXbCBol7uT7alP6kE7Hq/llk88e6Mvn4+ANDbUjCnnM0=\n  - secure: 3a07x1H5oEZ10CleLEVJuL/KPE1GVGRFY5MnoMdQ31kCbg+vlVaD9bFXs02Ipck4ELRABzWgM4pFNRlGlFE9GaUDrFEfmC90x8dSFVgATR9nTbkDI5mGUjPNlGQq5z9dvTmP11s/Le1/WS0WxJ0bvl8g3eevozsVcGcXuPsDf77Ghbfo7I5CttotEx+/i9vZZRfiLMMpm+5gRndjAEtqD2wGTrOyBlFfHwfRVR/XadUJIV7r1WxpCQbu4eXcLx95Sv09yBRujMM5xiCD4V50PPaDRbUZFwoCZcPuSzxSOW2pWYbGsesjTwaY/d/Y+nr8zHglcGx/jB7a949Ugk9zr12ttQsf51AfJZHNKHz4J/DCCDIDT+JOSjtGlAIAUvvhvUrfsPa5tHn0c/xJxBRCyFR0je+1TLKPHp0V1WlHIZWxfo2uDNZJf7HGG7fFOPueJNDry3+zVlsBZvXRN6MSE+MxcHBSZP5vTwv3OfVVMNt9Pg3ZkmpHK9x5Kx7xx67TW3d4WKB9HVwdYUm8JnFwJ1f/PzbTv77H27VJzO79Qpd1n2HSKQZiwkiTioxhUlu0b6xadPhHC6XTdgGHwzkCaxIR3ljg8+So3y3DVOMu8M5yXC+7Awwn2NmOWnPXK0cGX7HY1OZrKKtIp6E7gH/+M1mQxzaEuIlc5/YNsiqSMjM=\nservices:\n- docker\ndeploy:\n- provider: script\n  script: bash docker-push.sh prod\n  on:\n    branch: production\n"
  },
  {
    "path": "CONTRIBUTION_FLOW.md",
    "content": "# district0x Contribution Period Flow (DNT Token Sale)\n\n<br>\n<p align=\"center\">\n<img src=\"resources/public/images/dnt-logo-300.png\"/>\n</p>\n\n### Instantiation\n\n#### 1. Deploy contribution contract [District0xContribution.sol](/resources/public/contracts/src/District0xContribution.sol)\ndistrict0x contribution contract will be deployed at least 5 days prior to the beginning of the contribution period.\n\nParameters:\n- _Owners_: Addresses allowed to confirm contract transactions that require multiple signatures. Such as enabling or cancelling contribution period.\n- _Required_: Number of signatures required to run multi-signature transaction\n- _Wallet_: Multi-signature wallet holding raised funds\n- _Cofounder 1_: Address of Matus\n- _Cofounder 2_: Address of Joe\n- _Early Sponsor_: Address of our early sponsor\n- _Advisers_: 4 addresses of advisers consisting of: Luis Cuende from Aragon, Carl Bennett from Status, our legal adviser and community advisers wallet.\nFrom community advisers wallet, DNT rewards will be send after sale to community members listed in this [spreadsheet](https://docs.google.com/spreadsheets/d/11Kw5JK2YTFQzoC5yHH7EcGJAF3Ve9ypz3M6J12h0PmU/edit#gid=0).\n\n#### 2. Deploy MiniMeTokenFactory [MiniMeToken.sol](/resources/public/contracts/src/MiniMeToken.sol)\nMiniMeTokenFactory contract must be deployed, so DNT Token becomes clonable.\n\nNo parameters.\n \n#### 3. Deploy token contract [District0xNetworkToken.sol](/resources/public/contracts/src/District0xNetworkToken.sol)\n\n\nParameters:\n- _Controller_: Address of District0xContribution contract. Its address will be the only one allowed to generate predetermined\n amount of DNT tokens. District0xContribution doesn't implement function to transfer controller ownership, therefore additional\n DNT tokens can never be generated.\n- _TokenFactory_: Address of earlier deployed MiniMeTokenFactory\n\n#### 4. Set DNT Token address `District0xContribution.setDistrict0xNetworkToken()`\nThis method sets address of District0xNetworkToken in contribution contract. At this moment, exactly 1,000,000,000 DNT\ntokens is generated and assigned to contribution contract. \n\nParameters:\n- _district0xNetworkToken_: Address of earlier deployed District0xNetworkToken \n\n\n#### 5. Set contribution period parameters `District0xContribution.setContribPeriod()`\nThis method sets up contribution period parameters and also vesting for founders, early sponsor and advisers. Note, after\nsetting up, contribution period is still not valid. To be valid it must be confirmed by multiple signatures (see following step).\n  \nParameters:\n- _Contribution Period Index_: **0** Index number of contribution period to be set up (0, 1 or 2)\n- _Soft Cap Amount_: **10 Mil USD in ETH** Soft Cap for a contribution period\n- _After Soft Cap Duration_: **48 hours** Time to the end of contribution from the moment of reaching soft cap (unless reaching Hard Cap)\n- _Hard Cap Amount_: **50 Mil USD in ETH** When reached this amount, the contribution period ends instantly\n- _Start Time_: **July 18, 3:00pm UTC** Beginning of a contribution period\n- _End Time_: **August 1, 3:00pm UTC** End of a contribution period, unless Soft or Hard cap is reached\n\n#### 6. Enable contribution period `District0xContribution.enableContribPeriod()`\nThis method will be executed only with multiple signatures 4/6 of our team and trusted individuals from Ethereum community (listed in our whitepaper).\nIt will make a contribution period confirmed with current parameters. \n\nParameters:\n- _Contribution Period Index_: **0** Index number of contribution period to be enabled (0, 1 or 2)\n\n### Contribution\n\n#### 7. Buy DNT tokens `District0xContribution.contribute()` or `District0xContribution.fallback()` \nThis method will save your address and amount of your contribution. If you contribute multiple times from the\nsame address amounts will be added up. Note, since we'll allocate DNT proportionally to the contributed amount, DNT\ntokens will not be send to contributors immediately. Distribution will happen shortly after sale. Contributed\nEther is transferred to our multi-signature wallet after each contribution. Note, **maximum gas price** that can be\nused for contribution is **50Gwei**, otherwise transaction will fail!\n\nNo parameters\n\n#### 8. Emergency stop `District0xContribution.emergencyStop()`\nIn case of emergency, district0x is able to pause contribution period\n\n### After Contribution\n\n#### 9. Send DNT to contributors `District0xContribution.compensateContributors()`\nThis method is called by owner after contribution period ends to distribute DNT in proportional manner. \nIn case of many contributors will need to be executed multiple times, due to gas limit restrictions.\n\nParameters:\n- _Contribution Period Index_: **0** Index number of contribution period to be enabled (0, 1 or 2)\n- _offset_: Number of first contributors to skip.\n- _limit_: Maximum number of contributors compensated with this transaction. Offset and limit parameters are \nused to \"paging\" through contributors\n\n#### 10. Enable DNT transfers `District0xContribution.enableDistrict0xNetworkTokenTransfers()`\nThis method is called by owner after DNT tokens were distributed to all contributors. DNT transfers should be\nenabled in matter of hours after end of contribution period. We'll enable them as soon as we're sure that\ndistribution of DNT went without bugs.\n\nNo Parameters.\n\n#### 11. Cancel following contribution period `District0xContribution.cancelContribPeriod()`\nSecond and third contribution period might be subject to cancellation if district0x doesn't need more funds to\nachieve goals stated in our roadmap. In this case tokens allocated for a contribution period will be destroyed.\nThis method must be executed by multi-signature.\n\nParameters:\n- _Contribution Period Index_: **1** Index number of contribution period to be enabled (1 or 2)\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "LICENSE",
    "content": "THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC\nLICENSE (\"AGREEMENT\"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM\nCONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.\n\n1. DEFINITIONS\n\n\"Contribution\" means:\n\na) in the case of the initial Contributor, the initial code and\ndocumentation distributed under this Agreement, and\n\nb) in the case of each subsequent Contributor:\n\ni) changes to the Program, and\n\nii) additions to the Program;\n\nwhere such changes and/or additions to the Program originate from and are\ndistributed by that particular Contributor. A Contribution 'originates' from\na Contributor if it was added to the Program by such Contributor itself or\nanyone acting on such Contributor's behalf. Contributions do not include\nadditions to the Program which: (i) are separate modules of software\ndistributed in conjunction with the Program under their own license\nagreement, and (ii) are not derivative works of the Program.\n\n\"Contributor\" means any person or entity that distributes the Program.\n\n\"Licensed Patents\" mean patent claims licensable by a Contributor which are\nnecessarily infringed by the use or sale of its Contribution alone or when\ncombined with the Program.\n\n\"Program\" means the Contributions distributed in accordance with this\nAgreement.\n\n\"Recipient\" means anyone who receives the Program under this Agreement,\nincluding all Contributors.\n\n2. GRANT OF RIGHTS\n\na) Subject to the terms of this Agreement, each Contributor hereby grants\nRecipient a non-exclusive, worldwide, royalty-free copyright license to\nreproduce, prepare derivative works of, publicly display, publicly perform,\ndistribute and sublicense the Contribution of such Contributor, if any, and\nsuch derivative works, in source code and object code form.\n\nb) Subject to the terms of this Agreement, each Contributor hereby grants\nRecipient a non-exclusive, worldwide, royalty-free patent license under\nLicensed Patents to make, use, sell, offer to sell, import and otherwise\ntransfer the Contribution of such Contributor, if any, in source code and\nobject code form.  This patent license shall apply to the combination of the\nContribution and the Program if, at the time the Contribution is added by the\nContributor, such addition of the Contribution causes such combination to be\ncovered by the Licensed Patents. The patent license shall not apply to any\nother combinations which include the Contribution. No hardware per se is\nlicensed hereunder.\n\nc) Recipient understands that although each Contributor grants the licenses\nto its Contributions set forth herein, no assurances are provided by any\nContributor that the Program does not infringe the patent or other\nintellectual property rights of any other entity. Each Contributor disclaims\nany liability to Recipient for claims brought by any other entity based on\ninfringement of intellectual property rights or otherwise. As a condition to\nexercising the rights and licenses granted hereunder, each Recipient hereby\nassumes sole responsibility to secure any other intellectual property rights\nneeded, if any. For example, if a third party patent license is required to\nallow Recipient to distribute the Program, it is Recipient's responsibility\nto acquire that license before distributing the Program.\n\nd) Each Contributor represents that to its knowledge it has sufficient\ncopyright rights in its Contribution, if any, to grant the copyright license\nset forth in this Agreement.\n\n3. REQUIREMENTS\n\nA Contributor may choose to distribute the Program in object code form under\nits own license agreement, provided that:\n\na) it complies with the terms and conditions of this Agreement; and\n\nb) its license agreement:\n\ni) effectively disclaims on behalf of all Contributors all warranties and\nconditions, express and implied, including warranties or conditions of title\nand non-infringement, and implied warranties or conditions of merchantability\nand fitness for a particular purpose;\n\nii) effectively excludes on behalf of all Contributors all liability for\ndamages, including direct, indirect, special, incidental and consequential\ndamages, such as lost profits;\n\niii) states that any provisions which differ from this Agreement are offered\nby that Contributor alone and not by any other party; and\n\niv) states that source code for the Program is available from such\nContributor, and informs licensees how to obtain it in a reasonable manner on\nor through a medium customarily used for software exchange.\n\nWhen the Program is made available in source code form:\n\na) it must be made available under this Agreement; and\n\nb) a copy of this Agreement must be included with each copy of the Program.\n\nContributors may not remove or alter any copyright notices contained within\nthe Program.\n\nEach Contributor must identify itself as the originator of its Contribution,\nif any, in a manner that reasonably allows subsequent Recipients to identify\nthe originator of the Contribution.\n\n4. COMMERCIAL DISTRIBUTION\n\nCommercial distributors of software may accept certain responsibilities with\nrespect to end users, business partners and the like. While this license is\nintended to facilitate the commercial use of the Program, the Contributor who\nincludes the Program in a commercial product offering should do so in a\nmanner which does not create potential liability for other Contributors.\nTherefore, if a Contributor includes the Program in a commercial product\noffering, such Contributor (\"Commercial Contributor\") hereby agrees to defend\nand indemnify every other Contributor (\"Indemnified Contributor\") against any\nlosses, damages and costs (collectively \"Losses\") arising from claims,\nlawsuits and other legal actions brought by a third party against the\nIndemnified Contributor to the extent caused by the acts or omissions of such\nCommercial Contributor in connection with its distribution of the Program in\na commercial product offering.  The obligations in this section do not apply\nto any claims or Losses relating to any actual or alleged intellectual\nproperty infringement. In order to qualify, an Indemnified Contributor must:\na) promptly notify the Commercial Contributor in writing of such claim, and\nb) allow the Commercial Contributor to control, and cooperate with the\nCommercial Contributor in, the defense and any related settlement\nnegotiations. The Indemnified Contributor may participate in any such claim\nat its own expense.\n\nFor example, a Contributor might include the Program in a commercial product\noffering, Product X. That Contributor is then a Commercial Contributor. If\nthat Commercial Contributor then makes performance claims, or offers\nwarranties related to Product X, those performance claims and warranties are\nsuch Commercial Contributor's responsibility alone. Under this section, the\nCommercial Contributor would have to defend claims against the other\nContributors related to those performance claims and warranties, and if a\ncourt requires any other Contributor to pay any damages as a result, the\nCommercial Contributor must pay those damages.\n\n5. NO WARRANTY\n\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON\nAN \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER\nEXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR\nCONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A\nPARTICULAR PURPOSE. Each Recipient is solely responsible for determining the\nappropriateness of using and distributing the Program and assumes all risks\nassociated with its exercise of rights under this Agreement , including but\nnot limited to the risks and costs of program errors, compliance with\napplicable laws, damage to or loss of data, programs or equipment, and\nunavailability or interruption of operations.\n\n6. DISCLAIMER OF LIABILITY\n\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY\nCONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION\nLOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE\nEXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY\nOF SUCH DAMAGES.\n\n7. GENERAL\n\nIf any provision of this Agreement is invalid or unenforceable under\napplicable law, it shall not affect the validity or enforceability of the\nremainder of the terms of this Agreement, and without further action by the\nparties hereto, such provision shall be reformed to the minimum extent\nnecessary to make such provision valid and enforceable.\n\nIf Recipient institutes patent litigation against any entity (including a\ncross-claim or counterclaim in a lawsuit) alleging that the Program itself\n(excluding combinations of the Program with other software or hardware)\ninfringes such Recipient's patent(s), then such Recipient's rights granted\nunder Section 2(b) shall terminate as of the date such litigation is filed.\n\nAll Recipient's rights under this Agreement shall terminate if it fails to\ncomply with any of the material terms or conditions of this Agreement and\ndoes not cure such failure in a reasonable period of time after becoming\naware of such noncompliance. If all Recipient's rights under this Agreement\nterminate, Recipient agrees to cease use and distribution of the Program as\nsoon as reasonably practicable. However, Recipient's obligations under this\nAgreement and any licenses granted by Recipient relating to the Program shall\ncontinue and survive.\n\nEveryone is permitted to copy and distribute copies of this Agreement, but in\norder to avoid inconsistency the Agreement is copyrighted and may only be\nmodified in the following manner. The Agreement Steward reserves the right to\npublish new versions (including revisions) of this Agreement from time to\ntime. No one other than the Agreement Steward has the right to modify this\nAgreement. The Eclipse Foundation is the initial Agreement Steward. The\nEclipse Foundation may assign the responsibility to serve as the Agreement\nSteward to a suitable separate entity. Each new version of the Agreement will\nbe given a distinguishing version number. The Program (including\nContributions) may always be distributed subject to the version of the\nAgreement under which it was received. In addition, after a new version of\nthe Agreement is published, Contributor may elect to distribute the Program\n(including its Contributions) under the new version. Except as expressly\nstated in Sections 2(a) and 2(b) above, Recipient receives no rights or\nlicenses to the intellectual property of any Contributor under this\nAgreement, whether expressly, by implication, estoppel or otherwise. All\nrights in the Program not expressly granted under this Agreement are\nreserved.\n\nThis Agreement is governed by the laws of the State of New York and the\nintellectual property laws of the United States of America. No party to this\nAgreement will bring a legal action under this Agreement more than one year\nafter the cause of action arose. Each party waives its rights to a jury trial\nin any resulting litigation.\n"
  },
  {
    "path": "README.md",
    "content": "# district0x Network Token [Join our discord](https://discord.gg/Gjvw7qU)\n\n[![Build Status](https://travis-ci.org/district0x/district0x-network-token.svg?branch=master)](https://travis-ci.org/district0x/district0x-network-token)\n\n<img src=\"resources/public/images/dnt-header.jpg\"/>\n\nRead More:\n- [Contribution Period Flow](/CONTRIBUTION_FLOW.md)\n\n## ABIs\n\nContribution [0xf8094e15c897518b5ac5287d7070ca5850efc6ff](https://etherscan.io/address/0xf8094e15c897518b5ac5287d7070ca5850efc6ff):\n```json\n[{\"constant\":true,\"inputs\":[],\"name\":\"totalContributed\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_minContribAmount\",\"type\":\"uint256\"}],\"name\":\"setMinContribAmount\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"advisers\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"founder1\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"EARLY_CONTRIBUTOR_STAKE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"tokenAddr\",\"type\":\"address\"}],\"name\":\"reclaimToken\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"contributors\",\"outputs\":[{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"isCompensated\",\"type\":\"bool\"},{\"name\":\"amountCompensated\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"COMMUNITY_ADVISERS_STAKE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_softCapAmount\",\"type\":\"uint256\"},{\"name\":\"_afterSoftCapDuration\",\"type\":\"uint256\"},{\"name\":\"_hardCapAmount\",\"type\":\"uint256\"},{\"name\":\"_startTime\",\"type\":\"uint256\"},{\"name\":\"_endTime\",\"type\":\"uint256\"}],\"name\":\"setContribPeriod\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ADVISER_STAKE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"softCapReached\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"endTime\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"claimTokensFromTokenDistrict0xNetworkToken\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"contributorAddress\",\"type\":\"address\"}],\"name\":\"getContributor\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"maxGasPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ADVISER_STAKE2\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"contributorsKeys\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"onTransfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"TEAM_VESTING_CLIFF\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"EARLY_CONTRIBUTOR_VESTING_CLIFF\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"enableContribPeriod\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minContribAmount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"afterSoftCapDuration\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"emergencyStop\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isEnabled\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getConfiguration\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"},{\"name\":\"_advisers\",\"type\":\"address[]\"},{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"FOUNDER2_STAKE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"CONTRIB_PERIOD2_STAKE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"stopped\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"startTime\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"contributor\",\"type\":\"address\"}],\"name\":\"contributeWithAddress\",\"outputs\":[],\"payable\":true,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"founder2\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"earlySponsor\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"CONTRIB_PERIOD3_STAKE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"release\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"multisigWallet\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"hardCapReached\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"changeOwner\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"enableDistrict0xNetworkTokenTransfers\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"tokenTransfersEnabled\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"offset\",\"type\":\"uint256\"},{\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"getUncompensatedContributors\",\"outputs\":[{\"name\":\"contributorIndexes\",\"type\":\"uint256[]\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getNow\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"from_\",\"type\":\"address\"},{\"name\":\"value_\",\"type\":\"uint256\"},{\"name\":\"data_\",\"type\":\"bytes\"}],\"name\":\"tokenFallback\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"kill\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"hardCapAmount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isContribPeriodRunning\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_maxGasPrice\",\"type\":\"uint256\"}],\"name\":\"setMaxGasPrice\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"newOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"contribute\",\"outputs\":[],\"payable\":true,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"onApprove\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_district0xNetworkToken\",\"type\":\"address\"}],\"name\":\"setDistrict0xNetworkToken\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"TEAM_VESTING_PERIOD\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"district0xNetworkToken\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getContribPeriod\",\"outputs\":[{\"name\":\"boolValues\",\"type\":\"bool[3]\"},{\"name\":\"uintValues\",\"type\":\"uint256[8]\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"tokenAddr\",\"type\":\"address\"}],\"name\":\"isTokenSaleToken\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"CONTRIB_PERIOD1_STAKE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"EARLY_CONTRIBUTOR_VESTING_PERIOD\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"proxyPayment\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":true,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"softCapAmount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"FOUNDER1_STAKE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"offset\",\"type\":\"uint256\"},{\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"compensateContributors\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"inputs\":[{\"name\":\"_multisigWallet\",\"type\":\"address\"},{\"name\":\"_founder1\",\"type\":\"address\"},{\"name\":\"_founder2\",\"type\":\"address\"},{\"name\":\"_earlySponsor\",\"type\":\"address\"},{\"name\":\"_advisers\",\"type\":\"address[]\"}],\"payable\":false,\"type\":\"constructor\"},{\"payable\":true,\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"totalContributed\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"contributor\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"contributorsCount\",\"type\":\"uint256\"}],\"name\":\"onContribution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"onSoftCapReached\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"onHardCapReached\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"contributor\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"onCompensated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"isStopped\",\"type\":\"bool\"}],\"name\":\"onEmergencyChanged\",\"type\":\"event\"}]\n```\n\nDNT [0x0abdace70d3790235af448c88547603b945604ea](https://etherscan.io/address/0x0abdace70d3790235af448c88547603b945604ea):\n```json\n[{\"constant\":true,\"inputs\":[{\"name\":\"_holder\",\"type\":\"address\"}],\"name\":\"tokenGrantsCount\",\"outputs\":[{\"name\":\"index\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"creationBlock\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"grants\",\"outputs\":[{\"name\":\"granter\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"cliff\",\"type\":\"uint64\"},{\"name\":\"vesting\",\"type\":\"uint64\"},{\"name\":\"start\",\"type\":\"uint64\"},{\"name\":\"revokable\",\"type\":\"bool\"},{\"name\":\"burnsOnRevoke\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newController\",\"type\":\"address\"}],\"name\":\"changeController\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"balanceOfAt\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_holder\",\"type\":\"address\"},{\"name\":\"_grantId\",\"type\":\"uint256\"}],\"name\":\"tokenGrant\",\"outputs\":[{\"name\":\"granter\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"vested\",\"type\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint64\"},{\"name\":\"cliff\",\"type\":\"uint64\"},{\"name\":\"vesting\",\"type\":\"uint64\"},{\"name\":\"revokable\",\"type\":\"bool\"},{\"name\":\"burnsOnRevoke\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_cloneTokenName\",\"type\":\"string\"},{\"name\":\"_cloneDecimalUnits\",\"type\":\"uint8\"},{\"name\":\"_cloneTokenSymbol\",\"type\":\"string\"},{\"name\":\"_snapshotBlock\",\"type\":\"uint256\"},{\"name\":\"_transfersEnabled\",\"type\":\"bool\"}],\"name\":\"createCloneToken\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_token\",\"type\":\"address\"},{\"name\":\"_claimer\",\"type\":\"address\"}],\"name\":\"claimTokens\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"holder\",\"type\":\"address\"}],\"name\":\"lastTokenIsTransferableDate\",\"outputs\":[{\"name\":\"date\",\"type\":\"uint64\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"balance\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"parentToken\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"generateTokens\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"grantsController\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"},{\"name\":\"_start\",\"type\":\"uint64\"},{\"name\":\"_cliff\",\"type\":\"uint64\"},{\"name\":\"_vesting\",\"type\":\"uint64\"},{\"name\":\"_revokable\",\"type\":\"bool\"},{\"name\":\"_burnsOnRevoke\",\"type\":\"bool\"}],\"name\":\"grantVestedTokens\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"totalSupplyAt\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"transfersEnabled\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"parentSnapShotBlock\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"approveAndCall\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_holder\",\"type\":\"address\"}],\"name\":\"revokeAllTokenGrants\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"holder\",\"type\":\"address\"},{\"name\":\"time\",\"type\":\"uint64\"}],\"name\":\"transferableTokens\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"destroyTokens\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"remaining\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\"},{\"name\":\"time\",\"type\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint256\"},{\"name\":\"cliff\",\"type\":\"uint256\"},{\"name\":\"vesting\",\"type\":\"uint256\"}],\"name\":\"calculateVestedTokens\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newController\",\"type\":\"address\"}],\"name\":\"changeGrantsController\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"tokenFactory\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_holder\",\"type\":\"address\"},{\"name\":\"_grantId\",\"type\":\"uint256\"}],\"name\":\"revokeTokenGrant\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_transfersEnabled\",\"type\":\"bool\"}],\"name\":\"enableTransfers\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"controller\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[{\"name\":\"_controller\",\"type\":\"address\"},{\"name\":\"_tokenFactory\",\"type\":\"address\"}],\"payable\":false,\"type\":\"constructor\"},{\"payable\":true,\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"grantId\",\"type\":\"uint256\"}],\"name\":\"NewTokenGrant\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_claimer\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"ClaimedTokens\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_cloneToken\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_snapshotBlock\",\"type\":\"uint256\"}],\"name\":\"NewCloneToken\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"}]\n```\n\nMultisig [0xd20e4d854c71de2428e1268167753e4c7070ae68](https://etherscan.io/address/0xd20e4d854c71de2428e1268167753e4c7070ae68):\n```json\n[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"removeOwner\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"revokeConfirmation\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"confirmations\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"pending\",\"type\":\"bool\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"name\":\"getTransactionCount\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"addOwner\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"isConfirmed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"getConfirmationCount\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"transactions\",\"outputs\":[{\"name\":\"destination\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwners\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"from\",\"type\":\"uint256\"},{\"name\":\"to\",\"type\":\"uint256\"},{\"name\":\"pending\",\"type\":\"bool\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"name\":\"getTransactionIds\",\"outputs\":[{\"name\":\"_transactionIds\",\"type\":\"uint256[]\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"getConfirmations\",\"outputs\":[{\"name\":\"_confirmations\",\"type\":\"address[]\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"transactionCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_required\",\"type\":\"uint256\"}],\"name\":\"changeRequirement\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"confirmTransaction\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"destination\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"submitTransaction\",\"outputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MAX_OWNER_COUNT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"required\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"replaceOwner\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"executeTransaction\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"inputs\":[{\"name\":\"_owners\",\"type\":\"address[]\"},{\"name\":\"_required\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"constructor\"},{\"payable\":true,\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Confirmation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Revocation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Submission\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Execution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"ExecutionFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerAddition\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"RequirementChange\",\"type\":\"event\"}]\n```\n\n## Technical definition\n\nAt the technical level DNT is a ERC20-compliant token, derived from the [MiniMeToken](https://github.com/Giveth/minime) that allows for token cloning (forking), which will be useful for many future usecases.\n\nVesting functionality derived from [VestedToken](https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/VestedToken.sol) \nis also built-in into our token. Founders, advisors and early contributor have their tokens vested. \n\n## Contracts\n\nToken:\n\n- [District0xNetworkToken.sol](/resources/public/contracts/src/District0xNetworkToken.sol): Main contract for DNT token. Derives MiniMeToken and VestedToken\n- [MiniMeToken.sol](/resources/public/contracts/src/MiniMeToken.sol): Our slightly modified version of Giveth's [MiniMeToken](https://github.com/Giveth/minime)\n- [VestedToken.sol](/resources/public/contracts/src/VestedToken.sol): Our slightly modified version of OpenZeppelin's [VestedToken](https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/VestedToken.sol)\n\nContribution:\n\n- [District0xContribution.sol](/resources/public/contracts/src/District0xContribution.sol): Implementation of our token sale\n- [MultisigWallet.sol](/resources/public/contracts/src/District0xContribution.sol): Consensys multisig wallet used for district0x funds\n\n## Tests\nTo run our smart-contract tests you need to have [node](https://nodejs.org/en/) installed on your machine.\nOur tests are written in Clojurescript here [tests.cljs](/test/contribution/tests.cljs), but they are compiled into Javascript\nhere [contribution-tests.js](/contribution-tests.js), so you don't need to do that. You can just run tests with following commands:\n```bash\nnpm install\nnode contribution-tests.js\n```\n"
  },
  {
    "path": "compile-solidity.sh",
    "content": "#!/usr/bin/env bash\ncd resources/public/contracts/src\n\n#solc --overwrite --optimize --bin --abi District0xNetworkToken.sol -o ../build/\n#solc --overwrite --optimize --bin --abi MultisigWallet.sol -o ../build/\n#solc --overwrite --optimize --bin --abi District0xContribution.sol -o ../build/\nsolc --overwrite --optimize --bin --abi TokenVesting.sol -o ../build/\n\n\ncd ../build\n#wc -c District0xNetworkToken.bin | awk '{print \"District0xNetworkToken: \" $1}'\n#wc -c District0xContribution.bin | awk '{print \"District0xContribution: \" $1}'\n#wc -c MiniMeTokenFactory.bin | awk '{print \"MiniMeTokenFactory: \" $1}'\n#wc -c MultisigWallet.bin | awk '{print \"MultisigWallet: \" $1}'\n\nwc -c TokenVesting.bin | awk '{print \"TokenVesting: \" $1}'"
  },
  {
    "path": "docker-builds/ui/Dockerfile",
    "content": "FROM debian:stretch-slim\nMAINTAINER \"Filip Bielejec\" <filip@district0x.io>\n\nRUN apt-get update -y \\\n    && apt-get install --no-install-recommends -y \\\n    -q wget nginx\n\n# replace nginx config\nCOPY docker-builds/ui/nginx.conf /etc/nginx/nginx.conf\n\n# replace default server\nCOPY docker-builds/ui/default /etc/nginx/sites-available/default\n\n# nginx config\nCOPY docker-builds/ui/contribution.district0x.io /etc/nginx/sites-available/contribution.district0x.io\n\n# setup error page\nRUN wget --no-check-certificate -O X0X.html https://raw.githubusercontent.com/district0x/X0X/master/X0X.html \\\n  && mv X0X.html /usr/share/nginx/html/X0X.html\n\n# setup static server\nRUN ln -s -f /etc/nginx/sites-available/contribution.district0x.io /etc/nginx/sites-enabled/contribution.district0x.io\n\n# get compiled JS\nCOPY resources/public /app/resources/public/\n\nEXPOSE 80\nCMD [\"nginx\", \"-g\", \"daemon off;\"]\n"
  },
  {
    "path": "docker-builds/ui/contribution.district0x.io",
    "content": "server {\n\n  listen 80 default_server;\n\n  root /app/resources/public/;\n  index index.html;\n\n  location / {\n    # add_header Cache-Control \"no-store\";\n    expires 1h;\n    add_header Cache-Control \"public\";\n    try_files $uri $uri/index.html /index.html;\n  }\n\n  location ~ /(contracts|images|assets|js|css|fonts)(.*)$ {\n    expires 1h;\n    add_header Cache-Control \"public\";\n    rewrite /(contracts|images|assets|js|css|fonts)(.*) /$1$2 break;\n    try_files $uri $uri/index.html /index.html;\n  }\n\n  location = /X0X.html {\n    root /usr/share/nginx/html/;\n    internal;\n   }\n\n  # redirect server error pages to the static error page\n  error_page 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 420 422 423 424 426 428 429 431 444 449 450 451 500 501 502 503 504 505 506 507 508 509 510 511 /X0X.html;\n\n}\n"
  },
  {
    "path": "docker-builds/ui/default",
    "content": "##\n# You should look at the following URL's in order to grasp a solid understanding\n# of Nginx configuration files in order to fully unleash the power of Nginx.\n# http://wiki.nginx.org/Pitfalls\n# http://wiki.nginx.org/QuickStart\n# http://wiki.nginx.org/Configuration\n#\n# Generally, you will want to move this file somewhere, and start with a clean\n# file but keep this around for reference. Or just disable in sites-enabled.\n#\n# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.\n##\n\n# Default server configuration\n#\n# server {\n#         listen 80 default_server;\n#         listen [::]:80 default_server;\n\n#         # SSL configuration\n#         #\n#         # listen 443 ssl default_server;\n#         # listen [::]:443 ssl default_server;\n#         #\n#         # Note: You should disable gzip for SSL traffic.\n#         # See: https://bugs.debian.org/773332\n#         #\n#         # Read up on ssl_ciphers to ensure a secure configuration.\n#         # See: https://bugs.debian.org/765782\n#         #\n#         # Self signed certs generated by the ssl-cert package\n#         # Don't use them in a production server!\n#         #\n#         # include snippets/snakeoil.conf;\n\n#         root /var/www/html;\n\n#         # Add index.php to the list if you are using PHP\n#         index index.html index.htm index.nginx-debian.html;\n\n#         server_name _;\n\n#         location / {\n#                 # First attempt to serve request as file, then\n#                 # as directory, then fall back to displaying a 404.\n#                 try_files $uri $uri/ =404;\n# \t        # proxy_pass http://localhost:8080;\n#         \t# proxy_http_version 1.1;\n# \t        # proxy_set_header Upgrade $http_upgrade;\n#         \t# proxy_set_header Connection 'upgrade';\n# \t        # proxy_set_header Host $host;\n#         \t# proxy_cache_bypass $http_upgrade;\n#         }\n\n#         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000\n#         #\n#         #location ~ \\.php$ {\n#         #       include snippets/fastcgi-php.conf;\n#         #\n#         #       # With php7.0-cgi alone:\n#         #       fastcgi_pass 127.0.0.1:9000;\n#         #       # With php7.0-fpm:\n#         #       fastcgi_pass unix:/run/php/php7.0-fpm.sock;\n#         #}\n\n#         # deny access to .htaccess files, if Apache's document root\n#         # concurs with nginx's one\n#         #\n#         #location ~ /\\.ht {\n#         #       deny all;\n#         #}\n# }\n\n\n# Virtual Host configuration for example.com\n#\n# You can move that to a different file under sites-available/ and symlink that\n# to sites-enabled/ to enable it.\n#\n#server {\n#       listen 80;\n#       listen [::]:80;\n#\n#       server_name example.com;\n#\n#       root /var/www/example.com;\n#       index index.html;\n#\n#       location / {\n#               try_files $uri $uri/ =404;\n#       }\n#}"
  },
  {
    "path": "docker-builds/ui/nginx.conf",
    "content": "user www-data;\nworker_processes auto;\npid /run/nginx.pid;\ninclude /etc/nginx/modules-enabled/*.conf;\n\nevents {\n\tworker_connections 768;\n\t# multi_accept on;\n}\n\nhttp {\n\n\t##\n\t# Basic Settings\n\t##\n\n\tsendfile on;\n\ttcp_nopush on;\n\ttcp_nodelay on;\n\tkeepalive_timeout 65;\n\ttypes_hash_max_size 2048;\n\t# server_tokens off;\n\n\t# server_names_hash_bucket_size 64;\n\t# server_name_in_redirect off;\n\n\tinclude /etc/nginx/mime.types;\n\tdefault_type application/octet-stream;\n\n\t##\n\t# SSL Settings\n\t##\n\n\tssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE\n\tssl_prefer_server_ciphers on;\n\n\t##\n\t# Logging Settings\n\t##\n\n       log_format main '$remote_addr - $remote_user [$time_local] \"$request\" '\n                        '$status $body_bytes_sent \"$http_referer\" '\n                        '\"$http_user_agent\" \"$http_x_forwarded_for\"';\n\n\taccess_log /var/log/nginx/access.log main;\n\terror_log /var/log/nginx/error.log;\n\n\t##\n\t# Gzip Settings\n\t##\n\n        gzip on;\n        gzip_vary on;\n        gzip_min_length 10240;\n        gzip_proxied expired no-cache no-store private auth;\n        gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml application/javascript;\n        gzip_disable \"MSIE [1-6]\\.\";\n\n\t# gzip on;\n\t# gzip_vary on;\n\t# gzip_proxied any;\n\t# gzip_comp_level 6;\n\t# gzip_buffers 16 8k;\n\t# gzip_http_version 1.1;\n\t# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;\n\n\t##\n\t# Virtual Host Configs\n\t##\n\n\tinclude /etc/nginx/conf.d/*.conf;\n\tinclude /etc/nginx/sites-enabled/*;\n\n\t##\n\t# user settings\n\t##\n\n        server_names_hash_bucket_size 64;\n        # set client body size\n        client_max_body_size 10M;\n}\n\n\n#mail {\n#\t# See sample authentication script at:\n#\t# http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript\n# \n#\t# auth_http localhost/auth.php;\n#\t# pop3_capabilities \"TOP\" \"USER\";\n#\t# imap_capabilities \"IMAP4rev1\" \"UIDPLUS\";\n# \n#\tserver {\n#\t\tlisten     localhost:110;\n#\t\tprotocol   pop3;\n#\t\tproxy      on;\n#\t}\n# \n#\tserver {\n#\t\tlisten     localhost:143;\n#\t\tprotocol   imap;\n#\t\tproxy      on;\n#\t}\n#}\n"
  },
  {
    "path": "docker-push.sh",
    "content": "#!/bin/bash\n\n#--- ARGS\n\nBUILD_ENV=$1\n\n#--- FUNCTIONS\n\nfunction build {\n  {\n    NAME=$1\n    BUILD_ENV=$2\n    TAG=$(git log -1 --pretty=%h)\n    IMG=$NAME:$TAG\n\n    SERVICE=$(echo $NAME | cut -d \"-\" -f 2)\n\n    echo \"=============================================\"\n    echo  \"[\"$BUILD_ENV\"] [\"$SERVICE\"] Buidling: \"$IMG\"\"\n    echo \"=============================================\"\n\n    lein less4j once\n    lein cljsbuild once \"min\"\n\n    docker build -t $IMG -f docker-builds/$SERVICE/Dockerfile .\n\n    case $BUILD_ENV in\n      # \"qa\")\n      #   # qa images are tagged as `latest`\n      #   docker tag $IMG $NAME:latest\n      #   ;;\n      \"prod\")\n        # prod images are tagged as `release`\n        docker tag $IMG $NAME:release\n        ;;\n      *)\n        echo \"ERROR: don't know what to do with BUILD_ENV: \"$BUILD_ENV\"\"\n        exit 1\n        ;;\n    esac\n\n  } || {\n    echo \"EXCEPTION WHEN BUIDLING \"$IMG\"\"\n    exit 1\n  }\n}\n\nfunction push {\n  NAME=$1\n  echo \"Pushing: \" $NAME\n  docker push $NAME\n}\n\nfunction login {\n  echo \"$DOCKER_PASSWORD\" | docker login -u \"$DOCKER_USERNAME\" --password-stdin\n}\n\nfunction before {\n  lein deps\n  lein npm install\n#  lein compile-solidity\n}\n\n#--- EXECUTE\n\nbefore\nlogin\n\nimages=(\n  district0x/contribution-ui\n)\n\nfor i in \"${images[@]}\"; do\n  (\n    build $i $BUILD_ENV\n    push $i\n  )\n\ndone # END: i loop\n\nexit $?\n"
  },
  {
    "path": "project.clj",
    "content": "(defproject contribution \"0.1.0-SNAPSHOT\"\n  :description \"Contribution period for district0x\"\n  :url \"http://contribution.district0x.io\"\n  :license {:name \"Eclipse Public License\"\n            :url \"http://www.eclipse.org/legal/epl-v10.html\"}\n  :dependencies [[cljs-react-material-ui \"0.2.44\"]\n                 [cljs-web3 \"0.19.0-0-5\"]\n                 [day8.re-frame/async-flow-fx \"0.0.6\"]\n                 [district0x \"0.1.19\"]\n                 [lein-doo \"0.1.7\"]\n                 [madvas/reagent-patched \"0.6.1\" :exclusions [cljsjs/react cljsjs/react-dom]]\n                 [medley \"0.8.3\"]\n                 [org.clojure/clojurescript \"1.9.671\"]\n                 [print-foo-cljs \"2.0.3\"]\n                 [re-frame \"0.9.4\" :exclusions [reagent]]]\n\n  :plugins [[lein-auto \"0.1.2\"]\n            [lein-cljsbuild \"1.1.4\"]\n            [lein-shell \"0.5.0\"]\n            [deraen/lein-less4j \"0.5.0\"]\n            [lein-npm \"0.6.2\"]\n            [lein-doo \"0.1.7\"]]\n\n  :jvm-opts [\"-Xss3m\" \"-XX:+TieredCompilation\" \"-XX:TieredStopAtLevel=1\"]\n\n  :npm {:dependencies [[source-map-support \"0.4.0\"]\n                       [web3 \"0.19.0\"]\n                       [ws \"2.0.1\"]\n                       [ethereumjs-testrpc \"3.0.3\"]\n                       [solc \"0.4.11\"]]}\n\n  :min-lein-version \"2.5.3\"\n\n  :source-paths [\"src/cljs\"]\n\n  :clean-targets ^{:protect false} [\"resources/public/js/compiled\" \"resources/public/css\" \"target\"]\n\n  :figwheel {:server-port 6376}\n\n  :auto {\"compile-solidity\" {:file-pattern #\"\\.(sol)$\"\n                             :paths [\"resources/public/contracts/src\"]}}\n\n  :aliases {\"compile-solidity\" [\"shell\" \"./compile-solidity.sh\"]}\n\n  :less {:source-paths [\"resources/public/less\"]\n         :target-path \"resources/public/css\"\n         :target-dir \"resources/public/css\"\n         :source-map true\n         :compression true}\n\n  :profiles {:dev\n             {:dependencies [[org.clojure/clojure \"1.8.0\"]\n                             [binaryage/devtools \"0.9.4\"]\n                             [com.cemerick/piggieback \"0.2.1\"]\n                             [figwheel-sidecar \"0.5.10\"]\n                             [org.clojure/tools.nrepl \"0.2.13\"]]\n              :plugins [[lein-figwheel \"0.5.10\"]]\n              :source-paths []\n              :resource-paths [\"resources\"]\n              :cljsbuild {:builds [{:id \"dev\"\n                                    :source-paths [\"src/cljs\"]\n                                    :figwheel {:on-jsload \"contribution.core/mount-root\"}\n                                    :compiler {:main \"contribution.core\"\n                                               :output-to \"resources/public/js/compiled/app.js\"\n                                               :output-dir \"resources/public/js/compiled/out\"\n                                               :asset-path \"js/compiled/out\"\n                                               :source-map-timestamp true\n                                               :preloads [print.foo.preloads.devtools]\n                                               :closure-defines {goog.DEBUG true}\n                                               :external-config {:devtools/config {:features-to-install :all}}}}\n                                   {:id \"min\"\n                                    :source-paths [\"src/cljs\"]\n                                    :compiler {:main \"contribution.core\"\n                                               :output-to \"resources/public/js/compiled/app.js\"\n                                               :optimizations :advanced\n                                               :closure-defines {goog.DEBUG false}\n                                               :pretty-print false\n                                               :pseudo-names false}}\n                                   {:id \"tests\"\n                                    :source-paths [\"src/cljs\" \"test\"]\n                                    :figwheel true\n                                    :compiler {:main \"contribution.cmd\"\n                                               :output-to \"tests/contribution-tests.js\",\n                                               :output-dir \"tests\",\n                                               :target :nodejs,\n                                               :optimizations :none,\n                                               :verbose true\n                                               :source-map true}}]}}})\n"
  },
  {
    "path": "resources/public/contracts/build/ApproveAndCallFallBack.abi",
    "content": "[{\"constant\":false,\"inputs\":[{\"name\":\"from\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"},{\"name\":\"_token\",\"type\":\"address\"},{\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"receiveApproval\",\"outputs\":[],\"payable\":false,\"type\":\"function\"}]"
  },
  {
    "path": "resources/public/contracts/build/ApproveAndCallReceiver.abi",
    "content": "[{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"},{\"name\":\"_token\",\"type\":\"address\"},{\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"receiveApproval\",\"outputs\":[],\"payable\":false,\"type\":\"function\"}]"
  },
  {
    "path": "resources/public/contracts/build/BasicToken.abi",
    "content": "[{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"balance\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"}]"
  },
  {
    "path": "resources/public/contracts/build/Controlled.abi",
    "content": "[{\"constant\":false,\"inputs\":[{\"name\":\"_newController\",\"type\":\"address\"}],\"name\":\"changeController\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"controller\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"type\":\"constructor\"}]"
  },
  {
    "path": "resources/public/contracts/build/Controller.abi",
    "content": "[{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"onTransfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"onApprove\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"proxyPayment\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":true,\"type\":\"function\"}]"
  },
  {
    "path": "resources/public/contracts/build/D0xToken.abi",
    "content": "[{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"},{\"name\":\"_start\",\"type\":\"uint64\"},{\"name\":\"_cliff\",\"type\":\"uint64\"},{\"name\":\"_vesting\",\"type\":\"uint64\"}],\"name\":\"grantVestedTokens\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_holder\",\"type\":\"address\"}],\"name\":\"tokenGrantsCount\",\"outputs\":[{\"name\":\"index\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minter\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"grants\",\"outputs\":[{\"name\":\"granter\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"cliff\",\"type\":\"uint64\"},{\"name\":\"vesting\",\"type\":\"uint64\"},{\"name\":\"start\",\"type\":\"uint64\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_holder\",\"type\":\"address\"},{\"name\":\"_grantId\",\"type\":\"uint256\"}],\"name\":\"tokenGrant\",\"outputs\":[{\"name\":\"granter\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"vested\",\"type\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint64\"},{\"name\":\"cliff\",\"type\":\"uint64\"},{\"name\":\"vesting\",\"type\":\"uint64\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"createToken\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"holder\",\"type\":\"address\"}],\"name\":\"lastTokenIsTransferableDate\",\"outputs\":[{\"name\":\"date\",\"type\":\"uint64\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"balance\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MAX_TOTAL_TOKEN_AMOUNT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"transfersEnabled\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"approveAndCall\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_holder\",\"type\":\"address\"}],\"name\":\"revokeAllTokenGrants\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"holder\",\"type\":\"address\"},{\"name\":\"time\",\"type\":\"uint64\"}],\"name\":\"transferableTokens\",\"outputs\":[{\"name\":\"nonVested\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"remaining\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\"},{\"name\":\"time\",\"type\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint256\"},{\"name\":\"cliff\",\"type\":\"uint256\"},{\"name\":\"vesting\",\"type\":\"uint256\"}],\"name\":\"calculateVestedTokens\",\"outputs\":[{\"name\":\"vestedTokens\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_holder\",\"type\":\"address\"},{\"name\":\"_grantId\",\"type\":\"uint256\"}],\"name\":\"revokeTokenGrant\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enabled\",\"type\":\"bool\"}],\"name\":\"enableTransfers\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"inputs\":[{\"name\":\"_minter\",\"type\":\"address\"}],\"payable\":false,\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"}]"
  },
  {
    "path": "resources/public/contracts/build/District0xContribution.abi",
    "content": "[{\"constant\":true,\"inputs\":[],\"name\":\"totalContributed\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_minContribAmount\",\"type\":\"uint256\"}],\"name\":\"setMinContribAmount\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"advisers\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"founder1\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"EARLY_CONTRIBUTOR_STAKE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"tokenAddr\",\"type\":\"address\"}],\"name\":\"reclaimToken\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"contributors\",\"outputs\":[{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"isCompensated\",\"type\":\"bool\"},{\"name\":\"amountCompensated\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"COMMUNITY_ADVISERS_STAKE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_softCapAmount\",\"type\":\"uint256\"},{\"name\":\"_afterSoftCapDuration\",\"type\":\"uint256\"},{\"name\":\"_hardCapAmount\",\"type\":\"uint256\"},{\"name\":\"_startTime\",\"type\":\"uint256\"},{\"name\":\"_endTime\",\"type\":\"uint256\"}],\"name\":\"setContribPeriod\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ADVISER_STAKE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"softCapReached\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"endTime\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"claimTokensFromTokenDistrict0xNetworkToken\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"contributorAddress\",\"type\":\"address\"}],\"name\":\"getContributor\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"maxGasPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ADVISER_STAKE2\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"contributorsKeys\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"onTransfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"TEAM_VESTING_CLIFF\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"EARLY_CONTRIBUTOR_VESTING_CLIFF\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"enableContribPeriod\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minContribAmount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"afterSoftCapDuration\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"emergencyStop\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isEnabled\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getConfiguration\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"},{\"name\":\"_advisers\",\"type\":\"address[]\"},{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"FOUNDER2_STAKE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"CONTRIB_PERIOD2_STAKE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"stopped\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"startTime\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"contributor\",\"type\":\"address\"}],\"name\":\"contributeWithAddress\",\"outputs\":[],\"payable\":true,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"founder2\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"earlySponsor\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"CONTRIB_PERIOD3_STAKE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"release\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"multisigWallet\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"hardCapReached\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"changeOwner\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"enableDistrict0xNetworkTokenTransfers\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"tokenTransfersEnabled\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"offset\",\"type\":\"uint256\"},{\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"getUncompensatedContributors\",\"outputs\":[{\"name\":\"contributorIndexes\",\"type\":\"uint256[]\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getNow\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"from_\",\"type\":\"address\"},{\"name\":\"value_\",\"type\":\"uint256\"},{\"name\":\"data_\",\"type\":\"bytes\"}],\"name\":\"tokenFallback\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"kill\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"hardCapAmount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isContribPeriodRunning\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_maxGasPrice\",\"type\":\"uint256\"}],\"name\":\"setMaxGasPrice\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"newOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"contribute\",\"outputs\":[],\"payable\":true,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"onApprove\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_district0xNetworkToken\",\"type\":\"address\"}],\"name\":\"setDistrict0xNetworkToken\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"TEAM_VESTING_PERIOD\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"district0xNetworkToken\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getContribPeriod\",\"outputs\":[{\"name\":\"boolValues\",\"type\":\"bool[3]\"},{\"name\":\"uintValues\",\"type\":\"uint256[8]\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"tokenAddr\",\"type\":\"address\"}],\"name\":\"isTokenSaleToken\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"CONTRIB_PERIOD1_STAKE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"EARLY_CONTRIBUTOR_VESTING_PERIOD\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"proxyPayment\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":true,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"softCapAmount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"FOUNDER1_STAKE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"offset\",\"type\":\"uint256\"},{\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"compensateContributors\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"inputs\":[{\"name\":\"_multisigWallet\",\"type\":\"address\"},{\"name\":\"_founder1\",\"type\":\"address\"},{\"name\":\"_founder2\",\"type\":\"address\"},{\"name\":\"_earlySponsor\",\"type\":\"address\"},{\"name\":\"_advisers\",\"type\":\"address[]\"}],\"payable\":false,\"type\":\"constructor\"},{\"payable\":true,\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"totalContributed\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"contributor\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"contributorsCount\",\"type\":\"uint256\"}],\"name\":\"onContribution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"onSoftCapReached\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"onHardCapReached\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"contributor\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"onCompensated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"isStopped\",\"type\":\"bool\"}],\"name\":\"onEmergencyChanged\",\"type\":\"event\"}]"
  },
  {
    "path": "resources/public/contracts/build/District0xNetworkToken.abi",
    "content": "[{\"constant\":true,\"inputs\":[{\"name\":\"_holder\",\"type\":\"address\"}],\"name\":\"tokenGrantsCount\",\"outputs\":[{\"name\":\"index\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"creationBlock\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"grants\",\"outputs\":[{\"name\":\"granter\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"cliff\",\"type\":\"uint64\"},{\"name\":\"vesting\",\"type\":\"uint64\"},{\"name\":\"start\",\"type\":\"uint64\"},{\"name\":\"revokable\",\"type\":\"bool\"},{\"name\":\"burnsOnRevoke\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newController\",\"type\":\"address\"}],\"name\":\"changeController\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"balanceOfAt\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_holder\",\"type\":\"address\"},{\"name\":\"_grantId\",\"type\":\"uint256\"}],\"name\":\"tokenGrant\",\"outputs\":[{\"name\":\"granter\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"vested\",\"type\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint64\"},{\"name\":\"cliff\",\"type\":\"uint64\"},{\"name\":\"vesting\",\"type\":\"uint64\"},{\"name\":\"revokable\",\"type\":\"bool\"},{\"name\":\"burnsOnRevoke\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_cloneTokenName\",\"type\":\"string\"},{\"name\":\"_cloneDecimalUnits\",\"type\":\"uint8\"},{\"name\":\"_cloneTokenSymbol\",\"type\":\"string\"},{\"name\":\"_snapshotBlock\",\"type\":\"uint256\"},{\"name\":\"_transfersEnabled\",\"type\":\"bool\"}],\"name\":\"createCloneToken\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_token\",\"type\":\"address\"},{\"name\":\"_claimer\",\"type\":\"address\"}],\"name\":\"claimTokens\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"holder\",\"type\":\"address\"}],\"name\":\"lastTokenIsTransferableDate\",\"outputs\":[{\"name\":\"date\",\"type\":\"uint64\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"balance\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"parentToken\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"generateTokens\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"grantsController\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"},{\"name\":\"_start\",\"type\":\"uint64\"},{\"name\":\"_cliff\",\"type\":\"uint64\"},{\"name\":\"_vesting\",\"type\":\"uint64\"},{\"name\":\"_revokable\",\"type\":\"bool\"},{\"name\":\"_burnsOnRevoke\",\"type\":\"bool\"}],\"name\":\"grantVestedTokens\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"totalSupplyAt\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"transfersEnabled\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"parentSnapShotBlock\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"approveAndCall\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_holder\",\"type\":\"address\"}],\"name\":\"revokeAllTokenGrants\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"holder\",\"type\":\"address\"},{\"name\":\"time\",\"type\":\"uint64\"}],\"name\":\"transferableTokens\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"destroyTokens\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"remaining\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\"},{\"name\":\"time\",\"type\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint256\"},{\"name\":\"cliff\",\"type\":\"uint256\"},{\"name\":\"vesting\",\"type\":\"uint256\"}],\"name\":\"calculateVestedTokens\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newController\",\"type\":\"address\"}],\"name\":\"changeGrantsController\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"tokenFactory\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_holder\",\"type\":\"address\"},{\"name\":\"_grantId\",\"type\":\"uint256\"}],\"name\":\"revokeTokenGrant\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_transfersEnabled\",\"type\":\"bool\"}],\"name\":\"enableTransfers\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"controller\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[{\"name\":\"_controller\",\"type\":\"address\"},{\"name\":\"_tokenFactory\",\"type\":\"address\"}],\"payable\":false,\"type\":\"constructor\"},{\"payable\":true,\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"grantId\",\"type\":\"uint256\"}],\"name\":\"NewTokenGrant\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_claimer\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"ClaimedTokens\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_cloneToken\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_snapshotBlock\",\"type\":\"uint256\"}],\"name\":\"NewCloneToken\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"}]"
  },
  {
    "path": "resources/public/contracts/build/ERC20.abi",
    "content": "[{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"from\",\"type\":\"address\"},{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"who\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"approveAndCall\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"}]"
  },
  {
    "path": "resources/public/contracts/build/ERC20Basic.abi",
    "content": "[{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"who\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"}]"
  },
  {
    "path": "resources/public/contracts/build/GrantsControlled.abi",
    "content": "[{\"constant\":true,\"inputs\":[],\"name\":\"grantsController\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newController\",\"type\":\"address\"}],\"name\":\"changeGrantsController\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"type\":\"constructor\"}]"
  },
  {
    "path": "resources/public/contracts/build/HasNoTokens.abi",
    "content": "[{\"constant\":false,\"inputs\":[{\"name\":\"tokenAddr\",\"type\":\"address\"}],\"name\":\"reclaimToken\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"changeOwner\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"from_\",\"type\":\"address\"},{\"name\":\"value_\",\"type\":\"uint256\"},{\"name\":\"data_\",\"type\":\"bytes\"}],\"name\":\"tokenFallback\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"newOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"district0xNetworkToken\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"tokenAddr\",\"type\":\"address\"}],\"name\":\"isTokenSaleToken\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"}]"
  },
  {
    "path": "resources/public/contracts/build/LimitedTransferToken.abi",
    "content": "[{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"who\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"approveAndCall\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"holder\",\"type\":\"address\"},{\"name\":\"time\",\"type\":\"uint64\"}],\"name\":\"transferableTokens\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"}]"
  },
  {
    "path": "resources/public/contracts/build/MiniMeToken.abi",
    "content": "[{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"creationBlock\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newController\",\"type\":\"address\"}],\"name\":\"changeController\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"balanceOfAt\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_cloneTokenName\",\"type\":\"string\"},{\"name\":\"_cloneDecimalUnits\",\"type\":\"uint8\"},{\"name\":\"_cloneTokenSymbol\",\"type\":\"string\"},{\"name\":\"_snapshotBlock\",\"type\":\"uint256\"},{\"name\":\"_transfersEnabled\",\"type\":\"bool\"}],\"name\":\"createCloneToken\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_token\",\"type\":\"address\"},{\"name\":\"_claimer\",\"type\":\"address\"}],\"name\":\"claimTokens\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"balance\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"parentToken\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"generateTokens\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"totalSupplyAt\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"transfersEnabled\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"parentSnapShotBlock\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"approveAndCall\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"destroyTokens\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"remaining\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"tokenFactory\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_transfersEnabled\",\"type\":\"bool\"}],\"name\":\"enableTransfers\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"controller\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[{\"name\":\"_tokenFactory\",\"type\":\"address\"},{\"name\":\"_parentToken\",\"type\":\"address\"},{\"name\":\"_parentSnapShotBlock\",\"type\":\"uint256\"},{\"name\":\"_tokenName\",\"type\":\"string\"},{\"name\":\"_decimalUnits\",\"type\":\"uint8\"},{\"name\":\"_tokenSymbol\",\"type\":\"string\"},{\"name\":\"_transfersEnabled\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"constructor\"},{\"payable\":true,\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_claimer\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"ClaimedTokens\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_cloneToken\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_snapshotBlock\",\"type\":\"uint256\"}],\"name\":\"NewCloneToken\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"}]"
  },
  {
    "path": "resources/public/contracts/build/MiniMeTokenFactory.abi",
    "content": "[{\"constant\":false,\"inputs\":[{\"name\":\"_parentToken\",\"type\":\"address\"},{\"name\":\"_snapshotBlock\",\"type\":\"uint256\"},{\"name\":\"_tokenName\",\"type\":\"string\"},{\"name\":\"_decimalUnits\",\"type\":\"uint8\"},{\"name\":\"_tokenSymbol\",\"type\":\"string\"},{\"name\":\"_transfersEnabled\",\"type\":\"bool\"}],\"name\":\"createCloneToken\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"}]"
  },
  {
    "path": "resources/public/contracts/build/MultisigWallet.abi",
    "content": "[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"removeOwner\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"revokeConfirmation\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"confirmations\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"pending\",\"type\":\"bool\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"name\":\"getTransactionCount\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"addOwner\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"isConfirmed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"getConfirmationCount\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"transactions\",\"outputs\":[{\"name\":\"destination\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwners\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"from\",\"type\":\"uint256\"},{\"name\":\"to\",\"type\":\"uint256\"},{\"name\":\"pending\",\"type\":\"bool\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"name\":\"getTransactionIds\",\"outputs\":[{\"name\":\"_transactionIds\",\"type\":\"uint256[]\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"getConfirmations\",\"outputs\":[{\"name\":\"_confirmations\",\"type\":\"address[]\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"transactionCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_required\",\"type\":\"uint256\"}],\"name\":\"changeRequirement\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"confirmTransaction\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"destination\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"submitTransaction\",\"outputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MAX_OWNER_COUNT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"required\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"replaceOwner\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"executeTransaction\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"inputs\":[{\"name\":\"_owners\",\"type\":\"address[]\"},{\"name\":\"_required\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"constructor\"},{\"payable\":true,\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Confirmation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Revocation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Submission\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Execution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"ExecutionFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerAddition\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"RequirementChange\",\"type\":\"event\"}]"
  },
  {
    "path": "resources/public/contracts/build/Ownable.abi",
    "content": "[{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"}]"
  },
  {
    "path": "resources/public/contracts/build/Pausable.abi",
    "content": "[{\"constant\":false,\"inputs\":[],\"name\":\"emergencyStop\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"stopped\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"release\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"changeOwner\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"newOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"isStopped\",\"type\":\"bool\"}],\"name\":\"onEmergencyChanged\",\"type\":\"event\"}]"
  },
  {
    "path": "resources/public/contracts/build/SafeMath.abi",
    "content": "[]"
  },
  {
    "path": "resources/public/contracts/build/Shareable.abi",
    "content": "[{\"constant\":true,\"inputs\":[{\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_operation\",\"type\":\"bytes32\"}],\"name\":\"revoke\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_operation\",\"type\":\"bytes32\"},{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"hasConfirmed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"ownerIndex\",\"type\":\"uint256\"}],\"name\":\"getOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"required\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[{\"name\":\"_owners\",\"type\":\"address[]\"},{\"name\":\"_required\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"operation\",\"type\":\"bytes32\"}],\"name\":\"Confirmation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"operation\",\"type\":\"bytes32\"}],\"name\":\"Revoke\",\"type\":\"event\"}]"
  },
  {
    "path": "resources/public/contracts/build/StandardToken.abi",
    "content": "[{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"balance\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"},{\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"approveAndCall\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"remaining\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"}]"
  },
  {
    "path": "resources/public/contracts/build/TokenController.abi",
    "content": "[{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"onTransfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"onApprove\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"proxyPayment\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":true,\"type\":\"function\"}]"
  },
  {
    "path": "resources/public/contracts/build/TokenVesting.abi",
    "content": "[{\"constant\":true,\"inputs\":[],\"name\":\"duration\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"cliff\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"}],\"name\":\"releasableAmount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"}],\"name\":\"release\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"}],\"name\":\"vestedAmount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"beneficiary\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"}],\"name\":\"revoke\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"revocable\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"released\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"start\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"revoked\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_beneficiary\",\"type\":\"address\"},{\"name\":\"_start\",\"type\":\"uint256\"},{\"name\":\"_cliff\",\"type\":\"uint256\"},{\"name\":\"_duration\",\"type\":\"uint256\"},{\"name\":\"_revocable\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Revoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"}]"
  },
  {
    "path": "resources/public/contracts/build/VestedToken.abi",
    "content": "[{\"constant\":true,\"inputs\":[{\"name\":\"_holder\",\"type\":\"address\"}],\"name\":\"tokenGrantsCount\",\"outputs\":[{\"name\":\"index\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"grants\",\"outputs\":[{\"name\":\"granter\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"cliff\",\"type\":\"uint64\"},{\"name\":\"vesting\",\"type\":\"uint64\"},{\"name\":\"start\",\"type\":\"uint64\"},{\"name\":\"revokable\",\"type\":\"bool\"},{\"name\":\"burnsOnRevoke\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_holder\",\"type\":\"address\"},{\"name\":\"_grantId\",\"type\":\"uint256\"}],\"name\":\"tokenGrant\",\"outputs\":[{\"name\":\"granter\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"vested\",\"type\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint64\"},{\"name\":\"cliff\",\"type\":\"uint64\"},{\"name\":\"vesting\",\"type\":\"uint64\"},{\"name\":\"revokable\",\"type\":\"bool\"},{\"name\":\"burnsOnRevoke\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"holder\",\"type\":\"address\"}],\"name\":\"lastTokenIsTransferableDate\",\"outputs\":[{\"name\":\"date\",\"type\":\"uint64\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"who\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"grantsController\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"},{\"name\":\"_start\",\"type\":\"uint64\"},{\"name\":\"_cliff\",\"type\":\"uint64\"},{\"name\":\"_vesting\",\"type\":\"uint64\"},{\"name\":\"_revokable\",\"type\":\"bool\"},{\"name\":\"_burnsOnRevoke\",\"type\":\"bool\"}],\"name\":\"grantVestedTokens\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"approveAndCall\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_holder\",\"type\":\"address\"}],\"name\":\"revokeAllTokenGrants\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"holder\",\"type\":\"address\"},{\"name\":\"time\",\"type\":\"uint64\"}],\"name\":\"transferableTokens\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\"},{\"name\":\"time\",\"type\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint256\"},{\"name\":\"cliff\",\"type\":\"uint256\"},{\"name\":\"vesting\",\"type\":\"uint256\"}],\"name\":\"calculateVestedTokens\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_newController\",\"type\":\"address\"}],\"name\":\"changeGrantsController\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_holder\",\"type\":\"address\"},{\"name\":\"_grantId\",\"type\":\"uint256\"}],\"name\":\"revokeTokenGrant\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"grantId\",\"type\":\"uint256\"}],\"name\":\"NewTokenGrant\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"}]"
  },
  {
    "path": "resources/public/contracts/src/District0xContribution.sol",
    "content": "pragma solidity ^0.4.11;\n\n/*\n    Copyright 2017, Matus Lestan (district0x)\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport \"./SafeMath.sol\";\nimport \"./District0xNetworkToken.sol\";\nimport \"./Ownable.sol\";\nimport \"./Pausable.sol\";\nimport \"./HasNoTokens.sol\";\nimport \"./minime_interface/TokenController.sol\";\n\ncontract District0xContribution is Pausable, HasNoTokens, TokenController {\n    using SafeMath for uint;\n\n    District0xNetworkToken public district0xNetworkToken;\n    address public multisigWallet;                                      // Wallet that receives all sale funds\n    address public founder1;                                            // Wallet of founder 1\n    address public founder2;                                            // Wallet of founder 2\n    address public earlySponsor;                                        // Wallet of early sponsor\n    address[] public advisers;                                          // 4 Wallets of advisors\n\n    uint public constant FOUNDER1_STAKE = 119000000 ether;              // 119M DNT\n    uint public constant FOUNDER2_STAKE = 79000000 ether;               // 79M  DNT\n    uint public constant EARLY_CONTRIBUTOR_STAKE = 5000000 ether;       // 5M   DNT\n    uint public constant ADVISER_STAKE = 5000000 ether;                 // 5M   DNT\n    uint public constant ADVISER_STAKE2 = 1000000 ether;                // 1M   DNT\n    uint public constant COMMUNITY_ADVISERS_STAKE = 5000000 ether;      // 5M   DNT\n    uint public constant CONTRIB_PERIOD1_STAKE = 600000000 ether;       // 600M DNT\n    uint public constant CONTRIB_PERIOD2_STAKE = 140000000 ether;       // 140M DNT\n    uint public constant CONTRIB_PERIOD3_STAKE = 40000000 ether;        // 40M  DNT\n\n    uint public minContribAmount = 0.01 ether;                          // 0.01 ether\n    uint public maxGasPrice = 50000000000;                              // 50 GWei\n\n    uint public constant TEAM_VESTING_CLIFF = 24 weeks;                 // 6 months vesting cliff for founders and advisors, except community advisors\n    uint public constant TEAM_VESTING_PERIOD = 96 weeks;                // 2 years vesting period for founders and advisors, except community advisors\n\n    uint public constant EARLY_CONTRIBUTOR_VESTING_CLIFF = 12 weeks;    // 3 months vesting cliff for early sponsor\n    uint public constant EARLY_CONTRIBUTOR_VESTING_PERIOD = 24 weeks;   // 6 months vesting cliff for early sponsor\n\n    bool public tokenTransfersEnabled = false;                          // DNT token transfers will be enabled manually\n                                                                        // after first contribution period\n                                                                        // Can't be disabled back\n    struct Contributor {\n        uint amount;                        // Amount of ETH contributed by an address in given contribution period\n        bool isCompensated;                 // Whether this contributor received DNT token for ETH contribution\n        uint amountCompensated;             // Amount of DNT received. Not really needed to store,\n                                            // but stored for accounting and security purposes\n    }\n\n    uint public softCapAmount;                                 // Soft cap of contribution period in wei\n    uint public afterSoftCapDuration;                          // Number of seconds to the end of sale from the moment of reaching soft cap (unless reaching hardcap)\n    uint public hardCapAmount;                                 // When reached this amount of wei, the contribution will end instantly\n    uint public startTime;                                     // Start time of contribution period in UNIX time\n    uint public endTime;                                       // End time of contribution period in UNIX time\n    bool public isEnabled;                                     // If contribution period was enabled by multisignature\n    bool public softCapReached;                                // If soft cap was reached\n    bool public hardCapReached;                                // If hard cap was reached\n    uint public totalContributed;                              // Total amount of ETH contributed in given period\n    address[] public contributorsKeys;                         // Addresses of all contributors in given contribution period\n    mapping (address => Contributor) public contributors;\n\n    event onContribution(uint totalContributed, address indexed contributor, uint amount,\n        uint contributorsCount);\n    event onSoftCapReached(uint endTime);\n    event onHardCapReached(uint endTime);\n    event onCompensated(address indexed contributor, uint amount);\n\n    modifier onlyMultisig() {\n        require(multisigWallet == msg.sender);\n        _;\n    }\n\n    function District0xContribution(\n        address _multisigWallet,\n        address _founder1,\n        address _founder2,\n        address _earlySponsor,\n        address[] _advisers\n    ) {\n        require(_advisers.length == 5);\n        multisigWallet = _multisigWallet;\n        founder1 = _founder1;\n        founder2 = _founder2;\n        earlySponsor = _earlySponsor;\n        advisers = _advisers;\n    }\n    \n    // @notice Returns true if contribution period is currently running\n    function isContribPeriodRunning() constant returns (bool) {\n        return !hardCapReached &&\n               isEnabled &&\n               startTime <= now &&\n               endTime > now;\n    }\n\n    function contribute()\n        payable\n        stopInEmergency\n    {\n        contributeWithAddress(msg.sender);\n    }\n\n    // @notice Function to participate in contribution period\n    //  Amounts from the same address should be added up\n    //  If soft or hard cap is reached, end time should be modified\n    //  Funds should be transferred into multisig wallet\n    // @param contributor Address that will receive DNT token\n    function contributeWithAddress(address contributor)\n        payable\n        stopInEmergency\n    {\n        require(tx.gasprice <= maxGasPrice);\n        require(msg.value >= minContribAmount);\n        require(isContribPeriodRunning());\n\n        uint contribValue = msg.value;\n        uint excessContribValue = 0;\n\n        uint oldTotalContributed = totalContributed;\n\n        totalContributed = oldTotalContributed.add(contribValue);\n\n        uint newTotalContributed = totalContributed;\n\n        // Soft cap was reached\n        if (newTotalContributed >= softCapAmount &&\n            oldTotalContributed < softCapAmount)\n        {\n            softCapReached = true;\n            endTime = afterSoftCapDuration.add(now);\n            onSoftCapReached(endTime);\n        }\n        // Hard cap was reached\n        if (newTotalContributed >= hardCapAmount &&\n            oldTotalContributed < hardCapAmount)\n        {\n            hardCapReached = true;\n            endTime = now;\n            onHardCapReached(endTime);\n\n            // Everything above hard cap will be sent back to contributor\n            excessContribValue = newTotalContributed.sub(hardCapAmount);\n            contribValue = contribValue.sub(excessContribValue);\n\n            totalContributed = hardCapAmount;\n        }\n\n        if (contributors[contributor].amount == 0) {\n            contributorsKeys.push(contributor);\n        }\n\n        contributors[contributor].amount = contributors[contributor].amount.add(contribValue);\n\n        multisigWallet.transfer(contribValue);\n        if (excessContribValue > 0) {\n            msg.sender.transfer(excessContribValue);\n        }\n        onContribution(newTotalContributed, contributor, contribValue, contributorsKeys.length);\n    }\n\n    // @notice This method is called by owner after contribution period ends, to distribute DNT in proportional manner\n    //  Each contributor should receive DNT just once even if this method is called multiple times\n    //  In case of many contributors must be able to compensate contributors in paginational way, otherwise might\n    //  run out of gas if wanted to compensate all on one method call. Therefore parameters offset and limit\n    // @param periodIndex Index of contribution period (0-2)\n    // @param offset Number of first contributors to skip.\n    // @param limit Max number of contributors compensated on this call\n    function compensateContributors(uint offset, uint limit)\n        onlyOwner\n    {\n        require(isEnabled);\n        require(endTime < now);\n\n        uint i = offset;\n        uint compensatedCount = 0;\n        uint contributorsCount = contributorsKeys.length;\n\n        uint ratio = CONTRIB_PERIOD1_STAKE\n            .mul(1000000000000000000)\n            .div(totalContributed);\n\n        while (i < contributorsCount && compensatedCount < limit) {\n            address contributorAddress = contributorsKeys[i];\n            if (!contributors[contributorAddress].isCompensated) {\n                uint amountContributed = contributors[contributorAddress].amount;\n                contributors[contributorAddress].isCompensated = true;\n\n                contributors[contributorAddress].amountCompensated =\n                    amountContributed.mul(ratio).div(1000000000000000000);\n\n                district0xNetworkToken.transfer(contributorAddress, contributors[contributorAddress].amountCompensated);\n                onCompensated(contributorAddress, contributors[contributorAddress].amountCompensated);\n\n                compensatedCount++;\n            }\n            i++;\n        }\n    }\n\n    // @notice Method for setting up contribution period\n    //  Only owner should be able to execute\n    //  Setting first contribution period sets up vesting for founders & advisors\n    //  Contribution period should still not be enabled after calling this method\n    // @param softCapAmount Soft Cap in wei\n    // @param afterSoftCapDuration Number of seconds till the end of sale in the moment of reaching soft cap (unless reaching hard cap)\n    // @param hardCapAmount Hard Cap in wei\n    // @param startTime Contribution start time in UNIX time\n    // @param endTime Contribution end time in UNIX time\n    function setContribPeriod(\n        uint _softCapAmount,\n        uint _afterSoftCapDuration,\n        uint _hardCapAmount,\n        uint _startTime,\n        uint _endTime\n    )\n        onlyOwner\n    {\n        require(_softCapAmount > 0);\n        require(_hardCapAmount > _softCapAmount);\n        require(_afterSoftCapDuration > 0);\n        require(_startTime > now);\n        require(_endTime > _startTime);\n        require(!isEnabled);\n\n        softCapAmount = _softCapAmount;\n        afterSoftCapDuration = _afterSoftCapDuration;\n        hardCapAmount = _hardCapAmount;\n        startTime = _startTime;\n        endTime = _endTime;\n\n        district0xNetworkToken.revokeAllTokenGrants(founder1);\n        district0xNetworkToken.revokeAllTokenGrants(founder2);\n        district0xNetworkToken.revokeAllTokenGrants(earlySponsor);\n\n        for (uint j = 0; j < advisers.length; j++) {\n            district0xNetworkToken.revokeAllTokenGrants(advisers[j]);\n        }\n\n        uint64 vestingDate = uint64(startTime.add(TEAM_VESTING_PERIOD));\n        uint64 cliffDate = uint64(startTime.add(TEAM_VESTING_CLIFF));\n        uint64 earlyContribVestingDate = uint64(startTime.add(EARLY_CONTRIBUTOR_VESTING_PERIOD));\n        uint64 earlyContribCliffDate = uint64(startTime.add(EARLY_CONTRIBUTOR_VESTING_CLIFF));\n        uint64 startDate = uint64(startTime);\n\n        district0xNetworkToken.grantVestedTokens(founder1, FOUNDER1_STAKE, startDate, cliffDate, vestingDate, true, false);\n        district0xNetworkToken.grantVestedTokens(founder2, FOUNDER2_STAKE, startDate, cliffDate, vestingDate, true, false);\n        district0xNetworkToken.grantVestedTokens(earlySponsor, EARLY_CONTRIBUTOR_STAKE, startDate, earlyContribCliffDate, earlyContribVestingDate, true, false);\n        district0xNetworkToken.grantVestedTokens(advisers[0], ADVISER_STAKE, startDate, cliffDate, vestingDate, true, false);\n        district0xNetworkToken.grantVestedTokens(advisers[1], ADVISER_STAKE, startDate, cliffDate, vestingDate, true, false);\n        district0xNetworkToken.grantVestedTokens(advisers[2], ADVISER_STAKE2, startDate, cliffDate, vestingDate, true, false);\n        district0xNetworkToken.grantVestedTokens(advisers[3], ADVISER_STAKE2, startDate, cliffDate, vestingDate, true, false);\n\n        // Community advisors stake has no vesting, but we set it up this way, so we can revoke it in case of\n        // re-setting up contribution period\n        district0xNetworkToken.grantVestedTokens(advisers[4], COMMUNITY_ADVISERS_STAKE, startDate, startDate, startDate, true, false);\n    }\n\n    // @notice Enables contribution period\n    //  Must be executed by multisignature\n    function enableContribPeriod()\n        onlyMultisig\n    {\n        require(startTime > now);\n        isEnabled = true;\n    }\n\n    // @notice Sets new min. contribution amount\n    //  Only owner can execute\n    //  Cannot be executed while contribution period is running\n    // @param _minContribAmount new min. amount\n    function setMinContribAmount(uint _minContribAmount)\n        onlyOwner\n    {\n        require(_minContribAmount > 0);\n        require(startTime > now);\n        minContribAmount = _minContribAmount;\n    }\n\n    // @notice Sets new max gas price for contribution\n    //  Only owner can execute\n    //  Cannot be executed while contribution period is running\n    // @param _minContribAmount new min. amount\n    function setMaxGasPrice(uint _maxGasPrice)\n        onlyOwner\n    {\n        require(_maxGasPrice > 0);\n        require(startTime > now);\n        maxGasPrice = _maxGasPrice;\n    }\n\n    // @notice Sets District0xNetworkToken contract\n    //  Generates all DNT tokens and assigns them to this contract\n    //  If token contract has already generated tokens, do not generate again\n    // @param _district0xNetworkToken District0xNetworkToken address\n    function setDistrict0xNetworkToken(address _district0xNetworkToken)\n        onlyOwner\n    {\n        require(_district0xNetworkToken != 0x0);\n        require(!isEnabled);\n        district0xNetworkToken = District0xNetworkToken(_district0xNetworkToken);\n        if (district0xNetworkToken.totalSupply() == 0) {\n            district0xNetworkToken.generateTokens(this, FOUNDER1_STAKE\n                .add(FOUNDER2_STAKE)\n                .add(EARLY_CONTRIBUTOR_STAKE)\n                .add(ADVISER_STAKE.mul(2))\n                .add(ADVISER_STAKE2.mul(2))\n                .add(COMMUNITY_ADVISERS_STAKE)\n                .add(CONTRIB_PERIOD1_STAKE));\n\n            district0xNetworkToken.generateTokens(multisigWallet, CONTRIB_PERIOD2_STAKE\n                .add(CONTRIB_PERIOD3_STAKE));\n        }\n    }\n\n    // @notice Enables transfers of DNT\n    //  Will be executed after first contribution period by owner\n    function enableDistrict0xNetworkTokenTransfers()\n        onlyOwner\n    {\n        require(endTime < now);\n        tokenTransfersEnabled = true;\n    }\n\n    // @notice Method to claim tokens accidentally sent to a DNT contract\n    //  Only multisig wallet can execute\n    // @param _token Address of claimed ERC20 Token\n    function claimTokensFromTokenDistrict0xNetworkToken(address _token)\n        onlyMultisig\n    {\n        district0xNetworkToken.claimTokens(_token, multisigWallet);\n    }\n\n    // @notice Kill method should not really be needed, but just in case\n    function kill(address _to) onlyMultisig external {\n        suicide(_to);\n    }\n\n    function()\n        payable\n        stopInEmergency\n    {\n        contributeWithAddress(msg.sender);\n    }\n\n    // MiniMe Controller default settings for allowing token transfers.\n    function proxyPayment(address _owner) payable public returns (bool) {\n        throw;\n    }\n\n    // Before transfers are enabled for everyone, only this contract is allowed to distribute DNT\n    function onTransfer(address _from, address _to, uint _amount) public returns (bool) {\n        return tokenTransfersEnabled || _from == address(this) || _to == address(this);\n    }\n\n    function onApprove(address _owner, address _spender, uint _amount) public returns (bool) {\n        return tokenTransfersEnabled;\n    }\n\n    function isTokenSaleToken(address tokenAddr) returns(bool) {\n        return district0xNetworkToken == tokenAddr;\n    }\n\n    /*\n     Following constant methods are used for tests and contribution web app\n     They don't impact logic of contribution contract, therefor DOES NOT NEED TO BE AUDITED\n     */\n\n    // Used by contribution front-end to obtain contribution period properties\n    function getContribPeriod()\n        constant\n        returns (bool[3] boolValues, uint[8] uintValues)\n    {\n        boolValues[0] = isEnabled;\n        boolValues[1] = softCapReached;\n        boolValues[2] = hardCapReached;\n\n        uintValues[0] = softCapAmount;\n        uintValues[1] = afterSoftCapDuration;\n        uintValues[2] = hardCapAmount;\n        uintValues[3] = startTime;\n        uintValues[4] = endTime;\n        uintValues[5] = totalContributed;\n        uintValues[6] = contributorsKeys.length;\n        uintValues[7] = CONTRIB_PERIOD1_STAKE;\n\n        return (boolValues, uintValues);\n    }\n\n    // Used by contribution front-end to obtain contribution contract properties\n    function getConfiguration()\n        constant\n        returns (bool, address, address, address, address, address[] _advisers, bool, uint)\n    {\n        _advisers = new address[](advisers.length);\n        for (uint i = 0; i < advisers.length; i++) {\n            _advisers[i] = advisers[i];\n        }\n        return (stopped, multisigWallet, founder1, founder2, earlySponsor, _advisers, tokenTransfersEnabled,\n            maxGasPrice);\n    }\n\n    // Used by contribution front-end to obtain contributor's properties\n    function getContributor(address contributorAddress)\n        constant\n        returns(uint, bool, uint)\n    {\n        Contributor contributor = contributors[contributorAddress];\n        return (contributor.amount, contributor.isCompensated, contributor.amountCompensated);\n    }\n\n    // Function to verify if all contributors were compensated\n    function getUncompensatedContributors(uint offset, uint limit)\n        constant\n        returns (uint[] contributorIndexes)\n    {\n        uint contributorsCount = contributorsKeys.length;\n\n        if (limit == 0) {\n            limit = contributorsCount;\n        }\n\n        uint i = offset;\n        uint resultsCount = 0;\n        uint[] memory _contributorIndexes = new uint[](limit);\n\n        while (i < contributorsCount && resultsCount < limit) {\n            if (!contributors[contributorsKeys[i]].isCompensated) {\n                _contributorIndexes[resultsCount] = i;\n                resultsCount++;\n            }\n            i++;\n        }\n\n        contributorIndexes = new uint[](resultsCount);\n        for (i = 0; i < resultsCount; i++) {\n            contributorIndexes[i] = _contributorIndexes[i];\n        }\n        return contributorIndexes;\n    }\n\n    function getNow()\n        constant\n        returns(uint)\n    {\n        return now;\n    }\n}\n"
  },
  {
    "path": "resources/public/contracts/src/District0xNetworkToken.sol",
    "content": "pragma solidity ^0.4.11;\n\nimport \"./MiniMeToken.sol\";\nimport \"./VestedToken.sol\";\n\ncontract District0xNetworkToken is MiniMeToken, VestedToken {\n    function District0xNetworkToken(address _controller, address _tokenFactory)\n        MiniMeToken(\n            _tokenFactory,\n            0x0,                        // no parent token\n            0,                          // no snapshot block number from parent\n            \"district0x Network Token\", // Token name\n            18,                         // Decimals\n            \"DNT\",                      // Symbol\n            true                        // Enable transfers\n            )\n    {\n        changeController(_controller);\n        changeGrantsController(_controller);\n    }\n}\n"
  },
  {
    "path": "resources/public/contracts/src/ERC20.sol",
    "content": "pragma solidity ^0.4.11;\n\n\nimport './ERC20Basic.sol';\n\n\n/*\n * ERC20 interface\n * see https://github.com/ethereum/EIPs/issues/20\n *\n * Slightly modified version of OpenZeppelin's ERC20\n * Original can be found ./orig/ERC20.sol or https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC20.sol\n * Modifications:\n * - Added doTransfer so it can be used in VestedToken with implmentation from MiniMe token\n *\n */\ncontract ERC20 is ERC20Basic {\n\n  mapping(address => uint) balances;\n\n  function allowance(address owner, address spender) constant returns (uint);\n  function transferFrom(address from, address to, uint value) returns (bool);\n  function approve(address spender, uint value) returns (bool);\n  function approveAndCall(address spender, uint256 value, bytes extraData) returns (bool);\n  event Approval(address indexed owner, address indexed spender, uint value);\n\n  function doTransfer(address _from, address _to, uint _amount) internal returns(bool);\n}\n"
  },
  {
    "path": "resources/public/contracts/src/ERC20Basic.sol",
    "content": "pragma solidity ^0.4.11;\n\n\n/*\n * ERC20Basic\n * Simpler version of ERC20 interface\n * see https://github.com/ethereum/EIPs/issues/20\n */\ncontract ERC20Basic {\n  function totalSupply() constant returns (uint);\n  function balanceOf(address who) constant returns (uint);\n  function transfer(address to, uint value) returns (bool);\n  event Transfer(address indexed from, address indexed to, uint value);\n}\n"
  },
  {
    "path": "resources/public/contracts/src/GrantsControlled.sol",
    "content": "pragma solidity ^0.4.11;\n\n/*\n    This contract adds modifier to VestedToken contract in order to restrict creating\n    vesting on to contribution contract for security purposes.\n*/\n\ncontract GrantsControlled {\n    modifier onlyGrantsController { if (msg.sender != grantsController) throw; _; }\n\n    address public grantsController;\n\n    function GrantsControlled() { grantsController = msg.sender;}\n\n    function changeGrantsController(address _newController) onlyGrantsController {\n        grantsController = _newController;\n    }\n}\n"
  },
  {
    "path": "resources/public/contracts/src/HasNoTokens.sol",
    "content": "pragma solidity ^0.4.11;\n\nimport \"./ERC20Basic.sol\";\nimport \"./Ownable.sol\";\nimport \"./District0xNetworkToken.sol\";\n\n/**\n * @title Contracts that should not own Tokens\n * @author Remco Bloemen <remco@2π.com>\n * @dev This blocks incoming ERC23 tokens to prevent accidental loss of tokens.\n * Should tokens (any ERC20Basic compatible) end up in the contract, it allows the\n * owner to reclaim the tokens.\n */\ncontract HasNoTokens is Ownable {\n\n  District0xNetworkToken public district0xNetworkToken;\n\n /**\n  * @dev Reject all ERC23 compatible tokens\n  * @param from_ address The address that is transferring the tokens\n  * @param value_ uint256 the amount of the specified token\n  * @param data_ Bytes The data passed from the caller.\n  */\n  function tokenFallback(address from_, uint256 value_, bytes data_) external {\n    throw;\n  }\n\n  function isTokenSaleToken(address tokenAddr) returns(bool);\n\n  /**\n   * @dev Reclaim all ERC20Basic compatible tokens\n   * @param tokenAddr address The address of the token contract\n   */\n  function reclaimToken(address tokenAddr) external onlyOwner {\n    require(!isTokenSaleToken(tokenAddr));\n    ERC20Basic tokenInst = ERC20Basic(tokenAddr);\n    uint256 balance = tokenInst.balanceOf(this);\n    tokenInst.transfer(msg.sender, balance);\n  }\n}\n"
  },
  {
    "path": "resources/public/contracts/src/LimitedTransferToken.sol",
    "content": "pragma solidity ^0.4.11;\n\nimport \"./ERC20.sol\";\n\n/*\n    Very slightly modified version of OpenZeppelin's LimitedTransferToken\n    Original can be found at ./orig/LimitedTransferToken.sol or https://raw.githubusercontent.com/OpenZeppelin/zeppelin-solidity/master/contracts/token/LimitedTransferToken.sol\n    Modifications:\n    - Added return types \"bool\" so it's compact with MiniMeToken\n*/\n\ncontract LimitedTransferToken is ERC20 {\n  // Checks whether it can transfer or otherwise throws.\n  modifier canTransfer(address _sender, uint _value) {\n   if (_value > transferableTokens(_sender, uint64(now))) throw;\n   _;\n  }\n\n  // Checks modifier and allows transfer if tokens are not locked.\n  function transfer(address _to, uint _value) canTransfer(msg.sender, _value) returns (bool) {\n   return super.transfer(_to, _value);\n  }\n\n  // Checks modifier and allows transfer if tokens are not locked.\n  function transferFrom(address _from, address _to, uint _value) canTransfer(_from, _value) returns (bool) {\n   return super.transferFrom(_from, _to, _value);\n  }\n\n  // Default transferable tokens function returns all tokens for a holder (no limit).\n  function transferableTokens(address holder, uint64 time) constant public returns (uint256) {\n    return balanceOf(holder);\n  }\n}\n"
  },
  {
    "path": "resources/public/contracts/src/MiniMeToken.sol",
    "content": "pragma solidity ^0.4.11;\n\nimport \"./minime_interface/Controlled.sol\";\nimport \"./minime_interface/TokenController.sol\";\nimport \"./minime_interface/ApproveAndCallFallback.sol\";\nimport \"./ERC20.sol\";\nimport \"./SafeMath.sol\";\nimport \"./ERC20Basic.sol\";\n\n/*\n    Slightly modified version of Giveth's MiniMeToken\n    Original can be found at ./orig/MiniMeToken.sol or https://github.com/Giveth/minime\n    Modifications:\n    - Split contracts into multiple files\n    - Use SafeMath.sol\n    - Make it descendant of ERC20\n*/\n\n/// @dev The actual token contract, the default controller is the msg.sender\n///  that deploys the contract, so usually this token will be deployed by a\n///  token controller contract, which Giveth will call a \"Campaign\"\ncontract MiniMeToken is ERC20, Controlled {\n    using SafeMath for uint;\n\n    string public name;                //The Token's name: e.g. DigixDAO Tokens\n    uint8 public decimals;             //Number of decimals of the smallest unit\n    string public symbol;              //An identifier: e.g. REP\n    string public version = 'MMT_0.1'; //An arbitrary versioning scheme\n\n\n    /// @dev `Checkpoint` is the structure that attaches a block number to a\n    ///  given value, the block number attached is the one that last changed the\n    ///  value\n    struct  Checkpoint {\n\n        // `fromBlock` is the block number that the value was generated from\n        uint128 fromBlock;\n\n        // `value` is the amount of tokens at a specific block number\n        uint128 value;\n    }\n\n    // `parentToken` is the Token address that was cloned to produce this token;\n    //  it will be 0x0 for a token that was not cloned\n    MiniMeToken public parentToken;\n\n    // `parentSnapShotBlock` is the block number from the Parent Token that was\n    //  used to determine the initial distribution of the Clone Token\n    uint public parentSnapShotBlock;\n\n    // `creationBlock` is the block number that the Clone Token was created\n    uint public creationBlock;\n\n    // `balances` is the map that tracks the balance of each address, in this\n    //  contract when the balance changes the block number that the change\n    //  occurred is also included in the map\n    mapping (address => Checkpoint[]) balances;\n\n    // `allowed` tracks any extra transfer rights as in all ERC20 tokens\n    mapping (address => mapping (address => uint256)) allowed;\n\n    // Tracks the history of the `totalSupply` of the token\n    Checkpoint[] totalSupplyHistory;\n\n    // Flag that determines if the token is transferable or not.\n    bool public transfersEnabled;\n\n    // The factory used to create new clone tokens\n    MiniMeTokenFactory public tokenFactory;\n\n////////////////\n// Constructor\n////////////////\n\n    /// @notice Constructor to create a MiniMeToken\n    /// @param _tokenFactory The address of the MiniMeTokenFactory contract that\n    ///  will create the Clone token contracts, the token factory needs to be\n    ///  deployed first\n    /// @param _parentToken Address of the parent token, set to 0x0 if it is a\n    ///  new token\n    /// @param _parentSnapShotBlock Block of the parent token that will\n    ///  determine the initial distribution of the clone token, set to 0 if it\n    ///  is a new token\n    /// @param _tokenName Name of the new token\n    /// @param _decimalUnits Number of decimals of the new token\n    /// @param _tokenSymbol Token Symbol for the new token\n    /// @param _transfersEnabled If true, tokens will be able to be transferred\n    function MiniMeToken(\n        address _tokenFactory,\n        address _parentToken,\n        uint _parentSnapShotBlock,\n        string _tokenName,\n        uint8 _decimalUnits,\n        string _tokenSymbol,\n        bool _transfersEnabled\n    ) {\n        tokenFactory = MiniMeTokenFactory(_tokenFactory);\n        name = _tokenName;                                 // Set the name\n        decimals = _decimalUnits;                          // Set the decimals\n        symbol = _tokenSymbol;                             // Set the symbol\n        parentToken = MiniMeToken(_parentToken);\n        parentSnapShotBlock = _parentSnapShotBlock;\n        transfersEnabled = _transfersEnabled;\n        creationBlock = block.number;\n    }\n\n\n///////////////////\n// ERC20 Methods\n///////////////////\n\n    /// @notice Send `_amount` tokens to `_to` from `msg.sender`\n    /// @param _to The address of the recipient\n    /// @param _amount The amount of tokens to be transferred\n    /// @return Whether the transfer was successful or not\n    function transfer(address _to, uint256 _amount) returns (bool success) {\n        if (!transfersEnabled) throw;\n        return doTransfer(msg.sender, _to, _amount);\n    }\n\n    /// @notice Send `_amount` tokens to `_to` from `_from` on the condition it\n    ///  is approved by `_from`\n    /// @param _from The address holding the tokens being transferred\n    /// @param _to The address of the recipient\n    /// @param _amount The amount of tokens to be transferred\n    /// @return True if the transfer was successful\n    function transferFrom(address _from, address _to, uint256 _amount\n    ) returns (bool success) {\n\n        // The controller of this contract can move tokens around at will,\n        //  this is important to recognize! Confirm that you trust the\n        //  controller of this contract, which in most situations should be\n        //  another open source smart contract or 0x0\n        if (msg.sender != controller) {\n            if (!transfersEnabled) throw;\n\n            // The standard ERC 20 transferFrom functionality\n            if (allowed[_from][msg.sender] < _amount) return false;\n            allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_amount);\n        }\n        return doTransfer(_from, _to, _amount);\n    }\n\n    /// @dev This is the actual transfer function in the token contract, it can\n    ///  only be called by other functions in this contract.\n    /// @param _from The address holding the tokens being transferred\n    /// @param _to The address of the recipient\n    /// @param _amount The amount of tokens to be transferred\n    /// @return True if the transfer was successful\n    function doTransfer(address _from, address _to, uint _amount\n    ) internal returns(bool) {\n\n           if (_amount == 0) {\n               return true;\n           }\n\n           if (parentSnapShotBlock >= block.number) throw;\n\n           // Do not allow transfer to 0x0 or the token contract itself\n           if ((_to == 0) || (_to == address(this))) throw;\n\n           // If the amount being transfered is more than the balance of the\n           //  account the transfer returns false\n           var previousBalanceFrom = balanceOfAt(_from, block.number);\n           if (previousBalanceFrom < _amount) {\n               return false;\n           }\n\n           // Alerts the token controller of the transfer\n           if (isContract(controller)) {\n               if (!TokenController(controller).onTransfer(_from, _to, _amount))\n               throw;\n           }\n\n           // First update the balance array with the new value for the address\n           //  sending the tokens\n           updateValueAtNow(balances[_from], previousBalanceFrom.sub(_amount));\n\n           // Then update the balance array with the new value for the address\n           //  receiving the tokens\n           var previousBalanceTo = balanceOfAt(_to, block.number);\n           updateValueAtNow(balances[_to], previousBalanceTo.add(_amount));\n\n           // An event to make the transfer easy to find on the blockchain\n           Transfer(_from, _to, _amount);\n\n           return true;\n    }\n\n    /// @param _owner The address that's balance is being requested\n    /// @return The balance of `_owner` at the current block\n    function balanceOf(address _owner) constant returns (uint256 balance) {\n        return balanceOfAt(_owner, block.number);\n    }\n\n    /// @notice `msg.sender` approves `_spender` to spend `_amount` tokens on\n    ///  its behalf. This is a modified version of the ERC20 approve function\n    ///  to be a little bit safer\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @param _amount The amount of tokens to be approved for transfer\n    /// @return True if the approval was successful\n    function approve(address _spender, uint256 _amount) returns (bool success) {\n        if (!transfersEnabled) throw;\n\n        // To change the approve amount you first have to reduce the addresses`\n        //  allowance to zero by calling `approve(_spender,0)` if it is not\n        //  already 0 to mitigate the race condition described here:\n        //  https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n        if ((_amount!=0) && (allowed[msg.sender][_spender] !=0)) throw;\n\n        // Alerts the token controller of the approve function call\n        if (isContract(controller)) {\n            if (!TokenController(controller).onApprove(msg.sender, _spender, _amount))\n                throw;\n        }\n\n        allowed[msg.sender][_spender] = _amount;\n        Approval(msg.sender, _spender, _amount);\n        return true;\n    }\n\n    /// @dev This function makes it easy to read the `allowed[]` map\n    /// @param _owner The address of the account that owns the token\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @return Amount of remaining tokens of _owner that _spender is allowed\n    ///  to spend\n    function allowance(address _owner, address _spender\n    ) constant returns (uint256 remaining) {\n        return allowed[_owner][_spender];\n    }\n\n    /// @notice `msg.sender` approves `_spender` to send `_amount` tokens on\n    ///  its behalf, and then a function is triggered in the contract that is\n    ///  being approved, `_spender`. This allows users to use their tokens to\n    ///  interact with contracts in one function call instead of two\n    /// @param _spender The address of the contract able to transfer the tokens\n    /// @param _amount The amount of tokens to be approved for transfer\n    /// @return True if the function call was successful\n    function approveAndCall(address _spender, uint256 _amount, bytes _extraData\n    ) returns (bool success) {\n        if (!approve(_spender, _amount)) throw;\n\n        ApproveAndCallFallBack(_spender).receiveApproval(\n            msg.sender,\n            _amount,\n            this,\n            _extraData\n        );\n\n        return true;\n    }\n\n    /// @dev This function makes it easy to get the total number of tokens\n    /// @return The total number of tokens\n    function totalSupply() constant returns (uint) {\n        return totalSupplyAt(block.number);\n    }\n\n\n////////////////\n// Query balance and totalSupply in History\n////////////////\n\n    /// @dev Queries the balance of `_owner` at a specific `_blockNumber`\n    /// @param _owner The address from which the balance will be retrieved\n    /// @param _blockNumber The block number when the balance is queried\n    /// @return The balance at `_blockNumber`\n    function balanceOfAt(address _owner, uint _blockNumber) constant\n        returns (uint) {\n\n        // These next few lines are used when the balance of the token is\n        //  requested before a check point was ever created for this token, it\n        //  requires that the `parentToken.balanceOfAt` be queried at the\n        //  genesis block for that token as this contains initial balance of\n        //  this token\n        if ((balances[_owner].length == 0)\n            || (balances[_owner][0].fromBlock > _blockNumber)) {\n            if (address(parentToken) != 0) {\n                return parentToken.balanceOfAt(_owner, min(_blockNumber, parentSnapShotBlock));\n            } else {\n                // Has no parent\n                return 0;\n            }\n\n        // This will return the expected balance during normal situations\n        } else {\n            return getValueAt(balances[_owner], _blockNumber);\n        }\n    }\n\n    /// @notice Total amount of tokens at a specific `_blockNumber`.\n    /// @param _blockNumber The block number when the totalSupply is queried\n    /// @return The total amount of tokens at `_blockNumber`\n    function totalSupplyAt(uint _blockNumber) constant returns(uint) {\n\n        // These next few lines are used when the totalSupply of the token is\n        //  requested before a check point was ever created for this token, it\n        //  requires that the `parentToken.totalSupplyAt` be queried at the\n        //  genesis block for this token as that contains totalSupply of this\n        //  token at this block number.\n        if ((totalSupplyHistory.length == 0)\n            || (totalSupplyHistory[0].fromBlock > _blockNumber)) {\n            if (address(parentToken) != 0) {\n                return parentToken.totalSupplyAt(min(_blockNumber, parentSnapShotBlock));\n            } else {\n                return 0;\n            }\n\n        // This will return the expected totalSupply during normal situations\n        } else {\n            return getValueAt(totalSupplyHistory, _blockNumber);\n        }\n    }\n\n////////////////\n// Clone Token Method\n////////////////\n\n    /// @notice Creates a new clone token with the initial distribution being\n    ///  this token at `_snapshotBlock`\n    /// @param _cloneTokenName Name of the clone token\n    /// @param _cloneDecimalUnits Number of decimals of the smallest unit\n    /// @param _cloneTokenSymbol Symbol of the clone token\n    /// @param _snapshotBlock Block when the distribution of the parent token is\n    ///  copied to set the initial distribution of the new clone token;\n    ///  if the block is zero than the actual block, the current block is used\n    /// @param _transfersEnabled True if transfers are allowed in the clone\n    /// @return The address of the new MiniMeToken Contract\n    function createCloneToken(\n        string _cloneTokenName,\n        uint8 _cloneDecimalUnits,\n        string _cloneTokenSymbol,\n        uint _snapshotBlock,\n        bool _transfersEnabled\n        ) returns(address) {\n        if (_snapshotBlock == 0) _snapshotBlock = block.number;\n        MiniMeToken cloneToken = tokenFactory.createCloneToken(\n            this,\n            _snapshotBlock,\n            _cloneTokenName,\n            _cloneDecimalUnits,\n            _cloneTokenSymbol,\n            _transfersEnabled\n            );\n\n        cloneToken.changeController(msg.sender);\n\n        // An event to make the token easy to find on the blockchain\n        NewCloneToken(address(cloneToken), _snapshotBlock);\n        return address(cloneToken);\n    }\n\n////////////////\n// Generate and destroy tokens\n////////////////\n\n    /// @notice Generates `_amount` tokens that are assigned to `_owner`\n    /// @param _owner The address that will be assigned the new tokens\n    /// @param _amount The quantity of tokens generated\n    /// @return True if the tokens are generated correctly\n    function generateTokens(address _owner, uint _amount\n    ) onlyController returns (bool) {\n        uint curTotalSupply = getValueAt(totalSupplyHistory, block.number);\n        updateValueAtNow(totalSupplyHistory, curTotalSupply.add(_amount));\n        var previousBalanceTo = balanceOf(_owner);\n        updateValueAtNow(balances[_owner], previousBalanceTo.add(_amount));\n        Transfer(0, _owner, _amount);\n        return true;\n    }\n\n\n    /// @notice Burns `_amount` tokens from `_owner`\n    /// @param _owner The address that will lose the tokens\n    /// @param _amount The quantity of tokens to burn\n    /// @return True if the tokens are burned correctly\n    function destroyTokens(address _owner, uint _amount\n    ) onlyController returns (bool) {\n        uint curTotalSupply = getValueAt(totalSupplyHistory, block.number);\n        if (curTotalSupply < _amount) throw;\n        updateValueAtNow(totalSupplyHistory, curTotalSupply.sub(_amount));\n        var previousBalanceFrom = balanceOf(_owner);\n        if (previousBalanceFrom < _amount) throw;\n        updateValueAtNow(balances[_owner], previousBalanceFrom.sub(_amount));\n        Transfer(_owner, 0, _amount);\n        return true;\n    }\n\n////////////////\n// Enable tokens transfers\n////////////////\n\n\n    /// @notice Enables token holders to transfer their tokens freely if true\n    /// @param _transfersEnabled True if transfers are allowed in the clone\n    function enableTransfers(bool _transfersEnabled) onlyController {\n        transfersEnabled = _transfersEnabled;\n    }\n\n////////////////\n// Internal helper functions to query and set a value in a snapshot array\n////////////////\n\n    /// @dev `getValueAt` retrieves the number of tokens at a given block number\n    /// @param checkpoints The history of values being queried\n    /// @param _block The block number to retrieve the value at\n    /// @return The number of tokens being queried\n    function getValueAt(Checkpoint[] storage checkpoints, uint _block\n    ) constant internal returns (uint) {\n        if (checkpoints.length == 0) return 0;\n\n        // Shortcut for the actual value\n        if (_block >= checkpoints[checkpoints.length-1].fromBlock)\n            return checkpoints[checkpoints.length-1].value;\n        if (_block < checkpoints[0].fromBlock) return 0;\n\n        // Binary search of the value in the array\n        uint min = 0;\n        uint max = checkpoints.length-1;\n        while (max > min) {\n            uint mid = (max + min + 1)/ 2;\n            if (checkpoints[mid].fromBlock<=_block) {\n                min = mid;\n            } else {\n                max = mid-1;\n            }\n        }\n        return checkpoints[min].value;\n    }\n\n    /// @dev `updateValueAtNow` used to update the `balances` map and the\n    ///  `totalSupplyHistory`\n    /// @param checkpoints The history of data being updated\n    /// @param _value The new number of tokens\n    function updateValueAtNow(Checkpoint[] storage checkpoints, uint _value\n    ) internal  {\n        if ((checkpoints.length == 0)\n        || (checkpoints[checkpoints.length -1].fromBlock < block.number)) {\n               Checkpoint newCheckPoint = checkpoints[ checkpoints.length++ ];\n               newCheckPoint.fromBlock =  uint128(block.number);\n               newCheckPoint.value = uint128(_value);\n           } else {\n               Checkpoint oldCheckPoint = checkpoints[checkpoints.length-1];\n               oldCheckPoint.value = uint128(_value);\n           }\n    }\n\n    /// @dev Internal function to determine if an address is a contract\n    /// @param _addr The address being queried\n    /// @return True if `_addr` is a contract\n    function isContract(address _addr) constant internal returns(bool) {\n        uint size;\n        if (_addr == 0) return false;\n        assembly {\n            size := extcodesize(_addr)\n        }\n        return size>0;\n    }\n\n    /// @dev Helper function to return a min betwen the two uints\n    function min(uint a, uint b) internal returns (uint) {\n        return a < b ? a : b;\n    }\n\n    /// @notice The fallback function: If the contract's controller has not been\n    ///  set to 0, then the `proxyPayment` method is called which relays the\n    ///  ether and creates tokens as described in the token controller contract\n    function ()  payable {\n        if (isContract(controller)) {\n            if (! TokenController(controller).proxyPayment.value(msg.value)(msg.sender))\n                throw;\n        } else {\n            throw;\n        }\n    }\n\n    //////////\n    // Safety Methods\n    //////////\n\n    /// @notice This method can be used by the controller to extract mistakenly\n    ///  sent tokens to this contract.\n    /// @param _token The address of the token contract that you want to recover\n    ///  set to 0 in case you want to extract ether.\n    /// @param _claimer Address that tokens will be send to\n    function claimTokens(address _token, address _claimer) onlyController {\n        if (_token == 0x0) {\n            _claimer.transfer(this.balance);\n            return;\n        }\n\n        ERC20Basic token = ERC20Basic(_token);\n        uint balance = token.balanceOf(this);\n        token.transfer(_claimer, balance);\n        ClaimedTokens(_token, _claimer, balance);\n    }\n\n\n////////////////\n// Events\n////////////////\n    event ClaimedTokens(address indexed _token, address indexed _claimer, uint _amount);\n    event Transfer(address indexed _from, address indexed _to, uint256 _amount);\n    event NewCloneToken(address indexed _cloneToken, uint _snapshotBlock);\n    event Approval(\n        address indexed _owner,\n        address indexed _spender,\n        uint256 _amount\n        );\n\n}\n\n\n////////////////\n// MiniMeTokenFactory\n////////////////\n\n/// @dev This contract is used to generate clone contracts from a contract.\n///  In solidity this is the way to create a contract from a contract of the\n///  same class\ncontract MiniMeTokenFactory {\n\n    /// @notice Update the DApp by creating a new token with new functionalities\n    ///  the msg.sender becomes the controller of this clone token\n    /// @param _parentToken Address of the token being cloned\n    /// @param _snapshotBlock Block of the parent token that will\n    ///  determine the initial distribution of the clone token\n    /// @param _tokenName Name of the new token\n    /// @param _decimalUnits Number of decimals of the new token\n    /// @param _tokenSymbol Token Symbol for the new token\n    /// @param _transfersEnabled If true, tokens will be able to be transferred\n    /// @return The address of the new token contract\n    function createCloneToken(\n        address _parentToken,\n        uint _snapshotBlock,\n        string _tokenName,\n        uint8 _decimalUnits,\n        string _tokenSymbol,\n        bool _transfersEnabled\n    ) returns (MiniMeToken) {\n        MiniMeToken newToken = new MiniMeToken(\n            this,\n            _parentToken,\n            _snapshotBlock,\n            _tokenName,\n            _decimalUnits,\n            _tokenSymbol,\n            _transfersEnabled\n            );\n\n        newToken.changeController(msg.sender);\n        return newToken;\n    }\n}\n"
  },
  {
    "path": "resources/public/contracts/src/MultisigWallet.sol",
    "content": "pragma solidity ^0.4.11;\n\n\n/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.\n/// @author Stefan George - <stefan.george@consensys.net>\ncontract MultiSigWallet {\n\n    uint constant public MAX_OWNER_COUNT = 50;\n\n    event Confirmation(address indexed sender, uint indexed transactionId);\n    event Revocation(address indexed sender, uint indexed transactionId);\n    event Submission(uint indexed transactionId);\n    event Execution(uint indexed transactionId);\n    event ExecutionFailure(uint indexed transactionId);\n    event Deposit(address indexed sender, uint value);\n    event OwnerAddition(address indexed owner);\n    event OwnerRemoval(address indexed owner);\n    event RequirementChange(uint required);\n\n    mapping (uint => Transaction) public transactions;\n    mapping (uint => mapping (address => bool)) public confirmations;\n    mapping (address => bool) public isOwner;\n    address[] public owners;\n    uint public required;\n    uint public transactionCount;\n\n    struct Transaction {\n        address destination;\n        uint value;\n        bytes data;\n        bool executed;\n    }\n\n    modifier onlyWallet() {\n        if (msg.sender != address(this))\n            throw;\n        _;\n    }\n\n    modifier ownerDoesNotExist(address owner) {\n        if (isOwner[owner])\n            throw;\n        _;\n    }\n\n    modifier ownerExists(address owner) {\n        if (!isOwner[owner])\n            throw;\n        _;\n    }\n\n    modifier transactionExists(uint transactionId) {\n        if (transactions[transactionId].destination == 0)\n            throw;\n        _;\n    }\n\n    modifier confirmed(uint transactionId, address owner) {\n        if (!confirmations[transactionId][owner])\n            throw;\n        _;\n    }\n\n    modifier notConfirmed(uint transactionId, address owner) {\n        if (confirmations[transactionId][owner])\n            throw;\n        _;\n    }\n\n    modifier notExecuted(uint transactionId) {\n        if (transactions[transactionId].executed)\n            throw;\n        _;\n    }\n\n    modifier notNull(address _address) {\n        if (_address == 0)\n            throw;\n        _;\n    }\n\n    modifier validRequirement(uint ownerCount, uint _required) {\n        if (   ownerCount > MAX_OWNER_COUNT\n            || _required > ownerCount\n            || _required == 0\n            || ownerCount == 0)\n            throw;\n        _;\n    }\n\n    /// @dev Fallback function allows to deposit ether.\n    function()\n        payable\n    {\n        if (msg.value > 0)\n            Deposit(msg.sender, msg.value);\n    }\n\n    /*\n     * Public functions\n     */\n    /// @dev Contract constructor sets initial owners and required number of confirmations.\n    /// @param _owners List of initial owners.\n    /// @param _required Number of required confirmations.\n    function MultiSigWallet(address[] _owners, uint _required)\n        public\n        validRequirement(_owners.length, _required)\n    {\n        for (uint i=0; i<_owners.length; i++) {\n            if (isOwner[_owners[i]] || _owners[i] == 0)\n                throw;\n            isOwner[_owners[i]] = true;\n        }\n        owners = _owners;\n        required = _required;\n    }\n\n    /// @dev Allows to add a new owner. Transaction has to be sent by wallet.\n    /// @param owner Address of new owner.\n    function addOwner(address owner)\n        public\n        onlyWallet\n        ownerDoesNotExist(owner)\n        notNull(owner)\n        validRequirement(owners.length + 1, required)\n    {\n        isOwner[owner] = true;\n        owners.push(owner);\n        OwnerAddition(owner);\n    }\n\n    /// @dev Allows to remove an owner. Transaction has to be sent by wallet.\n    /// @param owner Address of owner.\n    function removeOwner(address owner)\n        public\n        onlyWallet\n        ownerExists(owner)\n    {\n        isOwner[owner] = false;\n        for (uint i=0; i<owners.length - 1; i++)\n            if (owners[i] == owner) {\n                owners[i] = owners[owners.length - 1];\n                break;\n            }\n        owners.length -= 1;\n        if (required > owners.length)\n            changeRequirement(owners.length);\n        OwnerRemoval(owner);\n    }\n\n    /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.\n    /// @param owner Address of owner to be replaced.\n    /// @param owner Address of new owner.\n    function replaceOwner(address owner, address newOwner)\n        public\n        onlyWallet\n        ownerExists(owner)\n        ownerDoesNotExist(newOwner)\n    {\n        for (uint i=0; i<owners.length; i++)\n            if (owners[i] == owner) {\n                owners[i] = newOwner;\n                break;\n            }\n        isOwner[owner] = false;\n        isOwner[newOwner] = true;\n        OwnerRemoval(owner);\n        OwnerAddition(newOwner);\n    }\n\n    /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.\n    /// @param _required Number of required confirmations.\n    function changeRequirement(uint _required)\n        public\n        onlyWallet\n        validRequirement(owners.length, _required)\n    {\n        required = _required;\n        RequirementChange(_required);\n    }\n\n    /// @dev Allows an owner to submit and confirm a transaction.\n    /// @param destination Transaction target address.\n    /// @param value Transaction ether value.\n    /// @param data Transaction data payload.\n    /// @return Returns transaction ID.\n    function submitTransaction(address destination, uint value, bytes data)\n        public\n        returns (uint transactionId)\n    {\n        transactionId = addTransaction(destination, value, data);\n        confirmTransaction(transactionId);\n    }\n\n    /// @dev Allows an owner to confirm a transaction.\n    /// @param transactionId Transaction ID.\n    function confirmTransaction(uint transactionId)\n        public\n        ownerExists(msg.sender)\n        transactionExists(transactionId)\n        notConfirmed(transactionId, msg.sender)\n    {\n        confirmations[transactionId][msg.sender] = true;\n        Confirmation(msg.sender, transactionId);\n        executeTransaction(transactionId);\n    }\n\n    /// @dev Allows an owner to revoke a confirmation for a transaction.\n    /// @param transactionId Transaction ID.\n    function revokeConfirmation(uint transactionId)\n        public\n        ownerExists(msg.sender)\n        confirmed(transactionId, msg.sender)\n        notExecuted(transactionId)\n    {\n        confirmations[transactionId][msg.sender] = false;\n        Revocation(msg.sender, transactionId);\n    }\n\n    /// @dev Allows anyone to execute a confirmed transaction.\n    /// @param transactionId Transaction ID.\n    function executeTransaction(uint transactionId)\n        public\n        notExecuted(transactionId)\n    {\n        if (isConfirmed(transactionId)) {\n            Transaction tx = transactions[transactionId];\n            tx.executed = true;\n            if (tx.destination.call.value(tx.value)(tx.data))\n                Execution(transactionId);\n            else {\n                ExecutionFailure(transactionId);\n                tx.executed = false;\n            }\n        }\n    }\n\n    /// @dev Returns the confirmation status of a transaction.\n    /// @param transactionId Transaction ID.\n    /// @return Confirmation status.\n    function isConfirmed(uint transactionId)\n        public\n        constant\n        returns (bool)\n    {\n        uint count = 0;\n        for (uint i=0; i<owners.length; i++) {\n            if (confirmations[transactionId][owners[i]])\n                count += 1;\n            if (count == required)\n                return true;\n        }\n    }\n\n    /*\n     * Internal functions\n     */\n    /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.\n    /// @param destination Transaction target address.\n    /// @param value Transaction ether value.\n    /// @param data Transaction data payload.\n    /// @return Returns transaction ID.\n    function addTransaction(address destination, uint value, bytes data)\n        internal\n        notNull(destination)\n        returns (uint transactionId)\n    {\n        transactionId = transactionCount;\n        transactions[transactionId] = Transaction({\n            destination: destination,\n            value: value,\n            data: data,\n            executed: false\n        });\n        transactionCount += 1;\n        Submission(transactionId);\n    }\n\n    /*\n     * Web3 call functions\n     */\n    /// @dev Returns number of confirmations of a transaction.\n    /// @param transactionId Transaction ID.\n    /// @return Number of confirmations.\n    function getConfirmationCount(uint transactionId)\n        public\n        constant\n        returns (uint count)\n    {\n        for (uint i=0; i<owners.length; i++)\n            if (confirmations[transactionId][owners[i]])\n                count += 1;\n    }\n\n    /// @dev Returns total number of transactions after filers are applied.\n    /// @param pending Include pending transactions.\n    /// @param executed Include executed transactions.\n    /// @return Total number of transactions after filters are applied.\n    function getTransactionCount(bool pending, bool executed)\n        public\n        constant\n        returns (uint count)\n    {\n        for (uint i=0; i<transactionCount; i++)\n            if (   pending && !transactions[i].executed\n                || executed && transactions[i].executed)\n                count += 1;\n    }\n\n    /// @dev Returns list of owners.\n    /// @return List of owner addresses.\n    function getOwners()\n        public\n        constant\n        returns (address[])\n    {\n        return owners;\n    }\n\n    /// @dev Returns array with owner addresses, which confirmed transaction.\n    /// @param transactionId Transaction ID.\n    /// @return Returns array of owner addresses.\n    function getConfirmations(uint transactionId)\n        public\n        constant\n        returns (address[] _confirmations)\n    {\n        address[] memory confirmationsTemp = new address[](owners.length);\n        uint count = 0;\n        uint i;\n        for (i=0; i<owners.length; i++)\n            if (confirmations[transactionId][owners[i]]) {\n                confirmationsTemp[count] = owners[i];\n                count += 1;\n            }\n        _confirmations = new address[](count);\n        for (i=0; i<count; i++)\n            _confirmations[i] = confirmationsTemp[i];\n    }\n\n    /// @dev Returns list of transaction IDs in defined range.\n    /// @param from Index start position of transaction array.\n    /// @param to Index end position of transaction array.\n    /// @param pending Include pending transactions.\n    /// @param executed Include executed transactions.\n    /// @return Returns array of transaction IDs.\n    function getTransactionIds(uint from, uint to, bool pending, bool executed)\n        public\n        constant\n        returns (uint[] _transactionIds)\n    {\n        uint[] memory transactionIdsTemp = new uint[](transactionCount);\n        uint count = 0;\n        uint i;\n        for (i=0; i<transactionCount; i++)\n            if (   pending && !transactions[i].executed\n                || executed && transactions[i].executed)\n            {\n                transactionIdsTemp[count] = i;\n                count += 1;\n            }\n        _transactionIds = new uint[](to - from);\n        for (i=from; i<to; i++)\n            _transactionIds[i - from] = transactionIdsTemp[i];\n    }\n}\n"
  },
  {
    "path": "resources/public/contracts/src/Ownable.sol",
    "content": "pragma solidity ^0.4.11;\n\n\n/// @dev `Owned` is a base level contract that assigns an `owner` that can be\n///  later changed\ncontract Ownable {\n\n    /// @dev `owner` is the only address that can call a function with this\n    /// modifier\n    modifier onlyOwner() {\n        require(msg.sender == owner);\n        _;\n    }\n\n    address public owner;\n\n    /// @notice The Constructor assigns the message sender to be `owner`\n    function Ownable() {\n        owner = msg.sender;\n    }\n\n    address public newOwner;\n\n    /// @notice `owner` can step down and assign some other address to this role\n    /// @param _newOwner The address of the new owner.\n    function changeOwner(address _newOwner) onlyOwner {\n        newOwner = _newOwner;\n    }\n\n\n    function acceptOwnership() {\n        if (msg.sender == newOwner) {\n            owner = newOwner;\n        }\n    }\n}\n"
  },
  {
    "path": "resources/public/contracts/src/Pausable.sol",
    "content": "pragma solidity ^0.4.11;\n\n\nimport \"./Ownable.sol\";\n\n\n/*\n * Pausable\n * Abstract contract that allows children to implement an\n * emergency stop mechanism.\n * Made by OpenZeppelin https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/lifecycle/Pausable.sol\n */\ncontract Pausable is Ownable {\n  bool public stopped;\n  event onEmergencyChanged(bool isStopped);\n\n  modifier stopInEmergency {\n    if (stopped) {\n      throw;\n    }\n    _;\n  }\n\n  modifier onlyInEmergency {\n    if (!stopped) {\n      throw;\n    }\n    _;\n  }\n\n  // called by the owner on emergency, triggers stopped state\n  function emergencyStop() external onlyOwner {\n    stopped = true;\n    onEmergencyChanged(stopped);\n  }\n\n  // called by the owner on end of emergency, returns to normal state\n  function release() external onlyOwner onlyInEmergency {\n    stopped = false;\n    onEmergencyChanged(stopped);\n  }\n\n}\n"
  },
  {
    "path": "resources/public/contracts/src/SafeERC20.sol",
    "content": "pragma solidity ^0.4.18;\n\nimport './ERC20Basic.sol';\nimport './ERC20.sol';\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure.\n * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n  function safeTransfer(ERC20Basic token, address to, uint256 value) internal {\n    assert(token.transfer(to, value));\n  }\n\n  function safeTransferFrom(ERC20 token, address from, address to, uint256 value) internal {\n    assert(token.transferFrom(from, to, value));\n  }\n\n  function safeApprove(ERC20 token, address spender, uint256 value) internal {\n    assert(token.approve(spender, value));\n  }\n}\n"
  },
  {
    "path": "resources/public/contracts/src/SafeMath.sol",
    "content": "pragma solidity ^0.4.11;\n\n\n/**\n * Math operations with safety checks\n */\nlibrary SafeMath {\n  function mul(uint a, uint b) internal returns (uint) {\n    uint c = a * b;\n    assert(a == 0 || c / a == b);\n    return c;\n  }\n\n  function div(uint a, uint b) internal returns (uint) {\n    // assert(b > 0); // Solidity automatically throws when dividing by 0\n    uint c = a / b;\n    // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n    return c;\n  }\n\n  function sub(uint a, uint b) internal returns (uint) {\n    assert(b <= a);\n    return a - b;\n  }\n\n  function add(uint a, uint b) internal returns (uint) {\n    uint c = a + b;\n    assert(c >= a);\n    return c;\n  }\n\n  function max64(uint64 a, uint64 b) internal constant returns (uint64) {\n    return a >= b ? a : b;\n  }\n\n  function min64(uint64 a, uint64 b) internal constant returns (uint64) {\n    return a < b ? a : b;\n  }\n\n  function max256(uint256 a, uint256 b) internal constant returns (uint256) {\n    return a >= b ? a : b;\n  }\n\n  function min256(uint256 a, uint256 b) internal constant returns (uint256) {\n    return a < b ? a : b;\n  }\n\n  function assert(bool assertion) internal {\n    if (!assertion) {\n      throw;\n    }\n  }\n}\n"
  },
  {
    "path": "resources/public/contracts/src/Shareable.sol",
    "content": "pragma solidity ^0.4.11;\n\n\n/*\n * Shareable\n *\n * Based on https://github.com/ethereum/dapp-bin/blob/master/wallet/wallet.sol\n *\n * inheritable \"property\" contract that enables methods to be protected by requiring the acquiescence of either a single, or, crucially, each of a number of, designated owners.\n *\n * usage:\n * use modifiers onlyowner (just own owned) or onlymanyowners(hash), whereby the same hash must be provided by some number (specified in constructor) of the set of owners (specified in the constructor) before the interior is executed.\n * Made by OpenZeppelin https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/ownership/Shareable.sol\n */\ncontract Shareable {\n  // struct for the status of a pending operation.\n  struct PendingState {\n    uint yetNeeded;\n    uint ownersDone;\n    uint index;\n  }\n\n  // the number of owners that must confirm the same operation before it is run.\n  uint public required;\n\n  // list of owners\n  address[256] owners;\n  // index on the list of owners to allow reverse lookup\n  mapping(address => uint) ownerIndex;\n  // the ongoing operations.\n  mapping(bytes32 => PendingState) pendings;\n  bytes32[] pendingsIndex;\n\n\n  // this contract only has six types of events: it can accept a confirmation, in which case\n  // we record owner and operation (hash) alongside it.\n  event Confirmation(address owner, bytes32 operation);\n  event Revoke(address owner, bytes32 operation);\n\n\n  // simple single-sig function modifier.\n  modifier onlyOwner {\n    if (!isOwner(msg.sender)) {\n      throw;\n    }\n    _;\n  }\n\n  // multi-sig function modifier: the operation must have an intrinsic hash in order\n  // that later attempts can be realised as the same underlying operation and\n  // thus count as confirmations.\n  modifier onlymanyowners(bytes32 _operation) {\n    if (confirmAndCheck(_operation)) {\n      _;\n    }\n  }\n\n  // constructor is given number of sigs required to do protected \"onlymanyowners\" transactions\n  // as well as the selection of addresses capable of confirming them.\n  function Shareable(address[] _owners, uint _required) {\n    owners[1] = msg.sender;\n    ownerIndex[msg.sender] = 1;\n    for (uint i = 0; i < _owners.length; ++i) {\n      owners[2 + i] = _owners[i];\n      ownerIndex[_owners[i]] = 2 + i;\n    }\n    required = _required;\n    if (required > owners.length) {\n      throw;\n    }\n  }\n\n  // Revokes a prior confirmation of the given operation\n  function revoke(bytes32 _operation) external {\n    uint index = ownerIndex[msg.sender];\n    // make sure they're an owner\n    if (index == 0) {\n      return;\n    }\n    uint ownerIndexBit = 2**index;\n    var pending = pendings[_operation];\n    if (pending.ownersDone & ownerIndexBit > 0) {\n      pending.yetNeeded++;\n      pending.ownersDone -= ownerIndexBit;\n      Revoke(msg.sender, _operation);\n    }\n  }\n\n  // Gets an owner by 0-indexed position (using numOwners as the count)\n  function getOwner(uint ownerIndex) external constant returns (address) {\n    return address(owners[ownerIndex + 1]);\n  }\n\n  function isOwner(address _addr) constant returns (bool) {\n    return ownerIndex[_addr] > 0;\n  }\n\n  function hasConfirmed(bytes32 _operation, address _owner) constant returns (bool) {\n    var pending = pendings[_operation];\n    uint index = ownerIndex[_owner];\n\n    // make sure they're an owner\n    if (index == 0) {\n      return false;\n    }\n\n    // determine the bit to set for this owner.\n    uint ownerIndexBit = 2**index;\n    return !(pending.ownersDone & ownerIndexBit == 0);\n  }\n\n  // returns true when operation can be executed\n  function confirmAndCheck(bytes32 _operation) internal returns (bool) {\n    // determine what index the present sender is:\n    uint index = ownerIndex[msg.sender];\n    // make sure they're an owner\n    if (index == 0) {\n      throw;\n    }\n\n    var pending = pendings[_operation];\n    // if we're not yet working on this operation, switch over and reset the confirmation status.\n    if (pending.yetNeeded == 0) {\n      // reset count of confirmations needed.\n      pending.yetNeeded = required;\n      // reset which owners have confirmed (none) - set our bitmap to 0.\n      pending.ownersDone = 0;\n      pending.index = pendingsIndex.length++;\n      pendingsIndex[pending.index] = _operation;\n    }\n    // determine the bit to set for this owner.\n    uint ownerIndexBit = 2**index;\n    // make sure we (the message sender) haven't confirmed this operation previously.\n    if (pending.ownersDone & ownerIndexBit == 0) {\n      Confirmation(msg.sender, _operation);\n      // ok - check if count is enough to go ahead.\n      if (pending.yetNeeded <= 1) {\n        // enough confirmations: reset and run interior.\n        delete pendingsIndex[pendings[_operation].index];\n        delete pendings[_operation];\n        return true;\n      } else {\n        // not enough: record that this owner in particular confirmed.\n        pending.yetNeeded--;\n        pending.ownersDone |= ownerIndexBit;\n      }\n    }\n    return false;\n  }\n\n  function clearPending() internal {\n    uint length = pendingsIndex.length;\n    for (uint i = 0; i < length; ++i) {\n      if (pendingsIndex[i] != 0) {\n        delete pendings[pendingsIndex[i]];\n      }\n    }\n    delete pendingsIndex;\n  }\n\n}\n"
  },
  {
    "path": "resources/public/contracts/src/SingleFileContribution.sol",
    "content": "pragma solidity ^0.4.11;\n\n\nlibrary SafeMath {\n  function mul(uint a, uint b) internal returns (uint) {\n    uint c = a * b;\n    assert(a == 0 || c / a == b);\n    return c;\n  }\n\n  function div(uint a, uint b) internal returns (uint) {\n    // assert(b > 0); // Solidity automatically throws when dividing by 0\n    uint c = a / b;\n    // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n    return c;\n  }\n\n  function sub(uint a, uint b) internal returns (uint) {\n    assert(b <= a);\n    return a - b;\n  }\n\n  function add(uint a, uint b) internal returns (uint) {\n    uint c = a + b;\n    assert(c >= a);\n    return c;\n  }\n\n  function max64(uint64 a, uint64 b) internal constant returns (uint64) {\n    return a >= b ? a : b;\n  }\n\n  function min64(uint64 a, uint64 b) internal constant returns (uint64) {\n    return a < b ? a : b;\n  }\n\n  function max256(uint256 a, uint256 b) internal constant returns (uint256) {\n    return a >= b ? a : b;\n  }\n\n  function min256(uint256 a, uint256 b) internal constant returns (uint256) {\n    return a < b ? a : b;\n  }\n\n  function assert(bool assertion) internal {\n    if (!assertion) {\n      throw;\n    }\n  }\n}\n\ncontract Ownable {\n\n    /// @dev `owner` is the only address that can call a function with this\n    /// modifier\n    modifier onlyOwner() {\n        require(msg.sender == owner);\n        _;\n    }\n\n    address public owner;\n\n    /// @notice The Constructor assigns the message sender to be `owner`\n    function Ownable() {\n        owner = msg.sender;\n    }\n\n    address public newOwner;\n\n    /// @notice `owner` can step down and assign some other address to this role\n    /// @param _newOwner The address of the new owner.\n    function changeOwner(address _newOwner) onlyOwner {\n        newOwner = _newOwner;\n    }\n\n\n    function acceptOwnership() {\n        if (msg.sender == newOwner) {\n            owner = newOwner;\n        }\n    }\n}\n\ncontract Pausable is Ownable {\n  bool public stopped;\n  event onEmergencyChanged(bool isStopped);\n\n  modifier stopInEmergency {\n    if (stopped) {\n      throw;\n    }\n    _;\n  }\n\n  modifier onlyInEmergency {\n    if (!stopped) {\n      throw;\n    }\n    _;\n  }\n\n  // called by the owner on emergency, triggers stopped state\n  function emergencyStop() external onlyOwner {\n    stopped = true;\n    onEmergencyChanged(stopped);\n  }\n\n  // called by the owner on end of emergency, returns to normal state\n  function release() external onlyOwner onlyInEmergency {\n    stopped = false;\n    onEmergencyChanged(stopped);\n  }\n\n}\n\ncontract ERC20Basic {\n  function totalSupply() constant returns (uint);\n  function balanceOf(address who) constant returns (uint);\n  function transfer(address to, uint value) returns (bool);\n  event Transfer(address indexed from, address indexed to, uint value);\n}\n\ncontract ERC20 is ERC20Basic {\n\n  mapping(address => uint) balances;\n\n  function allowance(address owner, address spender) constant returns (uint);\n  function transferFrom(address from, address to, uint value) returns (bool);\n  function approve(address spender, uint value) returns (bool);\n  function approveAndCall(address spender, uint256 value, bytes extraData) returns (bool);\n  event Approval(address indexed owner, address indexed spender, uint value);\n\n  function doTransfer(address _from, address _to, uint _amount) internal returns(bool);\n}\n\ncontract GrantsControlled {\n    modifier onlyGrantsController { if (msg.sender != grantsController) throw; _; }\n\n    address public grantsController;\n\n    function GrantsControlled() { grantsController = msg.sender;}\n\n    function changeGrantsController(address _newController) onlyGrantsController {\n        grantsController = _newController;\n    }\n}\n\ncontract LimitedTransferToken is ERC20 {\n  // Checks whether it can transfer or otherwise throws.\n  modifier canTransfer(address _sender, uint _value) {\n   if (_value > transferableTokens(_sender, uint64(now))) throw;\n   _;\n  }\n\n  // Checks modifier and allows transfer if tokens are not locked.\n  function transfer(address _to, uint _value) canTransfer(msg.sender, _value) returns (bool) {\n   return super.transfer(_to, _value);\n  }\n\n  // Checks modifier and allows transfer if tokens are not locked.\n  function transferFrom(address _from, address _to, uint _value) canTransfer(_from, _value) returns (bool) {\n   return super.transferFrom(_from, _to, _value);\n  }\n\n  // Default transferable tokens function returns all tokens for a holder (no limit).\n  function transferableTokens(address holder, uint64 time) constant public returns (uint256) {\n    return balanceOf(holder);\n  }\n}\n\ncontract Controlled {\n    /// @notice The address of the controller is the only address that can call\n    ///  a function with this modifier\n    modifier onlyController { if (msg.sender != controller) throw; _; }\n\n    address public controller;\n\n    function Controlled() { controller = msg.sender;}\n\n    /// @notice Changes the controller of the contract\n    /// @param _newController The new controller of the contract\n    function changeController(address _newController) onlyController {\n        controller = _newController;\n    }\n}\n\ncontract MiniMeToken is ERC20, Controlled {\n    using SafeMath for uint;\n\n    string public name;                //The Token's name: e.g. DigixDAO Tokens\n    uint8 public decimals;             //Number of decimals of the smallest unit\n    string public symbol;              //An identifier: e.g. REP\n    string public version = 'MMT_0.1'; //An arbitrary versioning scheme\n\n\n    /// @dev `Checkpoint` is the structure that attaches a block number to a\n    ///  given value, the block number attached is the one that last changed the\n    ///  value\n    struct  Checkpoint {\n\n        // `fromBlock` is the block number that the value was generated from\n        uint128 fromBlock;\n\n        // `value` is the amount of tokens at a specific block number\n        uint128 value;\n    }\n\n    // `parentToken` is the Token address that was cloned to produce this token;\n    //  it will be 0x0 for a token that was not cloned\n    MiniMeToken public parentToken;\n\n    // `parentSnapShotBlock` is the block number from the Parent Token that was\n    //  used to determine the initial distribution of the Clone Token\n    uint public parentSnapShotBlock;\n\n    // `creationBlock` is the block number that the Clone Token was created\n    uint public creationBlock;\n\n    // `balances` is the map that tracks the balance of each address, in this\n    //  contract when the balance changes the block number that the change\n    //  occurred is also included in the map\n    mapping (address => Checkpoint[]) balances;\n\n    // `allowed` tracks any extra transfer rights as in all ERC20 tokens\n    mapping (address => mapping (address => uint256)) allowed;\n\n    // Tracks the history of the `totalSupply` of the token\n    Checkpoint[] totalSupplyHistory;\n\n    // Flag that determines if the token is transferable or not.\n    bool public transfersEnabled;\n\n    // The factory used to create new clone tokens\n    MiniMeTokenFactory public tokenFactory;\n\n////////////////\n// Constructor\n////////////////\n\n    /// @notice Constructor to create a MiniMeToken\n    /// @param _tokenFactory The address of the MiniMeTokenFactory contract that\n    ///  will create the Clone token contracts, the token factory needs to be\n    ///  deployed first\n    /// @param _parentToken Address of the parent token, set to 0x0 if it is a\n    ///  new token\n    /// @param _parentSnapShotBlock Block of the parent token that will\n    ///  determine the initial distribution of the clone token, set to 0 if it\n    ///  is a new token\n    /// @param _tokenName Name of the new token\n    /// @param _decimalUnits Number of decimals of the new token\n    /// @param _tokenSymbol Token Symbol for the new token\n    /// @param _transfersEnabled If true, tokens will be able to be transferred\n    function MiniMeToken(\n        address _tokenFactory,\n        address _parentToken,\n        uint _parentSnapShotBlock,\n        string _tokenName,\n        uint8 _decimalUnits,\n        string _tokenSymbol,\n        bool _transfersEnabled\n    ) {\n        tokenFactory = MiniMeTokenFactory(_tokenFactory);\n        name = _tokenName;                                 // Set the name\n        decimals = _decimalUnits;                          // Set the decimals\n        symbol = _tokenSymbol;                             // Set the symbol\n        parentToken = MiniMeToken(_parentToken);\n        parentSnapShotBlock = _parentSnapShotBlock;\n        transfersEnabled = _transfersEnabled;\n        creationBlock = block.number;\n    }\n\n\n///////////////////\n// ERC20 Methods\n///////////////////\n\n    /// @notice Send `_amount` tokens to `_to` from `msg.sender`\n    /// @param _to The address of the recipient\n    /// @param _amount The amount of tokens to be transferred\n    /// @return Whether the transfer was successful or not\n    function transfer(address _to, uint256 _amount) returns (bool success) {\n        if (!transfersEnabled) throw;\n        return doTransfer(msg.sender, _to, _amount);\n    }\n\n    /// @notice Send `_amount` tokens to `_to` from `_from` on the condition it\n    ///  is approved by `_from`\n    /// @param _from The address holding the tokens being transferred\n    /// @param _to The address of the recipient\n    /// @param _amount The amount of tokens to be transferred\n    /// @return True if the transfer was successful\n    function transferFrom(address _from, address _to, uint256 _amount\n    ) returns (bool success) {\n\n        // The controller of this contract can move tokens around at will,\n        //  this is important to recognize! Confirm that you trust the\n        //  controller of this contract, which in most situations should be\n        //  another open source smart contract or 0x0\n        if (msg.sender != controller) {\n            if (!transfersEnabled) throw;\n\n            // The standard ERC 20 transferFrom functionality\n            if (allowed[_from][msg.sender] < _amount) return false;\n            allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_amount);\n        }\n        return doTransfer(_from, _to, _amount);\n    }\n\n    /// @dev This is the actual transfer function in the token contract, it can\n    ///  only be called by other functions in this contract.\n    /// @param _from The address holding the tokens being transferred\n    /// @param _to The address of the recipient\n    /// @param _amount The amount of tokens to be transferred\n    /// @return True if the transfer was successful\n    function doTransfer(address _from, address _to, uint _amount\n    ) internal returns(bool) {\n\n           if (_amount == 0) {\n               return true;\n           }\n\n           if (parentSnapShotBlock >= block.number) throw;\n\n           // Do not allow transfer to 0x0 or the token contract itself\n           if ((_to == 0) || (_to == address(this))) throw;\n\n           // If the amount being transfered is more than the balance of the\n           //  account the transfer returns false\n           var previousBalanceFrom = balanceOfAt(_from, block.number);\n           if (previousBalanceFrom < _amount) {\n               return false;\n           }\n\n           // Alerts the token controller of the transfer\n           if (isContract(controller)) {\n               if (!TokenController(controller).onTransfer(_from, _to, _amount))\n               throw;\n           }\n\n           // First update the balance array with the new value for the address\n           //  sending the tokens\n           updateValueAtNow(balances[_from], previousBalanceFrom.sub(_amount));\n\n           // Then update the balance array with the new value for the address\n           //  receiving the tokens\n           var previousBalanceTo = balanceOfAt(_to, block.number);\n           updateValueAtNow(balances[_to], previousBalanceTo.add(_amount));\n\n           // An event to make the transfer easy to find on the blockchain\n           Transfer(_from, _to, _amount);\n\n           return true;\n    }\n\n    /// @param _owner The address that's balance is being requested\n    /// @return The balance of `_owner` at the current block\n    function balanceOf(address _owner) constant returns (uint256 balance) {\n        return balanceOfAt(_owner, block.number);\n    }\n\n    /// @notice `msg.sender` approves `_spender` to spend `_amount` tokens on\n    ///  its behalf. This is a modified version of the ERC20 approve function\n    ///  to be a little bit safer\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @param _amount The amount of tokens to be approved for transfer\n    /// @return True if the approval was successful\n    function approve(address _spender, uint256 _amount) returns (bool success) {\n        if (!transfersEnabled) throw;\n\n        // To change the approve amount you first have to reduce the addresses`\n        //  allowance to zero by calling `approve(_spender,0)` if it is not\n        //  already 0 to mitigate the race condition described here:\n        //  https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n        if ((_amount!=0) && (allowed[msg.sender][_spender] !=0)) throw;\n\n        // Alerts the token controller of the approve function call\n        if (isContract(controller)) {\n            if (!TokenController(controller).onApprove(msg.sender, _spender, _amount))\n                throw;\n        }\n\n        allowed[msg.sender][_spender] = _amount;\n        Approval(msg.sender, _spender, _amount);\n        return true;\n    }\n\n    /// @dev This function makes it easy to read the `allowed[]` map\n    /// @param _owner The address of the account that owns the token\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @return Amount of remaining tokens of _owner that _spender is allowed\n    ///  to spend\n    function allowance(address _owner, address _spender\n    ) constant returns (uint256 remaining) {\n        return allowed[_owner][_spender];\n    }\n\n    /// @notice `msg.sender` approves `_spender` to send `_amount` tokens on\n    ///  its behalf, and then a function is triggered in the contract that is\n    ///  being approved, `_spender`. This allows users to use their tokens to\n    ///  interact with contracts in one function call instead of two\n    /// @param _spender The address of the contract able to transfer the tokens\n    /// @param _amount The amount of tokens to be approved for transfer\n    /// @return True if the function call was successful\n    function approveAndCall(address _spender, uint256 _amount, bytes _extraData\n    ) returns (bool success) {\n        if (!approve(_spender, _amount)) throw;\n\n        ApproveAndCallFallBack(_spender).receiveApproval(\n            msg.sender,\n            _amount,\n            this,\n            _extraData\n        );\n\n        return true;\n    }\n\n    /// @dev This function makes it easy to get the total number of tokens\n    /// @return The total number of tokens\n    function totalSupply() constant returns (uint) {\n        return totalSupplyAt(block.number);\n    }\n\n\n////////////////\n// Query balance and totalSupply in History\n////////////////\n\n    /// @dev Queries the balance of `_owner` at a specific `_blockNumber`\n    /// @param _owner The address from which the balance will be retrieved\n    /// @param _blockNumber The block number when the balance is queried\n    /// @return The balance at `_blockNumber`\n    function balanceOfAt(address _owner, uint _blockNumber) constant\n        returns (uint) {\n\n        // These next few lines are used when the balance of the token is\n        //  requested before a check point was ever created for this token, it\n        //  requires that the `parentToken.balanceOfAt` be queried at the\n        //  genesis block for that token as this contains initial balance of\n        //  this token\n        if ((balances[_owner].length == 0)\n            || (balances[_owner][0].fromBlock > _blockNumber)) {\n            if (address(parentToken) != 0) {\n                return parentToken.balanceOfAt(_owner, min(_blockNumber, parentSnapShotBlock));\n            } else {\n                // Has no parent\n                return 0;\n            }\n\n        // This will return the expected balance during normal situations\n        } else {\n            return getValueAt(balances[_owner], _blockNumber);\n        }\n    }\n\n    /// @notice Total amount of tokens at a specific `_blockNumber`.\n    /// @param _blockNumber The block number when the totalSupply is queried\n    /// @return The total amount of tokens at `_blockNumber`\n    function totalSupplyAt(uint _blockNumber) constant returns(uint) {\n\n        // These next few lines are used when the totalSupply of the token is\n        //  requested before a check point was ever created for this token, it\n        //  requires that the `parentToken.totalSupplyAt` be queried at the\n        //  genesis block for this token as that contains totalSupply of this\n        //  token at this block number.\n        if ((totalSupplyHistory.length == 0)\n            || (totalSupplyHistory[0].fromBlock > _blockNumber)) {\n            if (address(parentToken) != 0) {\n                return parentToken.totalSupplyAt(min(_blockNumber, parentSnapShotBlock));\n            } else {\n                return 0;\n            }\n\n        // This will return the expected totalSupply during normal situations\n        } else {\n            return getValueAt(totalSupplyHistory, _blockNumber);\n        }\n    }\n\n////////////////\n// Clone Token Method\n////////////////\n\n    /// @notice Creates a new clone token with the initial distribution being\n    ///  this token at `_snapshotBlock`\n    /// @param _cloneTokenName Name of the clone token\n    /// @param _cloneDecimalUnits Number of decimals of the smallest unit\n    /// @param _cloneTokenSymbol Symbol of the clone token\n    /// @param _snapshotBlock Block when the distribution of the parent token is\n    ///  copied to set the initial distribution of the new clone token;\n    ///  if the block is zero than the actual block, the current block is used\n    /// @param _transfersEnabled True if transfers are allowed in the clone\n    /// @return The address of the new MiniMeToken Contract\n    function createCloneToken(\n        string _cloneTokenName,\n        uint8 _cloneDecimalUnits,\n        string _cloneTokenSymbol,\n        uint _snapshotBlock,\n        bool _transfersEnabled\n        ) returns(address) {\n        if (_snapshotBlock == 0) _snapshotBlock = block.number;\n        MiniMeToken cloneToken = tokenFactory.createCloneToken(\n            this,\n            _snapshotBlock,\n            _cloneTokenName,\n            _cloneDecimalUnits,\n            _cloneTokenSymbol,\n            _transfersEnabled\n            );\n\n        cloneToken.changeController(msg.sender);\n\n        // An event to make the token easy to find on the blockchain\n        NewCloneToken(address(cloneToken), _snapshotBlock);\n        return address(cloneToken);\n    }\n\n////////////////\n// Generate and destroy tokens\n////////////////\n\n    /// @notice Generates `_amount` tokens that are assigned to `_owner`\n    /// @param _owner The address that will be assigned the new tokens\n    /// @param _amount The quantity of tokens generated\n    /// @return True if the tokens are generated correctly\n    function generateTokens(address _owner, uint _amount\n    ) onlyController returns (bool) {\n        uint curTotalSupply = getValueAt(totalSupplyHistory, block.number);\n        updateValueAtNow(totalSupplyHistory, curTotalSupply.add(_amount));\n        var previousBalanceTo = balanceOf(_owner);\n        updateValueAtNow(balances[_owner], previousBalanceTo.add(_amount));\n        Transfer(0, _owner, _amount);\n        return true;\n    }\n\n\n    /// @notice Burns `_amount` tokens from `_owner`\n    /// @param _owner The address that will lose the tokens\n    /// @param _amount The quantity of tokens to burn\n    /// @return True if the tokens are burned correctly\n    function destroyTokens(address _owner, uint _amount\n    ) onlyController returns (bool) {\n        uint curTotalSupply = getValueAt(totalSupplyHistory, block.number);\n        if (curTotalSupply < _amount) throw;\n        updateValueAtNow(totalSupplyHistory, curTotalSupply.sub(_amount));\n        var previousBalanceFrom = balanceOf(_owner);\n        if (previousBalanceFrom < _amount) throw;\n        updateValueAtNow(balances[_owner], previousBalanceFrom.sub(_amount));\n        Transfer(_owner, 0, _amount);\n        return true;\n    }\n\n////////////////\n// Enable tokens transfers\n////////////////\n\n\n    /// @notice Enables token holders to transfer their tokens freely if true\n    /// @param _transfersEnabled True if transfers are allowed in the clone\n    function enableTransfers(bool _transfersEnabled) onlyController {\n        transfersEnabled = _transfersEnabled;\n    }\n\n////////////////\n// Internal helper functions to query and set a value in a snapshot array\n////////////////\n\n    /// @dev `getValueAt` retrieves the number of tokens at a given block number\n    /// @param checkpoints The history of values being queried\n    /// @param _block The block number to retrieve the value at\n    /// @return The number of tokens being queried\n    function getValueAt(Checkpoint[] storage checkpoints, uint _block\n    ) constant internal returns (uint) {\n        if (checkpoints.length == 0) return 0;\n\n        // Shortcut for the actual value\n        if (_block >= checkpoints[checkpoints.length-1].fromBlock)\n            return checkpoints[checkpoints.length-1].value;\n        if (_block < checkpoints[0].fromBlock) return 0;\n\n        // Binary search of the value in the array\n        uint min = 0;\n        uint max = checkpoints.length-1;\n        while (max > min) {\n            uint mid = (max + min + 1)/ 2;\n            if (checkpoints[mid].fromBlock<=_block) {\n                min = mid;\n            } else {\n                max = mid-1;\n            }\n        }\n        return checkpoints[min].value;\n    }\n\n    /// @dev `updateValueAtNow` used to update the `balances` map and the\n    ///  `totalSupplyHistory`\n    /// @param checkpoints The history of data being updated\n    /// @param _value The new number of tokens\n    function updateValueAtNow(Checkpoint[] storage checkpoints, uint _value\n    ) internal  {\n        if ((checkpoints.length == 0)\n        || (checkpoints[checkpoints.length -1].fromBlock < block.number)) {\n               Checkpoint newCheckPoint = checkpoints[ checkpoints.length++ ];\n               newCheckPoint.fromBlock =  uint128(block.number);\n               newCheckPoint.value = uint128(_value);\n           } else {\n               Checkpoint oldCheckPoint = checkpoints[checkpoints.length-1];\n               oldCheckPoint.value = uint128(_value);\n           }\n    }\n\n    /// @dev Internal function to determine if an address is a contract\n    /// @param _addr The address being queried\n    /// @return True if `_addr` is a contract\n    function isContract(address _addr) constant internal returns(bool) {\n        uint size;\n        if (_addr == 0) return false;\n        assembly {\n            size := extcodesize(_addr)\n        }\n        return size>0;\n    }\n\n    /// @dev Helper function to return a min betwen the two uints\n    function min(uint a, uint b) internal returns (uint) {\n        return a < b ? a : b;\n    }\n\n    /// @notice The fallback function: If the contract's controller has not been\n    ///  set to 0, then the `proxyPayment` method is called which relays the\n    ///  ether and creates tokens as described in the token controller contract\n    function ()  payable {\n        if (isContract(controller)) {\n            if (! TokenController(controller).proxyPayment.value(msg.value)(msg.sender))\n                throw;\n        } else {\n            throw;\n        }\n    }\n\n    //////////\n    // Safety Methods\n    //////////\n\n    /// @notice This method can be used by the controller to extract mistakenly\n    ///  sent tokens to this contract.\n    /// @param _token The address of the token contract that you want to recover\n    ///  set to 0 in case you want to extract ether.\n    /// @param _claimer Address that tokens will be send to\n    function claimTokens(address _token, address _claimer) onlyController {\n        if (_token == 0x0) {\n            _claimer.transfer(this.balance);\n            return;\n        }\n\n        ERC20Basic token = ERC20Basic(_token);\n        uint balance = token.balanceOf(this);\n        token.transfer(_claimer, balance);\n        ClaimedTokens(_token, _claimer, balance);\n    }\n\n\n////////////////\n// Events\n////////////////\n    event ClaimedTokens(address indexed _token, address indexed _claimer, uint _amount);\n    event Transfer(address indexed _from, address indexed _to, uint256 _amount);\n    event NewCloneToken(address indexed _cloneToken, uint _snapshotBlock);\n    event Approval(\n        address indexed _owner,\n        address indexed _spender,\n        uint256 _amount\n        );\n\n}\n\n\n////////////////\n// MiniMeTokenFactory\n////////////////\n\n/// @dev This contract is used to generate clone contracts from a contract.\n///  In solidity this is the way to create a contract from a contract of the\n///  same class\ncontract MiniMeTokenFactory {\n\n    /// @notice Update the DApp by creating a new token with new functionalities\n    ///  the msg.sender becomes the controller of this clone token\n    /// @param _parentToken Address of the token being cloned\n    /// @param _snapshotBlock Block of the parent token that will\n    ///  determine the initial distribution of the clone token\n    /// @param _tokenName Name of the new token\n    /// @param _decimalUnits Number of decimals of the new token\n    /// @param _tokenSymbol Token Symbol for the new token\n    /// @param _transfersEnabled If true, tokens will be able to be transferred\n    /// @return The address of the new token contract\n    function createCloneToken(\n        address _parentToken,\n        uint _snapshotBlock,\n        string _tokenName,\n        uint8 _decimalUnits,\n        string _tokenSymbol,\n        bool _transfersEnabled\n    ) returns (MiniMeToken) {\n        MiniMeToken newToken = new MiniMeToken(\n            this,\n            _parentToken,\n            _snapshotBlock,\n            _tokenName,\n            _decimalUnits,\n            _tokenSymbol,\n            _transfersEnabled\n            );\n\n        newToken.changeController(msg.sender);\n        return newToken;\n    }\n}\n\ncontract VestedToken is LimitedTransferToken, GrantsControlled {\n  using SafeMath for uint;\n\n  uint256 MAX_GRANTS_PER_ADDRESS = 20;\n\n  struct TokenGrant {\n    address granter;     // 20 bytes\n    uint256 value;       // 32 bytes\n    uint64 cliff;\n    uint64 vesting;\n    uint64 start;        // 3 * 8 = 24 bytes\n    bool revokable;\n    bool burnsOnRevoke;  // 2 * 1 = 2 bits? or 2 bytes?\n  } // total 78 bytes = 3 sstore per operation (32 per sstore)\n\n  mapping (address => TokenGrant[]) public grants;\n\n  event NewTokenGrant(address indexed from, address indexed to, uint256 value, uint256 grantId);\n\n  /**\n   * @dev Grant tokens to a specified address\n   * @param _to address The address which the tokens will be granted to.\n   * @param _value uint256 The amount of tokens to be granted.\n   * @param _start uint64 Time of the beginning of the grant.\n   * @param _cliff uint64 Time of the cliff period.\n   * @param _vesting uint64 The vesting period.\n   */\n  function grantVestedTokens(\n    address _to,\n    uint256 _value,\n    uint64 _start,\n    uint64 _cliff,\n    uint64 _vesting,\n    bool _revokable,\n    bool _burnsOnRevoke\n  ) onlyGrantsController public {\n\n    // Check for date inconsistencies that may cause unexpected behavior\n    if (_cliff < _start || _vesting < _cliff) {\n      throw;\n    }\n\n    if (tokenGrantsCount(_to) > MAX_GRANTS_PER_ADDRESS) throw;   // To prevent a user being spammed and have his balance locked (out of gas attack when calculating vesting).\n\n    uint count = grants[_to].push(\n                TokenGrant(\n                  _revokable ? msg.sender : 0, // avoid storing an extra 20 bytes when it is non-revokable\n                  _value,\n                  _cliff,\n                  _vesting,\n                  _start,\n                  _revokable,\n                  _burnsOnRevoke\n                )\n              );\n\n    transfer(_to, _value);\n\n    NewTokenGrant(msg.sender, _to, _value, count - 1);\n  }\n\n  /**\n   * @dev Revoke the grant of tokens of a specifed address.\n   * @param _holder The address which will have its tokens revoked.\n   * @param _grantId The id of the token grant.\n   */\n  function revokeTokenGrant(address _holder, uint _grantId) public {\n    TokenGrant grant = grants[_holder][_grantId];\n\n    if (!grant.revokable) { // Check if grant was revokable\n      throw;\n    }\n\n    if (grant.granter != msg.sender) { // Only granter can revoke it\n      throw;\n    }\n\n    address receiver = grant.burnsOnRevoke ? 0xdead : msg.sender;\n\n    uint256 nonVested = nonVestedTokens(grant, uint64(now));\n\n    // remove grant from array\n    delete grants[_holder][_grantId];\n    grants[_holder][_grantId] = grants[_holder][grants[_holder].length.sub(1)];\n    grants[_holder].length -= 1;\n\n    // This will call MiniMe's doTransfer method, so token is transferred according to\n    // MiniMe Token logic\n    doTransfer(_holder, receiver, nonVested);\n\n    Transfer(_holder, receiver, nonVested);\n  }\n\n  /**\n   * @dev Revoke all grants of tokens of a specifed address.\n   * @param _holder The address which will have its tokens revoked.\n   */\n    function revokeAllTokenGrants(address _holder) {\n        var grandsCount = tokenGrantsCount(_holder);\n        for (uint i = 0; i < grandsCount; i++) {\n          revokeTokenGrant(_holder, 0);\n        }\n    }\n\n  /**\n   * @dev Calculate the total amount of transferable tokens of a holder at a given time\n   * @param holder address The address of the holder\n   * @param time uint64 The specific time.\n   * @return An uint representing a holder's total amount of transferable tokens.\n   */\n  function transferableTokens(address holder, uint64 time) constant public returns (uint256) {\n    uint256 grantIndex = tokenGrantsCount(holder);\n\n    if (grantIndex == 0) return balanceOf(holder); // shortcut for holder without grants\n\n    // Iterate through all the grants the holder has, and add all non-vested tokens\n    uint256 nonVested = 0;\n    for (uint256 i = 0; i < grantIndex; i++) {\n      nonVested = SafeMath.add(nonVested, nonVestedTokens(grants[holder][i], time));\n    }\n\n    // Balance - totalNonVested is the amount of tokens a holder can transfer at any given time\n    uint256 vestedTransferable = SafeMath.sub(balanceOf(holder), nonVested);\n\n    // Return the minimum of how many vested can transfer and other value\n    // in case there are other limiting transferability factors (default is balanceOf)\n    return SafeMath.min256(vestedTransferable, super.transferableTokens(holder, time));\n  }\n\n  /**\n   * @dev Check the amount of grants that an address has.\n   * @param _holder The holder of the grants.\n   * @return A uint representing the total amount of grants.\n   */\n  function tokenGrantsCount(address _holder) constant returns (uint index) {\n    return grants[_holder].length;\n  }\n\n  /**\n   * @dev Calculate amount of vested tokens at a specifc time.\n   * @param tokens uint256 The amount of tokens grantted.\n   * @param time uint64 The time to be checked\n   * @param start uint64 A time representing the begining of the grant\n   * @param cliff uint64 The cliff period.\n   * @param vesting uint64 The vesting period.\n   * @return An uint representing the amount of vested tokensof a specif grant.\n   *  transferableTokens\n   *   |                         _/--------   vestedTokens rect\n   *   |                       _/\n   *   |                     _/\n   *   |                   _/\n   *   |                 _/\n   *   |                /\n   *   |              .|\n   *   |            .  |\n   *   |          .    |\n   *   |        .      |\n   *   |      .        |\n   *   |    .          |\n   *   +===+===========+---------+----------> time\n   *      Start       Clift    Vesting\n   */\n  function calculateVestedTokens(\n    uint256 tokens,\n    uint256 time,\n    uint256 start,\n    uint256 cliff,\n    uint256 vesting) constant returns (uint256)\n    {\n      // Shortcuts for before cliff and after vesting cases.\n      if (time < cliff) return 0;\n      if (time >= vesting) return tokens;\n\n      // Interpolate all vested tokens.\n      // As before cliff the shortcut returns 0, we can use just calculate a value\n      // in the vesting rect (as shown in above's figure)\n\n      // vestedTokens = tokens * (time - start) / (vesting - start)\n      uint256 vestedTokens = SafeMath.div(\n                                    SafeMath.mul(\n                                      tokens,\n                                      SafeMath.sub(time, start)\n                                      ),\n                                    SafeMath.sub(vesting, start)\n                                    );\n\n      return vestedTokens;\n  }\n\n  /**\n   * @dev Get all information about a specifc grant.\n   * @param _holder The address which will have its tokens revoked.\n   * @param _grantId The id of the token grant.\n   * @return Returns all the values that represent a TokenGrant(address, value, start, cliff,\n   * revokability, burnsOnRevoke, and vesting) plus the vested value at the current time.\n   */\n  function tokenGrant(address _holder, uint _grantId) constant returns (address granter, uint256 value, uint256 vested, uint64 start, uint64 cliff, uint64 vesting, bool revokable, bool burnsOnRevoke) {\n    TokenGrant grant = grants[_holder][_grantId];\n\n    granter = grant.granter;\n    value = grant.value;\n    start = grant.start;\n    cliff = grant.cliff;\n    vesting = grant.vesting;\n    revokable = grant.revokable;\n    burnsOnRevoke = grant.burnsOnRevoke;\n\n    vested = vestedTokens(grant, uint64(now));\n  }\n\n  /**\n   * @dev Get the amount of vested tokens at a specific time.\n   * @param grant TokenGrant The grant to be checked.\n   * @param time The time to be checked\n   * @return An uint representing the amount of vested tokens of a specific grant at a specific time.\n   */\n  function vestedTokens(TokenGrant grant, uint64 time) private constant returns (uint256) {\n    return calculateVestedTokens(\n      grant.value,\n      uint256(time),\n      uint256(grant.start),\n      uint256(grant.cliff),\n      uint256(grant.vesting)\n    );\n  }\n\n  /**\n   * @dev Calculate the amount of non vested tokens at a specific time.\n   * @param grant TokenGrant The grant to be checked.\n   * @param time uint64 The time to be checked\n   * @return An uint representing the amount of non vested tokens of a specifc grant on the\n   * passed time frame.\n   */\n  function nonVestedTokens(TokenGrant grant, uint64 time) private constant returns (uint256) {\n    return grant.value.sub(vestedTokens(grant, time));\n  }\n\n  /**\n   * @dev Calculate the date when the holder can trasfer all its tokens\n   * @param holder address The address of the holder\n   * @return An uint representing the date of the last transferable tokens.\n   */\n  function lastTokenIsTransferableDate(address holder) constant public returns (uint64 date) {\n    date = uint64(now);\n    uint256 grantIndex = grants[holder].length;\n    for (uint256 i = 0; i < grantIndex; i++) {\n      date = SafeMath.max64(grants[holder][i].vesting, date);\n    }\n  }\n}\n\ncontract ApproveAndCallFallBack {\n    function receiveApproval(address from, uint256 _amount, address _token, bytes _data);\n}\n\n\ncontract TokenController {\n    /// @notice Called when `_owner` sends ether to the MiniMe Token contract\n    /// @param _owner The address that sent the ether to create tokens\n    /// @return True if the ether is accepted, false if it throws\n    function proxyPayment(address _owner) payable returns(bool);\n\n    /// @notice Notifies the controller about a token transfer allowing the\n    ///  controller to react if desired\n    /// @param _from The origin of the transfer\n    /// @param _to The destination of the transfer\n    /// @param _amount The amount of the transfer\n    /// @return False if the controller does not authorize the transfer\n    function onTransfer(address _from, address _to, uint _amount) returns(bool);\n\n    /// @notice Notifies the controller about an approval allowing the\n    ///  controller to react if desired\n    /// @param _owner The address that calls `approve()`\n    /// @param _spender The spender in the `approve()` call\n    /// @param _amount The amount in the `approve()` call\n    /// @return False if the controller does not authorize the approval\n    function onApprove(address _owner, address _spender, uint _amount)\n        returns(bool);\n}\n\ncontract District0xNetworkToken is MiniMeToken, VestedToken {\n    function District0xNetworkToken(address _controller, address _tokenFactory)\n        MiniMeToken(\n            _tokenFactory,\n            0x0,                        // no parent token\n            0,                          // no snapshot block number from parent\n            \"district0x Network Token\", // Token name\n            18,                         // Decimals\n            \"DNT\",                      // Symbol\n            true                        // Enable transfers\n            )\n    {\n        changeController(_controller);\n        changeGrantsController(_controller);\n    }\n}\n\ncontract HasNoTokens is Ownable {\n\n  District0xNetworkToken public district0xNetworkToken;\n\n /**\n  * @dev Reject all ERC23 compatible tokens\n  * @param from_ address The address that is transferring the tokens\n  * @param value_ uint256 the amount of the specified token\n  * @param data_ Bytes The data passed from the caller.\n  */\n  function tokenFallback(address from_, uint256 value_, bytes data_) external {\n    throw;\n  }\n\n  function isTokenSaleToken(address tokenAddr) returns(bool);\n\n  /**\n   * @dev Reclaim all ERC20Basic compatible tokens\n   * @param tokenAddr address The address of the token contract\n   */\n  function reclaimToken(address tokenAddr) external onlyOwner {\n    require(!isTokenSaleToken(tokenAddr));\n    ERC20Basic tokenInst = ERC20Basic(tokenAddr);\n    uint256 balance = tokenInst.balanceOf(this);\n    tokenInst.transfer(msg.sender, balance);\n  }\n}\n\n\ncontract District0xContribution is Pausable, HasNoTokens, TokenController {\n    using SafeMath for uint;\n\n    District0xNetworkToken public district0xNetworkToken;\n    address public multisigWallet;                                      // Wallet that receives all sale funds\n    address public founder1;                                            // Wallet of founder 1\n    address public founder2;                                            // Wallet of founder 2\n    address public earlySponsor;                                        // Wallet of early sponsor\n    address[] public advisers;                                          // 4 Wallets of advisors\n\n    uint public constant FOUNDER1_STAKE = 119000000 ether;              // 119M DNT\n    uint public constant FOUNDER2_STAKE = 79000000 ether;               // 79M  DNT\n    uint public constant EARLY_CONTRIBUTOR_STAKE = 5000000 ether;       // 5M   DNT\n    uint public constant ADVISER_STAKE = 5000000 ether;                 // 5M   DNT\n    uint public constant ADVISER_STAKE2 = 1000000 ether;                // 1M   DNT\n    uint public constant COMMUNITY_ADVISERS_STAKE = 5000000 ether;      // 5M   DNT\n    uint public constant CONTRIB_PERIOD1_STAKE = 600000000 ether;       // 600M DNT\n    uint public constant CONTRIB_PERIOD2_STAKE = 140000000 ether;       // 140M DNT\n    uint public constant CONTRIB_PERIOD3_STAKE = 40000000 ether;        // 40M  DNT\n\n    uint public minContribAmount = 0.01 ether;                          // 0.01 ether\n    uint public maxGasPrice = 50000000000;                              // 50 GWei\n\n    uint public constant TEAM_VESTING_CLIFF = 24 weeks;                 // 6 months vesting cliff for founders and advisors, except community advisors\n    uint public constant TEAM_VESTING_PERIOD = 96 weeks;                // 2 years vesting period for founders and advisors, except community advisors\n\n    uint public constant EARLY_CONTRIBUTOR_VESTING_CLIFF = 12 weeks;    // 3 months vesting cliff for early sponsor\n    uint public constant EARLY_CONTRIBUTOR_VESTING_PERIOD = 24 weeks;   // 6 months vesting cliff for early sponsor\n\n    bool public tokenTransfersEnabled = false;                          // DNT token transfers will be enabled manually\n                                                                        // after first contribution period\n                                                                        // Can't be disabled back\n    struct Contributor {\n        uint amount;                        // Amount of ETH contributed by an address in given contribution period\n        bool isCompensated;                 // Whether this contributor received DNT token for ETH contribution\n        uint amountCompensated;             // Amount of DNT received. Not really needed to store,\n                                            // but stored for accounting and security purposes\n    }\n\n    uint public softCapAmount;                                 // Soft cap of contribution period in wei\n    uint public afterSoftCapDuration;                          // Number of seconds to the end of sale from the moment of reaching soft cap (unless reaching hardcap)\n    uint public hardCapAmount;                                 // When reached this amount of wei, the contribution will end instantly\n    uint public startTime;                                     // Start time of contribution period in UNIX time\n    uint public endTime;                                       // End time of contribution period in UNIX time\n    bool public isEnabled;                                     // If contribution period was enabled by multisignature\n    bool public softCapReached;                                // If soft cap was reached\n    bool public hardCapReached;                                // If hard cap was reached\n    uint public totalContributed;                              // Total amount of ETH contributed in given period\n    address[] public contributorsKeys;                         // Addresses of all contributors in given contribution period\n    mapping (address => Contributor) public contributors;\n\n    event onContribution(uint totalContributed, address indexed contributor, uint amount,\n        uint contributorsCount);\n    event onSoftCapReached(uint endTime);\n    event onHardCapReached(uint endTime);\n    event onCompensated(address indexed contributor, uint amount);\n\n    modifier onlyMultisig() {\n        require(multisigWallet == msg.sender);\n        _;\n    }\n\n    function District0xContribution(\n        address _multisigWallet,\n        address _founder1,\n        address _founder2,\n        address _earlySponsor,\n        address[] _advisers\n    ) {\n        require(_advisers.length == 5);\n        multisigWallet = _multisigWallet;\n        founder1 = _founder1;\n        founder2 = _founder2;\n        earlySponsor = _earlySponsor;\n        advisers = _advisers;\n    }\n\n    // @notice Returns true if contribution period is currently running\n    function isContribPeriodRunning() constant returns (bool) {\n        return !hardCapReached &&\n               isEnabled &&\n               startTime <= now &&\n               endTime > now;\n    }\n\n    function contribute()\n        payable\n        stopInEmergency\n    {\n        contributeWithAddress(msg.sender);\n    }\n\n    // @notice Function to participate in contribution period\n    //  Amounts from the same address should be added up\n    //  If soft or hard cap is reached, end time should be modified\n    //  Funds should be transferred into multisig wallet\n    // @param contributor Address that will receive DNT token\n    function contributeWithAddress(address contributor)\n        payable\n        stopInEmergency\n    {\n        require(tx.gasprice <= maxGasPrice);\n        require(msg.value >= minContribAmount);\n        require(isContribPeriodRunning());\n\n        uint contribValue = msg.value;\n        uint excessContribValue = 0;\n\n        uint oldTotalContributed = totalContributed;\n\n        totalContributed = oldTotalContributed.add(contribValue);\n\n        uint newTotalContributed = totalContributed;\n\n        // Soft cap was reached\n        if (newTotalContributed >= softCapAmount &&\n            oldTotalContributed < softCapAmount)\n        {\n            softCapReached = true;\n            endTime = afterSoftCapDuration.add(now);\n            onSoftCapReached(endTime);\n        }\n        // Hard cap was reached\n        if (newTotalContributed >= hardCapAmount &&\n            oldTotalContributed < hardCapAmount)\n        {\n            hardCapReached = true;\n            endTime = now;\n            onHardCapReached(endTime);\n\n            // Everything above hard cap will be sent back to contributor\n            excessContribValue = newTotalContributed.sub(hardCapAmount);\n            contribValue = contribValue.sub(excessContribValue);\n\n            totalContributed = hardCapAmount;\n        }\n\n        if (contributors[contributor].amount == 0) {\n            contributorsKeys.push(contributor);\n        }\n\n        contributors[contributor].amount = contributors[contributor].amount.add(contribValue);\n\n        multisigWallet.transfer(contribValue);\n        if (excessContribValue > 0) {\n            msg.sender.transfer(excessContribValue);\n        }\n        onContribution(newTotalContributed, contributor, contribValue, contributorsKeys.length);\n    }\n\n    // @notice This method is called by owner after contribution period ends, to distribute DNT in proportional manner\n    //  Each contributor should receive DNT just once even if this method is called multiple times\n    //  In case of many contributors must be able to compensate contributors in paginational way, otherwise might\n    //  run out of gas if wanted to compensate all on one method call. Therefore parameters offset and limit\n    // @param periodIndex Index of contribution period (0-2)\n    // @param offset Number of first contributors to skip.\n    // @param limit Max number of contributors compensated on this call\n    function compensateContributors(uint offset, uint limit)\n        onlyOwner\n    {\n        require(isEnabled);\n        require(endTime < now);\n\n        uint i = offset;\n        uint compensatedCount = 0;\n        uint contributorsCount = contributorsKeys.length;\n\n        uint ratio = CONTRIB_PERIOD1_STAKE\n            .mul(1000000000000000000)\n            .div(totalContributed);\n\n        while (i < contributorsCount && compensatedCount < limit) {\n            address contributorAddress = contributorsKeys[i];\n            if (!contributors[contributorAddress].isCompensated) {\n                uint amountContributed = contributors[contributorAddress].amount;\n                contributors[contributorAddress].isCompensated = true;\n\n                contributors[contributorAddress].amountCompensated =\n                    amountContributed.mul(ratio).div(1000000000000000000);\n\n                district0xNetworkToken.transfer(contributorAddress, contributors[contributorAddress].amountCompensated);\n                onCompensated(contributorAddress, contributors[contributorAddress].amountCompensated);\n\n                compensatedCount++;\n            }\n            i++;\n        }\n    }\n\n    // @notice Method for setting up contribution period\n    //  Only owner should be able to execute\n    //  Setting first contribution period sets up vesting for founders & advisors\n    //  Contribution period should still not be enabled after calling this method\n    // @param softCapAmount Soft Cap in wei\n    // @param afterSoftCapDuration Number of seconds till the end of sale in the moment of reaching soft cap (unless reaching hard cap)\n    // @param hardCapAmount Hard Cap in wei\n    // @param startTime Contribution start time in UNIX time\n    // @param endTime Contribution end time in UNIX time\n    function setContribPeriod(\n        uint _softCapAmount,\n        uint _afterSoftCapDuration,\n        uint _hardCapAmount,\n        uint _startTime,\n        uint _endTime\n    )\n        onlyOwner\n    {\n        require(_softCapAmount > 0);\n        require(_hardCapAmount > _softCapAmount);\n        require(_afterSoftCapDuration > 0);\n        require(_startTime > now);\n        require(_endTime > _startTime);\n        require(!isEnabled);\n\n        softCapAmount = _softCapAmount;\n        afterSoftCapDuration = _afterSoftCapDuration;\n        hardCapAmount = _hardCapAmount;\n        startTime = _startTime;\n        endTime = _endTime;\n\n        district0xNetworkToken.revokeAllTokenGrants(founder1);\n        district0xNetworkToken.revokeAllTokenGrants(founder2);\n        district0xNetworkToken.revokeAllTokenGrants(earlySponsor);\n\n        for (uint j = 0; j < advisers.length; j++) {\n            district0xNetworkToken.revokeAllTokenGrants(advisers[j]);\n        }\n\n        uint64 vestingDate = uint64(startTime.add(TEAM_VESTING_PERIOD));\n        uint64 cliffDate = uint64(startTime.add(TEAM_VESTING_CLIFF));\n        uint64 earlyContribVestingDate = uint64(startTime.add(EARLY_CONTRIBUTOR_VESTING_PERIOD));\n        uint64 earlyContribCliffDate = uint64(startTime.add(EARLY_CONTRIBUTOR_VESTING_CLIFF));\n        uint64 startDate = uint64(startTime);\n\n        district0xNetworkToken.grantVestedTokens(founder1, FOUNDER1_STAKE, startDate, cliffDate, vestingDate, true, false);\n        district0xNetworkToken.grantVestedTokens(founder2, FOUNDER2_STAKE, startDate, cliffDate, vestingDate, true, false);\n        district0xNetworkToken.grantVestedTokens(earlySponsor, EARLY_CONTRIBUTOR_STAKE, startDate, earlyContribCliffDate, earlyContribVestingDate, true, false);\n        district0xNetworkToken.grantVestedTokens(advisers[0], ADVISER_STAKE, startDate, cliffDate, vestingDate, true, false);\n        district0xNetworkToken.grantVestedTokens(advisers[1], ADVISER_STAKE, startDate, cliffDate, vestingDate, true, false);\n        district0xNetworkToken.grantVestedTokens(advisers[2], ADVISER_STAKE2, startDate, cliffDate, vestingDate, true, false);\n        district0xNetworkToken.grantVestedTokens(advisers[3], ADVISER_STAKE2, startDate, cliffDate, vestingDate, true, false);\n\n        // Community advisors stake has no vesting, but we set it up this way, so we can revoke it in case of\n        // re-setting up contribution period\n        district0xNetworkToken.grantVestedTokens(advisers[4], COMMUNITY_ADVISERS_STAKE, startDate, startDate, startDate, true, false);\n    }\n\n    // @notice Enables contribution period\n    //  Must be executed by multisignature\n    function enableContribPeriod()\n        onlyMultisig\n    {\n        require(startTime > now);\n        isEnabled = true;\n    }\n\n    // @notice Sets new min. contribution amount\n    //  Only owner can execute\n    //  Cannot be executed while contribution period is running\n    // @param _minContribAmount new min. amount\n    function setMinContribAmount(uint _minContribAmount)\n        onlyOwner\n    {\n        require(_minContribAmount > 0);\n        require(startTime > now);\n        minContribAmount = _minContribAmount;\n    }\n\n    // @notice Sets new max gas price for contribution\n    //  Only owner can execute\n    //  Cannot be executed while contribution period is running\n    // @param _minContribAmount new min. amount\n    function setMaxGasPrice(uint _maxGasPrice)\n        onlyOwner\n    {\n        require(_maxGasPrice > 0);\n        require(startTime > now);\n        maxGasPrice = _maxGasPrice;\n    }\n\n    // @notice Sets District0xNetworkToken contract\n    //  Generates all DNT tokens and assigns them to this contract\n    //  If token contract has already generated tokens, do not generate again\n    // @param _district0xNetworkToken District0xNetworkToken address\n    function setDistrict0xNetworkToken(address _district0xNetworkToken)\n        onlyOwner\n    {\n        require(_district0xNetworkToken != 0x0);\n        require(!isEnabled);\n        district0xNetworkToken = District0xNetworkToken(_district0xNetworkToken);\n        if (district0xNetworkToken.totalSupply() == 0) {\n            district0xNetworkToken.generateTokens(this, FOUNDER1_STAKE\n                .add(FOUNDER2_STAKE)\n                .add(EARLY_CONTRIBUTOR_STAKE)\n                .add(ADVISER_STAKE.mul(2))\n                .add(ADVISER_STAKE2.mul(2))\n                .add(COMMUNITY_ADVISERS_STAKE)\n                .add(CONTRIB_PERIOD1_STAKE));\n\n            district0xNetworkToken.generateTokens(multisigWallet, CONTRIB_PERIOD2_STAKE\n                .add(CONTRIB_PERIOD3_STAKE));\n        }\n    }\n\n    // @notice Enables transfers of DNT\n    //  Will be executed after first contribution period by owner\n    function enableDistrict0xNetworkTokenTransfers()\n        onlyOwner\n    {\n        require(endTime < now);\n        tokenTransfersEnabled = true;\n    }\n\n    // @notice Method to claim tokens accidentally sent to a DNT contract\n    //  Only multisig wallet can execute\n    // @param _token Address of claimed ERC20 Token\n    function claimTokensFromTokenDistrict0xNetworkToken(address _token)\n        onlyMultisig\n    {\n        district0xNetworkToken.claimTokens(_token, multisigWallet);\n    }\n\n    // @notice Kill method should not really be needed, but just in case\n    function kill(address _to) onlyMultisig external {\n        suicide(_to);\n    }\n\n    function()\n        payable\n        stopInEmergency\n    {\n        contributeWithAddress(msg.sender);\n    }\n\n    // MiniMe Controller default settings for allowing token transfers.\n    function proxyPayment(address _owner) payable public returns (bool) {\n        throw;\n    }\n\n    // Before transfers are enabled for everyone, only this contract is allowed to distribute DNT\n    function onTransfer(address _from, address _to, uint _amount) public returns (bool) {\n        return tokenTransfersEnabled || _from == address(this) || _to == address(this);\n    }\n\n    function onApprove(address _owner, address _spender, uint _amount) public returns (bool) {\n        return tokenTransfersEnabled;\n    }\n\n    function isTokenSaleToken(address tokenAddr) returns(bool) {\n        return district0xNetworkToken == tokenAddr;\n    }\n\n    /*\n     Following constant methods are used for tests and contribution web app\n     They don't impact logic of contribution contract, therefor DOES NOT NEED TO BE AUDITED\n     */\n\n    // Used by contribution front-end to obtain contribution period properties\n    function getContribPeriod()\n        constant\n        returns (bool[3] boolValues, uint[8] uintValues)\n    {\n        boolValues[0] = isEnabled;\n        boolValues[1] = softCapReached;\n        boolValues[2] = hardCapReached;\n\n        uintValues[0] = softCapAmount;\n        uintValues[1] = afterSoftCapDuration;\n        uintValues[2] = hardCapAmount;\n        uintValues[3] = startTime;\n        uintValues[4] = endTime;\n        uintValues[5] = totalContributed;\n        uintValues[6] = contributorsKeys.length;\n        uintValues[7] = CONTRIB_PERIOD1_STAKE;\n\n        return (boolValues, uintValues);\n    }\n\n    // Used by contribution front-end to obtain contribution contract properties\n    function getConfiguration()\n        constant\n        returns (bool, address, address, address, address, address[] _advisers, bool, uint)\n    {\n        _advisers = new address[](advisers.length);\n        for (uint i = 0; i < advisers.length; i++) {\n            _advisers[i] = advisers[i];\n        }\n        return (stopped, multisigWallet, founder1, founder2, earlySponsor, _advisers, tokenTransfersEnabled,\n            maxGasPrice);\n    }\n\n    // Used by contribution front-end to obtain contributor's properties\n    function getContributor(address contributorAddress)\n        constant\n        returns(uint, bool, uint)\n    {\n        Contributor contributor = contributors[contributorAddress];\n        return (contributor.amount, contributor.isCompensated, contributor.amountCompensated);\n    }\n\n    // Function to verify if all contributors were compensated\n    function getUncompensatedContributors(uint offset, uint limit)\n        constant\n        returns (uint[] contributorIndexes)\n    {\n        uint contributorsCount = contributorsKeys.length;\n\n        if (limit == 0) {\n            limit = contributorsCount;\n        }\n\n        uint i = offset;\n        uint resultsCount = 0;\n        uint[] memory _contributorIndexes = new uint[](limit);\n\n        while (i < contributorsCount && resultsCount < limit) {\n            if (!contributors[contributorsKeys[i]].isCompensated) {\n                _contributorIndexes[resultsCount] = i;\n                resultsCount++;\n            }\n            i++;\n        }\n\n        contributorIndexes = new uint[](resultsCount);\n        for (i = 0; i < resultsCount; i++) {\n            contributorIndexes[i] = _contributorIndexes[i];\n        }\n        return contributorIndexes;\n    }\n\n    function getNow()\n        constant\n        returns(uint)\n    {\n        return now;\n    }\n}\n"
  },
  {
    "path": "resources/public/contracts/src/TokenVesting.sol",
    "content": "pragma solidity ^0.4.18;\n\nimport './ERC20Basic.sol';\nimport './SafeERC20.sol';\nimport './ownership/Ownable.sol';\nimport './math/SafeMath.sol';\n\n/**\n * @title TokenVesting\n * @dev A token holder contract that can release its token balance gradually like a\n * typical vesting scheme, with a cliff and vesting period. Optionally revocable by the\n * owner.\n */\ncontract TokenVesting is Ownable {\n  using SafeMath for uint256;\n  using SafeERC20 for ERC20Basic;\n\n  event Released(uint256 amount);\n  event Revoked();\n\n  // beneficiary of tokens after they are released\n  address public beneficiary;\n\n  uint256 public cliff;\n  uint256 public start;\n  uint256 public duration;\n\n  bool public revocable;\n\n  mapping (address => uint256) public released;\n  mapping (address => bool) public revoked;\n\n  /**\n   * @dev Creates a vesting contract that vests its balance of any ERC20 token to the\n   * _beneficiary, gradually in a linear fashion until _start + _duration. By then all\n   * of the balance will have vested.\n   * @param _beneficiary address of the beneficiary to whom vested tokens are transferred\n   * @param _cliff duration in seconds of the cliff in which tokens will begin to vest\n   * @param _duration duration in seconds of the period in which the tokens will vest\n   * @param _revocable whether the vesting is revocable or not\n   */\n  function TokenVesting(address _beneficiary, uint256 _start, uint256 _cliff, uint256 _duration, bool _revocable) public {\n    require(_beneficiary != address(0));\n    require(_cliff <= _duration);\n\n    beneficiary = _beneficiary;\n    revocable = _revocable;\n    duration = _duration;\n    cliff = _start.add(_cliff);\n    start = _start;\n  }\n\n  /**\n   * @notice Transfers vested tokens to beneficiary.\n   * @param token ERC20 token which is being vested\n   */\n  function release(ERC20Basic token) public {\n    uint256 unreleased = releasableAmount(token);\n\n    require(unreleased > 0);\n\n    released[token] = released[token].add(unreleased);\n\n    token.safeTransfer(beneficiary, unreleased);\n\n    Released(unreleased);\n  }\n\n  /**\n   * @notice Allows the owner to revoke the vesting. Tokens already vested\n   * remain in the contract, the rest are returned to the owner.\n   * @param token ERC20 token which is being vested\n   */\n  function revoke(ERC20Basic token) public onlyOwner {\n    require(revocable);\n    require(!revoked[token]);\n\n    uint256 balance = token.balanceOf(this);\n\n    uint256 unreleased = releasableAmount(token);\n    uint256 refund = balance.sub(unreleased);\n\n    revoked[token] = true;\n\n    token.safeTransfer(owner, refund);\n\n    Revoked();\n  }\n\n  /**\n   * @dev Calculates the amount that has already vested but hasn't been released yet.\n   * @param token ERC20 token which is being vested\n   */\n  function releasableAmount(ERC20Basic token) public view returns (uint256) {\n    return vestedAmount(token).sub(released[token]);\n  }\n\n  /**\n   * @dev Calculates the amount that has already vested.\n   * @param token ERC20 token which is being vested\n   */\n  function vestedAmount(ERC20Basic token) public view returns (uint256) {\n    uint256 currentBalance = token.balanceOf(this);\n    uint256 totalBalance = currentBalance.add(released[token]);\n\n    if (now < cliff) {\n      return 0;\n    } else if (now >= start.add(duration) || revoked[token]) {\n      return totalBalance;\n    } else {\n      return totalBalance.mul(now.sub(start)).div(duration);\n    }\n  }\n}\n"
  },
  {
    "path": "resources/public/contracts/src/VestedToken.sol",
    "content": "pragma solidity ^0.4.11;\n\n/*\n    Slightly modified OpenZeppelin Vested Token deriving MiniMeToken\n    See original at ./orig/VestedToken.sol or https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/VestedToken.sol\n    Modifications:\n    - Does not inherit from StandardToken, so transfer functions can be supplied by MiniMe\n    - Uses SafeMath.sol\n    - In revokeTokenGrant method instead of manipulating balances manually, calls doTransfer method supplied by MiniMe\n    - Added revokeAllTokenGrants method\n    - Added onlyGrantsController modifier to restrict creating grants only to single address\n*/\n\nimport \"./LimitedTransferToken.sol\";\nimport \"./SafeMath.sol\";\nimport \"./GrantsControlled.sol\";\n\n/**\n * @title Vested token\n * @dev Tokens that can be vested for a group of addresses.\n */\n\ncontract VestedToken is LimitedTransferToken, GrantsControlled {\n  using SafeMath for uint;\n\n  uint256 MAX_GRANTS_PER_ADDRESS = 20;\n\n  struct TokenGrant {\n    address granter;     // 20 bytes\n    uint256 value;       // 32 bytes\n    uint64 cliff;\n    uint64 vesting;\n    uint64 start;        // 3 * 8 = 24 bytes\n    bool revokable;\n    bool burnsOnRevoke;  // 2 * 1 = 2 bits? or 2 bytes?\n  } // total 78 bytes = 3 sstore per operation (32 per sstore)\n\n  mapping (address => TokenGrant[]) public grants;\n\n  event NewTokenGrant(address indexed from, address indexed to, uint256 value, uint256 grantId);\n\n  /**\n   * @dev Grant tokens to a specified address\n   * @param _to address The address which the tokens will be granted to.\n   * @param _value uint256 The amount of tokens to be granted.\n   * @param _start uint64 Time of the beginning of the grant.\n   * @param _cliff uint64 Time of the cliff period.\n   * @param _vesting uint64 The vesting period.\n   */\n  function grantVestedTokens(\n    address _to,\n    uint256 _value,\n    uint64 _start,\n    uint64 _cliff,\n    uint64 _vesting,\n    bool _revokable,\n    bool _burnsOnRevoke\n  ) onlyGrantsController public {\n\n    // Check for date inconsistencies that may cause unexpected behavior\n    if (_cliff < _start || _vesting < _cliff) {\n      throw;\n    }\n\n    if (tokenGrantsCount(_to) > MAX_GRANTS_PER_ADDRESS) throw;   // To prevent a user being spammed and have his balance locked (out of gas attack when calculating vesting).\n\n    uint count = grants[_to].push(\n                TokenGrant(\n                  _revokable ? msg.sender : 0, // avoid storing an extra 20 bytes when it is non-revokable\n                  _value,\n                  _cliff,\n                  _vesting,\n                  _start,\n                  _revokable,\n                  _burnsOnRevoke\n                )\n              );\n\n    transfer(_to, _value);\n\n    NewTokenGrant(msg.sender, _to, _value, count - 1);\n  }\n\n  /**\n   * @dev Revoke the grant of tokens of a specifed address.\n   * @param _holder The address which will have its tokens revoked.\n   * @param _grantId The id of the token grant.\n   */\n  function revokeTokenGrant(address _holder, uint _grantId) public {\n    TokenGrant grant = grants[_holder][_grantId];\n\n    if (!grant.revokable) { // Check if grant was revokable\n      throw;\n    }\n\n    if (grant.granter != msg.sender) { // Only granter can revoke it\n      throw;\n    }\n\n    address receiver = grant.burnsOnRevoke ? 0xdead : msg.sender;\n\n    uint256 nonVested = nonVestedTokens(grant, uint64(now));\n\n    // remove grant from array\n    delete grants[_holder][_grantId];\n    grants[_holder][_grantId] = grants[_holder][grants[_holder].length.sub(1)];\n    grants[_holder].length -= 1;\n\n    // This will call MiniMe's doTransfer method, so token is transferred according to\n    // MiniMe Token logic\n    doTransfer(_holder, receiver, nonVested);\n\n    Transfer(_holder, receiver, nonVested);\n  }\n\n  /**\n   * @dev Revoke all grants of tokens of a specifed address.\n   * @param _holder The address which will have its tokens revoked.\n   */\n    function revokeAllTokenGrants(address _holder) {\n        var grandsCount = tokenGrantsCount(_holder);\n        for (uint i = 0; i < grandsCount; i++) {\n          revokeTokenGrant(_holder, 0);\n        }\n    }\n\n  /**\n   * @dev Calculate the total amount of transferable tokens of a holder at a given time\n   * @param holder address The address of the holder\n   * @param time uint64 The specific time.\n   * @return An uint representing a holder's total amount of transferable tokens.\n   */\n  function transferableTokens(address holder, uint64 time) constant public returns (uint256) {\n    uint256 grantIndex = tokenGrantsCount(holder);\n\n    if (grantIndex == 0) return balanceOf(holder); // shortcut for holder without grants\n\n    // Iterate through all the grants the holder has, and add all non-vested tokens\n    uint256 nonVested = 0;\n    for (uint256 i = 0; i < grantIndex; i++) {\n      nonVested = SafeMath.add(nonVested, nonVestedTokens(grants[holder][i], time));\n    }\n\n    // Balance - totalNonVested is the amount of tokens a holder can transfer at any given time\n    uint256 vestedTransferable = SafeMath.sub(balanceOf(holder), nonVested);\n\n    // Return the minimum of how many vested can transfer and other value\n    // in case there are other limiting transferability factors (default is balanceOf)\n    return SafeMath.min256(vestedTransferable, super.transferableTokens(holder, time));\n  }\n\n  /**\n   * @dev Check the amount of grants that an address has.\n   * @param _holder The holder of the grants.\n   * @return A uint representing the total amount of grants.\n   */\n  function tokenGrantsCount(address _holder) constant returns (uint index) {\n    return grants[_holder].length;\n  }\n\n  /**\n   * @dev Calculate amount of vested tokens at a specifc time.\n   * @param tokens uint256 The amount of tokens grantted.\n   * @param time uint64 The time to be checked\n   * @param start uint64 A time representing the begining of the grant\n   * @param cliff uint64 The cliff period.\n   * @param vesting uint64 The vesting period.\n   * @return An uint representing the amount of vested tokensof a specif grant.\n   *  transferableTokens\n   *   |                         _/--------   vestedTokens rect\n   *   |                       _/\n   *   |                     _/\n   *   |                   _/\n   *   |                 _/\n   *   |                /\n   *   |              .|\n   *   |            .  |\n   *   |          .    |\n   *   |        .      |\n   *   |      .        |\n   *   |    .          |\n   *   +===+===========+---------+----------> time\n   *      Start       Clift    Vesting\n   */\n  function calculateVestedTokens(\n    uint256 tokens,\n    uint256 time,\n    uint256 start,\n    uint256 cliff,\n    uint256 vesting) constant returns (uint256)\n    {\n      // Shortcuts for before cliff and after vesting cases.\n      if (time < cliff) return 0;\n      if (time >= vesting) return tokens;\n\n      // Interpolate all vested tokens.\n      // As before cliff the shortcut returns 0, we can use just calculate a value\n      // in the vesting rect (as shown in above's figure)\n\n      // vestedTokens = tokens * (time - start) / (vesting - start)\n      uint256 vestedTokens = SafeMath.div(\n                                    SafeMath.mul(\n                                      tokens,\n                                      SafeMath.sub(time, start)\n                                      ),\n                                    SafeMath.sub(vesting, start)\n                                    );\n\n      return vestedTokens;\n  }\n\n  /**\n   * @dev Get all information about a specifc grant.\n   * @param _holder The address which will have its tokens revoked.\n   * @param _grantId The id of the token grant.\n   * @return Returns all the values that represent a TokenGrant(address, value, start, cliff,\n   * revokability, burnsOnRevoke, and vesting) plus the vested value at the current time.\n   */\n  function tokenGrant(address _holder, uint _grantId) constant returns (address granter, uint256 value, uint256 vested, uint64 start, uint64 cliff, uint64 vesting, bool revokable, bool burnsOnRevoke) {\n    TokenGrant grant = grants[_holder][_grantId];\n\n    granter = grant.granter;\n    value = grant.value;\n    start = grant.start;\n    cliff = grant.cliff;\n    vesting = grant.vesting;\n    revokable = grant.revokable;\n    burnsOnRevoke = grant.burnsOnRevoke;\n\n    vested = vestedTokens(grant, uint64(now));\n  }\n\n  /**\n   * @dev Get the amount of vested tokens at a specific time.\n   * @param grant TokenGrant The grant to be checked.\n   * @param time The time to be checked\n   * @return An uint representing the amount of vested tokens of a specific grant at a specific time.\n   */\n  function vestedTokens(TokenGrant grant, uint64 time) private constant returns (uint256) {\n    return calculateVestedTokens(\n      grant.value,\n      uint256(time),\n      uint256(grant.start),\n      uint256(grant.cliff),\n      uint256(grant.vesting)\n    );\n  }\n\n  /**\n   * @dev Calculate the amount of non vested tokens at a specific time.\n   * @param grant TokenGrant The grant to be checked.\n   * @param time uint64 The time to be checked\n   * @return An uint representing the amount of non vested tokens of a specifc grant on the\n   * passed time frame.\n   */\n  function nonVestedTokens(TokenGrant grant, uint64 time) private constant returns (uint256) {\n    return grant.value.sub(vestedTokens(grant, time));\n  }\n\n  /**\n   * @dev Calculate the date when the holder can trasfer all its tokens\n   * @param holder address The address of the holder\n   * @return An uint representing the date of the last transferable tokens.\n   */\n  function lastTokenIsTransferableDate(address holder) constant public returns (uint64 date) {\n    date = uint64(now);\n    uint256 grantIndex = grants[holder].length;\n    for (uint256 i = 0; i < grantIndex; i++) {\n      date = SafeMath.max64(grants[holder][i].vesting, date);\n    }\n  }\n}\n"
  },
  {
    "path": "resources/public/contracts/src/math/SafeMath.sol",
    "content": "pragma solidity ^0.4.18;\n\n\n/**\n * @title SafeMath\n * @dev Math operations with safety checks that throw on error\n */\nlibrary SafeMath {\n  function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n    if (a == 0) {\n      return 0;\n    }\n    uint256 c = a * b;\n    assert(c / a == b);\n    return c;\n  }\n\n  function div(uint256 a, uint256 b) internal pure returns (uint256) {\n    // assert(b > 0); // Solidity automatically throws when dividing by 0\n    uint256 c = a / b;\n    // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n    return c;\n  }\n\n  function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n    assert(b <= a);\n    return a - b;\n  }\n\n  function add(uint256 a, uint256 b) internal pure returns (uint256) {\n    uint256 c = a + b;\n    assert(c >= a);\n    return c;\n  }\n}\n"
  },
  {
    "path": "resources/public/contracts/src/minime_interface/ApproveAndCallFallback.sol",
    "content": "pragma solidity ^0.4.11;\n\n/*\n    Copyright 2017, Jordi Baylina (Giveth)\n*/\n\ncontract ApproveAndCallFallBack {\n    function receiveApproval(address from, uint256 _amount, address _token, bytes _data);\n}"
  },
  {
    "path": "resources/public/contracts/src/minime_interface/Controlled.sol",
    "content": "pragma solidity ^0.4.11;\n\n/*\n    Copyright 2017, Jorge Izquierdo (Aragon Foundation)\n    Copyright 2017, Jordi Baylina (Giveth)\n\n    Based on MiniMeToken.sol from https://github.com/Giveth/minime\n */\n\ncontract Controlled {\n    /// @notice The address of the controller is the only address that can call\n    ///  a function with this modifier\n    modifier onlyController { if (msg.sender != controller) throw; _; }\n\n    address public controller;\n\n    function Controlled() { controller = msg.sender;}\n\n    /// @notice Changes the controller of the contract\n    /// @param _newController The new controller of the contract\n    function changeController(address _newController) onlyController {\n        controller = _newController;\n    }\n}\n"
  },
  {
    "path": "resources/public/contracts/src/minime_interface/TokenController.sol",
    "content": "pragma solidity ^0.4.11;\n\n/// @dev The token controller contract must implement these functions\ncontract TokenController {\n    /// @notice Called when `_owner` sends ether to the MiniMe Token contract\n    /// @param _owner The address that sent the ether to create tokens\n    /// @return True if the ether is accepted, false if it throws\n    function proxyPayment(address _owner) payable returns(bool);\n\n    /// @notice Notifies the controller about a token transfer allowing the\n    ///  controller to react if desired\n    /// @param _from The origin of the transfer\n    /// @param _to The destination of the transfer\n    /// @param _amount The amount of the transfer\n    /// @return False if the controller does not authorize the transfer\n    function onTransfer(address _from, address _to, uint _amount) returns(bool);\n\n    /// @notice Notifies the controller about an approval allowing the\n    ///  controller to react if desired\n    /// @param _owner The address that calls `approve()`\n    /// @param _spender The spender in the `approve()` call\n    /// @param _amount The amount in the `approve()` call\n    /// @return False if the controller does not authorize the approval\n    function onApprove(address _owner, address _spender, uint _amount)\n        returns(bool);\n}\n"
  },
  {
    "path": "resources/public/contracts/src/orig/ERC20.sol",
    "content": "pragma solidity ^0.4.11;\n\n\nimport './ERC20Basic.sol';\n\n\n/*\n * ERC20 interface\n * see https://github.com/ethereum/EIPs/issues/20\n */\ncontract ERC20 is ERC20Basic {\n  function allowance(address owner, address spender) constant returns (uint);\n  function transferFrom(address from, address to, uint value) returns (bool);\n  function approve(address spender, uint value) returns (bool);\n  function approveAndCall(address spender, uint256 value, bytes extraData) returns (bool);\n  event Approval(address indexed owner, address indexed spender, uint value);\n}\n"
  },
  {
    "path": "resources/public/contracts/src/orig/LimitedTransferToken.sol",
    "content": "pragma solidity ^0.4.11;\n\nimport \"./ERC20.sol\";\n\n/*\n\nLimitedTransferToken defines the generic interface and the implementation\nto limit token transferability for different events.\n\nIt is intended to be used as a base class for other token contracts.\n\nOverwriting transferableTokens(address holder, uint64 time) is the way to provide\nthe specific logic for limiting token transferability for a holder over time.\n\nLimitedTransferToken has been designed to allow for different limiting factors,\nthis can be achieved by recursively calling super.transferableTokens() until the\nbase class is hit. For example:\n\nfunction transferableTokens(address holder, uint64 time) constant public returns (uint256) {\n  return min256(unlockedTokens, super.transferableTokens(holder, time));\n}\n\nA working example is VestedToken.sol:\nhttps://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/VestedToken.sol\n\nMade by OpenZeppelin https://raw.githubusercontent.com/OpenZeppelin/zeppelin-solidity/master/contracts/token/LimitedTransferToken.sol\n\n*/\n\ncontract LimitedTransferToken is ERC20 {\n  // Checks whether it can transfer or otherwise throws.\n  modifier canTransfer(address _sender, uint _value) {\n   if (_value > transferableTokens(_sender, uint64(now))) throw;\n   _;\n  }\n\n  // Checks modifier and allows transfer if tokens are not locked.\n  function transfer(address _to, uint _value) canTransfer(msg.sender, _value) {\n   return super.transfer(_to, _value);\n  }\n\n  // Checks modifier and allows transfer if tokens are not locked.\n  function transferFrom(address _from, address _to, uint _value) canTransfer(_from, _value) {\n   return super.transferFrom(_from, _to, _value);\n  }\n\n  // Default transferable tokens function returns all tokens for a holder (no limit).\n  function transferableTokens(address holder, uint64 time) constant public returns (uint256) {\n    return balanceOf(holder);\n  }\n}\n"
  },
  {
    "path": "resources/public/contracts/src/orig/MiniMeToken.sol",
    "content": "pragma solidity ^0.4.6;\n\n/*\n    Copyright 2016, Jordi Baylina\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n/// @title MiniMeToken Contract\n/// @author Jordi Baylina\n/// @dev This token contract's goal is to make it easy for anyone to clone this\n///  token using the token distribution at a given block, this will allow DAO's\n///  and DApps to upgrade their features in a decentralized manner without\n///  affecting the original token\n/// @dev It is ERC20 compliant, but still needs to under go further testing.\n\n\n/// @dev The token controller contract must implement these functions\ncontract TokenController {\n    /// @notice Called when `_owner` sends ether to the MiniMe Token contract\n    /// @param _owner The address that sent the ether to create tokens\n    /// @return True if the ether is accepted, false if it throws\n    function proxyPayment(address _owner) payable returns(bool);\n\n    /// @notice Notifies the controller about a token transfer allowing the\n    ///  controller to react if desired\n    /// @param _from The origin of the transfer\n    /// @param _to The destination of the transfer\n    /// @param _amount The amount of the transfer\n    /// @return False if the controller does not authorize the transfer\n    function onTransfer(address _from, address _to, uint _amount) returns(bool);\n\n    /// @notice Notifies the controller about an approval allowing the\n    ///  controller to react if desired\n    /// @param _owner The address that calls `approve()`\n    /// @param _spender The spender in the `approve()` call\n    /// @param _amount The amount in the `approve()` call\n    /// @return False if the controller does not authorize the approval\n    function onApprove(address _owner, address _spender, uint _amount)\n        returns(bool);\n}\n\ncontract Controlled {\n    /// @notice The address of the controller is the only address that can call\n    ///  a function with this modifier\n    modifier onlyController { if (msg.sender != controller) throw; _; }\n\n    address public controller;\n\n    function Controlled() { controller = msg.sender;}\n\n    /// @notice Changes the controller of the contract\n    /// @param _newController The new controller of the contract\n    function changeController(address _newController) onlyController {\n        controller = _newController;\n    }\n}\n\ncontract ApproveAndCallFallBack {\n    function receiveApproval(address from, uint256 _amount, address _token, bytes _data);\n}\n\n/// @dev The actual token contract, the default controller is the msg.sender\n///  that deploys the contract, so usually this token will be deployed by a\n///  token controller contract, which Giveth will call a \"Campaign\"\ncontract MiniMeToken is Controlled {\n\n    string public name;                //The Token's name: e.g. DigixDAO Tokens\n    uint8 public decimals;             //Number of decimals of the smallest unit\n    string public symbol;              //An identifier: e.g. REP\n    string public version = 'MMT_0.1'; //An arbitrary versioning scheme\n\n\n    /// @dev `Checkpoint` is the structure that attaches a block number to a\n    ///  given value, the block number attached is the one that last changed the\n    ///  value\n    struct  Checkpoint {\n\n        // `fromBlock` is the block number that the value was generated from\n        uint128 fromBlock;\n\n        // `value` is the amount of tokens at a specific block number\n        uint128 value;\n    }\n\n    // `parentToken` is the Token address that was cloned to produce this token;\n    //  it will be 0x0 for a token that was not cloned\n    MiniMeToken public parentToken;\n\n    // `parentSnapShotBlock` is the block number from the Parent Token that was\n    //  used to determine the initial distribution of the Clone Token\n    uint public parentSnapShotBlock;\n\n    // `creationBlock` is the block number that the Clone Token was created\n    uint public creationBlock;\n\n    // `balances` is the map that tracks the balance of each address, in this\n    //  contract when the balance changes the block number that the change\n    //  occurred is also included in the map\n    mapping (address => Checkpoint[]) balances;\n\n    // `allowed` tracks any extra transfer rights as in all ERC20 tokens\n    mapping (address => mapping (address => uint256)) allowed;\n\n    // Tracks the history of the `totalSupply` of the token\n    Checkpoint[] totalSupplyHistory;\n\n    // Flag that determines if the token is transferable or not.\n    bool public transfersEnabled;\n\n    // The factory used to create new clone tokens\n    MiniMeTokenFactory public tokenFactory;\n\n////////////////\n// Constructor\n////////////////\n\n    /// @notice Constructor to create a MiniMeToken\n    /// @param _tokenFactory The address of the MiniMeTokenFactory contract that\n    ///  will create the Clone token contracts, the token factory needs to be\n    ///  deployed first\n    /// @param _parentToken Address of the parent token, set to 0x0 if it is a\n    ///  new token\n    /// @param _parentSnapShotBlock Block of the parent token that will\n    ///  determine the initial distribution of the clone token, set to 0 if it\n    ///  is a new token\n    /// @param _tokenName Name of the new token\n    /// @param _decimalUnits Number of decimals of the new token\n    /// @param _tokenSymbol Token Symbol for the new token\n    /// @param _transfersEnabled If true, tokens will be able to be transferred\n    function MiniMeToken(\n        address _tokenFactory,\n        address _parentToken,\n        uint _parentSnapShotBlock,\n        string _tokenName,\n        uint8 _decimalUnits,\n        string _tokenSymbol,\n        bool _transfersEnabled\n    ) {\n        tokenFactory = MiniMeTokenFactory(_tokenFactory);\n        name = _tokenName;                                 // Set the name\n        decimals = _decimalUnits;                          // Set the decimals\n        symbol = _tokenSymbol;                             // Set the symbol\n        parentToken = MiniMeToken(_parentToken);\n        parentSnapShotBlock = _parentSnapShotBlock;\n        transfersEnabled = _transfersEnabled;\n        creationBlock = block.number;\n    }\n\n\n///////////////////\n// ERC20 Methods\n///////////////////\n\n    /// @notice Send `_amount` tokens to `_to` from `msg.sender`\n    /// @param _to The address of the recipient\n    /// @param _amount The amount of tokens to be transferred\n    /// @return Whether the transfer was successful or not\n    function transfer(address _to, uint256 _amount) returns (bool success) {\n        if (!transfersEnabled) throw;\n        return doTransfer(msg.sender, _to, _amount);\n    }\n\n    /// @notice Send `_amount` tokens to `_to` from `_from` on the condition it\n    ///  is approved by `_from`\n    /// @param _from The address holding the tokens being transferred\n    /// @param _to The address of the recipient\n    /// @param _amount The amount of tokens to be transferred\n    /// @return True if the transfer was successful\n    function transferFrom(address _from, address _to, uint256 _amount\n    ) returns (bool success) {\n\n        // The controller of this contract can move tokens around at will,\n        //  this is important to recognize! Confirm that you trust the\n        //  controller of this contract, which in most situations should be\n        //  another open source smart contract or 0x0\n        if (msg.sender != controller) {\n            if (!transfersEnabled) throw;\n\n            // The standard ERC 20 transferFrom functionality\n            if (allowed[_from][msg.sender] < _amount) return false;\n            allowed[_from][msg.sender] -= _amount;\n        }\n        return doTransfer(_from, _to, _amount);\n    }\n\n    /// @dev This is the actual transfer function in the token contract, it can\n    ///  only be called by other functions in this contract.\n    /// @param _from The address holding the tokens being transferred\n    /// @param _to The address of the recipient\n    /// @param _amount The amount of tokens to be transferred\n    /// @return True if the transfer was successful\n    function doTransfer(address _from, address _to, uint _amount\n    ) internal returns(bool) {\n\n           if (_amount == 0) {\n               return true;\n           }\n\n           if (parentSnapShotBlock >= block.number) throw;\n\n           // Do not allow transfer to 0x0 or the token contract itself\n           if ((_to == 0) || (_to == address(this))) throw;\n\n           // If the amount being transfered is more than the balance of the\n           //  account the transfer returns false\n           var previousBalanceFrom = balanceOfAt(_from, block.number);\n           if (previousBalanceFrom < _amount) {\n               return false;\n           }\n\n           // Alerts the token controller of the transfer\n           if (isContract(controller)) {\n               if (!TokenController(controller).onTransfer(_from, _to, _amount))\n               throw;\n           }\n\n           // First update the balance array with the new value for the address\n           //  sending the tokens\n           updateValueAtNow(balances[_from], previousBalanceFrom - _amount);\n\n           // Then update the balance array with the new value for the address\n           //  receiving the tokens\n           var previousBalanceTo = balanceOfAt(_to, block.number);\n           if (previousBalanceTo + _amount < previousBalanceTo) throw; // Check for overflow\n           updateValueAtNow(balances[_to], previousBalanceTo + _amount);\n\n           // An event to make the transfer easy to find on the blockchain\n           Transfer(_from, _to, _amount);\n\n           return true;\n    }\n\n    /// @param _owner The address that's balance is being requested\n    /// @return The balance of `_owner` at the current block\n    function balanceOf(address _owner) constant returns (uint256 balance) {\n        return balanceOfAt(_owner, block.number);\n    }\n\n    /// @notice `msg.sender` approves `_spender` to spend `_amount` tokens on\n    ///  its behalf. This is a modified version of the ERC20 approve function\n    ///  to be a little bit safer\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @param _amount The amount of tokens to be approved for transfer\n    /// @return True if the approval was successful\n    function approve(address _spender, uint256 _amount) returns (bool success) {\n        if (!transfersEnabled) throw;\n\n        // To change the approve amount you first have to reduce the addresses`\n        //  allowance to zero by calling `approve(_spender,0)` if it is not\n        //  already 0 to mitigate the race condition described here:\n        //  https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n        if ((_amount!=0) && (allowed[msg.sender][_spender] !=0)) throw;\n\n        // Alerts the token controller of the approve function call\n        if (isContract(controller)) {\n            if (!TokenController(controller).onApprove(msg.sender, _spender, _amount))\n                throw;\n        }\n\n        allowed[msg.sender][_spender] = _amount;\n        Approval(msg.sender, _spender, _amount);\n        return true;\n    }\n\n    /// @dev This function makes it easy to read the `allowed[]` map\n    /// @param _owner The address of the account that owns the token\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @return Amount of remaining tokens of _owner that _spender is allowed\n    ///  to spend\n    function allowance(address _owner, address _spender\n    ) constant returns (uint256 remaining) {\n        return allowed[_owner][_spender];\n    }\n\n    /// @notice `msg.sender` approves `_spender` to send `_amount` tokens on\n    ///  its behalf, and then a function is triggered in the contract that is\n    ///  being approved, `_spender`. This allows users to use their tokens to\n    ///  interact with contracts in one function call instead of two\n    /// @param _spender The address of the contract able to transfer the tokens\n    /// @param _amount The amount of tokens to be approved for transfer\n    /// @return True if the function call was successful\n    function approveAndCall(address _spender, uint256 _amount, bytes _extraData\n    ) returns (bool success) {\n        if (!approve(_spender, _amount)) throw;\n\n        ApproveAndCallFallBack(_spender).receiveApproval(\n            msg.sender,\n            _amount,\n            this,\n            _extraData\n        );\n\n        return true;\n    }\n\n    /// @dev This function makes it easy to get the total number of tokens\n    /// @return The total number of tokens\n    function totalSupply() constant returns (uint) {\n        return totalSupplyAt(block.number);\n    }\n\n\n////////////////\n// Query balance and totalSupply in History\n////////////////\n\n    /// @dev Queries the balance of `_owner` at a specific `_blockNumber`\n    /// @param _owner The address from which the balance will be retrieved\n    /// @param _blockNumber The block number when the balance is queried\n    /// @return The balance at `_blockNumber`\n    function balanceOfAt(address _owner, uint _blockNumber) constant\n        returns (uint) {\n\n        // These next few lines are used when the balance of the token is\n        //  requested before a check point was ever created for this token, it\n        //  requires that the `parentToken.balanceOfAt` be queried at the\n        //  genesis block for that token as this contains initial balance of\n        //  this token\n        if ((balances[_owner].length == 0)\n            || (balances[_owner][0].fromBlock > _blockNumber)) {\n            if (address(parentToken) != 0) {\n                return parentToken.balanceOfAt(_owner, min(_blockNumber, parentSnapShotBlock));\n            } else {\n                // Has no parent\n                return 0;\n            }\n\n        // This will return the expected balance during normal situations\n        } else {\n            return getValueAt(balances[_owner], _blockNumber);\n        }\n    }\n\n    /// @notice Total amount of tokens at a specific `_blockNumber`.\n    /// @param _blockNumber The block number when the totalSupply is queried\n    /// @return The total amount of tokens at `_blockNumber`\n    function totalSupplyAt(uint _blockNumber) constant returns(uint) {\n\n        // These next few lines are used when the totalSupply of the token is\n        //  requested before a check point was ever created for this token, it\n        //  requires that the `parentToken.totalSupplyAt` be queried at the\n        //  genesis block for this token as that contains totalSupply of this\n        //  token at this block number.\n        if ((totalSupplyHistory.length == 0)\n            || (totalSupplyHistory[0].fromBlock > _blockNumber)) {\n            if (address(parentToken) != 0) {\n                return parentToken.totalSupplyAt(min(_blockNumber, parentSnapShotBlock));\n            } else {\n                return 0;\n            }\n\n        // This will return the expected totalSupply during normal situations\n        } else {\n            return getValueAt(totalSupplyHistory, _blockNumber);\n        }\n    }\n\n////////////////\n// Clone Token Method\n////////////////\n\n    /// @notice Creates a new clone token with the initial distribution being\n    ///  this token at `_snapshotBlock`\n    /// @param _cloneTokenName Name of the clone token\n    /// @param _cloneDecimalUnits Number of decimals of the smallest unit\n    /// @param _cloneTokenSymbol Symbol of the clone token\n    /// @param _snapshotBlock Block when the distribution of the parent token is\n    ///  copied to set the initial distribution of the new clone token;\n    ///  if the block is zero than the actual block, the current block is used\n    /// @param _transfersEnabled True if transfers are allowed in the clone\n    /// @return The address of the new MiniMeToken Contract\n    function createCloneToken(\n        string _cloneTokenName,\n        uint8 _cloneDecimalUnits,\n        string _cloneTokenSymbol,\n        uint _snapshotBlock,\n        bool _transfersEnabled\n        ) returns(address) {\n        if (_snapshotBlock == 0) _snapshotBlock = block.number;\n        MiniMeToken cloneToken = tokenFactory.createCloneToken(\n            this,\n            _snapshotBlock,\n            _cloneTokenName,\n            _cloneDecimalUnits,\n            _cloneTokenSymbol,\n            _transfersEnabled\n            );\n\n        cloneToken.changeController(msg.sender);\n\n        // An event to make the token easy to find on the blockchain\n        NewCloneToken(address(cloneToken), _snapshotBlock);\n        return address(cloneToken);\n    }\n\n////////////////\n// Generate and destroy tokens\n////////////////\n\n    /// @notice Generates `_amount` tokens that are assigned to `_owner`\n    /// @param _owner The address that will be assigned the new tokens\n    /// @param _amount The quantity of tokens generated\n    /// @return True if the tokens are generated correctly\n    function generateTokens(address _owner, uint _amount\n    ) onlyController returns (bool) {\n        uint curTotalSupply = getValueAt(totalSupplyHistory, block.number);\n        if (curTotalSupply + _amount < curTotalSupply) throw; // Check for overflow\n        updateValueAtNow(totalSupplyHistory, curTotalSupply + _amount);\n        var previousBalanceTo = balanceOf(_owner);\n        if (previousBalanceTo + _amount < previousBalanceTo) throw; // Check for overflow\n        updateValueAtNow(balances[_owner], previousBalanceTo + _amount);\n        Transfer(0, _owner, _amount);\n        return true;\n    }\n\n\n    /// @notice Burns `_amount` tokens from `_owner`\n    /// @param _owner The address that will lose the tokens\n    /// @param _amount The quantity of tokens to burn\n    /// @return True if the tokens are burned correctly\n    function destroyTokens(address _owner, uint _amount\n    ) onlyController returns (bool) {\n        uint curTotalSupply = getValueAt(totalSupplyHistory, block.number);\n        if (curTotalSupply < _amount) throw;\n        updateValueAtNow(totalSupplyHistory, curTotalSupply - _amount);\n        var previousBalanceFrom = balanceOf(_owner);\n        if (previousBalanceFrom < _amount) throw;\n        updateValueAtNow(balances[_owner], previousBalanceFrom - _amount);\n        Transfer(_owner, 0, _amount);\n        return true;\n    }\n\n////////////////\n// Enable tokens transfers\n////////////////\n\n\n    /// @notice Enables token holders to transfer their tokens freely if true\n    /// @param _transfersEnabled True if transfers are allowed in the clone\n    function enableTransfers(bool _transfersEnabled) onlyController {\n        transfersEnabled = _transfersEnabled;\n    }\n\n////////////////\n// Internal helper functions to query and set a value in a snapshot array\n////////////////\n\n    /// @dev `getValueAt` retrieves the number of tokens at a given block number\n    /// @param checkpoints The history of values being queried\n    /// @param _block The block number to retrieve the value at\n    /// @return The number of tokens being queried\n    function getValueAt(Checkpoint[] storage checkpoints, uint _block\n    ) constant internal returns (uint) {\n        if (checkpoints.length == 0) return 0;\n\n        // Shortcut for the actual value\n        if (_block >= checkpoints[checkpoints.length-1].fromBlock)\n            return checkpoints[checkpoints.length-1].value;\n        if (_block < checkpoints[0].fromBlock) return 0;\n\n        // Binary search of the value in the array\n        uint min = 0;\n        uint max = checkpoints.length-1;\n        while (max > min) {\n            uint mid = (max + min + 1)/ 2;\n            if (checkpoints[mid].fromBlock<=_block) {\n                min = mid;\n            } else {\n                max = mid-1;\n            }\n        }\n        return checkpoints[min].value;\n    }\n\n    /// @dev `updateValueAtNow` used to update the `balances` map and the\n    ///  `totalSupplyHistory`\n    /// @param checkpoints The history of data being updated\n    /// @param _value The new number of tokens\n    function updateValueAtNow(Checkpoint[] storage checkpoints, uint _value\n    ) internal  {\n        if ((checkpoints.length == 0)\n        || (checkpoints[checkpoints.length -1].fromBlock < block.number)) {\n               Checkpoint newCheckPoint = checkpoints[ checkpoints.length++ ];\n               newCheckPoint.fromBlock =  uint128(block.number);\n               newCheckPoint.value = uint128(_value);\n           } else {\n               Checkpoint oldCheckPoint = checkpoints[checkpoints.length-1];\n               oldCheckPoint.value = uint128(_value);\n           }\n    }\n\n    /// @dev Internal function to determine if an address is a contract\n    /// @param _addr The address being queried\n    /// @return True if `_addr` is a contract\n    function isContract(address _addr) constant internal returns(bool) {\n        uint size;\n        if (_addr == 0) return false;\n        assembly {\n            size := extcodesize(_addr)\n        }\n        return size>0;\n    }\n\n    /// @dev Helper function to return a min betwen the two uints\n    function min(uint a, uint b) internal returns (uint) {\n        return a < b ? a : b;\n    }\n\n    /// @notice The fallback function: If the contract's controller has not been\n    ///  set to 0, then the `proxyPayment` method is called which relays the\n    ///  ether and creates tokens as described in the token controller contract\n    function ()  payable {\n        if (isContract(controller)) {\n            if (! TokenController(controller).proxyPayment.value(msg.value)(msg.sender))\n                throw;\n        } else {\n            throw;\n        }\n    }\n\n\n////////////////\n// Events\n////////////////\n    event Transfer(address indexed _from, address indexed _to, uint256 _amount);\n    event NewCloneToken(address indexed _cloneToken, uint _snapshotBlock);\n    event Approval(\n        address indexed _owner,\n        address indexed _spender,\n        uint256 _amount\n        );\n\n}\n\n\n////////////////\n// MiniMeTokenFactory\n////////////////\n\n/// @dev This contract is used to generate clone contracts from a contract.\n///  In solidity this is the way to create a contract from a contract of the\n///  same class\ncontract MiniMeTokenFactory {\n\n    /// @notice Update the DApp by creating a new token with new functionalities\n    ///  the msg.sender becomes the controller of this clone token\n    /// @param _parentToken Address of the token being cloned\n    /// @param _snapshotBlock Block of the parent token that will\n    ///  determine the initial distribution of the clone token\n    /// @param _tokenName Name of the new token\n    /// @param _decimalUnits Number of decimals of the new token\n    /// @param _tokenSymbol Token Symbol for the new token\n    /// @param _transfersEnabled If true, tokens will be able to be transferred\n    /// @return The address of the new token contract\n    function createCloneToken(\n        address _parentToken,\n        uint _snapshotBlock,\n        string _tokenName,\n        uint8 _decimalUnits,\n        string _tokenSymbol,\n        bool _transfersEnabled\n    ) returns (MiniMeToken) {\n        MiniMeToken newToken = new MiniMeToken(\n            this,\n            _parentToken,\n            _snapshotBlock,\n            _tokenName,\n            _decimalUnits,\n            _tokenSymbol,\n            _transfersEnabled\n            );\n\n        newToken.changeController(msg.sender);\n        return newToken;\n    }\n}\n"
  },
  {
    "path": "resources/public/contracts/src/orig/VestedToken.sol",
    "content": "pragma solidity ^0.4.11;\n\nimport \"./StandardToken.sol\";\nimport \"./LimitedTransferToken.sol\";\n\n/**\n * @title Vested token\n * @dev Tokens that can be vested for a group of addresses.\n */\ncontract VestedToken is StandardToken, LimitedTransferToken {\n\n  uint256 MAX_GRANTS_PER_ADDRESS = 20;\n\n  struct TokenGrant {\n    address granter;     // 20 bytes\n    uint256 value;       // 32 bytes\n    uint64 cliff;\n    uint64 vesting;\n    uint64 start;        // 3 * 8 = 24 bytes\n    bool revokable;\n    bool burnsOnRevoke;  // 2 * 1 = 2 bits? or 2 bytes?\n  } // total 78 bytes = 3 sstore per operation (32 per sstore)\n\n  mapping (address => TokenGrant[]) public grants;\n\n  event NewTokenGrant(address indexed from, address indexed to, uint256 value, uint256 grantId);\n\n  /**\n   * @dev Grant tokens to a specified address\n   * @param _to address The address which the tokens will be granted to.\n   * @param _value uint256 The amount of tokens to be granted.\n   * @param _start uint64 Time of the beginning of the grant.\n   * @param _cliff uint64 Time of the cliff period.\n   * @param _vesting uint64 The vesting period.\n   */\n  function grantVestedTokens(\n    address _to,\n    uint256 _value,\n    uint64 _start,\n    uint64 _cliff,\n    uint64 _vesting,\n    bool _revokable,\n    bool _burnsOnRevoke\n  ) public {\n\n    // Check for date inconsistencies that may cause unexpected behavior\n    if (_cliff < _start || _vesting < _cliff) {\n      throw;\n    }\n\n    if (tokenGrantsCount(_to) > MAX_GRANTS_PER_ADDRESS) throw;   // To prevent a user being spammed and have his balance locked (out of gas attack when calculating vesting).\n\n    uint count = grants[_to].push(\n                TokenGrant(\n                  _revokable ? msg.sender : 0, // avoid storing an extra 20 bytes when it is non-revokable\n                  _value,\n                  _cliff,\n                  _vesting,\n                  _start,\n                  _revokable,\n                  _burnsOnRevoke\n                )\n              );\n\n    transfer(_to, _value);\n\n    NewTokenGrant(msg.sender, _to, _value, count - 1);\n  }\n\n  /**\n   * @dev Revoke the grant of tokens of a specifed address.\n   * @param _holder The address which will have its tokens revoked.\n   * @param _grantId The id of the token grant.\n   */\n  function revokeTokenGrant(address _holder, uint _grantId) public {\n    TokenGrant grant = grants[_holder][_grantId];\n\n    if (!grant.revokable) { // Check if grant was revokable\n      throw;\n    }\n\n    if (grant.granter != msg.sender) { // Only granter can revoke it\n      throw;\n    }\n\n    address receiver = grant.burnsOnRevoke ? 0xdead : msg.sender;\n\n    uint256 nonVested = nonVestedTokens(grant, uint64(now));\n\n    // remove grant from array\n    delete grants[_holder][_grantId];\n    grants[_holder][_grantId] = grants[_holder][grants[_holder].length.sub(1)];\n    grants[_holder].length -= 1;\n\n    balances[receiver] = balances[receiver].add(nonVested);\n    balances[_holder] = balances[_holder].sub(nonVested);\n\n    Transfer(_holder, receiver, nonVested);\n  }\n\n  /**\n   * @dev Calculate the total amount of transferable tokens of a holder at a given time\n   * @param holder address The address of the holder\n   * @param time uint64 The specific time.\n   * @return An uint representing a holder's total amount of transferable tokens.\n   */\n  function transferableTokens(address holder, uint64 time) constant public returns (uint256) {\n    uint256 grantIndex = tokenGrantsCount(holder);\n\n    if (grantIndex == 0) return balanceOf(holder); // shortcut for holder without grants\n\n    // Iterate through all the grants the holder has, and add all non-vested tokens\n    uint256 nonVested = 0;\n    for (uint256 i = 0; i < grantIndex; i++) {\n      nonVested = SafeMath.add(nonVested, nonVestedTokens(grants[holder][i], time));\n    }\n\n    // Balance - totalNonVested is the amount of tokens a holder can transfer at any given time\n    uint256 vestedTransferable = SafeMath.sub(balanceOf(holder), nonVested);\n\n    // Return the minimum of how many vested can transfer and other value\n    // in case there are other limiting transferability factors (default is balanceOf)\n    return SafeMath.min256(vestedTransferable, super.transferableTokens(holder, time));\n  }\n\n  /**\n   * @dev Check the amount of grants that an address has.\n   * @param _holder The holder of the grants.\n   * @return A uint representing the total amount of grants.\n   */\n  function tokenGrantsCount(address _holder) constant returns (uint index) {\n    return grants[_holder].length;\n  }\n\n  /**\n   * @dev Calculate amount of vested tokens at a specifc time.\n   * @param tokens uint256 The amount of tokens grantted.\n   * @param time uint64 The time to be checked\n   * @param start uint64 A time representing the begining of the grant\n   * @param cliff uint64 The cliff period.\n   * @param vesting uint64 The vesting period.\n   * @return An uint representing the amount of vested tokensof a specif grant.\n   *  transferableTokens\n   *   |                         _/--------   vestedTokens rect\n   *   |                       _/\n   *   |                     _/\n   *   |                   _/\n   *   |                 _/\n   *   |                /\n   *   |              .|\n   *   |            .  |\n   *   |          .    |\n   *   |        .      |\n   *   |      .        |\n   *   |    .          |\n   *   +===+===========+---------+----------> time\n   *      Start       Clift    Vesting\n   */\n  function calculateVestedTokens(\n    uint256 tokens,\n    uint256 time,\n    uint256 start,\n    uint256 cliff,\n    uint256 vesting) constant returns (uint256)\n    {\n      // Shortcuts for before cliff and after vesting cases.\n      if (time < cliff) return 0;\n      if (time >= vesting) return tokens;\n\n      // Interpolate all vested tokens.\n      // As before cliff the shortcut returns 0, we can use just calculate a value\n      // in the vesting rect (as shown in above's figure)\n\n      // vestedTokens = tokens * (time - start) / (vesting - start)\n      uint256 vestedTokens = SafeMath.div(\n                                    SafeMath.mul(\n                                      tokens,\n                                      SafeMath.sub(time, start)\n                                      ),\n                                    SafeMath.sub(vesting, start)\n                                    );\n\n      return vestedTokens;\n  }\n\n  /**\n   * @dev Get all information about a specifc grant.\n   * @param _holder The address which will have its tokens revoked.\n   * @param _grantId The id of the token grant.\n   * @return Returns all the values that represent a TokenGrant(address, value, start, cliff,\n   * revokability, burnsOnRevoke, and vesting) plus the vested value at the current time.\n   */\n  function tokenGrant(address _holder, uint _grantId) constant returns (address granter, uint256 value, uint256 vested, uint64 start, uint64 cliff, uint64 vesting, bool revokable, bool burnsOnRevoke) {\n    TokenGrant grant = grants[_holder][_grantId];\n\n    granter = grant.granter;\n    value = grant.value;\n    start = grant.start;\n    cliff = grant.cliff;\n    vesting = grant.vesting;\n    revokable = grant.revokable;\n    burnsOnRevoke = grant.burnsOnRevoke;\n\n    vested = vestedTokens(grant, uint64(now));\n  }\n\n  /**\n   * @dev Get the amount of vested tokens at a specific time.\n   * @param grant TokenGrant The grant to be checked.\n   * @param time The time to be checked\n   * @return An uint representing the amount of vested tokens of a specific grant at a specific time.\n   */\n  function vestedTokens(TokenGrant grant, uint64 time) private constant returns (uint256) {\n    return calculateVestedTokens(\n      grant.value,\n      uint256(time),\n      uint256(grant.start),\n      uint256(grant.cliff),\n      uint256(grant.vesting)\n    );\n  }\n\n  /**\n   * @dev Calculate the amount of non vested tokens at a specific time.\n   * @param grant TokenGrant The grant to be checked.\n   * @param time uint64 The time to be checked\n   * @return An uint representing the amount of non vested tokens of a specifc grant on the\n   * passed time frame.\n   */\n  function nonVestedTokens(TokenGrant grant, uint64 time) private constant returns (uint256) {\n    return grant.value.sub(vestedTokens(grant, time));\n  }\n\n  /**\n   * @dev Calculate the date when the holder can trasfer all its tokens\n   * @param holder address The address of the holder\n   * @return An uint representing the date of the last transferable tokens.\n   */\n  function lastTokenIsTransferableDate(address holder) constant public returns (uint64 date) {\n    date = uint64(now);\n    uint256 grantIndex = grants[holder].length;\n    for (uint256 i = 0; i < grantIndex; i++) {\n      date = SafeMath.max64(grants[holder][i].vesting, date);\n    }\n  }\n}\n"
  },
  {
    "path": "resources/public/contracts/src/ownership/Ownable.sol",
    "content": "pragma solidity ^0.4.18;\n\n\n/**\n * @title Ownable\n * @dev The Ownable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract Ownable {\n  address public owner;\n\n\n  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n\n  /**\n   * @dev The Ownable constructor sets the original `owner` of the contract to the sender\n   * account.\n   */\n  function Ownable() public {\n    owner = msg.sender;\n  }\n\n\n  /**\n   * @dev Throws if called by any account other than the owner.\n   */\n  modifier onlyOwner() {\n    require(msg.sender == owner);\n    _;\n  }\n\n\n  /**\n   * @dev Allows the current owner to transfer control of the contract to a newOwner.\n   * @param newOwner The address to transfer ownership to.\n   */\n  function transferOwnership(address newOwner) public onlyOwner {\n    require(newOwner != address(0));\n    OwnershipTransferred(owner, newOwner);\n    owner = newOwner;\n  }\n\n}\n"
  },
  {
    "path": "resources/public/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset='utf-8'>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=0, maximum-scale=1, minimum-scale=1\">\n    <title>district0x Contribution Page</title>\n    <meta property=\"og:title\" content=\"district0x Contribution Page\"/>\n    <meta property=\"og:image\" content=\"https://district0x.io/images/district0x-1200x630.png\"/>\n    <meta property=\"og:image:width\" content=\"1200\" />\n    <meta property=\"og:image:height\" content=\"630\" />\n    <meta property=\"og:image:type\" content=\"image/png\" />\n\n    <meta name=\"description\" content=\"A network of decentralized markets and communities. Create, operate, and govern. Powered by Ethereum, Aragon, and IPFS.\"/>\n    <link rel=\"stylesheet\" href=\"./css/district0x.css\">\n    <link rel=\"shortcut icon\" href=\"./images/favicon.ico\" type=\"image/x-icon\">\n    <link rel=\"icon\" href=\"./images/favicon.ico\" type=\"image/x-icon\">\n\n    <script src=\"https://use.typekit.net/zhu6uux.js\"></script>\n    <script>try{Typekit.load({ async: true });}catch(e){}</script>\n\n    <link rel=\"icon\" type=\"image/png\" href=\"./images/favicon-32x32.png\" sizes=\"32x32\" />\n    <link rel=\"icon\" type=\"image/png\" href=\"./images/favicon-16x16.png\" sizes=\"16x16\" />\n</head>\n<body>\n<div id=\"app\"></div>\n<script>\n      (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n      (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n      m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n      })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');\n\n      ga('create', 'UA-100624852-2', 'auto');\n</script>\n<script src=\"./js/compiled/app.js?v=1.0.9\"></script>\n<script>contribution.core.init();</script>\n</body>\n</html>\n"
  },
  {
    "path": "resources/public/less/district0x.main.less",
    "content": "@import (inline) \"cljsjs/react-flexbox-grid/production/react-flexbox-grid.min.inc.css\";\n\n@font-face {\n    font-family: ProximaNovaSoft;\n    src: url(\"../fonts/ProximaNovaSoft-Regular.otf\") format(\"opentype\");\n}\n\n@font-face {\n    font-family: ProximaNovaSoft;\n    font-weight: bold;\n    src: url(\"../fonts/ProximaNovaSoft-Semibold.otf\") format(\"opentype\");\n}\n\n\nhtml, body, #app {\n    height: 100%;\n    width: 100%;\n    padding: 0;\n    margin: 0;\n    -webkit-text-size-adjust: 100%;\n}\n\na {\n    color: inherit;\n    text-decoration: none;\n}\n\na.no-decor {\n    color: inherit !important;\n}\n\na.hoverable:hover {\n  text-decoration: underline;\n}\n\na.no-decor:hover {\n  text-decoration: none;\n}\n\nhtml {\n  font-family: 'proxima-soft', sans-serif;\n  -webkit-font-smoothing: antialiased;\n}\n\nbody {\n    background-color: #fff;\n}\n\nbody, h1, h2, h3, h4, h5, h6 {\n  margin: 0;\n}\n\nh1, h2, h3 {\n    font-weight: 300 !important;\n    line-height: 1.2em;\n    word-break: break-word;\n}\n\nh1.bolder, h2.bolder, h3.bolder {\n    font-weight: 400 !important;\n}\n\n.black {\n    color: #000;\n}\n\n.white {\n    color: #FFF;\n}\n\nh3 {\n    line-height: 1.4em;\n}\n\nbody {\n  font-size: 15px;\n  //line-height: 24px;\n}\n\nstrong, b {\n    font-weight: 600;\n}\n\n.sm-visible, .md-visible, .lg-visible {\n    display: none;\n}\n\n@media only screen and (min-width:48em) {\n    .sm-visible {\n        display: block;\n    }\n    .sm-margin-0 {\n        margin: 0;\n    }\n    .sm-margin-top-0 {\n        margin-top: 0 !important;\n    }\n}\n\n@media only screen and (min-width:64em) {\n    .md-visible {\n        display: block;\n    }\n    .md-margin-0 {\n        margin: 0;\n    }\n}\n\n@media only screen and (min-width:75em) {\n    .lg-visible {\n        display: block;\n    }\n    .lg-margin-0 {\n        margin: 0;\n    }\n}\n\n.icon svg path {\n    color: \"#FFF\";\n    fill: \"#FFF\";\n}"
  },
  {
    "path": "src/cljs/contribution/api.cljs",
    "content": "(ns contribution.api\n  (:require [district0x.big-number :as bn]\n            [cljs-web3.core :as web3]\n            [cljs-time.core :as t]))\n\n(def big-num->ether (comp bn/->number #(web3/from-wei % :ether)))\n\n(defn parse-get-contrib-period [[bool-vals uint-vals]]\n  (let [[enabled? soft-cap-reached? hard-cap-reached?] bool-vals\n        [soft-cap-amount after-soft-cap-duration hard-cap-amount start-time end-time total-contributed\n         contributors-count contrib-period-stake] uint-vals]\n    {:contrib-period/soft-cap-amount (big-num->ether soft-cap-amount)\n     :contrib-period/after-soft-cap-duration (bn/->number after-soft-cap-duration)\n     :contrib-period/hard-cap-amount (big-num->ether hard-cap-amount)\n     :contrib-period/start-time (bn/->date-time start-time)\n     :contrib-period/end-time (t/to-default-time-zone (t/plus (cljs-time.core/date-time 2017 7 18 15)\n                                                              (t/weeks 2))) #_(bn/->date-time end-time)\n     :contrib-period/enabled? enabled?\n     :contrib-period/soft-cap-reached? soft-cap-reached?\n     :contrib-period/hard-cap-reached? hard-cap-reached?\n     :contrib-period/total-contributed (big-num->ether total-contributed)\n     :contrib-period/contributors-count (bn/->number contributors-count)\n     :contrib-period/stake (big-num->ether contrib-period-stake)}))\n\n(defn contrib-period-args [contrib-period]\n  ((juxt :contrib-period/soft-cap-amount\n         :contrib-period/after-soft-cap-duration\n         :contrib-period/hard-cap-amount\n         :contrib-period/start-time\n         :contrib-period/end-time)\n    contrib-period))\n\n(defn parse-get-configuration [[stopped? wallet founder1 founder2 early-sponsor advisers transfers-enabled?\n                                max-gas-price]]\n  {:contribution/stopped? stopped?\n   :contribution/wallet wallet\n   :contribution/founder1 founder1\n   :contribution/founder2 founder2\n   :contribution/early-sponsor early-sponsor\n   :contribution/advisers advisers\n   :dnt-token/transfers-enabled? transfers-enabled?\n   :contribution/max-gas-price (bn/->number max-gas-price)})\n"
  },
  {
    "path": "src/cljs/contribution/components/main_panel.cljs",
    "content": "(ns contribution.components.main-panel\n  (:require\n    [cljs-react-material-ui.core :refer [get-mui-theme]]\n    [cljs-react-material-ui.reagent :as ui]\n    [cljs-time.core :as t]\n    [clojure.set :as set]\n    [contribution.constants :as constants]\n    [contribution.styles :as styles]\n    [district0x.components.active-address-select-field :refer [active-address-select-field]]\n    [district0x.components.misc :as misc :refer [row row-with-cols col center-layout etherscan-link]]\n    [district0x.components.utils :refer [create-with-default-props parse-props-children]]\n    [district0x.utils :as u]\n    [medley.core :as medley]\n    [re-frame.core :refer [subscribe dispatch]]\n    [reagent.core :as r]\n    [cljs-web3.core :as web3]))\n\n(def paper (create-with-default-props misc/paper {:style styles/paper}))\n\n(defn contracts-not-found-page []\n  [center-layout\n   [paper\n    [row\n     {:center \"xs\"\n      :middle \"xs\"\n      :style {:min-height \"400px\"}}\n     [:h3 \"We couldn't find district0x Contribution smart contracts.\" [:br]\n      \"Your MetaMask Chrome extension is most likely not pointed to Ethereum Mainnet, please check.\"]]]])\n\n(defn app-bar-right-elements []\n  (let [active-address-balance-eth (subscribe [:district0x/active-address-balance :eth])\n        active-address-balance-dnt (subscribe [:district0x/active-address-balance :dnt])\n        connection-error? (subscribe [:district0x/blockchain-connection-error?])\n        my-addresses (subscribe [:district0x/my-addresses])\n        contracts-not-found? (subscribe [:district0x/contracts-not-found?])]\n    (fn []\n      (when-not @connection-error?\n        [row\n         {:middle \"xs\"\n          :end \"xs\"}\n         (when (and (seq @my-addresses)\n                    @active-address-balance-dnt)\n           [:h2.bolder {:style (merge styles/app-bar-balance\n                                      {:margin-right 10})}\n            (u/format-dnt-with-symbol @active-address-balance-dnt)])\n         (when (and (seq @my-addresses)\n                    @active-address-balance-eth)\n           [:h2.bolder {:style (merge styles/app-bar-balance\n                                      {:margin-right 20})}\n            (u/format-eth-with-symbol @active-address-balance-eth)])\n         [active-address-select-field\n          {:select-field-props {:style styles/active-address-select-field\n                                :label-style styles/active-address-select-field-label\n                                :underline-style {:border-color styles/theme-blue}}\n           :single-address-props {:style styles/active-address-single}}]]))))\n\n(defn info-line [props & children]\n  (let [[props children] (parse-props-children props children)]\n    [:div\n     props\n     [:b\n      {:style {:color styles/theme-cyan}}\n      (first children)] \" \"\n     (into\n       [:span]\n       (rest children))]))\n\n(defn admin-panel []\n  (let [can-see-admin-panel? (subscribe [:db/can-see-admin-panel?])\n        contrib-period (subscribe [:contribution/contrib-period])\n        enable-contrib-form (subscribe [:form.contribution/enable-contrib-period])\n        contrib-config (subscribe [:contribution/configuration])\n        contrib-period-status (subscribe [:contribution/current-contrib-period-status])\n        contrib-contract-dnt-balance (subscribe [:contribution/dnt-balance])]\n    (fn []\n      (let [{:keys [:contrib-period/start-time :contrib-period/end-time\n                    :contrib-period/soft-cap-amount :contrib-period/after-soft-cap-duration\n                    :contrib-period/hard-cap-amount :contrib-period/enabled?\n                    :contrib-period/stake :contrib-period/soft-cap-reached? :contrib-period/total-contributed\n                    :contrib-period/hard-cap-reached? :contrib-period/contributors-count]} @contrib-period\n            {:keys [:loading?]} @enable-contrib-form\n            {:keys [:contribution/stopped? :contribution/founder1 :contribution/founder2\n                    :contribution/early-sponsor :contribution/wallet :contribution/advisers\n                    :contribution-address dnt-token-address :dnt-token/transfers-enabled?]} @contrib-config]\n        (when @can-see-admin-panel?\n          [paper\n           [row-with-cols\n            [col\n             {:xs 12}\n             [:h1\n              {:style (merge styles/margin-bottom-gutter styles/text-center)}\n              \"Admin Panel\"]]\n            [col\n             {:xs 12\n              :style styles/margin-bottom-gutter}\n             [info-line \"Contribution Contract:\" [etherscan-link {:address contribution-address}]]\n             [info-line \"DNT Token Contract:\" [etherscan-link {:address dnt-token-address}]]\n             [info-line \"Founder 1:\" [etherscan-link {:address founder1}]]\n             [info-line \"Founder 2:\" [etherscan-link {:address founder2}]]\n             [info-line \"Early Sponsor:\" [etherscan-link {:address early-sponsor}]]\n             [info-line \"Wallet:\" [etherscan-link {:address wallet}]]\n             (for [[i adviser] (medley/indexed advisers)]\n               [info-line\n                {:key i}\n                (str (when (= adviser (last advisers)) \"Community \")\n                     \"Adviser \" (inc i) \":\") [etherscan-link {:address adviser}]])]\n            (when total-contributed\n              [col\n               {:xs 12}\n               [info-line \"Contribution Round:\" (inc constants/current-contrib-period)]\n               [info-line \"Start Time:\" (u/format-local-datetime start-time)]\n               [info-line \"End Time:\" (u/format-local-datetime end-time)]\n               [info-line \"Soft Cap:\" (u/format-eth-with-symbol soft-cap-amount)]\n               [info-line \"After Soft Cap Duration:\" (t/in-hours (t/seconds after-soft-cap-duration)) \" hours\"]\n               [info-line \"Hard Cap:\" (u/format-eth-with-symbol hard-cap-amount)]\n               [info-line \"Enabled?\" (u/bool->yes|no enabled?)]\n               [info-line \"Token Distribution:\" (u/format-dnt-with-symbol stake)]\n               [info-line \"Soft Cap Reached?\" (u/bool->yes|no soft-cap-reached?)]\n               [info-line \"Hard Cap Reached?\" (u/bool->yes|no hard-cap-reached?)]\n               [info-line \"Total Contributed:\" (u/format-eth-with-symbol total-contributed)]\n               [info-line \"Contributors Count:\" contributors-count]\n               [info-line \"Emergency stop?\" (u/bool->yes|no stopped?)]\n               [info-line \"Contribution Contract DNT Balance:\" (u/format-dnt-with-symbol @contrib-contract-dnt-balance)]\n               [info-line \"DNT Transfers Enabled?\" (u/bool->yes|no transfers-enabled?)]])]])))))\n\n(defn contribution-tile []\n  (let [xs-sm-width? (subscribe [:district0x/window-xs-sm-width?])]\n    (fn [{:keys [:title :index]} & children]\n      [col\n       {:xs 12 :md 4\n        :key index\n        :style {:padding-left 0\n                :padding-right 0}}\n       [:div\n        {:style (merge styles/stats-tile-title\n                       (if @xs-sm-width?\n                         (merge\n                           styles/margin-top-gutter-less\n                           styles/stats-tile-border-bottom\n                           {:margin-right 0 :margin-left 0})\n                         styles/stats-tile-border-bottom))}\n        title]\n       (into [row\n              {:middle \"xs\"\n               :center \"xs\"\n               :style (merge styles/stats-tile\n                             (when-not (= index 2)\n                               (if @xs-sm-width?\n                                 styles/stats-tile-border-bottom\n                                 styles/stats-tile-border-right)))}]\n             children)])))\n\n(def contrib-period-status->countdown-title\n  {:contrib-period-status/not-started \"Starts in\"\n   :contrib-period-status/running \"Ends in\"\n   :contrib-period-status/ended \"Ended\"})\n\n(def unit->name\n  {:days \"day\"\n   :hours \"hour\"\n   :minutes \"minute\"\n   :seconds \"second\"})\n\n(defn countdown-time-item [{:keys [:unit :value]}]\n  [:span\n   [:h1\n    {:style (merge styles/contrib-countdown-value\n                   styles/text-left)}\n    (if (< value 10)\n      (str 0 value)\n      value)]\n   [:span\n    {:style styles/contrib-countdown-unit}\n    \" \" (u/pluralize (unit->name unit) value)]])\n\n(defn- countdown []\n  (fn [{:keys [:from-time :to-time]}]\n    (when (and from-time to-time)\n      (let [{:keys [:days :hours :minutes :seconds]} (u/time-remaining from-time to-time)]\n        [:div\n         {:style {:margin-top \"-10px\"}}\n         [:div\n          {:style styles/no-wrap}\n          [countdown-time-item\n           {:value days\n            :unit :days}]\n          \" \"\n          [countdown-time-item\n           {:value hours\n            :unit :hours}]]\n         [:div\n          {:style styles/no-wrap}\n          [countdown-time-item\n           {:value minutes\n            :unit :minutes}]\n          \" \"\n          [countdown-time-item\n           {:value seconds\n            :unit :seconds}]]\n         [:div\n          {:style {:margin-top 5}}\n          (u/format-local-datetime to-time)]]))))\n\n(defn contribution-stats-tiles []\n  (let [xs-width? (subscribe [:district0x/window-xs-width?])\n        contrib-period (subscribe [:contribution/contrib-period])\n        contrib-period-status (subscribe [:contribution/current-contrib-period-status])\n        now (subscribe [:db/now])]\n    (fn []\n      (let [{:keys [:contrib-period/loading? :contrib-period/start-time :contrib-period/end-time\n                    :contrib-period/total-contributed :contrib-period/stake\n                    :contrib-period/contributors-count]} @contrib-period]\n        [row-with-cols\n         {:center \"xs\"}\n         [col\n          {:xs 12}\n          [:h1 {:style (merge styles/margin-bottom-gutter-more\n                              styles/text-center)}\n           \"Contribution Period \" (constants/contrib-period->name constants/current-contrib-period)]]\n         [contribution-tile\n          {:title (contrib-period-status->countdown-title @contrib-period-status)\n           :index 0}\n          (if (and start-time end-time)\n            (condp = @contrib-period-status\n              :contrib-period-status/not-started\n              [countdown\n               {:from-time @now\n                :to-time start-time}]\n\n              :contrib-period-status/running\n              [countdown\n               {:from-time @now\n                :to-time end-time}]\n\n              :contrib-period-status/ended\n              [:h1 (u/format-local-date end-time)])\n            [ui/circular-progress])]\n         [contribution-tile\n          {:title \"Raised\"\n           :index 1}\n          (if total-contributed\n            [row\n             {:middle \"xs\"\n              :center \"xs\"}\n             [:div\n              [:h1\n               {:style styles/stats-tile-amount}\n               (u/format-metric total-contributed)]\n              [:span {:style {:font-size \"1.2em\"}} \" ETH\"]]\n             [:h3\n              {:style styles/stats-tile-amount-subtitle}\n              contributors-count (u/pluralize \" participant\" contributors-count)]]\n            [ui/circular-progress])]\n         [contribution-tile\n          {:title \"Token Distribution\"\n           :index 2}\n          (if stake\n            [:div\n             [:h1\n              {:style styles/stats-tile-amount}\n              (/ stake 1000000) \" Mil\"]\n             [:h3\n              {:style styles/stats-tile-amount-subtitle}\n              \"DNT tokens\"]]\n            [ui/circular-progress])]]))))\n\n(defn contribution-soft-cap-progress []\n  (let [current-contrib-period (subscribe [:contribution/contrib-period])]\n    (fn []\n      (let [{:keys [:contrib-period/total-contributed :contrib-period/soft-cap-amount\n                    :contrib-period/after-soft-cap-duration :contrib-period/hard-cap-amount]} @current-contrib-period]\n        (when (and total-contributed soft-cap-amount after-soft-cap-duration)\n          [row\n           {:center \"xs\"\n            :style styles/margin-top-gutter-more}\n           (if (< total-contributed soft-cap-amount)\n             [:div\n              {:style styles/full-width}\n              [ui/linear-progress\n               {:mode \"determinate\"\n                :style styles/cap-progress\n                :color styles/theme-orange\n                :max soft-cap-amount\n                :value total-contributed}]\n              [:h3\n               {:style styles/full-width}\n               \"Soft Cap \" (js/parseInt total-contributed) \"/\" (or soft-cap-amount 0) \" ETH\"]\n              [:div\n               {:style (merge styles/full-width\n                              styles/fade-white-text)}\n               \"After soft cap is reached, the contribution period will be closed in \" (t/in-hours (t/seconds after-soft-cap-duration))\n               \" hours\" [:br]\n               \"In case of reaching \" (or hard-cap-amount 0) \" ETH hard cap, contribution period closes immediately\"]]\n             [:div\n              {:style styles/full-width}\n              [ui/linear-progress\n               {:mode \"determinate\"\n                :style styles/cap-progress\n                :color styles/theme-orange\n                :max hard-cap-amount\n                :value total-contributed}]\n              [:h3\n               {:style styles/full-width}\n               \"Hard Cap \" (js/parseInt total-contributed) \"/\" (or hard-cap-amount 0) \" ETH\"]\n              [:div\n               {:style (merge styles/full-width\n                              styles/fade-white-text)}\n               \"After hard cap is reached, no more contributions will be accepted\"]])])))))\n\n(defn- external-link [body href]\n  [:a\n   {:href href\n    :target :_blank\n    :style {:color styles/theme-green}}\n   body])\n\n(defn contribution-contribute-section []\n  (let [contribution-address (subscribe [:contribution-contract-address])\n        contribute-form (subscribe [:form.contribution/contribute])\n        can-use-form? (subscribe [:district0x/can-submit-into-blockchain?])\n        contrib-period-status (subscribe [:contribution/current-contrib-period-status])\n        current-contrib-period (subscribe [:contribution/contrib-period])\n        contrib-config (subscribe [:contribution/configuration])\n        confirmed-not-us-citizen? (subscribe [:confirmed-not-us-citizen?])\n        confirmed-terms? (subscribe [:confirmed-terms?])\n        confirmed-gas-price? (subscribe [:confirmed-gas-price?])\n        confirmed-compensation? (subscribe [:confirmed-compensation?])\n        confirmations-submitted? (subscribe [:confirmations-submitted?])\n        disallowed-country? (subscribe [:disallowed-country?])\n        ]\n    (fn []\n      (let [{:keys [:contrib-period/stake :contrib-period/enabled?]} @current-contrib-period\n            {:keys [:data :loading?]} @contribute-form\n            {:keys [:contribution/amount]} data\n            {:keys [:contribution/stopped? :contribution/max-gas-price]} @contrib-config\n            error-text (cond\n                         (not (u/non-neg-ether-value? amount)) \"This is not valid Ether value\"\n                         (< (u/parse-float amount) constants/min-contrib-amount) (str \"Minimum contribution amount is \"\n                                                                                      constants/min-contrib-amount\n                                                                                      \" ETH\"))]\n        [row\n         {:center \"xs\"\n          :style styles/margin-top-gutter-more}\n         (if @disallowed-country?\n           [:div \"We have detected that you are visiting this page from the United States or another unpermitted country. Please note: US citizens and residents are not permitted to participate in the district0x Contribution Period.\"]\n           (if @confirmations-submitted?\n             [:div\n              [:h2\n               {:style (merge styles/full-width\n                              styles/margin-bottom-gutter-less)}\n               \"How to Contribute\"]\n              [:div\n               {:style (merge\n                         {:color styles/theme-orange\n                          :font-size \"1em\"}\n                         styles/margin-bottom-gutter-less)}\n               [:b\n                \"Important: Maximum allowed gas price is \" (web3/from-wei max-gas-price :gwei) \" Gwei \"\n                \"(\" max-gas-price \" wei).\" [:br]\n                \"Recommended gas limit is 200000\" [:br]\n                (if stopped?\n                  \"Contribution was temporarily paused due to emergency\"\n                  ({:contrib-period-status/not-started \"Contribution period has not started yet\"\n                    :contrib-period-status/ended \"Contribution period has been finished\"}\n                    @contrib-period-status))]]\n              [:div\n               {:style styles/full-width}\n               \"You can send Ether directly to contribution smart contract at\"]\n              [:h1\n               {:style (merge styles/full-width\n                              styles/margin-top-gutter-less\n                              {:color styles/theme-green\n                               :font-family \"filson-soft, sans-serif\"})}\n               \"district.eth\" [:br]\n               [:span {:style {:font-size \"0.7em\"}} @contribution-address]]\n              [:div\n               {:style (merge styles/full-width\n                              styles/margin-top-gutter-less)}\n               \"or you can use following form by using \" [external-link \"MetaMask\" \"https://metamask.io/\"] \", \"\n               [external-link \"Mist\" \"https://github.com/ethereum/mist\"] \", or \"\n               [external-link \"Parity\" \"https://parity.io/\"]]\n              [row\n               {:style styles/full-width\n                :middle \"xs\"\n                :center \"xs\"}\n               [ui/text-field\n                {:floating-label-fixed true\n                 :floating-label-text \"Amount in Ether\"\n                 :default-value amount\n                 :style (merge {:margin-left styles/desktop-gutter-mini\n                                :margin-right styles/desktop-gutter-mini}\n                               styles/margin-bottom-gutter-less)\n                 :error-text error-text\n                 :error-style styles/text-left\n                 :disabled (or (= :contrib-period-status/ended @contrib-period-status)\n                               (not enabled?)\n                               stopped?)\n                 :on-change #(dispatch [:district0x.form/set-value :form.contribution/contribute :default :contribution/amount %2])}]\n               (if-not loading?\n                 [ui/raised-button\n                  {:primary true\n                   :label \"Send\"\n                   :disabled (or (not @can-use-form?)\n                                 (boolean error-text)\n                                 (= :contrib-period-status/ended @contrib-period-status)\n                                 (not enabled?)\n                                 stopped?)\n                   :style {:margin-left styles/desktop-gutter-mini\n                           :margin-right styles/desktop-gutter-mini\n                           :margin-top 20}\n                   :on-touch-tap #(dispatch [:contribution/contribute data])}]\n                 [:div\n                  {:style {:margin-top 20\n                           :margin-left styles/desktop-gutter-mini\n                           :margin-right styles/desktop-gutter-mini\n                           :width 88}}\n                  [ui/circular-progress\n                   {:size 30\n                    :thickness 2}]])]\n              [:div\n               {:style (merge styles/full-width)}\n               \"For detailed instructions watch our \"\n               [external-link \"tutorials on Youtube\" \"https://www.youtube.com/channel/UCQq0INymkcGDYYXeFZgYk4g\"]]]\n             [:div\n              {:style styles/full-width}\n              [:h2\n               {:style (merge styles/full-width\n                              styles/margin-bottom-gutter)}\n               \"Before You Contribute\"]\n              [row\n               {:center \"xs\"\n                :style styles/full-width}\n               [:div\n                {:style styles/text-left}\n                [ui/checkbox\n                 {:label \"I confirm that I have read and agree to the Contribution Terms.\"\n                  :checked @confirmed-terms?\n                  :on-check #(dispatch [:set-confirmation :confirmed-terms? %2])}]\n                [ui/checkbox\n                 {:label \"I confirm that I am not a citizen or resident of the United States or other unpermitted country.\"\n                  :checked @confirmed-not-us-citizen?\n                  :on-check #(dispatch [:set-confirmation :confirmed-not-us-citizen? %2])}]\n                [ui/checkbox\n                 {:label (r/as-element [:span \"I understand \"\n                                        [:b \"the maximum gas price when contributing is 50 Gwei\"]\n                                        \" and any transaction sent with a higher gas price will be rejected.\"])\n                  :checked @confirmed-gas-price?\n                  :on-check #(dispatch [:set-confirmation :confirmed-gas-price? %2])}]\n                [ui/checkbox\n                 {:label \"I understand that it may take up to 7 days from the time the contribution period ends to receive DNT.\"\n                  :checked @confirmed-compensation?\n                  :on-check #(dispatch [:set-confirmation :confirmed-compensation? %2])}]]\n               [:div\n                {:style styles/full-width}\n                [ui/raised-button\n                 {:primary true\n                  :label \"Continue\"\n                  :style styles/margin-top-gutter-less\n                  :disabled (or (not @confirmed-terms?)\n                                (not @confirmed-not-us-citizen?)\n                                (not @confirmed-gas-price?)\n                                (not @confirmed-compensation?))\n                  :on-touch-tap #(dispatch [:set-confirmation :confirmations-submitted? true])}]]]]))\n         (when stake\n           [:div\n            [:div\n             {:style styles/distribution-note}\n             \"Please note: \" (u/format-eth stake) \" DNT tokens will be divided and distributed amongst all\n            participants \" [:b \"after the contribution period ends\"] \". Each participant will receive an allocation\n            proportional to the amount they contributed, relative to the total collected.\"]\n            [:div\n             {:style (merge styles/full-width\n                            styles/margin-top-gutter)}\n             [:a {:href \"https://district0x.io/docs/district0x-terms.pdf\"\n                  :target :_blank\n                  :style styles/contrib-terms-link}\n              \"Contribution Terms\"]]])\n         [:small\n          {:style (merge styles/full-width\n                         styles/fade-white-text\n                         styles/margin-top-gutter\n                         styles/margin-bottom-gutter-mini)}\n          \"Copyright © 2017 district0x\"]\n         [:div\n          {:style styles/full-width}\n          [:img {:src \"./images/district0x-logo-title-white.svg\"\n                 :style {:height 15}}]]]))))\n\n(defn contribution-panel []\n  [paper\n   [contribution-stats-tiles]\n   [contribution-soft-cap-progress]\n   [contribution-contribute-section]])\n\n(defn logo []\n  [:a\n   {:href \"https://district0x.io\"}\n   [:img\n    {:style styles/logo\n     :src \"./images/district0x-logo.svg\"}]])\n\n(defn main-panel []\n  (let [connection-error? (subscribe [:district0x/blockchain-connection-error?])\n        snackbar (subscribe [:district0x/snackbar])\n        contracts-not-found? (subscribe [:district0x/contracts-not-found?])\n        xs-width? (subscribe [:district0x/window-xs-width?])]\n    (fn []\n      [misc/main-panel\n       {:mui-theme styles/mui-theme}\n       [:div\n        {:style {:padding-bottom 20\n                 :overflow :hidden\n                 :position :relative\n                 :min-height \"100%\"}}\n        [:img {:src \"./images/green-blob2.svg\"\n               :style styles/blob4}]\n        [:img {:src \"./images/cyan-blob.svg\"\n               :style styles/blob1}]\n        [:img {:src \"./images/green-blob1.svg\"\n               :style styles/blob2}]\n        [:img {:src \"./images/green-blobs.svg\"\n               :style styles/blob3}]\n        [ui/app-bar\n         {:show-menu-icon-button false\n          :style styles/app-bar\n          :title (r/as-element [logo])\n          :icon-element-right (r/as-element [app-bar-right-elements])}]\n        [:div {:style (merge styles/content-wrap\n                             (when @xs-width?\n                               (styles/padding-all styles/desktop-gutter-mini)))}\n         (if @contracts-not-found?\n           [contracts-not-found-page]\n           [center-layout\n            [contribution-panel]\n            [admin-panel]])]]])))"
  },
  {
    "path": "src/cljs/contribution/constants.cljs",
    "content": "(ns contribution.constants)\n(def community-advisors\n  [[\"0x7e41aAa3623668e5D7D01B9b0340E65b515f3c83\" 31000]\n   [\"0x841B0c3D98b7714c8b4a4c2312369E94AeC70f12\" 1000]\n   [\"0xA7921Bb5389368C3B9C55605826Ed5c7656F0313\" 1000]\n   [\"0xeE2E0E56e11faE260f3DE0D6767fc1e970FC69D3\" 5000]\n   [\"0x00467579A3108e72d324771a66f2821f6bc6e61C\" 1000]\n   [\"0x5C681875A0ef659D6d97Bc51c077783Db474dE47\" 1000]\n   [\"0xc5f444774a79A772a7F4f20fFFe8c2dCB4115Ee1\" 1000]\n   [\"0x0025a54871Dc1FBa33da0212453094f73Cf64066\" 1000]\n   [\"0xC146a306CfC988a9fCB817dcaB3D1D0e0854CCD9\" 1000]\n   [\"0xeE00F786C1799C82e7cb6292B1b96282b3C83ba2\" 1000]\n   [\"0xB7f1498898d70685851B5331F64bF26215f00415\" 1000]\n   [\"0xbd74F047cD88C3fCF52e47dE7Ae33c0fe40f33CD\" 1000]\n   [\"0xd5FBD35C713178C4aC9d432528Bf8De747CbbdAF\" 5000]\n   [\"0xb5A378c1Fd1F31f1077C89f448deE3488d81669D\" 1000]\n   [\"0x16f4C2c13A6BceEdbd14e1A55E5A4c1Ac872Ee38\" 1000]\n   [\"0xe5D93Dd474988B60b354339DA3a845D9cd35ec5F\" 2000]\n   [\"0xd98b8BA6bEcf3694A8BDeBA0c9e9B1918E5C0CD8\" 1000]\n   [\"0xBF9B1c552C1fDEeDcB6a05F5C3db563bBE10B4bb\" 1000]\n   [\"0x5C71ded941d0377dd85F36EE23DDCa7BE7C8aC31\" 150000]\n   [\"0x8C74EA7ad4e91390028fFefE46eD21D0DCd54A6A\" 1000]\n   [\"0x762039f76394c51aa421B17832d3b9b6A39c9d3F\" 1000]\n   [\"0x6e611765F7e2dB91e7876CBe683EFbe6393831a8\" 1000]\n   [\"0x08D298D08bf9Ae07F000d3dFAFa3370169882d57\" 1000]\n   [\"0x00ae0c1fd293038C2b24a715E6fAbAcDa6012b55\" 1000]\n   [\"0x007ED64aC2fE49e1bcb932151e72dE0ca813ECF8\" 1000]\n   [\"0x041DeDfeC783D8D6D8BD4f81Cb3675042151184D\" 1000]\n   [\"0xb45489842B2F99e96f66a6eB486ae9c4F54A47c9\" 1000]\n   [\"0x0fa38abec02bd4dbb87f189df50b674b9db0b468\" 1000]\n   [\"0x3463DE8E9F42798C75492fE26273680F0fF0262C\" 1000]\n   [\"0x46e886aE3DF8835F3aBb7310b667A91CdD7ddBaf\" 1000]\n   [\"0x3EfEA862207f970a42e3DD2F31C9A29d3eF770Ac\" 1000]\n   [\"0x5cb479DB92Ce3572383837c9775639dC373e4194\" 1000]\n   [\"0xfF5166e66E389e07A50bc8232eB9Dc5a52Dc190b\" 1000]\n   [\"0x4219791C5a6832c6475f51BAe55f49D59Fb4c3Bd\" 1000]\n   [\"0x7c2be906222F1353D566c67A15Cc01a29c28DB84\" 1000]\n   [\"0x66E8F875C6840aDEf012320Fb50C7e3264F321ec\" 1000]\n   [\"0x244E9b38FC1c655de53A8ba5A4760F6E8001403b\" 1000]\n   [\"0x660Ac3F4D700d7618Bb81aD68087eae967E996Ec\" 1000]\n   [\"0x3Bb65357828Bd88457DA57cC7f144D004d3B036B\" 1000]\n   [\"0x019EdcB493Bd91e2b25b70f26D5d9041Fd7EF946\" 1000]\n   [\"0x70f421ca5D3263e82c155075a14EbCB7e5336643\" 1000]\n   [\"0x1a716E83DbE858B34E7Fb1441fF9B8dbfa0c2BF4\" 1000]\n   [\"0x0ddF6E4172fDd4D0389De04Bd440330FFC0eB96E\" 1000]\n   [\"0x0061b82814878024452427f8087733aE46a5a61a\" 20500]\n   [\"0x60819bb1DC2E213c4D9Ca008882b7180A93B9c66\" 1000]\n   [\"0x48A473FEC94704B1a5Ceb7459d4E21Ce1f5580fC\" 1000]\n   [\"0x52bB24A71aAb5f2DC01Aa1C8730aa27d9548Cd3a\" 1000]\n   [\"0x0ae2e95ab1610cd35285bdb268d94b3f078e6b36\" 1000]\n   [\"0x700694817BB4C7431ee19b51a002b062C6De7F80\" 1000]\n   [\"0xc83585b0Bf139A392069eE22C14dd4D64D26079A\" 3000]\n   [\"0x869e5B1bA479179f97D110D1D87f8E6dc7eB64Ae\" 1000]\n   [\"0xbb36D3465D8afae08B08CB59eF389Cc9387eFf38\" 1000]\n   [\"0x0e0CD189eC770A2814E78c9c9b022abdd5174723\" 1000]\n   [\"0x6F9cb16EBcEB99cf88ac97c3E35698E0e3D48F47\" 1000]\n   [\"0xE8Dde5cb737ad170Ed6349f958AF393368e7a36a\" 1000]\n   [\"0x6a297d402907dC13D292000feD490099024C822a\" 1000]\n   [\"0x2d3Dd55e97A9C8F07245eEb62846868990C258d6\" 1000]\n   [\"0x177CB7154f67EBbA46a2d3553c47D90A6E28A2dA\" 1000]\n   [\"0xae93A6CFb842495e38e7150c095B7c34D6485C82\" 1000]\n   [\"0x9cbb422df9f16B925dD1fd48b82073Be4f740496\" 1000]\n   [\"0x00eD1C405c08c87FDCd6C8A323180b82180A5730\" 1000]\n   [\"0x906277eec52171EC7911f0ecfB54C74D9dE3F905\" 1000]\n   [\"0x701d0ECB3BA780De7b2b36789aEC4493A426010a\" 1000]\n   [\"0xc31Bcd3Fd846518B91669727de9cb8fccF07bCba\" 1000]\n   [\"0x0B8C767a91DdbE99ABA14685d03B14D4265c1E5B\" 1000]\n   [\"0x2D99B9B9Afc29dC2caB888C1E7928C7b131e4656\" 1000]\n   [\"0x624DAeF5eA222Aad86d1a17EF72728169bDB360d\" 61000]\n   [\"0x290Dbf7EB51324266F0668675a2a230d250b293C\" 1000]\n   [\"0xa049C647eb5Ad083dD3Fb06d2a43Dbde30532072\" 1000]\n   [\"0x2FB7206c0C2d2fa10BB9880f9Ff42177117713Cc\" 1000]\n   [\"0x440c7EFe7fDD489c39B12ad0Fb8A8263c062ca72\" 1000]\n   [\"0x82b3B3FfFD8680967305DeBf1816fe49b090670D\" 1000]\n   [\"0xBffB814b73801Ff822427a3d8B902dbc8fFb5F93\" 1000]\n   [\"0x69a7EA4c2e935c8c34B9C99d72Db71508F09AeBe\" 1000]\n   [\"0xCb0ff21Aaf4CBC57B1B7EfBADbbd96D16ff50E57\" 1000]\n   [\"0x7dD16CCa04E09C925D248AefEDa0c37cB76c7E16\" 1000]\n   [\"0xc6Bffd211f37e24f9e870d4827C683B0a28B832e\" 1000]\n   [\"0xd36eA428FF8796f94Aec58A063500023525A1201\" 1000]\n   [\"0x03118e02cE007a0F0d1C9D806c2a7D5Ae2F26995\" 3000]\n   [\"0x95A998c9af7b9199Ad9b117613be2Ad2b8eEd7e9\" 1000]\n   [\"0xD9459cc85E78e0336aDb349EAbF257Dbaf9d5a2B\" 1000]\n   [\"0xC49827499FD8dEebD14f6AC117022C99F99a2Ddc\" 1000]\n   [\"0x51A125F89CBE0bFBFD62FeE8a750AAeC8fabC441\" 10000]\n   [\"0xb6b81bbFE61a1Cf3F9a8E8514D5E0F7200CfCcA2\" 1000]\n   [\"0x7dAfD53AEE8982aB1D767830c2fe50f62E3a98E6\" 2000]\n   [\"0x7863FDcF1E54d0F442e663152F6ab2d8Bb98aDCF\" 21000]\n   [\"0xc0B8705d2c92D7AfAD37cf7885b19eA60a9a1a71\" 1000]\n   [\"0x2A8392859b3eF08659af44fBCABaD3BDE170f4C7\" 1000]\n   [\"0x21Ac5f731b2AaFb6d7CcD20c1a70d5dFE320AEeb\" 6000]\n   [\"0xf705CeB0f8b700d98978D5fC91F7705169e3e60e\" 1000]\n   [\"0x665EaD9D831423e362D11BEaE3b9Dba380B8083A\" 1000]\n   [\"0xDf40059dA4DdD74fEECE3f9c5Da76F8C3317F24f\" 1000]\n   [\"0xa463F6edB92a2D7b9c90afc20a5Ce2116a945164\" 1000]\n   [\"0x48ED6904Ce56349FBE802552e8E892c9500A22C3\" 1000]\n   [\"0xb8a444F67d8d5e83425073dc05BbE3EBBf0b73Ad\" 1000]\n   [\"0x84433D07A273a82626A3c7f4Fd6b7e44505Ec4F1\" 1000]\n   [\"0xeaa40F6B29CE35d8F53f6bF9b2A7397E3D8475Af\" 1000]\n   [\"0x5B17e67DAD94A65759B2e9555D8dA6A2B8db6BE7\" 1000]\n   [\"0x611ec96B4dF9c8bbDB0258858C8451cAFedfDA34\" 1000]\n   [\"0x7b486037E66eF9fB05aB44aaf905931Ba31539Aa\" 3000]\n   [\"0x00a44164C421f4013d2E2E2e1CaeDA2A4763f386\" 1000]\n   [\"0x863Be577Ebff3fc3094cd6D91c8eFa54d077c821\" 1000]\n   [\"0x0f7ce02f8af040579eb7a93549bdcc965fa8eb7b\" 1000]\n   [\"0x7617236eA6eBf579F36169369AF41fa0D8116506\" 1000]\n   [\"0x007Dc7723F26b766c7bFE80764b004f5eDa03D78\" 5000]\n   [\"0x35700c4a7bd65048f01d6675f09d15771c0facd5\" 1000]\n   [\"0xf3B44AC5491E5349894D01532cDaeBa13311C041\" 1000]\n   [\"0x79EbC54E8550D61a20794e0501E3D4fA5fCE76c7\" 1000]\n   [\"0x55B39B67BB496B5E9F057Cde5E9F5173dCC66ADE\" 1000]\n   [\"0x01E2f9Ba53b6Cb91e7f158090D24ebBcAdF0C564\" 1000]\n   [\"0x564257bd12F17E3bcf0F3504FE0F5C8386254c39\" 1000]\n   [\"0x3BBb5a4b05B8241ebB268c605541580270A2f3f5\" 18000]\n   [\"0xe07449EF3ccEfAa15A29b66DE6634eB67229993e\" 1000]\n   [\"0xB7Fb1BE386067BCb9Bc7481271B12f7Ce86ac82e\" 1000]\n   [\"0x39f4662bf97200dbfa00ed05e3141c8959151cfa\" 3000]\n   [\"0x747a8161c3880C67B17e8e0E52b960C15520BE10\" 980000]\n   [\"0x792A57BE9b0E40E7bf2970Db901e5Ecd2DE30B7d\" 1000]\n   [\"0xDd3b9BE91EA4D427e62c3fA3f2B27b5290d98F1e\" 1000]\n   [\"0xa22D548B393736D0470584cCeE0cd59A90E15bBd\" 1000]\n   [\"0x20083892b34A049bFAE1B2a6b070a71525e0b41A\" 1000]\n   [\"0x1B5E3A4B53E1fFF879C718DE6afD45e4AFA6eF49\" 1000]\n   [\"0xbe1b723aCd1F47c1AACE1014d24F6e489D3bc47B\" 1000]\n   [\"0xa49b77305087d961612be78811c5d819928abef4\" 1000]\n   [\"0xEd8B951463de0f10ff74CacFAc612526417a9D16\" 200000]\n   [\"0xE5cbDF4d831fd46269c12ae2E4fB40606AF802aa\" 1000]\n   [\"0x67936306c1490db7c491b0fe56bcf067ede1fd28\" 1000]\n   [\"0x2322c22773C2d530dD5744A1Eea5a4be34c02dEA\" 3000]\n   [\"0xc5465016B1c5abe438C62118bFf457f35CAA7881\" 1000]\n   [\"0xA8E85dEe96F33Af3f5faae887dDf19260aDA2Ac7\" 1000]\n   [\"0x98D5F2d180a811e1Ef17a2b3D501242d0a714eE7\" 1000]\n   [\"0x0a94bcc0D0eC042CeD861d4D228bf8414B1d2956\" 1000]\n   [\"0xE82522a784346926cf745605748d184Fae902727\" 3000]\n   [\"0x00C4904FB17A6eCBfACb609273c89791aBA0a5cd\" 3000]\n   [\"0x95c96042D5d3941DeB785EbabD313EB317717E45\" 1000]\n   [\"0x26272474F4Bb38C04B1Bf1d9Fde567A578df7855\" 2000]\n   [\"0xfF5Bd27500868847d996919aCEeD56a3C5E9D0e8\" 1000]\n   [\"0x9CE315b846c211a05f9DE5578C74b875De470783\" 1000]\n   [\"0xbCCc76522169bF83078aee30a509c32909D9AEa2\" 1000]\n   [\"0x44C11Cf55b968eaE9F81044dcE6d6CBF15D36Bc8\" 5000]\n   [\"0x00272A739927F587E2762D8BC77020B76BF73640\" 5000]\n   [\"0xd5d28bbe1d2563addFaB1900F9dD7778cA515A9e\" 5000]\n   [\"0xa5ed3807e915973d11947E26E742b6d6b8d05506\" 20000]\n   [\"0x2C3F19eF4C6149cDdB84f8afbC4CA25e1FDB8926\" 1000]\n   [\"0xd7fbb6b4D57e22fb34b7E30955791f7F06Ad92d2\" 1000]\n   [\"0x1fA5Ec2f206Ea8fAf6c6D4919808339d3af3855D\" 1000]\n   [\"0x560241585CBeDbEBDf105c53C291d7914110D495\" 1000]\n   [\"0xe32c8561C14f5fCc6a4d4310cd866Ae48aAdd533\" 1000]\n   [\"0xA5D9e7032d1A5656E2Ed80Bc6a716d57265141db\" 2000]\n   [\"0x9cd6a59a40b7a88512999afc90220e5942e182ac\" 1000]\n   [\"0xf16CFD73Fe21E1d2ffdC68C6348489AD917e8546\" 3000]\n   [\"0x04b2986CEb58f87AE37267d36d666a1fC4894900\" 10000]\n   [\"0xE73A1998cE936AceBEb7899D790a7a69c541b695\" 10000]\n   [\"0x9e3bdfdf5b93832639ddfcb6f78b9fdc22788f5a\" 1000]\n   [\"0xbb7730b90273D8ccd1Df142C712a864f4401CC78\" 1000]\n   [\"0x00694C41975E95e435461192aBb86C56A3c2e66f\" 1000]\n   [\"0x1E5E067B27ee101828364a6c542315a41A748cf8\" 1000]\n   [\"0x28C2897122286A35738413E264942a781AF5c06A\" 1000]\n   [\"0x0070Cfc95E4A24d8d43c5CF32390931439535227\" 1000]\n   [\"0x7976B95F1C30725F25A2ee922c68a86a90Ff624C\" 1000]\n   [\"0x1BD54855eF94cC9813B23464C6bC8afaa1a639e3\" 1000]\n   [\"0x8E765AF6b5366A1c073600c1951C8998BF11ffa2\" 1000]\n   [\"0x8FDa6640F52631253521D4605969cb92cA7BE94b\" 1000]\n   [\"0xeB99C5E24011222F2e19a964939bb7B54fEcA22d\" 3000]\n   [\"0xF34c0e5346cF57867A661e6B34ede6135d38bb85\" 1000]\n   [\"0x7d97994332cd2d191845859b6d6F6D2270ECa45B\" 1000]\n   [\"0xAff4f80ED19fA3b5856472362d77Dc87061aB932\" 1000]\n   [\"0xf74c902f38e25a50464cccd24fdf94438dbd5d24\" 1000]\n   [\"0xE71E66E9A1a53dBB9488C50b5bc08289afEF85f5\" 1000]\n   [\"0x4eF6f3A56Ce63753EE82DD6e6654EaB912F7cECd\" 5000]\n   [\"0xE5228908E0b5084af3dC95641F5b8055dd15edcd\" 1000]\n   [\"0x8C0f64DdB364072ac54a5E5aC26F1ff1ACda38fc\" 1000]\n   [\"0x2a57B99146fd06976C45F937604F0a19041938EA\" 3000]\n   [\"0x839395e20bbB182fa440d08F850E6c7A8f6F0780\" 50000]\n   [\"0x1DBA1131000664b884A1Ba238464159892252D3a\" 50000]\n   [\"0x9082e0eAc4B7D13F6Db1259dfC8829859ED90329\" 1000]\n   [\"0x25619749e040dec6a6832d60d228f867dd77c35d\" 1000]\n   [\"0xeC92519007b823765664Beac13eFAF630C263316\" 1000]\n   [\"0xF38852A25c1e3557D876e88E2FEE3522eFe03E96\" 1000]\n   [\"0x6C22fa46Cb7FABd775bb0c4E13948e75Aa458a60\" 1000]\n   [\"0x00049808dcce781C7FD603B9a2563c0932Ef6d29\" 1000]\n   [\"0x0a417Def3B61404122c7580bfF82dc97E8a86D85\" 150000]\n   [\"0x1Fd717A0AD0d3A163Fc7359c449A4a8490866Ce6\" 2000]\n   [\"0x6cF4240145eFBF5a9Df664b6AaD55dc736DB037F\" 1000]\n   [\"0xf8536CA7a25CBF70DF754fA310079aDa4c6114C2\" 10000]\n   [\"0xf94eB69bcA6Eac9b97AFd1147C5B2Fa12e6D011B\" 50000]\n   [\"0x0DE3145a2174608A7E389892b3Db1c9A3DE3DE1A\" 1000]\n   [\"0x2fd4EC45ec04d33127E59CDfF2be4AC6d0B8C976\" 2000]\n   [\"0x8911323De6b42df0bb9bD43d21e1D2E0C9236839\" 5000]\n   [\"0x9C520c675BEB6eA07Aaf6F850a6Bc4Cd0724b015\" 2000]\n   [\"0xdC1Fe37a00909ad34A827A377eBC184b897b8910\" 1000]\n   [\"0xB7FeA0028b8EC4a0B651B060f58565EB6C57D507\" 1000]\n   [\"0xB2839c0Fb42E66D8bAE27C2A0EAE5807e95e612A\" 1000]\n   [\"0x4Ce0dadfCE28845aAF6812E5520f1F6c6406C72F\" 1000]\n   [\"0x3eA10564417AdB679d149c2F4A3D118b0123e72D\" 1000]\n   [\"0xf5a2cd399fb938b7fe2fce58b98b98b279a6ca63\" 1000]\n   [\"0xeBe2c382b36145b8A4B37141CB141fd7d0B602A9\" 1000]\n   [\"0x42C051538ae4d9523F910AB2Db41bF798f0DB344\" 1000]\n   [\"0x441D034A49c17D079eFd70D477A180969b7fDa77\" 1000]\n   [\"0xd4499ded424CA4d068D2f6B5eCf3d645D8e166ea\" 1000]\n   [\"0x1141640AE469E5A9C99184AA4Cd55EE6C00fb4d2\" 1000]\n   [\"0x3Ab76b9AF7da268A2dcAE0c2241fC37654d6DBea\" 1000]\n   [\"0x4C1dD69120E1C82126677A6D30C2b61fec49cDd6\" 1000]\n   [\"0x4161e7f10852b74713099Ca1a0Bd47fe341e5B52\" 1000]\n   [\"0x2ee16239cfefc5e5f657e0aecc53b3643656dfa9\" 1000]\n   [\"0xe9aaD3b8C643263935b45f74d0A5494ED5eF4AD7\" 1000]\n   [\"0xe35c3F2211F9A0dC3883338Bc50A84DD16cb4cc2\" 1000]\n   [\"0xeD523745Ac4D3b9313045C7d2238EdC2dFf50781\" 1000]\n   [\"0xD9f3465E42B5F0eC627A156FB158b32Bc828CBB\" 5000]\n   [\"0xaaE140fC38c11d085c14B38b0B9524DF6702bFFF\" 1000]\n   [\"0x35ccE922b335aCe829A07F75Da01678a5931Eb3e\" 1000]\n   [\"0x73a95DCa7522b9319a46f723Db44AF0c2F2cCe7c\" 1000]\n   [\"0x1ad89A2B5537feF9799B64469E5f712F2d01a43E\" 1000]\n   [\"0x6395DFf5ae32bEfaefA4CD6689E7Ed7CE5208069\" 1000]\n   [\"0x442a1C75d6751F1E6b3C944C608336b41Bc9E696\" 1000]\n   [\"0xDF90a56FeDE1dD8c2F89060dc8d649CAe1A026fC\" 1000]\n   [\"0x24Cb28f325A9CE3C27D746e70Edeb9643f37c86E\" 1000]\n   [\"0x0646F493FAC83c393A3b3B76669b52eDE6Ec5774\" 1000]\n   [\"0x3215c214229e2310b0beb3a5b798849dd0882d28\" 1000]\n   [\"0x812585402c94D4a4Fe0fa98FC05a4c2A404B05A7\" 1000]\n   [\"0x1021F3AA2F1e8aBcf01c374305022b4B6e62135b\" 1000]\n   [\"0xaaE140fC38c11d085c14B38b0B9524DF6702bFFF\" 3000]\n   [\"0xA26776bC0d2079e550987F351969C727925FF6f9\" 3000]\n   [\"0xa0298d6163B8f1d2594CB7C0dFa5359d4238f696\" 1000]\n   [\"0x7AE7D714f5CF94A0DE58B178ecDbaaFE22482653\" 1000]\n   [\"0xF19C090d039d08D85fA81f2b4095b9Fa66Aa8ea7\" 1000]\n   [\"0x44010C025AE15838B92a43cA80BFAC1270888aAD\" 1000]\n   [\"0x057b0175E2eD09CA783BC33C48cF31615B233692\" 1000]\n   [\"0xF865a1226351A0C88e2497E057DDdBe5577D9852\" 1000]\n   [\"0x185c742082316a46C0736c16F75332126F9c43d3\" 1000]\n   [\"0x2aC079a959e3ca41B2cd5457b07930ABEB800943\" 1000]\n   [\"0x0b738a03c82E6f06B723B6f4719581270E1477E6\" 1000]\n   [\"0xE79E4a95dD61ca9E6ffD8821054a3745a229E33d\" 25000]\n   [\"0x266DaF2B2c0F120A86F84f8190bdd0a264A62FE6\" 1000]\n   [\"0xfC8b7d3405F68B07A84CC24caF79430f06618D8d\" 1000]\n   [\"0xE72CE789BF6393771aa454e09Cd5be9715a83474\" 1000]\n   [\"0x6E258688b739ebdB1F2Dcc4fbf7D96d0fa6Cacff\" 36000]\n   [\"0x3ceBA254Ee10D70c1657F961D38423c65B0Ac9Fe\" 3000]\n   [\"0x2a30Ac28acaAb47CC7B186a9cf6545FCD8ABC11F\" 1000]\n   [\"0x15ff63d544ecB4a24969121b2F3239867D4F18E4\" 1000]\n   [\"0xCC5479F7A6Cd4dCAA0F0fEd16E7952709ba1dC09\" 1000]\n   [\"0x4b4BA59C1EaDaF4ce367445fDDd4218728A47b6a\" 1000]\n   [\"0xe0c207F5c6Ab73C928a61F2b4B046cB86ce993dd\" 1000]\n   [\"0x8e283225172CA64bfd44AC8D27CCf8728f5c2735\" 1000]\n   [\"0x79b458A7abD79B5046a85Da12a1612e81678e7D9\" 1000]\n   [\"0x4B00c6555ea388E9d881FF349256F0A4092F64e4\" 1000]\n   [\"0x15EF0B50823C0c96EF201CB418E3785F6b8D7D59\" 1000]\n   [\"0xfC8b7d3405F68B07A84CC24caF79430f06618D8d\" 1000]\n   [\"0xA7bd17Ac3082a281FfAa2730f361E5c596224eaa\" 1000]\n   [\"0x0a4231157671A451F1919d87f38bd0C307A0960F\" 1000]\n   [\"0x8D32b2E44A3F9565c2Ed2FfDAFf7dB5D8212710a\" 1000]\n   [\"0xc9D3879c3427aFd6E0cB83488Ff2000bDeb24Bc6\" 1000]\n   [\"0x90cc6AD2f24209a127dD6247bf68acC0a453f2BF\" 1000]\n   [\"0xe3517ae43529EF5243B1Ca137eAc764e66914871\" 1000]\n   [\"0xc893c331A99Ec7A0CC186DFeD7F1F6E06a1A943F\" 1000]\n   [\"0x88Bdb0aeC80e001738c101d111EE035F1eaC0D95\" 2000]\n   [\"0x3592C46b40123Dd9ac242e37a94F4C8C082df439\" 2000]\n   [\"0x6F0bECd0348CacAe43Ecd0f09805885675F51124\" 2000]\n   [\"0xfa9150a1CFC22b18c93ef7A51fB2B1B8f48D1fdB\" 1000]\n   [\"0xd046Cd27126d4f22C83Ba1d7C393d9b9A976f269\" 1000]\n   [\"0xAe16d2f23e2389D3E60345AF20631Db806024C16\" 1000]\n   [\"0x1aAa2834c52CFB38D035F328A0037E53A5fF7509\" 1000]\n   [\"0xfC8b7d3405F68B07A84CC24caF79430f06618D8d\" 1000]\n   [\"0xffb5d974cba1e8c3761427f017c9666c9f14c32b\" 10000]\n   [\"0x06c1ca9861fc6DD78cF0Cf7381Ebd2B8254CaA1d\" 1000]\n   [\"0xF7FC28C321fd17B8972BC2b2F53AaC7a22Ad228E\" 1000]\n   [\"0x42c163Eff7D309425487CE50a9f4cB91DA19e4d1\" 1000]\n   [\"0x019a5e8314d7273640cEf5675Cbfee834F4020C5\" 1000]\n   [\"0x5108c73F481E8B6381AaA73325111EA6bFFfDa2f\" 1000]\n   [\"0xDb25E5f07d8607823Fe76407046B0e469aCA164d\" 1000]\n   [\"0xc8f1E7FF0E5066C8d8638575dBaD7CB261f19819\" 1000]\n   [\"0x395f111e7dAE03BD7246b592be279ab344964dA5\" 2000]\n   [\"0x4549DF8057aa166368aAAb2fe7af0AC2F1B6B01E\" 1000]\n   [\"0x6765579e9750670d5bF03F4DAcCF21aFd691b0cF\" 1000]\n   [\"0x8B0BCaf9f6c7b18810Eb412E08241659a20aDfd7\" 1000]\n   [\"0xe675ECCf6C1D8Cfa2c3Ae29fa2AA325e2918d72e\" 1000]\n   [\"0xd3AeA8b3db93F641fB0E2E51Fb41050e788412F7\" 5000]\n   [\"0x24D39ecbDbBf850A13BD281827CFe6ada211b175\" 1000]\n   [\"0xEd289a040f4e80FdD8D1065Eb9F4482b5bEe7A60\" 1000]\n   [\"0xb93c1b96200f765D71f219A3Fa7CdCe0b7A1DA9b\" 1000]\n   [\"0x9971DAA66B451338A2D6934D795549dbacD189E1\" 1000]\n   [\"0x309DA4AD891E21b1527AF45a802fcAf97bd1e380\" 1000]\n   [\"0xa91A30500A60258dC83F08bD7E29086F19E75E10\" 1000]\n   [\"0x403629f0616767e437973323d2f0d3Ceb845f3a1\" 1000]\n   [\"0xabb4639de78e88dabf47b8d659574dd660ffbb2c\" 1000]\n   [\"0x3b630662cf15B0280A45bE85f1a175D5D8ED4939\" 1000]\n   [\"0x106C21874eaA24d3bF34139281Ae5f1a82A101b6\" 3000]\n   [\"0xA7Fd4bAfcF05DE525Dc7f235301FC7D15B1022A9\" 1000]\n   [\"0xdd12d76573bffdd7e1e70359eb65e83910a0f35e\" 1000]\n   [\"0x9c2238E76e267912EDB7817ce2C6E13468759110\" 8000]\n   [\"0x583a22c4B14ae27ff4d25e9F1a2448ea9cce199a\" 3000]\n   [\"0x2666Efbc740C0c57fd99B30cbe5132f934525637\" 1000]\n   [\"0x252d3363191138D74bD017Bb81a9F1d64f5fcc0a\" 1000]\n   [\"0x8635E9bBB8d628958787c227db6A3E070B9429dC\" 1000]\n   [\"0x001A8821F547B1311dDbe86Bb59976ef66536fbB\" 1000]\n   [\"0xb1b49Cd4Df741C883073c4f54f23921d6f2662C8\" 1000]\n   [\"0x3eC827A91F8600c5e7D5a86Cdf9a0b913d84b6e6\" 1000]\n   [\"0xc8e7E9B4335Ec38b1eF2c72274eBc530bb806B3c\" 1000]\n   [\"0xACFe2fDdd3Ff10A5f9b0b2bbb581BdeCB8EA0287\" 1000]\n   [\"0x44EC996aBF893285D567178149060B377BBC0151\" 1000]\n   [\"0x0BF816Df8b8ad5b08490741B2b02b9C8b961CfE1\" 1000]\n   [\"0xFd2262c369636E1c295C9aBA4CaD67316FBa74A2\" 1000]\n   [\"0xc46D4a8737CedE0556425c8F346B48F75E0Dc741\" 1000]\n   [\"0x00EA29cB2e2Ca58eC093BDC2C1400E91594609Cc\" 50000]\n   [\"0xbBF8A5f7eC330ED877129e8195C72b521560158c\" 1000]\n   [\"0xF04bA1E22Bf1d8819e373C2022861df56f60cB6c\" 1000]\n   [\"0x8966FD4A3091C8c031F53Ad150a68D9235265EA7\" 1000]\n   [\"0xf9e6341904be225154CdeC72B432AA3C67ad752B\" 1000]\n   [\"0xd06CdbE139750F820B7E2298488B27E2e67f3B33\" 1000]\n   [\"0x3EEBe3856B9a54276FEA2DF57934312F65f2E119\" 1000]\n   [\"0x1297ac9bc3D892b647c9FE1f22E470560D711cA8\" 1000]\n   [\"0x602889A6F2797451e30aFA98B508A404695a7e86\" 1000]\n   [\"0x47f05aFF6ED5CADDb2332E9E48f64d62A5ad8Fe2\" 1000]\n   [\"0x4D93604b66261116c9aac3E5d3e954BfEadA3a5D\" 1000]\n   [\"0xa7ade07e80cf242dce085e545069b11c32fcc56e\" 1000]\n   [\"0xd5ff18c05fb0aa587aadef87c8a8facc0d417b9a\" 1000]\n   [\"0x6667273b97886f6583065c38e4732fc8b5e24ec5\" 1000]\n   [\"0x6ed95B6fc786D426789Ff42b7d754fC26667bfAc\" 1000]\n   [\"0x8bc1ab6fc6524335d723611b85a9f57ff6d3fcd3\" 1000]\n   [\"0xa790266590062Aec36Fb3AAD7Bb4C0868C6AC992\" 1000]\n   [\"0x30398e0f9e53475eefb5d60a52a048a2dc47709a\" 1000]\n   [\"0xA9e2eFFBb7006c9E380FBda884EE316fC40F9cDD\" 1000]\n   [\"0xA5F67CB29799087c817D1a7B76925e81b4be7f05\" 1000]\n   [\"0x6308f9536c177059cFc4D78a1c8814a128Ce29D9\" 1000]\n   [\"0x672f37e959Cc3606F4b95024feAe16135F2A93B7\" 1000]\n   [\"0xcF876a3deF89b6e3DE37974190C843A83ACF090e\" 1000]\n   [\"0xFFf94042354Cf1ffEEC622E4563774390c999dC8\" 1000]\n   [\"0x2ba61dA3E9b2eB86879373EE337C1730990BacEA\" 1000]\n   [\"0x156a58E7ed33baeb566c38caa200707E7daBfAe0\" 1000]\n   [\"0x65ed0C1Ead5383988e556027Ac81F1acAD8d6A10\" 1000]\n   [\"0xCA55BF46a8A01A283144F56C80c775b1f7786d9d\" 1000]\n   [\"0x90e7aA0a9f37fa3930c1D33D57893E3372C84773\" 1000]\n   [\"0x7e229c415ef56f8ea9ccca7291e88f0b3fa2bdcc\" 1000]\n   [\"0xe4ef526473accbfc617451010beb5fbd68fe816d\" 1000]\n   [\"0x5e51f674239f938110417a75e3f89d03d566b9ed\" 1000]\n   [\"0x2e3313F1A506645c45E8d4ea27a25d8bA8d7eB9d\" 1000]\n   [\"0x6957945e80280e63c8C51e54f2992e1E81DeCe84\" 1000]\n   [\"0xF6284C62E081873dE747434EA38aD04559965DD9\" 1000]\n   [\"0x072C075612aF238B2184CdcBc379B78eC048F918\" 1000]\n   [\"0xdeE26DF7De15319697EcD1f81Ac374Ff0Bc06E09\" 10000]\n   [\"0x8d2548cec0ac6807c0131e33360ad6e1332fe929\" 1000]\n   [\"0x85c7716158d1050c918eb5859c5219fac0665eb7\" 1000]\n   [\"0x509cfBd419e63264d4D92a39B414f2a8531dB0dc\" 1000]\n   [\"0x430A499f2E0028C76618b3436BeD0952EB33bb6a\" 3000]\n   [\"0x78CAc1584824dd9633d71f9EF41B56e6AA9927c0\" 1000]\n   [\"0xB7BE0712d6ea427cE952539B52B0d10ea9a994b4\" 1000]\n   [\"0xA85469B4c350D5177bA6657e138051a5C8171871\" 1000]\n   [\"0x3aA2b7D989bD4145cF01c5f8e0710edCb9d7D0bB\" 1000]\n   [\"0xaa8c09A4eD08B97F5886E067eA203656639ADfBc\" 3000]\n   [\"0x23CC9a102eEe541d468B5F55d6dE1753fB245430\" 1000]\n   [\"0x89628723da5101fcA70B4CA4dCB68A920ddC5A71\" 1000]\n   [\"0x29367119856D241A401C79ED75571c323cF8373C\" 1000]\n   [\"0xef44F365384ad909A3a885dc577d191b92292ba4\" 1000]\n   [\"0x6e1323eF2554633375dC1D81696F9BA6fB18A2F5\" 1000]\n   [\"0x8CD0C09B71a76298cE90459524883663C88D063F\" 1000]\n   [\"0x924De4EFaC18ed4460C0b93d3bF726788E1a3F22\" 1000]\n   [\"0xd9Cc2C57eb932E276B6663D55CdA63015d6801f9\" 1000]\n   [\"0xf21749506CDC7C684b096bA172c99A8878a816FB\" 5000]\n   [\"0xb8E1302A3390221A5375359E2Bb5f3f692725F46\" 1000]\n   [\"0x5B62c6a32B64473C7Fb0bd94003990270E33eE9C\" 1000]\n   [\"0x5210c0C80f14D07E415ad2d0A5A0AdDD16daB4c8\" 1000]\n   [\"0x03b12981Ef4dF9bd810Ae12C53230BE9848AE5A5\" 1000]\n   [\"0x7Ee084006b6Aea591DA21E26444915Fb57Ed647E\" 1000]\n   [\"0xe6a024916a1936307Ea728A8F085d409ae5ecb10\" 1000]\n   [\"0x1151D9EDA4d6415b57851F39894c0bC69134e86C\" 1000]\n   [\"0x53e49353D37ad53CafFB4698CD9B7d831f55F707\" 1000]\n   [\"0x9df1FCB2dcCA866bEdfb6514d3D5a1eBD522A544\" 1000]\n   [\"0x1f05235F421c8CAe10CB593a1b4eAb2B17e4596a\" 1000]\n   [\"0xcfd0055e61e4061052b77e51c8ce58e7a390bb90\" 1000]\n   [\"0xF932b570f399fE46534613B16c9BB5744678a895\" 1000]\n   [\"0xD38828D80aC4E5CF5F4A102494816945Ea37FB7B\" 1000]\n   [\"0x9ceb60c1A364771a22e5707e137d168016c813DA\" 1000]\n   [\"0xD6386Eff8a91ab3350E0A8009A9fF919484FB4AA\" 1000]\n   [\"0x7E5d729704263f71D82fe2F8fC127526dddbC36C\" 1000]\n   [\"0xeBcf2E9FAacB281c947A81759847139AE0Ad3992\" 1000]\n   [\"0xa10Ce005fcdb49Ab04E05fdFE15539deef774fF3\" 1000]\n   [\"0xc49d1085e06a93cD0F95dbD3C4e270Db7aB8f572\" 1000]\n   [\"0xfB8FE962bE318fbB420ebA2D78E36836AE5Cef61\" 1000]\n   [\"0x310Bc5f5746f7749eCdBBa01B4EAbC6F1A9a0E18\" 1000]\n   [\"0x394B6a2a8ebc8Da4716F67a5F61ebe6f8d31C50A\" 1000]\n   [\"0xb56E0bd6900311Db57e6D32e56F2bc995a1D1318\" 1000]\n   [\"0xD4072DccceF9e050d29043e680f2574868C31021\" 1000]\n   [\"0xdb4a0e45C50bF078f4e03d4C761F893184154977\" 1000]\n   [\"0x814e400a8e169C736de1c620d7a84C43ef1b46F4\" 1000]\n   [\"0x12040482Ab34ACbB440b17c64e7EB72253FD1401\" 1000]\n   [\"0x910418Bc7839A456ba268E1D891d43AC6DD51AD6\" 1000]\n   [\"0x83e5Df6fcC22e54Fcf9370FE4437c9cf251bCd54\" 10000]\n   [\"0x65fac207ee655c873b5dcaae9a8d4140b15ec81e\" 10000]\n   [\"0x7eB1e9267Ab19cefE7Dc068Be6c8f9dE42b0d85E\" 12000]\n   [\"0x16C321252E56d1245151496D2F7FA4F4e8a3acdC\" 1000]\n   [\"0x779a5D022ABf5A747194BB83cf2eF6B27cd1c48A\" 1000]\n   [\"0xB4B9FAB079D452bd446F49C275417eF545F85BE7\" 1000]\n   [\"0xD0d9754b02Cc1BA92217cC648B921e631f4C2e4f\" 1000]\n   [\"0xF2f962ad05aEe8069B6e1e2AcE6E0C4b1414dF97\" 1000]\n   [\"0xa8FF6589eE19df43D6580905Bf275DAb75Cf987B\" 1000]\n   [\"0x1C609b9F8C77BF015dE1634De3Bd6158f091Bb4C\" 1000]\n   [\"0x6C441eBA0ac23897B58c342f36a2D9a214593DdB\" 1000]\n   [\"0x2F5C6A70c961EBc59DC943E4875af66318C4d75D\" 1000]\n   [\"0x7D10aDDBb705e42cF68b07bb45C755E2Cff0ED1D\" 1000]\n   [\"0xEd5830604989CcE0D9A3E97ECD84f3a66Df93bFe\" 1000]\n   [\"0x335096bCAf8F2DFcB7506C01Ea00a5eec259a22b\" 1000]\n   [\"0xCc6EAC5155D1eEaB6987b9efD791377Fd7C5539C\" 1000]\n   [\"0xd17597f94ac4841ad8f24a2c222a3a056ad2116a\" 25000]\n   [\"0xA43680F8E8694bedE9F2050920C2bfcb8687329c\" 1000]\n   [\"0xbD6221808d98b601d343aC0aC7C0379F28399bde\" 1000]\n   [\"0xE49eA037c47F4eb9b6e434B65902B759FDB08Bbe\" 1000]\n   [\"0xcCE3F30cfEC3c5F090F0a8C94d8ca0e87be78879\" 1000]\n   [\"0x87e6a0974B08Cd7156884912C5c63d30Ae2AFC1e\" 1000]\n   [\"0xa8B4d876cDB3dD4f066FD830A21464daf8857c80\" 1000]\n   [\"0x015E395AaA541574ea7b33A7803F67374C11c129\" 1000]\n   [\"0x06905127EcB3f59c46a468489e5b262d7AfCc2e8\" 50000]\n   [\"0xE4fbfe78a6F1Facb2D39141016a9A631F96b4F53\" 1000]\n   [\"0xa2dEE84501a30b5847EcfEf8DB22a726EE911346\" 1000]\n   [\"0x7ABCcb7afc349851d2f4E1D31A1f9DBd0e5F2F45\" 1000]\n   [\"0xb305B0840c376CEB4176a0916b2593dE10abF8ee\" 1000]\n   [\"0x904587Bb327E7a2CF439fA8606E4c9535FDC40Ae\" 1000]\n   [\"0x92a5646e085051a8cC4a36a4CE9268AF223f0D4c\" 1000]\n   [\"0xE6A9B3D0C232B5866ba0b90F0e3711AeF6E1D382\" 1000]\n   [\"0xE6d80aC0aEb167DE108cfCf735e3FBD66DbB5802\" 1000]\n   [\"0x00304C9D754Fa9B897Aa655D531AE125b7a12108\" 1000]\n   [\"0xA92b2b995a6a09097a243dEbD79DcFC2B46848Ed\" 1000]\n   [\"0xfD82A5b995ffF8FB85a01f4498994541a1d8eE60\" 10000]\n   [\"0x19E580c6230b9194A7A0935ed4217CfFe8278adF\" 1000]\n   [\"0x6E04454F2bb9D04F505C8b775E2e68cFc95F46D2\" 5000]\n   [\"0x5C35A34977f83E049bd699e2481e21D116223B04\" 1000]\n   [\"0x382bFcFf04b65E31CDD3f4310ad144C6905ED1cD\" 1000]\n   [\"0x5457c5dd2c611c3E99902EAE1e89041bafF32a85\" 1000]\n   [\"0xc008C29303b26f59453e9d79F37160909105250F\" 1000]\n   [\"0x3785d73c25C4c08dC2c40fbA1CC845Fdc2210732\" 1000]\n   [\"0x09ECb548371278A4fEE5E8e9B9bF1596F85d02c8\" 1000]\n   [\"0xE3E3C3540FD428Aeb5828DFc2F6Fea7d20ebDF33\" 1000]\n   [\"0x7Da722723897049fbe7d25cC1661102DE3fAf94E\" 1000]\n   [\"0x0b48689A46F89b8149851021666CEa967902fc0C\" 1000]\n   [\"0x6CF176CfcC5b82D5b14af25CF09bf3D6D37E1716\" 1000]\n   [\"0xFfa6ADEC873c41f08d6D28d8f4eb978f968969f3\" 1000]\n   [\"0x83e5Df6fcC22e54Fcf9370FE4437c9cf251bCd54\" 1000]\n   [\"0xea9C95FB771De9e1E19aA25cA2E190aE96466CDD\" 5000]\n   [\"0x41E53CD6Eb57CDb25ACE7eeBd212178cD358D48e\" 1000]\n   [\"0xfb4abAe409A373d1994c62Dc0461a35b3c1B4089\" 1000]\n   [\"0xC714d192D3904784137bDD316C423463aba0cEfc\" 1000]\n   [\"0x2116Bc455dDf345539a738fdE43ABb63e6B0061C\" 1000]\n   [\"0x88F78B27B0eaB9cB2f9108808070C7aa1E6A88b8\" 5000]\n   [\"0xaf24Ba021B3e8D3a13b4691a2B0828dCd811545E\" 50000]\n   [\"0xB7426E85Ca3eC67a009d30558062dda387cDb412\" 50000]\n   [\"0x745E6bDDD3024E73daEc30d883A0A4e21D728cD9\" 1000]\n   [\"0x59207cFeDa73D3B9Cb297d187446C7189D8e2bDC\" 5000]\n   [\"0xd26bE7916836AECA8a7Cb41ef2f1e4299469f35D\" 1000]\n   [\"0xFf628FCfAcd51760Dc145a8eC55fffd80749dbB9\" 1000]\n   [\"0x7Da2eb91C6403d15e52Cba9539d4Bdec97c131dF\" 1000]\n   [\"0x13a7D67c2228bA500375E4Ec78c9cd724B008491\" 1000]\n   [\"0xC351Ff80e9F1Fb8ea0D3d6520DF678C6db9790C4\" 1000]\n   [\"0xc7f148f442d5d76F2831A3053033E56F7A7573d3\" 1000]\n   [\"0x7417030fD93C026b0735270f7a41B847044A637d\" 1000]\n   [\"0x04a883fc7a3090d11B76601ae636F399fa747A51\" 1000]\n   [\"0x0fA1f9E6B02d69Dd873bdC0dda9d8FfEa944F987\" 1000]\n   [\"0xA6C1c8522B90138fc04eDFd3F8659210a710df81\" 1000]\n   [\"0x9be64EC6D716699aBaE0661B6bd5602a3e38130A\" 1000]\n   [\"0x37b9907d267Ad0D852A0490e77d37BE9A896c4A0\" 1000]\n   [\"0x15E6a4EF615198d25a34DAFAe24446011400bedD\" 1000]\n   [\"0x2A3bD9c6012920b7986da963C2244E3BEEdbaB1a\" 1000]\n   [\"0xCF9b27Ff5A8a2B3E9048F833eA2E320B99Dd86BB\" 1000]\n   [\"0xa59959D7DaaD25fd25781b7CEBcfd4303434e868\" 1000]\n   [\"0x837259709B34FB0f1AEFA1644441057502998521\" 1000]\n   [\"0x25864Cb83dccA71583E2958c52FCc5d9ADB6e4FC\" 1000]\n   [\"0x8f6C1E30079535e45900Fd525fFA8BA1225F0EE8\" 1000]\n   [\"0x13A33bB5321c1cb27C3F7011A9fFf1Dd5E660e74\" 1000]\n   [\"0x9ca99bC90bc7C8F393848f4ff220e57202949654\" 1000]\n   [\"0xa06d7BA83c7489716c9bA4429766D5Db8DeDC942\" 1000]\n   [\"0x466Ad15Bfb27463BC2852f5fb925Cd2124495f06\" 1000]\n   [\"0x08b55C4D3b0959D6F11fB3534970357765E16495\" 1000]\n   [\"0xFE9f5d39BEcb99Ec713F46d9a55459A164ed95BE\" 1000]\n   [\"0x45578b6c87d2B3981ab05dc149d360b92F4BeF3B\" 1000]\n   [\"0x555084d6417304347357339300ca56016cc73290\" 1000]\n   [\"0xFF8536eDDaD144A0005Cd6f34999A11a9A871DdF\" 15000]\n   [\"0x2a84327E76f1C68FB6Ac9fCfc994cdc98fffc76F\" 1000]\n   [\"0x0033e959d6e2574282B66071c4bA2fc01A338bA6\" 15000]\n   [\"0xEB8664FCAc34e577D8A0C2FbF6d7AF68439FCC0C\" 1000]\n   [\"0xDCb7f959d492Cd0E9441915dF1fEc58c7a6ECd93\" 1000]\n   [\"0xf20D4dEe4E2E56768BA21Ed9edf6D95714F92993\" 1000]\n   [\"0x54243AcE4f7B5f333090da5725082D857f914A18\" 1000]\n   [\"0xfee48cEc41f071Bc462507d1E2fDa9B2fADB39C2\" 1000]\n   [\"0x31fbdf54Ac00C6fE001aff1Bba93739289f066D3\" 1000]\n   [\"0x0b4a9B08a05f5f0eeC936F3Bc8C259aCc1a24E8F\" 1000]\n   [\"0x5B2E26c8d575F4E251142F2aD55510DAf2A89Ac7\" 1000]\n   [\"0x9AA14a368D4bBdfA1Ae52BE735e90b34B251A120\" 2000]\n   [\"0xc7fCEc0f33AB7a589c3E6D615d0aA19283D2ae6e\" 1000]\n   [\"0xcea47EbD1e877fc651e72004e6C2F8bA8Bff3bC9\" 1000]\n   [\"0x758f338534754eE7ea76a234332BA5EB695B2347\" 1000]\n   [\"0xEdA350347cc954E219a70dc43a20426C98e4C0Be\" 1000]\n   [\"0x826D4e2FcC0EeFC0De0DEaa868431d68f3004aC5\" 1000]\n   [\"0x6d25A6343d3c9c0943F310aFBbD33D9Fa241E702\" 1000]\n   [\"0xf25f1E156b5D329389eD7641A7a7012eAeb3172f\" 1000]\n   [\"0x68583fe6A4c0E5De31EA6bdF352D8E5E897A6bB7\" 1000]\n   [\"0x0801e3D533fA36BB5845994CB9b1869746d17DD7\" 1000]\n   [\"0xd1108AD0B6B5e4b9017a545a6f808b2D0386d150\" 1000]\n   [\"0xa75F95A04aa938B091e86cA5ca06A2d7d912173F\" 1000]\n   [\"0x456D5C6c0322869e0e2beaad13819e7CA55D8006\" 1000]\n   [\"0x1e1cCD5EC07e2D63e50ef2b183B66dB444C9f845\" 5000]\n   [\"0xF8be4E6e786c4248b6dF08c5B766d786AE905B36\" 1000]\n   [\"0xA28891F13275138e0b79569dD20D51e968827Cc1\" 2000]\n   [\"0xCD41D02BDc943C3d8122C7fbCbb6487c642078A2\" 10000]\n   [\"0x30b7908a77c07d1aE480d26D5039Ed01049AE1bf\" 1000]\n   [\"0xDBfd04666F46Fc8CCadA187AD5Ecb736c0d09657\" 1000]\n   [\"0x00ed6b3e01d2edafdefe598a7d962bbc7526629b\" 5000]\n   [\"0x8A0bd511E47070cf9E358cb7754b9ceB56213c56\" 1000]\n   [\"0xCF4173e010fC0C8dA4ba7443a7D5F52694Eb3928\" 1000]\n   [\"0x7ec7b7FE8F255B3909313A37DdbFf407BF56F29e\" 5000]\n   [\"0xDEd0a02807B8241703E2509A1Eaa2CC160bA53f1\" 5000]\n   [\"0xae17ebd7f3bb7f74340647f68304fba0dcb7aa1d\" 10000]\n   [\"0x0033e959d6e2574282B66071c4bA2fc01A338bA6\" 5000]\n   [\"0x1B55887509d4d07965e20842cddaA1B1C4AD559c\" 5000]\n   [\"0x01c68DE2A7A84BF0A58797C53aa91F08cF2A6cBf\" 5000]\n   [\"0x6350632F0c38eF922EA2Eea20006779724eF0858\" 7500]\n   [\"0x5cdc87001DD04b8A1257FdacfA67ae4d7F26B33a\" 10000]\n   [\"0x0984274936F54ab6D34B6E4c1A8aAA92416e5cfe\" 10000]\n   [\"0xc3B329f42CdB787c6600f7aE73632c037728c0a4\" 5000]\n   [\"0x1F58868b6fA873739A07cB8D0412108Dc3B01733\" 25000]\n   [\"0x3ac6cb2ccfd8c8aae3ba31d7ed44c20d241b16a4\" 25000]\n   [\"0xa1C78ED146a8693A8cF3d29385BC54Cd3F145B4a\" 10000]\n   [\"0x0d3A9470b55bb0131260b8d9941B37E6E35133aa\" 5000]\n   [\"0x5ed1ac26ee940a42207955e119d283ecfe18a477\" 25000]\n   [\"0x974c92f17621D11E60c724d193547b0533906191\" 25000]\n   [\"0x4838eab6f43841e0d233db4cea47bd64f614f0c5\" 25000]\n   [\"0xdA1F3a8603F8466Da8B4c95e8eFD8f87047467ac\" 2000]\n   [\"0xEB6A307fCA343e103A177Eb67644D7Ed790Fbb33\" 200000]\n   [\"0x8C3EaC201Ae1644eb6dA0F9318a2FF9C5F0c6D20\" 500000]\n   [\"0x5A1495fAB6a150D9D0989B49e69bcD24F5fc243d\" 1000]\n   [\"0xcdAA0072029E8c3e8C46c5Ed6c274cA6EA335a28\" 20000]\n   [\"0x0a417Def3B61404122c7580bfF82dc97E8a86D85\" 25000]\n   [\"0x000Fb8369677b3065dE5821a86Bc9551d5e5EAb9\" 10000]\n   [\"0xc71a4798DBB8b85Db9e1b697B233F826B4F93dde\" 10000]\n   [\"0x259fd04930947f4c12484d06e7251fcb38b57731\" 1000]\n   [\"0x45f95DcC43424D500eB2c9C3eEd0Ad4159AceD5d\" 10000]\n   [\"0x315A7B7160A12f036676a56B24e31B087387DA5d\" 5000]\n   [\"0x4166ec103ea48ebc4d4538ac0f810f3472a8225d\" 1000]\n   [\"0xd918219fd9bE2DE265438128988A0716C2BE1236\" 1000]\n   [\"0x9d0A1C5741b6013A1681594d74bB5387b4e0d7C4\" 1000]\n   [\"0xd4536721D929d66d645D6E6550aA06d8A82A95c6\" 1000]\n   [\"0x18Fa802F9AA92CFfbd45f51e208a7D636612d65a\" 1000]\n   [\"0x35854d221f0B2eDC4559e01e98f7De842C3e17d8\" 1000]\n   [\"0xa386563bf026eEBe096fe26acc6e80Ba84D213a2\" 1000]\n   [\"0x0EAC1BE5c2Bf16B9aE3DAd30F7815C466dB6Af8f\" 1000]\n   [\"0xCd45dC40b5BD52284bF57a6C5c0ab3AA2f94c205\" 1000]\n   [\"0xcA83fC54849e9a200b4401134B391E83b8D03ACF\" 1000]\n   [\"0xA2537C2c3B8539744E2a1182C90A2c2d65E74ea8\" 1000]\n   [\"0xa8c2c0007f4F50045241bF96aa1934B0ddA2528D\" 1000]\n   [\"0xf6Ecc169e4E30d0d85e7696746ca87f0740C02BF\" 1000]\n   [\"0x47dd3D9c9843f71eEDb4CdEA4ceB07E55B06adA0\" 1000]\n   [\"0x86b717A8E106Ab0A84b6e1a3E47aBc60F643C81a\" 1000]\n   [\"0x2Bc7e8EeC35CCB4644199Fd2C881eA8Da98a0cA9\" 1000]\n   [\"0x101f0D604623783A9194e4a03e149c83bD94ED9c\" 1000]\n   [\"0xfaE371BE58ce2199D48C9E2aa5f414dBE24b491d\" 1000]\n   [\"0x424ce77Aff0D95615dA060bD3f8D570F774d633b\" 1000]\n   [\"0xeAFEDde19F9c37e44f1Ec91487003Fdf895DdA3F\" 1000]\n   [\"0x19Df053d56649E0A8ec11DD468cE280CC0F1dda0\" 1000]\n   [\"0xE68eDa08389E8642E7b13Fc2e783f41150830a02\" 1000]\n   [\"0x5858121D4Ccbc8095699a927d27CCc4460B5011E\" 1000]\n   [\"0x9E10085270Ef7b0D2A9d2264803C295c545C81C1\" 1000]\n   [\"0x097Eb69CD700C252Ae55AB123013b46BF68028f9\" 1000]\n   [\"0xB00C946c53ab3b51F73C5DF7fcd10b39073e1790\" 1000]\n   [\"0x004DccdCCd989fE30Ebb6ABc304cEBeCa438fa2b\" 1000]\n   [\"0x09DB255Cd4e9927264391c87A6572338be33E08A\" 1000]\n   [\"0xA25f2D38cB91F53136C25E553641E341D1cbd07f\" 1000]\n   [\"0x7A33a5Bd15f3708dd0A8595b029D450fFcAa164f\" 1000]\n   [\"0xef6Fa7B0B45F0273e5CBF740A150C4b1fB3Ba74A\" 1000]\n   [\"0x8Fca7C9672c3C2db6FF538C858fEb66f6a90C6cc\" 1000]\n   [\"0xB50d87cfF0D1708ecc0d6E5dc83862013624888A\" 1000]\n   [\"0xb942eeE225766Db8180Fb3dd2CA00c3608BE0b8C\" 1000]\n   [\"0x8ae03Fa94a53128AeCaAA3dfFB87FcA97797c1F0\" 1000]\n   [\"0x949b82Dfc04558bC4D3CA033A1B194915a3A3bEE\" 1000]\n   [\"0x126B62835b53360F226BE5c1fcD45B168afcc916\" 1000]\n   [\"0xED2fd9b1bBb02a4cFa167942F771f7CFb522A0E6\" 1000]\n   [\"0x05FFDec848E8Ca0AB751748A2cE3bf6bbAB91b24\" 1000]\n   [\"0xcb584262393935eD3aCB5BeB81e2004a46A8482E\" 1000]\n   [\"0x423CFB62c6ec7165C98964e2AB3865234F774756\" 1000]\n   [\"0xA139E660CeF348d0e52bd2a5A280B663d8fd0379\" 1000]\n   [\"0x678498BADBE31D20F718A303E51324a6D039E7AF\" 1000]\n   [\"0x5bD4f1B3dd982DF217224B6c0967C700037a09be\" 1000]\n   [\"0xcd13DE3339c03e97b01aDC779962D4d64e066d8e\" 1000]\n   [\"0xA9501D1f52CA501ee432d62C6d89Cb77276FdfCe\" 1000]\n   [\"0x58650c16afbD187686aB4D55B4AD9bf6191fefF2\" 1000]\n   [\"0xfB9E00A0ADC832F82631a2D6f5467D802296249D\" 1000]\n   [\"0xacD4e2556b363C1720184ebae82137211a773642\" 1000]\n   [\"0x32bA4a7c41e164Cb6F9e6f406C2E35eC15db6Cd6\" 1000]\n   [\"0x76e5fFFc26386E4D617eD6DF7Be9596f4007fCae\" 1000]\n   [\"0x78508dEC3B3510B9f798693D6Df1b410CfC54280\" 1000]\n   [\"0xcFE0909Dc95c2b22510Ea81f648Efb4b63c8021a\" 1000]\n   [\"0xc1230cEe10dbbC41D9BB0D2df29603959c529419\" 1000]\n   [\"0x6413CEF9F62Dc527CD8d3B971AfC2113d92D9b10\" 1000]\n   [\"0x8FC70daAbDeFda552Ab7ddf089D2BfC6Cff17293\" 1000]\n   [\"0x54F4e0063437be30Ba989Fe323c39FF7E41BB073\" 1000]\n   [\"0x39de8D7AfA1Adb239fD1d59ACbb4CFdb87D3DCF6\" 1000]\n   [\"0xE333aa1E1230CC722309d8d5f7F65fE8684c883d\" 1000]\n   [\"0xAd4ecec26AeF498949e7eF64CC54372F1de52E51\" 1000]\n   [\"0xFE88DD131d675874d8475ED6d3E3e92993f76d51\" 1000]\n   [\"0x4a44dd1f701a90325513cad8a37d21f80dcc1da1\" 1000]\n   [\"0x3C6b29F10f977c3314C7B528673B697839d0E19B\" 1000]\n   [\"0x7E48aaCb783e1aA67A07CB8901067a2B03420c21\" 1000]\n   [\"0x19b8eeBEC2E7427955D3E8916a1A608D9813A608\" 1000]\n   [\"0xa4665c4524f09320b60f460c12DD943AacaD1b4b\" 1000]\n   [\"0xBDA8106d4339eAec2396CDDEb2B93092CF97Ef01\" 1000]\n   [\"0xA7d9c99De467C3558ADd28c057af8CeA9652395F\" 1000]\n   [\"0x7f73803778ffBB312C3DBB5C48bBe0D1044D2273\" 1000]\n   [\"0x4A70EE052822A4571642769dEed715D4bBABd3f8\" 1000]\n   [\"0xF4509b36Dd69BCFbD45D79e56FA9B526aaa47788\" 1000]\n   [\"0x3454319ba898F7ee3ab45409e1B415E8C16aCA3a\" 1000]\n   [\"0xAEe48570A037Ec2aCf8E7Cf4710EE5a936561704\" 1000]\n   [\"0x95f57d93effCfa494EB8d6F85d3f475107E0CE48\" 1000]\n   [\"0xb1FBEb3273ad482AD276d4CdCaE560CE80e41394\" 1000]\n   [\"0x989943F1DF0874e5735b6ec2fa4d221384CbB067\" 1000]\n   [\"0xAeA4F88b8EEfe2C197b9AFb1FC053909549008b5\" 1000]\n   [\"0xaB99F2AbA7d6CA4E61148a181036cfc84c680cb8\" 1000]\n   [\"0x04DDA39c62312aE8b23bB4C36a703576C009327B\" 1000]\n   [\"0x1d186680fea0c552ff4ed9F0bDCa1629e2EA1528\" 1000]\n   [\"0x2B1000e66185905359B64DF9f0c8fCFd5929E457\" 1000]\n   [\"0xa2781fbF8555cfAE3f98A213EE60AF17295aD156\" 1000]\n   [\"0xBc55Cd5499DC8034f3e98a31D44421e4B16D6CBB\" 1000]\n   [\"0x03439743652496291b17DDdBa5a93b9D8B9EB20D\" 1000]\n   [\"0x739bf345F9CDAD9A4F6b827299dcAe222695F7d6\" 1000]\n   [\"0xa3115D531b75BC72c796Af207192Fc960b615783\" 1000]\n   [\"0xcD34DDEBaC48186Af7EA4a14F817831F5c74D56A\" 1000]\n   [\"0x21Ec0929FEe996e938e3743B8d99dA877f80e748\" 1000]\n   [\"0xbf489d7A7F4fb6cc75B231d69b3F6480064bf5A5\" 1000]\n   [\"0x44E5030987cC08DdD4Ee77D76d1bA6424CAac5B4\" 1000]\n   [\"0x2827d3f9C39bA0507710A0D813f8A1b2EC9d3C07\" 1000]\n   [\"0x3C579133C724d42a557B3B8005C369d89a5d8BC7\" 1000]\n   [\"0x96605f38873b4B00F3F6b1D122FBC82293672Bc2\" 1000]\n   [\"0x70eb3bcecDC49615a805F8F0425E1AE2412De9a6\" 1000]\n   [\"0xFf06A94E171fe7f29C4635B89756e59E66F9eBd8\" 1000]\n   [\"0x766841734ef2a013374cb6E95458F498B9A617bC\" 1000]\n   [\"0xF6825F6B83677ed6353c31B01BCe8363a2cCdCF3\" 1000]\n   [\"0xC5EfE0F491aeb5D2E03143775f33135BE0CB9a31\" 5000]\n   [\"0x5bB91b0b19E06ee8411431726F0c9661b1782070\" 1000]\n   [\"0xcb1DDFcc09617aeb7E3bb4E58B2053B112324Ac1\" 1000]\n   [\"0x7A3D3C991506432e09E05dB9cBeE8329e1067cAd\" 1000]\n   [\"0xcaFe2a3a9a19F0E5D6A4A13620d6CB2a3a84cDF1\" 5000]\n   [\"0xFBBc28653b2eF52Cde4a781de4Fb3b42FD308D55\" 1000]\n   [\"0xd2E8bdCE6dc933eD4eEFcf7b069653F54823D3Fa\" 1000]\n   [\"0x964B2B8083c40BcEb551BEe229ad84723F39dbA9\" 1000]\n   [\"0x88E347aABCa0Ff031ef52937C6D56a7a6E4b0475\" 1000]\n   [\"0x5e9ea9d04bff6e5416e5cd59d750293d4e186639\" 5000]]\n  )\n\n(def community-advisors-hashmap\n  {\"0x9971DAA66B451338A2D6934D795549dbacD189E1\" 1000,\n   \"0xcCE3F30cfEC3c5F090F0a8C94d8ca0e87be78879\" 1000,\n   \"0xf94eB69bcA6Eac9b97AFd1147C5B2Fa12e6D011B\" 50000,\n   \"0x841B0c3D98b7714c8b4a4c2312369E94AeC70f12\" 1000,\n   \"0x1Fd717A0AD0d3A163Fc7359c449A4a8490866Ce6\" 2000,\n   \"0x266DaF2B2c0F120A86F84f8190bdd0a264A62FE6\" 1000,\n   \"0x01E2f9Ba53b6Cb91e7f158090D24ebBcAdF0C564\" 1000,\n   \"0xF4509b36Dd69BCFbD45D79e56FA9B526aaa47788\" 1000,\n   \"0x1297ac9bc3D892b647c9FE1f22E470560D711cA8\" 1000,\n   \"0x3215c214229e2310b0beb3a5b798849dd0882d28\" 1000,\n   \"0x7b486037E66eF9fB05aB44aaf905931Ba31539Aa\" 3000,\n   \"0xbd74F047cD88C3fCF52e47dE7Ae33c0fe40f33CD\" 1000,\n   \"0x48A473FEC94704B1a5Ceb7459d4E21Ce1f5580fC\" 1000,\n   \"0x00C4904FB17A6eCBfACb609273c89791aBA0a5cd\" 3000,\n   \"0xeE2E0E56e11faE260f3DE0D6767fc1e970FC69D3\" 5000,\n   \"0x156a58E7ed33baeb566c38caa200707E7daBfAe0\" 1000,\n   \"0x7D10aDDBb705e42cF68b07bb45C755E2Cff0ED1D\" 1000,\n   \"0xcd13DE3339c03e97b01aDC779962D4d64e066d8e\" 1000,\n   \"0x89628723da5101fcA70B4CA4dCB68A920ddC5A71\" 1000,\n   \"0x96605f38873b4B00F3F6b1D122FBC82293672Bc2\" 1000,\n   \"0xCF9b27Ff5A8a2B3E9048F833eA2E320B99Dd86BB\" 1000,\n   \"0x0d3A9470b55bb0131260b8d9941B37E6E35133aa\" 5000,\n   \"0x747a8161c3880C67B17e8e0E52b960C15520BE10\" 980000,\n   \"0xD9459cc85E78e0336aDb349EAbF257Dbaf9d5a2B\" 1000,\n   \"0xE5228908E0b5084af3dC95641F5b8055dd15edcd\" 1000,\n   \"0x66E8F875C6840aDEf012320Fb50C7e3264F321ec\" 1000,\n   \"0xeE00F786C1799C82e7cb6292B1b96282b3C83ba2\" 1000,\n   \"0x7A33a5Bd15f3708dd0A8595b029D450fFcAa164f\" 1000,\n   \"0xE79E4a95dD61ca9E6ffD8821054a3745a229E33d\" 25000,\n   \"0x0984274936F54ab6D34B6E4c1A8aAA92416e5cfe\" 10000,\n   \"0xFF8536eDDaD144A0005Cd6f34999A11a9A871DdF\" 15000,\n   \"0x6413CEF9F62Dc527CD8d3B971AfC2113d92D9b10\" 1000,\n   \"0x5457c5dd2c611c3E99902EAE1e89041bafF32a85\" 1000,\n   \"0x42C051538ae4d9523F910AB2Db41bF798f0DB344\" 1000,\n   \"0x964B2B8083c40BcEb551BEe229ad84723F39dbA9\" 1000,\n   \"0xFBBc28653b2eF52Cde4a781de4Fb3b42FD308D55\" 1000,\n   \"0xbBF8A5f7eC330ED877129e8195C72b521560158c\" 1000,\n   \"0x2C3F19eF4C6149cDdB84f8afbC4CA25e1FDB8926\" 1000,\n   \"0x244E9b38FC1c655de53A8ba5A4760F6E8001403b\" 1000,\n   \"0xc9D3879c3427aFd6E0cB83488Ff2000bDeb24Bc6\" 1000,\n   \"0x7AE7D714f5CF94A0DE58B178ecDbaaFE22482653\" 1000,\n   \"0xCd45dC40b5BD52284bF57a6C5c0ab3AA2f94c205\" 1000,\n   \"0x00eD1C405c08c87FDCd6C8A323180b82180A5730\" 1000,\n   \"0x5B2E26c8d575F4E251142F2aD55510DAf2A89Ac7\" 1000,\n   \"0x3EEBe3856B9a54276FEA2DF57934312F65f2E119\" 1000,\n   \"0x423CFB62c6ec7165C98964e2AB3865234F774756\" 1000,\n   \"0x54F4e0063437be30Ba989Fe323c39FF7E41BB073\" 1000,\n   \"0x177CB7154f67EBbA46a2d3553c47D90A6E28A2dA\" 1000,\n   \"0xa75F95A04aa938B091e86cA5ca06A2d7d912173F\" 1000,\n   \"0xd9Cc2C57eb932E276B6663D55CdA63015d6801f9\" 1000,\n   \"0x8C74EA7ad4e91390028fFefE46eD21D0DCd54A6A\" 1000,\n   \"0xA85469B4c350D5177bA6657e138051a5C8171871\" 1000,\n   \"0xd06CdbE139750F820B7E2298488B27E2e67f3B33\" 1000,\n   \"0xfaE371BE58ce2199D48C9E2aa5f414dBE24b491d\" 1000,\n   \"0x949b82Dfc04558bC4D3CA033A1B194915a3A3bEE\" 1000,\n   \"0xEB8664FCAc34e577D8A0C2FbF6d7AF68439FCC0C\" 1000,\n   \"0xC146a306CfC988a9fCB817dcaB3D1D0e0854CCD9\" 1000,\n   \"0x44C11Cf55b968eaE9F81044dcE6d6CBF15D36Bc8\" 5000,\n   \"0xe5D93Dd474988B60b354339DA3a845D9cd35ec5F\" 2000,\n   \"0xb1FBEb3273ad482AD276d4CdCaE560CE80e41394\" 1000,\n   \"0x25864Cb83dccA71583E2958c52FCc5d9ADB6e4FC\" 1000,\n   \"0xfa9150a1CFC22b18c93ef7A51fB2B1B8f48D1fdB\" 1000,\n   \"0x5108c73F481E8B6381AaA73325111EA6bFFfDa2f\" 1000,\n   \"0x44EC996aBF893285D567178149060B377BBC0151\" 1000,\n   \"0x7976B95F1C30725F25A2ee922c68a86a90Ff624C\" 1000,\n   \"0x442a1C75d6751F1E6b3C944C608336b41Bc9E696\" 1000,\n   \"0xb56E0bd6900311Db57e6D32e56F2bc995a1D1318\" 1000,\n   \"0x441D034A49c17D079eFd70D477A180969b7fDa77\" 1000,\n   \"0xa790266590062Aec36Fb3AAD7Bb4C0868C6AC992\" 1000,\n   \"0x9be64EC6D716699aBaE0661B6bd5602a3e38130A\" 1000,\n   \"0x39de8D7AfA1Adb239fD1d59ACbb4CFdb87D3DCF6\" 1000,\n   \"0xA7Fd4bAfcF05DE525Dc7f235301FC7D15B1022A9\" 1000,\n   \"0x7Da722723897049fbe7d25cC1661102DE3fAf94E\" 1000,\n   \"0xfb4abAe409A373d1994c62Dc0461a35b3c1B4089\" 1000,\n   \"0x2322c22773C2d530dD5744A1Eea5a4be34c02dEA\" 3000,\n   \"0xf20D4dEe4E2E56768BA21Ed9edf6D95714F92993\" 1000,\n   \"0x19Df053d56649E0A8ec11DD468cE280CC0F1dda0\" 1000,\n   \"0xaaE140fC38c11d085c14B38b0B9524DF6702bFFF\" 3000,\n   \"0x31fbdf54Ac00C6fE001aff1Bba93739289f066D3\" 1000,\n   \"0xF6284C62E081873dE747434EA38aD04559965DD9\" 1000,\n   \"0x00694C41975E95e435461192aBb86C56A3c2e66f\" 1000,\n   \"0x0801e3D533fA36BB5845994CB9b1869746d17DD7\" 1000,\n   \"0x0b738a03c82E6f06B723B6f4719581270E1477E6\" 1000,\n   \"0x403629f0616767e437973323d2f0d3Ceb845f3a1\" 1000,\n   \"0x0DE3145a2174608A7E389892b3Db1c9A3DE3DE1A\" 1000,\n   \"0x16C321252E56d1245151496D2F7FA4F4e8a3acdC\" 1000,\n   \"0x762039f76394c51aa421B17832d3b9b6A39c9d3F\" 1000,\n   \"0x701d0ECB3BA780De7b2b36789aEC4493A426010a\" 1000,\n   \"0x001A8821F547B1311dDbe86Bb59976ef66536fbB\" 1000,\n   \"0xc7fCEc0f33AB7a589c3E6D615d0aA19283D2ae6e\" 1000,\n   \"0xe9aaD3b8C643263935b45f74d0A5494ED5eF4AD7\" 1000,\n   \"0x78508dEC3B3510B9f798693D6Df1b410CfC54280\" 1000,\n   \"0x2a84327E76f1C68FB6Ac9fCfc994cdc98fffc76F\" 1000,\n   \"0x382bFcFf04b65E31CDD3f4310ad144C6905ED1cD\" 1000,\n   \"0xA5F67CB29799087c817D1a7B76925e81b4be7f05\" 1000,\n   \"0x2a30Ac28acaAb47CC7B186a9cf6545FCD8ABC11F\" 1000,\n   \"0xcb584262393935eD3aCB5BeB81e2004a46A8482E\" 1000,\n   \"0x6e611765F7e2dB91e7876CBe683EFbe6393831a8\" 1000,\n   \"0x1BD54855eF94cC9813B23464C6bC8afaa1a639e3\" 1000,\n   \"0x814e400a8e169C736de1c620d7a84C43ef1b46F4\" 1000,\n   \"0x45f95DcC43424D500eB2c9C3eEd0Ad4159AceD5d\" 10000,\n   \"0x6957945e80280e63c8C51e54f2992e1E81DeCe84\" 1000,\n   \"0x007Dc7723F26b766c7bFE80764b004f5eDa03D78\" 5000,\n   \"0x7Da2eb91C6403d15e52Cba9539d4Bdec97c131dF\" 1000,\n   \"0x00EA29cB2e2Ca58eC093BDC2C1400E91594609Cc\" 50000,\n   \"0xe0c207F5c6Ab73C928a61F2b4B046cB86ce993dd\" 1000,\n   \"0x904587Bb327E7a2CF439fA8606E4c9535FDC40Ae\" 1000,\n   \"0xeB99C5E24011222F2e19a964939bb7B54fEcA22d\" 3000,\n   \"0xa049C647eb5Ad083dD3Fb06d2a43Dbde30532072\" 1000,\n   \"0x660Ac3F4D700d7618Bb81aD68087eae967E996Ec\" 1000,\n   \"0xE5cbDF4d831fd46269c12ae2E4fB40606AF802aa\" 1000,\n   \"0x01c68DE2A7A84BF0A58797C53aa91F08cF2A6cBf\" 5000,\n   \"0xd3AeA8b3db93F641fB0E2E51Fb41050e788412F7\" 5000,\n   \"0xcb1DDFcc09617aeb7E3bb4E58B2053B112324Ac1\" 1000,\n   \"0x2A3bD9c6012920b7986da963C2244E3BEEdbaB1a\" 1000,\n   \"0x0033e959d6e2574282B66071c4bA2fc01A338bA6\" 20000,\n   \"0x6350632F0c38eF922EA2Eea20006779724eF0858\" 7500,\n   \"0x309DA4AD891E21b1527AF45a802fcAf97bd1e380\" 1000,\n   \"0xc5f444774a79A772a7F4f20fFFe8c2dCB4115Ee1\" 1000,\n   \"0x3454319ba898F7ee3ab45409e1B415E8C16aCA3a\" 1000,\n   \"0xb305B0840c376CEB4176a0916b2593dE10abF8ee\" 1000,\n   \"0xDEd0a02807B8241703E2509A1Eaa2CC160bA53f1\" 5000,\n   \"0xC5EfE0F491aeb5D2E03143775f33135BE0CB9a31\" 5000,\n   \"0x88F78B27B0eaB9cB2f9108808070C7aa1E6A88b8\" 5000,\n   \"0x83e5Df6fcC22e54Fcf9370FE4437c9cf251bCd54\" 11000,\n   \"0xbf489d7A7F4fb6cc75B231d69b3F6480064bf5A5\" 1000,\n   \"0x87e6a0974B08Cd7156884912C5c63d30Ae2AFC1e\" 1000,\n   \"0xAEe48570A037Ec2aCf8E7Cf4710EE5a936561704\" 1000,\n   \"0x335096bCAf8F2DFcB7506C01Ea00a5eec259a22b\" 1000,\n   \"0xe07449EF3ccEfAa15A29b66DE6634eB67229993e\" 1000,\n   \"0xdeE26DF7De15319697EcD1f81Ac374Ff0Bc06E09\" 10000,\n   \"0x126B62835b53360F226BE5c1fcD45B168afcc916\" 1000,\n   \"0xe35c3F2211F9A0dC3883338Bc50A84DD16cb4cc2\" 1000,\n   \"0x430A499f2E0028C76618b3436BeD0952EB33bb6a\" 3000,\n   \"0x60819bb1DC2E213c4D9Ca008882b7180A93B9c66\" 1000,\n   \"0xc1230cEe10dbbC41D9BB0D2df29603959c529419\" 1000,\n   \"0x48ED6904Ce56349FBE802552e8E892c9500A22C3\" 1000,\n   \"0xd7fbb6b4D57e22fb34b7E30955791f7F06Ad92d2\" 1000,\n   \"0xa8FF6589eE19df43D6580905Bf275DAb75Cf987B\" 1000,\n   \"0x259fd04930947f4c12484d06e7251fcb38b57731\" 1000,\n   \"0xB7Fb1BE386067BCb9Bc7481271B12f7Ce86ac82e\" 1000,\n   \"0x1DBA1131000664b884A1Ba238464159892252D3a\" 50000,\n   \"0x097Eb69CD700C252Ae55AB123013b46BF68028f9\" 1000,\n   \"0xd918219fd9bE2DE265438128988A0716C2BE1236\" 1000,\n   \"0x5cb479DB92Ce3572383837c9775639dC373e4194\" 1000,\n   \"0xef44F365384ad909A3a885dc577d191b92292ba4\" 1000,\n   \"0x678498BADBE31D20F718A303E51324a6D039E7AF\" 1000,\n   \"0xCA55BF46a8A01A283144F56C80c775b1f7786d9d\" 1000,\n   \"0x08D298D08bf9Ae07F000d3dFAFa3370169882d57\" 1000,\n   \"0x9082e0eAc4B7D13F6Db1259dfC8829859ED90329\" 1000,\n   \"0x95A998c9af7b9199Ad9b117613be2Ad2b8eEd7e9\" 1000,\n   \"0x8FDa6640F52631253521D4605969cb92cA7BE94b\" 1000,\n   \"0xD0d9754b02Cc1BA92217cC648B921e631f4C2e4f\" 1000,\n   \"0xdA1F3a8603F8466Da8B4c95e8eFD8f87047467ac\" 2000,\n   \"0xA28891F13275138e0b79569dD20D51e968827Cc1\" 2000,\n   \"0x2d3Dd55e97A9C8F07245eEb62846868990C258d6\" 1000,\n   \"0x95f57d93effCfa494EB8d6F85d3f475107E0CE48\" 1000,\n   \"0x9ceb60c1A364771a22e5707e137d168016c813DA\" 1000,\n   \"0xa8c2c0007f4F50045241bF96aa1934B0ddA2528D\" 1000,\n   \"0xBDA8106d4339eAec2396CDDEb2B93092CF97Ef01\" 1000,\n   \"0x989943F1DF0874e5735b6ec2fa4d221384CbB067\" 1000,\n   \"0xa7ade07e80cf242dce085e545069b11c32fcc56e\" 1000,\n   \"0xFfa6ADEC873c41f08d6D28d8f4eb978f968969f3\" 1000,\n   \"0xbb36D3465D8afae08B08CB59eF389Cc9387eFf38\" 1000,\n   \"0xacD4e2556b363C1720184ebae82137211a773642\" 1000,\n   \"0x7417030fD93C026b0735270f7a41B847044A637d\" 1000,\n   \"0x82b3B3FfFD8680967305DeBf1816fe49b090670D\" 1000,\n   \"0x839395e20bbB182fa440d08F850E6c7A8f6F0780\" 50000,\n   \"0xB4B9FAB079D452bd446F49C275417eF545F85BE7\" 1000,\n   \"0xA6C1c8522B90138fc04eDFd3F8659210a710df81\" 1000,\n   \"0xeBe2c382b36145b8A4B37141CB141fd7d0B602A9\" 1000,\n   \"0xFE9f5d39BEcb99Ec713F46d9a55459A164ed95BE\" 1000,\n   \"0x3eC827A91F8600c5e7D5a86Cdf9a0b913d84b6e6\" 1000,\n   \"0xae93A6CFb842495e38e7150c095B7c34D6485C82\" 1000,\n   \"0xfB8FE962bE318fbB420ebA2D78E36836AE5Cef61\" 1000,\n   \"0x92a5646e085051a8cC4a36a4CE9268AF223f0D4c\" 1000,\n   \"0x32bA4a7c41e164Cb6F9e6f406C2E35eC15db6Cd6\" 1000,\n   \"0x837259709B34FB0f1AEFA1644441057502998521\" 1000,\n   \"0xb93c1b96200f765D71f219A3Fa7CdCe0b7A1DA9b\" 1000,\n   \"0x007ED64aC2fE49e1bcb932151e72dE0ca813ECF8\" 1000,\n   \"0xE3E3C3540FD428Aeb5828DFc2F6Fea7d20ebDF33\" 1000,\n   \"0x5210c0C80f14D07E415ad2d0A5A0AdDD16daB4c8\" 1000,\n   \"0x3C579133C724d42a557B3B8005C369d89a5d8BC7\" 1000,\n   \"0x6C22fa46Cb7FABd775bb0c4E13948e75Aa458a60\" 1000,\n   \"0xCc6EAC5155D1eEaB6987b9efD791377Fd7C5539C\" 1000,\n   \"0xA5D9e7032d1A5656E2Ed80Bc6a716d57265141db\" 2000,\n   \"0x101f0D604623783A9194e4a03e149c83bD94ED9c\" 1000,\n   \"0x1B55887509d4d07965e20842cddaA1B1C4AD559c\" 5000,\n   \"0x04a883fc7a3090d11B76601ae636F399fa747A51\" 1000,\n   \"0x766841734ef2a013374cb6E95458F498B9A617bC\" 1000,\n   \"0x35854d221f0B2eDC4559e01e98f7De842C3e17d8\" 1000,\n   \"0x8bc1ab6fc6524335d723611b85a9f57ff6d3fcd3\" 1000,\n   \"0xAeA4F88b8EEfe2C197b9AFb1FC053909549008b5\" 1000,\n   \"0x3ceBA254Ee10D70c1657F961D38423c65B0Ac9Fe\" 3000,\n   \"0x4B00c6555ea388E9d881FF349256F0A4092F64e4\" 1000,\n   \"0xfF5Bd27500868847d996919aCEeD56a3C5E9D0e8\" 1000,\n   \"0xc46D4a8737CedE0556425c8F346B48F75E0Dc741\" 1000,\n   \"0xA7d9c99De467C3558ADd28c057af8CeA9652395F\" 1000,\n   \"0xf5a2cd399fb938b7fe2fce58b98b98b279a6ca63\" 1000,\n   \"0xd36eA428FF8796f94Aec58A063500023525A1201\" 1000,\n   \"0x315A7B7160A12f036676a56B24e31B087387DA5d\" 5000,\n   \"0x68583fe6A4c0E5De31EA6bdF352D8E5E897A6bB7\" 1000,\n   \"0xE8Dde5cb737ad170Ed6349f958AF393368e7a36a\" 1000,\n   \"0xAd4ecec26AeF498949e7eF64CC54372F1de52E51\" 1000,\n   \"0x8C0f64DdB364072ac54a5E5aC26F1ff1ACda38fc\" 1000,\n   \"0xe3517ae43529EF5243B1Ca137eAc764e66914871\" 1000,\n   \"0x019EdcB493Bd91e2b25b70f26D5d9041Fd7EF946\" 1000,\n   \"0x4Ce0dadfCE28845aAF6812E5520f1F6c6406C72F\" 1000,\n   \"0xA25f2D38cB91F53136C25E553641E341D1cbd07f\" 1000,\n   \"0xf6Ecc169e4E30d0d85e7696746ca87f0740C02BF\" 1000,\n   \"0xFf06A94E171fe7f29C4635B89756e59E66F9eBd8\" 1000,\n   \"0xE333aa1E1230CC722309d8d5f7F65fE8684c883d\" 1000,\n   \"0xCF4173e010fC0C8dA4ba7443a7D5F52694Eb3928\" 1000,\n   \"0x0f7ce02f8af040579eb7a93549bdcc965fa8eb7b\" 1000,\n   \"0x555084d6417304347357339300ca56016cc73290\" 1000,\n   \"0xfF5166e66E389e07A50bc8232eB9Dc5a52Dc190b\" 1000,\n   \"0x7f73803778ffBB312C3DBB5C48bBe0D1044D2273\" 1000,\n   \"0x04b2986CEb58f87AE37267d36d666a1fC4894900\" 10000,\n   \"0x4C1dD69120E1C82126677A6D30C2b61fec49cDd6\" 1000,\n   \"0xCD41D02BDc943C3d8122C7fbCbb6487c642078A2\" 10000,\n   \"0x2e3313F1A506645c45E8d4ea27a25d8bA8d7eB9d\" 1000,\n   \"0xf9e6341904be225154CdeC72B432AA3C67ad752B\" 1000,\n   \"0x0ae2e95ab1610cd35285bdb268d94b3f078e6b36\" 1000,\n   \"0x84433D07A273a82626A3c7f4Fd6b7e44505Ec4F1\" 1000,\n   \"0x45578b6c87d2B3981ab05dc149d360b92F4BeF3B\" 1000,\n   \"0x1f05235F421c8CAe10CB593a1b4eAb2B17e4596a\" 1000,\n   \"0xE82522a784346926cf745605748d184Fae902727\" 3000,\n   \"0x5bD4f1B3dd982DF217224B6c0967C700037a09be\" 1000,\n   \"0xDCb7f959d492Cd0E9441915dF1fEc58c7a6ECd93\" 1000,\n   \"0x2666Efbc740C0c57fd99B30cbe5132f934525637\" 1000,\n   \"0x6667273b97886f6583065c38e4732fc8b5e24ec5\" 1000,\n   \"0xcD34DDEBaC48186Af7EA4a14F817831F5c74D56A\" 1000,\n   \"0x974c92f17621D11E60c724d193547b0533906191\" 25000,\n   \"0xe6a024916a1936307Ea728A8F085d409ae5ecb10\" 1000,\n   \"0x7863FDcF1E54d0F442e663152F6ab2d8Bb98aDCF\" 21000,\n   \"0x7617236eA6eBf579F36169369AF41fa0D8116506\" 1000,\n   \"0xdd12d76573bffdd7e1e70359eb65e83910a0f35e\" 1000,\n   \"0xef6Fa7B0B45F0273e5CBF740A150C4b1fB3Ba74A\" 1000,\n   \"0x9AA14a368D4bBdfA1Ae52BE735e90b34B251A120\" 2000,\n   \"0x0EAC1BE5c2Bf16B9aE3DAd30F7815C466dB6Af8f\" 1000,\n   \"0x7E48aaCb783e1aA67A07CB8901067a2B03420c21\" 1000,\n   \"0x8Fca7C9672c3C2db6FF538C858fEb66f6a90C6cc\" 1000,\n   \"0x000Fb8369677b3065dE5821a86Bc9551d5e5EAb9\" 10000,\n   \"0x35ccE922b335aCe829A07F75Da01678a5931Eb3e\" 1000,\n   \"0x5B62c6a32B64473C7Fb0bd94003990270E33eE9C\" 1000,\n   \"0x560241585CBeDbEBDf105c53C291d7914110D495\" 1000,\n   \"0xDf40059dA4DdD74fEECE3f9c5Da76F8C3317F24f\" 1000,\n   \"0x395f111e7dAE03BD7246b592be279ab344964dA5\" 2000,\n   \"0x4b4BA59C1EaDaF4ce367445fDDd4218728A47b6a\" 1000,\n   \"0x3C6b29F10f977c3314C7B528673B697839d0E19B\" 1000,\n   \"0x252d3363191138D74bD017Bb81a9F1d64f5fcc0a\" 1000,\n   \"0x0070Cfc95E4A24d8d43c5CF32390931439535227\" 1000,\n   \"0xb942eeE225766Db8180Fb3dd2CA00c3608BE0b8C\" 1000,\n   \"0xF04bA1E22Bf1d8819e373C2022861df56f60cB6c\" 1000,\n   \"0xbe1b723aCd1F47c1AACE1014d24F6e489D3bc47B\" 1000,\n   \"0x44010C025AE15838B92a43cA80BFAC1270888aAD\" 1000,\n   \"0x0fA1f9E6B02d69Dd873bdC0dda9d8FfEa944F987\" 1000,\n   \"0x466Ad15Bfb27463BC2852f5fb925Cd2124495f06\" 1000,\n   \"0xe32c8561C14f5fCc6a4d4310cd866Ae48aAdd533\" 1000,\n   \"0x20083892b34A049bFAE1B2a6b070a71525e0b41A\" 1000,\n   \"0xd5FBD35C713178C4aC9d432528Bf8De747CbbdAF\" 5000,\n   \"0x47f05aFF6ED5CADDb2332E9E48f64d62A5ad8Fe2\" 1000,\n   \"0x9E10085270Ef7b0D2A9d2264803C295c545C81C1\" 1000,\n   \"0x70eb3bcecDC49615a805F8F0425E1AE2412De9a6\" 1000,\n   \"0x0B8C767a91DdbE99ABA14685d03B14D4265c1E5B\" 1000,\n   \"0x9d0A1C5741b6013A1681594d74bB5387b4e0d7C4\" 1000,\n   \"0x440c7EFe7fDD489c39B12ad0Fb8A8263c062ca72\" 1000,\n   \"0xc008C29303b26f59453e9d79F37160909105250F\" 1000,\n   \"0xF932b570f399fE46534613B16c9BB5744678a895\" 1000,\n   \"0x1C609b9F8C77BF015dE1634De3Bd6158f091Bb4C\" 1000,\n   \"0x69a7EA4c2e935c8c34B9C99d72Db71508F09AeBe\" 1000,\n   \"0x1aAa2834c52CFB38D035F328A0037E53A5fF7509\" 1000,\n   \"0xF7FC28C321fd17B8972BC2b2F53AaC7a22Ad228E\" 1000,\n   \"0x826D4e2FcC0EeFC0De0DEaa868431d68f3004aC5\" 1000,\n   \"0x5858121D4Ccbc8095699a927d27CCc4460B5011E\" 1000,\n   \"0x6cF4240145eFBF5a9Df664b6AaD55dc736DB037F\" 1000,\n   \"0x00467579A3108e72d324771a66f2821f6bc6e61C\" 1000,\n   \"0x5C681875A0ef659D6d97Bc51c077783Db474dE47\" 1000,\n   \"0xcaFe2a3a9a19F0E5D6A4A13620d6CB2a3a84cDF1\" 5000,\n   \"0x51A125F89CBE0bFBFD62FeE8a750AAeC8fabC441\" 10000,\n   \"0xa2781fbF8555cfAE3f98A213EE60AF17295aD156\" 1000,\n   \"0xa49b77305087d961612be78811c5d819928abef4\" 1000,\n   \"0xcFE0909Dc95c2b22510Ea81f648Efb4b63c8021a\" 1000,\n   \"0x1fA5Ec2f206Ea8fAf6c6D4919808339d3af3855D\" 1000,\n   \"0x906277eec52171EC7911f0ecfB54C74D9dE3F905\" 1000,\n   \"0xc3B329f42CdB787c6600f7aE73632c037728c0a4\" 5000,\n   \"0x06c1ca9861fc6DD78cF0Cf7381Ebd2B8254CaA1d\" 1000,\n   \"0xE4fbfe78a6F1Facb2D39141016a9A631F96b4F53\" 1000,\n   \"0xEB6A307fCA343e103A177Eb67644D7Ed790Fbb33\" 200000,\n   \"0x00272A739927F587E2762D8BC77020B76BF73640\" 5000,\n   \"0x672f37e959Cc3606F4b95024feAe16135F2A93B7\" 1000,\n   \"0x5C71ded941d0377dd85F36EE23DDCa7BE7C8aC31\" 150000,\n   \"0xF19C090d039d08D85fA81f2b4095b9Fa66Aa8ea7\" 1000,\n   \"0x21Ec0929FEe996e938e3743B8d99dA877f80e748\" 1000,\n   \"0xA2537C2c3B8539744E2a1182C90A2c2d65E74ea8\" 1000,\n   \"0x0BF816Df8b8ad5b08490741B2b02b9C8b961CfE1\" 1000,\n   \"0x7c2be906222F1353D566c67A15Cc01a29c28DB84\" 1000,\n   \"0xE6d80aC0aEb167DE108cfCf735e3FBD66DbB5802\" 1000,\n   \"0x00a44164C421f4013d2E2E2e1CaeDA2A4763f386\" 1000,\n   \"0x13a7D67c2228bA500375E4Ec78c9cd724B008491\" 1000,\n   \"0x739bf345F9CDAD9A4F6b827299dcAe222695F7d6\" 1000,\n   \"0xc5465016B1c5abe438C62118bFf457f35CAA7881\" 1000,\n   \"0x79EbC54E8550D61a20794e0501E3D4fA5fCE76c7\" 1000,\n   \"0xD6386Eff8a91ab3350E0A8009A9fF919484FB4AA\" 1000,\n   \"0x3aA2b7D989bD4145cF01c5f8e0710edCb9d7D0bB\" 1000,\n   \"0xA139E660CeF348d0e52bd2a5A280B663d8fd0379\" 1000,\n   \"0xB50d87cfF0D1708ecc0d6E5dc83862013624888A\" 1000,\n   \"0x46e886aE3DF8835F3aBb7310b667A91CdD7ddBaf\" 1000,\n   \"0x1a716E83DbE858B34E7Fb1441fF9B8dbfa0c2BF4\" 1000,\n   \"0x4166ec103ea48ebc4d4538ac0f810f3472a8225d\" 1000,\n   \"0xC714d192D3904784137bDD316C423463aba0cEfc\" 1000,\n   \"0x2F5C6A70c961EBc59DC943E4875af66318C4d75D\" 1000,\n   \"0xc6Bffd211f37e24f9e870d4827C683B0a28B832e\" 1000,\n   \"0x79b458A7abD79B5046a85Da12a1612e81678e7D9\" 1000,\n   \"0x9e3bdfdf5b93832639ddfcb6f78b9fdc22788f5a\" 1000,\n   \"0x1141640AE469E5A9C99184AA4Cd55EE6C00fb4d2\" 1000,\n   \"0x1E5E067B27ee101828364a6c542315a41A748cf8\" 1000,\n   \"0x8D32b2E44A3F9565c2Ed2FfDAFf7dB5D8212710a\" 1000,\n   \"0xF865a1226351A0C88e2497E057DDdBe5577D9852\" 1000,\n   \"0xFf628FCfAcd51760Dc145a8eC55fffd80749dbB9\" 1000,\n   \"0x602889A6F2797451e30aFA98B508A404695a7e86\" 1000,\n   \"0x44E5030987cC08DdD4Ee77D76d1bA6424CAac5B4\" 1000,\n   \"0x1151D9EDA4d6415b57851F39894c0bC69134e86C\" 1000,\n   \"0x6d25A6343d3c9c0943F310aFBbD33D9Fa241E702\" 1000,\n   \"0xd1108AD0B6B5e4b9017a545a6f808b2D0386d150\" 1000,\n   \"0x509cfBd419e63264d4D92a39B414f2a8531dB0dc\" 1000,\n   \"0xEd8B951463de0f10ff74CacFAc612526417a9D16\" 200000,\n   \"0x29367119856D241A401C79ED75571c323cF8373C\" 1000,\n   \"0x6395DFf5ae32bEfaefA4CD6689E7Ed7CE5208069\" 1000,\n   \"0x26272474F4Bb38C04B1Bf1d9Fde567A578df7855\" 2000,\n   \"0xdb4a0e45C50bF078f4e03d4C761F893184154977\" 1000,\n   \"0x2B1000e66185905359B64DF9f0c8fCFd5929E457\" 1000,\n   \"0x7d97994332cd2d191845859b6d6F6D2270ECa45B\" 1000,\n   \"0xb8a444F67d8d5e83425073dc05BbE3EBBf0b73Ad\" 1000,\n   \"0xE73A1998cE936AceBEb7899D790a7a69c541b695\" 10000,\n   \"0xC351Ff80e9F1Fb8ea0D3d6520DF678C6db9790C4\" 1000,\n   \"0x779a5D022ABf5A747194BB83cf2eF6B27cd1c48A\" 1000,\n   \"0x35700c4a7bd65048f01d6675f09d15771c0facd5\" 1000,\n   \"0x8A0bd511E47070cf9E358cb7754b9ceB56213c56\" 1000,\n   \"0x3EfEA862207f970a42e3DD2F31C9A29d3eF770Ac\" 1000,\n   \"0xe675ECCf6C1D8Cfa2c3Ae29fa2AA325e2918d72e\" 1000,\n   \"0x0b4a9B08a05f5f0eeC936F3Bc8C259aCc1a24E8F\" 1000,\n   \"0xEdA350347cc954E219a70dc43a20426C98e4C0Be\" 1000,\n   \"0x9CE315b846c211a05f9DE5578C74b875De470783\" 1000,\n   \"0x16f4C2c13A6BceEdbd14e1A55E5A4c1Ac872Ee38\" 1000,\n   \"0x19b8eeBEC2E7427955D3E8916a1A608D9813A608\" 1000,\n   \"0x7e41aAa3623668e5D7D01B9b0340E65b515f3c83\" 31000,\n   \"0xfD82A5b995ffF8FB85a01f4498994541a1d8eE60\" 10000,\n   \"0x2FB7206c0C2d2fa10BB9880f9Ff42177117713Cc\" 1000,\n   \"0x5cdc87001DD04b8A1257FdacfA67ae4d7F26B33a\" 10000,\n   \"0x8FC70daAbDeFda552Ab7ddf089D2BfC6Cff17293\" 1000,\n   \"0x4219791C5a6832c6475f51BAe55f49D59Fb4c3Bd\" 1000,\n   \"0xb8E1302A3390221A5375359E2Bb5f3f692725F46\" 1000,\n   \"0x23CC9a102eEe541d468B5F55d6dE1753fB245430\" 1000,\n   \"0x58650c16afbD187686aB4D55B4AD9bf6191fefF2\" 1000,\n   \"0xa59959D7DaaD25fd25781b7CEBcfd4303434e868\" 1000,\n   \"0xA43680F8E8694bedE9F2050920C2bfcb8687329c\" 1000,\n   \"0x3Bb65357828Bd88457DA57cC7f144D004d3B036B\" 1000,\n   \"0x8f6C1E30079535e45900Fd525fFA8BA1225F0EE8\" 1000,\n   \"0x15E6a4EF615198d25a34DAFAe24446011400bedD\" 1000,\n   \"0x6F9cb16EBcEB99cf88ac97c3E35698E0e3D48F47\" 1000,\n   \"0xea9C95FB771De9e1E19aA25cA2E190aE96466CDD\" 5000,\n   \"0xDBfd04666F46Fc8CCadA187AD5Ecb736c0d09657\" 1000,\n   \"0x73a95DCa7522b9319a46f723Db44AF0c2F2cCe7c\" 1000,\n   \"0xC49827499FD8dEebD14f6AC117022C99F99a2Ddc\" 1000,\n   \"0xeD523745Ac4D3b9313045C7d2238EdC2dFf50781\" 1000,\n   \"0x812585402c94D4a4Fe0fa98FC05a4c2A404B05A7\" 1000,\n   \"0x3b630662cf15B0280A45bE85f1a175D5D8ED4939\" 1000,\n   \"0x8911323De6b42df0bb9bD43d21e1D2E0C9236839\" 5000,\n   \"0x0025a54871Dc1FBa33da0212453094f73Cf64066\" 1000,\n   \"0x65fac207ee655c873b5dcaae9a8d4140b15ec81e\" 10000,\n   \"0x7e229c415ef56f8ea9ccca7291e88f0b3fa2bdcc\" 1000,\n   \"0xb1b49Cd4Df741C883073c4f54f23921d6f2662C8\" 1000,\n   \"0xd98b8BA6bEcf3694A8BDeBA0c9e9B1918E5C0CD8\" 1000,\n   \"0xc893c331A99Ec7A0CC186DFeD7F1F6E06a1A943F\" 1000,\n   \"0xd26bE7916836AECA8a7Cb41ef2f1e4299469f35D\" 1000,\n   \"0x7dAfD53AEE8982aB1D767830c2fe50f62E3a98E6\" 2000,\n   \"0x700694817BB4C7431ee19b51a002b062C6De7F80\" 1000,\n   \"0xdC1Fe37a00909ad34A827A377eBC184b897b8910\" 1000,\n   \"0x394B6a2a8ebc8Da4716F67a5F61ebe6f8d31C50A\" 1000,\n   \"0xF6825F6B83677ed6353c31B01BCe8363a2cCdCF3\" 1000,\n   \"0xf21749506CDC7C684b096bA172c99A8878a816FB\" 5000,\n   \"0x7Ee084006b6Aea591DA21E26444915Fb57Ed647E\" 1000,\n   \"0xFE88DD131d675874d8475ED6d3E3e92993f76d51\" 1000,\n   \"0xaB99F2AbA7d6CA4E61148a181036cfc84c680cb8\" 1000,\n   \"0x456D5C6c0322869e0e2beaad13819e7CA55D8006\" 1000,\n   \"0xA26776bC0d2079e550987F351969C727925FF6f9\" 3000,\n   \"0x564257bd12F17E3bcf0F3504FE0F5C8386254c39\" 1000,\n   \"0x6CF176CfcC5b82D5b14af25CF09bf3D6D37E1716\" 1000,\n   \"0xa8B4d876cDB3dD4f066FD830A21464daf8857c80\" 1000,\n   \"0x30398e0f9e53475eefb5d60a52a048a2dc47709a\" 1000,\n   \"0xeC92519007b823765664Beac13eFAF630C263316\" 1000,\n   \"0x019a5e8314d7273640cEf5675Cbfee834F4020C5\" 1000,\n   \"0x8e283225172CA64bfd44AC8D27CCf8728f5c2735\" 1000,\n   \"0x0a94bcc0D0eC042CeD861d4D228bf8414B1d2956\" 1000,\n   \"0x7dD16CCa04E09C925D248AefEDa0c37cB76c7E16\" 1000,\n   \"0x0061b82814878024452427f8087733aE46a5a61a\" 20500,\n   \"0x1021F3AA2F1e8aBcf01c374305022b4B6e62135b\" 1000,\n   \"0xa0298d6163B8f1d2594CB7C0dFa5359d4238f696\" 1000,\n   \"0xA7bd17Ac3082a281FfAa2730f361E5c596224eaa\" 1000,\n   \"0x03118e02cE007a0F0d1C9D806c2a7D5Ae2F26995\" 3000,\n   \"0xf74c902f38e25a50464cccd24fdf94438dbd5d24\" 1000,\n   \"0xE6A9B3D0C232B5866ba0b90F0e3711AeF6E1D382\" 1000,\n   \"0xf8536CA7a25CBF70DF754fA310079aDa4c6114C2\" 10000,\n   \"0x0b48689A46F89b8149851021666CEa967902fc0C\" 1000,\n   \"0x24D39ecbDbBf850A13BD281827CFe6ada211b175\" 1000,\n   \"0x6ed95B6fc786D426789Ff42b7d754fC26667bfAc\" 1000,\n   \"0x8635E9bBB8d628958787c227db6A3E070B9429dC\" 1000,\n   #_ #_ \"0xfC8b7d3405F68B07A84CC24caF79430f06618D8d\" 3000,\n   \"0x54243AcE4f7B5f333090da5725082D857f914A18\" 1000,\n   \"0x88E347aABCa0Ff031ef52937C6D56a7a6E4b0475\" 1000,\n   \"0xae17ebd7f3bb7f74340647f68304fba0dcb7aa1d\" 10000,\n   \"0x041DeDfeC783D8D6D8BD4f81Cb3675042151184D\" 1000,\n   \"0x18Fa802F9AA92CFfbd45f51e208a7D636612d65a\" 1000,\n   \"0xeaa40F6B29CE35d8F53f6bF9b2A7397E3D8475Af\" 1000,\n   \"0x15ff63d544ecB4a24969121b2F3239867D4F18E4\" 1000,\n   \"0x3463DE8E9F42798C75492fE26273680F0fF0262C\" 1000,\n   \"0x3592C46b40123Dd9ac242e37a94F4C8C082df439\" 2000,\n   \"0xeAFEDde19F9c37e44f1Ec91487003Fdf895DdA3F\" 1000,\n   \"0x70f421ca5D3263e82c155075a14EbCB7e5336643\" 1000,\n   \"0xa10Ce005fcdb49Ab04E05fdFE15539deef774fF3\" 1000,\n   \"0x1ad89A2B5537feF9799B64469E5f712F2d01a43E\" 1000,\n   \"0x6e1323eF2554633375dC1D81696F9BA6fB18A2F5\" 1000,\n   \"0xEd289a040f4e80FdD8D1065Eb9F4482b5bEe7A60\" 1000,\n   \"0xb45489842B2F99e96f66a6eB486ae9c4F54A47c9\" 1000,\n   \"0x745E6bDDD3024E73daEc30d883A0A4e21D728cD9\" 1000,\n   \"0xbb7730b90273D8ccd1Df142C712a864f4401CC78\" 1000,\n   \"0x665EaD9D831423e362D11BEaE3b9Dba380B8083A\" 1000,\n   \"0x88Bdb0aeC80e001738c101d111EE035F1eaC0D95\" 2000,\n   \"0xA8E85dEe96F33Af3f5faae887dDf19260aDA2Ac7\" 1000,\n   \"0x15EF0B50823C0c96EF201CB418E3785F6b8D7D59\" 1000,\n   \"0x90e7aA0a9f37fa3930c1D33D57893E3372C84773\" 1000,\n   \"0x85c7716158d1050c918eb5859c5219fac0665eb7\" 1000,\n   \"0x8E765AF6b5366A1c073600c1951C8998BF11ffa2\" 1000,\n   \"0xd2E8bdCE6dc933eD4eEFcf7b069653F54823D3Fa\" 1000,\n   \"0x3ac6cb2ccfd8c8aae3ba31d7ed44c20d241b16a4\" 25000,\n   \"0xB7FeA0028b8EC4a0B651B060f58565EB6C57D507\" 1000,\n   \"0xd17597f94ac4841ad8f24a2c222a3a056ad2116a\" 25000,\n   \"0xf16CFD73Fe21E1d2ffdC68C6348489AD917e8546\" 3000,\n   \"0x30b7908a77c07d1aE480d26D5039Ed01049AE1bf\" 1000,\n   \"0xcdAA0072029E8c3e8C46c5Ed6c274cA6EA335a28\" 20000,\n   \"0x2aC079a959e3ca41B2cd5457b07930ABEB800943\" 1000,\n   \"0xBc55Cd5499DC8034f3e98a31D44421e4B16D6CBB\" 1000,\n   \"0x5ed1ac26ee940a42207955e119d283ecfe18a477\" 25000,\n   \"0xF38852A25c1e3557D876e88E2FEE3522eFe03E96\" 1000,\n   \"0xc8e7E9B4335Ec38b1eF2c72274eBc530bb806B3c\" 1000,\n   \"0x2827d3f9C39bA0507710A0D813f8A1b2EC9d3C07\" 1000,\n   \"0xFFf94042354Cf1ffEEC622E4563774390c999dC8\" 1000,\n   \"0x78CAc1584824dd9633d71f9EF41B56e6AA9927c0\" 1000,\n   \"0x6F0bECd0348CacAe43Ecd0f09805885675F51124\" 2000,\n   \"0xD38828D80aC4E5CF5F4A102494816945Ea37FB7B\" 1000,\n   \"0xd4536721D929d66d645D6E6550aA06d8A82A95c6\" 1000,\n   \"0x6308f9536c177059cFc4D78a1c8814a128Ce29D9\" 1000,\n   \"0x4838eab6f43841e0d233db4cea47bd64f614f0c5\" 25000,\n   \"0xeBcf2E9FAacB281c947A81759847139AE0Ad3992\" 1000,\n   \"0x3BBb5a4b05B8241ebB268c605541580270A2f3f5\" 18000,\n   \"0xf3B44AC5491E5349894D01532cDaeBa13311C041\" 1000,\n   \"0xcea47EbD1e877fc651e72004e6C2F8bA8Bff3bC9\" 1000,\n   \"0x03b12981Ef4dF9bd810Ae12C53230BE9848AE5A5\" 1000,\n   \"0x2a57B99146fd06976C45F937604F0a19041938EA\" 3000,\n   \"0xa386563bf026eEBe096fe26acc6e80Ba84D213a2\" 1000,\n   \"0x3Ab76b9AF7da268A2dcAE0c2241fC37654d6DBea\" 1000,\n   \"0x76e5fFFc26386E4D617eD6DF7Be9596f4007fCae\" 1000,\n   \"0xc31Bcd3Fd846518B91669727de9cb8fccF07bCba\" 1000,\n   \"0x910418Bc7839A456ba268E1D891d43AC6DD51AD6\" 1000,\n   \"0xcF876a3deF89b6e3DE37974190C843A83ACF090e\" 1000,\n   \"0x869e5B1bA479179f97D110D1D87f8E6dc7eB64Ae\" 1000,\n   \"0x310Bc5f5746f7749eCdBBa01B4EAbC6F1A9a0E18\" 1000,\n   \"0xDb25E5f07d8607823Fe76407046B0e469aCA164d\" 1000,\n   \"0x863Be577Ebff3fc3094cd6D91c8eFa54d077c821\" 1000,\n   \"0xFd2262c369636E1c295C9aBA4CaD67316FBa74A2\" 1000,\n   \"0xc83585b0Bf139A392069eE22C14dd4D64D26079A\" 3000,\n   \"0x0a417Def3B61404122c7580bfF82dc97E8a86D85\" 25000,\n   \"0xc0B8705d2c92D7AfAD37cf7885b19eA60a9a1a71\" 1000,\n   \"0xa2dEE84501a30b5847EcfEf8DB22a726EE911346\" 1000,\n   \"0xA92b2b995a6a09097a243dEbD79DcFC2B46848Ed\" 1000,\n   \"0x4eF6f3A56Ce63753EE82DD6e6654EaB912F7cECd\" 5000,\n   \"0x25619749e040dec6a6832d60d228f867dd77c35d\" 1000,\n   \"0xB7f1498898d70685851B5331F64bF26215f00415\" 1000,\n   \"0x5B17e67DAD94A65759B2e9555D8dA6A2B8db6BE7\" 1000,\n   \"0xF34c0e5346cF57867A661e6B34ede6135d38bb85\" 1000,\n   \"0x7ec7b7FE8F255B3909313A37DdbFf407BF56F29e\" 5000,\n   \"0xa91A30500A60258dC83F08bD7E29086F19E75E10\" 1000,\n   \"0x24Cb28f325A9CE3C27D746e70Edeb9643f37c86E\" 1000,\n   \"0x67936306c1490db7c491b0fe56bcf067ede1fd28\" 1000,\n   \"0xB00C946c53ab3b51F73C5DF7fcd10b39073e1790\" 1000,\n   \"0xAe16d2f23e2389D3E60345AF20631Db806024C16\" 1000,\n   \"0x47dd3D9c9843f71eEDb4CdEA4ceB07E55B06adA0\" 1000,\n   \"0x1F58868b6fA873739A07cB8D0412108Dc3B01733\" 25000,\n   \"0x7eB1e9267Ab19cefE7Dc068Be6c8f9dE42b0d85E\" 12000,\n   \"0x42c163Eff7D309425487CE50a9f4cB91DA19e4d1\" 1000,\n   \"0xbCCc76522169bF83078aee30a509c32909D9AEa2\" 1000,\n   \"0x2116Bc455dDf345539a738fdE43ABb63e6B0061C\" 1000,\n   \"0x1B5E3A4B53E1fFF879C718DE6afD45e4AFA6eF49\" 1000,\n   \"0xDd3b9BE91EA4D427e62c3fA3f2B27b5290d98F1e\" 1000,\n   \"0xb6b81bbFE61a1Cf3F9a8E8514D5E0F7200CfCcA2\" 1000,\n   \"0x106C21874eaA24d3bF34139281Ae5f1a82A101b6\" 3000,\n   \"0xD4072DccceF9e050d29043e680f2574868C31021\" 1000,\n   \"0x290Dbf7EB51324266F0668675a2a230d250b293C\" 1000,\n   \"0xc49d1085e06a93cD0F95dbD3C4e270Db7aB8f572\" 1000,\n   \"0x6C441eBA0ac23897B58c342f36a2D9a214593DdB\" 1000,\n   \"0xE49eA037c47F4eb9b6e434B65902B759FDB08Bbe\" 1000,\n   \"0xB7426E85Ca3eC67a009d30558062dda387cDb412\" 50000,\n   \"0x7ABCcb7afc349851d2f4E1D31A1f9DBd0e5F2F45\" 1000,\n   \"0x5bB91b0b19E06ee8411431726F0c9661b1782070\" 1000,\n   \"0x52bB24A71aAb5f2DC01Aa1C8730aa27d9548Cd3a\" 1000,\n   \"0x4a44dd1f701a90325513cad8a37d21f80dcc1da1\" 1000,\n   \"0x04DDA39c62312aE8b23bB4C36a703576C009327B\" 1000,\n   \"0xa3115D531b75BC72c796Af207192Fc960b615783\" 1000,\n   \"0x792A57BE9b0E40E7bf2970Db901e5Ecd2DE30B7d\" 1000,\n   \"0x624DAeF5eA222Aad86d1a17EF72728169bDB360d\" 61000,\n   \"0x0e0CD189eC770A2814E78c9c9b022abdd5174723\" 1000,\n   \"0x0ddF6E4172fDd4D0389De04Bd440330FFC0eB96E\" 1000,\n   \"0x611ec96B4dF9c8bbDB0258858C8451cAFedfDA34\" 1000,\n   \"0xc7f148f442d5d76F2831A3053033E56F7A7573d3\" 1000,\n   \"0x6a297d402907dC13D292000feD490099024C822a\" 1000,\n   \"0x8B0BCaf9f6c7b18810Eb412E08241659a20aDfd7\" 1000,\n   \"0xb5A378c1Fd1F31f1077C89f448deE3488d81669D\" 1000,\n   \"0xabb4639de78e88dabf47b8d659574dd660ffbb2c\" 1000,\n   \"0xa463F6edB92a2D7b9c90afc20a5Ce2116a945164\" 1000,\n   \"0xd5ff18c05fb0aa587aadef87c8a8facc0d417b9a\" 1000,\n   \"0xfee48cEc41f071Bc462507d1E2fDa9B2fADB39C2\" 1000,\n   \"0xF2f962ad05aEe8069B6e1e2AcE6E0C4b1414dF97\" 1000,\n   \"0x7A3D3C991506432e09E05dB9cBeE8329e1067cAd\" 1000,\n   \"0x7E5d729704263f71D82fe2F8fC127526dddbC36C\" 1000,\n   \"0x0fa38abec02bd4dbb87f189df50b674b9db0b468\" 1000,\n   \"0xA7921Bb5389368C3B9C55605826Ed5c7656F0313\" 1000,\n   \"0x9ca99bC90bc7C8F393848f4ff220e57202949654\" 1000,\n   \"0x09ECb548371278A4fEE5E8e9B9bF1596F85d02c8\" 1000,\n   \"0xf705CeB0f8b700d98978D5fC91F7705169e3e60e\" 1000,\n   \"0x1e1cCD5EC07e2D63e50ef2b183B66dB444C9f845\" 5000,\n   \"0x53e49353D37ad53CafFB4698CD9B7d831f55F707\" 1000,\n   \"0xBffB814b73801Ff822427a3d8B902dbc8fFb5F93\" 1000,\n   \"0x2A8392859b3eF08659af44fBCABaD3BDE170f4C7\" 1000,\n   \"0xCb0ff21Aaf4CBC57B1B7EfBADbbd96D16ff50E57\" 1000,\n   \"0x185c742082316a46C0736c16F75332126F9c43d3\" 1000,\n   \"0x5C35A34977f83E049bd699e2481e21D116223B04\" 1000,\n   \"0x9cd6a59a40b7a88512999afc90220e5942e182ac\" 1000,\n   \"0xaf24Ba021B3e8D3a13b4691a2B0828dCd811545E\" 50000,\n   \"0x09DB255Cd4e9927264391c87A6572338be33E08A\" 1000,\n   \"0x4D93604b66261116c9aac3E5d3e954BfEadA3a5D\" 1000,\n   \"0x95c96042D5d3941DeB785EbabD313EB317717E45\" 1000,\n   \"0xA9501D1f52CA501ee432d62C6d89Cb77276FdfCe\" 1000,\n   \"0x55B39B67BB496B5E9F057Cde5E9F5173dCC66ADE\" 1000,\n   \"0xcfd0055e61e4061052b77e51c8ce58e7a390bb90\" 1000,\n   \"0xA9e2eFFBb7006c9E380FBda884EE316fC40F9cDD\" 1000,\n   \"0x12040482Ab34ACbB440b17c64e7EB72253FD1401\" 1000,\n   \"0x00049808dcce781C7FD603B9a2563c0932Ef6d29\" 1000,\n   \"0xE72CE789BF6393771aa454e09Cd5be9715a83474\" 1000,\n   \"0x4A70EE052822A4571642769dEed715D4bBABd3f8\" 1000,\n   \"0x0646F493FAC83c393A3b3B76669b52eDE6Ec5774\" 1000,\n   \"0x59207cFeDa73D3B9Cb297d187446C7189D8e2bDC\" 5000,\n   \"0x03439743652496291b17DDdBa5a93b9D8B9EB20D\" 1000,\n   \"0x4549DF8057aa166368aAAb2fe7af0AC2F1B6B01E\" 1000,\n   \"0x39f4662bf97200dbfa00ed05e3141c8959151cfa\" 3000,\n   \"0x057b0175E2eD09CA783BC33C48cF31615B233692\" 1000,\n   \"0xf25f1E156b5D329389eD7641A7a7012eAeb3172f\" 1000,\n   \"0x8966FD4A3091C8c031F53Ad150a68D9235265EA7\" 1000,\n   \"0x2ee16239cfefc5e5f657e0aecc53b3643656dfa9\" 1000,\n   \"0xED2fd9b1bBb02a4cFa167942F771f7CFb522A0E6\" 1000,\n   \"0x37b9907d267Ad0D852A0490e77d37BE9A896c4A0\" 1000,\n   \"0x9df1FCB2dcCA866bEdfb6514d3D5a1eBD522A544\" 1000,\n   \"0xa22D548B393736D0470584cCeE0cd59A90E15bBd\" 1000,\n   \"0x28C2897122286A35738413E264942a781AF5c06A\" 1000,\n   \"0xa06d7BA83c7489716c9bA4429766D5Db8DeDC942\" 1000,\n   \"0x00304C9D754Fa9B897Aa655D531AE125b7a12108\" 1000,\n   \"0x072C075612aF238B2184CdcBc379B78eC048F918\" 1000,\n   \"0xD9f3465E42B5F0eC627A156FB158b32Bc828CBB\" 5000,\n   \"0x6E04454F2bb9D04F505C8b775E2e68cFc95F46D2\" 5000,\n   \"0x2fd4EC45ec04d33127E59CDfF2be4AC6d0B8C976\" 2000,\n   \"0x8CD0C09B71a76298cE90459524883663C88D063F\" 1000,\n   \"0xa1C78ED146a8693A8cF3d29385BC54Cd3F145B4a\" 10000,\n   \"0x6E258688b739ebdB1F2Dcc4fbf7D96d0fa6Cacff\" 36000,\n   \"0xd4499ded424CA4d068D2f6B5eCf3d645D8e166ea\" 1000,\n   \"0xaa8c09A4eD08B97F5886E067eA203656639ADfBc\" 3000,\n   \"0xc71a4798DBB8b85Db9e1b697B233F826B4F93dde\" 10000,\n   \"0x2ba61dA3E9b2eB86879373EE337C1730990BacEA\" 1000,\n   \"0xe4ef526473accbfc617451010beb5fbd68fe816d\" 1000,\n   \"0xACFe2fDdd3Ff10A5f9b0b2bbb581BdeCB8EA0287\" 1000,\n   \"0x4161e7f10852b74713099Ca1a0Bd47fe341e5B52\" 1000,\n   \"0xbD6221808d98b601d343aC0aC7C0379F28399bde\" 1000,\n   \"0xd046Cd27126d4f22C83Ba1d7C393d9b9A976f269\" 1000,\n   \"0xa5ed3807e915973d11947E26E742b6d6b8d05506\" 20000,\n   \"0x2D99B9B9Afc29dC2caB888C1E7928C7b131e4656\" 1000,\n   \"0xc8f1E7FF0E5066C8d8638575dBaD7CB261f19819\" 1000,\n   \"0x758f338534754eE7ea76a234332BA5EB695B2347\" 1000,\n   \"0xAff4f80ED19fA3b5856472362d77Dc87061aB932\" 1000,\n   \"0x924De4EFaC18ed4460C0b93d3bF726788E1a3F22\" 1000,\n   \"0xd5d28bbe1d2563addFaB1900F9dD7778cA515A9e\" 5000,\n   \"0x41E53CD6Eb57CDb25ACE7eeBd212178cD358D48e\" 1000,\n   \"0x9cbb422df9f16B925dD1fd48b82073Be4f740496\" 1000,\n   \"0x5e51f674239f938110417a75e3f89d03d566b9ed\" 1000,\n   \"0x5A1495fAB6a150D9D0989B49e69bcD24F5fc243d\" 1000,\n   \"0xcA83fC54849e9a200b4401134B391E83b8D03ACF\" 1000,\n   \"0x424ce77Aff0D95615dA060bD3f8D570F774d633b\" 1000,\n   \"0xE71E66E9A1a53dBB9488C50b5bc08289afEF85f5\" 1000,\n   \"0xB2839c0Fb42E66D8bAE27C2A0EAE5807e95e612A\" 1000,\n   \"0x00ed6b3e01d2edafdefe598a7d962bbc7526629b\" 5000,\n   \"0x65ed0C1Ead5383988e556027Ac81F1acAD8d6A10\" 1000,\n   \"0x00ae0c1fd293038C2b24a715E6fAbAcDa6012b55\" 1000,\n   \"0x6765579e9750670d5bF03F4DAcCF21aFd691b0cF\" 1000,\n   \"0x13A33bB5321c1cb27C3F7011A9fFf1Dd5E660e74\" 1000,\n   \"0x08b55C4D3b0959D6F11fB3534970357765E16495\" 1000,\n   \"0x3eA10564417AdB679d149c2F4A3D118b0123e72D\" 1000,\n   \"0x015E395AaA541574ea7b33A7803F67374C11c129\" 1000,\n   \"0x06905127EcB3f59c46a468489e5b262d7AfCc2e8\" 50000,\n   \"0x21Ac5f731b2AaFb6d7CcD20c1a70d5dFE320AEeb\" 6000,\n   \"0x5e9ea9d04bff6e5416e5cd59d750293d4e186639\" 5000,\n   \"0x2Bc7e8EeC35CCB4644199Fd2C881eA8Da98a0cA9\" 1000,\n   \"0xa4665c4524f09320b60f460c12DD943AacaD1b4b\" 1000,\n   \"0xEd5830604989CcE0D9A3E97ECD84f3a66Df93bFe\" 1000,\n   \"0x86b717A8E106Ab0A84b6e1a3E47aBc60F643C81a\" 1000,\n   \"0x05FFDec848E8Ca0AB751748A2cE3bf6bbAB91b24\" 1000,\n   \"0xB7BE0712d6ea427cE952539B52B0d10ea9a994b4\" 1000,\n   \"0xCC5479F7A6Cd4dCAA0F0fEd16E7952709ba1dC09\" 1000,\n   \"0x3785d73c25C4c08dC2c40fbA1CC845Fdc2210732\" 1000,\n   \"0x9C520c675BEB6eA07Aaf6F850a6Bc4Cd0724b015\" 2000,\n   \"0x9c2238E76e267912EDB7817ce2C6E13468759110\" 8000,\n   \"0x19E580c6230b9194A7A0935ed4217CfFe8278adF\" 1000,\n   \"0x98D5F2d180a811e1Ef17a2b3D501242d0a714eE7\" 1000,\n   \"0xffb5d974cba1e8c3761427f017c9666c9f14c32b\" 10000,\n   \"0xE68eDa08389E8642E7b13Fc2e783f41150830a02\" 1000,\n   \"0xfB9E00A0ADC832F82631a2D6f5467D802296249D\" 1000,\n   \"0x004DccdCCd989fE30Ebb6ABc304cEBeCa438fa2b\" 1000,\n   \"0x8ae03Fa94a53128AeCaAA3dfFB87FcA97797c1F0\" 1000,\n   \"0x1d186680fea0c552ff4ed9F0bDCa1629e2EA1528\" 1000,\n   \"0x90cc6AD2f24209a127dD6247bf68acC0a453f2BF\" 1000,\n   \"0x583a22c4B14ae27ff4d25e9F1a2448ea9cce199a\" 3000,\n   \"0x8C3EaC201Ae1644eb6dA0F9318a2FF9C5F0c6D20\" 500000,\n   \"0xF8be4E6e786c4248b6dF08c5B766d786AE905B36\" 1000,\n   \"0xBF9B1c552C1fDEeDcB6a05F5C3db563bBE10B4bb\" 1000,\n   \"0x8d2548cec0ac6807c0131e33360ad6e1332fe929\" 1000,\n   \"0x0a4231157671A451F1919d87f38bd0C307A0960F\" 1000,\n   \"0xDF90a56FeDE1dD8c2F89060dc8d649CAe1A026fC\" 1000})\n\n(def contracts-version \"1.0.1\")\n\n(def current-contrib-period 0)\n\n(def min-contrib-amount 0.1)\n\n(def contrib-period->name\n  {0 \"v0.1\"\n   1 \"v0.2\"\n   2 \"v0.3\"})\n\n(def disallowed-countries #{\"US\" \"BA\" \"MD\" \"RS\" \"ME\" \"BY\" \"CI\" \"CU\" \"CG\" \"CD\" \"IR\" \"IQ\" \"LR\" \"KP\" \"SD\" \"SY\" \"ZW\"})\n\n\n\n(def scammers #{\"0xfC8b7d3405F68B07A84CC24caF79430f06618D8d\"\n                \"0x9df1FCB2dcCA866bEdfb6514d3D5a1eBD522A544\"\n                \"0x2ba61dA3E9b2eB86879373EE337C1730990BacEA\"\n                \"0xd918219fd9bE2DE265438128988A0716C2BE1236\"\n                \"0xe35c3F2211F9A0dC3883338Bc50A84DD16cb4cc2\"\n                \"0xB00C946c53ab3b51F73C5DF7fcd10b39073e1790\"\n                \"0x989943F1DF0874e5735b6ec2fa4d221384CbB067\"\n                \"0x03439743652496291b17DDdBa5a93b9D8B9EB20D\"\n                \"0xfB9E00A0ADC832F82631a2D6f5467D802296249D\"})"
  },
  {
    "path": "src/cljs/contribution/core.cljs",
    "content": "(ns contribution.core\n  (:require\n    [cljs-time.extend]\n    [cljs.spec.alpha :as s]\n    [cljsjs.material-ui]\n    [cljsjs.react-flexbox-grid]\n    [cljsjs.web3]\n    [contribution.components.main-panel :refer [main-panel]]\n    [contribution.constants :as constants]\n    [contribution.db]\n    [contribution.events]\n    [contribution.subs]\n    [district0x.events]\n    [district0x.subs]\n    [goog.string.format]\n    [madvas.re-frame.google-analytics-fx :as google-analytics-fx]\n    [print.foo :include-macros true]\n    [re-frame.core :refer [dispatch dispatch-sync clear-subscription-cache!]]\n    [reagent.core :as r]))\n\n(defn mount-root []\n  (s/check-asserts goog.DEBUG)\n  (google-analytics-fx/set-enabled! (not goog.DEBUG))\n  (clear-subscription-cache!)\n  ;(.clear js/console)\n  (r/render [main-panel] (.getElementById js/document \"app\")))\n\n(defn ^:export init []\n  (s/check-asserts goog.DEBUG)\n  (google-analytics-fx/set-enabled! (not goog.DEBUG))\n  (dispatch-sync [:district0x/initialize\n                  {:default-db contribution.db/default-db\n                   :effects\n                   {:async-flow {:first-dispatch [:district0x/load-smart-contracts {:version constants/contracts-version}]\n                                 :rules [{:when :seen?\n                                          :events [:district0x/smart-contracts-loaded :district0x/my-addresses-loaded]\n                                          :dispatch-n [[:watch-dnt-balances]\n                                                       [:district0x/watch-my-eth-balances]\n                                                       [:contribution/get-contrib-period]\n                                                       [:contribution/get-configuration]\n                                                       [:contribution/setup-event-listeners]]\n                                          :halt? true}]}\n                    :district0x/dispatch [:load-ip-location]\n                    :dispatch-interval {:dispatch [:update-now]\n                                        :ms 1000\n                                        :db-path [:update-now-interval]}}}])\n  (mount-root))\n"
  },
  {
    "path": "src/cljs/contribution/db.cljs",
    "content": "(ns contribution.db\n  (:require\n    [cljs-time.core :as t]\n    [cljs-web3.core :as web3]\n    [cljs.spec.alpha :as s]\n    [district0x.db]\n    [district0x.utils :as u]\n    [re-frame.core :refer [dispatch]]))\n\n(s/def :contribution/stopped? boolean?)\n(s/def :contribution/founder1 (s/nilable u/address?))\n(s/def :contribution/founder2 (s/nilable u/address?))\n(s/def :contribution/early-sponsor (s/nilable u/address?))\n(s/def :contribution/wallet (s/nilable u/address?))\n(s/def :contribution/advisers (s/coll-of u/address?))\n(s/def :contribution/max-gas-price u/non-neg?)\n(s/def :dnt-token/transfers-enabled? boolean?)\n\n(s/def :contrib-period/soft-cap-amount u/not-neg?)\n(s/def :contrib-period/after-soft-cap-duration u/not-neg?)\n(s/def :contrib-period/hard-cap-amount u/not-neg?)\n(s/def :contrib-period/start-time (s/nilable u/date?))\n(s/def :contrib-period/end-time (s/nilable u/date?))\n(s/def :contrib-period/enabled? boolean?)\n(s/def :contrib-period/cancelled? boolean?)\n(s/def :contrib-period/soft-cap-reached? boolean?)\n(s/def :contrib-period/hard-cap-reached? boolean?)\n(s/def :contrib-period/total-contributed u/not-neg?)\n(s/def :contrib-period/contributors-count u/not-neg?)\n(s/def :contrib-period/stake u/not-neg?)\n(s/def :contrib-period/loading? boolean?)\n\n(s/def :contribution/contrib-period (s/keys :opt [:contrib-period/soft-cap-amount\n                                                  :contrib-period/after-soft-cap-duration\n                                                  :contrib-period/hard-cap-amount\n                                                  :contrib-period/start-time\n                                                  :contrib-period/end-time\n                                                  :contrib-period/enabled?\n                                                  :contrib-period/cancelled?\n                                                  :contrib-period/soft-cap-reached?\n                                                  :contrib-period/hard-cap-reached?\n                                                  :contrib-period/total-contributed\n                                                  :contrib-period/contributors-count\n                                                  :contrib-period/stake\n                                                  :contrib-period/loading?]))\n\n(s/def :form.contribution/contribute (s/map-of :district0x.db/only-default-kw :district0x.db/submit-form))\n(s/def :form.contribution/enable-contrib-period (s/map-of :district0x.db/only-default-kw :district0x.db/submit-form))\n\n(def default-db\n  (merge\n    district0x.db/default-db\n    {:load-node-addresses? false\n     :node-url \"https://mainnet.infura.io/\" #_\"http://localhost:8549\"\n     :smart-contracts {:contribution {:name \"District0xContribution\" :address \"0xf8094e15c897518b5ac5287d7070ca5850efc6ff\"}\n                       :dnt-token {:name \"District0xNetworkToken\" :address \"0x0abdace70d3790235af448c88547603b945604ea\"}\n                       :mini-me-token-factory {:name \"MiniMeTokenFactory\" :address \"0xa7dd95d9978dde794eae5233889f1ffebcdc9914\"}\n                       :multisig-wallet {:name \"MultisigWallet\" :address \"0xd20e4d854c71de2428e1268167753e4c7070ae68\"}\n                       :token-vesting {:name \"TokenVesting\" :address \"0x7c715A0d3018e254CC6A1c699bc63aBBaAeA5B7e\"}}\n     :now (t/now)\n     :admin-addresses #{\"0x8F5aAfdE2f96238e88403a9aF533F7D0440309f4\" \"0x610cAcfCc86Fe4B7A6c99F7FA0f49Dd6725c6632\" \"0x2Db0aaF01876d231E1541f72FB50b8c6716FCc9A\"}\n     :disallowed-country? false\n     :confirmed-terms? false\n     :confirmed-not-us-citizen? false\n     :confirmed-gas-price? false\n     :confirmed-compensation? false\n     :confirmations-submitted? false\n     :dnt-token/transfers-enabled? false\n     :contribution/stopped? false\n     :contribution/founder1 nil\n     :contribution/founder2 nil\n     :contribution/early-sponsor nil\n     :contribution/wallet nil\n     :contribution/advisers []\n     :contribution/max-gas-price 0\n     :contribution/contrib-period {}\n     :form.contribution/contribute {:default {:loading? false\n                                              :gas-limit 200000\n                                              :data {:contribution/amount 1}\n                                              :errors #{}}}\n\n     :form.contribution/enable-contrib-period {:default {:loading? false\n                                                         :gas-limit 100000\n                                                         :data {:contribution/period-index 0}\n                                                         :errors #{}}}}))"
  },
  {
    "path": "src/cljs/contribution/events.cljs",
    "content": "(ns contribution.events\n  (:require\n    [ajax.core :as ajax]\n    [akiroz.re-frame.storage :as re-frame-storage]\n    [camel-snake-kebab.core :as cs :include-macros true]\n    [camel-snake-kebab.extras :refer [transform-keys]]\n    [cljs-time.coerce :as time-coerce]\n    [cljs-time.core :as t]\n    [cljs-web3.async.eth :as web3-eth-async]\n    [cljs-web3.core :as web3]\n    [cljs-web3.eth :as web3-eth]\n    [cljs-web3.personal :as web3-personal]\n    [cljs-web3.utils :as web3-utils]\n    [cljs.core.async :refer [<! >! chan alts! timeout close!]]\n    [cljs.spec.alpha :as s]\n    [clojure.data :as data]\n    [clojure.set :as set]\n    [clojure.string :as string]\n    [contribution.api :refer [parse-get-contrib-period contrib-period-args parse-get-configuration]]\n    [contribution.constants :as constants]\n    [district0x.big-number :as bn]\n    [district0x.events :refer [get-contract get-instance all-contracts-loaded? reg-empty-event-fx]]\n    [district0x.utils :as u]\n    [goog.string :as gstring]\n    [goog.string.format]\n    [medley.core :as medley]\n    [re-frame.core :as re-frame :refer [reg-event-db reg-event-fx inject-cofx path trim-v after debug reg-fx console dispatch]])\n  (:require-macros [cljs.core.async.macros :refer [go]]))\n\n(def interceptors district0x.events/interceptors)\n\n(reg-event-fx\n  :load-ip-location\n  interceptors\n  (fn [{:keys [db]}]\n    {:http-xhrio [{:method :get\n                   :uri \"https://ipinfo.io/json\"\n                   :timeout 20000\n                   :response-format (ajax/json-response-format)\n                   :on-success [:ip-location-loaded]\n                   :on-failure [:district0x.log/error]}]}))\n\n(reg-event-fx\n  :ip-location-loaded\n  interceptors\n  (fn [{:keys [db]} [{:strs [country]}]]\n    {:db (assoc db :disallowed-country? (contains? constants/disallowed-countries country))}))\n\n(reg-event-fx\n  :update-now\n  interceptors\n  (fn [{:keys [db]}]\n    {:db (assoc db :now (t/now))}))\n\n(reg-event-fx\n  :deploy-contribution-contract\n  interceptors\n  (fn [{:keys [db]} [contribution-args address-index]]\n    {:dispatch [:district0x/deploy-contract {:address-index address-index\n                                             :contract-key :contribution\n                                             :gas 3500000\n                                             :args ((juxt :contribution/wallet\n                                                          :contribution/founder1\n                                                          :contribution/founder2\n                                                          :contribution/early-sponsor\n                                                          :contribution/advisers)\n                                                     contribution-args)\n                                             :on-success [:contribution-contract-deployed]}]}))\n\n(reg-empty-event-fx :contribution-contract-deployed)\n\n(reg-event-fx\n  :deploy-mini-me-token-factory-contract\n  interceptors\n  (fn [{:keys [db]} [address-index]]\n    {:dispatch [:district0x/deploy-contract {:address-index address-index\n                                             :contract-key :mini-me-token-factory\n                                             :gas 3000000\n                                             :on-success [:mini-me-token-factory-deployed]}]}))\n\n(reg-empty-event-fx :mini-me-token-factory-deployed)\n\n(reg-event-fx\n  :deploy-dnt-token-contract\n  interceptors\n  (fn [{:keys [db]} [address-index]]\n    (let [contribution-address (:address (get-contract db :contribution))\n          mini-me-token-factory-address (:address (get-contract db :mini-me-token-factory))]\n      {:dispatch [:district0x/deploy-contract {:address-index address-index\n                                               :contract-key :dnt-token\n                                               :gas 3300000\n                                               :args [contribution-address mini-me-token-factory-address]\n                                               :on-success [:dnt-token-contract-deployed]}]})))\n\n\n(reg-event-fx\n  :deploy-token-vesting-contract\n  interceptors\n  (fn [{:keys [db]} [{:keys [:beneficiary :start :cliff :duration :revocable?]}]]\n    {:dispatch [:district0x/deploy-contract {:address-index 0\n                                             :contract-key :token-vesting\n                                             :gas 3300000\n                                             :args [beneficiary\n                                                    (or start (time-coerce/to-epoch (t/now)))\n                                                    cliff\n                                                    duration\n                                                    revocable?]\n                                             :on-success [:dnt-token-contract-deployed]}]}))\n\n\n(comment\n  (re-frame.core/dispatch [:deploy-token-vesting-contract\n                           {:beneficiary \"\"\n                            :cliff 0\n                            :duration (t/in-seconds (t/days (* 365 2)))\n                            :revocable? true}]))\n\n(reg-empty-event-fx :token-vesting-contract-deployed)\n\n(reg-event-fx\n  :deploy-multisig-wallet\n  interceptors\n  (fn [{:keys [db]} [{:keys [:multisig-wallet/owners :multisig-wallet/required]} address-index]]\n    {:dispatch [:district0x/deploy-contract {:address-index address-index\n                                             :contract-key :multisig-wallet\n                                             :gas 3300000\n                                             :args [owners required]\n                                             :on-success [:multisig-wallet-deployed]}]}))\n\n(reg-empty-event-fx :multisig-wallet-deployed)\n\n(reg-event-fx\n  :contribution/set-district0x-network-token\n  interceptors\n  (fn [{:keys [db]} [address-index]]\n    (let [dnt-address (:address (get-contract db :dnt-token))]\n      {:dispatch [:district0x.contract/state-fn-call\n                  {:contract-key :contribution\n                   :method :set-district0x-network-token\n                   :args [dnt-address]\n                   :tx-opts {:gas 300000\n                             :from (if address-index\n                                     (nth (:my-addresses db) address-index)\n                                     (:active-address db))}\n                   :on-tx-receipt-n [[:contribution/get-contrib-period]\n                                     [:contribution/district0x-network-token-was-set]]}]})))\n\n(reg-empty-event-fx :contribution/district0x-network-token-was-set)\n\n(reg-event-fx\n  :contribution/setup-event-listeners\n  interceptors\n  (fn [{:keys [db]}]\n    (let [contribution-instance (get-instance db :contribution)]\n      {:web3-fx.contract/events\n       {:db-path [:web3-event-listeners]\n        :events [[contribution-instance :on-contribution {}\n                  \"latest\" :contribution/on-contribution [:district0x.log/error :on-contribution]]\n                 [contribution-instance :on-soft-cap-reached {}\n                  \"latest\" :contribution/on-soft-cap-reached [:district0x.log/error :on-soft-cap-reached]]\n                 [contribution-instance :on-hard-cap-reached {}\n                  \"latest\" :contribution/on-hard-cap-reached [:district0x.log/error :on-hard-cap-reached]]\n                 [contribution-instance :on-emergency-changed {}\n                  \"latest\" :contribution/on-emergency-changed [:district0x.log/error :on-emergency-changed]]]}})))\n\n(reg-event-fx\n  :contribution/on-contribution\n  interceptors\n  (fn [{:keys [db]} [{:keys [:total-contributed :contributors-count]}]]\n    (let [total-contributed (u/big-num->ether total-contributed)\n          contributors-count (bn/->number contributors-count)]\n      (when (< (get-in db [:contribution/contrib-period :contrib-period/total-contributed])\n               total-contributed)\n        {:db (update-in db [:contribution/contrib-period] merge\n                        {:contrib-period/total-contributed total-contributed\n                         :contrib-period/contributors-count contributors-count})}))))\n\n(reg-event-fx\n  :contribution/on-soft-cap-reached\n  interceptors\n  (fn [{:keys [db]} [{:keys [:end-time]}]]\n    {:db (update-in db [:contribution/contrib-period] merge\n                    {#_#_:contrib-period/end-time (bn/->date-time end-time)\n                     :contrib-period/soft-cap-reached? true})\n     :dispatch [:district0x.snackbar/show-message \"Amazing! Soft Cap was just reached!\"]}))\n\n(reg-event-fx\n  :contribution/on-hard-cap-reached\n  interceptors\n  (fn [{:keys [db]} [{:keys [:end-time]}]]\n    {:db (update-in db [:contribution/contrib-period] merge\n                    {:contrib-period/end-time (bn/->date-time end-time)\n                     :contrib-period/hard-cap-reached? true})\n     :dispatch [:district0x.snackbar/show-message \"Unbelievable! Our Hard Cap was reached! The Sale is over now\"]}))\n\n(reg-event-fx\n  :contribution/on-emergency-changed\n  interceptors\n  (fn [{:keys [db]} [{:keys [:is-stopped]}]]\n    {:db (assoc db :contribution/stopped? is-stopped)\n     :dispatch [:district0x.snackbar/show-message (if is-stopped\n                                                    \"Contribution was temporarily paused due to emergency\"\n                                                    \"Contribution was just resumed\")]}))\n\n(reg-event-fx\n  :contribution/set-contrib-period\n  interceptors\n  (fn [{:keys [db]} [args address-index]]\n    {:dispatch [:district0x.contract/state-fn-call\n                {:contract-key :contribution\n                 :method :set-contrib-period\n                 :args (contrib-period-args args)\n                 :tx-opts {:gas 1000000\n                           :from (if address-index\n                                   (nth (:my-addresses db) address-index)\n                                   (:active-address db))}\n                 :on-error [:district0x.log/error]\n                 :on-tx-receipt-n [[:contribution/get-contrib-period]\n                                   [:contribution/contrib-period-was-set]]}]}))\n\n(reg-empty-event-fx :contribution/contrib-period-was-set)\n\n(reg-event-fx\n  :contribution/get-contrib-period\n  interceptors\n  (fn [{:keys [db]}]\n    {:db (assoc-in db [:contribution/contrib-period :contrib-period/loading?] true)\n     :web3-fx.contract/constant-fns\n     {:fns [[(get-instance db :contribution)\n             :get-contrib-period\n             [:contribution/get-contrib-period-loaded]\n             [:district0x.log/error :contribution/get-contrib-period]]]}}))\n\n(reg-event-fx\n  :contribution/get-contrib-period-loaded\n  interceptors\n  (fn [{:keys [db]} [contrib-period]]\n    {:db (assoc-in db [:contribution/contrib-period]\n                   (merge (parse-get-contrib-period contrib-period)\n                          {:contrib-period/loading? false}))}))\n\n(reg-event-fx\n  :contribution/get-configuration\n  interceptors\n  (fn [{:keys [db]}]\n    {:web3-fx.contract/constant-fns\n     {:fns [[(get-instance db :contribution)\n             :get-configuration\n             [:contribution/get-configuration-loaded]\n             [:district0x.log/error :contribution/get-contrib-period]]]}}))\n\n(reg-event-fx\n  :contribution/get-configuration-loaded\n  interceptors\n  (fn [{:keys [db]} [configuration]]\n    (let [config (parse-get-configuration configuration)]\n      (if-not (u/zero-address? (:contribution/wallet config))\n        {:db (merge db config)}\n        {:db (assoc db :contracts-not-found? true)}))))\n\n(reg-event-fx\n  :contribution/contribute\n  interceptors\n  (fn [{:keys [db]} [form-data address]]\n    {:dispatch [:district0x.form/submit\n                {:form-data form-data\n                 :address address\n                 :value (u/num->wei (:contribution/amount form-data))\n                 :fn-key :contribution/contribute\n                 :fn-args []\n                 :tx-opts {:gas-price (:contribution/max-gas-price db)}\n                 :form-key :form.contribution/contribute\n                 :on-tx-receipt [:district0x.snackbar/show-message \"Thank you! Your contribution was successfully sent\"]}]}))\n\n(reg-event-fx\n  :contribution/enable-contrib-period\n  interceptors\n  (fn [{:keys [db]} [form-data address]]\n    {:dispatch [:district0x.form/submit\n                {:form-data form-data\n                 :address address\n                 :fn-key :contribution/enable-contrib-period\n                 :fn-args []\n                 :form-key :form.contribution/enable-contrib-period\n                 :on-tx-receipt-n [[:district0x.snackbar/show-message \"Your agreement to enable contribution was successfully sent\"]\n                                   [:contribution/get-contrib-period]]}]}))\n\n(reg-event-fx\n  :contribution/emergency-stop\n  interceptors\n  (fn [{:keys [db]}]\n    {:dispatch [:district0x.contract/state-fn-call {:contract-key :contribution\n                                                    :method :emergency-stop\n                                                    :args []\n                                                    :tx-opts {:gas 200000}}]}))\n\n(reg-event-fx\n  :contribution/release\n  interceptors\n  (fn [{:keys [db]}]\n    {:dispatch [:district0x.contract/state-fn-call {:contract-key :contribution\n                                                    :method :release\n                                                    :args []\n                                                    :tx-opts {:gas 200000}}]}))\n\n(reg-event-fx\n  :contribution/compensate-contributors\n  interceptors\n  (fn [{:keys [db]} [{:keys [:offset :limit]}]]\n    {:dispatch [:district0x.contract/state-fn-call {:contract-key :contribution\n                                                    :method :compensate-contributors\n                                                    :args [offset limit]\n                                                    :tx-opts {:gas 3500000\n                                                              :gas-price (web3/to-wei 4 :gwei)}\n                                                    :on-tx-receipt [:contribution/compensate-contributors-success offset limit]\n                                                    :on-error [:district0x.log/error offset (+ offset limit)]}]}))\n\n(reg-event-fx\n  :contribution/compensate-contributors-success\n  interceptors\n  (fn [{:keys [db]} [offset limit]]\n    (println \"Successfully compensated\" offset (+ offset limit))\n    nil))\n\n(reg-event-fx\n  :contribution/enable-district0x-network-token-transfers\n  interceptors\n  (fn [{:keys [db]}]\n    {:dispatch [:district0x.contract/state-fn-call {:contract-key :contribution\n                                                    :method :enable-district0x-network-token-transfers\n                                                    :args []\n                                                    :tx-opts {:gas 500000}}]}))\n\n(reg-event-fx\n  :watch-dnt-balances\n  [interceptors]\n  (fn [{:keys [db]}]\n    {:dispatch [:district0x/watch-token-balances\n                {:addresses (conj (:my-addresses db) (:address (get-contract db :contribution)))\n                 :instance (get-instance db :dnt-token)\n                 :token-code :dnt}]}))\n\n(reg-event-fx\n  :dnt-token/transfer\n  [interceptors]\n  (fn [{:keys [db]} [{:keys [:dnt-token/to :dnt-token/from :dnt-token/value]}]]\n    {:dispatch [:district0x.contract/state-fn-call {:contract-key :dnt-token\n                                                    :method :transfer\n                                                    :args [to value]\n                                                    :tx-opts {:gas 200000\n                                                              :from (or from (:active-address db))}}]}))\n\n(reg-event-fx\n  :set-confirmation\n  interceptors\n  (fn [{:keys [db]} [confirm-key confirmed?]]\n    {:db (assoc db confirm-key confirmed?)}))\n\n(reg-event-fx\n  :reinitialize\n  interceptors\n  (fn [{:keys [:db]} args]\n    (let [my-addresses (:my-addresses db)\n          {:keys [:contribution-args :address-index]} (s/conform (s/cat :contribution-args (s/? map?)\n                                                                        :address-index (s/? number?))\n                                                                 args)]\n      (.clear js/console)\n      {:dispatch [:district0x/clear-smart-contracts]\n       :async-flow {:first-dispatch [:district0x/load-smart-contracts {:version constants/contracts-version}]\n                    :rules [{:when :seen?\n                             :events [:district0x/smart-contracts-loaded]\n                             :dispatch [:deploy-contribution-contract\n                                        (merge\n                                          (when (<= 10 (count my-addresses))\n                                            #_{:contribution/founder1 (first my-addresses)\n                                               :contribution/founder2 (second my-addresses)\n                                               :contribution/early-sponsor (first my-addresses)\n                                               :contribution/wallet (nth my-addresses 3)\n                                               :contribution/advisers (drop 4 (take 7 my-addresses))}\n                                            {:contribution/founder1 (first my-addresses)\n                                             :contribution/founder2 (first my-addresses)\n                                             :contribution/early-sponsor (first my-addresses)\n                                             :contribution/wallet (first my-addresses)\n                                             :contribution/advisers (repeat 3 (first my-addresses))})\n                                          contribution-args)\n                                        address-index]}\n                            {:when :seen?\n                             :events [:contribution-contract-deployed]\n                             :dispatch [:deploy-mini-me-token-factory-contract address-index]}\n                            {:when :seen?\n                             :events [:mini-me-token-factory-deployed]\n                             :dispatch [:deploy-dnt-token-contract address-index]}\n                            {:when :seen?\n                             :events [:dnt-token-contract-deployed]\n                             :dispatch [:contribution/set-district0x-network-token address-index]\n                             :halt? true}]}})))\n\n(reg-event-fx\n  :generate-db\n  interceptors\n  (fn [{:keys [:db]}]\n    {:async-flow\n     {:first-dispatch [:reinitialize]\n      :rules [{:when :seen?\n               :events [:contribution/district0x-network-token-was-set]\n               :dispatch [:contribution/set-contrib-period\n                          {:contrib-period/start-time (time-coerce/to-epoch (t/plus (t/now) (t/seconds 5)))\n                           :contrib-period/end-time (time-coerce/to-epoch (t/plus (t/now) (t/hours 2)))\n                           :contrib-period/soft-cap-amount (u/eth->wei 5)\n                           :contrib-period/hard-cap-amount (u/eth->wei 100)\n                           :contrib-period/after-soft-cap-duration (t/in-seconds (t/minutes 30))}]}\n              {:when :seen?\n               :events [:contribution/contrib-period-was-set]\n               ;:dispatch [:contribution/enable-contrib-period {} (nth (:my-addresses db) 3)]\n               :dispatch [:contribution/enable-contrib-period {} (first (:my-addresses db))]\n               :halt? true}]}}))\n\n(reg-event-fx\n  :compensate-community-advisor\n  interceptors\n  (fn [{:keys [db]} [i]]\n    (when (< i (count constants/community-advisors))\n      (let [[receiver amount] (nth constants/community-advisors i)]\n        (println \"Sending\" amount \"DNT to\" receiver i)\n        {:dispatch [:dnt-token/transfer {:dnt-token/to receiver\n                                         :dnt-token/value (web3/to-wei amount :ether)}]\n         :dispatch-later [{:ms 1000 :dispatch [:compensate-community-advisor (inc i)]}]}))))\n\n\n(reg-event-fx\n  :community-advisor-balances\n  interceptors\n  (fn [{:keys [db]}]\n    {:web3-fx.blockchain/balances\n     {:web3 (:web3 db)\n      :addresses (map first (take 270 constants/community-advisors))\n      :instance (get-instance db :dnt-token)\n      :dispatches [[:community-advisor-balances-loaded]\n                   [:district0x/blockchain-connection-error :community-advisor-balances]]}}))\n\n(reg-event-fx\n  :community-advisor-balances-loaded\n  interceptors\n  (fn [{:keys [db]} [balance address]]\n    (let [balance (bn/->number (web3/from-wei balance :ether))\n          expected-balance (constants/community-advisors-hashmap address)]\n      (when (not= balance expected-balance)\n        (console :log address balance expected-balance)))\n    nil))\n\n(defn compensate-community-advisor [i stop-at]\n  (when (< i (min stop-at (count constants/community-advisors-hashmap)))\n    (let [address (nth (keys constants/community-advisors-hashmap) i)]\n      (go\n        (let [[result ch] (alts! [(web3-eth-async/contract-call\n                                    (get-instance @re-frame.db/app-db :dnt-token)\n                                    :Transfer\n                                    {:_from \"0x2a2A57a98a07D3CA5a46A0e1d51dEFffBeF54E4F\"\n                                     :_to address}\n                                    {:from-block 0})\n                                  (timeout 1000)])]\n          (if result\n            (do\n              (println address \"was compensated\" i)\n              (compensate-community-advisor (inc i) stop-at))\n            (let [amount (constants/community-advisors-hashmap address)]\n              (println \"Sending\" amount \"to\" address i)\n              (close! ch)\n              (let [[err res] (<! (web3-eth-async/contract-call\n                                    (get-instance @re-frame.db/app-db :dnt-token)\n                                    :transfer\n                                    address\n                                    (web3/to-wei amount :ether)\n                                    {:gas 200000\n                                     :gas-price (web3/to-wei 4 :gwei)\n                                     :from \"0x2a2A57a98a07D3CA5a46A0e1d51dEFffBeF54E4F\"}))]\n                (if err\n                  (println err)\n                  (compensate-community-advisor (inc i) stop-at))))))))))\n\n\n(comment\n\n  (dispatch [:deploy-contribution-contract {:contribution/wallet \"0xd20e4d854c71de2428e1268167753e4c7070ae68\"\n                                            :contribution/founder1 \"0x0e90d8f85fc3107df47d20444244feaa824d1082\"\n                                            :contribution/founder2 \"0xa8dc2b53ecebeaa641ebb0601a69fbf936ee04f4\"\n                                            :contribution/early-sponsor \"0x00E5cDD4B7b3a78a4277749957553371cb6B2310\"\n                                            :contribution/advisers [\"0x518611649eE8fEFeD0A4DA3D47bAB213c79ce9b5\"\n                                                                    \"0xdBD6ffD3CB205576367915Dd2f8De0aF7edcCeeF\"\n                                                                    \"0x61EF0722Fb8c4F11cB2F0091EA1DC22B6dFF89c1\"\n                                                                    \"0x8f077C8B4876004ef3549CeebF312D36F5B109eF\"\n                                                                    \"0xb58f2c5431ba945d765e92c14990bed40990f719\"]}])\n\n  (let [active-address (:active-address @re-frame.db/app-db)]\n    (dispatch [:deploy-contribution-contract {:contribution/wallet active-address\n                                              :contribution/founder1 active-address\n                                              :contribution/founder2 active-address\n                                              :contribution/early-sponsor active-address\n                                              :contribution/advisers [active-address active-address active-address]}]))\n\n  (dispatch [:deploy-mini-me-token-factory-contract])\n  (dispatch [:deploy-dnt-token-contract])\n  (dispatch [:contribution/set-district0x-network-token])\n  (dispatch [:contribution/enable-contrib-period {}])\n\n  (dispatch [:contribution/set-contrib-period\n             {:contrib-period/start-time (time-coerce/to-epoch (t/plus (t/now) (t/seconds 5)))\n              :contrib-period/end-time (time-coerce/to-epoch (t/plus (t/now) (t/weeks 2)))\n              :contrib-period/soft-cap-amount (u/eth->wei 5)\n              :contrib-period/hard-cap-amount (u/eth->wei 10)\n              :contrib-period/after-soft-cap-duration (t/in-seconds (t/hours 48))}])\n\n\n\n  (dispatch [:contribution/set-contrib-period\n             {:contrib-period/start-time (time-coerce/to-epoch (t/plus (t/now) (t/hours 1)))\n              :contrib-period/end-time (time-coerce/to-epoch (t/plus (t/now) (t/hours 2)))\n              :contrib-period/soft-cap-amount (u/eth->wei 55000)\n              :contrib-period/after-soft-cap-duration (t/in-seconds (t/minutes 30))\n              :contrib-period/hard-cap-amount (u/eth->wei 65000)}\n             0])\n\n  (dispatch [:contribution/set-contrib-period\n             {:contrib-period/start-time (time-coerce/to-epoch (t/plus (t/now) (t/seconds 30)))\n              :contrib-period/end-time (time-coerce/to-epoch (t/plus (t/now) (t/hours 2)))\n              :contrib-period/soft-cap-amount (u/eth->wei 5)\n              :contrib-period/after-soft-cap-duration (t/in-seconds (t/minutes 10))\n              :contrib-period/hard-cap-amount (u/eth->wei 10)}\n             0])\n\n  (dispatch [:contribution/set-contrib-period\n             {:contrib-period/start-time (cljs-time.coerce/to-epoch (cljs-time.core/date-time 2017 7 18 15))\n              :contrib-period/end-time (cljs-time.coerce/to-epoch (t/plus (cljs-time.core/date-time 2017 7 18 15)\n                                                                          (t/weeks 2)))\n              :contrib-period/soft-cap-amount (u/eth->wei 58550)\n              :contrib-period/after-soft-cap-duration (t/in-seconds (t/days 2))\n              :contrib-period/hard-cap-amount (u/eth->wei 292750)}])\n\n  (dispatch [:district0x.contract/constant-fn-call :token-vesting :beneficiary])\n  (dispatch [:district0x.contract/constant-fn-call :token-vesting :start])\n  (dispatch [:district0x.contract/constant-fn-call :token-vesting :cliff])\n  (dispatch [:district0x.contract/constant-fn-call :token-vesting :duration])\n  (dispatch [:district0x.contract/constant-fn-call :token-vesting :revocable])\n  (dispatch [:district0x.contract/constant-fn-call :token-vesting :owner])\n\n  (dispatch [:district0x.contract/constant-fn-call :multisig-wallet :get-transaction-count true false])\n  (dispatch [:district0x.contract/constant-fn-call :multisig-wallet :get-transaction-ids 0 9999 true false])\n  (dispatch [:district0x.contract/constant-fn-call :contribution :district0x-network-token])\n  (dispatch [:district0x.contract/constant-fn-call :contribution :founder1])\n  (dispatch [:district0x.contract/constant-fn-call :dnt-token :controller])\n  (dispatch [:district0x.contract/constant-fn-call :dnt-token :token-grants-count (:contribution/founder1 @re-frame.db/app-db)])\n  (dispatch [:district0x.contract/constant-fn-call :dnt-token :token-grant (:contribution/founder1 @re-frame.db/app-db) 1])\n  (dispatch [:district0x.contract/constant-fn-call :contribution :get-running-contrib-period])\n  (dispatch [:district0x.contract/constant-fn-call :contribution :get-times])\n  (dispatch [:district0x.contract/constant-fn-call :contribution :get-uncompensated-contributors 0 0])\n  (dispatch [:contribution/enable-contrib-period {}\n             (last (:my-addresses @re-frame.db/app-db))])\n  )"
  },
  {
    "path": "src/cljs/contribution/styles.cljs",
    "content": "(ns contribution.styles\n  (:require [cljs-react-material-ui.core :refer [color get-mui-theme]]))\n\n(def theme-cyan \"#7cf8fa\")\n(def theme-blue \"#2c398f\")\n(def theme-green \"#23fdd8\")\n(def theme-orange \"#ffd500\")\n(def theme-gray \"#47608e\")\n\n(def primary1-color theme-cyan)\n(def accent1-color theme-cyan)\n(def text-color \"rgba(0, 0, 0, 0.87)\")\n\n(def fade-white-color \"rgba(255, 255, 255, 0.8)\")\n\n(def fade-white-text\n  {:color fade-white-color})\n\n(def palette {:primary1-color primary1-color\n              :accent1-color accent1-color\n              :text-color \"#FFF\"})\n\n\n(def mui-theme (get-mui-theme {:palette palette\n                               :font-family \"proxima-soft, sans-serif\"\n                               :text-field {:error-color theme-orange\n                                            :floating-label-color \"#FFF\"\n                                            :focus-color theme-green\n                                            :disabled-text-color \"rgba(255, 255, 255, 0.6)\"}\n                               :paper {:background-color theme-blue\n                                       :color \"#FFF\"}\n                               :raised-button {:primary-text-color theme-blue\n                                               :primary-color theme-green\n                                               :disabled-text-color theme-blue\n                                               :disabled-color \"rgba(255, 255, 255, 0.6)\"}\n                               :drop-down-menu {:accent-color theme-blue}\n                               :menu-item {:selected-text-color theme-cyan}\n                               :snackbar {:background-color \"rgba(0, 0, 0, 0.95)\"\n                                          :text-color theme-cyan}}))\n\n;; --- GENERIC STYLES BEGNINNING ---\n\n(def desktop-gutter (aget mui-theme \"spacing\" \"desktopGutter\"))\n(def desktop-gutter-more (aget mui-theme \"spacing\" \"desktopGutterMore\"))\n(def desktop-gutter-less (aget mui-theme \"spacing\" \"desktopGutterLess\"))\n(def desktop-gutter-mini (aget mui-theme \"spacing\" \"desktopGutterMini\"))\n\n(def margin-bottom-gutter\n  {:margin-bottom desktop-gutter})\n\n(def margin-bottom-gutter-more\n  {:margin-bottom desktop-gutter-more})\n\n(def margin-top-gutter-more\n  {:margin-top desktop-gutter-more})\n\n(def margin-bottom-gutter-less\n  {:margin-bottom desktop-gutter-less})\n\n(def margin-bottom-gutter-mini\n  {:margin-bottom desktop-gutter-mini})\n\n(def margin-top-gutter\n  {:margin-top desktop-gutter})\n\n(def margin-top-gutter-less\n  {:margin-top desktop-gutter-less})\n\n(defn margin-all [x]\n  {:margin-top x\n   :margin-bottom x\n   :margin-right x\n   :margin-left x})\n\n(defn margin-horizontal [x]\n  {:margin-right x\n   :margin-left x})\n\n(defn margin-vertical [x]\n  {:margin-top x\n   :margin-bottom x})\n\n(defn padding-all [x]\n  {:padding-top x\n   :padding-bottom x\n   :padding-right x\n   :padding-left x})\n\n(defn padding-horizontal [x]\n  {:padding-right x\n   :padding-left x})\n\n(defn padding-vertical [x]\n  {:padding-top x\n   :padding-bottom x})\n\n(def text-left\n  {:text-align :left})\n\n(def text-right\n  {:text-align :right})\n\n(def text-center\n  {:text-align :center})\n\n(def full-width\n  {:width \"100%\"})\n\n(def full-height\n  {:height \"100%\"})\n\n(def no-wrap\n  {:white-space :nowrap})\n\n(def word-wrap-break\n  {:word-wrap :break-word})\n\n(def clickable\n  {:cursor :pointer})\n\n(def display-inline\n  {:display :inline})\n\n(def display-block\n  {:display :block})\n\n(def italic-text\n  {:font-style :italic})\n\n(def bold-text\n  {:font-style :bold})\n\n\n;; --- GENERIC STYLES END ---\n\n(def paper\n  {:border-radius \"10px\"})\n\n(def content-wrap\n  (padding-all desktop-gutter))\n\n(def white-text\n  {:color (color :white)})\n\n(def app-bar\n  {:background-color \"#FFF\"\n   :box-shadow \"none\"})\n\n(def active-address-select-field\n  {:color theme-blue\n   :margin-right 10})\n\n(def active-address-single\n  {:margin-right 10\n   :font-size \"1.3em\"\n   :line-height \"50px\"\n   :color theme-blue})\n\n(def active-address-select-field-label\n  {:color theme-blue})\n\n(def app-bar-balance\n  {:color theme-blue})\n\n(def stats-tile-border-right\n  {:border-right \"0.5px solid rgba(255, 255, 255, 0.1)\"})\n\n(def stats-tile-border-bottom\n  {:border-bottom \"0.5px solid rgba(255, 255, 255, 0.1)\"})\n\n(def stats-tile-border-top\n  {:border-top \"0.5px solid rgba(255, 255, 255, 0.1)\"})\n\n(def stats-tile\n  {:text-align \"center\"\n   :height 250\n   :color theme-green\n   :font-family \"filson-soft, sans-serif\"})\n\n(def stats-tile-title\n  {:text-transform \"uppercase\"\n   :font-size \"0.95em\"\n   :font-weight \"bold\"\n   :padding-bottom desktop-gutter-less\n   :margin-bottom desktop-gutter-less\n   :margin-left desktop-gutter-less\n   :margin-right desktop-gutter-less})\n\n(def contrib-countdown-unit\n  {:font-size \"0.9em\"\n   :width 60\n   :display :inline-block\n   :text-align :left})\n\n(def contrib-countdown-value\n  {:display :inline-block\n   :font-size \"2.7em\"\n   :width 57})\n\n(def logo\n  {:height 45\n   :width \"auto\"\n   :margin-top 13})\n\n\n\n(def stats-tile-amount\n  {:width \"100%\"\n   :font-size \"3em\"\n   :display :inline})\n\n(def stats-tile-amount-subtitle\n  {:width \"100%\"\n   :font-size \"1.2em\"})\n\n(def cap-progress\n  (merge\n    margin-bottom-gutter-less\n    {:height \"10px\"\n     :border-radius \"10px\"}))\n\n(def distribution-note\n  (merge full-width\n         fade-white-text\n         margin-top-gutter\n         fade-white-text\n         {:font-size \"0.9em\"}))\n\n(def contrib-terms-link\n  {:background-color theme-cyan\n   :padding \"8px 13px\"\n   :font-size \"0.75em\"\n   :border-radius \"20px\"\n   :color theme-blue\n   :font-weight \"bold\"})\n\n(def blob1\n  {:position :absolute\n   :top 200\n   :left \"-40%\"\n   :z-index -1\n   :height 980\n   :margin-bottom 40})\n\n(def blob2\n  {:position :absolute\n   :top 300\n   :right \"-30%\"\n   :z-index -1\n   :height 800\n   :overflow :hidden})\n\n(def blob3\n  {:position :absolute\n   :right \"14%\"\n   :z-index -1\n   :height 250\n   :top 1030\n   :margin-bottom 40})\n\n(def blob4\n  {:position :absolute\n   :right \"3%\"\n   :z-index -1\n   :height 60\n   :top 150})"
  },
  {
    "path": "src/cljs/contribution/subs.cljs",
    "content": "(ns contribution.subs\n  (:require\n    [cljs-time.core :as t]\n    [cljs-web3.core :as web3]\n    [contribution.constants :as constants]\n    [district0x.utils :as u]\n    [goog.string :as gstring]\n    [goog.string.format]\n    [medley.core :as medley]\n    [re-frame.core :refer [reg-sub]]\n    [clojure.set :as set]\n    [clojure.string :as string]))\n\n(reg-sub\n  :db/now\n  (fn [db]\n    (:now db)))\n\n(reg-sub\n  :contribution/dnt-balance\n  :<- [:district0x/balances]\n  :<- [:district0x/smart-contracts]\n  (fn [[balances contracts]]\n    (get-in balances [(:address (:contribution contracts)) :dnt])))\n\n(reg-sub\n  :confirmed-not-us-citizen?\n  (fn [db]\n    (:confirmed-not-us-citizen? db)))\n\n(reg-sub\n  :confirmed-terms?\n  (fn [db]\n    (:confirmed-terms? db)))\n\n(reg-sub\n  :confirmations-submitted?\n  (fn [db]\n    (:confirmations-submitted? db)))\n\n(reg-sub\n  :confirmed-gas-price?\n  (fn [db]\n    (:confirmed-gas-price? db)))\n\n(reg-sub\n  :confirmed-compensation?\n  (fn [db]\n    (:confirmed-compensation? db)))\n\n(reg-sub\n  :contribution/contrib-period\n  (fn [db]\n    (:contribution/contrib-period db)))\n\n(reg-sub\n  :disallowed-country?\n  (fn [db]\n    (:disallowed-country? db)))\n\n(reg-sub\n  :admin-addresses\n  (fn [db]\n    (:admin-addresses db)))\n\n(reg-sub\n  :contribution/current-contrib-period-status\n  :<- [:contribution/contrib-period]\n  :<- [:db/now]\n  (fn [[{:keys [:contrib-period/start-time :contrib-period/end-time]} now]]\n    (cond\n      (or (not start-time)\n          (not end-time)\n          (not (t/before? start-time now)))\n      :contrib-period-status/not-started\n\n      (and (t/after? now start-time)\n           (t/before? now end-time))\n      :contrib-period-status/running\n\n      (t/after? now end-time)\n      :contrib-period-status/ended)))\n\n(reg-sub\n  :contribution/configuration\n  (fn [db]\n    (merge\n      (select-keys db [:contribution/stopped? :contribution/founder1 :contribution/founder2\n                       :contribution/early-sponsor :contribution/wallet :contribution/advisers\n                       :contribution/max-gas-price])\n      {:contribution-address (get-in db [:smart-contracts :contribution :address])\n       :dnt-token-address (get-in db [:smart-contracts :dnt-token :address])})))\n\n(reg-sub\n  :contribution-contract-address\n  :<- [:district0x/smart-contracts]\n  (fn [contracts]\n    (get-in contracts [:contribution :address])))\n\n(reg-sub\n  :db/can-see-admin-panel?\n  :<- [:district0x/my-addresses]\n  :<- [:admin-addresses]\n  (fn [[my-addresses admin-addresses]]\n    (boolean (seq (set/intersection (set (map string/lower-case my-addresses))\n                                    (set (map string/lower-case admin-addresses)))))))\n\n(reg-sub\n  :form.contribution/enable-contrib-period\n  (fn [db _]\n    (:default (:form.contribution/enable-contrib-period db))))\n\n(reg-sub\n  :form.contribution/contribute\n  (fn [db _]\n    (:default (:form.contribution/contribute db))))\n\n"
  },
  {
    "path": "test/contribution/cmd.cljs",
    "content": "(ns contribution.cmd\n  (:require\n    [cljs.nodejs :as nodejs]\n    [contribution.tests]\n    [cljs.test :refer-macros [run-tests]]\n    #_[doo.runner :refer-macros [doo-tests]]))\n\n(nodejs/enable-util-print!)\n(set! js/window #js {})\n\n#_(doo-tests 'contribution.tests)\n\n(set! (.-error js/console) (fn [x] (.log js/console x)))\n\n(comment\n  (run-all-tests)\n  (run-tests 'contribution.tests)\n  ((doo-tests 'contribution.tests)))\n\n(defn -main [& _]\n  (run-tests 'contribution.tests))\n\n(set! *main-cli-fn* -main)\n\n"
  },
  {
    "path": "test/contribution/tests.cljs",
    "content": "(ns contribution.tests\n  (:require\n    [cljs-time.coerce :refer [to-epoch]]\n    [cljs-time.core :as time]\n    [cljs-web3.core :as web3]\n    [cljs-web3.eth :as web3-eth :refer [contract-call]]\n    [cljs-web3.evm :as web3-evm]\n    [cljs.core.async :refer [<! >! chan]]\n    [cljs.nodejs :as nodejs]\n    [cljs.test :refer-macros [deftest is testing run-tests use-fixtures async]]\n    [contribution.api :refer [parse-get-contrib-period contrib-period-args parse-get-configuration]]\n    [district0x.big-number :as bn]\n    [district0x.test.contracts :as test-utils :refer [state-call! now-plus-seconds get-balance-ch contract-call-ch state-call-ch! state-call-ch! increase-time-and-mine-ch! mine-ch!]]\n    [district0x.test.node :refer [fetch-contract fetch-bin fetch-abi]]\n    [district0x.utils :as u :refer [wei->eth->num eth->wei->num]]\n    [print.foo :include-macros true])\n  (:require-macros [cljs.core.async.macros :refer [go]]))\n\n\n(def accounts-secrets [\"0x2331c9b2390ff4acfd9bb1277f35cb303581bf8d30433aec9d517dd7c6213e05\"\n                       \"0x862b9e4ac273b75153122c16611bb73b85ee35d2443f49b6651dde9b624d3175\"\n                       \"0xfe7a2920e0b7572ee98e78b4a551723697c1678bed60d2c7ddd8d015ea15f241\"\n                       \"0x84aae7d13483fc0ef0910cae872a15a10f60a495b7067793bc868250d1c760ba\"\n                       \"0x4919c9259eac34d6af231edf36af697f7a6291bc28c9837f7fabb678e750fb98\"\n                       \"0xbad6bfea21ca0d5d9e02f8a6854a5d6aea31fc57505ce336ea7ebbf31e91f487\"\n                       \"0xd804f2fe99d8186aa9dc2a6e74c0c4a551b12d29db9bba79187664b86a830659\"\n                       \"0x564af4b4727963fd3830abfdef5f97ba2b06926760aaff5869e6f8f4ce6e2538\"\n                       \"0x5a157c8984c783fe9e1fc33f8b25e5a2b9d46b78b06e8d0081d594483fb52a52\"\n                       \"0xe80a3596cd9c6daaa66007e742d5fc07a7cb0d139f2a904a218edb14d47e7de2\"\n                       \"0x7bb136a6ec7bbe915bf8acc42ce0625936c5ddf970c23953b81f5304ace40c08\"\n                       \"0xc65d6da272a181baa120e492e69bb94a4cfc70188fbe97cd46359c0f35a78f92\"\n                       \"0x433fdca0953ec0b358178085e74d108587374f4d8b823cf93e3c46685981b6a6\"\n                       \"0x99465e2dc764d25d60f76c0f3f7857bfacd873c8958cc24bf5361e1f57abc1ea\"\n                       \"0xbd410cd7cfe6209e37b37ca3dd316b63971633a7e3a6c4781137df35fae5c23a\"])\n\n(def accounts [\"0x76852ba1f2fcb6355c57ffbd0bccfc226411f611\"\n               \"0xe5e0c25e7928ddb94a5a9569e25bdb1c5ef68392\"\n               \"0x7d3a19dc294eb5043e019b72adae56d67eaa4b07\"\n               \"0xd43c63869ea4c4a73efe218321a4f0653304026f\"\n               \"0xb2165ba402f5625ba5d59bc432b79bcc342250ae\"\n               \"0x979582a341f47a4caeac6cefb1a3af123a939264\"\n               \"0xb66b622f6ee6cc98581ed03ea2a393cb2de7a33e\"\n               \"0x6e17baf999bb6a6204d80d55a3e0910e7d4eceed\"\n               \"0x85ebe786470fd4204b307f39f49724136fcd2a2c\"\n               \"0x46f9d973f77133ecbfc0d1f43de3c00147a82096\"\n               \"0x0cf38f282e4cd051ca637115f745a8f60cbd215e\"\n               \"0xebbf7c3882b86f5eb4f13dbaed2487837f6ce786\"\n               \"0x4ee964fa20f7f3195b34a2d76579ced86a3de171\"\n               \"0xdd88343d4760e872d86a309c6cd3a4ed247fd335\"\n               \"0x1a1191cea03f9a15159f77e5e50f221c2b4b7eff\"])\n\n(def Web3 (js/require \"web3\"))\n(def TestRPC (js/require \"ethereumjs-testrpc\"))\n(set! js/Web3 Web3)\n\n(def web3 (new Web3))\n\n(def ^:dynamic MiniMeTokenFactory nil)\n(def ^:dynamic Contribution nil)\n(def ^:dynamic DNTToken nil)\n\n(def owner1 (nth accounts 0))\n(def wallet (nth accounts 10))\n(def founder1 (nth accounts 2))\n(def founder2 (nth accounts 3))\n(def early-sponsor (nth accounts 4))\n(def adviser1 (nth accounts 5))\n(def adviser2 (nth accounts 6))\n(def adviser3 (nth accounts 7))\n(def adviser4 (nth accounts 8))\n(def community-advisors (nth accounts 9))\n\n(defn- get-dnt-balance [address]\n  (contract-call-ch (chan 1 (map wei->eth->num)) DNTToken :balance-of address))\n\n(defn- contrib-period-running? []\n  (contract-call-ch Contribution :is-contrib-period-running))\n\n(defn get-contrib-period []\n  (contract-call-ch (chan 1 (map parse-get-contrib-period)) Contribution :get-contrib-period))\n\n\n(defn deploy-contracts! [done]\n  (go\n    (.setProvider web3 (.provider TestRPC (clj->js {:accounts (->> accounts-secrets\n                                                                (map (fn [secret]\n                                                                       {:balance (web3/to-wei 0x64 :ether)\n                                                                        :secretKey secret})))\n                                                    :locked false})))\n\n    (set! MiniMeTokenFactory (<! (test-utils/deploy-contract-ch!\n                                   {:web3 web3\n                                    :from owner1\n                                    :abi (fetch-abi \"MiniMeTokenFactory\")\n                                    :bin (fetch-bin \"MiniMeTokenFactory\")\n                                    :args []})))\n\n    (set! Contribution (<! (test-utils/deploy-contract-ch!\n                             {:web3 web3\n                              :from owner1\n                              :abi (fetch-abi \"District0xContribution\")\n                              :bin (fetch-bin \"District0xContribution\")\n                              :args [wallet founder1 founder2 early-sponsor [adviser1 adviser2 adviser3 adviser4 community-advisors]]})))\n\n    (set! DNTToken (<! (test-utils/deploy-contract-ch!\n                         {:web3 web3\n                          :from owner1\n                          :abi (fetch-abi \"District0xNetworkToken\")\n                          :bin (fetch-bin \"District0xNetworkToken\")\n                          :args [(aget Contribution \"address\") (aget MiniMeTokenFactory \"address\")]})))\n\n    (state-call! Contribution :set-district0x-network-token {:from owner1\n                                                             :args [(aget DNTToken \"address\")]\n                                                             :on-error test-utils/assert-no-error\n                                                             :callback #(done)})))\n\n(use-fixtures\n  :each\n  {:before\n   (fn []\n     (async done\n       (deploy-contracts! done)))\n   :after\n   (fn []\n     (async done (js/setTimeout #(done) 0)))                ; Prevents from hanging between tests, don't ask me why\n   })\n\n(deftest contracts-setup\n  (is MiniMeTokenFactory)\n  (is Contribution)\n  (is DNTToken)\n\n  (async done\n    (go\n      (is (= (aget DNTToken \"address\") (<! (contract-call-ch Contribution :district0x-network-token))))\n      (is (= (aget Contribution \"address\") (<! (contract-call-ch DNTToken :controller))))\n      (is (= (aget MiniMeTokenFactory \"address\") (<! (contract-call-ch DNTToken :token-factory))))\n      (is (= wallet (<! (contract-call-ch Contribution :multisig-wallet))))\n      (is (= founder1 (<! (contract-call-ch Contribution :founder1))))\n      (is (= founder2 (<! (contract-call-ch Contribution :founder2))))\n      (is (= early-sponsor (<! (contract-call-ch Contribution :early-sponsor))))\n      (is (= adviser1 (<! (contract-call-ch Contribution :advisers 0))))\n      (is (= adviser2 (<! (contract-call-ch Contribution :advisers 1))))\n      (is (= adviser3 (<! (contract-call-ch Contribution :advisers 2))))\n      (is (= adviser4 (<! (contract-call-ch Contribution :advisers 3))))\n      (is (= community-advisors (<! (contract-call-ch Contribution :advisers 4))))\n      (is (= 1000000000 (wei->eth->num (<! (contract-call-ch DNTToken :total-supply)))))\n      (is (not (<! (contract-call-ch Contribution :token-transfers-enabled))))\n      (is (= 0 (<! (get-dnt-balance founder1))))\n      (is (= 0 (<! (get-dnt-balance founder2))))\n      (is (= 180000000 (<! (get-dnt-balance wallet))))\n      (is (= 0 (<! (get-dnt-balance early-sponsor))))\n      (is (= 0 (<! (get-dnt-balance adviser1))))\n      (is (= 0 (<! (get-dnt-balance adviser2))))\n      (is (= 0 (<! (get-dnt-balance adviser3))))\n      (is (= 0 (<! (get-dnt-balance adviser4))))\n      (is (= 0 (<! (get-dnt-balance community-advisors))))\n      (is (= 820000000 (<! (get-dnt-balance (aget Contribution \"address\")))))\n      (done))))\n\n(deftest contribution1\n  (async done\n    (go\n      (testing \"Shouldn't be able to contribute when contribution period is not running\"\n        (is (u/error? (<! (state-call-ch! Contribution :contribute {:from (nth accounts 10)\n                                                                    :value-ether 1})))))\n\n      (let [soft-cap-amount (eth->wei->num 10)\n            after-soft-cap-duration (time/in-seconds (time/hours 48))\n            hard-cap-amount (eth->wei->num 15)\n            start-time-seconds 60\n            end-time-seconds 120\n            start-time (now-plus-seconds start-time-seconds)\n            end-time (now-plus-seconds end-time-seconds)]\n\n\n        (testing \"Should be able to set contribution period\"\n          (is (u/sha3? (<! (state-call-ch! Contribution :set-contrib-period\n                                           {:from owner1\n                                            :args (contrib-period-args\n                                                    {:contrib-period/soft-cap-amount soft-cap-amount\n                                                     :contrib-period/after-soft-cap-duration after-soft-cap-duration\n                                                     :contrib-period/hard-cap-amount hard-cap-amount\n                                                     :contrib-period/start-time start-time\n                                                     :contrib-period/end-time end-time})}))))\n\n          (let [contrib-period (<! (get-contrib-period))]\n            (is (= (wei->eth->num soft-cap-amount) (:contrib-period/soft-cap-amount contrib-period)))\n            (is (= after-soft-cap-duration (:contrib-period/after-soft-cap-duration contrib-period)))\n            (is (= start-time (to-epoch (:contrib-period/start-time contrib-period))))\n            (is (= end-time (to-epoch (:contrib-period/end-time contrib-period))))\n            (is (= false (:contrib-period/enabled? contrib-period)))\n            (is (= false (:contrib-period/soft-cap-reached? contrib-period)))\n            (is (zero? (:contrib-period/total-contributed contrib-period)))\n            (is (zero? (:contrib-period/contributors-count contrib-period))))\n\n          (is (= 119000000 (<! (get-dnt-balance founder1))))\n          (is (= 79000000 (<! (get-dnt-balance founder2))))\n          (is (= 5000000 (<! (get-dnt-balance early-sponsor))))\n          (is (= 5000000 (<! (get-dnt-balance adviser1))))\n          (is (= 5000000 (<! (get-dnt-balance adviser2))))\n          (is (= 1000000 (<! (get-dnt-balance adviser3))))\n          (is (= 1000000 (<! (get-dnt-balance adviser4))))\n          (is (= 5000000 (<! (get-dnt-balance community-advisors))))\n          (is (= 600000000 (<! (get-dnt-balance (aget Contribution \"address\")))))\n\n          (testing \"Shouldn't be able to reclaim DNT tokens\"\n            (is (u/error? (<! (state-call-ch! Contribution :reclaim-token\n                                              {:from owner1\n                                               :args [(aget DNTToken \"address\")]}))))\n            (is (= 600000000 (<! (get-dnt-balance (aget Contribution \"address\"))))))\n\n          (testing \"Token grants are setup okay\"\n            (doseq [account-index [founder1 founder2 early-sponsor adviser1 adviser2 adviser3 adviser4 community-advisors]]\n              (is (bn/eq? (<! (contract-call-ch DNTToken :token-grants-count founder1)) 1))\n              (let [[granter amount vested-amount start-date cliff-date vesting-date]\n                    (<! (contract-call-ch DNTToken :token-grant founder1 0))]\n                (is (= granter (aget Contribution \"address\")))\n                (bn/eq? vested-amount 0))))\n\n          (testing \"Setting first contrib period again will keep correct dnt balances\"\n            (is (u/sha3? (<! (state-call-ch! Contribution :set-contrib-period\n                                             {:from owner1\n                                              :args (contrib-period-args\n                                                      {:contrib-period/soft-cap-amount soft-cap-amount\n                                                       :contrib-period/after-soft-cap-duration after-soft-cap-duration\n                                                       :contrib-period/hard-cap-amount hard-cap-amount\n                                                       :contrib-period/start-time start-time\n                                                       :contrib-period/end-time end-time})}))))\n\n            (let [contrib-period (<! (get-contrib-period))]\n              (is (= (wei->eth->num soft-cap-amount) (:contrib-period/soft-cap-amount contrib-period)))\n              (is (= after-soft-cap-duration (:contrib-period/after-soft-cap-duration contrib-period)))\n              (is (= start-time (to-epoch (:contrib-period/start-time contrib-period))))\n              (is (= end-time (to-epoch (:contrib-period/end-time contrib-period))))\n              (is (= false (:contrib-period/enabled? contrib-period)))\n              (is (= false (:contrib-period/soft-cap-reached? contrib-period)))\n              (is (zero? (:contrib-period/total-contributed contrib-period)))\n              (is (zero? (:contrib-period/contributors-count contrib-period))))\n\n            (is (= 119000000 (<! (get-dnt-balance founder1))))\n            (is (= 79000000 (<! (get-dnt-balance founder2))))\n            (is (= 5000000 (<! (get-dnt-balance early-sponsor))))\n            (is (= 5000000 (<! (get-dnt-balance adviser1))))\n            (is (= 5000000 (<! (get-dnt-balance adviser2))))\n            (is (= 1000000 (<! (get-dnt-balance adviser3))))\n            (is (= 1000000 (<! (get-dnt-balance adviser4))))\n            (is (= 5000000 (<! (get-dnt-balance community-advisors))))\n            (is (= 600000000 (<! (get-dnt-balance (aget Contribution \"address\"))))))\n\n          (testing \"Only one owner shouldn't be able to enable contribution period\"\n            (<! (state-call-ch! Contribution :enable-contrib-period {:from owner1}))\n            (is (= false (:contrib-period/enabled? (<! (get-contrib-period))))))\n\n          (testing \"Confirmation from multisig wallet should enable contribution period\"\n            (<! (state-call-ch! Contribution :enable-contrib-period {:from wallet}))\n            (is (= true (:contrib-period/enabled? (<! (get-contrib-period))))))\n\n          (testing \"Shouldn't be able to contribute before contribution start time\"\n            (is (u/error? (<! (state-call-ch! Contribution :contribute {:from owner1 :value-ether 1})))))\n\n          (testing \"Contrib period 1 is running\"\n            (is (false? (<! (contrib-period-running?)))))\n\n          (<! (increase-time-and-mine-ch! web3 start-time-seconds))\n\n          (testing \"Contrib period 1 is running\"\n            (is (true? (<! (contrib-period-running?)))))\n\n          (testing \"Contribution round 1\"\n            (let [wallet-balance-before (<! (get-balance-ch web3 wallet))\n                  contributions [[(nth accounts 11) 1]\n                                 [(nth accounts 12) 1.5]\n                                 [(nth accounts 13) 2]\n                                 [(nth accounts 14) 2.5]]\n                  contributors (mapv first contributions)\n                  contribs-total (->> contributions\n                                   (map second)\n                                   (reduce + 0)\n                                   eth->wei->num)\n                  expected-dnt-balances [(web3/to-big-number \"85714285714285714285714285\")\n                                         (web3/to-big-number \"128571428571428571428571427\")\n                                         (web3/to-big-number \"171428571428571428571428570\")\n                                         (web3/to-big-number \"214285714285714285714285712\")]\n                  dnt-compensated-total (reduce bn/+ (web3/to-big-number 0) expected-dnt-balances)]\n\n              (testing \"Users should be able to contribute\"\n                (doseq [[contributor amount] contributions]\n                  (is (u/sha3? (<! (state-call-ch! Contribution :contribute\n                                                   {:from contributor\n                                                    :value-ether amount})))))\n                (is (bn/eq? (bn/+ wallet-balance-before contribs-total) (<! (get-balance-ch web3 wallet))))\n\n                (<! (mine-ch! web3))\n\n                (doseq [[contributor amount] contributions]\n                  (let [[contrib-amount compensated?] (<! (contract-call-ch Contribution :get-contributor contributor))]\n                    (is (= (wei->eth->num contrib-amount) amount))\n                    (is (false? compensated?))))\n\n                (let [contrib-period (<! (get-contrib-period))]\n                  (is (= false (:contrib-period/soft-cap-reached? contrib-period)))\n                  (is (= (wei->eth->num contribs-total) (:contrib-period/total-contributed contrib-period)))\n                  (is (= (count contributors) (:contrib-period/contributors-count contrib-period)))))\n\n              (testing \"Shouldn't be able to compensate when contrib period is still running\"\n                (is (u/error? (<! (state-call-ch! Contribution :compensate-contributors\n                                                  {:from owner1\n                                                   :args [0 10]})))))\n\n              (<! (increase-time-and-mine-ch! web3 (- end-time-seconds start-time-seconds)))\n\n              (testing \"Contributors should be compensated with dnt tokens after contrib period ended\"\n                (state-call-ch! Contribution :compensate-contributors {:from owner1\n                                                                       :args [0 10]})\n\n                (doseq [[contributor expected-dnt] (zipmap contributors expected-dnt-balances)]\n                  (is (bn/eq? expected-dnt (<! (contract-call-ch DNTToken :balance-of contributor)))))\n                (is (= 600000000 (wei->eth->num dnt-compensated-total))))))))\n      (done))))\n\n(deftest contribution2\n  (async done\n    (go\n      (let [soft-cap-amount (eth->wei->num 3)\n            hard-cap-amount (eth->wei->num 6)\n            start-time-seconds 300\n            after-soft-cap-seconds 200\n            start-time (now-plus-seconds start-time-seconds)\n            end-time (now-plus-seconds 10000)\n            contributions [[(nth accounts 13) 2] [(nth accounts 14) 2]]\n            contributors (mapv first contributions)\n            contribs-total (->> contributions\n                             (map second)\n                             (reduce + 0)\n                             eth->wei->num)\n            expected-dnt-balances [(bn/+ (<! (contract-call-ch DNTToken :balance-of (first contributors)))\n                                         (web3/to-big-number \"300000000000000000000000000\"))\n                                   (web3/to-big-number \"300000000000000000000000000\")]\n            dnt-compensated-total (reduce bn/+ (web3/to-big-number 0) expected-dnt-balances)]\n\n        (is (u/sha3? (<! (state-call-ch! Contribution :set-contrib-period\n                                         {:from owner1\n                                          :args (contrib-period-args\n                                                  {:contrib-period/soft-cap-amount soft-cap-amount\n                                                   :contrib-period/after-soft-cap-duration after-soft-cap-seconds\n                                                   :contrib-period/hard-cap-amount hard-cap-amount\n                                                   :contrib-period/start-time start-time\n                                                   :contrib-period/end-time end-time})}))))\n\n        (let [contrib-period (<! (get-contrib-period))]\n          (is (= (wei->eth->num soft-cap-amount) (:contrib-period/soft-cap-amount contrib-period)))\n          (is (= after-soft-cap-seconds (:contrib-period/after-soft-cap-duration contrib-period)))\n          (is (= start-time (to-epoch (:contrib-period/start-time contrib-period))))\n          (is (= end-time (to-epoch (:contrib-period/end-time contrib-period))))\n          (is (= false (:contrib-period/enabled? contrib-period)))\n          (is (= false (:contrib-period/soft-cap-reached? contrib-period)))\n          (is (zero? (:contrib-period/total-contributed contrib-period)))\n          (is (zero? (:contrib-period/contributors-count contrib-period))))\n\n        (is (u/sha3? (<! (state-call-ch! Contribution :enable-contrib-period {:from wallet}))))\n\n        (<! (increase-time-and-mine-ch! web3 start-time-seconds))\n\n        (is (true? (<! (contrib-period-running?))))\n\n        (testing \"Users should be able to contribute and hit soft cap\"\n          (let [wallet-balance-before (<! (get-balance-ch web3 wallet))]\n            (doseq [[contributor amount] contributions]\n              (is (u/sha3? (<! (state-call-ch! Contribution :contribute {:from contributor\n                                                                         :value-ether amount})))))\n            (is (bn/eq? (bn/+ wallet-balance-before contribs-total) (<! (get-balance-ch web3 wallet)))))\n\n          (<! (mine-ch! web3))\n\n          (doseq [[contributor amount] contributions]\n            (let [[contrib-amount compensated?] (<! (contract-call-ch Contribution :get-contributor contributor))]\n              (is (= (wei->eth->num contrib-amount) amount))\n              (is (false? compensated?))))\n\n          (testing \"Hitting soft cap should change contrib period end time\"\n            (let [contrib-period (<! (get-contrib-period))]\n              (is (< (to-epoch (:contrib-period/end-time contrib-period))\n                     end-time))\n              (is (= true (:contrib-period/soft-cap-reached? contrib-period)))\n              (is (= (wei->eth->num contribs-total) (:contrib-period/total-contributed contrib-period)))\n              (is (= (count contributors) (:contrib-period/contributors-count contrib-period)))))\n\n          (<! (increase-time-and-mine-ch! web3 (+ after-soft-cap-seconds 3)))\n\n          (is (false? (<! (contrib-period-running?))))\n\n          (testing \"Contributors should be compensated partially (first half) with dnt tokens\"\n            (let [half-count (/ (count contributions) 2)\n                  contributions (take half-count contributions)\n                  expected-dnt-balances (take half-count expected-dnt-balances)\n                  contributors (take half-count contributors)]\n              (is (u/sha3? (<! (state-call-ch! Contribution :compensate-contributors\n                                               {:from owner1\n                                                :args [0 half-count]}))))\n\n              (doseq [[contributor expected-dnt] (zipmap contributors expected-dnt-balances)]\n                (is (bn/eq? expected-dnt (<! (contract-call-ch DNTToken :balance-of contributor))))))\n\n            (testing \"Some contributors are still not compensated\"\n              (is (bn/eq? (<! (contract-call-ch DNTToken :balance-of (last contributors))) 0))))\n\n          (testing \"Contributors should be compensated partially (second half) with dnt tokens\"\n            (let [half-count (/ (count contributions) 2)\n                  contributions (take-last half-count contributions)\n                  expected-dnt-balances (take-last half-count expected-dnt-balances)\n                  contributors (take-last half-count contributors)]\n              (is (u/sha3? (<! (state-call-ch! Contribution :compensate-contributors\n                                               {:from owner1\n                                                :args [0 1000]}))))\n\n              (doseq [[contributor expected-dnt] (zipmap contributors expected-dnt-balances)]\n                (is (bn/eq? expected-dnt (<! (contract-call-ch DNTToken :balance-of contributor)))))))\n\n          (testing \"First contributor wasn't compensated twice\"\n            (is (bn/eq? (first expected-dnt-balances)\n                        (<! (contract-call-ch DNTToken :balance-of (first contributors))))))))\n      (done))))\n\n(deftest contribution3\n  (async done\n    (go\n      (let [soft-cap-amount (eth->wei->num 1)\n            after-soft-cap-duration (time/in-seconds (time/hours 48))\n            hard-cap-amount (eth->wei->num 2)\n            now (bn/->number (<! (contract-call-ch Contribution :get-now)))\n            start-time-seconds 60\n            end-time-seconds 120\n            start-time (+ now 60)\n            end-time (+ start-time 120)\n            wait-ch (chan)]\n        (testing \"Should be able to set contribution period\"\n          (state-call-ch! Contribution :set-contrib-period {:from owner1\n                                                            :args (contrib-period-args\n                                                                    {:contrib-period/soft-cap-amount soft-cap-amount\n                                                                     :contrib-period/after-soft-cap-duration after-soft-cap-duration\n                                                                     :contrib-period/hard-cap-amount hard-cap-amount\n                                                                     :contrib-period/start-time start-time\n                                                                     :contrib-period/end-time end-time})})\n\n          (state-call-ch! Contribution :enable-contrib-period {:from wallet})\n\n          (is (true? (:contrib-period/enabled? (<! (get-contrib-period)))))\n\n          (<! (increase-time-and-mine-ch! web3 start-time-seconds))\n\n          (testing \"Contrib period 1 is running\"\n            (is (true? (<! (contrib-period-running?)))))\n\n          (testing \"Contribution round 1\"\n            (let [wallet-balance-before (<! (get-balance-ch web3 wallet))\n                  contributions [[(nth accounts 11) 1]\n                                 [(nth accounts 12) 1.5]\n                                 [(nth accounts 13) 2]\n                                 [(nth accounts 14) 2.5]]]\n\n              (testing \"Users shouldn't be able to contribute with higer gas price than allowed\"\n                (let [[contributor amount] (first contributions)]\n                  (is (u/error? (<! (state-call-ch! Contribution :contribute {:from contributor\n                                                                              :value-ether amount\n                                                                              :gas-price 51000000000}))))))\n\n              (testing \"Should be able to make emergency stop\"\n                (is (u/sha3? (<! (state-call-ch! Contribution :emergency-stop {:from owner1})))))\n\n              (testing \"Shouldn't be able to contribute during emergency stop\"\n                (is (u/error? (<! (state-call-ch! Contribution :contribute {:from (ffirst contributions)\n                                                                            :value-ether (second (first contributions))})))))\n              (testing \"Should be able to release emergency stop\"\n                (is (u/sha3? (<! (state-call-ch! Contribution :release {:from owner1})))))\n\n\n              (testing \"Users should be able to contribute and hit hard cap\"\n                (doseq [[contributor amount] (take 2 contributions)]\n                  (is (u/sha3? (<! (state-call-ch! Contribution :contribute {:from contributor\n                                                                             :value-ether amount})))))\n\n                (<! (mine-ch! web3))\n\n                (let [contrib-period (<! (get-contrib-period))]\n                  (is (= true (:contrib-period/soft-cap-reached? contrib-period)))\n                  (is (= true (:contrib-period/hard-cap-reached? contrib-period)))))\n\n\n              (is (false? (<! (contrib-period-running?))))\n\n              (testing \"Should properly handle sending extra amount above hard cap\"\n                (is (bn/eq? (bn/+ wallet-balance-before hard-cap-amount)\n                            (<! (get-balance-ch web3 wallet))))\n\n                (let [[contrib-amount compensated?] (<! (contract-call-ch Contribution :get-contributor (nth accounts 11)))]\n                  (is (= (wei->eth->num contrib-amount) 1))\n                  (is (false? compensated?))))\n\n              (testing \"After hitting hard cap users shouldn't be able to contribute\"\n                (doseq [[contributor amount] (drop 2 contributions)]\n                  (is (u/error? (<! (state-call-ch! Contribution :contribute {:from contributor\n                                                                              :value-ether amount}))))))\n\n\n              (<! (increase-time-and-mine-ch! web3 1))\n\n              (testing \"Contributors should be compensated with dnt tokens after contrib period ended\"\n                (is (u/sha3? (<! (state-call-ch! Contribution :compensate-contributors\n                                                 {:from owner1\n                                                  :args [0 10]})))))\n\n              (<! (mine-ch! web3))\n\n              (testing \"Trading dnt is still disabled\"\n                (is (u/error? (<! (state-call-ch! DNTToken :transfer\n                                                  {:from (nth accounts 11)\n                                                   :args [12 (eth->wei->num 1)]})))))\n\n              (testing \"Should be able to enable dnt token transfers\"\n                (is (u/sha3? (<! (state-call-ch! Contribution :enable-district0x-network-token-transfers\n                                                 {:from owner1})))))\n\n              (testing \"Trading dnt should be enabled\"\n                (is (u/sha3? (<! (state-call-ch! DNTToken :transfer\n                                                 {:from (nth accounts 11) :args [12 (eth->wei->num 1)]}))))\n                (is (= 1 (wei->eth->num (bn/->number (<! (contract-call-ch DNTToken :balance-of 12)))))))\n\n              (testing \"Vesting works\"\n                (is (u/error? (<! (state-call-ch! DNTToken :transfer {:from early-sponsor\n                                                                      :args [founder2 (eth->wei->num 1)]})))))\n              (testing \"Community advisors stake should not be vested\"\n                (is (u/sha3? (<! (state-call-ch! DNTToken :transfer {:from community-advisors\n                                                                     :args [founder2 (eth->wei->num 1)]})))))\n\n              (testing \"Other addresses besides contribution contract can't create vesting\"\n                (is (u/error? (<! (state-call-ch! DNTToken :grant-vested-tokens\n                                                  {:from community-advisors\n                                                   :args [(nth accounts 12)\n                                                          (eth->wei->num 1)\n                                                          (+ now 120)\n                                                          (+ now 180)\n                                                          (+ now 300)\n                                                          false\n                                                          false]})))))\n\n              (testing \"Funds should not be vested after vesting period\"\n                (<! (increase-time-and-mine-ch! web3 (time/in-seconds (time/weeks 24))))\n                (is (u/sha3? (<! (state-call-ch! DNTToken :transfer {:from early-sponsor\n                                                                     :args [founder2 (eth->wei->num 1)]})))))\n\n              (testing \"Contribution Contract can be killed\"\n                (is (u/sha3? (<! (state-call-ch! Contribution :kill {:from wallet\n                                                                     :args [wallet]})))))))))\n      (done))))"
  }
]