{"file_path":"contracts/BGBTC.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {ERC20Capped, ERC20} from \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Capped.sol\";\nimport {ERC20Burnable} from \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol\";\nimport {Common} from \"contracts/Common.sol\";\nimport {IBGBTC} from \"contracts/interfaces/IBGBTC.sol\";\n\ncontract BGBTC is ERC20Capped, ERC20Burnable, Common, IBGBTC {\n    address public minter;\n    address public pauseTransferOperator;\n    bool public transferPaused;\n    mapping(address account => bool blacklisted) public isBlacklisted;\n\n    uint256 public constant TOKEN_CAP = 21000000 * 10 ** 8;\n    address public mintDestination;\n\n    modifier onlyPauseTransferOperator() {\n        if (_msgSender() != pauseTransferOperator) {\n            revert OnlyPauseTransferOperator();\n        }\n        _;\n    }\n\n    modifier whenTransferNotPaused() {\n        if (transferPaused) {\n            revert TransferPaused();\n        }\n        _;\n    }\n\n    modifier whenTransferPaused() {\n        if (!transferPaused) {\n            revert TransferUnpaused();\n        }\n        _;\n    }\n\n    modifier whenNotBlacklisted(address from, address to) {\n        if (isBlacklisted[from] || isBlacklisted[to]) {\n            revert AddressBlackListed();\n        }\n        _;\n    }\n\n    modifier onlyMinter() {\n        if (_msgSender() != minter) {\n            revert OnlyMinter();\n        }\n        _;\n    }\n\n    constructor(\n        address _owner,\n        address _operator,\n        address _mintDestination,\n        address _safe,\n        address _initialCaller,\n        address _pauseTransferOperator\n    ) ERC20(\"Bitget Wrapped BTC\", \"BGBTC\") ERC20Capped(TOKEN_CAP) Common(_owner, _operator, _safe, _initialCaller) {\n        transferPaused = false;\n        _updateMintDestination(_mintDestination);\n        _updateTransferPauseOperator(_pauseTransferOperator);\n    }\n\n    function mint(uint256 value) external onlyMinter whenNotPaused {\n        if (value == 0) {\n            revert InvalidMintAmount();\n        }\n        _mint(mintDestination, value);\n    }\n\n    function decimals() public view virtual override returns (uint8) {\n        return 8;\n    }\n\n    function pauseTransfer() external whenTransferNotPaused onlyPauseTransferOperator {\n        transferPaused = true;\n        emit TransferHasPaused(_msgSender());\n    }\n\n    function unpauseTransfer() external whenTransferPaused onlyOwner {\n        transferPaused = false;\n        emit TransferHasUnpaused(_msgSender());\n    }\n\n    function burn(uint256 value) public virtual override whenNotPaused onlyCaller {\n        super.burn(value);\n    }\n\n    function burnFrom(address from, uint256 value) public virtual override whenNotPaused onlyCaller {\n        super.burnFrom(from, value);\n    }\n\n    function transfer(address recipient, uint256 amount) public virtual override whenTransferNotPaused returns (bool) {\n        return super.transfer(recipient, amount);\n    }\n\n    function transferFrom(address sender, address recipient, uint256 amount)\n        public\n        virtual\n        override\n        whenTransferNotPaused\n        returns (bool)\n    {\n        return super.transferFrom(sender, recipient, amount);\n    }\n\n    function _update(address from, address to, uint256 value)\n        internal\n        virtual\n        override(ERC20, ERC20Capped)\n        whenNotBlacklisted(from, to)\n    {\n        super._update(from, to, value);\n    }\n\n    function manageMinter(address account) external onlyOwner whenNotPaused {\n        if (account == address(0)) {\n            revert ZeroAddressNotAllowed();\n        }\n        if (account == minter) {\n            revert MinterAlreadySet();\n        }\n\n        address oldMinter = minter;\n\n        minter = account;\n\n        emit MinterChanged(oldMinter, minter);\n    }\n\n    function batchManageBlacklist(address[] calldata accounts, bool blacklisted) external onlyOwner whenNotPaused {\n        if (accounts.length == 0) {\n            revert EmptyArray();\n        }\n\n        if (accounts.length > 100) {\n            revert BatchTooLarge();\n        }\n\n        for (uint256 i = 0; i < accounts.length; i++) {\n            address account = accounts[i];\n\n            if (account == address(0)) {\n                revert ZeroAddressNotAllowed();\n            }\n\n            if (isBlacklisted[account] != blacklisted) {\n                isBlacklisted[account] = blacklisted;\n            }\n        }\n\n        emit BatchBlacklistUpdated(accounts, blacklisted);\n    }\n\n    function updateMintDestination(address mintDestinationAddr) external onlyOwner whenNotPaused {\n        _updateMintDestination(mintDestinationAddr);\n    }\n\n    function _updateMintDestination(address _mintDestinationAddr) private {\n        if (_mintDestinationAddr == address(0)) {\n            revert ZeroAddressNotAllowed();\n        }\n        if (_mintDestinationAddr == mintDestination) {\n            revert MintDestinationAlreadySet();\n        }\n\n        address oldMintDestination = mintDestination;\n        mintDestination = _mintDestinationAddr;\n\n        emit MintDestinationChanged(oldMintDestination, _mintDestinationAddr);\n    }\n\n    function updateTransferPauseOperator(address pauseTransferOperatorAddr) external onlyOwner whenNotPaused {\n        _updateTransferPauseOperator(pauseTransferOperatorAddr);\n    }\n\n    function _updateTransferPauseOperator(address _pauseTransferOperatorAddr) private {\n        if (_pauseTransferOperatorAddr == address(0)) {\n            revert ZeroAddressNotAllowed();\n        }\n        if (_pauseTransferOperatorAddr == pauseTransferOperator) {\n            revert TransferPauseOperatorAlreadySet();\n        }\n\n        address oldPauseTransferOperator = pauseTransferOperator;\n        pauseTransferOperator = _pauseTransferOperatorAddr;\n\n        emit PauseTransferOperatorChanged(oldPauseTransferOperator, _pauseTransferOperatorAddr);\n    }\n}\n","deployed_bytecode":"0x608060405234801561001057600080fd5b50600436106102d35760003560e01c806379ba509711610186578063a0e51018116100e3578063dd62ed3e11610097578063fb2cb34e11610071578063fb2cb34e146105d8578063fc9c8d39146105fd578063fe575a871461061057600080fd5b8063dd62ed3e1461057b578063e30c3978146105b4578063f2fde38b146105c557600080fd5b8063aabb5222116100c8578063aabb522214610542578063ac7475ed14610555578063ccec37161461056857600080fd5b8063a0e510181461051c578063a9059cbb1461052f57600080fd5b80638da5cb5b1161013a57806395d89b411161011f57806395d89b41146104f35780639a6524f1146104fb578063a0712d681461050957600080fd5b80638da5cb5b146104da57806390a70139146104eb57600080fd5b806381bde1201161016b57806381bde120146104ac5780638456cb59146104bf57806385d74e73146104c757600080fd5b806379ba50971461049157806379cc67901461049957600080fd5b80632bfea0e41161023457806342966c68116101e85780635c975abb116101cd5780635c975abb1461043d57806370a0823114610460578063715018a61461048957600080fd5b806342966c6814610417578063570ca7351461042a57600080fd5b8063355274ea11610219578063355274ea146103d65780633f4ba83a146103fc578063407e28f41461040457600080fd5b80632bfea0e4146103bf578063313ce567146103c757600080fd5b806318a1c9541161028b5780632341ba85116102705780632341ba8514610386578063235d69c11461039957806323b872dd146103ac57600080fd5b806318a1c9541461036957806320800a001461037c57600080fd5b8063095ea7b3116102bc578063095ea7b31461032157806318160ddd14610344578063186f03541461035657600080fd5b806306fdde03146102d857806307546172146102f6575b600080fd5b6102e0610633565b6040516102ed9190611f98565b60405180910390f35b600a54610309906001600160a01b031681565b6040516001600160a01b0390911681526020016102ed565b61033461032f366004612020565b6106c5565b60405190151581526020016102ed565b6002545b6040519081526020016102ed565b600854610309906001600160a01b031681565b600b54610309906001600160a01b031681565b6103846106df565b005b61038461039436600461204a565b610786565b6103846103a7366004612065565b6107a2565b6103346103ba3660046120f3565b610951565b6103846109bc565b604051600881526020016102ed565b7f000000000000000000000000000000000000000000000000000775f05a074000610348565b610384610a80565b61038461041236600461204a565b610a92565b610384610425366004612130565b610b94565b600754610309906001600160a01b031681565b60065474010000000000000000000000000000000000000000900460ff16610334565b61034861046e36600461204a565b6001600160a01b031660009081526020819052604090205490565b610384610bf2565b610384610c04565b6103846104a7366004612020565b610c63565b6103846104ba36600461204a565b610cc6565b610384610cd7565b600d54610309906001600160a01b031681565b6005546001600160a01b0316610309565b610384610d2c565b6102e0610e35565b610348660775f05a07400081565b610384610517366004612130565b610e44565b61038461052a36600461204a565b610ee9565b61033461053d366004612020565b610f02565b61038461055036600461204a565b610f6b565b61038461056336600461204a565b610f84565b61038461057636600461204a565b610f95565b610348610589366004612149565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6006546001600160a01b0316610309565b6103846105d336600461204a565b6110c7565b600b546103349074010000000000000000000000000000000000000000900460ff1681565b600954610309906001600160a01b031681565b61033461061e36600461204a565b600c6020526000908152604090205460ff1681565b6060600380546106429061217c565b80601f016020809104026020016040519081016040528092919081815260200182805461066e9061217c565b80156106bb5780601f10610690576101008083540402835291602001916106bb565b820191906000526020600020905b81548152906001019060200180831161069e57829003601f168201915b5050505050905090565b6000336106d3818585611150565b60019150505b92915050565b6007546001600160a01b0316336001600160a01b03161461072c576040517f27e1f1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600854610742906001600160a01b031647611162565b6008546040514781526001600160a01b03909116907f77f67778e9529a2fd2147ffb2b10ca2e0d1efd8cb925e1f1d5702e39c5fa8da69060200160405180910390a2565b61078e6111fd565b610796611243565b61079f81611298565b50565b6107aa6111fd565b6107b2611243565b60008290036107ed576040517f521299a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6064821115610828576040517f0b7d62e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82811015610910576000848483818110610847576108476121cf565b905060200201602081019061085c919061204a565b90506001600160a01b03811661089e576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166000908152600c602052604090205460ff16151583151514610907576001600160a01b0381166000908152600c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168415151790555b5060010161082b565b507fffbd0267db706b23a5b9a76b5318e5c068ff754607f203a3591eb81c1eb0597c838383604051610944939291906121fe565b60405180910390a1505050565b600b5460009074010000000000000000000000000000000000000000900460ff16156109a9576040517fcd1fda9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b4848484611389565b949350505050565b600b5474010000000000000000000000000000000000000000900460ff16610a10576040517f90f85aa200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a186111fd565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557fe230694d4124d15d4222c7e09384c68619f24e35ef40684e8bcb1823f6eb74c1335b6040516001600160a01b03909116815260200160405180910390a1565b610a886111fd565b610a906113ad565b565b610a9a6111fd565b610aa2611243565b6001600160a01b038116610ae2576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a546001600160a01b0390811690821603610b2a576040517ff119708d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3b0007eb941cf645526cbb3a4fdaecda9d28ce4843167d9263b536a1f1edc0f690600090a35050565b610b9c611243565b6009546001600160a01b0316336001600160a01b031614610be9576040517fbc8fb4ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61079f81611404565b610bfa6111fd565b610a90600061140e565b60065433906001600160a01b03168114610c5a576040517f118cdaa70000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b61079f8161140e565b610c6b611243565b6009546001600160a01b0316336001600160a01b031614610cb8576040517fbc8fb4ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cc2828261143f565b5050565b610cce6111fd565b61079f81611454565b6007546001600160a01b0316336001600160a01b031614610d24576040517f27e1f1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a90611546565b600b5474010000000000000000000000000000000000000000900460ff1615610d81576040517fcd1fda9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b546001600160a01b0316336001600160a01b031614610dce576040517f2cd1603a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f49ad30017d8d8592f96ba17c8dc5944e1ebd14d12961d73f0a6e5e54efc77d3a610a633390565b6060600480546106429061217c565b600a546001600160a01b0316336001600160a01b031614610e91576040517f9cdc2ed500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e99611243565b80600003610ed3576040517fccfad01800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d5461079f906001600160a01b0316826115b5565b610ef16111fd565b610ef9611243565b61079f81611604565b600b5460009074010000000000000000000000000000000000000000900460ff1615610f5a576040517fcd1fda9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f6483836116f6565b9392505050565b610f736111fd565b610f7b611243565b61079f81611704565b610f8c6111fd565b61079f816117f6565b6007546001600160a01b0316336001600160a01b031614610fe2576040517f27e1f1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152611080916001600160a01b0390811691908416906370a0823190602401602060405180830381865afa15801561104b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106f9190612255565b6001600160a01b03841691906118e8565b6008546040516001600160a01b039182168152908216907f8c4e91db779d40eb9afbcebd8cf9aa9195b7b057611e32ad5dc9e4025f56ada09060200160405180910390a250565b6110cf6111fd565b600680546001600160a01b0383167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556111186005546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61115d8383836001611968565b505050565b600080600080600085875af190508061115d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5f7472616e736665724574683a20457468207472616e73666572206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610c51565b6005546001600160a01b03163314610a90576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610c51565b60065474010000000000000000000000000000000000000000900460ff1615610a90576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166112d8576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009546001600160a01b0380831691160361131f576040517f652dbaa100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907fa6933f9f697543ec771a146b7f9e62ada3b63963182f5055426aeda98ae2ed6490600090a35050565b600033611397858285611a70565b6113a2858585611b1f565b506001949350505050565b6113b5611bb0565b600680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33610a63565b61079f3382611c04565b600680547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561079f81611c53565b61144a823383611a70565b610cc28282611c04565b6001600160a01b038116611494576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008546001600160a01b03908116908216036114dc576040517f8b16f96700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907fd985accb6cfdb092cc434f7772495b303081d86bbf22637402146c9ba1977d4890600090a35050565b61154e611243565b600680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610a633390565b6001600160a01b0382166115f8576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610c51565b610cc260008383611cbd565b6001600160a01b038116611644576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b546001600160a01b039081169082160361168c576040517f9d4c98e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907fb27455687cdac873b1c3771d1de067957c14ec41b9a69b49401fb8ea12f2486b90600090a35050565b6000336106d3818585611b1f565b6001600160a01b038116611744576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d546001600160a01b039081169082160361178c576040517f2490526b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907fa07ccc058ad99e8af4a8ce34a08f9f45846f034300bc144b98618a19e031078390600090a35050565b6001600160a01b038116611836576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546001600160a01b039081169082160361187e576040517fc4142b4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad0390600090a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261115d908490611d49565b6001600160a01b0384166119ab576040517fe602df0500000000000000000000000000000000000000000000000000000000815260006004820152602401610c51565b6001600160a01b0383166119ee576040517f94280d6200000000000000000000000000000000000000000000000000000000815260006004820152602401610c51565b6001600160a01b0380851660009081526001602090815260408083209387168352929052208290558015611a6a57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611a6191815260200190565b60405180910390a35b50505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611a6a5781811015611b10576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401610c51565b611a6a84848484036000611968565b6001600160a01b038316611b62576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610c51565b6001600160a01b038216611ba5576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610c51565b61115d838383611cbd565b60065474010000000000000000000000000000000000000000900460ff16610a90576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216611c47576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610c51565b610cc282600083611cbd565b600580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166000908152600c60205260409020548390839060ff1680611d0057506001600160a01b0381166000908152600c602052604090205460ff165b15611d37576040517f0465462a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d42858585611dd3565b5050505050565b600080602060008451602086016000885af180611d6c576040513d6000823e3d81fd5b50506000513d91508115611d84578060011415611d91565b6001600160a01b0384163b155b15611a6a576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610c51565b611dde838383611e55565b6001600160a01b03831661115d576002547f000000000000000000000000000000000000000000000000000775f05a0740009081811115611d42576040517f9e79f8540000000000000000000000000000000000000000000000000000000081526004810182905260248101839052604401610c51565b6001600160a01b038316611e80578060026000828254611e75919061226e565b90915550611f0b9050565b6001600160a01b03831660009081526020819052604090205481811015611eec576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024810182905260448101839052606401610c51565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216611f2757600280548290039055611f46565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f8b91815260200190565b60405180910390a3505050565b602081526000825180602084015260005b81811015611fc65760208186018101516040868401015201611fa9565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b80356001600160a01b038116811461201b57600080fd5b919050565b6000806040838503121561203357600080fd5b61203c83612004565b946020939093013593505050565b60006020828403121561205c57600080fd5b610f6482612004565b60008060006040848603121561207a57600080fd5b833567ffffffffffffffff81111561209157600080fd5b8401601f810186136120a257600080fd5b803567ffffffffffffffff8111156120b957600080fd5b8660208260051b84010111156120ce57600080fd5b60209182019450925084013580151581146120e857600080fd5b809150509250925092565b60008060006060848603121561210857600080fd5b61211184612004565b925061211f60208501612004565b929592945050506040919091013590565b60006020828403121561214257600080fd5b5035919050565b6000806040838503121561215c57600080fd5b61216583612004565b915061217360208401612004565b90509250929050565b600181811c9082168061219057607f821691505b6020821081036121c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6040808252810183905260008460608301825b8681101561223f576001600160a01b0361222a84612004565b16825260209283019290910190600101612211565b5080925050508215156020830152949350505050565b60006020828403121561226757600080fd5b5051919050565b808201808211156106d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea264697066735822122090c25d7a770d9953beae5c6d9240af8dd13395be6795303aea5c7de8685d318964736f6c634300081a0033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":10000},"remappings":[]},"optimization_runs":10000,"sourcify_repo_url":"https://repo.sourcify.dev/contracts/full_match/1/0x0520930F21b14Cafac7a27b102487beE7138a017/","decoded_constructor_args":[["0x3DF3c01b72dC5d63565Af0bCB20d847227c2201A",{"internalType":"address","name":"_owner","type":"address"}],["0x5Db8606F2927e7173b3Cab5a4c512d9f00BBF193",{"internalType":"address","name":"_operator","type":"address"}],["0x8F1aaE2978f35E710E34db6F3139Db629F608335",{"internalType":"address","name":"_mintDestination","type":"address"}],["0x9287B8E84d972DD02f618BBEd45b9A6d7ed16384",{"internalType":"address","name":"_safe","type":"address"}],["0x69C46c049502Aeb0d9c6a01432e1d2C2c8384993",{"internalType":"address","name":"_initialCaller","type":"address"}],["0x5Db8606F2927e7173b3Cab5a4c512d9f00BBF193",{"internalType":"address","name":"_pauseTransferOperator","type":"address"}]],"compiler_version":"0.8.26+commit.8a97fa7a","is_verified_via_verifier_alliance":false,"verified_at":"2025-05-30T10:42:36.597257Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x60a060405234801561001057600080fd5b506040516129fd3803806129fd83398101604081905261002f9161052c565b8585848483660775f05a0740006040518060400160405280601281526020017142697467657420577261707065642042544360701b81525060405180604001604052806005815260200164424742544360d81b8152508160039081610094919061063f565b5060046100a1828261063f565b505050806000036100cd5760405163392e1e2760e01b8152600060048201526024015b60405180910390fd5b6080526001600160a01b0381166100fa57604051631e4fbdf760e01b8152600060048201526024016100c4565b6101038161015b565b506006805460ff60a01b1916905561011a83610177565b6101238261021f565b61012c816102c7565b5050600b805460ff60a01b191690555061014790508461036e565b61015081610416565b5050505050506106fd565b600680546001600160a01b0319169055610174816104be565b50565b6001600160a01b03811661019e576040516342bcdf7f60e11b815260040160405180910390fd5b6007546001600160a01b03908116908216036101cd5760405163c4142b4160e01b815260040160405180910390fd5b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad0390600090a35050565b6001600160a01b038116610246576040516342bcdf7f60e11b815260040160405180910390fd5b6008546001600160a01b039081169082160361027557604051638b16f96760e01b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fd985accb6cfdb092cc434f7772495b303081d86bbf22637402146c9ba1977d4890600090a35050565b6001600160a01b0381166102ee576040516342bcdf7f60e11b815260040160405180910390fd5b6009546001600160a01b0380831691160361031c5760405163652dbaa160e01b815260040160405180910390fd5b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fa6933f9f697543ec771a146b7f9e62ada3b63963182f5055426aeda98ae2ed6490600090a35050565b6001600160a01b038116610395576040516342bcdf7f60e11b815260040160405180910390fd5b600d546001600160a01b03908116908216036103c457604051632490526b60e01b815260040160405180910390fd5b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fa07ccc058ad99e8af4a8ce34a08f9f45846f034300bc144b98618a19e031078390600090a35050565b6001600160a01b03811661043d576040516342bcdf7f60e11b815260040160405180910390fd5b600b546001600160a01b039081169082160361046c57604051639d4c98e560e01b815260040160405180910390fd5b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fb27455687cdac873b1c3771d1de067957c14ec41b9a69b49401fb8ea12f2486b90600090a35050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80516001600160a01b038116811461052757600080fd5b919050565b60008060008060008060c0878903121561054557600080fd5b61054e87610510565b955061055c60208801610510565b945061056a60408801610510565b935061057860608801610510565b925061058660808801610510565b915061059460a08801610510565b90509295509295509295565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806105ca57607f821691505b6020821081036105ea57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561063a57806000526020600020601f840160051c810160208510156106175750805b601f840160051c820191505b818110156106375760008155600101610623565b50505b505050565b81516001600160401b03811115610658576106586105a0565b61066c8161066684546105b6565b846105f0565b6020601f8211600181146106a057600083156106885750848201515b600019600385901b1c1916600184901b178455610637565b600084815260208120601f198516915b828110156106d057878501518255602094850194600190920191016106b0565b50848210156106ee5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6080516122de61071f600039600081816103d80152611df101526122de6000f3fe608060405234801561001057600080fd5b50600436106102d35760003560e01c806379ba509711610186578063a0e51018116100e3578063dd62ed3e11610097578063fb2cb34e11610071578063fb2cb34e146105d8578063fc9c8d39146105fd578063fe575a871461061057600080fd5b8063dd62ed3e1461057b578063e30c3978146105b4578063f2fde38b146105c557600080fd5b8063aabb5222116100c8578063aabb522214610542578063ac7475ed14610555578063ccec37161461056857600080fd5b8063a0e510181461051c578063a9059cbb1461052f57600080fd5b80638da5cb5b1161013a57806395d89b411161011f57806395d89b41146104f35780639a6524f1146104fb578063a0712d681461050957600080fd5b80638da5cb5b146104da57806390a70139146104eb57600080fd5b806381bde1201161016b57806381bde120146104ac5780638456cb59146104bf57806385d74e73146104c757600080fd5b806379ba50971461049157806379cc67901461049957600080fd5b80632bfea0e41161023457806342966c68116101e85780635c975abb116101cd5780635c975abb1461043d57806370a0823114610460578063715018a61461048957600080fd5b806342966c6814610417578063570ca7351461042a57600080fd5b8063355274ea11610219578063355274ea146103d65780633f4ba83a146103fc578063407e28f41461040457600080fd5b80632bfea0e4146103bf578063313ce567146103c757600080fd5b806318a1c9541161028b5780632341ba85116102705780632341ba8514610386578063235d69c11461039957806323b872dd146103ac57600080fd5b806318a1c9541461036957806320800a001461037c57600080fd5b8063095ea7b3116102bc578063095ea7b31461032157806318160ddd14610344578063186f03541461035657600080fd5b806306fdde03146102d857806307546172146102f6575b600080fd5b6102e0610633565b6040516102ed9190611f98565b60405180910390f35b600a54610309906001600160a01b031681565b6040516001600160a01b0390911681526020016102ed565b61033461032f366004612020565b6106c5565b60405190151581526020016102ed565b6002545b6040519081526020016102ed565b600854610309906001600160a01b031681565b600b54610309906001600160a01b031681565b6103846106df565b005b61038461039436600461204a565b610786565b6103846103a7366004612065565b6107a2565b6103346103ba3660046120f3565b610951565b6103846109bc565b604051600881526020016102ed565b7f0000000000000000000000000000000000000000000000000000000000000000610348565b610384610a80565b61038461041236600461204a565b610a92565b610384610425366004612130565b610b94565b600754610309906001600160a01b031681565b60065474010000000000000000000000000000000000000000900460ff16610334565b61034861046e36600461204a565b6001600160a01b031660009081526020819052604090205490565b610384610bf2565b610384610c04565b6103846104a7366004612020565b610c63565b6103846104ba36600461204a565b610cc6565b610384610cd7565b600d54610309906001600160a01b031681565b6005546001600160a01b0316610309565b610384610d2c565b6102e0610e35565b610348660775f05a07400081565b610384610517366004612130565b610e44565b61038461052a36600461204a565b610ee9565b61033461053d366004612020565b610f02565b61038461055036600461204a565b610f6b565b61038461056336600461204a565b610f84565b61038461057636600461204a565b610f95565b610348610589366004612149565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6006546001600160a01b0316610309565b6103846105d336600461204a565b6110c7565b600b546103349074010000000000000000000000000000000000000000900460ff1681565b600954610309906001600160a01b031681565b61033461061e36600461204a565b600c6020526000908152604090205460ff1681565b6060600380546106429061217c565b80601f016020809104026020016040519081016040528092919081815260200182805461066e9061217c565b80156106bb5780601f10610690576101008083540402835291602001916106bb565b820191906000526020600020905b81548152906001019060200180831161069e57829003601f168201915b5050505050905090565b6000336106d3818585611150565b60019150505b92915050565b6007546001600160a01b0316336001600160a01b03161461072c576040517f27e1f1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600854610742906001600160a01b031647611162565b6008546040514781526001600160a01b03909116907f77f67778e9529a2fd2147ffb2b10ca2e0d1efd8cb925e1f1d5702e39c5fa8da69060200160405180910390a2565b61078e6111fd565b610796611243565b61079f81611298565b50565b6107aa6111fd565b6107b2611243565b60008290036107ed576040517f521299a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6064821115610828576040517f0b7d62e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82811015610910576000848483818110610847576108476121cf565b905060200201602081019061085c919061204a565b90506001600160a01b03811661089e576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166000908152600c602052604090205460ff16151583151514610907576001600160a01b0381166000908152600c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168415151790555b5060010161082b565b507fffbd0267db706b23a5b9a76b5318e5c068ff754607f203a3591eb81c1eb0597c838383604051610944939291906121fe565b60405180910390a1505050565b600b5460009074010000000000000000000000000000000000000000900460ff16156109a9576040517fcd1fda9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109b4848484611389565b949350505050565b600b5474010000000000000000000000000000000000000000900460ff16610a10576040517f90f85aa200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a186111fd565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557fe230694d4124d15d4222c7e09384c68619f24e35ef40684e8bcb1823f6eb74c1335b6040516001600160a01b03909116815260200160405180910390a1565b610a886111fd565b610a906113ad565b565b610a9a6111fd565b610aa2611243565b6001600160a01b038116610ae2576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a546001600160a01b0390811690821603610b2a576040517ff119708d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f3b0007eb941cf645526cbb3a4fdaecda9d28ce4843167d9263b536a1f1edc0f690600090a35050565b610b9c611243565b6009546001600160a01b0316336001600160a01b031614610be9576040517fbc8fb4ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61079f81611404565b610bfa6111fd565b610a90600061140e565b60065433906001600160a01b03168114610c5a576040517f118cdaa70000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024015b60405180910390fd5b61079f8161140e565b610c6b611243565b6009546001600160a01b0316336001600160a01b031614610cb8576040517fbc8fb4ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cc2828261143f565b5050565b610cce6111fd565b61079f81611454565b6007546001600160a01b0316336001600160a01b031614610d24576040517f27e1f1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a90611546565b600b5474010000000000000000000000000000000000000000900460ff1615610d81576040517fcd1fda9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b546001600160a01b0316336001600160a01b031614610dce576040517f2cd1603a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f49ad30017d8d8592f96ba17c8dc5944e1ebd14d12961d73f0a6e5e54efc77d3a610a633390565b6060600480546106429061217c565b600a546001600160a01b0316336001600160a01b031614610e91576040517f9cdc2ed500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e99611243565b80600003610ed3576040517fccfad01800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d5461079f906001600160a01b0316826115b5565b610ef16111fd565b610ef9611243565b61079f81611604565b600b5460009074010000000000000000000000000000000000000000900460ff1615610f5a576040517fcd1fda9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f6483836116f6565b9392505050565b610f736111fd565b610f7b611243565b61079f81611704565b610f8c6111fd565b61079f816117f6565b6007546001600160a01b0316336001600160a01b031614610fe2576040517f27e1f1e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152611080916001600160a01b0390811691908416906370a0823190602401602060405180830381865afa15801561104b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106f9190612255565b6001600160a01b03841691906118e8565b6008546040516001600160a01b039182168152908216907f8c4e91db779d40eb9afbcebd8cf9aa9195b7b057611e32ad5dc9e4025f56ada09060200160405180910390a250565b6110cf6111fd565b600680546001600160a01b0383167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556111186005546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61115d8383836001611968565b505050565b600080600080600085875af190508061115d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5f7472616e736665724574683a20457468207472616e73666572206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610c51565b6005546001600160a01b03163314610a90576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610c51565b60065474010000000000000000000000000000000000000000900460ff1615610a90576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166112d8576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009546001600160a01b0380831691160361131f576040517f652dbaa100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907fa6933f9f697543ec771a146b7f9e62ada3b63963182f5055426aeda98ae2ed6490600090a35050565b600033611397858285611a70565b6113a2858585611b1f565b506001949350505050565b6113b5611bb0565b600680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33610a63565b61079f3382611c04565b600680547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561079f81611c53565b61144a823383611a70565b610cc28282611c04565b6001600160a01b038116611494576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008546001600160a01b03908116908216036114dc576040517f8b16f96700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907fd985accb6cfdb092cc434f7772495b303081d86bbf22637402146c9ba1977d4890600090a35050565b61154e611243565b600680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610a633390565b6001600160a01b0382166115f8576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610c51565b610cc260008383611cbd565b6001600160a01b038116611644576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b546001600160a01b039081169082160361168c576040517f9d4c98e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907fb27455687cdac873b1c3771d1de067957c14ec41b9a69b49401fb8ea12f2486b90600090a35050565b6000336106d3818585611b1f565b6001600160a01b038116611744576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d546001600160a01b039081169082160361178c576040517f2490526b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907fa07ccc058ad99e8af4a8ce34a08f9f45846f034300bc144b98618a19e031078390600090a35050565b6001600160a01b038116611836576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546001600160a01b039081169082160361187e576040517fc4142b4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad0390600090a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261115d908490611d49565b6001600160a01b0384166119ab576040517fe602df0500000000000000000000000000000000000000000000000000000000815260006004820152602401610c51565b6001600160a01b0383166119ee576040517f94280d6200000000000000000000000000000000000000000000000000000000815260006004820152602401610c51565b6001600160a01b0380851660009081526001602090815260408083209387168352929052208290558015611a6a57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611a6191815260200190565b60405180910390a35b50505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611a6a5781811015611b10576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401610c51565b611a6a84848484036000611968565b6001600160a01b038316611b62576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610c51565b6001600160a01b038216611ba5576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610c51565b61115d838383611cbd565b60065474010000000000000000000000000000000000000000900460ff16610a90576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216611c47576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610c51565b610cc282600083611cbd565b600580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166000908152600c60205260409020548390839060ff1680611d0057506001600160a01b0381166000908152600c602052604090205460ff165b15611d37576040517f0465462a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d42858585611dd3565b5050505050565b600080602060008451602086016000885af180611d6c576040513d6000823e3d81fd5b50506000513d91508115611d84578060011415611d91565b6001600160a01b0384163b155b15611a6a576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610c51565b611dde838383611e55565b6001600160a01b03831661115d576002547f00000000000000000000000000000000000000000000000000000000000000009081811115611d42576040517f9e79f8540000000000000000000000000000000000000000000000000000000081526004810182905260248101839052604401610c51565b6001600160a01b038316611e80578060026000828254611e75919061226e565b90915550611f0b9050565b6001600160a01b03831660009081526020819052604090205481811015611eec576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024810182905260448101839052606401610c51565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216611f2757600280548290039055611f46565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f8b91815260200190565b60405180910390a3505050565b602081526000825180602084015260005b81811015611fc65760208186018101516040868401015201611fa9565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b80356001600160a01b038116811461201b57600080fd5b919050565b6000806040838503121561203357600080fd5b61203c83612004565b946020939093013593505050565b60006020828403121561205c57600080fd5b610f6482612004565b60008060006040848603121561207a57600080fd5b833567ffffffffffffffff81111561209157600080fd5b8401601f810186136120a257600080fd5b803567ffffffffffffffff8111156120b957600080fd5b8660208260051b84010111156120ce57600080fd5b60209182019450925084013580151581146120e857600080fd5b809150509250925092565b60008060006060848603121561210857600080fd5b61211184612004565b925061211f60208501612004565b929592945050506040919091013590565b60006020828403121561214257600080fd5b5035919050565b6000806040838503121561215c57600080fd5b61216583612004565b915061217360208401612004565b90509250929050565b600181811c9082168061219057607f821691505b6020821081036121c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6040808252810183905260008460608301825b8681101561223f576001600160a01b0361222a84612004565b16825260209283019290910190600101612211565b5080925050508215156020830152949350505050565b60006020828403121561226757600080fd5b5051919050565b808201808211156106d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea264697066735822122090c25d7a770d9953beae5c6d9240af8dd13395be6795303aea5c7de8685d318964736f6c634300081a00330000000000000000000000003df3c01b72dc5d63565af0bcb20d847227c2201a0000000000000000000000005db8606f2927e7173b3cab5a4c512d9f00bbf1930000000000000000000000008f1aae2978f35e710e34db6f3139db629f6083350000000000000000000000009287b8e84d972dd02f618bbed45b9a6d7ed1638400000000000000000000000069c46c049502aeb0d9c6a01432e1d2c2c83849930000000000000000000000005db8606f2927e7173b3cab5a4c512d9f00bbf193","name":"BGBTC","is_blueprint":false,"license_type":"none","is_fully_verified":true,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"paris","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":true,"additional_sources":[{"file_path":"@openzeppelin/contracts/access/Ownable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n    address private _owner;\n\n    /**\n     * @dev The caller account is not authorized to perform an operation.\n     */\n    error OwnableUnauthorizedAccount(address account);\n\n    /**\n     * @dev The owner is not a valid owner account. (eg. `address(0)`)\n     */\n    error OwnableInvalidOwner(address owner);\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n     */\n    constructor(address initialOwner) {\n        if (initialOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(initialOwner);\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        if (owner() != _msgSender()) {\n            revert OwnableUnauthorizedAccount(_msgSender());\n        }\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby disabling any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _transferOwnership(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        if (newOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        address oldOwner = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/access/Ownable2Step.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.20;\n\nimport {Ownable} from \"./Ownable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * This extension of the {Ownable} contract includes a two-step mechanism to transfer\n * ownership, where the new owner must call {acceptOwnership} in order to replace the\n * old one. This can help prevent common mistakes, such as transfers of ownership to\n * incorrect accounts, or to contracts that are unable to interact with the\n * permission system.\n *\n * The initial owner is specified at deployment time in the constructor for `Ownable`. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2Step is Ownable {\n    address private _pendingOwner;\n\n    event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Returns the address of the pending owner.\n     */\n    function pendingOwner() public view virtual returns (address) {\n        return _pendingOwner;\n    }\n\n    /**\n     * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n     * Can only be called by the current owner.\n     *\n     * Setting `newOwner` to the zero address is allowed; this can be used to cancel an initiated ownership transfer.\n     */\n    function transferOwnership(address newOwner) public virtual override onlyOwner {\n        _pendingOwner = newOwner;\n        emit OwnershipTransferStarted(owner(), newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual override {\n        delete _pendingOwner;\n        super._transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev The new owner accepts the ownership transfer.\n     */\n    function acceptOwnership() public virtual {\n        address sender = _msgSender();\n        if (pendingOwner() != sender) {\n            revert OwnableUnauthorizedAccount(sender);\n        }\n        _transferOwnership(sender);\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/interfaces/IERC1363.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n    /*\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n     * 0xb0202a11 ===\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n     */\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @param data Additional data with no specified format, sent in call to `spender`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"},{"file_path":"@openzeppelin/contracts/interfaces/IERC165.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"},{"file_path":"@openzeppelin/contracts/interfaces/IERC20.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"},{"file_path":"@openzeppelin/contracts/interfaces/draft-IERC6093.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC20InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC20InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     * @param allowance Amount of tokens a `spender` is allowed to operate with.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC20InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n    /**\n     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.\n     * Used in balance queries.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721InvalidOwner(address owner);\n\n    /**\n     * @dev Indicates a `tokenId` whose `owner` is the zero address.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721NonexistentToken(uint256 tokenId);\n\n    /**\n     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param tokenId Identifier number of a token.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC721InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC721InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC721InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC1155InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC1155InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC1155MissingApprovalForAll(address operator, address owner);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC1155InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC1155InvalidOperator(address operator);\n\n    /**\n     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n     * Used in batch transfers.\n     * @param idsLength Length of the array of token identifiers\n     * @param valuesLength Length of the array of token amounts\n     */\n    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"},{"file_path":"@openzeppelin/contracts/token/ERC20/ERC20.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC20Metadata} from \"./extensions/IERC20Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC20Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC-20\n * applications.\n */\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\n    mapping(address account => uint256) private _balances;\n\n    mapping(address account => mapping(address spender => uint256)) private _allowances;\n\n    uint256 private _totalSupply;\n\n    string private _name;\n    string private _symbol;\n\n    /**\n     * @dev Sets the values for {name} and {symbol}.\n     *\n     * All two of these values are immutable: they can only be set once during\n     * construction.\n     */\n    constructor(string memory name_, string memory symbol_) {\n        _name = name_;\n        _symbol = symbol_;\n    }\n\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() public view virtual returns (string memory) {\n        return _name;\n    }\n\n    /**\n     * @dev Returns the symbol of the token, usually a shorter version of the\n     * name.\n     */\n    function symbol() public view virtual returns (string memory) {\n        return _symbol;\n    }\n\n    /**\n     * @dev Returns the number of decimals used to get its user representation.\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\n     * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n     *\n     * Tokens usually opt for a value of 18, imitating the relationship between\n     * Ether and Wei. This is the default value returned by this function, unless\n     * it's overridden.\n     *\n     * NOTE: This information is only used for _display_ purposes: it in\n     * no way affects any of the arithmetic of the contract, including\n     * {IERC20-balanceOf} and {IERC20-transfer}.\n     */\n    function decimals() public view virtual returns (uint8) {\n        return 18;\n    }\n\n    /**\n     * @dev See {IERC20-totalSupply}.\n     */\n    function totalSupply() public view virtual returns (uint256) {\n        return _totalSupply;\n    }\n\n    /**\n     * @dev See {IERC20-balanceOf}.\n     */\n    function balanceOf(address account) public view virtual returns (uint256) {\n        return _balances[account];\n    }\n\n    /**\n     * @dev See {IERC20-transfer}.\n     *\n     * Requirements:\n     *\n     * - `to` cannot be the zero address.\n     * - the caller must have a balance of at least `value`.\n     */\n    function transfer(address to, uint256 value) public virtual returns (bool) {\n        address owner = _msgSender();\n        _transfer(owner, to, value);\n        return true;\n    }\n\n    /**\n     * @dev See {IERC20-allowance}.\n     */\n    function allowance(address owner, address spender) public view virtual returns (uint256) {\n        return _allowances[owner][spender];\n    }\n\n    /**\n     * @dev See {IERC20-approve}.\n     *\n     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n     * `transferFrom`. This is semantically equivalent to an infinite approval.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     */\n    function approve(address spender, uint256 value) public virtual returns (bool) {\n        address owner = _msgSender();\n        _approve(owner, spender, value);\n        return true;\n    }\n\n    /**\n     * @dev See {IERC20-transferFrom}.\n     *\n     * Skips emitting an {Approval} event indicating an allowance update. This is not\n     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].\n     *\n     * NOTE: Does not update the allowance if the current allowance\n     * is the maximum `uint256`.\n     *\n     * Requirements:\n     *\n     * - `from` and `to` cannot be the zero address.\n     * - `from` must have a balance of at least `value`.\n     * - the caller must have allowance for ``from``'s tokens of at least\n     * `value`.\n     */\n    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n        address spender = _msgSender();\n        _spendAllowance(from, spender, value);\n        _transfer(from, to, value);\n        return true;\n    }\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to`.\n     *\n     * This internal function is equivalent to {transfer}, and can be used to\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\n     *\n     * Emits a {Transfer} event.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead.\n     */\n    function _transfer(address from, address to, uint256 value) internal {\n        if (from == address(0)) {\n            revert ERC20InvalidSender(address(0));\n        }\n        if (to == address(0)) {\n            revert ERC20InvalidReceiver(address(0));\n        }\n        _update(from, to, value);\n    }\n\n    /**\n     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n     * this function.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _update(address from, address to, uint256 value) internal virtual {\n        if (from == address(0)) {\n            // Overflow check required: The rest of the code assumes that totalSupply never overflows\n            _totalSupply += value;\n        } else {\n            uint256 fromBalance = _balances[from];\n            if (fromBalance < value) {\n                revert ERC20InsufficientBalance(from, fromBalance, value);\n            }\n            unchecked {\n                // Overflow not possible: value <= fromBalance <= totalSupply.\n                _balances[from] = fromBalance - value;\n            }\n        }\n\n        if (to == address(0)) {\n            unchecked {\n                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n                _totalSupply -= value;\n            }\n        } else {\n            unchecked {\n                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n                _balances[to] += value;\n            }\n        }\n\n        emit Transfer(from, to, value);\n    }\n\n    /**\n     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n     * Relies on the `_update` mechanism\n     *\n     * Emits a {Transfer} event with `from` set to the zero address.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead.\n     */\n    function _mint(address account, uint256 value) internal {\n        if (account == address(0)) {\n            revert ERC20InvalidReceiver(address(0));\n        }\n        _update(address(0), account, value);\n    }\n\n    /**\n     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n     * Relies on the `_update` mechanism.\n     *\n     * Emits a {Transfer} event with `to` set to the zero address.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead\n     */\n    function _burn(address account, uint256 value) internal {\n        if (account == address(0)) {\n            revert ERC20InvalidSender(address(0));\n        }\n        _update(account, address(0), value);\n    }\n\n    /**\n     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.\n     *\n     * This internal function is equivalent to `approve`, and can be used to\n     * e.g. set automatic allowances for certain subsystems, etc.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `owner` cannot be the zero address.\n     * - `spender` cannot be the zero address.\n     *\n     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n     */\n    function _approve(address owner, address spender, uint256 value) internal {\n        _approve(owner, spender, value, true);\n    }\n\n    /**\n     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n     *\n     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any\n     * `Approval` event during `transferFrom` operations.\n     *\n     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to\n     * true using the following override:\n     *\n     * ```solidity\n     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n     *     super._approve(owner, spender, value, true);\n     * }\n     * ```\n     *\n     * Requirements are the same as {_approve}.\n     */\n    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n        if (owner == address(0)) {\n            revert ERC20InvalidApprover(address(0));\n        }\n        if (spender == address(0)) {\n            revert ERC20InvalidSpender(address(0));\n        }\n        _allowances[owner][spender] = value;\n        if (emitEvent) {\n            emit Approval(owner, spender, value);\n        }\n    }\n\n    /**\n     * @dev Updates `owner` s allowance for `spender` based on spent `value`.\n     *\n     * Does not update the allowance value in case of infinite allowance.\n     * Revert if not enough allowance is available.\n     *\n     * Does not emit an {Approval} event.\n     */\n    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n        uint256 currentAllowance = allowance(owner, spender);\n        if (currentAllowance != type(uint256).max) {\n            if (currentAllowance < value) {\n                revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n            }\n            unchecked {\n                _approve(owner, spender, currentAllowance - value, false);\n            }\n        }\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/token/ERC20/IERC20.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},{"file_path":"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Burnable.sol)\n\npragma solidity ^0.8.20;\n\nimport {ERC20} from \"../ERC20.sol\";\nimport {Context} from \"../../../utils/Context.sol\";\n\n/**\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\n * tokens and those that they have an allowance for, in a way that can be\n * recognized off-chain (via event analysis).\n */\nabstract contract ERC20Burnable is Context, ERC20 {\n    /**\n     * @dev Destroys a `value` amount of tokens from the caller.\n     *\n     * See {ERC20-_burn}.\n     */\n    function burn(uint256 value) public virtual {\n        _burn(_msgSender(), value);\n    }\n\n    /**\n     * @dev Destroys a `value` amount of tokens from `account`, deducting from\n     * the caller's allowance.\n     *\n     * See {ERC20-_burn} and {ERC20-allowance}.\n     *\n     * Requirements:\n     *\n     * - the caller must have allowance for ``accounts``'s tokens of at least\n     * `value`.\n     */\n    function burnFrom(address account, uint256 value) public virtual {\n        _spendAllowance(account, _msgSender(), value);\n        _burn(account, value);\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/token/ERC20/extensions/ERC20Capped.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Capped.sol)\n\npragma solidity ^0.8.20;\n\nimport {ERC20} from \"../ERC20.sol\";\n\n/**\n * @dev Extension of {ERC20} that adds a cap to the supply of tokens.\n */\nabstract contract ERC20Capped is ERC20 {\n    uint256 private immutable _cap;\n\n    /**\n     * @dev Total supply cap has been exceeded.\n     */\n    error ERC20ExceededCap(uint256 increasedSupply, uint256 cap);\n\n    /**\n     * @dev The supplied cap is not a valid cap.\n     */\n    error ERC20InvalidCap(uint256 cap);\n\n    /**\n     * @dev Sets the value of the `cap`. This value is immutable, it can only be\n     * set once during construction.\n     */\n    constructor(uint256 cap_) {\n        if (cap_ == 0) {\n            revert ERC20InvalidCap(0);\n        }\n        _cap = cap_;\n    }\n\n    /**\n     * @dev Returns the cap on the token's total supply.\n     */\n    function cap() public view virtual returns (uint256) {\n        return _cap;\n    }\n\n    /**\n     * @dev See {ERC20-_update}.\n     */\n    function _update(address from, address to, uint256 value) internal virtual override {\n        super._update(from, to, value);\n\n        if (from == address(0)) {\n            uint256 maxSupply = cap();\n            uint256 supply = totalSupply();\n            if (supply > maxSupply) {\n                revert ERC20ExceededCap(supply, maxSupply);\n            }\n        }\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"},{"file_path":"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\nimport {Address} from \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    /**\n     * @dev An operation with an ERC-20 token failed.\n     */\n    error SafeERC20FailedOperation(address token);\n\n    /**\n     * @dev Indicates a failed `decreaseAllowance` request.\n     */\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        forceApprove(token, spender, oldAllowance + value);\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n     * value, non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n        unchecked {\n            uint256 currentAllowance = token.allowance(address(this), spender);\n            if (currentAllowance < requestedDecrease) {\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n            }\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     *\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n     * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n     * set here.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n        if (!_callOptionalReturnBool(token, approvalCall)) {\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n            _callOptionalReturn(token, approvalCall);\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            safeTransfer(token, to, value);\n        } else if (!token.transferAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferFromAndCallRelaxed(\n        IERC1363 token,\n        address from,\n        address to,\n        uint256 value,\n        bytes memory data\n    ) internal {\n        if (to.code.length == 0) {\n            safeTransferFrom(token, from, to, value);\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n     * once without retrying, and relies on the returned value to be true.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            forceApprove(token, to, value);\n        } else if (!token.approveAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            // bubble errors\n            if iszero(success) {\n                let ptr := mload(0x40)\n                returndatacopy(ptr, 0, returndatasize())\n                revert(ptr, returndatasize())\n            }\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n     */\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n        bool success;\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/utils/Address.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n    /**\n     * @dev There's no code at `target` (it is not a contract).\n     */\n    error AddressEmptyCode(address target);\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        if (address(this).balance < amount) {\n            revert Errors.InsufficientBalance(address(this).balance, amount);\n        }\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        if (!success) {\n            revert Errors.FailedCall();\n        }\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason or custom error, it is bubbled\n     * up by this function (like regular Solidity function calls). However, if\n     * the call reverted with no returned reason, this function reverts with a\n     * {Errors.FailedCall} error.\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        if (address(this).balance < value) {\n            revert Errors.InsufficientBalance(address(this).balance, value);\n        }\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n     * of an unsuccessful call.\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata\n    ) internal view returns (bytes memory) {\n        if (!success) {\n            _revert(returndata);\n        } else {\n            // only check if target is a contract if the call was successful and the return data is empty\n            // otherwise we already know that it was a contract\n            if (returndata.length == 0 && target.code.length == 0) {\n                revert AddressEmptyCode(target);\n            }\n            return returndata;\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n     * revert reason or with a default {Errors.FailedCall} error.\n     */\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n        if (!success) {\n            _revert(returndata);\n        } else {\n            return returndata;\n        }\n    }\n\n    /**\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\n     */\n    function _revert(bytes memory returndata) private pure {\n        // Look for revert reason and bubble it up if present\n        if (returndata.length > 0) {\n            // The easiest way to bubble the revert reason is using memory via assembly\n            assembly (\"memory-safe\") {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert Errors.FailedCall();\n        }\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/utils/Context.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/utils/Errors.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n    /**\n     * @dev The ETH balance of the account is not enough to perform the operation.\n     */\n    error InsufficientBalance(uint256 balance, uint256 needed);\n\n    /**\n     * @dev A call to an address target failed. The target may have reverted.\n     */\n    error FailedCall();\n\n    /**\n     * @dev The deployment failed.\n     */\n    error FailedDeployment();\n\n    /**\n     * @dev A necessary precompile is missing.\n     */\n    error MissingPrecompile(address);\n}\n"},{"file_path":"@openzeppelin/contracts/utils/Pausable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract Pausable is Context {\n    bool private _paused;\n\n    /**\n     * @dev Emitted when the pause is triggered by `account`.\n     */\n    event Paused(address account);\n\n    /**\n     * @dev Emitted when the pause is lifted by `account`.\n     */\n    event Unpaused(address account);\n\n    /**\n     * @dev The operation failed because the contract is paused.\n     */\n    error EnforcedPause();\n\n    /**\n     * @dev The operation failed because the contract is not paused.\n     */\n    error ExpectedPause();\n\n    /**\n     * @dev Initializes the contract in unpaused state.\n     */\n    constructor() {\n        _paused = false;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is not paused.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    modifier whenNotPaused() {\n        _requireNotPaused();\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is paused.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    modifier whenPaused() {\n        _requirePaused();\n        _;\n    }\n\n    /**\n     * @dev Returns true if the contract is paused, and false otherwise.\n     */\n    function paused() public view virtual returns (bool) {\n        return _paused;\n    }\n\n    /**\n     * @dev Throws if the contract is paused.\n     */\n    function _requireNotPaused() internal view virtual {\n        if (paused()) {\n            revert EnforcedPause();\n        }\n    }\n\n    /**\n     * @dev Throws if the contract is not paused.\n     */\n    function _requirePaused() internal view virtual {\n        if (!paused()) {\n            revert ExpectedPause();\n        }\n    }\n\n    /**\n     * @dev Triggers stopped state.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    function _pause() internal virtual whenNotPaused {\n        _paused = true;\n        emit Paused(_msgSender());\n    }\n\n    /**\n     * @dev Returns to normal state.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    function _unpause() internal virtual whenPaused {\n        _paused = false;\n        emit Unpaused(_msgSender());\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/utils/introspection/IERC165.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},{"file_path":"contracts/Common.sol","source_code":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Ownable2Step, Ownable} from \"@openzeppelin/contracts/access/Ownable2Step.sol\";\nimport {Pausable} from \"@openzeppelin/contracts/utils/Pausable.sol\";\nimport {SafeERC20, IERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {ICommon} from \"contracts/interfaces/ICommon.sol\";\n\ncontract Common is Ownable2Step, Pausable, ICommon {\n    using SafeERC20 for IERC20;\n\n    address public operator;\n    address public safe;\n    address public caller;\n\n    modifier onlyCaller() {\n        if (_msgSender() != caller) {\n            revert OnlyCaller();\n        }\n        _;\n    }\n\n    modifier onlyOperator() {\n        if (_msgSender() != operator) {\n            revert OnlyOperator();\n        }\n        _;\n    }\n\n    constructor(address _initialOwner, address _initialOperator, address _initialSafe, address _initialCaller)\n        Ownable(_initialOwner)\n    {\n        _updateOperator(_initialOperator);\n        _updateSafe(_initialSafe);\n        _manageCaller(_initialCaller);\n    }\n\n    function updateOperator(address newOperator) external onlyOwner {\n        _updateOperator(newOperator);\n    }\n\n    function _updateOperator(address _newOperator) private {\n        if (_newOperator == address(0)) {\n            revert ZeroAddressNotAllowed();\n        }\n\n        if (_newOperator == operator) {\n            revert OperatorAlreadySet();\n        }\n\n        address oldOperator = operator;\n        operator = _newOperator;\n        emit OperatorUpdated(oldOperator, _newOperator);\n    }\n\n    function manageCaller(address newCaller) external onlyOwner whenNotPaused {\n        _manageCaller(newCaller);\n    }\n\n    function _manageCaller(address _newCaller) private {\n        if (_newCaller == address(0)) {\n            revert ZeroAddressNotAllowed();\n        }\n\n        if (caller == _newCaller) {\n            revert CallerStatusAlreadySet();\n        }\n\n        address oldCaller = caller;\n        caller = _newCaller;\n\n        emit ManageCaller(oldCaller, _newCaller);\n    }\n\n    function pause() external onlyOperator {\n        _pause();\n    }\n\n    function unpause() external onlyOwner {\n        _unpause();\n    }\n\n    function updateSafe(address _bksafe) external onlyOwner {\n        _updateSafe(_bksafe);\n    }\n\n    function _updateSafe(address _newSafe) private {\n        if (_newSafe == address(0)) {\n            revert ZeroAddressNotAllowed();\n        }\n\n        if (_newSafe == safe) {\n            revert SafeAlreadySet();\n        }\n\n        address oldSafe = safe;\n        safe = _newSafe;\n        emit SafeUpdated(oldSafe, _newSafe);\n    }\n\n    function rescueERC20(address asset) external onlyOperator {\n        IERC20(asset).safeTransfer(safe, IERC20(asset).balanceOf(address(this)));\n        emit RescueERC20(asset, safe);\n    }\n\n    function rescueETH() external onlyOperator {\n        _transferEth(safe, address(this).balance);\n        emit RescueETH(safe, address(this).balance);\n    }\n\n    function _transferEth(address _to, uint256 _amount) internal {\n        bool callStatus;\n        assembly {\n            // Transfer the ETH and store if it succeeded or not.\n            callStatus := call(gas(), _to, _amount, 0, 0, 0, 0)\n        }\n        require(callStatus, \"_transferEth: Eth transfer failed\");\n    }\n}\n"},{"file_path":"contracts/interfaces/IBGBTC.sol","source_code":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\ninterface IBGBTC {\n    error OnlyMinter();\n    error OnlyPauseTransferOperator();\n    error TransferPaused();\n    error TransferUnpaused();\n    error TransferPauseOperatorAlreadySet();\n    error MintDestinationAlreadySet();\n    error MinterAlreadySet();\n    error EmptyArray();\n    error BatchTooLarge();\n    error AddressBlackListed();\n    error InvalidMintAmount();\n\n    event MinterChanged(address indexed oldMinter, address indexed newMinter);\n    event MintDestinationChanged(address indexed oldMintDestination, address indexed newMintDestination);\n    event PauseTransferOperatorChanged(\n        address indexed oldPauseTransferOperator, address indexed newPauseTransferOperator\n    );\n    event BatchBlacklistUpdated(address[] accounts, bool isBlacklisted);\n    event TransferHasPaused(address account);\n    event TransferHasUnpaused(address account);\n}\n"},{"file_path":"contracts/interfaces/ICommon.sol","source_code":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\ninterface ICommon {\n    error OnlyOperator();\n    error OnlyCaller();\n\n    error ZeroAddressNotAllowed();\n    error SafeAlreadySet();\n    error OperatorAlreadySet();\n    error CallerStatusAlreadySet();\n\n    event RescueETH(address indexed recipient, uint256 amount);\n    event RescueERC20(address indexed asset, address recipient);\n    event OperatorUpdated(address indexed oldOperator, address indexed newOperator);\n    event SafeUpdated(address indexed oldOperator, address indexed newOperator);\n    event ManageCaller(address indexed oldCaller, address indexed newCaller);\n}\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_mintDestination","type":"address"},{"internalType":"address","name":"_safe","type":"address"},{"internalType":"address","name":"_initialCaller","type":"address"},{"internalType":"address","name":"_pauseTransferOperator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AddressBlackListed","type":"error"},{"inputs":[],"name":"BatchTooLarge","type":"error"},{"inputs":[],"name":"CallerStatusAlreadySet","type":"error"},{"inputs":[{"internalType":"uint256","name":"increasedSupply","type":"uint256"},{"internalType":"uint256","name":"cap","type":"uint256"}],"name":"ERC20ExceededCap","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"uint256","name":"cap","type":"uint256"}],"name":"ERC20InvalidCap","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"EmptyArray","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"InvalidMintAmount","type":"error"},{"inputs":[],"name":"MintDestinationAlreadySet","type":"error"},{"inputs":[],"name":"MinterAlreadySet","type":"error"},{"inputs":[],"name":"OnlyCaller","type":"error"},{"inputs":[],"name":"OnlyMinter","type":"error"},{"inputs":[],"name":"OnlyOperator","type":"error"},{"inputs":[],"name":"OnlyPauseTransferOperator","type":"error"},{"inputs":[],"name":"OperatorAlreadySet","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"SafeAlreadySet","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"TransferPauseOperatorAlreadySet","type":"error"},{"inputs":[],"name":"TransferPaused","type":"error"},{"inputs":[],"name":"TransferUnpaused","type":"error"},{"inputs":[],"name":"ZeroAddressNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isBlacklisted","type":"bool"}],"name":"BatchBlacklistUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldCaller","type":"address"},{"indexed":true,"internalType":"address","name":"newCaller","type":"address"}],"name":"ManageCaller","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldMintDestination","type":"address"},{"indexed":true,"internalType":"address","name":"newMintDestination","type":"address"}],"name":"MintDestinationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldMinter","type":"address"},{"indexed":true,"internalType":"address","name":"newMinter","type":"address"}],"name":"MinterChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldPauseTransferOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newPauseTransferOperator","type":"address"}],"name":"PauseTransferOperatorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"RescueERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RescueETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"SafeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"TransferHasPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"TransferHasUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"TOKEN_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"accounts","type":"address[]"},{"internalType":"bool","name":"blacklisted","type":"bool"}],"name":"batchManageBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"caller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"blacklisted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newCaller","type":"address"}],"name":"manageCaller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"manageMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintDestination","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseTransferOperator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"safe","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mintDestinationAddr","type":"address"}],"name":"updateMintDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"updateOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bksafe","type":"address"}],"name":"updateSafe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pauseTransferOperatorAddr","type":"address"}],"name":"updateTransferPauseOperator","outputs":[],"stateMutability":"nonpayable","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":false,"constructor_args":"0x0000000000000000000000003df3c01b72dc5d63565af0bcb20d847227c2201a0000000000000000000000005db8606f2927e7173b3cab5a4c512d9f00bbf1930000000000000000000000008f1aae2978f35e710e34db6f3139db629f6083350000000000000000000000009287b8e84d972dd02f618bbed45b9a6d7ed1638400000000000000000000000069c46c049502aeb0d9c6a01432e1d2c2c83849930000000000000000000000005db8606f2927e7173b3cab5a4c512d9f00bbf193"}