Latest 25 transactions from a total of 52691 transactions

TxHash Age From To Value [TxFee]
0xaa7f0b1a5320b0da9bf47e423cdcf8bbb5d65c809f25c28b1c99df2f2db35e342 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031527
0x8154406277f73f9b71d72933df37dcced200103fc6b9bdd243ce9e4d603eb38c2 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031591
0x101603be5241d5a79fdec1f5478bc28278d3290b95ee094cb145b619775b6b062 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031527
0xb0e3f98ee88925db0934f677d36b3e5504f00cc4ffefd62f2c70756e13c3b99f2 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031527
0x006d5324be5a693c9e6fd4d3f86c6c938a1c52b529366200d19395bfddb9f4849 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031527
0xea1a8386d499ca32ed793f3a20afb8e2274057ace1c15f04a6ba23ee9794411c9 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031591
0xeac63dcf6878dd7cbbe0b90bc3bd009e606300c546c74df606f351143a05bc229 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00026727
0xf760c36693af53b5c498dd571bbbecd4e8b10058243165812fa35d6446b059c59 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031527
0xe18bb4f45599d7545937ed6bd90d2beaeb99d080b3cb9a5b21529c36f7116be912 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031527
0x549f0d2f287e28f67a4db347bc6fd215e787954633c7628b2274116cd5aab00b12 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031591
0x5f82ccf8926f826a9f19ecc717d1c9c5a5b4618bf92df13fa8f4eb99955af16912 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031527
0xd397132b5eba798fc3c956e09020a4dee3467c0fa7c1777645d73216fcfd05bb12 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00026727
0x5a52f9c09afc557bfdf73a996f625eab812eeca2ad785d7ae231f912a856fccf17 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031527
0x0f572c1b52a5d4657e358209b2d5147a41e5a74f33cdf9c3162bbc0dafb3caec17 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031591
0x2a888ce83ce3d88ab641552061f68a201aa0764b3e4f92ba3ad52564512edbd617 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031527
0xbaaa053461bb1b88ba276269e0364375c87c26a274539febdaf57522936a831317 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031527
0x0ac2ce63b1ec75fff5601480ddbcd8bfd91254bf6c7eb583262e75977bdff69023 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00026727
0xaec791a149f17e5d95dc5b4422e3a4e0c8ed3113008fa76837bc9b2f9c62606f23 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031591
0xbb5ef2c1a665182aecb19d873f6864c0782f45ab114d607eae51b8a5cc97e11f23 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00026727
0x3e142b34058069ef68d3d6a770b286dc24f076867791da1d0eef8f98981f66cc23 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031527
0xfd84b0cd59ffcfe37e6b1d2596eb69b18490d2320b78c0f455aad7fcc68a1da827 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00026727
0x9b7166315872fe7a5ee49d9bf252594922802b67a45921bb789c4d39c1351d4727 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031463
0x64dc5a5d4d1c9264a73f283a22139755426dd82a203604ad18b17e388a2ece8b27 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031527
0xb257463ee55a76a180ea5ee93ecdbcb161c8c0d6e9f4f246b4b516070a02501d27 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031527
0x0bd3fcdec298adba9b6bbd4ab7894cb18bfdaba58b339b64fc178346cd1b42f232 mins ago0xb04fb70c0d6b64a236fa15461594dd0c283cc8c4  IN   0xd996f8a7298d822eeb71868c93eceb106401a5fe0 Ether0.00031527
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 25 Internal Txns, Click here To View More View All
ParentTxHash Block Age From To Value
0xede2616bde11deb06995c1c8717e3b3b0704db8384d9a5260b58f219447577dc47977898 days 23 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0x9cb253e4f4e35530352250f362eda353e7201f619eeb877f5e4fc180600e546547977838 days 23 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0xc425c5f06400f1e5110256d7fcb7016d6cbdb64b80bdb4b07ecc5716558026f347977698 days 23 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0x4052fe5849a797af1fcff4aad42b3bb46c735b2e4328ac2bd65e911ca6e69e1447977638 days 23 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0x419ad22240c8856d1e8e06f23a17b91f0ebe03dafa9d0d4d97c7c0522afc6c2447977538 days 23 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0x0d9f530fba5bce66cca1edbfdadf70e05c9bbccb6423387cb27f21eeb3975258478628810 days 18 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0x730c497a8684387eaabfa7fd36dcf4a146db8b9fb0e6a7c83dc49713d2719a95478626910 days 18 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0x2d2f9a68b5651a16cdc0bc4b4ea11a03cd850a0185456f5a838f82d96dd9abed478625310 days 18 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0x1964fff19c52b81bfef90d8127b6f4a642f140b6216ea9c99dd88e6d70900a00478623310 days 18 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0x43d7d3d0fbefd757402561aedd13fc623e233da94c44816539aa44aa30cd60c9478622210 days 18 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0xa4e056a0616f3c7ed662705456849e85408311b7c3cec72f340fe299ee53d5b1475087615 days 23 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0x3efe77e8b401f6188481fb095f219fe291b38a140e8ada18e804a24df19fa11e475085615 days 23 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0xe2fdfe3228916111508c58c749dc221cf926484d0c6e5aa6bb28f5e35fa9db53475084215 days 23 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0x69bba5a1c0b7edf4a3fd9b9e58bdcb2185d96d614df0edfd161cce69846fe63b475082615 days 23 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0xac5274940e534724bd67470524d67f1fdff9cba1301a30d51084d638f7f51409475081315 days 23 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0xabf79ee69f4a3164e41a2c76ae08ce6c46a196ca152663a446be1ec6414e09bd475073615 days 23 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0xdadb983c14dbe8ed4506a651880e3b58eaca3128551eaa5ad899d4e36471f92d467555728 days 1 hr ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0x04839591edd98af938376d6b390799bf03dae8a758da5923b23082c2374f89cc467552928 days 1 hr ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0x45452a1de3b72d12c4d8538b6690b4186b56bc360df37282f69c939bb6729a39467549728 days 1 hr ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0x9c39ead435d54424de78ed977e05a338249f240601034ebc7129d8b824d419dd467546928 days 1 hr ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0xd9d672806c07f3af57e0e8905efbb7a3ce7248676eb9a6f596d9d9b45bd8803c467544628 days 1 hr ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0x719b8097ee48073beb4be15a65950011befa19fe581cee19f6804c1ae088d7a7467077828 days 17 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0x6d737db1bfe38b7c98c181b05b1b0e43d1c5b531b4cbef4ab248d305e27f024f467075528 days 17 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0x042f6fd1af15ea9da02829c685f3d24a2fb16aa85092b16a511e3aeac8a48cd6467074228 days 17 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
0x06f2b33052124dd59bdf49974177ab737a0cd813acd332b97367931fd89b2835467073928 days 17 hrs ago0xd996f8a7298d822eeb71868c93eceb106401a5fe0x11c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc10 Ether
[ Download CSV Export  ] 
Contract Source Code Verified (Exact Match)
Contract Name: PumaPayPullPayment
Compiler Text: v0.4.25+commit.59dbf8f1
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity 0.4.25;

// File: node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * See https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address _who) public view returns (uint256);
  function transfer(address _to, uint256 _value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

// File: node_modules/openzeppelin-solidity/contracts/math/SafeMath.sol

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (_a == 0) {
      return 0;
    }

    c = _a * _b;
    assert(c / _a == _b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
    // assert(_b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = _a / _b;
    // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold
    return _a / _b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
    assert(_b <= _a);
    return _a - _b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    c = _a + _b;
    assert(c >= _a);
    return c;
  }
}

// File: node_modules/openzeppelin-solidity/contracts/token/ERC20/BasicToken.sol

/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) internal balances;

  uint256 internal totalSupply_;

  /**
  * @dev Total number of tokens in existence
  */
  function totalSupply() public view returns (uint256) {
    return totalSupply_;
  }

  /**
  * @dev Transfer token for a specified address
  * @param _to The address to transfer to.
  * @param _value The amount to be transferred.
  */
  function transfer(address _to, uint256 _value) public returns (bool) {
    require(_value <= balances[msg.sender]);
    require(_to != address(0));

    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    emit Transfer(msg.sender, _to, _value);
    return true;
  }

  /**
  * @dev Gets the balance of the specified address.
  * @param _owner The address to query the the balance of.
  * @return An uint256 representing the amount owned by the passed address.
  */
  function balanceOf(address _owner) public view returns (uint256) {
    return balances[_owner];
  }

}

// File: node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address _owner, address _spender)
    public view returns (uint256);

  function transferFrom(address _from, address _to, uint256 _value)
    public returns (bool);

  function approve(address _spender, uint256 _value) public returns (bool);
  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}

// File: node_modules/openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol

/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * https://github.com/ethereum/EIPs/issues/20
 * Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20, BasicToken {

  mapping (address => mapping (address => uint256)) internal allowed;


  /**
   * @dev Transfer tokens from one address to another
   * @param _from address The address which you want to send tokens from
   * @param _to address The address which you want to transfer to
   * @param _value uint256 the amount of tokens to be transferred
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _value
  )
    public
    returns (bool)
  {
    require(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);
    require(_to != address(0));

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    emit Transfer(_from, _to, _value);
    return true;
  }

  /**
   * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
   * Beware that changing an allowance with this method brings the risk that someone may use both the old
   * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
   * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
  function approve(address _spender, uint256 _value) public returns (bool) {
    allowed[msg.sender][_spender] = _value;
    emit Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @dev Function to check the amount of tokens that an owner allowed to a spender.
   * @param _owner address The address which owns the funds.
   * @param _spender address The address which will spend the funds.
   * @return A uint256 specifying the amount of tokens still available for the spender.
   */
  function allowance(
    address _owner,
    address _spender
   )
    public
    view
    returns (uint256)
  {
    return allowed[_owner][_spender];
  }

  /**
   * @dev Increase the amount of tokens that an owner allowed to a spender.
   * approve should be called when allowed[_spender] == 0. To increment
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _addedValue The amount of tokens to increase the allowance by.
   */
  function increaseApproval(
    address _spender,
    uint256 _addedValue
  )
    public
    returns (bool)
  {
    allowed[msg.sender][_spender] = (
      allowed[msg.sender][_spender].add(_addedValue));
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  /**
   * @dev Decrease the amount of tokens that an owner allowed to a spender.
   * approve should be called when allowed[_spender] == 0. To decrement
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _subtractedValue The amount of tokens to decrease the allowance by.
   */
  function decreaseApproval(
    address _spender,
    uint256 _subtractedValue
  )
    public
    returns (bool)
  {
    uint256 oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue >= oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}

// File: node_modules/openzeppelin-solidity/contracts/ownership/Ownable.sol

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipRenounced(address indexed previousOwner);
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to relinquish control of the contract.
   * @notice Renouncing to ownership will leave the contract without an owner.
   * It will not be possible to call the functions with the `onlyOwner`
   * modifier anymore.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(address _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}

// File: node_modules/openzeppelin-solidity/contracts/token/ERC20/MintableToken.sol

/**
 * @title Mintable token
 * @dev Simple ERC20 Token example, with mintable token creation
 * Based on code by TokenMarketNet: https://github.com/TokenMarketNet/ico/blob/master/contracts/MintableToken.sol
 */
contract MintableToken is StandardToken, Ownable {
  event Mint(address indexed to, uint256 amount);
  event MintFinished();

  bool public mintingFinished = false;


  modifier canMint() {
    require(!mintingFinished);
    _;
  }

  modifier hasMintPermission() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Function to mint tokens
   * @param _to The address that will receive the minted tokens.
   * @param _amount The amount of tokens to mint.
   * @return A boolean that indicates if the operation was successful.
   */
  function mint(
    address _to,
    uint256 _amount
  )
    public
    hasMintPermission
    canMint
    returns (bool)
  {
    totalSupply_ = totalSupply_.add(_amount);
    balances[_to] = balances[_to].add(_amount);
    emit Mint(_to, _amount);
    emit Transfer(address(0), _to, _amount);
    return true;
  }

  /**
   * @dev Function to stop minting new tokens.
   * @return True if the operation was successful.
   */
  function finishMinting() public onlyOwner canMint returns (bool) {
    mintingFinished = true;
    emit MintFinished();
    return true;
  }
}

// File: contracts/PumaPayToken.sol

/// PumaPayToken inherits from MintableToken, which in turn inherits from StandardToken.
/// Super is used to bypass the original function signature and include the whenNotMinting modifier.
contract PumaPayToken is MintableToken {

    string public name = "PumaPay"; 
    string public symbol = "PMA";
    uint8 public decimals = 18;

    constructor() public {
    }

    /// This modifier will be used to disable all ERC20 functionalities during the minting process.
    modifier whenNotMinting() {
        require(mintingFinished);
        _;
    }

    /// @dev transfer token for a specified address
    /// @param _to address The address to transfer to.
    /// @param _value uint256 The amount to be transferred.
    /// @return success bool Calling super.transfer and returns true if successful.
    function transfer(address _to, uint256 _value) public whenNotMinting returns (bool) {
        return super.transfer(_to, _value);
    }

    /// @dev Transfer tokens from one address to another.
    /// @param _from address The address which you want to send tokens from.
    /// @param _to address The address which you want to transfer to.
    /// @param _value uint256 the amount of tokens to be transferred.
    /// @return success bool Calling super.transferFrom and returns true if successful.
    function transferFrom(address _from, address _to, uint256 _value) public whenNotMinting returns (bool) {
        return super.transferFrom(_from, _to, _value);
    }
}

// File: contracts/MasterPullPayment.sol

/// @title PumaPay Pull Payment - Contract that facilitates our pull payment protocol
/// @author PumaPay Dev Team - <[email protected]>
contract PumaPayPullPayment is Ownable {
    using SafeMath for uint256;
    /// =================================================================================================================
    ///                                      Events
    /// =================================================================================================================
    
    event LogExecutorAdded(address executor);
    event LogExecutorRemoved(address executor);
    event LogPaymentRegistered(address clientAddress, address beneficiaryAddress, string paymentID);
    event LogPaymentCancelled(address clientAddress, address beneficiaryAddress, string paymentID);
    event LogPullPaymentExecuted(address clientAddress, address beneficiaryAddress, string paymentID);
    event LogSetExchangeRate(string currency, uint256 exchangeRate);

    /// =================================================================================================================
    ///                                      Constants
    /// =================================================================================================================

    uint256 constant private DECIMAL_FIXER = 10000000000; // 1^10 - This transforms the Rate from decimals to uint256
    uint256 constant private FIAT_TO_CENT_FIXER = 100;    // Fiat currencies have 100 cents in 1 basic monetary unit.
    uint256 constant private ONE_ETHER = 1 ether;         // PumaPay token has 18 decimals - same as one ETHER
    uint256 constant private MINIMUM_AMOUN_OF_ETH_FOR_OPARATORS = 0.01 ether; // minimum amount of ETHER the owner/executor should have 
    /// =================================================================================================================
    ///                                      Members
    /// =================================================================================================================

    PumaPayToken public token;

    mapping (string => uint256) private exchangeRates;
    mapping (address => bool) public executors;
    mapping (address => mapping (address => PullPayment)) public pullPayments;

    struct PullPayment {
        string merchantID;                      /// ID of the merchant
        string paymentID;                       /// ID of the payment
        string currency;                        /// 3-letter abbr i.e. 'EUR' / 'USD' etc.
        uint256 initialPaymentAmountInCents;    /// initial payment amount in fiat in cents
        uint256 fiatAmountInCents;              /// payment amount in fiat in cents
        uint256 frequency;                      /// how often merchant can pull - in seconds
        uint256 numberOfPayments;               /// amount of pull payments merchant can make
        uint256 startTimestamp;                 /// when subscription starts - in seconds
        uint256 nextPaymentTimestamp;           /// timestamp of next payment
        uint256 lastPaymentTimestamp;           /// timestamp of last payment
        uint256 cancelTimestamp;                /// timestamp the payment was cancelled
    }

    /// =================================================================================================================
    ///                                      Modifiers
    /// =================================================================================================================

    modifier isExecutor() {
         require(executors[msg.sender]);
         _;
     }

     modifier executorExists(address _executor) {
         require(executors[_executor]);
         _;
     }

     modifier executorDoesNotExists(address _executor) {
         require(!executors[_executor]);
         _;
     } 

    modifier paymentExists(address _client, address _beneficiary) {
        require(doesPaymentExist(_client, _beneficiary));
        _;
    }

    modifier paymentNotCancelled(address _client, address _beneficiary) {
        require(pullPayments[_client][_beneficiary].cancelTimestamp == 0);
        _;
    }

    modifier isValidPullPaymentRequest(address _client, address _beneficiary, string _paymentID) {
        require(
            (pullPayments[_client][_beneficiary].initialPaymentAmountInCents > 0 ||
            (now >= pullPayments[_client][_beneficiary].startTimestamp &&
            now >= pullPayments[_client][_beneficiary].nextPaymentTimestamp)
            ) 
            &&
            pullPayments[_client][_beneficiary].numberOfPayments > 0 &&
            (pullPayments[_client][_beneficiary].cancelTimestamp == 0 ||
            pullPayments[_client][_beneficiary].cancelTimestamp > pullPayments[_client][_beneficiary].nextPaymentTimestamp) &&
            keccak256(
                abi.encodePacked(pullPayments[_client][_beneficiary].paymentID)
                ) == keccak256(abi.encodePacked(_paymentID))
        );
        _;
    }

    modifier isValidDeletionRequest(string paymentID, address client, address beneficiary) {
        require(
            beneficiary != address(0) &&
            client != address(0) &&
            bytes(paymentID).length != 0
        );
        _;
    }

    modifier isValidAddress(address _address) {
        require(_address != address(0));
        _;
    }

    /// =================================================================================================================
    ///                                      Constructor
    /// =================================================================================================================

    /// @dev Contract constructor - sets the token address that the contract facilitates.
    /// @param _token Token Address.
    constructor (PumaPayToken _token)
    public
    {
        require(_token != address(0));
        token = _token;
    }

    // @notice Will receive any eth sent to the contract
    function () external payable {
    }

    /// =================================================================================================================
    ///                                      Public Functions - Owner Only
    /// =================================================================================================================
    
    /// @dev Adds a new executor. - can be executed only by the onwer. 
    /// When adding a new executor 1 ETH is tranferred to allow the executor to pay for gas.
    /// The balance of the owner is also checked and if funding is needed 1 ETH is transferred.
    /// @param _executor - address of the executor which cannot be zero address.
    function addExecutor(address _executor)
    public 
    onlyOwner
    isValidAddress(_executor)
    executorDoesNotExists(_executor)
    {
        if (isFundingNeeded(owner)) {
            owner.transfer(1 ether);
        }
        _executor.transfer(1 ether);
        executors[_executor] = true;
        
        emit LogExecutorAdded(_executor);
    }

    /// @dev Removes a new executor. - can be executed only by the onwer.
    /// The balance of the owner is checked and if funding is needed 1 ETH is transferred.
    /// @param _executor - address of the executor which cannot be zero address.
    function removeExecutor(address _executor)
    public 
    onlyOwner
    isValidAddress(_executor)
    executorExists(_executor)
    {
        executors[_executor] = false;
        if (isFundingNeeded(owner)) {
            owner.transfer(1 ether);
        }
        emit LogExecutorRemoved(_executor);
    }

    /// @dev Sets the exchange rate for a currency. - can be executed only by the onwer.
    /// Emits 'LogSetExchangeRate' with the currency and the updated rate.
    /// The balance of the owner is checked and if funding is needed 1 ETH is transferred.
    /// @param _currency - address of the executor which cannot be zero address
    /// @param _rate - address of the executor which cannot be zero address
    function setRate(string _currency, uint256 _rate)
    public
    onlyOwner
    returns (bool) {
        exchangeRates[_currency] = _rate;
        emit LogSetExchangeRate(_currency, _rate);
        
        if (isFundingNeeded(owner)) {
            owner.transfer(1 ether);
        }

        return true;
    }

    /// =================================================================================================================
    ///                                      Public Functions - Executors Only
    /// =================================================================================================================

    /// @dev Registers a new pull payment to the Master Pull Payment Contract - The registration can be executed only by one of the executors of the Master Pull Payment Contract
    /// and the Master Pull Payment Contract checks that the pull payment has been singed by the signatory of the account.
    /// The balance of the executor (msg.sender) is checked and if funding is needed 1 ETH is transferred.
    /// Emits 'LogPaymentRegistered' with client address, beneficiary address and paymentID.
    /// @param v - recovery ID of the ETH signature. - https://github.com/ethereum/EIPs/issues/155
    /// @param r - R output of ECDSA signature.
    /// @param s - S output of ECDSA signature.
    /// @param _merchantID - ID of the merchant.
    /// @param _paymentID - ID of the payment.
    /// @param _client - client address that is linked to this pull payment.
    /// @param _beneficiary - address that is allowed to execute this pull payment.
    /// @param _currency - currency of the payment / 3-letter abbr i.e. 'EUR'.
    /// @param _fiatAmountInCents - payment amount in fiat in cents.
    /// @param _frequency - how often merchant can pull - in seconds.
    /// @param _numberOfPayments - amount of pull payments merchant can make
    /// @param _startTimestamp - when subscription starts - in seconds.
    function registerPullPayment (
        uint8 v,
        bytes32 r,
        bytes32 s,
        string _merchantID,
        string _paymentID,
        address _client,
        address _beneficiary,
        string _currency,
        uint256 _initialPaymentAmountInCents,
        uint256 _fiatAmountInCents,
        uint256 _frequency,
        uint256 _numberOfPayments,
        uint256 _startTimestamp
    )
    public
    isExecutor()
    {
        require(
            bytes(_paymentID).length > 0 &&
            bytes(_currency).length > 0 &&
            _client != address(0) &&
            _beneficiary != address(0) &&
            _initialPaymentAmountInCents >= 0 &&
            _fiatAmountInCents > 0 &&
            _frequency > 0 &&
            _numberOfPayments > 0 &&
            _startTimestamp > 0
        );

        pullPayments[_client][_beneficiary].currency = _currency;
        pullPayments[_client][_beneficiary].initialPaymentAmountInCents = _initialPaymentAmountInCents;
        pullPayments[_client][_beneficiary].fiatAmountInCents = _fiatAmountInCents;
        pullPayments[_client][_beneficiary].frequency = _frequency;
        pullPayments[_client][_beneficiary].startTimestamp = _startTimestamp;
        pullPayments[_client][_beneficiary].numberOfPayments = _numberOfPayments;

        if (!isValidRegistration(v, r, s, _client, _beneficiary, pullPayments[_client][_beneficiary])) revert();

        pullPayments[_client][_beneficiary].merchantID = _merchantID;
        pullPayments[_client][_beneficiary].paymentID = _paymentID;
        pullPayments[_client][_beneficiary].nextPaymentTimestamp = _startTimestamp;
        pullPayments[_client][_beneficiary].lastPaymentTimestamp = 0;
        pullPayments[_client][_beneficiary].cancelTimestamp = 0;
        
        if (isFundingNeeded(msg.sender)) {
            msg.sender.transfer(1 ether);
        }

        emit LogPaymentRegistered(_client, _beneficiary, _paymentID);
    }

    /// @dev Deletes a pull payment for a beneficiary - The deletion needs can be executed only by one of the executors of the Master Pull Payment Contract
    /// and the Master Pull Payment Contract checks that the beneficiary and the paymentID have been singed by the signatory of the account.
    /// This method deletes the pull payment from the pull payments array for this beneficiary specified and
    /// also deletes the beneficiary from the beneficiaries array.
    /// The balance of the executor (msg.sender) is checked and if funding is needed 1 ETH is transferred.
    /// Emits 'LogPaymentCancelled' with beneficiary address and paymentID.
    /// @param v - recovery ID of the ETH signature. - https://github.com/ethereum/EIPs/issues/155
    /// @param r - R output of ECDSA signature.
    /// @param s - S output of ECDSA signature.
    /// @param _paymentID - ID of the payment.
    /// @param _client - client address that is linked to this pull payment.
    /// @param _beneficiary - address that is allowed to execute this pull payment.
    function deletePullPayment (
        uint8 v,
        bytes32 r,
        bytes32 s,
        string _paymentID,
        address _client,
        address _beneficiary
    )
    public
    isExecutor()
    paymentExists(_client, _beneficiary)
    paymentNotCancelled(_client, _beneficiary)
    isValidDeletionRequest(_paymentID, _client, _beneficiary)
    {   
        if (!isValidDeletion(v, r, s, _paymentID, _client, _beneficiary)) revert();
        pullPayments[_client][_beneficiary].cancelTimestamp = now;

        if (isFundingNeeded(msg.sender)) {
            msg.sender.transfer(1 ether);
        }

        emit LogPaymentCancelled(_client, _beneficiary, _paymentID);
    }

    /// =================================================================================================================
    ///                                      Public Functions
    /// =================================================================================================================

    /// @dev Executes a pull payment for the msg.sender - The pull payment should exist and the payment request
    /// should be valid in terms of when it can be executed.
    /// Emits 'LogPullPaymentExecuted' with client address, msg.sender as the beneficiary address and the paymentID.
    /// Use Case 1: Single/Recurring Fixed Pull Payment (initialPaymentAmountInCents == 0 )
    /// ------------------------------------------------
    /// We calculate the amount in PMA using the rate for the currency specified in the pull payment
    /// and the 'fiatAmountInCents' and we transfer from the client account the amount in PMA.
    /// After execution we set the last payment timestamp to NOW, the next payment timestamp is incremented by
    /// the frequency and the number of payments is decresed by 1.
    /// Use Case 2: Recurring Fixed Pull Payment with initial fee (initialPaymentAmountInCents > 0)
    /// ------------------------------------------------------------------------------------------------
    /// We calculate the amount in PMA using the rate for the currency specified in the pull payment
    /// and the 'initialPaymentAmountInCents' and we transfer from the client account the amount in PMA.
    /// After execution we set the last payment timestamp to NOW and the 'initialPaymentAmountInCents to ZERO.
    /// @param _client - address of the client from which the msg.sender requires to pull funds.
    function executePullPayment(address _client, string _paymentID)
    public
    paymentExists(_client, msg.sender)
    isValidPullPaymentRequest(_client, msg.sender, _paymentID)
    {
        uint256 amountInPMA;
        if (pullPayments[_client][msg.sender].initialPaymentAmountInCents > 0) {
            amountInPMA = calculatePMAFromFiat(pullPayments[_client][msg.sender].initialPaymentAmountInCents, pullPayments[_client][msg.sender].currency);
            pullPayments[_client][msg.sender].initialPaymentAmountInCents = 0;
        } else {
            amountInPMA = calculatePMAFromFiat(pullPayments[_client][msg.sender].fiatAmountInCents, pullPayments[_client][msg.sender].currency);   
            
            pullPayments[_client][msg.sender].nextPaymentTimestamp = pullPayments[_client][msg.sender].nextPaymentTimestamp + pullPayments[_client][msg.sender].frequency;
            pullPayments[_client][msg.sender].numberOfPayments = pullPayments[_client][msg.sender].numberOfPayments - 1;
        }
        token.transferFrom(_client, msg.sender, amountInPMA);

        pullPayments[_client][msg.sender].lastPaymentTimestamp = now;

        emit LogPullPaymentExecuted(_client, msg.sender, pullPayments[_client][msg.sender].paymentID);
    }

    function getRate(string _currency) public view returns(uint256) {
        return exchangeRates[_currency];
    }

    /// =================================================================================================================
    ///                                      Internal Functions
    /// =================================================================================================================

    /// @dev Calculates the PMA Rate for the fiat currency specified - The rate is being retrieved by the PumaPayOracle
    /// for the currency specified. The Oracle is being updated every minute for each different currency the our system supports.
    /// @param _fiatAmountInCents - payment amount in fiat CENTS so that is always integer
    /// @param _currency - currency in which the payment needs to take place
    /// RATE CALCULATION EXAMPLE
    /// ------------------------
    /// RATE ==> 1 PMA = 0.01 USD$
    /// 1 USD$ = 1/0.01 PMA = 100 PMA
    /// Start the calculation from one ether - PMA Token has 18 decimals
    /// Multiply by the DECIMAL_FIXER (1e+10) to fix the multiplication of the rate
    /// Multiply with the fiat amount in cents
    /// Divide by the Rate of PMA to Fiat in cents
    /// Divide by the FIAT_TO_CENT_FIXER to fix the _fiatAmountInCents
    function calculatePMAFromFiat(uint256 _fiatAmountInCents, string _currency)
    internal
    view
    returns (uint256) {
        return ONE_ETHER.mul(DECIMAL_FIXER).mul(_fiatAmountInCents).div(exchangeRates[_currency]).div(FIAT_TO_CENT_FIXER);
    }

    /// @dev Checks if a deletion request is valid by comparing the v, r, s params
    /// and the hashed params with the signatory address.
    /// @param v - recovery ID of the ETH signature. - https://github.com/ethereum/EIPs/issues/155
    /// @param r - R output of ECDSA signature.
    /// @param s - S output of ECDSA signature.
    /// @param _client - client address that is linked to this pull payment.
    /// @param _beneficiary - address that is allowed to execute this pull payment.
    /// @param _pullPayment - pull payment to be validated.
    /// @return bool - if the v, r, s params with the hashed params match the signatory address
    function isValidRegistration(
        uint8 v,
        bytes32 r,
        bytes32 s,
        address _client,
        address _beneficiary,
        PullPayment _pullPayment
    )
    internal
    pure
    returns(bool)
    {
        return ecrecover(
            keccak256(
                abi.encodePacked(
                    _beneficiary,
                    _pullPayment.currency,
                    _pullPayment.initialPaymentAmountInCents,
                    _pullPayment.fiatAmountInCents,
                    _pullPayment.frequency,
                    _pullPayment.numberOfPayments,
                    _pullPayment.startTimestamp
                )
        ),
        v, r, s) == _client;
    }

    /// @dev Checks if a deletion request is valid by comparing the v, r, s params
    /// and the hashed params with the signatory address.
    /// @param v - recovery ID of the ETH signature. - https://github.com/ethereum/EIPs/issues/155
    /// @param r - R output of ECDSA signature.
    /// @param s - S output of ECDSA signature.
    /// @param _paymentID - ID of the payment.
    /// @param _client - client address that is linked to this pull payment.
    /// @param _beneficiary - address that is allowed to execute this pull payment.
    /// @return bool - if the v, r, s params with the hashed params match the signatory address
    function isValidDeletion(
        uint8 v,
        bytes32 r,
        bytes32 s,
        string _paymentID,
        address _client,
        address _beneficiary
    )
    internal
    view
    returns(bool)
    {
        return ecrecover(
            keccak256(
                abi.encodePacked(
                    _paymentID,
                    _beneficiary
                )
            ), v, r, s) == _client
            && keccak256(
                abi.encodePacked(pullPayments[_client][_beneficiary].paymentID)
                ) == keccak256(abi.encodePacked(_paymentID));
    }

    /// @dev Checks if a payment for a beneficiary of a client exists.
    /// @param _client - client address that is linked to this pull payment.
    /// @param _beneficiary - address to execute a pull payment.
    /// @return bool - whether the beneficiary for this client has a pull payment to execute.
    function doesPaymentExist(address _client, address _beneficiary)
    internal
    view
    returns(bool) {
        return (
            bytes(pullPayments[_client][_beneficiary].currency).length > 0 &&
            pullPayments[_client][_beneficiary].fiatAmountInCents > 0 &&
            pullPayments[_client][_beneficiary].frequency > 0 &&
            pullPayments[_client][_beneficiary].startTimestamp > 0 &&
            pullPayments[_client][_beneficiary].numberOfPayments > 0 &&
            pullPayments[_client][_beneficiary].nextPaymentTimestamp > 0
        );
    }
    
    /// @dev Checks if the address of an owner/executor needs to be funded. 
    /// The minimum amount the owner/executors should always have is 0.001 ETH 
    /// @param _address - address of owner/executors that the balance is checked against. 
    /// @return bool - whether the address needs more ETH.
    function isFundingNeeded(address _address) 
    private
    view
    returns (bool) {
        return address(_address).balance <= MINIMUM_AMOUN_OF_ETH_FOR_OPARATORS;
    }
}

    Contract ABI  
[{"constant":false,"inputs":[{"name":"_executor","type":"address"}],"name":"addExecutor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_executor","type":"address"}],"name":"removeExecutor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_client","type":"address"},{"name":"_paymentID","type":"string"}],"name":"executePullPayment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_currency","type":"string"}],"name":"getRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"},{"name":"_paymentID","type":"string"},{"name":"_client","type":"address"},{"name":"_beneficiary","type":"address"}],"name":"deletePullPayment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"pullPayments","outputs":[{"name":"merchantID","type":"string"},{"name":"paymentID","type":"string"},{"name":"currency","type":"string"},{"name":"initialPaymentAmountInCents","type":"uint256"},{"name":"fiatAmountInCents","type":"uint256"},{"name":"frequency","type":"uint256"},{"name":"numberOfPayments","type":"uint256"},{"name":"startTimestamp","type":"uint256"},{"name":"nextPaymentTimestamp","type":"uint256"},{"name":"lastPaymentTimestamp","type":"uint256"},{"name":"cancelTimestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"},{"name":"_merchantID","type":"string"},{"name":"_paymentID","type":"string"},{"name":"_client","type":"address"},{"name":"_beneficiary","type":"address"},{"name":"_currency","type":"string"},{"name":"_initialPaymentAmountInCents","type":"uint256"},{"name":"_fiatAmountInCents","type":"uint256"},{"name":"_frequency","type":"uint256"},{"name":"_numberOfPayments","type":"uint256"},{"name":"_startTimestamp","type":"uint256"}],"name":"registerPullPayment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"executors","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_currency","type":"string"},{"name":"_rate","type":"uint256"}],"name":"setRate","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_token","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"executor","type":"address"}],"name":"LogExecutorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"executor","type":"address"}],"name":"LogExecutorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"clientAddress","type":"address"},{"indexed":false,"name":"beneficiaryAddress","type":"address"},{"indexed":false,"name":"paymentID","type":"string"}],"name":"LogPaymentRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"clientAddress","type":"address"},{"indexed":false,"name":"beneficiaryAddress","type":"address"},{"indexed":false,"name":"paymentID","type":"string"}],"name":"LogPaymentCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"clientAddress","type":"address"},{"indexed":false,"name":"beneficiaryAddress","type":"address"},{"indexed":false,"name":"paymentID","type":"string"}],"name":"LogPullPaymentExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"currency","type":"string"},{"indexed":false,"name":"exchangeRate","type":"uint256"}],"name":"LogSetExchangeRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

  Contract Creation Code Switch To Opcodes View
608060405234801561001057600080fd5b50604051602080612593833981016040525160008054600160a060020a03191633179055600160a060020a038116151561004957600080fd5b60018054600160a060020a031916600160a060020a039290921691909117905561251b806100786000396000f3006080604052600436106100c45763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631f5a0bbe81146100c657806324788429146100e757806365826666146101085780636c0daed81461016f5780636e635673146101da578063715018a6146102565780637d45bd2f1461026b5780638da5cb5b146104115780639072d58a146104425780639ac2a01114610556578063c84cda0f1461058b578063f2fde38b146105e6578063fc0c546a14610607575b005b3480156100d257600080fd5b506100c4600160a060020a036004351661061c565b3480156100f357600080fd5b506100c4600160a060020a0360043516610760565b34801561011457600080fd5b5060408051602060046024803582810135601f81018590048502860185019096528585526100c4958335600160a060020a03169536956044949193909101919081908401838280828437509497506108669650505050505050565b34801561017b57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101c8943694929360249392840191908190840183828082843750949750610f1e9650505050505050565b60408051918252519081900360200190f35b3480156101e657600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526100c49460ff813516946024803595604435953695608494930191819084018382808284375094975050600160a060020a038535811696506020909501359094169350610f8692505050565b34801561026257600080fd5b506100c461118d565b34801561027757600080fd5b50610292600160a060020a03600435811690602435166111f9565b604051808060200180602001806020018c81526020018b81526020018a815260200189815260200188815260200187815260200186815260200185815260200184810384528f818151815260200191508051906020019080838360005b838110156103075781810151838201526020016102ef565b50505050905090810190601f1680156103345780820380516001836020036101000a031916815260200191505b5084810383528e818151815260200191508051906020019080838360005b8381101561036a578181015183820152602001610352565b50505050905090810190601f1680156103975780820380516001836020036101000a031916815260200191505b5084810382528d5181528d516020918201918f019080838360005b838110156103ca5781810151838201526020016103b2565b50505050905090810190601f1680156103f75780820380516001836020036101000a031916815260200191505b509e50505050505050505050505050505060405180910390f35b34801561041d57600080fd5b50610426611401565b60408051600160a060020a039092168252519081900360200190f35b34801561044e57600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526100c49460ff813516946024803595604435953695608494930191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020888301358a018035601f8101839004830284018301909452838352979a8935600160a060020a039081169b8b8401359091169a9199909850606090910196509194509081019250819084018382808284375094975050843595505050602083013592604081013592506060810135915060800135611410565b34801561056257600080fd5b50610577600160a060020a0360043516611a8a565b604080519115158252519081900360200190f35b34801561059757600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526105779436949293602493928401919081908401838280828437509497505093359450611a9f9350505050565b3480156105f257600080fd5b506100c4600160a060020a0360043516611c1d565b34801561061357600080fd5b50610426611c40565b600054600160a060020a0316331461063357600080fd5b80600160a060020a038116151561064957600080fd5b600160a060020a038216600090815260036020526040902054829060ff161561067157600080fd5b60005461068690600160a060020a0316611c4f565b156106c95760008054604051600160a060020a039091169190670de0b6b3a76400009082818181858883f193505050501580156106c7573d6000803e3d6000fd5b505b604051600160a060020a03841690600090670de0b6b3a76400009082818181858883f19350505050158015610702573d6000803e3d6000fd5b50600160a060020a038316600081815260036020908152604091829020805460ff19166001179055815192835290517f8002cf25aa76b379f7f97c8fe71f2bb091370573ab719fd656612219aae890ba9281900390910190a1505050565b600054600160a060020a0316331461077757600080fd5b80600160a060020a038116151561078d57600080fd5b600160a060020a038216600090815260036020526040902054829060ff1615156107b657600080fd5b600160a060020a038084166000908152600360205260408120805460ff19169055546107e29116611c4f565b156108255760008054604051600160a060020a039091169190670de0b6b3a76400009082818181858883f19350505050158015610823573d6000803e3d6000fd5b505b60408051600160a060020a038516815290517f67c86b0b9218d30f0d89e72b9aafcace5cd51e46f60fdf6f3323877952e21c4b9181900360200190a1505050565b600082336108748282611c69565b151561087f57600080fd5b600160a060020a03851660009081526004602090815260408083203380855292528220600301548792879111806109115750600160a060020a0380841660009081526004602090815260408083209386168352929052206007015442108015906109115750600160a060020a038084166000908152600460209081526040808320938616835292905220600801544210155b80156109455750600160a060020a038084166000908152600460209081526040808320938616835292905290812060060154115b80156109ae5750600160a060020a038084166000908152600460209081526040808320938616835292905220600a015415806109ae5750600160a060020a0383811660009081526004602090815260408083209386168352929052206008810154600a90910154115b8015610b9b5750806040516020018082805190602001908083835b602083106109e85780518252601f1990920191602091820191016109c9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310610a4b5780518252601f199092019160209182019101610a2c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019166004600085600160a060020a0316600160a060020a03168152602001908152602001600020600084600160a060020a0316600160a060020a031681526020019081526020016000206001016040516020018082805460018160011615610100020316600290048015610b255780601f10610b03576101008083540402835291820191610b25565b820191906000526020600020905b815481529060010190602001808311610b11575b50509150506040516020818303038152906040526040518082805190602001908083835b60208310610b685780518252601f199092019160209182019101610b49565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916145b1515610ba657600080fd5b600160a060020a03881660009081526004602090815260408083203384529091528120600301541115610cbe57600160a060020a038816600090815260046020908152604080832033845282529182902060038101546002918201805485516001821615610100026000190190911693909304601f8101859004850284018501909552848352610c90949193909190830182828015610c865780601f10610c5b57610100808354040283529160200191610c86565b820191906000526020600020905b815481529060010190602001808311610c6957829003601f168201915b5050505050611db2565b600160a060020a03891660009081526004602090815260408083203384529091528120600301559550610d87565b600160a060020a0388166000908152600460208181526040808420338552825292839020918201546002928301805485516001821615610100026000190190911694909404601f8101849004840285018401909552848452610d4694919392909190830182828015610c865780601f10610c5b57610100808354040283529160200191610c86565b600160a060020a0389166000908152600460209081526040808320338452909152902060058101546008820180549091019055600601805460001901905595505b600154604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152336024830152604482018a9052915191909216916323b872dd9160648083019260209291908290030181600087803b158015610dfc57600080fd5b505af1158015610e10573d6000803e3d6000fd5b505050506040513d6020811015610e2657600080fd5b5050600160a060020a038816600081815260046020908152604080832033808552908352928190204260098201558151948552918401839052606090840181815260019283018054600294811615610100026000190116939093049185018290527f13492443fb72a9a7d56cc1aa2e262bcf2442d4b084def464b7934b3485114e59948d949392909190608083019084908015610f045780601f10610ed957610100808354040283529160200191610f04565b820191906000526020600020905b815481529060010190602001808311610ee757829003601f168201915b505094505050505060405180910390a15050505050505050565b60006002826040518082805190602001908083835b60208310610f525780518252601f199092019160209182019101610f33565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054949350505050565b3360009081526003602052604090205460ff161515610fa457600080fd5b8181610fb08282611c69565b1515610fbb57600080fd5b600160a060020a038085166000908152600460209081526040808320938716835292905220600a01548490849015610ff257600080fd5b868686600160a060020a038116158015906110155750600160a060020a03821615155b80156110215750825115155b151561102c57600080fd5b61103a8d8d8d8d8d8d611e51565b151561104557600080fd5b600160a060020a03808a166000908152600460209081526040808320938c1683529290522042600a9091015561107a33611c4f565b156110b1576040513390600090670de0b6b3a76400009082818181858883f193505050501580156110af573d6000803e3d6000fd5b505b7f172a33cda438041634fc514b27425640f7d77fd7bd679f07f1931d454b08fa7889898c6040518084600160a060020a0316600160a060020a0316815260200183600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561114257818101518382015260200161112a565b50505050905090810190601f16801561116f5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a150505050505050505050505050565b600054600160a060020a031633146111a457600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600460209081526000928352604080842082529183529181902080548251601f6002600019610100600186161502019093169290920491820185900485028101850190935280835290928391908301828280156112975780601f1061126c57610100808354040283529160200191611297565b820191906000526020600020905b81548152906001019060200180831161127a57829003601f168201915b505050505090806001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113355780601f1061130a57610100808354040283529160200191611335565b820191906000526020600020905b81548152906001019060200180831161131857829003601f168201915b50505060028085018054604080516020601f60001961010060018716150201909416959095049283018590048502810185019091528181529596959450909250908301828280156113c75780601f1061139c576101008083540402835291602001916113c7565b820191906000526020600020905b8154815290600101906020018083116113aa57829003601f168201915b50505050509080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a015490508b565b600054600160a060020a031681565b3360009081526003602052604090205460ff16151561142e57600080fd5b60008951118015611440575060008651115b80156114545750600160a060020a03881615155b80156114685750600160a060020a03871615155b8015611475575060008510155b80156114815750600084115b801561148d5750600083115b80156114995750600082115b80156114a55750600081115b15156114b057600080fd5b600160a060020a038089166000908152600460209081526040808320938b16835292815291902087516114eb92600290920191890190612454565b5084600460008a600160a060020a0316600160a060020a03168152602001908152602001600020600089600160a060020a0316600160a060020a031681526020019081526020016000206003018190555083600460008a600160a060020a0316600160a060020a03168152602001908152602001600020600089600160a060020a0316600160a060020a031681526020019081526020016000206004018190555082600460008a600160a060020a0316600160a060020a03168152602001908152602001600020600089600160a060020a0316600160a060020a031681526020019081526020016000206005018190555080600460008a600160a060020a0316600160a060020a03168152602001908152602001600020600089600160a060020a0316600160a060020a031681526020019081526020016000206007018190555081600460008a600160a060020a0316600160a060020a03168152602001908152602001600020600089600160a060020a0316600160a060020a03168152602001908152602001600020600601819055506119048d8d8d8b8b600460008f600160a060020a0316600160a060020a0316815260200190815260200160002060008e600160a060020a0316600160a060020a031681526020019081526020016000206101606040519081016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117725780601f1061174757610100808354040283529160200191611772565b820191906000526020600020905b81548152906001019060200180831161175557829003601f168201915b50505050508152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118145780601f106117e957610100808354040283529160200191611814565b820191906000526020600020905b8154815290600101906020018083116117f757829003601f168201915b5050509183525050600282810180546040805160206001841615610100026000190190931694909404601f810183900483028501830190915280845293810193908301828280156118a65780601f1061187b576101008083540402835291602001916118a6565b820191906000526020600020905b81548152906001019060200180831161188957829003601f168201915b5050505050815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a820154815250506121cb565b151561190f57600080fd5b600160a060020a038089166000908152600460209081526040808320938b1683529281529190208b51611944928d0190612454565b50600160a060020a038089166000908152600460209081526040808320938b1683529281529190208a51611980926001909201918c0190612454565b50600160a060020a038881166000908152600460209081526040808320938b1683529290529081206008810183905560098101829055600a01556119c333611c4f565b156119fa576040513390600090670de0b6b3a76400009082818181858883f193505050501580156119f8573d6000803e3d6000fd5b505b7f428ab8c1610a031128b670bb25673444ab666a8ffc071f4d10f9a4d4111cc4b988888b6040518084600160a060020a0316600160a060020a0316815260200183600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360008381101561114257818101518382015260200161112a565b60036020526000908152604090205460ff1681565b60008054600160a060020a03163314611ab757600080fd5b816002846040518082805190602001908083835b60208310611aea5780518252601f199092019160209182019101611acb565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201852095909555838101879052848452875194840194909452505084517f91507cd48322a48a936015a3065f76190a84176426c149cd0149452bc34bd097928692869290918291606083019186019080838360005b83811015611b80578181015183820152602001611b68565b50505050905090810190601f168015611bad5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a1600054611bd090600160a060020a0316611c4f565b15611c135760008054604051600160a060020a039091169190670de0b6b3a76400009082818181858883f19350505050158015611c11573d6000803e3d6000fd5b505b5060015b92915050565b600054600160a060020a03163314611c3457600080fd5b611c3d81612399565b50565b600154600160a060020a031681565b662386f26fc10000600160a060020a038216311115919050565b600160a060020a038083166000908152600460209081526040808320938516835292905290812060029081015460001961010060018316150201160481108015611cdb5750600160a060020a038084166000908152600460208181526040808420948716845293905291812090910154115b8015611d0f5750600160a060020a038084166000908152600460209081526040808320938616835292905290812060050154115b8015611d435750600160a060020a038084166000908152600460209081526040808320938616835292905290812060070154115b8015611d775750600160a060020a038084166000908152600460209081526040808320938616835292905290812060060154115b8015611dab5750600160a060020a038084166000908152600460209081526040808320938616835292905290812060080154115b9392505050565b6000611dab6064611e456002856040518082805190602001908083835b60208310611dee5780518252601f199092019160209182019101611dcf565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549150611e45905087611e39670de0b6b3a76400006402540be400612416565b9063ffffffff61241616565b9063ffffffff61243f16565b600082600160a060020a0316600185846040516020018083805190602001908083835b60208310611e935780518252601f199092019160209182019101611e74565b6001836020036101000a03801982511681845116808217855250505050505090500182600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401925050506040516020818303038152906040526040518082805190602001908083835b60208310611f1e5780518252601f199092019160209182019101611eff565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020898989604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af1158015611fbf573d6000803e3d6000fd5b50505060206040510351600160a060020a03161480156121c05750836040516020018082805190602001908083835b6020831061200d5780518252601f199092019160209182019101611fee565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083106120705780518252601f199092019160209182019101612051565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019166004600085600160a060020a0316600160a060020a03168152602001908152602001600020600084600160a060020a0316600160a060020a03168152602001908152602001600020600101604051602001808280546001816001161561010002031660029004801561214a5780601f1061212857610100808354040283529182019161214a565b820191906000526020600020905b815481529060010190602001808311612136575b50509150506040516020818303038152906040526040518082805190602001908083835b6020831061218d5780518252601f19909201916020918201910161216e565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916145b979650505050505050565b600083600160a060020a03166001848460400151856060015186608001518760a001518860c001518960e001516040516020018088600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140187805190602001908083835b602083106122515780518252601f199092019160209182019101612232565b6001836020036101000a0380198251168184511680821785525050505050509050018681526020018581526020018481526020018381526020018281526020019750505050505050506040516020818303038152906040526040518082805190602001908083835b602083106122d85780518252601f1990920191602091820191016122b9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020898989604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af1158015612379573d6000803e3d6000fd5b50505060206040510351600160a060020a03161490509695505050505050565b600160a060020a03811615156123ae57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600082151561242757506000611c17565b5081810281838281151561243757fe5b0414611c1757fe5b6000818381151561244c57fe5b049392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061249557805160ff19168380011785556124c2565b828001600101855582156124c2579182015b828111156124c25782518255916020019190600101906124a7565b506124ce9291506124d2565b5090565b6124ec91905b808211156124ce57600081556001016124d8565b905600a165627a7a72305820f2f193767f437e9bc5952aa9cd188f72b7825145e20b733cd3aa121b710d3972002900000000000000000000000011c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc1

    Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000011c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc1

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000011c1e537801cc1c37ad6e1b7d0bdc0e00fcc6dc1


   Swarm Source:
bzzr://f2f193767f437e9bc5952aa9cd188f72b7825145e20b733cd3aa121b710d3972

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward