GithubHelp home page GithubHelp logo

district0x / district0x-network-token Goto Github PK

View Code? Open in Web Editor NEW
131.0 23.0 37.0 10.24 MB

Smart Contracts and web app for district0x contribution

Home Page: https://contribution.district0x.io/

License: Eclipse Public License 1.0

Shell 1.12% Clojure 95.99% HTML 0.98% CSS 0.98% Dockerfile 0.48% Io 0.45%
ethereum smart-contracts clojurescript

district0x-network-token's Introduction

district0x Network Token Join our discord

Build Status

Read More:

ABIs

Contribution 0xf8094e15c897518b5ac5287d7070ca5850efc6ff:

[{"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"}]

DNT 0x0abdace70d3790235af448c88547603b945604ea:

[{"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"}]

Multisig 0xd20e4d854c71de2428e1268167753e4c7070ae68:

[{"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"}]

Technical definition

At the technical level DNT is a ERC20-compliant token, derived from the MiniMeToken that allows for token cloning (forking), which will be useful for many future usecases.

Vesting functionality derived from VestedToken is also built-in into our token. Founders, advisors and early contributor have their tokens vested.

Contracts

Token:

Contribution:

Tests

To run our smart-contract tests you need to have node installed on your machine. Our tests are written in Clojurescript here tests.cljs, but they are compiled into Javascript here contribution-tests.js, so you don't need to do that. You can just run tests with following commands:

npm install
node contribution-tests.js

district0x-network-token's People

Contributors

fbielejec avatar griffgreen avatar madvas avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

district0x-network-token's Issues

compensateContributors isn't onlyOwner

The top comment contains "this method is called by owner after contribution period ends". If it's meant to be called by the owner, why not make it onlyOwner?

district0x Contract Audit

Contract Audit: district0x

Preamble

This audit report was undertaken by @adamdossa for the purpose of providing feedback to district0x. It has been shared publicly via a Github issue without any express or implied warranty.

Solidity contracts were sourced from the public Github repo district0x/district0x-network-token.

The code was audited as of commit 79602a921f64e207d0a39e1a1238a0b81de5df44.

The following contracts were fully audited:

resources/public/contracts/src/District0xContribution.sol
resources/public/contracts/src/District0xNetworkToken.sol
resources/public/contracts/src/GrantsControlled.sol

In addition, the following contracts were modified from their OpenZeppelin implementations, and these modifications were audited (audit limited to just the modifications):

resources/public/contracts/src/ERC20.sol
resources/public/contracts/src/MiniMeToken.sol
resources/public/contracts/src/LimitedTransferToken.sol
resources/public/contracts/src/VestedToken.sol

Modifications of these four contracts were taken to be the diff between the versions of these contracts found in:
resources/public/contracts/src/ and
resources/public/contracts/src/orig/

Classification

Defect Severity

  • Minor - A defect that does not have a material impact on the contract execution and is likely to be subjective.
  • Moderate - A defect that could impact the desired outcome of the contract execution in a specific scenario.
  • Major - A defect that impacts the desired outcome of the contract execution or introduces a weakness that may be exploited.
  • Critical - A defect that presents a significant security vulnerability or failure of the contract across a range of scenarios.

ERC20 Short Address Attack

Modifications have been made to guard against the ERC20 short address attack as detailed here:
http://vessenes.com/the-erc20-short-address-attack-explained/
https://blog.golemproject.net/how-to-find-10m-by-just-reading-blockchain-6ae9d39fcd95

ERC20.sol adds a modifier function which is used by the transfer and transferFrom function of the MiniMeToken.sol contract to ensure that addresses passed to these functions are the correct length (i.e. not short) thus guarding against this attack vector.

This approach has been widely agreed to be correct by the community, with the caveat that any contract which subclasses the MiniMeToken contract, and calls these functions internally with a different msg.data could fail. See gist below for example:
https://ethereum.github.io/browser-solidity/#gist=f5c444b9e087d03438aa990cb91b9e3a

Minor: You may wish to consider adding this modifier to the approve function in MiniMeToken.sol as well for the same rationale.

Refactoring Interfaces Into Their Own Files

The interfaces for ApproveAndCallFallback, Controlled & TokenController have been factored out into their own files under resources/public/contracts/src/minime_interface.

I have checked that these refactored versions match the versions in "orig".

Inclusion of doTransfer in ERC20.sol

Since District0xNetworkToken.sol inherits from both MiniMeToken.sol and VestedToken.sol, a call to transfer in District0xNetworkToken.sol will use the most derived function, in this case the one defined in LimitedTransferToken.sol (from which VestedToken.sol inherits). LimitedTransferToken.sol invokes its modifier function (which has been overriden in VestedToken.sol), and then calls super.transfer, which will call transfer on the next base class in the inheritance hierarchy, which in this case will be MiniMeToken.sol.

Minor: There is also the addition of doTransfer to ERC20.sol in order to facilitate the ability to call this function from revokeTokenGrant in VestedToken.sol. An alternative would be to modify the transferableTokens function in VestedToken.sol to directly account for the ability to always transfer tokens to the original granter (or 0xdead) provided the grant is revokable. The revokeTokenGrant could then simply call transfer which in turn would call transfer in LimitedTransferToken.sol which in turn would call transfer in MiniMeToken.sol as above, which would invoke doTransfer. This would avoid the slight messiness around defining this function in ERC20.sol which seems a bit of a hack. Another option to consider is to leave VestedToken.sol alone (keep its original OpenZeppelin implementation) and subclass it with a new contract GrantControlledVestedToken.sol. This function could implement the revokeTokenGrant function, and override the transferableTokens function so that it works with revocations.

Use of SafeMath.sol

The MiniMeToken.sol and VestedToken.sol contract has been modified to use SafeMath.sol library which implicitly check for overflows.

I have checked that these modifications functionally match the versions in "orig".

Addition of return statements to LimitedTransferToken.sol

Return statements have been added to transfer and transferFrom.

Minor: For consistency it may be worth adding return statements to the approve function as well.

Modifications to VestedToken.sol

Minor: VestedToken.sol inherits from GrantsControlled.sol in order to add a modifier to grantVestedTokens such that only the grantsController can invoke this function. This modifier could also be added to revokeAllTokenGrants rather than:

if (grant.granter != msg.sender) { // Only granter can revoke it
  throw;
}

since grant.granter is guaranteed to be the grantsController due to the existing modifier on grantVestedTokens.

Minor: grants[_holder].length -= 1 should use SafeMath.sol instead.

General Comments

Minor: it may be useful for district0x to document the commit as of which they took the "orig" version of these contracts as the OpenZeppelin Github is regularly updated.

Whilst I appreciate the rationale behind these modifications, they do add complexity and reduce transparency in the overall set of contracts. Use of SafeMath and the refactoring of interfaces are functionally equivalent, so I wonder whether these changes are worthwhile given the tradeoff against not using the "official" versions of these contracts sourced directly from OpenZeppelin.

The ERC20 short address issue is more serious, and is easier to justify, although the severity of this issue is a little questionable and more of a user side issue. It should be noted that the OpenZeppelin community decided to remove these guards recently:
OpenZeppelin/openzeppelin-contracts#277

Modifications to VestedToken.sol could perhaps be refactored to centralize all logic around revoking grants in that contract, as per comments above (rather than working around the issue by adding doTransfer in ERC20.sol) which may also reduce the complexity of these changes.

In short, my suggestion would be to keep modifications of these contracts to an absolute minimum.

Review of GrantsControlled.sol

This contract (which is used in VestedToken.sol) implements a simple modifier to allow a specified address only to access grantVestedTokens.

Review of District0xNetworkToken.sol

This contract represents the district0x token (DNT). It sets both the MiniMeToken controller (via the Controlled.sol interface) and the grantsController to the constructor argument.

Review of District0xContribution.sol

This contract collects ether in exchange for DNT issuance.

Moderate: In general this contract uses unix timestamps (now) to control behavior. This value is somewhat manipulatable by miners (within bounds) and usually a better approach is to use block number as a proxy for date / time instead.

Minor: The function enableDistrict0xNetworkTokenTransfers is used to enable DNT token transfers. Since it is guarded by onlyOwner contributors to the contract are not guaranteed that their tokens will ever be transferable. It may be worth considering having a similar function that is callable by anyone a certain time after the endTime of the first contribution period that unlocks transfers to offer this guarantee. The same argument could be made for compensateContributors.

Moderate: The <address>.transfer function is used to refund contributions which exceed the hard cap for a given period, and also to pass through contributions to the wallet address. Use of this function does not follow the Checks-Effects-Interactions Pattern:
http://solidity.readthedocs.io/en/develop/security-considerations.html#use-the-checks-effects-interactions-pattern
This should still be safe given the limited gas stipend provided to the <address>.transfer function, but may be worth reviewing (moving state changes to before the call to this function).

Moderate: var is used in several places in this contract. This may have an unexpected effect if the initial value assigned is of a smaller uint and subsequently a larger value is assigned (which would not change the original type of the uint used). It may be worth considering replacing usage of var with explicit types for clarity. I have used usages of var and can't see an instance of this, but it would reduce the change for any unexpected corner-cases.

Minor: In function getRunningContribPeriod, contribPeriod.startTime and contribPeriod.endTime are compared to now. Consider changing:

contribPeriod.startTime <= now &&
contribPeriod.endTime >= now) {

to

contribPeriod.startTime <= now &&
contribPeriod.endTime > now) {

in order to match other places in the contract where this comparison is made.

Minor: In function contributeWithAddress consider changing:

var extraContribValue = newTotalContributed.sub(contribPeriods[periodIndex].hardCapAmount);
contributor.transfer(extraContribValue);

to only return extraContribValue if it is strictly greater than 0.

Minor: Consider using e.g. (1 ether) rather than 1000000000000000000 for clarity in the code.

Minor: Some functions are guarded by onlyOwner and some by onlymanyowners. It may be worth making this consistent throughout or clarify in comments the rationale behind using each of these in specific circumstances.

Minor: You can use SafeMath.sol instead of ++ in the function compensateContributors for consistency.

Minor: There is a reasonable amount of complexity around the initalization and iteration over contribution periods, which is driven by both hard / soft caps, and unix timestamps. It may be worth considering making these checks clearer, or keeping an explicit reference to the current contribution period.

Summary

Overall these contracts seem well-written with clear functionality. My primary concern would be in the modifications to the complex OpenZeppelin contracts which largely invalidate existing audits of these community contracts - if this can be refactored as per suggestions above, I would suggest seriously considering this.

Whilst it is not possible to transfer tokens to contributors immediately on contributions (since the amounts transferred depend on the total contributions in a given period) you could consider making this functionality trustless so that anyone can execute this process (for their own address) once the contribution periods have completed.

Enable then cancel

If enable is called on a contrib. period, then cancel is, ether can be collected for tokens that no longer exist.
Not sure if this is a bug, since its not different from just not calling compensate on people from that period.

Smart Contracts using DNT

Hi all,

I wanted to submit a smart contract model to the network. I wanted to add the code to the public resources page. But I am having trouble submitting the software as a pull request. I am getting an uploads disabled readout for directly uploading the file and then when I went write the code as a new submission, I wasn't able to do a pull request because it simply wasn't an option. In other open development environments I have been able to do a pull request by editing the code and then submitting the updates to the network.

Either way, I wanted to find a way to develop smart contracts with DNT and attached my code below. I would appreciate any advice or guidance on how to contribute to DNT development.

Thanks!

`#Smart Contracts

##MIT License
#Copyright Brian Haney 2021
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

import csv
from tkinter import *
import tkinter.messagebox as box

master = Tk()

#Parties
label0 = Label(master, text = 'PartyA', relief = 'groove', width = 40)
label1 = Label(master, text = 'PartyB', relief = 'groove', width = 40)
Party_A = Entry(master, relief = 'groove', width = 40)
Party_B = Entry(master, relief = 'groove', width = 40)

#Consideration
label2 = Label(master, text = 'Party A Tokens', relief = 'groove', width = 40)
label3 = Label(master, text = 'Party B Tokens', relief = 'groove', width = 40)
Party_A_C = Entry(master, relief = 'groove', width = 40)
Party_B_C = Entry(master, relief = 'groove', width = 40)

#Signed
label4 = Label(master, text = 'Sign', relief = 'groove', width = 40)
label5 = Label(master, text = 'Transaction Number', relief = 'groove', width = 40)
Party_A_Sign = Entry(master, relief = 'groove', width = 40)
Party_B_Sign = Entry(master, relief = 'groove', width = 40)

#Date
label6 = Label(master, text = 'Date', relief = 'groove', width = 40)
Date = Entry(master, relief = 'groove', width = 40)


#write to file function
def write():
    
    #Define Variavles
    Party_Red = str(Party_A.get())
    Party_Blue = str(Party_B.get())
    Party_Red_C = str(Party_A_C.get())
    Party_Blue_C = str(Party_B_C.get())
    Party_Red_Sign = str(Party_A_Sign.get())
    Party_Blue_Sign = str(Party_B_Sign.get())
    Date_0 = str(Date.get())

    #Openfile
    with open('DNT.csv', 'a') as csvfile:
    #define fieldnames
        fieldnames = ['Party A', 'Party A Consideration', 'Party A Signiture', 'Party B', 'Party B Consideration', 'Party B Signiture', 'Date']
    #define writer
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    #Write
        writer.writerow({'Party A': Party_Red, 'Party A Consideration':Party_Red_C, 'Party A Signiture':Party_Red_Sign,
                         'Party B': Party_Blue, 'Party B Consideration':Party_Blue_C, 'Party B Signiture':Party_Blue_Sign,
                         'Date': Date_0})

#Button to run write
b1 = Button(master, text = 'Execute Smart Contract', relief = 'groove', width = 25, command=write)

#function two to clear the entry widgets
def clear():
    Party_A.delete(0, END)
    Party_B.delete(0, END)
    Party_A_C.delete(0, END)
    Party_B_C.delete(0, END)
    Party_A_Sign.delete(0, END)
    Party_B_Sign.delete(0, END)
    Date.delete(0,END)
                        
#button to run function clear
b2 = Button(master, text = 'New Contract', relief = 'groove', width = 25, command=clear)

#Geometry
label0.grid( row = 1, column = 1, padx = 10 )
Party_A.grid( row = 2, column = 1, padx = 10 )
label1.grid( row = 1, column = 2, padx = 10 )
Party_B.grid( row = 2, column = 2, padx = 10 )

label2.grid( row = 3, column = 1, padx = 10 )
Party_A_C.grid( row = 4, column = 1, padx = 10 )
label3.grid( row = 3, column = 2, padx = 10 )
Party_B_C.grid( row = 4, column = 2, padx = 10 )
label4.grid( row = 5, column = 1, padx = 10 )
label5.grid( row = 5, column = 2, padx = 10 )

Party_A_Sign.grid( row = 6, column = 1, padx = 10 )
Party_B_Sign.grid( row = 6, column = 2, padx = 10 )

label6.grid( row = 7, column = 1, padx = 10 )
Date.grid( row = 7, column = 2, padx = 10 )

b1.grid( row = 8, column = 1, columnspan = 2)
b2.grid( row = 9, column = 1, columnspan = 2)

#Static Properties
master.title('DNT Smart Contract')`

Request to Add Trust Wallet for Dapps

I believe Trust Wallet is the best to use to handle dapp today. User and Dapp friendly.
Would you reconsider to add them on the website. Currently on MemeFactory its only show coinbase and metamask. Coinbase is going to remove dapp and not sure it goes with that at the moment,but considering this situation it would be best to have a proper dapp friendly wallet to be up on website.

WallMindFree

Purpose
Create an application for social relationships based on the desired level.

Description
General District Use
The district works by following the following steps:

One person (P1) joins as a member of the district.
The person can give a description of his profile so that other people who interact can see his profile.

A business (B1), be it a restaurant, cinema, theater, massage center joins the district as a business. By being a member of the district you can offer your services.

(P1) will choose the level of social relationship you want:

(N1): Relation of friendship, to stay to go to dinner, to the cinema, to see a play ..etc.
(N2): Friendship is in the background and the objective of P1 is a moment of fun sexually speaking.

After interacting both P1 members, they can decide whether to pay between the two or just one of them to B1.

Members P1 can feed back the service given by B1.

Backend
The district back-end uses the following features:
• Advertisement and listing
• Search and geolocation filtering
• Facilitate navigation and search for ads
• Classification and Reputation

The back-end will include the integration of the decentralized storage platform for users and business units.
Smart contracts and open source libraries will help control and automate everything from decision making to user voting.

The WallMindFree (WMF)
The WallMindFree Token will be used throughout the district and in each transaction.

The Future of WMF
The next step is to finish the project and let people know how it works. After that, it will be launched in the agreed quotation period.

Hard cap

The hard cap limits the next transaction and not the current one, and it's unlikely the last transaction will set the contributions to exactly equal the hard cap.

In a similar vein, in the unlikely situation a tx breaks both the hard and soft cap simultaneously , the hard cap will be completely ignored from that point forward.

These don't deserve an issue by themselves so they're here, typo @171 cao-> cap & @292 tokens

node contribution-tests.js fails on Ubuntu 16.04

I got this error message when launching the tests with the command
node contribution-tests.js
The error follows:
`§xa=l=a;xa[2]=$c;xa[1]=300;return new cljs.core.Keyword(null,"recur","recur",-437573268)}if(121===d){var Dc=a[2],ad=[new cljs.core.Keyword(null,"type","type",1174270348),new cljs.core.Keyword(null,"expected","expected",1583670997),new cljs.core.Keyword(null,"actual","actual",107306363),new cljs.core.Keyword(null,"message","message",-406056002)],cc=cljs.core.list(new cljs.core.Symbol(null,"\x3d","\x3d",-1501502141,null),5E6,cljs.core.list(new cljs.core.Symbol(null,"\x3c!","\x3c!",-1961915773,null),
^

SyntaxError: Invalid or unexpected token
at createScript (vm.js:80:10)
at Object.runInThisContext (vm.js:139:10)
at Module._compile (module.js:576:28)
at Object.Module._extensions..js (module.js:623:10)
at Module.load (module.js:531:32)
at tryModuleLoad (module.js:494:12)
at Function.Module._load (module.js:486:3)
at Function.Module.runMain (module.js:653:10)
at startup (bootstrap_node.js:187:16)
at bootstrap_node.js:608:3`

Any help?

js/compiled/app.js missing?

Hi,
I tried to open the contribution webpage on a browser but I think it is missing the titled file. Can you add it to the repo please? Even better would be the non compiled version of the file. Thanks..

Possible issue in Ownable.sol

Hey District0x guys,

There is a comment in Ownable.sol:

/// @param _newOwner The address of the new owner. 0x0 can be used to create
///  an unowned neutral vault, however that cannot be undone

However, if you call changeOwner(0x0), this will set newOwner to 0x0, but in order for owner to be then be set to newOwner, address 0x0 would need to call acceptOwnership which I don't think is possible.

So - I think either the comment is wrong, or the contract needs to be implemented differently. Probably worth clarifying either way.

Thanks,
Adam

Joining the discord

Hi all,

I am trying to join to the District Discord. But the link in the readme isn't allowing me to request to join. Can someone please post the group name for the server?

Thanks!

DNT tokens locked in the Contribution contract

Hi, @madvas!

This is a really cool project. I'm impressed by all of you achieved so far and looking forward to seeing how it evolves in the future.

There is one issue that I've discovered reading your code.
From all of the tokens that are generated in:

function setDistrict0xNetworkToken(address _district0xNetworkToken)

the amount CONTRIB_PERIOD1_STAKE is left in possession of District0xContribution.

After the sale period is ended require(endTime < now) there is an attempt to distribute all of the CONTRIB_PERIOD1_STAKE among contributors in:

function compensateContributors(uint offset, uint limit)

Despite this attempt, there may be some tokens left on the District0xContribution contract in any the two cases:

  • exception in district0xNetworkToken.transfer(contributorAddress, contributors[contributorAddress].amountCompensated);
  • tokens are sent to District0xContribution by mistake, which is always enabled:
function onTransfer(address _from, address _to, uint _amount) public returns (bool) {
  return tokenTransfersEnabled || _from == address(this) || _to == address(this);
}

There is no mechanism to reclaim theses tokens as DNT is permanently blocked for reclaim in:

function reclaimToken(address tokenAddr) external onlyOwner {
    require(!isTokenSaleToken(tokenAddr));
    ERC20Basic tokenInst = ERC20Basic(tokenAddr);
    uint256 balance = tokenInst.balanceOf(this);
    tokenInst.transfer(msg.sender, balance);
  }

This results in some of the DNT tokens may be stuck in this contract forever.

One of the solutions is to enable reclaim mechanism after the contribution period is over. Happy to send PR if you want.

Please let me know what do you think about it?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.