Código
- Crear carpeta decentralized-cupcakes
- Abrir editor de código en la carpeta
- Abrir consola
- Iniciar proyecto con hardhat
yarn add --dev hardhat
yarn hardhat init
- Elegir Create Javascript Project
- Reemplazamos el código del archivo hardhat.config.js por:
require('@nomicfoundation/hardhat-toolbox');
// NEVER record important private keys in your code - this is for demo purposes
const SEPOLIA_TESTNET_PRIVATE_KEY = '';
const ARBITRUM_MAINNET_TEMPORARY_PRIVATE_KEY = '';
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
solidity: '0.8.18',
networks: {
hardhat: {
chainId: 1337,
},
arbitrumSepolia: {
url: '<https://sepolia-rollup.arbitrum.io/rpc>',
chainId: 421614,
//accounts: [SEPOLIA_TESTNET_PRIVATE_KEY]
},
arbitrumOne: {
url: '<https://arb1.arbitrum.io/rpc>',
//accounts: [ARBITRUM_MAINNET_TEMPORARY_PRIVATE_KEY]
},
},
};
- ``Reemplazamos el código del contrato y renombramos el archivo Lock.sol por VendingMachine.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.9;
// Rule 2: The vending machine's rules can't be changed by anyone.
contract VendingMachine {
// state variables = internal memory of the vending machine
mapping(address => uint) private _cupcakeBalances;
mapping(address => uint) private _cupcakeDistributionTimes;
function giveCupcakeTo(address userAddress) public returns (bool) {
// this code is unnecessary, but we're keeping it here so you can compare it to the JS implementation
if (_cupcakeDistributionTimes[userAddress] == 0) {
_cupcakeBalances[userAddress] = 0;
_cupcakeDistributionTimes[userAddress] = 0;
}
// Rule 1: The vending machine will distribute a cupcake to anyone who hasn't recently received one.
uint fiveSecondsFromLastDistribution = _cupcakeDistributionTimes[userAddress] + 5 seconds;
bool userCanReceiveCupcake = fiveSecondsFromLastDistribution <= block.timestamp;
if (userCanReceiveCupcake) {
_cupcakeBalances[userAddress]++;
_cupcakeDistributionTimes[userAddress] = block.timestamp;
return true;
} else {
revert("HTTP 429: Too Many Cupcakes (you must wait at least 5 seconds between cupcakes)");
}
}
// Getter function for the cupcake balance of a user
function getCupcakeBalanceFor(address userAddress) public view returns (uint) {
return _cupcakeBalances[userAddress];
}
}
- Crear el archivo scripts/deploy.js
const hre = require('hardhat');
async function main() {
const vendingMachine = await hre.ethers.deployContract('VendingMachine');
await vendingMachine.waitForDeployment();
console.log(`Cupcake vending machine deployed to ${vendingMachine.target}`);
}
main().catch((error) => {
console.error(error);
process.exit(1);
});
- Compilar proyecto 2 veces
yarn hardhat compile
Despliegue
- Necesitamos tener listos los fondos de prueba Sepolia ETH en la red Arbitrum Sepolia.
- Nos logueamos en Alchemy y creamos una nueva app, eligiendo a Arbitrum Sepolia como red
- Creada la app en el dashboard de alchemy, seleccionamos la url para el endpoint que nos genera y la ponemos el parametro url del campo arbitrumSepolia en el archivo da hardhat.config.js