├── Screenshots ├── readme.md ├── sec.PNG ├── thi.PNG ├── first.PNG ├── second.PNG └── third.PNG ├── client ├── Readme.md ├── images │ ├── logo.png │ ├── hello.svg │ └── animated.svg ├── postcss.config.js ├── src │ ├── utils │ │ ├── shortenAddress.js │ │ ├── constants.js │ │ ├── dummyData.js │ │ └── Transactions.json │ ├── components │ │ ├── Loader.jsx │ │ ├── index.js │ │ ├── Footer.jsx │ │ ├── Services.jsx │ │ ├── Navbar.jsx │ │ ├── Transactions.jsx │ │ └── Welcome.jsx │ ├── main.jsx │ ├── App.jsx │ ├── App.css │ ├── hooks │ │ └── useFetch.jsx │ ├── favicon.svg │ ├── index.css │ └── context │ │ └── TransactionContext.jsx ├── vite.config.js ├── .gitignore ├── index.html ├── package.json └── tailwind.config.js ├── smart_contract ├── .gitignore ├── hardhat.config.js ├── README.md ├── scripts │ └── deploy.js ├── package.json ├── test │ └── sample-test.js ├── contracts │ └── Transactions.sol └── cache │ └── solidity-files-cache.json └── README.md /Screenshots/readme.md: -------------------------------------------------------------------------------- 1 | Screenshots 2 | -------------------------------------------------------------------------------- /client/Readme.md: -------------------------------------------------------------------------------- 1 | Application side 2 | -------------------------------------------------------------------------------- /Screenshots/sec.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chandran-jr/Krypt/main/Screenshots/sec.PNG -------------------------------------------------------------------------------- /Screenshots/thi.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chandran-jr/Krypt/main/Screenshots/thi.PNG -------------------------------------------------------------------------------- /Screenshots/first.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chandran-jr/Krypt/main/Screenshots/first.PNG -------------------------------------------------------------------------------- /Screenshots/second.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chandran-jr/Krypt/main/Screenshots/second.PNG -------------------------------------------------------------------------------- /Screenshots/third.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chandran-jr/Krypt/main/Screenshots/third.PNG -------------------------------------------------------------------------------- /client/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chandran-jr/Krypt/main/client/images/logo.png -------------------------------------------------------------------------------- /client/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /client/src/utils/shortenAddress.js: -------------------------------------------------------------------------------- 1 | export const shortenAddress = (address) => `${address.slice(0, 14)}.....${address.slice(address.length - 4)}`; -------------------------------------------------------------------------------- /smart_contract/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | coverage 4 | coverage.json 5 | typechain 6 | 7 | #Hardhat files 8 | cache 9 | artifacts 10 | -------------------------------------------------------------------------------- /client/src/utils/constants.js: -------------------------------------------------------------------------------- 1 | import abi from './Transactions.json'; 2 | 3 | export const contractABI = abi.abi; 4 | 5 | export const contractAddress = '0x82bC522e6ddBE1726C17b878593E07930459A7f1'; -------------------------------------------------------------------------------- /client/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()] 7 | }) 8 | -------------------------------------------------------------------------------- /client/src/components/Loader.jsx: -------------------------------------------------------------------------------- 1 | const Loader = () => { 2 | return ( 3 |
4 |
5 |
6 | ); 7 | } 8 | 9 | export default Loader; -------------------------------------------------------------------------------- /client/src/components/index.js: -------------------------------------------------------------------------------- 1 | export { default as Loader } from './Loader'; 2 | export {default as Navbar} from './Navbar'; 3 | export {default as Footer} from './Footer'; 4 | export {default as Services} from './Services'; 5 | export {default as Transactions} from './Transactions'; 6 | export {default as Welcome} from './Welcome'; -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /client/src/main.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom' 3 | import './index.css' 4 | import App from './App' 5 | import {TransactionProvider} from './context/TransactionContext'; 6 | 7 | ReactDOM.render( 8 | 9 | 10 | 11 | , 12 | , 13 | document.getElementById('root') 14 | ) 15 | -------------------------------------------------------------------------------- /smart_contract/hardhat.config.js: -------------------------------------------------------------------------------- 1 | // https://eth-ropsten.alchemyapi.io/v2/SGf4PqnjzMkShZFtY6QHv2BFOAbqmmuf 2 | 3 | require('@nomiclabs/hardhat-waffle'); 4 | 5 | module.exports = { 6 | solidity: '0.8.0', 7 | networks: { 8 | ropsten: { 9 | url: 'https://eth-ropsten.alchemyapi.io/v2/SGf4PqnjzMkShZFtY6QHv2BFOAbqmmuf', 10 | accounts: ['Your own Private Key from Metamask'] 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /client/src/App.jsx: -------------------------------------------------------------------------------- 1 | import {Navbar,Welcome,Transactions,Services,Footer} from './components'; 2 | 3 | const App = () => { 4 | 5 | return ( 6 | <> 7 |
8 |
9 | 10 | 11 |
12 | 13 | 14 |
15 |
16 | 17 | ) 18 | } 19 | 20 | export default App 21 | -------------------------------------------------------------------------------- /client/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /smart_contract/README.md: -------------------------------------------------------------------------------- 1 | # Basic Sample Hardhat Project 2 | 3 | This project demonstrates a basic Hardhat use case. It comes with a sample contract, a test for that contract, a sample script that deploys that contract, and an example of a task implementation, which simply lists the available accounts. 4 | 5 | Try running some of the following tasks: 6 | 7 | ```shell 8 | npx hardhat accounts 9 | npx hardhat compile 10 | npx hardhat clean 11 | npx hardhat test 12 | npx hardhat node 13 | node scripts/sample-script.js 14 | npx hardhat help 15 | ``` 16 | -------------------------------------------------------------------------------- /smart_contract/scripts/deploy.js: -------------------------------------------------------------------------------- 1 | const main = async () => { 2 | 3 | const Transactions = await hre.ethers.getContractFactory("Transactions"); 4 | const transactions = await Transactions.deploy(); 5 | 6 | await transactions.deployed(); 7 | 8 | console.log("Transactions deployed to:", transactions.address); 9 | } 10 | 11 | const runMain = async () => { 12 | try { 13 | await main(); 14 | process.exit(0); 15 | } 16 | catch (error) { 17 | console.log(error); 18 | process.exit(1); 19 | } 20 | } 21 | 22 | runMain(); 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Krypt 2 | 3 | ### A Web3 application built using React with Vite, Tailwind.css for styling, smart contract written in Solidity, using Alchemy for the backend, built on top of Ropsten Test Network for ethereum, using MetaMask for authentication and wallet, capable of sending Ethereum from one wallet to another, anywhere in the world, and transactions shown using gifs fetched from developer gifs API 4 | 5 | 6 | 7 | 8 | ### Transactions 9 | 10 | -------------------------------------------------------------------------------- /smart_contract/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "smart_contract", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@nomiclabs/hardhat-ethers": "^2.0.5", 14 | "@nomiclabs/hardhat-waffle": "^2.0.3", 15 | "chai": "^4.3.6", 16 | "ethereum-waffle": "^3.4.4", 17 | "ethers": "^5.6.2", 18 | "hardhat": "^2.9.2" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "krypt", 3 | "private": true, 4 | "version": "0.0.0", 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "vite build", 8 | "preview": "vite preview" 9 | }, 10 | "dependencies": { 11 | "@tailwindcss/forms": "^0.5.0", 12 | "ethers": "^5.6.2", 13 | "react": "^17.0.2", 14 | "react-dom": "^17.0.2", 15 | "react-icons": "^4.3.1" 16 | }, 17 | "devDependencies": { 18 | "@vitejs/plugin-react": "^1.0.7", 19 | "autoprefixer": "^10.4.4", 20 | "postcss": "^8.4.12", 21 | "tailwindcss": "^3.0.23", 22 | "vite": "^2.8.0" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /smart_contract/test/sample-test.js: -------------------------------------------------------------------------------- 1 | const { expect } = require("chai"); 2 | const { ethers } = require("hardhat"); 3 | 4 | describe("Greeter", function () { 5 | it("Should return the new greeting once it's changed", async function () { 6 | const Greeter = await ethers.getContractFactory("Greeter"); 7 | const greeter = await Greeter.deploy("Hello, world!"); 8 | await greeter.deployed(); 9 | 10 | expect(await greeter.greet()).to.equal("Hello, world!"); 11 | 12 | const setGreetingTx = await greeter.setGreeting("Hola, mundo!"); 13 | 14 | // wait until the transaction is mined 15 | await setGreetingTx.wait(); 16 | 17 | expect(await greeter.greet()).to.equal("Hola, mundo!"); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /client/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | height: 40vmin; 7 | pointer-events: none; 8 | } 9 | 10 | @media (prefers-reduced-motion: no-preference) { 11 | .App-logo { 12 | animation: App-logo-spin infinite 20s linear; 13 | } 14 | } 15 | 16 | .App-header { 17 | background-color: #282c34; 18 | min-height: 100vh; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: center; 23 | font-size: calc(10px + 2vmin); 24 | color: white; 25 | } 26 | 27 | .App-link { 28 | color: #61dafb; 29 | } 30 | 31 | @keyframes App-logo-spin { 32 | from { 33 | transform: rotate(0deg); 34 | } 35 | to { 36 | transform: rotate(360deg); 37 | } 38 | } 39 | 40 | button { 41 | font-size: calc(10px + 2vmin); 42 | } 43 | -------------------------------------------------------------------------------- /client/src/hooks/useFetch.jsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | 3 | const APIKEY = "I3mwc33DxfJdBcbq0hV2FTkK7nLmzSIW"; 4 | 5 | const useFetch = ({ keyword }) => { 6 | const [gifUrl, setGifUrl] = useState(""); 7 | 8 | const fetchGifs = async () => { 9 | try { 10 | const response = await fetch(`https://api.giphy.com/v1/gifs/search?api_key=${APIKEY}&q=${keyword.split(" ").join("")}&limit=1`); 11 | const { data } = await response.json(); 12 | 13 | setGifUrl(data[0]?.images?.downsized_medium.url); 14 | } catch (error) { 15 | setGifUrl("https://metro.co.uk/wp-content/uploads/2015/05/pokemon_crying.gif?quality=90&strip=all&zoom=1&resize=500%2C284"); 16 | } 17 | }; 18 | 19 | useEffect(() => { 20 | if (keyword) fetchGifs(); 21 | }, [keyword]); 22 | 23 | return gifUrl; 24 | }; 25 | 26 | export default useFetch; -------------------------------------------------------------------------------- /client/tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | purge: ["./src/**/*.{js,jsx,ts,tsx}", "./public/index.html"], 3 | mode: "jit", 4 | darkMode: false, // or 'media' or 'class' 5 | theme: { 6 | fontFamily: { 7 | display: ["Open Sans", "sans-serif"], 8 | body: ["Open Sans", "sans-serif"], 9 | }, 10 | extend: { 11 | screens: { 12 | mf: "990px", 13 | }, 14 | keyframes: { 15 | "slide-in": { 16 | "0%": { 17 | "-webkit-transform": "translateX(120%)", 18 | transform: "translateX(120%)", 19 | }, 20 | "100%": { 21 | "-webkit-transform": "translateX(0%)", 22 | transform: "translateX(0%)", 23 | }, 24 | }, 25 | }, 26 | animation: { 27 | "slide-in": "slide-in 0.5s ease-out", 28 | }, 29 | }, 30 | }, 31 | variants: { 32 | extend: {}, 33 | }, 34 | plugins: [require("@tailwindcss/forms")], 35 | }; -------------------------------------------------------------------------------- /smart_contract/contracts/Transactions.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: UNLICENSED 2 | 3 | pragma solidity ^0.8.0; 4 | 5 | contract Transactions { 6 | 7 | uint256 transactionCount; 8 | 9 | event Transfer (address from, address receiver, uint amount, string message, uint256 timestamp, string keyword); 10 | 11 | struct TransferStruct { 12 | address sender; 13 | address receiver; 14 | uint amount; 15 | string message; 16 | uint256 timestamp; 17 | string keyword; 18 | } 19 | 20 | TransferStruct[] transactions; 21 | 22 | function addToBlockchain(address payable receiver, uint amount, string memory message, string memory keyword) public { 23 | transactionCount+=1; 24 | transactions.push(TransferStruct(msg.sender, receiver, amount, message, block.timestamp, keyword)); 25 | 26 | emit Transfer(msg.sender, receiver, amount, message, block.timestamp, keyword); 27 | } 28 | 29 | function getAllTransactions() public view returns (TransferStruct[] memory) { 30 | return transactions; 31 | } 32 | 33 | function getTransactionCount() public view returns (uint256) { 34 | return transactionCount; 35 | } 36 | } -------------------------------------------------------------------------------- /client/src/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /client/src/components/Footer.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import logo from "../../images/logo.png"; 4 | 5 | const Footer = () => ( 6 |
7 |
8 |
9 | logo 10 |
11 |
12 |

Market

13 |

Exchange

14 |

Tutorials

15 |

Wallets

16 |
17 |
18 | 19 |
20 |

Come join us and hear for the unexpected miracle

21 |

govindchandran150@gmail.com

22 |
23 | 24 |
25 | 26 |
27 |

GOVIND B CHANDRAN

28 |

All rights reserved

29 |
30 |
31 | ); 32 | 33 | export default Footer; -------------------------------------------------------------------------------- /smart_contract/cache/solidity-files-cache.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-cache-2", 3 | "files": { 4 | "C:\\Users\\ACER\\Documents\\Krypt\\smart_contract\\contracts\\Greeter.sol": { 5 | "lastModificationDate": 1648891286910, 6 | "contentHash": "54c28c84e5277b35b8c8329ce9755dae", 7 | "sourceName": "contracts/Greeter.sol", 8 | "solcConfig": { 9 | "version": "0.8.4", 10 | "settings": { 11 | "optimizer": { 12 | "enabled": false, 13 | "runs": 200 14 | }, 15 | "outputSelection": { 16 | "*": { 17 | "*": [ 18 | "abi", 19 | "evm.bytecode", 20 | "evm.deployedBytecode", 21 | "evm.methodIdentifiers", 22 | "metadata" 23 | ], 24 | "": [ 25 | "ast" 26 | ] 27 | } 28 | } 29 | } 30 | }, 31 | "imports": [ 32 | "hardhat/console.sol" 33 | ], 34 | "versionPragmas": [ 35 | "^0.8.0" 36 | ], 37 | "artifacts": [ 38 | "Greeter" 39 | ] 40 | }, 41 | "C:\\Users\\ACER\\Documents\\Krypt\\smart_contract\\node_modules\\hardhat\\console.sol": { 42 | "lastModificationDate": 1648891286894, 43 | "contentHash": "cc4777addd464ea56fa35b1c45df0591", 44 | "sourceName": "hardhat/console.sol", 45 | "solcConfig": { 46 | "version": "0.8.4", 47 | "settings": { 48 | "optimizer": { 49 | "enabled": false, 50 | "runs": 200 51 | }, 52 | "outputSelection": { 53 | "*": { 54 | "*": [ 55 | "abi", 56 | "evm.bytecode", 57 | "evm.deployedBytecode", 58 | "evm.methodIdentifiers", 59 | "metadata" 60 | ], 61 | "": [ 62 | "ast" 63 | ] 64 | } 65 | } 66 | } 67 | }, 68 | "imports": [], 69 | "versionPragmas": [ 70 | ">=0.4.22 <0.9.0" 71 | ], 72 | "artifacts": [ 73 | "console" 74 | ] 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /client/src/utils/dummyData.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | id: 1, 4 | url: "https://metro.co.uk/wp-content/uploads/2015/05/pokemon_crying.gif?quality=90&strip=all&zoom=1&resize=500%2C284", 5 | message: "", 6 | timestamp: "12/21/2021, 4:33:21 PM", 7 | addressFrom: "0xCF8e569A97C423952DdFf902375C7C76549A6A90", 8 | amount: "0.01", 9 | addressTo: "0x8aa395Ab97837576aF9cd6946C79024ef1acfdbE", 10 | }, 11 | { 12 | id: 2, 13 | url: "https://media4.popsugar-assets.com/files/2013/11/07/832/n/1922398/eb7a69a76543358d_28.gif", 14 | message: "", 15 | timestamp: "12/21/2021, 4:33:21 PM", 16 | addressFrom: "0xCF8e569A97C423952DdFf902375C7C76549A6A90", 17 | amount: "0.01", 18 | addressTo: "0x8aa395Ab97837576aF9cd6946C79024ef1acfdbE", 19 | }, 20 | { 21 | id: 3, 22 | url: "https://acegif.com/wp-content/uploads/gif-shaking-head-38.gif", 23 | message: "", 24 | timestamp: "12/21/2021, 4:33:21 PM", 25 | addressFrom: "0xCF8e569A97C423952DdFf902375C7C76549A6A90", 26 | amount: "0.01", 27 | addressTo: "0x8aa395Ab97837576aF9cd6946C79024ef1acfdbE", 28 | }, 29 | { 30 | id: 4, 31 | url: "https://i.pinimg.com/originals/68/a0/9e/68a09e774e98242871c2db0f99307420.gif", 32 | message: "", 33 | timestamp: "12/21/2021, 4:33:21 PM", 34 | addressFrom: "0xCF8e569A97C423952DdFf902375C7C76549A6A90", 35 | amount: "0.01", 36 | addressTo: "0x8aa395Ab97837576aF9cd6946C79024ef1acfdbE", 37 | }, 38 | { 39 | id: 5, 40 | url: "https://i.pinimg.com/originals/73/d3/a1/73d3a14d212314ab1f7268b71d639c15.gif", 41 | message: "", 42 | timestamp: "12/21/2021, 4:33:21 PM", 43 | addressFrom: "0xCF8e569A97C423952DdFf902375C7C76549A6A90", 44 | amount: "0.01", 45 | addressTo: "0x8aa395Ab97837576aF9cd6946C79024ef1acfdbE", 46 | }, 47 | { 48 | id: 6, 49 | url: "https://www.omnisend.com/blog/wp-content/uploads/2016/09/funny-gifs-9.gif", 50 | message: "", 51 | timestamp: "12/21/2021, 4:33:21 PM", 52 | addressFrom: "0xCF8e569A97C423952DdFf902375C7C76549A6A90", 53 | amount: "0.01", 54 | addressTo: "0x8aa395Ab97837576aF9cd6946C79024ef1acfdbE", 55 | }, 56 | ]; -------------------------------------------------------------------------------- /client/src/components/Services.jsx: -------------------------------------------------------------------------------- 1 | import {BsShieldFillCheck} from 'react-icons/bs'; 2 | import {BiSearchAlt} from 'react-icons/bi'; 3 | import {RiHeart2Fill} from 'react-icons/ri'; 4 | import {BsFillLightningChargeFill} from 'react-icons/bs'; 5 | 6 | const ServiceCard = ({color,title,icon,subTitle}) => ( 7 |
8 |
9 | {icon} 10 |
11 |
12 |

{title}

13 |

{subTitle}

14 |
15 |
16 | ) 17 | 18 | const Services = () => { 19 | return ( 20 |
21 |
22 |
23 |

Services that we
Continue to Improve

24 |
25 |
26 | 27 |
28 | } 32 | subTitle="Security is always our priority, we maintain privacy and quality!!" 33 | /> 34 | } 38 | subTitle="The best rates with the lowest gas fees you will ever find here!!" 39 | /> 40 | } 44 | subTitle="We provide amongst the fastest transactions ever, in seconds!!" 45 | /> 46 |
47 |
48 | ); 49 | } 50 | 51 | export default Services; -------------------------------------------------------------------------------- /client/src/components/Navbar.jsx: -------------------------------------------------------------------------------- 1 | import {HiMenuAlt4} from 'react-icons/hi'; 2 | import {AiOutlineClose} from 'react-icons/ai'; 3 | import logo from '../../images/logo.png'; 4 | import React from 'react'; 5 | import {useState} from 'react'; 6 | import { TransactionContext } from "../context/TransactionContext"; 7 | import {useContext} from "react"; 8 | 9 | const NavBarItem = ({title,classProps}) => { 10 | return ( 11 |
  • 12 | {title} 13 |
  • 14 | ) 15 | } 16 | 17 | const Navbar = () => { 18 | 19 | const [toggleMenu,setToggleMenu] = useState(false); 20 | const {connectWallet, currentAccount} = useContext(TransactionContext); 21 | 22 | return ( 23 | 50 | ); 51 | } 52 | 53 | export default Navbar; -------------------------------------------------------------------------------- /client/src/index.css: -------------------------------------------------------------------------------- 1 | @import url("https://fonts.googleapis.com/css2?family=Open+Sans:wght@300;400;500;600;700&display=swap"); 2 | 3 | * html { 4 | padding: 0; 5 | margin: 0; 6 | box-sizing: border-box; 7 | } 8 | 9 | body { 10 | margin: 0; 11 | font-family: "Open Sans", sans-serif; 12 | -webkit-font-smoothing: antialiased; 13 | -moz-osx-font-smoothing: grayscale; 14 | } 15 | 16 | .gradient-bg-welcome { 17 | background-color:#0f0e13; 18 | background-image: 19 | radial-gradient(at 0% 0%, hsla(253,16%,7%,1) 0, transparent 50%), 20 | radial-gradient(at 50% 0%, hsla(225,39%,30%,1) 0, transparent 50%), 21 | radial-gradient(at 100% 0%, hsla(339,49%,30%,1) 0, transparent 50%); 22 | } 23 | 24 | .gradient-bg-services { 25 | background-color:#0f0e13; 26 | background-image: 27 | radial-gradient(at 0% 0%, hsla(253,16%,7%,1) 0, transparent 50%), 28 | radial-gradient(at 50% 100%, hsla(225,39%,25%,1) 0, transparent 50%); 29 | } 30 | 31 | .gradient-bg-transactions { 32 | background-color: #0f0e13; 33 | background-image: 34 | radial-gradient(at 0% 100%, hsla(253,16%,7%,1) 0, transparent 50%), 35 | radial-gradient(at 50% 0%, hsla(225,39%,25%,1) 0, transparent 50%); 36 | } 37 | 38 | .gradient-bg-footer { 39 | background-color: #0f0e13; 40 | background-image: 41 | radial-gradient(at 0% 100%, hsla(253,16%,7%,1) 0, transparent 53%), 42 | radial-gradient(at 50% 150%, hsla(339,49%,30%,1) 0, transparent 50%); 43 | } 44 | 45 | .blue-glassmorphism { 46 | background: rgb(39, 51, 89, 0.4); 47 | border-radius: 16px; 48 | box-shadow: 0 4px 30px rgba(0, 0, 0, 0.2); 49 | backdrop-filter: blur(5px); 50 | -webkit-backdrop-filter: blur(5px); 51 | border: 1px solid rgba(0, 0, 0, 0.3); 52 | } 53 | 54 | /* white glassmorphism */ 55 | .white-glassmorphism { 56 | background: rgba(255, 255, 255, 0.05); 57 | border-radius: 16px; 58 | backdrop-filter: blur(5px); 59 | -webkit-backdrop-filter: blur(5px); 60 | border: 1px solid rgba(255, 255, 255, 0.3); 61 | } 62 | 63 | .eth-card { 64 | background-color:#ff99af; 65 | background-image: 66 | radial-gradient(at 85% 90%, hsla(183,73%,67%,1) 0px, transparent 50%), 67 | radial-gradient(at 21% 57%, hsla(25,97%,64%,1) 0px, transparent 50%), 68 | radial-gradient(at 67% 23%, hsla(48,65%,70%,1) 0px, transparent 50%), 69 | radial-gradient(at 84% 5%, hsla(77,82%,65%,1) 0px, transparent 50%); 70 | } 71 | 72 | .text-gradient { 73 | background-color: #fff; 74 | background-image: radial-gradient(at 4% 36%, hsla(0,0%,100%,1) 0, transparent 53%), radial-gradient(at 100% 60%, rgb(0, 0, 0) 0, transparent 50%); 75 | -webkit-background-clip: text; 76 | -webkit-text-fill-color: transparent; 77 | } 78 | 79 | @tailwind base; 80 | @tailwind components; 81 | @tailwind utilities; -------------------------------------------------------------------------------- /client/src/components/Transactions.jsx: -------------------------------------------------------------------------------- 1 | import { useContext } from "react"; 2 | import React from "react"; 3 | import {TransactionContext} from "../context/TransactionContext"; 4 | import dummyData from "../utils/dummyData"; 5 | import {shortenAddress} from "../utils/shortenAddress"; 6 | import useFetch from "../hooks/useFetch"; 7 | 8 | const TransactionCard = ({ addressTo, addressFrom, timestamp, message, keyword, amount, url }) => { 9 | const gifUrl = useFetch({ keyword }); 10 | 11 | return ( 12 |
    20 |
    21 |
    22 | 23 |

    From: {shortenAddress(addressFrom)}

    24 |
    25 | 26 |

    To: {shortenAddress(addressTo)}

    27 |
    28 |

    Amount: {amount} ETH

    29 | {message && ( 30 | <> 31 |
    32 |

    Message: {message}

    33 | 34 | )} 35 |
    36 | nature 41 |
    42 |

    {timestamp}

    43 |
    44 |
    45 |
    46 | ); 47 | }; 48 | 49 | const Transactions = () => { 50 | const {currentAccount, transactions} = useContext(TransactionContext); 51 | 52 | return ( 53 |
    54 |
    55 | {currentAccount ? (

    Latest Transactions

    ) : (

    Connect wallet to see transactions

    )} 56 | 57 |
    58 | {transactions.map((transaction, i) => ( 59 | 60 | ))} 61 |
    62 |
    63 |
    64 | ); 65 | } 66 | 67 | export default Transactions; -------------------------------------------------------------------------------- /client/src/context/TransactionContext.jsx: -------------------------------------------------------------------------------- 1 | import React, {useEffect,useState} from 'react'; 2 | import {ethers} from 'ethers'; 3 | 4 | import {contractABI, contractAddress} from '../utils/constants'; 5 | import { parse } from '@ethersproject/transactions'; 6 | 7 | export const TransactionContext = React.createContext(); 8 | 9 | const {ethereum} = window; 10 | 11 | const getEthereumContract = () => { 12 | const provider = new ethers.providers.Web3Provider(ethereum); 13 | const signer = provider.getSigner(); 14 | const transactionContract = new ethers.Contract(contractAddress,contractABI,signer); 15 | 16 | 17 | return transactionContract; 18 | 19 | } 20 | 21 | export const TransactionProvider = ({children}) => { 22 | 23 | const [formData, setformData] = useState({ addressTo: "", amount: "", keyword: "", message: "" }); 24 | const [currentAccount, setCurrentAccount] = useState(); 25 | const [isLoading, setIsLoading] = useState(false); 26 | const [transactionCount, setTransactionCount] = useState(localStorage.getItem("transactionCount")); 27 | const [transactions, setTransactions] = useState([]); 28 | 29 | const handleChange = (e, name) => { 30 | setformData((prevState) => ({ ...prevState, [name]: e.target.value })); 31 | }; 32 | 33 | const getAllTransactions = async () => { 34 | try { 35 | if(!ethereum) { 36 | return alert ("Please install Metamask on browser as an extension") 37 | } 38 | const transactionContract = getEthereumContract(); 39 | const availableTransactions = await transactionContract.getAllTransactions(); 40 | 41 | const structuredTransactions = availableTransactions.map((transaction) => ({ 42 | addressTo: transaction.receiver, 43 | addressFrom: transaction.sender, 44 | timestamp: new Date(transaction.timestamp.toNumber() * 1000).toLocaleString(), 45 | message: transaction.message, 46 | keyword: transaction.keyword, 47 | amount: parseInt(transaction.amount._hex) / (10 ** 18) 48 | })); 49 | 50 | setTransactions(structuredTransactions) 51 | console.log(structuredTransactions); 52 | 53 | 54 | } catch (error) { 55 | console.log(error); 56 | } 57 | } 58 | 59 | const checkWalletConnected = async() => { 60 | 61 | try { 62 | if(!ethereum) { 63 | return alert ("Please install Metamask on browser as an extension") 64 | } 65 | 66 | const accounts = await ethereum.request({method: 'eth_accounts'}) 67 | 68 | if(accounts.length) { 69 | setCurrentAccount(accounts[0]); 70 | getAllTransactions(); 71 | } 72 | else { 73 | console.log("No accounts found"); 74 | } 75 | 76 | } 77 | catch(error) { 78 | console.error(error); 79 | throw new Error['No Ethereum Object'] 80 | } 81 | } 82 | 83 | const sendTransaction = async () => { 84 | try{ 85 | if(!ethereum) { 86 | return alert ("Please install Metamask on browser as an extension") 87 | } 88 | const { addressTo, amount, keyword, message } = formData; 89 | const transactionContract = getEthereumContract(); 90 | const parsedAmount = ethers.utils.parseEther(amount); 91 | 92 | await ethereum.request({ 93 | method: 'eth_sendTransaction', 94 | params: [{ 95 | from: currentAccount, 96 | to: addressTo, 97 | gas: '0x5208', 98 | value: parsedAmount._hex 99 | }] 100 | }) 101 | 102 | const transactionHash = await transactionContract.addToBlockchain(addressTo,parsedAmount,message,keyword); 103 | 104 | setIsLoading(true); 105 | console.log(transactionHash.hash); 106 | await transactionHash.wait(); 107 | setIsLoading(false); 108 | console.log(transactionHash.hash); 109 | 110 | const transactionCount = await transactionContract.getTransactionCount(); 111 | 112 | setTransactionCount(transactionCount.toNumber()); 113 | 114 | window.reload(); 115 | } 116 | catch(error) { 117 | console.error(error); 118 | throw new Error['No Ethereum Object'] 119 | } 120 | } 121 | 122 | const checkTransactionExists = async() => { 123 | try { 124 | const transactionContract = getEthereumContract(); 125 | const transactionCount = await transactionContract.getTransactionCount(); 126 | window.localStorage.setItem("transactionCount", transactionCount); 127 | } catch (error) { 128 | console.error(error); 129 | throw new Error['No Ethereum Object'] 130 | } 131 | } 132 | 133 | const connectWallet = async () => { 134 | try { 135 | if(!ethereum) { 136 | return alert ("Please install Metamask on browser as an extension") 137 | } 138 | const accounts = await ethereum.request({method: 'eth_requestAccounts'}) 139 | setCurrentAccount(accounts[0]); 140 | } 141 | 142 | catch(error) { 143 | console.error(error); 144 | 145 | throw new Error['No Ethereum Object'] 146 | } 147 | } 148 | 149 | useEffect(() => { 150 | checkWalletConnected(); 151 | checkTransactionExists(); 152 | },[]); 153 | 154 | return ( 155 | 156 | {children} 157 | 158 | ) 159 | } -------------------------------------------------------------------------------- /client/src/components/Welcome.jsx: -------------------------------------------------------------------------------- 1 | import { AiFillPlayCircle } from "react-icons/ai"; 2 | import {SiEthereum} from 'react-icons/si'; 3 | import {BsInfoCircle} from 'react-icons/bs'; 4 | import React, {useContext} from "react"; 5 | 6 | import {Loader} from './' 7 | 8 | import { TransactionContext } from "../context/TransactionContext"; 9 | import {shortenAddress} from "../utils/shortenAddress"; 10 | 11 | const commonStyles = "min-h-[70px] sm:px-0 px-2 sm:min-w-[120px] flex justify-center items-center border-[2px] border-white-400 text-sm font-bold text-white"; 12 | 13 | const Input = ({placeholder, name, type, value, handleChange}) => ( 14 | handleChange(e,name)} 20 | className="my-2 w-full rounded-sm p-2 outline-none bg-transparent text-white border-none text-sm white-glassmorphism " 21 | /> 22 | ) 23 | 24 | const Welcome = () => { 25 | const {connectWallet, currentAccount, formData,sendTransaction,handleChange,isLoading} = useContext(TransactionContext); 26 | 27 | const handleSubmit = (e) => { 28 | const { addressTo, amount, keyword, message } = formData; 29 | 30 | e.preventDefault(); 31 | 32 | if(!addressTo || !amount || !keyword || !message) { 33 | return; 34 | } 35 | else { 36 | sendTransaction(); 37 | } 38 | 39 | }; 40 | 41 | return ( 42 |
    43 |
    44 |
    45 |

    Send Crypto
    Anywhere, Anytime!

    46 |

    Explore the crypto world. Buy, Sell & hold crypto here!!

    47 | 48 | {!currentAccount && ()} 51 |
    52 |
    53 | Reliable 54 |
    55 |
    56 | Secure 57 |
    58 |
    59 | Fast 60 |
    61 |
    62 | Web 3.0 63 |
    64 |
    65 | Ethereum 66 |
    67 |
    68 | Low fees 69 |
    70 |
    71 |
    72 | 73 |
    74 |
    75 |
    76 |
    77 |
    78 | 79 |
    80 | 81 |
    82 |
    83 |

    84 | {currentAccount ? shortenAddress(currentAccount) : (

    No wallet connected

    )} 85 |

    86 |

    87 | Ethereum 88 |

    89 |
    90 |
    91 |
    92 | 93 |
    94 | 95 | 96 | 97 | 98 | 99 |
    100 | 101 | {isLoading 102 | ? 103 | : ( 104 | 111 | )} 112 |
    113 |
    114 | 115 |
    116 |
    117 | 118 | ); 119 | } 120 | export default Welcome; -------------------------------------------------------------------------------- /client/images/hello.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/images/animated.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/src/utils/Transactions.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "Transactions", 4 | "sourceName": "contracts/Transactions.sol", 5 | "abi": [ 6 | { 7 | "anonymous": false, 8 | "inputs": [ 9 | { 10 | "indexed": false, 11 | "internalType": "address", 12 | "name": "from", 13 | "type": "address" 14 | }, 15 | { 16 | "indexed": false, 17 | "internalType": "address", 18 | "name": "receiver", 19 | "type": "address" 20 | }, 21 | { 22 | "indexed": false, 23 | "internalType": "uint256", 24 | "name": "amount", 25 | "type": "uint256" 26 | }, 27 | { 28 | "indexed": false, 29 | "internalType": "string", 30 | "name": "message", 31 | "type": "string" 32 | }, 33 | { 34 | "indexed": false, 35 | "internalType": "uint256", 36 | "name": "timestamp", 37 | "type": "uint256" 38 | }, 39 | { 40 | "indexed": false, 41 | "internalType": "string", 42 | "name": "keyword", 43 | "type": "string" 44 | } 45 | ], 46 | "name": "Transfer", 47 | "type": "event" 48 | }, 49 | { 50 | "inputs": [ 51 | { 52 | "internalType": "address payable", 53 | "name": "receiver", 54 | "type": "address" 55 | }, 56 | { 57 | "internalType": "uint256", 58 | "name": "amount", 59 | "type": "uint256" 60 | }, 61 | { 62 | "internalType": "string", 63 | "name": "message", 64 | "type": "string" 65 | }, 66 | { 67 | "internalType": "string", 68 | "name": "keyword", 69 | "type": "string" 70 | } 71 | ], 72 | "name": "addToBlockchain", 73 | "outputs": [], 74 | "stateMutability": "nonpayable", 75 | "type": "function" 76 | }, 77 | { 78 | "inputs": [], 79 | "name": "getAllTransactions", 80 | "outputs": [ 81 | { 82 | "components": [ 83 | { 84 | "internalType": "address", 85 | "name": "sender", 86 | "type": "address" 87 | }, 88 | { 89 | "internalType": "address", 90 | "name": "receiver", 91 | "type": "address" 92 | }, 93 | { 94 | "internalType": "uint256", 95 | "name": "amount", 96 | "type": "uint256" 97 | }, 98 | { 99 | "internalType": "string", 100 | "name": "message", 101 | "type": "string" 102 | }, 103 | { 104 | "internalType": "uint256", 105 | "name": "timestamp", 106 | "type": "uint256" 107 | }, 108 | { 109 | "internalType": "string", 110 | "name": "keyword", 111 | "type": "string" 112 | } 113 | ], 114 | "internalType": "struct Transactions.TransferStruct[]", 115 | "name": "", 116 | "type": "tuple[]" 117 | } 118 | ], 119 | "stateMutability": "view", 120 | "type": "function" 121 | }, 122 | { 123 | "inputs": [], 124 | "name": "getTransactionCount", 125 | "outputs": [ 126 | { 127 | "internalType": "uint256", 128 | "name": "", 129 | "type": "uint256" 130 | } 131 | ], 132 | "stateMutability": "view", 133 | "type": "function" 134 | } 135 | ], 136 | "bytecode": "0x608060405234801561001057600080fd5b50610c0d806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806327506f53146100465780632e7700f014610064578063cc2d7ead14610082575b600080fd5b61004e61009e565b60405161005b91906108b9565b60405180910390f35b61006c6102e1565b60405161007991906108db565b60405180910390f35b61009c600480360381019061009791906105e1565b6102ea565b005b60606001805480602002602001604051908101604052809291908181526020016000905b828210156102d857838290600052602060002090600602016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820180546101ab90610ad9565b80601f01602080910402602001604051908101604052809291908181526020018280546101d790610ad9565b80156102245780601f106101f957610100808354040283529160200191610224565b820191906000526020600020905b81548152906001019060200180831161020757829003601f168201915b505050505081526020016004820154815260200160058201805461024790610ad9565b80601f016020809104026020016040519081016040528092919081815260200182805461027390610ad9565b80156102c05780601f10610295576101008083540402835291602001916102c0565b820191906000526020600020905b8154815290600101906020018083116102a357829003601f168201915b505050505081525050815260200190600101906100c2565b50505050905090565b60008054905090565b60016000808282546102fc91906109bd565b9250508190555060016040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200142815260200183815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301908051906020019061043b9291906104ac565b506080820151816004015560a08201518160050190805190602001906104629291906104ac565b5050507f416cfa4330a4565f45c2fd2dd4826a83a37443aba2ce6f79477c7355afac35fa33858585428660405161049e9695949392919061084a565b60405180910390a150505050565b8280546104b890610ad9565b90600052602060002090601f0160209004810192826104da5760008555610521565b82601f106104f357805160ff1916838001178555610521565b82800160010185558215610521579182015b82811115610520578251825591602001919060010190610505565b5b50905061052e9190610532565b5090565b5b8082111561054b576000816000905550600101610533565b5090565b600061056261055d84610927565b6108f6565b90508281526020810184848401111561057a57600080fd5b610585848285610a97565b509392505050565b60008135905061059c81610ba9565b92915050565b600082601f8301126105b357600080fd5b81356105c384826020860161054f565b91505092915050565b6000813590506105db81610bc0565b92915050565b600080600080608085870312156105f757600080fd5b60006106058782880161058d565b9450506020610616878288016105cc565b935050604085013567ffffffffffffffff81111561063357600080fd5b61063f878288016105a2565b925050606085013567ffffffffffffffff81111561065c57600080fd5b610668878288016105a2565b91505092959194509250565b6000610680838361079c565b905092915050565b61069181610a61565b82525050565b6106a081610a13565b82525050565b6106af81610a13565b82525050565b60006106c082610967565b6106ca818561098a565b9350836020820285016106dc85610957565b8060005b8581101561071857848403895281516106f98582610674565b94506107048361097d565b925060208a019950506001810190506106e0565b50829750879550505050505092915050565b600061073582610972565b61073f818561099b565b935061074f818560208601610aa6565b61075881610b98565b840191505092915050565b600061076e82610972565b61077881856109ac565b9350610788818560208601610aa6565b61079181610b98565b840191505092915050565b600060c0830160008301516107b46000860182610697565b5060208301516107c76020860182610697565b5060408301516107da604086018261082c565b50606083015184820360608601526107f2828261072a565b9150506080830151610807608086018261082c565b5060a083015184820360a086015261081f828261072a565b9150508091505092915050565b61083581610a57565b82525050565b61084481610a57565b82525050565b600060c08201905061085f60008301896106a6565b61086c6020830188610688565b610879604083018761083b565b818103606083015261088b8186610763565b905061089a608083018561083b565b81810360a08301526108ac8184610763565b9050979650505050505050565b600060208201905081810360008301526108d381846106b5565b905092915050565b60006020820190506108f0600083018461083b565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561091d5761091c610b69565b5b8060405250919050565b600067ffffffffffffffff82111561094257610941610b69565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006109c882610a57565b91506109d383610a57565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610a0857610a07610b0b565b5b828201905092915050565b6000610a1e82610a37565b9050919050565b6000610a3082610a37565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000610a6c82610a73565b9050919050565b6000610a7e82610a85565b9050919050565b6000610a9082610a37565b9050919050565b82818337600083830152505050565b60005b83811015610ac4578082015181840152602081019050610aa9565b83811115610ad3576000848401525b50505050565b60006002820490506001821680610af157607f821691505b60208210811415610b0557610b04610b3a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b610bb281610a25565b8114610bbd57600080fd5b50565b610bc981610a57565b8114610bd457600080fd5b5056fea26469706673582212203af44f407b708154e97f85223f7ae9d1369e2fff9736d7e51fb2702114b0f77364736f6c63430008000033", 137 | "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806327506f53146100465780632e7700f014610064578063cc2d7ead14610082575b600080fd5b61004e61009e565b60405161005b91906108b9565b60405180910390f35b61006c6102e1565b60405161007991906108db565b60405180910390f35b61009c600480360381019061009791906105e1565b6102ea565b005b60606001805480602002602001604051908101604052809291908181526020016000905b828210156102d857838290600052602060002090600602016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820180546101ab90610ad9565b80601f01602080910402602001604051908101604052809291908181526020018280546101d790610ad9565b80156102245780601f106101f957610100808354040283529160200191610224565b820191906000526020600020905b81548152906001019060200180831161020757829003601f168201915b505050505081526020016004820154815260200160058201805461024790610ad9565b80601f016020809104026020016040519081016040528092919081815260200182805461027390610ad9565b80156102c05780601f10610295576101008083540402835291602001916102c0565b820191906000526020600020905b8154815290600101906020018083116102a357829003601f168201915b505050505081525050815260200190600101906100c2565b50505050905090565b60008054905090565b60016000808282546102fc91906109bd565b9250508190555060016040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200142815260200183815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301908051906020019061043b9291906104ac565b506080820151816004015560a08201518160050190805190602001906104629291906104ac565b5050507f416cfa4330a4565f45c2fd2dd4826a83a37443aba2ce6f79477c7355afac35fa33858585428660405161049e9695949392919061084a565b60405180910390a150505050565b8280546104b890610ad9565b90600052602060002090601f0160209004810192826104da5760008555610521565b82601f106104f357805160ff1916838001178555610521565b82800160010185558215610521579182015b82811115610520578251825591602001919060010190610505565b5b50905061052e9190610532565b5090565b5b8082111561054b576000816000905550600101610533565b5090565b600061056261055d84610927565b6108f6565b90508281526020810184848401111561057a57600080fd5b610585848285610a97565b509392505050565b60008135905061059c81610ba9565b92915050565b600082601f8301126105b357600080fd5b81356105c384826020860161054f565b91505092915050565b6000813590506105db81610bc0565b92915050565b600080600080608085870312156105f757600080fd5b60006106058782880161058d565b9450506020610616878288016105cc565b935050604085013567ffffffffffffffff81111561063357600080fd5b61063f878288016105a2565b925050606085013567ffffffffffffffff81111561065c57600080fd5b610668878288016105a2565b91505092959194509250565b6000610680838361079c565b905092915050565b61069181610a61565b82525050565b6106a081610a13565b82525050565b6106af81610a13565b82525050565b60006106c082610967565b6106ca818561098a565b9350836020820285016106dc85610957565b8060005b8581101561071857848403895281516106f98582610674565b94506107048361097d565b925060208a019950506001810190506106e0565b50829750879550505050505092915050565b600061073582610972565b61073f818561099b565b935061074f818560208601610aa6565b61075881610b98565b840191505092915050565b600061076e82610972565b61077881856109ac565b9350610788818560208601610aa6565b61079181610b98565b840191505092915050565b600060c0830160008301516107b46000860182610697565b5060208301516107c76020860182610697565b5060408301516107da604086018261082c565b50606083015184820360608601526107f2828261072a565b9150506080830151610807608086018261082c565b5060a083015184820360a086015261081f828261072a565b9150508091505092915050565b61083581610a57565b82525050565b61084481610a57565b82525050565b600060c08201905061085f60008301896106a6565b61086c6020830188610688565b610879604083018761083b565b818103606083015261088b8186610763565b905061089a608083018561083b565b81810360a08301526108ac8184610763565b9050979650505050505050565b600060208201905081810360008301526108d381846106b5565b905092915050565b60006020820190506108f0600083018461083b565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561091d5761091c610b69565b5b8060405250919050565b600067ffffffffffffffff82111561094257610941610b69565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006109c882610a57565b91506109d383610a57565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610a0857610a07610b0b565b5b828201905092915050565b6000610a1e82610a37565b9050919050565b6000610a3082610a37565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000610a6c82610a73565b9050919050565b6000610a7e82610a85565b9050919050565b6000610a9082610a37565b9050919050565b82818337600083830152505050565b60005b83811015610ac4578082015181840152602081019050610aa9565b83811115610ad3576000848401525b50505050565b60006002820490506001821680610af157607f821691505b60208210811415610b0557610b04610b3a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b610bb281610a25565b8114610bbd57600080fd5b50565b610bc981610a57565b8114610bd457600080fd5b5056fea26469706673582212203af44f407b708154e97f85223f7ae9d1369e2fff9736d7e51fb2702114b0f77364736f6c63430008000033", 138 | "linkReferences": {}, 139 | "deployedLinkReferences": {} 140 | } 141 | --------------------------------------------------------------------------------