Source Code
Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Initialize | 12945001 | 1590 days ago | IN | 0 ETH | 0.00630091 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
CompoundModel
Compiler Version
v0.8.6+commit.11564f7e
Optimization Enabled:
Yes with 500 runs
Other Settings:
byzantium EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.9.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "../interfaces/ModelInterface.sol";
import "../ModelStorage.sol";
import "../3rdDeFiInterfaces/CTokenInterface.sol";
import "../3rdDeFiInterfaces/IUniswapV2Router.sol";
contract CompoundModel is ModelInterface, ModelStorage{
using SafeERC20 for IERC20;
using SafeMath for uint;
event Swap( uint compAmount, uint underlying );
address _cToken;
address _comp;
address _comptroller;
address _uRouterV2;
function initialize(
address forge_,
address token_,
address cToken_,
address comp_,
address comptroller_,
address uRouterV2_ ) public {
addToken( token_ );
setForge( forge_ );
_cToken = cToken_;
_comp = comp_;
_comptroller = comptroller_;
_uRouterV2 = uRouterV2_;
}
function underlyingBalanceInModel() public override view returns ( uint256 ){
return IERC20( token( 0 ) ).balanceOf( address( this ) );
}
function underlyingBalanceWithInvestment() public override view returns ( uint256 ){
// Hard Work Now! For Punkers by 0xViktor
return underlyingBalanceInModel().add( CTokenInterface( _cToken ).exchangeRateStored().mul( _cTokenBalanceOf() ).div( 1e18 ) );
}
function invest() public override {
// Hard Work Now! For Punkers by 0xViktor
IERC20( token( 0 ) ).safeApprove( _cToken, underlyingBalanceInModel() );
emit Invest( underlyingBalanceInModel(), block.timestamp );
CTokenInterface( _cToken ).mint( underlyingBalanceInModel() );
}
function reInvest() public{
// Hard Work Now! For Punkers by 0xViktor
_claimComp();
_swapCompToUnderlying();
invest();
}
function withdrawAllToForge() public OnlyForge override{
// Hard Work Now! For Punkers by 0xViktor
_claimComp();
_swapCompToUnderlying();
emit Withdraw( underlyingBalanceWithInvestment(), forge(), block.timestamp);
CTokenInterface( _cToken ).redeem( _cTokenBalanceOf() );
}
function withdrawToForge( uint256 amount ) public OnlyForge override{
withdrawTo( amount, forge() );
}
function withdrawTo( uint256 amount, address to ) public OnlyForge override{
// Hard Work Now! For Punkers by 0xViktor
uint oldBalance = IERC20( token(0) ).balanceOf( address( this ) );
CTokenInterface( _cToken ).redeemUnderlying( amount );
uint newBalance = IERC20( token(0) ).balanceOf( address( this ) );
require(newBalance.sub( oldBalance ) > 0, "MODEL : REDEEM BALANCE IS ZERO");
IERC20( token( 0 ) ).safeTransfer( to, newBalance.sub( oldBalance ) );
emit Withdraw( amount, forge(), block.timestamp);
}
function _cTokenBalanceOf() internal view returns( uint ){
return CTokenInterface( _cToken ).balanceOf( address( this ) );
}
function _claimComp() internal {
// Hard Work Now! For Punkers by 0xViktor
CTokenInterface( _comptroller ).claimComp( address( this ) );
}
function _swapCompToUnderlying() internal {
// Hard Work Now! For Punkers by 0xViktor
uint balance = IERC20(_comp).balanceOf(address(this));
if (balance > 0) {
IERC20(_comp).safeApprove(_uRouterV2, balance);
address[] memory path = new address[](3);
path[0] = address(_comp);
path[1] = IUniswapV2Router02( _uRouterV2 ).WETH();
path[2] = address( token( 0 ) );
IUniswapV2Router02(_uRouterV2).swapExactTokensForTokens(
balance,
1,
path,
address(this),
block.timestamp + ( 15 * 60 )
);
emit Swap(balance, underlyingBalanceInModel());
}
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.9.0;
interface CTokenInterface {
function mint() external payable;
function mint(uint256 mintAmount) external returns (uint256);
function redeem(uint256 redeemTokens) external returns (uint256);
function redeemUnderlying(uint256 redeemAmount) external returns (uint256);
function borrow(uint256 borrowAmount) external returns (uint256);
function repayBorrow(uint256 repayAmount) external returns (uint256);
function exchangeRateStored() external view returns (uint256);
function balanceOf(address _owner) external view returns (uint256);
function underlying() external view returns (address);
function claimComp(address holder) external;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
interface IUniswapV2Router02 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB);
function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts);
function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.9.0;
pragma experimental ABIEncoderV2;
contract ModelStorage{
address [] private _tokens;
address private _forge;
/**
* @dev This modifier allows only "Forge" to be executed.
*/
modifier OnlyForge(){
require(_forge == msg.sender, "MODEL : Only Forge");
_;
}
/**
* @dev Add a 'token' ERC20 to be used in the model.
*/
function addToken( address token_ ) internal returns( bool ){
for( uint i = 0 ; i < tokens().length ; i++ ){
if( token( i ) == token_ ){ return false; }
}
_tokens.push( token_ );
return true;
}
/**
* @dev A model must have only one Forge.
*
* IMPORTANT: 'Forge' should be non-replaceable by default.
*/
function setForge( address forge_ ) internal returns( bool ){
_forge = forge_;
return true;
}
/**
* @dev Returns the address of the token as 'index'.
*/
function token( uint index ) public view returns( address ){
return _tokens[index];
}
/**
* @dev Returns a list of addresses of tokens.
*/
function tokens() public view returns( address [] memory ){
return _tokens;
}
/**
* @dev Returns the address of Forge.
*/
function forge() public view returns( address ){
return _forge;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.9.0;
interface ModelInterface{
event Invest( uint amount, uint timestamp );
event Withdraw( uint amount, address to, uint timestamp );
/**
* @dev Returns the balance held by the model without investing.
*/
function underlyingBalanceInModel() external view returns ( uint256 );
/**
* @dev Returns the sum of the invested amount and the amount held by the model without investing.
*/
function underlyingBalanceWithInvestment() external view returns ( uint256 );
/**
* @dev Invest uninvested amounts according to your strategy.
*
* Emits a {Invest} event.
*/
function invest() external;
/**
* @dev After withdrawing all the invested amount, all the balance is transferred to 'Forge'.
*
* IMPORTANT: Must use the "OnlyForge" Modifier from "ModelStorage.sol".
*
* Emits a {Withdraw} event.
*/
function withdrawAllToForge() external;
/**
* @dev After withdrawing 'amount', send it to 'Forge'.
*
* IMPORTANT: Must use the "OnlyForge" Modifier from "ModelStorage.sol".
*
* Emits a {Withdraw} event.
*/
function withdrawToForge( uint256 amount ) external;
/**
* @dev After withdrawing 'amount', send it to 'to'.
*
* IMPORTANT: Must use the "OnlyForge" Modifier from "ModelStorage.sol".
*
* Emits a {Withdraw} event.
*/
function withdrawTo( uint256 amount, address to ) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}{
"remappings": [],
"optimizer": {
"enabled": true,
"runs": 500
},
"evmVersion": "byzantium",
"libraries": {},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Invest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"compAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"underlying","type":"uint256"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"forge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forge_","type":"address"},{"internalType":"address","name":"token_","type":"address"},{"internalType":"address","name":"cToken_","type":"address"},{"internalType":"address","name":"comp_","type":"address"},{"internalType":"address","name":"comptroller_","type":"address"},{"internalType":"address","name":"uRouterV2_","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"invest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reInvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"underlyingBalanceInModel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"underlyingBalanceWithInvestment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAllToForge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToForge","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b506117d1806100206000396000f3fe608060405234801561001057600080fd5b50600436106100d6576000357c0100000000000000000000000000000000000000000000000000000000900480636c6f42391161009e578063c86283c811610078578063c86283c814610174578063cc2a9a5b14610187578063e8b5e51f1461019a57600080fd5b80636c6f42391461013b5780637b9967a51461014c5780639d63848a1461015f57600080fd5b8063044215c6146100db5780630e007b6a1461010b57806313efb876146101155780631bf8e7be1461012b57806350be99ad14610133575b600080fd5b6100ee6100e93660046114c5565b6101a2565b604051600160a060020a0390911681526020015b60405180910390f35b6101136101d1565b005b61011d610342565b604051908152602001610102565b61011d6103e6565b6101136104be565b600154600160a060020a03166100ee565b61011361015a3660046114c5565b6104d8565b610167610550565b6040516101029190611587565b6101136101823660046114f7565b6105b2565b61011361019536600461135d565b6108d5565b610113610967565b60008082815481106101b6576101b6611708565b600091825260209091200154600160a060020a031692915050565b600154600160a060020a031633146102385760405160008051602061177c833981519152815260206004820152601260248201527f4d4f44454c203a204f6e6c7920466f726765000000000000000000000000000060448201526064015b60405180910390fd5b6102406109f1565b610248610a6a565b7f9da6493a92039daf47d1f2d7a782299c5994c6323eb1e972f69c432089ec52bf6102716103e6565b60015460408051928352600160a060020a0390911660208301524282820152519081900360600190a1600254600160a060020a031663db006a756102b3610d65565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016102ed91815260200190565b602060405180830381600087803b15801561030757600080fd5b505af115801561031b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033f91906114de565b50565b600061034e60006101a2565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a0391909116906370a08231906024015b60206040518083038186803b1580156103a957600080fd5b505afa1580156103bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103e191906114de565b905090565b60006103e16104b0670de0b6b3a76400006104aa610402610d65565b600260009054906101000a9004600160a060020a0316600160a060020a031663182df0f56040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561046c57600080fd5b505afa158015610480573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a491906114de565b90610daf565b90610dc2565b6104b8610342565b90610dce565b6104c66109f1565b6104ce610a6a565b6104d6610967565b565b600154600160a060020a0316331461053a5760405160008051602061177c833981519152815260206004820152601260248201527f4d4f44454c203a204f6e6c7920466f7267650000000000000000000000000000604482015260640161022f565b61033f81610182600154600160a060020a031690565b606060008054806020026020016040519081016040528092919081815260200182805480156105a857602002820191906000526020600020905b8154600160a060020a0316815260019091019060200180831161058a575b5050505050905090565b600154600160a060020a031633146106145760405160008051602061177c833981519152815260206004820152601260248201527f4d4f44454c203a204f6e6c7920466f7267650000000000000000000000000000604482015260640161022f565b600061062060006101a2565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a0391909116906370a082319060240160206040518083038186803b15801561067a57600080fd5b505afa15801561068e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b291906114de565b6002546040517f852a12e300000000000000000000000000000000000000000000000000000000815260048101869052919250600160a060020a03169063852a12e390602401602060405180830381600087803b15801561071257600080fd5b505af1158015610726573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074a91906114de565b50600061075760006101a2565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a0391909116906370a082319060240160206040518083038186803b1580156107b157600080fd5b505afa1580156107c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e991906114de565b905060006107f78284610dda565b1161084c5760405160008051602061177c833981519152815260206004820152601e60248201527f4d4f44454c203a2052454445454d2042414c414e4345204953205a45524f0000604482015260640161022f565b6108748361085a8385610dda565b61086460006101a2565b600160a060020a03169190610de6565b7f9da6493a92039daf47d1f2d7a782299c5994c6323eb1e972f69c432089ec52bf846108a8600154600160a060020a031690565b60408051928352600160a060020a039091166020830152429082015260600160405180910390a150505050565b6108de85610e94565b506001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0388161781555060028054600160a060020a0395861673ffffffffffffffffffffffffffffffffffffffff199182161790915560038054948616948216949094179093556004805492851692841692909217909155600580549190931691161790555050565b60025461099990600160a060020a031661097f610342565b61098960006101a2565b600160a060020a03169190610f46565b7fb089286041f4c8faf70006ecf5d7f8b6dce0f3bba8bdc30c237fd656060bff2c6109c2610342565b604080519182524260208301520160405180910390a1600254600160a060020a031663a0712d686102b3610342565b600480546040517fe9af02920000000000000000000000000000000000000000000000000000000081523092810192909252600160a060020a03169063e9af029290602401600060405180830381600087803b158015610a5057600080fd5b505af1158015610a64573d6000803e3d6000fd5b50505050565b6003546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600091600160a060020a0316906370a082319060240160206040518083038186803b158015610ac757600080fd5b505afa158015610adb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aff91906114de565b9050801561033f57600554600354610b2491600160a060020a03918216911683610f46565b604080516003808252608082019092526000916020820160608036833750506003548251929350600160a060020a031691839150600090610b6757610b67611708565b600160a060020a03928316602091820292909201810191909152600554604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b158015610bd457600080fd5b505afa158015610be8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0c9190611340565b81600181518110610c1f57610c1f611708565b6020026020010190600160a060020a03169081600160a060020a031681525050610c4960006101a2565b81600281518110610c5c57610c5c611708565b600160a060020a039283166020918202929092010152600554166338ed17398360018430610c8c42610384611609565b6040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610cc89594939291906115cd565b600060405180830381600087803b158015610ce257600080fd5b505af1158015610cf6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d1e91908101906113df565b507f015fc8ee969fd902d9ebd12a31c54446400a2b512a405366fe14defd6081d22082610d49610342565b6040805192835260208301919091520160405180910390a15050565b6002546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600091600160a060020a0316906370a0823190602401610391565b6000610dbb828461165c565b9392505050565b6000610dbb8284611621565b6000610dbb8284611609565b6000610dbb828461167b565b604051600160a060020a038316602482015260448101829052610e8f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526110ab565b505050565b6000805b610ea0610550565b51811015610ee55782600160a060020a0316610ebb826101a2565b600160a060020a03161415610ed35750600092915050565b80610edd816116be565b915050610e98565b505060008054600180820183559180527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56301805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03939093169290921790915590565b801580610fe857506040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a03838116602483015284169063dd62ed3e9060440160206040518083038186803b158015610fae57600080fd5b505afa158015610fc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe691906114de565b155b6110625760405160008051602061177c833981519152815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840161022f565b604051600160a060020a038316602482015260448101829052610e8f9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401610e2b565b6000611100826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525085600160a060020a03166111989092919063ffffffff16565b805190915015610e8f578080602001905181019061111e91906114a3565b610e8f5760405160008051602061177c833981519152815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161022f565b60606111a784846000856111af565b949350505050565b606030318311156112305760405160008051602061177c833981519152815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161022f565b843b6112865760405160008051602061177c833981519152815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161022f565b60008086600160a060020a031685876040516112a2919061156b565b60006040518083038185875af1925050503d80600081146112df576040519150601f19603f3d011682016040523d82523d6000602084013e6112e4565b606091505b50915091506112f48282866112ff565b979650505050505050565b6060831561130e575081610dbb565b82511561131e5782518084602001fd5b8160405160008051602061177c833981519152815260040161022f919061159a565b60006020828403121561135257600080fd5b8151610dbb81611766565b60008060008060008060c0878903121561137657600080fd5b863561138181611766565b9550602087013561139181611766565b945060408701356113a181611766565b935060608701356113b181611766565b925060808701356113c181611766565b915060a08701356113d181611766565b809150509295509295509295565b600060208083850312156113f257600080fd5b825167ffffffffffffffff8082111561140a57600080fd5b818501915085601f83011261141e57600080fd5b81518181111561143057611430611737565b838102604051601f19603f8301168101818110858211171561145457611454611737565b604052828152858101935084860182860187018a101561147357600080fd5b600095505b83861015611496578051855260019590950194938601938601611478565b5098975050505050505050565b6000602082840312156114b557600080fd5b81518015158114610dbb57600080fd5b6000602082840312156114d757600080fd5b5035919050565b6000602082840312156114f057600080fd5b5051919050565b6000806040838503121561150a57600080fd5b82359150602083013561151c81611766565b809150509250929050565b600081518084526020808501945080840160005b83811015611560578151600160a060020a03168752958201959082019060010161153b565b509495945050505050565b6000825161157d818460208701611692565b9190910192915050565b602081526000610dbb6020830184611527565b60208152600082518060208401526115b9816040850160208701611692565b601f01601f19169190910160400192915050565b85815284602082015260a0604082015260006115ec60a0830186611527565b600160a060020a0394909416606083015250608001529392505050565b6000821982111561161c5761161c6116d9565b500190565b600082611657577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000816000190483118215151615611676576116766116d9565b500290565b60008282101561168d5761168d6116d9565b500390565b60005b838110156116ad578181015183820152602001611695565b83811115610a645750506000910152565b60006000198214156116d2576116d26116d9565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600160a060020a038116811461033f57600080fdfe08c379a000000000000000000000000000000000000000000000000000000000a2646970667358221220589fde0f512240f5c6fbdebbd68a3ccd5fdaff736c659705f6c35bc639aae5b964736f6c63430008060033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100d6576000357c0100000000000000000000000000000000000000000000000000000000900480636c6f42391161009e578063c86283c811610078578063c86283c814610174578063cc2a9a5b14610187578063e8b5e51f1461019a57600080fd5b80636c6f42391461013b5780637b9967a51461014c5780639d63848a1461015f57600080fd5b8063044215c6146100db5780630e007b6a1461010b57806313efb876146101155780631bf8e7be1461012b57806350be99ad14610133575b600080fd5b6100ee6100e93660046114c5565b6101a2565b604051600160a060020a0390911681526020015b60405180910390f35b6101136101d1565b005b61011d610342565b604051908152602001610102565b61011d6103e6565b6101136104be565b600154600160a060020a03166100ee565b61011361015a3660046114c5565b6104d8565b610167610550565b6040516101029190611587565b6101136101823660046114f7565b6105b2565b61011361019536600461135d565b6108d5565b610113610967565b60008082815481106101b6576101b6611708565b600091825260209091200154600160a060020a031692915050565b600154600160a060020a031633146102385760405160008051602061177c833981519152815260206004820152601260248201527f4d4f44454c203a204f6e6c7920466f726765000000000000000000000000000060448201526064015b60405180910390fd5b6102406109f1565b610248610a6a565b7f9da6493a92039daf47d1f2d7a782299c5994c6323eb1e972f69c432089ec52bf6102716103e6565b60015460408051928352600160a060020a0390911660208301524282820152519081900360600190a1600254600160a060020a031663db006a756102b3610d65565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016102ed91815260200190565b602060405180830381600087803b15801561030757600080fd5b505af115801561031b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033f91906114de565b50565b600061034e60006101a2565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a0391909116906370a08231906024015b60206040518083038186803b1580156103a957600080fd5b505afa1580156103bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103e191906114de565b905090565b60006103e16104b0670de0b6b3a76400006104aa610402610d65565b600260009054906101000a9004600160a060020a0316600160a060020a031663182df0f56040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561046c57600080fd5b505afa158015610480573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a491906114de565b90610daf565b90610dc2565b6104b8610342565b90610dce565b6104c66109f1565b6104ce610a6a565b6104d6610967565b565b600154600160a060020a0316331461053a5760405160008051602061177c833981519152815260206004820152601260248201527f4d4f44454c203a204f6e6c7920466f7267650000000000000000000000000000604482015260640161022f565b61033f81610182600154600160a060020a031690565b606060008054806020026020016040519081016040528092919081815260200182805480156105a857602002820191906000526020600020905b8154600160a060020a0316815260019091019060200180831161058a575b5050505050905090565b600154600160a060020a031633146106145760405160008051602061177c833981519152815260206004820152601260248201527f4d4f44454c203a204f6e6c7920466f7267650000000000000000000000000000604482015260640161022f565b600061062060006101a2565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a0391909116906370a082319060240160206040518083038186803b15801561067a57600080fd5b505afa15801561068e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b291906114de565b6002546040517f852a12e300000000000000000000000000000000000000000000000000000000815260048101869052919250600160a060020a03169063852a12e390602401602060405180830381600087803b15801561071257600080fd5b505af1158015610726573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074a91906114de565b50600061075760006101a2565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a0391909116906370a082319060240160206040518083038186803b1580156107b157600080fd5b505afa1580156107c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e991906114de565b905060006107f78284610dda565b1161084c5760405160008051602061177c833981519152815260206004820152601e60248201527f4d4f44454c203a2052454445454d2042414c414e4345204953205a45524f0000604482015260640161022f565b6108748361085a8385610dda565b61086460006101a2565b600160a060020a03169190610de6565b7f9da6493a92039daf47d1f2d7a782299c5994c6323eb1e972f69c432089ec52bf846108a8600154600160a060020a031690565b60408051928352600160a060020a039091166020830152429082015260600160405180910390a150505050565b6108de85610e94565b506001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0388161781555060028054600160a060020a0395861673ffffffffffffffffffffffffffffffffffffffff199182161790915560038054948616948216949094179093556004805492851692841692909217909155600580549190931691161790555050565b60025461099990600160a060020a031661097f610342565b61098960006101a2565b600160a060020a03169190610f46565b7fb089286041f4c8faf70006ecf5d7f8b6dce0f3bba8bdc30c237fd656060bff2c6109c2610342565b604080519182524260208301520160405180910390a1600254600160a060020a031663a0712d686102b3610342565b600480546040517fe9af02920000000000000000000000000000000000000000000000000000000081523092810192909252600160a060020a03169063e9af029290602401600060405180830381600087803b158015610a5057600080fd5b505af1158015610a64573d6000803e3d6000fd5b50505050565b6003546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600091600160a060020a0316906370a082319060240160206040518083038186803b158015610ac757600080fd5b505afa158015610adb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aff91906114de565b9050801561033f57600554600354610b2491600160a060020a03918216911683610f46565b604080516003808252608082019092526000916020820160608036833750506003548251929350600160a060020a031691839150600090610b6757610b67611708565b600160a060020a03928316602091820292909201810191909152600554604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b158015610bd457600080fd5b505afa158015610be8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0c9190611340565b81600181518110610c1f57610c1f611708565b6020026020010190600160a060020a03169081600160a060020a031681525050610c4960006101a2565b81600281518110610c5c57610c5c611708565b600160a060020a039283166020918202929092010152600554166338ed17398360018430610c8c42610384611609565b6040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610cc89594939291906115cd565b600060405180830381600087803b158015610ce257600080fd5b505af1158015610cf6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d1e91908101906113df565b507f015fc8ee969fd902d9ebd12a31c54446400a2b512a405366fe14defd6081d22082610d49610342565b6040805192835260208301919091520160405180910390a15050565b6002546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600091600160a060020a0316906370a0823190602401610391565b6000610dbb828461165c565b9392505050565b6000610dbb8284611621565b6000610dbb8284611609565b6000610dbb828461167b565b604051600160a060020a038316602482015260448101829052610e8f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526110ab565b505050565b6000805b610ea0610550565b51811015610ee55782600160a060020a0316610ebb826101a2565b600160a060020a03161415610ed35750600092915050565b80610edd816116be565b915050610e98565b505060008054600180820183559180527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56301805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03939093169290921790915590565b801580610fe857506040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a03838116602483015284169063dd62ed3e9060440160206040518083038186803b158015610fae57600080fd5b505afa158015610fc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe691906114de565b155b6110625760405160008051602061177c833981519152815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840161022f565b604051600160a060020a038316602482015260448101829052610e8f9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401610e2b565b6000611100826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525085600160a060020a03166111989092919063ffffffff16565b805190915015610e8f578080602001905181019061111e91906114a3565b610e8f5760405160008051602061177c833981519152815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161022f565b60606111a784846000856111af565b949350505050565b606030318311156112305760405160008051602061177c833981519152815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161022f565b843b6112865760405160008051602061177c833981519152815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161022f565b60008086600160a060020a031685876040516112a2919061156b565b60006040518083038185875af1925050503d80600081146112df576040519150601f19603f3d011682016040523d82523d6000602084013e6112e4565b606091505b50915091506112f48282866112ff565b979650505050505050565b6060831561130e575081610dbb565b82511561131e5782518084602001fd5b8160405160008051602061177c833981519152815260040161022f919061159a565b60006020828403121561135257600080fd5b8151610dbb81611766565b60008060008060008060c0878903121561137657600080fd5b863561138181611766565b9550602087013561139181611766565b945060408701356113a181611766565b935060608701356113b181611766565b925060808701356113c181611766565b915060a08701356113d181611766565b809150509295509295509295565b600060208083850312156113f257600080fd5b825167ffffffffffffffff8082111561140a57600080fd5b818501915085601f83011261141e57600080fd5b81518181111561143057611430611737565b838102604051601f19603f8301168101818110858211171561145457611454611737565b604052828152858101935084860182860187018a101561147357600080fd5b600095505b83861015611496578051855260019590950194938601938601611478565b5098975050505050505050565b6000602082840312156114b557600080fd5b81518015158114610dbb57600080fd5b6000602082840312156114d757600080fd5b5035919050565b6000602082840312156114f057600080fd5b5051919050565b6000806040838503121561150a57600080fd5b82359150602083013561151c81611766565b809150509250929050565b600081518084526020808501945080840160005b83811015611560578151600160a060020a03168752958201959082019060010161153b565b509495945050505050565b6000825161157d818460208701611692565b9190910192915050565b602081526000610dbb6020830184611527565b60208152600082518060208401526115b9816040850160208701611692565b601f01601f19169190910160400192915050565b85815284602082015260a0604082015260006115ec60a0830186611527565b600160a060020a0394909416606083015250608001529392505050565b6000821982111561161c5761161c6116d9565b500190565b600082611657577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000816000190483118215151615611676576116766116d9565b500290565b60008282101561168d5761168d6116d9565b500390565b60005b838110156116ad578181015183820152602001611695565b83811115610a645750506000910152565b60006000198214156116d2576116d26116d9565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600160a060020a038116811461033f57600080fdfe08c379a000000000000000000000000000000000000000000000000000000000a2646970667358221220589fde0f512240f5c6fbdebbd68a3ccd5fdaff736c659705f6c35bc639aae5b964736f6c63430008060033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.