├── 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 |
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 |
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 |
24 |
25 |
26 |
27 |
28 |
29 | {["Market", "Exchange", "Tutorials", "Wallets"].map((item, index) => (
30 |
31 | ))}
32 | {!currentAccount && (
33 | Login
34 | )}
35 |
36 |
37 | {toggleMenu ?
setToggleMenu(false)} /> : setToggleMenu(true)} />}
38 | {toggleMenu &&
39 | (
40 |
41 | setToggleMenu(false)}/>
42 |
43 | {["Market", "Exchange", "Tutorials", "Wallets"].map((item, index) => (
44 |
45 | ))}
46 | )}
47 |
48 |
49 |
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 |
36 |
41 |
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 && (
49 | Connect Wallet
50 | )}
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 |
82 |
83 |
84 | {currentAccount ? shortenAddress(currentAccount) : (
No wallet connected )}
85 |
86 |
87 | Ethereum
88 |
89 |
90 |
91 |
92 |
93 |
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 |
--------------------------------------------------------------------------------