FINAL PROJECT REQUIREMENTS

Each student will participate in a team (of 3-4 students each) which will propose, and deliver, a smart contract-based Daap or DAO of their choice in the form of one or more cooperating smart contracts onto Ethereum (Testnet only).  It is intended for teams to have significant latitude in defining their Daap/DAO project.  This flexibility is evidenced in team self-selection and formation as well as in the use case selection for their Daap/DAO as well as in the specific requirements of the project as delineated by their chosen use case.  Use cases can come from a variety of verticals; for example (Note:  this list is only intended to be illustrative of breadth of problem space), a team may choose to focus on building a simple token exchange, or focus on provenance and authenticity, or they may focus on identity verification or ownership verification.  Other possibilities include an NFT-based art brokerage, decentralized prediction markets, regulatory auditing, crowdfunding, auctions, and yes, games and gambling.  Teams are of course welcome and expected to come up their own "take" on the problem space they would like to tackle.

Best practices should be employed in your deliverables and a good starting point is here: 

Index - Ethereum Smart Contract Best Practices (consensys.github.io)

Periodic Requirements:

1.  Team Self-Selection & Formation (July 3, 2023)
2.  Team Project Proposal (July 24, 2023)
2.  Team Project Check-Ins with Faculty (2) and proposal updates (To be scheduled weeks of July 17th, 2023 & July 31st, 2023)
3.  Final Team project code
delivery and deployment (Thursday, August 17th, 2023)
4.  Final Team project presentation to class and post-mortem (August 14, 2023)

Project Proposal Requirements:

Project proposal drafts should be detailed in terms of:

* Use Case:  Describe the general use case and what your team is going to do and an overview of the solution.

* Approach (Design Approach with Diagram(s)):  What will your deployed project look like in terms of contracts and capabilities? [Feel free to leverage UML in your diagrams]

* Tools:  What tools (Solidity, Remix, VS Code, Oracalize, truffle, ganache, etc.) do you anticipate needing and leveraging?

* Anticipated Complexities and Mitigation Plans:  This stuff isn't easy.  What "gotchas" do you feel you may encounter?  What backup plans (tools, approach, etc.) do you have in case of trouble?

NOTE:  You may (and will) revise your proposal throughout the course even after initial submission.

Specific Project Requirements:

A "front end" is optional.  Teams are free to submit their Daap driveable solely through a defined API, and, at their sole discretion, may include a front end (HTML, Node.js, Web3, Angular, etc.).  Teams that choose to add a user-friendly (does not have to be beautiful!!!) front-end may be more impressive than just an API-based solution.  HOWEVER, AND HEAR THIS, NO AMOUNT OF FRONT END RAZZMATAZZ WILL MAKE UP FOR A FUNDAMENTAL LACK OF CAPABILITY IN THE SMART CONTRACT(S).  IT IS ABOUT THE SMART CONTRACT FUNCTIONALITY, NOT THE FRONT-END BELLS AND WHISTLES.  A very simple field-based front end is all that you should focus on, if you even decide to add one at all.  Remember, there is no requirement for a front end, and you will not be downgraded for not supplying one.  The very last thing you want is to deliver a beautiful user experience and have your Dapp's contract(s) basically not work.  Tactics might dictate getting the contract(s) working first with tests and APIs, and then, if you have time and are so incined, throw together a front end.

Project code for smart contracts must be written in the Solidity programming language.  Other languages may be used for additional project support (python, JavaScript, etc.).

All projects must include copious tests (Mocha, e.g.) that ensure fundamental functionality, and all tests must run successfully.

A token (coin) must be integrated (you may utilize any
standard ERC token specification)

Projects should be be delivered onto the Sepolia Testnet for final delivery, testing and grading, although final deployment onto Ganache is acceptable.

Projects may access external data through the form of oracle frameworks, off-chain data, etc.

Projects may utilize decentralized storage options such as Swarm or IPFS.

Projects may utilize ENS (the Ethereum Name Service) at their discretion.

Projects may utilize Whisper messaging at their discretion.

Projects may utilize Docker containers in any way that might help facilitate delivery of capabilities

Projects must have some form of security awareness built in (e.g., onlyOwnable, etc. modifiers, requires() protections, gas limits, data privacy, etc.).  That said, we do not expect a faultless contract (e.g., if you need a source of randomness, you will not be penalized if your source of entropy is in a state of von Neumann sin or lacks Markovian randomness, or your contract makes potentially-compromising external calls).  [Note::  help can be found at https://consensys.github.io/smart-contract-best-practices/.  You may wish to employ a linter.]

Projects must emit and handle events.

Libraries may be used (e.g. SafeMath, OpenZeppelin, etc.)