More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,455 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint Tokens By P... | 21216721 | 4 hrs ago | IN | 0 ETH | 0.00296763 | ||||
Mint Tokens By P... | 21207488 | 35 hrs ago | IN | 0 ETH | 0.00170134 | ||||
Mint Tokens By P... | 21202739 | 2 days ago | IN | 0 ETH | 0.00180977 | ||||
Mint Tokens By P... | 21202076 | 2 days ago | IN | 0 ETH | 0.00217941 | ||||
Mint Tokens By P... | 21193535 | 3 days ago | IN | 0 ETH | 0.00435735 | ||||
Mint Tokens By P... | 21192933 | 3 days ago | IN | 0 ETH | 0.00210403 | ||||
Mint Tokens By P... | 21192501 | 3 days ago | IN | 0 ETH | 0.00222954 | ||||
Mint Tokens By P... | 21183432 | 4 days ago | IN | 0 ETH | 0.0046572 | ||||
Mint Tokens By P... | 21176755 | 5 days ago | IN | 0 ETH | 0.00326137 | ||||
Mint Tokens By P... | 21170264 | 6 days ago | IN | 0 ETH | 0.00370124 | ||||
Mint Tokens By P... | 21164297 | 7 days ago | IN | 0 ETH | 0.00253333 | ||||
Mint Tokens By P... | 21160899 | 7 days ago | IN | 0 ETH | 0.00224954 | ||||
Mint Tokens By P... | 21160681 | 8 days ago | IN | 0 ETH | 0.00226512 | ||||
Mint Tokens By P... | 21160524 | 8 days ago | IN | 0 ETH | 0.00209524 | ||||
Mint Tokens By P... | 21160245 | 8 days ago | IN | 0 ETH | 0.00268734 | ||||
Mint Tokens By P... | 21157785 | 8 days ago | IN | 0 ETH | 0.0021808 | ||||
Mint Tokens By P... | 21157772 | 8 days ago | IN | 0 ETH | 0.00213629 | ||||
Mint Tokens By P... | 21157764 | 8 days ago | IN | 0 ETH | 0.00219142 | ||||
Mint Tokens By P... | 21157740 | 8 days ago | IN | 0 ETH | 0.00204037 | ||||
Mint Tokens By P... | 21157663 | 8 days ago | IN | 0 ETH | 0.00201643 | ||||
Mint Tokens By P... | 21156671 | 8 days ago | IN | 0 ETH | 0.00187409 | ||||
Mint Tokens By P... | 21155114 | 8 days ago | IN | 0 ETH | 0.00221441 | ||||
Mint Tokens By P... | 21153371 | 9 days ago | IN | 0 ETH | 0.00181614 | ||||
Mint Tokens By P... | 21153179 | 9 days ago | IN | 0 ETH | 0.00184113 | ||||
Mint Tokens By P... | 21150965 | 9 days ago | IN | 0 ETH | 0.00180914 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
11294630 | 1459 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
OwnedUpgradeabilityProxy
Compiler Version
v0.5.9+commit.c68bc34e
Contract Source Code (Solidity Multiple files format)
pragma solidity ^0.5.8; import './UpgradeabilityProxy.sol'; /** * @title OwnedUpgradeabilityProxy * @dev This contract combines an upgradeability proxy with basic authorization control functionalities */ contract OwnedUpgradeabilityProxy is UpgradeabilityProxy { /** * @dev Event to show ownership has been transferred * @param previousOwner representing the address of the previous owner * @param newOwner representing the address of the new owner */ event ProxyOwnershipTransferred(address previousOwner, address newOwner); // Storage position of the owner of the contract bytes32 private constant proxyOwnerPosition = keccak256("com.d3ledger.proxy.owner"); /** * @dev the constructor sets the original owner of the contract to the sender account. */ constructor() public { setUpgradeabilityOwner(msg.sender); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyProxyOwner() { require(msg.sender == proxyOwner()); _; } /** * @dev Tells the address of the owner * @return the address of the owner */ function proxyOwner() public view returns (address owner) { bytes32 position = proxyOwnerPosition; assembly { owner := sload(position) } } /** * @dev Sets the address of the owner */ function setUpgradeabilityOwner(address newProxyOwner) internal { bytes32 position = proxyOwnerPosition; assembly { sstore(position, newProxyOwner) } } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferProxyOwnership(address newOwner) public onlyProxyOwner { require(newOwner != address(0)); emit ProxyOwnershipTransferred(proxyOwner(), newOwner); setUpgradeabilityOwner(newOwner); } /** * @dev Allows the proxy owner to upgrade the current version of the proxy. * @param implementation representing the address of the new implementation to be set. */ function upgradeTo(address implementation) public onlyProxyOwner { _upgradeTo(implementation); } /** * @dev Allows the proxy owner to upgrade the current version of the proxy and call the new implementation * to initialize whatever is needed through a low level call. * @param implementation representing the address of the new implementation to be set. * @param data represents the msg.data to bet sent in the low level call. This parameter may include the function * signature of the implementation to be called with the needed payload */ function upgradeToAndCall(address implementation, bytes memory data) payable public onlyProxyOwner { upgradeTo(implementation); (bool success,) = address(this).call.value(msg.value)(data); require(success); } }
//! The basic-coin ECR20-compliant token contract. //! //! Copyright 2016 Gavin Wood, Parity Technologies Ltd. //! //! Licensed under the Apache License, Version 2.0 (the "License"); //! you may not use this file except in compliance with the License. //! You may obtain a copy of the License at //! //! http://www.apache.org/licenses/LICENSE-2.0 //! //! Unless required by applicable law or agreed to in writing, software //! distributed under the License is distributed on an "AS IS" BASIS, //! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //! See the License for the specific language governing permissions and //! limitations under the License. pragma solidity ^0.5.8; contract Owned { modifier only_owner { require(msg.sender == owner); _; } event NewOwner(address indexed old, address indexed current); function setOwner(address _new) only_owner public { emit NewOwner(owner, _new); owner = _new; } address public owner = msg.sender; } interface Token { event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); function balanceOf(address _owner) view external returns (uint256 balance); function transfer(address _to, uint256 _value) external returns (bool success); function transferFrom(address _from, address _to, uint256 _value) external returns (bool success); function approve(address _spender, uint256 _value) external returns (bool success); function allowance(address _owner, address _spender) view external returns (uint256 remaining); } // TokenReg interface contract TokenReg { function register(address _addr, string memory _tla, uint _base, string memory _name) public payable returns (bool); function registerAs(address _addr, string memory _tla, uint _base, string memory _name, address _owner) public payable returns (bool); function unregister(uint _id) public; function setFee(uint _fee) public; function tokenCount() public view returns (uint); function token(uint _id) public view returns (address addr, string memory tla, uint base, string memory name, address owner); function fromAddress(address _addr) public view returns (uint id, string memory tla, uint base, string memory name, address owner); function fromTLA(string memory _tla) public view returns (uint id, address addr, uint base, string memory name, address owner); function meta(uint _id, bytes32 _key) public view returns (bytes32); function setMeta(uint _id, bytes32 _key, bytes32 _value) public; function drain() public; uint public fee; } // BasicCoin, ECR20 tokens that all belong to the owner for sending around contract BasicCoin is Owned, Token { // this is as basic as can be, only the associated balance & allowances struct Account { uint balance; mapping (address => uint) allowanceOf; } // the balance should be available modifier when_owns(address _owner, uint _amount) { if (accounts[_owner].balance < _amount) revert(); _; } // an allowance should be available modifier when_has_allowance(address _owner, address _spender, uint _amount) { if (accounts[_owner].allowanceOf[_spender] < _amount) revert(); _; } // a value should be > 0 modifier when_non_zero(uint _value) { if (_value == 0) revert(); _; } bool public called = false; // the base, tokens denoted in micros uint constant public base = 1000000; // available token supply uint public totalSupply; // storage and mapping of all balances & allowances mapping (address => Account) accounts; // constructor sets the parameters of execution, _totalSupply is all units constructor(uint _totalSupply, address _owner) public when_non_zero(_totalSupply) { totalSupply = _totalSupply; owner = _owner; accounts[_owner].balance = totalSupply; } // balance of a specific address function balanceOf(address _who) public view returns (uint256) { return accounts[_who].balance; } // transfer function transfer(address _to, uint256 _value) public when_owns(msg.sender, _value) returns (bool) { emit Transfer(msg.sender, _to, _value); accounts[msg.sender].balance -= _value; accounts[_to].balance += _value; return true; } // transfer via allowance function transferFrom(address _from, address _to, uint256 _value) public when_owns(_from, _value) when_has_allowance(_from, msg.sender, _value) returns (bool) { called = true; emit Transfer(_from, _to, _value); accounts[_from].allowanceOf[msg.sender] -= _value; accounts[_from].balance -= _value; accounts[_to].balance += _value; return true; } // approve allowances function approve(address _spender, uint256 _value) public returns (bool) { emit Approval(msg.sender, _spender, _value); accounts[msg.sender].allowanceOf[_spender] += _value; return true; } // available allowance function allowance(address _owner, address _spender) public view returns (uint256) { return accounts[_owner].allowanceOf[_spender]; } // no default function, simple contract only, entry-level users function() external { revert(); } } // Manages BasicCoin instances, including the deployment & registration contract BasicCoinManager is Owned { // a structure wrapping a deployed BasicCoin struct Coin { address coin; address owner; address tokenreg; } // a new BasicCoin has been deployed event Created(address indexed owner, address indexed tokenreg, address indexed coin); // a list of all the deployed BasicCoins Coin[] coins; // all BasicCoins for a specific owner mapping (address => uint[]) ownedCoins; // the base, tokens denoted in micros (matches up with BasicCoin interface above) uint constant public base = 1000000; // return the number of deployed function count() public view returns (uint) { return coins.length; } // get a specific deployment function get(uint _index) public view returns (address coin, address owner, address tokenreg) { Coin memory c = coins[_index]; coin = c.coin; owner = c.owner; tokenreg = c.tokenreg; } // returns the number of coins for a specific owner function countByOwner(address _owner) public view returns (uint) { return ownedCoins[_owner].length; } // returns a specific index by owner function getByOwner(address _owner, uint _index) public view returns (address coin, address owner, address tokenreg) { return get(ownedCoins[_owner][_index]); } // deploy a new BasicCoin on the blockchain function deploy(uint _totalSupply, string memory _tla, string memory _name, address _tokenreg) public payable returns (bool) { TokenReg tokenreg = TokenReg(_tokenreg); BasicCoin coin = new BasicCoin(_totalSupply, msg.sender); uint ownerCount = countByOwner(msg.sender); uint fee = tokenreg.fee(); ownedCoins[msg.sender].length = ownerCount + 1; ownedCoins[msg.sender][ownerCount] = coins.length; coins.push(Coin(address(coin), msg.sender, address(tokenreg))); tokenreg.registerAs.value(fee)(address(coin), _tla, base, _name, msg.sender); emit Created(msg.sender, address(tokenreg), address(coin)); return true; } // owner can withdraw all collected funds function drain() public only_owner { if (!msg.sender.send(address(this).balance)) { revert(); } } }
pragma solidity ^0.5.8; import "./IERC20.sol"; import "./SafeMath.sol"; /** * @title Standard ERC20 token * * @dev Implementation of the basic standard token. * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md * Originally based on code by FirstBlood: * https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol * * This implementation emits additional Approval events, allowing applications to reconstruct the allowance status for * all accounts just by listening to said events. Note that this isn't required by the specification, and other * compliant implementations may not do it. */ contract ERC20 is IERC20 { using SafeMath for uint256; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowed; uint256 private _totalSupply; /** * @dev Total number of tokens in existence */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev Gets the balance of the specified address. * @param owner The address to query 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]; } /** * @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 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) { _transfer(msg.sender, 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) { _approve(msg.sender, spender, value); return true; } /** * @dev Transfer tokens from one address to another. * Note that while this function emits an Approval event, this is not required as per the specification, * and other compliant implementations may not emit the event. * @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) { _transfer(from, to, value); _approve(from, msg.sender, _allowed[from][msg.sender].sub(value)); return true; } /** * @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 * Emits an Approval event. * @param spender The address which will spend the funds. * @param addedValue The amount of tokens to increase the allowance by. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(msg.sender, spender, _allowed[msg.sender][spender].add(addedValue)); 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 * Emits an Approval event. * @param spender The address which will spend the funds. * @param subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve(msg.sender, spender, _allowed[msg.sender][spender].sub(subtractedValue)); return true; } /** * @dev Transfer token for a specified addresses * @param from The address to transfer from. * @param to The address to transfer to. * @param value The amount to be transferred. */ function _transfer(address from, address to, uint256 value) internal { require(to != address(0)); _balances[from] = _balances[from].sub(value); _balances[to] = _balances[to].add(value); emit Transfer(from, to, value); } /** * @dev Internal function that mints an amount of the token and assigns it to * an account. This encapsulates the modification of balances such that the * proper events are emitted. * @param account The account that will receive the created tokens. * @param value The amount that will be created. */ function _mint(address account, uint256 value) internal { require(account != address(0)); _totalSupply = _totalSupply.add(value); _balances[account] = _balances[account].add(value); emit Transfer(address(0), account, value); } /** * @dev Internal function that burns an amount of the token of a given * account. * @param account The account whose tokens will be burnt. * @param value The amount that will be burnt. */ function _burn(address account, uint256 value) internal { require(account != address(0)); _totalSupply = _totalSupply.sub(value); _balances[account] = _balances[account].sub(value); emit Transfer(account, address(0), value); } /** * @dev Approve an address to spend another addresses' tokens. * @param owner The address that owns the tokens. * @param spender The address that will spend the tokens. * @param value The number of tokens that can be spent. */ function _approve(address owner, address spender, uint256 value) internal { require(spender != address(0)); require(owner != address(0)); _allowed[owner][spender] = value; emit Approval(owner, spender, value); } /** * @dev Internal function that burns an amount of the token of a given * account, deducting from the sender's allowance for said account. Uses the * internal burn function. * Emits an Approval event (reflecting the reduced allowance). * @param account The account whose tokens will be burnt. * @param value The amount that will be burnt. */ function _burnFrom(address account, uint256 value) internal { _burn(account, value); _approve(account, msg.sender, _allowed[account][msg.sender].sub(value)); } }
pragma solidity ^0.5.8; import "./ERC20.sol"; /** * @title Burnable Token * @dev Token that can be irreversibly burned (destroyed). */ contract ERC20Burnable is ERC20 { /** * @dev Burns a specific amount of tokens. * @param value The amount of token to be burned. */ function burn(uint256 value) public { _burn(msg.sender, value); } /** * @dev Burns a specific amount of tokens from the target address and decrements allowance * @param from address The address which you want to send tokens from * @param value uint256 The amount of token to be burned */ function burnFrom(address from, uint256 value) public { _burnFrom(from, value); } }
pragma solidity ^0.5.8; import "./IERC20.sol"; /** * @title ERC20Detailed token * @dev The decimals are only for visualization purposes. * All the operations are done using the smallest and indivisible token unit, * just as on Ethereum all the operations are done in wei. */ contract ERC20Detailed is IERC20 { string private _name; string private _symbol; uint8 private _decimals; constructor (string memory name, string memory symbol, uint8 decimals) public { _name = name; _symbol = symbol; _decimals = decimals; } /** * @return the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @return the symbol of the token. */ function symbol() public view returns (string memory) { return _symbol; } /** * @return the number of decimals of the token. */ function decimals() public view returns (uint8) { return _decimals; } }
pragma solidity ^0.5.8; /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ interface IERC20 { function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); }
pragma solidity ^0.5.8; /** * Subset of master contract interface */ contract IMaster { function withdraw( address tokenAddress, uint256 amount, address to, bytes32 txHash, uint8[] memory v, bytes32[] memory r, bytes32[] memory s, address from ) public; function mintTokensByPeers( address tokenAddress, uint256 amount, address beneficiary, bytes32 txHash, uint8[] memory v, bytes32[] memory r, bytes32[] memory s, address from ) public; function checkTokenAddress(address token) public view returns (bool); }
pragma solidity ^0.5.8; import "./IERC20.sol"; import "./MasterToken.sol"; /** * Provides functionality of master contract */ contract Master { bool internal initialized_; bool internal enabled_; bytes32 public proof; uint256 public proofReward; address public owner_; mapping(address => bool) public isPeer; uint public peersCount; /** Iroha tx hashes used */ mapping(bytes32 => bool) public used; mapping(address => bool) public uniqueAddresses; MasterToken public tokenInstance; mapping(address => bool) public isToken; event Withdrawal(bytes32 txHash); event EnableContract(address provider, bytes32 proof); /** * Constructor. Sets contract owner to contract creator. */ constructor(address[] memory initialPeers, string memory name, string memory symbol, uint8 decimals, address beneficiary, uint256 supply, uint256 reward) public { initialize(msg.sender, initialPeers, name, symbol, decimals, beneficiary, supply, reward); } /** * Initialization of smart contract. */ function initialize(address owner, address[] memory initialPeers, string memory name, string memory symbol, uint8 decimals, address beneficiary, uint256 supply, uint256 reward) public { require(!initialized_); owner_ = owner; for (uint8 i = 0; i < initialPeers.length; i++) { addPeer(initialPeers[i]); } // 0 means ether which is definitely in whitelist isToken[address(0)] = true; // Create new instance of the token tokenInstance = new MasterToken(name, symbol, decimals, beneficiary, supply); isToken[address(tokenInstance)] = true; proofReward = reward; initialized_ = true; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner()); _; } /** * @dev Throws if called when the contract is disabled. */ modifier enabled() { require(enabled_); _; } /** * @return true if `msg.sender` is the owner of the contract. */ function isOwner() public view returns (bool) { return msg.sender == owner_; } /** * A special function-like stub to allow ether accepting */ function() external payable { require(msg.data.length == 0); } function submitProof( bytes32 proofArg, uint8[] memory v, bytes32[] memory r, bytes32[] memory s ) public { require(!enabled_, "Proof has been submitted already"); require(checkSignatures( keccak256(abi.encodePacked(proofArg)), v, r, s) ); tokenInstance.mintTokens(msg.sender, proofReward); proof = proofArg; enabled_ = true; emit EnableContract(msg.sender, proofArg); } /** * Adds new peer to list of signature verifiers. Can be called only by contract owner. * @param newAddress address of new peer */ function addPeer(address newAddress) private returns (uint) { require(isPeer[newAddress] == false); isPeer[newAddress] = true; ++peersCount; return peersCount; } function removePeer(address peerAddress) private { require(isPeer[peerAddress] == true); isPeer[peerAddress] = false; --peersCount; } function addPeerByPeer( address newPeerAddress, bytes32 txHash, uint8[] memory v, bytes32[] memory r, bytes32[] memory s ) public returns (bool) { require(used[txHash] == false); require(checkSignatures(keccak256(abi.encodePacked(newPeerAddress, txHash)), v, r, s) ); addPeer(newPeerAddress); used[txHash] = true; return true; } function removePeerByPeer( address peerAddress, bytes32 txHash, uint8[] memory v, bytes32[] memory r, bytes32[] memory s ) public returns (bool) { require(used[txHash] == false); require(checkSignatures( keccak256(abi.encodePacked(peerAddress, txHash)), v, r, s) ); removePeer(peerAddress); used[txHash] = true; return true; } /** * Adds new token to whitelist. Token should not been already added. * @param newToken token to add */ function addToken(address newToken) public onlyOwner { require(isToken[newToken] == false); isToken[newToken] = true; } /** * Checks is given token inside a whitelist or not * @param tokenAddress address of token to check * @return true if token inside whitelist or false otherwise */ function checkTokenAddress(address tokenAddress) public view returns (bool) { return isToken[tokenAddress]; } /** * Withdraws specified amount of ether or one of ERC-20 tokens to provided address * @param tokenAddress address of token to withdraw (0 for ether) * @param amount amount of tokens or ether to withdraw * @param to target account address * @param txHash hash of transaction from Iroha * @param v array of signatures of tx_hash (v-component) * @param r array of signatures of tx_hash (r-component) * @param s array of signatures of tx_hash (s-component) * @param from relay contract address */ function withdraw( address tokenAddress, uint256 amount, address payable to, bytes32 txHash, uint8[] memory v, bytes32[] memory r, bytes32[] memory s, address from ) public enabled { require(checkTokenAddress(tokenAddress)); require(used[txHash] == false); require(checkSignatures( keccak256(abi.encodePacked(tokenAddress, amount, to, txHash, from)), v, r, s) ); if (tokenAddress == address(0)) { used[txHash] = true; // untrusted transfer, relies on provided cryptographic proof to.transfer(amount); } else { IERC20 coin = IERC20(tokenAddress); used[txHash] = true; // untrusted call, relies on provided cryptographic proof coin.transfer(to, amount); } emit Withdrawal(txHash); } /** * Checks given addresses for duplicates and if they are peers signatures * @param hash unsigned data * @param v v-component of signature from hash * @param r r-component of signature from hash * @param s s-component of signature from hash * @return true if all given addresses are correct or false otherwise */ function checkSignatures(bytes32 hash, uint8[] memory v, bytes32[] memory r, bytes32[] memory s ) private returns (bool) { require(peersCount >= 1); require(v.length == r.length); require(r.length == s.length); uint needSigs = peersCount - (peersCount - 1) / 3; require(s.length >= needSigs); uint count = 0; address[] memory recoveredAddresses = new address[](s.length); for (uint i = 0; i < s.length; ++i) { address recoveredAddress = recoverAddress( hash, v[i], r[i], s[i] ); // not a peer address or not unique if (isPeer[recoveredAddress] != true || uniqueAddresses[recoveredAddress] == true) { continue; } recoveredAddresses[count] = recoveredAddress; count = count + 1; uniqueAddresses[recoveredAddress] = true; } // restore state for future usages for (uint i = 0; i < count; ++i) { uniqueAddresses[recoveredAddresses[i]] = false; } return count >= needSigs; } /** * Recovers address from a given single signature * @param hash unsigned data * @param v v-component of signature from hash * @param r r-component of signature from hash * @param s s-component of signature from hash * @return address recovered from signature */ function recoverAddress(bytes32 hash, uint8 v, bytes32 r, bytes32 s) private pure returns (address) { bytes32 simple_hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); address res = ecrecover(simple_hash, v, r, s); return res; } /** * Mint new Token * @param tokenAddress address to mint * @param amount how much to mint * @param beneficiary destination address * @param txHash hash of transaction from Iroha * @param v array of signatures of tx_hash (v-component) * @param r array of signatures of tx_hash (r-component) * @param s array of signatures of tx_hash (s-component) */ function mintTokensByPeers( address tokenAddress, uint256 amount, address beneficiary, bytes32 txHash, uint8[] memory v, bytes32[] memory r, bytes32[] memory s, address from ) public enabled { require(address(tokenInstance) == tokenAddress); require(used[txHash] == false); require(checkSignatures( keccak256(abi.encodePacked(tokenAddress, amount, beneficiary, txHash, from)), v, r, s) ); tokenInstance.mintTokens(beneficiary, amount); used[txHash] = true; emit Withdrawal(txHash); } }
pragma solidity ^0.5.8; import "./ERC20Detailed.sol"; import "./ERC20Burnable.sol"; import "./Ownable.sol"; contract MasterToken is ERC20Burnable, ERC20Detailed, Ownable { /** * @dev Constructor that gives the specified address all of existing tokens. */ constructor(string memory name, string memory symbol, uint8 decimals, address beneficiary, uint256 supply) public ERC20Detailed(name, symbol, decimals) { _mint(beneficiary, supply); } function mintTokens(address beneficiary, uint256 amount) public onlyOwner { _mint(beneficiary, amount); } }
pragma solidity ^0.5.8; /** * @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 private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @return the address of the owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner()); _; } /** * @return true if `msg.sender` is the owner of the contract. */ function isOwner() public view returns (bool) { return 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 OwnershipTransferred(_owner, address(0)); _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; } }
pragma solidity ^0.5.8; /** * @title Proxy * @dev Gives the possibility to delegate any call to a foreign implementation. */ contract Proxy { /** * @dev Tells the address of the implementation where every call will be delegated. * @return address of the implementation to which it will be delegated */ function implementation() public view returns (address); /** * @dev Fallback function allowing to perform a delegatecall to the given implementation. * This function will return whatever the implementation call returns */ function () payable external { address _impl = implementation(); require(_impl != address(0)); assembly { let ptr := mload(0x40) calldatacopy(ptr, 0, calldatasize) let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0) let size := returndatasize returndatacopy(ptr, 0, size) switch result case 0 { revert(ptr, size) } default { return(ptr, size) } } } }
pragma solidity ^0.5.8; /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring '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; } uint256 c = a * b; require(c / a == b); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0); return a % b; } }
pragma solidity ^0.5.8; import './Proxy.sol'; /** * @title UpgradeabilityProxy * @dev This contract represents a proxy where the implementation address to which it will delegate can be upgraded */ contract UpgradeabilityProxy is Proxy { /** * @dev This event will be emitted every time the implementation gets upgraded * @param implementation representing the address of the upgraded implementation */ event Upgraded(address indexed implementation); // Storage position of the address of the current implementation bytes32 private constant implementationPosition = keccak256("com.d3ledger.proxy.implementation"); /** * @dev Constructor function */ constructor() public {} /** * @dev Tells the address of the current implementation * @return address of the current implementation */ function implementation() public view returns (address impl) { bytes32 position = implementationPosition; assembly { impl := sload(position) } } /** * @dev Sets the address of the current implementation * @param newImplementation address representing the new implementation to be set */ function setImplementation(address newImplementation) internal { bytes32 position = implementationPosition; assembly { sstore(position, newImplementation) } } /** * @dev Upgrades the implementation address * @param newImplementation representing the address of the new implementation to be set */ function _upgradeTo(address newImplementation) internal { address currentImplementation = implementation(); require(currentImplementation != newImplementation); setImplementation(newImplementation); emit Upgraded(newImplementation); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"proxyOwner","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"implementation","type":"address"}],"name":"upgradeTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"implementation","type":"address"},{"name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"implementation","outputs":[{"name":"impl","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferProxyOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousOwner","type":"address"},{"indexed":false,"name":"newOwner","type":"address"}],"name":"ProxyOwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"implementation","type":"address"}],"name":"Upgraded","type":"event"}]
Contract Creation Code
608060405234801561001057600080fd5b50610023336001600160e01b0361002816565b61005d565b604080517f636f6d2e64336c65646765722e70726f78792e6f776e657200000000000000008152905190819003601801902055565b6104fc8061006c6000396000f3fe60806040526004361061004a5760003560e01c8063025313a21461008e5780633659cfe6146100bf5780634f1ef286146100f45780635c60da1b146101aa578063f1739cae146101bf575b60006100546101f2565b90506001600160a01b03811661006957600080fd5b60405136600082376000803683855af43d806000843e81801561008a578184f35b8184fd5b34801561009a57600080fd5b506100a3610215565b604080516001600160a01b039092168252519081900360200190f35b3480156100cb57600080fd5b506100f2600480360360208110156100e257600080fd5b50356001600160a01b0316610246565b005b6100f26004803603604081101561010a57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561013557600080fd5b82018360208201111561014757600080fd5b8035906020019184600183028401116401000000008311171561016957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610277945050505050565b3480156101b657600080fd5b506100a36101f2565b3480156101cb57600080fd5b506100f2600480360360208110156101e257600080fd5b50356001600160a01b031661035c565b60008060405180806104a760219139604051908190036021019020549392505050565b604080517731b7b6973219b632b233b2b917383937bc3c9737bbb732b960411b815290519081900360180190205490565b61024e610215565b6001600160a01b0316336001600160a01b03161461026b57600080fd5b610274816103e8565b50565b61027f610215565b6001600160a01b0316336001600160a01b03161461029c57600080fd5b6102a582610246565b6000306001600160a01b031634836040518082805190602001908083835b602083106102e25780518252601f1990920191602091820191016102c3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610344576040519150601f19603f3d011682016040523d82523d6000602084013e610349565b606091505b505090508061035757600080fd5b505050565b610364610215565b6001600160a01b0316336001600160a01b03161461038157600080fd5b6001600160a01b03811661039457600080fd5b7f5a3e66efaa1e445ebd894728a69d6959842ea1e97bd79b892797106e270efcd96103bd610215565b604080516001600160a01b03928316815291841660208301528051918290030190a161027481610454565b60006103f26101f2565b9050816001600160a01b0316816001600160a01b0316141561041357600080fd5b61041c82610484565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b604080517731b7b6973219b632b233b2b917383937bc3c9737bbb732b960411b8152905190819003601801902055565b600060405180806104a76021913960405190819003602101902092909255505056fe636f6d2e64336c65646765722e70726f78792e696d706c656d656e746174696f6ea265627a7a72305820fb4836e043122dcba66dc2661d87a24e8c10220ade499604e502336fedda4ae464736f6c63430005090032
Deployed Bytecode
0x60806040526004361061004a5760003560e01c8063025313a21461008e5780633659cfe6146100bf5780634f1ef286146100f45780635c60da1b146101aa578063f1739cae146101bf575b60006100546101f2565b90506001600160a01b03811661006957600080fd5b60405136600082376000803683855af43d806000843e81801561008a578184f35b8184fd5b34801561009a57600080fd5b506100a3610215565b604080516001600160a01b039092168252519081900360200190f35b3480156100cb57600080fd5b506100f2600480360360208110156100e257600080fd5b50356001600160a01b0316610246565b005b6100f26004803603604081101561010a57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561013557600080fd5b82018360208201111561014757600080fd5b8035906020019184600183028401116401000000008311171561016957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610277945050505050565b3480156101b657600080fd5b506100a36101f2565b3480156101cb57600080fd5b506100f2600480360360208110156101e257600080fd5b50356001600160a01b031661035c565b60008060405180806104a760219139604051908190036021019020549392505050565b604080517731b7b6973219b632b233b2b917383937bc3c9737bbb732b960411b815290519081900360180190205490565b61024e610215565b6001600160a01b0316336001600160a01b03161461026b57600080fd5b610274816103e8565b50565b61027f610215565b6001600160a01b0316336001600160a01b03161461029c57600080fd5b6102a582610246565b6000306001600160a01b031634836040518082805190602001908083835b602083106102e25780518252601f1990920191602091820191016102c3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610344576040519150601f19603f3d011682016040523d82523d6000602084013e610349565b606091505b505090508061035757600080fd5b505050565b610364610215565b6001600160a01b0316336001600160a01b03161461038157600080fd5b6001600160a01b03811661039457600080fd5b7f5a3e66efaa1e445ebd894728a69d6959842ea1e97bd79b892797106e270efcd96103bd610215565b604080516001600160a01b03928316815291841660208301528051918290030190a161027481610454565b60006103f26101f2565b9050816001600160a01b0316816001600160a01b0316141561041357600080fd5b61041c82610484565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b604080517731b7b6973219b632b233b2b917383937bc3c9737bbb732b960411b8152905190819003601801902055565b600060405180806104a76021913960405190819003602101902092909255505056fe636f6d2e64336c65646765722e70726f78792e696d706c656d656e746174696f6ea265627a7a72305820fb4836e043122dcba66dc2661d87a24e8c10220ade499604e502336fedda4ae464736f6c63430005090032
Deployed Bytecode Sourcemap
209:2628:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;584:13:10;600:16;:14;:16::i;:::-;584:32;-1:-1:-1;;;;;;630:19:10;;622:28;;;;;;691:4;685:11;724:12;721:1;716:3;703:34;805:1;802;788:12;783:3;776:5;771:3;758:49;826:14;870:4;867:1;862:3;847:28;890:6;903:28;;;;960:4;955:3;948:17;903:28;924:4;919:3;912:17;1102:158:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1102:158:9;;;:::i;:::-;;;;-1:-1:-1;;;;;1102:158:9;;;;;;;;;;;;;;2043:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2043:102:9;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2043:102:9;-1:-1:-1;;;;;2043:102:9;;:::i;:::-;;2613:222;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;2613:222:9;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;2613:222:9;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;2613:222:9;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;2613:222:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;2613:222:9;;-1:-1:-1;2613:222:9;;-1:-1:-1;;;;;2613:222:9:i;830:164:12:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;830:164:12;;;:::i;1648:212:9:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1648:212:9;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1648:212:9;-1:-1:-1;;;;;1648:212:9;;:::i;830:164:12:-;877:12;897:16;588:46;;;;;;;;;;;;;;;;;;969:15;;953:37;-1:-1:-1;;;953:37:12:o;1102:158:9:-;643:37;;;-1:-1:-1;;;643:37:9;;;;;;;;;;;;1235:15;;1218:38::o;2043:102::-;982:12;:10;:12::i;:::-;-1:-1:-1;;;;;968:26:9;:10;-1:-1:-1;;;;;968:26:9;;960:35;;;;;;2114:26;2125:14;2114:10;:26::i;:::-;2043:102;:::o;2613:222::-;982:12;:10;:12::i;:::-;-1:-1:-1;;;;;968:26:9;:10;-1:-1:-1;;;;;968:26:9;;960:35;;;;;;2718:25;2728:14;2718:9;:25::i;:::-;2750:12;2775:4;-1:-1:-1;;;;;2767:18:9;2792:9;2803:4;2767:41;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2767:41:9;;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;2749:59:9;;;2822:7;2814:16;;;;;;1001:1;2613:222;;:::o;1648:212::-;982:12;:10;:12::i;:::-;-1:-1:-1;;;;;968:26:9;:10;-1:-1:-1;;;;;968:26:9;;960:35;;;;;;-1:-1:-1;;;;;1734:22:9;;1726:31;;;;;;1768:49;1794:12;:10;:12::i;:::-;1768:49;;;-1:-1:-1;;;;;1768:49:9;;;;;;;;;;;;;;;;;;;;;1823:32;1846:8;1823:22;:32::i;1482:252:12:-;1544:29;1576:16;:14;:16::i;:::-;1544:48;;1631:17;-1:-1:-1;;;;;1606:42:12;:21;-1:-1:-1;;;;;1606:42:12;;;1598:51;;;;;;1655:36;1673:17;1655;:36::i;:::-;1702:27;;-1:-1:-1;;;;;1702:27:12;;;;;;;;1482:252;;:::o;1316:171:9:-;643:37;;;-1:-1:-1;;;643:37:9;;;;;;;;;;;;1446:31;1438:45::o;1151:178:12:-;1220:16;588:46;;;;;;;;;;;;;;;;;;1284:35;;;;-1:-1:-1;;1276:49:12:o
Swarm Source
bzzr://fb4836e043122dcba66dc2661d87a24e8c10220ade499604e502336fedda4ae4
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.