├── .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 |
--------------------------------------------------------------------------------