Skip to content

Instantly share code, notes, and snippets.

@nodlAndHodl
Created February 18, 2022 14:21
Show Gist options
  • Save nodlAndHodl/87450a77114daca314447271adf39408 to your computer and use it in GitHub Desktop.
Save nodlAndHodl/87450a77114daca314447271adf39408 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.8.11+commit.d7f03943.js&optimize=false&runs=200&gist=
// SPDX-License-Identifier: MIT
pragma solidity 0.8.11;
contract LemonadeStand {
address owner;
uint skuCount;
enum State { ForSale , Sold, Shipped }
struct Item {
string name;
uint sku;
uint price;
State state;
address seller;
address buyer;
}
constructor() {
owner = msg.sender;
skuCount = 0;
}
//items that maps the SKU to a number on an item
mapping (uint => Item) items;
//Events
event ForSale(uint skuCount);
event Sold (uint sku);
event Shipped(uint sku);
//modifiers
modifier onlyOwner(){
require(msg.sender == owner);
_;
}
modifier verifyCaller(address _address){
require(msg.sender == _address);
_;
}
modifier paidEnough(uint _price){
require(msg.value >= _price);
_;
}
modifier forSale(uint _sku){
require(items[_sku].state == State.ForSale);
_;
}
modifier sold(uint _sku){
require(items[_sku].state == State.Sold);
_;
}
//Adding a new item
function addItem(string calldata _name, uint _price) onlyOwner public{
skuCount += 1;
items[skuCount] = Item({name: _name, sku: skuCount, price: _price, state: State.ForSale, seller: msg.sender, buyer: address(0)});
emit ForSale(skuCount);
}
//buying an item
function buyItem(uint _sku) forSale(_sku) paidEnough(items[_sku].price) public payable {
//get price from item
uint price = items[_sku].price;
//set buyer to sender address
items[_sku].buyer = msg.sender;
//set item state
items[_sku].state = State.Sold;
//transfer money to seller
payable(items[_sku].seller).transfer(price);
returnBalance(_sku);
emit Sold(_sku);
}
function returnBalance(uint sku) internal {
uint balance = msg.value - items[sku].price;
payable(items[sku].buyer).transfer(balance);
}
function shipItem(uint _sku) verifyCaller(items[_sku].seller) sold(_sku) public {
items[_sku].state = State.Shipped;
emit Shipped(_sku);
}
function fetchItem(uint _sku) public view returns(string memory name, uint sku, uint price, string memory stateIs, address buyer, address seller){
uint state;
name = items[_sku].name;
sku = items[_sku].sku;
price = items[_sku].price;
state = uint(items[_sku].state);
if(state == 0){ stateIs = "ForSale"; }
if(state == 1) { stateIs = "Sold"; }
if(state == 2) { stateIs = "Shipped"; }
seller = items[_sku].seller;
buyer = items[_sku].buyer;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment