interface IDAOStaking {
  struct Lock {
    uint64 lockDate;
    uint64 duration;
    uint256 amount;
  }

  function depositToken() external view returns(address);

  /**
   * @notice Stake a given amount of `depositToken` into wrappedTokenManager's token.
   *         From https://github.com/provable-things/aragon-staking-manager/blob/develop/contracts/StakingManager.sol
   * @dev This function requires the MINT_ROLE permission on the TokenManager specified
   * @param _amount Wrapped amount
   * @param _duration lock time for this wrapping
   * @param _receiver address who will receive back once unwrapped
   */
  function stake(
    uint256 _amount,
    uint64 _duration,
    address _receiver
  ) external returns (bool);

  function getStakedLocks(address _address) external view returns (Lock[] memory);
}
function stake(
  uint256 _amount,
  uint64 _duration,
  address _receiver
) external returns (bool);

/**
 * @notice Stake a given amount of `depositToken` into wrappedTokenManager's token.
 *         From https://github.com/provable-things/aragon-staking-manager/blob/develop/contracts/StakingManager.sol
 * @dev This function requires the MINT_ROLE permission on the TokenManager specified
 * @param _amount Wrapped amount
 * @param _duration lock time for this wrapping
 * @param _receiver address who will receive back once unwrapped
 */