bootcamp 1 - solidity

configurando cliente = site

repositório no replit

fork and run
no rplit arquivos javascript tem a extensão jsx
image.png

deploy na blockchain ethereum

quando chamamos wave e ele faz totalWaves += 1, isso é uma transação!
o deploy de um contrato inteligente também é uma transação.
a (ethereum) blockchain não tem dono.
é um monte de computadores ao redor do mundo administrados por mineradores
quando implantamos nosso contrato, precisamos contar a todos mineradores
e pedir que ele seja adicionado à blockchain
o Alchemy transmite a transação criação de contrato para que possa ser coletada por mineradores
depois que a transação é minerada, ela é transmitida para a blockchain como uma transação legítima. daí todos atualizam sua cópia da blockchain.
criar conta no alchemy
criar app
chain = ethereum
network = rinkeby → rede de teste, roda transações com fake ETH! haha
copiar HTTP key
colar no hardhat config

obtendo fake ETH em uma torneira (faucet)

certifique-se de que sua carteira MetaMask está definida como "Rinkeby Test Network"
antes de usar a faucet.
name
link
amount
time
4
Rinkeby Oficial
3 / 7.5 / 18.75
8h / 1d / 3d
There are no rows in this table

alterando o arquivo hardhat.config.js

require("@nomiclabs/hardhat-waffle");

module.exports = {
solidity: "0.8.0",
networks: {
rinkeby: {
//PRIVATE!!! DO NOT DISCLOSE PRIVATE INFO!!!
url: "YOUR_ALCHEMY_API_URL",
//PRIVATE!!! DO NOT DISCLOSE PRIVATE INFO!!!
accounts: ["YOUR_PRIVATE_RINKEBY_ACCOUNT_KEY"],
},
},
};

deploy na rede de teste

npx hardhat run scripts/deploy.js --network rinkeby
image.png
image.png

WavePortal address = contract address na rede de teste rinkeby

0x1E2F345E79548eC134F6b088ac32d76fD065ad39
0x811bD8E8BaE351f9b4c666AA341b1f750c9406D5
image.png

conectando site a carteira pra ele poder chamar o smart contract

replit > src > App.jsx (código adicionado / alterado)

import React, { useEffect } from "react";
import { ethers } from "ethers";
import './App.css';

export default function App() {

const checkIfWalletIsConnected = () => {
//temos acesso ao objeto window.ethereum?
const { ethereum } = window;

if (!ethereum) {
console.log("verifique se a Metamask está instalada!");
return;
} else {
//sucesso!!!
console.log("temos o objeto ethereum!", ethereum);
}
}

useEffect(() => {
checkIfWalletIsConnected();
}, [])

const wave = () => {
}

return (
<div className="mainContainer">

<div className="dataContainer">
<div className="header">
👋 hello
</div>

<div className="bio">
eu sou a tati e resolvi voltar a programar!
</div>
<div className="bio">
não sei fazer nada ainda!
</div>
<div className="bio">
esse código é todo do danicuki :p
</div>
<div className="bio">
mas... que tal conectar sua carteira ethereum e me mandar um abraço?!?
</div>
<button className="waveButton" onClick={wave}>
send me a hug 🌟
</button>
</div>
</div>
);
}
replit → run
abra site em nova tab
inspect / console
deve aparecer a mensagem "temos o objeto ethereum!"

verificar se estamos "conectados"

usamos o método eth_accounts para checar se estamos autorizados a acessar
alguma das contas na carteira do usuário.
o usuário pode ter várias contas em sua carteira.
pegamos a primeira.
import React, { useEffect, useState } from "react";
import { ethers } from "ethers";
import './App.css';

export default function App() {

//variável de estado para armazenar carteira pública do usuário
const [currentAccount, setCurrentAccount] = useState("");

const checkIfWalletIsConnected = async () => {
try {
//temos acesso ao objeto window.ethereum?
const { ethereum } = window;

if (!ethereum) {
console.log("verifique se a Metamask está instalada!");
return;
} else {
console.log("temos o objeto ethereum", ethereum);
}

//estamos autorizados a acessar a carteira do cliente?
const accounts = await ethereum.request({ method: "eth_accounts" });

if (accounts.length !== 0) {
const account = accounts[0];
console.log("conta autorizada:", account);
setCurrentAccount(account)
} else {
console.log("não encontramos nenhuma conta autorizada...")
}
} catch (error) {
console.log(error);
}
}

useEffect(() => {
checkIfWalletIsConnected();
}, [])

const wave = () => {
}

return (
<div className="mainContainer">

<div className="dataContainer">
<div className="header">
👋 hello
</div>

<div className="bio">
eu sou a tati e resolvi voltar a programar!
</div>
<div className="bio">
não sei fazer nada ainda!
</div>
<div className="bio">
esse código é todo do danicuki :p
</div>
<div className="bio">
mas... que tal conectar sua carteira ethereum e me mandar um abraço?!?
</div>
<button className="waveButton" onClick={wave}>
send me a hug 🌟
</button>
</div>
</div>
);
}

botão para conectar carteira

import React, { useEffect, useState } from "react";
import { ethers } from "ethers";
import './App.css';

export default function App() {
//variável de estado para armazenar carteira pública do usuário
const [currentAccount, setCurrentAccount] = useState("");

const checkIfWalletIsConnected = async () => {
try {
//temos acesso ao objeto window.ethereum?
const { ethereum } = window;

if (!ethereum) {
console.log("verifique se a Metamask está instalada!");
return;
} else {
console.log("temos o objeto ethereum", ethereum);
}
//estamos autorizados a acessar a carteira do cliente?
const accounts = await ethereum.request({ method: "eth_accounts" });

if (accounts.length !== 0) {
const account = accounts[0];
console.log("conta autorizada:", account);
setCurrentAccount(account)
} else {
console.log("não encontramos nenhuma conta autorizada...")
}
} catch (error) {
console.log(error);
}
}

//método connectWallet
const connectWallet = async () => {
try {
const { ethereum } = window;

if (!ethereum) {
alert("metamask encontrada!");
return;
}
//pedindo à Metamask para dar acesso à carteira do usuário
const accounts = await ethereum.request({ method: "eth_requestAccounts" });

console.log("conectados!", accounts[0]);
setCurrentAccount(accounts[0]);
} catch (error) {
console.log(error)
}
}

useEffect(() => {
checkIfWalletIsConnected();
}, [])

const wave = () => {
Want to print your doc?
This is not the way.
Try clicking the ⋯ next to your doc name or using a keyboard shortcut (
CtrlP
) instead.