BluzelleToken
Deploy on AlchemyContract Information
The following smart contract is a BluzelleToken contract that inherits from FinalizableToken and BluzelleTokenConfig contracts. It defines the token symbol, name, decimals, and total supply. The contract also includes a function to reclaim tokens, which transfers the tokens from the contract address to the owner's address. The purpose of the contract is to create and manage the Bluzelle Token.
More Info
pragma solidity ^0.4.18;
// ----------------------------------------------------------------------------
// Owned - Ownership model with 2 phase transfers
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies.
// https://www.enuma.io/
// ----------------------------------------------------------------------------
// Implements a simple ownership model with 2-phase transfer.
contract Owned {
address public owner;
address public proposedOwner;
event OwnershipTransferInitiated(address indexed _proposedOwner);
event OwnershipTransferCompleted(address indexed _newOwner);
event OwnershipTransferCanceled();
function Owned() public
{
owner = msg.sender;
}
modifier onlyOwner() {
require(isOwner(msg.sender) == true);
_;
}
function isOwner(address _address) public view returns (bool) {
return (_address == owner);
}
function initiateOwnershipTransfer(address _proposedOwner) public onlyOwner returns (bool) {
require(_proposedOwner != address(0));
require(_proposedOwner != address(this));
require(_proposedOwner != owner);
proposedOwner = _proposedOwner;
OwnershipTransferInitiated(proposedOwner);
return true;
}
function cancelOwnershipTransfer() public onlyOwner returns (bool) {
if (proposedOwner == address(0)) {
return true;
}
proposedOwner = address(0);
OwnershipTransferCanceled();
return true;
}
function completeOwnershipTransfer() public returns (bool) {
require(msg.sender == proposedOwner);
owner = msg.sender;
proposedOwner = address(0);
OwnershipTransferCompleted(owner);
return true;
}
}
// ----------------------------------------------------------------------------
// OpsManaged - Implements an Owner and Ops Permission Model
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies.
// https://www.enuma.io/
// ----------------------------------------------------------------------------
//
// Implements a security model with owner and ops.
//
contract OpsManaged is Owned {
address public opsAddress;
event OpsAddressUpdated(address indexed _newAddress);
function OpsManaged() public
Owned()
{
}
modifier onlyOwnerOrOps() {
require(isOwnerOrOps(msg.sender));
_;
}
function isOps(address _address) public view returns (bool) {
return (opsAddress != address(0) && _address == opsAddress);
}
function isOwnerOrOps(address _address) public view returns (bool) {
return (isOwner(_address) || isOps(_address));
}
function setOpsAddress(address _newOpsAddress) public onlyOwner returns (bool) {
require(_newOpsAddress != owner);
require(_newOpsAddress != address(this));
opsAddress = _newOpsAddress;
OpsAddressUpdated(opsAddress);
return true;
}
}
// ----------------------------------------------------------------------------
// Math - General Math Utility Library
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies.
// https://www.enuma.io/
// ----------------------------------------------------------------------------
library Math {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 r = a + b;
require(r >= a);
return r;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(a >= b);
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 r = a * b;
require(a == 0 || r / a == b);
return r;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
}
// ----------------------------------------------------------------------------
// ERC20Interface - Standard ERC20 Interface Definition
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies.
// https://www.enuma.io/
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// Based on the final ERC20 specification at:
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
// ----------------------------------------------------------------------------
contract ERC20Interface {
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
function name() public view returns (string);
function symbol() public view returns (string);
function decimals() public view returns (uint8);
function totalSupply() public view returns (uint256);
function balanceOf(address _owner) public view returns (uint256 balance);
function allowance(address _owner, address _spender) public view returns (uint256 remaining);
function transfer(address _to, uint256 _value) public returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
function approve(address _spender, uint256 _value) public returns (bool success);
}
// ----------------------------------------------------------------------------
// ERC20Token - Standard ERC20 Implementation
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies.
// https://www.enuma.io/
// ----------------------------------------------------------------------------
contract ERC20Token is ERC20Interface {
using Math for uint256;
string private tokenName;
string private tokenSymbol;
uint8 private tokenDecimals;
uint256 internal tokenTotalSupply;
mapping(address => uint256) internal balances;
mapping(address => mapping (address => uint256)) allowed;
function ERC20Token(string _name, string _symbol, uint8 _decimals, uint256 _totalSupply, address _initialTokenHolder) public {
tokenName = _name;
tokenSymbol = _symbol;
tokenDecimals = _decimals;
tokenTotalSupply = _totalSupply;
// The initial balance of tokens is assigned to the given token holder address.
balances[_initialTokenHolder] = _totalSupply;
// Per EIP20, the constructor should fire a Transfer event if tokens are assigned to an account.
Transfer(0x0, _initialTokenHolder, _totalSupply);
}
function name() public view returns (string) {
return tokenName;
}
function symbol() public view returns (string) {
return tokenSymbol;
}
function decimals() public view returns (uint8) {
return tokenDecimals;
}
function totalSupply() public view returns (uint256) {
return tokenTotalSupply;
}
function balanceOf(address _owner) public view returns (uint256 balance) {
return balances[_owner];
}
function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
return allowed[_owner][_spender];
}
function transfer(address _to, uint256 _value) public returns (bool success) {
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
Transfer(msg.sender, _to, _value);
return true;
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
balances[_from] = balances[_from].sub(_value);
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
Transfer(_from, _to, _value);
return true;
}
function approve(address _spender, uint256 _value) public returns (bool success) {
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
}
// ----------------------------------------------------------------------------
// Finalizable - Basic implementation of the finalization pattern
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies.
// https://www.enuma.io/
// ----------------------------------------------------------------------------
contract Finalizable is Owned {
bool public finalized;
event Finalized();
function Finalizable() public
Owned()
{
finalized = false;
}
function finalize() public onlyOwner returns (bool) {
require(!finalized);
finalized = true;
Finalized();
return true;
}
}
// ----------------------------------------------------------------------------
// FinalizableToken - Extension to ERC20Token with ops and finalization
// Enuma Blockchain Platform
//
// Copyright (c) 2017 Enuma Technologies.
// https://www.enuma.io/
// ----------------------------------------------------------------------------
//
// ERC20 token with the following additions:
// 1. Owner/Ops Ownership
// 2. Finalization
//
contract FinalizableToken is ERC20Token, OpsManaged, Finalizable {
using Math for uint256;
// The constructor will assign the initial token supply to the owner (msg.sender).
function FinalizableToken(string _name, string _symbol, uint8 _decimals, uint256 _totalSupply) public
ERC20Token(_name, _symbol, _decimals, _totalSupply, msg.sender)
OpsManaged()
Finalizable()
{
}
function transfer(address _to, uint256 _value) public returns (bool success) {
validateTransfer(msg.sender, _to);
return super.transfer(_to, _value);
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
validateTransfer(msg.sender, _to);
return super.transferFrom(_from, _to, _value);
}
function validateTransfer(address _sender, address _to) private view {
require(_to != address(0));
// Once the token is finalized, everybody can transfer tokens.
if (finalized) {
return;
}
if (isOwner(_to)) {
return;
}
// Before the token is finalized, only owner and ops are allowed to initiate transfers.
// This allows them to move tokens while the sale is still ongoing for example.
require(isOwnerOrOps(_sender));
}
}
// ----------------------------------------------------------------------------
// BluzelleTokenConfig - Token Contract Configuration
//
// Copyright (c) 2017 Bluzelle Networks Pte Ltd.
// http://www.bluzelle.com/
//
// The MIT Licence.
// ----------------------------------------------------------------------------
contract BluzelleTokenConfig {
string public constant TOKEN_SYMBOL = "BLZ";
string public constant TOKEN_NAME = "Bluzelle Token";
uint8 public constant TOKEN_DECIMALS = 18;
uint256 public constant DECIMALSFACTOR = 10**uint256(TOKEN_DECIMALS);
uint256 public constant TOKEN_TOTALSUPPLY = 500000000 * DECIMALSFACTOR;
}
// ----------------------------------------------------------------------------
// BluzelleToken - ERC20 Compatible Token
//
// Copyright (c) 2017 Bluzelle Networks Pte Ltd.
// http://www.bluzelle.com/
//
// The MIT Licence.
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// The Bluzelle token is a standard ERC20 token with the addition of a few
// concepts such as:
//
// 1. Finalization
// Tokens can only be transfered by contributors after the contract has
// been finalized.
//
// 2. Ops Managed Model
// In addition to owner, there is a ops role which is used during the sale,
// by the sale contract, in order to transfer tokens.
// ----------------------------------------------------------------------------
contract BluzelleToken is FinalizableToken, BluzelleTokenConfig {
event TokensReclaimed(uint256 _amount);
function BluzelleToken() public
FinalizableToken(TOKEN_NAME, TOKEN_SYMBOL, TOKEN_DECIMALS, TOKEN_TOTALSUPPLY)
{
}
// Allows the owner to reclaim tokens that have been sent to the token address itself.
function reclaimTokens() public onlyOwner returns (bool) {
address account = address(this);
uint256 amount = balanceOf(account);
if (amount == 0) {
return false;
}
balances[account] = balances[account].sub(amount);
balances[owner] = balances[owner].add(amount);
Transfer(account, owner, amount);
TokensReclaimed(amount);
return true;
}
}
[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_NAME","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cancelOwnershipTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_SYMBOL","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"reclaimTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_DECIMALS","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOpsAddress","type":"address"}],"name":"setOpsAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_TOTALSUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DECIMALSFACTOR","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"opsAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isOwnerOrOps","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"finalized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_proposedOwner","type":"address"}],"name":"initiateOwnershipTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"proposedOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"completeOwnershipTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isOps","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_amount","type":"uint256"}],"name":"TokensReclaimed","type":"event"},{"anonymous":false,"inputs":[],"name":"Finalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_newAddress","type":"address"}],"name":"OpsAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_proposedOwner","type":"address"}],"name":"OwnershipTransferInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_newOwner","type":"address"}],"name":"OwnershipTransferCompleted","type":"event"},{"anonymous":false,"inputs":[],"name":"OwnershipTransferCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"}]
[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_NAME","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cancelOwnershipTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_SYMBOL","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"reclaimTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_DECIMALS","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOpsAddress","type":"address"}],"name":"setOpsAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_TOTALSUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DECIMALSFACTOR","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"opsAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isOwnerOrOps","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"finalized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_proposedOwner","type":"address"}],"name":"initiateOwnershipTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"proposedOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"completeOwnershipTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isOps","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_amount","type":"uint256"}],"name":"TokensReclaimed","type":"event"},{"anonymous":false,"inputs":[],"name":"Finalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_newAddress","type":"address"}],"name":"OpsAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_proposedOwner","type":"address"}],"name":"OwnershipTransferInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_newOwner","type":"address"}],"name":"OwnershipTransferCompleted","type":"event"},{"anonymous":false,"inputs":[],"name":"OwnershipTransferCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"}]
6060604052341561000f57600080fd5b604080519081016040908152600e82527f426c757a656c6c6520546f6b656e00000000000000000000000000000000000060208301528051908101604052600381527f424c5a0000000000000000000000000000000000000000000000000000000000602082015260126b019d971e4fe8401e740000008383838333600085805161009e929160200190610150565b5060018480516100b2929160200190610150565b506002805460ff191660ff85161790556003829055600160a060020a0381166000818152600460205260408082208590557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a3505060068054600160a060020a03191633600160a060020a031617905550506008805460a060020a60ff0219169055506101eb9350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061019157805160ff19168380011785556101be565b828001600101855582156101be579182015b828111156101be5782518255916020019190600101906101a3565b506101ca9291506101ce565b5090565b6101e891905b808211156101ca57600081556001016101d4565b90565b610ee080620001fb6000396000f30060606040526004361061015e5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610163578063095ea7b3146101ed57806318160ddd14610223578063188214001461024857806323452b9c1461025b57806323b872dd1461026e5780632a905318146102965780632f54bf6e146102a9578063313ce567146102c85780633c54caa5146102f15780634bb278f3146103045780635b7f415c14610317578063707789c51461032a57806370a082311461034957806374c950fb146103685780638bc04eb71461037b5780638da5cb5b1461038e5780638ea64376146103bd57806395d89b41146103d0578063a9059cbb146103e3578063adcf59ee14610405578063b3f05b9714610424578063c0b6f56114610437578063d153b60c14610456578063dd62ed3e14610469578063e71a78111461048e578063ef326c6d146104a1575b600080fd5b341561016e57600080fd5b6101766104c0565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101b257808201518382015260200161019a565b50505050905090810190601f1680156101df5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101f857600080fd5b61020f600160a060020a0360043516602435610569565b604051901515815260200160405180910390f35b341561022e57600080fd5b6102366105d5565b60405190815260200160405180910390f35b341561025357600080fd5b6101766105db565b341561026657600080fd5b61020f610612565b341561027957600080fd5b61020f600160a060020a0360043581169060243516604435610694565b34156102a157600080fd5b6101766106b3565b34156102b457600080fd5b61020f600160a060020a03600435166106ea565b34156102d357600080fd5b6102db6106fe565b60405160ff909116815260200160405180910390f35b34156102fc57600080fd5b61020f610707565b341561030f57600080fd5b61020f61083e565b341561032257600080fd5b6102db6108c4565b341561033557600080fd5b61020f600160a060020a03600435166108c9565b341561035457600080fd5b610236600160a060020a0360043516610981565b341561037357600080fd5b61023661099c565b341561038657600080fd5b6102366109ac565b341561039957600080fd5b6103a16109b8565b604051600160a060020a03909116815260200160405180910390f35b34156103c857600080fd5b6103a16109c7565b34156103db57600080fd5b6101766109d6565b34156103ee57600080fd5b61020f600160a060020a0360043516602435610a49565b341561041057600080fd5b61020f600160a060020a0360043516610a66565b341561042f57600080fd5b61020f610a86565b341561044257600080fd5b61020f600160a060020a0360043516610a96565b341561046157600080fd5b6103a1610b63565b341561047457600080fd5b610236600160a060020a0360043581169060243516610b72565b341561049957600080fd5b61020f610b9d565b34156104ac57600080fd5b61020f600160a060020a0360043516610c25565b6104c8610ea2565b60008054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561055e5780601f106105335761010080835404028352916020019161055e565b820191906000526020600020905b81548152906001019060200180831161054157829003601f168201915b505050505090505b90565b600160a060020a03338116600081815260056020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b60035490565b60408051908101604052600e81527f426c757a656c6c6520546f6b656e000000000000000000000000000000000000602082015281565b600061061d336106ea565b151560011461062b57600080fd5b600754600160a060020a0316151561064557506001610566565b6007805473ffffffffffffffffffffffffffffffffffffffff191690557f670699162ea7ba4de638b5a57c2148aed9ee8bd69740a5e6a7db727e3886c88b60405160405180910390a150600190565b60006106a03384610c52565b6106ab848484610ca9565b949350505050565b60408051908101604052600381527f424c5a0000000000000000000000000000000000000000000000000000000000602082015281565b600654600160a060020a0390811691161490565b60025460ff1690565b6000806000610715336106ea565b151560011461072357600080fd5b30915061072f82610981565b90508015156107415760009250610839565b600160a060020a03821660009081526004602052604090205461076a908263ffffffff610dbc16565b600160a060020a0380841660009081526004602052604080822093909355600654909116815220546107a2908263ffffffff610dd116565b60068054600160a060020a0390811660009081526004602052604090819020939093559054811691908416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9084905190815260200160405180910390a37fbce3cc672456937708767d1642a17cacb1962753bd5cff46c8dbd377906a6b4b8160405190815260200160405180910390a1600192505b505090565b6000610849336106ea565b151560011461085757600080fd5b60085460a060020a900460ff161561086e57600080fd5b6008805474ff0000000000000000000000000000000000000000191660a060020a1790557f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768160405160405180910390a150600190565b601281565b60006108d4336106ea565b15156001146108e257600080fd5b600654600160a060020a03838116911614156108fd57600080fd5b30600160a060020a031682600160a060020a03161415151561091e57600080fd5b6008805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038481169190911791829055167f06171a5d6c06d67b0cfa679c07db377a27d1170797663fd98d395229d8c3650860405160405180910390a2506001919050565b600160a060020a031660009081526004602052604090205490565b6b019d971e4fe8401e7400000081565b670de0b6b3a764000081565b600654600160a060020a031681565b600854600160a060020a031681565b6109de610ea2565b60018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561055e5780601f106105335761010080835404028352916020019161055e565b6000610a553384610c52565b610a5f8383610de3565b9392505050565b6000610a71826106ea565b80610a805750610a8082610c25565b92915050565b60085460a060020a900460ff1681565b6000610aa1336106ea565b1515600114610aaf57600080fd5b600160a060020a0382161515610ac457600080fd5b30600160a060020a031682600160a060020a031614151515610ae557600080fd5b600654600160a060020a0383811691161415610b0057600080fd5b6007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038481169190911791829055167f20f5afdf40bf7b43c89031a5d4369a30b159e512d164aa46124bcb706b4a1caf60405160405180910390a2506001919050565b600754600160a060020a031681565b600160a060020a03918216600090815260056020908152604080832093909416825291909152205490565b60075460009033600160a060020a03908116911614610bbb57600080fd5b60068054600160a060020a0333811673ffffffffffffffffffffffffffffffffffffffff19928316179283905560078054909216909155167f624adc4c72536289dd9d5439ccdeccd8923cb9af95fb626b21935447c77b840760405160405180910390a250600190565b600854600090600160a060020a031615801590610a80575050600854600160a060020a0390811691161490565b600160a060020a0381161515610c6757600080fd5b60085460a060020a900460ff1615610c7e57610ca5565b610c87816106ea565b15610c9157610ca5565b610c9a82610a66565b1515610ca557600080fd5b5050565b600160a060020a038316600090815260046020526040812054610cd2908363ffffffff610dbc16565b600160a060020a0380861660009081526004602090815260408083209490945560058152838220339093168252919091522054610d15908363ffffffff610dbc16565b600160a060020a0380861660009081526005602090815260408083203385168452825280832094909455918616815260049091522054610d5b908363ffffffff610dd116565b600160a060020a03808516600081815260046020526040908190209390935591908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060019392505050565b600081831015610dcb57600080fd5b50900390565b600082820183811015610a5f57600080fd5b600160a060020a033316600090815260046020526040812054610e0c908363ffffffff610dbc16565b600160a060020a033381166000908152600460205260408082209390935590851681522054610e41908363ffffffff610dd116565b600160a060020a0380851660008181526004602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a350600192915050565b602060405190810160405260008152905600a165627a7a72305820bc8b6478ee59585031c79969344b9a113852e7a98d20f2fba1d29901ecd0d4e50029
6060604052341561000f57600080fd5b604080519081016040908152600e82527f426c757a656c6c6520546f6b656e00000000000000000000000000000000000060208301528051908101604052600381527f424c5a0000000000000000000000000000000000000000000000000000000000602082015260126b019d971e4fe8401e740000008383838333600085805161009e929160200190610150565b5060018480516100b2929160200190610150565b506002805460ff191660ff85161790556003829055600160a060020a0381166000818152600460205260408082208590557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a3505060068054600160a060020a03191633600160a060020a031617905550506008805460a060020a60ff0219169055506101eb9350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061019157805160ff19168380011785556101be565b828001600101855582156101be579182015b828111156101be5782518255916020019190600101906101a3565b506101ca9291506101ce565b5090565b6101e891905b808211156101ca57600081556001016101d4565b90565b610ee080620001fb6000396000f30060606040526004361061015e5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610163578063095ea7b3146101ed57806318160ddd14610223578063188214001461024857806323452b9c1461025b57806323b872dd1461026e5780632a905318146102965780632f54bf6e146102a9578063313ce567146102c85780633c54caa5146102f15780634bb278f3146103045780635b7f415c14610317578063707789c51461032a57806370a082311461034957806374c950fb146103685780638bc04eb71461037b5780638da5cb5b1461038e5780638ea64376146103bd57806395d89b41146103d0578063a9059cbb146103e3578063adcf59ee14610405578063b3f05b9714610424578063c0b6f56114610437578063d153b60c14610456578063dd62ed3e14610469578063e71a78111461048e578063ef326c6d146104a1575b600080fd5b341561016e57600080fd5b6101766104c0565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101b257808201518382015260200161019a565b50505050905090810190601f1680156101df5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101f857600080fd5b61020f600160a060020a0360043516602435610569565b604051901515815260200160405180910390f35b341561022e57600080fd5b6102366105d5565b60405190815260200160405180910390f35b341561025357600080fd5b6101766105db565b341561026657600080fd5b61020f610612565b341561027957600080fd5b61020f600160a060020a0360043581169060243516604435610694565b34156102a157600080fd5b6101766106b3565b34156102b457600080fd5b61020f600160a060020a03600435166106ea565b34156102d357600080fd5b6102db6106fe565b60405160ff909116815260200160405180910390f35b34156102fc57600080fd5b61020f610707565b341561030f57600080fd5b61020f61083e565b341561032257600080fd5b6102db6108c4565b341561033557600080fd5b61020f600160a060020a03600435166108c9565b341561035457600080fd5b610236600160a060020a0360043516610981565b341561037357600080fd5b61023661099c565b341561038657600080fd5b6102366109ac565b341561039957600080fd5b6103a16109b8565b604051600160a060020a03909116815260200160405180910390f35b34156103c857600080fd5b6103a16109c7565b34156103db57600080fd5b6101766109d6565b34156103ee57600080fd5b61020f600160a060020a0360043516602435610a49565b341561041057600080fd5b61020f600160a060020a0360043516610a66565b341561042f57600080fd5b61020f610a86565b341561044257600080fd5b61020f600160a060020a0360043516610a96565b341561046157600080fd5b6103a1610b63565b341561047457600080fd5b610236600160a060020a0360043581169060243516610b72565b341561049957600080fd5b61020f610b9d565b34156104ac57600080fd5b61020f600160a060020a0360043516610c25565b6104c8610ea2565b60008054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561055e5780601f106105335761010080835404028352916020019161055e565b820191906000526020600020905b81548152906001019060200180831161054157829003601f168201915b505050505090505b90565b600160a060020a03338116600081815260056020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b60035490565b60408051908101604052600e81527f426c757a656c6c6520546f6b656e000000000000000000000000000000000000602082015281565b600061061d336106ea565b151560011461062b57600080fd5b600754600160a060020a0316151561064557506001610566565b6007805473ffffffffffffffffffffffffffffffffffffffff191690557f670699162ea7ba4de638b5a57c2148aed9ee8bd69740a5e6a7db727e3886c88b60405160405180910390a150600190565b60006106a03384610c52565b6106ab848484610ca9565b949350505050565b60408051908101604052600381527f424c5a0000000000000000000000000000000000000000000000000000000000602082015281565b600654600160a060020a0390811691161490565b60025460ff1690565b6000806000610715336106ea565b151560011461072357600080fd5b30915061072f82610981565b90508015156107415760009250610839565b600160a060020a03821660009081526004602052604090205461076a908263ffffffff610dbc16565b600160a060020a0380841660009081526004602052604080822093909355600654909116815220546107a2908263ffffffff610dd116565b60068054600160a060020a0390811660009081526004602052604090819020939093559054811691908416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9084905190815260200160405180910390a37fbce3cc672456937708767d1642a17cacb1962753bd5cff46c8dbd377906a6b4b8160405190815260200160405180910390a1600192505b505090565b6000610849336106ea565b151560011461085757600080fd5b60085460a060020a900460ff161561086e57600080fd5b6008805474ff0000000000000000000000000000000000000000191660a060020a1790557f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768160405160405180910390a150600190565b601281565b60006108d4336106ea565b15156001146108e257600080fd5b600654600160a060020a03838116911614156108fd57600080fd5b30600160a060020a031682600160a060020a03161415151561091e57600080fd5b6008805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038481169190911791829055167f06171a5d6c06d67b0cfa679c07db377a27d1170797663fd98d395229d8c3650860405160405180910390a2506001919050565b600160a060020a031660009081526004602052604090205490565b6b019d971e4fe8401e7400000081565b670de0b6b3a764000081565b600654600160a060020a031681565b600854600160a060020a031681565b6109de610ea2565b60018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561055e5780601f106105335761010080835404028352916020019161055e565b6000610a553384610c52565b610a5f8383610de3565b9392505050565b6000610a71826106ea565b80610a805750610a8082610c25565b92915050565b60085460a060020a900460ff1681565b6000610aa1336106ea565b1515600114610aaf57600080fd5b600160a060020a0382161515610ac457600080fd5b30600160a060020a031682600160a060020a031614151515610ae557600080fd5b600654600160a060020a0383811691161415610b0057600080fd5b6007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038481169190911791829055167f20f5afdf40bf7b43c89031a5d4369a30b159e512d164aa46124bcb706b4a1caf60405160405180910390a2506001919050565b600754600160a060020a031681565b600160a060020a03918216600090815260056020908152604080832093909416825291909152205490565b60075460009033600160a060020a03908116911614610bbb57600080fd5b60068054600160a060020a0333811673ffffffffffffffffffffffffffffffffffffffff19928316179283905560078054909216909155167f624adc4c72536289dd9d5439ccdeccd8923cb9af95fb626b21935447c77b840760405160405180910390a250600190565b600854600090600160a060020a031615801590610a80575050600854600160a060020a0390811691161490565b600160a060020a0381161515610c6757600080fd5b60085460a060020a900460ff1615610c7e57610ca5565b610c87816106ea565b15610c9157610ca5565b610c9a82610a66565b1515610ca557600080fd5b5050565b600160a060020a038316600090815260046020526040812054610cd2908363ffffffff610dbc16565b600160a060020a0380861660009081526004602090815260408083209490945560058152838220339093168252919091522054610d15908363ffffffff610dbc16565b600160a060020a0380861660009081526005602090815260408083203385168452825280832094909455918616815260049091522054610d5b908363ffffffff610dd116565b600160a060020a03808516600081815260046020526040908190209390935591908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060019392505050565b600081831015610dcb57600080fd5b50900390565b600082820183811015610a5f57600080fd5b600160a060020a033316600090815260046020526040812054610e0c908363ffffffff610dbc16565b600160a060020a033381166000908152600460205260408082209390935590851681522054610e41908363ffffffff610dd116565b600160a060020a0380851660008181526004602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a350600192915050565b602060405190810160405260008152905600a165627a7a72305820bc8b6478ee59585031c79969344b9a113852e7a98d20f2fba1d29901ecd0d4e50029