Transaction Hash:
Block:
21623932 at Jan-14-2025 04:29:59 PM +UTC
Transaction Fee:
0.000542465831596803 ETH
$2.31
Gas Used:
58,141 Gas / 9.330177183 Gwei
Emitted Events:
337 |
OwnedUpgradeabilityProxy.0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925( 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925, 0x0000000000000000000000005f939de0e81a199a34e50615f34cbab82412459a, 0x00000000000000000000000068b3465833fb72a70ecdf485e0e4c7bd8665fc45, 0000000000000000000000000000000000000000000011632fc4e51adeae0000 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x4838B106...B0BAD5f97
Miner
| (Titan Builder) | 13.79193885505153262 Eth | 13.79194466915153262 Eth | 0.0000058141 | |
0x5F939de0...82412459a |
8.073049383063933534 Eth
Nonce: 25
|
8.072506917232336731 Eth
Nonce: 26
| 0.000542465831596803 | ||
0x75231F58...14342a86c |
Execution Trace
OwnedUpgradeabilityProxy.095ea7b3( )

-
OKBImplementation.approve( spender=0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45, value=82109900000000000000000 ) => ( True )
File 1 of 2: OwnedUpgradeabilityProxy
File 2 of 2: OKBImplementation
1{"Address.sol":{"content":"pragma solidity ^0.4.24;\n\nlibrary Address {\n /**\n * Returns whether the target address is a contract\n * @devThis function will return false if invoked during the constructor of a contract,\n * as the code is not actually created until after theconstructor finishes.\n * @param account address of the account to check\n * @return whether the target address is a contract\n */\nfunction isContract(address account) internal view returns (bool) {\n uint256 size;\n // XXX Currently there is no better way tocheck if there is a contract in an address\n // than to check the size of the code at that address.\n // See https://ethereum.stackexchange.com/a/14016/36603\n // for more details about how this works.\n // TODO Check this again before the Serenity release,because all addresses will be\n // contracts then.\n // solhint-disable-next-line no-inline-assembly\n assembly { size :=extcodesize(account) }\n return size \u003e 0;\n }\n}"},"OwnedUpgradeabilityProxy.sol":{"content":"pragma solidity ^0.4.24;\n\nimport\u0027./UpgradeabilityProxy.sol\u0027;\n\n\n/**\n * @title OwnedUpgradeabilityProxy\n * @dev This contract combines an upgradeability proxy withbasic authorization control functionalities\n */\ncontract OwnedUpgradeabilityProxy is UpgradeabilityProxy {\n /**\n * @dev Event to showownership has been transferred\n * @param previousOwner representing the address of the previous owner\n * @param newOwner representing theaddress of the new owner\n */\n event ProxyOwnershipTransferred(address previousOwner, address newOwner);\n\n // Storage position of the ownerof the contract\n bytes32 private constant proxyOwnerPosition = keccak256(\"org.zeppelinos.proxy.owner\");\n\n /**\n * @dev the constructor setsthe original owner of the contract to the sender account.\n */\n constructor() public {\n setUpgradeabilityOwner(msg.sender);\n }\n\n /**\n* @dev Throws if called by any account other than the owner.\n */\n modifier onlyProxyOwner() {\n require(msg.sender == proxyOwner());\n _;\n }\n\n /**\n * @dev Tells the address of the owner\n * @return the address of the owner\n */\n function proxyOwner() public viewreturns (address owner) {\n bytes32 position = proxyOwnerPosition;\n assembly {\n owner := sload(position)\n }\n }\n\n /**\n *@dev Sets the address of the owner\n */\n function setUpgradeabilityOwner(address newProxyOwner) internal {\n bytes32 position =proxyOwnerPosition;\n assembly {\n sstore(position, newProxyOwner)\n }\n }\n\n /**\n * @dev Allows the current owner to transfercontrol of the contract to a newOwner.\n * @param newOwner The address to transfer ownership to.\n */\n function transferProxyOwnership(address newOwner) public onlyProxyOwner {\n require(newOwner != address(0));\n emit ProxyOwnershipTransferred(proxyOwner(), newOwner);\nsetUpgradeabilityOwner(newOwner);\n }\n\n /**\n * @dev Allows the proxy owner to upgrade the current version of the proxy.\n * @paramimplementation representing the address of the new implementation to be set.\n */\n function upgradeTo(address implementation) publiconlyProxyOwner {\n _upgradeTo(implementation);\n }\n\n /**\n * @dev Allows the proxy owner to upgrade the current version of the proxy andcall the new implementation\n * to initialize whatever is needed through a low level call.\n * @param implementation representing the addressof the new implementation to be set.\n * @param data represents the msg.data to bet sent in the low level call. This parameter may include thefunction\n * signature of the implementation to be called with the needed payload\n */\n function upgradeToAndCall(address implementation,bytes data) payable public onlyProxyOwner {\n upgradeTo(implementation);\n require(implementation.delegatecall(data));\n}\n}"},"Proxy.sol":{"content":"pragma solidity ^0.4.24;\n\n/**\n * @title Proxy\n * @dev Gives the possibility to delegate any call to a foreign implementation.\n*/\ncontract Proxy {\n /**\n * @dev Tells the address of the implementation where every call will be delegated.\n * @return address of theimplementation to which it will be delegated\n */\n function implementation() public view returns (address);\n\n /**\n * @dev Fallback functionallowing to perform a delegatecall to the given implementation.\n * This function will return whatever the implementation call returns\n */\nfunction () payable public {\n address _impl = implementation();\n require(_impl != address(0));\n\n assembly {\n let ptr := mload(0x40)\n calldatacopy(ptr, 0, calldatasize)\n let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0)\n let size :=returndatasize\n returndatacopy(ptr, 0, size)\n\n switch result\n case 0 { revert(ptr, size) }\n default { return(ptr, size)}\n }\n }\n}"},"UpgradeabilityProxy.sol":{"content":"pragma solidity ^0.4.24;\n\nimport \u0027./Proxy.sol\u0027;\nimport \u0027./Address.sol\u0027;\n\n\n/**\n * @title UpgradeabilityProxy\n * @dev This contract represents a proxy where the implementation address to which it willdelegate can be upgraded\n */\ncontract UpgradeabilityProxy is Proxy {\n /**\n * @dev This event will be emitted every time the implementationgets upgraded\n * @param implementation representing the address of the upgraded implementation\n */\n event Upgraded(address indexedimplementation);\n\n // Storage position of the address of the current implementation\n bytes32 private constant implementationPosition =keccak256(\"org.zeppelinos.proxy.implementation\");\n\n /**\n * @dev Constructor function\n */\n constructor() public {}\n\n /**\n * @devTells the address of the current implementation\n * @return address of the current implementation\n */\n function implementation() public viewreturns (address impl) {\n bytes32 position = implementationPosition;\n assembly {\n impl := sload(position)\n }\n }\n\n /**\n *@dev Sets the address of the current implementation\n * @param newImplementation address representing the new implementation to be set\n */\nfunction setImplementation(address newImplementation) internal {\n require(Address.isContract(newImplementation),\"newImplementation is not acontractAddress\");\n bytes32 position = implementationPosition;\n assembly {\n sstore(position, newImplementation)\n }\n }\n\n/**\n * @dev Upgrades the implementation address\n * @param newImplementation representing the address of the new implementation to be set\n*/\n function _upgradeTo(address newImplementation) internal {\n address currentImplementation = implementation();\n require(currentImplementation != newImplementation);\n setImplementation(newImplementation);\n emit Upgraded(newImplementation);\n }\n}"}}
File 2 of 2: OKBImplementation
1{"OKb.sol":{"content":"pragma solidity ^0.4.24;\n\n\nimport \"./SafeMath.sol\";\n\n\n\n/**\n * @title OKBImplementation\n * @dev this contract is aPausable ERC20 token with Burn and Mint\n * controleld by a central SupplyController. By implementing OKBImplementation\n * this contract alsoincludes external methods for setting\n * a new implementation contract for the Proxy.\n * NOTE: The storage defined here will actually be held inthe Proxy\n * contract and all calls to this contract should be made through\n * the proxy, including admin actions done as owner orsupplyController.\n * Any call to transfer against this contract should fail\n * with insufficient funds since no tokens will be issued there.\n*/\ncontract OKBImplementation {\n\n /**\n * MATH\n */\n\n using SafeMath for uint256;\n\n /**\n * DATA\n */\n\n //INITIALIZATION DATA\n bool private initialized = false;\n\n // ERC20 BASIC DATA\n mapping(address =\u003e uint256) internal balances;\nuint256 internal totalSupply_;\n string public constant name = \"OKB\"; // solium-disable-line uppercase\n string public constant symbol =\"OKB\"; // solium-disable-line uppercase\n uint8 public constant decimals = 18; // solium-disable-line uppercase\n\n // ERC20 DATA\nmapping (address =\u003e mapping (address =\u003e uint256)) internal _allowed;\n\n // OWNER DATA\n address public owner;\n\n //PAUSABILITY DATA\n bool public paused = false;\n\n // LAW ENFORCEMENT DATA\n address public lawEnforcementRole;\n mapping(address=\u003e bool) internal frozen;\n\n // SUPPLY CONTROL DATA\n\n\n\n address public supplyController;\n\n /**\n * EVENTS\n */\n\n// ERC20 BASIC EVENTS\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n // ERC20 EVENTS\n event Approval(\naddress indexed owner,\n address indexed spender,\n uint256 value\n );\n\n // OWNABLE EVENTS\n eventOwnershipTransferred(\n address indexed oldOwner,\n address indexed newOwner\n );\n\n // PAUSABLE EVENTS\n event Pause();\nevent Unpause();\n\n // LAW ENFORCEMENT EVENTS\n event AddressFrozen(address indexed addr);\n event AddressUnfrozen(address indexedaddr);\n event FrozenAddressWiped(address indexed addr);\n event LawEnforcementRoleSet (\n address indexed oldLawEnforcementRole,\naddress indexed newLawEnforcementRole\n );\n\n // SUPPLY CONTROL EVENTS\n event SupplyIncreased(address indexed to, uint256 value);\nevent SupplyDecreased(address indexed from, uint256 value);\n event SupplyControllerSet(\n address indexed oldSupplyController,\naddress indexed newSupplyController\n );\n\n /**\n * FUNCTIONALITY\n */\n\n // INITIALIZATION FUNCTIONALITY\n\n /**\n *@dev sets 0 initials tokens, the owner, and the supplyController.\n * this serves as the constructor for the proxy but compiles to the\n *memory model of the Implementation contract.\n */\n function initialize() public {\n require(!initialized, \"already initialized\");\n owner = msg.sender;\n lawEnforcementRole = address(0);\n totalSupply_ = 0;\n supplyController = msg.sender;\ninitialized = true;\n }\n\n /**\n * The constructor is used here to ensure that the implementation\n * contract is initialized. Anuncontrolled implementation\n * contract might lead to misleading state\n * for users who accidentally interact with it.\n */\nconstructor() public {\n initialize();\n pause();\n }\n\n // ERC20 BASIC FUNCTIONALITY\n\n /**\n * @dev Total number oftokens in existence\n */\n function totalSupply() public view returns (uint256) {\n return totalSupply_;\n }\n\n /**\n * @devTransfer token for a specified address\n * @param _to The address to transfer to.\n * @param _value The amount to be transferred.\n */\nfunction transfer(address _to, uint256 _value) public whenNotPaused returns (bool) {\n require(_to != address(0), \"cannot transfer toaddress zero\");\n require(!frozen[_to] \u0026\u0026 !frozen[msg.sender], \"address frozen\");\n require(_value \u003c= balances[msg.sender], \"insufficient funds\");\n\n balances[msg.sender] = balances[msg.sender].sub(_value);\n balances[_to] = balances[_to].add(_value);\n emit Transfer(msg.sender, _to, _value);\n return true;\n }\n\n /**\n * @dev Gets the balance of the specifiedaddress.\n * @param _addr The address to query the the balance of.\n * @return An uint256 representing the amount owned by the passed address.\n */\n function balanceOf(address _addr) public view returns (uint256) {\n return balances[_addr];\n }\n\n // ERC20FUNCTIONALITY\n\n /**\n * @dev Transfer tokens from one address to another\n * @param _from address The address which you want to sendtokens from\n * @param _to address The address which you want to transfer to\n * @param _value uint256 the amount of tokens to betransferred\n */\n function transferFrom(address _from,address _to,uint256 _value) public whenNotPaused returns (bool)\n {\nrequire(_to != address(0), \"cannot transfer to address zero\");\n require(!frozen[_to] \u0026\u0026 !frozen[_from] \u0026\u0026 !frozen[msg.sender], \"address frozen\");\n require(_value \u003c= balances[_from], \"insufficient funds\");\n require(_value \u003c=_allowed[_from][msg.sender], \"insufficient allowance\");\n\n balances[_from] = balances[_from].sub(_value);\n balances[_to] =balances[_to].add(_value);\n _allowed[_from][msg.sender] = _allowed[_from][msg.sender].sub(_value);\n emit Transfer(_from, _to,_value);\n return true;\n }\n\n /**\n * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.\n * Beware that changing an allowance with this method brings the risk that someone may use both the old\n * and the new allowanceby unfortunate transaction ordering. One possible solution to mitigate this\n * race condition is to first reduce the spender\u0027s allowanceto 0 and set the desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n * @param spender Theaddress which will spend the funds.\n * @param value The amount of tokens to be spent.\n */\n function approve(address spender, uint256value) public whenNotPaused returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n /**\n * @devApprove an address to spend another addresses\u0027 tokens.\n * @param _owner The address that owns the tokens.\n * @param spender Theaddress that will spend the tokens.\n * @param value The number of tokens that can be spent.\n */\n function _approve(address _owner,address spender, uint256 value) internal {\n require(!frozen[spender] \u0026\u0026 !frozen[_owner], \"address frozen\");\n require(spender != address(0) \u0026\u0026 _owner != address(0),\"not address(0)\");\n _allowed[_owner][spender] = value;\n emit Approval(_owner, spender, value);\n }\n\n /**\n * @dev Function to check the amount of tokens that an owner allowed to a spender.\n * @param_owner address The address which owns the funds.\n * @param spender address The address which will spend the funds.\n * @return A uint256specifying the amount of tokens still available for the spender.\n */\n function allowance(address _owner, address spender) public viewreturns (uint256) {\n return _allowed[_owner][spender];\n }\n\n /**\n * @dev Increase the amount of tokens that an owner allowedto a spender.\n * approve should be called when _allowed[msg.sender][spender] == 0. To increment\n * allowed value is better to use thisfunction to avoid 2 calls (and wait until\n * the first transaction is mined)\n * From MonolithDAO Token.sol\n * Emits an Approvalevent.\n * @param spender The address which will spend the funds.\n * @param addedValue The amount of tokens to increase the allowance by.\n */\n function increaseAllowance(address spender, uint256 addedValue) public whenNotPaused returns (bool) {\n _approve(msg.sender,spender, _allowed[msg.sender][spender].add(addedValue));\n return true;\n }\n\n /**\n * @dev Decrease the amount of tokens that anowner allowed to a spender.\n * approve should be called when _allowed[msg.sender][spender] == 0. To decrement\n * allowed value is betterto use this function to avoid 2 calls (and wait until\n * the first transaction is mined)\n * From MonolithDAO Token.sol\n * Emits anApproval event.\n * @param spender The address which will spend the funds.\n * @param subtractedValue The amount of tokens to decrease theallowance by.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public whenNotPaused returns (bool) {\n_approve(msg.sender, spender, _allowed[msg.sender][spender].sub(subtractedValue));\n return true;\n }\n\n // OWNER FUNCTIONALITY\n\n/**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(msg.sender == owner,\"onlyOwner\");\n _;\n }\n\n /**\n * @dev Allows the current owner to transfer control of the contract to a newOwner.\n *@param _newOwner The address to transfer ownership to.\n */\n function transferOwnership(address _newOwner) public onlyOwner {\nrequire(_newOwner != address(0), \"cannot transfer ownership to address zero\");\n emit OwnershipTransferred(owner, _newOwner);\nowner = _newOwner;\n }\n\n // PAUSABILITY FUNCTIONALITY\n\n /**\n * @dev Modifier to make a function callable only when the contractis not paused.\n */\n modifier whenNotPaused() {\n require(!paused, \"whenNotPaused\");\n _;\n }\n\n /**\n * @devcalled by the owner to pause, triggers stopped state\n */\n function pause() public onlyOwner {\n require(!paused, \"already paused\");\n paused = true;\n emit Pause();\n }\n\n /**\n * @dev called by the owner to unpause, returns to normal state\n */\nfunction unpause() public onlyOwner {\n require(paused, \"already unpaused\");\n paused = false;\n emit Unpause();\n}\n\n // LAW ENFORCEMENT FUNCTIONALITY\n\n /**\n * @dev Sets a new law enforcement role address.\n * @param _newLawEnforcementRoleThe new address allowed to freeze/unfreeze addresses and seize their tokens.\n */\n function setLawEnforcementRole(address_newLawEnforcementRole) public {\n require(_newLawEnforcementRole != address(0),\"lawEnforcementRole cannot address(0)\");\n require(msg.sender == lawEnforcementRole || msg.sender == owner, \"only lawEnforcementRole or Owner\");\n emit LawEnforcementRoleSet(lawEnforcementRole, _newLawEnforcementRole);\n lawEnforcementRole = _newLawEnforcementRole;\n }\n\n modifier onlyLawEnforcementRole(){\n require(msg.sender == lawEnforcementRole, \"onlyLawEnforcementRole\");\n _;\n }\n\n /**\n * @dev Freezes an addressbalance from being transferred.\n * @param _addr The new address to freeze.\n */\n function freeze(address _addr) publiconlyLawEnforcementRole {\n require(!frozen[_addr], \"address already frozen\");\n frozen[_addr] = true;\n emit AddressFrozen(_addr);\n }\n\n /**\n * @dev Unfreezes an address balance allowing transfer.\n * @param _addr The new address to unfreeze.\n*/\n function unfreeze(address _addr) public onlyLawEnforcementRole {\n require(frozen[_addr], \"address already unfrozen\");\nfrozen[_addr] = false;\n emit AddressUnfrozen(_addr);\n }\n\n /**\n * @dev Wipes the balance of a frozen address, burning thetokens\n * @param _addr The new frozen address to wipe.\n */\n function wipeFrozenAddress(address _addr) public onlyLawEnforcementRole{\n require(frozen[_addr], \"address is not frozen\");\n uint256 _balance = balances[_addr];\n balances[_addr] = 0;\ntotalSupply_ = totalSupply_.sub(_balance);\n emit FrozenAddressWiped(_addr);\n emit SupplyDecreased(_addr, _balance);\n emitTransfer(_addr, address(0), _balance);\n }\n\n /**\n * @dev Gets the balance of the specified address.\n * @param _addr The address tocheck if frozen.\n * @return A bool representing whether the given address is frozen.\n */\n function isFrozen(address _addr) public viewreturns (bool) {\n return frozen[_addr];\n }\n\n // SUPPLY CONTROL FUNCTIONALITY\n\n /**\n * @dev Sets a new supply controlleraddress.\n * @param _newSupplyController The address allowed to burn/mint tokens to control supply.\n */\n function setSupplyController(address _newSupplyController) public {\n require(msg.sender == supplyController || msg.sender == owner, \"only SupplyController or Owner\");\n require(_newSupplyController != address(0), \"cannot set supply controller to address zero\");\n emit SupplyControllerSet(supplyController, _newSupplyController);\n supplyController = _newSupplyController;\n }\n\n modifier onlySupplyController() {\nrequire(msg.sender == supplyController, \"onlySupplyController\");\n _;\n }\n\n /**\n * @dev Increases the total supply byminting the specified number of tokens to the supply controller account.\n * @param _value The number of tokens to add.\n * @return Aboolean that indicates if the operation was successful.\n */\n function increaseSupply(uint256 _value) public onlySupplyController returns(bool success) {\n totalSupply_ = totalSupply_.add(_value);\n balances[supplyController] = balances[supplyController].add(_value);\nemit SupplyIncreased(supplyController, _value);\n emit Transfer(address(0), supplyController, _value);\n return true;\n}\n\n /**\n * @dev Decreases the total supply by burning the specified number of tokens from the supply controller account.\n * @param_value The number of tokens to remove.\n * @return A boolean that indicates if the operation was successful.\n */\n functiondecreaseSupply(uint256 _value) public onlySupplyController returns (bool success) {\n require(_value \u003c= balances[supplyController],\"not enough supply\");\n balances[supplyController] = balances[supplyController].sub(_value);\n totalSupply_ = totalSupply_.sub(_value);\n emit SupplyDecreased(supplyController, _value);\n emit Transfer(supplyController, address(0), _value);\n returntrue;\n }\n}\n"},"SafeMath.sol":{"content":"pragma solidity ^0.4.24;\n\n\n/**\n * @title SafeMath\n * @dev Math operations with safety checksthat throw on error\n */\nlibrary SafeMath {\n /**\n * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater thanminuend).\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b \u003c= a);\n uint256 c = a -b;\n\n return c;\n }\n\n /**\n * @dev Adds two numbers, reverts on overflow.\n */\n function add(uint256 a, uint256 b)internal pure returns (uint256) {\n uint256 c = a + b;\n require(c \u003e= a);\n\n return c;\n }\n}\n"}}