pragma solidity ^0.4.18;
// See ethermango.com
// Sell digital products easily, only 1% fees
contract EtherMango {
uint public feePercent = 100;
address owner;
uint public numProducts;
mapping(uint => Product) public products;
mapping(address => mapping(uint => bool)) public purchases;
event ProductAdded(uint productId, address merchant, uint price);
event ProductPurchased(uint productId, address buyer);
struct Product {
uint price;
address merchant;
bool isFrozen;
}
function EtherMango() public payable {
owner = msg.sender;
}
function AddProduct(uint price) public payable returns(uint productId) {
productId = numProducts++;
products[productId] = Product(price, msg.sender, false);
// Merchant auto purchases their own product
purchases[msg.sender][productId] = true;
ProductAdded(productId, msg.sender, price);
}
function Pay(uint productId) public payable {
require(products[productId].price == msg.value);
require(products[productId].isFrozen == false);
uint fee = msg.value / feePercent;
uint remaining = msg.value - fee;
// Immediately pay out merchant, but keep fees in contract
// Which keeps the gas cost lower
products[productId].merchant.transfer(remaining);
// Log the purchase on the blockchain
purchases[msg.sender][productId] = true;
ProductPurchased(productId, msg.sender);
}
function WithdrawFees() public payable {
require(msg.sender == owner);
owner.transfer(this.balance);
}
function FreezeProduct(uint productId) public {
require(products[productId].merchant == msg.sender);
products[productId].isFrozen = true;
}
function UnFreezeProduct(uint productId) public {
require(products[productId].merchant == msg.sender);
products[productId].isFrozen = false;
}
}
{
"compilationTarget": {
"EtherMango.sol": "EtherMango"
},
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"constant":false,"inputs":[{"name":"price","type":"uint256"}],"name":"AddProduct","outputs":[{"name":"productId","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"productId","type":"uint256"}],"name":"UnFreezeProduct","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"purchases","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"productId","type":"uint256"}],"name":"Pay","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"products","outputs":[{"name":"price","type":"uint256"},{"name":"merchant","type":"address"},{"name":"isFrozen","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feePercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numProducts","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"productId","type":"uint256"}],"name":"FreezeProduct","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"WithdrawFees","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"inputs":[],"payable":true,"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"productId","type":"uint256"},{"indexed":false,"name":"merchant","type":"address"},{"indexed":false,"name":"price","type":"uint256"}],"name":"ProductAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"productId","type":"uint256"},{"indexed":false,"name":"buyer","type":"address"}],"name":"ProductPurchased","type":"event"}]