Skip to content

Instantly share code, notes, and snippets.

@maellson
Created June 30, 2020 18:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maellson/06cbd8e7a4a713a105855dbab1d99e88 to your computer and use it in GitHub Desktop.
Save maellson/06cbd8e7a4a713a105855dbab1d99e88 to your computer and use it in GitHub Desktop.
Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.4.24+commit.e67f0147.js&optimize=false&gist=
pragma solidity ^0.5.17;
library SafeMath {
//funcoes pure nao alteram nem consultam coisas na blockchain e sao gratuitas
function sum(uint num1, uint num2) internal pure returns(uint){
uint num3 = num1+num2;
require(num3 >=num1, "Erro de soma: Sum Overflow");
return num3;
}
function sub(uint num1, uint num2) internal pure returns(uint){
require(num2 <= num1, "Erro de Subtracao: Sub Underflow");
uint num3 = num1 - num2;
return num3;
}
function prod(uint num1, uint num2) internal pure returns(uint){
if (num1 == 0){
return 0;
}
uint num3 = num1 * num2;
require(num3 / num1 == num2, "Erro multiplicacao: Prod Overflow");
return num3;
}
}
contract Ownable {
address payable public owner; // variavei para enderecos que enviam ou recebem eth devem ser payable.
//evento que pode ser disparado ao ser executada uma determinada tarefa do contrato.
event OwnershipTranferred(address newOwner);
// a funcao constructor, por fdefinicao, so e chamada uma vez, nao podendo ser alterada.
constructor()public {
owner = msg.sender;
}
//exige que o usuario seja o dono do contrato para executar a funcao que vier posterior.
modifier onlyOwner() {
require (msg.sender == owner, "You are not the owner!");
_; //executa o resto da funcao, ou seja, o que vier apos quando for chamado.
}
// essa so executada apos tere certeza que o usuario e o dono do contrato para poder executa-la.
function transferOwnerShip(address payable newOwner) onlyOwner public{
owner = newOwner;
emit OwnershipTranferred(owner);
}
}
contract desafio_02 is Ownable{
using SafeMath for uint;
uint public price = 25 finney;//definiu uma variavel numerica
event NewPrice(uint newPrice);
mapping (address => uint) public balances;//saldo da conta;
mapping (address => uint) public hasInteracted;//essa variavel recebe a quantidade de vezes em que houve interacao no contrato(modelo_2)
function setNumber (uint myNumber) public payable returns (string memory) {
require(myNumber <=10, "Number out of range");
require (msg.value == price, "Insufficient ETH sent.");
doublePrice();
if(myNumber > 5){
return "maior que 5";
}
return "menor ou igual a 5";
}
function doublePrice() private {
price = price.prod(2);
emit NewPrice(price);
}
}
pragma solidity ^0.5.17;
library SafeMath {
//funcoes pure nao alteram nem consultam coisas na blockchain e sao gratuitas
function sum(uint num1, uint num2) internal pure returns(uint){
uint num3 = num1+num2;
require(num3 >=num1, "Erro de soma: Sum Overflow");
return num3;
}
function sub(uint num1, uint num2) internal pure returns(uint){
require(num2 <= num1, "Erro de Subtracao: Sub Underflow");
uint num3 = num1 - num2;
return num3;
}
function prod(uint num1, uint num2) internal pure returns(uint){
if (num1 == 0){
return 0;
}
uint num3 = num1 * num2;
require(num3 / num1 == num2, "Erro multiplicacao: Prod Overflow");
return num3;
}
}
contract Ownable {
address payable public owner; // variavei para enderecos que enviam ou recebem eth devem ser payable.
//evento que pode ser disparado ao ser executada uma determinada tarefa do contrato.
event OwnershipTranferred(address newOwner);
// a funcao constructor, por fdefinicao, so e chamada uma vez, nao podendo ser alterada.
constructor()public {
owner = msg.sender;
}
//exige que o usuario seja o dono do contrato para executar a funcao que vier posterior.
modifier onlyOwner() {
require (msg.sender == owner, "You are not the owner!");
_; //executa o resto da funcao, ou seja, o que vier apos quando for chamado.
}
// essa so executada apos tere certeza que o usuario e o dono do contrato para poder executa-la.
function transferOwnerShip(address payable newOwner) onlyOwner public{
owner = newOwner;
emit OwnershipTranferred(owner);
}
}
contract desafio_01 is Ownable{
using SafeMath for uint;
string public retorno;
mapping (address => uint) public balances;//saldo da conta;
mapping (address => uint) public hasInteracted;//essa variavel recebe a quantidade de vezes em que houve interacao no contrato(modelo_2)
function setNumber (uint myNumber) public payable{
require(myNumber <=10, "Number out of range");
require (msg.value == 25 finney, "Insufficient ETH sent.");
if(myNumber > 5){
retorno = "maior que 5";
} else {
retorno = "menor ou igual a 5";}
}
//podia ser implementada direto na funcao de cima,
//mas prefiro uma funcao especifica para exibir a string.
function getString() public view returns (string memory) {
return retorno;
}
}
pragma solidity ^0.4.0;
contract GuardaLoteria {
uint numeroSorteado;
function set(uint enviado) public{
numeroSorteado = enviado;
}
function get() public view returns (uint) {
return numeroSorteado;
}
}
pragma solidity ^0.5.17;
/**
* The SafeMath library does this and that...
* essa library contem os methodos matemáticos que podem ser importados por outras classes que pertençam ao diretorio
* quando um determinado contrato quer usarlas só precisa instaciar.
*/
library SafeMath {
//funcoes pure nao alteram nem consultam coisas na blockchain e sao gratuitas
function sum(uint num1, uint num2) internal pure returns(uint){
uint num3 = num1+num2;
require(num3 >=num1, "Erro de soma: Sum Overflow");
return num3;
}
function sub(uint num1, uint num2) internal pure returns(uint){
require(num2 <= num1, "Erro de Subtracao: Sub Underflow");
uint num3 = num1 - num2;
return num3;
}
function prod(uint num1, uint num2) internal pure returns(uint){
if (num1 == 0){
return 0;
}
uint num3 = num1 * num2;
require(num3 / num1 == num2, "Erro multiplicacao: Prod Overflow");
return num3;
}
function div(uint num1, uint num2) internal pure returns(uint){
uint num3 = num1 / num2;
return num3;
}
}
/**
* The Ownable contract does this and that...
* classe com methods para serem herdados por outras classes.
* funcoes ownnable permitem que o contrato saiba quem é o dono dele.
**/
contract Ownable {
address payable public owner; // variavei para enderecos que enviam ou recebem eth devem ser payable.
//evento que pode ser disparado ao ser executada uma determinada tarefa do contrato.
event OwnershipTranferred(address newOwner);
// a funcao constructor, por fdefinicao, so e chamada uma vez, nao podendo ser alterada.
constructor()public {
owner = msg.sender;
}
//exige que o usuario seja o dono do contrato para executar a funcao que vier posterior.
modifier onlyOwner() {
require (msg.sender == owner, "You are not the owner!");
_; //executa o resto da funcao, ou seja, o que vier apos quando for chamado.
}
// essa so executada apos tere certeza que o usuario e o dono do contrato para poder executa-la.
function transferOwnerShip(address payable newOwner) onlyOwner public{
owner = newOwner;
emit OwnershipTranferred(owner);
}
}
/**
* esse contrato HelloWorld agora sabe tanto guardar o endereco do Ownable como executar suas funcoes
*Esse é o melhor exemplo de
**
*/
contract HelloWorld is Ownable{
using SafeMath for uint;
string public text;//defeiniu uma string como sendo publica de acesso global
uint public number;//definiu uma variavel numerica
address payable public userAddress;//definiu uma variavel do tipo endereco
bool public answer;// definiu uma variavel booleana
//mapping (address => bool) public hasInteracted;//definiu uma variavel mapeada que informa se um endereco interagiu no contrato (modelo_1)
mapping (address => uint) public hasInteracted;//essa variavel recebe a quantidade de vezes em que houve interacao no contrato(modelo_2)
mapping (address => uint) public balances;//saldo da conta;
function setText (string memory myText) onlyOwner public {
text = myText;
setInteracted();
}
function setNumber (uint myNumber) public payable{
require (msg.value >= 1 ether, "Insufficient ETH sent.");
balances[msg.sender] = balances[msg.sender].sum(msg.value); //procura o endereco pra fazer o incrmento do valor
number = myNumber;
setInteracted();
}
//esta funcao ler de imediato de qual endereco partiu a mensagem ou os termos do contrato.
function setUserAddress() public {
userAddress = msg.sender;
setInteracted();
}
//variaveis booleana so aceitam dois valores true ou false, caso seja inserido outro valor, sera interpretado como true
function setAnswer (bool myAnswer) public {
answer = myAnswer;
setInteracted();
}
//(modelo_1)guarda dentro da variavel hasInteracted o valor true, pra dizer que aquele endereco interegiu dentro do contrato
//(modelo_2) Incrementa o valor da varivael para contar quantas vezes houve interacoes no contrato.
//toda ver que um metodo acima e chamado ess funcao e executada.
function setInteracted()private{
//hasInteracted[msg.sender] = true; //modelo_1
hasInteracted[msg.sender] = hasInteracted[msg.sender].sum(1); //modelo_2
}
//envia eth para uma conta payable
function sendETH(address payable targetAddress) public payable{
targetAddress.transfer(msg.value);
}
function withdraw() public {
require (balances[msg.sender] > 0, "Insufficient funds!");
uint amount = balances[msg.sender];//variavel de escopo e sera esquecida
balances[msg.sender] =0;// o saldo e zerado antes da tranferencia impedido loop de saques
msg.sender.transfer(amount);// usa o valor do amount e verifica o saldo, como agora esta zerado, nao podera ser executada novamente
}
//funcoes do tipo view fazem consulta na blockchain. ela esta consultando o valor de number
function sumStored (uint num1) public view returns(uint){
return num1.sum(number);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment