first commit

This commit is contained in:
Faizhn 2024-07-17 11:03:52 +07:00
parent 99cc871dd8
commit 1a8e67496e
21 changed files with 173 additions and 30 deletions

View File

@ -35,6 +35,41 @@
"artifacts": [
"Crowdfunding"
]
},
"E:\\blockxstarter super final git\\blockxstarter\\crowdfunding\\src\\contracts\\Crowdfunding.sol": {
"lastModificationDate": 1719969053251,
"contentHash": "ed6a87ec28f0e0260fc567ac6fffa946",
"sourceName": "src/contracts/Crowdfunding.sol",
"solcConfig": {
"version": "0.8.11",
"settings": {
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"abi",
"evm.bytecode",
"evm.deployedBytecode",
"evm.methodIdentifiers",
"metadata"
],
"": [
"ast"
]
}
}
}
},
"imports": [],
"versionPragmas": [
"^0.8.7"
],
"artifacts": [
"Crowdfunding"
]
}
}
}

View File

@ -1,7 +1,8 @@
require('@nomiclabs/hardhat-waffle')
require('@nomiclabs/hardhat-etherscan')
require('dotenv').config()
const { API_URL, PRIVATE_KEY } = process.env;
const { API_URL, PRIVATE_KEY, ETHERSCAN_API_KEY } = process.env
module.exports = {
defaultNetwork: 'sepolia',
@ -11,6 +12,9 @@ module.exports = {
accounts: [`0x${PRIVATE_KEY}`]
},
},
etherscan: {
apiKey: ETHERSCAN_API_KEY
},
solidity: {
version: '0.8.11',
settings: {

2
package-lock.json generated
View File

@ -1,5 +1,5 @@
{
"name": "demo",
"name": "crowdfunding",
"version": "0.0.0",
"lockfileVersion": 3,
"requires": true,

View File

@ -1,5 +1,5 @@
{
"name": "demo",
"name": "crowdfunding",
"private": true,
"version": "0.0.0",
"scripts": {
@ -19,6 +19,7 @@
"moment": "^2.29.4",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-google-recaptcha": "^3.1.0",
"react-hooks-global-state": "^1.0.2",
"react-icons": "^4.3.1",
"react-identicons": "^1.2.5",
@ -31,6 +32,7 @@
"web-vitals": "^2.1.4"
},
"devDependencies": {
"@nomiclabs/hardhat-etherscan": "^3.1.8",
"@openzeppelin/contracts": "^4.5.0",
"@tailwindcss/forms": "0.4.0",
"assert": "^2.0.0",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,3 +1,3 @@
{
"address": "0x6EDDfdEca0cacB915EA53AbD3a7D86757cd649CE"
"address": "0xf17828b611D2b4601EDc2C361cB67B1de112b5e5"
}

View File

@ -1,4 +1,4 @@
{
"_format": "hh-sol-dbg-1",
"buildInfo": "..\\..\\..\\build-info\\2dfcbeb6cd62675e9921eab4db6e9eaf.json"
"buildInfo": "..\\..\\..\\build-info\\61fd3f84cc5c7185fe7b64e3f4c1e380.json"
}

File diff suppressed because one or more lines are too long

View File

@ -126,4 +126,4 @@ const BackProject = ({ project }) => {
);
};
export default BackProject;
export default BackProject

View File

@ -1,9 +1,10 @@
import { useState, useEffect } from 'react'
import { useState, useEffect, useRef } from 'react'
import { FaTimes, FaEthereum } from 'react-icons/fa'
import { toast } from 'react-toastify'
import { createProject } from '../services/blockchain'
import { useGlobalState, setGlobalState } from '../store'
import crowd from '../assets/crowd.png'
import ReCAPTCHA from 'react-google-recaptcha'
const CreateProject = () => {
const [createModal] = useGlobalState('createModal')
@ -18,6 +19,9 @@ const CreateProject = () => {
const [imageURL, setImageURL] = useState('')
const [category, setCategory] = useState('')
const [selectedCurrency, setSelectedCurrency] = useState('IDR')
const [captchaValue, setCaptchaValue] = useState(null)
const recaptchaRef = useRef(null)
useEffect(() => {
const fetchExchangeRate = async () => {
@ -57,7 +61,7 @@ const CreateProject = () => {
const handleSubmit = async (e) => {
e.preventDefault()
if (!title || !description || !costETH || !date || !imageURL || !category) return
if (!title || !description || !costETH || !date || !imageURL || !category || !captchaValue) return
const params = {
title,
@ -89,6 +93,8 @@ const CreateProject = () => {
setImageURL('')
setDate('')
setCategory('')
setCaptchaValue(null)
recaptchaRef.current.reset()
}
const handleOverlayClick = (e) => {
@ -101,6 +107,10 @@ const CreateProject = () => {
setSelectedCurrency(selectedCurrency === 'IDR' ? 'USD' : 'IDR')
}
const onChangeCaptcha = (value) => {
setCaptchaValue(value)
}
return (
<div
className={`fixed top-0 left-0 w-screen h-screen flex items-center justify-center bg-black bg-opacity-50 transform transition-transform duration-300 ${createModal}`}
@ -225,8 +235,7 @@ const CreateProject = () => {
<div className="mb-6">
<textarea
className="block w-full bg-gray-100 border border-gray-300 rounded-lg text-gray-700 py-2 px-3 leading-tight focus:outline-none focus
focus:bg-white focus:border-gray-500"
className="block w-full bg-gray-100 border border-gray-300 rounded-lg text-gray-700 py-2 px-3 leading-tight focus:outline-none focus:bg-white focus:border-gray-500"
type="text"
name="description"
placeholder="Deskripsi"
@ -237,6 +246,14 @@ const CreateProject = () => {
></textarea>
</div>
<div className="mb-6">
<ReCAPTCHA
sitekey="6LfV__4pAAAAAPXf2ldifkouTbRjlz8nM_kUmf1t"
onChange={onChangeCaptcha}
ref={recaptchaRef}
/>
</div>
<button
type="submit"
className="inline-block w-full px-6 py-3 bg-green-600 text-white font-medium text-lg leading-tight rounded-lg shadow-md hover:bg-green-700 transition duration-300"

View File

@ -79,4 +79,4 @@ const Header = () => {
);
};
export default Header;
export default Header

View File

@ -47,4 +47,4 @@ const Navbar = () => {
);
};
export default Navbar;
export default Navbar

View File

@ -33,4 +33,4 @@ const Newsletter = () => {
);
};
export default Newsletter;
export default Newsletter

View File

@ -55,4 +55,4 @@ const Backer = ({ backer }) => (
</tr>
);
export default ProjectBackers;
export default ProjectBackers

View File

@ -170,7 +170,6 @@ const ProjectDetails = ({ project }) => {
</div>
</div>
{/* Comments Section */}
<div className="md:col-span-1 mt-6 md:mt-0">
<h3 className="text-lg font-semibold mb-4">Dukungan Komentar</h3>
<div className="space-y-4 h-96 overflow-y-auto">
@ -228,7 +227,9 @@ const ProjectDetails = ({ project }) => {
>
Tambah Komentar
</button>
{connectedAccount !== project.owner && (
<FaExclamationCircle className="ml-2 text-grey-500 cursor-pointer" title="Hanya pengguna yang telah mendukung project ini yang dapat menambahkan komentar" />
)}
</div>
</>
)}
@ -240,4 +241,4 @@ const ProjectDetails = ({ project }) => {
);
};
export default ProjectDetails;
export default ProjectDetails

View File

@ -143,4 +143,4 @@ const ProjectCard = ({ project }) => {
);
};
export default Projects;
export default Projects

View File

@ -28,4 +28,4 @@ const Title = () => {
)
}
export default Title;
export default Title

View File

@ -147,9 +147,9 @@ const UpdateProject = ({ project }) => {
<button
type="submit"
className="w-full px-6 py-2.5 bg-blue-600
className="w-full px-6 py-2.5 bg-gray-600
text-white font-medium text-md leading-tight
rounded-lg shadow-md hover:bg-blue-700 transition-colors"
rounded-lg shadow-md hover:bg-gray-700 transition-colors"
>
Edit
</button>

View File

@ -131,7 +131,7 @@ contract Crowdfunding {
projects[id].imageURL = imageURL;
projects[id].expiresAt = expiresAt;
checkAndRefund(id); // Memeriksa dan mengembalikan dana jika perlu
checkAndRefund(id);
emit Action (
id,
@ -200,7 +200,7 @@ contract Crowdfunding {
block.timestamp
);
checkAndRefund(id); // Memeriksa dan mengembalikan dana jika perlu
checkAndRefund(id);
if(projects[id].raised >= projects[id].cost) {
projects[id].status = statusEnum.APPROVED;

View File

@ -1479,7 +1479,7 @@
"@ethersproject/logger" "^5.7.0"
"@ethersproject/properties" "^5.7.0"
"@ethersproject/address@5.7.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.7.0":
"@ethersproject/address@5.7.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0":
version "5.7.0"
resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37"
integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==
@ -2443,6 +2443,22 @@
resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0"
integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==
"@nomiclabs/hardhat-etherscan@^3.1.8":
version "3.1.8"
resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.8.tgz#3c12ee90b3733e0775e05111146ef9418d4f5a38"
integrity sha512-v5F6IzQhrsjHh6kQz4uNrym49brK9K5bYCq2zQZ729RYRaifI9hHbtmK+KkIVevfhut7huQFEQ77JLRMAzWYjQ==
dependencies:
"@ethersproject/abi" "^5.1.2"
"@ethersproject/address" "^5.0.2"
cbor "^8.1.0"
chalk "^2.4.2"
debug "^4.1.1"
fs-extra "^7.0.1"
lodash "^4.17.11"
semver "^6.3.0"
table "^6.8.0"
undici "^5.14.0"
"@nomiclabs/hardhat-waffle@^2.0.3":
version "2.0.6"
resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.6.tgz#d11cb063a5f61a77806053e54009c40ddee49a54"
@ -3716,6 +3732,16 @@ ajv@^8.0.0, ajv@^8.6.0, ajv@^8.9.0:
require-from-string "^2.0.2"
uri-js "^4.2.2"
ajv@^8.0.1:
version "8.16.0"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.16.0.tgz#22e2a92b94f005f7e0f9c9d39652ef0b8f6f0cb4"
integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==
dependencies:
fast-deep-equal "^3.1.3"
json-schema-traverse "^1.0.0"
require-from-string "^2.0.2"
uri-js "^4.4.1"
ansi-colors@4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
@ -3981,6 +4007,11 @@ ast-types-flow@^0.0.7:
resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"
integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==
astral-regex@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
async-eventemitter@^0.2.2:
version "0.2.4"
resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca"
@ -5445,6 +5476,13 @@ catering@^2.1.0, catering@^2.1.1:
resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510"
integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==
cbor@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5"
integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==
dependencies:
nofilter "^3.1.0"
cborg@^1.5.4, cborg@^1.6.0:
version "1.10.2"
resolved "https://registry.yarnpkg.com/cborg/-/cborg-1.10.2.tgz#83cd581b55b3574c816f82696307c7512db759a1"
@ -10906,6 +10944,11 @@ lodash.sortby@^4.7.0:
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==
lodash.truncate@^4.4.2:
version "4.4.2"
resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==
lodash.uniq@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
@ -11605,6 +11648,11 @@ node-releases@^2.0.12:
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039"
integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==
nofilter@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66"
integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==
normalize-package-data@^2.3.2:
version "2.5.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
@ -12927,7 +12975,7 @@ prompts@^2.0.1, prompts@^2.4.2:
kleur "^3.0.3"
sisteransi "^1.0.5"
prop-types@^15.8.1:
prop-types@^15.5.0, prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
@ -13180,6 +13228,14 @@ react-app-rewired@^2.1.11:
dependencies:
semver "^5.6.0"
react-async-script@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/react-async-script/-/react-async-script-1.2.0.tgz#ab9412a26f0b83f5e2e00de1d2befc9400834b21"
integrity sha512-bCpkbm9JiAuMGhkqoAiC0lLkb40DJ0HOEJIku+9JDjxX3Rcs+ztEOG13wbrOskt3n2DTrjshhaQ/iay+SnGg5Q==
dependencies:
hoist-non-react-statics "^3.3.0"
prop-types "^15.5.0"
react-dev-utils@^12.0.0:
version "12.0.1"
resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73"
@ -13223,6 +13279,14 @@ react-error-overlay@^6.0.11:
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb"
integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==
react-google-recaptcha@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/react-google-recaptcha/-/react-google-recaptcha-3.1.0.tgz#44aaab834495d922b9d93d7d7a7fb2326315b4ab"
integrity sha512-cYW2/DWas8nEKZGD7SCu9BSuVz8iOcOLHChHyi7upUuVhkpkhYG/6N3KDiTQ3XAiZ2UAZkfvYKMfAHOzBOcGEg==
dependencies:
prop-types "^15.5.0"
react-async-script "^1.2.0"
react-hooks-global-state@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/react-hooks-global-state/-/react-hooks-global-state-1.0.2.tgz#37bbc3203a0be9f3ac0658abfd28dd7ce7ee166c"
@ -14221,6 +14285,15 @@ slash@^4.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7"
integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==
slice-ansi@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
dependencies:
ansi-styles "^4.0.0"
astral-regex "^2.0.0"
is-fullwidth-code-point "^3.0.0"
snapdragon-node@^2.0.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
@ -14583,7 +14656,7 @@ string-width@^1.0.1:
is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0"
string-width@^4.1.0, string-width@^4.2.0:
string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@ -14854,6 +14927,17 @@ symbol-tree@^3.2.4:
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
table@^6.8.0:
version "6.8.2"
resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58"
integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==
dependencies:
ajv "^8.0.1"
lodash.truncate "^4.4.2"
slice-ansi "^4.0.0"
string-width "^4.2.3"
strip-ansi "^6.0.1"
tailwindcss@3.0.18:
version "3.0.18"
resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.0.18.tgz#ea4825e6496d77dc21877b6b61c7cc56cda3add5"
@ -15532,7 +15616,7 @@ update-browserslist-db@^1.0.11:
escalade "^3.1.1"
picocolors "^1.0.0"
uri-js@^4.2.2:
uri-js@^4.2.2, uri-js@^4.4.1:
version "4.4.1"
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==