ETH Price: $2,101.17 (+12.93%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

1 Internal Transaction and 6 Token Transfers found.

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Method Block
From
To
0x60808060226311602025-06-04 12:04:59266 days ago1749038699  Contract Creation0 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x2E1B8BFA...dd09165b4
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
DelegationSurrogateVotes

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 5083 runs

Other Settings:
cancun EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 5 : DelegationSurrogateVotes.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.23;

import {DelegationSurrogate} from "./DelegationSurrogate.sol";
import {IERC20Delegates} from "./interfaces/IERC20Delegates.sol";

/// @title DelegationSurrogateVotes
/// @author [ScopeLift](https://scopelift.co)
/// @notice A dead-simple contract whose only purpose is to hold governance tokens on behalf of
/// users while delegating voting power to one specific delegatee. This is needed because a single
/// address can only delegate its (full) token weight to a single address at a time. Thus, when a
/// contract holds governance tokens in a pool on behalf of disparate token holders, those holders
/// are typically disenfranchised from their governance rights.
///
/// If a pool contract deploys a DelegationSurrogateVotes for each delegatee, and transfers each
/// depositor's tokens to the appropriate surrogate—or deploys it on their behalf—users can retain
/// their governance rights.
///
/// The pool contract deploying the surrogates must handle all accounting. The surrogate simply
/// delegates its voting weight and max-approves its deployer to allow tokens to be reclaimed.
contract DelegationSurrogateVotes is DelegationSurrogate {
  /// @param _token The governance token that will be held by this surrogate
  /// @param _delegatee The address of the would-be voter to which this surrogate will delegate its
  /// voting weight. 100% of all voting tokens held by this surrogate will be delegated to this
  /// address.
  constructor(IERC20Delegates _token, address _delegatee) DelegationSurrogate(_token) {
    _token.delegate(_delegatee);
  }
}

File 2 of 5 : DelegationSurrogate.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.23;

import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";

/// @title DelegationSurrogate
/// @author [ScopeLift](https://scopelift.co)
/// @notice A dead-simple contract whose only purpose is to hold ERC20 tokens which can always be
/// moved by the Surrogate's deployer.
abstract contract DelegationSurrogate {
  /// @param _token The token that will be held by this surrogate.
  constructor(IERC20 _token) {
    _token.approve(msg.sender, type(uint256).max);
  }
}

File 3 of 5 : IERC20Delegates.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.23;

import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IDelegates} from "./IDelegates.sol";

/// @notice A subset of the ERC20Votes-style governance token to which a staking token should
/// conform. Methods related to standard ERC20 functionality and to delegation are included.
/// These methods are needed in the context of this system. Methods related to checkpointing,
/// past voting weights, and other functionality are omitted.
interface IERC20Delegates is IERC20, IDelegates {}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.23;

/// @notice An interface that contains the necessary `IVotes` functions for the governance staking
/// system.
interface IDelegates {
  /// @notice Method which assigns voting weight from the sender to delegatee.
  function delegate(address _delegatee) external;

  /// @notice Method which returns the delegatee to which the account's voting weight is currently
  /// delegated.
  function delegates(address _account) external view returns (address);
}

Settings
{
  "remappings": [
    "@openzeppelin/contracts/=lib/stGOV/lib/staker/lib/openzeppelin-contracts/contracts/",
    "ds-test/=lib/stGOV/lib/staker/lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/stGOV/lib/staker/lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/stGOV/lib/staker/lib/openzeppelin-contracts/",
    "stGOV-test/=lib/stGOV/test/",
    "stGOV/=lib/stGOV/src/",
    "staker-test/=lib/stGOV/lib/staker/test/",
    "staker/=lib/stGOV/lib/staker/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 5083
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": true,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract IERC20Delegates","name":"_token","type":"address"},{"internalType":"address","name":"_delegatee","type":"address"}],"stateMutability":"nonpayable","type":"constructor"}]

0x608080604052346100de5760408161018b803803809161001f828561011a565b8339810103126100de5780516001600160a01b03811691908290036100de57602001516001600160a01b038116908190036100de5760405163095ea7b360e01b81523360048201525f1960248201526020816044815f875af180156100d3576100e2575b50813b156100de575f916024839260405194859384926317066a5760e21b845260048401525af180156100d3576100c3575b604051603990816101528239f35b5f6100cd9161011a565b5f6100b5565b6040513d5f823e3d90fd5b5f80fd5b6020813d602011610112575b816100fb6020938361011a565b810103126100de5751801515036100de575f610083565b3d91506100ee565b601f909101601f19168101906001600160401b0382119082101761013d57604052565b634e487b7160e01b5f52604160045260245ffdfe5f80fdfea2646970667358221220f219eb10253f5e37af99d28697305519c64df0a7634dd0e93fc68aef267ea15964736f6c634300081c00330000000000000000000000000b010000b7624eb9b3dfbc279673c76e9d29d5f7000000000000000000000000746bb7befd31d9052bb8eba7d5dd74c9acf54c6d

Deployed Bytecode

0x5f80fdfea2646970667358221220f219eb10253f5e37af99d28697305519c64df0a7634dd0e93fc68aef267ea15964736f6c634300081c0033

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
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.