@ensuro/account-abstraction 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "_format": "hh3-sol-build-info-1",
3
- "id": "solc-0_8_30-3f701667cdad33af53ac1f684f455bb9e01a58ac",
3
+ "id": "solc-0_8_30-f987e738f2ecce00e06bc1b8c078480f3d3eb966",
4
4
  "solcVersion": "0.8.30",
5
5
  "solcLongVersion": "0.8.30+commit.73712a01",
6
6
  "userSourceNameMap": {
@@ -226,7 +226,7 @@
226
226
  "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/types/Time.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"@openzeppelin/contracts/utils/math/Math.sol\";\nimport {SafeCast} from \"@openzeppelin/contracts/utils/math/SafeCast.sol\";\n\n/**\n * @dev This library provides helpers for manipulating time-related objects.\n *\n * It uses the following types:\n * - `uint48` for timepoints\n * - `uint32` for durations\n *\n * While the library doesn't provide specific types for timepoints and duration, it does provide:\n * - a `Delay` type to represent duration that can be programmed to change value automatically at a given point\n * - additional helper functions\n */\nlibrary FrozenTime {\n using FrozenTime for *;\n\n /**\n * @dev Get the block timestamp as a Timepoint.\n */\n function timestamp() internal pure returns (uint48) {\n // return SafeCast.toUint48(block.timestamp);\n return SafeCast.toUint48(32503680000); // 3000-01-01\n }\n\n /**\n * @dev Get the block number as a Timepoint.\n */\n function blockNumber() internal view returns (uint48) {\n return SafeCast.toUint48(block.number);\n }\n\n // ==================================================== Delay =====================================================\n /**\n * @dev A `Delay` is a uint32 duration that can be programmed to change value automatically at a given point in the\n * future. The \"effect\" timepoint describes when the transitions happens from the \"old\" value to the \"new\" value.\n * This allows updating the delay applied to some operation while keeping some guarantees.\n *\n * In particular, the {update} function guarantees that if the delay is reduced, the old delay still applies for\n * some time. For example if the delay is currently 7 days to do an upgrade, the admin should not be able to set\n * the delay to 0 and upgrade immediately. If the admin wants to reduce the delay, the old delay (7 days) should\n * still apply for some time.\n *\n *\n * The `Delay` type is 112 bits long, and packs the following:\n *\n * ```\n * | [uint48]: effect date (timepoint)\n * | | [uint32]: value before (duration)\n * ↓ ↓ ↓ [uint32]: value after (duration)\n * 0xAAAAAAAAAAAABBBBBBBBCCCCCCCC\n * ```\n *\n * NOTE: The {get} and {withUpdate} functions operate using timestamps. Block number based delays are not currently\n * supported.\n */\n type Delay is uint112;\n\n /**\n * @dev Wrap a duration into a Delay to add the one-step \"update in the future\" feature\n */\n function toDelay(uint32 duration) internal pure returns (Delay) {\n return Delay.wrap(duration);\n }\n\n /**\n * @dev Get the value at a given timepoint plus the pending value and effect timepoint if there is a scheduled\n * change after this timepoint. If the effect timepoint is 0, then the pending value should not be considered.\n */\n function _getFullAt(Delay self, uint48 timepoint) private pure returns (uint32, uint32, uint48) {\n (uint32 valueBefore, uint32 valueAfter, uint48 effect) = self.unpack();\n return effect <= timepoint ? (valueAfter, 0, 0) : (valueBefore, valueAfter, effect);\n }\n\n /**\n * @dev Get the current value plus the pending value and effect timepoint if there is a scheduled change. If the\n * effect timepoint is 0, then the pending value should not be considered.\n */\n function getFull(Delay self) internal pure returns (uint32, uint32, uint48) {\n return _getFullAt(self, timestamp());\n }\n\n /**\n * @dev Get the current value.\n */\n function get(Delay self) internal pure returns (uint32) {\n (uint32 delay, , ) = self.getFull();\n return delay;\n }\n\n /**\n * @dev Update a Delay object so that it takes a new duration after a timepoint that is automatically computed to\n * enforce the old delay at the moment of the update. Returns the updated Delay object and the timestamp when the\n * new delay becomes effective.\n */\n function withUpdate(\n Delay self,\n uint32 newValue,\n uint32 minSetback\n ) internal pure returns (Delay updatedDelay, uint48 effect) {\n uint32 value = self.get();\n uint32 setback = uint32(Math.max(minSetback, value > newValue ? value - newValue : 0));\n effect = timestamp() + setback;\n return (pack(value, newValue, effect), effect);\n }\n\n /**\n * @dev Split a delay into its components: valueBefore, valueAfter and effect (transition timepoint).\n */\n function unpack(Delay self) internal pure returns (uint32 valueBefore, uint32 valueAfter, uint48 effect) {\n uint112 raw = Delay.unwrap(self);\n\n valueAfter = uint32(raw);\n valueBefore = uint32(raw >> 32);\n effect = uint48(raw >> 64);\n\n return (valueBefore, valueAfter, effect);\n }\n\n /**\n * @dev pack the components into a Delay object.\n */\n function pack(uint32 valueBefore, uint32 valueAfter, uint48 effect) internal pure returns (Delay) {\n return Delay.wrap((uint112(effect) << 64) | (uint112(valueBefore) << 32) | uint112(valueAfter));\n }\n}\n"
227
227
  },
228
228
  "project/contracts/ERC2771ForwarderAccount.sol": {
229
- "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.23;\n\nimport {Address} from \"@openzeppelin/contracts/utils/Address.sol\";\nimport {BaseAccount} from \"@account-abstraction/contracts/core/BaseAccount.sol\";\nimport {ECDSA} from \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport {ERC2771Context} from \"@openzeppelin/contracts/metatx/ERC2771Context.sol\";\nimport {IAccountExecute} from \"@account-abstraction/contracts/interfaces/IAccountExecute.sol\";\nimport {IEntryPoint} from \"@account-abstraction/contracts/interfaces/IEntryPoint.sol\";\nimport {MessageHashUtils} from \"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\";\nimport {PackedUserOperation} from \"@account-abstraction/contracts/interfaces/PackedUserOperation.sol\";\nimport {SIG_VALIDATION_SUCCESS, SIG_VALIDATION_FAILED} from \"@account-abstraction/contracts/core/Helpers.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\n\n/**\n * @title ERC2771ForwarderAccount\n *\n * @dev Smart Account that acts as an ERC2771 Trusted Forwarder, forwarding calls to a pre-defined contract\n * on behalf of the signer of the userOp.\n *\n * Assumes the target contract is designed to work with ERC2771Context and trusts this account as a forwarder.\n *\n * This contract is designed to be used with an AccessManagedProxy for runtime access control management.\n *\n * @custom:security-contact security@ensuro.co\n * @author Ensuro\n */\ncontract ERC2771ForwarderAccount is UUPSUpgradeable, BaseAccount, IAccountExecute {\n IEntryPoint private immutable _entryPoint;\n\n /// @custom:storage-location erc7201:ensuro.storage.ERC2771ForwarderAccount\n struct ERC2771ForwarderAccountStorage {\n mapping(address => ERC2771Context) targets;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"ensuro.storage.ERC2771ForwarderAccount\")) - 1)) & ~bytes32(uint256(0xff))\n // solhint-disable-next-line const-name-snakecase\n bytes32 internal constant ERC2771ForwarderAccountStorageLocation =\n 0x32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e3843000;\n\n function _getAccountStorage() internal pure returns (ERC2771ForwarderAccountStorage storage $) {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n $.slot := ERC2771ForwarderAccountStorageLocation\n }\n }\n\n event ExecutorAdded(address indexed executor, ERC2771Context indexed target);\n event ExecutorRemoved(address indexed executor);\n\n error RequiredEntryPointOrExecutor(address sender);\n error InvalidTarget(ERC2771Context target, address signer);\n error OnlyExecuteUserOpAllowed();\n error InvalidCall();\n\n constructor(IEntryPoint anEntryPoint) {\n _entryPoint = anEntryPoint;\n }\n\n // solhint-disable-next-line no-empty-blocks\n function _authorizeUpgrade(address newImpl) internal view override {}\n\n /**\n * @dev This is a noop, for deployment convenience where an initializer is expected.\n */\n //solhint-disable-next-line no-empty-blocks\n function initialize() external {}\n\n // solhint-disable-next-line no-empty-blocks\n receive() external payable {}\n\n function executeBatch(Call[] calldata) external virtual override {\n revert OnlyExecuteUserOpAllowed();\n }\n\n function execute(address, uint256, bytes calldata) external virtual override {\n revert OnlyExecuteUserOpAllowed();\n }\n\n function _getSigner(PackedUserOperation calldata userop, bytes32 userOpHash) internal pure returns (address) {\n bytes32 hash = MessageHashUtils.toEthSignedMessageHash(userOpHash);\n return ECDSA.recover(hash, userop.signature);\n }\n\n /**\n * @dev Validates that the user operation is well formed and that the destination is correct. Does not validate signature.\n * @return expectedSigner The address included in the call data, expected to be the signer of the userOp\n * @return call A Call struct containing the call to be made\n */\n function _validateAndDecodeCall(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash\n ) internal pure returns (address expectedSigner, Call memory call) {\n require(userOp.callData.length >= 80 && bytes4(userOp.callData[0:4]) == this.executeUserOp.selector, InvalidCall());\n (expectedSigner, call.target, call.value, call.data) = abi.decode(\n userOp.callData[4:],\n (address, address, uint256, bytes)\n );\n if (call.target == address(0)) {\n // This is an if and not a require to avoid evaluating the _getSigner call in the happy path\n revert InvalidTarget(ERC2771Context(call.target), _getSigner(userOp, userOpHash));\n }\n }\n\n function _isAuthorized(address signer, address expectedSigner, address target) internal view returns (bool) {\n ERC2771ForwarderAccountStorage storage $ = _getAccountStorage();\n return signer == expectedSigner && $.targets[signer] == ERC2771Context(target);\n }\n\n /**\n * @notice Add an executor and its corresponding target contract.\n * @param executor The executor address to add\n * @param target The ERC2771Context target contract for this executor\n */\n function addExecutor(address executor, ERC2771Context target) external {\n ERC2771ForwarderAccountStorage storage $ = _getAccountStorage();\n $.targets[executor] = target;\n emit ExecutorAdded(executor, target);\n }\n\n /**\n * @notice Remove an executor by setting its target to the zero address.\n * @param executor The executor address to remove\n */\n function removeExecutor(address executor) external {\n ERC2771ForwarderAccountStorage storage $ = _getAccountStorage();\n $.targets[executor] = ERC2771Context(address(0));\n emit ExecutorRemoved(executor);\n }\n\n /// implement template method of BaseAccount\n function _validateSignature(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash\n ) internal virtual override returns (uint256 validationData) {\n (address expectedSigner, Call memory call) = _validateAndDecodeCall(userOp, userOpHash);\n address signer = _getSigner(userOp, userOpHash);\n if (!_isAuthorized(signer, expectedSigner, call.target)) {\n return SIG_VALIDATION_FAILED;\n }\n return SIG_VALIDATION_SUCCESS;\n }\n\n /**\n * @dev Executes a user operation by forwarding the call to the target contract with the signer as the msgSender.\n * The calldata is expected to contain this function's selector followed by the signer and the ABI-encoded call:\n * - signer (address): the signer of the userop, must match the signature\n * - dest (address): the target contract address (must be the same as _target)\n * - value (uint256): the amount of ETH to send with the call\n * - func (bytes): the calldata for the target function\n *\n * @param userOp The packed user operation containing the call data and signature.\n * @param userOpHash The hash of the user operation, used for signature verification.\n */\n function executeUserOp(PackedUserOperation calldata userOp, bytes32 userOpHash) external override {\n _requireFromEntryPoint();\n\n // We can trust that expectedSigner is the userop signer because it was checked in validateSignature\n (address expectedSigner, Call memory call) = _validateAndDecodeCall(userOp, userOpHash);\n\n Address.functionCallWithValue(call.target, abi.encodePacked(call.data, expectedSigner), call.value);\n }\n\n /**\n * check current account deposit in the entryPoint\n */\n function getDeposit() public view returns (uint256) {\n return entryPoint().balanceOf(address(this));\n }\n\n /**\n * deposit more funds for this account in the entryPoint\n */\n function addDeposit() public payable {\n entryPoint().depositTo{value: msg.value}(address(this));\n }\n\n /**\n * withdraw value from the account's deposit\n * @param withdrawAddress target to send to\n * @param amount to withdraw\n */\n function withdrawDepositTo(address payable withdrawAddress, uint256 amount) public {\n entryPoint().withdrawTo(withdrawAddress, amount);\n }\n\n /// @inheritdoc BaseAccount\n function entryPoint() public view virtual override returns (IEntryPoint) {\n return _entryPoint;\n }\n}\n"
229
+ "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.23;\n\nimport {Address} from \"@openzeppelin/contracts/utils/Address.sol\";\nimport {BaseAccount} from \"@account-abstraction/contracts/core/BaseAccount.sol\";\nimport {ECDSA} from \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport {ERC2771Context} from \"@openzeppelin/contracts/metatx/ERC2771Context.sol\";\nimport {IAccountExecute} from \"@account-abstraction/contracts/interfaces/IAccountExecute.sol\";\nimport {IEntryPoint} from \"@account-abstraction/contracts/interfaces/IEntryPoint.sol\";\nimport {MessageHashUtils} from \"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\";\nimport {PackedUserOperation} from \"@account-abstraction/contracts/interfaces/PackedUserOperation.sol\";\nimport {SIG_VALIDATION_SUCCESS, SIG_VALIDATION_FAILED} from \"@account-abstraction/contracts/core/Helpers.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\n\n/**\n * @title ERC2771ForwarderAccount\n *\n * @dev Smart Account that acts as an ERC2771 Trusted Forwarder, forwarding calls to a pre-defined contract\n * on behalf of the signer of the userOp.\n *\n * Assumes the target contract is designed to work with ERC2771Context and trusts this account as a forwarder.\n *\n * This contract is designed to be used with an AccessManagedProxy for runtime access control management.\n *\n * @custom:security-contact security@ensuro.co\n * @author Ensuro\n */\ncontract ERC2771ForwarderAccount is UUPSUpgradeable, BaseAccount, IAccountExecute {\n // 132 = 4 (method bytes4) + 32 (expectedSigner) + 32 (target) + 32 (value) + 32 (calldata offset)\n uint256 private constant MIN_USER_OP_CALLDATA = 132;\n IEntryPoint private immutable _entryPoint;\n\n /// @custom:storage-location erc7201:ensuro.storage.ERC2771ForwarderAccount\n struct ERC2771ForwarderAccountStorage {\n mapping(address => ERC2771Context) targets;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"ensuro.storage.ERC2771ForwarderAccount\")) - 1)) & ~bytes32(uint256(0xff))\n // solhint-disable-next-line const-name-snakecase\n bytes32 internal constant ERC2771ForwarderAccountStorageLocation =\n 0x32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e3843000;\n\n function _getAccountStorage() internal pure returns (ERC2771ForwarderAccountStorage storage $) {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n $.slot := ERC2771ForwarderAccountStorageLocation\n }\n }\n\n event ExecutorAdded(address indexed executor, ERC2771Context indexed target);\n event ExecutorRemoved(address indexed executor);\n\n error RequiredEntryPointOrExecutor(address sender);\n error InvalidTarget(ERC2771Context target, address signer);\n error InvalidCall();\n error MethodNotSupported(bytes4 selector);\n\n constructor(IEntryPoint anEntryPoint) {\n _entryPoint = anEntryPoint;\n }\n\n // solhint-disable-next-line no-empty-blocks\n function _authorizeUpgrade(address newImpl) internal view override {}\n\n /**\n * @dev This is a noop, for deployment convenience where an initializer is expected.\n */\n //solhint-disable-next-line no-empty-blocks\n function initialize() external {}\n\n // solhint-disable-next-line no-empty-blocks\n receive() external payable {}\n\n function executeBatch(Call[] calldata) external virtual override {\n revert InvalidCall();\n }\n\n function execute(address, uint256, bytes calldata) external virtual override {\n revert InvalidCall();\n }\n\n function _getSigner(PackedUserOperation calldata userop, bytes32 userOpHash) internal pure returns (address) {\n bytes32 hash = MessageHashUtils.toEthSignedMessageHash(userOpHash);\n return ECDSA.recover(hash, userop.signature);\n }\n\n /**\n * @dev Validates that the user operation is well formed and that the destination is correct. Does not validate signature.\n * @return expectedSigner The address included in the call data, expected to be the signer of the userOp\n * @return call A Call struct containing the call to be made\n * @return selector The selector used (execute or executeUserOp)\n */\n function _validateAndDecodeCall(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash\n ) internal pure returns (address expectedSigner, Call memory call, bytes4 selector) {\n require(userOp.callData.length >= MIN_USER_OP_CALLDATA, InvalidCall());\n selector = bytes4(userOp.callData[0:4]);\n if (selector != this.executeUserOp.selector && selector != this.erc2771Forward.selector) {\n revert MethodNotSupported(selector);\n }\n (expectedSigner, call.target, call.value, call.data) = abi.decode(\n userOp.callData[4:],\n (address, address, uint256, bytes)\n );\n if (call.target == address(0)) {\n revert InvalidTarget(ERC2771Context(call.target), _getSigner(userOp, userOpHash));\n }\n }\n\n function _isAuthorized(address signer, address expectedSigner, address target) internal view returns (bool) {\n ERC2771ForwarderAccountStorage storage $ = _getAccountStorage();\n return signer == expectedSigner && $.targets[signer] == ERC2771Context(target);\n }\n\n /**\n * @notice Add an executor and its corresponding target contract.\n * @param executor The executor address to add\n * @param target The ERC2771Context target contract for this executor\n */\n function addExecutor(address executor, ERC2771Context target) external {\n ERC2771ForwarderAccountStorage storage $ = _getAccountStorage();\n $.targets[executor] = target;\n emit ExecutorAdded(executor, target);\n }\n\n /**\n * @notice Remove an executor by setting its target to the zero address.\n * @param executor The executor address to remove\n */\n function removeExecutor(address executor) external {\n ERC2771ForwarderAccountStorage storage $ = _getAccountStorage();\n $.targets[executor] = ERC2771Context(address(0));\n emit ExecutorRemoved(executor);\n }\n\n /// implement template method of BaseAccount\n function _validateSignature(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash\n ) internal virtual override returns (uint256 validationData) {\n (address expectedSigner, Call memory call, ) = _validateAndDecodeCall(userOp, userOpHash);\n address signer = _getSigner(userOp, userOpHash);\n if (!_isAuthorized(signer, expectedSigner, call.target)) {\n return SIG_VALIDATION_FAILED;\n }\n return SIG_VALIDATION_SUCCESS;\n }\n\n /**\n * @dev Executes a user operation by forwarding the call to the target contract with the signer as the msgSender.\n * The calldata is expected to contain this function's selector followed by the signer and the ABI-encoded call:\n * - signer (address): the signer of the userop, must match the signature\n * - dest (address): the target contract address (must be the same as _target)\n * - value (uint256): the amount of ETH to send with the call\n * - func (bytes): the calldata for the target function\n *\n * @param userOp The packed user operation containing the call data and signature.\n * @param userOpHash The hash of the user operation, used for signature verification.\n */\n function executeUserOp(PackedUserOperation calldata userOp, bytes32 userOpHash) external override {\n _requireFromEntryPoint();\n\n (address expectedSigner, Call memory call, ) = _validateAndDecodeCall(userOp, userOpHash);\n\n Address.functionCallWithValue(call.target, abi.encodePacked(call.data, expectedSigner), call.value);\n }\n\n /**\n * @notice Forwards a call to the target contract with `caller` as the msgSender.\n * @dev Since this method is called from the entryPoint, the method _validateSignature was passed before,\n * validating the signer of the userOp is equal to `caller` and `caller` is authorized to call `target`.\n *\n * @param caller The real caller of the operation that will be appended to the call, and decoded by the target\n * contract as _msgSender()\n * @param target The target contract to be called\n * @param value The amount of ETH to send with the call\n * @param func The calldata for the target function\n */\n function erc2771Forward(address caller, address target, uint256 value, bytes calldata func) external virtual {\n _requireFromEntryPoint();\n Address.functionCallWithValue(target, abi.encodePacked(func, caller), value);\n }\n\n /**\n * check current account deposit in the entryPoint\n */\n function getDeposit() public view returns (uint256) {\n return entryPoint().balanceOf(address(this));\n }\n\n /**\n * deposit more funds for this account in the entryPoint\n */\n function addDeposit() public payable {\n entryPoint().depositTo{value: msg.value}(address(this));\n }\n\n /**\n * withdraw value from the account's deposit\n * @param withdrawAddress target to send to\n * @param amount to withdraw\n */\n function withdrawDepositTo(address payable withdrawAddress, uint256 amount) public {\n entryPoint().withdrawTo(withdrawAddress, amount);\n }\n\n /// @inheritdoc BaseAccount\n function entryPoint() public view virtual override returns (IEntryPoint) {\n return _entryPoint;\n }\n}\n"
230
230
  },
231
231
  "project/contracts/mock/ERC20With2771.sol": {
232
232
  "content": "//SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport {ERC2771Context} from \"@openzeppelin/contracts/metatx/ERC2771Context.sol\";\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\ncontract ERC20With2771 is ERC20, ERC2771Context {\n uint8 internal immutable _decimals;\n\n constructor(\n string memory name_,\n string memory symbol_,\n uint256 initialSupply,\n uint8 decimals_,\n address trustedForwarder\n ) ERC20(name_, symbol_) ERC2771Context(trustedForwarder) {\n _decimals = decimals_;\n _mint(msg.sender, initialSupply);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return _decimals;\n }\n\n /// @inheritdoc ERC2771Context\n function _contextSuffixLength() internal view override(Context, ERC2771Context) returns (uint256) {\n return ERC2771Context._contextSuffixLength();\n }\n\n /// @inheritdoc ERC2771Context\n function _msgSender() internal view override(Context, ERC2771Context) returns (address) {\n return ERC2771Context._msgSender();\n }\n\n /// @inheritdoc ERC2771Context\n function _msgData() internal view override(Context, ERC2771Context) returns (bytes calldata) {\n return ERC2771Context._msgData();\n }\n}\n"
@@ -624,5 +624,5 @@
624
624
  ]
625
625
  },
626
626
  "inputSourceName": "project/contracts/AccessControlAccount.sol",
627
- "buildInfoId": "solc-0_8_30-3f701667cdad33af53ac1f684f455bb9e01a58ac"
627
+ "buildInfoId": "solc-0_8_30-f987e738f2ecce00e06bc1b8c078480f3d3eb966"
628
628
  }
@@ -15,7 +15,7 @@ export interface AccessControlAccount$Type {
15
15
  readonly deployedLinkReferences: {};
16
16
  readonly immutableReferences: {"11576":[{"length":32,"start":709},{"length":32,"start":1751},{"length":32,"start":1917},{"length":32,"start":2183},{"length":32,"start":2332},{"length":32,"start":2426},{"length":32,"start":3165}]};
17
17
  readonly inputSourceName: "project/contracts/AccessControlAccount.sol";
18
- readonly buildInfoId: "solc-0_8_30-3f701667cdad33af53ac1f684f455bb9e01a58ac";
18
+ readonly buildInfoId: "solc-0_8_30-f987e738f2ecce00e06bc1b8c078480f3d3eb966";
19
19
  };
20
20
 
21
21
  import "hardhat/types/artifacts";
@@ -1467,5 +1467,5 @@
1467
1467
  ]
1468
1468
  },
1469
1469
  "inputSourceName": "project/contracts/AccessManagerAccount.sol",
1470
- "buildInfoId": "solc-0_8_30-3f701667cdad33af53ac1f684f455bb9e01a58ac"
1470
+ "buildInfoId": "solc-0_8_30-f987e738f2ecce00e06bc1b8c078480f3d3eb966"
1471
1471
  }
@@ -15,7 +15,7 @@ export interface AccessManagerAccount$Type {
15
15
  readonly deployedLinkReferences: {};
16
16
  readonly immutableReferences: {"11905":[{"length":32,"start":1672},{"length":32,"start":3154},{"length":32,"start":3366},{"length":32,"start":4409},{"length":32,"start":4558},{"length":32,"start":5858}]};
17
17
  readonly inputSourceName: "project/contracts/AccessManagerAccount.sol";
18
- readonly buildInfoId: "solc-0_8_30-3f701667cdad33af53ac1f684f455bb9e01a58ac";
18
+ readonly buildInfoId: "solc-0_8_30-f987e738f2ecce00e06bc1b8c078480f3d3eb966";
19
19
  };
20
20
 
21
21
  import "hardhat/types/artifacts";
@@ -127,8 +127,14 @@
127
127
  "type": "error"
128
128
  },
129
129
  {
130
- "inputs": [],
131
- "name": "OnlyExecuteUserOpAllowed",
130
+ "inputs": [
131
+ {
132
+ "internalType": "bytes4",
133
+ "name": "selector",
134
+ "type": "bytes4"
135
+ }
136
+ ],
137
+ "name": "MethodNotSupported",
132
138
  "type": "error"
133
139
  },
134
140
  {
@@ -254,6 +260,34 @@
254
260
  "stateMutability": "view",
255
261
  "type": "function"
256
262
  },
263
+ {
264
+ "inputs": [
265
+ {
266
+ "internalType": "address",
267
+ "name": "caller",
268
+ "type": "address"
269
+ },
270
+ {
271
+ "internalType": "address",
272
+ "name": "target",
273
+ "type": "address"
274
+ },
275
+ {
276
+ "internalType": "uint256",
277
+ "name": "value",
278
+ "type": "uint256"
279
+ },
280
+ {
281
+ "internalType": "bytes",
282
+ "name": "func",
283
+ "type": "bytes"
284
+ }
285
+ ],
286
+ "name": "erc2771Forward",
287
+ "outputs": [],
288
+ "stateMutability": "nonpayable",
289
+ "type": "function"
290
+ },
257
291
  {
258
292
  "inputs": [
259
293
  {
@@ -548,52 +582,52 @@
548
582
  "type": "receive"
549
583
  }
550
584
  ],
551
- "bytecode": "0x60c060405230608052348015610013575f5ffd5b5060405161151e38038061151e83398101604081905261003291610043565b6001600160a01b031660a052610070565b5f60208284031215610053575f5ffd5b81516001600160a01b0381168114610069575f5ffd5b9392505050565b60805160a05161145c6100c25f395f81816102510152818161036f015281816103eb015281816105890152818161061e015261065801525f81816107660152818161078f01526108cb015261145c5ff3fe6080604052600436106100e7575f3560e01c80636267e75911610087578063b0d691fe11610057578063b0d691fe14610238578063b61d27f61461027b578063c399ec8814610295578063d087d288146102a9575f5ffd5b80636267e759146101b25780638129fc1c146101d15780638dd7712f146101dc578063ad3cb1cc146101fb575f5ffd5b80634a58db19116100c25780634a58db19146101645780634d44560d1461016c5780634f1ef2861461018b57806352d1902d1461019e575f5ffd5b806319822f7c146100f2578063247884291461012457806334fcd5be14610145575f5ffd5b366100ee57005b5f5ffd5b3480156100fd575f5ffd5b5061011161010c366004610f71565b6102bd565b6040519081526020015b60405180910390f35b34801561012f575f5ffd5b5061014361013e366004610fcf565b6102e2565b005b348015610150575f5ffd5b5061014361015f366004610fea565b610354565b61014361036d565b348015610177575f5ffd5b5061014361018636600461105b565b6103e9565b610143610199366004611124565b61046d565b3480156101a9575f5ffd5b50610111610483565b3480156101bd575f5ffd5b506101436101cc366004611171565b61049e565b348015610143575f5ffd5b3480156101e7575f5ffd5b506101436101f63660046111a8565b61051b565b348015610206575f5ffd5b5061022b604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161011b91906111ea565b348015610243575f5ffd5b506040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016815260200161011b565b348015610286575f5ffd5b5061014361015f36600461121f565b3480156102a0575f5ffd5b5061011161056a565b3480156102b4575f5ffd5b506101116105f8565b5f6102c661064d565b6102d084846106ca565b90506102db82610716565b9392505050565b6001600160a01b0381165f8181527f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006020819052604080832080546001600160a01b0319169055519092917f4a2cf608bfb427f53279ec7f0eadf48913b9346ccefc3af138dbdec14ea0907d91a25050565b604051630ad8c00b60e31b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060405163b760faf960e01b81523060048201526001600160a01b03919091169063b760faf99034906024015f604051808303818588803b1580156103d0575f5ffd5b505af11580156103e2573d5f5f3e3d5ffd5b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000060405163040b850f60e31b81526001600160a01b03848116600483015260248201849052919091169063205c2878906044015f604051808303815f87803b158015610453575f5ffd5b505af1158015610465573d5f5f3e3d5ffd5b505050505050565b61047561075b565b61047f82826107ff565b5050565b5f61048c6108c0565b505f5160206114075f395f51905f5290565b6001600160a01b038281165f8181527f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006020819052604080832080546001600160a01b031916958716958617905551909392917f8a39fc6d5142759acd84b3e96ccde9187266ecb0df56c8ff08bf2aedc7c93c4791a3505050565b565b61052361064d565b5f5f61052f8484610909565b915091506103e2815f01518260400151846040516020016105519291906112a4565b6040516020818303038152906040528360200151610a16565b6040516370a0823160e01b81523060048201525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa1580156105cf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f391906112d3565b905090565b604051631aab3f0d60e11b81523060048201525f60248201819052906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906335567e1a906044016105b4565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064015b60405180910390fd5b5f5f5f6106d78585610909565b915091505f6106e68686610ae2565b90506106f68184845f0151610b63565b610706576001935050505061070d565b5f93505050505b92915050565b50565b8015610713576040515f90339083908381818185875af1925050503d805f81146103e2576040519150601f19603f3d011682016040523d82523d5f602084013e6103e2565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806107e157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166107d55f5160206114075f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156105195760405163703e46dd60e11b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610859575060408051601f3d908101601f19168201909252610856918101906112d3565b60015b61088157604051634c9c8ce360e01b81526001600160a01b03831660048201526024016106c1565b5f5160206114075f395f51905f5281146108b157604051632a87526960e21b8152600481018290526024016106c1565b6108bb8383610bc4565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105195760405163703e46dd60e11b815260040160405180910390fd5b60408051606080820183525f8083526020830181905292820152605061093260608601866112ea565b9050101580156109755750638dd7712f60e01b61095260608601866112ea565b610960916004915f9161132d565b61096991611354565b6001600160e01b031916145b6109925760405163574b16a760e11b815260040160405180910390fd5b61099f60608501856112ea565b6109ad91600490829061132d565b8101906109ba919061138a565b604085015260208401526001600160a01b0316808352909250610a0f5780516109e38585610ae2565b60405163f252a21160e01b81526001600160a01b039283166004820152911660248201526044016106c1565b9250929050565b606081471015610a425760405163cf47918160e01b8152476004820152602481018390526044016106c1565b5f610a4e858486610c19565b9050808015610a6f57505f3d1180610a6f57505f856001600160a01b03163b115b15610a8457610a7c610c2e565b9150506102db565b8015610aae57604051639996b31560e01b81526001600160a01b03861660048201526024016106c1565b3d15610ac157610abc610c47565b610ada565b60405163d6bda27560e01b815260040160405180910390fd5b509392505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c829052603c8120610b5b81610b226101008701876112ea565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610c5292505050565b949350505050565b5f7f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006001600160a01b03858116908516148015610bbb57506001600160a01b038581165f908152602083905260409020548116908416145b95945050505050565b610bcd82610c7a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115610c11576108bb8282610cdd565b61047f610d5f565b5f5f5f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b5f5f5f5f610c608686610d7e565b925092509250610c708282610dc7565b5090949350505050565b806001600160a01b03163b5f03610caf57604051634c9c8ce360e01b81526001600160a01b03821660048201526024016106c1565b5f5160206114075f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f610cea8484610e7f565b9050808015610d0b57505f3d1180610d0b57505f846001600160a01b03163b115b15610d2057610d18610c2e565b91505061070d565b8015610d4a57604051639996b31560e01b81526001600160a01b03851660048201526024016106c1565b3d15610ac157610d58610c47565b5092915050565b34156105195760405163b398979f60e01b815260040160405180910390fd5b5f5f5f8351604103610db5576020840151604085015160608601515f1a610da788828585610e92565b955095509550505050610dc0565b505081515f91506002905b9250925092565b5f826003811115610dda57610dda6113f2565b03610de3575050565b6001826003811115610df757610df76113f2565b03610e155760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610e2957610e296113f2565b03610e4a5760405163fce698f760e01b8152600481018290526024016106c1565b6003826003811115610e5e57610e5e6113f2565b0361047f576040516335e2f38360e21b8152600481018290526024016106c1565b5f5f5f835160208501865af49392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610ecb57505f91506003905082610f50565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610f1c573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610f4757505f925060019150829050610f50565b92505f91508190505b9450945094915050565b5f6101208284031215610f6b575f5ffd5b50919050565b5f5f5f60608486031215610f83575f5ffd5b833567ffffffffffffffff811115610f99575f5ffd5b610fa586828701610f5a565b9660208601359650604090950135949350505050565b6001600160a01b0381168114610713575f5ffd5b5f60208284031215610fdf575f5ffd5b81356102db81610fbb565b5f5f60208385031215610ffb575f5ffd5b823567ffffffffffffffff811115611011575f5ffd5b8301601f81018513611021575f5ffd5b803567ffffffffffffffff811115611037575f5ffd5b8560208260051b840101111561104b575f5ffd5b6020919091019590945092505050565b5f5f6040838503121561106c575f5ffd5b823561107781610fbb565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126110a8575f5ffd5b813567ffffffffffffffff8111156110c2576110c2611085565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156110f1576110f1611085565b604052818152838201602001851015611108575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f60408385031215611135575f5ffd5b823561114081610fbb565b9150602083013567ffffffffffffffff81111561115b575f5ffd5b61116785828601611099565b9150509250929050565b5f5f60408385031215611182575f5ffd5b823561118d81610fbb565b9150602083013561119d81610fbb565b809150509250929050565b5f5f604083850312156111b9575f5ffd5b823567ffffffffffffffff8111156111cf575f5ffd5b6111db85828601610f5a565b95602094909401359450505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f5f60608587031215611232575f5ffd5b843561123d81610fbb565b935060208501359250604085013567ffffffffffffffff81111561125f575f5ffd5b8501601f8101871361126f575f5ffd5b803567ffffffffffffffff811115611285575f5ffd5b876020828401011115611296575f5ffd5b949793965060200194505050565b5f83518060208601845e60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f602082840312156112e3575f5ffd5b5051919050565b5f5f8335601e198436030181126112ff575f5ffd5b83018035915067ffffffffffffffff821115611319575f5ffd5b602001915036819003821315610a0f575f5ffd5b5f5f8585111561133b575f5ffd5b83861115611347575f5ffd5b5050820193919092039150565b80356001600160e01b03198116906004841015610d58576001600160e01b031960049490940360031b84901b1690921692915050565b5f5f5f5f6080858703121561139d575f5ffd5b84356113a881610fbb565b935060208501356113b881610fbb565b925060408501359150606085013567ffffffffffffffff8111156113da575f5ffd5b6113e687828801611099565b91505092959194509250565b634e487b7160e01b5f52602160045260245ffdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca264697066735822122013a4df1d72e5a64f451b71018c2fa481b59ab84ef8a2fe93f22ebcc4986f4f0364736f6c634300081e0033",
552
- "deployedBytecode": "0x6080604052600436106100e7575f3560e01c80636267e75911610087578063b0d691fe11610057578063b0d691fe14610238578063b61d27f61461027b578063c399ec8814610295578063d087d288146102a9575f5ffd5b80636267e759146101b25780638129fc1c146101d15780638dd7712f146101dc578063ad3cb1cc146101fb575f5ffd5b80634a58db19116100c25780634a58db19146101645780634d44560d1461016c5780634f1ef2861461018b57806352d1902d1461019e575f5ffd5b806319822f7c146100f2578063247884291461012457806334fcd5be14610145575f5ffd5b366100ee57005b5f5ffd5b3480156100fd575f5ffd5b5061011161010c366004610f71565b6102bd565b6040519081526020015b60405180910390f35b34801561012f575f5ffd5b5061014361013e366004610fcf565b6102e2565b005b348015610150575f5ffd5b5061014361015f366004610fea565b610354565b61014361036d565b348015610177575f5ffd5b5061014361018636600461105b565b6103e9565b610143610199366004611124565b61046d565b3480156101a9575f5ffd5b50610111610483565b3480156101bd575f5ffd5b506101436101cc366004611171565b61049e565b348015610143575f5ffd5b3480156101e7575f5ffd5b506101436101f63660046111a8565b61051b565b348015610206575f5ffd5b5061022b604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161011b91906111ea565b348015610243575f5ffd5b506040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016815260200161011b565b348015610286575f5ffd5b5061014361015f36600461121f565b3480156102a0575f5ffd5b5061011161056a565b3480156102b4575f5ffd5b506101116105f8565b5f6102c661064d565b6102d084846106ca565b90506102db82610716565b9392505050565b6001600160a01b0381165f8181527f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006020819052604080832080546001600160a01b0319169055519092917f4a2cf608bfb427f53279ec7f0eadf48913b9346ccefc3af138dbdec14ea0907d91a25050565b604051630ad8c00b60e31b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060405163b760faf960e01b81523060048201526001600160a01b03919091169063b760faf99034906024015f604051808303818588803b1580156103d0575f5ffd5b505af11580156103e2573d5f5f3e3d5ffd5b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000060405163040b850f60e31b81526001600160a01b03848116600483015260248201849052919091169063205c2878906044015f604051808303815f87803b158015610453575f5ffd5b505af1158015610465573d5f5f3e3d5ffd5b505050505050565b61047561075b565b61047f82826107ff565b5050565b5f61048c6108c0565b505f5160206114075f395f51905f5290565b6001600160a01b038281165f8181527f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006020819052604080832080546001600160a01b031916958716958617905551909392917f8a39fc6d5142759acd84b3e96ccde9187266ecb0df56c8ff08bf2aedc7c93c4791a3505050565b565b61052361064d565b5f5f61052f8484610909565b915091506103e2815f01518260400151846040516020016105519291906112a4565b6040516020818303038152906040528360200151610a16565b6040516370a0823160e01b81523060048201525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa1580156105cf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f391906112d3565b905090565b604051631aab3f0d60e11b81523060048201525f60248201819052906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906335567e1a906044016105b4565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064015b60405180910390fd5b5f5f5f6106d78585610909565b915091505f6106e68686610ae2565b90506106f68184845f0151610b63565b610706576001935050505061070d565b5f93505050505b92915050565b50565b8015610713576040515f90339083908381818185875af1925050503d805f81146103e2576040519150601f19603f3d011682016040523d82523d5f602084013e6103e2565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806107e157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166107d55f5160206114075f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156105195760405163703e46dd60e11b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610859575060408051601f3d908101601f19168201909252610856918101906112d3565b60015b61088157604051634c9c8ce360e01b81526001600160a01b03831660048201526024016106c1565b5f5160206114075f395f51905f5281146108b157604051632a87526960e21b8152600481018290526024016106c1565b6108bb8383610bc4565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105195760405163703e46dd60e11b815260040160405180910390fd5b60408051606080820183525f8083526020830181905292820152605061093260608601866112ea565b9050101580156109755750638dd7712f60e01b61095260608601866112ea565b610960916004915f9161132d565b61096991611354565b6001600160e01b031916145b6109925760405163574b16a760e11b815260040160405180910390fd5b61099f60608501856112ea565b6109ad91600490829061132d565b8101906109ba919061138a565b604085015260208401526001600160a01b0316808352909250610a0f5780516109e38585610ae2565b60405163f252a21160e01b81526001600160a01b039283166004820152911660248201526044016106c1565b9250929050565b606081471015610a425760405163cf47918160e01b8152476004820152602481018390526044016106c1565b5f610a4e858486610c19565b9050808015610a6f57505f3d1180610a6f57505f856001600160a01b03163b115b15610a8457610a7c610c2e565b9150506102db565b8015610aae57604051639996b31560e01b81526001600160a01b03861660048201526024016106c1565b3d15610ac157610abc610c47565b610ada565b60405163d6bda27560e01b815260040160405180910390fd5b509392505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c829052603c8120610b5b81610b226101008701876112ea565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610c5292505050565b949350505050565b5f7f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006001600160a01b03858116908516148015610bbb57506001600160a01b038581165f908152602083905260409020548116908416145b95945050505050565b610bcd82610c7a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115610c11576108bb8282610cdd565b61047f610d5f565b5f5f5f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b5f5f5f5f610c608686610d7e565b925092509250610c708282610dc7565b5090949350505050565b806001600160a01b03163b5f03610caf57604051634c9c8ce360e01b81526001600160a01b03821660048201526024016106c1565b5f5160206114075f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f610cea8484610e7f565b9050808015610d0b57505f3d1180610d0b57505f846001600160a01b03163b115b15610d2057610d18610c2e565b91505061070d565b8015610d4a57604051639996b31560e01b81526001600160a01b03851660048201526024016106c1565b3d15610ac157610d58610c47565b5092915050565b34156105195760405163b398979f60e01b815260040160405180910390fd5b5f5f5f8351604103610db5576020840151604085015160608601515f1a610da788828585610e92565b955095509550505050610dc0565b505081515f91506002905b9250925092565b5f826003811115610dda57610dda6113f2565b03610de3575050565b6001826003811115610df757610df76113f2565b03610e155760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610e2957610e296113f2565b03610e4a5760405163fce698f760e01b8152600481018290526024016106c1565b6003826003811115610e5e57610e5e6113f2565b0361047f576040516335e2f38360e21b8152600481018290526024016106c1565b5f5f5f835160208501865af49392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610ecb57505f91506003905082610f50565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610f1c573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610f4757505f925060019150829050610f50565b92505f91508190505b9450945094915050565b5f6101208284031215610f6b575f5ffd5b50919050565b5f5f5f60608486031215610f83575f5ffd5b833567ffffffffffffffff811115610f99575f5ffd5b610fa586828701610f5a565b9660208601359650604090950135949350505050565b6001600160a01b0381168114610713575f5ffd5b5f60208284031215610fdf575f5ffd5b81356102db81610fbb565b5f5f60208385031215610ffb575f5ffd5b823567ffffffffffffffff811115611011575f5ffd5b8301601f81018513611021575f5ffd5b803567ffffffffffffffff811115611037575f5ffd5b8560208260051b840101111561104b575f5ffd5b6020919091019590945092505050565b5f5f6040838503121561106c575f5ffd5b823561107781610fbb565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126110a8575f5ffd5b813567ffffffffffffffff8111156110c2576110c2611085565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156110f1576110f1611085565b604052818152838201602001851015611108575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f60408385031215611135575f5ffd5b823561114081610fbb565b9150602083013567ffffffffffffffff81111561115b575f5ffd5b61116785828601611099565b9150509250929050565b5f5f60408385031215611182575f5ffd5b823561118d81610fbb565b9150602083013561119d81610fbb565b809150509250929050565b5f5f604083850312156111b9575f5ffd5b823567ffffffffffffffff8111156111cf575f5ffd5b6111db85828601610f5a565b95602094909401359450505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f5f60608587031215611232575f5ffd5b843561123d81610fbb565b935060208501359250604085013567ffffffffffffffff81111561125f575f5ffd5b8501601f8101871361126f575f5ffd5b803567ffffffffffffffff811115611285575f5ffd5b876020828401011115611296575f5ffd5b949793965060200194505050565b5f83518060208601845e60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f602082840312156112e3575f5ffd5b5051919050565b5f5f8335601e198436030181126112ff575f5ffd5b83018035915067ffffffffffffffff821115611319575f5ffd5b602001915036819003821315610a0f575f5ffd5b5f5f8585111561133b575f5ffd5b83861115611347575f5ffd5b5050820193919092039150565b80356001600160e01b03198116906004841015610d58576001600160e01b031960049490940360031b84901b1690921692915050565b5f5f5f5f6080858703121561139d575f5ffd5b84356113a881610fbb565b935060208501356113b881610fbb565b925060408501359150606085013567ffffffffffffffff8111156113da575f5ffd5b6113e687828801611099565b91505092959194509250565b634e487b7160e01b5f52602160045260245ffdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca264697066735822122013a4df1d72e5a64f451b71018c2fa481b59ab84ef8a2fe93f22ebcc4986f4f0364736f6c634300081e0033",
585
+ "bytecode": "0x60c060405230608052348015610013575f5ffd5b5060405161166d38038061166d83398101604081905261003291610043565b6001600160a01b031660a052610070565b5f60208284031215610053575f5ffd5b81516001600160a01b0381168114610069575f5ffd5b9392505050565b60805160a0516115ab6100c25f395f818161027b0152818161039901528181610415015281816105ea0152818161067f01526106b901525f81816107c8015281816107f1015261092d01526115ab5ff3fe6080604052600436106100f2575f3560e01c80638129fc1c11610087578063b0d691fe11610057578063b0d691fe14610262578063b61d27f6146102a5578063c399ec88146102bf578063d087d288146102d3575f5ffd5b80638129fc1c146101dc57806381a30acd146101e75780638dd7712f14610206578063ad3cb1cc14610225575f5ffd5b80634d44560d116100c25780634d44560d146101775780634f1ef2861461019657806352d1902d146101a95780636267e759146101bd575f5ffd5b806319822f7c146100fd578063247884291461012f57806334fcd5be146101505780634a58db191461016f575f5ffd5b366100f957005b5f5ffd5b348015610108575f5ffd5b5061011c610117366004611014565b6102e7565b6040519081526020015b60405180910390f35b34801561013a575f5ffd5b5061014e610149366004611072565b61030c565b005b34801561015b575f5ffd5b5061014e61016a36600461108d565b61037e565b61014e610397565b348015610182575f5ffd5b5061014e6101913660046110fe565b610413565b61014e6101a43660046111c7565b610497565b3480156101b4575f5ffd5b5061011c6104ad565b3480156101c8575f5ffd5b5061014e6101d7366004611214565b6104c8565b34801561014e575f5ffd5b3480156101f2575f5ffd5b5061014e610201366004611290565b610545565b348015610211575f5ffd5b5061014e6102203660046112fe565b61057b565b348015610230575f5ffd5b50610255604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101269190611340565b34801561026d575f5ffd5b506040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152602001610126565b3480156102b0575f5ffd5b5061014e61016a366004611375565b3480156102ca575f5ffd5b5061011c6105cb565b3480156102de575f5ffd5b5061011c610659565b5f6102f06106ae565b6102fa848461072b565b905061030582610778565b9392505050565b6001600160a01b0381165f8181527f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006020819052604080832080546001600160a01b0319169055519092917f4a2cf608bfb427f53279ec7f0eadf48913b9346ccefc3af138dbdec14ea0907d91a25050565b60405163574b16a760e11b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060405163b760faf960e01b81523060048201526001600160a01b03919091169063b760faf99034906024015f604051808303818588803b1580156103fa575f5ffd5b505af115801561040c573d5f5f3e3d5ffd5b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000060405163040b850f60e31b81526001600160a01b03848116600483015260248201849052919091169063205c2878906044015f604051808303815f87803b15801561047d575f5ffd5b505af115801561048f573d5f5f3e3d5ffd5b505050505050565b61049f6107bd565b6104a98282610861565b5050565b5f6104b6610922565b505f5160206115565f395f51905f5290565b6001600160a01b038281165f8181527f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006020819052604080832080546001600160a01b031916958716958617905551909392917f8a39fc6d5142759acd84b3e96ccde9187266ecb0df56c8ff08bf2aedc7c93c4791a3505050565b565b61054d6106ae565b61048f84838388604051602001610566939291906113cd565b6040516020818303038152906040528561096b565b6105836106ae565b5f5f61058f8484610a37565b509150915061040c815f01518260400151846040516020016105b29291906113f3565b604051602081830303815290604052836020015161096b565b6040516370a0823160e01b81523060048201525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015610630573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106549190611422565b905090565b604051631aab3f0d60e11b81523060048201525f60248201819052906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610615565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105435760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064015b60405180910390fd5b5f5f5f6107388585610a37565b50915091505f6107488686610b88565b90506107588184845f0151610c09565b610768576001935050505061076f565b5f93505050505b92915050565b50565b8015610775576040515f90339083908381818185875af1925050503d805f811461040c576040519150601f19603f3d011682016040523d82523d5f602084013e61040c565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061084357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166108375f5160206115565f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156105435760405163703e46dd60e11b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156108bb575060408051601f3d908101601f191682019092526108b891810190611422565b60015b6108e357604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610722565b5f5160206115565f395f51905f52811461091357604051632a87526960e21b815260048101829052602401610722565b61091d8383610c6a565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105435760405163703e46dd60e11b815260040160405180910390fd5b6060814710156109975760405163cf47918160e01b815247600482015260248101839052604401610722565b5f6109a3858486610cbf565b90508080156109c457505f3d11806109c457505f856001600160a01b03163b115b156109d9576109d1610cd4565b915050610305565b8015610a0357604051639996b31560e01b81526001600160a01b0386166004820152602401610722565b3d15610a1657610a11610ced565b610a2f565b60405163d6bda27560e01b815260040160405180910390fd5b509392505050565b60408051606080820183525f80835260208301819052928201525f6084610a616060870187611439565b90501015610a825760405163574b16a760e11b815260040160405180910390fd5b610a8f6060860186611439565b610a9d916004915f9161147c565b610aa6916114a3565b90506001600160e01b03198116638dd7712f60e01b14801590610ada57506001600160e01b031981166381a30acd60e01b14155b15610b045760405163c610096760e01b81526001600160e01b031982166004820152602401610722565b610b116060860186611439565b610b1f91600490829061147c565b810190610b2c91906114d9565b604086015260208501526001600160a01b0316808452909350610b81578151610b558686610b88565b60405163f252a21160e01b81526001600160a01b03928316600482015291166024820152604401610722565b9250925092565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c829052603c8120610c0181610bc8610100870187611439565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610cf892505050565b949350505050565b5f7f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006001600160a01b03858116908516148015610c6157506001600160a01b038581165f908152602083905260409020548116908416145b95945050505050565b610c7382610d20565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115610cb75761091d8282610d83565b6104a9610e05565b5f5f5f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b5f5f5f5f610d068686610e24565b925092509250610d168282610e6a565b5090949350505050565b806001600160a01b03163b5f03610d5557604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610722565b5f5160206115565f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f610d908484610f22565b9050808015610db157505f3d1180610db157505f846001600160a01b03163b115b15610dc657610dbe610cd4565b91505061076f565b8015610df057604051639996b31560e01b81526001600160a01b0385166004820152602401610722565b3d15610a1657610dfe610ced565b5092915050565b34156105435760405163b398979f60e01b815260040160405180910390fd5b5f5f5f8351604103610e5b576020840151604085015160608601515f1a610e4d88828585610f35565b955095509550505050610b81565b505081515f9150600290610b81565b5f826003811115610e7d57610e7d611541565b03610e86575050565b6001826003811115610e9a57610e9a611541565b03610eb85760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610ecc57610ecc611541565b03610eed5760405163fce698f760e01b815260048101829052602401610722565b6003826003811115610f0157610f01611541565b036104a9576040516335e2f38360e21b815260048101829052602401610722565b5f5f5f835160208501865af49392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610f6e57505f91506003905082610ff3565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610fbf573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610fea57505f925060019150829050610ff3565b92505f91508190505b9450945094915050565b5f610120828403121561100e575f5ffd5b50919050565b5f5f5f60608486031215611026575f5ffd5b833567ffffffffffffffff81111561103c575f5ffd5b61104886828701610ffd565b9660208601359650604090950135949350505050565b6001600160a01b0381168114610775575f5ffd5b5f60208284031215611082575f5ffd5b81356103058161105e565b5f5f6020838503121561109e575f5ffd5b823567ffffffffffffffff8111156110b4575f5ffd5b8301601f810185136110c4575f5ffd5b803567ffffffffffffffff8111156110da575f5ffd5b8560208260051b84010111156110ee575f5ffd5b6020919091019590945092505050565b5f5f6040838503121561110f575f5ffd5b823561111a8161105e565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261114b575f5ffd5b813567ffffffffffffffff81111561116557611165611128565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561119457611194611128565b6040528181528382016020018510156111ab575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f604083850312156111d8575f5ffd5b82356111e38161105e565b9150602083013567ffffffffffffffff8111156111fe575f5ffd5b61120a8582860161113c565b9150509250929050565b5f5f60408385031215611225575f5ffd5b82356112308161105e565b915060208301356112408161105e565b809150509250929050565b5f5f83601f84011261125b575f5ffd5b50813567ffffffffffffffff811115611272575f5ffd5b602083019150836020828501011115611289575f5ffd5b9250929050565b5f5f5f5f5f608086880312156112a4575f5ffd5b85356112af8161105e565b945060208601356112bf8161105e565b935060408601359250606086013567ffffffffffffffff8111156112e1575f5ffd5b6112ed8882890161124b565b969995985093965092949392505050565b5f5f6040838503121561130f575f5ffd5b823567ffffffffffffffff811115611325575f5ffd5b61133185828601610ffd565b95602094909401359450505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f5f60608587031215611388575f5ffd5b84356113938161105e565b935060208501359250604085013567ffffffffffffffff8111156113b5575f5ffd5b6113c18782880161124b565b95989497509550505050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b5f83518060208601845e60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f60208284031215611432575f5ffd5b5051919050565b5f5f8335601e1984360301811261144e575f5ffd5b83018035915067ffffffffffffffff821115611468575f5ffd5b602001915036819003821315611289575f5ffd5b5f5f8585111561148a575f5ffd5b83861115611496575f5ffd5b5050820193919092039150565b80356001600160e01b03198116906004841015610dfe576001600160e01b031960049490940360031b84901b1690921692915050565b5f5f5f5f608085870312156114ec575f5ffd5b84356114f78161105e565b935060208501356115078161105e565b925060408501359150606085013567ffffffffffffffff811115611529575f5ffd5b6115358782880161113c565b91505092959194509250565b634e487b7160e01b5f52602160045260245ffdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220925fe411a74f721c53058a316afb80f3ef094898def53447db92437f185df9ba64736f6c634300081e0033",
586
+ "deployedBytecode": "0x6080604052600436106100f2575f3560e01c80638129fc1c11610087578063b0d691fe11610057578063b0d691fe14610262578063b61d27f6146102a5578063c399ec88146102bf578063d087d288146102d3575f5ffd5b80638129fc1c146101dc57806381a30acd146101e75780638dd7712f14610206578063ad3cb1cc14610225575f5ffd5b80634d44560d116100c25780634d44560d146101775780634f1ef2861461019657806352d1902d146101a95780636267e759146101bd575f5ffd5b806319822f7c146100fd578063247884291461012f57806334fcd5be146101505780634a58db191461016f575f5ffd5b366100f957005b5f5ffd5b348015610108575f5ffd5b5061011c610117366004611014565b6102e7565b6040519081526020015b60405180910390f35b34801561013a575f5ffd5b5061014e610149366004611072565b61030c565b005b34801561015b575f5ffd5b5061014e61016a36600461108d565b61037e565b61014e610397565b348015610182575f5ffd5b5061014e6101913660046110fe565b610413565b61014e6101a43660046111c7565b610497565b3480156101b4575f5ffd5b5061011c6104ad565b3480156101c8575f5ffd5b5061014e6101d7366004611214565b6104c8565b34801561014e575f5ffd5b3480156101f2575f5ffd5b5061014e610201366004611290565b610545565b348015610211575f5ffd5b5061014e6102203660046112fe565b61057b565b348015610230575f5ffd5b50610255604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101269190611340565b34801561026d575f5ffd5b506040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152602001610126565b3480156102b0575f5ffd5b5061014e61016a366004611375565b3480156102ca575f5ffd5b5061011c6105cb565b3480156102de575f5ffd5b5061011c610659565b5f6102f06106ae565b6102fa848461072b565b905061030582610778565b9392505050565b6001600160a01b0381165f8181527f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006020819052604080832080546001600160a01b0319169055519092917f4a2cf608bfb427f53279ec7f0eadf48913b9346ccefc3af138dbdec14ea0907d91a25050565b60405163574b16a760e11b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060405163b760faf960e01b81523060048201526001600160a01b03919091169063b760faf99034906024015f604051808303818588803b1580156103fa575f5ffd5b505af115801561040c573d5f5f3e3d5ffd5b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000060405163040b850f60e31b81526001600160a01b03848116600483015260248201849052919091169063205c2878906044015f604051808303815f87803b15801561047d575f5ffd5b505af115801561048f573d5f5f3e3d5ffd5b505050505050565b61049f6107bd565b6104a98282610861565b5050565b5f6104b6610922565b505f5160206115565f395f51905f5290565b6001600160a01b038281165f8181527f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006020819052604080832080546001600160a01b031916958716958617905551909392917f8a39fc6d5142759acd84b3e96ccde9187266ecb0df56c8ff08bf2aedc7c93c4791a3505050565b565b61054d6106ae565b61048f84838388604051602001610566939291906113cd565b6040516020818303038152906040528561096b565b6105836106ae565b5f5f61058f8484610a37565b509150915061040c815f01518260400151846040516020016105b29291906113f3565b604051602081830303815290604052836020015161096b565b6040516370a0823160e01b81523060048201525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015610630573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106549190611422565b905090565b604051631aab3f0d60e11b81523060048201525f60248201819052906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610615565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105435760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064015b60405180910390fd5b5f5f5f6107388585610a37565b50915091505f6107488686610b88565b90506107588184845f0151610c09565b610768576001935050505061076f565b5f93505050505b92915050565b50565b8015610775576040515f90339083908381818185875af1925050503d805f811461040c576040519150601f19603f3d011682016040523d82523d5f602084013e61040c565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061084357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166108375f5160206115565f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156105435760405163703e46dd60e11b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156108bb575060408051601f3d908101601f191682019092526108b891810190611422565b60015b6108e357604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610722565b5f5160206115565f395f51905f52811461091357604051632a87526960e21b815260048101829052602401610722565b61091d8383610c6a565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105435760405163703e46dd60e11b815260040160405180910390fd5b6060814710156109975760405163cf47918160e01b815247600482015260248101839052604401610722565b5f6109a3858486610cbf565b90508080156109c457505f3d11806109c457505f856001600160a01b03163b115b156109d9576109d1610cd4565b915050610305565b8015610a0357604051639996b31560e01b81526001600160a01b0386166004820152602401610722565b3d15610a1657610a11610ced565b610a2f565b60405163d6bda27560e01b815260040160405180910390fd5b509392505050565b60408051606080820183525f80835260208301819052928201525f6084610a616060870187611439565b90501015610a825760405163574b16a760e11b815260040160405180910390fd5b610a8f6060860186611439565b610a9d916004915f9161147c565b610aa6916114a3565b90506001600160e01b03198116638dd7712f60e01b14801590610ada57506001600160e01b031981166381a30acd60e01b14155b15610b045760405163c610096760e01b81526001600160e01b031982166004820152602401610722565b610b116060860186611439565b610b1f91600490829061147c565b810190610b2c91906114d9565b604086015260208501526001600160a01b0316808452909350610b81578151610b558686610b88565b60405163f252a21160e01b81526001600160a01b03928316600482015291166024820152604401610722565b9250925092565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c829052603c8120610c0181610bc8610100870187611439565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610cf892505050565b949350505050565b5f7f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006001600160a01b03858116908516148015610c6157506001600160a01b038581165f908152602083905260409020548116908416145b95945050505050565b610c7382610d20565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115610cb75761091d8282610d83565b6104a9610e05565b5f5f5f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b5f5f5f5f610d068686610e24565b925092509250610d168282610e6a565b5090949350505050565b806001600160a01b03163b5f03610d5557604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610722565b5f5160206115565f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f610d908484610f22565b9050808015610db157505f3d1180610db157505f846001600160a01b03163b115b15610dc657610dbe610cd4565b91505061076f565b8015610df057604051639996b31560e01b81526001600160a01b0385166004820152602401610722565b3d15610a1657610dfe610ced565b5092915050565b34156105435760405163b398979f60e01b815260040160405180910390fd5b5f5f5f8351604103610e5b576020840151604085015160608601515f1a610e4d88828585610f35565b955095509550505050610b81565b505081515f9150600290610b81565b5f826003811115610e7d57610e7d611541565b03610e86575050565b6001826003811115610e9a57610e9a611541565b03610eb85760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610ecc57610ecc611541565b03610eed5760405163fce698f760e01b815260048101829052602401610722565b6003826003811115610f0157610f01611541565b036104a9576040516335e2f38360e21b815260048101829052602401610722565b5f5f5f835160208501865af49392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610f6e57505f91506003905082610ff3565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610fbf573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610fea57505f925060019150829050610ff3565b92505f91508190505b9450945094915050565b5f610120828403121561100e575f5ffd5b50919050565b5f5f5f60608486031215611026575f5ffd5b833567ffffffffffffffff81111561103c575f5ffd5b61104886828701610ffd565b9660208601359650604090950135949350505050565b6001600160a01b0381168114610775575f5ffd5b5f60208284031215611082575f5ffd5b81356103058161105e565b5f5f6020838503121561109e575f5ffd5b823567ffffffffffffffff8111156110b4575f5ffd5b8301601f810185136110c4575f5ffd5b803567ffffffffffffffff8111156110da575f5ffd5b8560208260051b84010111156110ee575f5ffd5b6020919091019590945092505050565b5f5f6040838503121561110f575f5ffd5b823561111a8161105e565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261114b575f5ffd5b813567ffffffffffffffff81111561116557611165611128565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561119457611194611128565b6040528181528382016020018510156111ab575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f604083850312156111d8575f5ffd5b82356111e38161105e565b9150602083013567ffffffffffffffff8111156111fe575f5ffd5b61120a8582860161113c565b9150509250929050565b5f5f60408385031215611225575f5ffd5b82356112308161105e565b915060208301356112408161105e565b809150509250929050565b5f5f83601f84011261125b575f5ffd5b50813567ffffffffffffffff811115611272575f5ffd5b602083019150836020828501011115611289575f5ffd5b9250929050565b5f5f5f5f5f608086880312156112a4575f5ffd5b85356112af8161105e565b945060208601356112bf8161105e565b935060408601359250606086013567ffffffffffffffff8111156112e1575f5ffd5b6112ed8882890161124b565b969995985093965092949392505050565b5f5f6040838503121561130f575f5ffd5b823567ffffffffffffffff811115611325575f5ffd5b61133185828601610ffd565b95602094909401359450505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f5f60608587031215611388575f5ffd5b84356113938161105e565b935060208501359250604085013567ffffffffffffffff8111156113b5575f5ffd5b6113c18782880161124b565b95989497509550505050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b5f83518060208601845e60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f60208284031215611432575f5ffd5b5051919050565b5f5f8335601e1984360301811261144e575f5ffd5b83018035915067ffffffffffffffff821115611468575f5ffd5b602001915036819003821315611289575f5ffd5b5f5f8585111561148a575f5ffd5b83861115611496575f5ffd5b5050820193919092039150565b80356001600160e01b03198116906004841015610dfe576001600160e01b031960049490940360031b84901b1690921692915050565b5f5f5f5f608085870312156114ec575f5ffd5b84356114f78161105e565b935060208501356115078161105e565b925060408501359150606085013567ffffffffffffffff811115611529575f5ffd5b6115358782880161113c565b91505092959194509250565b634e487b7160e01b5f52602160045260245ffdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220925fe411a74f721c53058a316afb80f3ef094898def53447db92437f185df9ba64736f6c634300081e0033",
553
587
  "linkReferences": {},
554
588
  "deployedLinkReferences": {},
555
589
  "immutableReferences": {
556
590
  "2756": [
557
591
  {
558
592
  "length": 32,
559
- "start": 1894
593
+ "start": 1992
560
594
  },
561
595
  {
562
596
  "length": 32,
563
- "start": 1935
597
+ "start": 2033
564
598
  },
565
599
  {
566
600
  "length": 32,
567
- "start": 2251
601
+ "start": 2349
568
602
  }
569
603
  ],
570
- "12314": [
604
+ "12317": [
571
605
  {
572
606
  "length": 32,
573
- "start": 593
607
+ "start": 635
574
608
  },
575
609
  {
576
610
  "length": 32,
577
- "start": 879
611
+ "start": 921
578
612
  },
579
613
  {
580
614
  "length": 32,
581
- "start": 1003
615
+ "start": 1045
582
616
  },
583
617
  {
584
618
  "length": 32,
585
- "start": 1417
619
+ "start": 1514
586
620
  },
587
621
  {
588
622
  "length": 32,
589
- "start": 1566
623
+ "start": 1663
590
624
  },
591
625
  {
592
626
  "length": 32,
593
- "start": 1624
627
+ "start": 1721
594
628
  }
595
629
  ]
596
630
  },
597
631
  "inputSourceName": "project/contracts/ERC2771ForwarderAccount.sol",
598
- "buildInfoId": "solc-0_8_30-3f701667cdad33af53ac1f684f455bb9e01a58ac"
632
+ "buildInfoId": "solc-0_8_30-f987e738f2ecce00e06bc1b8c078480f3d3eb966"
599
633
  }
@@ -8,14 +8,14 @@ export interface ERC2771ForwarderAccount$Type {
8
8
  readonly _format: "hh3-artifact-1";
9
9
  readonly contractName: "ERC2771ForwarderAccount";
10
10
  readonly sourceName: "contracts/ERC2771ForwarderAccount.sol";
11
- readonly abi: [{"inputs":[{"internalType":"contract IEntryPoint","name":"anEntryPoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bytes","name":"error","type":"bytes"}],"name":"ExecuteError","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidCall","type":"error"},{"inputs":[{"internalType":"contract ERC2771Context","name":"target","type":"address"},{"internalType":"address","name":"signer","type":"address"}],"name":"InvalidTarget","type":"error"},{"inputs":[],"name":"OnlyExecuteUserOpAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"RequiredEntryPointOrExecutor","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":true,"internalType":"contract ERC2771Context","name":"target","type":"address"}],"name":"ExecutorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"executor","type":"address"}],"name":"ExecutorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"executor","type":"address"},{"internalType":"contract ERC2771Context","name":"target","type":"address"}],"name":"addExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct BaseAccount.Call[]","name":"","type":"tuple[]"}],"name":"executeBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"bytes32","name":"accountGasLimits","type":"bytes32"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"bytes32","name":"gasFees","type":"bytes32"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct PackedUserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"}],"name":"executeUserOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"executor","type":"address"}],"name":"removeExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"bytes32","name":"accountGasLimits","type":"bytes32"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"bytes32","name":"gasFees","type":"bytes32"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct PackedUserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"missingAccountFunds","type":"uint256"}],"name":"validateUserOp","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawDepositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}];
12
- readonly bytecode: "0x60c060405230608052348015610013575f5ffd5b5060405161151e38038061151e83398101604081905261003291610043565b6001600160a01b031660a052610070565b5f60208284031215610053575f5ffd5b81516001600160a01b0381168114610069575f5ffd5b9392505050565b60805160a05161145c6100c25f395f81816102510152818161036f015281816103eb015281816105890152818161061e015261065801525f81816107660152818161078f01526108cb015261145c5ff3fe6080604052600436106100e7575f3560e01c80636267e75911610087578063b0d691fe11610057578063b0d691fe14610238578063b61d27f61461027b578063c399ec8814610295578063d087d288146102a9575f5ffd5b80636267e759146101b25780638129fc1c146101d15780638dd7712f146101dc578063ad3cb1cc146101fb575f5ffd5b80634a58db19116100c25780634a58db19146101645780634d44560d1461016c5780634f1ef2861461018b57806352d1902d1461019e575f5ffd5b806319822f7c146100f2578063247884291461012457806334fcd5be14610145575f5ffd5b366100ee57005b5f5ffd5b3480156100fd575f5ffd5b5061011161010c366004610f71565b6102bd565b6040519081526020015b60405180910390f35b34801561012f575f5ffd5b5061014361013e366004610fcf565b6102e2565b005b348015610150575f5ffd5b5061014361015f366004610fea565b610354565b61014361036d565b348015610177575f5ffd5b5061014361018636600461105b565b6103e9565b610143610199366004611124565b61046d565b3480156101a9575f5ffd5b50610111610483565b3480156101bd575f5ffd5b506101436101cc366004611171565b61049e565b348015610143575f5ffd5b3480156101e7575f5ffd5b506101436101f63660046111a8565b61051b565b348015610206575f5ffd5b5061022b604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161011b91906111ea565b348015610243575f5ffd5b506040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016815260200161011b565b348015610286575f5ffd5b5061014361015f36600461121f565b3480156102a0575f5ffd5b5061011161056a565b3480156102b4575f5ffd5b506101116105f8565b5f6102c661064d565b6102d084846106ca565b90506102db82610716565b9392505050565b6001600160a01b0381165f8181527f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006020819052604080832080546001600160a01b0319169055519092917f4a2cf608bfb427f53279ec7f0eadf48913b9346ccefc3af138dbdec14ea0907d91a25050565b604051630ad8c00b60e31b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060405163b760faf960e01b81523060048201526001600160a01b03919091169063b760faf99034906024015f604051808303818588803b1580156103d0575f5ffd5b505af11580156103e2573d5f5f3e3d5ffd5b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000060405163040b850f60e31b81526001600160a01b03848116600483015260248201849052919091169063205c2878906044015f604051808303815f87803b158015610453575f5ffd5b505af1158015610465573d5f5f3e3d5ffd5b505050505050565b61047561075b565b61047f82826107ff565b5050565b5f61048c6108c0565b505f5160206114075f395f51905f5290565b6001600160a01b038281165f8181527f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006020819052604080832080546001600160a01b031916958716958617905551909392917f8a39fc6d5142759acd84b3e96ccde9187266ecb0df56c8ff08bf2aedc7c93c4791a3505050565b565b61052361064d565b5f5f61052f8484610909565b915091506103e2815f01518260400151846040516020016105519291906112a4565b6040516020818303038152906040528360200151610a16565b6040516370a0823160e01b81523060048201525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa1580156105cf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f391906112d3565b905090565b604051631aab3f0d60e11b81523060048201525f60248201819052906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906335567e1a906044016105b4565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064015b60405180910390fd5b5f5f5f6106d78585610909565b915091505f6106e68686610ae2565b90506106f68184845f0151610b63565b610706576001935050505061070d565b5f93505050505b92915050565b50565b8015610713576040515f90339083908381818185875af1925050503d805f81146103e2576040519150601f19603f3d011682016040523d82523d5f602084013e6103e2565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806107e157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166107d55f5160206114075f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156105195760405163703e46dd60e11b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610859575060408051601f3d908101601f19168201909252610856918101906112d3565b60015b61088157604051634c9c8ce360e01b81526001600160a01b03831660048201526024016106c1565b5f5160206114075f395f51905f5281146108b157604051632a87526960e21b8152600481018290526024016106c1565b6108bb8383610bc4565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105195760405163703e46dd60e11b815260040160405180910390fd5b60408051606080820183525f8083526020830181905292820152605061093260608601866112ea565b9050101580156109755750638dd7712f60e01b61095260608601866112ea565b610960916004915f9161132d565b61096991611354565b6001600160e01b031916145b6109925760405163574b16a760e11b815260040160405180910390fd5b61099f60608501856112ea565b6109ad91600490829061132d565b8101906109ba919061138a565b604085015260208401526001600160a01b0316808352909250610a0f5780516109e38585610ae2565b60405163f252a21160e01b81526001600160a01b039283166004820152911660248201526044016106c1565b9250929050565b606081471015610a425760405163cf47918160e01b8152476004820152602481018390526044016106c1565b5f610a4e858486610c19565b9050808015610a6f57505f3d1180610a6f57505f856001600160a01b03163b115b15610a8457610a7c610c2e565b9150506102db565b8015610aae57604051639996b31560e01b81526001600160a01b03861660048201526024016106c1565b3d15610ac157610abc610c47565b610ada565b60405163d6bda27560e01b815260040160405180910390fd5b509392505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c829052603c8120610b5b81610b226101008701876112ea565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610c5292505050565b949350505050565b5f7f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006001600160a01b03858116908516148015610bbb57506001600160a01b038581165f908152602083905260409020548116908416145b95945050505050565b610bcd82610c7a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115610c11576108bb8282610cdd565b61047f610d5f565b5f5f5f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b5f5f5f5f610c608686610d7e565b925092509250610c708282610dc7565b5090949350505050565b806001600160a01b03163b5f03610caf57604051634c9c8ce360e01b81526001600160a01b03821660048201526024016106c1565b5f5160206114075f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f610cea8484610e7f565b9050808015610d0b57505f3d1180610d0b57505f846001600160a01b03163b115b15610d2057610d18610c2e565b91505061070d565b8015610d4a57604051639996b31560e01b81526001600160a01b03851660048201526024016106c1565b3d15610ac157610d58610c47565b5092915050565b34156105195760405163b398979f60e01b815260040160405180910390fd5b5f5f5f8351604103610db5576020840151604085015160608601515f1a610da788828585610e92565b955095509550505050610dc0565b505081515f91506002905b9250925092565b5f826003811115610dda57610dda6113f2565b03610de3575050565b6001826003811115610df757610df76113f2565b03610e155760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610e2957610e296113f2565b03610e4a5760405163fce698f760e01b8152600481018290526024016106c1565b6003826003811115610e5e57610e5e6113f2565b0361047f576040516335e2f38360e21b8152600481018290526024016106c1565b5f5f5f835160208501865af49392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610ecb57505f91506003905082610f50565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610f1c573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610f4757505f925060019150829050610f50565b92505f91508190505b9450945094915050565b5f6101208284031215610f6b575f5ffd5b50919050565b5f5f5f60608486031215610f83575f5ffd5b833567ffffffffffffffff811115610f99575f5ffd5b610fa586828701610f5a565b9660208601359650604090950135949350505050565b6001600160a01b0381168114610713575f5ffd5b5f60208284031215610fdf575f5ffd5b81356102db81610fbb565b5f5f60208385031215610ffb575f5ffd5b823567ffffffffffffffff811115611011575f5ffd5b8301601f81018513611021575f5ffd5b803567ffffffffffffffff811115611037575f5ffd5b8560208260051b840101111561104b575f5ffd5b6020919091019590945092505050565b5f5f6040838503121561106c575f5ffd5b823561107781610fbb565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126110a8575f5ffd5b813567ffffffffffffffff8111156110c2576110c2611085565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156110f1576110f1611085565b604052818152838201602001851015611108575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f60408385031215611135575f5ffd5b823561114081610fbb565b9150602083013567ffffffffffffffff81111561115b575f5ffd5b61116785828601611099565b9150509250929050565b5f5f60408385031215611182575f5ffd5b823561118d81610fbb565b9150602083013561119d81610fbb565b809150509250929050565b5f5f604083850312156111b9575f5ffd5b823567ffffffffffffffff8111156111cf575f5ffd5b6111db85828601610f5a565b95602094909401359450505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f5f60608587031215611232575f5ffd5b843561123d81610fbb565b935060208501359250604085013567ffffffffffffffff81111561125f575f5ffd5b8501601f8101871361126f575f5ffd5b803567ffffffffffffffff811115611285575f5ffd5b876020828401011115611296575f5ffd5b949793965060200194505050565b5f83518060208601845e60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f602082840312156112e3575f5ffd5b5051919050565b5f5f8335601e198436030181126112ff575f5ffd5b83018035915067ffffffffffffffff821115611319575f5ffd5b602001915036819003821315610a0f575f5ffd5b5f5f8585111561133b575f5ffd5b83861115611347575f5ffd5b5050820193919092039150565b80356001600160e01b03198116906004841015610d58576001600160e01b031960049490940360031b84901b1690921692915050565b5f5f5f5f6080858703121561139d575f5ffd5b84356113a881610fbb565b935060208501356113b881610fbb565b925060408501359150606085013567ffffffffffffffff8111156113da575f5ffd5b6113e687828801611099565b91505092959194509250565b634e487b7160e01b5f52602160045260245ffdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca264697066735822122013a4df1d72e5a64f451b71018c2fa481b59ab84ef8a2fe93f22ebcc4986f4f0364736f6c634300081e0033";
13
- readonly deployedBytecode: "0x6080604052600436106100e7575f3560e01c80636267e75911610087578063b0d691fe11610057578063b0d691fe14610238578063b61d27f61461027b578063c399ec8814610295578063d087d288146102a9575f5ffd5b80636267e759146101b25780638129fc1c146101d15780638dd7712f146101dc578063ad3cb1cc146101fb575f5ffd5b80634a58db19116100c25780634a58db19146101645780634d44560d1461016c5780634f1ef2861461018b57806352d1902d1461019e575f5ffd5b806319822f7c146100f2578063247884291461012457806334fcd5be14610145575f5ffd5b366100ee57005b5f5ffd5b3480156100fd575f5ffd5b5061011161010c366004610f71565b6102bd565b6040519081526020015b60405180910390f35b34801561012f575f5ffd5b5061014361013e366004610fcf565b6102e2565b005b348015610150575f5ffd5b5061014361015f366004610fea565b610354565b61014361036d565b348015610177575f5ffd5b5061014361018636600461105b565b6103e9565b610143610199366004611124565b61046d565b3480156101a9575f5ffd5b50610111610483565b3480156101bd575f5ffd5b506101436101cc366004611171565b61049e565b348015610143575f5ffd5b3480156101e7575f5ffd5b506101436101f63660046111a8565b61051b565b348015610206575f5ffd5b5061022b604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161011b91906111ea565b348015610243575f5ffd5b506040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016815260200161011b565b348015610286575f5ffd5b5061014361015f36600461121f565b3480156102a0575f5ffd5b5061011161056a565b3480156102b4575f5ffd5b506101116105f8565b5f6102c661064d565b6102d084846106ca565b90506102db82610716565b9392505050565b6001600160a01b0381165f8181527f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006020819052604080832080546001600160a01b0319169055519092917f4a2cf608bfb427f53279ec7f0eadf48913b9346ccefc3af138dbdec14ea0907d91a25050565b604051630ad8c00b60e31b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060405163b760faf960e01b81523060048201526001600160a01b03919091169063b760faf99034906024015f604051808303818588803b1580156103d0575f5ffd5b505af11580156103e2573d5f5f3e3d5ffd5b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000060405163040b850f60e31b81526001600160a01b03848116600483015260248201849052919091169063205c2878906044015f604051808303815f87803b158015610453575f5ffd5b505af1158015610465573d5f5f3e3d5ffd5b505050505050565b61047561075b565b61047f82826107ff565b5050565b5f61048c6108c0565b505f5160206114075f395f51905f5290565b6001600160a01b038281165f8181527f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006020819052604080832080546001600160a01b031916958716958617905551909392917f8a39fc6d5142759acd84b3e96ccde9187266ecb0df56c8ff08bf2aedc7c93c4791a3505050565b565b61052361064d565b5f5f61052f8484610909565b915091506103e2815f01518260400151846040516020016105519291906112a4565b6040516020818303038152906040528360200151610a16565b6040516370a0823160e01b81523060048201525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa1580156105cf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f391906112d3565b905090565b604051631aab3f0d60e11b81523060048201525f60248201819052906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906335567e1a906044016105b4565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064015b60405180910390fd5b5f5f5f6106d78585610909565b915091505f6106e68686610ae2565b90506106f68184845f0151610b63565b610706576001935050505061070d565b5f93505050505b92915050565b50565b8015610713576040515f90339083908381818185875af1925050503d805f81146103e2576040519150601f19603f3d011682016040523d82523d5f602084013e6103e2565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806107e157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166107d55f5160206114075f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156105195760405163703e46dd60e11b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610859575060408051601f3d908101601f19168201909252610856918101906112d3565b60015b61088157604051634c9c8ce360e01b81526001600160a01b03831660048201526024016106c1565b5f5160206114075f395f51905f5281146108b157604051632a87526960e21b8152600481018290526024016106c1565b6108bb8383610bc4565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105195760405163703e46dd60e11b815260040160405180910390fd5b60408051606080820183525f8083526020830181905292820152605061093260608601866112ea565b9050101580156109755750638dd7712f60e01b61095260608601866112ea565b610960916004915f9161132d565b61096991611354565b6001600160e01b031916145b6109925760405163574b16a760e11b815260040160405180910390fd5b61099f60608501856112ea565b6109ad91600490829061132d565b8101906109ba919061138a565b604085015260208401526001600160a01b0316808352909250610a0f5780516109e38585610ae2565b60405163f252a21160e01b81526001600160a01b039283166004820152911660248201526044016106c1565b9250929050565b606081471015610a425760405163cf47918160e01b8152476004820152602481018390526044016106c1565b5f610a4e858486610c19565b9050808015610a6f57505f3d1180610a6f57505f856001600160a01b03163b115b15610a8457610a7c610c2e565b9150506102db565b8015610aae57604051639996b31560e01b81526001600160a01b03861660048201526024016106c1565b3d15610ac157610abc610c47565b610ada565b60405163d6bda27560e01b815260040160405180910390fd5b509392505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c829052603c8120610b5b81610b226101008701876112ea565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610c5292505050565b949350505050565b5f7f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006001600160a01b03858116908516148015610bbb57506001600160a01b038581165f908152602083905260409020548116908416145b95945050505050565b610bcd82610c7a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115610c11576108bb8282610cdd565b61047f610d5f565b5f5f5f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b5f5f5f5f610c608686610d7e565b925092509250610c708282610dc7565b5090949350505050565b806001600160a01b03163b5f03610caf57604051634c9c8ce360e01b81526001600160a01b03821660048201526024016106c1565b5f5160206114075f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f610cea8484610e7f565b9050808015610d0b57505f3d1180610d0b57505f846001600160a01b03163b115b15610d2057610d18610c2e565b91505061070d565b8015610d4a57604051639996b31560e01b81526001600160a01b03851660048201526024016106c1565b3d15610ac157610d58610c47565b5092915050565b34156105195760405163b398979f60e01b815260040160405180910390fd5b5f5f5f8351604103610db5576020840151604085015160608601515f1a610da788828585610e92565b955095509550505050610dc0565b505081515f91506002905b9250925092565b5f826003811115610dda57610dda6113f2565b03610de3575050565b6001826003811115610df757610df76113f2565b03610e155760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610e2957610e296113f2565b03610e4a5760405163fce698f760e01b8152600481018290526024016106c1565b6003826003811115610e5e57610e5e6113f2565b0361047f576040516335e2f38360e21b8152600481018290526024016106c1565b5f5f5f835160208501865af49392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610ecb57505f91506003905082610f50565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610f1c573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610f4757505f925060019150829050610f50565b92505f91508190505b9450945094915050565b5f6101208284031215610f6b575f5ffd5b50919050565b5f5f5f60608486031215610f83575f5ffd5b833567ffffffffffffffff811115610f99575f5ffd5b610fa586828701610f5a565b9660208601359650604090950135949350505050565b6001600160a01b0381168114610713575f5ffd5b5f60208284031215610fdf575f5ffd5b81356102db81610fbb565b5f5f60208385031215610ffb575f5ffd5b823567ffffffffffffffff811115611011575f5ffd5b8301601f81018513611021575f5ffd5b803567ffffffffffffffff811115611037575f5ffd5b8560208260051b840101111561104b575f5ffd5b6020919091019590945092505050565b5f5f6040838503121561106c575f5ffd5b823561107781610fbb565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126110a8575f5ffd5b813567ffffffffffffffff8111156110c2576110c2611085565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156110f1576110f1611085565b604052818152838201602001851015611108575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f60408385031215611135575f5ffd5b823561114081610fbb565b9150602083013567ffffffffffffffff81111561115b575f5ffd5b61116785828601611099565b9150509250929050565b5f5f60408385031215611182575f5ffd5b823561118d81610fbb565b9150602083013561119d81610fbb565b809150509250929050565b5f5f604083850312156111b9575f5ffd5b823567ffffffffffffffff8111156111cf575f5ffd5b6111db85828601610f5a565b95602094909401359450505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f5f60608587031215611232575f5ffd5b843561123d81610fbb565b935060208501359250604085013567ffffffffffffffff81111561125f575f5ffd5b8501601f8101871361126f575f5ffd5b803567ffffffffffffffff811115611285575f5ffd5b876020828401011115611296575f5ffd5b949793965060200194505050565b5f83518060208601845e60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f602082840312156112e3575f5ffd5b5051919050565b5f5f8335601e198436030181126112ff575f5ffd5b83018035915067ffffffffffffffff821115611319575f5ffd5b602001915036819003821315610a0f575f5ffd5b5f5f8585111561133b575f5ffd5b83861115611347575f5ffd5b5050820193919092039150565b80356001600160e01b03198116906004841015610d58576001600160e01b031960049490940360031b84901b1690921692915050565b5f5f5f5f6080858703121561139d575f5ffd5b84356113a881610fbb565b935060208501356113b881610fbb565b925060408501359150606085013567ffffffffffffffff8111156113da575f5ffd5b6113e687828801611099565b91505092959194509250565b634e487b7160e01b5f52602160045260245ffdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca264697066735822122013a4df1d72e5a64f451b71018c2fa481b59ab84ef8a2fe93f22ebcc4986f4f0364736f6c634300081e0033";
11
+ readonly abi: [{"inputs":[{"internalType":"contract IEntryPoint","name":"anEntryPoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bytes","name":"error","type":"bytes"}],"name":"ExecuteError","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidCall","type":"error"},{"inputs":[{"internalType":"contract ERC2771Context","name":"target","type":"address"},{"internalType":"address","name":"signer","type":"address"}],"name":"InvalidTarget","type":"error"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"MethodNotSupported","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"RequiredEntryPointOrExecutor","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":true,"internalType":"contract ERC2771Context","name":"target","type":"address"}],"name":"ExecutorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"executor","type":"address"}],"name":"ExecutorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"executor","type":"address"},{"internalType":"contract ERC2771Context","name":"target","type":"address"}],"name":"addExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"func","type":"bytes"}],"name":"erc2771Forward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct BaseAccount.Call[]","name":"","type":"tuple[]"}],"name":"executeBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"bytes32","name":"accountGasLimits","type":"bytes32"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"bytes32","name":"gasFees","type":"bytes32"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct PackedUserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"}],"name":"executeUserOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"executor","type":"address"}],"name":"removeExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"bytes32","name":"accountGasLimits","type":"bytes32"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"bytes32","name":"gasFees","type":"bytes32"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct PackedUserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"missingAccountFunds","type":"uint256"}],"name":"validateUserOp","outputs":[{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawDepositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}];
12
+ readonly bytecode: "0x60c060405230608052348015610013575f5ffd5b5060405161166d38038061166d83398101604081905261003291610043565b6001600160a01b031660a052610070565b5f60208284031215610053575f5ffd5b81516001600160a01b0381168114610069575f5ffd5b9392505050565b60805160a0516115ab6100c25f395f818161027b0152818161039901528181610415015281816105ea0152818161067f01526106b901525f81816107c8015281816107f1015261092d01526115ab5ff3fe6080604052600436106100f2575f3560e01c80638129fc1c11610087578063b0d691fe11610057578063b0d691fe14610262578063b61d27f6146102a5578063c399ec88146102bf578063d087d288146102d3575f5ffd5b80638129fc1c146101dc57806381a30acd146101e75780638dd7712f14610206578063ad3cb1cc14610225575f5ffd5b80634d44560d116100c25780634d44560d146101775780634f1ef2861461019657806352d1902d146101a95780636267e759146101bd575f5ffd5b806319822f7c146100fd578063247884291461012f57806334fcd5be146101505780634a58db191461016f575f5ffd5b366100f957005b5f5ffd5b348015610108575f5ffd5b5061011c610117366004611014565b6102e7565b6040519081526020015b60405180910390f35b34801561013a575f5ffd5b5061014e610149366004611072565b61030c565b005b34801561015b575f5ffd5b5061014e61016a36600461108d565b61037e565b61014e610397565b348015610182575f5ffd5b5061014e6101913660046110fe565b610413565b61014e6101a43660046111c7565b610497565b3480156101b4575f5ffd5b5061011c6104ad565b3480156101c8575f5ffd5b5061014e6101d7366004611214565b6104c8565b34801561014e575f5ffd5b3480156101f2575f5ffd5b5061014e610201366004611290565b610545565b348015610211575f5ffd5b5061014e6102203660046112fe565b61057b565b348015610230575f5ffd5b50610255604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101269190611340565b34801561026d575f5ffd5b506040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152602001610126565b3480156102b0575f5ffd5b5061014e61016a366004611375565b3480156102ca575f5ffd5b5061011c6105cb565b3480156102de575f5ffd5b5061011c610659565b5f6102f06106ae565b6102fa848461072b565b905061030582610778565b9392505050565b6001600160a01b0381165f8181527f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006020819052604080832080546001600160a01b0319169055519092917f4a2cf608bfb427f53279ec7f0eadf48913b9346ccefc3af138dbdec14ea0907d91a25050565b60405163574b16a760e11b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060405163b760faf960e01b81523060048201526001600160a01b03919091169063b760faf99034906024015f604051808303818588803b1580156103fa575f5ffd5b505af115801561040c573d5f5f3e3d5ffd5b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000060405163040b850f60e31b81526001600160a01b03848116600483015260248201849052919091169063205c2878906044015f604051808303815f87803b15801561047d575f5ffd5b505af115801561048f573d5f5f3e3d5ffd5b505050505050565b61049f6107bd565b6104a98282610861565b5050565b5f6104b6610922565b505f5160206115565f395f51905f5290565b6001600160a01b038281165f8181527f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006020819052604080832080546001600160a01b031916958716958617905551909392917f8a39fc6d5142759acd84b3e96ccde9187266ecb0df56c8ff08bf2aedc7c93c4791a3505050565b565b61054d6106ae565b61048f84838388604051602001610566939291906113cd565b6040516020818303038152906040528561096b565b6105836106ae565b5f5f61058f8484610a37565b509150915061040c815f01518260400151846040516020016105b29291906113f3565b604051602081830303815290604052836020015161096b565b6040516370a0823160e01b81523060048201525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015610630573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106549190611422565b905090565b604051631aab3f0d60e11b81523060048201525f60248201819052906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610615565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105435760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064015b60405180910390fd5b5f5f5f6107388585610a37565b50915091505f6107488686610b88565b90506107588184845f0151610c09565b610768576001935050505061076f565b5f93505050505b92915050565b50565b8015610775576040515f90339083908381818185875af1925050503d805f811461040c576040519150601f19603f3d011682016040523d82523d5f602084013e61040c565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061084357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166108375f5160206115565f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156105435760405163703e46dd60e11b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156108bb575060408051601f3d908101601f191682019092526108b891810190611422565b60015b6108e357604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610722565b5f5160206115565f395f51905f52811461091357604051632a87526960e21b815260048101829052602401610722565b61091d8383610c6a565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105435760405163703e46dd60e11b815260040160405180910390fd5b6060814710156109975760405163cf47918160e01b815247600482015260248101839052604401610722565b5f6109a3858486610cbf565b90508080156109c457505f3d11806109c457505f856001600160a01b03163b115b156109d9576109d1610cd4565b915050610305565b8015610a0357604051639996b31560e01b81526001600160a01b0386166004820152602401610722565b3d15610a1657610a11610ced565b610a2f565b60405163d6bda27560e01b815260040160405180910390fd5b509392505050565b60408051606080820183525f80835260208301819052928201525f6084610a616060870187611439565b90501015610a825760405163574b16a760e11b815260040160405180910390fd5b610a8f6060860186611439565b610a9d916004915f9161147c565b610aa6916114a3565b90506001600160e01b03198116638dd7712f60e01b14801590610ada57506001600160e01b031981166381a30acd60e01b14155b15610b045760405163c610096760e01b81526001600160e01b031982166004820152602401610722565b610b116060860186611439565b610b1f91600490829061147c565b810190610b2c91906114d9565b604086015260208501526001600160a01b0316808452909350610b81578151610b558686610b88565b60405163f252a21160e01b81526001600160a01b03928316600482015291166024820152604401610722565b9250925092565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c829052603c8120610c0181610bc8610100870187611439565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610cf892505050565b949350505050565b5f7f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006001600160a01b03858116908516148015610c6157506001600160a01b038581165f908152602083905260409020548116908416145b95945050505050565b610c7382610d20565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115610cb75761091d8282610d83565b6104a9610e05565b5f5f5f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b5f5f5f5f610d068686610e24565b925092509250610d168282610e6a565b5090949350505050565b806001600160a01b03163b5f03610d5557604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610722565b5f5160206115565f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f610d908484610f22565b9050808015610db157505f3d1180610db157505f846001600160a01b03163b115b15610dc657610dbe610cd4565b91505061076f565b8015610df057604051639996b31560e01b81526001600160a01b0385166004820152602401610722565b3d15610a1657610dfe610ced565b5092915050565b34156105435760405163b398979f60e01b815260040160405180910390fd5b5f5f5f8351604103610e5b576020840151604085015160608601515f1a610e4d88828585610f35565b955095509550505050610b81565b505081515f9150600290610b81565b5f826003811115610e7d57610e7d611541565b03610e86575050565b6001826003811115610e9a57610e9a611541565b03610eb85760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610ecc57610ecc611541565b03610eed5760405163fce698f760e01b815260048101829052602401610722565b6003826003811115610f0157610f01611541565b036104a9576040516335e2f38360e21b815260048101829052602401610722565b5f5f5f835160208501865af49392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610f6e57505f91506003905082610ff3565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610fbf573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610fea57505f925060019150829050610ff3565b92505f91508190505b9450945094915050565b5f610120828403121561100e575f5ffd5b50919050565b5f5f5f60608486031215611026575f5ffd5b833567ffffffffffffffff81111561103c575f5ffd5b61104886828701610ffd565b9660208601359650604090950135949350505050565b6001600160a01b0381168114610775575f5ffd5b5f60208284031215611082575f5ffd5b81356103058161105e565b5f5f6020838503121561109e575f5ffd5b823567ffffffffffffffff8111156110b4575f5ffd5b8301601f810185136110c4575f5ffd5b803567ffffffffffffffff8111156110da575f5ffd5b8560208260051b84010111156110ee575f5ffd5b6020919091019590945092505050565b5f5f6040838503121561110f575f5ffd5b823561111a8161105e565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261114b575f5ffd5b813567ffffffffffffffff81111561116557611165611128565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561119457611194611128565b6040528181528382016020018510156111ab575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f604083850312156111d8575f5ffd5b82356111e38161105e565b9150602083013567ffffffffffffffff8111156111fe575f5ffd5b61120a8582860161113c565b9150509250929050565b5f5f60408385031215611225575f5ffd5b82356112308161105e565b915060208301356112408161105e565b809150509250929050565b5f5f83601f84011261125b575f5ffd5b50813567ffffffffffffffff811115611272575f5ffd5b602083019150836020828501011115611289575f5ffd5b9250929050565b5f5f5f5f5f608086880312156112a4575f5ffd5b85356112af8161105e565b945060208601356112bf8161105e565b935060408601359250606086013567ffffffffffffffff8111156112e1575f5ffd5b6112ed8882890161124b565b969995985093965092949392505050565b5f5f6040838503121561130f575f5ffd5b823567ffffffffffffffff811115611325575f5ffd5b61133185828601610ffd565b95602094909401359450505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f5f60608587031215611388575f5ffd5b84356113938161105e565b935060208501359250604085013567ffffffffffffffff8111156113b5575f5ffd5b6113c18782880161124b565b95989497509550505050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b5f83518060208601845e60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f60208284031215611432575f5ffd5b5051919050565b5f5f8335601e1984360301811261144e575f5ffd5b83018035915067ffffffffffffffff821115611468575f5ffd5b602001915036819003821315611289575f5ffd5b5f5f8585111561148a575f5ffd5b83861115611496575f5ffd5b5050820193919092039150565b80356001600160e01b03198116906004841015610dfe576001600160e01b031960049490940360031b84901b1690921692915050565b5f5f5f5f608085870312156114ec575f5ffd5b84356114f78161105e565b935060208501356115078161105e565b925060408501359150606085013567ffffffffffffffff811115611529575f5ffd5b6115358782880161113c565b91505092959194509250565b634e487b7160e01b5f52602160045260245ffdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220925fe411a74f721c53058a316afb80f3ef094898def53447db92437f185df9ba64736f6c634300081e0033";
13
+ readonly deployedBytecode: "0x6080604052600436106100f2575f3560e01c80638129fc1c11610087578063b0d691fe11610057578063b0d691fe14610262578063b61d27f6146102a5578063c399ec88146102bf578063d087d288146102d3575f5ffd5b80638129fc1c146101dc57806381a30acd146101e75780638dd7712f14610206578063ad3cb1cc14610225575f5ffd5b80634d44560d116100c25780634d44560d146101775780634f1ef2861461019657806352d1902d146101a95780636267e759146101bd575f5ffd5b806319822f7c146100fd578063247884291461012f57806334fcd5be146101505780634a58db191461016f575f5ffd5b366100f957005b5f5ffd5b348015610108575f5ffd5b5061011c610117366004611014565b6102e7565b6040519081526020015b60405180910390f35b34801561013a575f5ffd5b5061014e610149366004611072565b61030c565b005b34801561015b575f5ffd5b5061014e61016a36600461108d565b61037e565b61014e610397565b348015610182575f5ffd5b5061014e6101913660046110fe565b610413565b61014e6101a43660046111c7565b610497565b3480156101b4575f5ffd5b5061011c6104ad565b3480156101c8575f5ffd5b5061014e6101d7366004611214565b6104c8565b34801561014e575f5ffd5b3480156101f2575f5ffd5b5061014e610201366004611290565b610545565b348015610211575f5ffd5b5061014e6102203660046112fe565b61057b565b348015610230575f5ffd5b50610255604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101269190611340565b34801561026d575f5ffd5b506040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152602001610126565b3480156102b0575f5ffd5b5061014e61016a366004611375565b3480156102ca575f5ffd5b5061011c6105cb565b3480156102de575f5ffd5b5061011c610659565b5f6102f06106ae565b6102fa848461072b565b905061030582610778565b9392505050565b6001600160a01b0381165f8181527f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006020819052604080832080546001600160a01b0319169055519092917f4a2cf608bfb427f53279ec7f0eadf48913b9346ccefc3af138dbdec14ea0907d91a25050565b60405163574b16a760e11b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060405163b760faf960e01b81523060048201526001600160a01b03919091169063b760faf99034906024015f604051808303818588803b1580156103fa575f5ffd5b505af115801561040c573d5f5f3e3d5ffd5b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000060405163040b850f60e31b81526001600160a01b03848116600483015260248201849052919091169063205c2878906044015f604051808303815f87803b15801561047d575f5ffd5b505af115801561048f573d5f5f3e3d5ffd5b505050505050565b61049f6107bd565b6104a98282610861565b5050565b5f6104b6610922565b505f5160206115565f395f51905f5290565b6001600160a01b038281165f8181527f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006020819052604080832080546001600160a01b031916958716958617905551909392917f8a39fc6d5142759acd84b3e96ccde9187266ecb0df56c8ff08bf2aedc7c93c4791a3505050565b565b61054d6106ae565b61048f84838388604051602001610566939291906113cd565b6040516020818303038152906040528561096b565b6105836106ae565b5f5f61058f8484610a37565b509150915061040c815f01518260400151846040516020016105b29291906113f3565b604051602081830303815290604052836020015161096b565b6040516370a0823160e01b81523060048201525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015610630573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106549190611422565b905090565b604051631aab3f0d60e11b81523060048201525f60248201819052906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610615565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105435760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064015b60405180910390fd5b5f5f5f6107388585610a37565b50915091505f6107488686610b88565b90506107588184845f0151610c09565b610768576001935050505061076f565b5f93505050505b92915050565b50565b8015610775576040515f90339083908381818185875af1925050503d805f811461040c576040519150601f19603f3d011682016040523d82523d5f602084013e61040c565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061084357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166108375f5160206115565f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156105435760405163703e46dd60e11b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156108bb575060408051601f3d908101601f191682019092526108b891810190611422565b60015b6108e357604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610722565b5f5160206115565f395f51905f52811461091357604051632a87526960e21b815260048101829052602401610722565b61091d8383610c6a565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105435760405163703e46dd60e11b815260040160405180910390fd5b6060814710156109975760405163cf47918160e01b815247600482015260248101839052604401610722565b5f6109a3858486610cbf565b90508080156109c457505f3d11806109c457505f856001600160a01b03163b115b156109d9576109d1610cd4565b915050610305565b8015610a0357604051639996b31560e01b81526001600160a01b0386166004820152602401610722565b3d15610a1657610a11610ced565b610a2f565b60405163d6bda27560e01b815260040160405180910390fd5b509392505050565b60408051606080820183525f80835260208301819052928201525f6084610a616060870187611439565b90501015610a825760405163574b16a760e11b815260040160405180910390fd5b610a8f6060860186611439565b610a9d916004915f9161147c565b610aa6916114a3565b90506001600160e01b03198116638dd7712f60e01b14801590610ada57506001600160e01b031981166381a30acd60e01b14155b15610b045760405163c610096760e01b81526001600160e01b031982166004820152602401610722565b610b116060860186611439565b610b1f91600490829061147c565b810190610b2c91906114d9565b604086015260208501526001600160a01b0316808452909350610b81578151610b558686610b88565b60405163f252a21160e01b81526001600160a01b03928316600482015291166024820152604401610722565b9250925092565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c829052603c8120610c0181610bc8610100870187611439565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610cf892505050565b949350505050565b5f7f32800a8a254400b8b55434a22b827759dcb96a572133b419f26b7155e38430006001600160a01b03858116908516148015610c6157506001600160a01b038581165f908152602083905260409020548116908416145b95945050505050565b610c7382610d20565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115610cb75761091d8282610d83565b6104a9610e05565b5f5f5f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b5f5f5f5f610d068686610e24565b925092509250610d168282610e6a565b5090949350505050565b806001600160a01b03163b5f03610d5557604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610722565b5f5160206115565f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f610d908484610f22565b9050808015610db157505f3d1180610db157505f846001600160a01b03163b115b15610dc657610dbe610cd4565b91505061076f565b8015610df057604051639996b31560e01b81526001600160a01b0385166004820152602401610722565b3d15610a1657610dfe610ced565b5092915050565b34156105435760405163b398979f60e01b815260040160405180910390fd5b5f5f5f8351604103610e5b576020840151604085015160608601515f1a610e4d88828585610f35565b955095509550505050610b81565b505081515f9150600290610b81565b5f826003811115610e7d57610e7d611541565b03610e86575050565b6001826003811115610e9a57610e9a611541565b03610eb85760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610ecc57610ecc611541565b03610eed5760405163fce698f760e01b815260048101829052602401610722565b6003826003811115610f0157610f01611541565b036104a9576040516335e2f38360e21b815260048101829052602401610722565b5f5f5f835160208501865af49392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610f6e57505f91506003905082610ff3565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610fbf573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610fea57505f925060019150829050610ff3565b92505f91508190505b9450945094915050565b5f610120828403121561100e575f5ffd5b50919050565b5f5f5f60608486031215611026575f5ffd5b833567ffffffffffffffff81111561103c575f5ffd5b61104886828701610ffd565b9660208601359650604090950135949350505050565b6001600160a01b0381168114610775575f5ffd5b5f60208284031215611082575f5ffd5b81356103058161105e565b5f5f6020838503121561109e575f5ffd5b823567ffffffffffffffff8111156110b4575f5ffd5b8301601f810185136110c4575f5ffd5b803567ffffffffffffffff8111156110da575f5ffd5b8560208260051b84010111156110ee575f5ffd5b6020919091019590945092505050565b5f5f6040838503121561110f575f5ffd5b823561111a8161105e565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261114b575f5ffd5b813567ffffffffffffffff81111561116557611165611128565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561119457611194611128565b6040528181528382016020018510156111ab575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f604083850312156111d8575f5ffd5b82356111e38161105e565b9150602083013567ffffffffffffffff8111156111fe575f5ffd5b61120a8582860161113c565b9150509250929050565b5f5f60408385031215611225575f5ffd5b82356112308161105e565b915060208301356112408161105e565b809150509250929050565b5f5f83601f84011261125b575f5ffd5b50813567ffffffffffffffff811115611272575f5ffd5b602083019150836020828501011115611289575f5ffd5b9250929050565b5f5f5f5f5f608086880312156112a4575f5ffd5b85356112af8161105e565b945060208601356112bf8161105e565b935060408601359250606086013567ffffffffffffffff8111156112e1575f5ffd5b6112ed8882890161124b565b969995985093965092949392505050565b5f5f6040838503121561130f575f5ffd5b823567ffffffffffffffff811115611325575f5ffd5b61133185828601610ffd565b95602094909401359450505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f5f5f60608587031215611388575f5ffd5b84356113938161105e565b935060208501359250604085013567ffffffffffffffff8111156113b5575f5ffd5b6113c18782880161124b565b95989497509550505050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b5f83518060208601845e60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f60208284031215611432575f5ffd5b5051919050565b5f5f8335601e1984360301811261144e575f5ffd5b83018035915067ffffffffffffffff821115611468575f5ffd5b602001915036819003821315611289575f5ffd5b5f5f8585111561148a575f5ffd5b83861115611496575f5ffd5b5050820193919092039150565b80356001600160e01b03198116906004841015610dfe576001600160e01b031960049490940360031b84901b1690921692915050565b5f5f5f5f608085870312156114ec575f5ffd5b84356114f78161105e565b935060208501356115078161105e565b925060408501359150606085013567ffffffffffffffff811115611529575f5ffd5b6115358782880161113c565b91505092959194509250565b634e487b7160e01b5f52602160045260245ffdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220925fe411a74f721c53058a316afb80f3ef094898def53447db92437f185df9ba64736f6c634300081e0033";
14
14
  readonly linkReferences: {};
15
15
  readonly deployedLinkReferences: {};
16
- readonly immutableReferences: {"2756":[{"length":32,"start":1894},{"length":32,"start":1935},{"length":32,"start":2251}],"12314":[{"length":32,"start":593},{"length":32,"start":879},{"length":32,"start":1003},{"length":32,"start":1417},{"length":32,"start":1566},{"length":32,"start":1624}]};
16
+ readonly immutableReferences: {"2756":[{"length":32,"start":1992},{"length":32,"start":2033},{"length":32,"start":2349}],"12317":[{"length":32,"start":635},{"length":32,"start":921},{"length":32,"start":1045},{"length":32,"start":1514},{"length":32,"start":1663},{"length":32,"start":1721}]};
17
17
  readonly inputSourceName: "project/contracts/ERC2771ForwarderAccount.sol";
18
- readonly buildInfoId: "solc-0_8_30-3f701667cdad33af53ac1f684f455bb9e01a58ac";
18
+ readonly buildInfoId: "solc-0_8_30-f987e738f2ecce00e06bc1b8c078480f3d3eb966";
19
19
  };
20
20
 
21
21
  import "hardhat/types/artifacts";
@@ -1174,5 +1174,5 @@
1174
1174
  "deployedLinkReferences": {},
1175
1175
  "immutableReferences": {},
1176
1176
  "inputSourceName": "project/contracts/dependencies/AccessManager.sol",
1177
- "buildInfoId": "solc-0_8_30-3f701667cdad33af53ac1f684f455bb9e01a58ac"
1177
+ "buildInfoId": "solc-0_8_30-f987e738f2ecce00e06bc1b8c078480f3d3eb966"
1178
1178
  }
@@ -15,7 +15,7 @@ export interface AccessManager$Type {
15
15
  readonly deployedLinkReferences: {};
16
16
  readonly immutableReferences: {};
17
17
  readonly inputSourceName: "project/contracts/dependencies/AccessManager.sol";
18
- readonly buildInfoId: "solc-0_8_30-3f701667cdad33af53ac1f684f455bb9e01a58ac";
18
+ readonly buildInfoId: "solc-0_8_30-f987e738f2ecce00e06bc1b8c078480f3d3eb966";
19
19
  };
20
20
 
21
21
  import "hardhat/types/artifacts";
@@ -9,5 +9,5 @@
9
9
  "deployedLinkReferences": {},
10
10
  "immutableReferences": {},
11
11
  "inputSourceName": "project/contracts/dependencies/FrozenTime.sol",
12
- "buildInfoId": "solc-0_8_30-3f701667cdad33af53ac1f684f455bb9e01a58ac"
12
+ "buildInfoId": "solc-0_8_30-f987e738f2ecce00e06bc1b8c078480f3d3eb966"
13
13
  }
@@ -15,7 +15,7 @@ export interface FrozenTime$Type {
15
15
  readonly deployedLinkReferences: {};
16
16
  readonly immutableReferences: {};
17
17
  readonly inputSourceName: "project/contracts/dependencies/FrozenTime.sol";
18
- readonly buildInfoId: "solc-0_8_30-3f701667cdad33af53ac1f684f455bb9e01a58ac";
18
+ readonly buildInfoId: "solc-0_8_30-f987e738f2ecce00e06bc1b8c078480f3d3eb966";
19
19
  };
20
20
 
21
21
  import "hardhat/types/artifacts";
@@ -394,7 +394,7 @@
394
394
  "start": 1096
395
395
  }
396
396
  ],
397
- "14972": [
397
+ "15022": [
398
398
  {
399
399
  "length": 32,
400
400
  "start": 279
@@ -402,5 +402,5 @@
402
402
  ]
403
403
  },
404
404
  "inputSourceName": "project/contracts/mock/ERC20With2771.sol",
405
- "buildInfoId": "solc-0_8_30-3f701667cdad33af53ac1f684f455bb9e01a58ac"
405
+ "buildInfoId": "solc-0_8_30-f987e738f2ecce00e06bc1b8c078480f3d3eb966"
406
406
  }
@@ -13,9 +13,9 @@ export interface ERC20With2771$Type {
13
13
  readonly deployedBytecode: "0x608060405234801561000f575f5ffd5b50600436106100a6575f3560e01c8063572b6c051161006e578063572b6c051461014157806370a08231146101815780637da0a877146101a957806395d89b41146101e0578063a9059cbb146101e8578063dd62ed3e146101fb575f5ffd5b806306fdde03146100aa578063095ea7b3146100c857806318160ddd146100eb57806323b872dd146100fd578063313ce56714610110575b5f5ffd5b6100b2610233565b6040516100bf9190610699565b60405180910390f35b6100db6100d63660046106e9565b6102c3565b60405190151581526020016100bf565b6002545b6040519081526020016100bf565b6100db61010b366004610711565b6102e6565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016100bf565b6100db61014f36600461074b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b6100ef61018f36600461074b565b6001600160a01b03165f9081526020819052604090205490565b6040516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681526020016100bf565b6100b2610313565b6100db6101f63660046106e9565b610322565b6100ef61020936600461076b565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6060600380546102429061079c565b80601f016020809104026020016040519081016040528092919081815260200182805461026e9061079c565b80156102b95780601f10610290576101008083540402835291602001916102b9565b820191905f5260205f20905b81548152906001019060200180831161029c57829003601f168201915b5050505050905090565b5f5f6102cd610339565b90506102da818585610347565b60019150505b92915050565b5f5f6102f0610339565b90506102fd858285610359565b6103088585856103da565b506001949350505050565b6060600480546102429061079c565b5f5f61032c610339565b90506102da8185856103da565b5f610342610437565b905090565b61035483838360016104a1565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198110156103d457818110156103c657604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064015b60405180910390fd5b6103d484848484035f6104a1565b50505050565b6001600160a01b03831661040357604051634b637e8f60e11b81525f60048201526024016103bd565b6001600160a01b03821661042c5760405163ec442f0560e01b81525f60048201526024016103bd565b610354838383610573565b5f36601480821080159061047357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633145b156104995761048636828403815f6107d4565b61048f916107fb565b60601c9250505090565b339250505090565b6001600160a01b0384166104ca5760405163e602df0560e01b81525f60048201526024016103bd565b6001600160a01b0383166104f357604051634a1406b160e11b81525f60048201526024016103bd565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156103d457826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161056591815260200190565b60405180910390a350505050565b6001600160a01b03831661059d578060025f8282546105929190610848565b9091555061060d9050565b6001600160a01b0383165f90815260208190526040902054818110156105ef5760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016103bd565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661062957600280548290039055610647565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161068c91815260200190565b60405180910390a3505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146106e4575f5ffd5b919050565b5f5f604083850312156106fa575f5ffd5b610703836106ce565b946020939093013593505050565b5f5f5f60608486031215610723575f5ffd5b61072c846106ce565b925061073a602085016106ce565b929592945050506040919091013590565b5f6020828403121561075b575f5ffd5b610764826106ce565b9392505050565b5f5f6040838503121561077c575f5ffd5b610785836106ce565b9150610793602084016106ce565b90509250929050565b600181811c908216806107b057607f821691505b6020821081036107ce57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f5f858511156107e2575f5ffd5b838611156107ee575f5ffd5b5050820193919092039150565b80356bffffffffffffffffffffffff198116906014841015610841576bffffffffffffffffffffffff196bffffffffffffffffffffffff198560140360031b1b82161691505b5092915050565b808201808211156102e057634e487b7160e01b5f52601160045260245ffdfea26469706673582212209052ca3b7d16208877574fb8688288b972afaa142be43385402a72663c099d9564736f6c634300081e0033";
14
14
  readonly linkReferences: {};
15
15
  readonly deployedLinkReferences: {};
16
- readonly immutableReferences: {"2301":[{"length":32,"start":337},{"length":32,"start":438},{"length":32,"start":1096}],"14972":[{"length":32,"start":279}]};
16
+ readonly immutableReferences: {"2301":[{"length":32,"start":337},{"length":32,"start":438},{"length":32,"start":1096}],"15022":[{"length":32,"start":279}]};
17
17
  readonly inputSourceName: "project/contracts/mock/ERC20With2771.sol";
18
- readonly buildInfoId: "solc-0_8_30-3f701667cdad33af53ac1f684f455bb9e01a58ac";
18
+ readonly buildInfoId: "solc-0_8_30-f987e738f2ecce00e06bc1b8c078480f3d3eb966";
19
19
  };
20
20
 
21
21
  import "hardhat/types/artifacts";
@@ -26,6 +26,8 @@ import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/U
26
26
  * @author Ensuro
27
27
  */
28
28
  contract ERC2771ForwarderAccount is UUPSUpgradeable, BaseAccount, IAccountExecute {
29
+ // 132 = 4 (method bytes4) + 32 (expectedSigner) + 32 (target) + 32 (value) + 32 (calldata offset)
30
+ uint256 private constant MIN_USER_OP_CALLDATA = 132;
29
31
  IEntryPoint private immutable _entryPoint;
30
32
 
31
33
  /// @custom:storage-location erc7201:ensuro.storage.ERC2771ForwarderAccount
@@ -50,8 +52,8 @@ contract ERC2771ForwarderAccount is UUPSUpgradeable, BaseAccount, IAccountExecut
50
52
 
51
53
  error RequiredEntryPointOrExecutor(address sender);
52
54
  error InvalidTarget(ERC2771Context target, address signer);
53
- error OnlyExecuteUserOpAllowed();
54
55
  error InvalidCall();
56
+ error MethodNotSupported(bytes4 selector);
55
57
 
56
58
  constructor(IEntryPoint anEntryPoint) {
57
59
  _entryPoint = anEntryPoint;
@@ -70,11 +72,11 @@ contract ERC2771ForwarderAccount is UUPSUpgradeable, BaseAccount, IAccountExecut
70
72
  receive() external payable {}
71
73
 
72
74
  function executeBatch(Call[] calldata) external virtual override {
73
- revert OnlyExecuteUserOpAllowed();
75
+ revert InvalidCall();
74
76
  }
75
77
 
76
78
  function execute(address, uint256, bytes calldata) external virtual override {
77
- revert OnlyExecuteUserOpAllowed();
79
+ revert InvalidCall();
78
80
  }
79
81
 
80
82
  function _getSigner(PackedUserOperation calldata userop, bytes32 userOpHash) internal pure returns (address) {
@@ -86,18 +88,22 @@ contract ERC2771ForwarderAccount is UUPSUpgradeable, BaseAccount, IAccountExecut
86
88
  * @dev Validates that the user operation is well formed and that the destination is correct. Does not validate signature.
87
89
  * @return expectedSigner The address included in the call data, expected to be the signer of the userOp
88
90
  * @return call A Call struct containing the call to be made
91
+ * @return selector The selector used (execute or executeUserOp)
89
92
  */
90
93
  function _validateAndDecodeCall(
91
94
  PackedUserOperation calldata userOp,
92
95
  bytes32 userOpHash
93
- ) internal pure returns (address expectedSigner, Call memory call) {
94
- require(userOp.callData.length >= 80 && bytes4(userOp.callData[0:4]) == this.executeUserOp.selector, InvalidCall());
96
+ ) internal pure returns (address expectedSigner, Call memory call, bytes4 selector) {
97
+ require(userOp.callData.length >= MIN_USER_OP_CALLDATA, InvalidCall());
98
+ selector = bytes4(userOp.callData[0:4]);
99
+ if (selector != this.executeUserOp.selector && selector != this.erc2771Forward.selector) {
100
+ revert MethodNotSupported(selector);
101
+ }
95
102
  (expectedSigner, call.target, call.value, call.data) = abi.decode(
96
103
  userOp.callData[4:],
97
104
  (address, address, uint256, bytes)
98
105
  );
99
106
  if (call.target == address(0)) {
100
- // This is an if and not a require to avoid evaluating the _getSigner call in the happy path
101
107
  revert InvalidTarget(ERC2771Context(call.target), _getSigner(userOp, userOpHash));
102
108
  }
103
109
  }
@@ -133,7 +139,7 @@ contract ERC2771ForwarderAccount is UUPSUpgradeable, BaseAccount, IAccountExecut
133
139
  PackedUserOperation calldata userOp,
134
140
  bytes32 userOpHash
135
141
  ) internal virtual override returns (uint256 validationData) {
136
- (address expectedSigner, Call memory call) = _validateAndDecodeCall(userOp, userOpHash);
142
+ (address expectedSigner, Call memory call, ) = _validateAndDecodeCall(userOp, userOpHash);
137
143
  address signer = _getSigner(userOp, userOpHash);
138
144
  if (!_isAuthorized(signer, expectedSigner, call.target)) {
139
145
  return SIG_VALIDATION_FAILED;
@@ -155,12 +161,27 @@ contract ERC2771ForwarderAccount is UUPSUpgradeable, BaseAccount, IAccountExecut
155
161
  function executeUserOp(PackedUserOperation calldata userOp, bytes32 userOpHash) external override {
156
162
  _requireFromEntryPoint();
157
163
 
158
- // We can trust that expectedSigner is the userop signer because it was checked in validateSignature
159
- (address expectedSigner, Call memory call) = _validateAndDecodeCall(userOp, userOpHash);
164
+ (address expectedSigner, Call memory call, ) = _validateAndDecodeCall(userOp, userOpHash);
160
165
 
161
166
  Address.functionCallWithValue(call.target, abi.encodePacked(call.data, expectedSigner), call.value);
162
167
  }
163
168
 
169
+ /**
170
+ * @notice Forwards a call to the target contract with `caller` as the msgSender.
171
+ * @dev Since this method is called from the entryPoint, the method _validateSignature was passed before,
172
+ * validating the signer of the userOp is equal to `caller` and `caller` is authorized to call `target`.
173
+ *
174
+ * @param caller The real caller of the operation that will be appended to the call, and decoded by the target
175
+ * contract as _msgSender()
176
+ * @param target The target contract to be called
177
+ * @param value The amount of ETH to send with the call
178
+ * @param func The calldata for the target function
179
+ */
180
+ function erc2771Forward(address caller, address target, uint256 value, bytes calldata func) external virtual {
181
+ _requireFromEntryPoint();
182
+ Address.functionCallWithValue(target, abi.encodePacked(func, caller), value);
183
+ }
184
+
164
185
  /**
165
186
  * check current account deposit in the entryPoint
166
187
  */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ensuro/account-abstraction",
3
3
  "description": "ERC-4337 related contracts by the Ensuro Team",
4
- "version": "0.3.0",
4
+ "version": "0.3.1",
5
5
  "files": [
6
6
  "**/*.sol",
7
7
  "/build",