This contract's source code is verified! Compiler
0.5.17+commit.d19bba13
File 1 of 11: DistributedStorage.sol
pragma solidity ^0.5.10;
import "./StorageUnit.sol" ;
import "./IsContract.sol" ;
library DistributedStorage {
function contractSlot (bytes32 _struct ) private view returns (address ) {
return address (
uint256 (
keccak256 (
abi .encodePacked (
byte (0xff ),
address (this ),
_struct,
keccak256 (type (StorageUnit).creationCode )
)
)
)
);
}
function deploy (bytes32 _struct ) private {
bytes memory slotcode = type (StorageUnit).creationCode ;
assembly { pop (create2 (0 , add (slotcode, 0x20 ), mload (slotcode), _struct)) }
}
function write (
bytes32 _struct,
bytes32 _key,
bytes32 _value
) internal {
StorageUnit store = StorageUnit(contractSlot(_struct));
if (! IsContract.isContract(address (store))) {
deploy(_struct);
}
(bool success, ) = address (store).call (
abi .encodeWithSelector (
store.write.selector ,
_key,
_value
)
);
require (success, "error writing storage" );
}
function read (
bytes32 _struct,
bytes32 _key
) internal view returns (bytes32 ) {
StorageUnit store = StorageUnit(contractSlot(_struct));
if (! IsContract.isContract(address (store))) {
return bytes32 (0 );
}
(bool success, bytes memory data) = address (store).staticcall (
abi .encodeWithSelector (
store.read.selector ,
_key
)
);
require (success, "error reading storage" );
return abi .decode (data, (bytes32 ));
}
}
File 2 of 11: Farm.sol
pragma solidity ^0.5.10;
library Farm {
using Farm for Farm .Pigpen ;
struct Pigpen {
uint256 [] entries;
mapping (address = > uint256 ) index;
}
function initialize (Pigpen storage _pigpen ) internal {
require (_pigpen.entries.length = = 0 , "already initialized" );
_pigpen.entries.push (0 );
}
function encode (address _addr, uint256 _value ) internal pure returns (uint256 _entry ) {
assembly {
_entry := not (or (and (0xffffffffffffffffffffffffffffffffffffffff , _addr), shl (160 , _value)))
}
}
function decode (uint256 _entry ) internal pure returns (address _addr, uint256 _value ) {
assembly {
let entry := not (_entry)
_addr := and (entry, 0xffffffffffffffffffffffffffffffffffffffff )
_value := shr (160 , entry)
}
}
function decodeAddress (uint256 _entry ) internal pure returns (address _addr ) {
assembly {
_addr := and (not (_entry), 0xffffffffffffffffffffffffffffffffffffffff )
}
}
function top (Pigpen storage _pigpen ) internal view returns (address , uint256 ) {
if (_pigpen.entries.length < 2 ) {
return (address (0 ), 0 );
}
return decode(_pigpen.entries[1 ]);
}
function has (Pigpen storage _pigpen, address _addr ) internal view returns (bool ) {
return _pigpen.index[_addr] ! = 0 ;
}
function size (Pigpen storage _pigpen ) internal view returns (uint256 ) {
return _pigpen.entries.length - 1 ;
}
function entry (Pigpen storage _pigpen, uint256 _i ) internal view returns (address , uint256 ) {
return decode(_pigpen.entries[_i + 1 ]);
}
function popTop (Pigpen storage _pigpen ) internal returns (address _addr, uint256 _value ) {
uint256 pigpenLength = _pigpen.entries.length ;
require (pigpenLength > 1 , "The pigpen does not exists" );
(_addr, _value) = decode(_pigpen.entries[1 ]);
_pigpen.index[_addr] = 0 ;
if (pigpenLength = = 2 ) {
_pigpen.entries.length = 1 ;
} else {
uint256 val = _pigpen.entries[pigpenLength - 1 ];
_pigpen.entries[1 ] = val;
_pigpen.entries.length = pigpenLength - 1 ;
uint256 ind = 1 ;
ind = _pigpen.bubbleDown(ind, val);
_pigpen.index[decodeAddress(val)] = ind;
}
}
function insert (Pigpen storage _pigpen, address _addr, uint256 _value ) internal {
require (_pigpen.index[_addr] = = 0 , "The entry already exists" );
uint256 encoded = encode(_addr, _value);
_pigpen.entries.push (encoded);
uint256 currentIndex = _pigpen.entries.length - 1 ;
currentIndex = _pigpen.bubbleUp(currentIndex, encoded);
_pigpen.index[_addr] = currentIndex;
}
function update (Pigpen storage _pigpen, address _addr, uint256 _value ) internal {
uint256 ind = _pigpen.index[_addr];
require (ind ! = 0 , "The entry does not exists" );
uint256 can = encode(_addr, _value);
uint256 val = _pigpen.entries[ind];
uint256 newInd;
if (can < val) {
newInd = _pigpen.bubbleDown(ind, can);
} else if (can > val) {
newInd = _pigpen.bubbleUp(ind, can);
} else {
return ;
}
_pigpen.entries[newInd] = can;
if (newInd ! = ind) {
_pigpen.index[_addr] = newInd;
}
}
function bubbleUp (Pigpen storage _pigpen, uint256 _ind, uint256 _val ) internal returns (uint256 ind ) {
ind = _ind;
if (ind ! = 1 ) {
uint256 pen = _pigpen.entries[ind / 2 ];
while (pen < _val) {
(_pigpen.entries[ind / 2 ], _pigpen.entries[ind]) = (_val, pen);
_pigpen.index[decodeAddress(pen)] = ind;
ind = ind / 2 ;
if (ind = = 1 ) {
break ;
}
pen = _pigpen.entries[ind / 2 ];
}
}
}
function bubbleDown (Pigpen storage _pigpen, uint256 _ind, uint256 _val ) internal returns (uint256 ind ) {
ind = _ind;
uint256 lenght = _pigpen.entries.length ;
uint256 target = lenght - 1 ;
while (ind * 2 < lenght) {
uint256 j = ind * 2 ;
uint256 leftPig = _pigpen.entries[j];
uint256 pigValue;
if (target > j) {
uint256 rightPig = _pigpen.entries[j + 1 ];
if (leftPig < rightPig) {
pigValue = rightPig;
j = j + 1 ;
} else {
pigValue = leftPig;
}
} else {
pigValue = leftPig;
}
if (_val > pigValue) {
break ;
}
(_pigpen.entries[ind], _pigpen.entries[j]) = (pigValue, _val);
_pigpen.index[decodeAddress(pigValue)] = ind;
ind = j;
}
}
}
File 3 of 11: GasPump.sol
pragma solidity ^0.5.10;
contract GasPump {
bytes32 private stub;
modifier requestGas (uint256 _factor ) {
if (tx .gasprice = = 0 | | gasleft () > block .gaslimit ) {
uint256 startgas = gasleft ();
_ ;
uint256 delta = startgas - gasleft ();
uint256 target = (delta * _factor) / 100 ;
startgas = gasleft ();
while (startgas - gasleft () < target) {
stub = keccak256 (abi .encodePacked (stub));
}
} else {
_ ;
}
}
}File 4 of 11: IERC20.sol
pragma solidity ^0.5.10;
interface IERC20 {
event Transfer (address indexed _from, address indexed _to, uint256 _value ) ;
event Approval (address indexed _owner, address indexed _spender, uint256 _value ) ;
function transfer (address _to, uint _value ) external returns (bool success ) ;
function transferFrom (address _from, address _to, uint256 _value ) external returns (bool success ) ;
function allowance (address _owner, address _spender ) external view returns (uint256 remaining ) ;
function approve (address _spender, uint256 _value ) external returns (bool success ) ;
function balanceOf (address _owner ) external view returns (uint256 balance ) ;
}
File 5 of 11: IsContract.sol
pragma solidity ^0.5.10;
library IsContract {
function isContract (address _addr ) internal view returns (bool ) {
bytes32 codehash;
assembly { codehash := extcodehash (_addr) }
return codehash ! = bytes32 (0 ) & & codehash ! = bytes32 (0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 );
}
}
File 6 of 11: Math.sol
pragma solidity ^0.5.10;
library Math {
function orderOfMagnitude (uint256 input ) internal pure returns (uint256 ) {
uint256 counter = uint (-1 );
uint256 temp = input;
do {
temp / = 10 ;
counter+ + ;
} while (temp ! = 0 );
return counter;
}
function min (uint256 _a, uint256 _b ) internal pure returns (uint256 ) {
if (_a < _b) {
return _a;
} else {
return _b;
}
}
function max (uint256 _a, uint256 _b ) internal pure returns (uint256 ) {
if (_a > _b) {
return _a;
} else {
return _b;
}
}
}
File 7 of 11: Ownable.sol
pragma solidity ^0.5.10;
contract Ownable {
address public owner;
event TransferOwnership (address _from, address _to ) ;
constructor ( ) public {
owner = msg .sender ;
emit TransferOwnership(address (0 ), msg .sender );
}
modifier onlyOwner ( ) {
require (msg .sender = = owner, "only owner" );
_ ;
}
function setOwner (address _owner ) external onlyOwner {
emit TransferOwnership(owner, _owner);
owner = _owner;
}
}
File 8 of 11: Pigpen.sol
pragma solidity ^0.5.10;
import "./Ownable.sol" ;
import "./Farm.sol" ;
contract Pigpen is Ownable {
using Farm for Farm .Pigpen ;
Farm.Pigpen private pigpen;
event JoinPigpen (address indexed _address, uint256 _balance, uint256 _prevSize ) ;
event LeavePigpen (address indexed _address, uint256 _balance, uint256 _prevSize ) ;
uint256 public constant TOP_SIZE = 100 ;
constructor ( ) public {
pigpen.initialize();
}
function topSize ( ) external pure returns (uint256 ) {
return TOP_SIZE;
}
function addressAt (uint256 _i ) external view returns (address addr ) {
(addr, ) = pigpen.entry(_i);
}
function indexOf (address _addr ) external view returns (uint256 ) {
return pigpen.index[_addr];
}
function entry (uint256 _i ) external view returns (address , uint256 ) {
return pigpen.entry(_i);
}
function top ( ) external view returns (address , uint256 ) {
return pigpen.top();
}
function size ( ) external view returns (uint256 ) {
return pigpen.size();
}
function update (address _addr, uint256 _new ) external onlyOwner {
uint256 _size = pigpen.size();
if (_size = = 0 ) {
emit JoinPigpen(_addr, _new, 0 );
pigpen.insert(_addr, _new);
return ;
}
(, uint256 lastBal) = pigpen.top();
if (pigpen.has(_addr)) {
pigpen.update(_addr, _new);
if (_new = = 0 ) {
pigpen.popTop();
emit LeavePigpen(_addr, 0 , _size);
}
} else {
if (_new ! = 0 & & (_size < TOP_SIZE | | lastBal < _new)) {
if (_size > = TOP_SIZE) {
(address _poped, uint256 _balance) = pigpen.popTop();
emit LeavePigpen(_poped, _balance, _size);
}
pigpen.insert(_addr, _new);
emit JoinPigpen(_addr, _new, _size);
}
}
}
}
File 9 of 11: Porkchop.sol
pragma solidity ^0.5.10;
import "./Ownable.sol" ;
import "./DistributedStorage.sol" ;
import "./SafeMath.sol" ;
import "./Math.sol" ;
import "./GasPump.sol" ;
import "./IERC20.sol" ;
import "./Pigpen.sol" ;
contract Porkchop is Ownable , GasPump , IERC20 {
using DistributedStorage for bytes32 ;
using SafeMath for uint256 ;
event Winner (address indexed _addr, uint256 _value ) ;
event SetName (string _prev, string _new ) ;
event SetExtraGas (uint256 _prev, uint256 _new ) ;
event SetPigpen (address _prev, address _new ) ;
event WhitelistFrom (address _addr, bool _whitelisted ) ;
event WhitelistTo (address _addr, bool _whitelisted ) ;
uint256 public totalSupply;
bytes32 private constant BALANCE_KEY = keccak256 ("balance" );
uint256 public constant FEE = 100 ;
string public name = "Porkchop" ;
string public constant symbol = "CHOP" ;
uint8 public constant decimals = 18 ;
mapping (address = > bool ) public whitelistFrom;
mapping (address = > bool ) public whitelistTo;
Pigpen public pigpen;
uint256 public extraGas;
bool inited;
function init (
address _to,
uint256 _amount
) external {
assert (! inited);
inited = true ;
assert (totalSupply = = 0 );
assert (address (pigpen) = = address (0 ));
pigpen = new Pigpen();
emit SetPigpen(address (0 ), address (pigpen));
extraGas = 15 ;
emit SetExtraGas(0 , extraGas);
emit Transfer(address (0 ), _to, _amount);
_setBalance(_to, _amount);
totalSupply = _amount;
}
function _toKey (address a ) internal pure returns (bytes32 ) {
return bytes32 (uint256 (a));
}
function _balanceOf (address _addr ) internal view returns (uint256 ) {
return uint256 (_toKey(_addr).read(BALANCE_KEY));
}
function _allowance (address _addr, address _spender ) internal view returns (uint256 ) {
return uint256 (_toKey(_addr).read(keccak256 (abi .encodePacked ("allowance" , _spender))));
}
function _nonce (address _addr, uint256 _cat ) internal view returns (uint256 ) {
return uint256 (_toKey(_addr).read(keccak256 (abi .encodePacked ("nonce" , _cat))));
}
function _setAllowance (address _addr, address _spender, uint256 _value ) internal {
_toKey(_addr).write(keccak256 (abi .encodePacked ("allowance" , _spender)), bytes32 (_value));
}
function _setNonce (address _addr, uint256 _cat, uint256 _value ) internal {
_toKey(_addr).write(keccak256 (abi .encodePacked ("nonce" , _cat)), bytes32 (_value));
}
function _setBalance (address _addr, uint256 _balance ) internal {
_toKey(_addr).write(BALANCE_KEY, bytes32 (_balance));
pigpen.update(_addr, _balance);
}
function _isWhitelisted (address _from, address _to ) internal view returns (bool ) {
return whitelistFrom[_from]| | whitelistTo[_to];
}
function _random (address _s1, uint256 _s2, uint256 _s3, uint256 _max ) internal pure returns (uint256 ) {
uint256 rand = uint256 (keccak256 (abi .encodePacked (_s1, _s2, _s3)));
return rand % (_max + 1 );
}
function _pickWinner (address _from, uint256 _value ) internal returns (address winner ) {
uint256 magnitude = Math.orderOfMagnitude(_value);
uint256 nonce = _nonce(_from, magnitude);
_setNonce(_from, magnitude, nonce + 1 );
winner = pigpen.addressAt(_random(_from, nonce, magnitude, pigpen.size() - 1 ));
}
function _transferFrom (address _operator, address _from, address _to, uint256 _value, bool _payFee ) internal {
if (_value = = 0 ) {
emit Transfer(_from, _to, 0 );
return ;
}
uint256 balanceFrom = _balanceOf(_from);
require (balanceFrom > = _value, "balance not enough" );
if (_from ! = _operator) {
uint256 allowanceFrom = _allowance(_from, _operator);
if (allowanceFrom ! = uint (-1 )) {
require (allowanceFrom > = _value, "allowance not enough" );
_setAllowance(_from, _operator, allowanceFrom.sub(_value));
}
}
uint256 receive = _value ;
uint256 burn = 0 ;
uint256 chop = 0 ;
_setBalance(_from, balanceFrom.sub(_value));
if (_payFee | | ! _isWhitelisted(_from, _to)) {
burn = _value.divRound(FEE);
chop = _value = = 1 ? 0 : burn;
receive = receive .sub (burn.add(chop ) ) ;
totalSupply = totalSupply.sub(burn);
emit Transfer(_from, address (0 ), burn);
address winner = _pickWinner(_from, _value);
_setBalance(winner, _balanceOf(winner).add(chop));
emit Winner(winner, chop);
emit Transfer(_from, winner, chop);
}
assert (burn.add(chop).add(receive ) == _value ) ;
_setBalance(_to, _balanceOf(_to).add(receive )) ;
emit Transfer(_from, _to, receive ) ;
}
function setWhitelistedTo (address _addr, bool _whitelisted ) external onlyOwner {
emit WhitelistTo(_addr, _whitelisted);
whitelistTo[_addr] = _whitelisted;
}
function setWhitelistedFrom (address _addr, bool _whitelisted ) external onlyOwner {
emit WhitelistFrom(_addr, _whitelisted);
whitelistFrom[_addr] = _whitelisted;
}
function setName (string calldata _name ) external onlyOwner {
emit SetName(name, _name);
name = _name;
}
function setExtraGas (uint256 _gas ) external onlyOwner {
emit SetExtraGas(extraGas, _gas);
extraGas = _gas;
}
function setPigpen (Pigpen _pigpen ) external onlyOwner {
emit SetPigpen(address (pigpen), address (_pigpen));
pigpen = _pigpen;
}
function topSize ( ) external view returns (uint256 ) {
return pigpen.topSize();
}
function pigpenSize ( ) external view returns (uint256 ) {
return pigpen.size();
}
function pigpenEntry (uint256 _i ) external view returns (address , uint256 ) {
return pigpen.entry(_i);
}
function pigpenTop ( ) external view returns (address , uint256 ) {
return pigpen.top();
}
function pigpenIndex (address _addr ) external view returns (uint256 ) {
return pigpen.indexOf(_addr);
}
function getNonce (address _addr, uint256 _cat ) external view returns (uint256 ) {
return _nonce(_addr, _cat);
}
function balanceOf (address _addr ) external view returns (uint256 ) {
return _balanceOf(_addr);
}
function allowance (address _addr, address _spender ) external view returns (uint256 ) {
return _allowance(_addr, _spender);
}
function approve (address _spender, uint256 _value ) external returns (bool ) {
emit Approval(msg .sender , _spender, _value);
_setAllowance(msg .sender , _spender, _value);
return true ;
}
function transfer (address _to, uint256 _value ) external requestGas (extraGas ) returns (bool ) {
_transferFrom(msg .sender , msg .sender , _to, _value, false );
return true ;
}
function transferWithFee (address _to, uint256 _value ) external requestGas (extraGas ) returns (bool ) {
_transferFrom(msg .sender , msg .sender , _to, _value, true );
return true ;
}
function transferFrom (address _from, address _to, uint256 _value ) external requestGas (extraGas ) returns (bool ) {
_transferFrom(msg .sender , _from, _to, _value, false );
return true ;
}
function transferFromWithFee (address _from, address _to, uint256 _value ) external requestGas (extraGas ) returns (bool ) {
_transferFrom(msg .sender , _from, _to, _value, true );
return true ;
}
}
File 10 of 11: SafeMath.sol
pragma solidity ^0.5.10;
library SafeMath {
function add (uint256 x, uint256 y ) internal pure returns (uint256 ) {
uint256 z = x + y;
require (z > = x, "Add overflow" );
return z;
}
function sub (uint256 x, uint256 y ) internal pure returns (uint256 ) {
require (x > = y, "Sub underflow" );
return x - y;
}
function mult (uint256 x, uint256 y ) internal pure returns (uint256 ) {
if (x = = 0 ) {
return 0 ;
}
uint256 z = x * y;
require (z / x = = y, "Mult overflow" );
return z;
}
function div (uint256 x, uint256 y ) internal pure returns (uint256 ) {
require (y ! = 0 , "Div by zero" );
return x / y;
}
function divRound (uint256 x, uint256 y ) internal pure returns (uint256 ) {
require (y ! = 0 , "Div by zero" );
uint256 r = x / y;
if (x % y ! = 0 ) {
r = r + 1 ;
}
return r;
}
}
File 11 of 11: StorageUnit.sol
pragma solidity ^0.5.10;
contract StorageUnit {
address private owner;
mapping (bytes32 = > bytes32 ) private store;
constructor ( ) public {
owner = msg .sender ;
}
function write (bytes32 _key, bytes32 _value ) external {
require (msg .sender = = owner);
store[_key] = _value;
}
function read (bytes32 _key ) external view returns (bytes32 ) {
return store[_key];
}
}
{
"compilationTarget" : {
"Porkchop.sol" : "Porkchop"
} ,
"evmVersion" : "istanbul" ,
"libraries" : { } ,
"optimizer" : {
"enabled" : false ,
"runs" : 200
} ,
"remappings" : [ ]
} [{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_prev","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_new","type":"uint256"}],"name":"SetExtraGas","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_prev","type":"string"},{"indexed":false,"internalType":"string","name":"_new","type":"string"}],"name":"SetName","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_prev","type":"address"},{"indexed":false,"internalType":"address","name":"_new","type":"address"}],"name":"SetPigpen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"TransferOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_addr","type":"address"},{"indexed":false,"internalType":"bool","name":"_whitelisted","type":"bool"}],"name":"WhitelistFrom","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_addr","type":"address"},{"indexed":false,"internalType":"bool","name":"_whitelisted","type":"bool"}],"name":"WhitelistTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Winner","type":"event"},{"constant":true,"inputs":[],"name":"FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"extraGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_cat","type":"uint256"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pigpen","outputs":[{"internalType":"contract Pigpen","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_i","type":"uint256"}],"name":"pigpenEntry","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"pigpenIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pigpenSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pigpenTop","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_gas","type":"uint256"}],"name":"setExtraGas","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract Pigpen","name":"_pigpen","type":"address"}],"name":"setPigpen","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_whitelisted","type":"bool"}],"name":"setWhitelistedFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_whitelisted","type":"bool"}],"name":"setWhitelistedTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"topSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFromWithFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferWithFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"}]