Code Monkey home page Code Monkey logo

crowdfund-dapp's Introduction

Decentralized Crowdfunding App

This is a simple crowdfunding dapp intended to show off what I've learned from the B9 Lab Ethereum course. The contracts are written in Solidity and the app is utilizing the Truffle framework. The frontend of the app is built with React and Webpack.

https://github.com/tyndallm/crowdfund-dapp

Contracts

FundingHub.sol The first contract is the Funding Hub. This contract is responsible for creating and maintaining a list of all Project contracts. FundingHub also offers a contribute method which can be used to contribute directly to a Project. To demonstrate a potential business model use-case Projects have been locked to only allow receiving of funds from their managing Funding Hub. You can imagine a scenario in which the FundingHub takes a small fee for managing each project.

Project.sol This contract contains all of the logic around how a crowdfunding project should operate. Projects are "locked" to their Funding Hub and can only receive funds sent thru the associated FundingHub contract address.

There are three main functions: (fund, payout, and refund)

Fund This is the function called when the FundingHub receives a contribution. If the contribution was sent after the deadline of the project passed, or the full amount has been reached, the function must return the value to the originator of the transaction. If the full funding amount has been reached, the function must call payout. NOTE: This is slightly different than the original instructions. I wanted to enforce the withdrawal pattern in the refund method as opposed to a group send. The withdrawal pattern is generally considered safer and avoids some of the pitfalls of call depth and out-of-gas issues, see more here.

Payout If funding goal has been met, transfer fund to project creator. This function protects against re-entrancy and is only payable to the project creator.

Refund If the deadline is passed and the goal was not reached, allow contributors to withdraw their contributions. NOTE This is slightly different that the final project requirements, see above for details.

App

The frontend app for this project is built on React and forks off of the truffle-webpack-demo project by Consensys. The cool thing about this is that it combines the latest in regular frontend javscript development with Ethereum. In order to manage the state of the dapp, Redux was chosen.

One of my goals of this project was to see if there was a way I could abstract the asynchronous web3 and contract calls into a simple API that I could then integrate into a standard React+Redux Action/Reducer flow. This was achieved with the web3Api.js file. This approach works well with the asynchronous nature of interacting with the blockchain as things like contract properties, and account balances can seemlessly notify the app when they have updated and the UI will reflect those changes instantly.

Here is an example of how this flow works:

  1. Upon initial load the app dispatchs fetchProjectsAndDetails()
  2. fetchProjectsAndDetails dispatchs the requestProjects Action and makes async request to web3Api's getProjects() function
  3. When the getProjects() request resolves it returns the result to the fetchProjectAndDetails() function and dispatchs the receivedProjects Action which notifies the FundingHub Reducer that the state has changed.
  4. When the app sees that the state for FundingHub has changed, the UI re-renders with the new project properties and the projects are displayed in a table on the page

Screenshots

Funding Hub screen Create project screen Project screen

Running

The Web3 RPC location will be picked up from the truffle.js file.

  1. Clone this repo
  2. npm install
  3. Make sure testrpc is running on its default port. Then:
  • npm run start - Starts the development server
  • npm run build - Generates a build
  • truffle test - Run the rest suite

crowdfund-dapp's People

Contributors

tyndallm avatar johnmcdowall avatar ted-piotrowski avatar caleteet avatar bneiluj avatar

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.