├── .gitignore ├── public ├── robots.txt ├── favicon.ico ├── favicon-16x16.png ├── favicon-32x32.png ├── apple-touch-icon.png ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── manifest.json └── index.html ├── src ├── index.js ├── index.css ├── App.css ├── App.js └── utils │ └── WavePortal.json ├── README.md ├── package.json └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clever-web/wave-portal-frontend/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clever-web/wave-portal-frontend/HEAD/public/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clever-web/wave-portal-frontend/HEAD/public/favicon-32x32.png -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clever-web/wave-portal-frontend/HEAD/public/apple-touch-icon.png -------------------------------------------------------------------------------- /public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clever-web/wave-portal-frontend/HEAD/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clever-web/wave-portal-frontend/HEAD/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import App from './App'; 5 | 6 | ReactDOM.render(, document.getElementById('root')); 7 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 12 | monospace; 13 | } 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # buildspace Wave Portal 👋 2 | 3 | ### **Welcome!** 4 | To get started with this course, clone this repo and follow these commands: 5 | 6 | 1. Run `npm install` at the root of your directory 7 | 2. Run `npm run start` to start the project 8 | 3. Start coding! 9 | 10 | ### **Questions?** 11 | Have some questions make sure you head over to your [buildspace Dashboard](https://app.buildspace.so/courses/CO02cf0f1c-f996-4f50-9669-cf945ca3fb0b) and link your Discord account so you can get access to helpful channels and your instructor! 12 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /src/App.css: -------------------------------------------------------------------------------- 1 | .mainContainer { 2 | display: flex; 3 | justify-content: center; 4 | width: 100%; 5 | margin-top: 64px; 6 | } 7 | 8 | .dataContainer { 9 | display: flex; 10 | flex-direction: column; 11 | justify-content: center; 12 | max-width: 600px; 13 | } 14 | 15 | .header { 16 | text-align: center; 17 | font-size: 32px; 18 | font-weight: 600; 19 | } 20 | 21 | .bio { 22 | text-align: center; 23 | color: gray; 24 | margin-top: 16px; 25 | } 26 | 27 | .waveButton { 28 | cursor: pointer; 29 | margin-top: 16px; 30 | padding: 8px; 31 | border: 0; 32 | border-radius: 5px; 33 | 34 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "creap", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@testing-library/jest-dom": "^4.2.4", 7 | "@testing-library/react": "^9.3.2", 8 | "@testing-library/user-event": "^7.1.2", 9 | "ethers": "^5.4.4", 10 | "react": "^16.12.0", 11 | "react-dom": "^16.12.0", 12 | "react-scripts": "3.2.0" 13 | }, 14 | "scripts": { 15 | "start": "react-scripts start", 16 | "build": "react-scripts build", 17 | "test": "react-scripts test", 18 | "eject": "react-scripts eject" 19 | }, 20 | "eslintConfig": { 21 | "extends": "react-app" 22 | }, 23 | "browserslist": { 24 | "production": [ 25 | ">0.2%", 26 | "not dead", 27 | "not op_mini all" 28 | ], 29 | "development": [ 30 | "last 1 chrome version", 31 | "last 1 firefox version", 32 | "last 1 safari version" 33 | ] 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 buildspace 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | Wave Portal 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 45 | 46 | 47 | 48 |
49 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | 2 | import React, { useEffect, useState } from "react"; 3 | import { ethers } from "ethers"; 4 | import "./App.css"; 5 | import abi from "./utils/WavePortal.json"; 6 | 7 | const App = () => { 8 | const [currentAccount, setCurrentAccount] = useState(""); 9 | 10 | const [allWaves, setAllWaves] = useState([]); 11 | 12 | const contractAddress = "0xfec3155141E9C2D4a2194D87ebea5D6379B99c19"; 13 | 14 | const contractABI = abi.abi; 15 | 16 | const checkIfWalletIsConnected = async () => { 17 | try { 18 | const { ethereum } = window; 19 | 20 | if (!ethereum) { 21 | console.log("Make sure you have metamask!"); 22 | return; 23 | } else { 24 | console.log("We have the ethereum object", ethereum); 25 | } 26 | 27 | const accounts = await ethereum.request({ method: "eth_accounts" }); 28 | 29 | if (accounts.length !== 0) { 30 | const account = accounts[0]; 31 | console.log("Found an authorized account:", account); 32 | setCurrentAccount(account); 33 | getAllWaves(); 34 | } else { 35 | console.log("No authorized account found") 36 | } 37 | } catch (error) { 38 | console.log(error); 39 | } 40 | } 41 | 42 | /** 43 | * Implement your connectWallet method here 44 | */ 45 | const connectWallet = async () => { 46 | try { 47 | const { ethereum } = window; 48 | 49 | if (!ethereum) { 50 | alert("Get MetaMask!"); 51 | return; 52 | } 53 | 54 | const accounts = await ethereum.request({ method: "eth_requestAccounts" }); 55 | 56 | console.log("Connected", accounts[0]); 57 | setCurrentAccount(accounts[0]); 58 | } catch (error) { 59 | console.log(error) 60 | } 61 | } 62 | 63 | const wave = async () => { 64 | try { 65 | const { ethereum } = window; 66 | 67 | if (ethereum) { 68 | const provider = new ethers.providers.Web3Provider(ethereum); 69 | const signer = provider.getSigner(); 70 | const wavePortalContract = new ethers.Contract(contractAddress, contractABI, signer); 71 | 72 | let count = await wavePortalContract.getTotalWaves(); 73 | console.log("Retrieved total wave count...", count.toNumber()); 74 | 75 | /* 76 | * Execute the actual wave from your smart contract 77 | */ 78 | const waveTxn = await wavePortalContract.wave("I love you!", { gasLimit: 300000 }); 79 | console.log("Mining...", waveTxn.hash); 80 | 81 | await waveTxn.wait(); 82 | console.log("Mined -- ", waveTxn.hash); 83 | 84 | count = await wavePortalContract.getTotalWaves(); 85 | console.log("Retrieved total wave count...", count.toNumber()); 86 | } else { 87 | console.log("Ethereum object doesn't exist!"); 88 | } 89 | } catch (error) { 90 | console.log(error); 91 | } 92 | } 93 | 94 | // const getAllWaves = async () => { 95 | // try { 96 | // const { ethereum } = window; 97 | // if (ethereum) { 98 | // const provider = new ethers.providers.Web3Provider(ethereum); 99 | // const signer = provider.getSigner(); 100 | // const wavePortalContract = new ethers.Contract(contractAddress, contractABI, signer); 101 | 102 | // 103 | // const waves = await wavePortalContract.getAllWaves(); 104 | 105 | 106 | // /* 107 | // * We only need address, timestamp, and message in our UI so let's 108 | // * pick those out 109 | // */ 110 | // let wavesCleaned = []; 111 | 112 | // waves.forEach(wave => { 113 | // wavesCleaned.push({ 114 | // address: wave.waver, 115 | // timestamp: new Date(wave.timestamp * 1000), 116 | // message: wave.message 117 | // }); 118 | // }); 119 | 120 | // 121 | // setAllWaves(wavesCleaned); 122 | // } else { 123 | // console.log("Ethereum object doesn't exist!") 124 | // } 125 | // } catch (error) { 126 | // console.log(error); 127 | // } 128 | // } 129 | 130 | const getAllWaves = async () => { 131 | const { ethereum } = window; 132 | 133 | try { 134 | if (ethereum) { 135 | const provider = new ethers.providers.Web3Provider(ethereum); 136 | const signer = provider.getSigner(); 137 | const wavePortalContract = new ethers.Contract(contractAddress, contractABI, signer); 138 | const waves = await wavePortalContract.getAllWaves(); 139 | 140 | const wavesCleaned = waves.map(wave => { 141 | return { 142 | address: wave.waver, 143 | timestamp: new Date(wave.timestamp * 1000), 144 | message: wave.message, 145 | }; 146 | }); 147 | 148 | setAllWaves(wavesCleaned); 149 | } else { 150 | console.log("Ethereum object doesn't exist!"); 151 | } 152 | } catch (error) { 153 | console.log(error); 154 | } 155 | }; 156 | /** 157 | * Listen in for emitter events! 158 | */ 159 | useEffect(() => { 160 | let wavePortalContract; 161 | 162 | const onNewWave = (from, timestamp, message) => { 163 | console.log("NewWave", from, timestamp, message); 164 | setAllWaves(prevState => [ 165 | ...prevState, 166 | { 167 | address: from, 168 | timestamp: new Date(timestamp * 1000), 169 | message: message, 170 | }, 171 | ]); 172 | }; 173 | 174 | if (window.ethereum) { 175 | const provider = new ethers.providers.Web3Provider(window.ethereum); 176 | const signer = provider.getSigner(); 177 | 178 | wavePortalContract = new ethers.Contract(contractAddress, contractABI, signer); 179 | wavePortalContract.on("NewWave", onNewWave); 180 | } 181 | 182 | return () => { 183 | if (wavePortalContract) { 184 | wavePortalContract.off("NewWave", onNewWave); 185 | } 186 | }; 187 | }, []); 188 | 189 | useEffect(() => { 190 | checkIfWalletIsConnected(); 191 | }, []) 192 | 193 | return ( 194 |
195 |
196 |
197 | 👋 Hey there! 198 |
199 | 200 |
201 | I am farza and I worked on self-driving cars so that's pretty cool right? Connect your Ethereum wallet and wave at me! 202 |
203 | 204 | 207 | 208 | {!currentAccount && ( 209 | 212 | )} 213 | 214 | {allWaves.map((wave, index) => { 215 | return ( 216 |
217 |
Address: {wave.address}
218 |
Time: {wave.timestamp.toString()}
219 |
Message: {wave.message}
220 |
) 221 | })} 222 |
223 |
224 | ); 225 | } 226 | 227 | export default App 228 | -------------------------------------------------------------------------------- /src/utils/WavePortal.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "WavePortal", 4 | "sourceName": "contracts/WavePortal.sol", 5 | "abi": [ 6 | { 7 | "inputs": [], 8 | "stateMutability": "payable", 9 | "type": "constructor" 10 | }, 11 | { 12 | "anonymous": false, 13 | "inputs": [ 14 | { 15 | "indexed": true, 16 | "internalType": "address", 17 | "name": "from", 18 | "type": "address" 19 | }, 20 | { 21 | "indexed": false, 22 | "internalType": "uint256", 23 | "name": "timestamp", 24 | "type": "uint256" 25 | }, 26 | { 27 | "indexed": false, 28 | "internalType": "string", 29 | "name": "message", 30 | "type": "string" 31 | } 32 | ], 33 | "name": "NewWave", 34 | "type": "event" 35 | }, 36 | { 37 | "inputs": [], 38 | "name": "getAllWaves", 39 | "outputs": [ 40 | { 41 | "components": [ 42 | { 43 | "internalType": "address", 44 | "name": "waver", 45 | "type": "address" 46 | }, 47 | { 48 | "internalType": "string", 49 | "name": "message", 50 | "type": "string" 51 | }, 52 | { 53 | "internalType": "uint256", 54 | "name": "timestamp", 55 | "type": "uint256" 56 | } 57 | ], 58 | "internalType": "struct WavePortal.Wave[]", 59 | "name": "", 60 | "type": "tuple[]" 61 | } 62 | ], 63 | "stateMutability": "view", 64 | "type": "function" 65 | }, 66 | { 67 | "inputs": [], 68 | "name": "getTotalWaves", 69 | "outputs": [ 70 | { 71 | "internalType": "uint256", 72 | "name": "", 73 | "type": "uint256" 74 | } 75 | ], 76 | "stateMutability": "view", 77 | "type": "function" 78 | }, 79 | { 80 | "inputs": [ 81 | { 82 | "internalType": "address", 83 | "name": "", 84 | "type": "address" 85 | } 86 | ], 87 | "name": "lastWavedAt", 88 | "outputs": [ 89 | { 90 | "internalType": "uint256", 91 | "name": "", 92 | "type": "uint256" 93 | } 94 | ], 95 | "stateMutability": "view", 96 | "type": "function" 97 | }, 98 | { 99 | "inputs": [ 100 | { 101 | "internalType": "string", 102 | "name": "_message", 103 | "type": "string" 104 | } 105 | ], 106 | "name": "wave", 107 | "outputs": [], 108 | "stateMutability": "nonpayable", 109 | "type": "function" 110 | } 111 | ], 112 | "bytecode": "0x60806040526200004f6040518060400160405280601981526020017f57652068617665206265656e20636f6e737472756374656421000000000000008152506200007760201b620006451760201c565b606444426200005f9190620001c4565b6200006b919062000261565b60018190555062000308565b62000117816040516024016200008e919062000184565b6040516020818303038152906040527f41304fac000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506200011a60201b60201c565b50565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b60006200015082620001a8565b6200015c8185620001b3565b93506200016e8185602086016200022b565b6200017981620002f7565b840191505092915050565b60006020820190508181036000830152620001a0818462000143565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000620001d18262000221565b9150620001de8362000221565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000216576200021562000299565b5b828201905092915050565b6000819050919050565b60005b838110156200024b5780820151818401526020810190506200022e565b838111156200025b576000848401525b50505050565b60006200026e8262000221565b91506200027b8362000221565b9250826200028e576200028d620002c8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b61112380620003186000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063449d46c0146100515780639a2cdc081461006d578063a42a46631461008b578063bd43a908146100bb575b600080fd5b61006b60048036038101906100669190610988565b6100d9565b005b6100756104d3565b6040516100829190610db5565b60405180910390f35b6100a560048036038101906100a0919061095f565b6104dc565b6040516100b29190610db5565b60405180910390f35b6100c36104f4565b6040516100d09190610cb1565b60405180910390f35b42601e600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546101269190610ed2565b10610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015d90610d95565b60405180910390fd5b42600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060016000808282546101bc9190610ed2565b925050819055506102026040518060400160405280600d81526020017f2573206861732077617665642100000000000000000000000000000000000000815250336106de565b600260405180606001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200183815260200142815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010190805190602001906102c192919061083f565b50604082015181600201555050606460015442446102df9190610ed2565b6102e99190610ed2565b6102f39190610fd8565b60018190555061033a6040518060400160405280601681526020017f52616e646f6d20232067656e6572617465643a2025640000000000000000000081525060015461077a565b603260015411610480576103836040518060400160405280600781526020017f257320776f6e2100000000000000000000000000000000000000000000000000815250336106de565b6000655af3107a40009050478111156103d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103c890610d55565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16826040516103f790610c9c565b60006040518083038185875af1925050503d8060008114610434576040519150601f19603f3d011682016040523d82523d6000602084013e610439565b606091505b505090508061047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047490610d75565b60405180910390fd5b50505b3373ffffffffffffffffffffffffffffffffffffffff167f5f7e16dc676677766a70e9c5628aa6c54ddb8b6e5188e2ae1e1f17f1ffbea71642836040516104c8929190610dd0565b60405180910390a250565b60008054905090565b60036020528060005260406000206000915090505481565b60606002805480602002602001604051908101604052809291908181526020016000905b8282101561063c57838290600052602060002090600302016040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820180546105a190610fa6565b80601f01602080910402602001604051908101604052809291908181526020018280546105cd90610fa6565b801561061a5780601f106105ef5761010080835404028352916020019161061a565b820191906000526020600020905b8154815290600101906020018083116105fd57829003601f168201915b5050505050815260200160028201548152505081526020019060010190610518565b50505050905090565b6106db816040516024016106599190610cd3565b6040516020818303038152906040527f41304fac000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610816565b50565b61077682826040516024016106f4929190610cf5565b6040516020818303038152906040527f319af333000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610816565b5050565b6108128282604051602401610790929190610d25565b6040516020818303038152906040527f9710a9d0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610816565b5050565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b82805461084b90610fa6565b90600052602060002090601f01602090048101928261086d57600085556108b4565b82601f1061088657805160ff19168380011785556108b4565b828001600101855582156108b4579182015b828111156108b3578251825591602001919060010190610898565b5b5090506108c191906108c5565b5090565b5b808211156108de5760008160009055506001016108c6565b5090565b60006108f56108f084610e31565b610e00565b90508281526020810184848401111561090d57600080fd5b610918848285610f64565b509392505050565b60008135905061092f816110d6565b92915050565b600082601f83011261094657600080fd5b81356109568482602086016108e2565b91505092915050565b60006020828403121561097157600080fd5b600061097f84828501610920565b91505092915050565b60006020828403121561099a57600080fd5b600082013567ffffffffffffffff8111156109b457600080fd5b6109c084828501610935565b91505092915050565b60006109d58383610c2e565b905092915050565b6109e681610f28565b82525050565b6109f581610f28565b82525050565b6000610a0682610e71565b610a108185610e94565b935083602082028501610a2285610e61565b8060005b85811015610a5e5784840389528151610a3f85826109c9565b9450610a4a83610e87565b925060208a01995050600181019050610a26565b50829750879550505050505092915050565b6000610a7b82610e7c565b610a858185610eb0565b9350610a95818560208601610f73565b610a9e816110c5565b840191505092915050565b6000610ab482610e7c565b610abe8185610ec1565b9350610ace818560208601610f73565b610ad7816110c5565b840191505092915050565b6000610aef603483610ec1565b91507f547279696e6720746f207769746864726177206d6f7265206d6f6e657920746860008301527f616e2074686520636f6e7472616374206861732e0000000000000000000000006020830152604082019050919050565b6000610b55602783610ec1565b91507f4661696c656420746f207769746864726177206d6f6e65792066726f6d20636f60008301527f6e74726163742e000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000610bbb602983610ec1565b91507f4d7573742077616974203330207365636f6e6473206265666f7265207761766960008301527f6e6720616761696e2e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000610c21600083610ea5565b9150600082019050919050565b6000606083016000830151610c4660008601826109dd565b5060208301518482036020860152610c5e8282610a70565b9150506040830151610c736040860182610c7e565b508091505092915050565b610c8781610f5a565b82525050565b610c9681610f5a565b82525050565b6000610ca782610c14565b9150819050919050565b60006020820190508181036000830152610ccb81846109fb565b905092915050565b60006020820190508181036000830152610ced8184610aa9565b905092915050565b60006040820190508181036000830152610d0f8185610aa9565b9050610d1e60208301846109ec565b9392505050565b60006040820190508181036000830152610d3f8185610aa9565b9050610d4e6020830184610c8d565b9392505050565b60006020820190508181036000830152610d6e81610ae2565b9050919050565b60006020820190508181036000830152610d8e81610b48565b9050919050565b60006020820190508181036000830152610dae81610bae565b9050919050565b6000602082019050610dca6000830184610c8d565b92915050565b6000604082019050610de56000830185610c8d565b8181036020830152610df78184610aa9565b90509392505050565b6000604051905081810181811067ffffffffffffffff82111715610e2757610e26611096565b5b8060405250919050565b600067ffffffffffffffff821115610e4c57610e4b611096565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000610edd82610f5a565b9150610ee883610f5a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610f1d57610f1c611009565b5b828201905092915050565b6000610f3382610f3a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015610f91578082015181840152602081019050610f76565b83811115610fa0576000848401525b50505050565b60006002820490506001821680610fbe57607f821691505b60208210811415610fd257610fd1611067565b5b50919050565b6000610fe382610f5a565b9150610fee83610f5a565b925082610ffe57610ffd611038565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6110df81610f28565b81146110ea57600080fd5b5056fea2646970667358221220a54704c262ac44cb3b7af80aeea4cd74921361f242326c3a172738da3b81774e64736f6c63430008000033", 113 | "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c8063449d46c0146100515780639a2cdc081461006d578063a42a46631461008b578063bd43a908146100bb575b600080fd5b61006b60048036038101906100669190610988565b6100d9565b005b6100756104d3565b6040516100829190610db5565b60405180910390f35b6100a560048036038101906100a0919061095f565b6104dc565b6040516100b29190610db5565b60405180910390f35b6100c36104f4565b6040516100d09190610cb1565b60405180910390f35b42601e600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546101269190610ed2565b10610166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015d90610d95565b60405180910390fd5b42600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060016000808282546101bc9190610ed2565b925050819055506102026040518060400160405280600d81526020017f2573206861732077617665642100000000000000000000000000000000000000815250336106de565b600260405180606001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200183815260200142815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010190805190602001906102c192919061083f565b50604082015181600201555050606460015442446102df9190610ed2565b6102e99190610ed2565b6102f39190610fd8565b60018190555061033a6040518060400160405280601681526020017f52616e646f6d20232067656e6572617465643a2025640000000000000000000081525060015461077a565b603260015411610480576103836040518060400160405280600781526020017f257320776f6e2100000000000000000000000000000000000000000000000000815250336106de565b6000655af3107a40009050478111156103d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103c890610d55565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16826040516103f790610c9c565b60006040518083038185875af1925050503d8060008114610434576040519150601f19603f3d011682016040523d82523d6000602084013e610439565b606091505b505090508061047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047490610d75565b60405180910390fd5b50505b3373ffffffffffffffffffffffffffffffffffffffff167f5f7e16dc676677766a70e9c5628aa6c54ddb8b6e5188e2ae1e1f17f1ffbea71642836040516104c8929190610dd0565b60405180910390a250565b60008054905090565b60036020528060005260406000206000915090505481565b60606002805480602002602001604051908101604052809291908181526020016000905b8282101561063c57838290600052602060002090600302016040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820180546105a190610fa6565b80601f01602080910402602001604051908101604052809291908181526020018280546105cd90610fa6565b801561061a5780601f106105ef5761010080835404028352916020019161061a565b820191906000526020600020905b8154815290600101906020018083116105fd57829003601f168201915b5050505050815260200160028201548152505081526020019060010190610518565b50505050905090565b6106db816040516024016106599190610cd3565b6040516020818303038152906040527f41304fac000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610816565b50565b61077682826040516024016106f4929190610cf5565b6040516020818303038152906040527f319af333000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610816565b5050565b6108128282604051602401610790929190610d25565b6040516020818303038152906040527f9710a9d0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610816565b5050565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b82805461084b90610fa6565b90600052602060002090601f01602090048101928261086d57600085556108b4565b82601f1061088657805160ff19168380011785556108b4565b828001600101855582156108b4579182015b828111156108b3578251825591602001919060010190610898565b5b5090506108c191906108c5565b5090565b5b808211156108de5760008160009055506001016108c6565b5090565b60006108f56108f084610e31565b610e00565b90508281526020810184848401111561090d57600080fd5b610918848285610f64565b509392505050565b60008135905061092f816110d6565b92915050565b600082601f83011261094657600080fd5b81356109568482602086016108e2565b91505092915050565b60006020828403121561097157600080fd5b600061097f84828501610920565b91505092915050565b60006020828403121561099a57600080fd5b600082013567ffffffffffffffff8111156109b457600080fd5b6109c084828501610935565b91505092915050565b60006109d58383610c2e565b905092915050565b6109e681610f28565b82525050565b6109f581610f28565b82525050565b6000610a0682610e71565b610a108185610e94565b935083602082028501610a2285610e61565b8060005b85811015610a5e5784840389528151610a3f85826109c9565b9450610a4a83610e87565b925060208a01995050600181019050610a26565b50829750879550505050505092915050565b6000610a7b82610e7c565b610a858185610eb0565b9350610a95818560208601610f73565b610a9e816110c5565b840191505092915050565b6000610ab482610e7c565b610abe8185610ec1565b9350610ace818560208601610f73565b610ad7816110c5565b840191505092915050565b6000610aef603483610ec1565b91507f547279696e6720746f207769746864726177206d6f7265206d6f6e657920746860008301527f616e2074686520636f6e7472616374206861732e0000000000000000000000006020830152604082019050919050565b6000610b55602783610ec1565b91507f4661696c656420746f207769746864726177206d6f6e65792066726f6d20636f60008301527f6e74726163742e000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000610bbb602983610ec1565b91507f4d7573742077616974203330207365636f6e6473206265666f7265207761766960008301527f6e6720616761696e2e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000610c21600083610ea5565b9150600082019050919050565b6000606083016000830151610c4660008601826109dd565b5060208301518482036020860152610c5e8282610a70565b9150506040830151610c736040860182610c7e565b508091505092915050565b610c8781610f5a565b82525050565b610c9681610f5a565b82525050565b6000610ca782610c14565b9150819050919050565b60006020820190508181036000830152610ccb81846109fb565b905092915050565b60006020820190508181036000830152610ced8184610aa9565b905092915050565b60006040820190508181036000830152610d0f8185610aa9565b9050610d1e60208301846109ec565b9392505050565b60006040820190508181036000830152610d3f8185610aa9565b9050610d4e6020830184610c8d565b9392505050565b60006020820190508181036000830152610d6e81610ae2565b9050919050565b60006020820190508181036000830152610d8e81610b48565b9050919050565b60006020820190508181036000830152610dae81610bae565b9050919050565b6000602082019050610dca6000830184610c8d565b92915050565b6000604082019050610de56000830185610c8d565b8181036020830152610df78184610aa9565b90509392505050565b6000604051905081810181811067ffffffffffffffff82111715610e2757610e26611096565b5b8060405250919050565b600067ffffffffffffffff821115610e4c57610e4b611096565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000610edd82610f5a565b9150610ee883610f5a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610f1d57610f1c611009565b5b828201905092915050565b6000610f3382610f3a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015610f91578082015181840152602081019050610f76565b83811115610fa0576000848401525b50505050565b60006002820490506001821680610fbe57607f821691505b60208210811415610fd257610fd1611067565b5b50919050565b6000610fe382610f5a565b9150610fee83610f5a565b925082610ffe57610ffd611038565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6110df81610f28565b81146110ea57600080fd5b5056fea2646970667358221220a54704c262ac44cb3b7af80aeea4cd74921361f242326c3a172738da3b81774e64736f6c63430008000033", 114 | "linkReferences": {}, 115 | "deployedLinkReferences": {} 116 | } 117 | --------------------------------------------------------------------------------