Transaction Hash:
Block:
5994279 at Jul-19-2018 09:16:08 PM +UTC
Transaction Fee:
0.00012768 ETH
$0.25
Gas Used:
42,560 Gas / 3 Gwei
Emitted Events:
| 38 |
BAToken.Transfer( _from=[Receiver] BATSafe, _to=[Sender] 0x4b93f57953d685f7241699a87f2464fa8b1b9bd9, _value=2000000000000000000000000 )
|
Account State Difference:
| Address | Before | After | State Difference | ||
|---|---|---|---|---|---|
| 0x0D8775F6...50d2887EF | |||||
| 0x4b93f579...A8B1b9bD9 |
0.255 Eth
Nonce: 0
|
0.25487232 Eth
Nonce: 1
| 0.00012768 | ||
| 0x67fa2C06...873eF3d2b | (BAT: Team Lockup) | ||||
|
0xEA674fdD...16B898ec8
Miner
| (Ethermine) | 958.411903962416576887 Eth | 958.412031642416576887 Eth | 0.00012768 |
Execution Trace
BATSafe.CALL( )
-
BAToken.transfer( _to=0x4b93f57953D685F7241699a87F2464fA8B1b9bD9, _value=2000000000000000000000000 ) => ( success=True )
File 1 of 2: BATSafe
File 2 of 2: BAToken
pragma solidity ^0.4.10;
contract Token {
uint256 public totalSupply;
function balanceOf(address _owner) constant returns (uint256 balance);
function transfer(address _to, uint256 _value) returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) returns (bool success);
function approve(address _spender, uint256 _value) returns (bool success);
function allowance(address _owner, address _spender) constant returns (uint256 remaining);
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
/* ERC 20 token */
contract StandardToken is Token {
function transfer(address _to, uint256 _value) returns (bool success) {
if (balances[msg.sender] >= _value && _value > 0) {
balances[msg.sender] -= _value;
balances[_to] += _value;
Transfer(msg.sender, _to, _value);
return true;
} else {
return false;
}
}
function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && _value > 0) {
balances[_to] += _value;
balances[_from] -= _value;
allowed[_from][msg.sender] -= _value;
Transfer(_from, _to, _value);
return true;
} else {
return false;
}
}
function balanceOf(address _owner) constant returns (uint256 balance) {
return balances[_owner];
}
function approve(address _spender, uint256 _value) returns (bool success) {
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
return allowed[_owner][_spender];
}
mapping (address => uint256) balances;
mapping (address => mapping (address => uint256)) allowed;
}
// requires 133,650,000 BAT deposited here
contract BATSafe {
mapping (address => uint256) allocations;
uint256 public unlockDate;
address public BAT;
uint256 public constant exponent = 10**18;
function BATSafe(address _BAT) {
BAT = _BAT;
unlockDate = now + 6 * 30 days;
allocations[0xe0f6EF3D61255d1Bd7ad66987D2fBB3FE5Ee8Ea4] = 16000000;
allocations[0xCB25966330044310ecD09634ea6B1f4190d5B10D] = 16000000;
allocations[0xFf8e2295EF4Ad0db7aFaDC13743c227Bb0e82838] = 16000000;
allocations[0x9Dc920118672c04645Eb2831A70d2aA1ccBF330c] = 16000000;
allocations[0xb9FE2d16eBAD02Ba3A6f61F64e8506F1C80cec07] = 8000000;
allocations[0x92C9304e826451a3Af0fc9f4d36Ae59920F80b0f] = 8000000;
allocations[0x5cAe9Bc0C527f95CC6558D32EC5B931ad7328088] = 8000000;
allocations[0xF94BE6b93432b39Bc1637FDD656740758736d935] = 4000000;
allocations[0x4Fb65030536103EA718Fa37A3E05c76aDB3C5447] = 4000000;
allocations[0x216C83DD2383e44cb9914C05aCd019dde429F201] = 2250000;
allocations[0x460599DC0A5AF7b4bef0ee6fdDA23DBF8CC6cA70] = 2000000;
allocations[0x06BdBDcCBeC95937b742c0EADf7B2f50c4f325C0] = 2000000;
allocations[0x6eED129DD60251c7C839Bf0D161199a3A3FED959] = 2000000;
allocations[0xAF6929A04651FE2fDa8eBBD18A6ed89ba6F7bb3b] = 2000000;
allocations[0x74019652e7Bfe06e055f1424E8F695d85c5AdDDa] = 2000000;
allocations[0x77D325161984D3A5835cfEB5dB4E6CF998904a84] = 2000000;
allocations[0x7b28547b78e425AbaE8f472e2A77021e9b19B5ad] = 2000000;
allocations[0xFF6Cb8161A55DB05F9B41F34F5A8B3dc1F1E1A7e] = 2000000;
allocations[0x016078A5e18D9a2A4698e8623744556F09a9Ca15] = 2000000;
allocations[0x5A471480d72D6a6Da75b7546D740F95387174c2D] = 2000000;
allocations[0xb46De0168c02246C0C1C4Cf562E9003cBf01CdD7] = 2000000;
allocations[0x9bbBD666B714C84764B1aE4012DD177526E63fB4] = 2000000;
allocations[0xC6aD53B70d2cCEf579D0CC4a22Ed18a62ADD33b6] = 2000000;
allocations[0x398aD5ed756C42758B33c4Ae36162E5C0cE787cE] = 2000000;
allocations[0x4b93f57953D685F7241699a87F2464fA8B1b9bD9] = 2000000;
allocations[0xFCdFdD838bAf60E53EAc5d86F3234854f7e0DDee] = 2000000;
allocations[0x98949388D6c5e9B91a1F30e33595A5E6127036bE] = 2000000;
allocations[0x7A5c1A532a89B50c84f9fFd7f915093f5C637081] = 700000;
allocations[0x2cb8457Adde40aa7298C19Fa94426B94317C2744] = 700000;
}
function unlock() external {
if(now < unlockDate) throw;
uint256 entitled = allocations[msg.sender];
allocations[msg.sender] = 0;
if(!StandardToken(BAT).transfer(msg.sender, entitled * exponent)) throw;
}
}File 2 of 2: BAToken
pragma solidity ^0.4.10;
/* taking ideas from FirstBlood token */
contract SafeMath {
/* function assert(bool assertion) internal { */
/* if (!assertion) { */
/* throw; */
/* } */
/* } // assert no longer needed once solidity is on 0.4.10 */
function safeAdd(uint256 x, uint256 y) internal returns(uint256) {
uint256 z = x + y;
assert((z >= x) && (z >= y));
return z;
}
function safeSubtract(uint256 x, uint256 y) internal returns(uint256) {
assert(x >= y);
uint256 z = x - y;
return z;
}
function safeMult(uint256 x, uint256 y) internal returns(uint256) {
uint256 z = x * y;
assert((x == 0)||(z/x == y));
return z;
}
}
contract Token {
uint256 public totalSupply;
function balanceOf(address _owner) constant returns (uint256 balance);
function transfer(address _to, uint256 _value) returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) returns (bool success);
function approve(address _spender, uint256 _value) returns (bool success);
function allowance(address _owner, address _spender) constant returns (uint256 remaining);
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
/* ERC 20 token */
contract StandardToken is Token {
function transfer(address _to, uint256 _value) returns (bool success) {
if (balances[msg.sender] >= _value && _value > 0) {
balances[msg.sender] -= _value;
balances[_to] += _value;
Transfer(msg.sender, _to, _value);
return true;
} else {
return false;
}
}
function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && _value > 0) {
balances[_to] += _value;
balances[_from] -= _value;
allowed[_from][msg.sender] -= _value;
Transfer(_from, _to, _value);
return true;
} else {
return false;
}
}
function balanceOf(address _owner) constant returns (uint256 balance) {
return balances[_owner];
}
function approve(address _spender, uint256 _value) returns (bool success) {
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
return allowed[_owner][_spender];
}
mapping (address => uint256) balances;
mapping (address => mapping (address => uint256)) allowed;
}
contract BAToken is StandardToken, SafeMath {
// metadata
string public constant name = "Basic Attention Token";
string public constant symbol = "BAT";
uint256 public constant decimals = 18;
string public version = "1.0";
// contracts
address public ethFundDeposit; // deposit address for ETH for Brave International
address public batFundDeposit; // deposit address for Brave International use and BAT User Fund
// crowdsale parameters
bool public isFinalized; // switched to true in operational state
uint256 public fundingStartBlock;
uint256 public fundingEndBlock;
uint256 public constant batFund = 500 * (10**6) * 10**decimals; // 500m BAT reserved for Brave Intl use
uint256 public constant tokenExchangeRate = 6400; // 6400 BAT tokens per 1 ETH
uint256 public constant tokenCreationCap = 1500 * (10**6) * 10**decimals;
uint256 public constant tokenCreationMin = 675 * (10**6) * 10**decimals;
// events
event LogRefund(address indexed _to, uint256 _value);
event CreateBAT(address indexed _to, uint256 _value);
// constructor
function BAToken(
address _ethFundDeposit,
address _batFundDeposit,
uint256 _fundingStartBlock,
uint256 _fundingEndBlock)
{
isFinalized = false; //controls pre through crowdsale state
ethFundDeposit = _ethFundDeposit;
batFundDeposit = _batFundDeposit;
fundingStartBlock = _fundingStartBlock;
fundingEndBlock = _fundingEndBlock;
totalSupply = batFund;
balances[batFundDeposit] = batFund; // Deposit Brave Intl share
CreateBAT(batFundDeposit, batFund); // logs Brave Intl fund
}
/// @dev Accepts ether and creates new BAT tokens.
function createTokens() payable external {
if (isFinalized) throw;
if (block.number < fundingStartBlock) throw;
if (block.number > fundingEndBlock) throw;
if (msg.value == 0) throw;
uint256 tokens = safeMult(msg.value, tokenExchangeRate); // check that we're not over totals
uint256 checkedSupply = safeAdd(totalSupply, tokens);
// return money if something goes wrong
if (tokenCreationCap < checkedSupply) throw; // odd fractions won't be found
totalSupply = checkedSupply;
balances[msg.sender] += tokens; // safeAdd not needed; bad semantics to use here
CreateBAT(msg.sender, tokens); // logs token creation
}
/// @dev Ends the funding period and sends the ETH home
function finalize() external {
if (isFinalized) throw;
if (msg.sender != ethFundDeposit) throw; // locks finalize to the ultimate ETH owner
if(totalSupply < tokenCreationMin) throw; // have to sell minimum to move to operational
if(block.number <= fundingEndBlock && totalSupply != tokenCreationCap) throw;
// move to operational
isFinalized = true;
if(!ethFundDeposit.send(this.balance)) throw; // send the eth to Brave International
}
/// @dev Allows contributors to recover their ether in the case of a failed funding campaign.
function refund() external {
if(isFinalized) throw; // prevents refund if operational
if (block.number <= fundingEndBlock) throw; // prevents refund until sale period is over
if(totalSupply >= tokenCreationMin) throw; // no refunds if we sold enough
if(msg.sender == batFundDeposit) throw; // Brave Intl not entitled to a refund
uint256 batVal = balances[msg.sender];
if (batVal == 0) throw;
balances[msg.sender] = 0;
totalSupply = safeSubtract(totalSupply, batVal); // extra safe
uint256 ethVal = batVal / tokenExchangeRate; // should be safe; previous throws covers edges
LogRefund(msg.sender, ethVal); // log it
if (!msg.sender.send(ethVal)) throw; // if you're using a contract; make sure it works with .send gas limits
}
}