Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
| Transaction Hash |
Method
|
Block
|
From
|
To
|
Amount
|
||||
|---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
To
|
Amount
|
||
|---|---|---|---|---|---|---|---|
| Get Latest | 1372843 | 102 days ago | 0 ETH | ||||
| New Version | 185353 | 279 days ago | 0 ETH | ||||
| CREATE_VERSION_R... | 1430 | 307 days ago | 0 ETH | ||||
| CREATE_VERSION_R... | 1430 | 307 days ago | 0 ETH | ||||
| CREATE_VERSION_R... | 1430 | 307 days ago | 0 ETH | ||||
| New Version | 1430 | 307 days ago | 0 ETH | ||||
| CREATE_VERSION_R... | 1430 | 307 days ago | 0 ETH | ||||
| Initialize | 1430 | 307 days ago | 0 ETH | ||||
| CREATE_VERSION_R... | 761 | 307 days ago | 0 ETH | ||||
| Get Latest | 727 | 307 days ago | 0 ETH | ||||
| Get Latest | 727 | 307 days ago | 0 ETH | ||||
| Get Latest | 727 | 307 days ago | 0 ETH | ||||
| Get Latest | 727 | 307 days ago | 0 ETH | ||||
| Get Latest | 727 | 307 days ago | 0 ETH | ||||
| Get Latest | 727 | 307 days ago | 0 ETH | ||||
| Get Latest | 727 | 307 days ago | 0 ETH | ||||
| Get Latest | 727 | 307 days ago | 0 ETH | ||||
| CREATE_VERSION_R... | 725 | 307 days ago | 0 ETH | ||||
| CREATE_VERSION_R... | 725 | 307 days ago | 0 ETH | ||||
| CREATE_VERSION_R... | 725 | 307 days ago | 0 ETH | ||||
| New Version | 725 | 307 days ago | 0 ETH | ||||
| CREATE_VERSION_R... | 725 | 307 days ago | 0 ETH | ||||
| Initialize | 725 | 307 days ago | 0 ETH | ||||
| CREATE_VERSION_R... | 725 | 307 days ago | 0 ETH | ||||
| CREATE_VERSION_R... | 725 | 307 days ago | 0 ETH |
Loading...
Loading
Loading...
Loading
Contract Name:
Repo
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
Yes with 200 runs
Other Settings:
constantinople EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity 0.4.24;
import "../apps/AragonApp.sol";
/* solium-disable function-order */
// Allow public initialize() to be first
contract Repo is AragonApp {
/* Hardcoded constants to save gas
bytes32 public constant CREATE_VERSION_ROLE = keccak256("CREATE_VERSION_ROLE");
*/
bytes32 public constant CREATE_VERSION_ROLE = 0x1f56cfecd3595a2e6cc1a7e6cb0b20df84cdbd92eff2fee554e70e4e45a9a7d8;
string private constant ERROR_INVALID_BUMP = "REPO_INVALID_BUMP";
string private constant ERROR_INVALID_VERSION = "REPO_INVALID_VERSION";
string private constant ERROR_INEXISTENT_VERSION = "REPO_INEXISTENT_VERSION";
struct Version {
uint16[3] semanticVersion;
address contractAddress;
bytes contentURI;
}
uint256 internal versionsNextIndex;
mapping (uint256 => Version) internal versions;
mapping (bytes32 => uint256) internal versionIdForSemantic;
mapping (address => uint256) internal latestVersionIdForContract;
event NewVersion(uint256 versionId, uint16[3] semanticVersion);
/**
* @dev Initialize can only be called once. It saves the block number in which it was initialized.
* @notice Initialize this Repo
*/
function initialize() public onlyInit {
initialized();
versionsNextIndex = 1;
}
/**
* @notice Create new version with contract `_contractAddress` and content `@fromHex(_contentURI)`
* @param _newSemanticVersion Semantic version for new repo version
* @param _contractAddress address for smart contract logic for version (if set to 0, it uses last versions' contractAddress)
* @param _contentURI External URI for fetching new version's content
*/
function newVersion(
uint16[3] _newSemanticVersion,
address _contractAddress,
bytes _contentURI
) public auth(CREATE_VERSION_ROLE)
{
address contractAddress = _contractAddress;
uint256 lastVersionIndex = versionsNextIndex - 1;
uint16[3] memory lastSematicVersion;
if (lastVersionIndex > 0) {
Version storage lastVersion = versions[lastVersionIndex];
lastSematicVersion = lastVersion.semanticVersion;
if (contractAddress == address(0)) {
contractAddress = lastVersion.contractAddress;
}
// Only allows smart contract change on major version bumps
require(
lastVersion.contractAddress == contractAddress || _newSemanticVersion[0] > lastVersion.semanticVersion[0],
ERROR_INVALID_VERSION
);
}
require(isValidBump(lastSematicVersion, _newSemanticVersion), ERROR_INVALID_BUMP);
uint256 versionId = versionsNextIndex++;
versions[versionId] = Version(_newSemanticVersion, contractAddress, _contentURI);
versionIdForSemantic[semanticVersionHash(_newSemanticVersion)] = versionId;
latestVersionIdForContract[contractAddress] = versionId;
emit NewVersion(versionId, _newSemanticVersion);
}
function getLatest() public view returns (uint16[3] semanticVersion, address contractAddress, bytes contentURI) {
return getByVersionId(versionsNextIndex - 1);
}
function getLatestForContractAddress(address _contractAddress)
public
view
returns (uint16[3] semanticVersion, address contractAddress, bytes contentURI)
{
return getByVersionId(latestVersionIdForContract[_contractAddress]);
}
function getBySemanticVersion(uint16[3] _semanticVersion)
public
view
returns (uint16[3] semanticVersion, address contractAddress, bytes contentURI)
{
return getByVersionId(versionIdForSemantic[semanticVersionHash(_semanticVersion)]);
}
function getByVersionId(uint _versionId) public view returns (uint16[3] semanticVersion, address contractAddress, bytes contentURI) {
require(_versionId > 0 && _versionId < versionsNextIndex, ERROR_INEXISTENT_VERSION);
Version storage version = versions[_versionId];
return (version.semanticVersion, version.contractAddress, version.contentURI);
}
function getVersionsCount() public view returns (uint256) {
return versionsNextIndex - 1;
}
function isValidBump(uint16[3] _oldVersion, uint16[3] _newVersion) public pure returns (bool) {
bool hasBumped;
uint i = 0;
while (i < 3) {
if (hasBumped) {
if (_newVersion[i] != 0) {
return false;
}
} else if (_newVersion[i] != _oldVersion[i]) {
if (_oldVersion[i] > _newVersion[i] || _newVersion[i] - _oldVersion[i] != 1) {
return false;
}
hasBumped = true;
}
i++;
}
return hasBumped;
}
function semanticVersionHash(uint16[3] version) internal pure returns (bytes32) {
return keccak256(abi.encodePacked(version[0], version[1], version[2]));
}
}/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.4.24;
contract ACLSyntaxSugar {
function arr() internal pure returns (uint256[]) {
return new uint256[](0);
}
function arr(bytes32 _a) internal pure returns (uint256[] r) {
return arr(uint256(_a));
}
function arr(bytes32 _a, bytes32 _b) internal pure returns (uint256[] r) {
return arr(uint256(_a), uint256(_b));
}
function arr(address _a) internal pure returns (uint256[] r) {
return arr(uint256(_a));
}
function arr(address _a, address _b) internal pure returns (uint256[] r) {
return arr(uint256(_a), uint256(_b));
}
function arr(address _a, uint256 _b, uint256 _c) internal pure returns (uint256[] r) {
return arr(uint256(_a), _b, _c);
}
function arr(address _a, uint256 _b, uint256 _c, uint256 _d) internal pure returns (uint256[] r) {
return arr(uint256(_a), _b, _c, _d);
}
function arr(address _a, uint256 _b) internal pure returns (uint256[] r) {
return arr(uint256(_a), uint256(_b));
}
function arr(address _a, address _b, uint256 _c, uint256 _d, uint256 _e) internal pure returns (uint256[] r) {
return arr(uint256(_a), uint256(_b), _c, _d, _e);
}
function arr(address _a, address _b, address _c) internal pure returns (uint256[] r) {
return arr(uint256(_a), uint256(_b), uint256(_c));
}
function arr(address _a, address _b, uint256 _c) internal pure returns (uint256[] r) {
return arr(uint256(_a), uint256(_b), uint256(_c));
}
function arr(uint256 _a) internal pure returns (uint256[] r) {
r = new uint256[](1);
r[0] = _a;
}
function arr(uint256 _a, uint256 _b) internal pure returns (uint256[] r) {
r = new uint256[](2);
r[0] = _a;
r[1] = _b;
}
function arr(uint256 _a, uint256 _b, uint256 _c) internal pure returns (uint256[] r) {
r = new uint256[](3);
r[0] = _a;
r[1] = _b;
r[2] = _c;
}
function arr(uint256 _a, uint256 _b, uint256 _c, uint256 _d) internal pure returns (uint256[] r) {
r = new uint256[](4);
r[0] = _a;
r[1] = _b;
r[2] = _c;
r[3] = _d;
}
function arr(uint256 _a, uint256 _b, uint256 _c, uint256 _d, uint256 _e) internal pure returns (uint256[] r) {
r = new uint256[](5);
r[0] = _a;
r[1] = _b;
r[2] = _c;
r[3] = _d;
r[4] = _e;
}
}
contract ACLHelpers {
function decodeParamOp(uint256 _x) internal pure returns (uint8 b) {
return uint8(_x >> (8 * 30));
}
function decodeParamId(uint256 _x) internal pure returns (uint8 b) {
return uint8(_x >> (8 * 31));
}
function decodeParamsList(uint256 _x) internal pure returns (uint32 a, uint32 b, uint32 c) {
a = uint32(_x);
b = uint32(_x >> (8 * 4));
c = uint32(_x >> (8 * 8));
}
}/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.4.24;
interface IACL {
function initialize(address permissionsCreator) external;
// TODO: this should be external
// See https://github.com/ethereum/solidity/issues/4832
function hasPermission(address who, address where, bytes32 what, bytes how) public view returns (bool);
}/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.4.24;
import "../common/UnstructuredStorage.sol";
import "../kernel/IKernel.sol";
contract AppStorage {
using UnstructuredStorage for bytes32;
/* Hardcoded constants to save gas
bytes32 internal constant KERNEL_POSITION = keccak256("aragonOS.appStorage.kernel");
bytes32 internal constant APP_ID_POSITION = keccak256("aragonOS.appStorage.appId");
*/
bytes32 internal constant KERNEL_POSITION = 0x4172f0f7d2289153072b0a6ca36959e0cbe2efc3afe50fc81636caa96338137b;
bytes32 internal constant APP_ID_POSITION = 0xd625496217aa6a3453eecb9c3489dc5a53e6c67b444329ea2b2cbc9ff547639b;
function kernel() public view returns (IKernel) {
return IKernel(KERNEL_POSITION.getStorageAddress());
}
function appId() public view returns (bytes32) {
return APP_ID_POSITION.getStorageBytes32();
}
function setKernel(IKernel _kernel) internal {
KERNEL_POSITION.setStorageAddress(address(_kernel));
}
function setAppId(bytes32 _appId) internal {
APP_ID_POSITION.setStorageBytes32(_appId);
}
}/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.4.24;
import "./AppStorage.sol";
import "../acl/ACLSyntaxSugar.sol";
import "../common/Autopetrified.sol";
import "../common/ConversionHelpers.sol";
import "../common/ReentrancyGuard.sol";
import "../common/VaultRecoverable.sol";
import "../evmscript/EVMScriptRunner.sol";
// Contracts inheriting from AragonApp are, by default, immediately petrified upon deployment so
// that they can never be initialized.
// Unless overriden, this behaviour enforces those contracts to be usable only behind an AppProxy.
// ReentrancyGuard, EVMScriptRunner, and ACLSyntaxSugar are not directly used by this contract, but
// are included so that they are automatically usable by subclassing contracts
contract AragonApp is AppStorage, Autopetrified, VaultRecoverable, ReentrancyGuard, EVMScriptRunner, ACLSyntaxSugar {
string private constant ERROR_AUTH_FAILED = "APP_AUTH_FAILED";
modifier auth(bytes32 _role) {
require(canPerform(msg.sender, _role, new uint256[](0)), ERROR_AUTH_FAILED);
_;
}
modifier authP(bytes32 _role, uint256[] _params) {
require(canPerform(msg.sender, _role, _params), ERROR_AUTH_FAILED);
_;
}
/**
* @dev Check whether an action can be performed by a sender for a particular role on this app
* @param _sender Sender of the call
* @param _role Role on this app
* @param _params Permission params for the role
* @return Boolean indicating whether the sender has the permissions to perform the action.
* Always returns false if the app hasn't been initialized yet.
*/
function canPerform(address _sender, bytes32 _role, uint256[] _params) public view returns (bool) {
if (!hasInitialized()) {
return false;
}
IKernel linkedKernel = kernel();
if (address(linkedKernel) == address(0)) {
return false;
}
return linkedKernel.hasPermission(
_sender,
address(this),
_role,
ConversionHelpers.dangerouslyCastUintArrayToBytes(_params)
);
}
/**
* @dev Get the recovery vault for the app
* @return Recovery vault address for the app
*/
function getRecoveryVault() public view returns (address) {
// Funds recovery via a vault is only available when used with a kernel
return kernel().getRecoveryVault(); // if kernel is not set, it will revert
}
}/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.4.24;
import "./Petrifiable.sol";
contract Autopetrified is Petrifiable {
constructor() public {
// Immediately petrify base (non-proxy) instances of inherited contracts on deploy.
// This renders them uninitializable (and unusable without a proxy).
petrify();
}
}pragma solidity ^0.4.24;
library ConversionHelpers {
string private constant ERROR_IMPROPER_LENGTH = "CONVERSION_IMPROPER_LENGTH";
function dangerouslyCastUintArrayToBytes(uint256[] memory _input) internal pure returns (bytes memory output) {
// Force cast the uint256[] into a bytes array, by overwriting its length
// Note that the bytes array doesn't need to be initialized as we immediately overwrite it
// with the input and a new length. The input becomes invalid from this point forward.
uint256 byteLength = _input.length * 32;
assembly {
output := _input
mstore(output, byteLength)
}
}
function dangerouslyCastBytesToUintArray(bytes memory _input) internal pure returns (uint256[] memory output) {
// Force cast the bytes array into a uint256[], by overwriting its length
// Note that the uint256[] doesn't need to be initialized as we immediately overwrite it
// with the input and a new length. The input becomes invalid from this point forward.
uint256 intsLength = _input.length / 32;
require(_input.length == intsLength * 32, ERROR_IMPROPER_LENGTH);
assembly {
output := _input
mstore(output, intsLength)
}
}
}/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.4.24;
// aragonOS and aragon-apps rely on address(0) to denote native ETH, in
// contracts where both tokens and ETH are accepted
contract EtherTokenConstant {
address internal constant ETH = address(0);
}/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.4.24;
import "./TimeHelpers.sol";
import "./UnstructuredStorage.sol";
contract Initializable is TimeHelpers {
using UnstructuredStorage for bytes32;
// keccak256("aragonOS.initializable.initializationBlock")
bytes32 internal constant INITIALIZATION_BLOCK_POSITION = 0xebb05b386a8d34882b8711d156f463690983dc47815980fb82aeeff1aa43579e;
string private constant ERROR_ALREADY_INITIALIZED = "INIT_ALREADY_INITIALIZED";
string private constant ERROR_NOT_INITIALIZED = "INIT_NOT_INITIALIZED";
modifier onlyInit {
require(getInitializationBlock() == 0, ERROR_ALREADY_INITIALIZED);
_;
}
modifier isInitialized {
require(hasInitialized(), ERROR_NOT_INITIALIZED);
_;
}
/**
* @return Block number in which the contract was initialized
*/
function getInitializationBlock() public view returns (uint256) {
return INITIALIZATION_BLOCK_POSITION.getStorageUint256();
}
/**
* @return Whether the contract has been initialized by the time of the current block
*/
function hasInitialized() public view returns (bool) {
uint256 initializationBlock = getInitializationBlock();
return initializationBlock != 0 && getBlockNumber() >= initializationBlock;
}
/**
* @dev Function to be called by top level contract after initialization has finished.
*/
function initialized() internal onlyInit {
INITIALIZATION_BLOCK_POSITION.setStorageUint256(getBlockNumber());
}
/**
* @dev Function to be called by top level contract after initialization to enable the contract
* at a future block number rather than immediately.
*/
function initializedAt(uint256 _blockNumber) internal onlyInit {
INITIALIZATION_BLOCK_POSITION.setStorageUint256(_blockNumber);
}
}/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.4.24;
contract IsContract {
/*
* NOTE: this should NEVER be used for authentication
* (see pitfalls: https://github.com/fergarrui/ethereum-security/tree/master/contracts/extcodesize).
*
* This is only intended to be used as a sanity check that an address is actually a contract,
* RATHER THAN an address not being a contract.
*/
function isContract(address _target) internal view returns (bool) {
if (_target == address(0)) {
return false;
}
uint256 size;
assembly { size := extcodesize(_target) }
return size > 0;
}
}/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.4.24;
interface IVaultRecoverable {
event RecoverToVault(address indexed vault, address indexed token, uint256 amount);
function transferToVault(address token) external;
function allowRecoverability(address token) external view returns (bool);
function getRecoveryVault() external view returns (address);
}/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.4.24;
import "./Initializable.sol";
contract Petrifiable is Initializable {
// Use block UINT256_MAX (which should be never) as the initializable date
uint256 internal constant PETRIFIED_BLOCK = uint256(-1);
function isPetrified() public view returns (bool) {
return getInitializationBlock() == PETRIFIED_BLOCK;
}
/**
* @dev Function to be called by top level contract to prevent being initialized.
* Useful for freezing base contracts when they're used behind proxies.
*/
function petrify() internal onlyInit {
initializedAt(PETRIFIED_BLOCK);
}
}/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.4.24;
import "../common/UnstructuredStorage.sol";
contract ReentrancyGuard {
using UnstructuredStorage for bytes32;
/* Hardcoded constants to save gas
bytes32 internal constant REENTRANCY_MUTEX_POSITION = keccak256("aragonOS.reentrancyGuard.mutex");
*/
bytes32 private constant REENTRANCY_MUTEX_POSITION = 0xe855346402235fdd185c890e68d2c4ecad599b88587635ee285bce2fda58dacb;
string private constant ERROR_REENTRANT = "REENTRANCY_REENTRANT_CALL";
modifier nonReentrant() {
// Ensure mutex is unlocked
require(!REENTRANCY_MUTEX_POSITION.getStorageBool(), ERROR_REENTRANT);
// Lock mutex before function call
REENTRANCY_MUTEX_POSITION.setStorageBool(true);
// Perform function call
_;
// Unlock mutex after function call
REENTRANCY_MUTEX_POSITION.setStorageBool(false);
}
}// Inspired by AdEx (https://github.com/AdExNetwork/adex-protocol-eth/blob/b9df617829661a7518ee10f4cb6c4108659dd6d5/contracts/libs/SafeERC20.sol)
// and 0x (https://github.com/0xProject/0x-monorepo/blob/737d1dc54d72872e24abce5a1dbe1b66d35fa21a/contracts/protocol/contracts/protocol/AssetProxy/ERC20Proxy.sol#L143)
pragma solidity ^0.4.24;
import "../lib/token/ERC20.sol";
library SafeERC20 {
// Before 0.5, solidity has a mismatch between `address.transfer()` and `token.transfer()`:
// https://github.com/ethereum/solidity/issues/3544
bytes4 private constant TRANSFER_SELECTOR = 0xa9059cbb;
string private constant ERROR_TOKEN_BALANCE_REVERTED = "SAFE_ERC_20_BALANCE_REVERTED";
string private constant ERROR_TOKEN_ALLOWANCE_REVERTED = "SAFE_ERC_20_ALLOWANCE_REVERTED";
function invokeAndCheckSuccess(address _addr, bytes memory _calldata)
private
returns (bool)
{
bool ret;
assembly {
let ptr := mload(0x40) // free memory pointer
let success := call(
gas, // forward all gas
_addr, // address
0, // no value
add(_calldata, 0x20), // calldata start
mload(_calldata), // calldata length
ptr, // write output over free memory
0x20 // uint256 return
)
if gt(success, 0) {
// Check number of bytes returned from last function call
switch returndatasize
// No bytes returned: assume success
case 0 {
ret := 1
}
// 32 bytes returned: check if non-zero
case 0x20 {
// Only return success if returned data was true
// Already have output in ptr
ret := eq(mload(ptr), 1)
}
// Not sure what was returned: don't mark as success
default { }
}
}
return ret;
}
function staticInvoke(address _addr, bytes memory _calldata)
private
view
returns (bool, uint256)
{
bool success;
uint256 ret;
assembly {
let ptr := mload(0x40) // free memory pointer
success := staticcall(
gas, // forward all gas
_addr, // address
add(_calldata, 0x20), // calldata start
mload(_calldata), // calldata length
ptr, // write output over free memory
0x20 // uint256 return
)
if gt(success, 0) {
ret := mload(ptr)
}
}
return (success, ret);
}
/**
* @dev Same as a standards-compliant ERC20.transfer() that never reverts (returns false).
* Note that this makes an external call to the token.
*/
function safeTransfer(ERC20 _token, address _to, uint256 _amount) internal returns (bool) {
bytes memory transferCallData = abi.encodeWithSelector(
TRANSFER_SELECTOR,
_to,
_amount
);
return invokeAndCheckSuccess(_token, transferCallData);
}
/**
* @dev Same as a standards-compliant ERC20.transferFrom() that never reverts (returns false).
* Note that this makes an external call to the token.
*/
function safeTransferFrom(ERC20 _token, address _from, address _to, uint256 _amount) internal returns (bool) {
bytes memory transferFromCallData = abi.encodeWithSelector(
_token.transferFrom.selector,
_from,
_to,
_amount
);
return invokeAndCheckSuccess(_token, transferFromCallData);
}
/**
* @dev Same as a standards-compliant ERC20.approve() that never reverts (returns false).
* Note that this makes an external call to the token.
*/
function safeApprove(ERC20 _token, address _spender, uint256 _amount) internal returns (bool) {
bytes memory approveCallData = abi.encodeWithSelector(
_token.approve.selector,
_spender,
_amount
);
return invokeAndCheckSuccess(_token, approveCallData);
}
/**
* @dev Static call into ERC20.balanceOf().
* Reverts if the call fails for some reason (should never fail).
*/
function staticBalanceOf(ERC20 _token, address _owner) internal view returns (uint256) {
bytes memory balanceOfCallData = abi.encodeWithSelector(
_token.balanceOf.selector,
_owner
);
(bool success, uint256 tokenBalance) = staticInvoke(_token, balanceOfCallData);
require(success, ERROR_TOKEN_BALANCE_REVERTED);
return tokenBalance;
}
/**
* @dev Static call into ERC20.allowance().
* Reverts if the call fails for some reason (should never fail).
*/
function staticAllowance(ERC20 _token, address _owner, address _spender) internal view returns (uint256) {
bytes memory allowanceCallData = abi.encodeWithSelector(
_token.allowance.selector,
_owner,
_spender
);
(bool success, uint256 allowance) = staticInvoke(_token, allowanceCallData);
require(success, ERROR_TOKEN_ALLOWANCE_REVERTED);
return allowance;
}
/**
* @dev Static call into ERC20.totalSupply().
* Reverts if the call fails for some reason (should never fail).
*/
function staticTotalSupply(ERC20 _token) internal view returns (uint256) {
bytes memory totalSupplyCallData = abi.encodeWithSelector(_token.totalSupply.selector);
(bool success, uint256 totalSupply) = staticInvoke(_token, totalSupplyCallData);
require(success, ERROR_TOKEN_ALLOWANCE_REVERTED);
return totalSupply;
}
}/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.4.24;
import "./Uint256Helpers.sol";
contract TimeHelpers {
using Uint256Helpers for uint256;
/**
* @dev Returns the current block number.
* Using a function rather than `block.number` allows us to easily mock the block number in
* tests.
*/
function getBlockNumber() internal view returns (uint256) {
return block.number;
}
/**
* @dev Returns the current block number, converted to uint64.
* Using a function rather than `block.number` allows us to easily mock the block number in
* tests.
*/
function getBlockNumber64() internal view returns (uint64) {
return getBlockNumber().toUint64();
}
/**
* @dev Returns the current timestamp.
* Using a function rather than `block.timestamp` allows us to easily mock it in
* tests.
*/
function getTimestamp() internal view returns (uint256) {
return block.timestamp; // solium-disable-line security/no-block-members
}
/**
* @dev Returns the current timestamp, converted to uint64.
* Using a function rather than `block.timestamp` allows us to easily mock it in
* tests.
*/
function getTimestamp64() internal view returns (uint64) {
return getTimestamp().toUint64();
}
}pragma solidity ^0.4.24;
library Uint256Helpers {
uint256 private constant MAX_UINT64 = uint64(-1);
string private constant ERROR_NUMBER_TOO_BIG = "UINT64_NUMBER_TOO_BIG";
function toUint64(uint256 a) internal pure returns (uint64) {
require(a <= MAX_UINT64, ERROR_NUMBER_TOO_BIG);
return uint64(a);
}
}/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.4.24;
library UnstructuredStorage {
function getStorageBool(bytes32 position) internal view returns (bool data) {
assembly { data := sload(position) }
}
function getStorageAddress(bytes32 position) internal view returns (address data) {
assembly { data := sload(position) }
}
function getStorageBytes32(bytes32 position) internal view returns (bytes32 data) {
assembly { data := sload(position) }
}
function getStorageUint256(bytes32 position) internal view returns (uint256 data) {
assembly { data := sload(position) }
}
function setStorageBool(bytes32 position, bool data) internal {
assembly { sstore(position, data) }
}
function setStorageAddress(bytes32 position, address data) internal {
assembly { sstore(position, data) }
}
function setStorageBytes32(bytes32 position, bytes32 data) internal {
assembly { sstore(position, data) }
}
function setStorageUint256(bytes32 position, uint256 data) internal {
assembly { sstore(position, data) }
}
}/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.4.24;
import "../lib/token/ERC20.sol";
import "./EtherTokenConstant.sol";
import "./IsContract.sol";
import "./IVaultRecoverable.sol";
import "./SafeERC20.sol";
contract VaultRecoverable is IVaultRecoverable, EtherTokenConstant, IsContract {
using SafeERC20 for ERC20;
string private constant ERROR_DISALLOWED = "RECOVER_DISALLOWED";
string private constant ERROR_VAULT_NOT_CONTRACT = "RECOVER_VAULT_NOT_CONTRACT";
string private constant ERROR_TOKEN_TRANSFER_FAILED = "RECOVER_TOKEN_TRANSFER_FAILED";
/**
* @notice Send funds to recovery Vault. This contract should never receive funds,
* but in case it does, this function allows one to recover them.
* @param _token Token balance to be sent to recovery vault.
*/
function transferToVault(address _token) external {
require(allowRecoverability(_token), ERROR_DISALLOWED);
address vault = getRecoveryVault();
require(isContract(vault), ERROR_VAULT_NOT_CONTRACT);
uint256 balance;
if (_token == ETH) {
balance = address(this).balance;
vault.transfer(balance);
} else {
ERC20 token = ERC20(_token);
balance = token.staticBalanceOf(this);
require(token.safeTransfer(vault, balance), ERROR_TOKEN_TRANSFER_FAILED);
}
emit RecoverToVault(vault, _token, balance);
}
/**
* @dev By default deriving from AragonApp makes it recoverable
* @param token Token address that would be recovered
* @return bool whether the app allows the recovery
*/
function allowRecoverability(address token) public view returns (bool) {
return true;
}
// Cast non-implemented interface to be public so we can use it internally
function getRecoveryVault() public view returns (address);
}/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.4.24;
import "./IEVMScriptExecutor.sol";
import "./IEVMScriptRegistry.sol";
import "../apps/AppStorage.sol";
import "../kernel/KernelConstants.sol";
import "../common/Initializable.sol";
contract EVMScriptRunner is AppStorage, Initializable, EVMScriptRegistryConstants, KernelNamespaceConstants {
string private constant ERROR_EXECUTOR_UNAVAILABLE = "EVMRUN_EXECUTOR_UNAVAILABLE";
string private constant ERROR_PROTECTED_STATE_MODIFIED = "EVMRUN_PROTECTED_STATE_MODIFIED";
/* This is manually crafted in assembly
string private constant ERROR_EXECUTOR_INVALID_RETURN = "EVMRUN_EXECUTOR_INVALID_RETURN";
*/
event ScriptResult(address indexed executor, bytes script, bytes input, bytes returnData);
function getEVMScriptExecutor(bytes _script) public view returns (IEVMScriptExecutor) {
return IEVMScriptExecutor(getEVMScriptRegistry().getScriptExecutor(_script));
}
function getEVMScriptRegistry() public view returns (IEVMScriptRegistry) {
address registryAddr = kernel().getApp(KERNEL_APP_ADDR_NAMESPACE, EVMSCRIPT_REGISTRY_APP_ID);
return IEVMScriptRegistry(registryAddr);
}
function runScript(bytes _script, bytes _input, address[] _blacklist)
internal
isInitialized
protectState
returns (bytes)
{
IEVMScriptExecutor executor = getEVMScriptExecutor(_script);
require(address(executor) != address(0), ERROR_EXECUTOR_UNAVAILABLE);
bytes4 sig = executor.execScript.selector;
bytes memory data = abi.encodeWithSelector(sig, _script, _input, _blacklist);
bytes memory output;
assembly {
let success := delegatecall(
gas, // forward all gas
executor, // address
add(data, 0x20), // calldata start
mload(data), // calldata length
0, // don't write output (we'll handle this ourselves)
0 // don't write output
)
output := mload(0x40) // free mem ptr get
switch success
case 0 {
// If the call errored, forward its full error data
returndatacopy(output, 0, returndatasize)
revert(output, returndatasize)
}
default {
switch gt(returndatasize, 0x3f)
case 0 {
// Need at least 0x40 bytes returned for properly ABI-encoded bytes values,
// revert with "EVMRUN_EXECUTOR_INVALID_RETURN"
// See remix: doing a `revert("EVMRUN_EXECUTOR_INVALID_RETURN")` always results in
// this memory layout
mstore(output, 0x08c379a000000000000000000000000000000000000000000000000000000000) // error identifier
mstore(add(output, 0x04), 0x0000000000000000000000000000000000000000000000000000000000000020) // starting offset
mstore(add(output, 0x24), 0x000000000000000000000000000000000000000000000000000000000000001e) // reason length
mstore(add(output, 0x44), 0x45564d52554e5f4558454355544f525f494e56414c49445f52455455524e0000) // reason
revert(output, 100) // 100 = 4 + 3 * 32 (error identifier + 3 words for the ABI encoded error)
}
default {
// Copy result
//
// Needs to perform an ABI decode for the expected `bytes` return type of
// `executor.execScript()` as solidity will automatically ABI encode the returned bytes as:
// [ position of the first dynamic length return value = 0x20 (32 bytes) ]
// [ output length (32 bytes) ]
// [ output content (N bytes) ]
//
// Perform the ABI decode by ignoring the first 32 bytes of the return data
let copysize := sub(returndatasize, 0x20)
returndatacopy(output, 0x20, copysize)
mstore(0x40, add(output, copysize)) // free mem ptr set
}
}
}
emit ScriptResult(address(executor), _script, _input, output);
return output;
}
modifier protectState {
address preKernel = address(kernel());
bytes32 preAppId = appId();
_; // exec
require(address(kernel()) == preKernel, ERROR_PROTECTED_STATE_MODIFIED);
require(appId() == preAppId, ERROR_PROTECTED_STATE_MODIFIED);
}
}/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.4.24;
interface IEVMScriptExecutor {
function execScript(bytes script, bytes input, address[] blacklist) external returns (bytes);
function executorType() external pure returns (bytes32);
}/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.4.24;
import "./IEVMScriptExecutor.sol";
contract EVMScriptRegistryConstants {
/* Hardcoded constants to save gas
bytes32 internal constant EVMSCRIPT_REGISTRY_APP_ID = apmNamehash("evmreg");
*/
bytes32 internal constant EVMSCRIPT_REGISTRY_APP_ID = 0xddbcfd564f642ab5627cf68b9b7d374fb4f8a36e941a75d89c87998cef03bd61;
}
interface IEVMScriptRegistry {
function addScriptExecutor(IEVMScriptExecutor executor) external returns (uint id);
function disableScriptExecutor(uint256 executorId) external;
// TODO: this should be external
// See https://github.com/ethereum/solidity/issues/4832
function getScriptExecutor(bytes script) public view returns (IEVMScriptExecutor);
}/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.4.24;
import "../acl/IACL.sol";
import "../common/IVaultRecoverable.sol";
interface IKernelEvents {
event SetApp(bytes32 indexed namespace, bytes32 indexed appId, address app);
}
// This should be an interface, but interfaces can't inherit yet :(
contract IKernel is IKernelEvents, IVaultRecoverable {
function acl() public view returns (IACL);
function hasPermission(address who, address where, bytes32 what, bytes how) public view returns (bool);
function setApp(bytes32 namespace, bytes32 appId, address app) public;
function getApp(bytes32 namespace, bytes32 appId) public view returns (address);
}/*
* SPDX-License-Identifier: MIT
*/
pragma solidity ^0.4.24;
contract KernelAppIds {
/* Hardcoded constants to save gas
bytes32 internal constant KERNEL_CORE_APP_ID = apmNamehash("kernel");
bytes32 internal constant KERNEL_DEFAULT_ACL_APP_ID = apmNamehash("acl");
bytes32 internal constant KERNEL_DEFAULT_VAULT_APP_ID = apmNamehash("vault");
*/
bytes32 internal constant KERNEL_CORE_APP_ID = 0x3b4bf6bf3ad5000ecf0f989d5befde585c6860fea3e574a4fab4c49d1c177d9c;
bytes32 internal constant KERNEL_DEFAULT_ACL_APP_ID = 0xe3262375f45a6e2026b7e7b18c2b807434f2508fe1a2a3dfb493c7df8f4aad6a;
bytes32 internal constant KERNEL_DEFAULT_VAULT_APP_ID = 0x7e852e0fcfce6551c13800f1e7476f982525c2b5277ba14b24339c68416336d1;
}
contract KernelNamespaceConstants {
/* Hardcoded constants to save gas
bytes32 internal constant KERNEL_CORE_NAMESPACE = keccak256("core");
bytes32 internal constant KERNEL_APP_BASES_NAMESPACE = keccak256("base");
bytes32 internal constant KERNEL_APP_ADDR_NAMESPACE = keccak256("app");
*/
bytes32 internal constant KERNEL_CORE_NAMESPACE = 0xc681a85306374a5ab27f0bbc385296a54bcd314a1948b6cf61c4ea1bc44bb9f8;
bytes32 internal constant KERNEL_APP_BASES_NAMESPACE = 0xf1f3eb40f5bc1ad1344716ced8b8a0431d840b5783aea1fd01786bc26f35ac0f;
bytes32 internal constant KERNEL_APP_ADDR_NAMESPACE = 0xd6f028ca0e8edb4a8c9757ca4fdccab25fa1e0317da1188108f7d2dee14902fb;
}// See https://github.com/OpenZeppelin/openzeppelin-solidity/blob/a9f910d34f0ab33a1ae5e714f69f9596a02b4d91/contracts/token/ERC20/ERC20.sol
pragma solidity ^0.4.24;
/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
*/
contract ERC20 {
function totalSupply() public view returns (uint256);
function balanceOf(address _who) public view returns (uint256);
function allowance(address _owner, address _spender)
public view returns (uint256);
function transfer(address _to, uint256 _value) public returns (bool);
function approve(address _spender, uint256 _value)
public returns (bool);
function transferFrom(address _from, address _to, uint256 _value)
public returns (bool);
event Transfer(
address indexed from,
address indexed to,
uint256 value
);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "constantinople",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract ABI
API[{"constant":true,"inputs":[],"name":"hasInitialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_script","type":"bytes"}],"name":"getEVMScriptExecutor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRecoveryVault","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_semanticVersion","type":"uint16[3]"}],"name":"getBySemanticVersion","outputs":[{"name":"semanticVersion","type":"uint16[3]"},{"name":"contractAddress","type":"address"},{"name":"contentURI","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newSemanticVersion","type":"uint16[3]"},{"name":"_contractAddress","type":"address"},{"name":"_contentURI","type":"bytes"}],"name":"newVersion","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_versionId","type":"uint256"}],"name":"getByVersionId","outputs":[{"name":"semanticVersion","type":"uint16[3]"},{"name":"contractAddress","type":"address"},{"name":"contentURI","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"}],"name":"allowRecoverability","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"appId","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getInitializationBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_contractAddress","type":"address"}],"name":"getLatestForContractAddress","outputs":[{"name":"semanticVersion","type":"uint16[3]"},{"name":"contractAddress","type":"address"},{"name":"contentURI","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"transferToVault","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_sender","type":"address"},{"name":"_role","type":"bytes32"},{"name":"_params","type":"uint256[]"}],"name":"canPerform","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getEVMScriptRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_oldVersion","type":"uint16[3]"},{"name":"_newVersion","type":"uint16[3]"}],"name":"isValidBump","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"CREATE_VERSION_ROLE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getLatest","outputs":[{"name":"semanticVersion","type":"uint16[3]"},{"name":"contractAddress","type":"address"},{"name":"contentURI","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getVersionsCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"kernel","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isPetrified","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"versionId","type":"uint256"},{"indexed":false,"name":"semanticVersion","type":"uint16[3]"}],"name":"NewVersion","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"executor","type":"address"},{"indexed":false,"name":"script","type":"bytes"},{"indexed":false,"name":"input","type":"bytes"},{"indexed":false,"name":"returnData","type":"bytes"}],"name":"ScriptResult","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"vault","type":"address"},{"indexed":true,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"RecoverToVault","type":"event"}]Contract Creation Code
6080604052620000146200001a60201b60201c565b62000231565b6200002a6200011c60201b60201c565b60408051808201909152601881527f494e49545f414c52454144595f494e495449414c495a454400000000000000006020820152901562000106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620000ca578181015183820152602001620000b0565b50505050905090810190601f168015620000f85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506200011a6000196200014f60201b60201c565b565b60006200014a60008051602062001bec83398151915260001b600019166200022960201b620014f11760201c565b905090565b6200015f6200011c60201b60201c565b60408051808201909152601881527f494e49545f414c52454144595f494e495449414c495a4544000000000000000060208201529015620001fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252838181518152602001915080519060200190808383600083811015620000ca578181015183820152602001620000b0565b506200022660008051602062001bec833981519152826200022d602090811b6200179817901c565b50565b5490565b9055565b6119ab80620002416000396000f3006080604052600436106100f55760003560e01c63ffffffff1680630803fac0146100fa5780632914b9bd1461012357806332f0a3b5146101985780634c3ba268146101ad57806373053410146102aa578063737e7d4f1461033a5780637e7db6e11461035257806380afdea8146103735780638129fc1c1461039a5780638b3dd749146103af5780639a6fe50c146103c45780639d4941d8146103e5578063a1658fad14610406578063a479e5081461046d578063a7bdf16e14610482578063aa61924a146104eb578063c36af46014610500578063c6d48e0d14610515578063d4aae0c41461052a578063de4796ed1461053f575b600080fd5b34801561010657600080fd5b5061010f610554565b604080519115158252519081900360200190f35b34801561012f57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261017c94369492936024939284019190819084018382808284375094975061057e9650505050505050565b60408051600160a060020a039092168252519081900360200190f35b3480156101a457600080fd5b5061017c610661565b3480156101b957600080fd5b506040805160608181019092526101f09136916004916064919083906003908390839080828437509396506106d795505050505050565b6040518084606080838360005b838110156102155781810151838201526020016101fd565b5050505090500183600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561026d578181015183820152602001610255565b50505050905090810190601f16801561029a5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b3480156102b657600080fd5b50604080516060818101909252610338913691600491606491908390600390839083908082843750506040805160208781013589018035601f81018390048302840183018552808452979a8935600160a060020a03169a9099909894019650919450908101925081908401838280828437509497506107169650505050505050565b005b34801561034657600080fd5b506101f0600435610b4b565b34801561035e57600080fd5b5061010f600160a060020a0360043516610d0a565b34801561037f57600080fd5b50610388610d10565b60408051918252519081900360200190f35b3480156103a657600080fd5b50610338610d40565b3480156103bb57600080fd5b50610388610ddd565b3480156103d057600080fd5b506101f0600160a060020a0360043516610e08565b3480156103f157600080fd5b50610338600160a060020a0360043516610e35565b34801561041257600080fd5b50604080516020600460443581810135838102808601850190965280855261010f958335600160a060020a03169560248035963696956064959394920192918291850190849080828437509497506110c49650505050505050565b34801561047957600080fd5b5061017c611211565b34801561048e57600080fd5b5060408051606081810190925261010f91369160049160649190839060039083908390808284375050604080516060818101909252949796958181019594509250600391508390839080828437509396506112c695505050505050565b3480156104f757600080fd5b506103886113b5565b34801561050c57600080fd5b506101f06113d9565b34801561052157600080fd5b506103886113fe565b34801561053657600080fd5b5061017c611408565b34801561054b57600080fd5b5061010f611433565b60008061055f610ddd565b90508015801590610577575080610574611446565b10155b91505b5090565b6000610588611211565b600160a060020a03166304bf2a7f836040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156105e35781810151838201526020016105cb565b50505050905090810190601f1680156106105780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b15801561062f57600080fd5b505af1158015610643573d6000803e3d6000fd5b505050506040513d602081101561065957600080fd5b505192915050565b600061066b611408565b600160a060020a03166332f0a3b56040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156106a557600080fd5b505af11580156106b9573d6000803e3d6000fd5b505050506040513d60208110156106cf57600080fd5b505190505b90565b6106df61181b565b60006060610709600260006106f38761144a565b8152602081019190915260400160002054610b4b565b9250925092509193909250565b60008061072161181b565b6040805160008082526020820190925281907f1f56cfecd3595a2e6cc1a7e6cb0b20df84cdbd92eff2fee554e70e4e45a9a7d89061076290339083906110c4565b60408051808201909152600f81527f4150505f415554485f4641494c4544000000000000000000000000000000000060208201529015156108245760405160e560020a62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b838110156107e95781810151838201526020016107d1565b50505050905090810190601f1680156108165780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508795506001600054039450600085111561096f57600085815260016020526040808220815160608101928390529095509185916003918390855b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161085f5790505093975050505050600160a060020a03861615156108c0576001830154600160a060020a031695505b6001830154600160a060020a03878116911614806108e757508254895161ffff9182169116115b60408051808201909152601481527f5245504f5f494e56414c49445f56455253494f4e000000000000000000000000602082015290151561096d5760405160e560020a62461bcd028152600401808060200182810382528381815181526020019150805190602001908083836000838110156107e95781810151838201526020016107d1565b505b610979848a6112c6565b60408051808201909152601181527f5245504f5f494e56414c49445f42554d5000000000000000000000000000000060208201529015156109ff5760405160e560020a62461bcd028152600401808060200182810382528381815181526020019150805190602001908083836000838110156107e95781810151838201526020016107d1565b506000805460018082018355604080516060810182528d8152600160a060020a038b166020808301919091528183018d905284865292909252909220825191945090610a4e908290600361183a565b5060208281015160018301805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0390921691909117905560408301518051610a9a92600285019201906118cc565b509050508160026000610aac8c61144a565b81526020808201929092526040908101600090812093909355600160a060020a038916835260038252808320859055518481527e3aea8189d1a0aa3ebdb05219cd4c2a663166706e949e9d6e8aa63718ca43fd9285928d92919082019083906060908190849084905b83811015610b2d578181015183820152602001610b15565b505050509050019250505060405180910390a1505050505050505050565b610b5361181b565b6000606060008085118015610b69575060005485105b60408051808201909152601781527f5245504f5f494e4558495354454e545f56455253494f4e0000000000000000006020820152901515610bef5760405160e560020a62461bcd028152600401808060200182810382528381815181526020019150805190602001908083836000838110156107e95781810151838201526020016107d1565b50506000848152600160208190526040808320918201548151606081019283905292938493600160a060020a039092169260028501929185916003918390855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411610c2f575050855460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152969950879550935085019150839050828015610cf55780601f10610cca57610100808354040283529160200191610cf5565b820191906000526020600020905b815481529060010190602001808311610cd857829003601f168201915b50505050509050935093509350509193909250565b50600190565b6000610d3b7fd625496217aa6a3453eecb9c3489dc5a53e6c67b444329ea2b2cbc9ff547639b6114f1565b905090565b610d48610ddd565b60408051808201909152601881527f494e49545f414c52454144595f494e495449414c495a4544000000000000000060208201529015610dcd5760405160e560020a62461bcd028152600401808060200182810382528381815181526020019150805190602001908083836000838110156107e95781810151838201526020016107d1565b50610dd66114f5565b6001600055565b6000610d3b7febb05b386a8d34882b8711d156f463690983dc47815980fb82aeeff1aa43579e6114f1565b610e1061181b565b600160a060020a03821660009081526003602052604081205460609061070990610b4b565b6000806000610e4384610d0a565b60408051808201909152601281527f5245434f5645525f444953414c4c4f57454400000000000000000000000000006020820152901515610ec95760405160e560020a62461bcd028152600401808060200182810382528381815181526020019150805190602001908083836000838110156107e95781810151838201526020016107d1565b50610ed2610661565b9250610edd836115c1565b60408051808201909152601a81527f5245434f5645525f5641554c545f4e4f545f434f4e54524143540000000000006020820152901515610f635760405160e560020a62461bcd028152600401808060200182810382528381815181526020019150805190602001908083836000838110156107e95781810151838201526020016107d1565b50600160a060020a0384161515610fb45760405130319250600160a060020a0384169083156108fc029084906000818181858888f19350505050158015610fae573d6000803e3d6000fd5b50611073565b5082610fcf600160a060020a0382163063ffffffff6115ee16565b9150610feb600160a060020a038216848463ffffffff61170316565b60408051808201909152601d81527f5245434f5645525f544f4b454e5f5452414e534645525f4641494c454400000060208201529015156110715760405160e560020a62461bcd028152600401808060200182810382528381815181526020019150805190602001908083836000838110156107e95781810151838201526020016107d1565b505b83600160a060020a031683600160a060020a03167f596caf56044b55fb8c4ca640089bbc2b63cae3e978b851f5745cbb7c5b288e02846040518082815260200191505060405180910390a350505050565b6000806110cf610554565b15156110de5760009150611209565b6110e6611408565b9050600160a060020a03811615156111015760009150611209565b80600160a060020a031663fdef910686308761111c8861178e565b60405163ffffffff861660e01b8152600160a060020a03808616600483019081529085166024830152604482018490526080606483019081528351608484015283519192909160a490910190602085019080838360005b8381101561118b578181015183820152602001611173565b50505050905090810190601f1680156111b85780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156111da57600080fd5b505af11580156111ee573d6000803e3d6000fd5b505050506040513d602081101561120457600080fd5b505191505b509392505050565b60008061121c611408565b604080517fbe00bbd80000000000000000000000000000000000000000000000000000000081527fd6f028ca0e8edb4a8c9757ca4fdccab25fa1e0317da1188108f7d2dee14902fb60048201527fddbcfd564f642ab5627cf68b9b7d374fb4f8a36e941a75d89c87998cef03bd6160248201529051600160a060020a03929092169163be00bbd8916044808201926020929091908290030181600087803b15801561062f57600080fd5b600080805b60038110156113a9578115611302578381600381106112e657fe5b602002015161ffff16156112fd57600092506113ad565b6113a1565b84816003811061130e57fe5b602002015161ffff1684826003811061132357fe5b602002015161ffff16146113a15783816003811061133d57fe5b602002015161ffff1685826003811061135257fe5b602002015161ffff16118061138e575084816003811061136e57fe5b602002015184826003811061137f57fe5b60200201510361ffff16600114155b1561139c57600092506113ad565b600191505b6001016112cb565b8192505b505092915050565b7f1f56cfecd3595a2e6cc1a7e6cb0b20df84cdbd92eff2fee554e70e4e45a9a7d881565b6113e161181b565b600060606113f3600160005403610b4b565b925092509250909192565b6000546000190190565b6000610d3b7f4172f0f7d2289153072b0a6ca36959e0cbe2efc3afe50fc81636caa96338137b6114f1565b6000600019611440610ddd565b14905090565b4390565b8051602080830151604080850151815161ffff95861660f090811b82870152938616841b6022820152941690911b6024840152805180840360060181526026909301908190528251600093928291908401908083835b602083106114bf5780518252601f1990920191602091820191016114a0565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095945050505050565b5490565b6114fd610ddd565b60408051808201909152601881527f494e49545f414c52454144595f494e495449414c495a45440000000000000000602082015290156115825760405160e560020a62461bcd028152600401808060200182810382528381815181526020019150805190602001908083836000838110156107e95781810151838201526020016107d1565b506115bb61158e611446565b7febb05b386a8d34882b8711d156f463690983dc47815980fb82aeeff1aa43579e9063ffffffff61179816565b565b5490565b600080600160a060020a03831615156115dd57600091506115e8565b823b90506000811191505b50919050565b60408051600160a060020a0383166024808301919091528251808303909101815260449091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f70a0823100000000000000000000000000000000000000000000000000000000179052600090818061166e868461179c565b60408051808201909152601c81527f534146455f4552435f32305f42414c414e43455f524556455254454400000000602082015291935091508215156116f95760405160e560020a62461bcd028152600401808060200182810382528381815181526020019150805190602001908083836000838110156107e95781810151838201526020016107d1565b5095945050505050565b60408051600160a060020a038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260009061178585826117cd565b95945050505050565b8051602002815290565b9055565b6000806000806040516020818751602089018a5afa925060008311156117c157805191505b50909590945092505050565b6000806040516020818551602087016000895af16000811115611811573d80156117fe57602081146118075761180f565b6001935061180f565b600183511493505b505b5090949350505050565b6060604051908101604052806003906020820280388339509192915050565b6001830191839082156118c05791602002820160005b8382111561189057835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302611850565b80156118be5782816101000a81549061ffff0219169055600201602081600101049283019260010302611890565b505b5061057a929150611946565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061190d57805160ff191683800117855561193a565b8280016001018555821561193a579182015b8281111561193a57825182559160200191906001019061191f565b5061057a929150611965565b6106d491905b8082111561057a57805461ffff1916815560010161194c565b6106d491905b8082111561057a576000815560010161196b5600a165627a7a723058201755d6de12afb79629e28afc913d480f2527ea10a853591632418c1c1b1f901b0029ebb05b386a8d34882b8711d156f463690983dc47815980fb82aeeff1aa43579e
Deployed Bytecode
0x6080604052600436106100f55760003560e01c63ffffffff1680630803fac0146100fa5780632914b9bd1461012357806332f0a3b5146101985780634c3ba268146101ad57806373053410146102aa578063737e7d4f1461033a5780637e7db6e11461035257806380afdea8146103735780638129fc1c1461039a5780638b3dd749146103af5780639a6fe50c146103c45780639d4941d8146103e5578063a1658fad14610406578063a479e5081461046d578063a7bdf16e14610482578063aa61924a146104eb578063c36af46014610500578063c6d48e0d14610515578063d4aae0c41461052a578063de4796ed1461053f575b600080fd5b34801561010657600080fd5b5061010f610554565b604080519115158252519081900360200190f35b34801561012f57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261017c94369492936024939284019190819084018382808284375094975061057e9650505050505050565b60408051600160a060020a039092168252519081900360200190f35b3480156101a457600080fd5b5061017c610661565b3480156101b957600080fd5b506040805160608181019092526101f09136916004916064919083906003908390839080828437509396506106d795505050505050565b6040518084606080838360005b838110156102155781810151838201526020016101fd565b5050505090500183600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561026d578181015183820152602001610255565b50505050905090810190601f16801561029a5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b3480156102b657600080fd5b50604080516060818101909252610338913691600491606491908390600390839083908082843750506040805160208781013589018035601f81018390048302840183018552808452979a8935600160a060020a03169a9099909894019650919450908101925081908401838280828437509497506107169650505050505050565b005b34801561034657600080fd5b506101f0600435610b4b565b34801561035e57600080fd5b5061010f600160a060020a0360043516610d0a565b34801561037f57600080fd5b50610388610d10565b60408051918252519081900360200190f35b3480156103a657600080fd5b50610338610d40565b3480156103bb57600080fd5b50610388610ddd565b3480156103d057600080fd5b506101f0600160a060020a0360043516610e08565b3480156103f157600080fd5b50610338600160a060020a0360043516610e35565b34801561041257600080fd5b50604080516020600460443581810135838102808601850190965280855261010f958335600160a060020a03169560248035963696956064959394920192918291850190849080828437509497506110c49650505050505050565b34801561047957600080fd5b5061017c611211565b34801561048e57600080fd5b5060408051606081810190925261010f91369160049160649190839060039083908390808284375050604080516060818101909252949796958181019594509250600391508390839080828437509396506112c695505050505050565b3480156104f757600080fd5b506103886113b5565b34801561050c57600080fd5b506101f06113d9565b34801561052157600080fd5b506103886113fe565b34801561053657600080fd5b5061017c611408565b34801561054b57600080fd5b5061010f611433565b60008061055f610ddd565b90508015801590610577575080610574611446565b10155b91505b5090565b6000610588611211565b600160a060020a03166304bf2a7f836040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156105e35781810151838201526020016105cb565b50505050905090810190601f1680156106105780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b15801561062f57600080fd5b505af1158015610643573d6000803e3d6000fd5b505050506040513d602081101561065957600080fd5b505192915050565b600061066b611408565b600160a060020a03166332f0a3b56040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156106a557600080fd5b505af11580156106b9573d6000803e3d6000fd5b505050506040513d60208110156106cf57600080fd5b505190505b90565b6106df61181b565b60006060610709600260006106f38761144a565b8152602081019190915260400160002054610b4b565b9250925092509193909250565b60008061072161181b565b6040805160008082526020820190925281907f1f56cfecd3595a2e6cc1a7e6cb0b20df84cdbd92eff2fee554e70e4e45a9a7d89061076290339083906110c4565b60408051808201909152600f81527f4150505f415554485f4641494c4544000000000000000000000000000000000060208201529015156108245760405160e560020a62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b838110156107e95781810151838201526020016107d1565b50505050905090810190601f1680156108165780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508795506001600054039450600085111561096f57600085815260016020526040808220815160608101928390529095509185916003918390855b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161085f5790505093975050505050600160a060020a03861615156108c0576001830154600160a060020a031695505b6001830154600160a060020a03878116911614806108e757508254895161ffff9182169116115b60408051808201909152601481527f5245504f5f494e56414c49445f56455253494f4e000000000000000000000000602082015290151561096d5760405160e560020a62461bcd028152600401808060200182810382528381815181526020019150805190602001908083836000838110156107e95781810151838201526020016107d1565b505b610979848a6112c6565b60408051808201909152601181527f5245504f5f494e56414c49445f42554d5000000000000000000000000000000060208201529015156109ff5760405160e560020a62461bcd028152600401808060200182810382528381815181526020019150805190602001908083836000838110156107e95781810151838201526020016107d1565b506000805460018082018355604080516060810182528d8152600160a060020a038b166020808301919091528183018d905284865292909252909220825191945090610a4e908290600361183a565b5060208281015160018301805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0390921691909117905560408301518051610a9a92600285019201906118cc565b509050508160026000610aac8c61144a565b81526020808201929092526040908101600090812093909355600160a060020a038916835260038252808320859055518481527e3aea8189d1a0aa3ebdb05219cd4c2a663166706e949e9d6e8aa63718ca43fd9285928d92919082019083906060908190849084905b83811015610b2d578181015183820152602001610b15565b505050509050019250505060405180910390a1505050505050505050565b610b5361181b565b6000606060008085118015610b69575060005485105b60408051808201909152601781527f5245504f5f494e4558495354454e545f56455253494f4e0000000000000000006020820152901515610bef5760405160e560020a62461bcd028152600401808060200182810382528381815181526020019150805190602001908083836000838110156107e95781810151838201526020016107d1565b50506000848152600160208190526040808320918201548151606081019283905292938493600160a060020a039092169260028501929185916003918390855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411610c2f575050855460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152969950879550935085019150839050828015610cf55780601f10610cca57610100808354040283529160200191610cf5565b820191906000526020600020905b815481529060010190602001808311610cd857829003601f168201915b50505050509050935093509350509193909250565b50600190565b6000610d3b7fd625496217aa6a3453eecb9c3489dc5a53e6c67b444329ea2b2cbc9ff547639b6114f1565b905090565b610d48610ddd565b60408051808201909152601881527f494e49545f414c52454144595f494e495449414c495a4544000000000000000060208201529015610dcd5760405160e560020a62461bcd028152600401808060200182810382528381815181526020019150805190602001908083836000838110156107e95781810151838201526020016107d1565b50610dd66114f5565b6001600055565b6000610d3b7febb05b386a8d34882b8711d156f463690983dc47815980fb82aeeff1aa43579e6114f1565b610e1061181b565b600160a060020a03821660009081526003602052604081205460609061070990610b4b565b6000806000610e4384610d0a565b60408051808201909152601281527f5245434f5645525f444953414c4c4f57454400000000000000000000000000006020820152901515610ec95760405160e560020a62461bcd028152600401808060200182810382528381815181526020019150805190602001908083836000838110156107e95781810151838201526020016107d1565b50610ed2610661565b9250610edd836115c1565b60408051808201909152601a81527f5245434f5645525f5641554c545f4e4f545f434f4e54524143540000000000006020820152901515610f635760405160e560020a62461bcd028152600401808060200182810382528381815181526020019150805190602001908083836000838110156107e95781810151838201526020016107d1565b50600160a060020a0384161515610fb45760405130319250600160a060020a0384169083156108fc029084906000818181858888f19350505050158015610fae573d6000803e3d6000fd5b50611073565b5082610fcf600160a060020a0382163063ffffffff6115ee16565b9150610feb600160a060020a038216848463ffffffff61170316565b60408051808201909152601d81527f5245434f5645525f544f4b454e5f5452414e534645525f4641494c454400000060208201529015156110715760405160e560020a62461bcd028152600401808060200182810382528381815181526020019150805190602001908083836000838110156107e95781810151838201526020016107d1565b505b83600160a060020a031683600160a060020a03167f596caf56044b55fb8c4ca640089bbc2b63cae3e978b851f5745cbb7c5b288e02846040518082815260200191505060405180910390a350505050565b6000806110cf610554565b15156110de5760009150611209565b6110e6611408565b9050600160a060020a03811615156111015760009150611209565b80600160a060020a031663fdef910686308761111c8861178e565b60405163ffffffff861660e01b8152600160a060020a03808616600483019081529085166024830152604482018490526080606483019081528351608484015283519192909160a490910190602085019080838360005b8381101561118b578181015183820152602001611173565b50505050905090810190601f1680156111b85780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156111da57600080fd5b505af11580156111ee573d6000803e3d6000fd5b505050506040513d602081101561120457600080fd5b505191505b509392505050565b60008061121c611408565b604080517fbe00bbd80000000000000000000000000000000000000000000000000000000081527fd6f028ca0e8edb4a8c9757ca4fdccab25fa1e0317da1188108f7d2dee14902fb60048201527fddbcfd564f642ab5627cf68b9b7d374fb4f8a36e941a75d89c87998cef03bd6160248201529051600160a060020a03929092169163be00bbd8916044808201926020929091908290030181600087803b15801561062f57600080fd5b600080805b60038110156113a9578115611302578381600381106112e657fe5b602002015161ffff16156112fd57600092506113ad565b6113a1565b84816003811061130e57fe5b602002015161ffff1684826003811061132357fe5b602002015161ffff16146113a15783816003811061133d57fe5b602002015161ffff1685826003811061135257fe5b602002015161ffff16118061138e575084816003811061136e57fe5b602002015184826003811061137f57fe5b60200201510361ffff16600114155b1561139c57600092506113ad565b600191505b6001016112cb565b8192505b505092915050565b7f1f56cfecd3595a2e6cc1a7e6cb0b20df84cdbd92eff2fee554e70e4e45a9a7d881565b6113e161181b565b600060606113f3600160005403610b4b565b925092509250909192565b6000546000190190565b6000610d3b7f4172f0f7d2289153072b0a6ca36959e0cbe2efc3afe50fc81636caa96338137b6114f1565b6000600019611440610ddd565b14905090565b4390565b8051602080830151604080850151815161ffff95861660f090811b82870152938616841b6022820152941690911b6024840152805180840360060181526026909301908190528251600093928291908401908083835b602083106114bf5780518252601f1990920191602091820191016114a0565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095945050505050565b5490565b6114fd610ddd565b60408051808201909152601881527f494e49545f414c52454144595f494e495449414c495a45440000000000000000602082015290156115825760405160e560020a62461bcd028152600401808060200182810382528381815181526020019150805190602001908083836000838110156107e95781810151838201526020016107d1565b506115bb61158e611446565b7febb05b386a8d34882b8711d156f463690983dc47815980fb82aeeff1aa43579e9063ffffffff61179816565b565b5490565b600080600160a060020a03831615156115dd57600091506115e8565b823b90506000811191505b50919050565b60408051600160a060020a0383166024808301919091528251808303909101815260449091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f70a0823100000000000000000000000000000000000000000000000000000000179052600090818061166e868461179c565b60408051808201909152601c81527f534146455f4552435f32305f42414c414e43455f524556455254454400000000602082015291935091508215156116f95760405160e560020a62461bcd028152600401808060200182810382528381815181526020019150805190602001908083836000838110156107e95781810151838201526020016107d1565b5095945050505050565b60408051600160a060020a038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260009061178585826117cd565b95945050505050565b8051602002815290565b9055565b6000806000806040516020818751602089018a5afa925060008311156117c157805191505b50909590945092505050565b6000806040516020818551602087016000895af16000811115611811573d80156117fe57602081146118075761180f565b6001935061180f565b600183511493505b505b5090949350505050565b6060604051908101604052806003906020820280388339509192915050565b6001830191839082156118c05791602002820160005b8382111561189057835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302611850565b80156118be5782816101000a81549061ffff0219169055600201602081600101049283019260010302611890565b505b5061057a929150611946565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061190d57805160ff191683800117855561193a565b8280016001018555821561193a579182015b8281111561193a57825182559160200191906001019061191f565b5061057a929150611965565b6106d491905b8082111561057a57805461ffff1916815560010161194c565b6106d491905b8082111561057a576000815560010161196b5600a165627a7a723058201755d6de12afb79629e28afc913d480f2527ea10a853591632418c1c1b1f901b0029
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.