Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Multichain Info
No addresses found
Latest 8 from a total of 8 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Pay For Order | 8229136 | 2073 days ago | IN | 0.000306 ETH | 0.00009525 | ||||
Pay For Order | 7803796 | 2140 days ago | IN | 0.001191 ETH | 0.00024076 | ||||
Pay For Order | 7770312 | 2145 days ago | IN | 0.00564 ETH | 0.00152484 | ||||
Pay For Order | 7770266 | 2145 days ago | IN | 0.005725 ETH | 0.00152484 | ||||
Pay For Order | 7770220 | 2145 days ago | IN | 0.005639 ETH | 0.00152484 | ||||
Pay For Order | 7770154 | 2145 days ago | IN | 0.005553 ETH | 0.00180984 | ||||
Transfer Ownersh... | 7713925 | 2154 days ago | IN | 0 ETH | 0.00092646 | ||||
Set Monetha Addr... | 7713924 | 2154 days ago | IN | 0 ETH | 0.00136428 |
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xE6922636...4A0Fc9658 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
PrivatePaymentProcessor
Compiler Version
v0.4.25+commit.59dbf8f1
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-01-25 */ pragma solidity ^0.4.24; // File: 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: 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: openzeppelin-solidity/contracts/lifecycle/Pausable.sol /** * @title Pausable * @dev Base contract which allows children to implement an emergency stop mechanism. */ contract Pausable is Ownable { event Pause(); event Unpause(); bool public paused = false; /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!paused); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(paused); _; } /** * @dev called by the owner to pause, triggers stopped state */ function pause() public onlyOwner whenNotPaused { paused = true; emit Pause(); } /** * @dev called by the owner to unpause, returns to normal state */ function unpause() public onlyOwner whenPaused { paused = false; emit Unpause(); } } // File: openzeppelin-solidity/contracts/lifecycle/Destructible.sol /** * @title Destructible * @dev Base contract that can be destroyed by owner. All funds in contract will be sent to the owner. */ contract Destructible is Ownable { /** * @dev Transfers the current balance to the owner and terminates the contract. */ function destroy() public onlyOwner { selfdestruct(owner); } function destroyAndSend(address _recipient) public onlyOwner { selfdestruct(_recipient); } } // File: openzeppelin-solidity/contracts/ownership/Contactable.sol /** * @title Contactable token * @dev Basic version of a contactable contract, allowing the owner to provide a string with their * contact information. */ contract Contactable is Ownable { string public contactInformation; /** * @dev Allows the owner to set a string with their contact information. * @param _info The contact information to attach to the contract. */ function setContactInformation(string _info) public onlyOwner { contactInformation = _info; } } // File: monetha-utility-contracts/contracts/Restricted.sol /** @title Restricted * Exposes onlyMonetha modifier */ contract Restricted is Ownable { //MonethaAddress set event event MonethaAddressSet( address _address, bool _isMonethaAddress ); mapping (address => bool) public isMonethaAddress; /** * Restrict methods in such way, that they can be invoked only by monethaAddress account. */ modifier onlyMonetha() { require(isMonethaAddress[msg.sender]); _; } /** * Allows owner to set new monetha address */ function setMonethaAddress(address _address, bool _isMonethaAddress) onlyOwner public { isMonethaAddress[_address] = _isMonethaAddress; emit MonethaAddressSet(_address, _isMonethaAddress); } } // File: monetha-loyalty-contracts/contracts/IMonethaVoucher.sol interface IMonethaVoucher { /** * @dev Total number of vouchers in shared pool */ function totalInSharedPool() external view returns (uint256); /** * @dev Converts vouchers to equivalent amount of wei. * @param _value amount of vouchers (vouchers) to convert to amount of wei * @return A uint256 specifying the amount of wei. */ function toWei(uint256 _value) external view returns (uint256); /** * @dev Converts amount of wei to equivalent amount of vouchers. * @param _value amount of wei to convert to vouchers (vouchers) * @return A uint256 specifying the amount of vouchers. */ function fromWei(uint256 _value) external view returns (uint256); /** * @dev Applies discount for address by returning vouchers to shared pool and transferring funds (in wei). May be called only by Monetha. * @param _for address to apply discount for * @param _vouchers amount of vouchers to return to shared pool * @return Actual number of vouchers returned to shared pool and amount of funds (in wei) transferred. */ function applyDiscount(address _for, uint256 _vouchers) external returns (uint256 amountVouchers, uint256 amountWei); /** * @dev Applies payback by transferring vouchers from the shared pool to the user. * The amount of transferred vouchers is equivalent to the amount of Ether in the `_amountWei` parameter. * @param _for address to apply payback for * @param _amountWei amount of Ether to estimate the amount of vouchers * @return The number of vouchers added */ function applyPayback(address _for, uint256 _amountWei) external returns (uint256 amountVouchers); /** * @dev Function to buy vouchers by transferring equivalent amount in Ether to contract. May be called only by Monetha. * After the vouchers are purchased, they can be sold or released to another user. Purchased vouchers are stored in * a separate pool and may not be expired. * @param _vouchers The amount of vouchers to buy. The caller must also transfer an equivalent amount of Ether. */ function buyVouchers(uint256 _vouchers) external payable; /** * @dev The function allows Monetha account to sell previously purchased vouchers and get Ether from the sale. * The equivalent amount of Ether will be transferred to the caller. May be called only by Monetha. * @param _vouchers The amount of vouchers to sell. * @return A uint256 specifying the amount of Ether (in wei) transferred to the caller. */ function sellVouchers(uint256 _vouchers) external returns(uint256 weis); /** * @dev Function allows Monetha account to release the purchased vouchers to any address. * The released voucher acquires an expiration property and should be used in Monetha ecosystem within 6 months, otherwise * it will be returned to shared pool. May be called only by Monetha. * @param _to address to release vouchers to. * @param _value the amount of vouchers to release. */ function releasePurchasedTo(address _to, uint256 _value) external returns (bool); /** * @dev Function to check the amount of vouchers that an owner (Monetha account) allowed to sell or release to some user. * @param owner The address which owns the funds. * @return A uint256 specifying the amount of vouchers still available for the owner. */ function purchasedBy(address owner) external view returns (uint256); } // File: contracts/GenericERC20.sol /** * @title GenericERC20 interface */ contract GenericERC20 { function totalSupply() public view returns (uint256); function decimals() public view returns(uint256); function balanceOf(address _who) public view returns (uint256); function allowance(address _owner, address _spender) public view returns (uint256); // Return type not defined intentionally since not all ERC20 tokens return proper result type function transfer(address _to, uint256 _value) public; function approve(address _spender, uint256 _value) public returns (bool); function transferFrom(address _from, address _to, uint256 _value) public returns (bool); event Transfer( address indexed from, address indexed to, uint256 value ); event Approval( address indexed owner, address indexed spender, uint256 value ); } // File: contracts/MonethaGateway.sol /** * @title MonethaGateway * * MonethaGateway forward funds from order payment to merchant's wallet and collects Monetha fee. */ contract MonethaGateway is Pausable, Contactable, Destructible, Restricted { using SafeMath for uint256; string constant VERSION = "0.6"; /** * Fee permille of Monetha fee. * 1 permille (‰) = 0.1 percent (%) * 15‰ = 1.5% */ uint public constant FEE_PERMILLE = 15; uint public constant PERMILLE_COEFFICIENT = 1000; /** * Address of Monetha Vault for fee collection */ address public monethaVault; /** * Account for permissions managing */ address public admin; /** * Monetha voucher contract */ IMonethaVoucher public monethaVoucher; /** * Max. discount permille. * 10 permille = 1 % */ uint public MaxDiscountPermille; event PaymentProcessedEther(address merchantWallet, uint merchantIncome, uint monethaIncome); event PaymentProcessedToken(address tokenAddress, address merchantWallet, uint merchantIncome, uint monethaIncome); event MonethaVoucherChanged( address indexed previousMonethaVoucher, address indexed newMonethaVoucher ); event MaxDiscountPermilleChanged(uint prevPermilleValue, uint newPermilleValue); /** * @param _monethaVault Address of Monetha Vault */ constructor(address _monethaVault, address _admin, IMonethaVoucher _monethaVoucher) public { require(_monethaVault != 0x0); monethaVault = _monethaVault; setAdmin(_admin); setMonethaVoucher(_monethaVoucher); setMaxDiscountPermille(700); // 70% } /** * acceptPayment accept payment from PaymentAcceptor, forwards it to merchant's wallet * and collects Monetha fee. * @param _merchantWallet address of merchant's wallet for fund transfer * @param _monethaFee is a fee collected by Monetha */ /** * acceptPayment accept payment from PaymentAcceptor, forwards it to merchant's wallet * and collects Monetha fee. * @param _merchantWallet address of merchant's wallet for fund transfer * @param _monethaFee is a fee collected by Monetha */ function acceptPayment(address _merchantWallet, uint _monethaFee, address _customerAddress, uint _vouchersApply, uint _paybackPermille) external payable onlyMonetha whenNotPaused returns (uint discountWei){ require(_merchantWallet != 0x0); uint price = msg.value; // Monetha fee cannot be greater than 1.5% of payment require(_monethaFee >= 0 && _monethaFee <= FEE_PERMILLE.mul(price).div(1000)); discountWei = 0; if (monethaVoucher != address(0)) { if (_vouchersApply > 0 && MaxDiscountPermille > 0) { uint maxDiscountWei = price.mul(MaxDiscountPermille).div(PERMILLE_COEFFICIENT); uint maxVouchers = monethaVoucher.fromWei(maxDiscountWei); // limit vouchers to apply uint vouchersApply = _vouchersApply; if (vouchersApply > maxVouchers) { vouchersApply = maxVouchers; } (, discountWei) = monethaVoucher.applyDiscount(_customerAddress, vouchersApply); } if (_paybackPermille > 0) { uint paybackWei = price.sub(discountWei).mul(_paybackPermille).div(PERMILLE_COEFFICIENT); if (paybackWei > 0) { monethaVoucher.applyPayback(_customerAddress, paybackWei); } } } uint merchantIncome = price.sub(_monethaFee); _merchantWallet.transfer(merchantIncome); monethaVault.transfer(_monethaFee); emit PaymentProcessedEther(_merchantWallet, merchantIncome, _monethaFee); } /** * acceptTokenPayment accept token payment from PaymentAcceptor, forwards it to merchant's wallet * and collects Monetha fee. * @param _merchantWallet address of merchant's wallet for fund transfer * @param _monethaFee is a fee collected by Monetha * @param _tokenAddress is the token address * @param _value is the order value */ function acceptTokenPayment( address _merchantWallet, uint _monethaFee, address _tokenAddress, uint _value ) external onlyMonetha whenNotPaused { require(_merchantWallet != 0x0); // Monetha fee cannot be greater than 1.5% of payment require(_monethaFee >= 0 && _monethaFee <= FEE_PERMILLE.mul(_value).div(1000)); uint merchantIncome = _value.sub(_monethaFee); GenericERC20(_tokenAddress).transfer(_merchantWallet, merchantIncome); GenericERC20(_tokenAddress).transfer(monethaVault, _monethaFee); emit PaymentProcessedToken(_tokenAddress, _merchantWallet, merchantIncome, _monethaFee); } /** * changeMonethaVault allows owner to change address of Monetha Vault. * @param newVault New address of Monetha Vault */ function changeMonethaVault(address newVault) external onlyOwner whenNotPaused { monethaVault = newVault; } /** * Allows other monetha account or contract to set new monetha address */ function setMonethaAddress(address _address, bool _isMonethaAddress) public { require(msg.sender == admin || msg.sender == owner); isMonethaAddress[_address] = _isMonethaAddress; emit MonethaAddressSet(_address, _isMonethaAddress); } /** * setAdmin allows owner to change address of admin. * @param _admin New address of admin */ function setAdmin(address _admin) public onlyOwner { require(_admin != address(0)); admin = _admin; } /** * setAdmin allows owner to change address of Monetha voucher contract. If set to 0x0 address, discounts and paybacks are disabled. * @param _monethaVoucher New address of Monetha voucher contract */ function setMonethaVoucher(IMonethaVoucher _monethaVoucher) public onlyOwner { if (monethaVoucher != _monethaVoucher) { emit MonethaVoucherChanged(monethaVoucher, _monethaVoucher); monethaVoucher = _monethaVoucher; } } /** * setMaxDiscountPermille allows Monetha to change max.discount percentage * @param _maxDiscountPermille New value of max.discount (in permille) */ function setMaxDiscountPermille(uint _maxDiscountPermille) public onlyOwner { require(_maxDiscountPermille <= PERMILLE_COEFFICIENT); emit MaxDiscountPermilleChanged(MaxDiscountPermille, _maxDiscountPermille); MaxDiscountPermille = _maxDiscountPermille; } } // File: monetha-utility-contracts/contracts/SafeDestructible.sol /** * @title SafeDestructible * Base contract that can be destroyed by owner. * Can be destructed if there are no funds on contract balance. */ contract SafeDestructible is Ownable { function destroy() onlyOwner public { require(address(this).balance == 0); selfdestruct(owner); } } // File: contracts/MerchantWallet.sol /** * @title MerchantWallet * Serves as a public Merchant profile with merchant profile info, * payment settings and latest reputation value. * Also MerchantWallet accepts payments for orders. */ contract MerchantWallet is Pausable, SafeDestructible, Contactable, Restricted { string constant VERSION = "0.5"; /// Address of merchant's account, that can withdraw from wallet address public merchantAccount; /// Address of merchant's fund address. address public merchantFundAddress; /// Unique Merchant identifier hash bytes32 public merchantIdHash; /// profileMap stores general information about the merchant mapping (string=>string) profileMap; /// paymentSettingsMap stores payment and order settings for the merchant mapping (string=>string) paymentSettingsMap; /// compositeReputationMap stores composite reputation, that compraises from several metrics mapping (string=>uint32) compositeReputationMap; /// number of last digits in compositeReputation for fractional part uint8 public constant REPUTATION_DECIMALS = 4; /** * Restrict methods in such way, that they can be invoked only by merchant account. */ modifier onlyMerchant() { require(msg.sender == merchantAccount); _; } /** * Fund Address should always be Externally Owned Account and not a contract. */ modifier isEOA(address _fundAddress) { uint256 _codeLength; assembly {_codeLength := extcodesize(_fundAddress)} require(_codeLength == 0, "sorry humans only"); _; } /** * Restrict methods in such way, that they can be invoked only by merchant account or by monethaAddress account. */ modifier onlyMerchantOrMonetha() { require(msg.sender == merchantAccount || isMonethaAddress[msg.sender]); _; } /** * @param _merchantAccount Address of merchant's account, that can withdraw from wallet * @param _merchantId Merchant identifier * @param _fundAddress Merchant's fund address, where amount will be transferred. */ constructor(address _merchantAccount, string _merchantId, address _fundAddress) public isEOA(_fundAddress) { require(_merchantAccount != 0x0); require(bytes(_merchantId).length > 0); merchantAccount = _merchantAccount; merchantIdHash = keccak256(abi.encodePacked(_merchantId)); merchantFundAddress = _fundAddress; } /** * Accept payment from MonethaGateway */ function () external payable { } /** * @return profile info by string key */ function profile(string key) external constant returns (string) { return profileMap[key]; } /** * @return payment setting by string key */ function paymentSettings(string key) external constant returns (string) { return paymentSettingsMap[key]; } /** * @return composite reputation value by string key */ function compositeReputation(string key) external constant returns (uint32) { return compositeReputationMap[key]; } /** * Set profile info by string key */ function setProfile( string profileKey, string profileValue, string repKey, uint32 repValue ) external onlyOwner { profileMap[profileKey] = profileValue; if (bytes(repKey).length != 0) { compositeReputationMap[repKey] = repValue; } } /** * Set payment setting by string key */ function setPaymentSettings(string key, string value) external onlyOwner { paymentSettingsMap[key] = value; } /** * Set composite reputation value by string key */ function setCompositeReputation(string key, uint32 value) external onlyMonetha { compositeReputationMap[key] = value; } /** * Allows withdrawal of funds to beneficiary address */ function doWithdrawal(address beneficiary, uint amount) private { require(beneficiary != 0x0); beneficiary.transfer(amount); } /** * Allows merchant to withdraw funds to beneficiary address */ function withdrawTo(address beneficiary, uint amount) public onlyMerchant whenNotPaused { doWithdrawal(beneficiary, amount); } /** * Allows merchant to withdraw funds to it's own account */ function withdraw(uint amount) external onlyMerchant { withdrawTo(msg.sender, amount); } /** * Allows merchant or Monetha to initiate exchange of funds by withdrawing funds to deposit address of the exchange */ function withdrawToExchange(address depositAccount, uint amount) external onlyMerchantOrMonetha whenNotPaused { doWithdrawal(depositAccount, amount); } /** * Allows merchant or Monetha to initiate exchange of funds by withdrawing all funds to deposit address of the exchange */ function withdrawAllToExchange(address depositAccount, uint min_amount) external onlyMerchantOrMonetha whenNotPaused { require (address(this).balance >= min_amount); doWithdrawal(depositAccount, address(this).balance); } /** * Allows merchant or Monetha to initiate exchange of tokens by withdrawing all tokens to deposit address of the exchange */ function withdrawAllTokensToExchange(address _tokenAddress, address _depositAccount, uint _minAmount) external onlyMerchantOrMonetha whenNotPaused { require(_tokenAddress != address(0)); uint balance = GenericERC20(_tokenAddress).balanceOf(address(this)); require(balance >= _minAmount); GenericERC20(_tokenAddress).transfer(_depositAccount, balance); } /** * Allows merchant to change it's account address */ function changeMerchantAccount(address newAccount) external onlyMerchant whenNotPaused { merchantAccount = newAccount; } /** * Allows merchant to change it's fund address. */ function changeFundAddress(address newFundAddress) external onlyMerchant isEOA(newFundAddress) { merchantFundAddress = newFundAddress; } } // File: contracts/PrivatePaymentProcessor.sol contract PrivatePaymentProcessor is Pausable, Destructible, Contactable, Restricted { using SafeMath for uint256; string constant VERSION = "0.6"; /** * Payback permille. * 1 permille = 0.1 % */ uint public constant PAYBACK_PERMILLE = 2; // 0.2% // Order paid event event OrderPaidInEther( uint indexed _orderId, address indexed _originAddress, uint _price, uint _monethaFee, uint _discount ); event OrderPaidInToken( uint indexed _orderId, address indexed _originAddress, address indexed _tokenAddress, uint _price, uint _monethaFee ); // Payments have been processed event event PaymentsProcessed( address indexed _merchantAddress, uint _amount, uint _fee ); // PaymentRefunding is an event when refunding initialized event PaymentRefunding( uint indexed _orderId, address indexed _clientAddress, uint _amount, string _refundReason ); // PaymentWithdrawn event is fired when payment is withdrawn event PaymentWithdrawn( uint indexed _orderId, address indexed _clientAddress, uint amount ); /// MonethaGateway contract for payment processing MonethaGateway public monethaGateway; /// Address of MerchantWallet, where merchant reputation and funds are stored MerchantWallet public merchantWallet; /// Merchant identifier hash, that associates with the acceptor bytes32 public merchantIdHash; enum WithdrawState {Null, Pending, Withdrawn} struct Withdraw { WithdrawState state; uint amount; address clientAddress; address tokenAddress; } mapping(uint => Withdraw) public withdrawals; /** * Private Payment Processor sets Monetha Gateway and Merchant Wallet. * @param _merchantId Merchant of the acceptor * @param _monethaGateway Address of MonethaGateway contract for payment processing * @param _merchantWallet Address of MerchantWallet, where merchant reputation and funds are stored */ constructor( string _merchantId, MonethaGateway _monethaGateway, MerchantWallet _merchantWallet ) public { require(bytes(_merchantId).length > 0); merchantIdHash = keccak256(abi.encodePacked(_merchantId)); setMonethaGateway(_monethaGateway); setMerchantWallet(_merchantWallet); } /** * payForOrder is used by order wallet/client to pay for the order * @param _orderId Identifier of the order * @param _originAddress buyer address * @param _monethaFee is fee collected by Monetha */ function payForOrder( uint _orderId, address _originAddress, uint _monethaFee, uint _vouchersApply ) external payable whenNotPaused { require(_orderId > 0); require(_originAddress != 0x0); require(msg.value > 0); address fundAddress; fundAddress = merchantWallet.merchantFundAddress(); uint discountWei = 0; if (fundAddress != address(0)) { discountWei = monethaGateway.acceptPayment.value(msg.value)( fundAddress, _monethaFee, _originAddress, _vouchersApply, PAYBACK_PERMILLE); } else { discountWei = monethaGateway.acceptPayment.value(msg.value)( merchantWallet, _monethaFee, _originAddress, _vouchersApply, PAYBACK_PERMILLE); } // log payment event emit OrderPaidInEther(_orderId, _originAddress, msg.value, _monethaFee, discountWei); } /** * payForOrderInTokens is used by order wallet/client to pay for the order * This call requires that token's approve method has been called prior to this. * @param _orderId Identifier of the order * @param _originAddress buyer address * @param _monethaFee is fee collected by Monetha * @param _tokenAddress is tokens address * @param _orderValue is order amount */ function payForOrderInTokens( uint _orderId, address _originAddress, uint _monethaFee, address _tokenAddress, uint _orderValue ) external whenNotPaused { require(_orderId > 0); require(_originAddress != 0x0); require(_orderValue > 0); require(_tokenAddress != address(0)); address fundAddress; fundAddress = merchantWallet.merchantFundAddress(); GenericERC20(_tokenAddress).transferFrom(msg.sender, address(this), _orderValue); GenericERC20(_tokenAddress).transfer(address(monethaGateway), _orderValue); if (fundAddress != address(0)) { monethaGateway.acceptTokenPayment(fundAddress, _monethaFee, _tokenAddress, _orderValue); } else { monethaGateway.acceptTokenPayment(merchantWallet, _monethaFee, _tokenAddress, _orderValue); } // log payment event emit OrderPaidInToken(_orderId, _originAddress, _tokenAddress, _orderValue, _monethaFee); } /** * refundPayment used in case order cannot be processed and funds need to be returned * This function initiate process of funds refunding to the client. * @param _orderId Identifier of the order * @param _clientAddress is an address of client * @param _refundReason Order refund reason */ function refundPayment( uint _orderId, address _clientAddress, string _refundReason ) external payable onlyMonetha whenNotPaused { require(_orderId > 0); require(_clientAddress != 0x0); require(msg.value > 0); require(WithdrawState.Null == withdrawals[_orderId].state); // create withdraw withdrawals[_orderId] = Withdraw({ state : WithdrawState.Pending, amount : msg.value, clientAddress : _clientAddress, tokenAddress: address(0) }); // log refunding emit PaymentRefunding(_orderId, _clientAddress, msg.value, _refundReason); } /** * refundTokenPayment used in case order cannot be processed and tokens need to be returned * This call requires that token's approve method has been called prior to this. * This function initiate process of refunding tokens to the client. * @param _orderId Identifier of the order * @param _clientAddress is an address of client * @param _refundReason Order refund reason * @param _tokenAddress is tokens address * @param _orderValue is order amount */ function refundTokenPayment( uint _orderId, address _clientAddress, string _refundReason, uint _orderValue, address _tokenAddress ) external onlyMonetha whenNotPaused { require(_orderId > 0); require(_clientAddress != 0x0); require(_orderValue > 0); require(_tokenAddress != address(0)); require(WithdrawState.Null == withdrawals[_orderId].state); GenericERC20(_tokenAddress).transferFrom(msg.sender, address(this), _orderValue); // create withdraw withdrawals[_orderId] = Withdraw({ state : WithdrawState.Pending, amount : _orderValue, clientAddress : _clientAddress, tokenAddress : _tokenAddress }); // log refunding emit PaymentRefunding(_orderId, _clientAddress, _orderValue, _refundReason); } /** * withdrawRefund performs fund transfer to the client's account. * @param _orderId Identifier of the order */ function withdrawRefund(uint _orderId) external whenNotPaused { Withdraw storage withdraw = withdrawals[_orderId]; require(WithdrawState.Pending == withdraw.state); require(withdraw.tokenAddress == address(0)); address clientAddress = withdraw.clientAddress; uint amount = withdraw.amount; // changing withdraw state before transfer withdraw.state = WithdrawState.Withdrawn; // transfer fund to clients account clientAddress.transfer(amount); // log withdrawn emit PaymentWithdrawn(_orderId, clientAddress, amount); } /** * withdrawTokenRefund performs token transfer to the client's account. * @param _orderId Identifier of the order * @param _tokenAddress token address */ function withdrawTokenRefund(uint _orderId, address _tokenAddress) external whenNotPaused { require(_tokenAddress != address(0)); Withdraw storage withdraw = withdrawals[_orderId]; require(WithdrawState.Pending == withdraw.state); require(withdraw.tokenAddress == _tokenAddress); address clientAddress = withdraw.clientAddress; uint amount = withdraw.amount; // changing withdraw state before transfer withdraw.state = WithdrawState.Withdrawn; // transfer fund to clients account GenericERC20(_tokenAddress).transfer(clientAddress, amount); // log withdrawn emit PaymentWithdrawn(_orderId, clientAddress, amount); } /** * setMonethaGateway allows owner to change address of MonethaGateway. * @param _newGateway Address of new MonethaGateway contract */ function setMonethaGateway(MonethaGateway _newGateway) public onlyOwner { require(address(_newGateway) != 0x0); monethaGateway = _newGateway; } /** * setMerchantWallet allows owner to change address of MerchantWallet. * @param _newWallet Address of new MerchantWallet contract */ function setMerchantWallet(MerchantWallet _newWallet) public onlyOwner { require(address(_newWallet) != 0x0); require(_newWallet.merchantIdHash() == merchantIdHash); merchantWallet = _newWallet; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[{"name":"_orderId","type":"uint256"},{"name":"_originAddress","type":"address"},{"name":"_monethaFee","type":"uint256"},{"name":"_vouchersApply","type":"uint256"}],"name":"payForOrder","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isMonethaAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_orderId","type":"uint256"},{"name":"_clientAddress","type":"address"},{"name":"_refundReason","type":"string"}],"name":"refundPayment","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"contactInformation","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"PAYBACK_PERMILLE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"withdrawals","outputs":[{"name":"state","type":"uint8"},{"name":"amount","type":"uint256"},{"name":"clientAddress","type":"address"},{"name":"tokenAddress","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"monethaGateway","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_orderId","type":"uint256"},{"name":"_clientAddress","type":"address"},{"name":"_refundReason","type":"string"},{"name":"_orderValue","type":"uint256"},{"name":"_tokenAddress","type":"address"}],"name":"refundTokenPayment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_orderId","type":"uint256"}],"name":"withdrawRefund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_orderId","type":"uint256"},{"name":"_originAddress","type":"address"},{"name":"_monethaFee","type":"uint256"},{"name":"_tokenAddress","type":"address"},{"name":"_orderValue","type":"uint256"}],"name":"payForOrderInTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newGateway","type":"address"}],"name":"setMonethaGateway","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_info","type":"string"}],"name":"setContactInformation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"merchantWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_isMonethaAddress","type":"bool"}],"name":"setMonethaAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_orderId","type":"uint256"},{"name":"_tokenAddress","type":"address"}],"name":"withdrawTokenRefund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newWallet","type":"address"}],"name":"setMerchantWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"merchantIdHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"}],"name":"destroyAndSend","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_merchantId","type":"string"},{"name":"_monethaGateway","type":"address"},{"name":"_merchantWallet","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_orderId","type":"uint256"},{"indexed":true,"name":"_originAddress","type":"address"},{"indexed":false,"name":"_price","type":"uint256"},{"indexed":false,"name":"_monethaFee","type":"uint256"},{"indexed":false,"name":"_discount","type":"uint256"}],"name":"OrderPaidInEther","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_orderId","type":"uint256"},{"indexed":true,"name":"_originAddress","type":"address"},{"indexed":true,"name":"_tokenAddress","type":"address"},{"indexed":false,"name":"_price","type":"uint256"},{"indexed":false,"name":"_monethaFee","type":"uint256"}],"name":"OrderPaidInToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_merchantAddress","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"},{"indexed":false,"name":"_fee","type":"uint256"}],"name":"PaymentsProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_orderId","type":"uint256"},{"indexed":true,"name":"_clientAddress","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"},{"indexed":false,"name":"_refundReason","type":"string"}],"name":"PaymentRefunding","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_orderId","type":"uint256"},{"indexed":true,"name":"_clientAddress","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"PaymentWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"},{"indexed":false,"name":"_isMonethaAddress","type":"bool"}],"name":"MonethaAddressSet","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","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"}]
Deployed Bytecode
0x6080604052600436106101485763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631ee37896811461014d57806331d413251461016c57806331d4fad4146101a157806336f7ab5e146101c55780633f4ba83a1461024f5780634baf43e4146102645780635c975abb1461028b5780635cc07076146102a05780636137412c146102fd578063715018a61461032e57806383197ef0146103435780638456cb59146103585780638da5cb5b1461036d5780639600f294146103825780639d153495146103be5780639da30467146103d6578063b440bf3914610407578063b967a52e14610428578063bc85e06414610481578063c07e339114610496578063cee749bc146104bc578063ddda66db146104e0578063f0daba0114610501578063f2fde38b14610516578063f5074f4114610537575b600080fd5b61016a600435600160a060020a0360243516604435606435610558565b005b34801561017857600080fd5b5061018d600160a060020a0360043516610808565b604080519115158252519081900360200190f35b61016a600480359060248035600160a060020a03169160443591820191013561081d565b3480156101d157600080fd5b506101da6109c0565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102145781810151838201526020016101fc565b50505050905090810190601f1680156102415780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025b57600080fd5b5061016a610a4d565b34801561027057600080fd5b50610279610ac3565b60408051918252519081900360200190f35b34801561029757600080fd5b5061018d610ac8565b3480156102ac57600080fd5b506102b8600435610ad8565b604051808560028111156102c857fe5b60ff168152602081019490945250600160a060020a039182166040808501919091529116606083015251908190036080019150f35b34801561030957600080fd5b50610312610b10565b60408051600160a060020a039092168252519081900360200190f35b34801561033a57600080fd5b5061016a610b1f565b34801561034f57600080fd5b5061016a610b8b565b34801561036457600080fd5b5061016a610bb0565b34801561037957600080fd5b50610312610c2b565b34801561038e57600080fd5b5061016a6004803590600160a060020a036024803582169260443591820192910135906064359060843516610c3a565b3480156103ca57600080fd5b5061016a600435610e8c565b3480156103e257600080fd5b5061016a600435600160a060020a036024358116906044359060643516608435610f86565b34801561041357600080fd5b5061016a600160a060020a036004351661132e565b34801561043457600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261016a9436949293602493928401919081908401838280828437509497506113899650505050505050565b34801561048d57600080fd5b506103126113b7565b3480156104a257600080fd5b5061016a600160a060020a036004351660243515156113c6565b3480156104c857600080fd5b5061016a600435600160a060020a0360243516611441565b3480156104ec57600080fd5b5061016a600160a060020a03600435166115a1565b34801561050d57600080fd5b50610279611690565b34801561052257600080fd5b5061016a600160a060020a0360043516611696565b34801561054357600080fd5b5061016a600160a060020a03600435166116b9565b60008054819060a060020a900460ff161561057257600080fd5b6000861161057f57600080fd5b600160a060020a038516151561059457600080fd5b600034116105a157600080fd5b60048054604080517f969596d60000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169263969596d69282820192602092908290030181600087803b1580156105fe57600080fd5b505af1158015610612573d6000803e3d6000fd5b505050506040513d602081101561062857600080fd5b5051915060009050600160a060020a038216156106fa57600354604080517fd21c39a1000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015260248201889052888116604483015260648201879052600260848301529151919092169163d21c39a191349160a48082019260209290919082900301818588803b1580156106c657600080fd5b505af11580156106da573d6000803e3d6000fd5b50505050506040513d60208110156106f157600080fd5b505190506107b3565b60035460048054604080517fd21c39a1000000000000000000000000000000000000000000000000000000008152600160a060020a039283169381019390935260248301889052888216604484015260648301879052600260848401525192169163d21c39a191349160a480830192602092919082900301818588803b15801561078357600080fd5b505af1158015610797573d6000803e3d6000fd5b50505050506040513d60208110156107ae57600080fd5b505190505b60408051348152602081018690528082018390529051600160a060020a0387169188917ffb3b61c9f30df0c105c673af85f07796032c77c3bf21f256bce83ba0853f630f9181900360600190a3505050505050565b60026020526000908152604090205460ff1681565b3360009081526002602052604090205460ff16151561083b57600080fd5b60005460a060020a900460ff161561085257600080fd5b6000841161085f57600080fd5b600160a060020a038316151561087457600080fd5b6000341161088157600080fd5b60008481526006602052604090205460ff16600281111561089e57fe5b156108a857600080fd5b6040805160808101909152806001815234602080830191909152600160a060020a038616604080840191909152600060609093018390528783526006909152902081518154829060ff1916600183600281111561090157fe5b0217905550602082810151600183015560408084015160028401805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a039384161790915560609586015160039095018054909116948216949094179093558051348082529281018281529181018690529287169388937f26e77179a69c2db5e1f39af4e228bc8c2205384ba14b8c1e3339049db4ee42c5939288928892919082018484808284376040519201829003965090945050505050a350505050565b60018054604080516020600284861615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610a455780601f10610a1a57610100808354040283529160200191610a45565b820191906000526020600020905b815481529060010190602001808311610a2857829003601f168201915b505050505081565b600054600160a060020a03163314610a6457600080fd5b60005460a060020a900460ff161515610a7c57600080fd5b6000805474ff0000000000000000000000000000000000000000191681556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b339190a1565b600281565b60005460a060020a900460ff1681565b600660205260009081526040902080546001820154600283015460039093015460ff909216929091600160a060020a03918216911684565b600354600160a060020a031681565b600054600160a060020a03163314610b3657600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600054600160a060020a03163314610ba257600080fd5b600054600160a060020a0316ff5b600054600160a060020a03163314610bc757600080fd5b60005460a060020a900460ff1615610bde57600080fd5b6000805474ff0000000000000000000000000000000000000000191660a060020a1781556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff6259190a1565b600054600160a060020a031681565b3360009081526002602052604090205460ff161515610c5857600080fd5b60005460a060020a900460ff1615610c6f57600080fd5b60008611610c7c57600080fd5b600160a060020a0385161515610c9157600080fd5b60008211610c9e57600080fd5b600160a060020a0381161515610cb357600080fd5b60008681526006602052604090205460ff166002811115610cd057fe5b15610cda57600080fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490529051600160a060020a038316916323b872dd9160648083019260209291908290030181600087803b158015610d4857600080fd5b505af1158015610d5c573d6000803e3d6000fd5b505050506040513d6020811015610d7257600080fd5b50506040805160808101825260018082526020808301869052600160a060020a03898116848601528516606084015260008a815260069091529290922081518154929391929091839160ff191690836002811115610dcc57fe5b0217905550602082810151600183015560408084015160028401805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a0393841617909155606095860151600390950180549091169482169490941790935580518681529182018181529082018790529188169289927f26e77179a69c2db5e1f39af4e228bc8c2205384ba14b8c1e3339049db4ee42c59287928a928a929182018484808284376040519201829003965090945050505050a3505050505050565b600080548190819060a060020a900460ff1615610ea857600080fd5b6000848152600660205260409020805490935060ff166002811115610ec957fe5b600114610ed557600080fd5b6003830154600160a060020a031615610eed57600080fd5b50506002818101546001830154835460ff19169092178355604051600160a060020a03909116919082906108fc8315029083906000818181858888f19350505050158015610f3f573d6000803e3d6000fd5b50604080518281529051600160a060020a0384169186917fbe85bf3b0a1e335a22c461f84cf759dfe589ec1539caf4dce60f999d72dd8e239181900360200190a350505050565b6000805460a060020a900460ff1615610f9e57600080fd5b60008611610fab57600080fd5b600160a060020a0385161515610fc057600080fd5b60008211610fcd57600080fd5b600160a060020a0383161515610fe257600080fd5b60048054604080517f969596d60000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169263969596d69282820192602092908290030181600087803b15801561103f57600080fd5b505af1158015611053573d6000803e3d6000fd5b505050506040513d602081101561106957600080fd5b5051604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018590529051919250600160a060020a038516916323b872dd916064808201926020929091908290030181600087803b1580156110dd57600080fd5b505af11580156110f1573d6000803e3d6000fd5b505050506040513d602081101561110757600080fd5b5050600354604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201526024810185905290519185169163a9059cbb9160448082019260009290919082900301818387803b15801561117757600080fd5b505af115801561118b573d6000803e3d6000fd5b50505050600160a060020a0381161561123857600354604080517fcc4fbc43000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152602482018890528681166044830152606482018690529151919092169163cc4fbc4391608480830192600092919082900301818387803b15801561121b57600080fd5b505af115801561122f573d6000803e3d6000fd5b505050506112d2565b60035460048054604080517fcc4fbc43000000000000000000000000000000000000000000000000000000008152600160a060020a0392831693810193909352602483018890528682166044840152606483018690525192169163cc4fbc439160848082019260009290919082900301818387803b1580156112b957600080fd5b505af11580156112cd573d6000803e3d6000fd5b505050505b82600160a060020a031685600160a060020a0316877fd6dc98331ad06baebe39c90f4fd554341ad121d55e4384bd046def391501a00f8588604051808381526020018281526020019250505060405180910390a4505050505050565b600054600160a060020a0316331461134557600080fd5b600160a060020a038116151561135a57600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a031633146113a057600080fd5b80516113b3906001906020840190611759565b5050565b600454600160a060020a031681565b600054600160a060020a031633146113dd57600080fd5b600160a060020a038216600081815260026020908152604091829020805460ff191685151590811790915582519384529083015280517fa551de8741dbb2092ce6bc142fd0ff3af5dfbf87d0aa594619fccddb0141e6929281900390910190a15050565b600080548190819060a060020a900460ff161561145d57600080fd5b600160a060020a038416151561147257600080fd5b6000858152600660205260409020805490935060ff16600281111561149357fe5b60011461149f57600080fd5b6003830154600160a060020a038581169116146114bb57600080fd5b50506002818101546001830154835460ff19169092178355604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820181905260248201859052915191939286169163a9059cbb9160448082019260009290919082900301818387803b15801561154257600080fd5b505af1158015611556573d6000803e3d6000fd5b5050604080518481529051600160a060020a03861693508892507fbe85bf3b0a1e335a22c461f84cf759dfe589ec1539caf4dce60f999d72dd8e239181900360200190a35050505050565b600054600160a060020a031633146115b857600080fd5b600160a060020a03811615156115cd57600080fd5b6005546000191681600160a060020a031663f0daba016040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561162b57600080fd5b505af115801561163f573d6000803e3d6000fd5b505050506040513d602081101561165557600080fd5b50511461166157600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60055481565b600054600160a060020a031633146116ad57600080fd5b6116b6816116dc565b50565b600054600160a060020a031633146116d057600080fd5b80600160a060020a0316ff5b600160a060020a03811615156116f157600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061179a57805160ff19168380011785556117c7565b828001600101855582156117c7579182015b828111156117c75782518255916020019190600101906117ac565b506117d39291506117d7565b5090565b6117f191905b808211156117d357600081556001016117dd565b905600a165627a7a72305820b5debb2623b86cd4f7ffd25775500238675501750ea0fe8648caeb063ff4d1ba0029
Swarm Source
bzzr://b5debb2623b86cd4f7ffd25775500238675501750ea0fe8648caeb063ff4d1ba
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.