Created
February 18, 2022 14:21
-
-
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=
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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