import { SolcMetadata } from "@owlprotocol/viem-utils";

export const IStakeManager: SolcMetadata = {
    compiler: {
        version: "0.8.23+commit.f704f362",
    },
    language: "Solidity",
    output: {
        abi: [
            {
                anonymous: false,
                inputs: [
                    {
                        indexed: true,
                        internalType: "address",
                        name: "account",
                        type: "address",
                    },
                    {
                        indexed: false,
                        internalType: "uint256",
                        name: "totalDeposit",
                        type: "uint256",
                    },
                ],
                name: "Deposited",
                type: "event",
            },
            {
                anonymous: false,
                inputs: [
                    {
                        indexed: true,
                        internalType: "address",
                        name: "account",
                        type: "address",
                    },
                    {
                        indexed: false,
                        internalType: "uint256",
                        name: "totalStaked",
                        type: "uint256",
                    },
                    {
                        indexed: false,
                        internalType: "uint256",
                        name: "unstakeDelaySec",
                        type: "uint256",
                    },
                ],
                name: "StakeLocked",
                type: "event",
            },
            {
                anonymous: false,
                inputs: [
                    {
                        indexed: true,
                        internalType: "address",
                        name: "account",
                        type: "address",
                    },
                    {
                        indexed: false,
                        internalType: "uint256",
                        name: "withdrawTime",
                        type: "uint256",
                    },
                ],
                name: "StakeUnlocked",
                type: "event",
            },
            {
                anonymous: false,
                inputs: [
                    {
                        indexed: true,
                        internalType: "address",
                        name: "account",
                        type: "address",
                    },
                    {
                        indexed: false,
                        internalType: "address",
                        name: "withdrawAddress",
                        type: "address",
                    },
                    {
                        indexed: false,
                        internalType: "uint256",
                        name: "amount",
                        type: "uint256",
                    },
                ],
                name: "StakeWithdrawn",
                type: "event",
            },
            {
                anonymous: false,
                inputs: [
                    {
                        indexed: true,
                        internalType: "address",
                        name: "account",
                        type: "address",
                    },
                    {
                        indexed: false,
                        internalType: "address",
                        name: "withdrawAddress",
                        type: "address",
                    },
                    {
                        indexed: false,
                        internalType: "uint256",
                        name: "amount",
                        type: "uint256",
                    },
                ],
                name: "Withdrawn",
                type: "event",
            },
            {
                inputs: [
                    {
                        internalType: "uint32",
                        name: "_unstakeDelaySec",
                        type: "uint32",
                    },
                ],
                name: "addStake",
                outputs: [],
                stateMutability: "payable",
                type: "function",
            },
            {
                inputs: [
                    {
                        internalType: "address",
                        name: "account",
                        type: "address",
                    },
                ],
                name: "balanceOf",
                outputs: [
                    {
                        internalType: "uint256",
                        name: "",
                        type: "uint256",
                    },
                ],
                stateMutability: "view",
                type: "function",
            },
            {
                inputs: [
                    {
                        internalType: "address",
                        name: "account",
                        type: "address",
                    },
                ],
                name: "depositTo",
                outputs: [],
                stateMutability: "payable",
                type: "function",
            },
            {
                inputs: [
                    {
                        internalType: "address",
                        name: "account",
                        type: "address",
                    },
                ],
                name: "getDepositInfo",
                outputs: [
                    {
                        components: [
                            {
                                internalType: "uint256",
                                name: "deposit",
                                type: "uint256",
                            },
                            {
                                internalType: "bool",
                                name: "staked",
                                type: "bool",
                            },
                            {
                                internalType: "uint112",
                                name: "stake",
                                type: "uint112",
                            },
                            {
                                internalType: "uint32",
                                name: "unstakeDelaySec",
                                type: "uint32",
                            },
                            {
                                internalType: "uint48",
                                name: "withdrawTime",
                                type: "uint48",
                            },
                        ],
                        internalType: "struct IStakeManager.DepositInfo",
                        name: "info",
                        type: "tuple",
                    },
                ],
                stateMutability: "view",
                type: "function",
            },
            {
                inputs: [],
                name: "unlockStake",
                outputs: [],
                stateMutability: "nonpayable",
                type: "function",
            },
            {
                inputs: [
                    {
                        internalType: "address payable",
                        name: "withdrawAddress",
                        type: "address",
                    },
                ],
                name: "withdrawStake",
                outputs: [],
                stateMutability: "nonpayable",
                type: "function",
            },
            {
                inputs: [
                    {
                        internalType: "address payable",
                        name: "withdrawAddress",
                        type: "address",
                    },
                    {
                        internalType: "uint256",
                        name: "withdrawAmount",
                        type: "uint256",
                    },
                ],
                name: "withdrawTo",
                outputs: [],
                stateMutability: "nonpayable",
                type: "function",
            },
        ],
        devdoc: {
            kind: "dev",
            methods: {
                "addStake(uint32)": {
                    params: {
                        _unstakeDelaySec: "- The new lock duration before the deposit can be withdrawn.",
                    },
                },
                "balanceOf(address)": {
                    params: {
                        account: "- The account to query.",
                    },
                    returns: {
                        _0: "- The deposit (for gas payment) of the account.",
                    },
                },
                "depositTo(address)": {
                    params: {
                        account: "- The account to add to.",
                    },
                },
                "getDepositInfo(address)": {
                    params: {
                        account: "- The account to query.",
                    },
                    returns: {
                        info: "  - Full deposit information of given account.",
                    },
                },
                "withdrawStake(address)": {
                    params: {
                        withdrawAddress: "- The address to send withdrawn value.",
                    },
                },
                "withdrawTo(address,uint256)": {
                    params: {
                        withdrawAddress: "- The address to send withdrawn value.",
                        withdrawAmount: "- The amount to withdraw.",
                    },
                },
            },
            version: 1,
        },
        userdoc: {
            kind: "user",
            methods: {
                "addStake(uint32)": {
                    notice: "Add to the account's stake - amount and delay any pending unstake is first cancelled.",
                },
                "balanceOf(address)": {
                    notice: "Get account balance.",
                },
                "depositTo(address)": {
                    notice: "Add to the deposit of the given account.",
                },
                "getDepositInfo(address)": {
                    notice: "Get deposit info.",
                },
                "unlockStake()": {
                    notice: "Attempt to unlock the stake. The value can be withdrawn (using withdrawStake) after the unstake delay.",
                },
                "withdrawStake(address)": {
                    notice: "Withdraw from the (unlocked) stake. Must first call unlockStake and wait for the unstakeDelay to pass.",
                },
                "withdrawTo(address,uint256)": {
                    notice: "Withdraw from the deposit.",
                },
            },
            notice: 'Manage deposits and stakes. Deposit is just a balance used to pay for UserOperations (either by a paymaster or an account). Stake is value locked for at least "unstakeDelay" by the staked entity.',
            version: 1,
        },
    },
    settings: {
        compilationTarget: {
            "@account-abstraction/contracts/interfaces/IStakeManager.sol": "IStakeManager",
        },
        evmVersion: "paris",
        libraries: {},
        metadata: {
            bytecodeHash: "ipfs",
            useLiteralContent: true,
        },
        optimizer: {
            enabled: true,
            runs: 1000000,
        },
        remappings: [],
        viaIR: true,
    },
    sources: {
        "@account-abstraction/contracts/interfaces/IStakeManager.sol": {
            content:
                "// SPDX-License-Identifier: GPL-3.0-only\npragma solidity >=0.7.5;\n\n/**\n * Manage deposits and stakes.\n * Deposit is just a balance used to pay for UserOperations (either by a paymaster or an account).\n * Stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n    event Deposited(address indexed account, uint256 totalDeposit);\n\n    event Withdrawn(\n        address indexed account,\n        address withdrawAddress,\n        uint256 amount\n    );\n\n    // Emitted when stake or unstake delay are modified.\n    event StakeLocked(\n        address indexed account,\n        uint256 totalStaked,\n        uint256 unstakeDelaySec\n    );\n\n    // Emitted once a stake is scheduled for withdrawal.\n    event StakeUnlocked(address indexed account, uint256 withdrawTime);\n\n    event StakeWithdrawn(\n        address indexed account,\n        address withdrawAddress,\n        uint256 amount\n    );\n\n    /**\n     * @param deposit         - The entity's deposit.\n     * @param staked          - True if this entity is staked.\n     * @param stake           - Actual amount of ether staked for this entity.\n     * @param unstakeDelaySec - Minimum delay to withdraw the stake.\n     * @param withdrawTime    - First block timestamp where 'withdrawStake' will be callable, or zero if already locked.\n     * @dev Sizes were chosen so that deposit fits into one cell (used during handleOp)\n     *      and the rest fit into a 2nd cell (used during stake/unstake)\n     *      - 112 bit allows for 10^15 eth\n     *      - 48 bit for full timestamp\n     *      - 32 bit allows 150 years for unstake delay\n     */\n    struct DepositInfo {\n        uint256 deposit;\n        bool staked;\n        uint112 stake;\n        uint32 unstakeDelaySec;\n        uint48 withdrawTime;\n    }\n\n    // API struct used by getStakeInfo and simulateValidation.\n    struct StakeInfo {\n        uint256 stake;\n        uint256 unstakeDelaySec;\n    }\n\n    /**\n     * Get deposit info.\n     * @param account - The account to query.\n     * @return info   - Full deposit information of given account.\n     */\n    function getDepositInfo(\n        address account\n    ) external view returns (DepositInfo memory info);\n\n    /**\n     * Get account balance.\n     * @param account - The account to query.\n     * @return        - The deposit (for gas payment) of the account.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * Add to the deposit of the given account.\n     * @param account - The account to add to.\n     */\n    function depositTo(address account) external payable;\n\n    /**\n     * Add to the account's stake - amount and delay\n     * any pending unstake is first cancelled.\n     * @param _unstakeDelaySec - The new lock duration before the deposit can be withdrawn.\n     */\n    function addStake(uint32 _unstakeDelaySec) external payable;\n\n    /**\n     * Attempt to unlock the stake.\n     * The value can be withdrawn (using withdrawStake) after the unstake delay.\n     */\n    function unlockStake() external;\n\n    /**\n     * Withdraw from the (unlocked) stake.\n     * Must first call unlockStake and wait for the unstakeDelay to pass.\n     * @param withdrawAddress - The address to send withdrawn value.\n     */\n    function withdrawStake(address payable withdrawAddress) external;\n\n    /**\n     * Withdraw from the deposit.\n     * @param withdrawAddress - The address to send withdrawn value.\n     * @param withdrawAmount  - The amount to withdraw.\n     */\n    function withdrawTo(\n        address payable withdrawAddress,\n        uint256 withdrawAmount\n    ) external;\n}\n",
            keccak256: "0xbe5ca9e7f254d031687419e7b96ef48c9c63e9398bbe992dc72ffc6dc14e0a04",
            license: "GPL-3.0-only",
        },
    },
    version: 1,
};
