pragma solidity ^0.4.23;
// Ownable contract with CFO
contract Ownable {
address public owner;
address public cfoAddress;
constructor() public{
owner = msg.sender;
cfoAddress = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
modifier onlyCFO() {
require(msg.sender == cfoAddress);
_;
}
function transferOwnership(address newOwner) external onlyOwner {
if (newOwner != address(0)) {
owner = newOwner;
}
}
function setCFO(address newCFO) external onlyOwner {
require(newCFO != address(0));
cfoAddress = newCFO;
}
}
// Pausable contract which allows children to implement an emergency stop mechanism.
contract Pausable is Ownable {
event Pause();
event Unpause();
bool public paused = false;
// Modifier to make a function callable only when the contract is not paused.
modifier whenNotPaused() {
require(!paused);
_;
}
// Modifier to make a function callable only when the contract is paused.
modifier whenPaused() {
require(paused);
_;
}
// called by the owner to pause, triggers stopped state
function pause() onlyOwner whenNotPaused public {
paused = true;
emit Pause();
}
// called by the owner to unpause, returns to normal state
function unpause() onlyOwner whenPaused public {
paused = false;
emit Unpause();
}
}
// interface for presale contract
contract ParentInterface {
function transfer(address _to, uint256 _tokenId) external;
function recommendedPrice(uint16 quality) public pure returns(uint256 price);
function getPet(uint256 _id) external view returns (uint64 birthTime, uint256 genes,uint64 breedTimeout,uint16 quality,address owner);
}
contract JackpotInterface {
function addPlayer(address player) external;
function finished() public returns (bool);
}
contract AccessControl is Pausable {
ParentInterface public parent;
JackpotInterface public jackpot;
function setParentAddress(address _address) public whenPaused onlyOwner
{
parent = ParentInterface(_address);
}
function setJackpotAddress(address _address) public whenPaused onlyOwner
{
jackpot = JackpotInterface(_address);
}
}
// setting a special price
contract Discount is AccessControl {
uint128[101] public discount;
function setPrice(uint8 _tokenId, uint128 _price) external onlyOwner {
discount[_tokenId] = _price;
}
}
contract StoreLimit is AccessControl {
uint8 public saleLimit = 10;
function setSaleLimit(uint8 _limit) external onlyOwner {
saleLimit = _limit;
}
}
contract Store is Discount, StoreLimit {
constructor(address _presaleAddr) public {
parent = ParentInterface(_presaleAddr);
paused = true;
}
// purchasing a parrot
function purchaseParrot(uint256 _tokenId) external payable whenNotPaused
{
require(_tokenId <= saleLimit);
uint64 birthTime; uint256 genes; uint64 breedTimeout; uint16 quality; address parrot_owner;
(birthTime, genes, breedTimeout, quality, parrot_owner) = parent.getPet(_tokenId);
require(parrot_owner == address(this));
if(discount[_tokenId] == 0)
require(parent.recommendedPrice(quality) <= msg.value);
else
require(discount[_tokenId] <= msg.value);
parent.transfer(msg.sender, _tokenId);
if(!jackpot.finished()) {
jackpot.addPlayer(msg.sender);
address(jackpot).transfer(msg.value / 2);
}
}
function unpause() public onlyOwner whenPaused {
require(address(jackpot) != address(0));
super.unpause();
}
function gift(uint256 _tokenId, address to) external onlyOwner{
parent.transfer(to, _tokenId);
}
function withdrawBalance(uint256 summ) external onlyCFO {
cfoAddress.transfer(summ);
}
}
{
"compilationTarget": {
"Store.sol": "Store"
},
"evmVersion": "byzantium",
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"constant":true,"inputs":[],"name":"cfoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"discount","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newCFO","type":"address"}],"name":"setCFO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"parent","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"jackpot","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_limit","type":"uint8"}],"name":"setSaleLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"purchaseParrot","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"saleLimit","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setJackpotAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"to","type":"address"}],"name":"gift","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint8"},{"name":"_price","type":"uint128"}],"name":"setPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"summ","type":"uint256"}],"name":"withdrawBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setParentAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_presaleAddr","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"}]