From 11e77293b808f2e007ca6e6a2202c9494e78f52e Mon Sep 17 00:00:00 2001 From: leekt Date: Fri, 19 Jan 2024 21:25:44 +0900 Subject: [PATCH 01/36] restructured to seprate plugins folder --- plugins/src/p256/P256Validator.sol | 83 +++++ .../stealthAddressValidator/EllipticCurve.sol | 328 ++++++++++++++++++ .../StealthAddressValidator.sol | 182 ++++++++++ .../StealthAggreagteSignature.sol | 47 +++ plugins/test/P256Validator.t.sol | 207 +++++++++++ plugins/test/StealthAddressValidator.t.sol | 311 +++++++++++++++++ 6 files changed, 1158 insertions(+) create mode 100644 plugins/src/p256/P256Validator.sol create mode 100644 plugins/src/stealthAddressValidator/EllipticCurve.sol create mode 100644 plugins/src/stealthAddressValidator/StealthAddressValidator.sol create mode 100644 plugins/src/stealthAddressValidator/StealthAggreagteSignature.sol create mode 100644 plugins/test/P256Validator.t.sol create mode 100644 plugins/test/StealthAddressValidator.t.sol diff --git a/plugins/src/p256/P256Validator.sol b/plugins/src/p256/P256Validator.sol new file mode 100644 index 00000000..6fcc88c4 --- /dev/null +++ b/plugins/src/p256/P256Validator.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import {UserOperation} from "I4337/interfaces/UserOperation.sol"; +import {ECDSA} from "solady/utils/ECDSA.sol"; +import {IKernelValidator} from "src/interfaces/IKernelValidator.sol"; +import {ValidationData} from "src/common/Types.sol"; +import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; +import {P256} from "p256-verifier/P256.sol"; + +/// @title P256Validator +/// @notice This validator uses the P256 curve to validate signatures. +contract P256Validator is IKernelValidator { + /// @notice Emitted when a bad key is provided. + error BadKey(); + + /// @notice Emitted when the public key of a kernel is changed. + event P256PublicKeysChanged(address indexed kernel, PublicKey newKeys); + + /// @notice The P256 public key of a kernel. + struct PublicKey { + uint256 x; + uint256 y; + } + + /// @notice The P256 public keys of a kernel. + mapping(address kernel => PublicKey PublicKey) public p256PublicKey; + + /// @notice Enable this validator for a kernel account. + /// @dev The kernel account need to be the `msg.sender`. + /// @dev The public key is encoded as `abi.encode(PublicKey)` inside the data, so (uint256,uint256). + function enable(bytes calldata _data) external payable override { + PublicKey memory key = abi.decode(_data, (PublicKey)); + if (key.x == 0 || key.y == 0) { + revert BadKey(); + } + // Update the key (so a sstore) + p256PublicKey[msg.sender] = key; + // And emit the event + emit P256PublicKeysChanged(msg.sender, key); + } + + /// @notice Disable this validator for a kernel account. + /// @dev The kernel account need to be the `msg.sender`. + function disable(bytes calldata) external payable override { + delete p256PublicKey[msg.sender]; + } + + /// @notice Validate a user operation. + function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) + external + payable + override + returns (ValidationData validationData) + { + (uint256 r, uint256 s) = abi.decode(_userOp.signature, (uint256, uint256)); + PublicKey memory key = p256PublicKey[_userOp.sender]; + if (P256.verifySignature(_userOpHash, r, s, key.x, key.y)) { + return ValidationData.wrap(0); + } + return SIG_VALIDATION_FAILED; + } + + /// @notice Validate a signature. + function validateSignature(bytes32 hash, bytes calldata signature) + external + view + override + returns (ValidationData) + { + (uint256 r, uint256 s) = abi.decode(signature, (uint256, uint256)); + PublicKey memory key = p256PublicKey[msg.sender]; + if (P256.verifySignature(hash, r, s, key.x, key.y)) { + return ValidationData.wrap(0); + } + return SIG_VALIDATION_FAILED; + } + + function validCaller(address _caller, bytes calldata) external view override returns (bool) { + revert NotImplemented(); + } +} diff --git a/plugins/src/stealthAddressValidator/EllipticCurve.sol b/plugins/src/stealthAddressValidator/EllipticCurve.sol new file mode 100644 index 00000000..94a8eedf --- /dev/null +++ b/plugins/src/stealthAddressValidator/EllipticCurve.sol @@ -0,0 +1,328 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +/** + * @title Elliptic Curve Library + * @dev Library providing arithmetic operations over elliptic curves. + * This library does not check whether the inserted points belong to the curve + * `isOnCurve` function should be used by the library user to check the aforementioned statement. + * @author Witnet Foundation + */ +library EllipticCurve { + // Pre-computed constant for 2 ** 255 + uint256 private constant U255_MAX_PLUS_1 = + 57896044618658097711785492504343953926634992332820282019728792003956564819968; + + /// @dev Modular euclidean inverse of a number (mod p). + /// @param _x The number + /// @param _pp The modulus + /// @return q such that x*q = 1 (mod _pp) + function invMod(uint256 _x, uint256 _pp) internal pure returns (uint256) { + require(_x != 0 && _x != _pp && _pp != 0, "Invalid number"); + uint256 q = 0; + uint256 newT = 1; + uint256 r = _pp; + uint256 t; + while (_x != 0) { + t = r / _x; + (q, newT) = (newT, addmod(q, (_pp - mulmod(t, newT, _pp)), _pp)); + (r, _x) = (_x, r - t * _x); + } + + return q; + } + + /// @dev Modular exponentiation, b^e % _pp. + /// Source: https://github.com/androlo/standard-contracts/blob/master/contracts/src/crypto/ECCMath.sol + /// @param _base base + /// @param _exp exponent + /// @param _pp modulus + /// @return r such that r = b**e (mod _pp) + function expMod(uint256 _base, uint256 _exp, uint256 _pp) internal pure returns (uint256) { + require(_pp != 0, "EllipticCurve: modulus is zero"); + + if (_base == 0) return 0; + if (_exp == 0) return 1; + + uint256 r = 1; + uint256 bit = U255_MAX_PLUS_1; + assembly { + for {} gt(bit, 0) {} { + r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, bit)))), _pp) + r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, div(bit, 2))))), _pp) + r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, div(bit, 4))))), _pp) + r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, div(bit, 8))))), _pp) + bit := div(bit, 16) + } + } + + return r; + } + + /// @dev Converts a point (x, y, z) expressed in Jacobian coordinates to affine coordinates (x', y', 1). + /// @param _x coordinate x + /// @param _y coordinate y + /// @param _z coordinate z + /// @param _pp the modulus + /// @return (x', y') affine coordinates + function toAffine(uint256 _x, uint256 _y, uint256 _z, uint256 _pp) internal pure returns (uint256, uint256) { + uint256 zInv = invMod(_z, _pp); + uint256 zInv2 = mulmod(zInv, zInv, _pp); + uint256 x2 = mulmod(_x, zInv2, _pp); + uint256 y2 = mulmod(_y, mulmod(zInv, zInv2, _pp), _pp); + + return (x2, y2); + } + + /// @dev Derives the y coordinate from a compressed-format point x [[SEC-1]](https://www.secg.org/SEC1-Ver-1.0.pdf). + /// @param _prefix parity byte (0x02 even, 0x03 odd) + /// @param _x coordinate x + /// @param _aa constant of curve + /// @param _bb constant of curve + /// @param _pp the modulus + /// @return y coordinate y + function deriveY(uint8 _prefix, uint256 _x, uint256 _aa, uint256 _bb, uint256 _pp) + internal + pure + returns (uint256) + { + require(_prefix == 0x02 || _prefix == 0x03, "EllipticCurve:innvalid compressed EC point prefix"); + + // x^3 + ax + b + uint256 y2 = addmod(mulmod(_x, mulmod(_x, _x, _pp), _pp), addmod(mulmod(_x, _aa, _pp), _bb, _pp), _pp); + y2 = expMod(y2, (_pp + 1) / 4, _pp); + // uint256 cmp = yBit ^ y_ & 1; + uint256 y = (y2 + _prefix) % 2 == 0 ? y2 : _pp - y2; + + return y; + } + + /// @dev Check whether point (x,y) is on curve defined by a, b, and _pp. + /// @param _x coordinate x of P1 + /// @param _y coordinate y of P1 + /// @param _aa constant of curve + /// @param _bb constant of curve + /// @param _pp the modulus + /// @return true if x,y in the curve, false else + function isOnCurve(uint256 _x, uint256 _y, uint256 _aa, uint256 _bb, uint256 _pp) internal pure returns (bool) { + if (0 == _x || _x >= _pp || 0 == _y || _y >= _pp) { + return false; + } + // y^2 + uint256 lhs = mulmod(_y, _y, _pp); + // x^3 + uint256 rhs = mulmod(mulmod(_x, _x, _pp), _x, _pp); + if (_aa != 0) { + // x^3 + a*x + rhs = addmod(rhs, mulmod(_x, _aa, _pp), _pp); + } + if (_bb != 0) { + // x^3 + a*x + b + rhs = addmod(rhs, _bb, _pp); + } + + return lhs == rhs; + } + + /// @dev Calculate inverse (x, -y) of point (x, y). + /// @param _x coordinate x of P1 + /// @param _y coordinate y of P1 + /// @param _pp the modulus + /// @return (x, -y) + function ecInv(uint256 _x, uint256 _y, uint256 _pp) internal pure returns (uint256, uint256) { + return (_x, (_pp - _y) % _pp); + } + + /// @dev Add two points (x1, y1) and (x2, y2) in affine coordinates. + /// @param _x1 coordinate x of P1 + /// @param _y1 coordinate y of P1 + /// @param _x2 coordinate x of P2 + /// @param _y2 coordinate y of P2 + /// @param _aa constant of the curve + /// @param _pp the modulus + /// @return (qx, qy) = P1+P2 in affine coordinates + function ecAdd(uint256 _x1, uint256 _y1, uint256 _x2, uint256 _y2, uint256 _aa, uint256 _pp) + internal + pure + returns (uint256, uint256) + { + uint256 x = 0; + uint256 y = 0; + uint256 z = 0; + + // Double if x1==x2 else add + if (_x1 == _x2) { + // y1 = -y2 mod p + if (addmod(_y1, _y2, _pp) == 0) { + return (0, 0); + } else { + // P1 = P2 + (x, y, z) = jacDouble(_x1, _y1, 1, _aa, _pp); + } + } else { + (x, y, z) = jacAdd(_x1, _y1, 1, _x2, _y2, 1, _pp); + } + // Get back to affine + return toAffine(x, y, z, _pp); + } + + /// @dev Substract two points (x1, y1) and (x2, y2) in affine coordinates. + /// @param _x1 coordinate x of P1 + /// @param _y1 coordinate y of P1 + /// @param _x2 coordinate x of P2 + /// @param _y2 coordinate y of P2 + /// @param _aa constant of the curve + /// @param _pp the modulus + /// @return (qx, qy) = P1-P2 in affine coordinates + function ecSub(uint256 _x1, uint256 _y1, uint256 _x2, uint256 _y2, uint256 _aa, uint256 _pp) + internal + pure + returns (uint256, uint256) + { + // invert square + (uint256 x, uint256 y) = ecInv(_x2, _y2, _pp); + // P1-square + return ecAdd(_x1, _y1, x, y, _aa, _pp); + } + + /// @dev Multiply point (x1, y1, z1) times d in affine coordinates. + /// @param _k scalar to multiply + /// @param _x coordinate x of P1 + /// @param _y coordinate y of P1 + /// @param _aa constant of the curve + /// @param _pp the modulus + /// @return (qx, qy) = d*P in affine coordinates + function ecMul(uint256 _k, uint256 _x, uint256 _y, uint256 _aa, uint256 _pp) + internal + pure + returns (uint256, uint256) + { + // Jacobian multiplication + (uint256 x1, uint256 y1, uint256 z1) = jacMul(_k, _x, _y, 1, _aa, _pp); + // Get back to affine + return toAffine(x1, y1, z1, _pp); + } + + /// @dev Adds two points (x1, y1, z1) and (x2 y2, z2). + /// @param _x1 coordinate x of P1 + /// @param _y1 coordinate y of P1 + /// @param _z1 coordinate z of P1 + /// @param _x2 coordinate x of square + /// @param _y2 coordinate y of square + /// @param _z2 coordinate z of square + /// @param _pp the modulus + /// @return (qx, qy, qz) P1+square in Jacobian + function jacAdd(uint256 _x1, uint256 _y1, uint256 _z1, uint256 _x2, uint256 _y2, uint256 _z2, uint256 _pp) + internal + pure + returns (uint256, uint256, uint256) + { + if (_x1 == 0 && _y1 == 0) return (_x2, _y2, _z2); + if (_x2 == 0 && _y2 == 0) return (_x1, _y1, _z1); + + // We follow the equations described in https://pdfs.semanticscholar.org/5c64/29952e08025a9649c2b0ba32518e9a7fb5c2.pdf Section 5 + uint256[4] memory zs; // z1^2, z1^3, z2^2, z2^3 + zs[0] = mulmod(_z1, _z1, _pp); + zs[1] = mulmod(_z1, zs[0], _pp); + zs[2] = mulmod(_z2, _z2, _pp); + zs[3] = mulmod(_z2, zs[2], _pp); + + // u1, s1, u2, s2 + zs = [mulmod(_x1, zs[2], _pp), mulmod(_y1, zs[3], _pp), mulmod(_x2, zs[0], _pp), mulmod(_y2, zs[1], _pp)]; + + // In case of zs[0] == zs[2] && zs[1] == zs[3], double function should be used + require(zs[0] != zs[2] || zs[1] != zs[3], "Use jacDouble function instead"); + + uint256[4] memory hr; + //h + hr[0] = addmod(zs[2], _pp - zs[0], _pp); + //r + hr[1] = addmod(zs[3], _pp - zs[1], _pp); + //h^2 + hr[2] = mulmod(hr[0], hr[0], _pp); + // h^3 + hr[3] = mulmod(hr[2], hr[0], _pp); + // qx = -h^3 -2u1h^2+r^2 + uint256 qx = addmod(mulmod(hr[1], hr[1], _pp), _pp - hr[3], _pp); + qx = addmod(qx, _pp - mulmod(2, mulmod(zs[0], hr[2], _pp), _pp), _pp); + // qy = -s1*z1*h^3+r(u1*h^2 -x^3) + uint256 qy = mulmod(hr[1], addmod(mulmod(zs[0], hr[2], _pp), _pp - qx, _pp), _pp); + qy = addmod(qy, _pp - mulmod(zs[1], hr[3], _pp), _pp); + // qz = h*z1*z2 + uint256 qz = mulmod(hr[0], mulmod(_z1, _z2, _pp), _pp); + return (qx, qy, qz); + } + + /// @dev Doubles a points (x, y, z). + /// @param _x coordinate x of P1 + /// @param _y coordinate y of P1 + /// @param _z coordinate z of P1 + /// @param _aa the a scalar in the curve equation + /// @param _pp the modulus + /// @return (qx, qy, qz) 2P in Jacobian + function jacDouble(uint256 _x, uint256 _y, uint256 _z, uint256 _aa, uint256 _pp) + internal + pure + returns (uint256, uint256, uint256) + { + if (_z == 0) return (_x, _y, _z); + + // We follow the equations described in https://pdfs.semanticscholar.org/5c64/29952e08025a9649c2b0ba32518e9a7fb5c2.pdf Section 5 + // Note: there is a bug in the paper regarding the m parameter, M=3*(x1^2)+a*(z1^4) + // x, y, z at this point represent the squares of _x, _y, _z + uint256 x = mulmod(_x, _x, _pp); //x1^2 + uint256 y = mulmod(_y, _y, _pp); //y1^2 + uint256 z = mulmod(_z, _z, _pp); //z1^2 + + // s + uint256 s = mulmod(4, mulmod(_x, y, _pp), _pp); + // m + uint256 m = addmod(mulmod(3, x, _pp), mulmod(_aa, mulmod(z, z, _pp), _pp), _pp); + + // x, y, z at this point will be reassigned and rather represent qx, qy, qz from the paper + // This allows to reduce the gas cost and stack footprint of the algorithm + // qx + x = addmod(mulmod(m, m, _pp), _pp - addmod(s, s, _pp), _pp); + // qy = -8*y1^4 + M(S-T) + y = addmod(mulmod(m, addmod(s, _pp - x, _pp), _pp), _pp - mulmod(8, mulmod(y, y, _pp), _pp), _pp); + // qz = 2*y1*z1 + z = mulmod(2, mulmod(_y, _z, _pp), _pp); + + return (x, y, z); + } + + /// @dev Multiply point (x, y, z) times d. + /// @param _d scalar to multiply + /// @param _x coordinate x of P1 + /// @param _y coordinate y of P1 + /// @param _z coordinate z of P1 + /// @param _aa constant of curve + /// @param _pp the modulus + /// @return (qx, qy, qz) d*P1 in Jacobian + function jacMul(uint256 _d, uint256 _x, uint256 _y, uint256 _z, uint256 _aa, uint256 _pp) + internal + pure + returns (uint256, uint256, uint256) + { + // Early return in case that `_d == 0` + if (_d == 0) { + return (_x, _y, _z); + } + + uint256 remaining = _d; + uint256 qx = 0; + uint256 qy = 0; + uint256 qz = 1; + + // Double and add algorithm + while (remaining != 0) { + if ((remaining & 1) != 0) { + (qx, qy, qz) = jacAdd(qx, qy, qz, _x, _y, _z, _pp); + } + remaining = remaining / 2; + (_x, _y, _z) = jacDouble(_x, _y, _z, _aa, _pp); + } + return (qx, qy, qz); + } +} diff --git a/plugins/src/stealthAddressValidator/StealthAddressValidator.sol b/plugins/src/stealthAddressValidator/StealthAddressValidator.sol new file mode 100644 index 00000000..369a97b0 --- /dev/null +++ b/plugins/src/stealthAddressValidator/StealthAddressValidator.sol @@ -0,0 +1,182 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {UserOperation} from "I4337/interfaces/UserOperation.sol"; +import {ECDSA} from "solady/utils/ECDSA.sol"; +import {EIP712} from "solady/utils/EIP712.sol"; +import {StealthAggreagteSignature} from "./StealthAggreagteSignature.sol"; +import {IKernelValidator} from "src/interfaces/IKernelValidator.sol"; +import {ValidationData} from "src/common/Types.sol"; +import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; + +/** + * @dev Storage structure for Stealth Address Registry Module. + * StealthPubkey, dhkey are used in aggregated signature. + * EphemeralPubkey is used to recover private key of stealth address. + */ +struct StealthAddressValidatorStorage { + uint256 stealthPubkey; + uint256 dhkey; + uint256 ephemeralPubkey; + address stealthAddress; + uint8 stealthPubkeyPrefix; + uint8 dhkeyPrefix; + uint8 ephemeralPrefix; +} + +/** + * @author Justin Zen - + * @title Stealth Address Validator for ZeroDev Kernel. + * @notice This validator uses the Stealth address to validate signatures. + */ +contract StealthAddressValidator is IKernelValidator, EIP712 { + /// @notice The type hash used for kernel user op validation + bytes32 constant USER_OP_TYPEHASH = + keccak256("AllowUserOp(address owner,address kernelWallet,bytes32 userOpHash)"); + /// @notice The type hash used for kernel signature validation + bytes32 constant SIGNATURE_TYPEHASH = + keccak256("KernelSignature(address owner,address kernelWallet,bytes32 hash)"); + + /// @notice Emitted when the stealth address of a kernel is changed. + event StealthAddressChanged( + address indexed kernel, address indexed oldStealthAddress, address indexed newStealthAddress + ); + + /* -------------------------------------------------------------------------- */ + /* Storage */ + /* -------------------------------------------------------------------------- */ + mapping(address => StealthAddressValidatorStorage) public stealthAddressValidatorStorage; + + /* -------------------------------------------------------------------------- */ + /* EIP-712 Methods */ + /* -------------------------------------------------------------------------- */ + + /// @dev Get the current name & version of the validator, used for the EIP-712 domain separator from Solady + function _domainNameAndVersion() internal pure override returns (string memory, string memory) { + return ("Kernel:StealthAddressValidator", "1.0.0"); + } + + /// @dev Tell to solady that the current name & version of the validator won't change, so no need to recompute the eip-712 domain separator + function _domainNameAndVersionMayChange() internal pure override returns (bool) { + return false; + } + + /// @dev Export the current domain seperator + function getDomainSeperator() public view returns (bytes32) { + return _domainSeparator(); + } + + /* -------------------------------------------------------------------------- */ + /* Kernel validator Methods */ + /* -------------------------------------------------------------------------- */ + + /// @dev Enable this validator for a given `kernel` (msg.sender) + function enable(bytes calldata _data) external payable override { + address stealthAddress = address(bytes20(_data[0:20])); + uint256 stealthAddressPubkey = uint256(bytes32(_data[20:52])); + uint256 stealthAddressDhkey = uint256(bytes32(_data[52:84])); + uint8 stealthAddressPubkeyPrefix = uint8(_data[84]); + uint8 stealthAddressDhkeyPrefix = uint8(_data[85]); + uint256 ephemeralPubkey = uint256(bytes32(_data[86:118])); + uint8 ephemeralPrefix = uint8(_data[118]); + + address oldStealthAddress = stealthAddressValidatorStorage[msg.sender].stealthAddress; + stealthAddressValidatorStorage[msg.sender] = StealthAddressValidatorStorage({ + stealthPubkey: stealthAddressPubkey, + dhkey: stealthAddressDhkey, + ephemeralPubkey: ephemeralPubkey, + stealthAddress: stealthAddress, + stealthPubkeyPrefix: stealthAddressPubkeyPrefix, + dhkeyPrefix: stealthAddressDhkeyPrefix, + ephemeralPrefix: ephemeralPrefix + }); + emit StealthAddressChanged(msg.sender, oldStealthAddress, stealthAddress); + } + + /// @dev Disable this validator for a given `kernel` (msg.sender) + function disable(bytes calldata) external payable override { + address stealthAddress; + delete stealthAddressValidatorStorage[msg.sender]; + emit StealthAddressChanged(msg.sender, stealthAddress, address(0)); + } + + /// @dev Validate a `_userOp` using a EIP-712 signature, signed by the owner of the kernel account who is the `_userOp` sender + function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) + external + payable + override + returns (ValidationData validationData) + { + bytes1 mode = _userOp.signature[0]; + StealthAddressValidatorStorage storage stealthData = stealthAddressValidatorStorage[_userOp.sender]; + address stealthAddress = stealthData.stealthAddress; + bytes32 typedDataHash = + _hashTypedData(keccak256(abi.encode(USER_OP_TYPEHASH, stealthAddress, _userOp.sender, _userOpHash))); + + // 0x00: signature from spending key + // 0x01: aggregated signature from owner and shared secret + if (mode == 0x00) { + return stealthAddress == ECDSA.recover(typedDataHash, _userOp.signature[1:]) + ? ValidationData.wrap(0) + : SIG_VALIDATION_FAILED; + } else if (mode == 0x01) { + return StealthAggreagteSignature.validateAggregatedSignature( + stealthData.stealthPubkey, + stealthData.dhkey, + stealthData.stealthPubkeyPrefix, + stealthData.dhkeyPrefix, + typedDataHash, + _userOp.signature[1:] + ) ? ValidationData.wrap(0) : SIG_VALIDATION_FAILED; + } else { + return SIG_VALIDATION_FAILED; + } + } + + /// @dev Validate a `_signature` of the `_hash` ofor the given `kernel` (msg.sender) + function validateSignature(bytes32 _hash, bytes calldata _signature) + external + view + override + returns (ValidationData validationData) + { + bytes1 mode = _signature[0]; + StealthAddressValidatorStorage storage stealthData = stealthAddressValidatorStorage[msg.sender]; + address stealthAddress = stealthData.stealthAddress; + bytes32 typedDataHash = + _hashTypedData(keccak256(abi.encode(SIGNATURE_TYPEHASH, stealthAddress, msg.sender, _hash))); + + // 0x00: signature from spending key + // 0x01: aggregated signature from owner and shared secret + if (mode == 0x00) { + return stealthAddress == ECDSA.recover(typedDataHash, _signature[1:]) + ? ValidationData.wrap(0) + : SIG_VALIDATION_FAILED; + } else if (mode == 0x01) { + return StealthAggreagteSignature.validateAggregatedSignature( + stealthData.stealthPubkey, + stealthData.dhkey, + stealthData.stealthPubkeyPrefix, + stealthData.dhkeyPrefix, + typedDataHash, + _signature[1:] + ) ? ValidationData.wrap(0) : SIG_VALIDATION_FAILED; + } else { + return SIG_VALIDATION_FAILED; + } + } + + /// @dev Check if the caller is a valid signer for this kernel account + function validCaller(address _caller, bytes calldata) external view override returns (bool) { + return stealthAddressValidatorStorage[msg.sender].stealthAddress == _caller; + } + + /* -------------------------------------------------------------------------- */ + /* Public view methods */ + /* -------------------------------------------------------------------------- */ + + /// @dev Get the owner of a given `kernel` + function getOwner(address _kernel) public view returns (address) { + return stealthAddressValidatorStorage[_kernel].stealthAddress; + } +} diff --git a/plugins/src/stealthAddressValidator/StealthAggreagteSignature.sol b/plugins/src/stealthAddressValidator/StealthAggreagteSignature.sol new file mode 100644 index 00000000..d184a5f7 --- /dev/null +++ b/plugins/src/stealthAddressValidator/StealthAggreagteSignature.sol @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {EllipticCurve} from "./EllipticCurve.sol"; + +library StealthAggreagteSignature { + uint256 public constant GX = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798; + uint256 public constant GY = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8; + uint256 public constant AA = 0; + uint256 public constant BB = 7; + uint256 public constant PP = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F; + uint256 public constant N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141; + + function validateAggregatedSignature( + uint256 _pubkey, + uint256 _dhkey, + uint8 _pubkeyPrefix, + uint8 _dhkeyPrefix, + bytes32 _message, + bytes calldata _signature + ) external pure returns (bool) { + uint256 aggh2; + uint256 aggpb; + uint256 aggdh; + + uint256 sigr = uint256(bytes32(_signature[0:32])); + uint256 sigs = uint256(bytes32(_signature[32:64])); + uint256 sinv = EllipticCurve.invMod(sigs, N); + uint256 num_message = uint256(_message); + + assembly { + aggh2 := mulmod(mulmod(sinv, num_message, N), num_message, N) + aggpb := mulmod(mulmod(sinv, sigr, N), num_message, N) + aggdh := mulmod(mulmod(sinv, sigr, N), sigr, N) + } + (uint256 p1x, uint256 p1y) = EllipticCurve.ecMul(aggh2, GX, GY, AA, PP); + uint256 pubY = EllipticCurve.deriveY(_pubkeyPrefix, _pubkey, AA, BB, PP); + uint256 pubdhY = EllipticCurve.deriveY(_dhkeyPrefix, _dhkey, AA, BB, PP); + + (uint256 p2x, uint256 p2y) = EllipticCurve.ecMul(aggpb, _pubkey, pubY, AA, PP); + (uint256 p3x, uint256 p3y) = EllipticCurve.ecMul(aggdh, _dhkey, pubdhY, AA, PP); + (uint256 aggp1x, uint256 aggp1y) = EllipticCurve.ecAdd(p1x, p1y, p2x, p2y, AA, PP); + (uint256 aggpx,) = EllipticCurve.ecAdd(aggp1x, aggp1y, p3x, p3y, AA, PP); + + return aggpx % N == sigr; + } +} diff --git a/plugins/test/P256Validator.t.sol b/plugins/test/P256Validator.t.sol new file mode 100644 index 00000000..9d22e42b --- /dev/null +++ b/plugins/test/P256Validator.t.sol @@ -0,0 +1,207 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IEntryPoint} from "I4337/interfaces/IEntryPoint.sol"; +import "src/Kernel.sol"; +// test artifacts +// test utils +import "forge-std/Test.sol"; +import {ERC4337Utils} from "test/foundry/utils/ERC4337Utils.sol"; +import {KernelTestBase} from "test/foundry/KernelTestBase.sol"; +import {TestExecutor} from "test/foundry/mock/TestExecutor.sol"; +import {TestValidator} from "test/foundry/mock/TestValidator.sol"; +import {P256Validator} from "src/validator/P256Validator.sol"; +import {P256Verifier} from "p256-verifier/P256Verifier.sol"; +import {P256} from "p256-verifier/P256.sol"; +import {FCL_ecdsa_utils} from "FreshCryptoLib/FCL_ecdsa_utils.sol"; +import {IKernel} from "src/interfaces/IKernel.sol"; + +using ERC4337Utils for IEntryPoint; + +contract P256ValidatorTest is KernelTestBase { + P256Verifier p256Verifier; + P256Validator p256Validator; + + // Curve order (number of points) + uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; + + uint256 x; + uint256 y; + + function setUp() public { + p256Validator = new P256Validator(); + p256Verifier = new P256Verifier(); + + vm.etch(0xc2b78104907F722DABAc4C69f826a522B2754De4, address(p256Verifier).code); + + _initialize(); + (x, y) = generatePublicKey(ownerKey); + _setAddress(); + _setExecutionDetail(); + } + + function _setExecutionDetail() internal virtual override { + executionDetail.executor = address(new TestExecutor()); + executionSig = TestExecutor.doNothing.selector; + executionDetail.validator = new TestValidator(); + } + + function getValidatorSignature(UserOperation memory _op) internal view virtual override returns (bytes memory) { + bytes32 hash = entryPoint.getUserOpHash(_op); + (uint256 r, uint256 s) = generateSignature(ownerKey, ECDSA.toEthSignedMessageHash(hash)); + return abi.encodePacked(bytes4(0x00000000), abi.encode(r, s)); + } + + function getOwners() internal virtual override returns (address[] memory _owners) { + _owners = new address[](1); + _owners[0] = address(0); + return _owners; + } + + function getEnableData() internal view virtual override returns (bytes memory) { + return ""; + } + + function getInitializeData() internal view override returns (bytes memory) { + return abi.encodeWithSelector(KernelStorage.initialize.selector, p256Validator, abi.encode(x, y)); + } + + function test_default_validator_enable() external override { + UserOperation memory op = buildUserOperation( + abi.encodeWithSelector( + IKernel.execute.selector, + address(p256Validator), + 0, + abi.encodeWithSelector(P256Validator.enable.selector, abi.encode(x, y)), + Operation.Call + ) + ); + performUserOperationWithSig(op); + (uint256 x2, uint256 y2) = P256Validator(address(p256Validator)).p256PublicKey(address(kernel)); + verifyPublicKey(x2, y2, x, y); + } + + function test_default_validator_disable() external override { + UserOperation memory op = buildUserOperation( + abi.encodeWithSelector( + IKernel.execute.selector, + address(p256Validator), + 0, + abi.encodeWithSelector(P256Validator.disable.selector, ""), + Operation.Call + ) + ); + performUserOperationWithSig(op); + (uint256 x2, uint256 y2) = P256Validator(address(p256Validator)).p256PublicKey(address(kernel)); + verifyPublicKey(x2, y2, 0, 0); + } + + function test_external_call_batch_execute_success() external override { + vm.skip(true); + } + + function test_external_call_execute_success() external override { + vm.skip(true); + } + + function test_external_call_execute_delegatecall_success() external override { + vm.skip(true); + } + + function test_external_call_execute_delegatecall_fail() external override { + vm.skip(true); + } + + function test_external_call_default() external override { + vm.skip(true); + } + + function test_external_call_execution() external override { + vm.skip(true); + } + + function generatePublicKey(uint256 privateKey) internal view returns (uint256, uint256) { + return FCL_ecdsa_utils.ecdsa_derivKpub(privateKey); + } + + function generateSignature(uint256 privateKey, bytes32 hash) internal view returns (uint256 r, uint256 s) { + // Securely generate a random k value for each signature + uint256 k = uint256(keccak256(abi.encodePacked(hash, block.timestamp, block.difficulty, privateKey))) % n; + while (k == 0) { + k = uint256(keccak256(abi.encodePacked(k))) % n; + } + + // Generate the signature using the k value and the private key + (r, s) = FCL_ecdsa_utils.ecdsa_sign(hash, k, privateKey); + + // Ensure that s is in the lower half of the range [1, n-1] + if (r == 0 || s == 0 || s > P256.P256_N_DIV_2) { + s = n - s; // If s is in the upper half, use n - s instead + } + + return (r, s); + } + + function test_utils(uint256 privateKey, bytes32 hash) external { + vm.assume(hash != 0); + vm.assume(privateKey != 0); + (uint256 x1, uint256 y1) = generatePublicKey(privateKey); + (uint256 r, uint256 s) = generateSignature(privateKey, hash); + + vm.assume(x1 != 0); + vm.assume(y1 != 0); + vm.assume(r != 0); + vm.assume(s < P256.P256_N_DIV_2); + assertEq(P256.verifySignature(hash, r, s, x1, y1), true); + } + + function test_validate_signature() external override { + Kernel kernel2 = Kernel(payable(factory.createAccount(address(kernelImpl), getInitializeData(), 3))); + bytes32 hash = keccak256(abi.encodePacked("hello world")); + + bytes32 digest = keccak256( + abi.encodePacked( + "\x19\x01", ERC4337Utils._buildDomainSeparator(KERNEL_NAME, KERNEL_VERSION, address(kernel)), hash + ) + ); + + (uint256 r, uint256 s) = generateSignature(ownerKey, digest); + + assertEq(kernel.isValidSignature(hash, abi.encode(r, s)), Kernel.isValidSignature.selector); + assertEq(kernel2.isValidSignature(hash, abi.encode(r, s)), bytes4(0xffffffff)); + } + + function test_fail_validate_wrongsignature() external override { + bytes32 hash = keccak256(abi.encodePacked("hello world")); + bytes memory sig = getWrongSignature(hash); + assertEq(kernel.isValidSignature(hash, sig), bytes4(0xffffffff)); + } + + function signUserOp(UserOperation memory op) internal view override returns (bytes memory) { + bytes32 hash = entryPoint.getUserOpHash(op); + (uint256 r, uint256 s) = generateSignature(ownerKey, hash); + return abi.encodePacked(bytes4(0x00000000), abi.encode(r, s)); + } + + function getWrongSignature(UserOperation memory op) internal view override returns (bytes memory) { + bytes32 hash = entryPoint.getUserOpHash(op); + (uint256 r, uint256 s) = generateSignature(ownerKey + 1, hash); + return abi.encodePacked(bytes4(0x00000000), abi.encode(r, s)); + } + + function signHash(bytes32 hash) internal view override returns (bytes memory) { + (uint256 r, uint256 s) = generateSignature(ownerKey, hash); + + return abi.encode(r, s); + } + + function getWrongSignature(bytes32 hash) internal view override returns (bytes memory) { + (uint256 r, uint256 s) = generateSignature(ownerKey + 1, ECDSA.toEthSignedMessageHash(hash)); + return abi.encode(r, s); + } + + function verifyPublicKey(uint256 actualX, uint256 actualY, uint256 expectedX, uint256 expectedY) internal { + assertEq(actualX, expectedX, "Public key X component mismatch"); + assertEq(actualY, expectedY, "Public key Y component mismatch"); + } +} diff --git a/plugins/test/StealthAddressValidator.t.sol b/plugins/test/StealthAddressValidator.t.sol new file mode 100644 index 00000000..c989f348 --- /dev/null +++ b/plugins/test/StealthAddressValidator.t.sol @@ -0,0 +1,311 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {FixedPointMathLib} from "solady/utils/FixedPointMathLib.sol"; +import "src/Kernel.sol"; +import {EllipticCurve} from "src/validator/stealthAddressValidator/EllipticCurve.sol"; +import {IKernel} from "src/interfaces/IKernel.sol"; +import {StealthAddressValidator} from "src/validator/stealthAddressValidator/StealthAddressValidator.sol"; +// test utils +import {KernelTestBase} from "test/foundry/KernelTestBase.sol"; +import {TestExecutor} from "test/foundry/mock/TestExecutor.sol"; +import {TestValidator} from "test/foundry/mock/TestValidator.sol"; +import "forge-std/Vm.sol"; + +struct StealthAddressKey { + address stealthAddress; + uint256 stealthPub; + uint256 dhPub; + uint8 stealthPrefix; + uint8 dhPrefix; + uint256 ephemeralPub; + uint8 ephemeralPrefix; + uint256 hashSecret; + uint256 stealthPrivate; +} + +contract StealthAddressValidatorTest is KernelTestBase { + StealthAddressValidator private stealthAddressValidator; + VmSafe.Wallet private wallet; + VmSafe.Wallet private ephemeralWallet; + uint256 private stealthPrivateKey; + + function setUp() public { + _initialize(); + wallet = vm.createWallet(uint256(keccak256(bytes("owner")))); + ephemeralWallet = vm.createWallet(uint256(keccak256(bytes("ephemeral")))); + + StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); + owner = stealthAddressKey.stealthAddress; + ownerKey = stealthAddressKey.stealthPrivate; + stealthAddressValidator = new StealthAddressValidator(); + defaultValidator = stealthAddressValidator; + _setAddress(); + _setExecutionDetail(); + } + + function _setExecutionDetail() internal virtual override { + executionDetail.executor = address(new TestExecutor()); + executionSig = TestExecutor.doNothing.selector; + executionDetail.validator = new TestValidator(); + } + + function getEnableData() internal view virtual override returns (bytes memory) { + return ""; + } + + function getValidatorSignature(UserOperation memory) internal view virtual override returns (bytes memory) { + return ""; + } + + function getOwners() internal view override returns (address[] memory) { + address[] memory owners = new address[](1); + owners[0] = owner; + return owners; + } + + function getInitializeData() internal view override returns (bytes memory) { + StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); + return abi.encodeWithSelector( + KernelStorage.initialize.selector, + defaultValidator, + abi.encodePacked( + stealthAddressKey.stealthAddress, + stealthAddressKey.stealthPub, + stealthAddressKey.dhPub, + stealthAddressKey.stealthPrefix, + stealthAddressKey.dhPrefix, + stealthAddressKey.ephemeralPub, + stealthAddressKey.ephemeralPrefix + ) + ); + } + + function signUserOp(UserOperation memory op) internal view override returns (bytes memory) { + StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); + return abi.encodePacked( + bytes4(0x00000000), bytes1(0x00), _generateUserOpSignature(entryPoint, op, stealthAddressKey.stealthPrivate) + ); + } + + function getWrongSignature(UserOperation memory op) internal view override returns (bytes memory) { + StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); + return abi.encodePacked( + bytes4(0x00000000), + bytes1(0x00), + _generateUserOpSignature(entryPoint, op, stealthAddressKey.stealthPrivate + 1) + ); + } + + function signHash(bytes32 _hash) internal view override returns (bytes memory) { + StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); + return _generateHashSignature(_hash, address(kernel), stealthAddressKey.stealthPrivate); + } + + function getWrongSignature(bytes32 _hash) internal view override returns (bytes memory) { + StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); + return _generateHashSignature(_hash, address(kernel), stealthAddressKey.stealthPrivate + 1); + } + + function test_default_validator_enable() external override { + StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); + + UserOperation memory op = buildUserOperation( + abi.encodeWithSelector( + IKernel.execute.selector, + address(defaultValidator), + 0, + abi.encodeWithSelector( + StealthAddressValidator.enable.selector, + abi.encodePacked( + stealthAddressKey.stealthAddress, + stealthAddressKey.stealthPub, + stealthAddressKey.dhPub, + stealthAddressKey.stealthPrefix, + stealthAddressKey.dhPrefix, + stealthAddressKey.ephemeralPub, + stealthAddressKey.ephemeralPrefix + ) + ), + Operation.Call + ) + ); + performUserOperationWithSig(op); + address owner = stealthAddressValidator.getOwner(address(kernel)); + assertEq(owner, stealthAddressKey.stealthAddress, "owner should be stealthAddress"); + } + + function test_default_validator_disable() external override { + UserOperation memory op = buildUserOperation( + abi.encodeWithSelector( + IKernel.execute.selector, + address(defaultValidator), + 0, + abi.encodeWithSelector(StealthAddressValidator.disable.selector, ""), + Operation.Call + ) + ); + performUserOperationWithSig(op); + address owner = stealthAddressValidator.getOwner(address(kernel)); + assertEq(owner, address(0), "owner should be 0"); + } + + function test_stealth_validate_userop_aggsig() external { + UserOperation memory userOp = UserOperation({ + sender: address(kernel), + nonce: 0, + initCode: bytes(""), + callData: bytes(""), + callGasLimit: 1, + verificationGasLimit: 1, + preVerificationGas: 1, + maxFeePerGas: 1, + maxPriorityFeePerGas: 1, + paymasterAndData: bytes(""), + signature: bytes("") + }); + bytes32 userOpHash = entryPoint.getUserOpHash(userOp); + + // Get the validator domain separator + bytes32 domainSeparator = stealthAddressValidator.getDomainSeperator(); + bytes32 typedMsgHash = keccak256( + abi.encodePacked( + "\x19\x01", domainSeparator, keccak256(abi.encode(USER_OP_TYPEHASH, owner, address(kernel), userOpHash)) + ) + ); + bytes memory aggregatedSignature = getAggregatedSignature(typedMsgHash, wallet); + userOp.signature = aggregatedSignature; + + (,, address result) = parseValidationData(defaultValidator.validateUserOp(userOp, userOpHash, 0)); + assertEq(result, address(0)); + } + + function test_stealth_validate_sig_aggsig() external { + bytes32 message = bytes32(uint256(0x102030405060708090a)); + + // Get the validator domain separator + bytes32 domainSeparator = stealthAddressValidator.getDomainSeperator(); + bytes32 typedMsgHash = keccak256( + abi.encodePacked( + "\x19\x01", domainSeparator, keccak256(abi.encode(SIGNATURE_TYPEHASH, owner, address(kernel), message)) + ) + ); + bytes memory aggregatedSignature = getAggregatedSignature(typedMsgHash, wallet); + + vm.prank(address(kernel)); + (,, address result) = parseValidationData(defaultValidator.validateSignature(message, aggregatedSignature)); + assertEq(result, address(0)); + } + + /* -------------------------------------------------------------------------- */ + /* Helper methods */ + /* -------------------------------------------------------------------------- */ + + /// @notice The type hash used for kernel user op validation + bytes32 constant USER_OP_TYPEHASH = keccak256("AllowUserOp(address owner,address kernelWallet,bytes32 userOpHash)"); + + /// @dev Generate the signature for a user op + function _generateUserOpSignature(IEntryPoint _entryPoint, UserOperation memory _op, uint256 _privateKey) + internal + view + returns (bytes memory) + { + // Get the kernel private key owner address + address owner = vm.addr(_privateKey); + + // Get the user op hash + bytes32 userOpHash = _entryPoint.getUserOpHash(_op); + // Get the validator domain separator + bytes32 domainSeparator = stealthAddressValidator.getDomainSeperator(); + bytes32 typedMsgHash = keccak256( + abi.encodePacked( + "\x19\x01", domainSeparator, keccak256(abi.encode(USER_OP_TYPEHASH, owner, _op.sender, userOpHash)) + ) + ); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(_privateKey, typedMsgHash); + return abi.encodePacked(r, s, v); + } + + /// @notice The type hash used for kernel signature validation + bytes32 constant SIGNATURE_TYPEHASH = keccak256("KernelSignature(address owner,address kernelWallet,bytes32 hash)"); + + /// @dev Generate the signature for a given hash for a kernel account + function _generateHashSignature(bytes32 _hash, address _kernel, uint256 _privateKey) + internal + view + returns (bytes memory) + { + // Get the kernel private key owner address + address owner = vm.addr(_privateKey); + + // Get the validator domain separator + bytes32 domainSeparator = stealthAddressValidator.getDomainSeperator(); + bytes32 typedMsgHash = keccak256( + abi.encodePacked( + "\x19\x01", domainSeparator, keccak256(abi.encode(SIGNATURE_TYPEHASH, owner, _kernel, _hash)) + ) + ); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(_privateKey, typedMsgHash); + return abi.encodePacked(bytes1(0), r, s, v); + } + + /// @notice The parameter used in the elliptic curve + uint256 GX = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798; + uint256 GY = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8; + uint256 AA = 0; + uint256 PP = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F; + uint256 N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141; + + /// @dev Generate stealth address + function getStealthAddress(VmSafe.Wallet memory _ownerWallet, VmSafe.Wallet memory _ephemeralWallet) + public + view + returns (StealthAddressKey memory) + { + (uint256 ephemeralPub, uint256 ephemeralPrefix) = + (_ephemeralWallet.publicKeyX, _ephemeralWallet.publicKeyY % 2 + 2); + + (uint256 sharedSecretX, uint256 sharedSecretY) = + EllipticCurve.ecMul(_ephemeralWallet.privateKey, _ownerWallet.publicKeyX, _ownerWallet.publicKeyY, AA, PP); + uint256 hashSecret = uint256(keccak256(abi.encode(sharedSecretX, sharedSecretY))); + (uint256 pubX, uint256 pubY) = EllipticCurve.ecMul(hashSecret, GX, GY, AA, PP); + uint256 stealthPrivate = _ownerWallet.privateKey + hashSecret % N; + (uint256 stealthPubX, uint256 stealthPubY) = + EllipticCurve.ecAdd(_ownerWallet.publicKeyX, _ownerWallet.publicKeyY, pubX, pubY, AA, PP); + address stealthAddress = address(uint160(uint256(keccak256(abi.encode(stealthPubX, stealthPubY))))); + (uint256 dhkx, uint256 dhky) = + EllipticCurve.ecMul(hashSecret, _ownerWallet.publicKeyX, _ownerWallet.publicKeyY, AA, PP); + return StealthAddressKey( + stealthAddress, + stealthPubX, + dhkx, + uint8(stealthPubY % 2 + 2), + uint8(dhky % 2 + 2), + ephemeralPub, + uint8(ephemeralPrefix), + hashSecret, + stealthPrivate + ); + } + + function getAggregatedSignature(bytes32 _hash, Vm.Wallet memory _wallet) internal view returns (bytes memory) { + StealthAddressKey memory stelathAddressKey = getStealthAddress(_wallet, ephemeralWallet); + (, bytes32 r, bytes32 s) = vm.sign(_wallet.privateKey, _hash); + uint256 numR = uint256(r); + uint256 numS = uint256(s); + + // aggregatedSig = numS * (stelathAddressKey.hashSecret * numR + typedMsgHash) + bytes32 aggregatedSig = bytes32( + FixedPointMathLib.rawMulMod( + FixedPointMathLib.rawAddMod( + FixedPointMathLib.rawMulMod(stelathAddressKey.hashSecret, numR, N), uint256(_hash), N + ), + numS, + N + ) + ); + + return abi.encodePacked(bytes1(uint8(1)), r, aggregatedSig); + } +} From 09262304b07f8247eb971d1ab6d8293146ce999a Mon Sep 17 00:00:00 2001 From: leekt Date: Mon, 22 Jan 2024 02:33:45 +0900 Subject: [PATCH 02/36] added modular permission --- index.ts | 1 - script/postpack-contracts-package.sh | 4 - script/prepack-contracts-package.sh | 13 - .../modularPermission/CountPolicy.sol | 43 +++ src/validator/modularPermission/IPolicy.sol | 18 ++ src/validator/modularPermission/ISigner.sol | 13 + .../ModularPermissionValidator.sol | 260 ++++++++++++++++++ 7 files changed, 334 insertions(+), 18 deletions(-) delete mode 100644 index.ts delete mode 100755 script/postpack-contracts-package.sh delete mode 100755 script/prepack-contracts-package.sh create mode 100644 src/validator/modularPermission/CountPolicy.sol create mode 100644 src/validator/modularPermission/IPolicy.sol create mode 100644 src/validator/modularPermission/ISigner.sol create mode 100644 src/validator/modularPermission/ModularPermissionValidator.sol diff --git a/index.ts b/index.ts deleted file mode 100644 index c9f6f047..00000000 --- a/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './types' diff --git a/script/postpack-contracts-package.sh b/script/postpack-contracts-package.sh deleted file mode 100755 index b034efc6..00000000 --- a/script/postpack-contracts-package.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -xe -#echo postpack for "contracts" package -rm -rf artifacts-selected types dist - diff --git a/script/prepack-contracts-package.sh b/script/prepack-contracts-package.sh deleted file mode 100755 index 2d46f0fc..00000000 --- a/script/prepack-contracts-package.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -xe -#echo prepack for "contracts" package - -npx hardhat clean -npx hardhat compile - - -rm -rf artifacts-selected types dist - -mkdir -p artifacts-selected -cp `find ./artifacts/src ./artifacts/lib -type f | grep -v -E 'Test|dbg|bls|IOracle'` artifacts-selected -npx typechain --target ethers-v5 --out-dir types artifacts-selected/** -npx tsc index.ts -d --outDir dist diff --git a/src/validator/modularPermission/CountPolicy.sol b/src/validator/modularPermission/CountPolicy.sol new file mode 100644 index 00000000..71491279 --- /dev/null +++ b/src/validator/modularPermission/CountPolicy.sol @@ -0,0 +1,43 @@ +import "./IPolicy.sol"; +import "src/common/Types.sol"; +struct Count { + uint128 current; + uint128 allowed; +} + +contract CountPolicy is IPolicy { + address public immutable permissionValidator; + constructor(address _permissionValidator) { + permissionValidator = _permissionValidator; + } + + mapping(bytes32 permissionId => mapping(address kernel => Count)) public counts; + + function registerPolicy(address kernel, bytes32 permissionId, bytes calldata policyData) external payable override { + require(policyData.length == 16, "Invalid policy data"); + uint128 allowed = uint128(bytes16(policyData[0:16])); + counts[permissionId][kernel].allowed = allowed; + } + + function validatePolicy(address kernel, bytes32 permissionId, UserOperation calldata userOp, bytes calldata proofAndSig) + external + payable + override + returns (ValidationData, uint256 consumedSignatureLength) + { + Count storage count = counts[permissionId][kernel]; + require(count.current < count.allowed, "Permission revoked"); + count.current++; + return (packValidationData(ValidAfter.wrap(0), ValidUntil.wrap(0)), 0); + } + + function validateSignature( + address kernel, + address caller, + bytes32 permissionId, + bytes32 messageHash, + bytes calldata signature + ) external view override returns (ValidationData, uint256 consumedSignatureLength) { + revert("not implemented"); + } +} \ No newline at end of file diff --git a/src/validator/modularPermission/IPolicy.sol b/src/validator/modularPermission/IPolicy.sol new file mode 100644 index 00000000..e5dca3f4 --- /dev/null +++ b/src/validator/modularPermission/IPolicy.sol @@ -0,0 +1,18 @@ +pragma solidity ^0.8.0; +import {ValidationData} from "src/common/Types.sol"; +import {UserOperation} from "I4337/interfaces/UserOperation.sol"; + +interface IPolicy { + function registerPolicy(address kernel, bytes32 permissionId, bytes calldata policyData) external payable; + function validatePolicy(address kernel, bytes32 permissionId, UserOperation calldata userOp, bytes calldata proofAndSig) + external + payable + returns (ValidationData, uint256 consumedSignatureLength); + function validateSignature( + address kernel, + address caller, + bytes32 permissionId, + bytes32 messageHash, + bytes calldata signature + ) external view returns (ValidationData, uint256 consumedSignatureLength); +} diff --git a/src/validator/modularPermission/ISigner.sol b/src/validator/modularPermission/ISigner.sol new file mode 100644 index 00000000..46b8a1b5 --- /dev/null +++ b/src/validator/modularPermission/ISigner.sol @@ -0,0 +1,13 @@ +pragma solidity ^0.8.0; +import {ValidationData} from "src/common/Types.sol"; +interface ISigner { + function registerSigner(address kernel, bytes32 permissionId, bytes calldata signerData) external payable; + function validateUserOp(address kernel, bytes32 permissionId, bytes32 userOpHash, bytes calldata signature) + external + payable + returns (ValidationData); + function validateSignature(address kernel, bytes32 permissionId, bytes32 messageHash, bytes calldata signature) + external + view + returns (ValidationData); +} \ No newline at end of file diff --git a/src/validator/modularPermission/ModularPermissionValidator.sol b/src/validator/modularPermission/ModularPermissionValidator.sol new file mode 100644 index 00000000..db20273f --- /dev/null +++ b/src/validator/modularPermission/ModularPermissionValidator.sol @@ -0,0 +1,260 @@ +pragma solidity ^0.8.0; + +import {UserOperation} from "I4337/interfaces/UserOperation.sol"; +import {ValidationData} from "src/common/Types.sol"; +import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; +import {IKernelValidator} from "src/interfaces/IKernelValidator.sol"; +import {ISigner} from "./ISigner.sol"; +import {IPolicy} from "./IPolicy.sol"; + +// permission should handle the flag of following +// - check if permission is allowed to sign arbitrary signature, notice this is view so this cannot guarantee if signature is used +// - check if permission is allowed to call function directly +// - if aggregator address is returned from policy.validatePolicy, DO NOT invoke signer, delegate signer role to aggregator instead => CHECK is this safe??? +// - TODO : test this is aggregator can be setup as signer +// - if no policy is defined, should bypass policy +// - if no signer is defined, revert +// - if nonce is revoked, and policy is not 0, revert +// note that nonce revokation revokes all permissions that has lower nonce than revoked nonce +// - if nonce is revoked, and policy is 0, do not revert, this will act as sudo permission +// note that permissionId revokation should be considered revoked +// Policy should handle followings +// - check if permission is allowed to sign userOp with/without the gas spent by user +// - check if permission is allowed to sign given signature +// - check if permission is allowed to call function directly +// - return aggregator address if needed +// Signer should handle followings +// - check if userOpHash is signed +// - check msgHash is signed +// - note that checking signature prefix, checking replay attack should not be handled by signer +// - this remains responsibility of app / kernel +struct Permission { + uint128 nonce; + uint128 status; // status == 0 => revoked, status == 1 => active + uint48 validAfter; + uint48 validUntil; + ISigner signer; + IPolicy firstPolicy; +} + +struct Nonce { + uint128 latest; + uint128 revoked; +} + +/* +eth_requestPermissions +Request +{ + "type": "call", + "data" : [{ + "to": "
", + "amount": "", + "data" : "", + }], + "gas" : "sponsored | not sponsored | max priority fee limit, preVerificationGas limit" + "validUntil" : "", + "validAfter" : "", + "signer" : { + "address" : "", + "data" : "" + } +} +{ + "type" : "erc20", + "data" : [{ + "amount" : "", + }] + "gas" : "sponsored | not sponsored | max priority fee limit, preVerificationGas limit" + "validUntil" : "", + "validAfter" : "", + "signer" : { + "address" : "", + "data" : "" + } +} +Response +{ + "permissionId": "", + "nonce": "", + "validAfter": "", + "validUntil": "", + +} +eth_requestPolicyProof +Request +{ + "permissionId": "", + "userOperation": "", +} +Response +{ + "proof": "" +} +*/ + +contract PermissionValidator is IKernelValidator { + mapping(bytes32 permissionId => mapping(address kernel => Permission)) public permissions; + mapping(bytes32 permissionId => mapping(IPolicy policy => mapping(address kernel => IPolicy))) public nextPolicy; + mapping(address kernel => Nonce) public nonces; + + event PermissionRegistered(address kernel, bytes32 permissionId); + event PermissionRevoked(address kernel, bytes32 permissionId); + event NonceRevoked(address kernel, uint256 nonce); + + function getPermissionId( + uint256 nonce, + uint48 validAfter, + uint48 validUntil, + ISigner signer, + IPolicy[] calldata _permissions, + bytes calldata signerData, + bytes[] calldata permissionData + ) external pure returns (bytes32) { + return + keccak256(abi.encode(nonce, validAfter, validUntil, signer,_permissions, signerData, permissionData)); + } + + function enable(bytes calldata data) external payable { + uint128 nonce = uint128(bytes16(data[0:16])); + uint48 validAfter = uint48(bytes6(data[16:22])); + uint48 validUntil = uint48(bytes6(data[22:28])); + ISigner signer = ISigner(address(bytes20(data[28:48]))); + IPolicy[] calldata policies; + bytes calldata signerData; + bytes[] calldata policyData; + assembly { + policies.offset := add(data.offset, calldataload(add(data.offset, 48))) + policies.length := calldataload(policies.offset) + signerData.offset := add(data.offset, calldataload(add(data.offset, 80))) + signerData.length := calldataload(signerData.offset) + policyData.offset := add(data.offset, calldataload(add(data.offset, 112))) + policyData.length := calldataload(policyData.offset) + } + registerPermission(nonce, validAfter, validUntil, signer, policies, signerData, policyData); + } + + function registerPermission( + uint128 nonce, + uint48 validAfter, + uint48 validUntil, + ISigner signer, + IPolicy[] calldata policy, + bytes calldata signerData, + bytes[] calldata policyData + ) public payable { + bytes32 permissionId = keccak256( + abi.encode(msg.sender, nonce, validAfter, validUntil, signer, policy, signerData, policyData) + ); + + for(uint256 i = 0; i < policy.length; i++) { + policy[i].registerPolicy(msg.sender, permissionId, policyData[i]); + } + signer.registerSigner(msg.sender, permissionId, signerData); + + IPolicy firstPolicy = policy[0]; // NOTE : policy should not be empty array + permissions[permissionId][msg.sender] = Permission(nonce, 1, validAfter, validUntil, signer, firstPolicy); + for(uint256 i = 1; i < policy.length; i++) { + nextPolicy[permissionId][policy[i-1]][msg.sender] = policy[i]; + } + emit PermissionRegistered(msg.sender, permissionId); + } + + function disable(bytes calldata data) external payable { + if (data.length == 32) { + revokePermission(bytes32(data)); + } else { + revokePermission(uint128(bytes16(data))); + } + } + + function revokePermission(bytes32 permissionId) public payable { + permissions[permissionId][msg.sender].status = 0; + emit PermissionRevoked(msg.sender, permissionId); + } + + function revokePermission(uint128 nonce) public payable { + nonces[msg.sender].revoked = nonce; + emit NonceRevoked(msg.sender, nonce); + } + + function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) + external + payable + returns (ValidationData validationData) + { + require(_userOp.sender == msg.sender, "sender must be msg.sender"); + bytes32 permissionId = bytes32(_userOp.signature[0:32]); + if(address(permissions[permissionId][msg.sender].firstPolicy) != address(0) && permissions[permissionId][msg.sender].nonce < nonces[msg.sender].revoked) { + return SIG_VALIDATION_FAILED; + } + Permission memory permission = permissions[permissionId][msg.sender]; + IPolicy policy = permission.firstPolicy; + uint256 cursor = 32; + while(address(policy) != address(0)) { + (ValidationData policyValidation, uint256 sigOffset) = + policy.validatePolicy(msg.sender, permissionId, _userOp, _userOp.signature[cursor:] ); + // DO validationdata merge + policy = nextPolicy[permissionId][policy][msg.sender]; + cursor += sigOffset; + } + ValidationData signatureValidation = + permission.signer.validateUserOp(msg.sender, permissionId, _userOpHash, _userOp.signature[cursor:]); + // DO validationdata merge + return signatureValidation; + } + + function validCaller(address caller, bytes calldata data) + external + pure // TODO: this will turn non-view from 2.4 + override + returns (bool) + { + revert("not implemented"); + } + + struct ValidationSigMemory { + bytes32 permissionId; + uint256 cursor; + IPolicy policy; + } + + function validateSignature(bytes32 hash, bytes calldata signature) + external + view + override + returns (ValidationData) + { + ValidationSigMemory memory sigMemory; + sigMemory.permissionId = bytes32(signature[0:32]); + Permission memory permission = permissions[sigMemory.permissionId][msg.sender]; + // signature should be packed with + // (permissionId, rawMessage, [proof || signature]) + + bytes calldata proofAndSignature; //) = abi.decode(signature[32:], (bytes, bytes)); + { + bytes calldata rawMessage; + assembly { + rawMessage.offset := add(signature.offset, calldataload(add(signature.offset, 32))) + rawMessage.length := calldataload(rawMessage.offset) + proofAndSignature.offset := add(signature.offset, calldataload(add(signature.offset, 64))) + proofAndSignature.length := calldataload(proofAndSignature.offset) + } + require(hash == keccak256(rawMessage)); + } + + sigMemory.cursor = 0; + sigMemory.policy = permission.firstPolicy; + while(address(sigMemory.policy) != address(0)) { + (ValidationData policyValidation, uint256 sigOffset) = + sigMemory.policy.validateSignature(msg.sender, msg.sender, sigMemory.permissionId, hash, proofAndSignature[sigMemory.cursor:]); + // DO validationdata merge + sigMemory.policy = nextPolicy[sigMemory.permissionId][sigMemory.policy][msg.sender]; + sigMemory.cursor += sigOffset; + } + ValidationData signatureValidation = + permission.signer.validateSignature(msg.sender, sigMemory.permissionId, hash, proofAndSignature[sigMemory.cursor:]); + // DO validationdata merge + return signatureValidation; + } +} \ No newline at end of file From 614bbb1ed8c058a0387b3018287f5f86e76c02a0 Mon Sep 17 00:00:00 2001 From: leekt Date: Mon, 22 Jan 2024 02:33:57 +0900 Subject: [PATCH 03/36] fmt --- .../modularPermission/CountPolicy.sol | 22 ++++++---- src/validator/modularPermission/IPolicy.sol | 11 +++-- src/validator/modularPermission/ISigner.sol | 4 +- .../ModularPermissionValidator.sol | 41 ++++++++++--------- 4 files changed, 46 insertions(+), 32 deletions(-) diff --git a/src/validator/modularPermission/CountPolicy.sol b/src/validator/modularPermission/CountPolicy.sol index 71491279..5a0bb471 100644 --- a/src/validator/modularPermission/CountPolicy.sol +++ b/src/validator/modularPermission/CountPolicy.sol @@ -1,5 +1,6 @@ import "./IPolicy.sol"; import "src/common/Types.sol"; + struct Count { uint128 current; uint128 allowed; @@ -7,24 +8,29 @@ struct Count { contract CountPolicy is IPolicy { address public immutable permissionValidator; + constructor(address _permissionValidator) { permissionValidator = _permissionValidator; } mapping(bytes32 permissionId => mapping(address kernel => Count)) public counts; - function registerPolicy(address kernel, bytes32 permissionId, bytes calldata policyData) external payable override { + function registerPolicy(address kernel, bytes32 permissionId, bytes calldata policyData) + external + payable + override + { require(policyData.length == 16, "Invalid policy data"); uint128 allowed = uint128(bytes16(policyData[0:16])); counts[permissionId][kernel].allowed = allowed; } - function validatePolicy(address kernel, bytes32 permissionId, UserOperation calldata userOp, bytes calldata proofAndSig) - external - payable - override - returns (ValidationData, uint256 consumedSignatureLength) - { + function validatePolicy( + address kernel, + bytes32 permissionId, + UserOperation calldata userOp, + bytes calldata proofAndSig + ) external payable override returns (ValidationData, uint256 consumedSignatureLength) { Count storage count = counts[permissionId][kernel]; require(count.current < count.allowed, "Permission revoked"); count.current++; @@ -40,4 +46,4 @@ contract CountPolicy is IPolicy { ) external view override returns (ValidationData, uint256 consumedSignatureLength) { revert("not implemented"); } -} \ No newline at end of file +} diff --git a/src/validator/modularPermission/IPolicy.sol b/src/validator/modularPermission/IPolicy.sol index e5dca3f4..11192c11 100644 --- a/src/validator/modularPermission/IPolicy.sol +++ b/src/validator/modularPermission/IPolicy.sol @@ -1,13 +1,16 @@ pragma solidity ^0.8.0; + import {ValidationData} from "src/common/Types.sol"; import {UserOperation} from "I4337/interfaces/UserOperation.sol"; interface IPolicy { function registerPolicy(address kernel, bytes32 permissionId, bytes calldata policyData) external payable; - function validatePolicy(address kernel, bytes32 permissionId, UserOperation calldata userOp, bytes calldata proofAndSig) - external - payable - returns (ValidationData, uint256 consumedSignatureLength); + function validatePolicy( + address kernel, + bytes32 permissionId, + UserOperation calldata userOp, + bytes calldata proofAndSig + ) external payable returns (ValidationData, uint256 consumedSignatureLength); function validateSignature( address kernel, address caller, diff --git a/src/validator/modularPermission/ISigner.sol b/src/validator/modularPermission/ISigner.sol index 46b8a1b5..4beb55a2 100644 --- a/src/validator/modularPermission/ISigner.sol +++ b/src/validator/modularPermission/ISigner.sol @@ -1,5 +1,7 @@ pragma solidity ^0.8.0; + import {ValidationData} from "src/common/Types.sol"; + interface ISigner { function registerSigner(address kernel, bytes32 permissionId, bytes calldata signerData) external payable; function validateUserOp(address kernel, bytes32 permissionId, bytes32 userOpHash, bytes calldata signature) @@ -10,4 +12,4 @@ interface ISigner { external view returns (ValidationData); -} \ No newline at end of file +} diff --git a/src/validator/modularPermission/ModularPermissionValidator.sol b/src/validator/modularPermission/ModularPermissionValidator.sol index db20273f..a1b222b8 100644 --- a/src/validator/modularPermission/ModularPermissionValidator.sol +++ b/src/validator/modularPermission/ModularPermissionValidator.sol @@ -111,8 +111,7 @@ contract PermissionValidator is IKernelValidator { bytes calldata signerData, bytes[] calldata permissionData ) external pure returns (bytes32) { - return - keccak256(abi.encode(nonce, validAfter, validUntil, signer,_permissions, signerData, permissionData)); + return keccak256(abi.encode(nonce, validAfter, validUntil, signer, _permissions, signerData, permissionData)); } function enable(bytes calldata data) external payable { @@ -143,19 +142,18 @@ contract PermissionValidator is IKernelValidator { bytes calldata signerData, bytes[] calldata policyData ) public payable { - bytes32 permissionId = keccak256( - abi.encode(msg.sender, nonce, validAfter, validUntil, signer, policy, signerData, policyData) - ); + bytes32 permissionId = + keccak256(abi.encode(msg.sender, nonce, validAfter, validUntil, signer, policy, signerData, policyData)); - for(uint256 i = 0; i < policy.length; i++) { + for (uint256 i = 0; i < policy.length; i++) { policy[i].registerPolicy(msg.sender, permissionId, policyData[i]); } signer.registerSigner(msg.sender, permissionId, signerData); - + IPolicy firstPolicy = policy[0]; // NOTE : policy should not be empty array permissions[permissionId][msg.sender] = Permission(nonce, 1, validAfter, validUntil, signer, firstPolicy); - for(uint256 i = 1; i < policy.length; i++) { - nextPolicy[permissionId][policy[i-1]][msg.sender] = policy[i]; + for (uint256 i = 1; i < policy.length; i++) { + nextPolicy[permissionId][policy[i - 1]][msg.sender] = policy[i]; } emit PermissionRegistered(msg.sender, permissionId); } @@ -185,15 +183,18 @@ contract PermissionValidator is IKernelValidator { { require(_userOp.sender == msg.sender, "sender must be msg.sender"); bytes32 permissionId = bytes32(_userOp.signature[0:32]); - if(address(permissions[permissionId][msg.sender].firstPolicy) != address(0) && permissions[permissionId][msg.sender].nonce < nonces[msg.sender].revoked) { + if ( + address(permissions[permissionId][msg.sender].firstPolicy) != address(0) + && permissions[permissionId][msg.sender].nonce < nonces[msg.sender].revoked + ) { return SIG_VALIDATION_FAILED; } Permission memory permission = permissions[permissionId][msg.sender]; IPolicy policy = permission.firstPolicy; uint256 cursor = 32; - while(address(policy) != address(0)) { + while (address(policy) != address(0)) { (ValidationData policyValidation, uint256 sigOffset) = - policy.validatePolicy(msg.sender, permissionId, _userOp, _userOp.signature[cursor:] ); + policy.validatePolicy(msg.sender, permissionId, _userOp, _userOp.signature[cursor:]); // DO validationdata merge policy = nextPolicy[permissionId][policy][msg.sender]; cursor += sigOffset; @@ -228,7 +229,7 @@ contract PermissionValidator is IKernelValidator { ValidationSigMemory memory sigMemory; sigMemory.permissionId = bytes32(signature[0:32]); Permission memory permission = permissions[sigMemory.permissionId][msg.sender]; - // signature should be packed with + // signature should be packed with // (permissionId, rawMessage, [proof || signature]) bytes calldata proofAndSignature; //) = abi.decode(signature[32:], (bytes, bytes)); @@ -245,16 +246,18 @@ contract PermissionValidator is IKernelValidator { sigMemory.cursor = 0; sigMemory.policy = permission.firstPolicy; - while(address(sigMemory.policy) != address(0)) { - (ValidationData policyValidation, uint256 sigOffset) = - sigMemory.policy.validateSignature(msg.sender, msg.sender, sigMemory.permissionId, hash, proofAndSignature[sigMemory.cursor:]); + while (address(sigMemory.policy) != address(0)) { + (ValidationData policyValidation, uint256 sigOffset) = sigMemory.policy.validateSignature( + msg.sender, msg.sender, sigMemory.permissionId, hash, proofAndSignature[sigMemory.cursor:] + ); // DO validationdata merge sigMemory.policy = nextPolicy[sigMemory.permissionId][sigMemory.policy][msg.sender]; sigMemory.cursor += sigOffset; } - ValidationData signatureValidation = - permission.signer.validateSignature(msg.sender, sigMemory.permissionId, hash, proofAndSignature[sigMemory.cursor:]); + ValidationData signatureValidation = permission.signer.validateSignature( + msg.sender, sigMemory.permissionId, hash, proofAndSignature[sigMemory.cursor:] + ); // DO validationdata merge return signatureValidation; } -} \ No newline at end of file +} From bfc652998cf108858c55bfa831fa0c454c8d6c3d Mon Sep 17 00:00:00 2001 From: leekt Date: Mon, 22 Jan 2024 22:07:43 +0900 Subject: [PATCH 04/36] synced dev --- plugins/src/p256/P256Validator.sol | 83 ----- .../stealthAddressValidator/EllipticCurve.sol | 328 ------------------ .../StealthAddressValidator.sol | 182 ---------- .../StealthAggreagteSignature.sol | 47 --- plugins/test/P256Validator.t.sol | 207 ----------- plugins/test/StealthAddressValidator.t.sol | 311 ----------------- test/foundry/KernelECDSA.t.sol | 4 +- 7 files changed, 2 insertions(+), 1160 deletions(-) delete mode 100644 plugins/src/p256/P256Validator.sol delete mode 100644 plugins/src/stealthAddressValidator/EllipticCurve.sol delete mode 100644 plugins/src/stealthAddressValidator/StealthAddressValidator.sol delete mode 100644 plugins/src/stealthAddressValidator/StealthAggreagteSignature.sol delete mode 100644 plugins/test/P256Validator.t.sol delete mode 100644 plugins/test/StealthAddressValidator.t.sol diff --git a/plugins/src/p256/P256Validator.sol b/plugins/src/p256/P256Validator.sol deleted file mode 100644 index 6fcc88c4..00000000 --- a/plugins/src/p256/P256Validator.sol +++ /dev/null @@ -1,83 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import {UserOperation} from "I4337/interfaces/UserOperation.sol"; -import {ECDSA} from "solady/utils/ECDSA.sol"; -import {IKernelValidator} from "src/interfaces/IKernelValidator.sol"; -import {ValidationData} from "src/common/Types.sol"; -import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; -import {P256} from "p256-verifier/P256.sol"; - -/// @title P256Validator -/// @notice This validator uses the P256 curve to validate signatures. -contract P256Validator is IKernelValidator { - /// @notice Emitted when a bad key is provided. - error BadKey(); - - /// @notice Emitted when the public key of a kernel is changed. - event P256PublicKeysChanged(address indexed kernel, PublicKey newKeys); - - /// @notice The P256 public key of a kernel. - struct PublicKey { - uint256 x; - uint256 y; - } - - /// @notice The P256 public keys of a kernel. - mapping(address kernel => PublicKey PublicKey) public p256PublicKey; - - /// @notice Enable this validator for a kernel account. - /// @dev The kernel account need to be the `msg.sender`. - /// @dev The public key is encoded as `abi.encode(PublicKey)` inside the data, so (uint256,uint256). - function enable(bytes calldata _data) external payable override { - PublicKey memory key = abi.decode(_data, (PublicKey)); - if (key.x == 0 || key.y == 0) { - revert BadKey(); - } - // Update the key (so a sstore) - p256PublicKey[msg.sender] = key; - // And emit the event - emit P256PublicKeysChanged(msg.sender, key); - } - - /// @notice Disable this validator for a kernel account. - /// @dev The kernel account need to be the `msg.sender`. - function disable(bytes calldata) external payable override { - delete p256PublicKey[msg.sender]; - } - - /// @notice Validate a user operation. - function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) - external - payable - override - returns (ValidationData validationData) - { - (uint256 r, uint256 s) = abi.decode(_userOp.signature, (uint256, uint256)); - PublicKey memory key = p256PublicKey[_userOp.sender]; - if (P256.verifySignature(_userOpHash, r, s, key.x, key.y)) { - return ValidationData.wrap(0); - } - return SIG_VALIDATION_FAILED; - } - - /// @notice Validate a signature. - function validateSignature(bytes32 hash, bytes calldata signature) - external - view - override - returns (ValidationData) - { - (uint256 r, uint256 s) = abi.decode(signature, (uint256, uint256)); - PublicKey memory key = p256PublicKey[msg.sender]; - if (P256.verifySignature(hash, r, s, key.x, key.y)) { - return ValidationData.wrap(0); - } - return SIG_VALIDATION_FAILED; - } - - function validCaller(address _caller, bytes calldata) external view override returns (bool) { - revert NotImplemented(); - } -} diff --git a/plugins/src/stealthAddressValidator/EllipticCurve.sol b/plugins/src/stealthAddressValidator/EllipticCurve.sol deleted file mode 100644 index 94a8eedf..00000000 --- a/plugins/src/stealthAddressValidator/EllipticCurve.sol +++ /dev/null @@ -1,328 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -/** - * @title Elliptic Curve Library - * @dev Library providing arithmetic operations over elliptic curves. - * This library does not check whether the inserted points belong to the curve - * `isOnCurve` function should be used by the library user to check the aforementioned statement. - * @author Witnet Foundation - */ -library EllipticCurve { - // Pre-computed constant for 2 ** 255 - uint256 private constant U255_MAX_PLUS_1 = - 57896044618658097711785492504343953926634992332820282019728792003956564819968; - - /// @dev Modular euclidean inverse of a number (mod p). - /// @param _x The number - /// @param _pp The modulus - /// @return q such that x*q = 1 (mod _pp) - function invMod(uint256 _x, uint256 _pp) internal pure returns (uint256) { - require(_x != 0 && _x != _pp && _pp != 0, "Invalid number"); - uint256 q = 0; - uint256 newT = 1; - uint256 r = _pp; - uint256 t; - while (_x != 0) { - t = r / _x; - (q, newT) = (newT, addmod(q, (_pp - mulmod(t, newT, _pp)), _pp)); - (r, _x) = (_x, r - t * _x); - } - - return q; - } - - /// @dev Modular exponentiation, b^e % _pp. - /// Source: https://github.com/androlo/standard-contracts/blob/master/contracts/src/crypto/ECCMath.sol - /// @param _base base - /// @param _exp exponent - /// @param _pp modulus - /// @return r such that r = b**e (mod _pp) - function expMod(uint256 _base, uint256 _exp, uint256 _pp) internal pure returns (uint256) { - require(_pp != 0, "EllipticCurve: modulus is zero"); - - if (_base == 0) return 0; - if (_exp == 0) return 1; - - uint256 r = 1; - uint256 bit = U255_MAX_PLUS_1; - assembly { - for {} gt(bit, 0) {} { - r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, bit)))), _pp) - r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, div(bit, 2))))), _pp) - r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, div(bit, 4))))), _pp) - r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, div(bit, 8))))), _pp) - bit := div(bit, 16) - } - } - - return r; - } - - /// @dev Converts a point (x, y, z) expressed in Jacobian coordinates to affine coordinates (x', y', 1). - /// @param _x coordinate x - /// @param _y coordinate y - /// @param _z coordinate z - /// @param _pp the modulus - /// @return (x', y') affine coordinates - function toAffine(uint256 _x, uint256 _y, uint256 _z, uint256 _pp) internal pure returns (uint256, uint256) { - uint256 zInv = invMod(_z, _pp); - uint256 zInv2 = mulmod(zInv, zInv, _pp); - uint256 x2 = mulmod(_x, zInv2, _pp); - uint256 y2 = mulmod(_y, mulmod(zInv, zInv2, _pp), _pp); - - return (x2, y2); - } - - /// @dev Derives the y coordinate from a compressed-format point x [[SEC-1]](https://www.secg.org/SEC1-Ver-1.0.pdf). - /// @param _prefix parity byte (0x02 even, 0x03 odd) - /// @param _x coordinate x - /// @param _aa constant of curve - /// @param _bb constant of curve - /// @param _pp the modulus - /// @return y coordinate y - function deriveY(uint8 _prefix, uint256 _x, uint256 _aa, uint256 _bb, uint256 _pp) - internal - pure - returns (uint256) - { - require(_prefix == 0x02 || _prefix == 0x03, "EllipticCurve:innvalid compressed EC point prefix"); - - // x^3 + ax + b - uint256 y2 = addmod(mulmod(_x, mulmod(_x, _x, _pp), _pp), addmod(mulmod(_x, _aa, _pp), _bb, _pp), _pp); - y2 = expMod(y2, (_pp + 1) / 4, _pp); - // uint256 cmp = yBit ^ y_ & 1; - uint256 y = (y2 + _prefix) % 2 == 0 ? y2 : _pp - y2; - - return y; - } - - /// @dev Check whether point (x,y) is on curve defined by a, b, and _pp. - /// @param _x coordinate x of P1 - /// @param _y coordinate y of P1 - /// @param _aa constant of curve - /// @param _bb constant of curve - /// @param _pp the modulus - /// @return true if x,y in the curve, false else - function isOnCurve(uint256 _x, uint256 _y, uint256 _aa, uint256 _bb, uint256 _pp) internal pure returns (bool) { - if (0 == _x || _x >= _pp || 0 == _y || _y >= _pp) { - return false; - } - // y^2 - uint256 lhs = mulmod(_y, _y, _pp); - // x^3 - uint256 rhs = mulmod(mulmod(_x, _x, _pp), _x, _pp); - if (_aa != 0) { - // x^3 + a*x - rhs = addmod(rhs, mulmod(_x, _aa, _pp), _pp); - } - if (_bb != 0) { - // x^3 + a*x + b - rhs = addmod(rhs, _bb, _pp); - } - - return lhs == rhs; - } - - /// @dev Calculate inverse (x, -y) of point (x, y). - /// @param _x coordinate x of P1 - /// @param _y coordinate y of P1 - /// @param _pp the modulus - /// @return (x, -y) - function ecInv(uint256 _x, uint256 _y, uint256 _pp) internal pure returns (uint256, uint256) { - return (_x, (_pp - _y) % _pp); - } - - /// @dev Add two points (x1, y1) and (x2, y2) in affine coordinates. - /// @param _x1 coordinate x of P1 - /// @param _y1 coordinate y of P1 - /// @param _x2 coordinate x of P2 - /// @param _y2 coordinate y of P2 - /// @param _aa constant of the curve - /// @param _pp the modulus - /// @return (qx, qy) = P1+P2 in affine coordinates - function ecAdd(uint256 _x1, uint256 _y1, uint256 _x2, uint256 _y2, uint256 _aa, uint256 _pp) - internal - pure - returns (uint256, uint256) - { - uint256 x = 0; - uint256 y = 0; - uint256 z = 0; - - // Double if x1==x2 else add - if (_x1 == _x2) { - // y1 = -y2 mod p - if (addmod(_y1, _y2, _pp) == 0) { - return (0, 0); - } else { - // P1 = P2 - (x, y, z) = jacDouble(_x1, _y1, 1, _aa, _pp); - } - } else { - (x, y, z) = jacAdd(_x1, _y1, 1, _x2, _y2, 1, _pp); - } - // Get back to affine - return toAffine(x, y, z, _pp); - } - - /// @dev Substract two points (x1, y1) and (x2, y2) in affine coordinates. - /// @param _x1 coordinate x of P1 - /// @param _y1 coordinate y of P1 - /// @param _x2 coordinate x of P2 - /// @param _y2 coordinate y of P2 - /// @param _aa constant of the curve - /// @param _pp the modulus - /// @return (qx, qy) = P1-P2 in affine coordinates - function ecSub(uint256 _x1, uint256 _y1, uint256 _x2, uint256 _y2, uint256 _aa, uint256 _pp) - internal - pure - returns (uint256, uint256) - { - // invert square - (uint256 x, uint256 y) = ecInv(_x2, _y2, _pp); - // P1-square - return ecAdd(_x1, _y1, x, y, _aa, _pp); - } - - /// @dev Multiply point (x1, y1, z1) times d in affine coordinates. - /// @param _k scalar to multiply - /// @param _x coordinate x of P1 - /// @param _y coordinate y of P1 - /// @param _aa constant of the curve - /// @param _pp the modulus - /// @return (qx, qy) = d*P in affine coordinates - function ecMul(uint256 _k, uint256 _x, uint256 _y, uint256 _aa, uint256 _pp) - internal - pure - returns (uint256, uint256) - { - // Jacobian multiplication - (uint256 x1, uint256 y1, uint256 z1) = jacMul(_k, _x, _y, 1, _aa, _pp); - // Get back to affine - return toAffine(x1, y1, z1, _pp); - } - - /// @dev Adds two points (x1, y1, z1) and (x2 y2, z2). - /// @param _x1 coordinate x of P1 - /// @param _y1 coordinate y of P1 - /// @param _z1 coordinate z of P1 - /// @param _x2 coordinate x of square - /// @param _y2 coordinate y of square - /// @param _z2 coordinate z of square - /// @param _pp the modulus - /// @return (qx, qy, qz) P1+square in Jacobian - function jacAdd(uint256 _x1, uint256 _y1, uint256 _z1, uint256 _x2, uint256 _y2, uint256 _z2, uint256 _pp) - internal - pure - returns (uint256, uint256, uint256) - { - if (_x1 == 0 && _y1 == 0) return (_x2, _y2, _z2); - if (_x2 == 0 && _y2 == 0) return (_x1, _y1, _z1); - - // We follow the equations described in https://pdfs.semanticscholar.org/5c64/29952e08025a9649c2b0ba32518e9a7fb5c2.pdf Section 5 - uint256[4] memory zs; // z1^2, z1^3, z2^2, z2^3 - zs[0] = mulmod(_z1, _z1, _pp); - zs[1] = mulmod(_z1, zs[0], _pp); - zs[2] = mulmod(_z2, _z2, _pp); - zs[3] = mulmod(_z2, zs[2], _pp); - - // u1, s1, u2, s2 - zs = [mulmod(_x1, zs[2], _pp), mulmod(_y1, zs[3], _pp), mulmod(_x2, zs[0], _pp), mulmod(_y2, zs[1], _pp)]; - - // In case of zs[0] == zs[2] && zs[1] == zs[3], double function should be used - require(zs[0] != zs[2] || zs[1] != zs[3], "Use jacDouble function instead"); - - uint256[4] memory hr; - //h - hr[0] = addmod(zs[2], _pp - zs[0], _pp); - //r - hr[1] = addmod(zs[3], _pp - zs[1], _pp); - //h^2 - hr[2] = mulmod(hr[0], hr[0], _pp); - // h^3 - hr[3] = mulmod(hr[2], hr[0], _pp); - // qx = -h^3 -2u1h^2+r^2 - uint256 qx = addmod(mulmod(hr[1], hr[1], _pp), _pp - hr[3], _pp); - qx = addmod(qx, _pp - mulmod(2, mulmod(zs[0], hr[2], _pp), _pp), _pp); - // qy = -s1*z1*h^3+r(u1*h^2 -x^3) - uint256 qy = mulmod(hr[1], addmod(mulmod(zs[0], hr[2], _pp), _pp - qx, _pp), _pp); - qy = addmod(qy, _pp - mulmod(zs[1], hr[3], _pp), _pp); - // qz = h*z1*z2 - uint256 qz = mulmod(hr[0], mulmod(_z1, _z2, _pp), _pp); - return (qx, qy, qz); - } - - /// @dev Doubles a points (x, y, z). - /// @param _x coordinate x of P1 - /// @param _y coordinate y of P1 - /// @param _z coordinate z of P1 - /// @param _aa the a scalar in the curve equation - /// @param _pp the modulus - /// @return (qx, qy, qz) 2P in Jacobian - function jacDouble(uint256 _x, uint256 _y, uint256 _z, uint256 _aa, uint256 _pp) - internal - pure - returns (uint256, uint256, uint256) - { - if (_z == 0) return (_x, _y, _z); - - // We follow the equations described in https://pdfs.semanticscholar.org/5c64/29952e08025a9649c2b0ba32518e9a7fb5c2.pdf Section 5 - // Note: there is a bug in the paper regarding the m parameter, M=3*(x1^2)+a*(z1^4) - // x, y, z at this point represent the squares of _x, _y, _z - uint256 x = mulmod(_x, _x, _pp); //x1^2 - uint256 y = mulmod(_y, _y, _pp); //y1^2 - uint256 z = mulmod(_z, _z, _pp); //z1^2 - - // s - uint256 s = mulmod(4, mulmod(_x, y, _pp), _pp); - // m - uint256 m = addmod(mulmod(3, x, _pp), mulmod(_aa, mulmod(z, z, _pp), _pp), _pp); - - // x, y, z at this point will be reassigned and rather represent qx, qy, qz from the paper - // This allows to reduce the gas cost and stack footprint of the algorithm - // qx - x = addmod(mulmod(m, m, _pp), _pp - addmod(s, s, _pp), _pp); - // qy = -8*y1^4 + M(S-T) - y = addmod(mulmod(m, addmod(s, _pp - x, _pp), _pp), _pp - mulmod(8, mulmod(y, y, _pp), _pp), _pp); - // qz = 2*y1*z1 - z = mulmod(2, mulmod(_y, _z, _pp), _pp); - - return (x, y, z); - } - - /// @dev Multiply point (x, y, z) times d. - /// @param _d scalar to multiply - /// @param _x coordinate x of P1 - /// @param _y coordinate y of P1 - /// @param _z coordinate z of P1 - /// @param _aa constant of curve - /// @param _pp the modulus - /// @return (qx, qy, qz) d*P1 in Jacobian - function jacMul(uint256 _d, uint256 _x, uint256 _y, uint256 _z, uint256 _aa, uint256 _pp) - internal - pure - returns (uint256, uint256, uint256) - { - // Early return in case that `_d == 0` - if (_d == 0) { - return (_x, _y, _z); - } - - uint256 remaining = _d; - uint256 qx = 0; - uint256 qy = 0; - uint256 qz = 1; - - // Double and add algorithm - while (remaining != 0) { - if ((remaining & 1) != 0) { - (qx, qy, qz) = jacAdd(qx, qy, qz, _x, _y, _z, _pp); - } - remaining = remaining / 2; - (_x, _y, _z) = jacDouble(_x, _y, _z, _aa, _pp); - } - return (qx, qy, qz); - } -} diff --git a/plugins/src/stealthAddressValidator/StealthAddressValidator.sol b/plugins/src/stealthAddressValidator/StealthAddressValidator.sol deleted file mode 100644 index 369a97b0..00000000 --- a/plugins/src/stealthAddressValidator/StealthAddressValidator.sol +++ /dev/null @@ -1,182 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {UserOperation} from "I4337/interfaces/UserOperation.sol"; -import {ECDSA} from "solady/utils/ECDSA.sol"; -import {EIP712} from "solady/utils/EIP712.sol"; -import {StealthAggreagteSignature} from "./StealthAggreagteSignature.sol"; -import {IKernelValidator} from "src/interfaces/IKernelValidator.sol"; -import {ValidationData} from "src/common/Types.sol"; -import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; - -/** - * @dev Storage structure for Stealth Address Registry Module. - * StealthPubkey, dhkey are used in aggregated signature. - * EphemeralPubkey is used to recover private key of stealth address. - */ -struct StealthAddressValidatorStorage { - uint256 stealthPubkey; - uint256 dhkey; - uint256 ephemeralPubkey; - address stealthAddress; - uint8 stealthPubkeyPrefix; - uint8 dhkeyPrefix; - uint8 ephemeralPrefix; -} - -/** - * @author Justin Zen - - * @title Stealth Address Validator for ZeroDev Kernel. - * @notice This validator uses the Stealth address to validate signatures. - */ -contract StealthAddressValidator is IKernelValidator, EIP712 { - /// @notice The type hash used for kernel user op validation - bytes32 constant USER_OP_TYPEHASH = - keccak256("AllowUserOp(address owner,address kernelWallet,bytes32 userOpHash)"); - /// @notice The type hash used for kernel signature validation - bytes32 constant SIGNATURE_TYPEHASH = - keccak256("KernelSignature(address owner,address kernelWallet,bytes32 hash)"); - - /// @notice Emitted when the stealth address of a kernel is changed. - event StealthAddressChanged( - address indexed kernel, address indexed oldStealthAddress, address indexed newStealthAddress - ); - - /* -------------------------------------------------------------------------- */ - /* Storage */ - /* -------------------------------------------------------------------------- */ - mapping(address => StealthAddressValidatorStorage) public stealthAddressValidatorStorage; - - /* -------------------------------------------------------------------------- */ - /* EIP-712 Methods */ - /* -------------------------------------------------------------------------- */ - - /// @dev Get the current name & version of the validator, used for the EIP-712 domain separator from Solady - function _domainNameAndVersion() internal pure override returns (string memory, string memory) { - return ("Kernel:StealthAddressValidator", "1.0.0"); - } - - /// @dev Tell to solady that the current name & version of the validator won't change, so no need to recompute the eip-712 domain separator - function _domainNameAndVersionMayChange() internal pure override returns (bool) { - return false; - } - - /// @dev Export the current domain seperator - function getDomainSeperator() public view returns (bytes32) { - return _domainSeparator(); - } - - /* -------------------------------------------------------------------------- */ - /* Kernel validator Methods */ - /* -------------------------------------------------------------------------- */ - - /// @dev Enable this validator for a given `kernel` (msg.sender) - function enable(bytes calldata _data) external payable override { - address stealthAddress = address(bytes20(_data[0:20])); - uint256 stealthAddressPubkey = uint256(bytes32(_data[20:52])); - uint256 stealthAddressDhkey = uint256(bytes32(_data[52:84])); - uint8 stealthAddressPubkeyPrefix = uint8(_data[84]); - uint8 stealthAddressDhkeyPrefix = uint8(_data[85]); - uint256 ephemeralPubkey = uint256(bytes32(_data[86:118])); - uint8 ephemeralPrefix = uint8(_data[118]); - - address oldStealthAddress = stealthAddressValidatorStorage[msg.sender].stealthAddress; - stealthAddressValidatorStorage[msg.sender] = StealthAddressValidatorStorage({ - stealthPubkey: stealthAddressPubkey, - dhkey: stealthAddressDhkey, - ephemeralPubkey: ephemeralPubkey, - stealthAddress: stealthAddress, - stealthPubkeyPrefix: stealthAddressPubkeyPrefix, - dhkeyPrefix: stealthAddressDhkeyPrefix, - ephemeralPrefix: ephemeralPrefix - }); - emit StealthAddressChanged(msg.sender, oldStealthAddress, stealthAddress); - } - - /// @dev Disable this validator for a given `kernel` (msg.sender) - function disable(bytes calldata) external payable override { - address stealthAddress; - delete stealthAddressValidatorStorage[msg.sender]; - emit StealthAddressChanged(msg.sender, stealthAddress, address(0)); - } - - /// @dev Validate a `_userOp` using a EIP-712 signature, signed by the owner of the kernel account who is the `_userOp` sender - function validateUserOp(UserOperation calldata _userOp, bytes32 _userOpHash, uint256) - external - payable - override - returns (ValidationData validationData) - { - bytes1 mode = _userOp.signature[0]; - StealthAddressValidatorStorage storage stealthData = stealthAddressValidatorStorage[_userOp.sender]; - address stealthAddress = stealthData.stealthAddress; - bytes32 typedDataHash = - _hashTypedData(keccak256(abi.encode(USER_OP_TYPEHASH, stealthAddress, _userOp.sender, _userOpHash))); - - // 0x00: signature from spending key - // 0x01: aggregated signature from owner and shared secret - if (mode == 0x00) { - return stealthAddress == ECDSA.recover(typedDataHash, _userOp.signature[1:]) - ? ValidationData.wrap(0) - : SIG_VALIDATION_FAILED; - } else if (mode == 0x01) { - return StealthAggreagteSignature.validateAggregatedSignature( - stealthData.stealthPubkey, - stealthData.dhkey, - stealthData.stealthPubkeyPrefix, - stealthData.dhkeyPrefix, - typedDataHash, - _userOp.signature[1:] - ) ? ValidationData.wrap(0) : SIG_VALIDATION_FAILED; - } else { - return SIG_VALIDATION_FAILED; - } - } - - /// @dev Validate a `_signature` of the `_hash` ofor the given `kernel` (msg.sender) - function validateSignature(bytes32 _hash, bytes calldata _signature) - external - view - override - returns (ValidationData validationData) - { - bytes1 mode = _signature[0]; - StealthAddressValidatorStorage storage stealthData = stealthAddressValidatorStorage[msg.sender]; - address stealthAddress = stealthData.stealthAddress; - bytes32 typedDataHash = - _hashTypedData(keccak256(abi.encode(SIGNATURE_TYPEHASH, stealthAddress, msg.sender, _hash))); - - // 0x00: signature from spending key - // 0x01: aggregated signature from owner and shared secret - if (mode == 0x00) { - return stealthAddress == ECDSA.recover(typedDataHash, _signature[1:]) - ? ValidationData.wrap(0) - : SIG_VALIDATION_FAILED; - } else if (mode == 0x01) { - return StealthAggreagteSignature.validateAggregatedSignature( - stealthData.stealthPubkey, - stealthData.dhkey, - stealthData.stealthPubkeyPrefix, - stealthData.dhkeyPrefix, - typedDataHash, - _signature[1:] - ) ? ValidationData.wrap(0) : SIG_VALIDATION_FAILED; - } else { - return SIG_VALIDATION_FAILED; - } - } - - /// @dev Check if the caller is a valid signer for this kernel account - function validCaller(address _caller, bytes calldata) external view override returns (bool) { - return stealthAddressValidatorStorage[msg.sender].stealthAddress == _caller; - } - - /* -------------------------------------------------------------------------- */ - /* Public view methods */ - /* -------------------------------------------------------------------------- */ - - /// @dev Get the owner of a given `kernel` - function getOwner(address _kernel) public view returns (address) { - return stealthAddressValidatorStorage[_kernel].stealthAddress; - } -} diff --git a/plugins/src/stealthAddressValidator/StealthAggreagteSignature.sol b/plugins/src/stealthAddressValidator/StealthAggreagteSignature.sol deleted file mode 100644 index d184a5f7..00000000 --- a/plugins/src/stealthAddressValidator/StealthAggreagteSignature.sol +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {EllipticCurve} from "./EllipticCurve.sol"; - -library StealthAggreagteSignature { - uint256 public constant GX = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798; - uint256 public constant GY = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8; - uint256 public constant AA = 0; - uint256 public constant BB = 7; - uint256 public constant PP = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F; - uint256 public constant N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141; - - function validateAggregatedSignature( - uint256 _pubkey, - uint256 _dhkey, - uint8 _pubkeyPrefix, - uint8 _dhkeyPrefix, - bytes32 _message, - bytes calldata _signature - ) external pure returns (bool) { - uint256 aggh2; - uint256 aggpb; - uint256 aggdh; - - uint256 sigr = uint256(bytes32(_signature[0:32])); - uint256 sigs = uint256(bytes32(_signature[32:64])); - uint256 sinv = EllipticCurve.invMod(sigs, N); - uint256 num_message = uint256(_message); - - assembly { - aggh2 := mulmod(mulmod(sinv, num_message, N), num_message, N) - aggpb := mulmod(mulmod(sinv, sigr, N), num_message, N) - aggdh := mulmod(mulmod(sinv, sigr, N), sigr, N) - } - (uint256 p1x, uint256 p1y) = EllipticCurve.ecMul(aggh2, GX, GY, AA, PP); - uint256 pubY = EllipticCurve.deriveY(_pubkeyPrefix, _pubkey, AA, BB, PP); - uint256 pubdhY = EllipticCurve.deriveY(_dhkeyPrefix, _dhkey, AA, BB, PP); - - (uint256 p2x, uint256 p2y) = EllipticCurve.ecMul(aggpb, _pubkey, pubY, AA, PP); - (uint256 p3x, uint256 p3y) = EllipticCurve.ecMul(aggdh, _dhkey, pubdhY, AA, PP); - (uint256 aggp1x, uint256 aggp1y) = EllipticCurve.ecAdd(p1x, p1y, p2x, p2y, AA, PP); - (uint256 aggpx,) = EllipticCurve.ecAdd(aggp1x, aggp1y, p3x, p3y, AA, PP); - - return aggpx % N == sigr; - } -} diff --git a/plugins/test/P256Validator.t.sol b/plugins/test/P256Validator.t.sol deleted file mode 100644 index 9d22e42b..00000000 --- a/plugins/test/P256Validator.t.sol +++ /dev/null @@ -1,207 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IEntryPoint} from "I4337/interfaces/IEntryPoint.sol"; -import "src/Kernel.sol"; -// test artifacts -// test utils -import "forge-std/Test.sol"; -import {ERC4337Utils} from "test/foundry/utils/ERC4337Utils.sol"; -import {KernelTestBase} from "test/foundry/KernelTestBase.sol"; -import {TestExecutor} from "test/foundry/mock/TestExecutor.sol"; -import {TestValidator} from "test/foundry/mock/TestValidator.sol"; -import {P256Validator} from "src/validator/P256Validator.sol"; -import {P256Verifier} from "p256-verifier/P256Verifier.sol"; -import {P256} from "p256-verifier/P256.sol"; -import {FCL_ecdsa_utils} from "FreshCryptoLib/FCL_ecdsa_utils.sol"; -import {IKernel} from "src/interfaces/IKernel.sol"; - -using ERC4337Utils for IEntryPoint; - -contract P256ValidatorTest is KernelTestBase { - P256Verifier p256Verifier; - P256Validator p256Validator; - - // Curve order (number of points) - uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; - - uint256 x; - uint256 y; - - function setUp() public { - p256Validator = new P256Validator(); - p256Verifier = new P256Verifier(); - - vm.etch(0xc2b78104907F722DABAc4C69f826a522B2754De4, address(p256Verifier).code); - - _initialize(); - (x, y) = generatePublicKey(ownerKey); - _setAddress(); - _setExecutionDetail(); - } - - function _setExecutionDetail() internal virtual override { - executionDetail.executor = address(new TestExecutor()); - executionSig = TestExecutor.doNothing.selector; - executionDetail.validator = new TestValidator(); - } - - function getValidatorSignature(UserOperation memory _op) internal view virtual override returns (bytes memory) { - bytes32 hash = entryPoint.getUserOpHash(_op); - (uint256 r, uint256 s) = generateSignature(ownerKey, ECDSA.toEthSignedMessageHash(hash)); - return abi.encodePacked(bytes4(0x00000000), abi.encode(r, s)); - } - - function getOwners() internal virtual override returns (address[] memory _owners) { - _owners = new address[](1); - _owners[0] = address(0); - return _owners; - } - - function getEnableData() internal view virtual override returns (bytes memory) { - return ""; - } - - function getInitializeData() internal view override returns (bytes memory) { - return abi.encodeWithSelector(KernelStorage.initialize.selector, p256Validator, abi.encode(x, y)); - } - - function test_default_validator_enable() external override { - UserOperation memory op = buildUserOperation( - abi.encodeWithSelector( - IKernel.execute.selector, - address(p256Validator), - 0, - abi.encodeWithSelector(P256Validator.enable.selector, abi.encode(x, y)), - Operation.Call - ) - ); - performUserOperationWithSig(op); - (uint256 x2, uint256 y2) = P256Validator(address(p256Validator)).p256PublicKey(address(kernel)); - verifyPublicKey(x2, y2, x, y); - } - - function test_default_validator_disable() external override { - UserOperation memory op = buildUserOperation( - abi.encodeWithSelector( - IKernel.execute.selector, - address(p256Validator), - 0, - abi.encodeWithSelector(P256Validator.disable.selector, ""), - Operation.Call - ) - ); - performUserOperationWithSig(op); - (uint256 x2, uint256 y2) = P256Validator(address(p256Validator)).p256PublicKey(address(kernel)); - verifyPublicKey(x2, y2, 0, 0); - } - - function test_external_call_batch_execute_success() external override { - vm.skip(true); - } - - function test_external_call_execute_success() external override { - vm.skip(true); - } - - function test_external_call_execute_delegatecall_success() external override { - vm.skip(true); - } - - function test_external_call_execute_delegatecall_fail() external override { - vm.skip(true); - } - - function test_external_call_default() external override { - vm.skip(true); - } - - function test_external_call_execution() external override { - vm.skip(true); - } - - function generatePublicKey(uint256 privateKey) internal view returns (uint256, uint256) { - return FCL_ecdsa_utils.ecdsa_derivKpub(privateKey); - } - - function generateSignature(uint256 privateKey, bytes32 hash) internal view returns (uint256 r, uint256 s) { - // Securely generate a random k value for each signature - uint256 k = uint256(keccak256(abi.encodePacked(hash, block.timestamp, block.difficulty, privateKey))) % n; - while (k == 0) { - k = uint256(keccak256(abi.encodePacked(k))) % n; - } - - // Generate the signature using the k value and the private key - (r, s) = FCL_ecdsa_utils.ecdsa_sign(hash, k, privateKey); - - // Ensure that s is in the lower half of the range [1, n-1] - if (r == 0 || s == 0 || s > P256.P256_N_DIV_2) { - s = n - s; // If s is in the upper half, use n - s instead - } - - return (r, s); - } - - function test_utils(uint256 privateKey, bytes32 hash) external { - vm.assume(hash != 0); - vm.assume(privateKey != 0); - (uint256 x1, uint256 y1) = generatePublicKey(privateKey); - (uint256 r, uint256 s) = generateSignature(privateKey, hash); - - vm.assume(x1 != 0); - vm.assume(y1 != 0); - vm.assume(r != 0); - vm.assume(s < P256.P256_N_DIV_2); - assertEq(P256.verifySignature(hash, r, s, x1, y1), true); - } - - function test_validate_signature() external override { - Kernel kernel2 = Kernel(payable(factory.createAccount(address(kernelImpl), getInitializeData(), 3))); - bytes32 hash = keccak256(abi.encodePacked("hello world")); - - bytes32 digest = keccak256( - abi.encodePacked( - "\x19\x01", ERC4337Utils._buildDomainSeparator(KERNEL_NAME, KERNEL_VERSION, address(kernel)), hash - ) - ); - - (uint256 r, uint256 s) = generateSignature(ownerKey, digest); - - assertEq(kernel.isValidSignature(hash, abi.encode(r, s)), Kernel.isValidSignature.selector); - assertEq(kernel2.isValidSignature(hash, abi.encode(r, s)), bytes4(0xffffffff)); - } - - function test_fail_validate_wrongsignature() external override { - bytes32 hash = keccak256(abi.encodePacked("hello world")); - bytes memory sig = getWrongSignature(hash); - assertEq(kernel.isValidSignature(hash, sig), bytes4(0xffffffff)); - } - - function signUserOp(UserOperation memory op) internal view override returns (bytes memory) { - bytes32 hash = entryPoint.getUserOpHash(op); - (uint256 r, uint256 s) = generateSignature(ownerKey, hash); - return abi.encodePacked(bytes4(0x00000000), abi.encode(r, s)); - } - - function getWrongSignature(UserOperation memory op) internal view override returns (bytes memory) { - bytes32 hash = entryPoint.getUserOpHash(op); - (uint256 r, uint256 s) = generateSignature(ownerKey + 1, hash); - return abi.encodePacked(bytes4(0x00000000), abi.encode(r, s)); - } - - function signHash(bytes32 hash) internal view override returns (bytes memory) { - (uint256 r, uint256 s) = generateSignature(ownerKey, hash); - - return abi.encode(r, s); - } - - function getWrongSignature(bytes32 hash) internal view override returns (bytes memory) { - (uint256 r, uint256 s) = generateSignature(ownerKey + 1, ECDSA.toEthSignedMessageHash(hash)); - return abi.encode(r, s); - } - - function verifyPublicKey(uint256 actualX, uint256 actualY, uint256 expectedX, uint256 expectedY) internal { - assertEq(actualX, expectedX, "Public key X component mismatch"); - assertEq(actualY, expectedY, "Public key Y component mismatch"); - } -} diff --git a/plugins/test/StealthAddressValidator.t.sol b/plugins/test/StealthAddressValidator.t.sol deleted file mode 100644 index c989f348..00000000 --- a/plugins/test/StealthAddressValidator.t.sol +++ /dev/null @@ -1,311 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {FixedPointMathLib} from "solady/utils/FixedPointMathLib.sol"; -import "src/Kernel.sol"; -import {EllipticCurve} from "src/validator/stealthAddressValidator/EllipticCurve.sol"; -import {IKernel} from "src/interfaces/IKernel.sol"; -import {StealthAddressValidator} from "src/validator/stealthAddressValidator/StealthAddressValidator.sol"; -// test utils -import {KernelTestBase} from "test/foundry/KernelTestBase.sol"; -import {TestExecutor} from "test/foundry/mock/TestExecutor.sol"; -import {TestValidator} from "test/foundry/mock/TestValidator.sol"; -import "forge-std/Vm.sol"; - -struct StealthAddressKey { - address stealthAddress; - uint256 stealthPub; - uint256 dhPub; - uint8 stealthPrefix; - uint8 dhPrefix; - uint256 ephemeralPub; - uint8 ephemeralPrefix; - uint256 hashSecret; - uint256 stealthPrivate; -} - -contract StealthAddressValidatorTest is KernelTestBase { - StealthAddressValidator private stealthAddressValidator; - VmSafe.Wallet private wallet; - VmSafe.Wallet private ephemeralWallet; - uint256 private stealthPrivateKey; - - function setUp() public { - _initialize(); - wallet = vm.createWallet(uint256(keccak256(bytes("owner")))); - ephemeralWallet = vm.createWallet(uint256(keccak256(bytes("ephemeral")))); - - StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); - owner = stealthAddressKey.stealthAddress; - ownerKey = stealthAddressKey.stealthPrivate; - stealthAddressValidator = new StealthAddressValidator(); - defaultValidator = stealthAddressValidator; - _setAddress(); - _setExecutionDetail(); - } - - function _setExecutionDetail() internal virtual override { - executionDetail.executor = address(new TestExecutor()); - executionSig = TestExecutor.doNothing.selector; - executionDetail.validator = new TestValidator(); - } - - function getEnableData() internal view virtual override returns (bytes memory) { - return ""; - } - - function getValidatorSignature(UserOperation memory) internal view virtual override returns (bytes memory) { - return ""; - } - - function getOwners() internal view override returns (address[] memory) { - address[] memory owners = new address[](1); - owners[0] = owner; - return owners; - } - - function getInitializeData() internal view override returns (bytes memory) { - StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); - return abi.encodeWithSelector( - KernelStorage.initialize.selector, - defaultValidator, - abi.encodePacked( - stealthAddressKey.stealthAddress, - stealthAddressKey.stealthPub, - stealthAddressKey.dhPub, - stealthAddressKey.stealthPrefix, - stealthAddressKey.dhPrefix, - stealthAddressKey.ephemeralPub, - stealthAddressKey.ephemeralPrefix - ) - ); - } - - function signUserOp(UserOperation memory op) internal view override returns (bytes memory) { - StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); - return abi.encodePacked( - bytes4(0x00000000), bytes1(0x00), _generateUserOpSignature(entryPoint, op, stealthAddressKey.stealthPrivate) - ); - } - - function getWrongSignature(UserOperation memory op) internal view override returns (bytes memory) { - StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); - return abi.encodePacked( - bytes4(0x00000000), - bytes1(0x00), - _generateUserOpSignature(entryPoint, op, stealthAddressKey.stealthPrivate + 1) - ); - } - - function signHash(bytes32 _hash) internal view override returns (bytes memory) { - StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); - return _generateHashSignature(_hash, address(kernel), stealthAddressKey.stealthPrivate); - } - - function getWrongSignature(bytes32 _hash) internal view override returns (bytes memory) { - StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); - return _generateHashSignature(_hash, address(kernel), stealthAddressKey.stealthPrivate + 1); - } - - function test_default_validator_enable() external override { - StealthAddressKey memory stealthAddressKey = getStealthAddress(wallet, ephemeralWallet); - - UserOperation memory op = buildUserOperation( - abi.encodeWithSelector( - IKernel.execute.selector, - address(defaultValidator), - 0, - abi.encodeWithSelector( - StealthAddressValidator.enable.selector, - abi.encodePacked( - stealthAddressKey.stealthAddress, - stealthAddressKey.stealthPub, - stealthAddressKey.dhPub, - stealthAddressKey.stealthPrefix, - stealthAddressKey.dhPrefix, - stealthAddressKey.ephemeralPub, - stealthAddressKey.ephemeralPrefix - ) - ), - Operation.Call - ) - ); - performUserOperationWithSig(op); - address owner = stealthAddressValidator.getOwner(address(kernel)); - assertEq(owner, stealthAddressKey.stealthAddress, "owner should be stealthAddress"); - } - - function test_default_validator_disable() external override { - UserOperation memory op = buildUserOperation( - abi.encodeWithSelector( - IKernel.execute.selector, - address(defaultValidator), - 0, - abi.encodeWithSelector(StealthAddressValidator.disable.selector, ""), - Operation.Call - ) - ); - performUserOperationWithSig(op); - address owner = stealthAddressValidator.getOwner(address(kernel)); - assertEq(owner, address(0), "owner should be 0"); - } - - function test_stealth_validate_userop_aggsig() external { - UserOperation memory userOp = UserOperation({ - sender: address(kernel), - nonce: 0, - initCode: bytes(""), - callData: bytes(""), - callGasLimit: 1, - verificationGasLimit: 1, - preVerificationGas: 1, - maxFeePerGas: 1, - maxPriorityFeePerGas: 1, - paymasterAndData: bytes(""), - signature: bytes("") - }); - bytes32 userOpHash = entryPoint.getUserOpHash(userOp); - - // Get the validator domain separator - bytes32 domainSeparator = stealthAddressValidator.getDomainSeperator(); - bytes32 typedMsgHash = keccak256( - abi.encodePacked( - "\x19\x01", domainSeparator, keccak256(abi.encode(USER_OP_TYPEHASH, owner, address(kernel), userOpHash)) - ) - ); - bytes memory aggregatedSignature = getAggregatedSignature(typedMsgHash, wallet); - userOp.signature = aggregatedSignature; - - (,, address result) = parseValidationData(defaultValidator.validateUserOp(userOp, userOpHash, 0)); - assertEq(result, address(0)); - } - - function test_stealth_validate_sig_aggsig() external { - bytes32 message = bytes32(uint256(0x102030405060708090a)); - - // Get the validator domain separator - bytes32 domainSeparator = stealthAddressValidator.getDomainSeperator(); - bytes32 typedMsgHash = keccak256( - abi.encodePacked( - "\x19\x01", domainSeparator, keccak256(abi.encode(SIGNATURE_TYPEHASH, owner, address(kernel), message)) - ) - ); - bytes memory aggregatedSignature = getAggregatedSignature(typedMsgHash, wallet); - - vm.prank(address(kernel)); - (,, address result) = parseValidationData(defaultValidator.validateSignature(message, aggregatedSignature)); - assertEq(result, address(0)); - } - - /* -------------------------------------------------------------------------- */ - /* Helper methods */ - /* -------------------------------------------------------------------------- */ - - /// @notice The type hash used for kernel user op validation - bytes32 constant USER_OP_TYPEHASH = keccak256("AllowUserOp(address owner,address kernelWallet,bytes32 userOpHash)"); - - /// @dev Generate the signature for a user op - function _generateUserOpSignature(IEntryPoint _entryPoint, UserOperation memory _op, uint256 _privateKey) - internal - view - returns (bytes memory) - { - // Get the kernel private key owner address - address owner = vm.addr(_privateKey); - - // Get the user op hash - bytes32 userOpHash = _entryPoint.getUserOpHash(_op); - // Get the validator domain separator - bytes32 domainSeparator = stealthAddressValidator.getDomainSeperator(); - bytes32 typedMsgHash = keccak256( - abi.encodePacked( - "\x19\x01", domainSeparator, keccak256(abi.encode(USER_OP_TYPEHASH, owner, _op.sender, userOpHash)) - ) - ); - (uint8 v, bytes32 r, bytes32 s) = vm.sign(_privateKey, typedMsgHash); - return abi.encodePacked(r, s, v); - } - - /// @notice The type hash used for kernel signature validation - bytes32 constant SIGNATURE_TYPEHASH = keccak256("KernelSignature(address owner,address kernelWallet,bytes32 hash)"); - - /// @dev Generate the signature for a given hash for a kernel account - function _generateHashSignature(bytes32 _hash, address _kernel, uint256 _privateKey) - internal - view - returns (bytes memory) - { - // Get the kernel private key owner address - address owner = vm.addr(_privateKey); - - // Get the validator domain separator - bytes32 domainSeparator = stealthAddressValidator.getDomainSeperator(); - bytes32 typedMsgHash = keccak256( - abi.encodePacked( - "\x19\x01", domainSeparator, keccak256(abi.encode(SIGNATURE_TYPEHASH, owner, _kernel, _hash)) - ) - ); - - (uint8 v, bytes32 r, bytes32 s) = vm.sign(_privateKey, typedMsgHash); - return abi.encodePacked(bytes1(0), r, s, v); - } - - /// @notice The parameter used in the elliptic curve - uint256 GX = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798; - uint256 GY = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8; - uint256 AA = 0; - uint256 PP = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F; - uint256 N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141; - - /// @dev Generate stealth address - function getStealthAddress(VmSafe.Wallet memory _ownerWallet, VmSafe.Wallet memory _ephemeralWallet) - public - view - returns (StealthAddressKey memory) - { - (uint256 ephemeralPub, uint256 ephemeralPrefix) = - (_ephemeralWallet.publicKeyX, _ephemeralWallet.publicKeyY % 2 + 2); - - (uint256 sharedSecretX, uint256 sharedSecretY) = - EllipticCurve.ecMul(_ephemeralWallet.privateKey, _ownerWallet.publicKeyX, _ownerWallet.publicKeyY, AA, PP); - uint256 hashSecret = uint256(keccak256(abi.encode(sharedSecretX, sharedSecretY))); - (uint256 pubX, uint256 pubY) = EllipticCurve.ecMul(hashSecret, GX, GY, AA, PP); - uint256 stealthPrivate = _ownerWallet.privateKey + hashSecret % N; - (uint256 stealthPubX, uint256 stealthPubY) = - EllipticCurve.ecAdd(_ownerWallet.publicKeyX, _ownerWallet.publicKeyY, pubX, pubY, AA, PP); - address stealthAddress = address(uint160(uint256(keccak256(abi.encode(stealthPubX, stealthPubY))))); - (uint256 dhkx, uint256 dhky) = - EllipticCurve.ecMul(hashSecret, _ownerWallet.publicKeyX, _ownerWallet.publicKeyY, AA, PP); - return StealthAddressKey( - stealthAddress, - stealthPubX, - dhkx, - uint8(stealthPubY % 2 + 2), - uint8(dhky % 2 + 2), - ephemeralPub, - uint8(ephemeralPrefix), - hashSecret, - stealthPrivate - ); - } - - function getAggregatedSignature(bytes32 _hash, Vm.Wallet memory _wallet) internal view returns (bytes memory) { - StealthAddressKey memory stelathAddressKey = getStealthAddress(_wallet, ephemeralWallet); - (, bytes32 r, bytes32 s) = vm.sign(_wallet.privateKey, _hash); - uint256 numR = uint256(r); - uint256 numS = uint256(s); - - // aggregatedSig = numS * (stelathAddressKey.hashSecret * numR + typedMsgHash) - bytes32 aggregatedSig = bytes32( - FixedPointMathLib.rawMulMod( - FixedPointMathLib.rawAddMod( - FixedPointMathLib.rawMulMod(stelathAddressKey.hashSecret, numR, N), uint256(_hash), N - ), - numS, - N - ) - ); - - return abi.encodePacked(bytes1(uint8(1)), r, aggregatedSig); - } -} diff --git a/test/foundry/KernelECDSA.t.sol b/test/foundry/KernelECDSA.t.sol index 4ebe58ca..93227e15 100644 --- a/test/foundry/KernelECDSA.t.sol +++ b/test/foundry/KernelECDSA.t.sol @@ -78,8 +78,8 @@ contract KernelECDSATest is KernelTestBase { ) ); performUserOperationWithSig(op); - (address owner) = ECDSAValidator(address(defaultValidator)).ecdsaValidatorStorage(address(kernel)); - assertEq(owner, address(0xdeadbeef), "owner should be 0xdeadbeef"); + (address owner_) = ECDSAValidator(address(defaultValidator)).ecdsaValidatorStorage(address(kernel)); + assertEq(owner_, address(0xdeadbeef), "owner should be 0xdeadbeef"); } function test_default_validator_disable() external override { From 2379b7f7ce394f0ad36b285d69635764d5c4dea5 Mon Sep 17 00:00:00 2001 From: leekt Date: Mon, 22 Jan 2024 22:08:41 +0900 Subject: [PATCH 05/36] fix: shadowed variable --- test/foundry/KernelECDSA.t.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/foundry/KernelECDSA.t.sol b/test/foundry/KernelECDSA.t.sol index 93227e15..8322e9ad 100644 --- a/test/foundry/KernelECDSA.t.sol +++ b/test/foundry/KernelECDSA.t.sol @@ -93,7 +93,7 @@ contract KernelECDSATest is KernelTestBase { ) ); performUserOperationWithSig(op); - (address owner) = ECDSAValidator(address(defaultValidator)).ecdsaValidatorStorage(address(kernel)); - assertEq(owner, address(0), "owner should be 0"); + (address owner_) = ECDSAValidator(address(defaultValidator)).ecdsaValidatorStorage(address(kernel)); + assertEq(owner_, address(0), "owner should be 0"); } } From 0104ca83bfee8076db2e70377ea96084dc96efbf Mon Sep 17 00:00:00 2001 From: leekt Date: Tue, 23 Jan 2024 16:06:26 +0900 Subject: [PATCH 06/36] modular permission encoding checked --- foundry.toml | 2 +- gas/gas_report.sh | 4 +- .../ModularPermissionValidator.sol | 54 +++++++++++++------ test/foundry/validator/KernelECDSATyped.t.sol | 12 ++--- .../modularPermission/ModularPermission.t.sol | 48 +++++++++++++++++ tsconfig.json | 11 ---- 6 files changed, 96 insertions(+), 35 deletions(-) create mode 100644 test/foundry/validator/modularPermission/ModularPermission.t.sol delete mode 100644 tsconfig.json diff --git a/foundry.toml b/foundry.toml index 9757adcd..1ea2a0fe 100644 --- a/foundry.toml +++ b/foundry.toml @@ -10,7 +10,7 @@ optimize = true via-ir = false runs = 1000000 -[profile.deploy] +[profile.optimized] via-ir = true [fuzz] diff --git a/gas/gas_report.sh b/gas/gas_report.sh index 81f88e9f..e6c4d854 100755 --- a/gas/gas_report.sh +++ b/gas/gas_report.sh @@ -1,3 +1,3 @@ forge build -forge test --gas-report --match-path test/foundry/KernelECDSA.t.sol > gas/ecdsa/report.txt -forge test --gas-report --match-path test/foundry/KernelLiteECDSA.t.sol > gas/ecdsa/report-lite.txt +FOUNDRY_PROFILE=optimized forge test --gas-report --match-path test/foundry/KernelECDSA.t.sol > gas/ecdsa/report.txt +FOUNDRY_PROFILE=optimized forge test --gas-report --match-path test/foundry/KernelLiteECDSA.t.sol > gas/ecdsa/report-lite.txt diff --git a/src/validator/modularPermission/ModularPermissionValidator.sol b/src/validator/modularPermission/ModularPermissionValidator.sol index a1b222b8..8efb0a9a 100644 --- a/src/validator/modularPermission/ModularPermissionValidator.sol +++ b/src/validator/modularPermission/ModularPermissionValidator.sol @@ -93,7 +93,9 @@ Response } */ -contract PermissionValidator is IKernelValidator { +import "forge-std/console.sol"; + +contract ModularPermissionValidator is IKernelValidator { mapping(bytes32 permissionId => mapping(address kernel => Permission)) public permissions; mapping(bytes32 permissionId => mapping(IPolicy policy => mapping(address kernel => IPolicy))) public nextPolicy; mapping(address kernel => Nonce) public nonces; @@ -114,22 +116,44 @@ contract PermissionValidator is IKernelValidator { return keccak256(abi.encode(nonce, validAfter, validUntil, signer, _permissions, signerData, permissionData)); } - function enable(bytes calldata data) external payable { - uint128 nonce = uint128(bytes16(data[0:16])); - uint48 validAfter = uint48(bytes6(data[16:22])); - uint48 validUntil = uint48(bytes6(data[22:28])); - ISigner signer = ISigner(address(bytes20(data[28:48]))); - IPolicy[] calldata policies; - bytes calldata signerData; - bytes[] calldata policyData; + function parseData(bytes calldata data) + public + view + returns ( + uint128 nonce, + uint48 validAfter, + uint48 validUntil, + ISigner signer, + IPolicy[] calldata policies, + bytes calldata signerData, + bytes[] calldata policyData + ) + { + nonce = uint128(bytes16(data[0:16])); + validAfter = uint48(bytes6(data[16:22])); + validUntil = uint48(bytes6(data[22:28])); + signer = ISigner(address(bytes20(data[28:48]))); assembly { - policies.offset := add(data.offset, calldataload(add(data.offset, 48))) - policies.length := calldataload(policies.offset) - signerData.offset := add(data.offset, calldataload(add(data.offset, 80))) - signerData.length := calldataload(signerData.offset) - policyData.offset := add(data.offset, calldataload(add(data.offset, 112))) - policyData.length := calldataload(policyData.offset) + let offset := add(data.offset, 48) + policies.offset := add(add(offset, 32), calldataload(offset)) + policies.length := calldataload(sub(policies.offset, 32)) + signerData.offset := add(add(offset, 32), calldataload(add(offset, 32))) + signerData.length := calldataload(sub(signerData.offset, 32)) + policyData.offset := add(add(offset, 32), calldataload(add(offset, 64))) + policyData.length := calldataload(sub(policyData.offset, 32)) } + } + + function enable(bytes calldata data) external payable { + ( + uint128 nonce, + uint48 validAfter, + uint48 validUntil, + ISigner signer, + IPolicy[] calldata policies, + bytes calldata signerData, + bytes[] calldata policyData + ) = parseData(data); registerPermission(nonce, validAfter, validUntil, signer, policies, signerData, policyData); } diff --git a/test/foundry/validator/KernelECDSATyped.t.sol b/test/foundry/validator/KernelECDSATyped.t.sol index 4fd6bf44..905c7757 100644 --- a/test/foundry/validator/KernelECDSATyped.t.sol +++ b/test/foundry/validator/KernelECDSATyped.t.sol @@ -82,8 +82,8 @@ contract KernelECDSATypedTest is KernelTestBase { ) ); performUserOperationWithSig(op); - address owner = ecdsaTypedValidator.getOwner(address(kernel)); - assertEq(owner, address(0xdeadbeef), "owner should be 0xdeadbeef"); + address owner_ = ecdsaTypedValidator.getOwner(address(kernel)); + assertEq(owner_, address(0xdeadbeef), "owner should be 0xdeadbeef"); } function test_default_validator_disable() external override { @@ -97,8 +97,8 @@ contract KernelECDSATypedTest is KernelTestBase { ) ); performUserOperationWithSig(op); - address owner = ecdsaTypedValidator.getOwner(address(kernel)); - assertEq(owner, address(0), "owner should be 0"); + address owner_ = ecdsaTypedValidator.getOwner(address(kernel)); + assertEq(owner_, address(0), "owner should be 0"); } /* -------------------------------------------------------------------------- */ @@ -115,7 +115,7 @@ contract KernelECDSATypedTest is KernelTestBase { returns (bytes memory) { // Get the kernel private key owner address - address owner = vm.addr(_privateKey); + address owner_ = vm.addr(_privateKey); // Get the user op hash bytes32 userOpHash = _entryPoint.getUserOpHash(_op); @@ -124,7 +124,7 @@ contract KernelECDSATypedTest is KernelTestBase { bytes32 domainSeparator = ecdsaTypedValidator.getDomainSeperator(); bytes32 typedMsgHash = keccak256( abi.encodePacked( - "\x19\x01", domainSeparator, keccak256(abi.encode(USER_OP_TYPEHASH, owner, _op.sender, userOpHash)) + "\x19\x01", domainSeparator, keccak256(abi.encode(USER_OP_TYPEHASH, owner_, _op.sender, userOpHash)) ) ); (uint8 v, bytes32 r, bytes32 s) = vm.sign(_privateKey, typedMsgHash); diff --git a/test/foundry/validator/modularPermission/ModularPermission.t.sol b/test/foundry/validator/modularPermission/ModularPermission.t.sol new file mode 100644 index 00000000..9ec248ec --- /dev/null +++ b/test/foundry/validator/modularPermission/ModularPermission.t.sol @@ -0,0 +1,48 @@ +import "src/validator/modularPermission/ModularPermissionValidator.sol"; +import "forge-std/Test.sol"; + +contract ModularPermissionTest is Test { + ModularPermissionValidator validator; + + function setUp() external { + validator = new ModularPermissionValidator(); + } + + function testParseData() external { + uint48 until = uint48(block.timestamp + 100); + bytes memory sd = abi.encodePacked("hello world"); + address[] memory p = new address[](2); + p[0] = address(0xdeadbeef); + p[1] = address(0xcafecafe); + bytes[] memory pd = new bytes[](2); + pd[0] = abi.encodePacked("policy data 1"); + pd[1] = abi.encodePacked("policy data 2"); + bytes memory data = abi.encodePacked( + abi.encodePacked( + uint128(0), // nonce + uint48(1), //`validAfter + until, // validUntil + address(0xdead) + ), // signer + abi.encode(p, sd, pd) + ); + ( + uint128 nonce, + uint48 validAfter, + uint48 validUntil, + ISigner signer, + IPolicy[] memory policies, + bytes memory signerData, + bytes[] memory policyData + ) = validator.parseData(data); + assertEq(nonce, uint128(0)); + assertEq(validAfter, uint48(1)); + assertEq(validUntil, until); + assertEq(address(signer), address(0xdead)); + assertEq(address(policies[0]), address(0xdeadbeef)); + assertEq(address(policies[1]), address(0xcafecafe)); + assertEq(signerData, abi.encodePacked("hello world")); + assertEq(policyData[0], abi.encodePacked("policy data 1")); + assertEq(policyData[1], abi.encodePacked("policy data 2")); + } +} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 574e785c..00000000 --- a/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "target": "es2020", - "module": "commonjs", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "skipLibCheck": true, - "resolveJsonModule": true - } -} From 6319f48e3bd2a30432032ac274a8496ced7ffd11 Mon Sep 17 00:00:00 2001 From: leekt Date: Wed, 24 Jan 2024 02:27:19 +0900 Subject: [PATCH 07/36] intersect supports validation data with aggregator --- src/utils/KernelHelper.sol | 13 ++++++++---- test/foundry/KernelHelper.t.sol | 35 +++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/utils/KernelHelper.sol b/src/utils/KernelHelper.sol index c3d0fe3e..c914639e 100644 --- a/src/utils/KernelHelper.sol +++ b/src/utils/KernelHelper.sol @@ -9,12 +9,17 @@ function _intersectValidationData(ValidationData a, ValidationData b) pure retur // xor(a,b) == shows only matching bits // and(xor(a,b), 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff) == filters out the validAfter and validUntil bits // if the result is not zero, then aggregator part is not matching - switch iszero(and(xor(a, b), 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff)) + // validCase : + // a == 0 || b == 0 || xor(a,b) == 0 + // invalidCase : + // a mul b != 0 && xor(a,b) != 0 + switch or(iszero(and(xor(a, b), 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff)), or(iszero(a), iszero(b))) case 1 { + validationData := and(and(a,b), 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff) // validAfter - let a_vd := and(0xffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff, a) - let b_vd := and(0xffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff, b) - validationData := xor(a_vd, mul(xor(a_vd, b_vd), gt(b_vd, a_vd))) + let a_vd := and(0xffffffffffff0000000000000000000000000000000000000000000000000000, a) + let b_vd := and(0xffffffffffff0000000000000000000000000000000000000000000000000000, b) + validationData := or(validationData, xor(a_vd, mul(xor(a_vd, b_vd), gt(b_vd, a_vd)))) // validUntil a_vd := and(0x000000000000ffffffffffff0000000000000000000000000000000000000000, a) if iszero(a_vd) { a_vd := 0x000000000000ffffffffffff0000000000000000000000000000000000000000 } diff --git a/test/foundry/KernelHelper.t.sol b/test/foundry/KernelHelper.t.sol index 83c44a0c..f8416e48 100644 --- a/test/foundry/KernelHelper.t.sol +++ b/test/foundry/KernelHelper.t.sol @@ -27,4 +27,39 @@ contract KernelHelperTest is Test { ); assertEq(ValidationData.unwrap(c), ValidationData.unwrap(expected)); } + + function testIntersectWithAggregator( + address aggregatorA, + ValidAfter validAfterA, + ValidUntil validUntilA, + address aggregatorB, + ValidAfter validAfterB, + ValidUntil validUntilB + ) external { + + if (ValidUntil.unwrap(validUntilB) == 0) { + validUntilB = ValidUntil.wrap(0xffffffffffff); + } + if (ValidUntil.unwrap(validUntilA) == 0) { + validUntilA = ValidUntil.wrap(0xffffffffffff); + } + ValidationData a = packValidationData(aggregatorA, validAfterA, validUntilA); + ValidationData b = packValidationData(aggregatorB, validAfterB, validUntilB); + ValidationData c = _intersectValidationData(a, b); + + address expectedAggregator = aggregatorA == address(0) ? aggregatorB : aggregatorA == aggregatorB ? aggregatorA : address(1); + console.log("expectedAggregator", expectedAggregator); + // a : b + // 0 : 0 => 0 + // 0 : 1 => 1 + // 1 : 0 => 1 + // 1 : 1 => 1 + // X : 0 => X + // X : 1 => 1 + // 0 : X => X + // 1 : X => 1 + (ValidAfter vf, ValidUntil vu, address res) = parseValidationData(c); + console.log("res", res); + assertEq(res, expectedAggregator); + } } From d8125c3926867e01f4b8ec6bbec60bed76871c2e Mon Sep 17 00:00:00 2001 From: leekt Date: Wed, 24 Jan 2024 02:31:05 +0900 Subject: [PATCH 08/36] draft for modular permission --- src/Kernel.sol | 4 +- src/common/Types.sol | 6 ++ .../modularPermission/CountPolicy.sol | 49 ----------- src/validator/modularPermission/IPolicy.sol | 4 +- src/validator/modularPermission/ISigner.sol | 2 + .../ModularPermissionValidator.sol | 23 ++--- .../modularPermission/mock/MockPolicy.sol | 42 +++++++++ .../modularPermission/mock/MockSigner.sol | 30 +++++++ .../modularPermission/ModularPermission.t.sol | 88 +++++++++++++++++++ 9 files changed, 187 insertions(+), 61 deletions(-) delete mode 100644 src/validator/modularPermission/CountPolicy.sol create mode 100644 src/validator/modularPermission/mock/MockPolicy.sol create mode 100644 src/validator/modularPermission/mock/MockSigner.sol diff --git a/src/Kernel.sol b/src/Kernel.sol index 25a94b18..8040792d 100644 --- a/src/Kernel.sol +++ b/src/Kernel.sol @@ -375,7 +375,9 @@ contract Kernel is EIP712, Compatibility, KernelStorage { assembly { validator := shr(80, sload(KERNEL_STORAGE_SLOT_1)) } - return IKernelValidator(validator).validateSignature(_hash, _signature); + // 20 bytes added at the end of the signature to store the address of the caller + (bool success, bytes memory res) = validator.staticcall(abi.encodePacked(abi.encodeWithSelector(IKernelValidator.validateSignature.selector, _hash, _signature), msg.sender)); + return abi.decode(res, (ValidationData)); } /// @dev Check if the given caller is valid for the given data diff --git a/src/common/Types.sol b/src/common/Types.sol index 027c96c7..51a51003 100644 --- a/src/common/Types.sol +++ b/src/common/Types.sol @@ -12,6 +12,12 @@ function packValidationData(ValidAfter validAfter, ValidUntil validUntil) pure r ); } +function packValidationData(address aggregator, ValidAfter validAfter, ValidUntil validUntil) pure returns (ValidationData) { + return ValidationData.wrap( + uint256(ValidAfter.unwrap(validAfter)) << 208 | uint256(ValidUntil.unwrap(validUntil)) << 160 | uint160(aggregator) + ); +} + function parseValidationData(ValidationData validationData) pure returns (ValidAfter validAfter, ValidUntil validUntil, address result) diff --git a/src/validator/modularPermission/CountPolicy.sol b/src/validator/modularPermission/CountPolicy.sol deleted file mode 100644 index 5a0bb471..00000000 --- a/src/validator/modularPermission/CountPolicy.sol +++ /dev/null @@ -1,49 +0,0 @@ -import "./IPolicy.sol"; -import "src/common/Types.sol"; - -struct Count { - uint128 current; - uint128 allowed; -} - -contract CountPolicy is IPolicy { - address public immutable permissionValidator; - - constructor(address _permissionValidator) { - permissionValidator = _permissionValidator; - } - - mapping(bytes32 permissionId => mapping(address kernel => Count)) public counts; - - function registerPolicy(address kernel, bytes32 permissionId, bytes calldata policyData) - external - payable - override - { - require(policyData.length == 16, "Invalid policy data"); - uint128 allowed = uint128(bytes16(policyData[0:16])); - counts[permissionId][kernel].allowed = allowed; - } - - function validatePolicy( - address kernel, - bytes32 permissionId, - UserOperation calldata userOp, - bytes calldata proofAndSig - ) external payable override returns (ValidationData, uint256 consumedSignatureLength) { - Count storage count = counts[permissionId][kernel]; - require(count.current < count.allowed, "Permission revoked"); - count.current++; - return (packValidationData(ValidAfter.wrap(0), ValidUntil.wrap(0)), 0); - } - - function validateSignature( - address kernel, - address caller, - bytes32 permissionId, - bytes32 messageHash, - bytes calldata signature - ) external view override returns (ValidationData, uint256 consumedSignatureLength) { - revert("not implemented"); - } -} diff --git a/src/validator/modularPermission/IPolicy.sol b/src/validator/modularPermission/IPolicy.sol index 11192c11..a5f5b49d 100644 --- a/src/validator/modularPermission/IPolicy.sol +++ b/src/validator/modularPermission/IPolicy.sol @@ -1,6 +1,7 @@ pragma solidity ^0.8.0; -import {ValidationData} from "src/common/Types.sol"; +import {ValidationData, ValidUntil, ValidAfter, packValidationData} from "src/common/Types.sol"; +import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; import {UserOperation} from "I4337/interfaces/UserOperation.sol"; interface IPolicy { @@ -19,3 +20,4 @@ interface IPolicy { bytes calldata signature ) external view returns (ValidationData, uint256 consumedSignatureLength); } + diff --git a/src/validator/modularPermission/ISigner.sol b/src/validator/modularPermission/ISigner.sol index 4beb55a2..885cc8ed 100644 --- a/src/validator/modularPermission/ISigner.sol +++ b/src/validator/modularPermission/ISigner.sol @@ -1,6 +1,8 @@ pragma solidity ^0.8.0; import {ValidationData} from "src/common/Types.sol"; +import {ValidAfter, ValidUntil, packValidationData} from "src/common/Types.sol"; +import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; interface ISigner { function registerSigner(address kernel, bytes32 permissionId, bytes calldata signerData) external payable; diff --git a/src/validator/modularPermission/ModularPermissionValidator.sol b/src/validator/modularPermission/ModularPermissionValidator.sol index 8efb0a9a..6bd2017f 100644 --- a/src/validator/modularPermission/ModularPermissionValidator.sol +++ b/src/validator/modularPermission/ModularPermissionValidator.sol @@ -6,6 +6,7 @@ import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; import {IKernelValidator} from "src/interfaces/IKernelValidator.sol"; import {ISigner} from "./ISigner.sol"; import {IPolicy} from "./IPolicy.sol"; +import {_intersectValidationData} from "src/utils/KernelHelper.sol"; // permission should handle the flag of following // - check if permission is allowed to sign arbitrary signature, notice this is view so this cannot guarantee if signature is used @@ -105,20 +106,21 @@ contract ModularPermissionValidator is IKernelValidator { event NonceRevoked(address kernel, uint256 nonce); function getPermissionId( - uint256 nonce, + address kernel, + uint128 nonce, uint48 validAfter, uint48 validUntil, ISigner signer, IPolicy[] calldata _permissions, bytes calldata signerData, bytes[] calldata permissionData - ) external pure returns (bytes32) { - return keccak256(abi.encode(nonce, validAfter, validUntil, signer, _permissions, signerData, permissionData)); + ) public pure returns (bytes32) { + return keccak256(abi.encode(kernel, nonce, validAfter, validUntil, signer, _permissions, signerData, permissionData)); } function parseData(bytes calldata data) public - view + pure returns ( uint128 nonce, uint48 validAfter, @@ -166,8 +168,7 @@ contract ModularPermissionValidator is IKernelValidator { bytes calldata signerData, bytes[] calldata policyData ) public payable { - bytes32 permissionId = - keccak256(abi.encode(msg.sender, nonce, validAfter, validUntil, signer, policy, signerData, policyData)); + bytes32 permissionId = getPermissionId(msg.sender, nonce, validAfter, validUntil, signer, policy, signerData, policyData); for (uint256 i = 0; i < policy.length; i++) { policy[i].registerPolicy(msg.sender, permissionId, policyData[i]); @@ -220,13 +221,14 @@ contract ModularPermissionValidator is IKernelValidator { (ValidationData policyValidation, uint256 sigOffset) = policy.validatePolicy(msg.sender, permissionId, _userOp, _userOp.signature[cursor:]); // DO validationdata merge + validationData = _intersectValidationData(validationData, policyValidation); policy = nextPolicy[permissionId][policy][msg.sender]; cursor += sigOffset; } ValidationData signatureValidation = permission.signer.validateUserOp(msg.sender, permissionId, _userOpHash, _userOp.signature[cursor:]); // DO validationdata merge - return signatureValidation; + validationData = _intersectValidationData(validationData, signatureValidation); } function validCaller(address caller, bytes calldata data) @@ -248,7 +250,7 @@ contract ModularPermissionValidator is IKernelValidator { external view override - returns (ValidationData) + returns (ValidationData validationData) { ValidationSigMemory memory sigMemory; sigMemory.permissionId = bytes32(signature[0:32]); @@ -272,8 +274,9 @@ contract ModularPermissionValidator is IKernelValidator { sigMemory.policy = permission.firstPolicy; while (address(sigMemory.policy) != address(0)) { (ValidationData policyValidation, uint256 sigOffset) = sigMemory.policy.validateSignature( - msg.sender, msg.sender, sigMemory.permissionId, hash, proofAndSignature[sigMemory.cursor:] + msg.sender, address(bytes20(msg.data[msg.data.length - 20 :])), sigMemory.permissionId, hash, proofAndSignature[sigMemory.cursor:] ); + validationData = _intersectValidationData(validationData, policyValidation); // DO validationdata merge sigMemory.policy = nextPolicy[sigMemory.permissionId][sigMemory.policy][msg.sender]; sigMemory.cursor += sigOffset; @@ -282,6 +285,6 @@ contract ModularPermissionValidator is IKernelValidator { msg.sender, sigMemory.permissionId, hash, proofAndSignature[sigMemory.cursor:] ); // DO validationdata merge - return signatureValidation; + validationData = _intersectValidationData(validationData, signatureValidation); } } diff --git a/src/validator/modularPermission/mock/MockPolicy.sol b/src/validator/modularPermission/mock/MockPolicy.sol new file mode 100644 index 00000000..fa8ba67f --- /dev/null +++ b/src/validator/modularPermission/mock/MockPolicy.sol @@ -0,0 +1,42 @@ +pragma solidity ^0.8.0; + +import {UserOperation} from "I4337/interfaces/UserOperation.sol"; +import {ValidationData, ValidUntil, ValidAfter, packValidationData} from "src/common/Types.sol"; +import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; +import {IPolicy} from "../IPolicy.sol"; + +contract MockPolicy is IPolicy { + ValidationData public validationData; + uint256 public sigConsume; + mapping(bytes32 => uint256) public count; + bytes public policyData; + + function mock(uint48 validAfter, uint48 validUntil, bool success, uint256 consume) external { + validationData = success ? packValidationData(ValidAfter.wrap(validAfter), ValidUntil.wrap(validUntil)) : SIG_VALIDATION_FAILED; + } + + function registerPolicy(address, bytes32, bytes calldata data) external payable override { + // do nothing + policyData = data; + } + + function validatePolicy( + address, + bytes32 permissionId, + UserOperation calldata, + bytes calldata + ) external payable override returns (ValidationData, uint256 consumedSignatureLength) { + count[permissionId]++; + return (validationData, sigConsume); + } + + function validateSignature( + address kernel, + address caller, + bytes32 permissionId, + bytes32 messageHash, + bytes calldata signature + ) external view override returns (ValidationData, uint256 consumedSignatureLength) { + return (validationData, sigConsume); + } +} \ No newline at end of file diff --git a/src/validator/modularPermission/mock/MockSigner.sol b/src/validator/modularPermission/mock/MockSigner.sol new file mode 100644 index 00000000..a133c18a --- /dev/null +++ b/src/validator/modularPermission/mock/MockSigner.sol @@ -0,0 +1,30 @@ +pragma solidity ^0.8.0; + +import {UserOperation} from "I4337/interfaces/UserOperation.sol"; +import {ValidationData, ValidUntil, ValidAfter, packValidationData} from "src/common/Types.sol"; +import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; +import {ISigner} from "../ISigner.sol"; + +contract MockSigner is ISigner { + ValidationData public validationData; + mapping(bytes32 => uint256) public count; + bytes public signerData; + + function mock(uint48 validAfter, uint48 validUntil, bool success) external { + validationData = success ? packValidationData(ValidAfter.wrap(validAfter), ValidUntil.wrap(validUntil)) : SIG_VALIDATION_FAILED; + } + + function registerSigner(address, bytes32, bytes calldata data) external payable override { + // do nothing + signerData = data; + } + + function validateUserOp(address, bytes32 permissionId, bytes32, bytes calldata) external payable override returns (ValidationData) { + count[permissionId]++; + return validationData; + } + + function validateSignature(address, bytes32, bytes32, bytes calldata) external view override returns (ValidationData) { + return validationData; + } +} diff --git a/test/foundry/validator/modularPermission/ModularPermission.t.sol b/test/foundry/validator/modularPermission/ModularPermission.t.sol index 9ec248ec..f3d40335 100644 --- a/test/foundry/validator/modularPermission/ModularPermission.t.sol +++ b/test/foundry/validator/modularPermission/ModularPermission.t.sol @@ -1,11 +1,20 @@ +pragma solidity ^0.8.0; + import "src/validator/modularPermission/ModularPermissionValidator.sol"; +import "src/validator/modularPermission/mock/MockSigner.sol"; +import "src/validator/modularPermission/mock/MockPolicy.sol"; import "forge-std/Test.sol"; contract ModularPermissionTest is Test { ModularPermissionValidator validator; + MockSigner mockSigner; + MockPolicy mockPolicy; + function setUp() external { validator = new ModularPermissionValidator(); + mockPolicy = new MockPolicy(); + mockSigner = new MockSigner(); } function testParseData() external { @@ -45,4 +54,83 @@ contract ModularPermissionTest is Test { assertEq(policyData[0], abi.encodePacked("policy data 1")); assertEq(policyData[1], abi.encodePacked("policy data 2")); } + + function testRegister() external { + uint48 until = uint48(block.timestamp + 100); + bytes memory sd = abi.encodePacked("hello signer"); + address[] memory p = new address[](1); + p[0] = address(mockPolicy); + bytes[] memory pd = new bytes[](1); + pd[0] = abi.encodePacked("hello policy"); + bytes memory data = abi.encodePacked( + abi.encodePacked( + uint128(0), // nonce + uint48(1), //`validAfter + until, // validUntil + address(mockSigner) + ), // signer + abi.encode(p, sd, pd) + ); + validator.enable(data); + } + + function testValidateUserOp() external { + address kernel = makeAddr("Kernel"); + uint48 until = uint48(block.timestamp + 100); + bytes memory sd = abi.encodePacked("hello signer"); + IPolicy[] memory p = new IPolicy[](1); + p[0] = mockPolicy; + bytes[] memory pd = new bytes[](1); + pd[0] = abi.encodePacked("hello policy"); + bytes32 permissionId = validator.getPermissionId( + kernel, + 0, + uint48(1), + until, + mockSigner, + p, + sd, + pd + ); + + bytes memory data = abi.encodePacked( + abi.encodePacked( + uint128(0), // nonce + uint48(1), //`validAfter + until, // validUntil + address(mockSigner) + ), // signer + abi.encode(p, sd, pd) + ); + vm.startPrank(kernel); + validator.enable(data); + vm.stopPrank(); + + ( + uint128 nonce, + uint128 status, + uint48 validAfter, + uint48 validUntil, + ISigner signer, + IPolicy firstPolicy + ) = validator.permissions(permissionId, kernel); + assertEq(nonce, uint128(0)); + assertEq(status, uint128(1)); + assertEq(validAfter, uint48(1)); + assertEq(validUntil, until); + assertEq(address(signer), address(mockSigner)); + assertEq(address(firstPolicy), address(mockPolicy)); + + assertEq(mockSigner.signerData(), sd); + assertEq(mockPolicy.policyData(), pd[0]); + UserOperation memory op; + op.sender = kernel; + op.signature = abi.encodePacked(permissionId); + vm.startPrank(kernel); + validator.validateUserOp(op, keccak256(abi.encodePacked("hello")), 0); + vm.stopPrank(); + + assertEq(mockSigner.count(permissionId), 1); + assertEq(mockPolicy.count(permissionId), 1); + } } From 83fb2097b06a3ac8995820d840f7d7e8e286a0dc Mon Sep 17 00:00:00 2001 From: leekt Date: Wed, 24 Jan 2024 03:42:31 +0900 Subject: [PATCH 09/36] forge fmt --- src/Kernel.sol | 8 +- src/common/Types.sol | 8 +- src/utils/KernelHelper.sol | 7 +- src/validator/SessionKeyValidator.sol | 4 +- src/validator/modularPermission/IPolicy.sol | 1 - .../ModularPermissionValidator.sol | 87 +++---------------- .../modularPermission/mock/MockPolicy.sol | 18 ++-- .../modularPermission/mock/MockSigner.sol | 18 +++- test/foundry/KernelHelper.t.sol | 4 +- .../modularPermission/ModularPermission.t.sol | 21 +---- 10 files changed, 60 insertions(+), 116 deletions(-) diff --git a/src/Kernel.sol b/src/Kernel.sol index 8040792d..06bb6b9a 100644 --- a/src/Kernel.sol +++ b/src/Kernel.sol @@ -29,7 +29,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { /// @dev Selector of the `DisabledMode()` error, to be used in assembly, 'bytes4(keccak256(bytes("DisabledMode()")))', same as DisabledMode.selector() uint256 private constant _DISABLED_MODE_SELECTOR = 0xfc2f51c5; - /// @dev Current kernel name and version, todo: Need to expose getter for this variables? + /// @dev Current kernel name and version string public constant name = KERNEL_NAME; string public constant version = KERNEL_VERSION; @@ -376,7 +376,11 @@ contract Kernel is EIP712, Compatibility, KernelStorage { validator := shr(80, sload(KERNEL_STORAGE_SLOT_1)) } // 20 bytes added at the end of the signature to store the address of the caller - (bool success, bytes memory res) = validator.staticcall(abi.encodePacked(abi.encodeWithSelector(IKernelValidator.validateSignature.selector, _hash, _signature), msg.sender)); + (bool success, bytes memory res) = validator.staticcall( + abi.encodePacked( + abi.encodeWithSelector(IKernelValidator.validateSignature.selector, _hash, _signature), msg.sender + ) + ); return abi.decode(res, (ValidationData)); } diff --git a/src/common/Types.sol b/src/common/Types.sol index 51a51003..81ef36f4 100644 --- a/src/common/Types.sol +++ b/src/common/Types.sol @@ -12,9 +12,13 @@ function packValidationData(ValidAfter validAfter, ValidUntil validUntil) pure r ); } -function packValidationData(address aggregator, ValidAfter validAfter, ValidUntil validUntil) pure returns (ValidationData) { +function packValidationData(address aggregator, ValidAfter validAfter, ValidUntil validUntil) + pure + returns (ValidationData) +{ return ValidationData.wrap( - uint256(ValidAfter.unwrap(validAfter)) << 208 | uint256(ValidUntil.unwrap(validUntil)) << 160 | uint160(aggregator) + uint256(ValidAfter.unwrap(validAfter)) << 208 | uint256(ValidUntil.unwrap(validUntil)) << 160 + | uint160(aggregator) ); } diff --git a/src/utils/KernelHelper.sol b/src/utils/KernelHelper.sol index c914639e..5ab62481 100644 --- a/src/utils/KernelHelper.sol +++ b/src/utils/KernelHelper.sol @@ -13,9 +13,12 @@ function _intersectValidationData(ValidationData a, ValidationData b) pure retur // a == 0 || b == 0 || xor(a,b) == 0 // invalidCase : // a mul b != 0 && xor(a,b) != 0 - switch or(iszero(and(xor(a, b), 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff)), or(iszero(a), iszero(b))) + switch or( + iszero(and(xor(a, b), 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff)), + or(iszero(a), iszero(b)) + ) case 1 { - validationData := and(and(a,b), 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff) + validationData := and(and(a, b), 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff) // validAfter let a_vd := and(0xffffffffffff0000000000000000000000000000000000000000000000000000, a) let b_vd := and(0xffffffffffff0000000000000000000000000000000000000000000000000000, b) diff --git a/src/validator/SessionKeyValidator.sol b/src/validator/SessionKeyValidator.sol index 8021a452..06665e44 100644 --- a/src/validator/SessionKeyValidator.sol +++ b/src/validator/SessionKeyValidator.sol @@ -32,7 +32,9 @@ contract SessionKeyValidator is IKernelValidator { function invalidateNonce(uint128 nonce) public { require(nonce > nonces[msg.sender].invalidNonce, "SessionKeyValidator: invalid nonce"); nonces[msg.sender].invalidNonce = nonce; - nonces[msg.sender].lastNonce = nonce; + if (nonces[msg.sender].lastNonce < nonce) { + nonces[msg.sender].lastNonce = nonce; + } } function disable(bytes calldata _data) external payable { diff --git a/src/validator/modularPermission/IPolicy.sol b/src/validator/modularPermission/IPolicy.sol index a5f5b49d..49a3bb2f 100644 --- a/src/validator/modularPermission/IPolicy.sol +++ b/src/validator/modularPermission/IPolicy.sol @@ -20,4 +20,3 @@ interface IPolicy { bytes calldata signature ) external view returns (ValidationData, uint256 consumedSignatureLength); } - diff --git a/src/validator/modularPermission/ModularPermissionValidator.sol b/src/validator/modularPermission/ModularPermissionValidator.sol index 6bd2017f..52a73dfb 100644 --- a/src/validator/modularPermission/ModularPermissionValidator.sol +++ b/src/validator/modularPermission/ModularPermissionValidator.sol @@ -8,27 +8,6 @@ import {ISigner} from "./ISigner.sol"; import {IPolicy} from "./IPolicy.sol"; import {_intersectValidationData} from "src/utils/KernelHelper.sol"; -// permission should handle the flag of following -// - check if permission is allowed to sign arbitrary signature, notice this is view so this cannot guarantee if signature is used -// - check if permission is allowed to call function directly -// - if aggregator address is returned from policy.validatePolicy, DO NOT invoke signer, delegate signer role to aggregator instead => CHECK is this safe??? -// - TODO : test this is aggregator can be setup as signer -// - if no policy is defined, should bypass policy -// - if no signer is defined, revert -// - if nonce is revoked, and policy is not 0, revert -// note that nonce revokation revokes all permissions that has lower nonce than revoked nonce -// - if nonce is revoked, and policy is 0, do not revert, this will act as sudo permission -// note that permissionId revokation should be considered revoked -// Policy should handle followings -// - check if permission is allowed to sign userOp with/without the gas spent by user -// - check if permission is allowed to sign given signature -// - check if permission is allowed to call function directly -// - return aggregator address if needed -// Signer should handle followings -// - check if userOpHash is signed -// - check msgHash is signed -// - note that checking signature prefix, checking replay attack should not be handled by signer -// - this remains responsibility of app / kernel struct Permission { uint128 nonce; uint128 status; // status == 0 => revoked, status == 1 => active @@ -43,59 +22,6 @@ struct Nonce { uint128 revoked; } -/* -eth_requestPermissions -Request -{ - "type": "call", - "data" : [{ - "to": "
", - "amount": "", - "data" : "", - }], - "gas" : "sponsored | not sponsored | max priority fee limit, preVerificationGas limit" - "validUntil" : "", - "validAfter" : "", - "signer" : { - "address" : "", - "data" : "" - } -} -{ - "type" : "erc20", - "data" : [{ - "amount" : "", - }] - "gas" : "sponsored | not sponsored | max priority fee limit, preVerificationGas limit" - "validUntil" : "", - "validAfter" : "", - "signer" : { - "address" : "", - "data" : "" - } -} -Response -{ - "permissionId": "", - "nonce": "", - "validAfter": "", - "validUntil": "", - -} -eth_requestPolicyProof -Request -{ - "permissionId": "", - "userOperation": "", -} -Response -{ - "proof": "" -} -*/ - -import "forge-std/console.sol"; - contract ModularPermissionValidator is IKernelValidator { mapping(bytes32 permissionId => mapping(address kernel => Permission)) public permissions; mapping(bytes32 permissionId => mapping(IPolicy policy => mapping(address kernel => IPolicy))) public nextPolicy; @@ -115,7 +41,9 @@ contract ModularPermissionValidator is IKernelValidator { bytes calldata signerData, bytes[] calldata permissionData ) public pure returns (bytes32) { - return keccak256(abi.encode(kernel, nonce, validAfter, validUntil, signer, _permissions, signerData, permissionData)); + return keccak256( + abi.encode(kernel, nonce, validAfter, validUntil, signer, _permissions, signerData, permissionData) + ); } function parseData(bytes calldata data) @@ -168,7 +96,8 @@ contract ModularPermissionValidator is IKernelValidator { bytes calldata signerData, bytes[] calldata policyData ) public payable { - bytes32 permissionId = getPermissionId(msg.sender, nonce, validAfter, validUntil, signer, policy, signerData, policyData); + bytes32 permissionId = + getPermissionId(msg.sender, nonce, validAfter, validUntil, signer, policy, signerData, policyData); for (uint256 i = 0; i < policy.length; i++) { policy[i].registerPolicy(msg.sender, permissionId, policyData[i]); @@ -274,7 +203,11 @@ contract ModularPermissionValidator is IKernelValidator { sigMemory.policy = permission.firstPolicy; while (address(sigMemory.policy) != address(0)) { (ValidationData policyValidation, uint256 sigOffset) = sigMemory.policy.validateSignature( - msg.sender, address(bytes20(msg.data[msg.data.length - 20 :])), sigMemory.permissionId, hash, proofAndSignature[sigMemory.cursor:] + msg.sender, + address(bytes20(msg.data[msg.data.length - 20:])), + sigMemory.permissionId, + hash, + proofAndSignature[sigMemory.cursor:] ); validationData = _intersectValidationData(validationData, policyValidation); // DO validationdata merge diff --git a/src/validator/modularPermission/mock/MockPolicy.sol b/src/validator/modularPermission/mock/MockPolicy.sol index fa8ba67f..3d56443b 100644 --- a/src/validator/modularPermission/mock/MockPolicy.sol +++ b/src/validator/modularPermission/mock/MockPolicy.sol @@ -12,7 +12,9 @@ contract MockPolicy is IPolicy { bytes public policyData; function mock(uint48 validAfter, uint48 validUntil, bool success, uint256 consume) external { - validationData = success ? packValidationData(ValidAfter.wrap(validAfter), ValidUntil.wrap(validUntil)) : SIG_VALIDATION_FAILED; + validationData = success + ? packValidationData(ValidAfter.wrap(validAfter), ValidUntil.wrap(validUntil)) + : SIG_VALIDATION_FAILED; } function registerPolicy(address, bytes32, bytes calldata data) external payable override { @@ -20,12 +22,12 @@ contract MockPolicy is IPolicy { policyData = data; } - function validatePolicy( - address, - bytes32 permissionId, - UserOperation calldata, - bytes calldata - ) external payable override returns (ValidationData, uint256 consumedSignatureLength) { + function validatePolicy(address, bytes32 permissionId, UserOperation calldata, bytes calldata) + external + payable + override + returns (ValidationData, uint256 consumedSignatureLength) + { count[permissionId]++; return (validationData, sigConsume); } @@ -39,4 +41,4 @@ contract MockPolicy is IPolicy { ) external view override returns (ValidationData, uint256 consumedSignatureLength) { return (validationData, sigConsume); } -} \ No newline at end of file +} diff --git a/src/validator/modularPermission/mock/MockSigner.sol b/src/validator/modularPermission/mock/MockSigner.sol index a133c18a..f323b8c2 100644 --- a/src/validator/modularPermission/mock/MockSigner.sol +++ b/src/validator/modularPermission/mock/MockSigner.sol @@ -11,7 +11,9 @@ contract MockSigner is ISigner { bytes public signerData; function mock(uint48 validAfter, uint48 validUntil, bool success) external { - validationData = success ? packValidationData(ValidAfter.wrap(validAfter), ValidUntil.wrap(validUntil)) : SIG_VALIDATION_FAILED; + validationData = success + ? packValidationData(ValidAfter.wrap(validAfter), ValidUntil.wrap(validUntil)) + : SIG_VALIDATION_FAILED; } function registerSigner(address, bytes32, bytes calldata data) external payable override { @@ -19,12 +21,22 @@ contract MockSigner is ISigner { signerData = data; } - function validateUserOp(address, bytes32 permissionId, bytes32, bytes calldata) external payable override returns (ValidationData) { + function validateUserOp(address, bytes32 permissionId, bytes32, bytes calldata) + external + payable + override + returns (ValidationData) + { count[permissionId]++; return validationData; } - function validateSignature(address, bytes32, bytes32, bytes calldata) external view override returns (ValidationData) { + function validateSignature(address, bytes32, bytes32, bytes calldata) + external + view + override + returns (ValidationData) + { return validationData; } } diff --git a/test/foundry/KernelHelper.t.sol b/test/foundry/KernelHelper.t.sol index f8416e48..9505db25 100644 --- a/test/foundry/KernelHelper.t.sol +++ b/test/foundry/KernelHelper.t.sol @@ -36,7 +36,6 @@ contract KernelHelperTest is Test { ValidAfter validAfterB, ValidUntil validUntilB ) external { - if (ValidUntil.unwrap(validUntilB) == 0) { validUntilB = ValidUntil.wrap(0xffffffffffff); } @@ -47,7 +46,8 @@ contract KernelHelperTest is Test { ValidationData b = packValidationData(aggregatorB, validAfterB, validUntilB); ValidationData c = _intersectValidationData(a, b); - address expectedAggregator = aggregatorA == address(0) ? aggregatorB : aggregatorA == aggregatorB ? aggregatorA : address(1); + address expectedAggregator = + aggregatorA == address(0) ? aggregatorB : aggregatorA == aggregatorB ? aggregatorA : address(1); console.log("expectedAggregator", expectedAggregator); // a : b // 0 : 0 => 0 diff --git a/test/foundry/validator/modularPermission/ModularPermission.t.sol b/test/foundry/validator/modularPermission/ModularPermission.t.sol index f3d40335..55dc933a 100644 --- a/test/foundry/validator/modularPermission/ModularPermission.t.sol +++ b/test/foundry/validator/modularPermission/ModularPermission.t.sol @@ -82,16 +82,7 @@ contract ModularPermissionTest is Test { p[0] = mockPolicy; bytes[] memory pd = new bytes[](1); pd[0] = abi.encodePacked("hello policy"); - bytes32 permissionId = validator.getPermissionId( - kernel, - 0, - uint48(1), - until, - mockSigner, - p, - sd, - pd - ); + bytes32 permissionId = validator.getPermissionId(kernel, 0, uint48(1), until, mockSigner, p, sd, pd); bytes memory data = abi.encodePacked( abi.encodePacked( @@ -106,14 +97,8 @@ contract ModularPermissionTest is Test { validator.enable(data); vm.stopPrank(); - ( - uint128 nonce, - uint128 status, - uint48 validAfter, - uint48 validUntil, - ISigner signer, - IPolicy firstPolicy - ) = validator.permissions(permissionId, kernel); + (uint128 nonce, uint128 status, uint48 validAfter, uint48 validUntil, ISigner signer, IPolicy firstPolicy) = + validator.permissions(permissionId, kernel); assertEq(nonce, uint128(0)); assertEq(status, uint128(1)); assertEq(validAfter, uint48(1)); From 207470454df1937718b8eea81bd555c8d004c817 Mon Sep 17 00:00:00 2001 From: leekt Date: Wed, 24 Jan 2024 04:07:05 +0900 Subject: [PATCH 10/36] non-view for validCaller --- src/validator/ECDSATypedValidator.sol | 2 +- src/validator/ECDSAValidator.sol | 2 +- src/validator/ERC165SessionKeyValidator.sol | 2 +- src/validator/KillSwitchValidator.sol | 2 +- src/validator/SessionKeyValidator.sol | 2 +- src/validator/WeightedECDSAValidator.sol | 2 +- .../modularPermission/ModularPermissionValidator.sol | 6 +++--- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/validator/ECDSATypedValidator.sol b/src/validator/ECDSATypedValidator.sol index f2dea0c3..cb23106c 100644 --- a/src/validator/ECDSATypedValidator.sol +++ b/src/validator/ECDSATypedValidator.sol @@ -110,7 +110,7 @@ contract ECDSATypedValidator is IKernelValidator, EIP712 { } /// @dev Check if the caller is a valid signer for this kernel account - function validCaller(address _caller, bytes calldata) external view override returns (bool) { + function validCaller(address _caller, bytes calldata) external payable override returns (bool) { return ecdsaValidatorStorage[msg.sender].owner == _caller; } diff --git a/src/validator/ECDSAValidator.sol b/src/validator/ECDSAValidator.sol index 9eeabf6e..131b9ba1 100644 --- a/src/validator/ECDSAValidator.sol +++ b/src/validator/ECDSAValidator.sol @@ -57,7 +57,7 @@ contract ECDSAValidator is IKernelValidator { return ValidationData.wrap(0); } - function validCaller(address _caller, bytes calldata) external view override returns (bool) { + function validCaller(address _caller, bytes calldata) external payable override returns (bool) { return ecdsaValidatorStorage[msg.sender].owner == _caller; } } diff --git a/src/validator/ERC165SessionKeyValidator.sol b/src/validator/ERC165SessionKeyValidator.sol index ecb56c45..bd29f6f5 100644 --- a/src/validator/ERC165SessionKeyValidator.sol +++ b/src/validator/ERC165SessionKeyValidator.sol @@ -62,7 +62,7 @@ contract ERC165SessionKeyValidator is IKernelValidator { return packValidationData(sessionKey.validAfter, sessionKey.validUntil); } - function validCaller(address, bytes calldata) external pure override returns (bool) { + function validCaller(address, bytes calldata) external payable override returns (bool) { revert NotImplemented(); } } diff --git a/src/validator/KillSwitchValidator.sol b/src/validator/KillSwitchValidator.sol index 7df15d91..70f1d816 100644 --- a/src/validator/KillSwitchValidator.sol +++ b/src/validator/KillSwitchValidator.sol @@ -79,7 +79,7 @@ contract KillSwitchValidator is IKernelValidator { } } - function validCaller(address, bytes calldata) external pure override returns (bool) { + function validCaller(address, bytes calldata) external payable override returns (bool) { revert NotImplemented(); } } diff --git a/src/validator/SessionKeyValidator.sol b/src/validator/SessionKeyValidator.sol index 06665e44..7b7fc60d 100644 --- a/src/validator/SessionKeyValidator.sol +++ b/src/validator/SessionKeyValidator.sol @@ -301,7 +301,7 @@ contract SessionKeyValidator is IKernelValidator { return true; } - function validCaller(address, bytes calldata) external pure returns (bool) { + function validCaller(address, bytes calldata) external payable returns (bool) { revert NotImplemented(); } diff --git a/src/validator/WeightedECDSAValidator.sol b/src/validator/WeightedECDSAValidator.sol index a3b7a537..f0a8f993 100644 --- a/src/validator/WeightedECDSAValidator.sol +++ b/src/validator/WeightedECDSAValidator.sol @@ -234,7 +234,7 @@ contract WeightedECDSAValidator is EIP712, IKernelValidator { passed = approvals >= strg.threshold; } - function validCaller(address, bytes calldata) external pure override returns (bool) { + function validCaller(address, bytes calldata) external payable override returns (bool) { return false; } diff --git a/src/validator/modularPermission/ModularPermissionValidator.sol b/src/validator/modularPermission/ModularPermissionValidator.sol index 52a73dfb..888a7a12 100644 --- a/src/validator/modularPermission/ModularPermissionValidator.sol +++ b/src/validator/modularPermission/ModularPermissionValidator.sol @@ -162,7 +162,7 @@ contract ModularPermissionValidator is IKernelValidator { function validCaller(address caller, bytes calldata data) external - pure // TODO: this will turn non-view from 2.4 + payable // TODO: this will turn non-view from 2.4 override returns (bool) { @@ -192,9 +192,9 @@ contract ModularPermissionValidator is IKernelValidator { bytes calldata rawMessage; assembly { rawMessage.offset := add(signature.offset, calldataload(add(signature.offset, 32))) - rawMessage.length := calldataload(rawMessage.offset) + rawMessage.length := calldataload(sub(rawMessage.offset, 32)) proofAndSignature.offset := add(signature.offset, calldataload(add(signature.offset, 64))) - proofAndSignature.length := calldataload(proofAndSignature.offset) + proofAndSignature.length := calldataload(sub(proofAndSignature.offset, 32)) } require(hash == keccak256(rawMessage)); } From 1ec38e194d2885b6899567b49e9e3aecc131ea4d Mon Sep 17 00:00:00 2001 From: leekt Date: Wed, 24 Jan 2024 04:07:16 +0900 Subject: [PATCH 11/36] fix: test for helper --- src/utils/KernelHelper.sol | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/utils/KernelHelper.sol b/src/utils/KernelHelper.sol index 5ab62481..6c6d3e47 100644 --- a/src/utils/KernelHelper.sol +++ b/src/utils/KernelHelper.sol @@ -13,12 +13,13 @@ function _intersectValidationData(ValidationData a, ValidationData b) pure retur // a == 0 || b == 0 || xor(a,b) == 0 // invalidCase : // a mul b != 0 && xor(a,b) != 0 + let sum := shl(96, add(a, b)) switch or( iszero(and(xor(a, b), 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff)), - or(iszero(a), iszero(b)) + or(eq(sum, shl(96, a)), eq(sum, shl(96, b))) ) case 1 { - validationData := and(and(a, b), 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff) + validationData := and(or(a, b), 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff) // validAfter let a_vd := and(0xffffffffffff0000000000000000000000000000000000000000000000000000, a) let b_vd := and(0xffffffffffff0000000000000000000000000000000000000000000000000000, b) From 1283b169347c76731502f20d10e9f767f81da008 Mon Sep 17 00:00:00 2001 From: leekt Date: Wed, 24 Jan 2024 04:07:54 +0900 Subject: [PATCH 12/36] changed validCaller to non-view --- src/Kernel.sol | 4 ++-- src/interfaces/IKernelValidator.sol | 2 +- src/mock/TestValidator.sol | 2 +- test/foundry/KernelHelper.t.sol | 5 +++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Kernel.sol b/src/Kernel.sol index 06bb6b9a..88127185 100644 --- a/src/Kernel.sol +++ b/src/Kernel.sol @@ -323,7 +323,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { /// @dev Check if the current caller is authorized or no to perform the call /// @return True if the caller is authorized, otherwise false - function _checkCaller() internal view returns (bool) { + function _checkCaller() internal returns (bool) { if (_validCaller(msg.sender, msg.data)) { return true; } @@ -388,7 +388,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { /// @param _caller The caller to be checked /// @param _data The data to be checked /// @return True if the caller is valid, otherwise false - function _validCaller(address _caller, bytes calldata _data) internal view virtual returns (bool) { + function _validCaller(address _caller, bytes calldata _data) internal virtual returns (bool) { address validator; assembly { // Load the validator from the storage slot diff --git a/src/interfaces/IKernelValidator.sol b/src/interfaces/IKernelValidator.sol index 4544c92b..df7e0db0 100644 --- a/src/interfaces/IKernelValidator.sol +++ b/src/interfaces/IKernelValidator.sol @@ -18,7 +18,7 @@ interface IKernelValidator { function validateSignature(bytes32 hash, bytes calldata signature) external view returns (ValidationData); - function validCaller(address caller, bytes calldata data) external view returns (bool); + function validCaller(address caller, bytes calldata data) external payable returns (bool); } // 3 modes diff --git a/src/mock/TestValidator.sol b/src/mock/TestValidator.sol index dad5d27e..48cb5f32 100644 --- a/src/mock/TestValidator.sol +++ b/src/mock/TestValidator.sol @@ -49,7 +49,7 @@ contract TestValidator is IKernelValidator { emit TestDisable(_data); } - function validCaller(address _caller, bytes calldata) external view override returns (bool) { + function validCaller(address _caller, bytes calldata) external payable override returns (bool) { return _caller == caller[msg.sender]; } } diff --git a/test/foundry/KernelHelper.t.sol b/test/foundry/KernelHelper.t.sol index 9505db25..7a3fca8e 100644 --- a/test/foundry/KernelHelper.t.sol +++ b/test/foundry/KernelHelper.t.sol @@ -46,8 +46,9 @@ contract KernelHelperTest is Test { ValidationData b = packValidationData(aggregatorB, validAfterB, validUntilB); ValidationData c = _intersectValidationData(a, b); - address expectedAggregator = - aggregatorA == address(0) ? aggregatorB : aggregatorA == aggregatorB ? aggregatorA : address(1); + address expectedAggregator = aggregatorA == address(0) + ? aggregatorB + : aggregatorA == aggregatorB || aggregatorB == address(0) ? aggregatorA : address(1); console.log("expectedAggregator", expectedAggregator); // a : b // 0 : 0 => 0 From 57d53973e73db880f4ee11e60eac00ba8d59ba71 Mon Sep 17 00:00:00 2001 From: leekt Date: Wed, 24 Jan 2024 04:21:07 +0900 Subject: [PATCH 13/36] removed rawMessage, move this to policy...? --- .../ModularPermissionValidator.sol | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/validator/modularPermission/ModularPermissionValidator.sol b/src/validator/modularPermission/ModularPermissionValidator.sol index 888a7a12..00ceb94c 100644 --- a/src/validator/modularPermission/ModularPermissionValidator.sol +++ b/src/validator/modularPermission/ModularPermissionValidator.sol @@ -107,6 +107,7 @@ contract ModularPermissionValidator is IKernelValidator { IPolicy firstPolicy = policy[0]; // NOTE : policy should not be empty array permissions[permissionId][msg.sender] = Permission(nonce, 1, validAfter, validUntil, signer, firstPolicy); for (uint256 i = 1; i < policy.length; i++) { + // TODO: remove infinite loop by forcing incremental address nextPolicy[permissionId][policy[i - 1]][msg.sender] = policy[i]; } emit PermissionRegistered(msg.sender, permissionId); @@ -185,18 +186,12 @@ contract ModularPermissionValidator is IKernelValidator { sigMemory.permissionId = bytes32(signature[0:32]); Permission memory permission = permissions[sigMemory.permissionId][msg.sender]; // signature should be packed with - // (permissionId, rawMessage, [proof || signature]) + // (permissionId, [proof || signature]) bytes calldata proofAndSignature; //) = abi.decode(signature[32:], (bytes, bytes)); - { - bytes calldata rawMessage; - assembly { - rawMessage.offset := add(signature.offset, calldataload(add(signature.offset, 32))) - rawMessage.length := calldataload(sub(rawMessage.offset, 32)) - proofAndSignature.offset := add(signature.offset, calldataload(add(signature.offset, 64))) - proofAndSignature.length := calldataload(sub(proofAndSignature.offset, 32)) - } - require(hash == keccak256(rawMessage)); + assembly { + proofAndSignature.offset := add(signature.offset, calldataload(add(signature.offset, 32))) + proofAndSignature.length := calldataload(sub(proofAndSignature.offset, 32)) } sigMemory.cursor = 0; From f608ae48d74a1be5fe20904c6ed63eb5cae237ae Mon Sep 17 00:00:00 2001 From: leekt Date: Wed, 24 Jan 2024 04:42:39 +0900 Subject: [PATCH 14/36] gas policy example for policy --- src/validator/modularPermission/GasPolicy.sol | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/validator/modularPermission/GasPolicy.sol diff --git a/src/validator/modularPermission/GasPolicy.sol b/src/validator/modularPermission/GasPolicy.sol new file mode 100644 index 00000000..c695163b --- /dev/null +++ b/src/validator/modularPermission/GasPolicy.sol @@ -0,0 +1,56 @@ +pragma solidity ^0.8.0; + +import {UserOperation} from "I4337/interfaces/UserOperation.sol"; +import {ValidationData, ValidUntil, ValidAfter, packValidationData} from "src/common/Types.sol"; +import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; +import {IPolicy} from "./IPolicy.sol"; + +contract GasPolicy is IPolicy { + struct GasPolicyConfig { + uint128 allowed; + bool enforcePaymaster; + address allowedPaymaster; + } + + mapping(bytes32 permissionId => mapping(address kernel => GasPolicyConfig)) public gasPolicyConfig; + + function registerPolicy(address kernel, bytes32 permissionId, bytes calldata data) external payable override { + (uint128 allowed, bool enforcePaymaster, address allowedPaymaster) = abi.decode(data, (uint128, bool, address)); + gasPolicyConfig[permissionId][kernel] = GasPolicyConfig(allowed, enforcePaymaster, allowedPaymaster); + } + + function validatePolicy(address kernel, bytes32 permissionId, UserOperation calldata userOp, bytes calldata) + external + payable + override + returns (ValidationData, uint256 consumedSignatureLength) + { + uint128 maxAmount = uint128( + (userOp.preVerificationGas + userOp.verificationGasLimit + userOp.callGasLimit) * userOp.maxFeePerGas + ); + if (gasPolicyConfig[permissionId][kernel].enforcePaymaster) { + if ( + gasPolicyConfig[permissionId][kernel].allowedPaymaster != address(0) + && address(bytes20(userOp.paymasterAndData[0:20])) + != gasPolicyConfig[permissionId][kernel].allowedPaymaster + ) { + return (SIG_VALIDATION_FAILED, 0); + } + } + if (maxAmount > gasPolicyConfig[permissionId][kernel].allowed) { + return (SIG_VALIDATION_FAILED, 0); + } + gasPolicyConfig[permissionId][kernel].allowed -= maxAmount; + return (ValidationData.wrap(0), 0); + } + + function validateSignature( + address kernel, + address caller, + bytes32 permissionId, + bytes32 messageHash, + bytes calldata signature + ) external view override returns (ValidationData, uint256 consumedSignatureLength) { + return (ValidationData.wrap(0), 0); + } +} From 868c05e3ca0cb129ef9f8e271e9bf8e842f86957 Mon Sep 17 00:00:00 2001 From: leekt Date: Wed, 24 Jan 2024 21:20:19 +0900 Subject: [PATCH 15/36] execute policy for interval based execution limits --- .../modularPermission/ExecutePolicy.sol | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/validator/modularPermission/ExecutePolicy.sol diff --git a/src/validator/modularPermission/ExecutePolicy.sol b/src/validator/modularPermission/ExecutePolicy.sol new file mode 100644 index 00000000..f5751816 --- /dev/null +++ b/src/validator/modularPermission/ExecutePolicy.sol @@ -0,0 +1,49 @@ +pragma solidity ^0.8.0; + +import "./IPolicy.sol"; + +struct ExecutionConfig { + uint48 interval; + uint48 count; + ValidAfter startAt; +} + +contract ExecutePolicy is IPolicy { + mapping(bytes32 permissionId => mapping(address => ExecutionConfig)) public executionConfigs; + + function registerPolicy(address kernel, bytes32 permissionId, bytes calldata policyData) + external + payable + override + { + uint48 delay = uint48(bytes6(policyData[0:6])); + uint48 count = uint48(bytes6(policyData[6:12])); + uint48 startAt = uint48(bytes6(policyData[12:18])); + executionConfigs[permissionId][kernel] = ExecutionConfig(delay, count, ValidAfter.wrap(startAt)); + } + + function validatePolicy(address kernel, bytes32 permissionId, UserOperation calldata, bytes calldata) + external + payable + override + returns (ValidationData, uint256) + { + ExecutionConfig memory config = executionConfigs[permissionId][kernel]; + if (config.count == 0) { + return (SIG_VALIDATION_FAILED, 0); + } + executionConfigs[permissionId][kernel].count = config.count - 1; + executionConfigs[permissionId][kernel].startAt = + ValidAfter.wrap(ValidAfter.unwrap(config.startAt) + config.interval); + return (packValidationData(config.startAt, ValidUntil.wrap(0)), 0); + } + + function validateSignature(address, address, bytes32, bytes32, bytes calldata) + external + view + override + returns (ValidationData, uint256) + { + return (ValidationData.wrap(0), 0); + } +} From 73d5828a403558933d3682de9c42464bc3e32102 Mon Sep 17 00:00:00 2001 From: leekt Date: Wed, 24 Jan 2024 21:20:38 +0900 Subject: [PATCH 16/36] added natspec for modular permission validator --- .../modularPermission/ModularPermissionValidator.sol | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/validator/modularPermission/ModularPermissionValidator.sol b/src/validator/modularPermission/ModularPermissionValidator.sol index 00ceb94c..5e736dbe 100644 --- a/src/validator/modularPermission/ModularPermissionValidator.sol +++ b/src/validator/modularPermission/ModularPermissionValidator.sol @@ -21,6 +21,9 @@ struct Nonce { uint128 latest; uint128 revoked; } +/// @title ModularPermissionValidator +/// @notice ModularPermissionValidator is a Kernel validator that allows to register and revoke permissions +/// @dev modular architecture to allow composable permission system contract ModularPermissionValidator is IKernelValidator { mapping(bytes32 permissionId => mapping(address kernel => Permission)) public permissions; @@ -187,7 +190,6 @@ contract ModularPermissionValidator is IKernelValidator { Permission memory permission = permissions[sigMemory.permissionId][msg.sender]; // signature should be packed with // (permissionId, [proof || signature]) - bytes calldata proofAndSignature; //) = abi.decode(signature[32:], (bytes, bytes)); assembly { proofAndSignature.offset := add(signature.offset, calldataload(add(signature.offset, 32))) From 61457cffd2aa43bd940953fab3d3fe2f8690b9ec Mon Sep 17 00:00:00 2001 From: leekt Date: Mon, 29 Jan 2024 17:44:05 +0900 Subject: [PATCH 17/36] added flag to skip validation data --- foundry.toml | 2 +- src/validator/modularPermission/IPolicy.sol | 4 +- .../ModularPermissionValidator.sol | 208 +++++++++++++----- .../modularPermission/mock/MockPolicy.sol | 8 +- .../{ => policies}/ExecutePolicy.sol | 12 +- .../{ => policies}/GasPolicy.sol | 14 +- .../policies/MerklePolicy.sol | 178 +++++++++++++++ .../modularPermission/ModularPermission.t.sol | 69 ++++-- 8 files changed, 395 insertions(+), 100 deletions(-) rename src/validator/modularPermission/{ => policies}/ExecutePolicy.sol (82%) rename src/validator/modularPermission/{ => policies}/GasPolicy.sol (83%) create mode 100644 src/validator/modularPermission/policies/MerklePolicy.sol diff --git a/foundry.toml b/foundry.toml index 1ea2a0fe..3373bb03 100644 --- a/foundry.toml +++ b/foundry.toml @@ -2,7 +2,7 @@ src = 'src' out = 'out' libs = ['lib'] -solc_version = '0.8.21' +solc_version = '0.8.24' evm_version = 'paris' bytecode_hash = "none" cbor_metadata = false diff --git a/src/validator/modularPermission/IPolicy.sol b/src/validator/modularPermission/IPolicy.sol index 49a3bb2f..58b49cfd 100644 --- a/src/validator/modularPermission/IPolicy.sol +++ b/src/validator/modularPermission/IPolicy.sol @@ -11,12 +11,12 @@ interface IPolicy { bytes32 permissionId, UserOperation calldata userOp, bytes calldata proofAndSig - ) external payable returns (ValidationData, uint256 consumedSignatureLength); + ) external payable returns (ValidationData); function validateSignature( address kernel, address caller, bytes32 permissionId, bytes32 messageHash, bytes calldata signature - ) external view returns (ValidationData, uint256 consumedSignatureLength); + ) external view returns (ValidationData); } diff --git a/src/validator/modularPermission/ModularPermissionValidator.sol b/src/validator/modularPermission/ModularPermissionValidator.sol index 5e736dbe..2f0d60ce 100644 --- a/src/validator/modularPermission/ModularPermissionValidator.sol +++ b/src/validator/modularPermission/ModularPermissionValidator.sol @@ -1,7 +1,7 @@ pragma solidity ^0.8.0; import {UserOperation} from "I4337/interfaces/UserOperation.sol"; -import {ValidationData} from "src/common/Types.sol"; +import {ValidationData, ValidAfter, ValidUntil} from "src/common/Types.sol"; import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; import {IKernelValidator} from "src/interfaces/IKernelValidator.sol"; import {ISigner} from "./ISigner.sol"; @@ -10,24 +10,78 @@ import {_intersectValidationData} from "src/utils/KernelHelper.sol"; struct Permission { uint128 nonce; - uint128 status; // status == 0 => revoked, status == 1 => active - uint48 validAfter; - uint48 validUntil; + bytes12 flag; // flag represents what permission can do ISigner signer; - IPolicy firstPolicy; + PolicyConfig firstPolicy; + ValidAfter validAfter; + ValidUntil validUntil; } struct Nonce { uint128 latest; uint128 revoked; } + +type PolicyConfig is bytes32; + +// PolicyData is a 32 bytes array that contains the address of the policy +// [flags(12 bytes), address(20 bytes)] +// flags is 96 bits that contains the following information +// from last to first bit +// 1 bit : not for validatUserOp +// 1 bit : not for validateSignature +// 1 bit : not for validateCaller +library PolicyConfigLib { + function pack(IPolicy addr, bytes12 flag) internal pure returns (PolicyConfig data) { + assembly { + data := or(addr, shl(160, flag)) + } + } + + function getAddress(PolicyConfig data) internal pure returns (IPolicy policy) { + assembly { + policy := and(data, 0xffffffffffffffffffffffffffffffffffffffff) + } + } + + function getFlags(PolicyConfig data) internal pure returns (bytes12 flags) { + assembly { + flags := shr(160, data) + } + } + + function skipOnValidateUserOp(PolicyConfig data) internal pure returns (bool result) { + assembly { + let flags := shr(160, data) + let mask := 0x1 + result := and(flags, mask) + } + } + + function skipOnValidateSignature(PolicyConfig data) internal pure returns (bool result) { + assembly { + let flags := shr(161, data) + let mask := 0x1 + result := and(flags, mask) + } + } + + function skipOnValidateCaller(PolicyConfig data) internal pure returns (bool result) { + assembly { + let flags := shr(162, data) + let mask := 0x1 + result := and(flags, mask) + } + } +} + /// @title ModularPermissionValidator -/// @notice ModularPermissionValidator is a Kernel validator that allows to register and revoke permissions +/// @notice Validator that allows to register and revoke permissions /// @dev modular architecture to allow composable permission system - contract ModularPermissionValidator is IKernelValidator { mapping(bytes32 permissionId => mapping(address kernel => Permission)) public permissions; - mapping(bytes32 permissionId => mapping(IPolicy policy => mapping(address kernel => IPolicy))) public nextPolicy; + mapping(bytes32 permissionId => mapping(PolicyConfig policy => mapping(address kernel => PolicyConfig))) public + nextPolicy; mapping(address kernel => Nonce) public nonces; event PermissionRegistered(address kernel, bytes32 permissionId); @@ -37,15 +91,26 @@ contract ModularPermissionValidator is IKernelValidator { function getPermissionId( address kernel, uint128 nonce, - uint48 validAfter, - uint48 validUntil, + bytes12 flag, ISigner signer, - IPolicy[] calldata _permissions, + ValidAfter validAfter, + ValidUntil validUntil, + PolicyConfig[] calldata _policyConfig, bytes calldata signerData, - bytes[] calldata permissionData + bytes[] calldata policyData ) public pure returns (bytes32) { return keccak256( - abi.encode(kernel, nonce, validAfter, validUntil, signer, _permissions, signerData, permissionData) + abi.encode( + kernel, + nonce, + flag, + signer, + ValidAfter.unwrap(validAfter), + ValidUntil.unwrap(validUntil), + _policyConfig, + signerData, + policyData + ) ); } @@ -54,20 +119,22 @@ contract ModularPermissionValidator is IKernelValidator { pure returns ( uint128 nonce, - uint48 validAfter, - uint48 validUntil, + bytes12 flag, ISigner signer, - IPolicy[] calldata policies, + ValidAfter validAfter, + ValidUntil validUntil, + PolicyConfig[] calldata policies, bytes calldata signerData, bytes[] calldata policyData ) { nonce = uint128(bytes16(data[0:16])); - validAfter = uint48(bytes6(data[16:22])); - validUntil = uint48(bytes6(data[22:28])); - signer = ISigner(address(bytes20(data[28:48]))); + flag = bytes12(data[16:28]); + validAfter = ValidAfter.wrap(uint48(bytes6(data[28:34]))); + validUntil = ValidUntil.wrap(uint48(bytes6(data[34:40]))); + signer = ISigner(address(bytes20(data[40:60]))); assembly { - let offset := add(data.offset, 48) + let offset := add(data.offset, 60) policies.offset := add(add(offset, 32), calldataload(offset)) policies.length := calldataload(sub(policies.offset, 32)) signerData.offset := add(add(offset, 32), calldataload(add(offset, 32))) @@ -80,37 +147,39 @@ contract ModularPermissionValidator is IKernelValidator { function enable(bytes calldata data) external payable { ( uint128 nonce, - uint48 validAfter, - uint48 validUntil, + bytes12 flag, ISigner signer, - IPolicy[] calldata policies, + ValidAfter validAfter, + ValidUntil validUntil, + PolicyConfig[] calldata policies, bytes calldata signerData, bytes[] calldata policyData ) = parseData(data); - registerPermission(nonce, validAfter, validUntil, signer, policies, signerData, policyData); + registerPermission(nonce, flag, signer, validAfter, validUntil, policies, signerData, policyData); } function registerPermission( uint128 nonce, - uint48 validAfter, - uint48 validUntil, + bytes12 flag, ISigner signer, - IPolicy[] calldata policy, + ValidAfter validAfter, + ValidUntil validUntil, + PolicyConfig[] calldata policy, bytes calldata signerData, bytes[] calldata policyData ) public payable { + require(flag != bytes12(0), "flag should not be empty"); bytes32 permissionId = - getPermissionId(msg.sender, nonce, validAfter, validUntil, signer, policy, signerData, policyData); + getPermissionId(msg.sender, nonce, flag, signer, validAfter, validUntil, policy, signerData, policyData); for (uint256 i = 0; i < policy.length; i++) { - policy[i].registerPolicy(msg.sender, permissionId, policyData[i]); + PolicyConfigLib.getAddress(policy[i]).registerPolicy(msg.sender, permissionId, policyData[i]); } signer.registerSigner(msg.sender, permissionId, signerData); - IPolicy firstPolicy = policy[0]; // NOTE : policy should not be empty array - permissions[permissionId][msg.sender] = Permission(nonce, 1, validAfter, validUntil, signer, firstPolicy); + PolicyConfig firstPolicy = policy[0]; // NOTE : policy should not be empty array + permissions[permissionId][msg.sender] = Permission(nonce, flag, signer, firstPolicy, validAfter, validUntil); for (uint256 i = 1; i < policy.length; i++) { - // TODO: remove infinite loop by forcing incremental address nextPolicy[permissionId][policy[i - 1]][msg.sender] = policy[i]; } emit PermissionRegistered(msg.sender, permissionId); @@ -125,7 +194,7 @@ contract ModularPermissionValidator is IKernelValidator { } function revokePermission(bytes32 permissionId) public payable { - permissions[permissionId][msg.sender].status = 0; + permissions[permissionId][msg.sender].flag = bytes12(0); // NOTE: making flag == 0 makes it invalid emit PermissionRevoked(msg.sender, permissionId); } @@ -142,41 +211,52 @@ contract ModularPermissionValidator is IKernelValidator { require(_userOp.sender == msg.sender, "sender must be msg.sender"); bytes32 permissionId = bytes32(_userOp.signature[0:32]); if ( - address(permissions[permissionId][msg.sender].firstPolicy) != address(0) + address(PolicyConfigLib.getAddress(permissions[permissionId][msg.sender].firstPolicy)) != address(0) && permissions[permissionId][msg.sender].nonce < nonces[msg.sender].revoked ) { return SIG_VALIDATION_FAILED; } Permission memory permission = permissions[permissionId][msg.sender]; - IPolicy policy = permission.firstPolicy; + PolicyConfig policy = permission.firstPolicy; uint256 cursor = 32; - while (address(policy) != address(0)) { - (ValidationData policyValidation, uint256 sigOffset) = - policy.validatePolicy(msg.sender, permissionId, _userOp, _userOp.signature[cursor:]); - // DO validationdata merge + while (address(PolicyConfigLib.getAddress(policy)) != address(0)) { + if (PolicyConfigLib.skipOnValidateUserOp(policy)) { + policy = nextPolicy[permissionId][policy][msg.sender]; + continue; + } + bytes calldata policyData; + if ( + _userOp.signature.length >= cursor + 52 + && address(bytes20(_userOp.signature[cursor:cursor + 20])) + == address(PolicyConfigLib.getAddress(policy)) + ) { + // only when policy address is same as the one in signature + uint256 length = uint256(bytes32(_userOp.signature[cursor + 20:cursor + 52])); + require(_userOp.signature.length >= cursor + 52 + length, "policyData length exceeds signature length"); + policyData = _userOp.signature[cursor + 52:cursor + 52 + length]; // [policyAddress, policyDataLength, policyData] + cursor += 52 + length; + } else { + policyData = _userOp.signature[cursor:cursor]; + } + ValidationData policyValidation = + PolicyConfigLib.getAddress(policy).validatePolicy(msg.sender, permissionId, _userOp, policyData); validationData = _intersectValidationData(validationData, policyValidation); policy = nextPolicy[permissionId][policy][msg.sender]; - cursor += sigOffset; } ValidationData signatureValidation = permission.signer.validateUserOp(msg.sender, permissionId, _userOpHash, _userOp.signature[cursor:]); - // DO validationdata merge validationData = _intersectValidationData(validationData, signatureValidation); } - function validCaller(address caller, bytes calldata data) - external - payable // TODO: this will turn non-view from 2.4 - override - returns (bool) - { + function validCaller(address caller, bytes calldata data) external payable override returns (bool) { revert("not implemented"); } struct ValidationSigMemory { + address caller; bytes32 permissionId; uint256 cursor; - IPolicy policy; + PolicyConfig policy; } function validateSignature(bytes32 hash, bytes calldata signature) @@ -190,6 +270,7 @@ contract ModularPermissionValidator is IKernelValidator { Permission memory permission = permissions[sigMemory.permissionId][msg.sender]; // signature should be packed with // (permissionId, [proof || signature]) + // (permissionId, [ (policyAddress) + (policyProof) || signature] bytes calldata proofAndSignature; //) = abi.decode(signature[32:], (bytes, bytes)); assembly { proofAndSignature.offset := add(signature.offset, calldataload(add(signature.offset, 32))) @@ -198,23 +279,34 @@ contract ModularPermissionValidator is IKernelValidator { sigMemory.cursor = 0; sigMemory.policy = permission.firstPolicy; - while (address(sigMemory.policy) != address(0)) { - (ValidationData policyValidation, uint256 sigOffset) = sigMemory.policy.validateSignature( - msg.sender, - address(bytes20(msg.data[msg.data.length - 20:])), - sigMemory.permissionId, - hash, - proofAndSignature[sigMemory.cursor:] + sigMemory.caller = address(bytes20(msg.data[msg.data.length - 20:])); + while (address(PolicyConfigLib.getAddress(sigMemory.policy)) != address(0)) { + if (PolicyConfigLib.skipOnValidateSignature(sigMemory.policy)) { + sigMemory.policy = nextPolicy[sigMemory.permissionId][sigMemory.policy][msg.sender]; + continue; + } + bytes calldata policyData; + if ( + address(bytes20(proofAndSignature[sigMemory.cursor:sigMemory.cursor + 20])) + == address(PolicyConfigLib.getAddress(sigMemory.policy)) + ) { + // only when policy address is same as the one in signature + uint256 length = uint256(bytes32(proofAndSignature[sigMemory.cursor + 20:sigMemory.cursor + 52])); + policyData = proofAndSignature[sigMemory.cursor + 52:]; // [policyAddress, policyDataLength, policyData] + sigMemory.cursor += 52 + length; + } else { + policyData = proofAndSignature[sigMemory.cursor:sigMemory.cursor]; + // not move cursor here + } + ValidationData policyValidation = PolicyConfigLib.getAddress(sigMemory.policy).validateSignature( + msg.sender, sigMemory.caller, sigMemory.permissionId, hash, policyData ); validationData = _intersectValidationData(validationData, policyValidation); - // DO validationdata merge sigMemory.policy = nextPolicy[sigMemory.permissionId][sigMemory.policy][msg.sender]; - sigMemory.cursor += sigOffset; } ValidationData signatureValidation = permission.signer.validateSignature( msg.sender, sigMemory.permissionId, hash, proofAndSignature[sigMemory.cursor:] ); - // DO validationdata merge validationData = _intersectValidationData(validationData, signatureValidation); } } diff --git a/src/validator/modularPermission/mock/MockPolicy.sol b/src/validator/modularPermission/mock/MockPolicy.sol index 3d56443b..87b505f6 100644 --- a/src/validator/modularPermission/mock/MockPolicy.sol +++ b/src/validator/modularPermission/mock/MockPolicy.sol @@ -26,10 +26,10 @@ contract MockPolicy is IPolicy { external payable override - returns (ValidationData, uint256 consumedSignatureLength) + returns (ValidationData) { count[permissionId]++; - return (validationData, sigConsume); + return validationData; } function validateSignature( @@ -38,7 +38,7 @@ contract MockPolicy is IPolicy { bytes32 permissionId, bytes32 messageHash, bytes calldata signature - ) external view override returns (ValidationData, uint256 consumedSignatureLength) { - return (validationData, sigConsume); + ) external view override returns (ValidationData) { + return validationData; } } diff --git a/src/validator/modularPermission/ExecutePolicy.sol b/src/validator/modularPermission/policies/ExecutePolicy.sol similarity index 82% rename from src/validator/modularPermission/ExecutePolicy.sol rename to src/validator/modularPermission/policies/ExecutePolicy.sol index f5751816..9ccbf514 100644 --- a/src/validator/modularPermission/ExecutePolicy.sol +++ b/src/validator/modularPermission/policies/ExecutePolicy.sol @@ -1,6 +1,6 @@ pragma solidity ^0.8.0; -import "./IPolicy.sol"; +import "../IPolicy.sol"; struct ExecutionConfig { uint48 interval; @@ -26,24 +26,24 @@ contract ExecutePolicy is IPolicy { external payable override - returns (ValidationData, uint256) + returns (ValidationData) { ExecutionConfig memory config = executionConfigs[permissionId][kernel]; if (config.count == 0) { - return (SIG_VALIDATION_FAILED, 0); + return SIG_VALIDATION_FAILED; } executionConfigs[permissionId][kernel].count = config.count - 1; executionConfigs[permissionId][kernel].startAt = ValidAfter.wrap(ValidAfter.unwrap(config.startAt) + config.interval); - return (packValidationData(config.startAt, ValidUntil.wrap(0)), 0); + return packValidationData(config.startAt, ValidUntil.wrap(0)); } function validateSignature(address, address, bytes32, bytes32, bytes calldata) external view override - returns (ValidationData, uint256) + returns (ValidationData) { - return (ValidationData.wrap(0), 0); + return ValidationData.wrap(0); } } diff --git a/src/validator/modularPermission/GasPolicy.sol b/src/validator/modularPermission/policies/GasPolicy.sol similarity index 83% rename from src/validator/modularPermission/GasPolicy.sol rename to src/validator/modularPermission/policies/GasPolicy.sol index c695163b..08dd422c 100644 --- a/src/validator/modularPermission/GasPolicy.sol +++ b/src/validator/modularPermission/policies/GasPolicy.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import {UserOperation} from "I4337/interfaces/UserOperation.sol"; import {ValidationData, ValidUntil, ValidAfter, packValidationData} from "src/common/Types.sol"; import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; -import {IPolicy} from "./IPolicy.sol"; +import {IPolicy} from "../IPolicy.sol"; contract GasPolicy is IPolicy { struct GasPolicyConfig { @@ -23,7 +23,7 @@ contract GasPolicy is IPolicy { external payable override - returns (ValidationData, uint256 consumedSignatureLength) + returns (ValidationData) { uint128 maxAmount = uint128( (userOp.preVerificationGas + userOp.verificationGasLimit + userOp.callGasLimit) * userOp.maxFeePerGas @@ -34,14 +34,14 @@ contract GasPolicy is IPolicy { && address(bytes20(userOp.paymasterAndData[0:20])) != gasPolicyConfig[permissionId][kernel].allowedPaymaster ) { - return (SIG_VALIDATION_FAILED, 0); + return SIG_VALIDATION_FAILED; } } if (maxAmount > gasPolicyConfig[permissionId][kernel].allowed) { - return (SIG_VALIDATION_FAILED, 0); + return SIG_VALIDATION_FAILED; } gasPolicyConfig[permissionId][kernel].allowed -= maxAmount; - return (ValidationData.wrap(0), 0); + return ValidationData.wrap(0); } function validateSignature( @@ -50,7 +50,7 @@ contract GasPolicy is IPolicy { bytes32 permissionId, bytes32 messageHash, bytes calldata signature - ) external view override returns (ValidationData, uint256 consumedSignatureLength) { - return (ValidationData.wrap(0), 0); + ) external view override returns (ValidationData) { + return ValidationData.wrap(0); } } diff --git a/src/validator/modularPermission/policies/MerklePolicy.sol b/src/validator/modularPermission/policies/MerklePolicy.sol new file mode 100644 index 00000000..10fcab46 --- /dev/null +++ b/src/validator/modularPermission/policies/MerklePolicy.sol @@ -0,0 +1,178 @@ +pragma solidity ^0.8.0; + +import "../IPolicy.sol"; +import {Kernel} from "../../../Kernel.sol"; +import {ParamCondition, Operation} from "../../../common/Enums.sol"; +import {Call} from "../../../common/Structs.sol"; +import {MerkleProofLib} from "solady/utils/MerkleProofLib.sol"; + +struct Permission { + address target; + bytes4 sig; + uint256 valueLimit; + ParamRule[] rules; + Operation operation; +} + +struct ParamRule { + uint256 offset; + ParamCondition condition; + bytes32 param; +} + +contract MerklePolicy is IPolicy { + error MerklePolicyError(uint256 code); // todo: should policy revert instead of returning SIG_VALIDATION_FAILED? + + mapping(bytes32 => mapping(address => bytes32)) public merkleRoot; + + function registerPolicy(address kernel, bytes32 permissionId, bytes calldata policyData) external payable { + bytes32 root = bytes32(policyData[0:32]); + merkleRoot[permissionId][kernel] = root; + } + + function validatePolicy(address kernel, bytes32 permissionId, UserOperation calldata userOp, bytes calldata proof) + external + payable + returns (ValidationData) + { + bytes calldata callData = userOp.callData; + bytes32 root = merkleRoot[permissionId][kernel]; + bytes4 sig = bytes4(userOp.signature[0:4]); + if (sig == Kernel.execute.selector || sig == Kernel.executeDelegateCall.selector) { + (Permission calldata permission, bytes32[] calldata merkleProof) = _getPermission(userOp.signature[85:]); + bool verifyFailed = _verifyParam(root, callData, permission, merkleProof); + if (verifyFailed) { + revert MerklePolicyError(1); // merkle proof verification failed + } + return ValidationData.wrap(0); + } else if (sig == Kernel.executeBatch.selector) { + Permission[] calldata permissions = _getPermissions(userOp.signature[85:]); + bytes32[][] calldata merkleProof = _getProofs(userOp.signature[85:]); + bool verifyFailed = _verifyParams(root, callData, permissions, merkleProof); + if (verifyFailed) { + revert MerklePolicyError(1); // merkle proof verification failed + } + return ValidationData.wrap(0); + } else { + revert MerklePolicyError(0); // unknown selector + } + } + + function _verifyParams( + bytes32 root, + bytes calldata callData, + Permission[] calldata _permissions, + bytes32[][] calldata _merkleProof + ) internal returns (bool verifyFailed) { + Call[] calldata calls; + assembly { + calls.offset := add(add(callData.offset, 0x24), calldataload(add(callData.offset, 4))) + calls.length := calldataload(add(add(callData.offset, 4), calldataload(add(callData.offset, 4)))) + } + uint256 i = 0; + for (i = 0; i < calls.length; i++) { + Call calldata call = calls[i]; + Permission calldata permission = _permissions[i]; + require( + permission.target == address(0) || call.to == permission.target, "SessionKeyValidator: target mismatch" + ); + require(uint256(bytes32(call.value)) <= permission.valueLimit, "SessionKeyValidator: value limit exceeded"); + require(verifyPermission(call.data, permission), "SessionKeyValidator: permission verification failed"); + if (!MerkleProofLib.verify(_merkleProof[i], root, keccak256(abi.encode(permission)))) { + return true; + } + } + } + + // to parse batch execute permissions + function _getPermissions(bytes calldata _sig) internal pure returns (Permission[] calldata permissions) { + assembly { + permissions.offset := add(add(_sig.offset, 0x20), calldataload(_sig.offset)) + permissions.length := calldataload(add(_sig.offset, calldataload(_sig.offset))) + } + } + + function _getProofs(bytes calldata _sig) internal pure returns (bytes32[][] calldata proofs) { + assembly { + proofs.length := calldataload(add(_sig.offset, calldataload(add(_sig.offset, 0x20)))) + proofs.offset := add(add(_sig.offset, 0x20), calldataload(add(_sig.offset, 0x20))) + } + } + + // to parse single execute permission + function _getPermission(bytes calldata _sig) + internal + pure + returns (Permission calldata permission, bytes32[] calldata merkleProof) + { + assembly { + permission := add(_sig.offset, calldataload(_sig.offset)) + merkleProof.length := calldataload(add(_sig.offset, calldataload(add(_sig.offset, 0x20)))) + merkleProof.offset := add(add(_sig.offset, 0x20), calldataload(add(_sig.offset, 0x20))) + } + } + + function _verifyParam( + bytes32 root, + bytes calldata callData, + Permission calldata _permission, + bytes32[] calldata _merkleProof + ) internal returns (bool verifyFailed) { + bool isExecute = bytes4(callData[0:4]) == Kernel.execute.selector; + require( + _permission.target == address(0) || address(bytes20(callData[16:36])) == _permission.target, + "SessionKeyValidator: target mismatch" + ); + if (isExecute) { + require( + uint256(bytes32(callData[36:68])) <= _permission.valueLimit, "SessionKeyValidator: value limit exceeded" + ); + } else { + require(_permission.operation == Operation.DelegateCall, "SessionKeyValidator: operation mismatch"); + } + bytes calldata data; + uint8 dataParamOffset = isExecute ? 0x44 : 0x24; + assembly { + let dataOffset := add(add(callData.offset, 0x04), calldataload(add(callData.offset, dataParamOffset))) + let length := calldataload(dataOffset) + data.offset := add(dataOffset, 32) + data.length := length + } + require(verifyPermission(data, _permission), "SessionKeyValidator: permission verification failed"); + if (!MerkleProofLib.verify(_merkleProof, root, keccak256(abi.encode(_permission)))) { + return true; + } + } + + function verifyPermission(bytes calldata data, Permission calldata permission) internal pure returns (bool) { + if (bytes4(data[0:4]) != permission.sig) return false; + for (uint256 i = 0; i < permission.rules.length; i++) { + ParamRule calldata rule = permission.rules[i]; + bytes32 param = bytes32(data[4 + rule.offset:4 + rule.offset + 32]); + if (rule.condition == ParamCondition.EQUAL && param != rule.param) { + return false; + } else if (rule.condition == ParamCondition.GREATER_THAN && param <= rule.param) { + return false; + } else if (rule.condition == ParamCondition.LESS_THAN && param >= rule.param) { + return false; + } else if (rule.condition == ParamCondition.GREATER_THAN_OR_EQUAL && param < rule.param) { + return false; + } else if (rule.condition == ParamCondition.LESS_THAN_OR_EQUAL && param > rule.param) { + return false; + } else if (rule.condition == ParamCondition.NOT_EQUAL && param == rule.param) { + return false; + } + } + return true; + } + + function validateSignature( + address kernel, + address caller, + bytes32 permissionId, + bytes32 messageHash, + bytes calldata signature + ) external view returns (ValidationData) { + return ValidationData.wrap(0); + } +} diff --git a/test/foundry/validator/modularPermission/ModularPermission.t.sol b/test/foundry/validator/modularPermission/ModularPermission.t.sol index 55dc933a..7abb7f32 100644 --- a/test/foundry/validator/modularPermission/ModularPermission.t.sol +++ b/test/foundry/validator/modularPermission/ModularPermission.t.sol @@ -20,15 +20,16 @@ contract ModularPermissionTest is Test { function testParseData() external { uint48 until = uint48(block.timestamp + 100); bytes memory sd = abi.encodePacked("hello world"); - address[] memory p = new address[](2); - p[0] = address(0xdeadbeef); - p[1] = address(0xcafecafe); + PolicyConfig[] memory p = new PolicyConfig[](2); + p[0] = PolicyConfigLib.pack(IPolicy(address(0xdeadbeef)), toFlag(0)); + p[1] = PolicyConfigLib.pack(IPolicy(address(0xcafecafe)), toFlag(0)); bytes[] memory pd = new bytes[](2); pd[0] = abi.encodePacked("policy data 1"); pd[1] = abi.encodePacked("policy data 2"); bytes memory data = abi.encodePacked( abi.encodePacked( uint128(0), // nonce + toFlag(1), uint48(1), //`validAfter until, // validUntil address(0xdead) @@ -37,19 +38,21 @@ contract ModularPermissionTest is Test { ); ( uint128 nonce, - uint48 validAfter, - uint48 validUntil, + bytes12 flag, ISigner signer, - IPolicy[] memory policies, + ValidAfter validAfter, + ValidUntil validUntil, + PolicyConfig[] memory policies, bytes memory signerData, bytes[] memory policyData ) = validator.parseData(data); assertEq(nonce, uint128(0)); - assertEq(validAfter, uint48(1)); - assertEq(validUntil, until); + assertEq(flag, toFlag(1)); + assertEq(ValidAfter.unwrap(validAfter), uint48(1)); + assertEq(ValidUntil.unwrap(validUntil), until); assertEq(address(signer), address(0xdead)); - assertEq(address(policies[0]), address(0xdeadbeef)); - assertEq(address(policies[1]), address(0xcafecafe)); + assertEq(address(PolicyConfigLib.getAddress(policies[0])), address(0xdeadbeef)); + assertEq(address(PolicyConfigLib.getAddress(policies[1])), address(0xcafecafe)); assertEq(signerData, abi.encodePacked("hello world")); assertEq(policyData[0], abi.encodePacked("policy data 1")); assertEq(policyData[1], abi.encodePacked("policy data 2")); @@ -58,13 +61,14 @@ contract ModularPermissionTest is Test { function testRegister() external { uint48 until = uint48(block.timestamp + 100); bytes memory sd = abi.encodePacked("hello signer"); - address[] memory p = new address[](1); - p[0] = address(mockPolicy); + PolicyConfig[] memory p = new PolicyConfig[](1); + p[0] = PolicyConfigLib.pack(IPolicy(address(mockPolicy)), toFlag(0)); bytes[] memory pd = new bytes[](1); pd[0] = abi.encodePacked("hello policy"); bytes memory data = abi.encodePacked( abi.encodePacked( uint128(0), // nonce + toFlag(1), //flag uint48(1), //`validAfter until, // validUntil address(mockSigner) @@ -76,17 +80,28 @@ contract ModularPermissionTest is Test { function testValidateUserOp() external { address kernel = makeAddr("Kernel"); - uint48 until = uint48(block.timestamp + 100); + ValidUntil until = ValidUntil.wrap(uint48(block.timestamp + 100)); bytes memory sd = abi.encodePacked("hello signer"); - IPolicy[] memory p = new IPolicy[](1); - p[0] = mockPolicy; + PolicyConfig[] memory p = new PolicyConfig[](1); + p[0] = PolicyConfigLib.pack(mockPolicy, toFlag(0)); bytes[] memory pd = new bytes[](1); pd[0] = abi.encodePacked("hello policy"); - bytes32 permissionId = validator.getPermissionId(kernel, 0, uint48(1), until, mockSigner, p, sd, pd); + bytes32 permissionId = validator.getPermissionId( + kernel, + 0, + toFlag(1), // flag + mockSigner, + ValidAfter.wrap(1), + until, + p, + sd, + pd + ); bytes memory data = abi.encodePacked( abi.encodePacked( uint128(0), // nonce + toFlag(1), //flag uint48(1), //`validAfter until, // validUntil address(mockSigner) @@ -97,14 +112,20 @@ contract ModularPermissionTest is Test { validator.enable(data); vm.stopPrank(); - (uint128 nonce, uint128 status, uint48 validAfter, uint48 validUntil, ISigner signer, IPolicy firstPolicy) = - validator.permissions(permissionId, kernel); + ( + uint128 nonce, + bytes12 flag, + ISigner signer, + PolicyConfig firstPolicy, + ValidAfter validAfter, + ValidUntil validUntil + ) = validator.permissions(permissionId, kernel); assertEq(nonce, uint128(0)); - assertEq(status, uint128(1)); - assertEq(validAfter, uint48(1)); - assertEq(validUntil, until); + assertEq(flag, toFlag(1)); + assertEq(ValidAfter.unwrap(validAfter), uint48(1)); + assertEq(ValidUntil.unwrap(validUntil), ValidUntil.unwrap(until)); assertEq(address(signer), address(mockSigner)); - assertEq(address(firstPolicy), address(mockPolicy)); + assertEq(address(PolicyConfigLib.getAddress(firstPolicy)), address(mockPolicy)); assertEq(mockSigner.signerData(), sd); assertEq(mockPolicy.policyData(), pd[0]); @@ -119,3 +140,7 @@ contract ModularPermissionTest is Test { assertEq(mockPolicy.count(permissionId), 1); } } + +function toFlag(uint256 x) returns (bytes12) { + return bytes12(bytes32(x << 160)); +} From b83c6b35ae7dc8b497b43237aac8c449b0f4566c Mon Sep 17 00:00:00 2001 From: leekt Date: Mon, 29 Jan 2024 18:05:06 +0900 Subject: [PATCH 18/36] moved policy config to separate file --- src/Kernel.sol | 1 + .../ModularPermissionValidator.sol | 54 +----------------- .../modularPermission/PolicyConfig.sol | 56 +++++++++++++++++++ 3 files changed, 58 insertions(+), 53 deletions(-) create mode 100644 src/validator/modularPermission/PolicyConfig.sol diff --git a/src/Kernel.sol b/src/Kernel.sol index 88127185..615ac02b 100644 --- a/src/Kernel.sol +++ b/src/Kernel.sol @@ -381,6 +381,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { abi.encodeWithSelector(IKernelValidator.validateSignature.selector, _hash, _signature), msg.sender ) ); + require(success, "Kernel::_validateSignature: failed to validate signature"); return abi.decode(res, (ValidationData)); } diff --git a/src/validator/modularPermission/ModularPermissionValidator.sol b/src/validator/modularPermission/ModularPermissionValidator.sol index 2f0d60ce..03a115ce 100644 --- a/src/validator/modularPermission/ModularPermissionValidator.sol +++ b/src/validator/modularPermission/ModularPermissionValidator.sol @@ -7,6 +7,7 @@ import {IKernelValidator} from "src/interfaces/IKernelValidator.sol"; import {ISigner} from "./ISigner.sol"; import {IPolicy} from "./IPolicy.sol"; import {_intersectValidationData} from "src/utils/KernelHelper.sol"; +import {PolicyConfig, PolicyConfigLib} from "./PolicyConfig.sol"; struct Permission { uint128 nonce; @@ -22,59 +23,6 @@ struct Nonce { uint128 revoked; } -type PolicyConfig is bytes32; - -// PolicyData is a 32 bytes array that contains the address of the policy -// [flags(12 bytes), address(20 bytes)] -// flags is 96 bits that contains the following information -// from last to first bit -// 1 bit : not for validatUserOp -// 1 bit : not for validateSignature -// 1 bit : not for validateCaller -library PolicyConfigLib { - function pack(IPolicy addr, bytes12 flag) internal pure returns (PolicyConfig data) { - assembly { - data := or(addr, shl(160, flag)) - } - } - - function getAddress(PolicyConfig data) internal pure returns (IPolicy policy) { - assembly { - policy := and(data, 0xffffffffffffffffffffffffffffffffffffffff) - } - } - - function getFlags(PolicyConfig data) internal pure returns (bytes12 flags) { - assembly { - flags := shr(160, data) - } - } - - function skipOnValidateUserOp(PolicyConfig data) internal pure returns (bool result) { - assembly { - let flags := shr(160, data) - let mask := 0x1 - result := and(flags, mask) - } - } - - function skipOnValidateSignature(PolicyConfig data) internal pure returns (bool result) { - assembly { - let flags := shr(161, data) - let mask := 0x1 - result := and(flags, mask) - } - } - - function skipOnValidateCaller(PolicyConfig data) internal pure returns (bool result) { - assembly { - let flags := shr(162, data) - let mask := 0x1 - result := and(flags, mask) - } - } -} - /// @title ModularPermissionValidator /// @notice Validator that allows to register and revoke permissions /// @dev modular architecture to allow composable permission system diff --git a/src/validator/modularPermission/PolicyConfig.sol b/src/validator/modularPermission/PolicyConfig.sol new file mode 100644 index 00000000..63f0faac --- /dev/null +++ b/src/validator/modularPermission/PolicyConfig.sol @@ -0,0 +1,56 @@ +pragma solidity ^0.8.0; + +import "./IPolicy.sol"; + +type PolicyConfig is bytes32; + +// PolicyData is a 32 bytes array that contains the address of the policy +// [flags(12 bytes), address(20 bytes)] +// flags is 96 bits that contains the following information +// from last to first bit +// 1 bit : not for validatUserOp +// 1 bit : not for validateSignature +// 1 bit : not for validateCaller +library PolicyConfigLib { + function pack(IPolicy addr, bytes12 flag) internal pure returns (PolicyConfig data) { + assembly { + data := or(addr, shl(160, flag)) + } + } + + function getAddress(PolicyConfig data) internal pure returns (IPolicy policy) { + assembly { + policy := and(data, 0xffffffffffffffffffffffffffffffffffffffff) + } + } + + function getFlags(PolicyConfig data) internal pure returns (bytes12 flags) { + assembly { + flags := shr(160, data) + } + } + + function skipOnValidateUserOp(PolicyConfig data) internal pure returns (bool result) { + assembly { + let flags := shr(160, data) + let mask := 0x1 + result := and(flags, mask) + } + } + + function skipOnValidateSignature(PolicyConfig data) internal pure returns (bool result) { + assembly { + let flags := shr(161, data) + let mask := 0x1 + result := and(flags, mask) + } + } + + function skipOnValidateCaller(PolicyConfig data) internal pure returns (bool result) { + assembly { + let flags := shr(162, data) + let mask := 0x1 + result := and(flags, mask) + } + } +} From d9833ea6ebe9ce1ba022951d32a63bef6f19a37d Mon Sep 17 00:00:00 2001 From: leekt Date: Tue, 30 Jan 2024 00:32:50 +0900 Subject: [PATCH 19/36] remapping to includ I4337 --- remappings.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/remappings.txt b/remappings.txt index 82c83131..ad991f0e 100644 --- a/remappings.txt +++ b/remappings.txt @@ -2,4 +2,5 @@ ds-test/=lib/forge-std/lib/ds-test/src/ forge-std/=lib/forge-std/src/ solady/=lib/solady/src/ p256-verifier/=lib/p256-verifier/src/ -FreshCryptoLib/=lib/FreshCryptoLib/solidity/src/ \ No newline at end of file +FreshCryptoLib/=lib/FreshCryptoLib/solidity/src/ +I4337/=lib/I4337/src/ From e71af040e7c3cb2136c8ae145a837916c727dce6 Mon Sep 17 00:00:00 2001 From: leekt Date: Tue, 30 Jan 2024 22:12:57 +0900 Subject: [PATCH 20/36] temp --- lib/FreshCryptoLib | 1 + lib/forge-std | 2 +- lib/solady | 2 +- .../modularPermission/.IPolicy.sol.swp | Bin 0 -> 12288 bytes .../ModularPermissionValidator.sol | 4 +- .../modularPermission/signers/ECDSASigner.sol | 42 ++++++++++++++++++ .../modularPermission/ModularPermission.t.sol | 1 - 7 files changed, 46 insertions(+), 6 deletions(-) create mode 160000 lib/FreshCryptoLib create mode 100644 src/validator/modularPermission/.IPolicy.sol.swp create mode 100644 src/validator/modularPermission/signers/ECDSASigner.sol diff --git a/lib/FreshCryptoLib b/lib/FreshCryptoLib new file mode 160000 index 00000000..d9bb3b0f --- /dev/null +++ b/lib/FreshCryptoLib @@ -0,0 +1 @@ +Subproject commit d9bb3b0fc6b737af2c70dab246cabbc7d05afc3c diff --git a/lib/forge-std b/lib/forge-std index 2f112697..4513bc20 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit 2f112697506eab12d433a65fdc31a639548fe365 +Subproject commit 4513bc2063f23c57bee6558799584b518d387a39 diff --git a/lib/solady b/lib/solady index cb801a60..a6a95729 160000 --- a/lib/solady +++ b/lib/solady @@ -1 +1 @@ -Subproject commit cb801a60f8319a148697b09d19b748d04e3d65c4 +Subproject commit a6a95729f947bb2a24e05e862ba9522c10453a70 diff --git a/src/validator/modularPermission/.IPolicy.sol.swp b/src/validator/modularPermission/.IPolicy.sol.swp new file mode 100644 index 0000000000000000000000000000000000000000..abe37fafe19917979744a748f714f15bcd2e669d GIT binary patch literal 12288 zcmeI2%Wl&^6ow~Ux}tzUVuv&Y30f(MLxV(7R)J8kXlbN0SyD~xaccQ8*3391sRFEc z03L-6PXb~M3)t}roY;;-98?55&>88M?YW#Y=No$wMT%ZKp>2_OL^fCP{L58)p z@6LC!k!1U+)QFAQz~_HnT$DJe!K^Kuyn>$Mav!$OlH@suIO$$&Il%-JPA~M-f>IxM zT1{T9P_+kd`wqc literal 0 HcmV?d00001 diff --git a/src/validator/modularPermission/ModularPermissionValidator.sol b/src/validator/modularPermission/ModularPermissionValidator.sol index 03a115ce..ffa47867 100644 --- a/src/validator/modularPermission/ModularPermissionValidator.sol +++ b/src/validator/modularPermission/ModularPermissionValidator.sol @@ -37,7 +37,6 @@ contract ModularPermissionValidator is IKernelValidator { event NonceRevoked(address kernel, uint256 nonce); function getPermissionId( - address kernel, uint128 nonce, bytes12 flag, ISigner signer, @@ -49,7 +48,6 @@ contract ModularPermissionValidator is IKernelValidator { ) public pure returns (bytes32) { return keccak256( abi.encode( - kernel, nonce, flag, signer, @@ -118,7 +116,7 @@ contract ModularPermissionValidator is IKernelValidator { ) public payable { require(flag != bytes12(0), "flag should not be empty"); bytes32 permissionId = - getPermissionId(msg.sender, nonce, flag, signer, validAfter, validUntil, policy, signerData, policyData); + getPermissionId(nonce, flag, signer, validAfter, validUntil, policy, signerData, policyData); for (uint256 i = 0; i < policy.length; i++) { PolicyConfigLib.getAddress(policy[i]).registerPolicy(msg.sender, permissionId, policyData[i]); diff --git a/src/validator/modularPermission/signers/ECDSASigner.sol b/src/validator/modularPermission/signers/ECDSASigner.sol new file mode 100644 index 00000000..a4eef953 --- /dev/null +++ b/src/validator/modularPermission/signers/ECDSASigner.sol @@ -0,0 +1,42 @@ +pragma solidity ^0.8.0; + +import {ECDSA} from "solady/utils/ECDSA.sol"; +import {ISigner} from "../ISigner.sol"; +import {ValidationData} from "../../../common/Types.sol"; + +contract ECDSASigner is ISigner{ + using ECDSA for bytes32; + + mapping(bytes32 permissionId => mapping(address kernel => address)) public signer; + + function registerSigner(address kernel, bytes32 permissionId, bytes calldata data) external payable override { + require(signer[permissionId][kernel] == address(0), "ECDSASigner: kernel already registered"); + require(data.length == 20, "ECDSASigner: invalid signer address"); + address signerAddress = address(bytes20(data[0:20])); + signer[permissionId][kernel] = signerAddress; + } + + function validateUserOp( + address kernel, + bytes32 permissionId, + bytes32 userOpHash, + bytes calldata signature + ) external payable override returns (ValidationData) { + require(signer[permissionId][kernel] != address(0), "ECDSASigner: kernel not registered"); + address recovered = userOpHash.recover(signature); + require(recovered == signer[permissionId][kernel], "ECDSASigner: invalid signature"); + return ValidationData.wrap(0); + } + + function validateSignature( + address kernel, + bytes32 permissionId, + bytes32 messageHash, + bytes calldata signature + ) external view override returns (ValidationData) { + require(signer[permissionId][kernel] != address(0), "ECDSASigner: kernel not registered"); + address recovered = messageHash.recover(signature); + require(recovered == signer[permissionId][kernel], "ECDSASigner: invalid signature"); + return ValidationData.wrap(0); + } +} diff --git a/test/foundry/validator/modularPermission/ModularPermission.t.sol b/test/foundry/validator/modularPermission/ModularPermission.t.sol index 7abb7f32..386555c0 100644 --- a/test/foundry/validator/modularPermission/ModularPermission.t.sol +++ b/test/foundry/validator/modularPermission/ModularPermission.t.sol @@ -87,7 +87,6 @@ contract ModularPermissionTest is Test { bytes[] memory pd = new bytes[](1); pd[0] = abi.encodePacked("hello policy"); bytes32 permissionId = validator.getPermissionId( - kernel, 0, toFlag(1), // flag mockSigner, From d9c23c6ca8ff30f3d5bcfa450d5278a57351c873 Mon Sep 17 00:00:00 2001 From: leekt Date: Wed, 31 Jan 2024 02:34:32 +0900 Subject: [PATCH 21/36] modular permission test without validCaller support --- foundry.toml | 2 +- src/utils/KernelTestBase.sol | 6 + .../modularPermission/.IPolicy.sol.swp | Bin 12288 -> 0 bytes src/validator/modularPermission/IPolicy.sol | 2 +- .../ModularPermissionValidator.sol | 13 +- .../modularPermission/PolicyConfig.sol | 11 +- .../modularPermission/SignaturePolicy.sol | 34 +++ .../modularPermission/mock/MockPolicy.sol | 10 +- .../policies/ExecutePolicy.sol | 13 +- .../modularPermission/policies/GasPolicy.sol | 17 +- .../policies/MerklePolicy.sol | 21 +- .../modularPermission/signers/ECDSASigner.sol | 51 ++-- .../modularPermission/ModularPermission.t.sol | 276 +++++++++++++++++- 13 files changed, 391 insertions(+), 65 deletions(-) delete mode 100644 src/validator/modularPermission/.IPolicy.sol.swp create mode 100644 src/validator/modularPermission/SignaturePolicy.sol diff --git a/foundry.toml b/foundry.toml index 3373bb03..1ea2a0fe 100644 --- a/foundry.toml +++ b/foundry.toml @@ -2,7 +2,7 @@ src = 'src' out = 'out' libs = ['lib'] -solc_version = '0.8.24' +solc_version = '0.8.21' evm_version = 'paris' bytecode_hash = "none" cbor_metadata = false diff --git a/src/utils/KernelTestBase.sol b/src/utils/KernelTestBase.sol index 1a669ced..04c37aca 100644 --- a/src/utils/KernelTestBase.sol +++ b/src/utils/KernelTestBase.sol @@ -203,14 +203,18 @@ abstract contract KernelTestBase is Test { ) ); bytes memory sig = signHash(digest); + vm.startPrank(makeAddr("app")); assertEq(kernel.isValidSignature(hash, sig), Kernel.isValidSignature.selector); assertEq(kernel2.isValidSignature(hash, sig), bytes4(0xffffffff)); + vm.stopPrank(); } function test_fail_validate_wrongsignature() external virtual { bytes32 hash = keccak256(abi.encodePacked("hello world")); bytes memory sig = getWrongSignature(hash); + vm.startPrank(makeAddr("app")); assertEq(kernel.isValidSignature(hash, sig), bytes4(0xffffffff)); + vm.stopPrank(); } function test_fail_validate_not_activate() external virtual { @@ -223,12 +227,14 @@ abstract contract KernelTestBase is Test { vm.warp(100000); + vm.startPrank(makeAddr("app")); bytes32 hash = keccak256(abi.encodePacked("hello world")); assertEq(kernel.isValidSignature(hash, ""), bytes4(0xffffffff)); newDefaultValidator.setData(true, uint48(block.timestamp + 1000), uint48(0)); assertEq(kernel.isValidSignature(hash, ""), bytes4(0xffffffff)); newDefaultValidator.setData(true, uint48(0), uint48(block.timestamp - 1000)); assertEq(kernel.isValidSignature(hash, ""), bytes4(0xffffffff)); + vm.stopPrank(); } function test_should_emit_event_on_receive() external { diff --git a/src/validator/modularPermission/.IPolicy.sol.swp b/src/validator/modularPermission/.IPolicy.sol.swp deleted file mode 100644 index abe37fafe19917979744a748f714f15bcd2e669d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2%Wl&^6ow~Ux}tzUVuv&Y30f(MLxV(7R)J8kXlbN0SyD~xaccQ8*3391sRFEc z03L-6PXb~M3)t}roY;;-98?55&>88M?YW#Y=No$wMT%ZKp>2_OL^fCP{L58)p z@6LC!k!1U+)QFAQz~_HnT$DJe!K^Kuyn>$Mav!$OlH@suIO$$&Il%-JPA~M-f>IxM zT1{T9P_+kd`wqc diff --git a/src/validator/modularPermission/IPolicy.sol b/src/validator/modularPermission/IPolicy.sol index 58b49cfd..424988ca 100644 --- a/src/validator/modularPermission/IPolicy.sol +++ b/src/validator/modularPermission/IPolicy.sol @@ -6,7 +6,7 @@ import {UserOperation} from "I4337/interfaces/UserOperation.sol"; interface IPolicy { function registerPolicy(address kernel, bytes32 permissionId, bytes calldata policyData) external payable; - function validatePolicy( + function checkUserOpPolicy( address kernel, bytes32 permissionId, UserOperation calldata userOp, diff --git a/src/validator/modularPermission/ModularPermissionValidator.sol b/src/validator/modularPermission/ModularPermissionValidator.sol index ffa47867..ddb66982 100644 --- a/src/validator/modularPermission/ModularPermissionValidator.sol +++ b/src/validator/modularPermission/ModularPermissionValidator.sol @@ -119,6 +119,7 @@ contract ModularPermissionValidator is IKernelValidator { getPermissionId(nonce, flag, signer, validAfter, validUntil, policy, signerData, policyData); for (uint256 i = 0; i < policy.length; i++) { + //TODO make sure address of the policy is sorted PolicyConfigLib.getAddress(policy[i]).registerPolicy(msg.sender, permissionId, policyData[i]); } signer.registerSigner(msg.sender, permissionId, signerData); @@ -159,6 +160,7 @@ contract ModularPermissionValidator is IKernelValidator { if ( address(PolicyConfigLib.getAddress(permissions[permissionId][msg.sender].firstPolicy)) != address(0) && permissions[permissionId][msg.sender].nonce < nonces[msg.sender].revoked + && permissions[permissionId][msg.sender].flag != bytes12(0) ) { return SIG_VALIDATION_FAILED; } @@ -185,7 +187,7 @@ contract ModularPermissionValidator is IKernelValidator { policyData = _userOp.signature[cursor:cursor]; } ValidationData policyValidation = - PolicyConfigLib.getAddress(policy).validatePolicy(msg.sender, permissionId, _userOp, policyData); + PolicyConfigLib.getAddress(policy).checkUserOpPolicy(msg.sender, permissionId, _userOp, policyData); validationData = _intersectValidationData(validationData, policyValidation); policy = nextPolicy[permissionId][policy][msg.sender]; } @@ -213,14 +215,19 @@ contract ModularPermissionValidator is IKernelValidator { { ValidationSigMemory memory sigMemory; sigMemory.permissionId = bytes32(signature[0:32]); + require( + nonces[msg.sender].revoked <= permissions[sigMemory.permissionId][msg.sender].nonce + && permissions[sigMemory.permissionId][msg.sender].flag != bytes12(0), + "nonce revoked" + ); Permission memory permission = permissions[sigMemory.permissionId][msg.sender]; // signature should be packed with // (permissionId, [proof || signature]) // (permissionId, [ (policyAddress) + (policyProof) || signature] bytes calldata proofAndSignature; //) = abi.decode(signature[32:], (bytes, bytes)); assembly { - proofAndSignature.offset := add(signature.offset, calldataload(add(signature.offset, 32))) - proofAndSignature.length := calldataload(sub(proofAndSignature.offset, 32)) + proofAndSignature.offset := add(signature.offset, 32) + proofAndSignature.length := sub(signature.length, 32) } sigMemory.cursor = 0; diff --git a/src/validator/modularPermission/PolicyConfig.sol b/src/validator/modularPermission/PolicyConfig.sol index 63f0faac..adea0108 100644 --- a/src/validator/modularPermission/PolicyConfig.sol +++ b/src/validator/modularPermission/PolicyConfig.sol @@ -14,7 +14,7 @@ type PolicyConfig is bytes32; library PolicyConfigLib { function pack(IPolicy addr, bytes12 flag) internal pure returns (PolicyConfig data) { assembly { - data := or(addr, shl(160, flag)) + data := or(addr, flag) } } @@ -33,24 +33,21 @@ library PolicyConfigLib { function skipOnValidateUserOp(PolicyConfig data) internal pure returns (bool result) { assembly { let flags := shr(160, data) - let mask := 0x1 - result := and(flags, mask) + result := and(flags, 0x1) } } function skipOnValidateSignature(PolicyConfig data) internal pure returns (bool result) { assembly { let flags := shr(161, data) - let mask := 0x1 - result := and(flags, mask) + result := and(flags, 0x1) } } function skipOnValidateCaller(PolicyConfig data) internal pure returns (bool result) { assembly { let flags := shr(162, data) - let mask := 0x1 - result := and(flags, mask) + result := and(flags, 0x1) } } } diff --git a/src/validator/modularPermission/SignaturePolicy.sol b/src/validator/modularPermission/SignaturePolicy.sol new file mode 100644 index 00000000..647bae32 --- /dev/null +++ b/src/validator/modularPermission/SignaturePolicy.sol @@ -0,0 +1,34 @@ +pragma solidity ^0.8.0; + +import "./IPolicy.sol"; + +contract SignaturePolicy is IPolicy { + mapping(bytes32 => mapping(address => mapping(address => bool))) public allowedCaller; + + function registerPolicy(address kernel, bytes32 permissionId, bytes calldata policyData) external payable { + allowedCaller[permissionId][address(bytes20(policyData))][kernel] = true; + } + + function checkUserOpPolicy( + address kernel, + bytes32 permissionId, + UserOperation calldata userOp, + bytes calldata policyProof + ) external payable override returns (ValidationData) { + // do nothing on userOp validation + return ValidationData.wrap(0); + } + + function validateSignature( + address kernel, + address caller, + bytes32 permissionId, + bytes32 messageHash, + bytes calldata signature + ) external view override returns (ValidationData) { + if (allowedCaller[permissionId][caller][kernel]) { + return ValidationData.wrap(0); + } + return SIG_VALIDATION_FAILED; + } +} diff --git a/src/validator/modularPermission/mock/MockPolicy.sol b/src/validator/modularPermission/mock/MockPolicy.sol index 87b505f6..57598c79 100644 --- a/src/validator/modularPermission/mock/MockPolicy.sol +++ b/src/validator/modularPermission/mock/MockPolicy.sol @@ -7,14 +7,15 @@ import {IPolicy} from "../IPolicy.sol"; contract MockPolicy is IPolicy { ValidationData public validationData; - uint256 public sigConsume; mapping(bytes32 => uint256) public count; bytes public policyData; + bool public revertOnSignature; - function mock(uint48 validAfter, uint48 validUntil, bool success, uint256 consume) external { + function mock(uint48 validAfter, uint48 validUntil, bool success, bool revertOnSig) external { validationData = success ? packValidationData(ValidAfter.wrap(validAfter), ValidUntil.wrap(validUntil)) : SIG_VALIDATION_FAILED; + revertOnSignature = revertOnSig; } function registerPolicy(address, bytes32, bytes calldata data) external payable override { @@ -22,7 +23,7 @@ contract MockPolicy is IPolicy { policyData = data; } - function validatePolicy(address, bytes32 permissionId, UserOperation calldata, bytes calldata) + function checkUserOpPolicy(address, bytes32 permissionId, UserOperation calldata, bytes calldata) external payable override @@ -39,6 +40,9 @@ contract MockPolicy is IPolicy { bytes32 messageHash, bytes calldata signature ) external view override returns (ValidationData) { + if (revertOnSignature) { + revert("MockPolicy: signature validation failed"); + } return validationData; } } diff --git a/src/validator/modularPermission/policies/ExecutePolicy.sol b/src/validator/modularPermission/policies/ExecutePolicy.sol index 9ccbf514..071d5552 100644 --- a/src/validator/modularPermission/policies/ExecutePolicy.sol +++ b/src/validator/modularPermission/policies/ExecutePolicy.sol @@ -9,7 +9,8 @@ struct ExecutionConfig { } contract ExecutePolicy is IPolicy { - mapping(bytes32 permissionId => mapping(address => ExecutionConfig)) public executionConfigs; + mapping(address permissionValidator => mapping(bytes32 permissionId => mapping(address kernel => ExecutionConfig))) + public executionConfigs; function registerPolicy(address kernel, bytes32 permissionId, bytes calldata policyData) external @@ -19,21 +20,21 @@ contract ExecutePolicy is IPolicy { uint48 delay = uint48(bytes6(policyData[0:6])); uint48 count = uint48(bytes6(policyData[6:12])); uint48 startAt = uint48(bytes6(policyData[12:18])); - executionConfigs[permissionId][kernel] = ExecutionConfig(delay, count, ValidAfter.wrap(startAt)); + executionConfigs[msg.sender][permissionId][kernel] = ExecutionConfig(delay, count, ValidAfter.wrap(startAt)); } - function validatePolicy(address kernel, bytes32 permissionId, UserOperation calldata, bytes calldata) + function checkUserOpPolicy(address kernel, bytes32 permissionId, UserOperation calldata, bytes calldata) external payable override returns (ValidationData) { - ExecutionConfig memory config = executionConfigs[permissionId][kernel]; + ExecutionConfig memory config = executionConfigs[msg.sender][permissionId][kernel]; if (config.count == 0) { return SIG_VALIDATION_FAILED; } - executionConfigs[permissionId][kernel].count = config.count - 1; - executionConfigs[permissionId][kernel].startAt = + executionConfigs[msg.sender][permissionId][kernel].count = config.count - 1; + executionConfigs[msg.sender][permissionId][kernel].startAt = ValidAfter.wrap(ValidAfter.unwrap(config.startAt) + config.interval); return packValidationData(config.startAt, ValidUntil.wrap(0)); } diff --git a/src/validator/modularPermission/policies/GasPolicy.sol b/src/validator/modularPermission/policies/GasPolicy.sol index 08dd422c..c8947aab 100644 --- a/src/validator/modularPermission/policies/GasPolicy.sol +++ b/src/validator/modularPermission/policies/GasPolicy.sol @@ -12,14 +12,15 @@ contract GasPolicy is IPolicy { address allowedPaymaster; } - mapping(bytes32 permissionId => mapping(address kernel => GasPolicyConfig)) public gasPolicyConfig; + mapping(address permissionValidator => mapping(bytes32 permissionId => mapping(address kernel => GasPolicyConfig))) + public gasPolicyConfig; function registerPolicy(address kernel, bytes32 permissionId, bytes calldata data) external payable override { (uint128 allowed, bool enforcePaymaster, address allowedPaymaster) = abi.decode(data, (uint128, bool, address)); - gasPolicyConfig[permissionId][kernel] = GasPolicyConfig(allowed, enforcePaymaster, allowedPaymaster); + gasPolicyConfig[msg.sender][permissionId][kernel] = GasPolicyConfig(allowed, enforcePaymaster, allowedPaymaster); } - function validatePolicy(address kernel, bytes32 permissionId, UserOperation calldata userOp, bytes calldata) + function checkUserOpPolicy(address kernel, bytes32 permissionId, UserOperation calldata userOp, bytes calldata) external payable override @@ -28,19 +29,19 @@ contract GasPolicy is IPolicy { uint128 maxAmount = uint128( (userOp.preVerificationGas + userOp.verificationGasLimit + userOp.callGasLimit) * userOp.maxFeePerGas ); - if (gasPolicyConfig[permissionId][kernel].enforcePaymaster) { + if (gasPolicyConfig[msg.sender][permissionId][kernel].enforcePaymaster) { if ( - gasPolicyConfig[permissionId][kernel].allowedPaymaster != address(0) + gasPolicyConfig[msg.sender][permissionId][kernel].allowedPaymaster != address(0) && address(bytes20(userOp.paymasterAndData[0:20])) - != gasPolicyConfig[permissionId][kernel].allowedPaymaster + != gasPolicyConfig[msg.sender][permissionId][kernel].allowedPaymaster ) { return SIG_VALIDATION_FAILED; } } - if (maxAmount > gasPolicyConfig[permissionId][kernel].allowed) { + if (maxAmount > gasPolicyConfig[msg.sender][permissionId][kernel].allowed) { return SIG_VALIDATION_FAILED; } - gasPolicyConfig[permissionId][kernel].allowed -= maxAmount; + gasPolicyConfig[msg.sender][permissionId][kernel].allowed -= maxAmount; return ValidationData.wrap(0); } diff --git a/src/validator/modularPermission/policies/MerklePolicy.sol b/src/validator/modularPermission/policies/MerklePolicy.sol index 10fcab46..7a52659e 100644 --- a/src/validator/modularPermission/policies/MerklePolicy.sol +++ b/src/validator/modularPermission/policies/MerklePolicy.sol @@ -23,20 +23,21 @@ struct ParamRule { contract MerklePolicy is IPolicy { error MerklePolicyError(uint256 code); // todo: should policy revert instead of returning SIG_VALIDATION_FAILED? - mapping(bytes32 => mapping(address => bytes32)) public merkleRoot; + mapping(address permissionValidator => mapping(bytes32 => mapping(address => bytes32))) public merkleRoot; function registerPolicy(address kernel, bytes32 permissionId, bytes calldata policyData) external payable { bytes32 root = bytes32(policyData[0:32]); - merkleRoot[permissionId][kernel] = root; + merkleRoot[msg.sender][permissionId][kernel] = root; } - function validatePolicy(address kernel, bytes32 permissionId, UserOperation calldata userOp, bytes calldata proof) - external - payable - returns (ValidationData) - { + function checkUserOpPolicy( + address kernel, + bytes32 permissionId, + UserOperation calldata userOp, + bytes calldata proof + ) external payable returns (ValidationData) { bytes calldata callData = userOp.callData; - bytes32 root = merkleRoot[permissionId][kernel]; + bytes32 root = merkleRoot[msg.sender][permissionId][kernel]; bytes4 sig = bytes4(userOp.signature[0:4]); if (sig == Kernel.execute.selector || sig == Kernel.executeDelegateCall.selector) { (Permission calldata permission, bytes32[] calldata merkleProof) = _getPermission(userOp.signature[85:]); @@ -63,7 +64,7 @@ contract MerklePolicy is IPolicy { bytes calldata callData, Permission[] calldata _permissions, bytes32[][] calldata _merkleProof - ) internal returns (bool verifyFailed) { + ) internal pure returns (bool verifyFailed) { Call[] calldata calls; assembly { calls.offset := add(add(callData.offset, 0x24), calldataload(add(callData.offset, 4))) @@ -117,7 +118,7 @@ contract MerklePolicy is IPolicy { bytes calldata callData, Permission calldata _permission, bytes32[] calldata _merkleProof - ) internal returns (bool verifyFailed) { + ) internal pure returns (bool verifyFailed) { bool isExecute = bytes4(callData[0:4]) == Kernel.execute.selector; require( _permission.target == address(0) || address(bytes20(callData[16:36])) == _permission.target, diff --git a/src/validator/modularPermission/signers/ECDSASigner.sol b/src/validator/modularPermission/signers/ECDSASigner.sol index a4eef953..574bae45 100644 --- a/src/validator/modularPermission/signers/ECDSASigner.sol +++ b/src/validator/modularPermission/signers/ECDSASigner.sol @@ -3,40 +3,45 @@ pragma solidity ^0.8.0; import {ECDSA} from "solady/utils/ECDSA.sol"; import {ISigner} from "../ISigner.sol"; import {ValidationData} from "../../../common/Types.sol"; +import {SIG_VALIDATION_FAILED} from "../../../common/Constants.sol"; -contract ECDSASigner is ISigner{ +contract ECDSASigner is ISigner { using ECDSA for bytes32; - mapping(bytes32 permissionId => mapping(address kernel => address)) public signer; + mapping(address caller => mapping(bytes32 permissionId => mapping(address kernel => address))) public signer; function registerSigner(address kernel, bytes32 permissionId, bytes calldata data) external payable override { - require(signer[permissionId][kernel] == address(0), "ECDSASigner: kernel already registered"); + require(signer[msg.sender][permissionId][kernel] == address(0), "ECDSASigner: kernel already registered"); require(data.length == 20, "ECDSASigner: invalid signer address"); address signerAddress = address(bytes20(data[0:20])); - signer[permissionId][kernel] = signerAddress; + signer[msg.sender][permissionId][kernel] = signerAddress; } - function validateUserOp( - address kernel, - bytes32 permissionId, - bytes32 userOpHash, - bytes calldata signature - ) external payable override returns (ValidationData) { - require(signer[permissionId][kernel] != address(0), "ECDSASigner: kernel not registered"); - address recovered = userOpHash.recover(signature); - require(recovered == signer[permissionId][kernel], "ECDSASigner: invalid signature"); - return ValidationData.wrap(0); + function validateUserOp(address kernel, bytes32 permissionId, bytes32 userOpHash, bytes calldata signature) + external + payable + override + returns (ValidationData) + { + require(signer[msg.sender][permissionId][kernel] != address(0), "ECDSASigner: kernel not registered"); + address recovered = ECDSA.toEthSignedMessageHash(userOpHash).recover(signature); + if (recovered == signer[msg.sender][permissionId][kernel]) { + return ValidationData.wrap(0); + } + return SIG_VALIDATION_FAILED; } - function validateSignature( - address kernel, - bytes32 permissionId, - bytes32 messageHash, - bytes calldata signature - ) external view override returns (ValidationData) { - require(signer[permissionId][kernel] != address(0), "ECDSASigner: kernel not registered"); + function validateSignature(address kernel, bytes32 permissionId, bytes32 messageHash, bytes calldata signature) + external + view + override + returns (ValidationData) + { + require(signer[msg.sender][permissionId][kernel] != address(0), "ECDSASigner: kernel not registered"); address recovered = messageHash.recover(signature); - require(recovered == signer[permissionId][kernel], "ECDSASigner: invalid signature"); - return ValidationData.wrap(0); + if (recovered == signer[msg.sender][permissionId][kernel]) { + return ValidationData.wrap(0); + } + return SIG_VALIDATION_FAILED; } } diff --git a/test/foundry/validator/modularPermission/ModularPermission.t.sol b/test/foundry/validator/modularPermission/ModularPermission.t.sol index 386555c0..cb240922 100644 --- a/test/foundry/validator/modularPermission/ModularPermission.t.sol +++ b/test/foundry/validator/modularPermission/ModularPermission.t.sol @@ -1,11 +1,150 @@ pragma solidity ^0.8.0; +import {IEntryPoint} from "I4337/interfaces/IEntryPoint.sol"; +import {IKernel} from "src/interfaces/IKernel.sol"; +import {IKernelValidator} from "src/interfaces/IKernelValidator.sol"; +import {Operation} from "src/common/Enums.sol"; import "src/validator/modularPermission/ModularPermissionValidator.sol"; -import "src/validator/modularPermission/mock/MockSigner.sol"; +import "src/validator/modularPermission/signers/ECDSASigner.sol"; import "src/validator/modularPermission/mock/MockPolicy.sol"; +import "src/validator/modularPermission/mock/MockSigner.sol"; import "forge-std/Test.sol"; +import {KernelTestBase} from "src/utils/KernelTestBase.sol"; +import {TestExecutor} from "src/mock/TestExecutor.sol"; +import {TestValidator} from "src/mock/TestValidator.sol"; +import {KernelStorage} from "src/abstract/KernelStorage.sol"; +import {ERC4337Utils} from "src/utils/ERC4337Utils.sol"; + +using ERC4337Utils for IEntryPoint; + +contract ModularPermissionE2ETest is KernelTestBase { + ECDSASigner signer; + MockPolicy mockPolicy; + bytes32 permissionId; + + function setUp() public virtual { + _initialize(); + defaultValidator = new ModularPermissionValidator(); + signer = new ECDSASigner(); + mockPolicy = new MockPolicy(); + _setAddress(); + _setExecutionDetail(); + } + + function test_ignore() external {} + + function getPermissionId() internal view returns (bytes32) { + PolicyConfig[] memory p = new PolicyConfig[](1); + p[0] = PolicyConfigLib.pack(IPolicy(address(mockPolicy)), toFlag(0)); + bytes[] memory pd = new bytes[](1); + pd[0] = abi.encodePacked("policy data 1"); + + return ModularPermissionValidator(address(defaultValidator)).getPermissionId( + 0, toFlag(1), signer, ValidAfter.wrap(0), ValidUntil.wrap(0), p, abi.encodePacked(owner), pd + ); + } + + function _setExecutionDetail() internal virtual override { + executionDetail.executor = address(new TestExecutor()); + executionSig = TestExecutor.doNothing.selector; + executionDetail.validator = new TestValidator(); + } + + function getEnableData() internal view virtual override returns (bytes memory) { + return ""; + } + + function getValidatorSignature(UserOperation memory) internal view virtual override returns (bytes memory) { + return ""; + } + + function getOwners() internal view override returns (address[] memory) { + address[] memory owners = new address[](1); + owners[0] = owner; + return owners; + } + + function getInitializeData() internal view override returns (bytes memory) { + bytes memory sd = abi.encodePacked(owner); + PolicyConfig[] memory p = new PolicyConfig[](1); + p[0] = PolicyConfigLib.pack(IPolicy(address(mockPolicy)), toFlag(0)); + bytes[] memory pd = new bytes[](1); + pd[0] = abi.encodePacked("policy data 1"); + bytes memory data = abi.encodePacked( + abi.encodePacked( + uint128(0), // nonce + toFlag(1), + uint48(0), //`validAfter + uint48(0), // validUntil + address(signer) + ), // signer + abi.encode(p, sd, pd) + ); -contract ModularPermissionTest is Test { + return abi.encodeWithSelector(KernelStorage.initialize.selector, defaultValidator, data); + } + + function signUserOp(UserOperation memory op) internal view override returns (bytes memory) { + return abi.encodePacked(bytes4(0x00000000), getPermissionId(), entryPoint.signUserOpHash(vm, ownerKey, op)); + } + + function getWrongSignature(UserOperation memory op) internal view override returns (bytes memory) { + return abi.encodePacked(bytes4(0x00000000), getPermissionId(), entryPoint.signUserOpHash(vm, ownerKey + 1, op)); + } + + function signHash(bytes32 hash) internal view override returns (bytes memory) { + (uint8 v, bytes32 r, bytes32 s) = vm.sign(ownerKey, hash); + return abi.encodePacked(getPermissionId(), r, s, v); + } + + function getWrongSignature(bytes32 hash) internal view override returns (bytes memory) { + (uint8 v, bytes32 r, bytes32 s) = vm.sign(ownerKey + 1, hash); + return abi.encodePacked(getPermissionId(), r, s, v); + } + + function test_default_validator_enable() external override { + UserOperation memory op = buildUserOperation( + abi.encodeWithSelector( + IKernel.execute.selector, + address(defaultValidator), + 0, + abi.encodeWithSelector(IKernelValidator.enable.selector, abi.encodePacked(address(0xdeadbeef))), + Operation.Call + ) + ); + bytes memory sd = abi.encodePacked(owner); + PolicyConfig[] memory p = new PolicyConfig[](1); + p[0] = PolicyConfigLib.pack(IPolicy(address(mockPolicy)), toFlag(0)); + bytes[] memory pd = new bytes[](1); + pd[0] = abi.encodePacked("policy data 2"); + bytes memory data = abi.encodePacked( + abi.encodePacked( + uint128(0), // nonce + toFlag(1), + uint48(0), //`validAfter + uint48(0), // validUntil + address(signer) + ), // signer + abi.encode(p, sd, pd) + ); + performUserOperationWithSig(op); + } + + function test_default_validator_disable() external override { + UserOperation memory op = buildUserOperation( + abi.encodeWithSelector( + IKernel.execute.selector, + address(defaultValidator), + 0, + abi.encodeWithSelector(IKernelValidator.disable.selector, abi.encodePacked(getPermissionId())), + Operation.Call + ) + ); + performUserOperationWithSig(op); + } +} + +contract ModularPermissionUnitTest is Test { ModularPermissionValidator validator; MockSigner mockSigner; @@ -78,6 +217,137 @@ contract ModularPermissionTest is Test { validator.enable(data); } + struct ModularPermissionConfig { + uint128 nonce; + bytes12 flag; + ISigner signer; + ValidAfter validAfter; + ValidUntil validUntil; + PolicyConfig firstPolicy; + } + + function testValidateUserOpSkip() external { + address kernel = makeAddr("Kernel"); + ValidUntil until = ValidUntil.wrap(uint48(block.timestamp + 100)); + bytes memory sd = abi.encodePacked("hello signer"); + MockPolicy skipPolicy = new MockPolicy(); + PolicyConfig[] memory p = new PolicyConfig[](2); + p[0] = PolicyConfigLib.pack(mockPolicy, toFlag(0)); + p[1] = PolicyConfigLib.pack(skipPolicy, toFlag(1)); // skip + + bytes[] memory pd = new bytes[](2); + pd[0] = abi.encodePacked("hello policy"); + pd[1] = abi.encodePacked("hello policy 2"); + bytes32 permissionId = validator.getPermissionId( + 0, + toFlag(1), // flag + mockSigner, + ValidAfter.wrap(1), + until, + p, + sd, + pd + ); + + bytes memory data = abi.encodePacked( + abi.encodePacked( + uint128(0), // nonce + toFlag(1), //flag + uint48(1), //`validAfter + until, // validUntil + address(mockSigner) + ), // signer + abi.encode(p, sd, pd) + ); + vm.startPrank(kernel); + validator.enable(data); + vm.stopPrank(); + + ModularPermissionConfig memory config; + + (config.nonce, config.flag, config.signer, config.firstPolicy, config.validAfter, config.validUntil) = + validator.permissions(permissionId, kernel); + assertEq(config.nonce, uint128(0)); + assertEq(config.flag, toFlag(1)); + assertEq(ValidAfter.unwrap(config.validAfter), uint48(1)); + assertEq(ValidUntil.unwrap(config.validUntil), ValidUntil.unwrap(until)); + assertEq(address(config.signer), address(mockSigner)); + assertEq(address(PolicyConfigLib.getAddress(config.firstPolicy)), address(mockPolicy)); + + assertEq(mockSigner.signerData(), sd); + assertEq(mockPolicy.policyData(), pd[0]); + UserOperation memory op; + op.sender = kernel; + op.signature = abi.encodePacked(permissionId); + vm.startPrank(kernel); + validator.validateUserOp(op, keccak256(abi.encodePacked("hello")), 0); + vm.stopPrank(); + + assertEq(mockSigner.count(permissionId), 1); + assertEq(mockPolicy.count(permissionId), 1); + assertEq(skipPolicy.count(permissionId), 0); + } + + function testValidateSignatureSkip() external { + address kernel = makeAddr("Kernel"); + ValidUntil until = ValidUntil.wrap(uint48(block.timestamp + 100)); + bytes memory sd = abi.encodePacked("hello signer"); + MockPolicy skipPolicy = new MockPolicy(); + PolicyConfig[] memory p = new PolicyConfig[](2); + p[0] = PolicyConfigLib.pack(mockPolicy, toFlag(0)); + p[1] = PolicyConfigLib.pack(skipPolicy, toFlag(2)); // skip on signature + skipPolicy.mock(0, 0, true, true); + + bytes[] memory pd = new bytes[](2); + pd[0] = abi.encodePacked("hello policy"); + pd[1] = abi.encodePacked("hello policy 2"); + bytes32 permissionId = validator.getPermissionId( + 0, + toFlag(1), // flag + mockSigner, + ValidAfter.wrap(1), + until, + p, + sd, + pd + ); + + bytes memory data = abi.encodePacked( + abi.encodePacked( + uint128(0), // nonce + toFlag(1), //flag + uint48(1), //`validAfter + until, // validUntil + address(mockSigner) + ), // signer + abi.encode(p, sd, pd) + ); + vm.startPrank(kernel); + validator.enable(data); + vm.stopPrank(); + + ModularPermissionConfig memory config; + + (config.nonce, config.flag, config.signer, config.firstPolicy, config.validAfter, config.validUntil) = + validator.permissions(permissionId, kernel); + assertEq(config.nonce, uint128(0)); + assertEq(config.flag, toFlag(1)); + assertEq(ValidAfter.unwrap(config.validAfter), uint48(1)); + assertEq(ValidUntil.unwrap(config.validUntil), ValidUntil.unwrap(until)); + assertEq(address(config.signer), address(mockSigner)); + assertEq(address(PolicyConfigLib.getAddress(config.firstPolicy)), address(mockPolicy)); + + assertEq(mockSigner.signerData(), sd); + assertEq(mockPolicy.policyData(), pd[0]); + UserOperation memory op; + op.sender = kernel; + op.signature = abi.encodePacked(permissionId); + vm.startPrank(kernel); + vm.expectRevert(); + validator.validateSignature(keccak256(abi.encodePacked("hello")), ""); + vm.stopPrank(); + } + function testValidateUserOp() external { address kernel = makeAddr("Kernel"); ValidUntil until = ValidUntil.wrap(uint48(block.timestamp + 100)); @@ -140,6 +410,6 @@ contract ModularPermissionTest is Test { } } -function toFlag(uint256 x) returns (bytes12) { +function toFlag(uint256 x) pure returns (bytes12) { return bytes12(bytes32(x << 160)); } From f62ccbb786f85c1c58e3b0fe01168dd5c5916a03 Mon Sep 17 00:00:00 2001 From: leekt Date: Wed, 31 Jan 2024 03:18:16 +0900 Subject: [PATCH 22/36] support requestor feature --- src/Kernel.sol | 10 +-- src/lite/KernelLiteECDSA.sol | 2 +- .../ModularPermissionValidator.sol | 29 +++++--- .../modularPermission/PolicyConfig.sol | 5 ++ .../modularPermission/SignaturePolicy.sol | 9 ++- .../modularPermission/ModularPermission.t.sol | 73 +++++++++++++------ 6 files changed, 86 insertions(+), 42 deletions(-) diff --git a/src/Kernel.sol b/src/Kernel.sol index 615ac02b..cee0c251 100644 --- a/src/Kernel.sol +++ b/src/Kernel.sol @@ -244,7 +244,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { ) ); validationData = _intersectValidationData( - _validateSignature(enableDigest, signature[cursor:cursor + length]), + _validateSignature(address(this), enableDigest, signature[cursor:cursor + length]), ValidationData.wrap( uint256(bytes32(signature[4:36])) & 0xffffffffffffffffffffffff0000000000000000000000000000000000000000 @@ -269,7 +269,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { /// @param hash The hash of the data that was signed /// @param signature The signature to be validated function validateSignature(bytes32 hash, bytes calldata signature) public view returns (ValidationData) { - return _validateSignature(hash, signature); + return _validateSignature(msg.sender, hash, signature); } /// @dev Get the current name & version of the kernel, used for the EIP-712 domain separator @@ -305,7 +305,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { // Recreate the signed message hash with the correct domain separator bytes32 signedMessageHash = keccak256(abi.encodePacked("\x19\x01", domainSeparator, hash)); - ValidationData validationData = validateSignature(signedMessageHash, signature); + ValidationData validationData = _validateSignature(msg.sender, signedMessageHash, signature); (ValidAfter validAfter, ValidUntil validUntil, address result) = parseValidationData(validationData); // Check if the signature is valid within the specified time frame and the result is successful @@ -365,7 +365,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { /// @param _hash The hash of the data that was signed /// @param _signature The signature to be validated /// @return The magic value 0x1626ba7e if the signature is valid, otherwise returns 0xffffffff. - function _validateSignature(bytes32 _hash, bytes calldata _signature) + function _validateSignature(address _requestor, bytes32 _hash, bytes calldata _signature) internal view virtual @@ -378,7 +378,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { // 20 bytes added at the end of the signature to store the address of the caller (bool success, bytes memory res) = validator.staticcall( abi.encodePacked( - abi.encodeWithSelector(IKernelValidator.validateSignature.selector, _hash, _signature), msg.sender + abi.encodeWithSelector(IKernelValidator.validateSignature.selector, _hash, _signature), _requestor ) ); require(success, "Kernel::_validateSignature: failed to validate signature"); diff --git a/src/lite/KernelLiteECDSA.sol b/src/lite/KernelLiteECDSA.sol index 4f3a1a6f..ed958cfe 100644 --- a/src/lite/KernelLiteECDSA.sol +++ b/src/lite/KernelLiteECDSA.sol @@ -70,7 +70,7 @@ contract KernelLiteECDSA is Kernel { } /// @dev Validate a signature - function _validateSignature(bytes32 _hash, bytes calldata _signature) + function _validateSignature(address /*_requestor*/, bytes32 _hash, bytes calldata _signature) internal view override diff --git a/src/validator/modularPermission/ModularPermissionValidator.sol b/src/validator/modularPermission/ModularPermissionValidator.sol index ddb66982..0e07e0c2 100644 --- a/src/validator/modularPermission/ModularPermissionValidator.sol +++ b/src/validator/modularPermission/ModularPermissionValidator.sol @@ -7,7 +7,7 @@ import {IKernelValidator} from "src/interfaces/IKernelValidator.sol"; import {ISigner} from "./ISigner.sol"; import {IPolicy} from "./IPolicy.sol"; import {_intersectValidationData} from "src/utils/KernelHelper.sol"; -import {PolicyConfig, PolicyConfigLib} from "./PolicyConfig.sol"; +import {PolicyConfig, PolicyConfigLib, toFlag, MAX_FLAG} from "./PolicyConfig.sol"; struct Permission { uint128 nonce; @@ -19,7 +19,7 @@ struct Permission { } struct Nonce { - uint128 latest; + uint128 next; uint128 revoked; } @@ -27,6 +27,7 @@ struct Nonce { /// @notice Validator that allows to register and revoke permissions /// @dev modular architecture to allow composable permission system contract ModularPermissionValidator is IKernelValidator { + mapping(address => bytes32) public priorityPermission; mapping(bytes32 permissionId => mapping(address kernel => Permission)) public permissions; mapping(bytes32 permissionId => mapping(PolicyConfig policy => mapping(address kernel => PolicyConfig))) public nextPolicy; @@ -114,9 +115,13 @@ contract ModularPermissionValidator is IKernelValidator { bytes calldata signerData, bytes[] calldata policyData ) public payable { - require(flag != bytes12(0), "flag should not be empty"); + require(flag != toFlag(0), "flag should not be empty"); + require(nonce == nonces[msg.sender].next, "nonce should be next"); bytes32 permissionId = getPermissionId(nonce, flag, signer, validAfter, validUntil, policy, signerData, policyData); + if(flag == MAX_FLAG) { + priorityPermission[msg.sender] = permissionId; + } for (uint256 i = 0; i < policy.length; i++) { //TODO make sure address of the policy is sorted @@ -141,7 +146,7 @@ contract ModularPermissionValidator is IKernelValidator { } function revokePermission(bytes32 permissionId) public payable { - permissions[permissionId][msg.sender].flag = bytes12(0); // NOTE: making flag == 0 makes it invalid + permissions[permissionId][msg.sender].flag = toFlag(0); // NOTE: making flag == 0 makes it invalid emit PermissionRevoked(msg.sender, permissionId); } @@ -158,9 +163,8 @@ contract ModularPermissionValidator is IKernelValidator { require(_userOp.sender == msg.sender, "sender must be msg.sender"); bytes32 permissionId = bytes32(_userOp.signature[0:32]); if ( - address(PolicyConfigLib.getAddress(permissions[permissionId][msg.sender].firstPolicy)) != address(0) - && permissions[permissionId][msg.sender].nonce < nonces[msg.sender].revoked - && permissions[permissionId][msg.sender].flag != bytes12(0) + permissions[permissionId][msg.sender].flag & toFlag(1) == toFlag(0) + || permissions[permissionId][msg.sender].nonce > nonces[msg.sender].revoked ) { return SIG_VALIDATION_FAILED; } @@ -215,11 +219,12 @@ contract ModularPermissionValidator is IKernelValidator { { ValidationSigMemory memory sigMemory; sigMemory.permissionId = bytes32(signature[0:32]); - require( - nonces[msg.sender].revoked <= permissions[sigMemory.permissionId][msg.sender].nonce - && permissions[sigMemory.permissionId][msg.sender].flag != bytes12(0), - "nonce revoked" - ); + if( + nonces[msg.sender].revoked > permissions[sigMemory.permissionId][msg.sender].nonce + || permissions[sigMemory.permissionId][msg.sender].flag & toFlag(2) == toFlag(0) + ) { + return SIG_VALIDATION_FAILED; + } Permission memory permission = permissions[sigMemory.permissionId][msg.sender]; // signature should be packed with // (permissionId, [proof || signature]) diff --git a/src/validator/modularPermission/PolicyConfig.sol b/src/validator/modularPermission/PolicyConfig.sol index adea0108..9a774e74 100644 --- a/src/validator/modularPermission/PolicyConfig.sol +++ b/src/validator/modularPermission/PolicyConfig.sol @@ -4,6 +4,11 @@ import "./IPolicy.sol"; type PolicyConfig is bytes32; +function toFlag(uint256 x) pure returns (bytes12) { + return bytes12(bytes32(x << 160)); +} + +bytes12 constant MAX_FLAG = 0xffffffffffffffffffffffff; // PolicyData is a 32 bytes array that contains the address of the policy // [flags(12 bytes), address(20 bytes)] // flags is 96 bits that contains the following information diff --git a/src/validator/modularPermission/SignaturePolicy.sol b/src/validator/modularPermission/SignaturePolicy.sol index 647bae32..54b8cecf 100644 --- a/src/validator/modularPermission/SignaturePolicy.sol +++ b/src/validator/modularPermission/SignaturePolicy.sol @@ -6,7 +6,14 @@ contract SignaturePolicy is IPolicy { mapping(bytes32 => mapping(address => mapping(address => bool))) public allowedCaller; function registerPolicy(address kernel, bytes32 permissionId, bytes calldata policyData) external payable { - allowedCaller[permissionId][address(bytes20(policyData))][kernel] = true; + address[] memory callers = abi.decode(policyData, (address[])); + for (uint256 i = 0; i < callers.length; i++) { + if(callers[i] == address(0)) { + allowedCaller[permissionId][kernel][kernel] = true; + } else { + allowedCaller[permissionId][callers[i]][kernel] = true; + } + } } function checkUserOpPolicy( diff --git a/test/foundry/validator/modularPermission/ModularPermission.t.sol b/test/foundry/validator/modularPermission/ModularPermission.t.sol index cb240922..b14bdf5d 100644 --- a/test/foundry/validator/modularPermission/ModularPermission.t.sol +++ b/test/foundry/validator/modularPermission/ModularPermission.t.sol @@ -14,19 +14,26 @@ import {TestExecutor} from "src/mock/TestExecutor.sol"; import {TestValidator} from "src/mock/TestValidator.sol"; import {KernelStorage} from "src/abstract/KernelStorage.sol"; import {ERC4337Utils} from "src/utils/ERC4337Utils.sol"; +import {SignaturePolicy} from "src/validator/modularPermission/SignaturePolicy.sol"; using ERC4337Utils for IEntryPoint; contract ModularPermissionE2ETest is KernelTestBase { ECDSASigner signer; MockPolicy mockPolicy; + SignaturePolicy signaturePolicy; bytes32 permissionId; + address[] allowedCaller; function setUp() public virtual { _initialize(); defaultValidator = new ModularPermissionValidator(); signer = new ECDSASigner(); mockPolicy = new MockPolicy(); + signaturePolicy = new SignaturePolicy(); + allowedCaller = new address[](2); + allowedCaller[0] = makeAddr("app"); + allowedCaller[1] = address(0); _setAddress(); _setExecutionDetail(); } @@ -34,13 +41,15 @@ contract ModularPermissionE2ETest is KernelTestBase { function test_ignore() external {} function getPermissionId() internal view returns (bytes32) { - PolicyConfig[] memory p = new PolicyConfig[](1); + PolicyConfig[] memory p = new PolicyConfig[](2); p[0] = PolicyConfigLib.pack(IPolicy(address(mockPolicy)), toFlag(0)); - bytes[] memory pd = new bytes[](1); + p[1] = PolicyConfigLib.pack(IPolicy(address(signaturePolicy)), toFlag(1)); + bytes[] memory pd = new bytes[](2); pd[0] = abi.encodePacked("policy data 1"); + pd[1] = abi.encode(allowedCaller); return ModularPermissionValidator(address(defaultValidator)).getPermissionId( - 0, toFlag(1), signer, ValidAfter.wrap(0), ValidUntil.wrap(0), p, abi.encodePacked(owner), pd + 0, MAX_FLAG, signer, ValidAfter.wrap(0), ValidUntil.wrap(0), p, abi.encodePacked(owner), pd ); } @@ -66,14 +75,16 @@ contract ModularPermissionE2ETest is KernelTestBase { function getInitializeData() internal view override returns (bytes memory) { bytes memory sd = abi.encodePacked(owner); - PolicyConfig[] memory p = new PolicyConfig[](1); + PolicyConfig[] memory p = new PolicyConfig[](2); p[0] = PolicyConfigLib.pack(IPolicy(address(mockPolicy)), toFlag(0)); - bytes[] memory pd = new bytes[](1); + p[1] = PolicyConfigLib.pack(IPolicy(address(signaturePolicy)), toFlag(1)); + bytes[] memory pd = new bytes[](2); pd[0] = abi.encodePacked("policy data 1"); + pd[1] = abi.encode(allowedCaller); bytes memory data = abi.encodePacked( abi.encodePacked( uint128(0), // nonce - toFlag(1), + MAX_FLAG, uint48(0), //`validAfter uint48(0), // validUntil address(signer) @@ -120,7 +131,7 @@ contract ModularPermissionE2ETest is KernelTestBase { bytes memory data = abi.encodePacked( abi.encodePacked( uint128(0), // nonce - toFlag(1), + MAX_FLAG, //flag uint48(0), //`validAfter uint48(0), // validUntil address(signer) @@ -142,6 +153,26 @@ contract ModularPermissionE2ETest is KernelTestBase { ); performUserOperationWithSig(op); } + + function test_external_call_execute_success() external override { + vm.skip(true); + } + + function test_external_call_default() external override { + vm.skip(true); + } + + function test_external_call_execute_delegatecall_success() external override { + vm.skip(true); + } + + function test_external_call_batch_execute_success() external override { + vm.skip(true); + } + + function test_external_call_execution() external override { + vm.skip(true); + } } contract ModularPermissionUnitTest is Test { @@ -168,7 +199,7 @@ contract ModularPermissionUnitTest is Test { bytes memory data = abi.encodePacked( abi.encodePacked( uint128(0), // nonce - toFlag(1), + MAX_FLAG, //flag uint48(1), //`validAfter until, // validUntil address(0xdead) @@ -186,7 +217,7 @@ contract ModularPermissionUnitTest is Test { bytes[] memory policyData ) = validator.parseData(data); assertEq(nonce, uint128(0)); - assertEq(flag, toFlag(1)); + assertEq(flag, MAX_FLAG); assertEq(ValidAfter.unwrap(validAfter), uint48(1)); assertEq(ValidUntil.unwrap(validUntil), until); assertEq(address(signer), address(0xdead)); @@ -207,7 +238,7 @@ contract ModularPermissionUnitTest is Test { bytes memory data = abi.encodePacked( abi.encodePacked( uint128(0), // nonce - toFlag(1), //flag + MAX_FLAG, //flag uint48(1), //`validAfter until, // validUntil address(mockSigner) @@ -240,7 +271,7 @@ contract ModularPermissionUnitTest is Test { pd[1] = abi.encodePacked("hello policy 2"); bytes32 permissionId = validator.getPermissionId( 0, - toFlag(1), // flag + MAX_FLAG, //flag mockSigner, ValidAfter.wrap(1), until, @@ -252,7 +283,7 @@ contract ModularPermissionUnitTest is Test { bytes memory data = abi.encodePacked( abi.encodePacked( uint128(0), // nonce - toFlag(1), //flag + MAX_FLAG, //flag uint48(1), //`validAfter until, // validUntil address(mockSigner) @@ -268,7 +299,7 @@ contract ModularPermissionUnitTest is Test { (config.nonce, config.flag, config.signer, config.firstPolicy, config.validAfter, config.validUntil) = validator.permissions(permissionId, kernel); assertEq(config.nonce, uint128(0)); - assertEq(config.flag, toFlag(1)); + assertEq(config.flag, MAX_FLAG); assertEq(ValidAfter.unwrap(config.validAfter), uint48(1)); assertEq(ValidUntil.unwrap(config.validUntil), ValidUntil.unwrap(until)); assertEq(address(config.signer), address(mockSigner)); @@ -303,7 +334,7 @@ contract ModularPermissionUnitTest is Test { pd[1] = abi.encodePacked("hello policy 2"); bytes32 permissionId = validator.getPermissionId( 0, - toFlag(1), // flag + MAX_FLAG, //flag mockSigner, ValidAfter.wrap(1), until, @@ -315,7 +346,7 @@ contract ModularPermissionUnitTest is Test { bytes memory data = abi.encodePacked( abi.encodePacked( uint128(0), // nonce - toFlag(1), //flag + MAX_FLAG, //flag uint48(1), //`validAfter until, // validUntil address(mockSigner) @@ -331,7 +362,7 @@ contract ModularPermissionUnitTest is Test { (config.nonce, config.flag, config.signer, config.firstPolicy, config.validAfter, config.validUntil) = validator.permissions(permissionId, kernel); assertEq(config.nonce, uint128(0)); - assertEq(config.flag, toFlag(1)); + assertEq(config.flag, MAX_FLAG); assertEq(ValidAfter.unwrap(config.validAfter), uint48(1)); assertEq(ValidUntil.unwrap(config.validUntil), ValidUntil.unwrap(until)); assertEq(address(config.signer), address(mockSigner)); @@ -358,7 +389,7 @@ contract ModularPermissionUnitTest is Test { pd[0] = abi.encodePacked("hello policy"); bytes32 permissionId = validator.getPermissionId( 0, - toFlag(1), // flag + MAX_FLAG, //flag mockSigner, ValidAfter.wrap(1), until, @@ -370,7 +401,7 @@ contract ModularPermissionUnitTest is Test { bytes memory data = abi.encodePacked( abi.encodePacked( uint128(0), // nonce - toFlag(1), //flag + MAX_FLAG, //flag uint48(1), //`validAfter until, // validUntil address(mockSigner) @@ -390,7 +421,7 @@ contract ModularPermissionUnitTest is Test { ValidUntil validUntil ) = validator.permissions(permissionId, kernel); assertEq(nonce, uint128(0)); - assertEq(flag, toFlag(1)); + assertEq(flag, MAX_FLAG); assertEq(ValidAfter.unwrap(validAfter), uint48(1)); assertEq(ValidUntil.unwrap(validUntil), ValidUntil.unwrap(until)); assertEq(address(signer), address(mockSigner)); @@ -409,7 +440,3 @@ contract ModularPermissionUnitTest is Test { assertEq(mockPolicy.count(permissionId), 1); } } - -function toFlag(uint256 x) pure returns (bytes12) { - return bytes12(bytes32(x << 160)); -} From c8cdc7650a838496cd49fb140ebb0375537be863 Mon Sep 17 00:00:00 2001 From: leekt Date: Wed, 31 Jan 2024 03:19:03 +0900 Subject: [PATCH 23/36] now call it allowed requestor --- src/validator/modularPermission/SignaturePolicy.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/validator/modularPermission/SignaturePolicy.sol b/src/validator/modularPermission/SignaturePolicy.sol index 54b8cecf..93ee8070 100644 --- a/src/validator/modularPermission/SignaturePolicy.sol +++ b/src/validator/modularPermission/SignaturePolicy.sol @@ -3,15 +3,15 @@ pragma solidity ^0.8.0; import "./IPolicy.sol"; contract SignaturePolicy is IPolicy { - mapping(bytes32 => mapping(address => mapping(address => bool))) public allowedCaller; + mapping(bytes32 => mapping(address => mapping(address => bool))) public allowedRequestor; function registerPolicy(address kernel, bytes32 permissionId, bytes calldata policyData) external payable { address[] memory callers = abi.decode(policyData, (address[])); for (uint256 i = 0; i < callers.length; i++) { if(callers[i] == address(0)) { - allowedCaller[permissionId][kernel][kernel] = true; + allowedRequestor[permissionId][kernel][kernel] = true; } else { - allowedCaller[permissionId][callers[i]][kernel] = true; + allowedRequestor[permissionId][callers[i]][kernel] = true; } } } @@ -33,7 +33,7 @@ contract SignaturePolicy is IPolicy { bytes32 messageHash, bytes calldata signature ) external view override returns (ValidationData) { - if (allowedCaller[permissionId][caller][kernel]) { + if (allowedRequestor[permissionId][caller][kernel]) { return ValidationData.wrap(0); } return SIG_VALIDATION_FAILED; From c93db271038210b489352c048b35aaefc7c83972 Mon Sep 17 00:00:00 2001 From: leekt Date: Wed, 31 Jan 2024 03:19:13 +0900 Subject: [PATCH 24/36] forge fmt --- src/lite/KernelLiteECDSA.sol | 2 +- .../modularPermission/ModularPermissionValidator.sol | 4 ++-- src/validator/modularPermission/PolicyConfig.sol | 1 + src/validator/modularPermission/SignaturePolicy.sol | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/lite/KernelLiteECDSA.sol b/src/lite/KernelLiteECDSA.sol index ed958cfe..6d7f862a 100644 --- a/src/lite/KernelLiteECDSA.sol +++ b/src/lite/KernelLiteECDSA.sol @@ -70,7 +70,7 @@ contract KernelLiteECDSA is Kernel { } /// @dev Validate a signature - function _validateSignature(address /*_requestor*/, bytes32 _hash, bytes calldata _signature) + function _validateSignature(address, /*_requestor*/ bytes32 _hash, bytes calldata _signature) internal view override diff --git a/src/validator/modularPermission/ModularPermissionValidator.sol b/src/validator/modularPermission/ModularPermissionValidator.sol index 0e07e0c2..7ba1bd13 100644 --- a/src/validator/modularPermission/ModularPermissionValidator.sol +++ b/src/validator/modularPermission/ModularPermissionValidator.sol @@ -119,7 +119,7 @@ contract ModularPermissionValidator is IKernelValidator { require(nonce == nonces[msg.sender].next, "nonce should be next"); bytes32 permissionId = getPermissionId(nonce, flag, signer, validAfter, validUntil, policy, signerData, policyData); - if(flag == MAX_FLAG) { + if (flag == MAX_FLAG) { priorityPermission[msg.sender] = permissionId; } @@ -219,7 +219,7 @@ contract ModularPermissionValidator is IKernelValidator { { ValidationSigMemory memory sigMemory; sigMemory.permissionId = bytes32(signature[0:32]); - if( + if ( nonces[msg.sender].revoked > permissions[sigMemory.permissionId][msg.sender].nonce || permissions[sigMemory.permissionId][msg.sender].flag & toFlag(2) == toFlag(0) ) { diff --git a/src/validator/modularPermission/PolicyConfig.sol b/src/validator/modularPermission/PolicyConfig.sol index 9a774e74..704d5b9f 100644 --- a/src/validator/modularPermission/PolicyConfig.sol +++ b/src/validator/modularPermission/PolicyConfig.sol @@ -16,6 +16,7 @@ bytes12 constant MAX_FLAG = 0xffffffffffffffffffffffff; // 1 bit : not for validatUserOp // 1 bit : not for validateSignature // 1 bit : not for validateCaller + library PolicyConfigLib { function pack(IPolicy addr, bytes12 flag) internal pure returns (PolicyConfig data) { assembly { diff --git a/src/validator/modularPermission/SignaturePolicy.sol b/src/validator/modularPermission/SignaturePolicy.sol index 93ee8070..71fdc5ca 100644 --- a/src/validator/modularPermission/SignaturePolicy.sol +++ b/src/validator/modularPermission/SignaturePolicy.sol @@ -8,7 +8,7 @@ contract SignaturePolicy is IPolicy { function registerPolicy(address kernel, bytes32 permissionId, bytes calldata policyData) external payable { address[] memory callers = abi.decode(policyData, (address[])); for (uint256 i = 0; i < callers.length; i++) { - if(callers[i] == address(0)) { + if (callers[i] == address(0)) { allowedRequestor[permissionId][kernel][kernel] = true; } else { allowedRequestor[permissionId][callers[i]][kernel] = true; From 135db9864a3864d832c8f7a1b9789d8d854d93b0 Mon Sep 17 00:00:00 2001 From: leekt Date: Thu, 1 Feb 2024 03:08:15 +0900 Subject: [PATCH 25/36] example for eip712 --- src/Kernel.sol | 12 +- src/lite/KernelLiteECDSA.sol | 2 +- src/validator/modularPermission/IPolicy.sol | 1 + .../ModularPermissionValidator.sol | 5 +- .../modularPermission/mock/MockPolicy.sol | 1 + .../policies/EIP712Policy.sol | 134 +++++++++ .../policies/ExecutePolicy.sol | 2 +- .../modularPermission/policies/GasPolicy.sol | 1 + .../policies/MerklePolicy.sol | 1 + .../{ => policies}/SignaturePolicy.sol | 3 +- .../modularPermission/ModularPermission.t.sol | 254 +++++++++++++++++- 11 files changed, 405 insertions(+), 11 deletions(-) create mode 100644 src/validator/modularPermission/policies/EIP712Policy.sol rename src/validator/modularPermission/{ => policies}/SignaturePolicy.sol (96%) diff --git a/src/Kernel.sol b/src/Kernel.sol index cee0c251..e3da874f 100644 --- a/src/Kernel.sol +++ b/src/Kernel.sol @@ -244,7 +244,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { ) ); validationData = _intersectValidationData( - _validateSignature(address(this), enableDigest, signature[cursor:cursor + length]), + _validateSignature(address(this), enableDigest, enableDigest, signature[cursor:cursor + length]), ValidationData.wrap( uint256(bytes32(signature[4:36])) & 0xffffffffffffffffffffffff0000000000000000000000000000000000000000 @@ -269,7 +269,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { /// @param hash The hash of the data that was signed /// @param signature The signature to be validated function validateSignature(bytes32 hash, bytes calldata signature) public view returns (ValidationData) { - return _validateSignature(msg.sender, hash, signature); + return _validateSignature(msg.sender, hash, hash, signature); } /// @dev Get the current name & version of the kernel, used for the EIP-712 domain separator @@ -305,7 +305,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { // Recreate the signed message hash with the correct domain separator bytes32 signedMessageHash = keccak256(abi.encodePacked("\x19\x01", domainSeparator, hash)); - ValidationData validationData = _validateSignature(msg.sender, signedMessageHash, signature); + ValidationData validationData = _validateSignature(msg.sender, signedMessageHash, hash, signature); (ValidAfter validAfter, ValidUntil validUntil, address result) = parseValidationData(validationData); // Check if the signature is valid within the specified time frame and the result is successful @@ -365,7 +365,7 @@ contract Kernel is EIP712, Compatibility, KernelStorage { /// @param _hash The hash of the data that was signed /// @param _signature The signature to be validated /// @return The magic value 0x1626ba7e if the signature is valid, otherwise returns 0xffffffff. - function _validateSignature(address _requestor, bytes32 _hash, bytes calldata _signature) + function _validateSignature(address _requestor, bytes32 _hash, bytes32 _rawHash, bytes calldata _signature) internal view virtual @@ -378,7 +378,9 @@ contract Kernel is EIP712, Compatibility, KernelStorage { // 20 bytes added at the end of the signature to store the address of the caller (bool success, bytes memory res) = validator.staticcall( abi.encodePacked( - abi.encodeWithSelector(IKernelValidator.validateSignature.selector, _hash, _signature), _requestor + abi.encodeWithSelector(IKernelValidator.validateSignature.selector, _hash, _signature), + _rawHash, + _requestor ) ); require(success, "Kernel::_validateSignature: failed to validate signature"); diff --git a/src/lite/KernelLiteECDSA.sol b/src/lite/KernelLiteECDSA.sol index 6d7f862a..ee42efe1 100644 --- a/src/lite/KernelLiteECDSA.sol +++ b/src/lite/KernelLiteECDSA.sol @@ -70,7 +70,7 @@ contract KernelLiteECDSA is Kernel { } /// @dev Validate a signature - function _validateSignature(address, /*_requestor*/ bytes32 _hash, bytes calldata _signature) + function _validateSignature(address, /*_requestor*/ bytes32 _hash, bytes32, /*_rawHash*/ bytes calldata _signature) internal view override diff --git a/src/validator/modularPermission/IPolicy.sol b/src/validator/modularPermission/IPolicy.sol index 424988ca..a57b8148 100644 --- a/src/validator/modularPermission/IPolicy.sol +++ b/src/validator/modularPermission/IPolicy.sol @@ -17,6 +17,7 @@ interface IPolicy { address caller, bytes32 permissionId, bytes32 messageHash, + bytes32 rawHash, bytes calldata signature ) external view returns (ValidationData); } diff --git a/src/validator/modularPermission/ModularPermissionValidator.sol b/src/validator/modularPermission/ModularPermissionValidator.sol index 7ba1bd13..267465d7 100644 --- a/src/validator/modularPermission/ModularPermissionValidator.sol +++ b/src/validator/modularPermission/ModularPermissionValidator.sol @@ -8,6 +8,7 @@ import {ISigner} from "./ISigner.sol"; import {IPolicy} from "./IPolicy.sol"; import {_intersectValidationData} from "src/utils/KernelHelper.sol"; import {PolicyConfig, PolicyConfigLib, toFlag, MAX_FLAG} from "./PolicyConfig.sol"; +import "forge-std/console.sol"; struct Permission { uint128 nonce; @@ -207,6 +208,7 @@ contract ModularPermissionValidator is IKernelValidator { struct ValidationSigMemory { address caller; bytes32 permissionId; + bytes32 rawHash; uint256 cursor; PolicyConfig policy; } @@ -238,6 +240,7 @@ contract ModularPermissionValidator is IKernelValidator { sigMemory.cursor = 0; sigMemory.policy = permission.firstPolicy; sigMemory.caller = address(bytes20(msg.data[msg.data.length - 20:])); + sigMemory.rawHash = bytes32(msg.data[msg.data.length - 52:msg.data.length - 20]); while (address(PolicyConfigLib.getAddress(sigMemory.policy)) != address(0)) { if (PolicyConfigLib.skipOnValidateSignature(sigMemory.policy)) { sigMemory.policy = nextPolicy[sigMemory.permissionId][sigMemory.policy][msg.sender]; @@ -257,7 +260,7 @@ contract ModularPermissionValidator is IKernelValidator { // not move cursor here } ValidationData policyValidation = PolicyConfigLib.getAddress(sigMemory.policy).validateSignature( - msg.sender, sigMemory.caller, sigMemory.permissionId, hash, policyData + msg.sender, sigMemory.caller, sigMemory.permissionId, hash, sigMemory.rawHash, policyData ); validationData = _intersectValidationData(validationData, policyValidation); sigMemory.policy = nextPolicy[sigMemory.permissionId][sigMemory.policy][msg.sender]; diff --git a/src/validator/modularPermission/mock/MockPolicy.sol b/src/validator/modularPermission/mock/MockPolicy.sol index 57598c79..7b3384f2 100644 --- a/src/validator/modularPermission/mock/MockPolicy.sol +++ b/src/validator/modularPermission/mock/MockPolicy.sol @@ -38,6 +38,7 @@ contract MockPolicy is IPolicy { address caller, bytes32 permissionId, bytes32 messageHash, + bytes32 rawHash, bytes calldata signature ) external view override returns (ValidationData) { if (revertOnSignature) { diff --git a/src/validator/modularPermission/policies/EIP712Policy.sol b/src/validator/modularPermission/policies/EIP712Policy.sol new file mode 100644 index 00000000..9ffb0057 --- /dev/null +++ b/src/validator/modularPermission/policies/EIP712Policy.sol @@ -0,0 +1,134 @@ +pragma solidity ^0.8.0; + +import "../IPolicy.sol"; + +// does not support nested parameters, +// only allow checking, +// 1. domain separator +// 2. typeHash +// 3. encodeData => only allows 32 bytes of parameter in encodeData, if you are dealing with dynamic value, you need to pass in the keccak256 hash of the value +struct EncodeDataRule { + uint32 index; + bytes32 value; + ParamRule rule; +} + +struct AllowedEIP712Params { + bytes32 domainSeparator; + bytes32 typeHash; + EncodeDataRule encodeDataRule; +} + +enum ParamRule { + NA, + Equal, + NotEqual, + GreaterThan, + GreaterThanOrEqual, + LessThan, + LessThanOrEqual +} + +contract EIP712Policy is IPolicy { + mapping( + bytes32 permissionId => mapping(address permissionValidator => mapping(address kernel => AllowedEIP712Params)) + ) public eip712Param; + mapping( + bytes32 permissionId + => mapping( + address permissionValidator => mapping(bytes32 encodeData => mapping(address kernel => EncodeDataRule)) + ) + ) public nextEncodeData; + + function registerPolicy(address _kernel, bytes32 _permissionId, bytes calldata _data) external payable override { + bytes32 domainSeparator = bytes32(_data[0:32]); + bytes32 typeHash = bytes32(_data[32:64]); + uint32 index = uint32(bytes4(_data[64:68])); + ParamRule rule = ParamRule(uint8(bytes1(_data[68]))); + bytes32 encodeData = bytes32(_data[69:101]); + uint256 cursor = 101; + EncodeDataRule memory encodeDataRule = EncodeDataRule(index, encodeData, rule); + eip712Param[_permissionId][msg.sender][_kernel] = AllowedEIP712Params(domainSeparator, typeHash, encodeDataRule); + while (cursor <= _data.length - 37) { + index = uint32(bytes4(_data[cursor:cursor + 4])); + rule = ParamRule(uint8(bytes1(_data[cursor + 4]))); + bytes32 nextEncodeParam = bytes32(_data[cursor + 5:cursor + 37]); + nextEncodeData[_permissionId][msg.sender][encodeData][_kernel] = + EncodeDataRule(index, nextEncodeParam, rule); + cursor += 37; + } + } + + function checkUserOpPolicy( + address _kernel, + bytes32 _permissionId, + UserOperation calldata _userOp, + bytes calldata _policyProof + ) external payable override returns (ValidationData) { + // do nothing on userOp validation + return ValidationData.wrap(0); + } + + function validateSignature( + address _kernel, + address _caller, + bytes32 _permissionId, + bytes32 _messageHash, + bytes32 _rawHash, + bytes calldata _signature + ) external view override returns (ValidationData) { + AllowedEIP712Params memory allowedEIP712Params = eip712Param[_permissionId][_caller][_kernel]; + bytes32[] memory encodedData = new bytes32[](uint32(bytes4(_signature[64:68]))); + uint256 cursor = 68; + for (uint32 i = 0; i < encodedData.length; i++) { + encodedData[i] = bytes32(_signature[cursor:cursor + 32]); + cursor += 32; + } + { + bytes32 domainSeparator = bytes32(_signature[0:32]); + bytes32 typeHash = bytes32(_signature[32:64]); + if ( + allowedEIP712Params.domainSeparator | domainSeparator != domainSeparator + || allowedEIP712Params.typeHash | typeHash != typeHash + ) { + return SIG_VALIDATION_FAILED; + } + bytes32 structHash = keccak256(abi.encodePacked(typeHash, encodedData)); + bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); + if (digest != _messageHash) { + return SIG_VALIDATION_FAILED; + } + } + // need to check eip712 hash equals to _rawHash + EncodeDataRule memory encodeDataRule = allowedEIP712Params.encodeDataRule; + while (encodeDataRule.rule != ParamRule.NA) { + if (encodeDataRule.rule == ParamRule.Equal) { + if (encodedData[encodeDataRule.index] != encodeDataRule.value) { + return SIG_VALIDATION_FAILED; + } + } else if (encodeDataRule.rule == ParamRule.NotEqual) { + if (encodedData[encodeDataRule.index] == encodeDataRule.value) { + return SIG_VALIDATION_FAILED; + } + } else if (encodeDataRule.rule == ParamRule.GreaterThan) { + if (encodedData[encodeDataRule.index] <= encodeDataRule.value) { + return SIG_VALIDATION_FAILED; + } + } else if (encodeDataRule.rule == ParamRule.GreaterThanOrEqual) { + if (encodedData[encodeDataRule.index] < encodeDataRule.value) { + return SIG_VALIDATION_FAILED; + } + } else if (encodeDataRule.rule == ParamRule.LessThan) { + if (encodedData[encodeDataRule.index] >= encodeDataRule.value) { + return SIG_VALIDATION_FAILED; + } + } else if (encodeDataRule.rule == ParamRule.LessThanOrEqual) { + if (encodedData[encodeDataRule.index] > encodeDataRule.value) { + return SIG_VALIDATION_FAILED; + } + } + encodeDataRule = nextEncodeData[_permissionId][_caller][encodeDataRule.value][_kernel]; + } + return ValidationData.wrap(0); + } +} diff --git a/src/validator/modularPermission/policies/ExecutePolicy.sol b/src/validator/modularPermission/policies/ExecutePolicy.sol index 071d5552..4ca7f917 100644 --- a/src/validator/modularPermission/policies/ExecutePolicy.sol +++ b/src/validator/modularPermission/policies/ExecutePolicy.sol @@ -39,7 +39,7 @@ contract ExecutePolicy is IPolicy { return packValidationData(config.startAt, ValidUntil.wrap(0)); } - function validateSignature(address, address, bytes32, bytes32, bytes calldata) + function validateSignature(address, address, bytes32, bytes32, bytes32, bytes calldata) external view override diff --git a/src/validator/modularPermission/policies/GasPolicy.sol b/src/validator/modularPermission/policies/GasPolicy.sol index c8947aab..8d0cbeaa 100644 --- a/src/validator/modularPermission/policies/GasPolicy.sol +++ b/src/validator/modularPermission/policies/GasPolicy.sol @@ -50,6 +50,7 @@ contract GasPolicy is IPolicy { address caller, bytes32 permissionId, bytes32 messageHash, + bytes32 rawHash, bytes calldata signature ) external view override returns (ValidationData) { return ValidationData.wrap(0); diff --git a/src/validator/modularPermission/policies/MerklePolicy.sol b/src/validator/modularPermission/policies/MerklePolicy.sol index 7a52659e..96539553 100644 --- a/src/validator/modularPermission/policies/MerklePolicy.sol +++ b/src/validator/modularPermission/policies/MerklePolicy.sol @@ -172,6 +172,7 @@ contract MerklePolicy is IPolicy { address caller, bytes32 permissionId, bytes32 messageHash, + bytes32 rawHash, bytes calldata signature ) external view returns (ValidationData) { return ValidationData.wrap(0); diff --git a/src/validator/modularPermission/SignaturePolicy.sol b/src/validator/modularPermission/policies/SignaturePolicy.sol similarity index 96% rename from src/validator/modularPermission/SignaturePolicy.sol rename to src/validator/modularPermission/policies/SignaturePolicy.sol index 71fdc5ca..696390b3 100644 --- a/src/validator/modularPermission/SignaturePolicy.sol +++ b/src/validator/modularPermission/policies/SignaturePolicy.sol @@ -1,6 +1,6 @@ pragma solidity ^0.8.0; -import "./IPolicy.sol"; +import "../IPolicy.sol"; contract SignaturePolicy is IPolicy { mapping(bytes32 => mapping(address => mapping(address => bool))) public allowedRequestor; @@ -31,6 +31,7 @@ contract SignaturePolicy is IPolicy { address caller, bytes32 permissionId, bytes32 messageHash, + bytes32 rawHash, bytes calldata signature ) external view override returns (ValidationData) { if (allowedRequestor[permissionId][caller][kernel]) { diff --git a/test/foundry/validator/modularPermission/ModularPermission.t.sol b/test/foundry/validator/modularPermission/ModularPermission.t.sol index b14bdf5d..41a3ebde 100644 --- a/test/foundry/validator/modularPermission/ModularPermission.t.sol +++ b/test/foundry/validator/modularPermission/ModularPermission.t.sol @@ -8,13 +8,16 @@ import "src/validator/modularPermission/ModularPermissionValidator.sol"; import "src/validator/modularPermission/signers/ECDSASigner.sol"; import "src/validator/modularPermission/mock/MockPolicy.sol"; import "src/validator/modularPermission/mock/MockSigner.sol"; +import "src/validator/modularPermission/policies/EIP712Policy.sol"; import "forge-std/Test.sol"; import {KernelTestBase} from "src/utils/KernelTestBase.sol"; import {TestExecutor} from "src/mock/TestExecutor.sol"; import {TestValidator} from "src/mock/TestValidator.sol"; import {KernelStorage} from "src/abstract/KernelStorage.sol"; import {ERC4337Utils} from "src/utils/ERC4337Utils.sol"; -import {SignaturePolicy} from "src/validator/modularPermission/SignaturePolicy.sol"; +import {SignaturePolicy} from "src/validator/modularPermission/policies/SignaturePolicy.sol"; +import {EIP712} from "solady/utils/EIP712.sol"; +import {KERNEL_NAME, KERNEL_VERSION} from "src/common/Constants.sol"; using ERC4337Utils for IEntryPoint; @@ -22,7 +25,6 @@ contract ModularPermissionE2ETest is KernelTestBase { ECDSASigner signer; MockPolicy mockPolicy; SignaturePolicy signaturePolicy; - bytes32 permissionId; address[] allowedCaller; function setUp() public virtual { @@ -108,10 +110,136 @@ contract ModularPermissionE2ETest is KernelTestBase { return abi.encodePacked(getPermissionId(), r, s, v); } + function signHashWithoutPermissionId(bytes32 hash) internal view returns (bytes memory) { + (uint8 v, bytes32 r, bytes32 s) = vm.sign(ownerKey, hash); + return abi.encodePacked(r, s, v); + } + function getWrongSignature(bytes32 hash) internal view override returns (bytes memory) { (uint8 v, bytes32 r, bytes32 s) = vm.sign(ownerKey + 1, hash); return abi.encodePacked(getPermissionId(), r, s, v); } + // function testValidateSignature() external { + // + // require(address(uint160(bytes20(bytes32(ret) << 96))) == address(0)); + // require(success); + // vm.stopPrank(); + // vm.startPrank(d.kernel); + // (success, ret) = address(validator).call( + // abi.encodePacked( + // abi.encodeWithSelector( + // ModularPermissionValidator.validateSignature.selector, + // d.digest, + // abi.encodePacked( + // permissionId, + // d.eip712, + // uint256(100), + // d.domainSeparator, + // d.typeHash, + // uint32(1), + // uint256(d.encodeData) + 1 + // ) + // ), + // d.digest, + // makeAddr("app") + // ) + // ); + // require(address(uint160(bytes20(bytes32(ret) << 96))) == address(1)); + // + // require(success); + // vm.stopPrank(); + // } + + struct MData { + address kernel; + ValidUntil until; + bytes sd; + EIP712Policy eip712; + PolicyConfig[] p; + bytes32 domainSeparator; + bytes32 typeHash; + bytes32 encodeData; + bytes32 digest; + bytes[] pd; + } + + struct ModularPermissionConfig { + uint128 nonce; + bytes12 flag; + ISigner signer; + ValidAfter validAfter; + ValidUntil validUntil; + PolicyConfig firstPolicy; + } + + function test_sessionKey_signature() external { + MData memory d; + d.kernel = address(kernel); + d.until = ValidUntil.wrap(uint48(block.timestamp + 100)); + d.sd = abi.encodePacked(owner); + d.eip712 = new EIP712Policy(); + d.p = new PolicyConfig[](1); + d.p[0] = PolicyConfigLib.pack(d.eip712, toFlag(1)); // skip on userOp + + d.domainSeparator = keccak256("DOMAIN_SEPARATOR"); + d.typeHash = keccak256("TypeHash(bytes32 encodeData)"); + d.encodeData = bytes32(uint256(0xdeadbeef)); + d.digest = _hashTypedData(d.domainSeparator, keccak256(abi.encode(d.typeHash, d.encodeData))); + d.pd = new bytes[](1); + d.pd[0] = abi.encodePacked(d.domainSeparator, d.typeHash, bytes4(0), uint8(ParamRule.Equal), d.encodeData); + bytes32 permissionId = ModularPermissionValidator(address(defaultValidator)).getPermissionId( + 0, + MAX_FLAG, //flag + signer, + ValidAfter.wrap(1), + d.until, + d.p, + d.sd, + d.pd + ); + + bytes memory data = abi.encodePacked( + abi.encodePacked( + uint128(0), // nonce + MAX_FLAG, //flag + uint48(1), //`validAfter + d.until, // validUntil + address(signer) + ), // signer + abi.encode(d.p, d.sd, d.pd) + ); + vm.startPrank(d.kernel); + defaultValidator.enable(data); + vm.stopPrank(); + ModularPermissionConfig memory config; + + (config.nonce, config.flag, config.signer, config.firstPolicy, config.validAfter, config.validUntil) = + ModularPermissionValidator(address(defaultValidator)).permissions(permissionId, d.kernel); + assertEq(config.nonce, uint128(0)); + assertEq(config.flag, MAX_FLAG); + assertEq(ValidAfter.unwrap(config.validAfter), uint48(1)); + assertEq(ValidUntil.unwrap(config.validUntil), ValidUntil.unwrap(d.until)); + assertEq(address(config.signer), address(signer)); + bytes32 wrappedDigest = keccak256( + abi.encodePacked( + "\x19\x01", ERC4337Utils._buildDomainSeparator(KERNEL_NAME, KERNEL_VERSION, address(kernel)), d.digest + ) + ); + + kernel.validateSignature( + d.digest, + abi.encodePacked( + permissionId, + d.eip712, + uint256(100), + d.domainSeparator, + d.typeHash, + uint32(1), + uint256(d.encodeData), + signHashWithoutPermissionId(wrappedDigest) + ) + ); + } function test_default_validator_enable() external override { UserOperation memory op = buildUserOperation( @@ -319,6 +447,115 @@ contract ModularPermissionUnitTest is Test { assertEq(skipPolicy.count(permissionId), 0); } + struct MData { + address kernel; + ValidUntil until; + bytes sd; + EIP712Policy eip712; + PolicyConfig[] p; + bytes32 domainSeparator; + bytes32 typeHash; + bytes32 encodeData; + bytes32 digest; + bytes[] pd; + } + + function testValidateSignature() external { + MData memory d; + d.kernel = makeAddr("Kernel"); + d.until = ValidUntil.wrap(uint48(block.timestamp + 100)); + d.sd = abi.encodePacked("hello signer"); + d.eip712 = new EIP712Policy(); + d.p = new PolicyConfig[](1); + d.p[0] = PolicyConfigLib.pack(d.eip712, toFlag(1)); // skip on userOp + + d.domainSeparator = keccak256("DOMAIN_SEPARATOR"); + d.typeHash = keccak256("TypeHash(bytes32 encodeData)"); + d.encodeData = bytes32(uint256(0xdeadbeef)); + d.digest = _hashTypedData(d.domainSeparator, keccak256(abi.encode(d.typeHash, d.encodeData))); + d.pd = new bytes[](1); + d.pd[0] = abi.encodePacked(d.domainSeparator, d.typeHash, bytes4(0), uint8(ParamRule.Equal), d.encodeData); + bytes32 permissionId = validator.getPermissionId( + 0, + MAX_FLAG, //flag + mockSigner, + ValidAfter.wrap(1), + d.until, + d.p, + d.sd, + d.pd + ); + + bytes memory data = abi.encodePacked( + abi.encodePacked( + uint128(0), // nonce + MAX_FLAG, //flag + uint48(1), //`validAfter + d.until, // validUntil + address(mockSigner) + ), // signer + abi.encode(d.p, d.sd, d.pd) + ); + vm.startPrank(d.kernel); + validator.enable(data); + vm.stopPrank(); + + ModularPermissionConfig memory config; + + (config.nonce, config.flag, config.signer, config.firstPolicy, config.validAfter, config.validUntil) = + validator.permissions(permissionId, d.kernel); + assertEq(config.nonce, uint128(0)); + assertEq(config.flag, MAX_FLAG); + assertEq(ValidAfter.unwrap(config.validAfter), uint48(1)); + assertEq(ValidUntil.unwrap(config.validUntil), ValidUntil.unwrap(d.until)); + assertEq(address(config.signer), address(mockSigner)); + + UserOperation memory op; + op.sender = d.kernel; + op.signature = abi.encodePacked(permissionId); + vm.startPrank(d.kernel); + (bool success, bytes memory ret) = address(validator).call( + abi.encodePacked( + abi.encodeWithSelector( + ModularPermissionValidator.validateSignature.selector, + d.digest, + abi.encodePacked( + permissionId, d.eip712, uint256(100), d.domainSeparator, d.typeHash, uint32(1), d.encodeData + ) + ), + d.digest, + makeAddr("app") + ) + ); + require(address(uint160(bytes20(bytes32(ret) << 96))) == address(0)); + require(success); + vm.stopPrank(); + vm.startPrank(d.kernel); + (success, ret) = address(validator).call( + abi.encodePacked( + abi.encodeWithSelector( + ModularPermissionValidator.validateSignature.selector, + d.digest, + abi.encodePacked( + permissionId, + d.eip712, + uint256(100), + d.domainSeparator, + d.typeHash, + uint32(1), + uint256(d.encodeData) + 1 + ) + ), + d.digest, + makeAddr("app") + ) + ); + require(address(uint160(bytes20(bytes32(ret) << 96))) == address(1)); + + require(success); + vm.stopPrank(); + } + function testValidateSignatureSkip() external { address kernel = makeAddr("Kernel"); ValidUntil until = ValidUntil.wrap(uint48(block.timestamp + 100)); @@ -440,3 +677,16 @@ contract ModularPermissionUnitTest is Test { assertEq(mockPolicy.count(permissionId), 1); } } + +function _hashTypedData(bytes32 domain, bytes32 structHash) pure returns (bytes32 digest) { + /// @solidity memory-safe-assembly + assembly { + // Compute the digest. + mstore(0x00, 0x1901000000000000) // Store "\x19\x01". + mstore(0x1a, domain) // Store the domain separator. + mstore(0x3a, structHash) // Store the struct hash. + digest := keccak256(0x18, 0x42) + // Restore the part of the free memory slot that was overwritten. + mstore(0x3a, 0) + } +} From 60e1432aa74fe69cd3d868fd8b37be1d3281776d Mon Sep 17 00:00:00 2001 From: leekt Date: Thu, 1 Feb 2024 03:17:35 +0900 Subject: [PATCH 26/36] test fix to check if signature validation result is ok --- .../policies/EIP712Policy.sol | 4 +- .../modularPermission/ModularPermission.t.sol | 106 ++++++++++++------ 2 files changed, 75 insertions(+), 35 deletions(-) diff --git a/src/validator/modularPermission/policies/EIP712Policy.sol b/src/validator/modularPermission/policies/EIP712Policy.sol index 9ffb0057..f04bbe04 100644 --- a/src/validator/modularPermission/policies/EIP712Policy.sol +++ b/src/validator/modularPermission/policies/EIP712Policy.sol @@ -95,9 +95,7 @@ contract EIP712Policy is IPolicy { } bytes32 structHash = keccak256(abi.encodePacked(typeHash, encodedData)); bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); - if (digest != _messageHash) { - return SIG_VALIDATION_FAILED; - } + require(digest == _rawHash, "digest != _rawHash"); } // need to check eip712 hash equals to _rawHash EncodeDataRule memory encodeDataRule = allowedEIP712Params.encodeDataRule; diff --git a/test/foundry/validator/modularPermission/ModularPermission.t.sol b/test/foundry/validator/modularPermission/ModularPermission.t.sol index 41a3ebde..5cd6c5e6 100644 --- a/test/foundry/validator/modularPermission/ModularPermission.t.sol +++ b/test/foundry/validator/modularPermission/ModularPermission.t.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.0; import {IEntryPoint} from "I4337/interfaces/IEntryPoint.sol"; import {IKernel} from "src/interfaces/IKernel.sol"; +import {Kernel} from "src/Kernel.sol"; import {IKernelValidator} from "src/interfaces/IKernelValidator.sol"; import {Operation} from "src/common/Enums.sol"; import "src/validator/modularPermission/ModularPermissionValidator.sol"; @@ -119,36 +120,6 @@ contract ModularPermissionE2ETest is KernelTestBase { (uint8 v, bytes32 r, bytes32 s) = vm.sign(ownerKey + 1, hash); return abi.encodePacked(getPermissionId(), r, s, v); } - // function testValidateSignature() external { - // - // require(address(uint160(bytes20(bytes32(ret) << 96))) == address(0)); - // require(success); - // vm.stopPrank(); - // vm.startPrank(d.kernel); - // (success, ret) = address(validator).call( - // abi.encodePacked( - // abi.encodeWithSelector( - // ModularPermissionValidator.validateSignature.selector, - // d.digest, - // abi.encodePacked( - // permissionId, - // d.eip712, - // uint256(100), - // d.domainSeparator, - // d.typeHash, - // uint32(1), - // uint256(d.encodeData) + 1 - // ) - // ), - // d.digest, - // makeAddr("app") - // ) - // ); - // require(address(uint160(bytes20(bytes32(ret) << 96))) == address(1)); - // - // require(success); - // vm.stopPrank(); - // } struct MData { address kernel; @@ -226,7 +197,7 @@ contract ModularPermissionE2ETest is KernelTestBase { ) ); - kernel.validateSignature( + bytes4 res = kernel.isValidSignature( d.digest, abi.encodePacked( permissionId, @@ -235,10 +206,81 @@ contract ModularPermissionE2ETest is KernelTestBase { d.domainSeparator, d.typeHash, uint32(1), - uint256(d.encodeData), + uint256(d.encodeData), // you should put all data here signHashWithoutPermissionId(wrappedDigest) ) ); + assertEq(res, Kernel.isValidSignature.selector); + } + + function test_sessionKey_signature_greater_than() external { + MData memory d; + d.kernel = address(kernel); + d.until = ValidUntil.wrap(uint48(block.timestamp + 100)); + d.sd = abi.encodePacked(owner); + d.eip712 = new EIP712Policy(); + d.p = new PolicyConfig[](1); + d.p[0] = PolicyConfigLib.pack(d.eip712, toFlag(1)); // skip on userOp + + d.domainSeparator = keccak256("DOMAIN_SEPARATOR"); + d.typeHash = keccak256("TypeHash(bytes32 encodeData)"); + d.encodeData = bytes32(uint256(0xdeadbeef)); + d.digest = _hashTypedData(d.domainSeparator, keccak256(abi.encode(d.typeHash, uint256(d.encodeData) + 1))); + d.pd = new bytes[](1); + d.pd[0] = abi.encodePacked(d.domainSeparator, d.typeHash, bytes4(0), uint8(ParamRule.GreaterThan), d.encodeData); + bytes32 permissionId = ModularPermissionValidator(address(defaultValidator)).getPermissionId( + 0, + MAX_FLAG, //flag + signer, + ValidAfter.wrap(1), + d.until, + d.p, + d.sd, + d.pd + ); + + bytes memory data = abi.encodePacked( + abi.encodePacked( + uint128(0), // nonce + MAX_FLAG, //flag + uint48(1), //`validAfter + d.until, // validUntil + address(signer) + ), // signer + abi.encode(d.p, d.sd, d.pd) + ); + vm.startPrank(d.kernel); + defaultValidator.enable(data); + vm.stopPrank(); + ModularPermissionConfig memory config; + + (config.nonce, config.flag, config.signer, config.firstPolicy, config.validAfter, config.validUntil) = + ModularPermissionValidator(address(defaultValidator)).permissions(permissionId, d.kernel); + assertEq(config.nonce, uint128(0)); + assertEq(config.flag, MAX_FLAG); + assertEq(ValidAfter.unwrap(config.validAfter), uint48(1)); + assertEq(ValidUntil.unwrap(config.validUntil), ValidUntil.unwrap(d.until)); + assertEq(address(config.signer), address(signer)); + bytes32 wrappedDigest = keccak256( + abi.encodePacked( + "\x19\x01", ERC4337Utils._buildDomainSeparator(KERNEL_NAME, KERNEL_VERSION, address(kernel)), d.digest + ) + ); + + bytes4 res = kernel.isValidSignature( + d.digest, + abi.encodePacked( + permissionId, + d.eip712, + uint256(100), + d.domainSeparator, + d.typeHash, + uint32(1), + uint256(d.encodeData) + 1, // you should put all data here + signHashWithoutPermissionId(wrappedDigest) + ) + ); + assertEq(res, Kernel.isValidSignature.selector); } function test_default_validator_enable() external override { From a278ff54694e307f129126ec478d793ad6dbfd0a Mon Sep 17 00:00:00 2001 From: Sahil Vasava Date: Fri, 9 Feb 2024 09:56:15 +0700 Subject: [PATCH 27/36] fix: nonce fixes in ModularPermissionValidator --- .../80001/run-1707331759.json | 69 +++++++ .../80001/run-1707331808.json | 73 ++++++++ .../80001/run-1707331815.json | 169 ++++++++++++++++++ .../80001/run-1707430304.json | 33 ++++ .../80001/run-1707430395.json | 65 +++++++ .../80001/run-1707439892.json | 33 ++++ .../80001/run-1707439906.json | 65 +++++++ .../80001/run-latest.json | 65 +++++++ script/DeployModularPermission.s.sol | 44 +++++ .../ModularPermissionValidator.sol | 8 +- .../modularPermission/ModularPermission.t.sol | 16 +- 11 files changed, 624 insertions(+), 16 deletions(-) create mode 100644 broadcast/DeployModularPermission.s.sol/80001/run-1707331759.json create mode 100644 broadcast/DeployModularPermission.s.sol/80001/run-1707331808.json create mode 100644 broadcast/DeployModularPermission.s.sol/80001/run-1707331815.json create mode 100644 broadcast/DeployModularPermission.s.sol/80001/run-1707430304.json create mode 100644 broadcast/DeployModularPermission.s.sol/80001/run-1707430395.json create mode 100644 broadcast/DeployModularPermission.s.sol/80001/run-1707439892.json create mode 100644 broadcast/DeployModularPermission.s.sol/80001/run-1707439906.json create mode 100644 broadcast/DeployModularPermission.s.sol/80001/run-latest.json create mode 100644 script/DeployModularPermission.s.sol diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-1707331759.json b/broadcast/DeployModularPermission.s.sol/80001/run-1707331759.json new file mode 100644 index 00000000..1d1a4c10 --- /dev/null +++ b/broadcast/DeployModularPermission.s.sol/80001/run-1707331759.json @@ -0,0 +1,69 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "ModularPermissionValidator", + "contractAddress": "0x5e79C26A829e0b11b6cC2D2358551CE1a9f0e32B", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26cec4", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50611e71806100206000396000f3fe6080604052600436106100dd5760003560e01c80638fc925aa1161007f578063c4a5240911610059578063c4a524091461031f578063d4085e811461033f578063e89005c71461037d578063ee87c2951461039057600080fd5b80638fc925aa146102bc5780639ea9bd59146102cf578063b66bd1d2146102f257600080fd5b80633ec50c6c116100bb5780633ec50c6c1461013d578063511079bc1461021157806365b8de2e146102245780637ecebe001461025b57600080fd5b80630c959556146100e2578063333daf92146100f75780633a871cdd1461012a575b600080fd5b6100f56100f0366004611586565b6103a3565b005b34801561010357600080fd5b506101176101123660046115c8565b6103f6565b6040519081526020015b60405180910390f35b610117610138366004611614565b61089a565b34801561014957600080fd5b506101bb610158366004611690565b6001602081815260009384526040808520909152918352912080549181015460028201546003909201546001600160801b03841693600160801b900460a01b926001600160a01b03909216919065ffffffffffff80821691600160301b90041686565b604080516001600160801b0390971687526001600160a01b031990951660208701526001600160a01b0390931693850193909352606084015265ffffffffffff91821660808401521660a082015260c001610121565b6100f561021f36600461174a565b610d65565b34801561023057600080fd5b5061024461023f366004611586565b6111fe565b6040516101219b9a99989796959493929190611941565b34801561026757600080fd5b5061029c6102763660046119d8565b6003602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610121565b6100f56102ca366004611586565b6112f9565b6102e26102dd3660046119f5565b611328565b6040519015158152602001610121565b3480156102fe57600080fd5b5061011761030d3660046119d8565b60006020819052908152604090205481565b34801561032b57600080fd5b5061011761033a36600461174a565b611365565b34801561034b57600080fd5b5061011761035a366004611a31565b600260209081526000938452604080852082529284528284209052825290205481565b6100f561038b366004611a6a565b6113b3565b6100f561039e366004611a83565b61141f565b60008060008060003660003660003660006103be8d8d6111fe565b9a509a509a509a509a509a509a509a509a509a509a506103e78b8b8b8b8b8b8b8b8b8b8b610d65565b50505050505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810182905261042e602060008587611a9e565b61043791611ac8565b602080830182905260009182526001815260408083203384528252808320546003909252909120546001600160801b03918216600160801b90910490911611806104aa575060208181015160009081526001825260408082203383529092522054600160801b900460a01b600160a11b16155b156104b9576001915050610893565b6020818101516000908152600180835260408083203384528452808320815160c08101835281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682880152938201546001600160a01b0316928101929092526002810154606080840191825260039092015465ffffffffffff808216608080870191909152600160301b9092041694840194909452908601849052519185019190915291860190601f1986019036610574601482611afd565b61057f928290611a9e565b61058891611b10565b60601c845260003661059b603482611afd565b906105a7601436611afd565b926105b493929190611a9e565b6105bd91611ac8565b60408501525b60808401516001600160a01b0316156107ec57608084015160a11c60011615610618576020808501516000908152600282526040808220608088018051845290845281832033845290935290205490526105c3565b36600061062f86608001516001600160a01b031690565b60608701516001600160a01b03919091169085908561064f826014611b43565b9261065c93929190611a9e565b61066591611b10565b60601c036106f85760008484886060015160146106829190611b43565b90896060015160346106949190611b43565b926106a193929190611a9e565b6106aa91611ac8565b60001c90508484886060015160346106c29190611b43565b6106cd928290611a9e565b90935091506106dd816034611b43565b876060018181516106ee9190611b43565b90525061070e9050565b606086015161070990808587611a9e565b915091505b600061072487608001516001600160a01b031690565b6001600160a01b031663ecfcd9303389600001518a602001518f8c6040015189896040518863ffffffff1660e01b81526004016107679796959493929190611b56565b602060405180830381865afa158015610784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a89190611ba1565b90506107b4888261147f565b602080890151600090815260028252604080822060808c0180518452908452818320338452909352902054905297506105c392505050565b600083604001516001600160a01b0316637a7c6a4f3387602001518c87878b6060015190809261081e93929190611a9e565b6040518663ffffffff1660e01b815260040161083e959493929190611bba565b602060405180830381865afa15801561085b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087f9190611ba1565b905061088b868261147f565b955050505050505b9392505050565b6000336108aa60208601866119d8565b6001600160a01b0316146109055760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d757374206265206d73672e73656e6465720000000000000060448201526064015b60405180910390fd5b6000610915610140860186611bf3565b61092491602091600091611a9e565b61092d91611ac8565b6000818152600160209081526040808320338452909152902054909150600160801b900460a01b600160a01b16158061099e57503360008181526003602090815260408083205485845260018352818420948452939091529020546001600160801b03600160801b90920482169116115b156109ad576001915050610893565b6000818152600160208181526040808420338552825292839020835160c08101855281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682850152938201546001600160a01b03169481019490945260028101546060850181905260039091015465ffffffffffff8082166080870152600160301b90910416928401929092525b6001600160a01b03821615610cf25760a082901c60011615610a835760008481526002602090815260408083209483529381528382203383529052919091205490610a3d565b366000610a91836034611b43565b610a9f6101408c018c611bf3565b905010158015610aea57506001600160a01b038416610ac26101408c018c611bf3565b8590610acf826014611b43565b92610adc93929190611a9e565b610ae591611b10565b60601c145b15610c14576000610aff6101408c018c611bf3565b610b0a866014611b43565b90610b16876034611b43565b92610b2393929190611a9e565b610b2c91611ac8565b905080610b3a856034611b43565b610b449190611b43565b610b526101408d018d611bf3565b90501015610bb55760405162461bcd60e51b815260206004820152602a60248201527f706f6c69637944617461206c656e6774682065786365656473207369676e61746044820152690eae4ca40d8cadccee8d60b31b60648201526084016108fc565b610bc36101408c018c611bf3565b610bce866034611b43565b9083610bdb886034611b43565b610be59190611b43565b92610bf293929190611a9e565b9093509150610c02816034611b43565b610c0c9085611b43565b935050610c34565b610c226101408b018b611bf3565b610c2f9185918291611a9e565b915091505b60006001600160a01b0385166001600160a01b031663c92ce35133898e87876040518663ffffffff1660e01b8152600401610c73959493929190611c3a565b6020604051808303816000875af1158015610c92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb69190611ba1565b9050610cc2888261147f565b600088815260026020908152604080832098835297815287822033835290529590952054949750610a3d92505050565b60408301516000906001600160a01b0316638e0125d233878b610d196101408f018f611bf3565b610d269189908290611a9e565b6040518663ffffffff1660e01b8152600401610d46959493929190611bba565b6020604051808303816000875af115801561085b573d6000803e3d6000fd5b6001600160a01b03198a16610dbc5760405162461bcd60e51b815260206004820152601860248201527f666c61672073686f756c64206e6f7420626520656d707479000000000000000060448201526064016108fc565b336000908152600360205260409020546001600160801b038c8116911614610e1d5760405162461bcd60e51b81526020600482015260146024820152731b9bdb98d9481cda1bdd5b19081899481b995e1d60621b60448201526064016108fc565b6000610e328c8c8c8c8c8c8c8c8c8c8c611365565b9050600160a01b6001600160a01b03198c1601610e5c573360009081526020819052604090208190555b60005b86811015610f2657610e8f888883818110610e7c57610e7c611d7d565b905060200201356001600160a01b031690565b6001600160a01b031662282ae03384878786818110610eb057610eb0611d7d565b9050602002810190610ec29190611bf3565b6040518563ffffffff1660e01b8152600401610ee19493929190611d93565b600060405180830381600087803b158015610efb57600080fd5b505af1158015610f0f573d6000803e3d6000fd5b505050508080610f1e90611dc5565b915050610e5f565b5060405163e9b51de560e01b81526001600160a01b038b169063e9b51de590610f5990339085908a908a90600401611d93565b600060405180830381600087803b158015610f7357600080fd5b505af1158015610f87573d6000803e3d6000fd5b50505050600087876000818110610fa057610fa0611d7d565b9050602002013590506040518060c001604052808e6001600160801b031681526020018d6001600160a01b03191681526020018c6001600160a01b031681526020018281526020018b65ffffffffffff1681526020018a65ffffffffffff16815250600160008481526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160801b0302191690836001600160801b0316021790555060208201518160000160106101000a8154816bffffffffffffffffffffffff021916908360a01c021790555060408201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816002015560808201518160030160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060a08201518160030160066101000a81548165ffffffffffff021916908365ffffffffffff1602179055509050506000600190505b878110156111b55788888281811061114257611142611d7d565b905060200201356002600085815260200190815260200160002060008b8b60018661116d9190611afd565b81811061117c5761117c611d7d565b602090810292909201358352508181019290925260409081016000908120338252909252902055806111ad81611dc5565b915050611128565b5060408051338152602081018490527fab0f2b94c33903f7ed343b1bcc3baca5e69eb7d007b8c8207232012f6cffef0e910160405180910390a150505050505050505050505050565b60008060008060003660003660003660008c8c60009060109261122393929190611a9e565b61122c91611dde565b60801c9a508c8c601090601c9261124593929190611a9e565b61124e91611e15565b99508c8c601c9060229261126493929190611a9e565b61126d91611e43565b60d01c97508c8c60229060289261128693929190611a9e565b61128f91611e43565b60d01c96508c8c602890603c926112a893929190611a9e565b6112b191611b10565b9a9d999c60609b909b1c9b5096999598605c603c8089013589018281019b50810135995081890135890180830199908201359850607c81013501918201965001359350915050565b60208190036113135761130f61038b8284611ac8565b5050565b61130f6113208284611dde565b60801c61141f565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064016108fc565b60008b8b8b8b8b8b8b8b8b8b8b60405160200161138c9b9a99989796959493929190611941565b6040516020818303038152906040528051906020012090509b9a5050505050505050505050565b6000818152600160209081526040808320338085529083529281902080546bffffffffffffffffffffffff60801b1916905580519283529082018390527f789770131846de4d1f28418f0f957cdf4fcabe5eccf70067083e20ecece69a3491015b60405180910390a150565b3360008181526003602090815260409182902080546001600160801b03908116600160801b918716918202179091558251938452908301527f22cd1acb7e7a306800a1b2c0ca9b0280187bbc00b7fbf55d38ad6cbf73082aec9101611414565b600081830160601b8260601b81148460601b8214176001600160a01b03848618161517600181146114b35760019250611535565b6001600160d01b031980851690861681811881831102188686176001600160a01b031617935065ffffffffffff60a01b861690816114f85765ffffffffffff60a01b91505b5065ffffffffffff60a01b851680611516575065ffffffffffff60a01b5b80821890821102188061152f575065ffffffffffff60a01b5b92909217915b505092915050565b60008083601f84011261154f57600080fd5b50813567ffffffffffffffff81111561156757600080fd5b60208301915083602082850101111561157f57600080fd5b9250929050565b6000806020838503121561159957600080fd5b823567ffffffffffffffff8111156115b057600080fd5b6115bc8582860161153d565b90969095509350505050565b6000806000604084860312156115dd57600080fd5b83359250602084013567ffffffffffffffff8111156115fb57600080fd5b6116078682870161153d565b9497909650939450505050565b60008060006060848603121561162957600080fd5b833567ffffffffffffffff81111561164057600080fd5b8401610160818703121561165357600080fd5b95602085013595506040909401359392505050565b6001600160a01b038116811461167d57600080fd5b50565b803561168b81611668565b919050565b600080604083850312156116a357600080fd5b8235915060208301356116b581611668565b809150509250929050565b80356001600160801b038116811461168b57600080fd5b80356001600160a01b03198116811461168b57600080fd5b803565ffffffffffff8116811461168b57600080fd5b60008083601f84011261171757600080fd5b50813567ffffffffffffffff81111561172f57600080fd5b6020830191508360208260051b850101111561157f57600080fd5b60008060008060008060008060008060006101008c8e03121561176c57600080fd5b6117758c6116c0565b9a5061178360208d016116d7565b995061179160408d01611680565b985061179f60608d016116ef565b97506117ad60808d016116ef565b965067ffffffffffffffff8060a08e013511156117c957600080fd5b6117d98e60a08f01358f01611705565b909750955060c08d01358110156117ef57600080fd5b6117ff8e60c08f01358f0161153d565b909550935060e08d013581101561181557600080fd5b506118268d60e08e01358e01611705565b81935080925050509295989b509295989b9093969950565b8183526000602080850194508260005b8581101561186a5781358752958201959082019060010161184e565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000808335601e198436030181126118b557600080fd5b830160208101925035905067ffffffffffffffff8111156118d557600080fd5b80360382131561157f57600080fd5b81835260006020808501808196508560051b810191508460005b87811015611934578284038952611915828861189e565b611920868284611875565b9a87019a95505050908401906001016118fe565b5091979650505050505050565b6001600160801b038c1681526001600160a01b03198b1660208201526001600160a01b038a16604082015265ffffffffffff89811660608301528816608082015261010060a0820181905260009061199c838201898b61183e565b905082810360c08401526119b1818789611875565b905082810360e08401526119c68185876118e4565b9e9d5050505050505050505050505050565b6000602082840312156119ea57600080fd5b813561089381611668565b600080600060408486031215611a0a57600080fd5b8335611a1581611668565b9250602084013567ffffffffffffffff8111156115fb57600080fd5b600080600060608486031215611a4657600080fd5b83359250602084013591506040840135611a5f81611668565b809150509250925092565b600060208284031215611a7c57600080fd5b5035919050565b600060208284031215611a9557600080fd5b610893826116c0565b60008085851115611aae57600080fd5b83861115611abb57600080fd5b5050820193919092039150565b80356020831015611ae157600019602084900360031b1b165b92915050565b634e487b7160e01b600052601160045260246000fd5b81810381811115611ae157611ae1611ae7565b6bffffffffffffffffffffffff1981358181169160148510156115355760149490940360031b84901b1690921692915050565b80820180821115611ae157611ae1611ae7565b600060018060a01b03808a16835280891660208401525086604083015285606083015284608083015260c060a0830152611b9460c083018486611875565b9998505050505050505050565b600060208284031215611bb357600080fd5b5051919050565b60018060a01b0386168152846020820152836040820152608060608201526000611be8608083018486611875565b979650505050505050565b6000808335601e19843603018112611c0a57600080fd5b83018035915067ffffffffffffffff821115611c2557600080fd5b60200191503681900382131561157f57600080fd5b6001600160a01b038616815260208101859052608060408201819052611c72908201611c6586611680565b6001600160a01b03169052565b602084013560a08201526000611c8b604086018661189e565b6101608060c0860152611ca36101e086018385611875565b9250611cb2606089018961189e565b9250607f19808786030160e0880152611ccc858584611875565b9450610100935060808a013584880152610120915060a08a01358288015261014060c08b01358189015260e08b013584890152848b0135610180890152611d15838c018c61189e565b9550935081888703016101a0890152611d2f868686611875565b9550611d3d818c018c61189e565b955093505080878603016101c08801525050611d5a838383611875565b925050508281036060840152611d71818587611875565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b60018060a01b0385168152836020820152606060408201526000611dbb606083018486611875565b9695505050505050565b600060018201611dd757611dd7611ae7565b5060010190565b6fffffffffffffffffffffffffffffffff1981358181169160108510156115355760109490940360031b84901b1690921692915050565b6001600160a01b0319813581811691600c85101561153557600c9490940360031b84901b1690921692915050565b6001600160d01b031981358181169160068510156115355760069490940360031b84901b169092169291505056", + "nonce": "0x95c6" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "ECDSASigner", + "contractAddress": "0xF9E712F44A360ED8820aD624e41164f74a5a7456", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x9397d", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610680806100206000396000f3fe60806040526004361061003f5760003560e01c806367249d69146100445780637a7c6a4f146100a75780638e0125d2146100d5578063e9b51de5146100e8575b600080fd5b34801561005057600080fd5b5061008a61005f366004610498565b600060208181529381526040808220855292815282812090935282529020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100b357600080fd5b506100c76100c236600461051d565b6100fd565b60405190815260200161009e565b6100c76100e336600461051d565b6101e3565b6100fb6100f6366004610585565b610277565b005b3360009081526020818152604080832087845282528083206001600160a01b03898116855292528220541661014d5760405162461bcd60e51b8152600401610144906105df565b60405180910390fd5b600061019184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089939250506103c09050565b336000908152602081815260408083208a845282528083206001600160a01b038c81168552925290912054919250908116908216036101d45760009150506101da565b60019150505b95945050505050565b3360009081526020818152604080832087845282528083206001600160a01b03898116855292528220541661022a5760405162461bcd60e51b8152600401610144906105df565b600061019184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061027192508991506104519050565b906103c0565b3360009081526020818152604080832086845282528083206001600160a01b03888116855292529091205416156102ff5760405162461bcd60e51b815260206004820152602660248201527f45434453415369676e65723a206b65726e656c20616c726561647920726567696044820152651cdd195c995960d21b6064820152608401610144565b6014811461035b5760405162461bcd60e51b815260206004820152602360248201527f45434453415369676e65723a20696e76616c6964207369676e6572206164647260448201526265737360e81b6064820152608401610144565b600061036a6014828486610621565b6103739161064b565b336000908152602081815260408083209783529681528682206001600160a01b03989098168252969096529390942080546001600160a01b03191660609490941c93909317909255505050565b60405160019083600052602083015160405260408351036103fc57604083015160ff81901c601b016020526001600160ff1b0316606052610422565b604183510361041d57606083015160001a6020526040830151606052610422565b600091505b6020600160806000855afa5191503d61044357638baa579f6000526004601cfd5b600060605260405292915050565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b80356001600160a01b038116811461049357600080fd5b919050565b6000806000606084860312156104ad57600080fd5b6104b68461047c565b9250602084013591506104cb6040850161047c565b90509250925092565b60008083601f8401126104e657600080fd5b50813567ffffffffffffffff8111156104fe57600080fd5b60208301915083602082850101111561051657600080fd5b9250929050565b60008060008060006080868803121561053557600080fd5b61053e8661047c565b94506020860135935060408601359250606086013567ffffffffffffffff81111561056857600080fd5b610574888289016104d4565b969995985093965092949392505050565b6000806000806060858703121561059b57600080fd5b6105a48561047c565b935060208501359250604085013567ffffffffffffffff8111156105c757600080fd5b6105d3878288016104d4565b95989497509550505050565b60208082526022908201527f45434453415369676e65723a206b65726e656c206e6f74207265676973746572604082015261195960f21b606082015260800190565b6000808585111561063157600080fd5b8386111561063e57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106785780818660140360031b1b83161692505b50509291505056", + "nonce": "0x95c7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "GasPolicy", + "contractAddress": "0x62868E950Efbb336DCFf033598Ee5E602f0a93cD", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x98ba5", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610737806100206000396000f3fe60806040526004361061003e5760003560e01c8062282ae0146100435780632a730c3f14610058578063c92ce351146100ee578063ecfcd9301461010f575b600080fd5b61005661005136600461041f565b610137565b005b34801561006457600080fd5b506100bb61007336600461047b565b60006020818152938152604080822085529281528281209093528252902080546001909101546001600160801b03821691600160801b900460ff16906001600160a01b031683565b604080516001600160801b03909416845291151560208401526001600160a01b0316908201526060015b60405180910390f35b6101016100fc3660046104bd565b6101f0565b6040519081526020016100e5565b34801561011b57600080fd5b5061010161012a36600461054d565b6000979650505050505050565b60008080610147848601866105d3565b604080516060810182526001600160801b03948516815292151560208085019182526001600160a01b039384168584019081523360009081528083528481209d81529c8252838d209d85168d529c905299209151825499511515600160801b0270ffffffffffffffffffffffffffffffffff19909a16931692909217979097178755965160019096018054969097166001600160a01b0319909616959095179095555050505050565b60008060e0850135608086013561020f60a088013560c089013561063a565b610219919061063a565b6102239190610653565b336000908152602081815260408083208a845282528083206001600160a01b038c168452909152902054909150600160801b900460ff1615610301573360009081526020818152604080832089845282528083206001600160a01b038b8116855292529091206001015416158015906102f257503360009081526020818152604080832089845282528083206001600160a01b038b81168552925290912060010154166102d461012087018761066a565b6102e3916014916000916106b1565b6102ec916106db565b60601c14155b156103015760019150506103b5565b3360009081526020818152604080832089845282528083206001600160a01b038b1684529091529020546001600160801b0390811690821611156103495760019150506103b5565b3360009081526020818152604080832089845282528083206001600160a01b038b1684529091528120805483929061038b9084906001600160801b0316610710565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555060009150505b95945050505050565b6001600160a01b03811681146103d357600080fd5b50565b60008083601f8401126103e857600080fd5b50813567ffffffffffffffff81111561040057600080fd5b60208301915083602082850101111561041857600080fd5b9250929050565b6000806000806060858703121561043557600080fd5b8435610440816103be565b935060208501359250604085013567ffffffffffffffff81111561046357600080fd5b61046f878288016103d6565b95989497509550505050565b60008060006060848603121561049057600080fd5b833561049b816103be565b92506020840135915060408401356104b2816103be565b809150509250925092565b6000806000806000608086880312156104d557600080fd5b85356104e0816103be565b945060208601359350604086013567ffffffffffffffff8082111561050457600080fd5b90870190610160828a03121561051957600080fd5b9093506060870135908082111561052f57600080fd5b5061053c888289016103d6565b969995985093965092949392505050565b600080600080600080600060c0888a03121561056857600080fd5b8735610573816103be565b96506020880135610583816103be565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff8111156105b457600080fd5b6105c08a828b016103d6565b989b979a50959850939692959293505050565b6000806000606084860312156105e857600080fd5b83356001600160801b03811681146105ff57600080fd5b92506020840135801515811461061457600080fd5b915060408401356104b2816103be565b634e487b7160e01b600052601160045260246000fd5b8082018082111561064d5761064d610624565b92915050565b808202811582820484141761064d5761064d610624565b6000808335601e1984360301811261068157600080fd5b83018035915067ffffffffffffffff82111561069c57600080fd5b60200191503681900382131561041857600080fd5b600080858511156106c157600080fd5b838611156106ce57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107085780818660140360031b1b83161692505b505092915050565b6001600160801b0382811682821603908082111561073057610730610624565b509291505056", + "nonce": "0x95c8" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1707331759, + "chain": 80001, + "multi": false, + "commit": "60e1432" +} \ No newline at end of file diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-1707331808.json b/broadcast/DeployModularPermission.s.sol/80001/run-1707331808.json new file mode 100644 index 00000000..44b87a3f --- /dev/null +++ b/broadcast/DeployModularPermission.s.sol/80001/run-1707331808.json @@ -0,0 +1,73 @@ +{ + "transactions": [ + { + "hash": "0xed09bc17bbe34f24b0b6bd1ed893d748335663d42b6e61623999772f0617bf66", + "transactionType": "CREATE2", + "contractName": "ModularPermissionValidator", + "contractAddress": "0x5e79C26A829e0b11b6cC2D2358551CE1a9f0e32B", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26cec4", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50611e71806100206000396000f3fe6080604052600436106100dd5760003560e01c80638fc925aa1161007f578063c4a5240911610059578063c4a524091461031f578063d4085e811461033f578063e89005c71461037d578063ee87c2951461039057600080fd5b80638fc925aa146102bc5780639ea9bd59146102cf578063b66bd1d2146102f257600080fd5b80633ec50c6c116100bb5780633ec50c6c1461013d578063511079bc1461021157806365b8de2e146102245780637ecebe001461025b57600080fd5b80630c959556146100e2578063333daf92146100f75780633a871cdd1461012a575b600080fd5b6100f56100f0366004611586565b6103a3565b005b34801561010357600080fd5b506101176101123660046115c8565b6103f6565b6040519081526020015b60405180910390f35b610117610138366004611614565b61089a565b34801561014957600080fd5b506101bb610158366004611690565b6001602081815260009384526040808520909152918352912080549181015460028201546003909201546001600160801b03841693600160801b900460a01b926001600160a01b03909216919065ffffffffffff80821691600160301b90041686565b604080516001600160801b0390971687526001600160a01b031990951660208701526001600160a01b0390931693850193909352606084015265ffffffffffff91821660808401521660a082015260c001610121565b6100f561021f36600461174a565b610d65565b34801561023057600080fd5b5061024461023f366004611586565b6111fe565b6040516101219b9a99989796959493929190611941565b34801561026757600080fd5b5061029c6102763660046119d8565b6003602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610121565b6100f56102ca366004611586565b6112f9565b6102e26102dd3660046119f5565b611328565b6040519015158152602001610121565b3480156102fe57600080fd5b5061011761030d3660046119d8565b60006020819052908152604090205481565b34801561032b57600080fd5b5061011761033a36600461174a565b611365565b34801561034b57600080fd5b5061011761035a366004611a31565b600260209081526000938452604080852082529284528284209052825290205481565b6100f561038b366004611a6a565b6113b3565b6100f561039e366004611a83565b61141f565b60008060008060003660003660003660006103be8d8d6111fe565b9a509a509a509a509a509a509a509a509a509a509a506103e78b8b8b8b8b8b8b8b8b8b8b610d65565b50505050505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810182905261042e602060008587611a9e565b61043791611ac8565b602080830182905260009182526001815260408083203384528252808320546003909252909120546001600160801b03918216600160801b90910490911611806104aa575060208181015160009081526001825260408082203383529092522054600160801b900460a01b600160a11b16155b156104b9576001915050610893565b6020818101516000908152600180835260408083203384528452808320815160c08101835281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682880152938201546001600160a01b0316928101929092526002810154606080840191825260039092015465ffffffffffff808216608080870191909152600160301b9092041694840194909452908601849052519185019190915291860190601f1986019036610574601482611afd565b61057f928290611a9e565b61058891611b10565b60601c845260003661059b603482611afd565b906105a7601436611afd565b926105b493929190611a9e565b6105bd91611ac8565b60408501525b60808401516001600160a01b0316156107ec57608084015160a11c60011615610618576020808501516000908152600282526040808220608088018051845290845281832033845290935290205490526105c3565b36600061062f86608001516001600160a01b031690565b60608701516001600160a01b03919091169085908561064f826014611b43565b9261065c93929190611a9e565b61066591611b10565b60601c036106f85760008484886060015160146106829190611b43565b90896060015160346106949190611b43565b926106a193929190611a9e565b6106aa91611ac8565b60001c90508484886060015160346106c29190611b43565b6106cd928290611a9e565b90935091506106dd816034611b43565b876060018181516106ee9190611b43565b90525061070e9050565b606086015161070990808587611a9e565b915091505b600061072487608001516001600160a01b031690565b6001600160a01b031663ecfcd9303389600001518a602001518f8c6040015189896040518863ffffffff1660e01b81526004016107679796959493929190611b56565b602060405180830381865afa158015610784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a89190611ba1565b90506107b4888261147f565b602080890151600090815260028252604080822060808c0180518452908452818320338452909352902054905297506105c392505050565b600083604001516001600160a01b0316637a7c6a4f3387602001518c87878b6060015190809261081e93929190611a9e565b6040518663ffffffff1660e01b815260040161083e959493929190611bba565b602060405180830381865afa15801561085b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087f9190611ba1565b905061088b868261147f565b955050505050505b9392505050565b6000336108aa60208601866119d8565b6001600160a01b0316146109055760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d757374206265206d73672e73656e6465720000000000000060448201526064015b60405180910390fd5b6000610915610140860186611bf3565b61092491602091600091611a9e565b61092d91611ac8565b6000818152600160209081526040808320338452909152902054909150600160801b900460a01b600160a01b16158061099e57503360008181526003602090815260408083205485845260018352818420948452939091529020546001600160801b03600160801b90920482169116115b156109ad576001915050610893565b6000818152600160208181526040808420338552825292839020835160c08101855281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682850152938201546001600160a01b03169481019490945260028101546060850181905260039091015465ffffffffffff8082166080870152600160301b90910416928401929092525b6001600160a01b03821615610cf25760a082901c60011615610a835760008481526002602090815260408083209483529381528382203383529052919091205490610a3d565b366000610a91836034611b43565b610a9f6101408c018c611bf3565b905010158015610aea57506001600160a01b038416610ac26101408c018c611bf3565b8590610acf826014611b43565b92610adc93929190611a9e565b610ae591611b10565b60601c145b15610c14576000610aff6101408c018c611bf3565b610b0a866014611b43565b90610b16876034611b43565b92610b2393929190611a9e565b610b2c91611ac8565b905080610b3a856034611b43565b610b449190611b43565b610b526101408d018d611bf3565b90501015610bb55760405162461bcd60e51b815260206004820152602a60248201527f706f6c69637944617461206c656e6774682065786365656473207369676e61746044820152690eae4ca40d8cadccee8d60b31b60648201526084016108fc565b610bc36101408c018c611bf3565b610bce866034611b43565b9083610bdb886034611b43565b610be59190611b43565b92610bf293929190611a9e565b9093509150610c02816034611b43565b610c0c9085611b43565b935050610c34565b610c226101408b018b611bf3565b610c2f9185918291611a9e565b915091505b60006001600160a01b0385166001600160a01b031663c92ce35133898e87876040518663ffffffff1660e01b8152600401610c73959493929190611c3a565b6020604051808303816000875af1158015610c92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb69190611ba1565b9050610cc2888261147f565b600088815260026020908152604080832098835297815287822033835290529590952054949750610a3d92505050565b60408301516000906001600160a01b0316638e0125d233878b610d196101408f018f611bf3565b610d269189908290611a9e565b6040518663ffffffff1660e01b8152600401610d46959493929190611bba565b6020604051808303816000875af115801561085b573d6000803e3d6000fd5b6001600160a01b03198a16610dbc5760405162461bcd60e51b815260206004820152601860248201527f666c61672073686f756c64206e6f7420626520656d707479000000000000000060448201526064016108fc565b336000908152600360205260409020546001600160801b038c8116911614610e1d5760405162461bcd60e51b81526020600482015260146024820152731b9bdb98d9481cda1bdd5b19081899481b995e1d60621b60448201526064016108fc565b6000610e328c8c8c8c8c8c8c8c8c8c8c611365565b9050600160a01b6001600160a01b03198c1601610e5c573360009081526020819052604090208190555b60005b86811015610f2657610e8f888883818110610e7c57610e7c611d7d565b905060200201356001600160a01b031690565b6001600160a01b031662282ae03384878786818110610eb057610eb0611d7d565b9050602002810190610ec29190611bf3565b6040518563ffffffff1660e01b8152600401610ee19493929190611d93565b600060405180830381600087803b158015610efb57600080fd5b505af1158015610f0f573d6000803e3d6000fd5b505050508080610f1e90611dc5565b915050610e5f565b5060405163e9b51de560e01b81526001600160a01b038b169063e9b51de590610f5990339085908a908a90600401611d93565b600060405180830381600087803b158015610f7357600080fd5b505af1158015610f87573d6000803e3d6000fd5b50505050600087876000818110610fa057610fa0611d7d565b9050602002013590506040518060c001604052808e6001600160801b031681526020018d6001600160a01b03191681526020018c6001600160a01b031681526020018281526020018b65ffffffffffff1681526020018a65ffffffffffff16815250600160008481526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160801b0302191690836001600160801b0316021790555060208201518160000160106101000a8154816bffffffffffffffffffffffff021916908360a01c021790555060408201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816002015560808201518160030160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060a08201518160030160066101000a81548165ffffffffffff021916908365ffffffffffff1602179055509050506000600190505b878110156111b55788888281811061114257611142611d7d565b905060200201356002600085815260200190815260200160002060008b8b60018661116d9190611afd565b81811061117c5761117c611d7d565b602090810292909201358352508181019290925260409081016000908120338252909252902055806111ad81611dc5565b915050611128565b5060408051338152602081018490527fab0f2b94c33903f7ed343b1bcc3baca5e69eb7d007b8c8207232012f6cffef0e910160405180910390a150505050505050505050505050565b60008060008060003660003660003660008c8c60009060109261122393929190611a9e565b61122c91611dde565b60801c9a508c8c601090601c9261124593929190611a9e565b61124e91611e15565b99508c8c601c9060229261126493929190611a9e565b61126d91611e43565b60d01c97508c8c60229060289261128693929190611a9e565b61128f91611e43565b60d01c96508c8c602890603c926112a893929190611a9e565b6112b191611b10565b9a9d999c60609b909b1c9b5096999598605c603c8089013589018281019b50810135995081890135890180830199908201359850607c81013501918201965001359350915050565b60208190036113135761130f61038b8284611ac8565b5050565b61130f6113208284611dde565b60801c61141f565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064016108fc565b60008b8b8b8b8b8b8b8b8b8b8b60405160200161138c9b9a99989796959493929190611941565b6040516020818303038152906040528051906020012090509b9a5050505050505050505050565b6000818152600160209081526040808320338085529083529281902080546bffffffffffffffffffffffff60801b1916905580519283529082018390527f789770131846de4d1f28418f0f957cdf4fcabe5eccf70067083e20ecece69a3491015b60405180910390a150565b3360008181526003602090815260409182902080546001600160801b03908116600160801b918716918202179091558251938452908301527f22cd1acb7e7a306800a1b2c0ca9b0280187bbc00b7fbf55d38ad6cbf73082aec9101611414565b600081830160601b8260601b81148460601b8214176001600160a01b03848618161517600181146114b35760019250611535565b6001600160d01b031980851690861681811881831102188686176001600160a01b031617935065ffffffffffff60a01b861690816114f85765ffffffffffff60a01b91505b5065ffffffffffff60a01b851680611516575065ffffffffffff60a01b5b80821890821102188061152f575065ffffffffffff60a01b5b92909217915b505092915050565b60008083601f84011261154f57600080fd5b50813567ffffffffffffffff81111561156757600080fd5b60208301915083602082850101111561157f57600080fd5b9250929050565b6000806020838503121561159957600080fd5b823567ffffffffffffffff8111156115b057600080fd5b6115bc8582860161153d565b90969095509350505050565b6000806000604084860312156115dd57600080fd5b83359250602084013567ffffffffffffffff8111156115fb57600080fd5b6116078682870161153d565b9497909650939450505050565b60008060006060848603121561162957600080fd5b833567ffffffffffffffff81111561164057600080fd5b8401610160818703121561165357600080fd5b95602085013595506040909401359392505050565b6001600160a01b038116811461167d57600080fd5b50565b803561168b81611668565b919050565b600080604083850312156116a357600080fd5b8235915060208301356116b581611668565b809150509250929050565b80356001600160801b038116811461168b57600080fd5b80356001600160a01b03198116811461168b57600080fd5b803565ffffffffffff8116811461168b57600080fd5b60008083601f84011261171757600080fd5b50813567ffffffffffffffff81111561172f57600080fd5b6020830191508360208260051b850101111561157f57600080fd5b60008060008060008060008060008060006101008c8e03121561176c57600080fd5b6117758c6116c0565b9a5061178360208d016116d7565b995061179160408d01611680565b985061179f60608d016116ef565b97506117ad60808d016116ef565b965067ffffffffffffffff8060a08e013511156117c957600080fd5b6117d98e60a08f01358f01611705565b909750955060c08d01358110156117ef57600080fd5b6117ff8e60c08f01358f0161153d565b909550935060e08d013581101561181557600080fd5b506118268d60e08e01358e01611705565b81935080925050509295989b509295989b9093969950565b8183526000602080850194508260005b8581101561186a5781358752958201959082019060010161184e565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000808335601e198436030181126118b557600080fd5b830160208101925035905067ffffffffffffffff8111156118d557600080fd5b80360382131561157f57600080fd5b81835260006020808501808196508560051b810191508460005b87811015611934578284038952611915828861189e565b611920868284611875565b9a87019a95505050908401906001016118fe565b5091979650505050505050565b6001600160801b038c1681526001600160a01b03198b1660208201526001600160a01b038a16604082015265ffffffffffff89811660608301528816608082015261010060a0820181905260009061199c838201898b61183e565b905082810360c08401526119b1818789611875565b905082810360e08401526119c68185876118e4565b9e9d5050505050505050505050505050565b6000602082840312156119ea57600080fd5b813561089381611668565b600080600060408486031215611a0a57600080fd5b8335611a1581611668565b9250602084013567ffffffffffffffff8111156115fb57600080fd5b600080600060608486031215611a4657600080fd5b83359250602084013591506040840135611a5f81611668565b809150509250925092565b600060208284031215611a7c57600080fd5b5035919050565b600060208284031215611a9557600080fd5b610893826116c0565b60008085851115611aae57600080fd5b83861115611abb57600080fd5b5050820193919092039150565b80356020831015611ae157600019602084900360031b1b165b92915050565b634e487b7160e01b600052601160045260246000fd5b81810381811115611ae157611ae1611ae7565b6bffffffffffffffffffffffff1981358181169160148510156115355760149490940360031b84901b1690921692915050565b80820180821115611ae157611ae1611ae7565b600060018060a01b03808a16835280891660208401525086604083015285606083015284608083015260c060a0830152611b9460c083018486611875565b9998505050505050505050565b600060208284031215611bb357600080fd5b5051919050565b60018060a01b0386168152846020820152836040820152608060608201526000611be8608083018486611875565b979650505050505050565b6000808335601e19843603018112611c0a57600080fd5b83018035915067ffffffffffffffff821115611c2557600080fd5b60200191503681900382131561157f57600080fd5b6001600160a01b038616815260208101859052608060408201819052611c72908201611c6586611680565b6001600160a01b03169052565b602084013560a08201526000611c8b604086018661189e565b6101608060c0860152611ca36101e086018385611875565b9250611cb2606089018961189e565b9250607f19808786030160e0880152611ccc858584611875565b9450610100935060808a013584880152610120915060a08a01358288015261014060c08b01358189015260e08b013584890152848b0135610180890152611d15838c018c61189e565b9550935081888703016101a0890152611d2f868686611875565b9550611d3d818c018c61189e565b955093505080878603016101c08801525050611d5a838383611875565b925050508281036060840152611d71818587611875565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b60018060a01b0385168152836020820152606060408201526000611dbb606083018486611875565b9695505050505050565b600060018201611dd757611dd7611ae7565b5060010190565b6fffffffffffffffffffffffffffffffff1981358181169160108510156115355760109490940360031b84901b1690921692915050565b6001600160a01b0319813581811691600c85101561153557600c9490940360031b84901b1690921692915050565b6001600160d01b031981358181169160068510156115355760069490940360031b84901b169092169291505056", + "nonce": "0x1cf" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x5bfabf0d17e1fc24556b66786feb048a874a4768864a231b2f77004dbcad66ae", + "transactionType": "CREATE2", + "contractName": "ECDSASigner", + "contractAddress": "0xF9E712F44A360ED8820aD624e41164f74a5a7456", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x9397d", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610680806100206000396000f3fe60806040526004361061003f5760003560e01c806367249d69146100445780637a7c6a4f146100a75780638e0125d2146100d5578063e9b51de5146100e8575b600080fd5b34801561005057600080fd5b5061008a61005f366004610498565b600060208181529381526040808220855292815282812090935282529020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100b357600080fd5b506100c76100c236600461051d565b6100fd565b60405190815260200161009e565b6100c76100e336600461051d565b6101e3565b6100fb6100f6366004610585565b610277565b005b3360009081526020818152604080832087845282528083206001600160a01b03898116855292528220541661014d5760405162461bcd60e51b8152600401610144906105df565b60405180910390fd5b600061019184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089939250506103c09050565b336000908152602081815260408083208a845282528083206001600160a01b038c81168552925290912054919250908116908216036101d45760009150506101da565b60019150505b95945050505050565b3360009081526020818152604080832087845282528083206001600160a01b03898116855292528220541661022a5760405162461bcd60e51b8152600401610144906105df565b600061019184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061027192508991506104519050565b906103c0565b3360009081526020818152604080832086845282528083206001600160a01b03888116855292529091205416156102ff5760405162461bcd60e51b815260206004820152602660248201527f45434453415369676e65723a206b65726e656c20616c726561647920726567696044820152651cdd195c995960d21b6064820152608401610144565b6014811461035b5760405162461bcd60e51b815260206004820152602360248201527f45434453415369676e65723a20696e76616c6964207369676e6572206164647260448201526265737360e81b6064820152608401610144565b600061036a6014828486610621565b6103739161064b565b336000908152602081815260408083209783529681528682206001600160a01b03989098168252969096529390942080546001600160a01b03191660609490941c93909317909255505050565b60405160019083600052602083015160405260408351036103fc57604083015160ff81901c601b016020526001600160ff1b0316606052610422565b604183510361041d57606083015160001a6020526040830151606052610422565b600091505b6020600160806000855afa5191503d61044357638baa579f6000526004601cfd5b600060605260405292915050565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b80356001600160a01b038116811461049357600080fd5b919050565b6000806000606084860312156104ad57600080fd5b6104b68461047c565b9250602084013591506104cb6040850161047c565b90509250925092565b60008083601f8401126104e657600080fd5b50813567ffffffffffffffff8111156104fe57600080fd5b60208301915083602082850101111561051657600080fd5b9250929050565b60008060008060006080868803121561053557600080fd5b61053e8661047c565b94506020860135935060408601359250606086013567ffffffffffffffff81111561056857600080fd5b610574888289016104d4565b969995985093965092949392505050565b6000806000806060858703121561059b57600080fd5b6105a48561047c565b935060208501359250604085013567ffffffffffffffff8111156105c757600080fd5b6105d3878288016104d4565b95989497509550505050565b60208082526022908201527f45434453415369676e65723a206b65726e656c206e6f74207265676973746572604082015261195960f21b606082015260800190565b6000808585111561063157600080fd5b8386111561063e57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106785780818660140360031b1b83161692505b50509291505056", + "nonce": "0x1d0" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xa41af2cba175bc10e156a9457ee1fccfb5deb6a61f5fffb60c4757131054fab1", + "transactionType": "CREATE2", + "contractName": "GasPolicy", + "contractAddress": "0x62868E950Efbb336DCFf033598Ee5E602f0a93cD", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x98ba5", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610737806100206000396000f3fe60806040526004361061003e5760003560e01c8062282ae0146100435780632a730c3f14610058578063c92ce351146100ee578063ecfcd9301461010f575b600080fd5b61005661005136600461041f565b610137565b005b34801561006457600080fd5b506100bb61007336600461047b565b60006020818152938152604080822085529281528281209093528252902080546001909101546001600160801b03821691600160801b900460ff16906001600160a01b031683565b604080516001600160801b03909416845291151560208401526001600160a01b0316908201526060015b60405180910390f35b6101016100fc3660046104bd565b6101f0565b6040519081526020016100e5565b34801561011b57600080fd5b5061010161012a36600461054d565b6000979650505050505050565b60008080610147848601866105d3565b604080516060810182526001600160801b03948516815292151560208085019182526001600160a01b039384168584019081523360009081528083528481209d81529c8252838d209d85168d529c905299209151825499511515600160801b0270ffffffffffffffffffffffffffffffffff19909a16931692909217979097178755965160019096018054969097166001600160a01b0319909616959095179095555050505050565b60008060e0850135608086013561020f60a088013560c089013561063a565b610219919061063a565b6102239190610653565b336000908152602081815260408083208a845282528083206001600160a01b038c168452909152902054909150600160801b900460ff1615610301573360009081526020818152604080832089845282528083206001600160a01b038b8116855292529091206001015416158015906102f257503360009081526020818152604080832089845282528083206001600160a01b038b81168552925290912060010154166102d461012087018761066a565b6102e3916014916000916106b1565b6102ec916106db565b60601c14155b156103015760019150506103b5565b3360009081526020818152604080832089845282528083206001600160a01b038b1684529091529020546001600160801b0390811690821611156103495760019150506103b5565b3360009081526020818152604080832089845282528083206001600160a01b038b1684529091528120805483929061038b9084906001600160801b0316610710565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555060009150505b95945050505050565b6001600160a01b03811681146103d357600080fd5b50565b60008083601f8401126103e857600080fd5b50813567ffffffffffffffff81111561040057600080fd5b60208301915083602082850101111561041857600080fd5b9250929050565b6000806000806060858703121561043557600080fd5b8435610440816103be565b935060208501359250604085013567ffffffffffffffff81111561046357600080fd5b61046f878288016103d6565b95989497509550505050565b60008060006060848603121561049057600080fd5b833561049b816103be565b92506020840135915060408401356104b2816103be565b809150509250925092565b6000806000806000608086880312156104d557600080fd5b85356104e0816103be565b945060208601359350604086013567ffffffffffffffff8082111561050457600080fd5b90870190610160828a03121561051957600080fd5b9093506060870135908082111561052f57600080fd5b5061053c888289016103d6565b969995985093965092949392505050565b600080600080600080600060c0888a03121561056857600080fd5b8735610573816103be565b96506020880135610583816103be565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff8111156105b457600080fd5b6105c08a828b016103d6565b989b979a50959850939692959293505050565b6000806000606084860312156105e857600080fd5b83356001600160801b03811681146105ff57600080fd5b92506020840135801515811461061457600080fd5b915060408401356104b2816103be565b634e487b7160e01b600052601160045260246000fd5b8082018082111561064d5761064d610624565b92915050565b808202811582820484141761064d5761064d610624565b6000808335601e1984360301811261068157600080fd5b83018035915067ffffffffffffffff82111561069c57600080fd5b60200191503681900382131561041857600080fd5b600080858511156106c157600080fd5b838611156106ce57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107085780818660140360031b1b83161692505b505092915050565b6001600160801b0382811682821603908082111561073057610730610624565b509291505056", + "nonce": "0x1d1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xed09bc17bbe34f24b0b6bd1ed893d748335663d42b6e61623999772f0617bf66", + "0x5bfabf0d17e1fc24556b66786feb048a874a4768864a231b2f77004dbcad66ae", + "0xa41af2cba175bc10e156a9457ee1fccfb5deb6a61f5fffb60c4757131054fab1" + ], + "returns": {}, + "timestamp": 1707331808, + "chain": 80001, + "multi": false, + "commit": "60e1432" +} \ No newline at end of file diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-1707331815.json b/broadcast/DeployModularPermission.s.sol/80001/run-1707331815.json new file mode 100644 index 00000000..422ef6ac --- /dev/null +++ b/broadcast/DeployModularPermission.s.sol/80001/run-1707331815.json @@ -0,0 +1,169 @@ +{ + "transactions": [ + { + "hash": "0xed09bc17bbe34f24b0b6bd1ed893d748335663d42b6e61623999772f0617bf66", + "transactionType": "CREATE2", + "contractName": "ModularPermissionValidator", + "contractAddress": "0x5e79C26A829e0b11b6cC2D2358551CE1a9f0e32B", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x26cec4", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50611e71806100206000396000f3fe6080604052600436106100dd5760003560e01c80638fc925aa1161007f578063c4a5240911610059578063c4a524091461031f578063d4085e811461033f578063e89005c71461037d578063ee87c2951461039057600080fd5b80638fc925aa146102bc5780639ea9bd59146102cf578063b66bd1d2146102f257600080fd5b80633ec50c6c116100bb5780633ec50c6c1461013d578063511079bc1461021157806365b8de2e146102245780637ecebe001461025b57600080fd5b80630c959556146100e2578063333daf92146100f75780633a871cdd1461012a575b600080fd5b6100f56100f0366004611586565b6103a3565b005b34801561010357600080fd5b506101176101123660046115c8565b6103f6565b6040519081526020015b60405180910390f35b610117610138366004611614565b61089a565b34801561014957600080fd5b506101bb610158366004611690565b6001602081815260009384526040808520909152918352912080549181015460028201546003909201546001600160801b03841693600160801b900460a01b926001600160a01b03909216919065ffffffffffff80821691600160301b90041686565b604080516001600160801b0390971687526001600160a01b031990951660208701526001600160a01b0390931693850193909352606084015265ffffffffffff91821660808401521660a082015260c001610121565b6100f561021f36600461174a565b610d65565b34801561023057600080fd5b5061024461023f366004611586565b6111fe565b6040516101219b9a99989796959493929190611941565b34801561026757600080fd5b5061029c6102763660046119d8565b6003602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610121565b6100f56102ca366004611586565b6112f9565b6102e26102dd3660046119f5565b611328565b6040519015158152602001610121565b3480156102fe57600080fd5b5061011761030d3660046119d8565b60006020819052908152604090205481565b34801561032b57600080fd5b5061011761033a36600461174a565b611365565b34801561034b57600080fd5b5061011761035a366004611a31565b600260209081526000938452604080852082529284528284209052825290205481565b6100f561038b366004611a6a565b6113b3565b6100f561039e366004611a83565b61141f565b60008060008060003660003660003660006103be8d8d6111fe565b9a509a509a509a509a509a509a509a509a509a509a506103e78b8b8b8b8b8b8b8b8b8b8b610d65565b50505050505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810182905261042e602060008587611a9e565b61043791611ac8565b602080830182905260009182526001815260408083203384528252808320546003909252909120546001600160801b03918216600160801b90910490911611806104aa575060208181015160009081526001825260408082203383529092522054600160801b900460a01b600160a11b16155b156104b9576001915050610893565b6020818101516000908152600180835260408083203384528452808320815160c08101835281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682880152938201546001600160a01b0316928101929092526002810154606080840191825260039092015465ffffffffffff808216608080870191909152600160301b9092041694840194909452908601849052519185019190915291860190601f1986019036610574601482611afd565b61057f928290611a9e565b61058891611b10565b60601c845260003661059b603482611afd565b906105a7601436611afd565b926105b493929190611a9e565b6105bd91611ac8565b60408501525b60808401516001600160a01b0316156107ec57608084015160a11c60011615610618576020808501516000908152600282526040808220608088018051845290845281832033845290935290205490526105c3565b36600061062f86608001516001600160a01b031690565b60608701516001600160a01b03919091169085908561064f826014611b43565b9261065c93929190611a9e565b61066591611b10565b60601c036106f85760008484886060015160146106829190611b43565b90896060015160346106949190611b43565b926106a193929190611a9e565b6106aa91611ac8565b60001c90508484886060015160346106c29190611b43565b6106cd928290611a9e565b90935091506106dd816034611b43565b876060018181516106ee9190611b43565b90525061070e9050565b606086015161070990808587611a9e565b915091505b600061072487608001516001600160a01b031690565b6001600160a01b031663ecfcd9303389600001518a602001518f8c6040015189896040518863ffffffff1660e01b81526004016107679796959493929190611b56565b602060405180830381865afa158015610784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a89190611ba1565b90506107b4888261147f565b602080890151600090815260028252604080822060808c0180518452908452818320338452909352902054905297506105c392505050565b600083604001516001600160a01b0316637a7c6a4f3387602001518c87878b6060015190809261081e93929190611a9e565b6040518663ffffffff1660e01b815260040161083e959493929190611bba565b602060405180830381865afa15801561085b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087f9190611ba1565b905061088b868261147f565b955050505050505b9392505050565b6000336108aa60208601866119d8565b6001600160a01b0316146109055760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d757374206265206d73672e73656e6465720000000000000060448201526064015b60405180910390fd5b6000610915610140860186611bf3565b61092491602091600091611a9e565b61092d91611ac8565b6000818152600160209081526040808320338452909152902054909150600160801b900460a01b600160a01b16158061099e57503360008181526003602090815260408083205485845260018352818420948452939091529020546001600160801b03600160801b90920482169116115b156109ad576001915050610893565b6000818152600160208181526040808420338552825292839020835160c08101855281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682850152938201546001600160a01b03169481019490945260028101546060850181905260039091015465ffffffffffff8082166080870152600160301b90910416928401929092525b6001600160a01b03821615610cf25760a082901c60011615610a835760008481526002602090815260408083209483529381528382203383529052919091205490610a3d565b366000610a91836034611b43565b610a9f6101408c018c611bf3565b905010158015610aea57506001600160a01b038416610ac26101408c018c611bf3565b8590610acf826014611b43565b92610adc93929190611a9e565b610ae591611b10565b60601c145b15610c14576000610aff6101408c018c611bf3565b610b0a866014611b43565b90610b16876034611b43565b92610b2393929190611a9e565b610b2c91611ac8565b905080610b3a856034611b43565b610b449190611b43565b610b526101408d018d611bf3565b90501015610bb55760405162461bcd60e51b815260206004820152602a60248201527f706f6c69637944617461206c656e6774682065786365656473207369676e61746044820152690eae4ca40d8cadccee8d60b31b60648201526084016108fc565b610bc36101408c018c611bf3565b610bce866034611b43565b9083610bdb886034611b43565b610be59190611b43565b92610bf293929190611a9e565b9093509150610c02816034611b43565b610c0c9085611b43565b935050610c34565b610c226101408b018b611bf3565b610c2f9185918291611a9e565b915091505b60006001600160a01b0385166001600160a01b031663c92ce35133898e87876040518663ffffffff1660e01b8152600401610c73959493929190611c3a565b6020604051808303816000875af1158015610c92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb69190611ba1565b9050610cc2888261147f565b600088815260026020908152604080832098835297815287822033835290529590952054949750610a3d92505050565b60408301516000906001600160a01b0316638e0125d233878b610d196101408f018f611bf3565b610d269189908290611a9e565b6040518663ffffffff1660e01b8152600401610d46959493929190611bba565b6020604051808303816000875af115801561085b573d6000803e3d6000fd5b6001600160a01b03198a16610dbc5760405162461bcd60e51b815260206004820152601860248201527f666c61672073686f756c64206e6f7420626520656d707479000000000000000060448201526064016108fc565b336000908152600360205260409020546001600160801b038c8116911614610e1d5760405162461bcd60e51b81526020600482015260146024820152731b9bdb98d9481cda1bdd5b19081899481b995e1d60621b60448201526064016108fc565b6000610e328c8c8c8c8c8c8c8c8c8c8c611365565b9050600160a01b6001600160a01b03198c1601610e5c573360009081526020819052604090208190555b60005b86811015610f2657610e8f888883818110610e7c57610e7c611d7d565b905060200201356001600160a01b031690565b6001600160a01b031662282ae03384878786818110610eb057610eb0611d7d565b9050602002810190610ec29190611bf3565b6040518563ffffffff1660e01b8152600401610ee19493929190611d93565b600060405180830381600087803b158015610efb57600080fd5b505af1158015610f0f573d6000803e3d6000fd5b505050508080610f1e90611dc5565b915050610e5f565b5060405163e9b51de560e01b81526001600160a01b038b169063e9b51de590610f5990339085908a908a90600401611d93565b600060405180830381600087803b158015610f7357600080fd5b505af1158015610f87573d6000803e3d6000fd5b50505050600087876000818110610fa057610fa0611d7d565b9050602002013590506040518060c001604052808e6001600160801b031681526020018d6001600160a01b03191681526020018c6001600160a01b031681526020018281526020018b65ffffffffffff1681526020018a65ffffffffffff16815250600160008481526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160801b0302191690836001600160801b0316021790555060208201518160000160106101000a8154816bffffffffffffffffffffffff021916908360a01c021790555060408201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816002015560808201518160030160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060a08201518160030160066101000a81548165ffffffffffff021916908365ffffffffffff1602179055509050506000600190505b878110156111b55788888281811061114257611142611d7d565b905060200201356002600085815260200190815260200160002060008b8b60018661116d9190611afd565b81811061117c5761117c611d7d565b602090810292909201358352508181019290925260409081016000908120338252909252902055806111ad81611dc5565b915050611128565b5060408051338152602081018490527fab0f2b94c33903f7ed343b1bcc3baca5e69eb7d007b8c8207232012f6cffef0e910160405180910390a150505050505050505050505050565b60008060008060003660003660003660008c8c60009060109261122393929190611a9e565b61122c91611dde565b60801c9a508c8c601090601c9261124593929190611a9e565b61124e91611e15565b99508c8c601c9060229261126493929190611a9e565b61126d91611e43565b60d01c97508c8c60229060289261128693929190611a9e565b61128f91611e43565b60d01c96508c8c602890603c926112a893929190611a9e565b6112b191611b10565b9a9d999c60609b909b1c9b5096999598605c603c8089013589018281019b50810135995081890135890180830199908201359850607c81013501918201965001359350915050565b60208190036113135761130f61038b8284611ac8565b5050565b61130f6113208284611dde565b60801c61141f565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064016108fc565b60008b8b8b8b8b8b8b8b8b8b8b60405160200161138c9b9a99989796959493929190611941565b6040516020818303038152906040528051906020012090509b9a5050505050505050505050565b6000818152600160209081526040808320338085529083529281902080546bffffffffffffffffffffffff60801b1916905580519283529082018390527f789770131846de4d1f28418f0f957cdf4fcabe5eccf70067083e20ecece69a3491015b60405180910390a150565b3360008181526003602090815260409182902080546001600160801b03908116600160801b918716918202179091558251938452908301527f22cd1acb7e7a306800a1b2c0ca9b0280187bbc00b7fbf55d38ad6cbf73082aec9101611414565b600081830160601b8260601b81148460601b8214176001600160a01b03848618161517600181146114b35760019250611535565b6001600160d01b031980851690861681811881831102188686176001600160a01b031617935065ffffffffffff60a01b861690816114f85765ffffffffffff60a01b91505b5065ffffffffffff60a01b851680611516575065ffffffffffff60a01b5b80821890821102188061152f575065ffffffffffff60a01b5b92909217915b505092915050565b60008083601f84011261154f57600080fd5b50813567ffffffffffffffff81111561156757600080fd5b60208301915083602082850101111561157f57600080fd5b9250929050565b6000806020838503121561159957600080fd5b823567ffffffffffffffff8111156115b057600080fd5b6115bc8582860161153d565b90969095509350505050565b6000806000604084860312156115dd57600080fd5b83359250602084013567ffffffffffffffff8111156115fb57600080fd5b6116078682870161153d565b9497909650939450505050565b60008060006060848603121561162957600080fd5b833567ffffffffffffffff81111561164057600080fd5b8401610160818703121561165357600080fd5b95602085013595506040909401359392505050565b6001600160a01b038116811461167d57600080fd5b50565b803561168b81611668565b919050565b600080604083850312156116a357600080fd5b8235915060208301356116b581611668565b809150509250929050565b80356001600160801b038116811461168b57600080fd5b80356001600160a01b03198116811461168b57600080fd5b803565ffffffffffff8116811461168b57600080fd5b60008083601f84011261171757600080fd5b50813567ffffffffffffffff81111561172f57600080fd5b6020830191508360208260051b850101111561157f57600080fd5b60008060008060008060008060008060006101008c8e03121561176c57600080fd5b6117758c6116c0565b9a5061178360208d016116d7565b995061179160408d01611680565b985061179f60608d016116ef565b97506117ad60808d016116ef565b965067ffffffffffffffff8060a08e013511156117c957600080fd5b6117d98e60a08f01358f01611705565b909750955060c08d01358110156117ef57600080fd5b6117ff8e60c08f01358f0161153d565b909550935060e08d013581101561181557600080fd5b506118268d60e08e01358e01611705565b81935080925050509295989b509295989b9093969950565b8183526000602080850194508260005b8581101561186a5781358752958201959082019060010161184e565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000808335601e198436030181126118b557600080fd5b830160208101925035905067ffffffffffffffff8111156118d557600080fd5b80360382131561157f57600080fd5b81835260006020808501808196508560051b810191508460005b87811015611934578284038952611915828861189e565b611920868284611875565b9a87019a95505050908401906001016118fe565b5091979650505050505050565b6001600160801b038c1681526001600160a01b03198b1660208201526001600160a01b038a16604082015265ffffffffffff89811660608301528816608082015261010060a0820181905260009061199c838201898b61183e565b905082810360c08401526119b1818789611875565b905082810360e08401526119c68185876118e4565b9e9d5050505050505050505050505050565b6000602082840312156119ea57600080fd5b813561089381611668565b600080600060408486031215611a0a57600080fd5b8335611a1581611668565b9250602084013567ffffffffffffffff8111156115fb57600080fd5b600080600060608486031215611a4657600080fd5b83359250602084013591506040840135611a5f81611668565b809150509250925092565b600060208284031215611a7c57600080fd5b5035919050565b600060208284031215611a9557600080fd5b610893826116c0565b60008085851115611aae57600080fd5b83861115611abb57600080fd5b5050820193919092039150565b80356020831015611ae157600019602084900360031b1b165b92915050565b634e487b7160e01b600052601160045260246000fd5b81810381811115611ae157611ae1611ae7565b6bffffffffffffffffffffffff1981358181169160148510156115355760149490940360031b84901b1690921692915050565b80820180821115611ae157611ae1611ae7565b600060018060a01b03808a16835280891660208401525086604083015285606083015284608083015260c060a0830152611b9460c083018486611875565b9998505050505050505050565b600060208284031215611bb357600080fd5b5051919050565b60018060a01b0386168152846020820152836040820152608060608201526000611be8608083018486611875565b979650505050505050565b6000808335601e19843603018112611c0a57600080fd5b83018035915067ffffffffffffffff821115611c2557600080fd5b60200191503681900382131561157f57600080fd5b6001600160a01b038616815260208101859052608060408201819052611c72908201611c6586611680565b6001600160a01b03169052565b602084013560a08201526000611c8b604086018661189e565b6101608060c0860152611ca36101e086018385611875565b9250611cb2606089018961189e565b9250607f19808786030160e0880152611ccc858584611875565b9450610100935060808a013584880152610120915060a08a01358288015261014060c08b01358189015260e08b013584890152848b0135610180890152611d15838c018c61189e565b9550935081888703016101a0890152611d2f868686611875565b9550611d3d818c018c61189e565b955093505080878603016101c08801525050611d5a838383611875565b925050508281036060840152611d71818587611875565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b60018060a01b0385168152836020820152606060408201526000611dbb606083018486611875565b9695505050505050565b600060018201611dd757611dd7611ae7565b5060010190565b6fffffffffffffffffffffffffffffffff1981358181169160108510156115355760109490940360031b84901b1690921692915050565b6001600160a01b0319813581811691600c85101561153557600c9490940360031b84901b1690921692915050565b6001600160d01b031981358181169160068510156115355760069490940360031b84901b169092169291505056", + "nonce": "0x1cf" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x5bfabf0d17e1fc24556b66786feb048a874a4768864a231b2f77004dbcad66ae", + "transactionType": "CREATE2", + "contractName": "ECDSASigner", + "contractAddress": "0xF9E712F44A360ED8820aD624e41164f74a5a7456", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x9397d", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610680806100206000396000f3fe60806040526004361061003f5760003560e01c806367249d69146100445780637a7c6a4f146100a75780638e0125d2146100d5578063e9b51de5146100e8575b600080fd5b34801561005057600080fd5b5061008a61005f366004610498565b600060208181529381526040808220855292815282812090935282529020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100b357600080fd5b506100c76100c236600461051d565b6100fd565b60405190815260200161009e565b6100c76100e336600461051d565b6101e3565b6100fb6100f6366004610585565b610277565b005b3360009081526020818152604080832087845282528083206001600160a01b03898116855292528220541661014d5760405162461bcd60e51b8152600401610144906105df565b60405180910390fd5b600061019184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089939250506103c09050565b336000908152602081815260408083208a845282528083206001600160a01b038c81168552925290912054919250908116908216036101d45760009150506101da565b60019150505b95945050505050565b3360009081526020818152604080832087845282528083206001600160a01b03898116855292528220541661022a5760405162461bcd60e51b8152600401610144906105df565b600061019184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061027192508991506104519050565b906103c0565b3360009081526020818152604080832086845282528083206001600160a01b03888116855292529091205416156102ff5760405162461bcd60e51b815260206004820152602660248201527f45434453415369676e65723a206b65726e656c20616c726561647920726567696044820152651cdd195c995960d21b6064820152608401610144565b6014811461035b5760405162461bcd60e51b815260206004820152602360248201527f45434453415369676e65723a20696e76616c6964207369676e6572206164647260448201526265737360e81b6064820152608401610144565b600061036a6014828486610621565b6103739161064b565b336000908152602081815260408083209783529681528682206001600160a01b03989098168252969096529390942080546001600160a01b03191660609490941c93909317909255505050565b60405160019083600052602083015160405260408351036103fc57604083015160ff81901c601b016020526001600160ff1b0316606052610422565b604183510361041d57606083015160001a6020526040830151606052610422565b600091505b6020600160806000855afa5191503d61044357638baa579f6000526004601cfd5b600060605260405292915050565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b80356001600160a01b038116811461049357600080fd5b919050565b6000806000606084860312156104ad57600080fd5b6104b68461047c565b9250602084013591506104cb6040850161047c565b90509250925092565b60008083601f8401126104e657600080fd5b50813567ffffffffffffffff8111156104fe57600080fd5b60208301915083602082850101111561051657600080fd5b9250929050565b60008060008060006080868803121561053557600080fd5b61053e8661047c565b94506020860135935060408601359250606086013567ffffffffffffffff81111561056857600080fd5b610574888289016104d4565b969995985093965092949392505050565b6000806000806060858703121561059b57600080fd5b6105a48561047c565b935060208501359250604085013567ffffffffffffffff8111156105c757600080fd5b6105d3878288016104d4565b95989497509550505050565b60208082526022908201527f45434453415369676e65723a206b65726e656c206e6f74207265676973746572604082015261195960f21b606082015260800190565b6000808585111561063157600080fd5b8386111561063e57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156106785780818660140360031b1b83161692505b50509291505056", + "nonce": "0x1d0" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xa41af2cba175bc10e156a9457ee1fccfb5deb6a61f5fffb60c4757131054fab1", + "transactionType": "CREATE2", + "contractName": "GasPolicy", + "contractAddress": "0x62868E950Efbb336DCFf033598Ee5E602f0a93cD", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x98ba5", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610737806100206000396000f3fe60806040526004361061003e5760003560e01c8062282ae0146100435780632a730c3f14610058578063c92ce351146100ee578063ecfcd9301461010f575b600080fd5b61005661005136600461041f565b610137565b005b34801561006457600080fd5b506100bb61007336600461047b565b60006020818152938152604080822085529281528281209093528252902080546001909101546001600160801b03821691600160801b900460ff16906001600160a01b031683565b604080516001600160801b03909416845291151560208401526001600160a01b0316908201526060015b60405180910390f35b6101016100fc3660046104bd565b6101f0565b6040519081526020016100e5565b34801561011b57600080fd5b5061010161012a36600461054d565b6000979650505050505050565b60008080610147848601866105d3565b604080516060810182526001600160801b03948516815292151560208085019182526001600160a01b039384168584019081523360009081528083528481209d81529c8252838d209d85168d529c905299209151825499511515600160801b0270ffffffffffffffffffffffffffffffffff19909a16931692909217979097178755965160019096018054969097166001600160a01b0319909616959095179095555050505050565b60008060e0850135608086013561020f60a088013560c089013561063a565b610219919061063a565b6102239190610653565b336000908152602081815260408083208a845282528083206001600160a01b038c168452909152902054909150600160801b900460ff1615610301573360009081526020818152604080832089845282528083206001600160a01b038b8116855292529091206001015416158015906102f257503360009081526020818152604080832089845282528083206001600160a01b038b81168552925290912060010154166102d461012087018761066a565b6102e3916014916000916106b1565b6102ec916106db565b60601c14155b156103015760019150506103b5565b3360009081526020818152604080832089845282528083206001600160a01b038b1684529091529020546001600160801b0390811690821611156103495760019150506103b5565b3360009081526020818152604080832089845282528083206001600160a01b038b1684529091528120805483929061038b9084906001600160801b0316610710565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555060009150505b95945050505050565b6001600160a01b03811681146103d357600080fd5b50565b60008083601f8401126103e857600080fd5b50813567ffffffffffffffff81111561040057600080fd5b60208301915083602082850101111561041857600080fd5b9250929050565b6000806000806060858703121561043557600080fd5b8435610440816103be565b935060208501359250604085013567ffffffffffffffff81111561046357600080fd5b61046f878288016103d6565b95989497509550505050565b60008060006060848603121561049057600080fd5b833561049b816103be565b92506020840135915060408401356104b2816103be565b809150509250925092565b6000806000806000608086880312156104d557600080fd5b85356104e0816103be565b945060208601359350604086013567ffffffffffffffff8082111561050457600080fd5b90870190610160828a03121561051957600080fd5b9093506060870135908082111561052f57600080fd5b5061053c888289016103d6565b969995985093965092949392505050565b600080600080600080600060c0888a03121561056857600080fd5b8735610573816103be565b96506020880135610583816103be565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff8111156105b457600080fd5b6105c08a828b016103d6565b989b979a50959850939692959293505050565b6000806000606084860312156105e857600080fd5b83356001600160801b03811681146105ff57600080fd5b92506020840135801515811461061457600080fd5b915060408401356104b2816103be565b634e487b7160e01b600052601160045260246000fd5b8082018082111561064d5761064d610624565b92915050565b808202811582820484141761064d5761064d610624565b6000808335601e1984360301811261068157600080fd5b83018035915067ffffffffffffffff82111561069c57600080fd5b60200191503681900382131561041857600080fd5b600080858511156106c157600080fd5b838611156106ce57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107085780818660140360031b1b83161692505b505092915050565b6001600160801b0382811682821603908082111561073057610730610624565b509291505056", + "nonce": "0x1d1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xed09bc17bbe34f24b0b6bd1ed893d748335663d42b6e61623999772f0617bf66", + "transactionIndex": "0x2", + "blockHash": "0xa19406951cf2263998ddea3b542c3f265d40484fdbbc7c305babf392e284d932", + "blockNumber": "0x2b8bf8e", + "from": "0xA02CDdFa44B8C01b4257F54ac1c43F75801E8175", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1b4f83", + "gasUsed": "0x1a8aeb", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000a02cddfa44b8c01b4257f54ac1c43f75801e8175", + "0x0000000000000000000000005082f249cdb2f2c1ee035e4f423c46ea2dab3ab1" + ], + "data": "0x0000000000000000000000000000000000000000000000000009451901f92500000000000000000000000000000000000000000000000000033c939ef81c6c02000000000000000000000000000000000000000000000611489903de08baec2000000000000000000000000000000000000000000000000003334e85f623470200000000000000000000000000000000000000000000061148a248f70ab41120", + "blockHash": "0xa19406951cf2263998ddea3b542c3f265d40484fdbbc7c305babf392e284d932", + "blockNumber": "0x2b8bf8e", + "transactionHash": "0xed09bc17bbe34f24b0b6bd1ed893d748335663d42b6e61623999772f0617bf66", + "transactionIndex": "0x2", + "logIndex": "0x3", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000020000000000000002000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000020000000080000040000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000008000000000000000000000000100000000000000000000000000080000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f10" + }, + { + "transactionHash": "0x5bfabf0d17e1fc24556b66786feb048a874a4768864a231b2f77004dbcad66ae", + "transactionIndex": "0x3", + "blockHash": "0xa19406951cf2263998ddea3b542c3f265d40484fdbbc7c305babf392e284d932", + "blockNumber": "0x2b8bf8e", + "from": "0xA02CDdFa44B8C01b4257F54ac1c43F75801E8175", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x219e9f", + "gasUsed": "0x64f1c", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000a02cddfa44b8c01b4257f54ac1c43f75801e8175", + "0x0000000000000000000000005082f249cdb2f2c1ee035e4f423c46ea2dab3ab1" + ], + "data": "0x0000000000000000000000000000000000000000000000000002341207e6240000000000000000000000000000000000000000000000000003334e85f47a985200000000000000000000000000000000000000000000061148a248f70ab4112000000000000000000000000000000000000000000000000003311a73ec94745200000000000000000000000000000000000000000000061148a47d09129a3520", + "blockHash": "0xa19406951cf2263998ddea3b542c3f265d40484fdbbc7c305babf392e284d932", + "blockNumber": "0x2b8bf8e", + "transactionHash": "0x5bfabf0d17e1fc24556b66786feb048a874a4768864a231b2f77004dbcad66ae", + "transactionIndex": "0x3", + "logIndex": "0x4", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000020000000000000002000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000020000000080000040000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000008000000000000000000000000100000000000000000000000000080000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f10" + }, + { + "transactionHash": "0xa41af2cba175bc10e156a9457ee1fccfb5deb6a61f5fffb60c4757131054fab1", + "transactionIndex": "0x4", + "blockHash": "0xa19406951cf2263998ddea3b542c3f265d40484fdbbc7c305babf392e284d932", + "blockNumber": "0x2b8bf8e", + "from": "0xA02CDdFa44B8C01b4257F54ac1c43F75801E8175", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x28883d", + "gasUsed": "0x6e99e", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000a02cddfa44b8c01b4257f54ac1c43f75801e8175", + "0x0000000000000000000000005082f249cdb2f2c1ee035e4f423c46ea2dab3ab1" + ], + "data": "0x00000000000000000000000000000000000000000000000000026a081b14020000000000000000000000000000000000000000000000000003311a73ec2f829200000000000000000000000000000000000000000000061148a47d09129a3520000000000000000000000000000000000000000000000000032eb06bd11b809200000000000000000000000000000000000000000000061148a6e7112dae3720", + "blockHash": "0xa19406951cf2263998ddea3b542c3f265d40484fdbbc7c305babf392e284d932", + "blockNumber": "0x2b8bf8e", + "transactionHash": "0xa41af2cba175bc10e156a9457ee1fccfb5deb6a61f5fffb60c4757131054fab1", + "transactionIndex": "0x4", + "logIndex": "0x5", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000020000000000000002000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000020000000080000040000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000008000000000000000000000000100000000000000000000000000080000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f10" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1707331815, + "chain": 80001, + "multi": false, + "commit": "60e1432" +} \ No newline at end of file diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-1707430304.json b/broadcast/DeployModularPermission.s.sol/80001/run-1707430304.json new file mode 100644 index 00000000..8f9f6689 --- /dev/null +++ b/broadcast/DeployModularPermission.s.sol/80001/run-1707430304.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0x9c18252cd4aefca54f68714e67f3b848ba9ba75a4edd2571524844192e146951", + "transactionType": "CREATE2", + "contractName": "ModularPermissionValidator", + "contractAddress": "0x68F21b955dC9b2C24f738419CD9277eBfCa1Deb0", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x274b89", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50611ed6806100206000396000f3fe6080604052600436106100dd5760003560e01c80638fc925aa1161007f578063c4a5240911610059578063c4a524091461031f578063d4085e811461033f578063e89005c71461037d578063ee87c2951461039057600080fd5b80638fc925aa146102bc5780639ea9bd59146102cf578063b66bd1d2146102f257600080fd5b80633ec50c6c116100bb5780633ec50c6c1461013d578063511079bc1461021157806365b8de2e146102245780637ecebe001461025b57600080fd5b80630c959556146100e2578063333daf92146100f75780633a871cdd1461012a575b600080fd5b6100f56100f03660046115c2565b6103a3565b005b34801561010357600080fd5b50610117610112366004611604565b6103f6565b6040519081526020015b60405180910390f35b610117610138366004611650565b61089a565b34801561014957600080fd5b506101bb6101583660046116cc565b6001602081815260009384526040808520909152918352912080549181015460028201546003909201546001600160801b03841693600160801b900460a01b926001600160a01b03909216919065ffffffffffff80821691600160301b90041686565b604080516001600160801b0390971687526001600160a01b031990951660208701526001600160a01b0390931693850193909352606084015265ffffffffffff91821660808401521660a082015260c001610121565b6100f561021f366004611786565b610d63565b34801561023057600080fd5b5061024461023f3660046115c2565b61123a565b6040516101219b9a99989796959493929190611980565b34801561026757600080fd5b5061029c610276366004611a17565b6003602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610121565b6100f56102ca3660046115c2565b611335565b6102e26102dd366004611a34565b611364565b6040519015158152602001610121565b3480156102fe57600080fd5b5061011761030d366004611a17565b60006020819052908152604090205481565b34801561032b57600080fd5b5061011761033a366004611786565b6113a1565b34801561034b57600080fd5b5061011761035a366004611a70565b600260209081526000938452604080852082529284528284209052825290205481565b6100f561038b366004611aa9565b6113ef565b6100f561039e366004611ac2565b61145b565b60008060008060003660003660003660006103be8d8d61123a565b9a509a509a509a509a509a509a509a509a509a509a506103e78b8b8b8b8b8b8b8b8b8b8b610d63565b50505050505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810182905261042e602060008587611add565b61043791611b07565b602080830182905260009182526001815260408083203384528252808320546003909252909120546001600160801b03918216600160801b90910490911611806104aa575060208181015160009081526001825260408082203383529092522054600160801b900460a01b600160a11b16155b156104b9576001915050610893565b6020818101516000908152600180835260408083203384528452808320815160c08101835281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682880152938201546001600160a01b0316928101929092526002810154606080840191825260039092015465ffffffffffff808216608080870191909152600160301b9092041694840194909452908601849052519185019190915291860190601f1986019036610574601482611b3c565b61057f928290611add565b61058891611b4f565b60601c845260003661059b603482611b3c565b906105a7601436611b3c565b926105b493929190611add565b6105bd91611b07565b60408501525b60808401516001600160a01b0316156107ec57608084015160a11c60011615610618576020808501516000908152600282526040808220608088018051845290845281832033845290935290205490526105c3565b36600061062f86608001516001600160a01b031690565b60608701516001600160a01b03919091169085908561064f826014611b82565b9261065c93929190611add565b61066591611b4f565b60601c036106f85760008484886060015160146106829190611b82565b90896060015160346106949190611b82565b926106a193929190611add565b6106aa91611b07565b60001c90508484886060015160346106c29190611b82565b6106cd928290611add565b90935091506106dd816034611b82565b876060018181516106ee9190611b82565b90525061070e9050565b606086015161070990808587611add565b915091505b600061072487608001516001600160a01b031690565b6001600160a01b031663ecfcd9303389600001518a602001518f8c6040015189896040518863ffffffff1660e01b81526004016107679796959493929190611b95565b602060405180830381865afa158015610784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a89190611be0565b90506107b488826114bb565b602080890151600090815260028252604080822060808c0180518452908452818320338452909352902054905297506105c392505050565b600083604001516001600160a01b0316637a7c6a4f3387602001518c87878b6060015190809261081e93929190611add565b6040518663ffffffff1660e01b815260040161083e959493929190611bf9565b602060405180830381865afa15801561085b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087f9190611be0565b905061088b86826114bb565b955050505050505b9392505050565b6000336108aa6020860186611a17565b6001600160a01b0316146109055760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d757374206265206d73672e73656e6465720000000000000060448201526064015b60405180910390fd5b6000610915610140860186611c32565b61092491602091600091611add565b61092d91611b07565b6000818152600160209081526040808320338452909152902054909150600160801b900460a01b600160a01b16158061099c575060008181526001602090815260408083203384528252808320546003909252909120546001600160801b03918216600160801b909104909116115b156109ab576001915050610893565b6000818152600160208181526040808420338552825292839020835160c08101855281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682850152938201546001600160a01b03169481019490945260028101546060850181905260039091015465ffffffffffff8082166080870152600160301b90910416928401929092525b6001600160a01b03821615610cf05760a082901c60011615610a815760008481526002602090815260408083209483529381528382203383529052919091205490610a3b565b366000610a8f836034611b82565b610a9d6101408c018c611c32565b905010158015610ae857506001600160a01b038416610ac06101408c018c611c32565b8590610acd826014611b82565b92610ada93929190611add565b610ae391611b4f565b60601c145b15610c12576000610afd6101408c018c611c32565b610b08866014611b82565b90610b14876034611b82565b92610b2193929190611add565b610b2a91611b07565b905080610b38856034611b82565b610b429190611b82565b610b506101408d018d611c32565b90501015610bb35760405162461bcd60e51b815260206004820152602a60248201527f706f6c69637944617461206c656e6774682065786365656473207369676e61746044820152690eae4ca40d8cadccee8d60b31b60648201526084016108fc565b610bc16101408c018c611c32565b610bcc866034611b82565b9083610bd9886034611b82565b610be39190611b82565b92610bf093929190611add565b9093509150610c00816034611b82565b610c0a9085611b82565b935050610c32565b610c206101408b018b611c32565b610c2d9185918291611add565b915091505b60006001600160a01b0385166001600160a01b031663c92ce35133898e87876040518663ffffffff1660e01b8152600401610c71959493929190611c79565b6020604051808303816000875af1158015610c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb49190611be0565b9050610cc088826114bb565b600088815260026020908152604080832098835297815287822033835290529590952054949750610a3b92505050565b60408301516000906001600160a01b0316638e0125d233878b610d176101408f018f611c32565b610d249189908290611add565b6040518663ffffffff1660e01b8152600401610d44959493929190611bf9565b6020604051808303816000875af115801561085b573d6000803e3d6000fd5b6001600160a01b03198a16610dba5760405162461bcd60e51b815260206004820152601860248201527f666c61672073686f756c64206e6f7420626520656d707479000000000000000060448201526064016108fc565b33600090815260036020526040812080546001600160801b031691610dde83611dbc565b91906101000a8154816001600160801b0302191690836001600160801b031602179055506001600160801b03168b6001600160801b031614610e595760405162461bcd60e51b81526020600482015260146024820152731b9bdb98d9481cda1bdd5b19081899481b995e1d60621b60448201526064016108fc565b6000610e6e8c8c8c8c8c8c8c8c8c8c8c6113a1565b9050600160a01b6001600160a01b03198c1601610e98573360009081526020819052604090208190555b60005b86811015610f6257610ecb888883818110610eb857610eb8611de2565b905060200201356001600160a01b031690565b6001600160a01b031662282ae03384878786818110610eec57610eec611de2565b9050602002810190610efe9190611c32565b6040518563ffffffff1660e01b8152600401610f1d9493929190611df8565b600060405180830381600087803b158015610f3757600080fd5b505af1158015610f4b573d6000803e3d6000fd5b505050508080610f5a90611e2a565b915050610e9b565b5060405163e9b51de560e01b81526001600160a01b038b169063e9b51de590610f9590339085908a908a90600401611df8565b600060405180830381600087803b158015610faf57600080fd5b505af1158015610fc3573d6000803e3d6000fd5b50505050600087876000818110610fdc57610fdc611de2565b9050602002013590506040518060c001604052808e6001600160801b031681526020018d6001600160a01b03191681526020018c6001600160a01b031681526020018281526020018b65ffffffffffff1681526020018a65ffffffffffff16815250600160008481526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160801b0302191690836001600160801b0316021790555060208201518160000160106101000a8154816bffffffffffffffffffffffff021916908360a01c021790555060408201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816002015560808201518160030160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060a08201518160030160066101000a81548165ffffffffffff021916908365ffffffffffff1602179055509050506000600190505b878110156111f15788888281811061117e5761117e611de2565b905060200201356002600085815260200190815260200160002060008b8b6001866111a99190611b3c565b8181106111b8576111b8611de2565b602090810292909201358352508181019290925260409081016000908120338252909252902055806111e981611e2a565b915050611164565b5060408051338152602081018490527fab0f2b94c33903f7ed343b1bcc3baca5e69eb7d007b8c8207232012f6cffef0e910160405180910390a150505050505050505050505050565b60008060008060003660003660003660008c8c60009060109261125f93929190611add565b61126891611e43565b60801c9a508c8c601090601c9261128193929190611add565b61128a91611e7a565b99508c8c601c906022926112a093929190611add565b6112a991611ea8565b60d01c97508c8c6022906028926112c293929190611add565b6112cb91611ea8565b60d01c96508c8c602890603c926112e493929190611add565b6112ed91611b4f565b9a9d999c60609b909b1c9b5096999598605c603c8089013589018281019b50810135995081890135890180830199908201359850607c81013501918201965001359350915050565b602081900361134f5761134b61038b8284611b07565b5050565b61134b61135c8284611e43565b60801c61145b565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064016108fc565b60008b8b8b8b8b8b8b8b8b8b8b6040516020016113c89b9a99989796959493929190611980565b6040516020818303038152906040528051906020012090509b9a5050505050505050505050565b6000818152600160209081526040808320338085529083529281902080546bffffffffffffffffffffffff60801b1916905580519283529082018390527f789770131846de4d1f28418f0f957cdf4fcabe5eccf70067083e20ecece69a3491015b60405180910390a150565b3360008181526003602090815260409182902080546001600160801b03908116600160801b918716918202179091558251938452908301527f22cd1acb7e7a306800a1b2c0ca9b0280187bbc00b7fbf55d38ad6cbf73082aec9101611450565b600081830160601b8260601b81148460601b8214176001600160a01b03848618161517600181146114ef5760019250611571565b6001600160d01b031980851690861681811881831102188686176001600160a01b031617935065ffffffffffff60a01b861690816115345765ffffffffffff60a01b91505b5065ffffffffffff60a01b851680611552575065ffffffffffff60a01b5b80821890821102188061156b575065ffffffffffff60a01b5b92909217915b505092915050565b60008083601f84011261158b57600080fd5b50813567ffffffffffffffff8111156115a357600080fd5b6020830191508360208285010111156115bb57600080fd5b9250929050565b600080602083850312156115d557600080fd5b823567ffffffffffffffff8111156115ec57600080fd5b6115f885828601611579565b90969095509350505050565b60008060006040848603121561161957600080fd5b83359250602084013567ffffffffffffffff81111561163757600080fd5b61164386828701611579565b9497909650939450505050565b60008060006060848603121561166557600080fd5b833567ffffffffffffffff81111561167c57600080fd5b8401610160818703121561168f57600080fd5b95602085013595506040909401359392505050565b6001600160a01b03811681146116b957600080fd5b50565b80356116c7816116a4565b919050565b600080604083850312156116df57600080fd5b8235915060208301356116f1816116a4565b809150509250929050565b80356001600160801b03811681146116c757600080fd5b80356001600160a01b0319811681146116c757600080fd5b803565ffffffffffff811681146116c757600080fd5b60008083601f84011261175357600080fd5b50813567ffffffffffffffff81111561176b57600080fd5b6020830191508360208260051b85010111156115bb57600080fd5b60008060008060008060008060008060006101008c8e0312156117a857600080fd5b6117b18c6116fc565b9a506117bf60208d01611713565b99506117cd60408d016116bc565b98506117db60608d0161172b565b97506117e960808d0161172b565b965067ffffffffffffffff8060a08e0135111561180557600080fd5b6118158e60a08f01358f01611741565b909750955060c08d013581101561182b57600080fd5b61183b8e60c08f01358f01611579565b909550935060e08d013581101561185157600080fd5b506118628d60e08e01358e01611741565b81935080925050509295989b509295989b9093969950565b8183526000602080850194508260005b858110156118a65781358752958201959082019060010161188a565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000808335601e198436030181126118f157600080fd5b830160208101925035905067ffffffffffffffff81111561191157600080fd5b8036038213156115bb57600080fd5b60008383855260208086019550808560051b8301018460005b8781101561197357848303601f1901895261195482886118da565b61195f8582846118b1565b9a86019a9450505090830190600101611939565b5090979650505050505050565b6001600160801b038c1681526001600160a01b03198b1660208201526001600160a01b038a16604082015265ffffffffffff89811660608301528816608082015261010060a082018190526000906119db838201898b61187a565b905082810360c08401526119f08187896118b1565b905082810360e0840152611a05818587611920565b9e9d5050505050505050505050505050565b600060208284031215611a2957600080fd5b8135610893816116a4565b600080600060408486031215611a4957600080fd5b8335611a54816116a4565b9250602084013567ffffffffffffffff81111561163757600080fd5b600080600060608486031215611a8557600080fd5b83359250602084013591506040840135611a9e816116a4565b809150509250925092565b600060208284031215611abb57600080fd5b5035919050565b600060208284031215611ad457600080fd5b610893826116fc565b60008085851115611aed57600080fd5b83861115611afa57600080fd5b5050820193919092039150565b80356020831015611b2057600019602084900360031b1b165b92915050565b634e487b7160e01b600052601160045260246000fd5b81810381811115611b2057611b20611b26565b6bffffffffffffffffffffffff1981358181169160148510156115715760149490940360031b84901b1690921692915050565b80820180821115611b2057611b20611b26565b600060018060a01b03808a16835280891660208401525086604083015285606083015284608083015260c060a0830152611bd360c0830184866118b1565b9998505050505050505050565b600060208284031215611bf257600080fd5b5051919050565b60018060a01b0386168152846020820152836040820152608060608201526000611c276080830184866118b1565b979650505050505050565b6000808335601e19843603018112611c4957600080fd5b83018035915067ffffffffffffffff821115611c6457600080fd5b6020019150368190038213156115bb57600080fd5b6001600160a01b038616815260208101859052608060408201819052611cb1908201611ca4866116bc565b6001600160a01b03169052565b602084013560a08201526000611cca60408601866118da565b6101608060c0860152611ce26101e0860183856118b1565b9250611cf160608901896118da565b9250607f19808786030160e0880152611d0b8585846118b1565b9450610100935060808a013584880152610120915060a08a01358288015261014060c08b01358189015260e08b013584890152848b0135610180890152611d54838c018c6118da565b9550935081888703016101a0890152611d6e8686866118b1565b9550611d7c818c018c6118da565b955093505080878603016101c08801525050611d998383836118b1565b925050508281036060840152611db08185876118b1565b98975050505050505050565b60006001600160801b03808316818103611dd857611dd8611b26565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b60018060a01b0385168152836020820152606060408201526000611e206060830184866118b1565b9695505050505050565b600060018201611e3c57611e3c611b26565b5060010190565b6fffffffffffffffffffffffffffffffff1981358181169160108510156115715760109490940360031b84901b1690921692915050565b6001600160a01b0319813581811691600c85101561157157600c9490940360031b84901b1690921692915050565b6001600160d01b031981358181169160068510156115715760069490940360031b84901b169092169291505056", + "nonce": "0x1d2" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x9c18252cd4aefca54f68714e67f3b848ba9ba75a4edd2571524844192e146951" + ], + "returns": {}, + "timestamp": 1707430304, + "chain": 80001, + "multi": false, + "commit": "60e1432" +} \ No newline at end of file diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-1707430395.json b/broadcast/DeployModularPermission.s.sol/80001/run-1707430395.json new file mode 100644 index 00000000..29d452b4 --- /dev/null +++ b/broadcast/DeployModularPermission.s.sol/80001/run-1707430395.json @@ -0,0 +1,65 @@ +{ + "transactions": [ + { + "hash": "0x9c18252cd4aefca54f68714e67f3b848ba9ba75a4edd2571524844192e146951", + "transactionType": "CREATE2", + "contractName": "ModularPermissionValidator", + "contractAddress": "0x68F21b955dC9b2C24f738419CD9277eBfCa1Deb0", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x274b89", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50611ed6806100206000396000f3fe6080604052600436106100dd5760003560e01c80638fc925aa1161007f578063c4a5240911610059578063c4a524091461031f578063d4085e811461033f578063e89005c71461037d578063ee87c2951461039057600080fd5b80638fc925aa146102bc5780639ea9bd59146102cf578063b66bd1d2146102f257600080fd5b80633ec50c6c116100bb5780633ec50c6c1461013d578063511079bc1461021157806365b8de2e146102245780637ecebe001461025b57600080fd5b80630c959556146100e2578063333daf92146100f75780633a871cdd1461012a575b600080fd5b6100f56100f03660046115c2565b6103a3565b005b34801561010357600080fd5b50610117610112366004611604565b6103f6565b6040519081526020015b60405180910390f35b610117610138366004611650565b61089a565b34801561014957600080fd5b506101bb6101583660046116cc565b6001602081815260009384526040808520909152918352912080549181015460028201546003909201546001600160801b03841693600160801b900460a01b926001600160a01b03909216919065ffffffffffff80821691600160301b90041686565b604080516001600160801b0390971687526001600160a01b031990951660208701526001600160a01b0390931693850193909352606084015265ffffffffffff91821660808401521660a082015260c001610121565b6100f561021f366004611786565b610d63565b34801561023057600080fd5b5061024461023f3660046115c2565b61123a565b6040516101219b9a99989796959493929190611980565b34801561026757600080fd5b5061029c610276366004611a17565b6003602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610121565b6100f56102ca3660046115c2565b611335565b6102e26102dd366004611a34565b611364565b6040519015158152602001610121565b3480156102fe57600080fd5b5061011761030d366004611a17565b60006020819052908152604090205481565b34801561032b57600080fd5b5061011761033a366004611786565b6113a1565b34801561034b57600080fd5b5061011761035a366004611a70565b600260209081526000938452604080852082529284528284209052825290205481565b6100f561038b366004611aa9565b6113ef565b6100f561039e366004611ac2565b61145b565b60008060008060003660003660003660006103be8d8d61123a565b9a509a509a509a509a509a509a509a509a509a509a506103e78b8b8b8b8b8b8b8b8b8b8b610d63565b50505050505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810182905261042e602060008587611add565b61043791611b07565b602080830182905260009182526001815260408083203384528252808320546003909252909120546001600160801b03918216600160801b90910490911611806104aa575060208181015160009081526001825260408082203383529092522054600160801b900460a01b600160a11b16155b156104b9576001915050610893565b6020818101516000908152600180835260408083203384528452808320815160c08101835281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682880152938201546001600160a01b0316928101929092526002810154606080840191825260039092015465ffffffffffff808216608080870191909152600160301b9092041694840194909452908601849052519185019190915291860190601f1986019036610574601482611b3c565b61057f928290611add565b61058891611b4f565b60601c845260003661059b603482611b3c565b906105a7601436611b3c565b926105b493929190611add565b6105bd91611b07565b60408501525b60808401516001600160a01b0316156107ec57608084015160a11c60011615610618576020808501516000908152600282526040808220608088018051845290845281832033845290935290205490526105c3565b36600061062f86608001516001600160a01b031690565b60608701516001600160a01b03919091169085908561064f826014611b82565b9261065c93929190611add565b61066591611b4f565b60601c036106f85760008484886060015160146106829190611b82565b90896060015160346106949190611b82565b926106a193929190611add565b6106aa91611b07565b60001c90508484886060015160346106c29190611b82565b6106cd928290611add565b90935091506106dd816034611b82565b876060018181516106ee9190611b82565b90525061070e9050565b606086015161070990808587611add565b915091505b600061072487608001516001600160a01b031690565b6001600160a01b031663ecfcd9303389600001518a602001518f8c6040015189896040518863ffffffff1660e01b81526004016107679796959493929190611b95565b602060405180830381865afa158015610784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a89190611be0565b90506107b488826114bb565b602080890151600090815260028252604080822060808c0180518452908452818320338452909352902054905297506105c392505050565b600083604001516001600160a01b0316637a7c6a4f3387602001518c87878b6060015190809261081e93929190611add565b6040518663ffffffff1660e01b815260040161083e959493929190611bf9565b602060405180830381865afa15801561085b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087f9190611be0565b905061088b86826114bb565b955050505050505b9392505050565b6000336108aa6020860186611a17565b6001600160a01b0316146109055760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d757374206265206d73672e73656e6465720000000000000060448201526064015b60405180910390fd5b6000610915610140860186611c32565b61092491602091600091611add565b61092d91611b07565b6000818152600160209081526040808320338452909152902054909150600160801b900460a01b600160a01b16158061099c575060008181526001602090815260408083203384528252808320546003909252909120546001600160801b03918216600160801b909104909116115b156109ab576001915050610893565b6000818152600160208181526040808420338552825292839020835160c08101855281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682850152938201546001600160a01b03169481019490945260028101546060850181905260039091015465ffffffffffff8082166080870152600160301b90910416928401929092525b6001600160a01b03821615610cf05760a082901c60011615610a815760008481526002602090815260408083209483529381528382203383529052919091205490610a3b565b366000610a8f836034611b82565b610a9d6101408c018c611c32565b905010158015610ae857506001600160a01b038416610ac06101408c018c611c32565b8590610acd826014611b82565b92610ada93929190611add565b610ae391611b4f565b60601c145b15610c12576000610afd6101408c018c611c32565b610b08866014611b82565b90610b14876034611b82565b92610b2193929190611add565b610b2a91611b07565b905080610b38856034611b82565b610b429190611b82565b610b506101408d018d611c32565b90501015610bb35760405162461bcd60e51b815260206004820152602a60248201527f706f6c69637944617461206c656e6774682065786365656473207369676e61746044820152690eae4ca40d8cadccee8d60b31b60648201526084016108fc565b610bc16101408c018c611c32565b610bcc866034611b82565b9083610bd9886034611b82565b610be39190611b82565b92610bf093929190611add565b9093509150610c00816034611b82565b610c0a9085611b82565b935050610c32565b610c206101408b018b611c32565b610c2d9185918291611add565b915091505b60006001600160a01b0385166001600160a01b031663c92ce35133898e87876040518663ffffffff1660e01b8152600401610c71959493929190611c79565b6020604051808303816000875af1158015610c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb49190611be0565b9050610cc088826114bb565b600088815260026020908152604080832098835297815287822033835290529590952054949750610a3b92505050565b60408301516000906001600160a01b0316638e0125d233878b610d176101408f018f611c32565b610d249189908290611add565b6040518663ffffffff1660e01b8152600401610d44959493929190611bf9565b6020604051808303816000875af115801561085b573d6000803e3d6000fd5b6001600160a01b03198a16610dba5760405162461bcd60e51b815260206004820152601860248201527f666c61672073686f756c64206e6f7420626520656d707479000000000000000060448201526064016108fc565b33600090815260036020526040812080546001600160801b031691610dde83611dbc565b91906101000a8154816001600160801b0302191690836001600160801b031602179055506001600160801b03168b6001600160801b031614610e595760405162461bcd60e51b81526020600482015260146024820152731b9bdb98d9481cda1bdd5b19081899481b995e1d60621b60448201526064016108fc565b6000610e6e8c8c8c8c8c8c8c8c8c8c8c6113a1565b9050600160a01b6001600160a01b03198c1601610e98573360009081526020819052604090208190555b60005b86811015610f6257610ecb888883818110610eb857610eb8611de2565b905060200201356001600160a01b031690565b6001600160a01b031662282ae03384878786818110610eec57610eec611de2565b9050602002810190610efe9190611c32565b6040518563ffffffff1660e01b8152600401610f1d9493929190611df8565b600060405180830381600087803b158015610f3757600080fd5b505af1158015610f4b573d6000803e3d6000fd5b505050508080610f5a90611e2a565b915050610e9b565b5060405163e9b51de560e01b81526001600160a01b038b169063e9b51de590610f9590339085908a908a90600401611df8565b600060405180830381600087803b158015610faf57600080fd5b505af1158015610fc3573d6000803e3d6000fd5b50505050600087876000818110610fdc57610fdc611de2565b9050602002013590506040518060c001604052808e6001600160801b031681526020018d6001600160a01b03191681526020018c6001600160a01b031681526020018281526020018b65ffffffffffff1681526020018a65ffffffffffff16815250600160008481526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160801b0302191690836001600160801b0316021790555060208201518160000160106101000a8154816bffffffffffffffffffffffff021916908360a01c021790555060408201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816002015560808201518160030160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060a08201518160030160066101000a81548165ffffffffffff021916908365ffffffffffff1602179055509050506000600190505b878110156111f15788888281811061117e5761117e611de2565b905060200201356002600085815260200190815260200160002060008b8b6001866111a99190611b3c565b8181106111b8576111b8611de2565b602090810292909201358352508181019290925260409081016000908120338252909252902055806111e981611e2a565b915050611164565b5060408051338152602081018490527fab0f2b94c33903f7ed343b1bcc3baca5e69eb7d007b8c8207232012f6cffef0e910160405180910390a150505050505050505050505050565b60008060008060003660003660003660008c8c60009060109261125f93929190611add565b61126891611e43565b60801c9a508c8c601090601c9261128193929190611add565b61128a91611e7a565b99508c8c601c906022926112a093929190611add565b6112a991611ea8565b60d01c97508c8c6022906028926112c293929190611add565b6112cb91611ea8565b60d01c96508c8c602890603c926112e493929190611add565b6112ed91611b4f565b9a9d999c60609b909b1c9b5096999598605c603c8089013589018281019b50810135995081890135890180830199908201359850607c81013501918201965001359350915050565b602081900361134f5761134b61038b8284611b07565b5050565b61134b61135c8284611e43565b60801c61145b565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064016108fc565b60008b8b8b8b8b8b8b8b8b8b8b6040516020016113c89b9a99989796959493929190611980565b6040516020818303038152906040528051906020012090509b9a5050505050505050505050565b6000818152600160209081526040808320338085529083529281902080546bffffffffffffffffffffffff60801b1916905580519283529082018390527f789770131846de4d1f28418f0f957cdf4fcabe5eccf70067083e20ecece69a3491015b60405180910390a150565b3360008181526003602090815260409182902080546001600160801b03908116600160801b918716918202179091558251938452908301527f22cd1acb7e7a306800a1b2c0ca9b0280187bbc00b7fbf55d38ad6cbf73082aec9101611450565b600081830160601b8260601b81148460601b8214176001600160a01b03848618161517600181146114ef5760019250611571565b6001600160d01b031980851690861681811881831102188686176001600160a01b031617935065ffffffffffff60a01b861690816115345765ffffffffffff60a01b91505b5065ffffffffffff60a01b851680611552575065ffffffffffff60a01b5b80821890821102188061156b575065ffffffffffff60a01b5b92909217915b505092915050565b60008083601f84011261158b57600080fd5b50813567ffffffffffffffff8111156115a357600080fd5b6020830191508360208285010111156115bb57600080fd5b9250929050565b600080602083850312156115d557600080fd5b823567ffffffffffffffff8111156115ec57600080fd5b6115f885828601611579565b90969095509350505050565b60008060006040848603121561161957600080fd5b83359250602084013567ffffffffffffffff81111561163757600080fd5b61164386828701611579565b9497909650939450505050565b60008060006060848603121561166557600080fd5b833567ffffffffffffffff81111561167c57600080fd5b8401610160818703121561168f57600080fd5b95602085013595506040909401359392505050565b6001600160a01b03811681146116b957600080fd5b50565b80356116c7816116a4565b919050565b600080604083850312156116df57600080fd5b8235915060208301356116f1816116a4565b809150509250929050565b80356001600160801b03811681146116c757600080fd5b80356001600160a01b0319811681146116c757600080fd5b803565ffffffffffff811681146116c757600080fd5b60008083601f84011261175357600080fd5b50813567ffffffffffffffff81111561176b57600080fd5b6020830191508360208260051b85010111156115bb57600080fd5b60008060008060008060008060008060006101008c8e0312156117a857600080fd5b6117b18c6116fc565b9a506117bf60208d01611713565b99506117cd60408d016116bc565b98506117db60608d0161172b565b97506117e960808d0161172b565b965067ffffffffffffffff8060a08e0135111561180557600080fd5b6118158e60a08f01358f01611741565b909750955060c08d013581101561182b57600080fd5b61183b8e60c08f01358f01611579565b909550935060e08d013581101561185157600080fd5b506118628d60e08e01358e01611741565b81935080925050509295989b509295989b9093969950565b8183526000602080850194508260005b858110156118a65781358752958201959082019060010161188a565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000808335601e198436030181126118f157600080fd5b830160208101925035905067ffffffffffffffff81111561191157600080fd5b8036038213156115bb57600080fd5b60008383855260208086019550808560051b8301018460005b8781101561197357848303601f1901895261195482886118da565b61195f8582846118b1565b9a86019a9450505090830190600101611939565b5090979650505050505050565b6001600160801b038c1681526001600160a01b03198b1660208201526001600160a01b038a16604082015265ffffffffffff89811660608301528816608082015261010060a082018190526000906119db838201898b61187a565b905082810360c08401526119f08187896118b1565b905082810360e0840152611a05818587611920565b9e9d5050505050505050505050505050565b600060208284031215611a2957600080fd5b8135610893816116a4565b600080600060408486031215611a4957600080fd5b8335611a54816116a4565b9250602084013567ffffffffffffffff81111561163757600080fd5b600080600060608486031215611a8557600080fd5b83359250602084013591506040840135611a9e816116a4565b809150509250925092565b600060208284031215611abb57600080fd5b5035919050565b600060208284031215611ad457600080fd5b610893826116fc565b60008085851115611aed57600080fd5b83861115611afa57600080fd5b5050820193919092039150565b80356020831015611b2057600019602084900360031b1b165b92915050565b634e487b7160e01b600052601160045260246000fd5b81810381811115611b2057611b20611b26565b6bffffffffffffffffffffffff1981358181169160148510156115715760149490940360031b84901b1690921692915050565b80820180821115611b2057611b20611b26565b600060018060a01b03808a16835280891660208401525086604083015285606083015284608083015260c060a0830152611bd360c0830184866118b1565b9998505050505050505050565b600060208284031215611bf257600080fd5b5051919050565b60018060a01b0386168152846020820152836040820152608060608201526000611c276080830184866118b1565b979650505050505050565b6000808335601e19843603018112611c4957600080fd5b83018035915067ffffffffffffffff821115611c6457600080fd5b6020019150368190038213156115bb57600080fd5b6001600160a01b038616815260208101859052608060408201819052611cb1908201611ca4866116bc565b6001600160a01b03169052565b602084013560a08201526000611cca60408601866118da565b6101608060c0860152611ce26101e0860183856118b1565b9250611cf160608901896118da565b9250607f19808786030160e0880152611d0b8585846118b1565b9450610100935060808a013584880152610120915060a08a01358288015261014060c08b01358189015260e08b013584890152848b0135610180890152611d54838c018c6118da565b9550935081888703016101a0890152611d6e8686866118b1565b9550611d7c818c018c6118da565b955093505080878603016101c08801525050611d998383836118b1565b925050508281036060840152611db08185876118b1565b98975050505050505050565b60006001600160801b03808316818103611dd857611dd8611b26565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b60018060a01b0385168152836020820152606060408201526000611e206060830184866118b1565b9695505050505050565b600060018201611e3c57611e3c611b26565b5060010190565b6fffffffffffffffffffffffffffffffff1981358181169160108510156115715760109490940360031b84901b1690921692915050565b6001600160a01b0319813581811691600c85101561157157600c9490940360031b84901b1690921692915050565b6001600160d01b031981358181169160068510156115715760069490940360031b84901b169092169291505056", + "nonce": "0x1d2" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x9c18252cd4aefca54f68714e67f3b848ba9ba75a4edd2571524844192e146951", + "transactionIndex": "0x2c", + "blockHash": "0x34dcc4dbe5b09f39c365780863972b4df38b515c0dd7151bd5fc13eee0c051f8", + "blockNumber": "0x2b96880", + "from": "0xA02CDdFa44B8C01b4257F54ac1c43F75801E8175", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0xdcd222", + "gasUsed": "0x1ae041", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000a02cddfa44b8c01b4257f54ac1c43f75801e8175", + "0x000000000000000000000000c275dc8be39f50d12f66b6a63629c39da5bae5bd" + ], + "data": "0x000000000000000000000000000000000000000000000000000962e6a293ef00000000000000000000000000000000000000000000000000032eb06bd0ace6b200000000000000000000000000000000000000000000142c191f474a6dbe64a000000000000000000000000000000000000000000000000003254d852e18f7b200000000000000000000000000000000000000000000142c1928aa31105253a0", + "blockHash": "0x34dcc4dbe5b09f39c365780863972b4df38b515c0dd7151bd5fc13eee0c051f8", + "blockNumber": "0x2b96880", + "transactionHash": "0x9c18252cd4aefca54f68714e67f3b848ba9ba75a4edd2571524844192e146951", + "transactionIndex": "0x2c", + "logIndex": "0xa3", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000002000000000000000000000000000000000000000000000000000800000000000000000040100000000000000000000000000000000000000000000000000020000000080000040000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000040000000004000000000000000000001000008000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f0f" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1707430395, + "chain": 80001, + "multi": false, + "commit": "60e1432" +} \ No newline at end of file diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-1707439892.json b/broadcast/DeployModularPermission.s.sol/80001/run-1707439892.json new file mode 100644 index 00000000..ad20254e --- /dev/null +++ b/broadcast/DeployModularPermission.s.sol/80001/run-1707439892.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0xac55704b236879e66bd05cb7d6a3f5d0c29fecbe0b33abecf3d353e6a27f80bd", + "transactionType": "CREATE2", + "contractName": "ModularPermissionValidator", + "contractAddress": "0x965Bea0f8b65aABD1F5148F64654BbAAfB9d2Efa", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x28ffa2", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50612037806100206000396000f3fe6080604052600436106100dd5760003560e01c80638fc925aa1161007f578063b66bd1d211610059578063b66bd1d214610312578063d4085e811461033f578063e89005c71461037d578063ee87c2951461039057600080fd5b80638fc925aa146102bc5780639ea9bd59146102cf578063b52e2c7a146102f257600080fd5b80633ec50c6c116100bb5780633ec50c6c1461013d578063511079bc1461021157806365b8de2e146102245780637ecebe001461025b57600080fd5b80630c959556146100e2578063333daf92146100f75780633a871cdd1461012a575b600080fd5b6100f56100f03660046115be565b6103a3565b005b34801561010357600080fd5b50610117610112366004611600565b6103f6565b6040519081526020015b60405180910390f35b61011761013836600461164c565b61089a565b34801561014957600080fd5b506101bb6101583660046116c8565b6001602081815260009384526040808520909152918352912080549181015460028201546003909201546001600160801b03841693600160801b900460a01b926001600160a01b03909216919065ffffffffffff80821691600160301b90041686565b604080516001600160801b0390971687526001600160a01b031990951660208701526001600160a01b0390931693850193909352606084015265ffffffffffff91821660808401521660a082015260c001610121565b6100f561021f366004611782565b610d63565b34801561023057600080fd5b5061024461023f3660046115be565b611239565b6040516101219b9a9998979695949392919061197c565b34801561026757600080fd5b5061029c610276366004611a13565b6003602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610121565b6100f56102ca3660046115be565b611334565b6102e26102dd366004611a30565b611363565b6040519015158152602001610121565b3480156102fe57600080fd5b5061011761030d366004611a6c565b6113a0565b34801561031e57600080fd5b5061011761032d366004611a13565b60006020819052908152604090205481565b34801561034b57600080fd5b5061011761035a366004611b4d565b600260209081526000938452604080852082529284528284209052825290205481565b6100f561038b366004611b86565b6113eb565b6100f561039e366004611b9f565b611457565b60008060008060003660003660003660006103be8d8d611239565b9a509a509a509a509a509a509a509a509a509a509a506103e78b8b8b8b8b8b8b8b8b8b8b610d63565b50505050505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810182905261042e602060008587611bba565b61043791611be4565b602080830182905260009182526001815260408083203384528252808320546003909252909120546001600160801b03918216600160801b90910490911611806104aa575060208181015160009081526001825260408082203383529092522054600160801b900460a01b600160a11b16155b156104b9576001915050610893565b6020818101516000908152600180835260408083203384528452808320815160c08101835281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682880152938201546001600160a01b0316928101929092526002810154606080840191825260039092015465ffffffffffff808216608080870191909152600160301b9092041694840194909452908601849052519185019190915291860190601f1986019036610574601482611c19565b61057f928290611bba565b61058891611c2c565b60601c845260003661059b603482611c19565b906105a7601436611c19565b926105b493929190611bba565b6105bd91611be4565b60408501525b60808401516001600160a01b0316156107ec57608084015160a11c60011615610618576020808501516000908152600282526040808220608088018051845290845281832033845290935290205490526105c3565b36600061062f86608001516001600160a01b031690565b60608701516001600160a01b03919091169085908561064f826014611c5f565b9261065c93929190611bba565b61066591611c2c565b60601c036106f85760008484886060015160146106829190611c5f565b90896060015160346106949190611c5f565b926106a193929190611bba565b6106aa91611be4565b60001c90508484886060015160346106c29190611c5f565b6106cd928290611bba565b90935091506106dd816034611c5f565b876060018181516106ee9190611c5f565b90525061070e9050565b606086015161070990808587611bba565b915091505b600061072487608001516001600160a01b031690565b6001600160a01b031663ecfcd9303389600001518a602001518f8c6040015189896040518863ffffffff1660e01b81526004016107679796959493929190611c72565b602060405180830381865afa158015610784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a89190611cbd565b90506107b488826114b7565b602080890151600090815260028252604080822060808c0180518452908452818320338452909352902054905297506105c392505050565b600083604001516001600160a01b0316637a7c6a4f3387602001518c87878b6060015190809261081e93929190611bba565b6040518663ffffffff1660e01b815260040161083e959493929190611cd6565b602060405180830381865afa15801561085b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087f9190611cbd565b905061088b86826114b7565b955050505050505b9392505050565b6000336108aa6020860186611a13565b6001600160a01b0316146109055760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d757374206265206d73672e73656e6465720000000000000060448201526064015b60405180910390fd5b6000610915610140860186611d0f565b61092491602091600091611bba565b61092d91611be4565b6000818152600160209081526040808320338452909152902054909150600160801b900460a01b600160a01b16158061099c575060008181526001602090815260408083203384528252808320546003909252909120546001600160801b03918216600160801b909104909116115b156109ab576001915050610893565b6000818152600160208181526040808420338552825292839020835160c08101855281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682850152938201546001600160a01b03169481019490945260028101546060850181905260039091015465ffffffffffff8082166080870152600160301b90910416928401929092525b6001600160a01b03821615610cf05760a082901c60011615610a815760008481526002602090815260408083209483529381528382203383529052919091205490610a3b565b366000610a8f836034611c5f565b610a9d6101408c018c611d0f565b905010158015610ae857506001600160a01b038416610ac06101408c018c611d0f565b8590610acd826014611c5f565b92610ada93929190611bba565b610ae391611c2c565b60601c145b15610c12576000610afd6101408c018c611d0f565b610b08866014611c5f565b90610b14876034611c5f565b92610b2193929190611bba565b610b2a91611be4565b905080610b38856034611c5f565b610b429190611c5f565b610b506101408d018d611d0f565b90501015610bb35760405162461bcd60e51b815260206004820152602a60248201527f706f6c69637944617461206c656e6774682065786365656473207369676e61746044820152690eae4ca40d8cadccee8d60b31b60648201526084016108fc565b610bc16101408c018c611d0f565b610bcc866034611c5f565b9083610bd9886034611c5f565b610be39190611c5f565b92610bf093929190611bba565b9093509150610c00816034611c5f565b610c0a9085611c5f565b935050610c32565b610c206101408b018b611d0f565b610c2d9185918291611bba565b915091505b60006001600160a01b0385166001600160a01b031663c92ce35133898e87876040518663ffffffff1660e01b8152600401610c71959493929190611d56565b6020604051808303816000875af1158015610c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb49190611cbd565b9050610cc088826114b7565b600088815260026020908152604080832098835297815287822033835290529590952054949750610a3b92505050565b60408301516000906001600160a01b0316638e0125d233878b610d176101408f018f611d0f565b610d249189908290611bba565b6040518663ffffffff1660e01b8152600401610d44959493929190611cd6565b6020604051808303816000875af115801561085b573d6000803e3d6000fd5b6001600160a01b03198a16610dba5760405162461bcd60e51b815260206004820152601860248201527f666c61672073686f756c64206e6f7420626520656d707479000000000000000060448201526064016108fc565b33600090815260036020526040812080546001600160801b031691610dde83611e99565b91906101000a8154816001600160801b0302191690836001600160801b031602179055506001600160801b03168b6001600160801b031614610e595760405162461bcd60e51b81526020600482015260146024820152731b9bdb98d9481cda1bdd5b19081899481b995e1d60621b60448201526064016108fc565b6000610e6d8b8b8b8b8b8b8b8b8b8b6113a0565b9050600160a01b6001600160a01b03198c1601610e97573360009081526020819052604090208190555b60005b86811015610f6157610eca888883818110610eb757610eb7611ebf565b905060200201356001600160a01b031690565b6001600160a01b031662282ae03384878786818110610eeb57610eeb611ebf565b9050602002810190610efd9190611d0f565b6040518563ffffffff1660e01b8152600401610f1c9493929190611ed5565b600060405180830381600087803b158015610f3657600080fd5b505af1158015610f4a573d6000803e3d6000fd5b505050508080610f5990611f07565b915050610e9a565b5060405163e9b51de560e01b81526001600160a01b038b169063e9b51de590610f9490339085908a908a90600401611ed5565b600060405180830381600087803b158015610fae57600080fd5b505af1158015610fc2573d6000803e3d6000fd5b50505050600087876000818110610fdb57610fdb611ebf565b9050602002013590506040518060c001604052808e6001600160801b031681526020018d6001600160a01b03191681526020018c6001600160a01b031681526020018281526020018b65ffffffffffff1681526020018a65ffffffffffff16815250600160008481526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160801b0302191690836001600160801b0316021790555060208201518160000160106101000a8154816bffffffffffffffffffffffff021916908360a01c021790555060408201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816002015560808201518160030160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060a08201518160030160066101000a81548165ffffffffffff021916908365ffffffffffff1602179055509050506000600190505b878110156111f05788888281811061117d5761117d611ebf565b905060200201356002600085815260200190815260200160002060008b8b6001866111a89190611c19565b8181106111b7576111b7611ebf565b602090810292909201358352508181019290925260409081016000908120338252909252902055806111e881611f07565b915050611163565b5060408051338152602081018490527fab0f2b94c33903f7ed343b1bcc3baca5e69eb7d007b8c8207232012f6cffef0e910160405180910390a150505050505050505050505050565b60008060008060003660003660003660008c8c60009060109261125e93929190611bba565b61126791611f20565b60801c9a508c8c601090601c9261128093929190611bba565b61128991611f57565b99508c8c601c9060229261129f93929190611bba565b6112a891611f85565b60d01c97508c8c6022906028926112c193929190611bba565b6112ca91611f85565b60d01c96508c8c602890603c926112e393929190611bba565b6112ec91611c2c565b9a9d999c60609b909b1c9b5096999598605c603c8089013589018281019b50810135995081890135890180830199908201359850607c81013501918201965001359350915050565b602081900361134e5761134a61038b8284611be4565b5050565b61134a61135b8284611f20565b60801c611457565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064016108fc565b60008a8a8a8a8a8a8a8a8a8a6040516020016113c59a99989796959493929190611fb3565b6040516020818303038152906040528051906020012090509a9950505050505050505050565b6000818152600160209081526040808320338085529083529281902080546bffffffffffffffffffffffff60801b1916905580519283529082018390527f789770131846de4d1f28418f0f957cdf4fcabe5eccf70067083e20ecece69a3491015b60405180910390a150565b3360008181526003602090815260409182902080546001600160801b03908116600160801b918716918202179091558251938452908301527f22cd1acb7e7a306800a1b2c0ca9b0280187bbc00b7fbf55d38ad6cbf73082aec910161144c565b600081830160601b8260601b81148460601b8214176001600160a01b03848618161517600181146114eb576001925061156d565b6001600160d01b031980851690861681811881831102188686176001600160a01b031617935065ffffffffffff60a01b861690816115305765ffffffffffff60a01b91505b5065ffffffffffff60a01b85168061154e575065ffffffffffff60a01b5b808218908211021880611567575065ffffffffffff60a01b5b92909217915b505092915050565b60008083601f84011261158757600080fd5b50813567ffffffffffffffff81111561159f57600080fd5b6020830191508360208285010111156115b757600080fd5b9250929050565b600080602083850312156115d157600080fd5b823567ffffffffffffffff8111156115e857600080fd5b6115f485828601611575565b90969095509350505050565b60008060006040848603121561161557600080fd5b83359250602084013567ffffffffffffffff81111561163357600080fd5b61163f86828701611575565b9497909650939450505050565b60008060006060848603121561166157600080fd5b833567ffffffffffffffff81111561167857600080fd5b8401610160818703121561168b57600080fd5b95602085013595506040909401359392505050565b6001600160a01b03811681146116b557600080fd5b50565b80356116c3816116a0565b919050565b600080604083850312156116db57600080fd5b8235915060208301356116ed816116a0565b809150509250929050565b80356001600160801b03811681146116c357600080fd5b80356001600160a01b0319811681146116c357600080fd5b803565ffffffffffff811681146116c357600080fd5b60008083601f84011261174f57600080fd5b50813567ffffffffffffffff81111561176757600080fd5b6020830191508360208260051b85010111156115b757600080fd5b60008060008060008060008060008060006101008c8e0312156117a457600080fd5b6117ad8c6116f8565b9a506117bb60208d0161170f565b99506117c960408d016116b8565b98506117d760608d01611727565b97506117e560808d01611727565b965067ffffffffffffffff8060a08e0135111561180157600080fd5b6118118e60a08f01358f0161173d565b909750955060c08d013581101561182757600080fd5b6118378e60c08f01358f01611575565b909550935060e08d013581101561184d57600080fd5b5061185e8d60e08e01358e0161173d565b81935080925050509295989b509295989b9093969950565b8183526000602080850194508260005b858110156118a257813587529582019590820190600101611886565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000808335601e198436030181126118ed57600080fd5b830160208101925035905067ffffffffffffffff81111561190d57600080fd5b8036038213156115b757600080fd5b60008383855260208086019550808560051b8301018460005b8781101561196f57848303601f1901895261195082886118d6565b61195b8582846118ad565b9a86019a9450505090830190600101611935565b5090979650505050505050565b6001600160801b038c1681526001600160a01b03198b1660208201526001600160a01b038a16604082015265ffffffffffff89811660608301528816608082015261010060a082018190526000906119d7838201898b611876565b905082810360c08401526119ec8187896118ad565b905082810360e0840152611a0181858761191c565b9e9d5050505050505050505050505050565b600060208284031215611a2557600080fd5b8135610893816116a0565b600080600060408486031215611a4557600080fd5b8335611a50816116a0565b9250602084013567ffffffffffffffff81111561163357600080fd5b60008060008060008060008060008060e08b8d031215611a8b57600080fd5b611a948b61170f565b995060208b0135611aa4816116a0565b9850611ab260408c01611727565b9750611ac060608c01611727565b965060808b013567ffffffffffffffff80821115611add57600080fd5b611ae98e838f0161173d565b909850965060a08d0135915080821115611b0257600080fd5b611b0e8e838f01611575565b909650945060c08d0135915080821115611b2757600080fd5b50611b348d828e0161173d565b915080935050809150509295989b9194979a5092959850565b600080600060608486031215611b6257600080fd5b83359250602084013591506040840135611b7b816116a0565b809150509250925092565b600060208284031215611b9857600080fd5b5035919050565b600060208284031215611bb157600080fd5b610893826116f8565b60008085851115611bca57600080fd5b83861115611bd757600080fd5b5050820193919092039150565b80356020831015611bfd57600019602084900360031b1b165b92915050565b634e487b7160e01b600052601160045260246000fd5b81810381811115611bfd57611bfd611c03565b6bffffffffffffffffffffffff19813581811691601485101561156d5760149490940360031b84901b1690921692915050565b80820180821115611bfd57611bfd611c03565b600060018060a01b03808a16835280891660208401525086604083015285606083015284608083015260c060a0830152611cb060c0830184866118ad565b9998505050505050505050565b600060208284031215611ccf57600080fd5b5051919050565b60018060a01b0386168152846020820152836040820152608060608201526000611d046080830184866118ad565b979650505050505050565b6000808335601e19843603018112611d2657600080fd5b83018035915067ffffffffffffffff821115611d4157600080fd5b6020019150368190038213156115b757600080fd5b6001600160a01b038616815260208101859052608060408201819052611d8e908201611d81866116b8565b6001600160a01b03169052565b602084013560a08201526000611da760408601866118d6565b6101608060c0860152611dbf6101e0860183856118ad565b9250611dce60608901896118d6565b9250607f19808786030160e0880152611de88585846118ad565b9450610100935060808a013584880152610120915060a08a01358288015261014060c08b01358189015260e08b013584890152848b0135610180890152611e31838c018c6118d6565b9550935081888703016101a0890152611e4b8686866118ad565b9550611e59818c018c6118d6565b955093505080878603016101c08801525050611e768383836118ad565b925050508281036060840152611e8d8185876118ad565b98975050505050505050565b60006001600160801b03808316818103611eb557611eb5611c03565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b60018060a01b0385168152836020820152606060408201526000611efd6060830184866118ad565b9695505050505050565b600060018201611f1957611f19611c03565b5060010190565b6fffffffffffffffffffffffffffffffff19813581811691601085101561156d5760109490940360031b84901b1690921692915050565b6001600160a01b0319813581811691600c85101561156d57600c9490940360031b84901b1690921692915050565b6001600160d01b0319813581811691600685101561156d5760069490940360031b84901b1690921692915050565b6001600160a01b03198b1681526001600160a01b038a16602082015265ffffffffffff89811660408301528816606082015260e060808201819052600090611ffe908301888a611876565b82810360a08401526120118187896118ad565b905082810360c084015261202681858761191c565b9d9c5050505050505050505050505056", + "nonce": "0x1d3" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xac55704b236879e66bd05cb7d6a3f5d0c29fecbe0b33abecf3d353e6a27f80bd" + ], + "returns": {}, + "timestamp": 1707439892, + "chain": 80001, + "multi": false, + "commit": "60e1432" +} \ No newline at end of file diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-1707439906.json b/broadcast/DeployModularPermission.s.sol/80001/run-1707439906.json new file mode 100644 index 00000000..b2e434f5 --- /dev/null +++ b/broadcast/DeployModularPermission.s.sol/80001/run-1707439906.json @@ -0,0 +1,65 @@ +{ + "transactions": [ + { + "hash": "0xac55704b236879e66bd05cb7d6a3f5d0c29fecbe0b33abecf3d353e6a27f80bd", + "transactionType": "CREATE2", + "contractName": "ModularPermissionValidator", + "contractAddress": "0x965Bea0f8b65aABD1F5148F64654BbAAfB9d2Efa", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x28ffa2", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50612037806100206000396000f3fe6080604052600436106100dd5760003560e01c80638fc925aa1161007f578063b66bd1d211610059578063b66bd1d214610312578063d4085e811461033f578063e89005c71461037d578063ee87c2951461039057600080fd5b80638fc925aa146102bc5780639ea9bd59146102cf578063b52e2c7a146102f257600080fd5b80633ec50c6c116100bb5780633ec50c6c1461013d578063511079bc1461021157806365b8de2e146102245780637ecebe001461025b57600080fd5b80630c959556146100e2578063333daf92146100f75780633a871cdd1461012a575b600080fd5b6100f56100f03660046115be565b6103a3565b005b34801561010357600080fd5b50610117610112366004611600565b6103f6565b6040519081526020015b60405180910390f35b61011761013836600461164c565b61089a565b34801561014957600080fd5b506101bb6101583660046116c8565b6001602081815260009384526040808520909152918352912080549181015460028201546003909201546001600160801b03841693600160801b900460a01b926001600160a01b03909216919065ffffffffffff80821691600160301b90041686565b604080516001600160801b0390971687526001600160a01b031990951660208701526001600160a01b0390931693850193909352606084015265ffffffffffff91821660808401521660a082015260c001610121565b6100f561021f366004611782565b610d63565b34801561023057600080fd5b5061024461023f3660046115be565b611239565b6040516101219b9a9998979695949392919061197c565b34801561026757600080fd5b5061029c610276366004611a13565b6003602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610121565b6100f56102ca3660046115be565b611334565b6102e26102dd366004611a30565b611363565b6040519015158152602001610121565b3480156102fe57600080fd5b5061011761030d366004611a6c565b6113a0565b34801561031e57600080fd5b5061011761032d366004611a13565b60006020819052908152604090205481565b34801561034b57600080fd5b5061011761035a366004611b4d565b600260209081526000938452604080852082529284528284209052825290205481565b6100f561038b366004611b86565b6113eb565b6100f561039e366004611b9f565b611457565b60008060008060003660003660003660006103be8d8d611239565b9a509a509a509a509a509a509a509a509a509a509a506103e78b8b8b8b8b8b8b8b8b8b8b610d63565b50505050505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810182905261042e602060008587611bba565b61043791611be4565b602080830182905260009182526001815260408083203384528252808320546003909252909120546001600160801b03918216600160801b90910490911611806104aa575060208181015160009081526001825260408082203383529092522054600160801b900460a01b600160a11b16155b156104b9576001915050610893565b6020818101516000908152600180835260408083203384528452808320815160c08101835281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682880152938201546001600160a01b0316928101929092526002810154606080840191825260039092015465ffffffffffff808216608080870191909152600160301b9092041694840194909452908601849052519185019190915291860190601f1986019036610574601482611c19565b61057f928290611bba565b61058891611c2c565b60601c845260003661059b603482611c19565b906105a7601436611c19565b926105b493929190611bba565b6105bd91611be4565b60408501525b60808401516001600160a01b0316156107ec57608084015160a11c60011615610618576020808501516000908152600282526040808220608088018051845290845281832033845290935290205490526105c3565b36600061062f86608001516001600160a01b031690565b60608701516001600160a01b03919091169085908561064f826014611c5f565b9261065c93929190611bba565b61066591611c2c565b60601c036106f85760008484886060015160146106829190611c5f565b90896060015160346106949190611c5f565b926106a193929190611bba565b6106aa91611be4565b60001c90508484886060015160346106c29190611c5f565b6106cd928290611bba565b90935091506106dd816034611c5f565b876060018181516106ee9190611c5f565b90525061070e9050565b606086015161070990808587611bba565b915091505b600061072487608001516001600160a01b031690565b6001600160a01b031663ecfcd9303389600001518a602001518f8c6040015189896040518863ffffffff1660e01b81526004016107679796959493929190611c72565b602060405180830381865afa158015610784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a89190611cbd565b90506107b488826114b7565b602080890151600090815260028252604080822060808c0180518452908452818320338452909352902054905297506105c392505050565b600083604001516001600160a01b0316637a7c6a4f3387602001518c87878b6060015190809261081e93929190611bba565b6040518663ffffffff1660e01b815260040161083e959493929190611cd6565b602060405180830381865afa15801561085b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087f9190611cbd565b905061088b86826114b7565b955050505050505b9392505050565b6000336108aa6020860186611a13565b6001600160a01b0316146109055760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d757374206265206d73672e73656e6465720000000000000060448201526064015b60405180910390fd5b6000610915610140860186611d0f565b61092491602091600091611bba565b61092d91611be4565b6000818152600160209081526040808320338452909152902054909150600160801b900460a01b600160a01b16158061099c575060008181526001602090815260408083203384528252808320546003909252909120546001600160801b03918216600160801b909104909116115b156109ab576001915050610893565b6000818152600160208181526040808420338552825292839020835160c08101855281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682850152938201546001600160a01b03169481019490945260028101546060850181905260039091015465ffffffffffff8082166080870152600160301b90910416928401929092525b6001600160a01b03821615610cf05760a082901c60011615610a815760008481526002602090815260408083209483529381528382203383529052919091205490610a3b565b366000610a8f836034611c5f565b610a9d6101408c018c611d0f565b905010158015610ae857506001600160a01b038416610ac06101408c018c611d0f565b8590610acd826014611c5f565b92610ada93929190611bba565b610ae391611c2c565b60601c145b15610c12576000610afd6101408c018c611d0f565b610b08866014611c5f565b90610b14876034611c5f565b92610b2193929190611bba565b610b2a91611be4565b905080610b38856034611c5f565b610b429190611c5f565b610b506101408d018d611d0f565b90501015610bb35760405162461bcd60e51b815260206004820152602a60248201527f706f6c69637944617461206c656e6774682065786365656473207369676e61746044820152690eae4ca40d8cadccee8d60b31b60648201526084016108fc565b610bc16101408c018c611d0f565b610bcc866034611c5f565b9083610bd9886034611c5f565b610be39190611c5f565b92610bf093929190611bba565b9093509150610c00816034611c5f565b610c0a9085611c5f565b935050610c32565b610c206101408b018b611d0f565b610c2d9185918291611bba565b915091505b60006001600160a01b0385166001600160a01b031663c92ce35133898e87876040518663ffffffff1660e01b8152600401610c71959493929190611d56565b6020604051808303816000875af1158015610c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb49190611cbd565b9050610cc088826114b7565b600088815260026020908152604080832098835297815287822033835290529590952054949750610a3b92505050565b60408301516000906001600160a01b0316638e0125d233878b610d176101408f018f611d0f565b610d249189908290611bba565b6040518663ffffffff1660e01b8152600401610d44959493929190611cd6565b6020604051808303816000875af115801561085b573d6000803e3d6000fd5b6001600160a01b03198a16610dba5760405162461bcd60e51b815260206004820152601860248201527f666c61672073686f756c64206e6f7420626520656d707479000000000000000060448201526064016108fc565b33600090815260036020526040812080546001600160801b031691610dde83611e99565b91906101000a8154816001600160801b0302191690836001600160801b031602179055506001600160801b03168b6001600160801b031614610e595760405162461bcd60e51b81526020600482015260146024820152731b9bdb98d9481cda1bdd5b19081899481b995e1d60621b60448201526064016108fc565b6000610e6d8b8b8b8b8b8b8b8b8b8b6113a0565b9050600160a01b6001600160a01b03198c1601610e97573360009081526020819052604090208190555b60005b86811015610f6157610eca888883818110610eb757610eb7611ebf565b905060200201356001600160a01b031690565b6001600160a01b031662282ae03384878786818110610eeb57610eeb611ebf565b9050602002810190610efd9190611d0f565b6040518563ffffffff1660e01b8152600401610f1c9493929190611ed5565b600060405180830381600087803b158015610f3657600080fd5b505af1158015610f4a573d6000803e3d6000fd5b505050508080610f5990611f07565b915050610e9a565b5060405163e9b51de560e01b81526001600160a01b038b169063e9b51de590610f9490339085908a908a90600401611ed5565b600060405180830381600087803b158015610fae57600080fd5b505af1158015610fc2573d6000803e3d6000fd5b50505050600087876000818110610fdb57610fdb611ebf565b9050602002013590506040518060c001604052808e6001600160801b031681526020018d6001600160a01b03191681526020018c6001600160a01b031681526020018281526020018b65ffffffffffff1681526020018a65ffffffffffff16815250600160008481526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160801b0302191690836001600160801b0316021790555060208201518160000160106101000a8154816bffffffffffffffffffffffff021916908360a01c021790555060408201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816002015560808201518160030160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060a08201518160030160066101000a81548165ffffffffffff021916908365ffffffffffff1602179055509050506000600190505b878110156111f05788888281811061117d5761117d611ebf565b905060200201356002600085815260200190815260200160002060008b8b6001866111a89190611c19565b8181106111b7576111b7611ebf565b602090810292909201358352508181019290925260409081016000908120338252909252902055806111e881611f07565b915050611163565b5060408051338152602081018490527fab0f2b94c33903f7ed343b1bcc3baca5e69eb7d007b8c8207232012f6cffef0e910160405180910390a150505050505050505050505050565b60008060008060003660003660003660008c8c60009060109261125e93929190611bba565b61126791611f20565b60801c9a508c8c601090601c9261128093929190611bba565b61128991611f57565b99508c8c601c9060229261129f93929190611bba565b6112a891611f85565b60d01c97508c8c6022906028926112c193929190611bba565b6112ca91611f85565b60d01c96508c8c602890603c926112e393929190611bba565b6112ec91611c2c565b9a9d999c60609b909b1c9b5096999598605c603c8089013589018281019b50810135995081890135890180830199908201359850607c81013501918201965001359350915050565b602081900361134e5761134a61038b8284611be4565b5050565b61134a61135b8284611f20565b60801c611457565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064016108fc565b60008a8a8a8a8a8a8a8a8a8a6040516020016113c59a99989796959493929190611fb3565b6040516020818303038152906040528051906020012090509a9950505050505050505050565b6000818152600160209081526040808320338085529083529281902080546bffffffffffffffffffffffff60801b1916905580519283529082018390527f789770131846de4d1f28418f0f957cdf4fcabe5eccf70067083e20ecece69a3491015b60405180910390a150565b3360008181526003602090815260409182902080546001600160801b03908116600160801b918716918202179091558251938452908301527f22cd1acb7e7a306800a1b2c0ca9b0280187bbc00b7fbf55d38ad6cbf73082aec910161144c565b600081830160601b8260601b81148460601b8214176001600160a01b03848618161517600181146114eb576001925061156d565b6001600160d01b031980851690861681811881831102188686176001600160a01b031617935065ffffffffffff60a01b861690816115305765ffffffffffff60a01b91505b5065ffffffffffff60a01b85168061154e575065ffffffffffff60a01b5b808218908211021880611567575065ffffffffffff60a01b5b92909217915b505092915050565b60008083601f84011261158757600080fd5b50813567ffffffffffffffff81111561159f57600080fd5b6020830191508360208285010111156115b757600080fd5b9250929050565b600080602083850312156115d157600080fd5b823567ffffffffffffffff8111156115e857600080fd5b6115f485828601611575565b90969095509350505050565b60008060006040848603121561161557600080fd5b83359250602084013567ffffffffffffffff81111561163357600080fd5b61163f86828701611575565b9497909650939450505050565b60008060006060848603121561166157600080fd5b833567ffffffffffffffff81111561167857600080fd5b8401610160818703121561168b57600080fd5b95602085013595506040909401359392505050565b6001600160a01b03811681146116b557600080fd5b50565b80356116c3816116a0565b919050565b600080604083850312156116db57600080fd5b8235915060208301356116ed816116a0565b809150509250929050565b80356001600160801b03811681146116c357600080fd5b80356001600160a01b0319811681146116c357600080fd5b803565ffffffffffff811681146116c357600080fd5b60008083601f84011261174f57600080fd5b50813567ffffffffffffffff81111561176757600080fd5b6020830191508360208260051b85010111156115b757600080fd5b60008060008060008060008060008060006101008c8e0312156117a457600080fd5b6117ad8c6116f8565b9a506117bb60208d0161170f565b99506117c960408d016116b8565b98506117d760608d01611727565b97506117e560808d01611727565b965067ffffffffffffffff8060a08e0135111561180157600080fd5b6118118e60a08f01358f0161173d565b909750955060c08d013581101561182757600080fd5b6118378e60c08f01358f01611575565b909550935060e08d013581101561184d57600080fd5b5061185e8d60e08e01358e0161173d565b81935080925050509295989b509295989b9093969950565b8183526000602080850194508260005b858110156118a257813587529582019590820190600101611886565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000808335601e198436030181126118ed57600080fd5b830160208101925035905067ffffffffffffffff81111561190d57600080fd5b8036038213156115b757600080fd5b60008383855260208086019550808560051b8301018460005b8781101561196f57848303601f1901895261195082886118d6565b61195b8582846118ad565b9a86019a9450505090830190600101611935565b5090979650505050505050565b6001600160801b038c1681526001600160a01b03198b1660208201526001600160a01b038a16604082015265ffffffffffff89811660608301528816608082015261010060a082018190526000906119d7838201898b611876565b905082810360c08401526119ec8187896118ad565b905082810360e0840152611a0181858761191c565b9e9d5050505050505050505050505050565b600060208284031215611a2557600080fd5b8135610893816116a0565b600080600060408486031215611a4557600080fd5b8335611a50816116a0565b9250602084013567ffffffffffffffff81111561163357600080fd5b60008060008060008060008060008060e08b8d031215611a8b57600080fd5b611a948b61170f565b995060208b0135611aa4816116a0565b9850611ab260408c01611727565b9750611ac060608c01611727565b965060808b013567ffffffffffffffff80821115611add57600080fd5b611ae98e838f0161173d565b909850965060a08d0135915080821115611b0257600080fd5b611b0e8e838f01611575565b909650945060c08d0135915080821115611b2757600080fd5b50611b348d828e0161173d565b915080935050809150509295989b9194979a5092959850565b600080600060608486031215611b6257600080fd5b83359250602084013591506040840135611b7b816116a0565b809150509250925092565b600060208284031215611b9857600080fd5b5035919050565b600060208284031215611bb157600080fd5b610893826116f8565b60008085851115611bca57600080fd5b83861115611bd757600080fd5b5050820193919092039150565b80356020831015611bfd57600019602084900360031b1b165b92915050565b634e487b7160e01b600052601160045260246000fd5b81810381811115611bfd57611bfd611c03565b6bffffffffffffffffffffffff19813581811691601485101561156d5760149490940360031b84901b1690921692915050565b80820180821115611bfd57611bfd611c03565b600060018060a01b03808a16835280891660208401525086604083015285606083015284608083015260c060a0830152611cb060c0830184866118ad565b9998505050505050505050565b600060208284031215611ccf57600080fd5b5051919050565b60018060a01b0386168152846020820152836040820152608060608201526000611d046080830184866118ad565b979650505050505050565b6000808335601e19843603018112611d2657600080fd5b83018035915067ffffffffffffffff821115611d4157600080fd5b6020019150368190038213156115b757600080fd5b6001600160a01b038616815260208101859052608060408201819052611d8e908201611d81866116b8565b6001600160a01b03169052565b602084013560a08201526000611da760408601866118d6565b6101608060c0860152611dbf6101e0860183856118ad565b9250611dce60608901896118d6565b9250607f19808786030160e0880152611de88585846118ad565b9450610100935060808a013584880152610120915060a08a01358288015261014060c08b01358189015260e08b013584890152848b0135610180890152611e31838c018c6118d6565b9550935081888703016101a0890152611e4b8686866118ad565b9550611e59818c018c6118d6565b955093505080878603016101c08801525050611e768383836118ad565b925050508281036060840152611e8d8185876118ad565b98975050505050505050565b60006001600160801b03808316818103611eb557611eb5611c03565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b60018060a01b0385168152836020820152606060408201526000611efd6060830184866118ad565b9695505050505050565b600060018201611f1957611f19611c03565b5060010190565b6fffffffffffffffffffffffffffffffff19813581811691601085101561156d5760109490940360031b84901b1690921692915050565b6001600160a01b0319813581811691600c85101561156d57600c9490940360031b84901b1690921692915050565b6001600160d01b0319813581811691600685101561156d5760069490940360031b84901b1690921692915050565b6001600160a01b03198b1681526001600160a01b038a16602082015265ffffffffffff89811660408301528816606082015260e060808201819052600090611ffe908301888a611876565b82810360a08401526120118187896118ad565b905082810360c084015261202681858761191c565b9d9c5050505050505050505050505056", + "nonce": "0x1d3" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xac55704b236879e66bd05cb7d6a3f5d0c29fecbe0b33abecf3d353e6a27f80bd", + "transactionIndex": "0x2", + "blockHash": "0xd71ebcaea257f41ffeffc4fae5f415c93e2dbe517fabc5570dcc82ffc5582e3c", + "blockNumber": "0x2b97895", + "from": "0xA02CDdFa44B8C01b4257F54ac1c43F75801E8175", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1df13d", + "gasUsed": "0x1c0a87", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000a02cddfa44b8c01b4257f54ac1c43f75801e8175", + "0x00000000000000000000000022b64229c41429a023549fdab3385893b579327a" + ], + "data": "0x00000000000000000000000000000000000000000000000000126dcebd16268200000000000000000000000000000000000000000000000003254d852c85d3e3000000000000000000000000000000000000000000000060f7789dc7f78a88900000000000000000000000000000000000000000000000000312dfb66f6fad61000000000000000000000000000000000000000000000060f78b0b96b4a0af12", + "blockHash": "0xd71ebcaea257f41ffeffc4fae5f415c93e2dbe517fabc5570dcc82ffc5582e3c", + "blockNumber": "0x2b97895", + "transactionHash": "0xac55704b236879e66bd05cb7d6a3f5d0c29fecbe0b33abecf3d353e6a27f80bd", + "transactionIndex": "0x2", + "logIndex": "0x3", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000020000000080000040000000000000000000200000000000000000000000000000000000000000010000000000200000000000000000000000000000000000000000000000000000002000004000000000000000000001000008000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0xa83efbfe" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1707439906, + "chain": 80001, + "multi": false, + "commit": "60e1432" +} \ No newline at end of file diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-latest.json b/broadcast/DeployModularPermission.s.sol/80001/run-latest.json new file mode 100644 index 00000000..b2e434f5 --- /dev/null +++ b/broadcast/DeployModularPermission.s.sol/80001/run-latest.json @@ -0,0 +1,65 @@ +{ + "transactions": [ + { + "hash": "0xac55704b236879e66bd05cb7d6a3f5d0c29fecbe0b33abecf3d353e6a27f80bd", + "transactionType": "CREATE2", + "contractName": "ModularPermissionValidator", + "contractAddress": "0x965Bea0f8b65aABD1F5148F64654BbAAfB9d2Efa", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x28ffa2", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50612037806100206000396000f3fe6080604052600436106100dd5760003560e01c80638fc925aa1161007f578063b66bd1d211610059578063b66bd1d214610312578063d4085e811461033f578063e89005c71461037d578063ee87c2951461039057600080fd5b80638fc925aa146102bc5780639ea9bd59146102cf578063b52e2c7a146102f257600080fd5b80633ec50c6c116100bb5780633ec50c6c1461013d578063511079bc1461021157806365b8de2e146102245780637ecebe001461025b57600080fd5b80630c959556146100e2578063333daf92146100f75780633a871cdd1461012a575b600080fd5b6100f56100f03660046115be565b6103a3565b005b34801561010357600080fd5b50610117610112366004611600565b6103f6565b6040519081526020015b60405180910390f35b61011761013836600461164c565b61089a565b34801561014957600080fd5b506101bb6101583660046116c8565b6001602081815260009384526040808520909152918352912080549181015460028201546003909201546001600160801b03841693600160801b900460a01b926001600160a01b03909216919065ffffffffffff80821691600160301b90041686565b604080516001600160801b0390971687526001600160a01b031990951660208701526001600160a01b0390931693850193909352606084015265ffffffffffff91821660808401521660a082015260c001610121565b6100f561021f366004611782565b610d63565b34801561023057600080fd5b5061024461023f3660046115be565b611239565b6040516101219b9a9998979695949392919061197c565b34801561026757600080fd5b5061029c610276366004611a13565b6003602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610121565b6100f56102ca3660046115be565b611334565b6102e26102dd366004611a30565b611363565b6040519015158152602001610121565b3480156102fe57600080fd5b5061011761030d366004611a6c565b6113a0565b34801561031e57600080fd5b5061011761032d366004611a13565b60006020819052908152604090205481565b34801561034b57600080fd5b5061011761035a366004611b4d565b600260209081526000938452604080852082529284528284209052825290205481565b6100f561038b366004611b86565b6113eb565b6100f561039e366004611b9f565b611457565b60008060008060003660003660003660006103be8d8d611239565b9a509a509a509a509a509a509a509a509a509a509a506103e78b8b8b8b8b8b8b8b8b8b8b610d63565b50505050505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810182905261042e602060008587611bba565b61043791611be4565b602080830182905260009182526001815260408083203384528252808320546003909252909120546001600160801b03918216600160801b90910490911611806104aa575060208181015160009081526001825260408082203383529092522054600160801b900460a01b600160a11b16155b156104b9576001915050610893565b6020818101516000908152600180835260408083203384528452808320815160c08101835281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682880152938201546001600160a01b0316928101929092526002810154606080840191825260039092015465ffffffffffff808216608080870191909152600160301b9092041694840194909452908601849052519185019190915291860190601f1986019036610574601482611c19565b61057f928290611bba565b61058891611c2c565b60601c845260003661059b603482611c19565b906105a7601436611c19565b926105b493929190611bba565b6105bd91611be4565b60408501525b60808401516001600160a01b0316156107ec57608084015160a11c60011615610618576020808501516000908152600282526040808220608088018051845290845281832033845290935290205490526105c3565b36600061062f86608001516001600160a01b031690565b60608701516001600160a01b03919091169085908561064f826014611c5f565b9261065c93929190611bba565b61066591611c2c565b60601c036106f85760008484886060015160146106829190611c5f565b90896060015160346106949190611c5f565b926106a193929190611bba565b6106aa91611be4565b60001c90508484886060015160346106c29190611c5f565b6106cd928290611bba565b90935091506106dd816034611c5f565b876060018181516106ee9190611c5f565b90525061070e9050565b606086015161070990808587611bba565b915091505b600061072487608001516001600160a01b031690565b6001600160a01b031663ecfcd9303389600001518a602001518f8c6040015189896040518863ffffffff1660e01b81526004016107679796959493929190611c72565b602060405180830381865afa158015610784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a89190611cbd565b90506107b488826114b7565b602080890151600090815260028252604080822060808c0180518452908452818320338452909352902054905297506105c392505050565b600083604001516001600160a01b0316637a7c6a4f3387602001518c87878b6060015190809261081e93929190611bba565b6040518663ffffffff1660e01b815260040161083e959493929190611cd6565b602060405180830381865afa15801561085b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087f9190611cbd565b905061088b86826114b7565b955050505050505b9392505050565b6000336108aa6020860186611a13565b6001600160a01b0316146109055760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d757374206265206d73672e73656e6465720000000000000060448201526064015b60405180910390fd5b6000610915610140860186611d0f565b61092491602091600091611bba565b61092d91611be4565b6000818152600160209081526040808320338452909152902054909150600160801b900460a01b600160a01b16158061099c575060008181526001602090815260408083203384528252808320546003909252909120546001600160801b03918216600160801b909104909116115b156109ab576001915050610893565b6000818152600160208181526040808420338552825292839020835160c08101855281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682850152938201546001600160a01b03169481019490945260028101546060850181905260039091015465ffffffffffff8082166080870152600160301b90910416928401929092525b6001600160a01b03821615610cf05760a082901c60011615610a815760008481526002602090815260408083209483529381528382203383529052919091205490610a3b565b366000610a8f836034611c5f565b610a9d6101408c018c611d0f565b905010158015610ae857506001600160a01b038416610ac06101408c018c611d0f565b8590610acd826014611c5f565b92610ada93929190611bba565b610ae391611c2c565b60601c145b15610c12576000610afd6101408c018c611d0f565b610b08866014611c5f565b90610b14876034611c5f565b92610b2193929190611bba565b610b2a91611be4565b905080610b38856034611c5f565b610b429190611c5f565b610b506101408d018d611d0f565b90501015610bb35760405162461bcd60e51b815260206004820152602a60248201527f706f6c69637944617461206c656e6774682065786365656473207369676e61746044820152690eae4ca40d8cadccee8d60b31b60648201526084016108fc565b610bc16101408c018c611d0f565b610bcc866034611c5f565b9083610bd9886034611c5f565b610be39190611c5f565b92610bf093929190611bba565b9093509150610c00816034611c5f565b610c0a9085611c5f565b935050610c32565b610c206101408b018b611d0f565b610c2d9185918291611bba565b915091505b60006001600160a01b0385166001600160a01b031663c92ce35133898e87876040518663ffffffff1660e01b8152600401610c71959493929190611d56565b6020604051808303816000875af1158015610c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb49190611cbd565b9050610cc088826114b7565b600088815260026020908152604080832098835297815287822033835290529590952054949750610a3b92505050565b60408301516000906001600160a01b0316638e0125d233878b610d176101408f018f611d0f565b610d249189908290611bba565b6040518663ffffffff1660e01b8152600401610d44959493929190611cd6565b6020604051808303816000875af115801561085b573d6000803e3d6000fd5b6001600160a01b03198a16610dba5760405162461bcd60e51b815260206004820152601860248201527f666c61672073686f756c64206e6f7420626520656d707479000000000000000060448201526064016108fc565b33600090815260036020526040812080546001600160801b031691610dde83611e99565b91906101000a8154816001600160801b0302191690836001600160801b031602179055506001600160801b03168b6001600160801b031614610e595760405162461bcd60e51b81526020600482015260146024820152731b9bdb98d9481cda1bdd5b19081899481b995e1d60621b60448201526064016108fc565b6000610e6d8b8b8b8b8b8b8b8b8b8b6113a0565b9050600160a01b6001600160a01b03198c1601610e97573360009081526020819052604090208190555b60005b86811015610f6157610eca888883818110610eb757610eb7611ebf565b905060200201356001600160a01b031690565b6001600160a01b031662282ae03384878786818110610eeb57610eeb611ebf565b9050602002810190610efd9190611d0f565b6040518563ffffffff1660e01b8152600401610f1c9493929190611ed5565b600060405180830381600087803b158015610f3657600080fd5b505af1158015610f4a573d6000803e3d6000fd5b505050508080610f5990611f07565b915050610e9a565b5060405163e9b51de560e01b81526001600160a01b038b169063e9b51de590610f9490339085908a908a90600401611ed5565b600060405180830381600087803b158015610fae57600080fd5b505af1158015610fc2573d6000803e3d6000fd5b50505050600087876000818110610fdb57610fdb611ebf565b9050602002013590506040518060c001604052808e6001600160801b031681526020018d6001600160a01b03191681526020018c6001600160a01b031681526020018281526020018b65ffffffffffff1681526020018a65ffffffffffff16815250600160008481526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160801b0302191690836001600160801b0316021790555060208201518160000160106101000a8154816bffffffffffffffffffffffff021916908360a01c021790555060408201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816002015560808201518160030160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060a08201518160030160066101000a81548165ffffffffffff021916908365ffffffffffff1602179055509050506000600190505b878110156111f05788888281811061117d5761117d611ebf565b905060200201356002600085815260200190815260200160002060008b8b6001866111a89190611c19565b8181106111b7576111b7611ebf565b602090810292909201358352508181019290925260409081016000908120338252909252902055806111e881611f07565b915050611163565b5060408051338152602081018490527fab0f2b94c33903f7ed343b1bcc3baca5e69eb7d007b8c8207232012f6cffef0e910160405180910390a150505050505050505050505050565b60008060008060003660003660003660008c8c60009060109261125e93929190611bba565b61126791611f20565b60801c9a508c8c601090601c9261128093929190611bba565b61128991611f57565b99508c8c601c9060229261129f93929190611bba565b6112a891611f85565b60d01c97508c8c6022906028926112c193929190611bba565b6112ca91611f85565b60d01c96508c8c602890603c926112e393929190611bba565b6112ec91611c2c565b9a9d999c60609b909b1c9b5096999598605c603c8089013589018281019b50810135995081890135890180830199908201359850607c81013501918201965001359350915050565b602081900361134e5761134a61038b8284611be4565b5050565b61134a61135b8284611f20565b60801c611457565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064016108fc565b60008a8a8a8a8a8a8a8a8a8a6040516020016113c59a99989796959493929190611fb3565b6040516020818303038152906040528051906020012090509a9950505050505050505050565b6000818152600160209081526040808320338085529083529281902080546bffffffffffffffffffffffff60801b1916905580519283529082018390527f789770131846de4d1f28418f0f957cdf4fcabe5eccf70067083e20ecece69a3491015b60405180910390a150565b3360008181526003602090815260409182902080546001600160801b03908116600160801b918716918202179091558251938452908301527f22cd1acb7e7a306800a1b2c0ca9b0280187bbc00b7fbf55d38ad6cbf73082aec910161144c565b600081830160601b8260601b81148460601b8214176001600160a01b03848618161517600181146114eb576001925061156d565b6001600160d01b031980851690861681811881831102188686176001600160a01b031617935065ffffffffffff60a01b861690816115305765ffffffffffff60a01b91505b5065ffffffffffff60a01b85168061154e575065ffffffffffff60a01b5b808218908211021880611567575065ffffffffffff60a01b5b92909217915b505092915050565b60008083601f84011261158757600080fd5b50813567ffffffffffffffff81111561159f57600080fd5b6020830191508360208285010111156115b757600080fd5b9250929050565b600080602083850312156115d157600080fd5b823567ffffffffffffffff8111156115e857600080fd5b6115f485828601611575565b90969095509350505050565b60008060006040848603121561161557600080fd5b83359250602084013567ffffffffffffffff81111561163357600080fd5b61163f86828701611575565b9497909650939450505050565b60008060006060848603121561166157600080fd5b833567ffffffffffffffff81111561167857600080fd5b8401610160818703121561168b57600080fd5b95602085013595506040909401359392505050565b6001600160a01b03811681146116b557600080fd5b50565b80356116c3816116a0565b919050565b600080604083850312156116db57600080fd5b8235915060208301356116ed816116a0565b809150509250929050565b80356001600160801b03811681146116c357600080fd5b80356001600160a01b0319811681146116c357600080fd5b803565ffffffffffff811681146116c357600080fd5b60008083601f84011261174f57600080fd5b50813567ffffffffffffffff81111561176757600080fd5b6020830191508360208260051b85010111156115b757600080fd5b60008060008060008060008060008060006101008c8e0312156117a457600080fd5b6117ad8c6116f8565b9a506117bb60208d0161170f565b99506117c960408d016116b8565b98506117d760608d01611727565b97506117e560808d01611727565b965067ffffffffffffffff8060a08e0135111561180157600080fd5b6118118e60a08f01358f0161173d565b909750955060c08d013581101561182757600080fd5b6118378e60c08f01358f01611575565b909550935060e08d013581101561184d57600080fd5b5061185e8d60e08e01358e0161173d565b81935080925050509295989b509295989b9093969950565b8183526000602080850194508260005b858110156118a257813587529582019590820190600101611886565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000808335601e198436030181126118ed57600080fd5b830160208101925035905067ffffffffffffffff81111561190d57600080fd5b8036038213156115b757600080fd5b60008383855260208086019550808560051b8301018460005b8781101561196f57848303601f1901895261195082886118d6565b61195b8582846118ad565b9a86019a9450505090830190600101611935565b5090979650505050505050565b6001600160801b038c1681526001600160a01b03198b1660208201526001600160a01b038a16604082015265ffffffffffff89811660608301528816608082015261010060a082018190526000906119d7838201898b611876565b905082810360c08401526119ec8187896118ad565b905082810360e0840152611a0181858761191c565b9e9d5050505050505050505050505050565b600060208284031215611a2557600080fd5b8135610893816116a0565b600080600060408486031215611a4557600080fd5b8335611a50816116a0565b9250602084013567ffffffffffffffff81111561163357600080fd5b60008060008060008060008060008060e08b8d031215611a8b57600080fd5b611a948b61170f565b995060208b0135611aa4816116a0565b9850611ab260408c01611727565b9750611ac060608c01611727565b965060808b013567ffffffffffffffff80821115611add57600080fd5b611ae98e838f0161173d565b909850965060a08d0135915080821115611b0257600080fd5b611b0e8e838f01611575565b909650945060c08d0135915080821115611b2757600080fd5b50611b348d828e0161173d565b915080935050809150509295989b9194979a5092959850565b600080600060608486031215611b6257600080fd5b83359250602084013591506040840135611b7b816116a0565b809150509250925092565b600060208284031215611b9857600080fd5b5035919050565b600060208284031215611bb157600080fd5b610893826116f8565b60008085851115611bca57600080fd5b83861115611bd757600080fd5b5050820193919092039150565b80356020831015611bfd57600019602084900360031b1b165b92915050565b634e487b7160e01b600052601160045260246000fd5b81810381811115611bfd57611bfd611c03565b6bffffffffffffffffffffffff19813581811691601485101561156d5760149490940360031b84901b1690921692915050565b80820180821115611bfd57611bfd611c03565b600060018060a01b03808a16835280891660208401525086604083015285606083015284608083015260c060a0830152611cb060c0830184866118ad565b9998505050505050505050565b600060208284031215611ccf57600080fd5b5051919050565b60018060a01b0386168152846020820152836040820152608060608201526000611d046080830184866118ad565b979650505050505050565b6000808335601e19843603018112611d2657600080fd5b83018035915067ffffffffffffffff821115611d4157600080fd5b6020019150368190038213156115b757600080fd5b6001600160a01b038616815260208101859052608060408201819052611d8e908201611d81866116b8565b6001600160a01b03169052565b602084013560a08201526000611da760408601866118d6565b6101608060c0860152611dbf6101e0860183856118ad565b9250611dce60608901896118d6565b9250607f19808786030160e0880152611de88585846118ad565b9450610100935060808a013584880152610120915060a08a01358288015261014060c08b01358189015260e08b013584890152848b0135610180890152611e31838c018c6118d6565b9550935081888703016101a0890152611e4b8686866118ad565b9550611e59818c018c6118d6565b955093505080878603016101c08801525050611e768383836118ad565b925050508281036060840152611e8d8185876118ad565b98975050505050505050565b60006001600160801b03808316818103611eb557611eb5611c03565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b60018060a01b0385168152836020820152606060408201526000611efd6060830184866118ad565b9695505050505050565b600060018201611f1957611f19611c03565b5060010190565b6fffffffffffffffffffffffffffffffff19813581811691601085101561156d5760109490940360031b84901b1690921692915050565b6001600160a01b0319813581811691600c85101561156d57600c9490940360031b84901b1690921692915050565b6001600160d01b0319813581811691600685101561156d5760069490940360031b84901b1690921692915050565b6001600160a01b03198b1681526001600160a01b038a16602082015265ffffffffffff89811660408301528816606082015260e060808201819052600090611ffe908301888a611876565b82810360a08401526120118187896118ad565b905082810360c084015261202681858761191c565b9d9c5050505050505050505050505056", + "nonce": "0x1d3" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xac55704b236879e66bd05cb7d6a3f5d0c29fecbe0b33abecf3d353e6a27f80bd", + "transactionIndex": "0x2", + "blockHash": "0xd71ebcaea257f41ffeffc4fae5f415c93e2dbe517fabc5570dcc82ffc5582e3c", + "blockNumber": "0x2b97895", + "from": "0xA02CDdFa44B8C01b4257F54ac1c43F75801E8175", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1df13d", + "gasUsed": "0x1c0a87", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000a02cddfa44b8c01b4257f54ac1c43f75801e8175", + "0x00000000000000000000000022b64229c41429a023549fdab3385893b579327a" + ], + "data": "0x00000000000000000000000000000000000000000000000000126dcebd16268200000000000000000000000000000000000000000000000003254d852c85d3e3000000000000000000000000000000000000000000000060f7789dc7f78a88900000000000000000000000000000000000000000000000000312dfb66f6fad61000000000000000000000000000000000000000000000060f78b0b96b4a0af12", + "blockHash": "0xd71ebcaea257f41ffeffc4fae5f415c93e2dbe517fabc5570dcc82ffc5582e3c", + "blockNumber": "0x2b97895", + "transactionHash": "0xac55704b236879e66bd05cb7d6a3f5d0c29fecbe0b33abecf3d353e6a27f80bd", + "transactionIndex": "0x2", + "logIndex": "0x3", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000020000000080000040000000000000000000200000000000000000000000000000000000000000010000000000200000000000000000000000000000000000000000000000000000002000004000000000000000000001000008000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0xa83efbfe" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1707439906, + "chain": 80001, + "multi": false, + "commit": "60e1432" +} \ No newline at end of file diff --git a/script/DeployModularPermission.s.sol b/script/DeployModularPermission.s.sol new file mode 100644 index 00000000..817f7984 --- /dev/null +++ b/script/DeployModularPermission.s.sol @@ -0,0 +1,44 @@ +pragma solidity ^0.8.0; + +import "src/validator/modularPermission/ModularPermissionValidator.sol"; +import "src/validator/modularPermission/signers/ECDSASigner.sol"; +import "src/validator/modularPermission/policies/GasPolicy.sol"; +import "forge-std/Script.sol"; +import "forge-std/console.sol"; + +contract DeployModularPermission is Script { + address constant EXPECTED_MODULAR_PERMISSION_ADDRESS = 0x965Bea0f8b65aABD1F5148F64654BbAAfB9d2Efa; + address constant EXPECTED_ECDSA_SIGNER_ADDRESS = 0xF9E712F44A360ED8820aD624e41164f74a5a7456; + address constant EXPECTED_GAS_POLICY_ADDRESS = 0x62868E950Efbb336DCFf033598Ee5E602f0a93cD; + + function run() public { + uint256 key = vm.envUint("TESTNET_DEPLOYER_PRIVATE_KEY"); + vm.startBroadcast(key); + + if (EXPECTED_MODULAR_PERMISSION_ADDRESS.code.length == 0) { + console.log("deploying ModularPermissionValidator"); + ModularPermissionValidator validator = new ModularPermissionValidator{salt: 0}(); + console.log("validator address: %s", address(validator)); + } else { + console.log("validator address: %s", address(EXPECTED_MODULAR_PERMISSION_ADDRESS)); + } + + if (EXPECTED_ECDSA_SIGNER_ADDRESS.code.length == 0) { + console.log("deploying ECDSASigner"); + ECDSASigner ecdsaSigner = new ECDSASigner{salt: 0}(); + console.log("ecdsaSigner address: %s", address(ecdsaSigner)); + } else { + console.log("ecdsaSigner address: %s", address(EXPECTED_ECDSA_SIGNER_ADDRESS)); + } + + if (EXPECTED_GAS_POLICY_ADDRESS.code.length == 0) { + console.log("deploying GasPolicy"); + GasPolicy gasPolicy = new GasPolicy{salt: 0}(); + console.log("gasPolicy address: %s", address(gasPolicy)); + } else { + console.log("gasPolicy address: %s", address(EXPECTED_GAS_POLICY_ADDRESS)); + } + + vm.stopBroadcast(); + } +} diff --git a/src/validator/modularPermission/ModularPermissionValidator.sol b/src/validator/modularPermission/ModularPermissionValidator.sol index 267465d7..625ea524 100644 --- a/src/validator/modularPermission/ModularPermissionValidator.sol +++ b/src/validator/modularPermission/ModularPermissionValidator.sol @@ -39,7 +39,6 @@ contract ModularPermissionValidator is IKernelValidator { event NonceRevoked(address kernel, uint256 nonce); function getPermissionId( - uint128 nonce, bytes12 flag, ISigner signer, ValidAfter validAfter, @@ -50,7 +49,6 @@ contract ModularPermissionValidator is IKernelValidator { ) public pure returns (bytes32) { return keccak256( abi.encode( - nonce, flag, signer, ValidAfter.unwrap(validAfter), @@ -117,9 +115,9 @@ contract ModularPermissionValidator is IKernelValidator { bytes[] calldata policyData ) public payable { require(flag != toFlag(0), "flag should not be empty"); - require(nonce == nonces[msg.sender].next, "nonce should be next"); + require(nonce == nonces[msg.sender].next++, "nonce should be next"); bytes32 permissionId = - getPermissionId(nonce, flag, signer, validAfter, validUntil, policy, signerData, policyData); + getPermissionId(flag, signer, validAfter, validUntil, policy, signerData, policyData); if (flag == MAX_FLAG) { priorityPermission[msg.sender] = permissionId; } @@ -165,7 +163,7 @@ contract ModularPermissionValidator is IKernelValidator { bytes32 permissionId = bytes32(_userOp.signature[0:32]); if ( permissions[permissionId][msg.sender].flag & toFlag(1) == toFlag(0) - || permissions[permissionId][msg.sender].nonce > nonces[msg.sender].revoked + || nonces[msg.sender].revoked > permissions[permissionId][msg.sender].nonce ) { return SIG_VALIDATION_FAILED; } diff --git a/test/foundry/validator/modularPermission/ModularPermission.t.sol b/test/foundry/validator/modularPermission/ModularPermission.t.sol index 5cd6c5e6..6b50e6f0 100644 --- a/test/foundry/validator/modularPermission/ModularPermission.t.sol +++ b/test/foundry/validator/modularPermission/ModularPermission.t.sol @@ -52,7 +52,7 @@ contract ModularPermissionE2ETest is KernelTestBase { pd[1] = abi.encode(allowedCaller); return ModularPermissionValidator(address(defaultValidator)).getPermissionId( - 0, MAX_FLAG, signer, ValidAfter.wrap(0), ValidUntil.wrap(0), p, abi.encodePacked(owner), pd + MAX_FLAG, signer, ValidAfter.wrap(0), ValidUntil.wrap(0), p, abi.encodePacked(owner), pd ); } @@ -159,7 +159,6 @@ contract ModularPermissionE2ETest is KernelTestBase { d.pd = new bytes[](1); d.pd[0] = abi.encodePacked(d.domainSeparator, d.typeHash, bytes4(0), uint8(ParamRule.Equal), d.encodeData); bytes32 permissionId = ModularPermissionValidator(address(defaultValidator)).getPermissionId( - 0, MAX_FLAG, //flag signer, ValidAfter.wrap(1), @@ -171,7 +170,7 @@ contract ModularPermissionE2ETest is KernelTestBase { bytes memory data = abi.encodePacked( abi.encodePacked( - uint128(0), // nonce + uint128(1), // nonce MAX_FLAG, //flag uint48(1), //`validAfter d.until, // validUntil @@ -186,7 +185,7 @@ contract ModularPermissionE2ETest is KernelTestBase { (config.nonce, config.flag, config.signer, config.firstPolicy, config.validAfter, config.validUntil) = ModularPermissionValidator(address(defaultValidator)).permissions(permissionId, d.kernel); - assertEq(config.nonce, uint128(0)); + assertEq(config.nonce, uint128(1)); assertEq(config.flag, MAX_FLAG); assertEq(ValidAfter.unwrap(config.validAfter), uint48(1)); assertEq(ValidUntil.unwrap(config.validUntil), ValidUntil.unwrap(d.until)); @@ -229,7 +228,6 @@ contract ModularPermissionE2ETest is KernelTestBase { d.pd = new bytes[](1); d.pd[0] = abi.encodePacked(d.domainSeparator, d.typeHash, bytes4(0), uint8(ParamRule.GreaterThan), d.encodeData); bytes32 permissionId = ModularPermissionValidator(address(defaultValidator)).getPermissionId( - 0, MAX_FLAG, //flag signer, ValidAfter.wrap(1), @@ -241,7 +239,7 @@ contract ModularPermissionE2ETest is KernelTestBase { bytes memory data = abi.encodePacked( abi.encodePacked( - uint128(0), // nonce + uint128(1), // nonce MAX_FLAG, //flag uint48(1), //`validAfter d.until, // validUntil @@ -256,7 +254,7 @@ contract ModularPermissionE2ETest is KernelTestBase { (config.nonce, config.flag, config.signer, config.firstPolicy, config.validAfter, config.validUntil) = ModularPermissionValidator(address(defaultValidator)).permissions(permissionId, d.kernel); - assertEq(config.nonce, uint128(0)); + assertEq(config.nonce, uint128(1)); assertEq(config.flag, MAX_FLAG); assertEq(ValidAfter.unwrap(config.validAfter), uint48(1)); assertEq(ValidUntil.unwrap(config.validUntil), ValidUntil.unwrap(d.until)); @@ -440,7 +438,6 @@ contract ModularPermissionUnitTest is Test { pd[0] = abi.encodePacked("hello policy"); pd[1] = abi.encodePacked("hello policy 2"); bytes32 permissionId = validator.getPermissionId( - 0, MAX_FLAG, //flag mockSigner, ValidAfter.wrap(1), @@ -518,7 +515,6 @@ contract ModularPermissionUnitTest is Test { d.pd = new bytes[](1); d.pd[0] = abi.encodePacked(d.domainSeparator, d.typeHash, bytes4(0), uint8(ParamRule.Equal), d.encodeData); bytes32 permissionId = validator.getPermissionId( - 0, MAX_FLAG, //flag mockSigner, ValidAfter.wrap(1), @@ -612,7 +608,6 @@ contract ModularPermissionUnitTest is Test { pd[0] = abi.encodePacked("hello policy"); pd[1] = abi.encodePacked("hello policy 2"); bytes32 permissionId = validator.getPermissionId( - 0, MAX_FLAG, //flag mockSigner, ValidAfter.wrap(1), @@ -667,7 +662,6 @@ contract ModularPermissionUnitTest is Test { bytes[] memory pd = new bytes[](1); pd[0] = abi.encodePacked("hello policy"); bytes32 permissionId = validator.getPermissionId( - 0, MAX_FLAG, //flag mockSigner, ValidAfter.wrap(1), From 1bc084136172e24047cadf689fed3c2ddd3dd81b Mon Sep 17 00:00:00 2001 From: leekt Date: Fri, 9 Feb 2024 19:29:17 +0900 Subject: [PATCH 28/36] fix: use calldata for sig --- src/validator/modularPermission/policies/MerklePolicy.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/validator/modularPermission/policies/MerklePolicy.sol b/src/validator/modularPermission/policies/MerklePolicy.sol index 96539553..9bbd5d8c 100644 --- a/src/validator/modularPermission/policies/MerklePolicy.sol +++ b/src/validator/modularPermission/policies/MerklePolicy.sol @@ -38,7 +38,7 @@ contract MerklePolicy is IPolicy { ) external payable returns (ValidationData) { bytes calldata callData = userOp.callData; bytes32 root = merkleRoot[msg.sender][permissionId][kernel]; - bytes4 sig = bytes4(userOp.signature[0:4]); + bytes4 sig = bytes4(callData[0:4]); if (sig == Kernel.execute.selector || sig == Kernel.executeDelegateCall.selector) { (Permission calldata permission, bytes32[] calldata merkleProof) = _getPermission(userOp.signature[85:]); bool verifyFailed = _verifyParam(root, callData, permission, merkleProof); From 1d02052cb29d73015dc13476134a10167f670592 Mon Sep 17 00:00:00 2001 From: Sahil Vasava Date: Mon, 12 Feb 2024 23:24:24 +0700 Subject: [PATCH 29/36] fix: proof fetching in MerklePolicy --- .../80001/run-1707741950.json | 33 ++++++++++ .../80001/run-1707741957.json | 65 +++++++++++++++++++ .../80001/run-latest.json | 42 ++++++------ script/DeployModularPermission.s.sol | 10 +++ .../policies/MerklePolicy.sol | 6 +- 5 files changed, 132 insertions(+), 24 deletions(-) create mode 100644 broadcast/DeployModularPermission.s.sol/80001/run-1707741950.json create mode 100644 broadcast/DeployModularPermission.s.sol/80001/run-1707741957.json diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-1707741950.json b/broadcast/DeployModularPermission.s.sol/80001/run-1707741950.json new file mode 100644 index 00000000..81917f1a --- /dev/null +++ b/broadcast/DeployModularPermission.s.sol/80001/run-1707741950.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0x7d2de72251685ec4f433d6479f844c3c688ae894be1a06def804adfb55afc9c6", + "transactionType": "CREATE2", + "contractName": "MerklePolicy", + "contractAddress": "0xb808D75B5ACf6B5513eb816d3980C733ae6Be468", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x146081", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061107f806100206000396000f3fe60806040526004361061003e5760003560e01c8062282ae014610043578063c92ce35114610058578063ecfcd9301461007d578063f2a108001461009d575b600080fd5b6100566100513660046109f7565b6100da565b005b61006b610066366004610a51565b61012a565b60405190815260200160405180910390f35b34801561008957600080fd5b5061006b610098366004610adf565b6102ad565b3480156100a957600080fd5b5061006b6100b8366004610b61565b6000602081815293815260408082208552928152828120909352825290205481565b60006100e96020828486610b9d565b6100f291610bc7565b336000908152602081815260408083209783529681528682206001600160a01b03989098168252969096529390942092909255505050565b6000368161013b6060870187610be6565b336000908152602081815260408083208c845282528083206001600160a01b038e1684529091528120549294509092506101786004828587610b9d565b61018191610c2d565b90506001600160e01b03198116635194544760e01b14806101b257506001600160e01b0319811663b68df16d60e01b145b1561021257863587016020808901358901908101903560006101d88689898787876102bb565b9050801561020157604051633b755d2d60e21b8152600160048201526024015b60405180910390fd5b6000985050505050505050506102a4565b636581952160e11b6001600160e01b031982160161028857863587016020818101913590898101358a0190810190356000610252878a8a888888886104ed565b9050801561027657604051633b755d2d60e21b8152600160048201526024016101f8565b600099505050505050505050506102a4565b604051633b755d2d60e21b8152600060048201526024016101f8565b95945050505050565b60005b979650505050505050565b600080635194544760e01b6102d3600483898b610b9d565b6102dc91610c2d565b6001600160e01b03191614905060006102f86020870187610c5d565b6001600160a01b0316148061033a57506103156020860186610c5d565b6001600160a01b031661032c60246010898b610b9d565b61033591610c78565b60601c145b6103565760405162461bcd60e51b81526004016101f890610cab565b801561039b57604085013561036f60446024898b610b9d565b61037891610bc7565b11156103965760405162461bcd60e51b81526004016101f890610cef565b61041b565b60016103ad60a0870160808801610d5d565b60018111156103be576103be610d38565b1461041b5760405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b60648201526084016101f8565b366000808361042b57602461042e565b60445b808b01358b01602481019450600401359250905061044d83838a6106c7565b6104695760405162461bcd60e51b81526004016101f890610d78565b6104cd878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040518f92506104b291508c90602001610e68565b60405160208183030381529060405280519060200120610950565b6104de5760019450505050506104e3565b505050505b9695505050505050565b6000600487810135880160248101910135825b818110156106b9573683838381811061051b5761051b610f28565b905060200281019061052d9190610f3e565b90503689898481811061054257610542610f28565b90506020028101906105549190610f5e565b905060006105656020830183610c5d565b6001600160a01b031614806105a357506105826020820182610c5d565b6001600160a01b03166105986020840184610c5d565b6001600160a01b0316145b6105bf5760405162461bcd60e51b81526004016101f890610cab565b6040810135602083013511156105e75760405162461bcd60e51b81526004016101f890610cef565b6105fd6105f76040840184610be6565b836106c7565b6106195760405162461bcd60e51b81526004016101f890610d78565b61069288888581811061062e5761062e610f28565b90506020028101906106409190610f74565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508e836040516020016104b29190610e68565b6106a4576001955050505050506102b0565b505080806106b190610fd4565b915050610500565b505050979650505050505050565b60006106d96040830160208401610fed565b6001600160e01b0319166106f1600460008688610b9d565b6106fa91610c2d565b6001600160e01b0319161461071157506000610949565b60005b6107216060840184611008565b905081101561094357366107386060850185611008565b8381811061074857610748610f28565b60600291909101915060009050868661076384356004611051565b9061077085356004611051565b61077b906020611051565b9261078893929190610b9d565b61079191610bc7565b905060006107a56040840160208501611064565b60058111156107b6576107b6610d38565b1480156107c7575081604001358114155b156107d85760009350505050610949565b60016107ea6040840160208501611064565b60058111156107fb576107fb610d38565b14801561080c575081604001358111155b1561081d5760009350505050610949565b600261082f6040840160208501611064565b600581111561084057610840610d38565b148015610851575081604001358110155b156108625760009350505050610949565b60036108746040840160208501611064565b600581111561088557610885610d38565b1480156108955750816040013581105b156108a65760009350505050610949565b60046108b86040840160208501611064565b60058111156108c9576108c9610d38565b1480156108d95750816040013581115b156108ea5760009350505050610949565b60056108fc6040840160208501611064565b600581111561090d5761090d610d38565b14801561091d5750816040013581145b1561092e5760009350505050610949565b5050808061093b90610fd4565b915050610714565b50600190505b9392505050565b600083511561098b5760208401845160051b81015b8151841160051b9384528151602094851852604060002093909101908082106109655750505b5014919050565b80356001600160a01b03811681146109a957600080fd5b919050565b60008083601f8401126109c057600080fd5b50813567ffffffffffffffff8111156109d857600080fd5b6020830191508360208285010111156109f057600080fd5b9250929050565b60008060008060608587031215610a0d57600080fd5b610a1685610992565b935060208501359250604085013567ffffffffffffffff811115610a3957600080fd5b610a45878288016109ae565b95989497509550505050565b600080600080600060808688031215610a6957600080fd5b610a7286610992565b945060208601359350604086013567ffffffffffffffff80821115610a9657600080fd5b90870190610160828a031215610aab57600080fd5b90935060608701359080821115610ac157600080fd5b50610ace888289016109ae565b969995985093965092949392505050565b600080600080600080600060c0888a031215610afa57600080fd5b610b0388610992565b9650610b1160208901610992565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff811115610b4257600080fd5b610b4e8a828b016109ae565b989b979a50959850939692959293505050565b600080600060608486031215610b7657600080fd5b610b7f84610992565b925060208401359150610b9460408501610992565b90509250925092565b60008085851115610bad57600080fd5b83861115610bba57600080fd5b5050820193919092039150565b80356020831015610be057600019602084900360031b1b165b92915050565b6000808335601e19843603018112610bfd57600080fd5b83018035915067ffffffffffffffff821115610c1857600080fd5b6020019150368190038213156109f057600080fd5b6001600160e01b03198135818116916004851015610c555780818660040360031b1b83161692505b505092915050565b600060208284031215610c6f57600080fd5b61094982610992565b6bffffffffffffffffffffffff198135818116916014851015610c555760149490940360031b84901b1690921692915050565b60208082526024908201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6040820152630c2e8c6d60e31b606082015260800190565b60208082526029908201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460408201526808195e18d95959195960ba1b606082015260800190565b634e487b7160e01b600052602160045260246000fd5b8035600281106109a957600080fd5b600060208284031215610d6f57600080fd5b61094982610d4e565b60208082526033908201527f53657373696f6e4b657956616c696461746f723a207065726d697373696f6e206040820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b606082015260800190565b80356001600160e01b0319811681146109a957600080fd5b8035600681106109a957600080fd5b8183526000602080850194508260005b85811015610e495781358752610e19838301610de3565b60068110610e2957610e29610d38565b878401526040828101359088015260609687019690910190600101610e02565b509495945050505050565b60028110610e6457610e64610d38565b9052565b602081526001600160a01b03610e7d83610992565b16602082015263ffffffff60e01b610e9760208401610dcb565b1660408201526040820135606082015260006060830135601e19843603018112610ec057600080fd5b830160208101903567ffffffffffffffff811115610edd57600080fd5b606081023603821315610eef57600080fd5b60a06080850152610f0460c085018284610df2565b915050610f1360808501610d4e565b610f2060a0850182610e54565b509392505050565b634e487b7160e01b600052603260045260246000fd5b60008235605e19833603018112610f5457600080fd5b9190910192915050565b60008235609e19833603018112610f5457600080fd5b6000808335601e19843603018112610f8b57600080fd5b83018035915067ffffffffffffffff821115610fa657600080fd5b6020019150600581901b36038213156109f057600080fd5b634e487b7160e01b600052601160045260246000fd5b600060018201610fe657610fe6610fbe565b5060010190565b600060208284031215610fff57600080fd5b61094982610dcb565b6000808335601e1984360301811261101f57600080fd5b83018035915067ffffffffffffffff82111561103a57600080fd5b60200191506060810236038213156109f057600080fd5b80820180821115610be057610be0610fbe565b60006020828403121561107657600080fd5b61094982610de356", + "nonce": "0x1d4" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x7d2de72251685ec4f433d6479f844c3c688ae894be1a06def804adfb55afc9c6" + ], + "returns": {}, + "timestamp": 1707741950, + "chain": 80001, + "multi": false, + "commit": "1bc0841" +} \ No newline at end of file diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-1707741957.json b/broadcast/DeployModularPermission.s.sol/80001/run-1707741957.json new file mode 100644 index 00000000..37e1304e --- /dev/null +++ b/broadcast/DeployModularPermission.s.sol/80001/run-1707741957.json @@ -0,0 +1,65 @@ +{ + "transactions": [ + { + "hash": "0x7d2de72251685ec4f433d6479f844c3c688ae894be1a06def804adfb55afc9c6", + "transactionType": "CREATE2", + "contractName": "MerklePolicy", + "contractAddress": "0xb808D75B5ACf6B5513eb816d3980C733ae6Be468", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x146081", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061107f806100206000396000f3fe60806040526004361061003e5760003560e01c8062282ae014610043578063c92ce35114610058578063ecfcd9301461007d578063f2a108001461009d575b600080fd5b6100566100513660046109f7565b6100da565b005b61006b610066366004610a51565b61012a565b60405190815260200160405180910390f35b34801561008957600080fd5b5061006b610098366004610adf565b6102ad565b3480156100a957600080fd5b5061006b6100b8366004610b61565b6000602081815293815260408082208552928152828120909352825290205481565b60006100e96020828486610b9d565b6100f291610bc7565b336000908152602081815260408083209783529681528682206001600160a01b03989098168252969096529390942092909255505050565b6000368161013b6060870187610be6565b336000908152602081815260408083208c845282528083206001600160a01b038e1684529091528120549294509092506101786004828587610b9d565b61018191610c2d565b90506001600160e01b03198116635194544760e01b14806101b257506001600160e01b0319811663b68df16d60e01b145b1561021257863587016020808901358901908101903560006101d88689898787876102bb565b9050801561020157604051633b755d2d60e21b8152600160048201526024015b60405180910390fd5b6000985050505050505050506102a4565b636581952160e11b6001600160e01b031982160161028857863587016020818101913590898101358a0190810190356000610252878a8a888888886104ed565b9050801561027657604051633b755d2d60e21b8152600160048201526024016101f8565b600099505050505050505050506102a4565b604051633b755d2d60e21b8152600060048201526024016101f8565b95945050505050565b60005b979650505050505050565b600080635194544760e01b6102d3600483898b610b9d565b6102dc91610c2d565b6001600160e01b03191614905060006102f86020870187610c5d565b6001600160a01b0316148061033a57506103156020860186610c5d565b6001600160a01b031661032c60246010898b610b9d565b61033591610c78565b60601c145b6103565760405162461bcd60e51b81526004016101f890610cab565b801561039b57604085013561036f60446024898b610b9d565b61037891610bc7565b11156103965760405162461bcd60e51b81526004016101f890610cef565b61041b565b60016103ad60a0870160808801610d5d565b60018111156103be576103be610d38565b1461041b5760405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b60648201526084016101f8565b366000808361042b57602461042e565b60445b808b01358b01602481019450600401359250905061044d83838a6106c7565b6104695760405162461bcd60e51b81526004016101f890610d78565b6104cd878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040518f92506104b291508c90602001610e68565b60405160208183030381529060405280519060200120610950565b6104de5760019450505050506104e3565b505050505b9695505050505050565b6000600487810135880160248101910135825b818110156106b9573683838381811061051b5761051b610f28565b905060200281019061052d9190610f3e565b90503689898481811061054257610542610f28565b90506020028101906105549190610f5e565b905060006105656020830183610c5d565b6001600160a01b031614806105a357506105826020820182610c5d565b6001600160a01b03166105986020840184610c5d565b6001600160a01b0316145b6105bf5760405162461bcd60e51b81526004016101f890610cab565b6040810135602083013511156105e75760405162461bcd60e51b81526004016101f890610cef565b6105fd6105f76040840184610be6565b836106c7565b6106195760405162461bcd60e51b81526004016101f890610d78565b61069288888581811061062e5761062e610f28565b90506020028101906106409190610f74565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508e836040516020016104b29190610e68565b6106a4576001955050505050506102b0565b505080806106b190610fd4565b915050610500565b505050979650505050505050565b60006106d96040830160208401610fed565b6001600160e01b0319166106f1600460008688610b9d565b6106fa91610c2d565b6001600160e01b0319161461071157506000610949565b60005b6107216060840184611008565b905081101561094357366107386060850185611008565b8381811061074857610748610f28565b60600291909101915060009050868661076384356004611051565b9061077085356004611051565b61077b906020611051565b9261078893929190610b9d565b61079191610bc7565b905060006107a56040840160208501611064565b60058111156107b6576107b6610d38565b1480156107c7575081604001358114155b156107d85760009350505050610949565b60016107ea6040840160208501611064565b60058111156107fb576107fb610d38565b14801561080c575081604001358111155b1561081d5760009350505050610949565b600261082f6040840160208501611064565b600581111561084057610840610d38565b148015610851575081604001358110155b156108625760009350505050610949565b60036108746040840160208501611064565b600581111561088557610885610d38565b1480156108955750816040013581105b156108a65760009350505050610949565b60046108b86040840160208501611064565b60058111156108c9576108c9610d38565b1480156108d95750816040013581115b156108ea5760009350505050610949565b60056108fc6040840160208501611064565b600581111561090d5761090d610d38565b14801561091d5750816040013581145b1561092e5760009350505050610949565b5050808061093b90610fd4565b915050610714565b50600190505b9392505050565b600083511561098b5760208401845160051b81015b8151841160051b9384528151602094851852604060002093909101908082106109655750505b5014919050565b80356001600160a01b03811681146109a957600080fd5b919050565b60008083601f8401126109c057600080fd5b50813567ffffffffffffffff8111156109d857600080fd5b6020830191508360208285010111156109f057600080fd5b9250929050565b60008060008060608587031215610a0d57600080fd5b610a1685610992565b935060208501359250604085013567ffffffffffffffff811115610a3957600080fd5b610a45878288016109ae565b95989497509550505050565b600080600080600060808688031215610a6957600080fd5b610a7286610992565b945060208601359350604086013567ffffffffffffffff80821115610a9657600080fd5b90870190610160828a031215610aab57600080fd5b90935060608701359080821115610ac157600080fd5b50610ace888289016109ae565b969995985093965092949392505050565b600080600080600080600060c0888a031215610afa57600080fd5b610b0388610992565b9650610b1160208901610992565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff811115610b4257600080fd5b610b4e8a828b016109ae565b989b979a50959850939692959293505050565b600080600060608486031215610b7657600080fd5b610b7f84610992565b925060208401359150610b9460408501610992565b90509250925092565b60008085851115610bad57600080fd5b83861115610bba57600080fd5b5050820193919092039150565b80356020831015610be057600019602084900360031b1b165b92915050565b6000808335601e19843603018112610bfd57600080fd5b83018035915067ffffffffffffffff821115610c1857600080fd5b6020019150368190038213156109f057600080fd5b6001600160e01b03198135818116916004851015610c555780818660040360031b1b83161692505b505092915050565b600060208284031215610c6f57600080fd5b61094982610992565b6bffffffffffffffffffffffff198135818116916014851015610c555760149490940360031b84901b1690921692915050565b60208082526024908201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6040820152630c2e8c6d60e31b606082015260800190565b60208082526029908201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460408201526808195e18d95959195960ba1b606082015260800190565b634e487b7160e01b600052602160045260246000fd5b8035600281106109a957600080fd5b600060208284031215610d6f57600080fd5b61094982610d4e565b60208082526033908201527f53657373696f6e4b657956616c696461746f723a207065726d697373696f6e206040820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b606082015260800190565b80356001600160e01b0319811681146109a957600080fd5b8035600681106109a957600080fd5b8183526000602080850194508260005b85811015610e495781358752610e19838301610de3565b60068110610e2957610e29610d38565b878401526040828101359088015260609687019690910190600101610e02565b509495945050505050565b60028110610e6457610e64610d38565b9052565b602081526001600160a01b03610e7d83610992565b16602082015263ffffffff60e01b610e9760208401610dcb565b1660408201526040820135606082015260006060830135601e19843603018112610ec057600080fd5b830160208101903567ffffffffffffffff811115610edd57600080fd5b606081023603821315610eef57600080fd5b60a06080850152610f0460c085018284610df2565b915050610f1360808501610d4e565b610f2060a0850182610e54565b509392505050565b634e487b7160e01b600052603260045260246000fd5b60008235605e19833603018112610f5457600080fd5b9190910192915050565b60008235609e19833603018112610f5457600080fd5b6000808335601e19843603018112610f8b57600080fd5b83018035915067ffffffffffffffff821115610fa657600080fd5b6020019150600581901b36038213156109f057600080fd5b634e487b7160e01b600052601160045260246000fd5b600060018201610fe657610fe6610fbe565b5060010190565b600060208284031215610fff57600080fd5b61094982610dcb565b6000808335601e1984360301811261101f57600080fd5b83018035915067ffffffffffffffff82111561103a57600080fd5b60200191506060810236038213156109f057600080fd5b80820180821115610be057610be0610fbe565b60006020828403121561107657600080fd5b61094982610de356", + "nonce": "0x1d4" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x7d2de72251685ec4f433d6479f844c3c688ae894be1a06def804adfb55afc9c6", + "transactionIndex": "0x2", + "blockHash": "0x51981d91608b9c200c0543c6fc34f6ccaf102e0ab0fdcca6ecda0e50341ce937", + "blockNumber": "0x2bb5ecf", + "from": "0xA02CDdFa44B8C01b4257F54ac1c43F75801E8175", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1221f2", + "gasUsed": "0xec1b2", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000a02cddfa44b8c01b4257f54ac1c43f75801e8175", + "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" + ], + "data": "0x0000000000000000000000000000000000000000000000000005275847dfae000000000000000000000000000000000000000000000000000312dfbb15c6ccf10000000000000000000000000000000000000000000023945322b694fe94e60b000000000000000000000000000000000000000000000000030db862cde71ef10000000000000000000000000000000000000000000023945327dded4674940b", + "blockHash": "0x51981d91608b9c200c0543c6fc34f6ccaf102e0ab0fdcca6ecda0e50341ce937", + "blockNumber": "0x2bb5ecf", + "transactionHash": "0x7d2de72251685ec4f433d6479f844c3c688ae894be1a06def804adfb55afc9c6", + "transactionIndex": "0x2", + "logIndex": "0x8", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000020000000080000040000000000000000000000000000000000000000000000000000000000000000000000000200000000000000020000000000000000001000000000000000000000000004000000000000000000001000008000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f0f" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1707741957, + "chain": 80001, + "multi": false, + "commit": "1bc0841" +} \ No newline at end of file diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-latest.json b/broadcast/DeployModularPermission.s.sol/80001/run-latest.json index b2e434f5..37e1304e 100644 --- a/broadcast/DeployModularPermission.s.sol/80001/run-latest.json +++ b/broadcast/DeployModularPermission.s.sol/80001/run-latest.json @@ -1,20 +1,20 @@ { "transactions": [ { - "hash": "0xac55704b236879e66bd05cb7d6a3f5d0c29fecbe0b33abecf3d353e6a27f80bd", + "hash": "0x7d2de72251685ec4f433d6479f844c3c688ae894be1a06def804adfb55afc9c6", "transactionType": "CREATE2", - "contractName": "ModularPermissionValidator", - "contractAddress": "0x965Bea0f8b65aABD1F5148F64654BbAAfB9d2Efa", + "contractName": "MerklePolicy", + "contractAddress": "0xb808D75B5ACf6B5513eb816d3980C733ae6Be468", "function": null, "arguments": null, "transaction": { "type": "0x00", "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x28ffa2", + "gas": "0x146081", "value": "0x0", - "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50612037806100206000396000f3fe6080604052600436106100dd5760003560e01c80638fc925aa1161007f578063b66bd1d211610059578063b66bd1d214610312578063d4085e811461033f578063e89005c71461037d578063ee87c2951461039057600080fd5b80638fc925aa146102bc5780639ea9bd59146102cf578063b52e2c7a146102f257600080fd5b80633ec50c6c116100bb5780633ec50c6c1461013d578063511079bc1461021157806365b8de2e146102245780637ecebe001461025b57600080fd5b80630c959556146100e2578063333daf92146100f75780633a871cdd1461012a575b600080fd5b6100f56100f03660046115be565b6103a3565b005b34801561010357600080fd5b50610117610112366004611600565b6103f6565b6040519081526020015b60405180910390f35b61011761013836600461164c565b61089a565b34801561014957600080fd5b506101bb6101583660046116c8565b6001602081815260009384526040808520909152918352912080549181015460028201546003909201546001600160801b03841693600160801b900460a01b926001600160a01b03909216919065ffffffffffff80821691600160301b90041686565b604080516001600160801b0390971687526001600160a01b031990951660208701526001600160a01b0390931693850193909352606084015265ffffffffffff91821660808401521660a082015260c001610121565b6100f561021f366004611782565b610d63565b34801561023057600080fd5b5061024461023f3660046115be565b611239565b6040516101219b9a9998979695949392919061197c565b34801561026757600080fd5b5061029c610276366004611a13565b6003602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610121565b6100f56102ca3660046115be565b611334565b6102e26102dd366004611a30565b611363565b6040519015158152602001610121565b3480156102fe57600080fd5b5061011761030d366004611a6c565b6113a0565b34801561031e57600080fd5b5061011761032d366004611a13565b60006020819052908152604090205481565b34801561034b57600080fd5b5061011761035a366004611b4d565b600260209081526000938452604080852082529284528284209052825290205481565b6100f561038b366004611b86565b6113eb565b6100f561039e366004611b9f565b611457565b60008060008060003660003660003660006103be8d8d611239565b9a509a509a509a509a509a509a509a509a509a509a506103e78b8b8b8b8b8b8b8b8b8b8b610d63565b50505050505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810182905261042e602060008587611bba565b61043791611be4565b602080830182905260009182526001815260408083203384528252808320546003909252909120546001600160801b03918216600160801b90910490911611806104aa575060208181015160009081526001825260408082203383529092522054600160801b900460a01b600160a11b16155b156104b9576001915050610893565b6020818101516000908152600180835260408083203384528452808320815160c08101835281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682880152938201546001600160a01b0316928101929092526002810154606080840191825260039092015465ffffffffffff808216608080870191909152600160301b9092041694840194909452908601849052519185019190915291860190601f1986019036610574601482611c19565b61057f928290611bba565b61058891611c2c565b60601c845260003661059b603482611c19565b906105a7601436611c19565b926105b493929190611bba565b6105bd91611be4565b60408501525b60808401516001600160a01b0316156107ec57608084015160a11c60011615610618576020808501516000908152600282526040808220608088018051845290845281832033845290935290205490526105c3565b36600061062f86608001516001600160a01b031690565b60608701516001600160a01b03919091169085908561064f826014611c5f565b9261065c93929190611bba565b61066591611c2c565b60601c036106f85760008484886060015160146106829190611c5f565b90896060015160346106949190611c5f565b926106a193929190611bba565b6106aa91611be4565b60001c90508484886060015160346106c29190611c5f565b6106cd928290611bba565b90935091506106dd816034611c5f565b876060018181516106ee9190611c5f565b90525061070e9050565b606086015161070990808587611bba565b915091505b600061072487608001516001600160a01b031690565b6001600160a01b031663ecfcd9303389600001518a602001518f8c6040015189896040518863ffffffff1660e01b81526004016107679796959493929190611c72565b602060405180830381865afa158015610784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a89190611cbd565b90506107b488826114b7565b602080890151600090815260028252604080822060808c0180518452908452818320338452909352902054905297506105c392505050565b600083604001516001600160a01b0316637a7c6a4f3387602001518c87878b6060015190809261081e93929190611bba565b6040518663ffffffff1660e01b815260040161083e959493929190611cd6565b602060405180830381865afa15801561085b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087f9190611cbd565b905061088b86826114b7565b955050505050505b9392505050565b6000336108aa6020860186611a13565b6001600160a01b0316146109055760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d757374206265206d73672e73656e6465720000000000000060448201526064015b60405180910390fd5b6000610915610140860186611d0f565b61092491602091600091611bba565b61092d91611be4565b6000818152600160209081526040808320338452909152902054909150600160801b900460a01b600160a01b16158061099c575060008181526001602090815260408083203384528252808320546003909252909120546001600160801b03918216600160801b909104909116115b156109ab576001915050610893565b6000818152600160208181526040808420338552825292839020835160c08101855281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682850152938201546001600160a01b03169481019490945260028101546060850181905260039091015465ffffffffffff8082166080870152600160301b90910416928401929092525b6001600160a01b03821615610cf05760a082901c60011615610a815760008481526002602090815260408083209483529381528382203383529052919091205490610a3b565b366000610a8f836034611c5f565b610a9d6101408c018c611d0f565b905010158015610ae857506001600160a01b038416610ac06101408c018c611d0f565b8590610acd826014611c5f565b92610ada93929190611bba565b610ae391611c2c565b60601c145b15610c12576000610afd6101408c018c611d0f565b610b08866014611c5f565b90610b14876034611c5f565b92610b2193929190611bba565b610b2a91611be4565b905080610b38856034611c5f565b610b429190611c5f565b610b506101408d018d611d0f565b90501015610bb35760405162461bcd60e51b815260206004820152602a60248201527f706f6c69637944617461206c656e6774682065786365656473207369676e61746044820152690eae4ca40d8cadccee8d60b31b60648201526084016108fc565b610bc16101408c018c611d0f565b610bcc866034611c5f565b9083610bd9886034611c5f565b610be39190611c5f565b92610bf093929190611bba565b9093509150610c00816034611c5f565b610c0a9085611c5f565b935050610c32565b610c206101408b018b611d0f565b610c2d9185918291611bba565b915091505b60006001600160a01b0385166001600160a01b031663c92ce35133898e87876040518663ffffffff1660e01b8152600401610c71959493929190611d56565b6020604051808303816000875af1158015610c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb49190611cbd565b9050610cc088826114b7565b600088815260026020908152604080832098835297815287822033835290529590952054949750610a3b92505050565b60408301516000906001600160a01b0316638e0125d233878b610d176101408f018f611d0f565b610d249189908290611bba565b6040518663ffffffff1660e01b8152600401610d44959493929190611cd6565b6020604051808303816000875af115801561085b573d6000803e3d6000fd5b6001600160a01b03198a16610dba5760405162461bcd60e51b815260206004820152601860248201527f666c61672073686f756c64206e6f7420626520656d707479000000000000000060448201526064016108fc565b33600090815260036020526040812080546001600160801b031691610dde83611e99565b91906101000a8154816001600160801b0302191690836001600160801b031602179055506001600160801b03168b6001600160801b031614610e595760405162461bcd60e51b81526020600482015260146024820152731b9bdb98d9481cda1bdd5b19081899481b995e1d60621b60448201526064016108fc565b6000610e6d8b8b8b8b8b8b8b8b8b8b6113a0565b9050600160a01b6001600160a01b03198c1601610e97573360009081526020819052604090208190555b60005b86811015610f6157610eca888883818110610eb757610eb7611ebf565b905060200201356001600160a01b031690565b6001600160a01b031662282ae03384878786818110610eeb57610eeb611ebf565b9050602002810190610efd9190611d0f565b6040518563ffffffff1660e01b8152600401610f1c9493929190611ed5565b600060405180830381600087803b158015610f3657600080fd5b505af1158015610f4a573d6000803e3d6000fd5b505050508080610f5990611f07565b915050610e9a565b5060405163e9b51de560e01b81526001600160a01b038b169063e9b51de590610f9490339085908a908a90600401611ed5565b600060405180830381600087803b158015610fae57600080fd5b505af1158015610fc2573d6000803e3d6000fd5b50505050600087876000818110610fdb57610fdb611ebf565b9050602002013590506040518060c001604052808e6001600160801b031681526020018d6001600160a01b03191681526020018c6001600160a01b031681526020018281526020018b65ffffffffffff1681526020018a65ffffffffffff16815250600160008481526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160801b0302191690836001600160801b0316021790555060208201518160000160106101000a8154816bffffffffffffffffffffffff021916908360a01c021790555060408201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816002015560808201518160030160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060a08201518160030160066101000a81548165ffffffffffff021916908365ffffffffffff1602179055509050506000600190505b878110156111f05788888281811061117d5761117d611ebf565b905060200201356002600085815260200190815260200160002060008b8b6001866111a89190611c19565b8181106111b7576111b7611ebf565b602090810292909201358352508181019290925260409081016000908120338252909252902055806111e881611f07565b915050611163565b5060408051338152602081018490527fab0f2b94c33903f7ed343b1bcc3baca5e69eb7d007b8c8207232012f6cffef0e910160405180910390a150505050505050505050505050565b60008060008060003660003660003660008c8c60009060109261125e93929190611bba565b61126791611f20565b60801c9a508c8c601090601c9261128093929190611bba565b61128991611f57565b99508c8c601c9060229261129f93929190611bba565b6112a891611f85565b60d01c97508c8c6022906028926112c193929190611bba565b6112ca91611f85565b60d01c96508c8c602890603c926112e393929190611bba565b6112ec91611c2c565b9a9d999c60609b909b1c9b5096999598605c603c8089013589018281019b50810135995081890135890180830199908201359850607c81013501918201965001359350915050565b602081900361134e5761134a61038b8284611be4565b5050565b61134a61135b8284611f20565b60801c611457565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064016108fc565b60008a8a8a8a8a8a8a8a8a8a6040516020016113c59a99989796959493929190611fb3565b6040516020818303038152906040528051906020012090509a9950505050505050505050565b6000818152600160209081526040808320338085529083529281902080546bffffffffffffffffffffffff60801b1916905580519283529082018390527f789770131846de4d1f28418f0f957cdf4fcabe5eccf70067083e20ecece69a3491015b60405180910390a150565b3360008181526003602090815260409182902080546001600160801b03908116600160801b918716918202179091558251938452908301527f22cd1acb7e7a306800a1b2c0ca9b0280187bbc00b7fbf55d38ad6cbf73082aec910161144c565b600081830160601b8260601b81148460601b8214176001600160a01b03848618161517600181146114eb576001925061156d565b6001600160d01b031980851690861681811881831102188686176001600160a01b031617935065ffffffffffff60a01b861690816115305765ffffffffffff60a01b91505b5065ffffffffffff60a01b85168061154e575065ffffffffffff60a01b5b808218908211021880611567575065ffffffffffff60a01b5b92909217915b505092915050565b60008083601f84011261158757600080fd5b50813567ffffffffffffffff81111561159f57600080fd5b6020830191508360208285010111156115b757600080fd5b9250929050565b600080602083850312156115d157600080fd5b823567ffffffffffffffff8111156115e857600080fd5b6115f485828601611575565b90969095509350505050565b60008060006040848603121561161557600080fd5b83359250602084013567ffffffffffffffff81111561163357600080fd5b61163f86828701611575565b9497909650939450505050565b60008060006060848603121561166157600080fd5b833567ffffffffffffffff81111561167857600080fd5b8401610160818703121561168b57600080fd5b95602085013595506040909401359392505050565b6001600160a01b03811681146116b557600080fd5b50565b80356116c3816116a0565b919050565b600080604083850312156116db57600080fd5b8235915060208301356116ed816116a0565b809150509250929050565b80356001600160801b03811681146116c357600080fd5b80356001600160a01b0319811681146116c357600080fd5b803565ffffffffffff811681146116c357600080fd5b60008083601f84011261174f57600080fd5b50813567ffffffffffffffff81111561176757600080fd5b6020830191508360208260051b85010111156115b757600080fd5b60008060008060008060008060008060006101008c8e0312156117a457600080fd5b6117ad8c6116f8565b9a506117bb60208d0161170f565b99506117c960408d016116b8565b98506117d760608d01611727565b97506117e560808d01611727565b965067ffffffffffffffff8060a08e0135111561180157600080fd5b6118118e60a08f01358f0161173d565b909750955060c08d013581101561182757600080fd5b6118378e60c08f01358f01611575565b909550935060e08d013581101561184d57600080fd5b5061185e8d60e08e01358e0161173d565b81935080925050509295989b509295989b9093969950565b8183526000602080850194508260005b858110156118a257813587529582019590820190600101611886565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000808335601e198436030181126118ed57600080fd5b830160208101925035905067ffffffffffffffff81111561190d57600080fd5b8036038213156115b757600080fd5b60008383855260208086019550808560051b8301018460005b8781101561196f57848303601f1901895261195082886118d6565b61195b8582846118ad565b9a86019a9450505090830190600101611935565b5090979650505050505050565b6001600160801b038c1681526001600160a01b03198b1660208201526001600160a01b038a16604082015265ffffffffffff89811660608301528816608082015261010060a082018190526000906119d7838201898b611876565b905082810360c08401526119ec8187896118ad565b905082810360e0840152611a0181858761191c565b9e9d5050505050505050505050505050565b600060208284031215611a2557600080fd5b8135610893816116a0565b600080600060408486031215611a4557600080fd5b8335611a50816116a0565b9250602084013567ffffffffffffffff81111561163357600080fd5b60008060008060008060008060008060e08b8d031215611a8b57600080fd5b611a948b61170f565b995060208b0135611aa4816116a0565b9850611ab260408c01611727565b9750611ac060608c01611727565b965060808b013567ffffffffffffffff80821115611add57600080fd5b611ae98e838f0161173d565b909850965060a08d0135915080821115611b0257600080fd5b611b0e8e838f01611575565b909650945060c08d0135915080821115611b2757600080fd5b50611b348d828e0161173d565b915080935050809150509295989b9194979a5092959850565b600080600060608486031215611b6257600080fd5b83359250602084013591506040840135611b7b816116a0565b809150509250925092565b600060208284031215611b9857600080fd5b5035919050565b600060208284031215611bb157600080fd5b610893826116f8565b60008085851115611bca57600080fd5b83861115611bd757600080fd5b5050820193919092039150565b80356020831015611bfd57600019602084900360031b1b165b92915050565b634e487b7160e01b600052601160045260246000fd5b81810381811115611bfd57611bfd611c03565b6bffffffffffffffffffffffff19813581811691601485101561156d5760149490940360031b84901b1690921692915050565b80820180821115611bfd57611bfd611c03565b600060018060a01b03808a16835280891660208401525086604083015285606083015284608083015260c060a0830152611cb060c0830184866118ad565b9998505050505050505050565b600060208284031215611ccf57600080fd5b5051919050565b60018060a01b0386168152846020820152836040820152608060608201526000611d046080830184866118ad565b979650505050505050565b6000808335601e19843603018112611d2657600080fd5b83018035915067ffffffffffffffff821115611d4157600080fd5b6020019150368190038213156115b757600080fd5b6001600160a01b038616815260208101859052608060408201819052611d8e908201611d81866116b8565b6001600160a01b03169052565b602084013560a08201526000611da760408601866118d6565b6101608060c0860152611dbf6101e0860183856118ad565b9250611dce60608901896118d6565b9250607f19808786030160e0880152611de88585846118ad565b9450610100935060808a013584880152610120915060a08a01358288015261014060c08b01358189015260e08b013584890152848b0135610180890152611e31838c018c6118d6565b9550935081888703016101a0890152611e4b8686866118ad565b9550611e59818c018c6118d6565b955093505080878603016101c08801525050611e768383836118ad565b925050508281036060840152611e8d8185876118ad565b98975050505050505050565b60006001600160801b03808316818103611eb557611eb5611c03565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b60018060a01b0385168152836020820152606060408201526000611efd6060830184866118ad565b9695505050505050565b600060018201611f1957611f19611c03565b5060010190565b6fffffffffffffffffffffffffffffffff19813581811691601085101561156d5760109490940360031b84901b1690921692915050565b6001600160a01b0319813581811691600c85101561156d57600c9490940360031b84901b1690921692915050565b6001600160d01b0319813581811691600685101561156d5760069490940360031b84901b1690921692915050565b6001600160a01b03198b1681526001600160a01b038a16602082015265ffffffffffff89811660408301528816606082015260e060808201819052600090611ffe908301888a611876565b82810360a08401526120118187896118ad565b905082810360c084015261202681858761191c565b9d9c5050505050505050505050505056", - "nonce": "0x1d3" + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061107f806100206000396000f3fe60806040526004361061003e5760003560e01c8062282ae014610043578063c92ce35114610058578063ecfcd9301461007d578063f2a108001461009d575b600080fd5b6100566100513660046109f7565b6100da565b005b61006b610066366004610a51565b61012a565b60405190815260200160405180910390f35b34801561008957600080fd5b5061006b610098366004610adf565b6102ad565b3480156100a957600080fd5b5061006b6100b8366004610b61565b6000602081815293815260408082208552928152828120909352825290205481565b60006100e96020828486610b9d565b6100f291610bc7565b336000908152602081815260408083209783529681528682206001600160a01b03989098168252969096529390942092909255505050565b6000368161013b6060870187610be6565b336000908152602081815260408083208c845282528083206001600160a01b038e1684529091528120549294509092506101786004828587610b9d565b61018191610c2d565b90506001600160e01b03198116635194544760e01b14806101b257506001600160e01b0319811663b68df16d60e01b145b1561021257863587016020808901358901908101903560006101d88689898787876102bb565b9050801561020157604051633b755d2d60e21b8152600160048201526024015b60405180910390fd5b6000985050505050505050506102a4565b636581952160e11b6001600160e01b031982160161028857863587016020818101913590898101358a0190810190356000610252878a8a888888886104ed565b9050801561027657604051633b755d2d60e21b8152600160048201526024016101f8565b600099505050505050505050506102a4565b604051633b755d2d60e21b8152600060048201526024016101f8565b95945050505050565b60005b979650505050505050565b600080635194544760e01b6102d3600483898b610b9d565b6102dc91610c2d565b6001600160e01b03191614905060006102f86020870187610c5d565b6001600160a01b0316148061033a57506103156020860186610c5d565b6001600160a01b031661032c60246010898b610b9d565b61033591610c78565b60601c145b6103565760405162461bcd60e51b81526004016101f890610cab565b801561039b57604085013561036f60446024898b610b9d565b61037891610bc7565b11156103965760405162461bcd60e51b81526004016101f890610cef565b61041b565b60016103ad60a0870160808801610d5d565b60018111156103be576103be610d38565b1461041b5760405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b60648201526084016101f8565b366000808361042b57602461042e565b60445b808b01358b01602481019450600401359250905061044d83838a6106c7565b6104695760405162461bcd60e51b81526004016101f890610d78565b6104cd878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040518f92506104b291508c90602001610e68565b60405160208183030381529060405280519060200120610950565b6104de5760019450505050506104e3565b505050505b9695505050505050565b6000600487810135880160248101910135825b818110156106b9573683838381811061051b5761051b610f28565b905060200281019061052d9190610f3e565b90503689898481811061054257610542610f28565b90506020028101906105549190610f5e565b905060006105656020830183610c5d565b6001600160a01b031614806105a357506105826020820182610c5d565b6001600160a01b03166105986020840184610c5d565b6001600160a01b0316145b6105bf5760405162461bcd60e51b81526004016101f890610cab565b6040810135602083013511156105e75760405162461bcd60e51b81526004016101f890610cef565b6105fd6105f76040840184610be6565b836106c7565b6106195760405162461bcd60e51b81526004016101f890610d78565b61069288888581811061062e5761062e610f28565b90506020028101906106409190610f74565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508e836040516020016104b29190610e68565b6106a4576001955050505050506102b0565b505080806106b190610fd4565b915050610500565b505050979650505050505050565b60006106d96040830160208401610fed565b6001600160e01b0319166106f1600460008688610b9d565b6106fa91610c2d565b6001600160e01b0319161461071157506000610949565b60005b6107216060840184611008565b905081101561094357366107386060850185611008565b8381811061074857610748610f28565b60600291909101915060009050868661076384356004611051565b9061077085356004611051565b61077b906020611051565b9261078893929190610b9d565b61079191610bc7565b905060006107a56040840160208501611064565b60058111156107b6576107b6610d38565b1480156107c7575081604001358114155b156107d85760009350505050610949565b60016107ea6040840160208501611064565b60058111156107fb576107fb610d38565b14801561080c575081604001358111155b1561081d5760009350505050610949565b600261082f6040840160208501611064565b600581111561084057610840610d38565b148015610851575081604001358110155b156108625760009350505050610949565b60036108746040840160208501611064565b600581111561088557610885610d38565b1480156108955750816040013581105b156108a65760009350505050610949565b60046108b86040840160208501611064565b60058111156108c9576108c9610d38565b1480156108d95750816040013581115b156108ea5760009350505050610949565b60056108fc6040840160208501611064565b600581111561090d5761090d610d38565b14801561091d5750816040013581145b1561092e5760009350505050610949565b5050808061093b90610fd4565b915050610714565b50600190505b9392505050565b600083511561098b5760208401845160051b81015b8151841160051b9384528151602094851852604060002093909101908082106109655750505b5014919050565b80356001600160a01b03811681146109a957600080fd5b919050565b60008083601f8401126109c057600080fd5b50813567ffffffffffffffff8111156109d857600080fd5b6020830191508360208285010111156109f057600080fd5b9250929050565b60008060008060608587031215610a0d57600080fd5b610a1685610992565b935060208501359250604085013567ffffffffffffffff811115610a3957600080fd5b610a45878288016109ae565b95989497509550505050565b600080600080600060808688031215610a6957600080fd5b610a7286610992565b945060208601359350604086013567ffffffffffffffff80821115610a9657600080fd5b90870190610160828a031215610aab57600080fd5b90935060608701359080821115610ac157600080fd5b50610ace888289016109ae565b969995985093965092949392505050565b600080600080600080600060c0888a031215610afa57600080fd5b610b0388610992565b9650610b1160208901610992565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff811115610b4257600080fd5b610b4e8a828b016109ae565b989b979a50959850939692959293505050565b600080600060608486031215610b7657600080fd5b610b7f84610992565b925060208401359150610b9460408501610992565b90509250925092565b60008085851115610bad57600080fd5b83861115610bba57600080fd5b5050820193919092039150565b80356020831015610be057600019602084900360031b1b165b92915050565b6000808335601e19843603018112610bfd57600080fd5b83018035915067ffffffffffffffff821115610c1857600080fd5b6020019150368190038213156109f057600080fd5b6001600160e01b03198135818116916004851015610c555780818660040360031b1b83161692505b505092915050565b600060208284031215610c6f57600080fd5b61094982610992565b6bffffffffffffffffffffffff198135818116916014851015610c555760149490940360031b84901b1690921692915050565b60208082526024908201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6040820152630c2e8c6d60e31b606082015260800190565b60208082526029908201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460408201526808195e18d95959195960ba1b606082015260800190565b634e487b7160e01b600052602160045260246000fd5b8035600281106109a957600080fd5b600060208284031215610d6f57600080fd5b61094982610d4e565b60208082526033908201527f53657373696f6e4b657956616c696461746f723a207065726d697373696f6e206040820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b606082015260800190565b80356001600160e01b0319811681146109a957600080fd5b8035600681106109a957600080fd5b8183526000602080850194508260005b85811015610e495781358752610e19838301610de3565b60068110610e2957610e29610d38565b878401526040828101359088015260609687019690910190600101610e02565b509495945050505050565b60028110610e6457610e64610d38565b9052565b602081526001600160a01b03610e7d83610992565b16602082015263ffffffff60e01b610e9760208401610dcb565b1660408201526040820135606082015260006060830135601e19843603018112610ec057600080fd5b830160208101903567ffffffffffffffff811115610edd57600080fd5b606081023603821315610eef57600080fd5b60a06080850152610f0460c085018284610df2565b915050610f1360808501610d4e565b610f2060a0850182610e54565b509392505050565b634e487b7160e01b600052603260045260246000fd5b60008235605e19833603018112610f5457600080fd5b9190910192915050565b60008235609e19833603018112610f5457600080fd5b6000808335601e19843603018112610f8b57600080fd5b83018035915067ffffffffffffffff821115610fa657600080fd5b6020019150600581901b36038213156109f057600080fd5b634e487b7160e01b600052601160045260246000fd5b600060018201610fe657610fe6610fbe565b5060010190565b600060208284031215610fff57600080fd5b61094982610dcb565b6000808335601e1984360301811261101f57600080fd5b83018035915067ffffffffffffffff82111561103a57600080fd5b60200191506060810236038213156109f057600080fd5b80820180821115610be057610be0610fbe565b60006020828403121561107657600080fd5b61094982610de356", + "nonce": "0x1d4" }, "additionalContracts": [], "isFixedGasLimit": false @@ -22,14 +22,14 @@ ], "receipts": [ { - "transactionHash": "0xac55704b236879e66bd05cb7d6a3f5d0c29fecbe0b33abecf3d353e6a27f80bd", + "transactionHash": "0x7d2de72251685ec4f433d6479f844c3c688ae894be1a06def804adfb55afc9c6", "transactionIndex": "0x2", - "blockHash": "0xd71ebcaea257f41ffeffc4fae5f415c93e2dbe517fabc5570dcc82ffc5582e3c", - "blockNumber": "0x2b97895", + "blockHash": "0x51981d91608b9c200c0543c6fc34f6ccaf102e0ab0fdcca6ecda0e50341ce937", + "blockNumber": "0x2bb5ecf", "from": "0xA02CDdFa44B8C01b4257F54ac1c43F75801E8175", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0x1df13d", - "gasUsed": "0x1c0a87", + "cumulativeGasUsed": "0x1221f2", + "gasUsed": "0xec1b2", "contractAddress": null, "logs": [ { @@ -38,28 +38,28 @@ "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", "0x0000000000000000000000000000000000000000000000000000000000001010", "0x000000000000000000000000a02cddfa44b8c01b4257f54ac1c43f75801e8175", - "0x00000000000000000000000022b64229c41429a023549fdab3385893b579327a" + "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" ], - "data": "0x00000000000000000000000000000000000000000000000000126dcebd16268200000000000000000000000000000000000000000000000003254d852c85d3e3000000000000000000000000000000000000000000000060f7789dc7f78a88900000000000000000000000000000000000000000000000000312dfb66f6fad61000000000000000000000000000000000000000000000060f78b0b96b4a0af12", - "blockHash": "0xd71ebcaea257f41ffeffc4fae5f415c93e2dbe517fabc5570dcc82ffc5582e3c", - "blockNumber": "0x2b97895", - "transactionHash": "0xac55704b236879e66bd05cb7d6a3f5d0c29fecbe0b33abecf3d353e6a27f80bd", + "data": "0x0000000000000000000000000000000000000000000000000005275847dfae000000000000000000000000000000000000000000000000000312dfbb15c6ccf10000000000000000000000000000000000000000000023945322b694fe94e60b000000000000000000000000000000000000000000000000030db862cde71ef10000000000000000000000000000000000000000000023945327dded4674940b", + "blockHash": "0x51981d91608b9c200c0543c6fc34f6ccaf102e0ab0fdcca6ecda0e50341ce937", + "blockNumber": "0x2bb5ecf", + "transactionHash": "0x7d2de72251685ec4f433d6479f844c3c688ae894be1a06def804adfb55afc9c6", "transactionIndex": "0x2", - "logIndex": "0x3", + "logIndex": "0x8", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000020000000080000040000000000000000000200000000000000000000000000000000000000000010000000000200000000000000000000000000000000000000000000000000000002000004000000000000000000001000008000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000020000000080000040000000000000000000000000000000000000000000000000000000000000000000000000200000000000000020000000000000000001000000000000000000000000004000000000000000000001000008000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", "type": "0x0", - "effectiveGasPrice": "0xa83efbfe" + "effectiveGasPrice": "0x59682f0f" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1707439906, + "timestamp": 1707741957, "chain": 80001, "multi": false, - "commit": "60e1432" + "commit": "1bc0841" } \ No newline at end of file diff --git a/script/DeployModularPermission.s.sol b/script/DeployModularPermission.s.sol index 817f7984..5e076005 100644 --- a/script/DeployModularPermission.s.sol +++ b/script/DeployModularPermission.s.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.0; import "src/validator/modularPermission/ModularPermissionValidator.sol"; import "src/validator/modularPermission/signers/ECDSASigner.sol"; import "src/validator/modularPermission/policies/GasPolicy.sol"; +import {MerklePolicy} from "src/validator/modularPermission/policies/MerklePolicy.sol"; import "forge-std/Script.sol"; import "forge-std/console.sol"; @@ -10,6 +11,7 @@ contract DeployModularPermission is Script { address constant EXPECTED_MODULAR_PERMISSION_ADDRESS = 0x965Bea0f8b65aABD1F5148F64654BbAAfB9d2Efa; address constant EXPECTED_ECDSA_SIGNER_ADDRESS = 0xF9E712F44A360ED8820aD624e41164f74a5a7456; address constant EXPECTED_GAS_POLICY_ADDRESS = 0x62868E950Efbb336DCFf033598Ee5E602f0a93cD; + address constant EXPECTED_MERKLE_POLICY_ADDRESS = 0xb808D75B5ACf6B5513eb816d3980C733ae6Be468; function run() public { uint256 key = vm.envUint("TESTNET_DEPLOYER_PRIVATE_KEY"); @@ -39,6 +41,14 @@ contract DeployModularPermission is Script { console.log("gasPolicy address: %s", address(EXPECTED_GAS_POLICY_ADDRESS)); } + if (EXPECTED_MERKLE_POLICY_ADDRESS.code.length == 0) { + console.log("deploying MerklePolicy"); + MerklePolicy merklePolicy = new MerklePolicy{salt: 0}(); + console.log("merklePolicy address: %s", address(merklePolicy)); + } else { + console.log("merklePolicy address: %s", address(EXPECTED_MERKLE_POLICY_ADDRESS)); + } + vm.stopBroadcast(); } } diff --git a/src/validator/modularPermission/policies/MerklePolicy.sol b/src/validator/modularPermission/policies/MerklePolicy.sol index 9bbd5d8c..796714a6 100644 --- a/src/validator/modularPermission/policies/MerklePolicy.sol +++ b/src/validator/modularPermission/policies/MerklePolicy.sol @@ -40,15 +40,15 @@ contract MerklePolicy is IPolicy { bytes32 root = merkleRoot[msg.sender][permissionId][kernel]; bytes4 sig = bytes4(callData[0:4]); if (sig == Kernel.execute.selector || sig == Kernel.executeDelegateCall.selector) { - (Permission calldata permission, bytes32[] calldata merkleProof) = _getPermission(userOp.signature[85:]); + (Permission calldata permission, bytes32[] calldata merkleProof) = _getPermission(proof); bool verifyFailed = _verifyParam(root, callData, permission, merkleProof); if (verifyFailed) { revert MerklePolicyError(1); // merkle proof verification failed } return ValidationData.wrap(0); } else if (sig == Kernel.executeBatch.selector) { - Permission[] calldata permissions = _getPermissions(userOp.signature[85:]); - bytes32[][] calldata merkleProof = _getProofs(userOp.signature[85:]); + Permission[] calldata permissions = _getPermissions(proof); + bytes32[][] calldata merkleProof = _getProofs(proof); bool verifyFailed = _verifyParams(root, callData, permissions, merkleProof); if (verifyFailed) { revert MerklePolicyError(1); // merkle proof verification failed From 9cd97cb94a2553faba7a0c4856bac7967f0fce29 Mon Sep 17 00:00:00 2001 From: leekt Date: Thu, 15 Feb 2024 01:46:47 +0900 Subject: [PATCH 30/36] fix : use msg.sender instead of caller for signature verification on eip712 policy --- .../ModularPermissionValidator.sol | 10 +++++-- .../modularPermission/PolicyConfig.sol | 8 ++++++ .../policies/EIP712Policy.sol | 3 +-- .../modularPermission/ModularPermission.t.sol | 27 ++++++++++--------- 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/validator/modularPermission/ModularPermissionValidator.sol b/src/validator/modularPermission/ModularPermissionValidator.sol index 625ea524..4d209e36 100644 --- a/src/validator/modularPermission/ModularPermissionValidator.sol +++ b/src/validator/modularPermission/ModularPermissionValidator.sol @@ -116,19 +116,25 @@ contract ModularPermissionValidator is IKernelValidator { ) public payable { require(flag != toFlag(0), "flag should not be empty"); require(nonce == nonces[msg.sender].next++, "nonce should be next"); - bytes32 permissionId = - getPermissionId(flag, signer, validAfter, validUntil, policy, signerData, policyData); + bytes32 permissionId = getPermissionId(flag, signer, validAfter, validUntil, policy, signerData, policyData); if (flag == MAX_FLAG) { priorityPermission[msg.sender] = permissionId; } + bytes12 maxFlag = flag; for (uint256 i = 0; i < policy.length; i++) { //TODO make sure address of the policy is sorted PolicyConfigLib.getAddress(policy[i]).registerPolicy(msg.sender, permissionId, policyData[i]); + // NOTE: flag for policy is inverted version of flag for permission; + bytes12 currentFlag = PolicyConfigLib.getFlags(policy[i]); + // turn off flags that are used, + // meaning that remaining maxFlag will indicate the permissions that are not used on this permission + maxFlag = currentFlag & maxFlag; } signer.registerSigner(msg.sender, permissionId, signerData); PolicyConfig firstPolicy = policy[0]; // NOTE : policy should not be empty array + require(maxFlag == bytes12(0), "error : permission flag exceeds policy flag"); permissions[permissionId][msg.sender] = Permission(nonce, flag, signer, firstPolicy, validAfter, validUntil); for (uint256 i = 1; i < policy.length; i++) { nextPolicy[permissionId][policy[i - 1]][msg.sender] = policy[i]; diff --git a/src/validator/modularPermission/PolicyConfig.sol b/src/validator/modularPermission/PolicyConfig.sol index 704d5b9f..8f4f89cc 100644 --- a/src/validator/modularPermission/PolicyConfig.sol +++ b/src/validator/modularPermission/PolicyConfig.sol @@ -8,6 +8,14 @@ function toFlag(uint256 x) pure returns (bytes12) { return bytes12(bytes32(x << 160)); } +function toPermissionFlag(uint256 x) pure returns(bytes12) { + bytes12 ret = bytes12(bytes32(x << 160)); + assembly { + ret := not(ret) + } + return ret; +} + bytes12 constant MAX_FLAG = 0xffffffffffffffffffffffff; // PolicyData is a 32 bytes array that contains the address of the policy // [flags(12 bytes), address(20 bytes)] diff --git a/src/validator/modularPermission/policies/EIP712Policy.sol b/src/validator/modularPermission/policies/EIP712Policy.sol index f04bbe04..f23836ed 100644 --- a/src/validator/modularPermission/policies/EIP712Policy.sol +++ b/src/validator/modularPermission/policies/EIP712Policy.sol @@ -77,7 +77,7 @@ contract EIP712Policy is IPolicy { bytes32 _rawHash, bytes calldata _signature ) external view override returns (ValidationData) { - AllowedEIP712Params memory allowedEIP712Params = eip712Param[_permissionId][_caller][_kernel]; + AllowedEIP712Params memory allowedEIP712Params = eip712Param[_permissionId][msg.sender][_kernel]; bytes32[] memory encodedData = new bytes32[](uint32(bytes4(_signature[64:68]))); uint256 cursor = 68; for (uint32 i = 0; i < encodedData.length; i++) { @@ -97,7 +97,6 @@ contract EIP712Policy is IPolicy { bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); require(digest == _rawHash, "digest != _rawHash"); } - // need to check eip712 hash equals to _rawHash EncodeDataRule memory encodeDataRule = allowedEIP712Params.encodeDataRule; while (encodeDataRule.rule != ParamRule.NA) { if (encodeDataRule.rule == ParamRule.Equal) { diff --git a/test/foundry/validator/modularPermission/ModularPermission.t.sol b/test/foundry/validator/modularPermission/ModularPermission.t.sol index 6b50e6f0..4f90216d 100644 --- a/test/foundry/validator/modularPermission/ModularPermission.t.sol +++ b/test/foundry/validator/modularPermission/ModularPermission.t.sol @@ -5,6 +5,7 @@ import {IKernel} from "src/interfaces/IKernel.sol"; import {Kernel} from "src/Kernel.sol"; import {IKernelValidator} from "src/interfaces/IKernelValidator.sol"; import {Operation} from "src/common/Enums.sol"; +import {toPermissionFlag} from "src/validator/modularPermission/PolicyConfig.sol"; import "src/validator/modularPermission/ModularPermissionValidator.sol"; import "src/validator/modularPermission/signers/ECDSASigner.sol"; import "src/validator/modularPermission/mock/MockPolicy.sol"; @@ -159,7 +160,7 @@ contract ModularPermissionE2ETest is KernelTestBase { d.pd = new bytes[](1); d.pd[0] = abi.encodePacked(d.domainSeparator, d.typeHash, bytes4(0), uint8(ParamRule.Equal), d.encodeData); bytes32 permissionId = ModularPermissionValidator(address(defaultValidator)).getPermissionId( - MAX_FLAG, //flag + toPermissionFlag(1), //flag signer, ValidAfter.wrap(1), d.until, @@ -171,7 +172,7 @@ contract ModularPermissionE2ETest is KernelTestBase { bytes memory data = abi.encodePacked( abi.encodePacked( uint128(1), // nonce - MAX_FLAG, //flag + toPermissionFlag(1), //flag uint48(1), //`validAfter d.until, // validUntil address(signer) @@ -186,7 +187,7 @@ contract ModularPermissionE2ETest is KernelTestBase { (config.nonce, config.flag, config.signer, config.firstPolicy, config.validAfter, config.validUntil) = ModularPermissionValidator(address(defaultValidator)).permissions(permissionId, d.kernel); assertEq(config.nonce, uint128(1)); - assertEq(config.flag, MAX_FLAG); + assertEq(config.flag, toPermissionFlag(1)); assertEq(ValidAfter.unwrap(config.validAfter), uint48(1)); assertEq(ValidUntil.unwrap(config.validUntil), ValidUntil.unwrap(d.until)); assertEq(address(config.signer), address(signer)); @@ -228,7 +229,7 @@ contract ModularPermissionE2ETest is KernelTestBase { d.pd = new bytes[](1); d.pd[0] = abi.encodePacked(d.domainSeparator, d.typeHash, bytes4(0), uint8(ParamRule.GreaterThan), d.encodeData); bytes32 permissionId = ModularPermissionValidator(address(defaultValidator)).getPermissionId( - MAX_FLAG, //flag + toPermissionFlag(1), //flag signer, ValidAfter.wrap(1), d.until, @@ -240,7 +241,7 @@ contract ModularPermissionE2ETest is KernelTestBase { bytes memory data = abi.encodePacked( abi.encodePacked( uint128(1), // nonce - MAX_FLAG, //flag + toPermissionFlag(1), //flag uint48(1), //`validAfter d.until, // validUntil address(signer) @@ -255,7 +256,7 @@ contract ModularPermissionE2ETest is KernelTestBase { (config.nonce, config.flag, config.signer, config.firstPolicy, config.validAfter, config.validUntil) = ModularPermissionValidator(address(defaultValidator)).permissions(permissionId, d.kernel); assertEq(config.nonce, uint128(1)); - assertEq(config.flag, MAX_FLAG); + assertEq(config.flag, toPermissionFlag(1)); assertEq(ValidAfter.unwrap(config.validAfter), uint48(1)); assertEq(ValidUntil.unwrap(config.validUntil), ValidUntil.unwrap(d.until)); assertEq(address(config.signer), address(signer)); @@ -438,7 +439,7 @@ contract ModularPermissionUnitTest is Test { pd[0] = abi.encodePacked("hello policy"); pd[1] = abi.encodePacked("hello policy 2"); bytes32 permissionId = validator.getPermissionId( - MAX_FLAG, //flag + toPermissionFlag(0), //flag mockSigner, ValidAfter.wrap(1), until, @@ -450,7 +451,7 @@ contract ModularPermissionUnitTest is Test { bytes memory data = abi.encodePacked( abi.encodePacked( uint128(0), // nonce - MAX_FLAG, //flag + toPermissionFlag(0), //flag uint48(1), //`validAfter until, // validUntil address(mockSigner) @@ -466,7 +467,7 @@ contract ModularPermissionUnitTest is Test { (config.nonce, config.flag, config.signer, config.firstPolicy, config.validAfter, config.validUntil) = validator.permissions(permissionId, kernel); assertEq(config.nonce, uint128(0)); - assertEq(config.flag, MAX_FLAG); + assertEq(config.flag, toPermissionFlag(0)); assertEq(ValidAfter.unwrap(config.validAfter), uint48(1)); assertEq(ValidUntil.unwrap(config.validUntil), ValidUntil.unwrap(until)); assertEq(address(config.signer), address(mockSigner)); @@ -515,7 +516,7 @@ contract ModularPermissionUnitTest is Test { d.pd = new bytes[](1); d.pd[0] = abi.encodePacked(d.domainSeparator, d.typeHash, bytes4(0), uint8(ParamRule.Equal), d.encodeData); bytes32 permissionId = validator.getPermissionId( - MAX_FLAG, //flag + toPermissionFlag(1), //flag mockSigner, ValidAfter.wrap(1), d.until, @@ -527,7 +528,7 @@ contract ModularPermissionUnitTest is Test { bytes memory data = abi.encodePacked( abi.encodePacked( uint128(0), // nonce - MAX_FLAG, //flag + toPermissionFlag(1), //flag uint48(1), //`validAfter d.until, // validUntil address(mockSigner) @@ -543,7 +544,7 @@ contract ModularPermissionUnitTest is Test { (config.nonce, config.flag, config.signer, config.firstPolicy, config.validAfter, config.validUntil) = validator.permissions(permissionId, d.kernel); assertEq(config.nonce, uint128(0)); - assertEq(config.flag, MAX_FLAG); + assertEq(config.flag, toPermissionFlag(1)); assertEq(ValidAfter.unwrap(config.validAfter), uint48(1)); assertEq(ValidUntil.unwrap(config.validUntil), ValidUntil.unwrap(d.until)); assertEq(address(config.signer), address(mockSigner)); @@ -569,6 +570,7 @@ contract ModularPermissionUnitTest is Test { require(success); vm.stopPrank(); vm.startPrank(d.kernel); + d.digest = _hashTypedData(d.domainSeparator, keccak256(abi.encode(d.typeHash, uint256(d.encodeData) + 1))); (success, ret) = address(validator).call( abi.encodePacked( abi.encodeWithSelector( @@ -589,7 +591,6 @@ contract ModularPermissionUnitTest is Test { ) ); require(address(uint160(bytes20(bytes32(ret) << 96))) == address(1)); - require(success); vm.stopPrank(); } From ec169b3fa75a272d41b3106e0f0a300f045190ce Mon Sep 17 00:00:00 2001 From: Sahil Vasava Date: Thu, 15 Feb 2024 16:16:49 +0700 Subject: [PATCH 31/36] chore: deploy signaturePolicy --- .../80001/run-1707822518.json | 33 ++++++++++ .../80001/run-1707822525.json | 65 +++++++++++++++++++ .../80001/run-latest.json | 42 ++++++------ script/DeployModularPermission.s.sol | 10 +++ 4 files changed, 129 insertions(+), 21 deletions(-) create mode 100644 broadcast/DeployModularPermission.s.sol/80001/run-1707822518.json create mode 100644 broadcast/DeployModularPermission.s.sol/80001/run-1707822525.json diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-1707822518.json b/broadcast/DeployModularPermission.s.sol/80001/run-1707822518.json new file mode 100644 index 00000000..6cbbab04 --- /dev/null +++ b/broadcast/DeployModularPermission.s.sol/80001/run-1707822518.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0xafc9cb887a29150932f5e25c421edb3170b0a8d998368bf85c20d6c9877781eb", + "transactionType": "CREATE2", + "contractName": "SignaturePolicy", + "contractAddress": "0x60e9a007782EB649B291608dCa9E74Aaa966D122", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x80a90", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061058c806100206000396000f3fe60806040526004361061003e5760003560e01c8062282ae014610043578063466a35f214610058578063c92ce351146100ad578063ecfcd930146100d4575b600080fd5b6100566100513660046102ce565b6100f4565b005b34801561006457600080fd5b50610098610073366004610328565b6000602081815293815260408082208552928152828120909352825290205460ff1681565b60405190151581526020015b60405180910390f35b6100c66100bb366004610364565b600095945050505050565b6040519081526020016100a4565b3480156100e057600080fd5b506100c66100ef3660046103f2565b61021d565b60006101028284018461048a565b905060005b81518110156102155760006001600160a01b031682828151811061012d5761012d61054f565b60200260200101516001600160a01b031603610178576000858152602081815260408083206001600160a01b038a16845282528083209091529020805460ff19166001179055610203565b600160008087815260200190815260200160002060008484815181106101a0576101a061054f565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8061020d81610565565b915050610107565b505050505050565b6000858152602081815260408083206001600160a01b03808b168552908352818420908b16845290915281205460ff161561025a5750600061025e565b5060015b979650505050505050565b80356001600160a01b038116811461028057600080fd5b919050565b60008083601f84011261029757600080fd5b50813567ffffffffffffffff8111156102af57600080fd5b6020830191508360208285010111156102c757600080fd5b9250929050565b600080600080606085870312156102e457600080fd5b6102ed85610269565b935060208501359250604085013567ffffffffffffffff81111561031057600080fd5b61031c87828801610285565b95989497509550505050565b60008060006060848603121561033d57600080fd5b8335925061034d60208501610269565b915061035b60408501610269565b90509250925092565b60008060008060006080868803121561037c57600080fd5b61038586610269565b945060208601359350604086013567ffffffffffffffff808211156103a957600080fd5b90870190610160828a0312156103be57600080fd5b909350606087013590808211156103d457600080fd5b506103e188828901610285565b969995985093965092949392505050565b600080600080600080600060c0888a03121561040d57600080fd5b61041688610269565b965061042460208901610269565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff81111561045557600080fd5b6104618a828b01610285565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561049d57600080fd5b823567ffffffffffffffff808211156104b557600080fd5b818501915085601f8301126104c957600080fd5b8135818111156104db576104db610474565b8060051b604051601f19603f8301168101818110858211171561050057610500610474565b60405291825284820192508381018501918883111561051e57600080fd5b938501935b828510156105435761053485610269565b84529385019392850192610523565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b60006001820161058557634e487b7160e01b600052601160045260246000fd5b506001019056", + "nonce": "0x1d5" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xafc9cb887a29150932f5e25c421edb3170b0a8d998368bf85c20d6c9877781eb" + ], + "returns": {}, + "timestamp": 1707822518, + "chain": 80001, + "multi": false, + "commit": "1d02052" +} \ No newline at end of file diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-1707822525.json b/broadcast/DeployModularPermission.s.sol/80001/run-1707822525.json new file mode 100644 index 00000000..b9c6e7d1 --- /dev/null +++ b/broadcast/DeployModularPermission.s.sol/80001/run-1707822525.json @@ -0,0 +1,65 @@ +{ + "transactions": [ + { + "hash": "0xafc9cb887a29150932f5e25c421edb3170b0a8d998368bf85c20d6c9877781eb", + "transactionType": "CREATE2", + "contractName": "SignaturePolicy", + "contractAddress": "0x60e9a007782EB649B291608dCa9E74Aaa966D122", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x80a90", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061058c806100206000396000f3fe60806040526004361061003e5760003560e01c8062282ae014610043578063466a35f214610058578063c92ce351146100ad578063ecfcd930146100d4575b600080fd5b6100566100513660046102ce565b6100f4565b005b34801561006457600080fd5b50610098610073366004610328565b6000602081815293815260408082208552928152828120909352825290205460ff1681565b60405190151581526020015b60405180910390f35b6100c66100bb366004610364565b600095945050505050565b6040519081526020016100a4565b3480156100e057600080fd5b506100c66100ef3660046103f2565b61021d565b60006101028284018461048a565b905060005b81518110156102155760006001600160a01b031682828151811061012d5761012d61054f565b60200260200101516001600160a01b031603610178576000858152602081815260408083206001600160a01b038a16845282528083209091529020805460ff19166001179055610203565b600160008087815260200190815260200160002060008484815181106101a0576101a061054f565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8061020d81610565565b915050610107565b505050505050565b6000858152602081815260408083206001600160a01b03808b168552908352818420908b16845290915281205460ff161561025a5750600061025e565b5060015b979650505050505050565b80356001600160a01b038116811461028057600080fd5b919050565b60008083601f84011261029757600080fd5b50813567ffffffffffffffff8111156102af57600080fd5b6020830191508360208285010111156102c757600080fd5b9250929050565b600080600080606085870312156102e457600080fd5b6102ed85610269565b935060208501359250604085013567ffffffffffffffff81111561031057600080fd5b61031c87828801610285565b95989497509550505050565b60008060006060848603121561033d57600080fd5b8335925061034d60208501610269565b915061035b60408501610269565b90509250925092565b60008060008060006080868803121561037c57600080fd5b61038586610269565b945060208601359350604086013567ffffffffffffffff808211156103a957600080fd5b90870190610160828a0312156103be57600080fd5b909350606087013590808211156103d457600080fd5b506103e188828901610285565b969995985093965092949392505050565b600080600080600080600060c0888a03121561040d57600080fd5b61041688610269565b965061042460208901610269565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff81111561045557600080fd5b6104618a828b01610285565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561049d57600080fd5b823567ffffffffffffffff808211156104b557600080fd5b818501915085601f8301126104c957600080fd5b8135818111156104db576104db610474565b8060051b604051601f19603f8301168101818110858211171561050057610500610474565b60405291825284820192508381018501918883111561051e57600080fd5b938501935b828510156105435761053485610269565b84529385019392850192610523565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b60006001820161058557634e487b7160e01b600052601160045260246000fd5b506001019056", + "nonce": "0x1d5" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xafc9cb887a29150932f5e25c421edb3170b0a8d998368bf85c20d6c9877781eb", + "transactionIndex": "0x2", + "blockHash": "0xde9e19ccd546c800277af8effd96cbe24640ed08591c3ac968bd8d0d5e2433b8", + "blockNumber": "0x2bbe632", + "from": "0xA02CDdFa44B8C01b4257F54ac1c43F75801E8175", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1259af", + "gasUsed": "0x57fed", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000a02cddfa44b8c01b4257f54ac1c43f75801e8175", + "0x000000000000000000000000c275dc8be39f50d12f66b6a63629c39da5bae5bd" + ], + "data": "0x0000000000000000000000000000000000000000000000000002e1918fc7c40e000000000000000000000000000000000000000000000000030db870c5511d83000000000000000000000000000000000000000000001436667fd2243f7a0a55000000000000000000000000000000000000000000000000030ad6df358959750000000000000000000000000000000000000000000014366682b3b5cf41ce63", + "blockHash": "0xde9e19ccd546c800277af8effd96cbe24640ed08591c3ac968bd8d0d5e2433b8", + "blockNumber": "0x2bbe632", + "transactionHash": "0xafc9cb887a29150932f5e25c421edb3170b0a8d998368bf85c20d6c9877781eb", + "transactionIndex": "0x2", + "logIndex": "0x7", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000002000000000000000000000000000000000000000000000000000800000000000000000040100000000000000000000000000000000000000000000000000020000000080000040000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000040000000004000000000000000000001000008000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x861c4696" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1707822525, + "chain": 80001, + "multi": false, + "commit": "1d02052" +} \ No newline at end of file diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-latest.json b/broadcast/DeployModularPermission.s.sol/80001/run-latest.json index 37e1304e..b9c6e7d1 100644 --- a/broadcast/DeployModularPermission.s.sol/80001/run-latest.json +++ b/broadcast/DeployModularPermission.s.sol/80001/run-latest.json @@ -1,20 +1,20 @@ { "transactions": [ { - "hash": "0x7d2de72251685ec4f433d6479f844c3c688ae894be1a06def804adfb55afc9c6", + "hash": "0xafc9cb887a29150932f5e25c421edb3170b0a8d998368bf85c20d6c9877781eb", "transactionType": "CREATE2", - "contractName": "MerklePolicy", - "contractAddress": "0xb808D75B5ACf6B5513eb816d3980C733ae6Be468", + "contractName": "SignaturePolicy", + "contractAddress": "0x60e9a007782EB649B291608dCa9E74Aaa966D122", "function": null, "arguments": null, "transaction": { "type": "0x00", "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x146081", + "gas": "0x80a90", "value": "0x0", - "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061107f806100206000396000f3fe60806040526004361061003e5760003560e01c8062282ae014610043578063c92ce35114610058578063ecfcd9301461007d578063f2a108001461009d575b600080fd5b6100566100513660046109f7565b6100da565b005b61006b610066366004610a51565b61012a565b60405190815260200160405180910390f35b34801561008957600080fd5b5061006b610098366004610adf565b6102ad565b3480156100a957600080fd5b5061006b6100b8366004610b61565b6000602081815293815260408082208552928152828120909352825290205481565b60006100e96020828486610b9d565b6100f291610bc7565b336000908152602081815260408083209783529681528682206001600160a01b03989098168252969096529390942092909255505050565b6000368161013b6060870187610be6565b336000908152602081815260408083208c845282528083206001600160a01b038e1684529091528120549294509092506101786004828587610b9d565b61018191610c2d565b90506001600160e01b03198116635194544760e01b14806101b257506001600160e01b0319811663b68df16d60e01b145b1561021257863587016020808901358901908101903560006101d88689898787876102bb565b9050801561020157604051633b755d2d60e21b8152600160048201526024015b60405180910390fd5b6000985050505050505050506102a4565b636581952160e11b6001600160e01b031982160161028857863587016020818101913590898101358a0190810190356000610252878a8a888888886104ed565b9050801561027657604051633b755d2d60e21b8152600160048201526024016101f8565b600099505050505050505050506102a4565b604051633b755d2d60e21b8152600060048201526024016101f8565b95945050505050565b60005b979650505050505050565b600080635194544760e01b6102d3600483898b610b9d565b6102dc91610c2d565b6001600160e01b03191614905060006102f86020870187610c5d565b6001600160a01b0316148061033a57506103156020860186610c5d565b6001600160a01b031661032c60246010898b610b9d565b61033591610c78565b60601c145b6103565760405162461bcd60e51b81526004016101f890610cab565b801561039b57604085013561036f60446024898b610b9d565b61037891610bc7565b11156103965760405162461bcd60e51b81526004016101f890610cef565b61041b565b60016103ad60a0870160808801610d5d565b60018111156103be576103be610d38565b1461041b5760405162461bcd60e51b815260206004820152602760248201527f53657373696f6e4b657956616c696461746f723a206f7065726174696f6e206d6044820152660d2e6dac2e8c6d60cb1b60648201526084016101f8565b366000808361042b57602461042e565b60445b808b01358b01602481019450600401359250905061044d83838a6106c7565b6104695760405162461bcd60e51b81526004016101f890610d78565b6104cd878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040518f92506104b291508c90602001610e68565b60405160208183030381529060405280519060200120610950565b6104de5760019450505050506104e3565b505050505b9695505050505050565b6000600487810135880160248101910135825b818110156106b9573683838381811061051b5761051b610f28565b905060200281019061052d9190610f3e565b90503689898481811061054257610542610f28565b90506020028101906105549190610f5e565b905060006105656020830183610c5d565b6001600160a01b031614806105a357506105826020820182610c5d565b6001600160a01b03166105986020840184610c5d565b6001600160a01b0316145b6105bf5760405162461bcd60e51b81526004016101f890610cab565b6040810135602083013511156105e75760405162461bcd60e51b81526004016101f890610cef565b6105fd6105f76040840184610be6565b836106c7565b6106195760405162461bcd60e51b81526004016101f890610d78565b61069288888581811061062e5761062e610f28565b90506020028101906106409190610f74565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508e836040516020016104b29190610e68565b6106a4576001955050505050506102b0565b505080806106b190610fd4565b915050610500565b505050979650505050505050565b60006106d96040830160208401610fed565b6001600160e01b0319166106f1600460008688610b9d565b6106fa91610c2d565b6001600160e01b0319161461071157506000610949565b60005b6107216060840184611008565b905081101561094357366107386060850185611008565b8381811061074857610748610f28565b60600291909101915060009050868661076384356004611051565b9061077085356004611051565b61077b906020611051565b9261078893929190610b9d565b61079191610bc7565b905060006107a56040840160208501611064565b60058111156107b6576107b6610d38565b1480156107c7575081604001358114155b156107d85760009350505050610949565b60016107ea6040840160208501611064565b60058111156107fb576107fb610d38565b14801561080c575081604001358111155b1561081d5760009350505050610949565b600261082f6040840160208501611064565b600581111561084057610840610d38565b148015610851575081604001358110155b156108625760009350505050610949565b60036108746040840160208501611064565b600581111561088557610885610d38565b1480156108955750816040013581105b156108a65760009350505050610949565b60046108b86040840160208501611064565b60058111156108c9576108c9610d38565b1480156108d95750816040013581115b156108ea5760009350505050610949565b60056108fc6040840160208501611064565b600581111561090d5761090d610d38565b14801561091d5750816040013581145b1561092e5760009350505050610949565b5050808061093b90610fd4565b915050610714565b50600190505b9392505050565b600083511561098b5760208401845160051b81015b8151841160051b9384528151602094851852604060002093909101908082106109655750505b5014919050565b80356001600160a01b03811681146109a957600080fd5b919050565b60008083601f8401126109c057600080fd5b50813567ffffffffffffffff8111156109d857600080fd5b6020830191508360208285010111156109f057600080fd5b9250929050565b60008060008060608587031215610a0d57600080fd5b610a1685610992565b935060208501359250604085013567ffffffffffffffff811115610a3957600080fd5b610a45878288016109ae565b95989497509550505050565b600080600080600060808688031215610a6957600080fd5b610a7286610992565b945060208601359350604086013567ffffffffffffffff80821115610a9657600080fd5b90870190610160828a031215610aab57600080fd5b90935060608701359080821115610ac157600080fd5b50610ace888289016109ae565b969995985093965092949392505050565b600080600080600080600060c0888a031215610afa57600080fd5b610b0388610992565b9650610b1160208901610992565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff811115610b4257600080fd5b610b4e8a828b016109ae565b989b979a50959850939692959293505050565b600080600060608486031215610b7657600080fd5b610b7f84610992565b925060208401359150610b9460408501610992565b90509250925092565b60008085851115610bad57600080fd5b83861115610bba57600080fd5b5050820193919092039150565b80356020831015610be057600019602084900360031b1b165b92915050565b6000808335601e19843603018112610bfd57600080fd5b83018035915067ffffffffffffffff821115610c1857600080fd5b6020019150368190038213156109f057600080fd5b6001600160e01b03198135818116916004851015610c555780818660040360031b1b83161692505b505092915050565b600060208284031215610c6f57600080fd5b61094982610992565b6bffffffffffffffffffffffff198135818116916014851015610c555760149490940360031b84901b1690921692915050565b60208082526024908201527f53657373696f6e4b657956616c696461746f723a20746172676574206d69736d6040820152630c2e8c6d60e31b606082015260800190565b60208082526029908201527f53657373696f6e4b657956616c696461746f723a2076616c7565206c696d697460408201526808195e18d95959195960ba1b606082015260800190565b634e487b7160e01b600052602160045260246000fd5b8035600281106109a957600080fd5b600060208284031215610d6f57600080fd5b61094982610d4e565b60208082526033908201527f53657373696f6e4b657956616c696461746f723a207065726d697373696f6e206040820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b606082015260800190565b80356001600160e01b0319811681146109a957600080fd5b8035600681106109a957600080fd5b8183526000602080850194508260005b85811015610e495781358752610e19838301610de3565b60068110610e2957610e29610d38565b878401526040828101359088015260609687019690910190600101610e02565b509495945050505050565b60028110610e6457610e64610d38565b9052565b602081526001600160a01b03610e7d83610992565b16602082015263ffffffff60e01b610e9760208401610dcb565b1660408201526040820135606082015260006060830135601e19843603018112610ec057600080fd5b830160208101903567ffffffffffffffff811115610edd57600080fd5b606081023603821315610eef57600080fd5b60a06080850152610f0460c085018284610df2565b915050610f1360808501610d4e565b610f2060a0850182610e54565b509392505050565b634e487b7160e01b600052603260045260246000fd5b60008235605e19833603018112610f5457600080fd5b9190910192915050565b60008235609e19833603018112610f5457600080fd5b6000808335601e19843603018112610f8b57600080fd5b83018035915067ffffffffffffffff821115610fa657600080fd5b6020019150600581901b36038213156109f057600080fd5b634e487b7160e01b600052601160045260246000fd5b600060018201610fe657610fe6610fbe565b5060010190565b600060208284031215610fff57600080fd5b61094982610dcb565b6000808335601e1984360301811261101f57600080fd5b83018035915067ffffffffffffffff82111561103a57600080fd5b60200191506060810236038213156109f057600080fd5b80820180821115610be057610be0610fbe565b60006020828403121561107657600080fd5b61094982610de356", - "nonce": "0x1d4" + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061058c806100206000396000f3fe60806040526004361061003e5760003560e01c8062282ae014610043578063466a35f214610058578063c92ce351146100ad578063ecfcd930146100d4575b600080fd5b6100566100513660046102ce565b6100f4565b005b34801561006457600080fd5b50610098610073366004610328565b6000602081815293815260408082208552928152828120909352825290205460ff1681565b60405190151581526020015b60405180910390f35b6100c66100bb366004610364565b600095945050505050565b6040519081526020016100a4565b3480156100e057600080fd5b506100c66100ef3660046103f2565b61021d565b60006101028284018461048a565b905060005b81518110156102155760006001600160a01b031682828151811061012d5761012d61054f565b60200260200101516001600160a01b031603610178576000858152602081815260408083206001600160a01b038a16845282528083209091529020805460ff19166001179055610203565b600160008087815260200190815260200160002060008484815181106101a0576101a061054f565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8061020d81610565565b915050610107565b505050505050565b6000858152602081815260408083206001600160a01b03808b168552908352818420908b16845290915281205460ff161561025a5750600061025e565b5060015b979650505050505050565b80356001600160a01b038116811461028057600080fd5b919050565b60008083601f84011261029757600080fd5b50813567ffffffffffffffff8111156102af57600080fd5b6020830191508360208285010111156102c757600080fd5b9250929050565b600080600080606085870312156102e457600080fd5b6102ed85610269565b935060208501359250604085013567ffffffffffffffff81111561031057600080fd5b61031c87828801610285565b95989497509550505050565b60008060006060848603121561033d57600080fd5b8335925061034d60208501610269565b915061035b60408501610269565b90509250925092565b60008060008060006080868803121561037c57600080fd5b61038586610269565b945060208601359350604086013567ffffffffffffffff808211156103a957600080fd5b90870190610160828a0312156103be57600080fd5b909350606087013590808211156103d457600080fd5b506103e188828901610285565b969995985093965092949392505050565b600080600080600080600060c0888a03121561040d57600080fd5b61041688610269565b965061042460208901610269565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff81111561045557600080fd5b6104618a828b01610285565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561049d57600080fd5b823567ffffffffffffffff808211156104b557600080fd5b818501915085601f8301126104c957600080fd5b8135818111156104db576104db610474565b8060051b604051601f19603f8301168101818110858211171561050057610500610474565b60405291825284820192508381018501918883111561051e57600080fd5b938501935b828510156105435761053485610269565b84529385019392850192610523565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b60006001820161058557634e487b7160e01b600052601160045260246000fd5b506001019056", + "nonce": "0x1d5" }, "additionalContracts": [], "isFixedGasLimit": false @@ -22,14 +22,14 @@ ], "receipts": [ { - "transactionHash": "0x7d2de72251685ec4f433d6479f844c3c688ae894be1a06def804adfb55afc9c6", + "transactionHash": "0xafc9cb887a29150932f5e25c421edb3170b0a8d998368bf85c20d6c9877781eb", "transactionIndex": "0x2", - "blockHash": "0x51981d91608b9c200c0543c6fc34f6ccaf102e0ab0fdcca6ecda0e50341ce937", - "blockNumber": "0x2bb5ecf", + "blockHash": "0xde9e19ccd546c800277af8effd96cbe24640ed08591c3ac968bd8d0d5e2433b8", + "blockNumber": "0x2bbe632", "from": "0xA02CDdFa44B8C01b4257F54ac1c43F75801E8175", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0x1221f2", - "gasUsed": "0xec1b2", + "cumulativeGasUsed": "0x1259af", + "gasUsed": "0x57fed", "contractAddress": null, "logs": [ { @@ -38,28 +38,28 @@ "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", "0x0000000000000000000000000000000000000000000000000000000000001010", "0x000000000000000000000000a02cddfa44b8c01b4257f54ac1c43f75801e8175", - "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" + "0x000000000000000000000000c275dc8be39f50d12f66b6a63629c39da5bae5bd" ], - "data": "0x0000000000000000000000000000000000000000000000000005275847dfae000000000000000000000000000000000000000000000000000312dfbb15c6ccf10000000000000000000000000000000000000000000023945322b694fe94e60b000000000000000000000000000000000000000000000000030db862cde71ef10000000000000000000000000000000000000000000023945327dded4674940b", - "blockHash": "0x51981d91608b9c200c0543c6fc34f6ccaf102e0ab0fdcca6ecda0e50341ce937", - "blockNumber": "0x2bb5ecf", - "transactionHash": "0x7d2de72251685ec4f433d6479f844c3c688ae894be1a06def804adfb55afc9c6", + "data": "0x0000000000000000000000000000000000000000000000000002e1918fc7c40e000000000000000000000000000000000000000000000000030db870c5511d83000000000000000000000000000000000000000000001436667fd2243f7a0a55000000000000000000000000000000000000000000000000030ad6df358959750000000000000000000000000000000000000000000014366682b3b5cf41ce63", + "blockHash": "0xde9e19ccd546c800277af8effd96cbe24640ed08591c3ac968bd8d0d5e2433b8", + "blockNumber": "0x2bbe632", + "transactionHash": "0xafc9cb887a29150932f5e25c421edb3170b0a8d998368bf85c20d6c9877781eb", "transactionIndex": "0x2", - "logIndex": "0x8", + "logIndex": "0x7", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000020000000080000040000000000000000000000000000000000000000000000000000000000000000000000000200000000000000020000000000000000001000000000000000000000000004000000000000000000001000008000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000002000000000000000000000000000000000000000000000000000800000000000000000040100000000000000000000000000000000000000000000000000020000000080000040000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000040000000004000000000000000000001000008000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", "type": "0x0", - "effectiveGasPrice": "0x59682f0f" + "effectiveGasPrice": "0x861c4696" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1707741957, + "timestamp": 1707822525, "chain": 80001, "multi": false, - "commit": "1bc0841" + "commit": "1d02052" } \ No newline at end of file diff --git a/script/DeployModularPermission.s.sol b/script/DeployModularPermission.s.sol index 5e076005..8ae9273a 100644 --- a/script/DeployModularPermission.s.sol +++ b/script/DeployModularPermission.s.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.0; import "src/validator/modularPermission/ModularPermissionValidator.sol"; import "src/validator/modularPermission/signers/ECDSASigner.sol"; import "src/validator/modularPermission/policies/GasPolicy.sol"; +import "src/validator/modularPermission/policies/SignaturePolicy.sol"; import {MerklePolicy} from "src/validator/modularPermission/policies/MerklePolicy.sol"; import "forge-std/Script.sol"; import "forge-std/console.sol"; @@ -12,6 +13,7 @@ contract DeployModularPermission is Script { address constant EXPECTED_ECDSA_SIGNER_ADDRESS = 0xF9E712F44A360ED8820aD624e41164f74a5a7456; address constant EXPECTED_GAS_POLICY_ADDRESS = 0x62868E950Efbb336DCFf033598Ee5E602f0a93cD; address constant EXPECTED_MERKLE_POLICY_ADDRESS = 0xb808D75B5ACf6B5513eb816d3980C733ae6Be468; + address constant EXPECTED_SIGNATURE_POLICY_ADDRESS = 0x60e9a007782EB649B291608dCa9E74Aaa966D122; function run() public { uint256 key = vm.envUint("TESTNET_DEPLOYER_PRIVATE_KEY"); @@ -49,6 +51,14 @@ contract DeployModularPermission is Script { console.log("merklePolicy address: %s", address(EXPECTED_MERKLE_POLICY_ADDRESS)); } + if (EXPECTED_SIGNATURE_POLICY_ADDRESS.code.length == 0) { + console.log("deploying SignaturePolicy"); + SignaturePolicy signturePolicy = new SignaturePolicy{salt: 0}(); + console.log("signturePolicy address: %s", address(signturePolicy)); + } else { + console.log("signturePolicy address: %s", address(EXPECTED_SIGNATURE_POLICY_ADDRESS)); + } + vm.stopBroadcast(); } } From b5ca36fc55966ddd4eea271d54b797e1387179c8 Mon Sep 17 00:00:00 2001 From: Sahil Vasava Date: Thu, 15 Feb 2024 19:14:12 +0700 Subject: [PATCH 32/36] fix: added validator in the storage mapping of SignaturePolicy to fix unauthenticated state change vuln --- .gitignore | 1 + lib/p256-verifier | 1 + .../modularPermission/policies/SignaturePolicy.sol | 11 +++++++---- 3 files changed, 9 insertions(+), 4 deletions(-) create mode 160000 lib/p256-verifier diff --git a/.gitignore b/.gitignore index 3978feff..cfe668b2 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ artifacts-selected cache_hardhat lcov.info +settings.json \ No newline at end of file diff --git a/lib/p256-verifier b/lib/p256-verifier new file mode 160000 index 00000000..29475ae3 --- /dev/null +++ b/lib/p256-verifier @@ -0,0 +1 @@ +Subproject commit 29475ae300ec95d98d5c7cc34c094846f0aa2dcd diff --git a/src/validator/modularPermission/policies/SignaturePolicy.sol b/src/validator/modularPermission/policies/SignaturePolicy.sol index 696390b3..c4f1b16c 100644 --- a/src/validator/modularPermission/policies/SignaturePolicy.sol +++ b/src/validator/modularPermission/policies/SignaturePolicy.sol @@ -3,15 +3,18 @@ pragma solidity ^0.8.0; import "../IPolicy.sol"; contract SignaturePolicy is IPolicy { - mapping(bytes32 => mapping(address => mapping(address => bool))) public allowedRequestor; + mapping( + address permissionValidator + => mapping(bytes32 permissionId => mapping(address requestor => mapping(address kernel => bool))) + ) public allowedRequestor; function registerPolicy(address kernel, bytes32 permissionId, bytes calldata policyData) external payable { address[] memory callers = abi.decode(policyData, (address[])); for (uint256 i = 0; i < callers.length; i++) { if (callers[i] == address(0)) { - allowedRequestor[permissionId][kernel][kernel] = true; + allowedRequestor[msg.sender][permissionId][kernel][kernel] = true; } else { - allowedRequestor[permissionId][callers[i]][kernel] = true; + allowedRequestor[msg.sender][permissionId][callers[i]][kernel] = true; } } } @@ -34,7 +37,7 @@ contract SignaturePolicy is IPolicy { bytes32 rawHash, bytes calldata signature ) external view override returns (ValidationData) { - if (allowedRequestor[permissionId][caller][kernel]) { + if (allowedRequestor[msg.sender][permissionId][caller][kernel]) { return ValidationData.wrap(0); } return SIG_VALIDATION_FAILED; From c6d2effe0cef79aa53dfda6b78e46ea5c29092cb Mon Sep 17 00:00:00 2001 From: Sahil Vasava Date: Thu, 15 Feb 2024 19:20:21 +0700 Subject: [PATCH 33/36] fix: remove p256-verifier lib --- lib/p256-verifier | 1 - 1 file changed, 1 deletion(-) delete mode 160000 lib/p256-verifier diff --git a/lib/p256-verifier b/lib/p256-verifier deleted file mode 160000 index 29475ae3..00000000 --- a/lib/p256-verifier +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 29475ae300ec95d98d5c7cc34c094846f0aa2dcd From eecd5313c1ef728766845f3d9f440ab40786b308 Mon Sep 17 00:00:00 2001 From: Sahil Vasava Date: Fri, 16 Feb 2024 21:22:35 +0530 Subject: [PATCH 34/36] feat: added WebAuthnSigner for ModularPermissionValidator (#83) --- .gitmodules | 3 + lib/p256-verifier | 1 + .../signers/WebAuthnSigner.sol | 82 +++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 160000 lib/p256-verifier create mode 100644 src/validator/modularPermission/signers/WebAuthnSigner.sol diff --git a/.gitmodules b/.gitmodules index 744ac54b..467f62e8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "lib/I4337"] path = lib/I4337 url = https://github.com/leekt/I4337 +[submodule "lib/p256-verifier"] + path = lib/p256-verifier + url = https://github.com/daimo-eth/p256-verifier diff --git a/lib/p256-verifier b/lib/p256-verifier new file mode 160000 index 00000000..29475ae3 --- /dev/null +++ b/lib/p256-verifier @@ -0,0 +1 @@ +Subproject commit 29475ae300ec95d98d5c7cc34c094846f0aa2dcd diff --git a/src/validator/modularPermission/signers/WebAuthnSigner.sol b/src/validator/modularPermission/signers/WebAuthnSigner.sol new file mode 100644 index 00000000..011088fe --- /dev/null +++ b/src/validator/modularPermission/signers/WebAuthnSigner.sol @@ -0,0 +1,82 @@ +pragma solidity ^0.8.0; + +import {WebAuthn} from "p256-verifier/WebAuthn.sol"; +import {ISigner} from "../ISigner.sol"; +import {ValidationData} from "../../../common/Types.sol"; +import {SIG_VALIDATION_FAILED} from "../../../common/Constants.sol"; + +struct WebAuthnValidatorData { + uint256 x; + uint256 y; +} + +contract WebAuthnSigner is ISigner { + mapping(address caller => mapping(bytes32 permissionId => mapping(address kernel => WebAuthnValidatorData))) public + webAuthnValidatorStorage; + + function registerSigner(address kernel, bytes32 permissionId, bytes calldata data) external payable override { + WebAuthnValidatorData memory pubKey = abi.decode(data, (WebAuthnValidatorData)); + require( + webAuthnValidatorStorage[msg.sender][permissionId][kernel].x == 0 + && webAuthnValidatorStorage[msg.sender][permissionId][kernel].y == 0, + "WebAuthnSigner: kernel already registered" + ); + require(pubKey.x != 0 && pubKey.y != 0, "WebAuthnSigner: invalid public key"); + webAuthnValidatorStorage[msg.sender][permissionId][kernel] = pubKey; + } + + function validateUserOp(address kernel, bytes32 permissionId, bytes32 userOpHash, bytes calldata signature) + external + payable + override + returns (ValidationData) + { + return _verifySignature(kernel, permissionId, userOpHash, signature); + } + + function validateSignature(address kernel, bytes32 permissionId, bytes32 messageHash, bytes calldata signature) + external + view + override + returns (ValidationData) + { + return _verifySignature(kernel, permissionId, messageHash, signature); + } + + function _verifySignature(address sender, bytes32 permissionId, bytes32 hash, bytes calldata signature) + private + view + returns (ValidationData) + { + ( + bytes memory authenticatorData, + string memory clientDataJSON, + uint256 challengeLocation, + uint256 responseTypeLocation, + uint256 r, + uint256 s + ) = abi.decode(signature, (bytes, string, uint256, uint256, uint256, uint256)); + + WebAuthnValidatorData memory pubKey = webAuthnValidatorStorage[msg.sender][permissionId][sender]; + require(pubKey.x != 0 && pubKey.y != 0, "WebAuthnSigner: kernel not registered"); + + bool isValid = WebAuthn.verifySignature( + abi.encodePacked(hash), + authenticatorData, + true, // TODO: check if this needs to be true always + clientDataJSON, + challengeLocation, + responseTypeLocation, + r, + s, + pubKey.x, + pubKey.y + ); + + if (isValid) { + return ValidationData.wrap(0); + } + + return SIG_VALIDATION_FAILED; + } +} From 30432fb067d8efe5224313420da5b8340e6bab81 Mon Sep 17 00:00:00 2001 From: Sahil Vasava Date: Mon, 19 Feb 2024 17:17:36 +0700 Subject: [PATCH 35/36] feat: added Sudo policy for ModularPermissionValidator --- .../80001/run-1708112110.json | 33 ++++++++++ .../80001/run-1708112117.json | 65 +++++++++++++++++++ .../80001/run-latest.json | 46 ++++++------- lib/p256-verifier | 1 + script/DeployModularPermission.s.sol | 10 +++ .../modularPermission/policies/SudoPolicy.sol | 29 +++++++++ 6 files changed, 161 insertions(+), 23 deletions(-) create mode 100644 broadcast/DeployModularPermission.s.sol/80001/run-1708112110.json create mode 100644 broadcast/DeployModularPermission.s.sol/80001/run-1708112117.json create mode 160000 lib/p256-verifier create mode 100644 src/validator/modularPermission/policies/SudoPolicy.sol diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-1708112110.json b/broadcast/DeployModularPermission.s.sol/80001/run-1708112110.json new file mode 100644 index 00000000..2c82f2e1 --- /dev/null +++ b/broadcast/DeployModularPermission.s.sol/80001/run-1708112110.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0x89e6d563669543b286e9a46b28a735c7fffe00a561b93a88e0a853dda955ccfb", + "transactionType": "CREATE2", + "contractName": "SudoPolicy", + "contractAddress": "0x9262C3A894328f9036Aa7a3f0f2cE8CF684ad20f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x3f7cc", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610270806100206000396000f3fe6080604052600436106100335760003560e01c8062282ae014610038578063c92ce3511461004e578063ecfcd93014610079575b600080fd5b61004c610046366004610106565b50505050565b005b61006761005c366004610160565b600095945050505050565b60405190815260200160405180910390f35b34801561008557600080fd5b506100676100943660046101ee565b6000979650505050505050565b80356001600160a01b03811681146100b857600080fd5b919050565b60008083601f8401126100cf57600080fd5b50813567ffffffffffffffff8111156100e757600080fd5b6020830191508360208285010111156100ff57600080fd5b9250929050565b6000806000806060858703121561011c57600080fd5b610125856100a1565b935060208501359250604085013567ffffffffffffffff81111561014857600080fd5b610154878288016100bd565b95989497509550505050565b60008060008060006080868803121561017857600080fd5b610181866100a1565b945060208601359350604086013567ffffffffffffffff808211156101a557600080fd5b90870190610160828a0312156101ba57600080fd5b909350606087013590808211156101d057600080fd5b506101dd888289016100bd565b969995985093965092949392505050565b600080600080600080600060c0888a03121561020957600080fd5b610212886100a1565b9650610220602089016100a1565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff81111561025157600080fd5b61025d8a828b016100bd565b989b979a5095985093969295929350505056", + "nonce": "0x1d8" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x89e6d563669543b286e9a46b28a735c7fffe00a561b93a88e0a853dda955ccfb" + ], + "returns": {}, + "timestamp": 1708112110, + "chain": 80001, + "multi": false, + "commit": "c6d2eff" +} \ No newline at end of file diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-1708112117.json b/broadcast/DeployModularPermission.s.sol/80001/run-1708112117.json new file mode 100644 index 00000000..af2b7e09 --- /dev/null +++ b/broadcast/DeployModularPermission.s.sol/80001/run-1708112117.json @@ -0,0 +1,65 @@ +{ + "transactions": [ + { + "hash": "0x89e6d563669543b286e9a46b28a735c7fffe00a561b93a88e0a853dda955ccfb", + "transactionType": "CREATE2", + "contractName": "SudoPolicy", + "contractAddress": "0x9262C3A894328f9036Aa7a3f0f2cE8CF684ad20f", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x3f7cc", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610270806100206000396000f3fe6080604052600436106100335760003560e01c8062282ae014610038578063c92ce3511461004e578063ecfcd93014610079575b600080fd5b61004c610046366004610106565b50505050565b005b61006761005c366004610160565b600095945050505050565b60405190815260200160405180910390f35b34801561008557600080fd5b506100676100943660046101ee565b6000979650505050505050565b80356001600160a01b03811681146100b857600080fd5b919050565b60008083601f8401126100cf57600080fd5b50813567ffffffffffffffff8111156100e757600080fd5b6020830191508360208285010111156100ff57600080fd5b9250929050565b6000806000806060858703121561011c57600080fd5b610125856100a1565b935060208501359250604085013567ffffffffffffffff81111561014857600080fd5b610154878288016100bd565b95989497509550505050565b60008060008060006080868803121561017857600080fd5b610181866100a1565b945060208601359350604086013567ffffffffffffffff808211156101a557600080fd5b90870190610160828a0312156101ba57600080fd5b909350606087013590808211156101d057600080fd5b506101dd888289016100bd565b969995985093965092949392505050565b600080600080600080600060c0888a03121561020957600080fd5b610212886100a1565b9650610220602089016100a1565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff81111561025157600080fd5b61025d8a828b016100bd565b989b979a5095985093969295929350505056", + "nonce": "0x1d8" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x89e6d563669543b286e9a46b28a735c7fffe00a561b93a88e0a853dda955ccfb", + "transactionIndex": "0x3", + "blockHash": "0x9e7b7d9ca8c172613bfc0fa847fb7d588487008d1b7b7c1e5de7658bd07f7700", + "blockNumber": "0x2bdc57c", + "from": "0xA02CDdFa44B8C01b4257F54ac1c43F75801E8175", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x11750a", + "gasUsed": "0x2df96", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000a02cddfa44b8c01b4257f54ac1c43f75801e8175", + "0x000000000000000000000000be188d6641e8b680743a4815dfa0f6208038960f" + ], + "data": "0x000000000000000000000000000000000000000000000000000100e681fc8a0000000000000000000000000000000000000000000000000002b49b1af88c2ced00000000000000000000000000000000000000000000365882a68791112f118100000000000000000000000000000000000000000000000002b39a34768fa2ed00000000000000000000000000000000000000000000365882a78877932b9b81", + "blockHash": "0x9e7b7d9ca8c172613bfc0fa847fb7d588487008d1b7b7c1e5de7658bd07f7700", + "blockNumber": "0x2bdc57c", + "transactionHash": "0x89e6d563669543b286e9a46b28a735c7fffe00a561b93a88e0a853dda955ccfb", + "transactionIndex": "0x3", + "logIndex": "0x8", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000004000000000000000000000000000000000000000020000000080000040000000000000000000000000000000000000000000000000000080000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000008000000000000000000000000100040000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x59682f0f" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1708112117, + "chain": 80001, + "multi": false, + "commit": "c6d2eff" +} \ No newline at end of file diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-latest.json b/broadcast/DeployModularPermission.s.sol/80001/run-latest.json index b9c6e7d1..af2b7e09 100644 --- a/broadcast/DeployModularPermission.s.sol/80001/run-latest.json +++ b/broadcast/DeployModularPermission.s.sol/80001/run-latest.json @@ -1,20 +1,20 @@ { "transactions": [ { - "hash": "0xafc9cb887a29150932f5e25c421edb3170b0a8d998368bf85c20d6c9877781eb", + "hash": "0x89e6d563669543b286e9a46b28a735c7fffe00a561b93a88e0a853dda955ccfb", "transactionType": "CREATE2", - "contractName": "SignaturePolicy", - "contractAddress": "0x60e9a007782EB649B291608dCa9E74Aaa966D122", + "contractName": "SudoPolicy", + "contractAddress": "0x9262C3A894328f9036Aa7a3f0f2cE8CF684ad20f", "function": null, "arguments": null, "transaction": { "type": "0x00", "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x80a90", + "gas": "0x3f7cc", "value": "0x0", - "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061058c806100206000396000f3fe60806040526004361061003e5760003560e01c8062282ae014610043578063466a35f214610058578063c92ce351146100ad578063ecfcd930146100d4575b600080fd5b6100566100513660046102ce565b6100f4565b005b34801561006457600080fd5b50610098610073366004610328565b6000602081815293815260408082208552928152828120909352825290205460ff1681565b60405190151581526020015b60405180910390f35b6100c66100bb366004610364565b600095945050505050565b6040519081526020016100a4565b3480156100e057600080fd5b506100c66100ef3660046103f2565b61021d565b60006101028284018461048a565b905060005b81518110156102155760006001600160a01b031682828151811061012d5761012d61054f565b60200260200101516001600160a01b031603610178576000858152602081815260408083206001600160a01b038a16845282528083209091529020805460ff19166001179055610203565b600160008087815260200190815260200160002060008484815181106101a0576101a061054f565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8061020d81610565565b915050610107565b505050505050565b6000858152602081815260408083206001600160a01b03808b168552908352818420908b16845290915281205460ff161561025a5750600061025e565b5060015b979650505050505050565b80356001600160a01b038116811461028057600080fd5b919050565b60008083601f84011261029757600080fd5b50813567ffffffffffffffff8111156102af57600080fd5b6020830191508360208285010111156102c757600080fd5b9250929050565b600080600080606085870312156102e457600080fd5b6102ed85610269565b935060208501359250604085013567ffffffffffffffff81111561031057600080fd5b61031c87828801610285565b95989497509550505050565b60008060006060848603121561033d57600080fd5b8335925061034d60208501610269565b915061035b60408501610269565b90509250925092565b60008060008060006080868803121561037c57600080fd5b61038586610269565b945060208601359350604086013567ffffffffffffffff808211156103a957600080fd5b90870190610160828a0312156103be57600080fd5b909350606087013590808211156103d457600080fd5b506103e188828901610285565b969995985093965092949392505050565b600080600080600080600060c0888a03121561040d57600080fd5b61041688610269565b965061042460208901610269565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff81111561045557600080fd5b6104618a828b01610285565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561049d57600080fd5b823567ffffffffffffffff808211156104b557600080fd5b818501915085601f8301126104c957600080fd5b8135818111156104db576104db610474565b8060051b604051601f19603f8301168101818110858211171561050057610500610474565b60405291825284820192508381018501918883111561051e57600080fd5b938501935b828510156105435761053485610269565b84529385019392850192610523565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b60006001820161058557634e487b7160e01b600052601160045260246000fd5b506001019056", - "nonce": "0x1d5" + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610270806100206000396000f3fe6080604052600436106100335760003560e01c8062282ae014610038578063c92ce3511461004e578063ecfcd93014610079575b600080fd5b61004c610046366004610106565b50505050565b005b61006761005c366004610160565b600095945050505050565b60405190815260200160405180910390f35b34801561008557600080fd5b506100676100943660046101ee565b6000979650505050505050565b80356001600160a01b03811681146100b857600080fd5b919050565b60008083601f8401126100cf57600080fd5b50813567ffffffffffffffff8111156100e757600080fd5b6020830191508360208285010111156100ff57600080fd5b9250929050565b6000806000806060858703121561011c57600080fd5b610125856100a1565b935060208501359250604085013567ffffffffffffffff81111561014857600080fd5b610154878288016100bd565b95989497509550505050565b60008060008060006080868803121561017857600080fd5b610181866100a1565b945060208601359350604086013567ffffffffffffffff808211156101a557600080fd5b90870190610160828a0312156101ba57600080fd5b909350606087013590808211156101d057600080fd5b506101dd888289016100bd565b969995985093965092949392505050565b600080600080600080600060c0888a03121561020957600080fd5b610212886100a1565b9650610220602089016100a1565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff81111561025157600080fd5b61025d8a828b016100bd565b989b979a5095985093969295929350505056", + "nonce": "0x1d8" }, "additionalContracts": [], "isFixedGasLimit": false @@ -22,14 +22,14 @@ ], "receipts": [ { - "transactionHash": "0xafc9cb887a29150932f5e25c421edb3170b0a8d998368bf85c20d6c9877781eb", - "transactionIndex": "0x2", - "blockHash": "0xde9e19ccd546c800277af8effd96cbe24640ed08591c3ac968bd8d0d5e2433b8", - "blockNumber": "0x2bbe632", + "transactionHash": "0x89e6d563669543b286e9a46b28a735c7fffe00a561b93a88e0a853dda955ccfb", + "transactionIndex": "0x3", + "blockHash": "0x9e7b7d9ca8c172613bfc0fa847fb7d588487008d1b7b7c1e5de7658bd07f7700", + "blockNumber": "0x2bdc57c", "from": "0xA02CDdFa44B8C01b4257F54ac1c43F75801E8175", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0x1259af", - "gasUsed": "0x57fed", + "cumulativeGasUsed": "0x11750a", + "gasUsed": "0x2df96", "contractAddress": null, "logs": [ { @@ -38,28 +38,28 @@ "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", "0x0000000000000000000000000000000000000000000000000000000000001010", "0x000000000000000000000000a02cddfa44b8c01b4257f54ac1c43f75801e8175", - "0x000000000000000000000000c275dc8be39f50d12f66b6a63629c39da5bae5bd" + "0x000000000000000000000000be188d6641e8b680743a4815dfa0f6208038960f" ], - "data": "0x0000000000000000000000000000000000000000000000000002e1918fc7c40e000000000000000000000000000000000000000000000000030db870c5511d83000000000000000000000000000000000000000000001436667fd2243f7a0a55000000000000000000000000000000000000000000000000030ad6df358959750000000000000000000000000000000000000000000014366682b3b5cf41ce63", - "blockHash": "0xde9e19ccd546c800277af8effd96cbe24640ed08591c3ac968bd8d0d5e2433b8", - "blockNumber": "0x2bbe632", - "transactionHash": "0xafc9cb887a29150932f5e25c421edb3170b0a8d998368bf85c20d6c9877781eb", - "transactionIndex": "0x2", - "logIndex": "0x7", + "data": "0x000000000000000000000000000000000000000000000000000100e681fc8a0000000000000000000000000000000000000000000000000002b49b1af88c2ced00000000000000000000000000000000000000000000365882a68791112f118100000000000000000000000000000000000000000000000002b39a34768fa2ed00000000000000000000000000000000000000000000365882a78877932b9b81", + "blockHash": "0x9e7b7d9ca8c172613bfc0fa847fb7d588487008d1b7b7c1e5de7658bd07f7700", + "blockNumber": "0x2bdc57c", + "transactionHash": "0x89e6d563669543b286e9a46b28a735c7fffe00a561b93a88e0a853dda955ccfb", + "transactionIndex": "0x3", + "logIndex": "0x8", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000002000000000000000000000000000000000000000000000000000800000000000000000040100000000000000000000000000000000000000000000000000020000000080000040000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000040000000004000000000000000000001000008000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000004000000000000000000000000000000000000000020000000080000040000000000000000000000000000000000000000000000000000080000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000008000000000000000000000000100040000000000000000000000000000000000000000000000000000000000000000000100000", "type": "0x0", - "effectiveGasPrice": "0x861c4696" + "effectiveGasPrice": "0x59682f0f" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1707822525, + "timestamp": 1708112117, "chain": 80001, "multi": false, - "commit": "1d02052" + "commit": "c6d2eff" } \ No newline at end of file diff --git a/lib/p256-verifier b/lib/p256-verifier new file mode 160000 index 00000000..29475ae3 --- /dev/null +++ b/lib/p256-verifier @@ -0,0 +1 @@ +Subproject commit 29475ae300ec95d98d5c7cc34c094846f0aa2dcd diff --git a/script/DeployModularPermission.s.sol b/script/DeployModularPermission.s.sol index 8ae9273a..d18b2eaf 100644 --- a/script/DeployModularPermission.s.sol +++ b/script/DeployModularPermission.s.sol @@ -4,6 +4,7 @@ import "src/validator/modularPermission/ModularPermissionValidator.sol"; import "src/validator/modularPermission/signers/ECDSASigner.sol"; import "src/validator/modularPermission/policies/GasPolicy.sol"; import "src/validator/modularPermission/policies/SignaturePolicy.sol"; +import "src/validator/modularPermission/policies/SudoPolicy.sol"; import {MerklePolicy} from "src/validator/modularPermission/policies/MerklePolicy.sol"; import "forge-std/Script.sol"; import "forge-std/console.sol"; @@ -14,6 +15,7 @@ contract DeployModularPermission is Script { address constant EXPECTED_GAS_POLICY_ADDRESS = 0x62868E950Efbb336DCFf033598Ee5E602f0a93cD; address constant EXPECTED_MERKLE_POLICY_ADDRESS = 0xb808D75B5ACf6B5513eb816d3980C733ae6Be468; address constant EXPECTED_SIGNATURE_POLICY_ADDRESS = 0x60e9a007782EB649B291608dCa9E74Aaa966D122; + address constant EXPECTED_SUDO_POLICY_ADDRESS = 0x9262C3A894328f9036Aa7a3f0f2cE8CF684ad20f; function run() public { uint256 key = vm.envUint("TESTNET_DEPLOYER_PRIVATE_KEY"); @@ -59,6 +61,14 @@ contract DeployModularPermission is Script { console.log("signturePolicy address: %s", address(EXPECTED_SIGNATURE_POLICY_ADDRESS)); } + if (EXPECTED_SUDO_POLICY_ADDRESS.code.length == 0) { + console.log("deploying SudoPolicy"); + SudoPolicy sudoPolicy = new SudoPolicy{salt: 0}(); + console.log("sudoPolicy address: %s", address(sudoPolicy)); + } else { + console.log("sudoPolicy address: %s", address(EXPECTED_SUDO_POLICY_ADDRESS)); + } + vm.stopBroadcast(); } } diff --git a/src/validator/modularPermission/policies/SudoPolicy.sol b/src/validator/modularPermission/policies/SudoPolicy.sol new file mode 100644 index 00000000..f3125de6 --- /dev/null +++ b/src/validator/modularPermission/policies/SudoPolicy.sol @@ -0,0 +1,29 @@ +pragma solidity ^0.8.0; + +import {UserOperation} from "I4337/interfaces/UserOperation.sol"; +import {ValidationData} from "src/common/Types.sol"; +import {IPolicy} from "../IPolicy.sol"; + +contract SudoPolicy is IPolicy { + function registerPolicy(address kernel, bytes32 permissionId, bytes calldata data) external payable override {} + + function checkUserOpPolicy(address kernel, bytes32 permissionId, UserOperation calldata userOp, bytes calldata) + external + payable + override + returns (ValidationData) + { + return ValidationData.wrap(0); + } + + function validateSignature( + address kernel, + address caller, + bytes32 permissionId, + bytes32 messageHash, + bytes32 rawHash, + bytes calldata signature + ) external view override returns (ValidationData) { + return ValidationData.wrap(0); + } +} From 5f1b09450a4a83d809f3907321c752332701b575 Mon Sep 17 00:00:00 2001 From: Sahil Vasava Date: Wed, 21 Feb 2024 08:45:04 +0700 Subject: [PATCH 36/36] fix: nonce for single tx dual enable and ECDSASigner sig --- .../80001/run-1708379656.json | 31 +++++ .../80001/run-1708379701.json | 33 +++++ .../80001/run-1708379708.json | 65 ++++++++++ .../DeployKernel.s.sol/80001/run-latest.json | 65 ++++++++++ .../80001/run-1708376910.json | 53 ++++++++ .../80001/run-1708376917.json | 117 ++++++++++++++++++ .../80001/run-1708453269.json | 33 +++++ .../80001/run-1708453276.json | 65 ++++++++++ .../80001/run-latest.json | 46 +++---- script/DeployModularPermission.s.sol | 6 +- .../ModularPermissionValidator.sol | 7 +- .../modularPermission/mock/MockRequestor.sol | 11 ++ .../modularPermission/signers/ECDSASigner.sol | 11 +- 13 files changed, 512 insertions(+), 31 deletions(-) create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1708379656.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1708379701.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-1708379708.json create mode 100644 broadcast/DeployKernel.s.sol/80001/run-latest.json create mode 100644 broadcast/DeployModularPermission.s.sol/80001/run-1708376910.json create mode 100644 broadcast/DeployModularPermission.s.sol/80001/run-1708376917.json create mode 100644 broadcast/DeployModularPermission.s.sol/80001/run-1708453269.json create mode 100644 broadcast/DeployModularPermission.s.sol/80001/run-1708453276.json create mode 100644 src/validator/modularPermission/mock/MockRequestor.sol diff --git a/broadcast/DeployKernel.s.sol/80001/run-1708379656.json b/broadcast/DeployKernel.s.sol/80001/run-1708379656.json new file mode 100644 index 00000000..b47ca049 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1708379656.json @@ -0,0 +1,31 @@ +{ + "transactions": [ + { + "hash": null, + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0x5FC0236D6c88a65beD32EECDC5D60a5CAb377717", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x32ee8b", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006101406040523480156200001257600080fd5b5060405162002c4138038062002c41833981016040819052620000359162000137565b306080524660a0528060608062000081604080518082018252600681526512d95c9b995b60d21b60208083019190915282518084019093526005835264302e322e3360d81b9083015291565b815160209283012081519183019190912060c082905260e0819052604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8152938401929092529082015246606082015230608082015260a090206101005250506001600160a01b031661012052507f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd98054600160501b600160f01b0319166a010000000000000000000017905562000169565b6000602082840312156200014a57600080fd5b81516001600160a01b03811681146200016257600080fd5b9392505050565b60805160a05160c05160e0516101005161012051612a3b62000206600039600081816101e9015281816105ec015281816108e401528181610ae601528181610bb701528181610c6b01528181610f7b01528181610fff015281816110b7015281816112020152818161129b015261132901526000611c6901526000611d2301526000611cfd01526000611cad01526000611c8a0152612a3b6000f3fe60806040526004361061014f5760003560e01c806354fd4d50116100b6578063b68df16d1161006f578063b68df16d1461060e578063bc197c8114610621578063d087d28814610650578063d1f5789414610665578063d541622114610678578063f23a6e611461068b5761018e565b806354fd4d501461050557806355b14f501461053657806357b750471461054957806384b0196e1461056e57806388e7fd0614610596578063b0d691fe146105da5761018e565b806334fcd5be1161010857806334fcd5be146103885780633659cfe61461039b5780633a871cdd146103ae5780633e1b0812146103c157806351166ba0146103e157806351945447146104f25761018e565b806306fdde03146102615780630b3dc354146102a9578063150b7a02146102e25780631626ba7e1461032757806329f8b17414610347578063333daf921461035a5761018e565b3661018e57604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080356001600160e01b031916905060006101b56000805160206129fb83398151915290565b6001600160e01b0319831660009081526002919091016020526040902054600160601b90046001600160a01b0390811691507f000000000000000000000000000000000000000000000000000000000000000016331480159061021d575061021b6106b8565b155b1561023b57604051637046c88d60e01b815260040160405180910390fd5b3660008037600080366000845af43d6000803e80801561025a573d6000f35b3d6000fd5b005b34801561026d57600080fd5b506102936040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102a09190611dcf565b60405180910390f35b3480156102b557600080fd5b50600080516020612a1b8339815191525460501c5b6040516001600160a01b0390911681526020016102a0565b3480156102ee57600080fd5b5061030e6102fd366004611e52565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016102a0565b34801561033357600080fd5b5061030e610342366004611ec4565b610800565b61025f610355366004611f3b565b6108d9565b34801561036657600080fd5b5061037a610375366004611ec4565b610ac4565b6040519081526020016102a0565b61025f6103963660046120d9565b610adb565b61025f6103a93660046121df565b610bac565b61037a6103bc3660046121fc565b610c5e565b3480156103cd57600080fd5b5061037a6103dc36600461224f565b610f54565b3480156103ed57600080fd5b506104a56103fc366004612278565b60408051608080820183526000808352602080840182905283850182905260609384018290526001600160e01b03199590951681527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda855283902083519182018452805465ffffffffffff8082168452600160301b82041695830195909552600160601b9094046001600160a01b03908116938201939093526001909301549091169082015290565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b0390811692820192909252606092830151909116918101919091526080016102a0565b61025f610500366004612293565b610ff4565b34801561051157600080fd5b5061029360405180604001604052806005815260200164302e322e3360d81b81525081565b61025f610544366004612302565b6110ac565b34801561055557600080fd5b50600080516020612a1b8339815191525460e01b61030e565b34801561057a57600080fd5b506105836111d0565b6040516102a0979695949392919061233d565b3480156105a257600080fd5b50600080516020612a1b83398151915254640100000000900465ffffffffffff1660405165ffffffffffff90911681526020016102a0565b3480156105e657600080fd5b506102ca7f000000000000000000000000000000000000000000000000000000000000000081565b61025f61061c3660046123d3565b6111f7565b34801561062d57600080fd5b5061030e61063c366004612466565b63bc197c8160e01b98975050505050505050565b34801561065c57600080fd5b5061037a61127c565b61025f610673366004612302565b611313565b61025f610686366004612278565b61131e565b34801561069757600080fd5b5061030e6106a6366004612524565b63f23a6e6160e01b9695505050505050565b60006106c6336000366113b4565b156106d15750600190565b600080356001600160e01b031916905060006106f86000805160206129fb83398151915290565b6001600160e01b0319831660009081526002919091016020526040902060018101549091506001600160a01b0316158061075c57508054600160301b900465ffffffffffff161580159061075c5750805442600160301b90910465ffffffffffff16105b80610771575080544265ffffffffffff909116115b1561077f5760009250505090565b6001810154604051639ea9bd5960e01b81526001600160a01b0390911690639ea9bd59906107b690339060009036906004016125c8565b6020604051808303816000875af11580156107d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f991906125ed565b9250505090565b60008061080b611447565b60405161190160f01b60208201526022810182905260428101879052909150600090606201604051602081830303815290604052805190602001209050600061085733838989896114ca565b9050600080600061086784611645565b925092509250428365ffffffffffff161115801561088d5750428265ffffffffffff1610155b80156108a057506001600160a01b038116155b156108bb5750630b135d3f60e11b95506108d2945050505050565b506001600160e01b031995506108d2945050505050565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906109125750333014155b1561093057604051637046c88d60e01b815260040160405180910390fd5b60405180608001604052808465ffffffffffff1681526020018565ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b03168152506109886000805160206129fb83398151915290565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176bffffffffffffffffffffffff16600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c95955690610a45908590859060040161260f565b600060405180830381600087803b158015610a5f57600080fd5b505af1158015610a73573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b6000610ad333858686866114ca565b949350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610b195750610b176106b8565b155b15610b3757604051637046c88d60e01b815260040160405180910390fd5b805160005b81811015610ba7576000838281518110610b5857610b58612623565b6020026020010151905060008160000151905060008260200151905060008360400151905060008082516020840185875af13d6000803e80801561025a57600187019650505050505050610b3c565b505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610be55750333014155b15610c0357604051637046c88d60e01b815260040160405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ca957604051636b31ba1560e11b815260040160405180910390fd5b6024600480356101448101358101838101939083013592910190600090610cd290828587612639565b610cdb91612663565b90506001600160e01b03198116600003610d15578515610cff573434343489335af1505b610d0a888888611678565b9450505050506108d2565b600080516020612a1b8339815191525460e01b81811615610d3e5763fc2f51c56000526004601cfd5b5060006001600160e01b03198216600160e01b03610e0d5760408301358301601f1981013560007f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda81610d946004828688612639565b610d9d91612663565b6001600160e01b0319168152602081019190915260400160002060018101546001600160a01b031694509050610dd6876004818b612639565b82549199509750600160301b810460a01b65ffffffffffff60a01b1660d09190911b6001600160d01b031916179850505050610e6f565b6001600160e01b03198216600160e11b03610e615760408301358301601f19810135610e50610e40600460008486612639565b610e4991612663565b8888611770565b919a50985096509250610e6f915050565b6001955050505050506108d2565b8615610e7f57343434348a335af1505b6000610e8a8a612691565b905085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140820152604051633a871cdd60e01b8152610f469088906001600160a01b03851690633a871cdd90610efe9086908f908f9060040161279f565b6020604051808303816000875af1158015610f1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f419190612891565b611ad9565b9a9950505050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610fca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fee9190612891565b92915050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480159061102d5750333014155b801561103e575061103c6106b8565b155b1561105c57604051637046c88d60e01b815260040160405180910390fd5b6000816001811115611070576110706128aa565b1461108e576040516367ce775960e01b815260040160405180910390fd5b60008083516020850186885af13d6000803e80801561025a573d6000f35b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110e55750333014155b1561110357604051637046c88d60e01b815260040160405180910390fd5b600080516020612a1b83398151915280546001600160a01b03858116600160501b818102600160501b600160f01b031985161790945560405193909204169182907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c95955690611198908690869060040161260f565b600060405180830381600087803b1580156111b257600080fd5b505af11580156111c6573d6000803e3d6000fd5b5050505050505050565b600f60f81b60608060008080836111e5611b97565b97989097965046955030945091925090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112305750333014155b8015611241575061123f6106b8565b155b1561125f57604051637046c88d60e01b815260040160405180910390fd5b600080825160208401855af43d6000803e80801561025a573d6000f35b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa1580156112ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130e9190612891565b905090565b610ba7838383611bd3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113575750333014155b1561137557604051637046c88d60e01b815260040160405180910390fd5b600080516020612a1b833981519152805460e09290921c69ffffffffffffffffffff19909216919091176401000000004265ffffffffffff1602179055565b600080516020612a1b83398151915254604051639ea9bd5960e01b815260009160501c906001600160a01b03821690639ea9bd59906113fb908890889088906004016125c8565b6020604051808303816000875af115801561141a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143e91906125ed565b95945050505050565b6000806000611454611b97565b8151602092830120815191830191909120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818601528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c0909201905280519101209392505050565b600080600080516020612a1b8339815191525460501c9050600080826001600160a01b031663333daf9260e01b89888860405160240161150c939291906128c0565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b0319909516949094179093525161154e928b918e91016128da565b60408051601f19818403018152908290526115689161290e565b600060405180830381855afa9150503d80600081146115a3576040519150601f19603f3d011682016040523d82523d6000602084013e6115a8565b606091505b5091509150816116245760405162461bcd60e51b815260206004820152603860248201527f4b65726e656c3a3a5f76616c69646174655369676e61747572653a206661696c60448201527f656420746f2076616c6964617465207369676e61747572650000000000000000606482015260840160405180910390fd5b808060200190518101906116389190612891565b9998505050505050505050565b600060a082901c65ffffffffffff16828115600019810161166a5765ffffffffffff92505b508360d01c92509193909250565b60008061168485612691565b905061169461014086018661292a565b6116a2916004908290612639565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140820152600080516020612a1b83398151915254604051633a871cdd60e01b815260509190911c906001600160a01b03821690633a871cdd906117239085908990899060040161279f565b6020604051808303816000875af1158015611742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117669190612891565b9695505050505050565b6000803681611783602460108789612639565b61178c91612970565b60601c9350605860006117a2826038898b612639565b6117ab9161299e565b828101929091508801816117c460208501858b8d612639565b6117cd9161299e565b60001c925060208401935060006118b77f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee96417660001b8d8d8d60049060249261181693929190612639565b61181f9161299e565b60001c8e8e60249060389261183693929190612639565b61183f91612970565b60601c87876040516118529291906129bc565b60405190819003812061189c95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120611c67565b90506119076118db3083848f8f8b908b8d01926118d693929190612639565b6114ca565b8c8c6004906024926118ef93929190612639565b6118f89161299e565b6001600160a01b031916611ad9565b97508385019450848b019650848a03955060405180608001604052808c8c600490600a9261193793929190612639565b611940916129cc565b60d01c65ffffffffffff1681526020018c8c600a9060109261196493929190612639565b61196d916129cc565b60d01c65ffffffffffff1681526020018c8c60249060389261199193929190612639565b61199a91612970565b60601c6001600160a01b031681526020018c8c6010906024926119bf93929190612639565b6119c891612970565b60601c90526000805160206129fb8339815191526001600160e01b03198e166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176bffffffffffffffffffffffff16600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b8152908a1690630c95955690611a99908690869060040161260f565b600060405180830381600087803b158015611ab357600080fd5b505af1158015611ac7573d6000803e3d6000fd5b50505050505050505093509350935093565b600081830160601b8260601b81148460601b8214176001600160a01b0384861816151760018114611b0d5760019250611b8f565b6001600160d01b031980851690861681811881831102188686176001600160a01b031617935065ffffffffffff60a01b86169081611b525765ffffffffffff60a01b91505b5065ffffffffffff60a01b851680611b70575065ffffffffffff60a01b5b808218908211021880611b89575065ffffffffffff60a01b5b92909217915b505092915050565b604080518082018252600681526512d95c9b995b60d21b60208083019190915282518084019093526005835264302e322e3360d81b9083015291565b600080516020612a1b8339815191525460501c6001600160a01b03811615611c0d5760405162dc149f60e41b815260040160405180910390fd5b600080516020612a1b8339815191528054600160501b600160f01b031916600160501b6001600160a01b0387169081029190911790915560405163064acaab60e11b8152630c95955690611198908690869060040161260f565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f0000000000000000000000000000000000000000000000000000000000000000461416611d5a5750604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f00000000000000000000000000000000000000000000000000000000000000009181019190915246606082015230608082015260a090205b67190100000000000060005280601a5281603a52604260182090506000603a52919050565b60005b83811015611d9a578181015183820152602001611d82565b50506000910152565b60008151808452611dbb816020860160208601611d7f565b601f01601f19169290920160200192915050565b6020815260006108d26020830184611da3565b6001600160a01b0381168114611df757600080fd5b50565b8035611e0581611de2565b919050565b60008083601f840112611e1c57600080fd5b5081356001600160401b03811115611e3357600080fd5b602083019150836020828501011115611e4b57600080fd5b9250929050565b600080600080600060808688031215611e6a57600080fd5b8535611e7581611de2565b94506020860135611e8581611de2565b93506040860135925060608601356001600160401b03811115611ea757600080fd5b611eb388828901611e0a565b969995985093965092949392505050565b600080600060408486031215611ed957600080fd5b8335925060208401356001600160401b03811115611ef657600080fd5b611f0286828701611e0a565b9497909650939450505050565b80356001600160e01b031981168114611e0557600080fd5b65ffffffffffff81168114611df757600080fd5b600080600080600080600060c0888a031215611f5657600080fd5b611f5f88611f0f565b96506020880135611f6f81611de2565b95506040880135611f7f81611de2565b94506060880135611f8f81611f27565b93506080880135611f9f81611f27565b925060a08801356001600160401b03811115611fba57600080fd5b611fc68a828b01611e0a565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171561201157612011611fd9565b60405290565b60405161016081016001600160401b038111828210171561201157612011611fd9565b604051601f8201601f191681016001600160401b038111828210171561206257612062611fd9565b604052919050565b600082601f83011261207b57600080fd5b81356001600160401b0381111561209457612094611fd9565b6120a7601f8201601f191660200161203a565b8181528460208386010111156120bc57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208083850312156120ec57600080fd5b82356001600160401b038082111561210357600080fd5b818501915085601f83011261211757600080fd5b81358181111561212957612129611fd9565b8060051b61213885820161203a565b918252838101850191858101908984111561215257600080fd5b86860192505b83831015611638578235858111156121705760008081fd5b86016060818c03601f19018113156121885760008081fd5b612190611fef565b8983013561219d81611de2565b81526040838101358b8301529183013591888311156121bc5760008081fd5b6121ca8e8c8587010161206a565b90820152845250509186019190860190612158565b6000602082840312156121f157600080fd5b81356108d281611de2565b60008060006060848603121561221157600080fd5b83356001600160401b0381111561222757600080fd5b8401610160818703121561223a57600080fd5b95602085013595506040909401359392505050565b60006020828403121561226157600080fd5b81356001600160c01b03811681146108d257600080fd5b60006020828403121561228a57600080fd5b6108d282611f0f565b600080600080608085870312156122a957600080fd5b84356122b481611de2565b93506020850135925060408501356001600160401b038111156122d657600080fd5b6122e28782880161206a565b9250506060850135600281106122f757600080fd5b939692955090935050565b60008060006040848603121561231757600080fd5b833561232281611de2565b925060208401356001600160401b03811115611ef657600080fd5b60ff60f81b881681526000602060e08184015261235d60e084018a611da3565b838103604085015261236f818a611da3565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b818110156123c1578351835292840192918401916001016123a5565b50909c9b505050505050505050505050565b600080604083850312156123e657600080fd5b82356123f181611de2565b915060208301356001600160401b0381111561240c57600080fd5b6124188582860161206a565b9150509250929050565b60008083601f84011261243457600080fd5b5081356001600160401b0381111561244b57600080fd5b6020830191508360208260051b8501011115611e4b57600080fd5b60008060008060008060008060a0898b03121561248257600080fd5b883561248d81611de2565b9750602089013561249d81611de2565b965060408901356001600160401b03808211156124b957600080fd5b6124c58c838d01612422565b909850965060608b01359150808211156124de57600080fd5b6124ea8c838d01612422565b909650945060808b013591508082111561250357600080fd5b506125108b828c01611e0a565b999c989b5096995094979396929594505050565b60008060008060008060a0878903121561253d57600080fd5b863561254881611de2565b9550602087013561255881611de2565b9450604087013593506060870135925060808701356001600160401b0381111561258157600080fd5b61258d89828a01611e0a565b979a9699509497509295939492505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b038416815260406020820181905260009061143e908301848661259f565b6000602082840312156125ff57600080fd5b815180151581146108d257600080fd5b602081526000610ad360208301848661259f565b634e487b7160e01b600052603260045260246000fd5b6000808585111561264957600080fd5b8386111561265657600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015611b8f5760049490940360031b84901b1690921692915050565b600061016082360312156126a457600080fd5b6126ac612017565b6126b583611dfa565b81526020830135602082015260408301356001600160401b03808211156126db57600080fd5b6126e73683870161206a565b6040840152606085013591508082111561270057600080fd5b61270c3683870161206a565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561275c57600080fd5b6127683682880161206a565b83850152506101409150818501358181111561278357600080fd5b61278f3682880161206a565b8385015250505080915050919050565b606081526127b96060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526127e16101c0850183611da3565b91506060870151605f19808685030160c08701526127ff8483611da3565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261285b8787611da3565b9650808c0151955050505080868503016101a0870152505061287d8282611da3565b602085019690965250505060400152919050565b6000602082840312156128a357600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b83815260406020820152600061143e60408301848661259f565b600084516128ec818460208901611d7f565b919091019283525060601b6001600160601b0319166020820152603401919050565b60008251612920818460208701611d7f565b9190910192915050565b6000808335601e1984360301811261294157600080fd5b8301803591506001600160401b0382111561295b57600080fd5b602001915036819003821315611e4b57600080fd5b6001600160601b03198135818116916014851015611b8f5760149490940360031b84901b1690921692915050565b80356020831015610fee57600019602084900360031b1b1692915050565b8183823760009101908152919050565b6001600160d01b03198135818116916006851015611b8f5760069490940360031b84901b169092169291505056fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd8439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x95ea" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1708379656, + "chain": 80001, + "multi": false, + "commit": "525f3f4" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1708379701.json b/broadcast/DeployKernel.s.sol/80001/run-1708379701.json new file mode 100644 index 00000000..1db8adf8 --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1708379701.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0x98cccb650873fecf2ce04c1c7c631814d4be62760bc179f425742be214a4bfd5", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0x5FC0236D6c88a65beD32EECDC5D60a5CAb377717", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x32ee8b", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006101406040523480156200001257600080fd5b5060405162002c4138038062002c41833981016040819052620000359162000137565b306080524660a0528060608062000081604080518082018252600681526512d95c9b995b60d21b60208083019190915282518084019093526005835264302e322e3360d81b9083015291565b815160209283012081519183019190912060c082905260e0819052604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8152938401929092529082015246606082015230608082015260a090206101005250506001600160a01b031661012052507f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd98054600160501b600160f01b0319166a010000000000000000000017905562000169565b6000602082840312156200014a57600080fd5b81516001600160a01b03811681146200016257600080fd5b9392505050565b60805160a05160c05160e0516101005161012051612a3b62000206600039600081816101e9015281816105ec015281816108e401528181610ae601528181610bb701528181610c6b01528181610f7b01528181610fff015281816110b7015281816112020152818161129b015261132901526000611c6901526000611d2301526000611cfd01526000611cad01526000611c8a0152612a3b6000f3fe60806040526004361061014f5760003560e01c806354fd4d50116100b6578063b68df16d1161006f578063b68df16d1461060e578063bc197c8114610621578063d087d28814610650578063d1f5789414610665578063d541622114610678578063f23a6e611461068b5761018e565b806354fd4d501461050557806355b14f501461053657806357b750471461054957806384b0196e1461056e57806388e7fd0614610596578063b0d691fe146105da5761018e565b806334fcd5be1161010857806334fcd5be146103885780633659cfe61461039b5780633a871cdd146103ae5780633e1b0812146103c157806351166ba0146103e157806351945447146104f25761018e565b806306fdde03146102615780630b3dc354146102a9578063150b7a02146102e25780631626ba7e1461032757806329f8b17414610347578063333daf921461035a5761018e565b3661018e57604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080356001600160e01b031916905060006101b56000805160206129fb83398151915290565b6001600160e01b0319831660009081526002919091016020526040902054600160601b90046001600160a01b0390811691507f000000000000000000000000000000000000000000000000000000000000000016331480159061021d575061021b6106b8565b155b1561023b57604051637046c88d60e01b815260040160405180910390fd5b3660008037600080366000845af43d6000803e80801561025a573d6000f35b3d6000fd5b005b34801561026d57600080fd5b506102936040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102a09190611dcf565b60405180910390f35b3480156102b557600080fd5b50600080516020612a1b8339815191525460501c5b6040516001600160a01b0390911681526020016102a0565b3480156102ee57600080fd5b5061030e6102fd366004611e52565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016102a0565b34801561033357600080fd5b5061030e610342366004611ec4565b610800565b61025f610355366004611f3b565b6108d9565b34801561036657600080fd5b5061037a610375366004611ec4565b610ac4565b6040519081526020016102a0565b61025f6103963660046120d9565b610adb565b61025f6103a93660046121df565b610bac565b61037a6103bc3660046121fc565b610c5e565b3480156103cd57600080fd5b5061037a6103dc36600461224f565b610f54565b3480156103ed57600080fd5b506104a56103fc366004612278565b60408051608080820183526000808352602080840182905283850182905260609384018290526001600160e01b03199590951681527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda855283902083519182018452805465ffffffffffff8082168452600160301b82041695830195909552600160601b9094046001600160a01b03908116938201939093526001909301549091169082015290565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b0390811692820192909252606092830151909116918101919091526080016102a0565b61025f610500366004612293565b610ff4565b34801561051157600080fd5b5061029360405180604001604052806005815260200164302e322e3360d81b81525081565b61025f610544366004612302565b6110ac565b34801561055557600080fd5b50600080516020612a1b8339815191525460e01b61030e565b34801561057a57600080fd5b506105836111d0565b6040516102a0979695949392919061233d565b3480156105a257600080fd5b50600080516020612a1b83398151915254640100000000900465ffffffffffff1660405165ffffffffffff90911681526020016102a0565b3480156105e657600080fd5b506102ca7f000000000000000000000000000000000000000000000000000000000000000081565b61025f61061c3660046123d3565b6111f7565b34801561062d57600080fd5b5061030e61063c366004612466565b63bc197c8160e01b98975050505050505050565b34801561065c57600080fd5b5061037a61127c565b61025f610673366004612302565b611313565b61025f610686366004612278565b61131e565b34801561069757600080fd5b5061030e6106a6366004612524565b63f23a6e6160e01b9695505050505050565b60006106c6336000366113b4565b156106d15750600190565b600080356001600160e01b031916905060006106f86000805160206129fb83398151915290565b6001600160e01b0319831660009081526002919091016020526040902060018101549091506001600160a01b0316158061075c57508054600160301b900465ffffffffffff161580159061075c5750805442600160301b90910465ffffffffffff16105b80610771575080544265ffffffffffff909116115b1561077f5760009250505090565b6001810154604051639ea9bd5960e01b81526001600160a01b0390911690639ea9bd59906107b690339060009036906004016125c8565b6020604051808303816000875af11580156107d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f991906125ed565b9250505090565b60008061080b611447565b60405161190160f01b60208201526022810182905260428101879052909150600090606201604051602081830303815290604052805190602001209050600061085733838989896114ca565b9050600080600061086784611645565b925092509250428365ffffffffffff161115801561088d5750428265ffffffffffff1610155b80156108a057506001600160a01b038116155b156108bb5750630b135d3f60e11b95506108d2945050505050565b506001600160e01b031995506108d2945050505050565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906109125750333014155b1561093057604051637046c88d60e01b815260040160405180910390fd5b60405180608001604052808465ffffffffffff1681526020018565ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b03168152506109886000805160206129fb83398151915290565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176bffffffffffffffffffffffff16600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c95955690610a45908590859060040161260f565b600060405180830381600087803b158015610a5f57600080fd5b505af1158015610a73573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b6000610ad333858686866114ca565b949350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610b195750610b176106b8565b155b15610b3757604051637046c88d60e01b815260040160405180910390fd5b805160005b81811015610ba7576000838281518110610b5857610b58612623565b6020026020010151905060008160000151905060008260200151905060008360400151905060008082516020840185875af13d6000803e80801561025a57600187019650505050505050610b3c565b505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610be55750333014155b15610c0357604051637046c88d60e01b815260040160405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ca957604051636b31ba1560e11b815260040160405180910390fd5b6024600480356101448101358101838101939083013592910190600090610cd290828587612639565b610cdb91612663565b90506001600160e01b03198116600003610d15578515610cff573434343489335af1505b610d0a888888611678565b9450505050506108d2565b600080516020612a1b8339815191525460e01b81811615610d3e5763fc2f51c56000526004601cfd5b5060006001600160e01b03198216600160e01b03610e0d5760408301358301601f1981013560007f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda81610d946004828688612639565b610d9d91612663565b6001600160e01b0319168152602081019190915260400160002060018101546001600160a01b031694509050610dd6876004818b612639565b82549199509750600160301b810460a01b65ffffffffffff60a01b1660d09190911b6001600160d01b031916179850505050610e6f565b6001600160e01b03198216600160e11b03610e615760408301358301601f19810135610e50610e40600460008486612639565b610e4991612663565b8888611770565b919a50985096509250610e6f915050565b6001955050505050506108d2565b8615610e7f57343434348a335af1505b6000610e8a8a612691565b905085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140820152604051633a871cdd60e01b8152610f469088906001600160a01b03851690633a871cdd90610efe9086908f908f9060040161279f565b6020604051808303816000875af1158015610f1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f419190612891565b611ad9565b9a9950505050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610fca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fee9190612891565b92915050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480159061102d5750333014155b801561103e575061103c6106b8565b155b1561105c57604051637046c88d60e01b815260040160405180910390fd5b6000816001811115611070576110706128aa565b1461108e576040516367ce775960e01b815260040160405180910390fd5b60008083516020850186885af13d6000803e80801561025a573d6000f35b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110e55750333014155b1561110357604051637046c88d60e01b815260040160405180910390fd5b600080516020612a1b83398151915280546001600160a01b03858116600160501b818102600160501b600160f01b031985161790945560405193909204169182907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c95955690611198908690869060040161260f565b600060405180830381600087803b1580156111b257600080fd5b505af11580156111c6573d6000803e3d6000fd5b5050505050505050565b600f60f81b60608060008080836111e5611b97565b97989097965046955030945091925090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112305750333014155b8015611241575061123f6106b8565b155b1561125f57604051637046c88d60e01b815260040160405180910390fd5b600080825160208401855af43d6000803e80801561025a573d6000f35b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa1580156112ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130e9190612891565b905090565b610ba7838383611bd3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113575750333014155b1561137557604051637046c88d60e01b815260040160405180910390fd5b600080516020612a1b833981519152805460e09290921c69ffffffffffffffffffff19909216919091176401000000004265ffffffffffff1602179055565b600080516020612a1b83398151915254604051639ea9bd5960e01b815260009160501c906001600160a01b03821690639ea9bd59906113fb908890889088906004016125c8565b6020604051808303816000875af115801561141a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143e91906125ed565b95945050505050565b6000806000611454611b97565b8151602092830120815191830191909120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818601528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c0909201905280519101209392505050565b600080600080516020612a1b8339815191525460501c9050600080826001600160a01b031663333daf9260e01b89888860405160240161150c939291906128c0565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b0319909516949094179093525161154e928b918e91016128da565b60408051601f19818403018152908290526115689161290e565b600060405180830381855afa9150503d80600081146115a3576040519150601f19603f3d011682016040523d82523d6000602084013e6115a8565b606091505b5091509150816116245760405162461bcd60e51b815260206004820152603860248201527f4b65726e656c3a3a5f76616c69646174655369676e61747572653a206661696c60448201527f656420746f2076616c6964617465207369676e61747572650000000000000000606482015260840160405180910390fd5b808060200190518101906116389190612891565b9998505050505050505050565b600060a082901c65ffffffffffff16828115600019810161166a5765ffffffffffff92505b508360d01c92509193909250565b60008061168485612691565b905061169461014086018661292a565b6116a2916004908290612639565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140820152600080516020612a1b83398151915254604051633a871cdd60e01b815260509190911c906001600160a01b03821690633a871cdd906117239085908990899060040161279f565b6020604051808303816000875af1158015611742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117669190612891565b9695505050505050565b6000803681611783602460108789612639565b61178c91612970565b60601c9350605860006117a2826038898b612639565b6117ab9161299e565b828101929091508801816117c460208501858b8d612639565b6117cd9161299e565b60001c925060208401935060006118b77f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee96417660001b8d8d8d60049060249261181693929190612639565b61181f9161299e565b60001c8e8e60249060389261183693929190612639565b61183f91612970565b60601c87876040516118529291906129bc565b60405190819003812061189c95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120611c67565b90506119076118db3083848f8f8b908b8d01926118d693929190612639565b6114ca565b8c8c6004906024926118ef93929190612639565b6118f89161299e565b6001600160a01b031916611ad9565b97508385019450848b019650848a03955060405180608001604052808c8c600490600a9261193793929190612639565b611940916129cc565b60d01c65ffffffffffff1681526020018c8c600a9060109261196493929190612639565b61196d916129cc565b60d01c65ffffffffffff1681526020018c8c60249060389261199193929190612639565b61199a91612970565b60601c6001600160a01b031681526020018c8c6010906024926119bf93929190612639565b6119c891612970565b60601c90526000805160206129fb8339815191526001600160e01b03198e166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176bffffffffffffffffffffffff16600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b8152908a1690630c95955690611a99908690869060040161260f565b600060405180830381600087803b158015611ab357600080fd5b505af1158015611ac7573d6000803e3d6000fd5b50505050505050505093509350935093565b600081830160601b8260601b81148460601b8214176001600160a01b0384861816151760018114611b0d5760019250611b8f565b6001600160d01b031980851690861681811881831102188686176001600160a01b031617935065ffffffffffff60a01b86169081611b525765ffffffffffff60a01b91505b5065ffffffffffff60a01b851680611b70575065ffffffffffff60a01b5b808218908211021880611b89575065ffffffffffff60a01b5b92909217915b505092915050565b604080518082018252600681526512d95c9b995b60d21b60208083019190915282518084019093526005835264302e322e3360d81b9083015291565b600080516020612a1b8339815191525460501c6001600160a01b03811615611c0d5760405162dc149f60e41b815260040160405180910390fd5b600080516020612a1b8339815191528054600160501b600160f01b031916600160501b6001600160a01b0387169081029190911790915560405163064acaab60e11b8152630c95955690611198908690869060040161260f565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f0000000000000000000000000000000000000000000000000000000000000000461416611d5a5750604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f00000000000000000000000000000000000000000000000000000000000000009181019190915246606082015230608082015260a090205b67190100000000000060005280601a5281603a52604260182090506000603a52919050565b60005b83811015611d9a578181015183820152602001611d82565b50506000910152565b60008151808452611dbb816020860160208601611d7f565b601f01601f19169290920160200192915050565b6020815260006108d26020830184611da3565b6001600160a01b0381168114611df757600080fd5b50565b8035611e0581611de2565b919050565b60008083601f840112611e1c57600080fd5b5081356001600160401b03811115611e3357600080fd5b602083019150836020828501011115611e4b57600080fd5b9250929050565b600080600080600060808688031215611e6a57600080fd5b8535611e7581611de2565b94506020860135611e8581611de2565b93506040860135925060608601356001600160401b03811115611ea757600080fd5b611eb388828901611e0a565b969995985093965092949392505050565b600080600060408486031215611ed957600080fd5b8335925060208401356001600160401b03811115611ef657600080fd5b611f0286828701611e0a565b9497909650939450505050565b80356001600160e01b031981168114611e0557600080fd5b65ffffffffffff81168114611df757600080fd5b600080600080600080600060c0888a031215611f5657600080fd5b611f5f88611f0f565b96506020880135611f6f81611de2565b95506040880135611f7f81611de2565b94506060880135611f8f81611f27565b93506080880135611f9f81611f27565b925060a08801356001600160401b03811115611fba57600080fd5b611fc68a828b01611e0a565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171561201157612011611fd9565b60405290565b60405161016081016001600160401b038111828210171561201157612011611fd9565b604051601f8201601f191681016001600160401b038111828210171561206257612062611fd9565b604052919050565b600082601f83011261207b57600080fd5b81356001600160401b0381111561209457612094611fd9565b6120a7601f8201601f191660200161203a565b8181528460208386010111156120bc57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208083850312156120ec57600080fd5b82356001600160401b038082111561210357600080fd5b818501915085601f83011261211757600080fd5b81358181111561212957612129611fd9565b8060051b61213885820161203a565b918252838101850191858101908984111561215257600080fd5b86860192505b83831015611638578235858111156121705760008081fd5b86016060818c03601f19018113156121885760008081fd5b612190611fef565b8983013561219d81611de2565b81526040838101358b8301529183013591888311156121bc5760008081fd5b6121ca8e8c8587010161206a565b90820152845250509186019190860190612158565b6000602082840312156121f157600080fd5b81356108d281611de2565b60008060006060848603121561221157600080fd5b83356001600160401b0381111561222757600080fd5b8401610160818703121561223a57600080fd5b95602085013595506040909401359392505050565b60006020828403121561226157600080fd5b81356001600160c01b03811681146108d257600080fd5b60006020828403121561228a57600080fd5b6108d282611f0f565b600080600080608085870312156122a957600080fd5b84356122b481611de2565b93506020850135925060408501356001600160401b038111156122d657600080fd5b6122e28782880161206a565b9250506060850135600281106122f757600080fd5b939692955090935050565b60008060006040848603121561231757600080fd5b833561232281611de2565b925060208401356001600160401b03811115611ef657600080fd5b60ff60f81b881681526000602060e08184015261235d60e084018a611da3565b838103604085015261236f818a611da3565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b818110156123c1578351835292840192918401916001016123a5565b50909c9b505050505050505050505050565b600080604083850312156123e657600080fd5b82356123f181611de2565b915060208301356001600160401b0381111561240c57600080fd5b6124188582860161206a565b9150509250929050565b60008083601f84011261243457600080fd5b5081356001600160401b0381111561244b57600080fd5b6020830191508360208260051b8501011115611e4b57600080fd5b60008060008060008060008060a0898b03121561248257600080fd5b883561248d81611de2565b9750602089013561249d81611de2565b965060408901356001600160401b03808211156124b957600080fd5b6124c58c838d01612422565b909850965060608b01359150808211156124de57600080fd5b6124ea8c838d01612422565b909650945060808b013591508082111561250357600080fd5b506125108b828c01611e0a565b999c989b5096995094979396929594505050565b60008060008060008060a0878903121561253d57600080fd5b863561254881611de2565b9550602087013561255881611de2565b9450604087013593506060870135925060808701356001600160401b0381111561258157600080fd5b61258d89828a01611e0a565b979a9699509497509295939492505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b038416815260406020820181905260009061143e908301848661259f565b6000602082840312156125ff57600080fd5b815180151581146108d257600080fd5b602081526000610ad360208301848661259f565b634e487b7160e01b600052603260045260246000fd5b6000808585111561264957600080fd5b8386111561265657600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015611b8f5760049490940360031b84901b1690921692915050565b600061016082360312156126a457600080fd5b6126ac612017565b6126b583611dfa565b81526020830135602082015260408301356001600160401b03808211156126db57600080fd5b6126e73683870161206a565b6040840152606085013591508082111561270057600080fd5b61270c3683870161206a565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561275c57600080fd5b6127683682880161206a565b83850152506101409150818501358181111561278357600080fd5b61278f3682880161206a565b8385015250505080915050919050565b606081526127b96060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526127e16101c0850183611da3565b91506060870151605f19808685030160c08701526127ff8483611da3565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261285b8787611da3565b9650808c0151955050505080868503016101a0870152505061287d8282611da3565b602085019690965250505060400152919050565b6000602082840312156128a357600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b83815260406020820152600061143e60408301848661259f565b600084516128ec818460208901611d7f565b919091019283525060601b6001600160601b0319166020820152603401919050565b60008251612920818460208701611d7f565b9190910192915050565b6000808335601e1984360301811261294157600080fd5b8301803591506001600160401b0382111561295b57600080fd5b602001915036819003821315611e4b57600080fd5b6001600160601b03198135818116916014851015611b8f5760149490940360031b84901b1690921692915050565b80356020831015610fee57600019602084900360031b1b1692915050565b8183823760009101908152919050565b6001600160d01b03198135818116916006851015611b8f5760069490940360031b84901b169092169291505056fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd8439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1db" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x98cccb650873fecf2ce04c1c7c631814d4be62760bc179f425742be214a4bfd5" + ], + "returns": {}, + "timestamp": 1708379701, + "chain": 80001, + "multi": false, + "commit": "525f3f4" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-1708379708.json b/broadcast/DeployKernel.s.sol/80001/run-1708379708.json new file mode 100644 index 00000000..8290830e --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-1708379708.json @@ -0,0 +1,65 @@ +{ + "transactions": [ + { + "hash": "0x98cccb650873fecf2ce04c1c7c631814d4be62760bc179f425742be214a4bfd5", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0x5FC0236D6c88a65beD32EECDC5D60a5CAb377717", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x32ee8b", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006101406040523480156200001257600080fd5b5060405162002c4138038062002c41833981016040819052620000359162000137565b306080524660a0528060608062000081604080518082018252600681526512d95c9b995b60d21b60208083019190915282518084019093526005835264302e322e3360d81b9083015291565b815160209283012081519183019190912060c082905260e0819052604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8152938401929092529082015246606082015230608082015260a090206101005250506001600160a01b031661012052507f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd98054600160501b600160f01b0319166a010000000000000000000017905562000169565b6000602082840312156200014a57600080fd5b81516001600160a01b03811681146200016257600080fd5b9392505050565b60805160a05160c05160e0516101005161012051612a3b62000206600039600081816101e9015281816105ec015281816108e401528181610ae601528181610bb701528181610c6b01528181610f7b01528181610fff015281816110b7015281816112020152818161129b015261132901526000611c6901526000611d2301526000611cfd01526000611cad01526000611c8a0152612a3b6000f3fe60806040526004361061014f5760003560e01c806354fd4d50116100b6578063b68df16d1161006f578063b68df16d1461060e578063bc197c8114610621578063d087d28814610650578063d1f5789414610665578063d541622114610678578063f23a6e611461068b5761018e565b806354fd4d501461050557806355b14f501461053657806357b750471461054957806384b0196e1461056e57806388e7fd0614610596578063b0d691fe146105da5761018e565b806334fcd5be1161010857806334fcd5be146103885780633659cfe61461039b5780633a871cdd146103ae5780633e1b0812146103c157806351166ba0146103e157806351945447146104f25761018e565b806306fdde03146102615780630b3dc354146102a9578063150b7a02146102e25780631626ba7e1461032757806329f8b17414610347578063333daf921461035a5761018e565b3661018e57604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080356001600160e01b031916905060006101b56000805160206129fb83398151915290565b6001600160e01b0319831660009081526002919091016020526040902054600160601b90046001600160a01b0390811691507f000000000000000000000000000000000000000000000000000000000000000016331480159061021d575061021b6106b8565b155b1561023b57604051637046c88d60e01b815260040160405180910390fd5b3660008037600080366000845af43d6000803e80801561025a573d6000f35b3d6000fd5b005b34801561026d57600080fd5b506102936040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102a09190611dcf565b60405180910390f35b3480156102b557600080fd5b50600080516020612a1b8339815191525460501c5b6040516001600160a01b0390911681526020016102a0565b3480156102ee57600080fd5b5061030e6102fd366004611e52565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016102a0565b34801561033357600080fd5b5061030e610342366004611ec4565b610800565b61025f610355366004611f3b565b6108d9565b34801561036657600080fd5b5061037a610375366004611ec4565b610ac4565b6040519081526020016102a0565b61025f6103963660046120d9565b610adb565b61025f6103a93660046121df565b610bac565b61037a6103bc3660046121fc565b610c5e565b3480156103cd57600080fd5b5061037a6103dc36600461224f565b610f54565b3480156103ed57600080fd5b506104a56103fc366004612278565b60408051608080820183526000808352602080840182905283850182905260609384018290526001600160e01b03199590951681527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda855283902083519182018452805465ffffffffffff8082168452600160301b82041695830195909552600160601b9094046001600160a01b03908116938201939093526001909301549091169082015290565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b0390811692820192909252606092830151909116918101919091526080016102a0565b61025f610500366004612293565b610ff4565b34801561051157600080fd5b5061029360405180604001604052806005815260200164302e322e3360d81b81525081565b61025f610544366004612302565b6110ac565b34801561055557600080fd5b50600080516020612a1b8339815191525460e01b61030e565b34801561057a57600080fd5b506105836111d0565b6040516102a0979695949392919061233d565b3480156105a257600080fd5b50600080516020612a1b83398151915254640100000000900465ffffffffffff1660405165ffffffffffff90911681526020016102a0565b3480156105e657600080fd5b506102ca7f000000000000000000000000000000000000000000000000000000000000000081565b61025f61061c3660046123d3565b6111f7565b34801561062d57600080fd5b5061030e61063c366004612466565b63bc197c8160e01b98975050505050505050565b34801561065c57600080fd5b5061037a61127c565b61025f610673366004612302565b611313565b61025f610686366004612278565b61131e565b34801561069757600080fd5b5061030e6106a6366004612524565b63f23a6e6160e01b9695505050505050565b60006106c6336000366113b4565b156106d15750600190565b600080356001600160e01b031916905060006106f86000805160206129fb83398151915290565b6001600160e01b0319831660009081526002919091016020526040902060018101549091506001600160a01b0316158061075c57508054600160301b900465ffffffffffff161580159061075c5750805442600160301b90910465ffffffffffff16105b80610771575080544265ffffffffffff909116115b1561077f5760009250505090565b6001810154604051639ea9bd5960e01b81526001600160a01b0390911690639ea9bd59906107b690339060009036906004016125c8565b6020604051808303816000875af11580156107d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f991906125ed565b9250505090565b60008061080b611447565b60405161190160f01b60208201526022810182905260428101879052909150600090606201604051602081830303815290604052805190602001209050600061085733838989896114ca565b9050600080600061086784611645565b925092509250428365ffffffffffff161115801561088d5750428265ffffffffffff1610155b80156108a057506001600160a01b038116155b156108bb5750630b135d3f60e11b95506108d2945050505050565b506001600160e01b031995506108d2945050505050565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906109125750333014155b1561093057604051637046c88d60e01b815260040160405180910390fd5b60405180608001604052808465ffffffffffff1681526020018565ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b03168152506109886000805160206129fb83398151915290565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176bffffffffffffffffffffffff16600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c95955690610a45908590859060040161260f565b600060405180830381600087803b158015610a5f57600080fd5b505af1158015610a73573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b6000610ad333858686866114ca565b949350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610b195750610b176106b8565b155b15610b3757604051637046c88d60e01b815260040160405180910390fd5b805160005b81811015610ba7576000838281518110610b5857610b58612623565b6020026020010151905060008160000151905060008260200151905060008360400151905060008082516020840185875af13d6000803e80801561025a57600187019650505050505050610b3c565b505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610be55750333014155b15610c0357604051637046c88d60e01b815260040160405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ca957604051636b31ba1560e11b815260040160405180910390fd5b6024600480356101448101358101838101939083013592910190600090610cd290828587612639565b610cdb91612663565b90506001600160e01b03198116600003610d15578515610cff573434343489335af1505b610d0a888888611678565b9450505050506108d2565b600080516020612a1b8339815191525460e01b81811615610d3e5763fc2f51c56000526004601cfd5b5060006001600160e01b03198216600160e01b03610e0d5760408301358301601f1981013560007f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda81610d946004828688612639565b610d9d91612663565b6001600160e01b0319168152602081019190915260400160002060018101546001600160a01b031694509050610dd6876004818b612639565b82549199509750600160301b810460a01b65ffffffffffff60a01b1660d09190911b6001600160d01b031916179850505050610e6f565b6001600160e01b03198216600160e11b03610e615760408301358301601f19810135610e50610e40600460008486612639565b610e4991612663565b8888611770565b919a50985096509250610e6f915050565b6001955050505050506108d2565b8615610e7f57343434348a335af1505b6000610e8a8a612691565b905085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140820152604051633a871cdd60e01b8152610f469088906001600160a01b03851690633a871cdd90610efe9086908f908f9060040161279f565b6020604051808303816000875af1158015610f1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f419190612891565b611ad9565b9a9950505050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610fca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fee9190612891565b92915050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480159061102d5750333014155b801561103e575061103c6106b8565b155b1561105c57604051637046c88d60e01b815260040160405180910390fd5b6000816001811115611070576110706128aa565b1461108e576040516367ce775960e01b815260040160405180910390fd5b60008083516020850186885af13d6000803e80801561025a573d6000f35b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110e55750333014155b1561110357604051637046c88d60e01b815260040160405180910390fd5b600080516020612a1b83398151915280546001600160a01b03858116600160501b818102600160501b600160f01b031985161790945560405193909204169182907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c95955690611198908690869060040161260f565b600060405180830381600087803b1580156111b257600080fd5b505af11580156111c6573d6000803e3d6000fd5b5050505050505050565b600f60f81b60608060008080836111e5611b97565b97989097965046955030945091925090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112305750333014155b8015611241575061123f6106b8565b155b1561125f57604051637046c88d60e01b815260040160405180910390fd5b600080825160208401855af43d6000803e80801561025a573d6000f35b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa1580156112ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130e9190612891565b905090565b610ba7838383611bd3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113575750333014155b1561137557604051637046c88d60e01b815260040160405180910390fd5b600080516020612a1b833981519152805460e09290921c69ffffffffffffffffffff19909216919091176401000000004265ffffffffffff1602179055565b600080516020612a1b83398151915254604051639ea9bd5960e01b815260009160501c906001600160a01b03821690639ea9bd59906113fb908890889088906004016125c8565b6020604051808303816000875af115801561141a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143e91906125ed565b95945050505050565b6000806000611454611b97565b8151602092830120815191830191909120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818601528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c0909201905280519101209392505050565b600080600080516020612a1b8339815191525460501c9050600080826001600160a01b031663333daf9260e01b89888860405160240161150c939291906128c0565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b0319909516949094179093525161154e928b918e91016128da565b60408051601f19818403018152908290526115689161290e565b600060405180830381855afa9150503d80600081146115a3576040519150601f19603f3d011682016040523d82523d6000602084013e6115a8565b606091505b5091509150816116245760405162461bcd60e51b815260206004820152603860248201527f4b65726e656c3a3a5f76616c69646174655369676e61747572653a206661696c60448201527f656420746f2076616c6964617465207369676e61747572650000000000000000606482015260840160405180910390fd5b808060200190518101906116389190612891565b9998505050505050505050565b600060a082901c65ffffffffffff16828115600019810161166a5765ffffffffffff92505b508360d01c92509193909250565b60008061168485612691565b905061169461014086018661292a565b6116a2916004908290612639565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140820152600080516020612a1b83398151915254604051633a871cdd60e01b815260509190911c906001600160a01b03821690633a871cdd906117239085908990899060040161279f565b6020604051808303816000875af1158015611742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117669190612891565b9695505050505050565b6000803681611783602460108789612639565b61178c91612970565b60601c9350605860006117a2826038898b612639565b6117ab9161299e565b828101929091508801816117c460208501858b8d612639565b6117cd9161299e565b60001c925060208401935060006118b77f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee96417660001b8d8d8d60049060249261181693929190612639565b61181f9161299e565b60001c8e8e60249060389261183693929190612639565b61183f91612970565b60601c87876040516118529291906129bc565b60405190819003812061189c95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120611c67565b90506119076118db3083848f8f8b908b8d01926118d693929190612639565b6114ca565b8c8c6004906024926118ef93929190612639565b6118f89161299e565b6001600160a01b031916611ad9565b97508385019450848b019650848a03955060405180608001604052808c8c600490600a9261193793929190612639565b611940916129cc565b60d01c65ffffffffffff1681526020018c8c600a9060109261196493929190612639565b61196d916129cc565b60d01c65ffffffffffff1681526020018c8c60249060389261199193929190612639565b61199a91612970565b60601c6001600160a01b031681526020018c8c6010906024926119bf93929190612639565b6119c891612970565b60601c90526000805160206129fb8339815191526001600160e01b03198e166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176bffffffffffffffffffffffff16600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b8152908a1690630c95955690611a99908690869060040161260f565b600060405180830381600087803b158015611ab357600080fd5b505af1158015611ac7573d6000803e3d6000fd5b50505050505050505093509350935093565b600081830160601b8260601b81148460601b8214176001600160a01b0384861816151760018114611b0d5760019250611b8f565b6001600160d01b031980851690861681811881831102188686176001600160a01b031617935065ffffffffffff60a01b86169081611b525765ffffffffffff60a01b91505b5065ffffffffffff60a01b851680611b70575065ffffffffffff60a01b5b808218908211021880611b89575065ffffffffffff60a01b5b92909217915b505092915050565b604080518082018252600681526512d95c9b995b60d21b60208083019190915282518084019093526005835264302e322e3360d81b9083015291565b600080516020612a1b8339815191525460501c6001600160a01b03811615611c0d5760405162dc149f60e41b815260040160405180910390fd5b600080516020612a1b8339815191528054600160501b600160f01b031916600160501b6001600160a01b0387169081029190911790915560405163064acaab60e11b8152630c95955690611198908690869060040161260f565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f0000000000000000000000000000000000000000000000000000000000000000461416611d5a5750604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f00000000000000000000000000000000000000000000000000000000000000009181019190915246606082015230608082015260a090205b67190100000000000060005280601a5281603a52604260182090506000603a52919050565b60005b83811015611d9a578181015183820152602001611d82565b50506000910152565b60008151808452611dbb816020860160208601611d7f565b601f01601f19169290920160200192915050565b6020815260006108d26020830184611da3565b6001600160a01b0381168114611df757600080fd5b50565b8035611e0581611de2565b919050565b60008083601f840112611e1c57600080fd5b5081356001600160401b03811115611e3357600080fd5b602083019150836020828501011115611e4b57600080fd5b9250929050565b600080600080600060808688031215611e6a57600080fd5b8535611e7581611de2565b94506020860135611e8581611de2565b93506040860135925060608601356001600160401b03811115611ea757600080fd5b611eb388828901611e0a565b969995985093965092949392505050565b600080600060408486031215611ed957600080fd5b8335925060208401356001600160401b03811115611ef657600080fd5b611f0286828701611e0a565b9497909650939450505050565b80356001600160e01b031981168114611e0557600080fd5b65ffffffffffff81168114611df757600080fd5b600080600080600080600060c0888a031215611f5657600080fd5b611f5f88611f0f565b96506020880135611f6f81611de2565b95506040880135611f7f81611de2565b94506060880135611f8f81611f27565b93506080880135611f9f81611f27565b925060a08801356001600160401b03811115611fba57600080fd5b611fc68a828b01611e0a565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171561201157612011611fd9565b60405290565b60405161016081016001600160401b038111828210171561201157612011611fd9565b604051601f8201601f191681016001600160401b038111828210171561206257612062611fd9565b604052919050565b600082601f83011261207b57600080fd5b81356001600160401b0381111561209457612094611fd9565b6120a7601f8201601f191660200161203a565b8181528460208386010111156120bc57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208083850312156120ec57600080fd5b82356001600160401b038082111561210357600080fd5b818501915085601f83011261211757600080fd5b81358181111561212957612129611fd9565b8060051b61213885820161203a565b918252838101850191858101908984111561215257600080fd5b86860192505b83831015611638578235858111156121705760008081fd5b86016060818c03601f19018113156121885760008081fd5b612190611fef565b8983013561219d81611de2565b81526040838101358b8301529183013591888311156121bc5760008081fd5b6121ca8e8c8587010161206a565b90820152845250509186019190860190612158565b6000602082840312156121f157600080fd5b81356108d281611de2565b60008060006060848603121561221157600080fd5b83356001600160401b0381111561222757600080fd5b8401610160818703121561223a57600080fd5b95602085013595506040909401359392505050565b60006020828403121561226157600080fd5b81356001600160c01b03811681146108d257600080fd5b60006020828403121561228a57600080fd5b6108d282611f0f565b600080600080608085870312156122a957600080fd5b84356122b481611de2565b93506020850135925060408501356001600160401b038111156122d657600080fd5b6122e28782880161206a565b9250506060850135600281106122f757600080fd5b939692955090935050565b60008060006040848603121561231757600080fd5b833561232281611de2565b925060208401356001600160401b03811115611ef657600080fd5b60ff60f81b881681526000602060e08184015261235d60e084018a611da3565b838103604085015261236f818a611da3565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b818110156123c1578351835292840192918401916001016123a5565b50909c9b505050505050505050505050565b600080604083850312156123e657600080fd5b82356123f181611de2565b915060208301356001600160401b0381111561240c57600080fd5b6124188582860161206a565b9150509250929050565b60008083601f84011261243457600080fd5b5081356001600160401b0381111561244b57600080fd5b6020830191508360208260051b8501011115611e4b57600080fd5b60008060008060008060008060a0898b03121561248257600080fd5b883561248d81611de2565b9750602089013561249d81611de2565b965060408901356001600160401b03808211156124b957600080fd5b6124c58c838d01612422565b909850965060608b01359150808211156124de57600080fd5b6124ea8c838d01612422565b909650945060808b013591508082111561250357600080fd5b506125108b828c01611e0a565b999c989b5096995094979396929594505050565b60008060008060008060a0878903121561253d57600080fd5b863561254881611de2565b9550602087013561255881611de2565b9450604087013593506060870135925060808701356001600160401b0381111561258157600080fd5b61258d89828a01611e0a565b979a9699509497509295939492505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b038416815260406020820181905260009061143e908301848661259f565b6000602082840312156125ff57600080fd5b815180151581146108d257600080fd5b602081526000610ad360208301848661259f565b634e487b7160e01b600052603260045260246000fd5b6000808585111561264957600080fd5b8386111561265657600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015611b8f5760049490940360031b84901b1690921692915050565b600061016082360312156126a457600080fd5b6126ac612017565b6126b583611dfa565b81526020830135602082015260408301356001600160401b03808211156126db57600080fd5b6126e73683870161206a565b6040840152606085013591508082111561270057600080fd5b61270c3683870161206a565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561275c57600080fd5b6127683682880161206a565b83850152506101409150818501358181111561278357600080fd5b61278f3682880161206a565b8385015250505080915050919050565b606081526127b96060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526127e16101c0850183611da3565b91506060870151605f19808685030160c08701526127ff8483611da3565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261285b8787611da3565b9650808c0151955050505080868503016101a0870152505061287d8282611da3565b602085019690965250505060400152919050565b6000602082840312156128a357600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b83815260406020820152600061143e60408301848661259f565b600084516128ec818460208901611d7f565b919091019283525060601b6001600160601b0319166020820152603401919050565b60008251612920818460208701611d7f565b9190910192915050565b6000808335601e1984360301811261294157600080fd5b8301803591506001600160401b0382111561295b57600080fd5b602001915036819003821315611e4b57600080fd5b6001600160601b03198135818116916014851015611b8f5760149490940360031b84901b1690921692915050565b80356020831015610fee57600019602084900360031b1b1692915050565b8183823760009101908152919050565b6001600160d01b03198135818116916006851015611b8f5760069490940360031b84901b169092169291505056fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd8439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1db" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x98cccb650873fecf2ce04c1c7c631814d4be62760bc179f425742be214a4bfd5", + "transactionIndex": "0x5", + "blockHash": "0x646d03a5c531523d64b9ab9b5850c6acd8e2bf288af463682ba20fee3db0bbd3", + "blockNumber": "0x2bfa041", + "from": "0xA02CDdFa44B8C01b4257F54ac1c43F75801E8175", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x2d5257", + "gasUsed": "0x24e274", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000a02cddfa44b8c01b4257f54ac1c43f75801e8175", + "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" + ], + "data": "0x000000000000000000000000000000000000000000000000002846178c2af7e000000000000000000000000000000000000000000000000002871cce0617f7890000000000000000000000000000000000000000000023ad78b1a2609c9b5ec9000000000000000000000000000000000000000000000000025ed6b679ecffa90000000000000000000000000000000000000000000023ad78d9e87828c656a9", + "blockHash": "0x646d03a5c531523d64b9ab9b5850c6acd8e2bf288af463682ba20fee3db0bbd3", + "blockNumber": "0x2bfa041", + "transactionHash": "0x98cccb650873fecf2ce04c1c7c631814d4be62760bc179f425742be214a4bfd5", + "transactionIndex": "0x5", + "logIndex": "0x12", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000020000000080000040000000000000000000000000000000000000000000000000000000000000000000000000200000000000000020000000000000000001000000000000000000000000004000000000000000000001000008000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x11785e867" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1708379708, + "chain": 80001, + "multi": false, + "commit": "525f3f4" +} \ No newline at end of file diff --git a/broadcast/DeployKernel.s.sol/80001/run-latest.json b/broadcast/DeployKernel.s.sol/80001/run-latest.json new file mode 100644 index 00000000..8290830e --- /dev/null +++ b/broadcast/DeployKernel.s.sol/80001/run-latest.json @@ -0,0 +1,65 @@ +{ + "transactions": [ + { + "hash": "0x98cccb650873fecf2ce04c1c7c631814d4be62760bc179f425742be214a4bfd5", + "transactionType": "CREATE2", + "contractName": "Kernel", + "contractAddress": "0x5FC0236D6c88a65beD32EECDC5D60a5CAb377717", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x32ee8b", + "value": "0x0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000006101406040523480156200001257600080fd5b5060405162002c4138038062002c41833981016040819052620000359162000137565b306080524660a0528060608062000081604080518082018252600681526512d95c9b995b60d21b60208083019190915282518084019093526005835264302e322e3360d81b9083015291565b815160209283012081519183019190912060c082905260e0819052604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8152938401929092529082015246606082015230608082015260a090206101005250506001600160a01b031661012052507f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd98054600160501b600160f01b0319166a010000000000000000000017905562000169565b6000602082840312156200014a57600080fd5b81516001600160a01b03811681146200016257600080fd5b9392505050565b60805160a05160c05160e0516101005161012051612a3b62000206600039600081816101e9015281816105ec015281816108e401528181610ae601528181610bb701528181610c6b01528181610f7b01528181610fff015281816110b7015281816112020152818161129b015261132901526000611c6901526000611d2301526000611cfd01526000611cad01526000611c8a0152612a3b6000f3fe60806040526004361061014f5760003560e01c806354fd4d50116100b6578063b68df16d1161006f578063b68df16d1461060e578063bc197c8114610621578063d087d28814610650578063d1f5789414610665578063d541622114610678578063f23a6e611461068b5761018e565b806354fd4d501461050557806355b14f501461053657806357b750471461054957806384b0196e1461056e57806388e7fd0614610596578063b0d691fe146105da5761018e565b806334fcd5be1161010857806334fcd5be146103885780633659cfe61461039b5780633a871cdd146103ae5780633e1b0812146103c157806351166ba0146103e157806351945447146104f25761018e565b806306fdde03146102615780630b3dc354146102a9578063150b7a02146102e25780631626ba7e1461032757806329f8b17414610347578063333daf921461035a5761018e565b3661018e57604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080356001600160e01b031916905060006101b56000805160206129fb83398151915290565b6001600160e01b0319831660009081526002919091016020526040902054600160601b90046001600160a01b0390811691507f000000000000000000000000000000000000000000000000000000000000000016331480159061021d575061021b6106b8565b155b1561023b57604051637046c88d60e01b815260040160405180910390fd5b3660008037600080366000845af43d6000803e80801561025a573d6000f35b3d6000fd5b005b34801561026d57600080fd5b506102936040518060400160405280600681526020016512d95c9b995b60d21b81525081565b6040516102a09190611dcf565b60405180910390f35b3480156102b557600080fd5b50600080516020612a1b8339815191525460501c5b6040516001600160a01b0390911681526020016102a0565b3480156102ee57600080fd5b5061030e6102fd366004611e52565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016102a0565b34801561033357600080fd5b5061030e610342366004611ec4565b610800565b61025f610355366004611f3b565b6108d9565b34801561036657600080fd5b5061037a610375366004611ec4565b610ac4565b6040519081526020016102a0565b61025f6103963660046120d9565b610adb565b61025f6103a93660046121df565b610bac565b61037a6103bc3660046121fc565b610c5e565b3480156103cd57600080fd5b5061037a6103dc36600461224f565b610f54565b3480156103ed57600080fd5b506104a56103fc366004612278565b60408051608080820183526000808352602080840182905283850182905260609384018290526001600160e01b03199590951681527f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda855283902083519182018452805465ffffffffffff8082168452600160301b82041695830195909552600160601b9094046001600160a01b03908116938201939093526001909301549091169082015290565b60408051825165ffffffffffff908116825260208085015190911690820152828201516001600160a01b0390811692820192909252606092830151909116918101919091526080016102a0565b61025f610500366004612293565b610ff4565b34801561051157600080fd5b5061029360405180604001604052806005815260200164302e322e3360d81b81525081565b61025f610544366004612302565b6110ac565b34801561055557600080fd5b50600080516020612a1b8339815191525460e01b61030e565b34801561057a57600080fd5b506105836111d0565b6040516102a0979695949392919061233d565b3480156105a257600080fd5b50600080516020612a1b83398151915254640100000000900465ffffffffffff1660405165ffffffffffff90911681526020016102a0565b3480156105e657600080fd5b506102ca7f000000000000000000000000000000000000000000000000000000000000000081565b61025f61061c3660046123d3565b6111f7565b34801561062d57600080fd5b5061030e61063c366004612466565b63bc197c8160e01b98975050505050505050565b34801561065c57600080fd5b5061037a61127c565b61025f610673366004612302565b611313565b61025f610686366004612278565b61131e565b34801561069757600080fd5b5061030e6106a6366004612524565b63f23a6e6160e01b9695505050505050565b60006106c6336000366113b4565b156106d15750600190565b600080356001600160e01b031916905060006106f86000805160206129fb83398151915290565b6001600160e01b0319831660009081526002919091016020526040902060018101549091506001600160a01b0316158061075c57508054600160301b900465ffffffffffff161580159061075c5750805442600160301b90910465ffffffffffff16105b80610771575080544265ffffffffffff909116115b1561077f5760009250505090565b6001810154604051639ea9bd5960e01b81526001600160a01b0390911690639ea9bd59906107b690339060009036906004016125c8565b6020604051808303816000875af11580156107d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f991906125ed565b9250505090565b60008061080b611447565b60405161190160f01b60208201526022810182905260428101879052909150600090606201604051602081830303815290604052805190602001209050600061085733838989896114ca565b9050600080600061086784611645565b925092509250428365ffffffffffff161115801561088d5750428265ffffffffffff1610155b80156108a057506001600160a01b038116155b156108bb5750630b135d3f60e11b95506108d2945050505050565b506001600160e01b031995506108d2945050505050565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906109125750333014155b1561093057604051637046c88d60e01b815260040160405180910390fd5b60405180608001604052808465ffffffffffff1681526020018565ffffffffffff168152602001876001600160a01b03168152602001866001600160a01b03168152506109886000805160206129fb83398151915290565b6001600160e01b031989166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176bffffffffffffffffffffffff16600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b815290861690630c95955690610a45908590859060040161260f565b600060405180830381600087803b158015610a5f57600080fd5b505af1158015610a73573d6000803e3d6000fd5b50506040516001600160a01b038089169350891691506001600160e01b03198a16907fed03d2572564284398470d3f266a693e29ddfff3eba45fc06c5e91013d32135390600090a450505050505050565b6000610ad333858686866114ca565b949350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610b195750610b176106b8565b155b15610b3757604051637046c88d60e01b815260040160405180910390fd5b805160005b81811015610ba7576000838281518110610b5857610b58612623565b6020026020010151905060008160000151905060008260200151905060008360400151905060008082516020840185875af13d6000803e80801561025a57600187019650505050505050610b3c565b505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801590610be55750333014155b15610c0357604051637046c88d60e01b815260040160405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ca957604051636b31ba1560e11b815260040160405180910390fd5b6024600480356101448101358101838101939083013592910190600090610cd290828587612639565b610cdb91612663565b90506001600160e01b03198116600003610d15578515610cff573434343489335af1505b610d0a888888611678565b9450505050506108d2565b600080516020612a1b8339815191525460e01b81811615610d3e5763fc2f51c56000526004601cfd5b5060006001600160e01b03198216600160e01b03610e0d5760408301358301601f1981013560007f439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dda81610d946004828688612639565b610d9d91612663565b6001600160e01b0319168152602081019190915260400160002060018101546001600160a01b031694509050610dd6876004818b612639565b82549199509750600160301b810460a01b65ffffffffffff60a01b1660d09190911b6001600160d01b031916179850505050610e6f565b6001600160e01b03198216600160e11b03610e615760408301358301601f19810135610e50610e40600460008486612639565b610e4991612663565b8888611770565b919a50985096509250610e6f915050565b6001955050505050506108d2565b8615610e7f57343434348a335af1505b6000610e8a8a612691565b905085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140820152604051633a871cdd60e01b8152610f469088906001600160a01b03851690633a871cdd90610efe9086908f908f9060040161279f565b6020604051808303816000875af1158015610f1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f419190612891565b611ad9565b9a9950505050505050505050565b604051631aab3f0d60e11b81523060048201526001600160c01b03821660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa158015610fca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fee9190612891565b92915050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480159061102d5750333014155b801561103e575061103c6106b8565b155b1561105c57604051637046c88d60e01b815260040160405180910390fd5b6000816001811115611070576110706128aa565b1461108e576040516367ce775960e01b815260040160405180910390fd5b60008083516020850186885af13d6000803e80801561025a573d6000f35b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110e55750333014155b1561110357604051637046c88d60e01b815260040160405180910390fd5b600080516020612a1b83398151915280546001600160a01b03858116600160501b818102600160501b600160f01b031985161790945560405193909204169182907fa35f5cdc5fbabb614b4cd5064ce5543f43dc8fab0e4da41255230eb8aba2531c90600090a360405163064acaab60e11b81526001600160a01b03851690630c95955690611198908690869060040161260f565b600060405180830381600087803b1580156111b257600080fd5b505af11580156111c6573d6000803e3d6000fd5b5050505050505050565b600f60f81b60608060008080836111e5611b97565b97989097965046955030945091925090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906112305750333014155b8015611241575061123f6106b8565b155b1561125f57604051637046c88d60e01b815260040160405180910390fd5b600080825160208401855af43d6000803e80801561025a573d6000f35b604051631aab3f0d60e11b8152306004820152600060248201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906335567e1a90604401602060405180830381865afa1580156112ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130e9190612891565b905090565b610ba7838383611bd3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906113575750333014155b1561137557604051637046c88d60e01b815260040160405180910390fd5b600080516020612a1b833981519152805460e09290921c69ffffffffffffffffffff19909216919091176401000000004265ffffffffffff1602179055565b600080516020612a1b83398151915254604051639ea9bd5960e01b815260009160501c906001600160a01b03821690639ea9bd59906113fb908890889088906004016125c8565b6020604051808303816000875af115801561141a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143e91906125ed565b95945050505050565b6000806000611454611b97565b8151602092830120815191830191909120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818601528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c0909201905280519101209392505050565b600080600080516020612a1b8339815191525460501c9050600080826001600160a01b031663333daf9260e01b89888860405160240161150c939291906128c0565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b0319909516949094179093525161154e928b918e91016128da565b60408051601f19818403018152908290526115689161290e565b600060405180830381855afa9150503d80600081146115a3576040519150601f19603f3d011682016040523d82523d6000602084013e6115a8565b606091505b5091509150816116245760405162461bcd60e51b815260206004820152603860248201527f4b65726e656c3a3a5f76616c69646174655369676e61747572653a206661696c60448201527f656420746f2076616c6964617465207369676e61747572650000000000000000606482015260840160405180910390fd5b808060200190518101906116389190612891565b9998505050505050505050565b600060a082901c65ffffffffffff16828115600019810161166a5765ffffffffffff92505b508360d01c92509193909250565b60008061168485612691565b905061169461014086018661292a565b6116a2916004908290612639565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610140820152600080516020612a1b83398151915254604051633a871cdd60e01b815260509190911c906001600160a01b03821690633a871cdd906117239085908990899060040161279f565b6020604051808303816000875af1158015611742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117669190612891565b9695505050505050565b6000803681611783602460108789612639565b61178c91612970565b60601c9350605860006117a2826038898b612639565b6117ab9161299e565b828101929091508801816117c460208501858b8d612639565b6117cd9161299e565b60001c925060208401935060006118b77f3ce406685c1b3551d706d85a68afdaa49ac4e07b451ad9b8ff8b58c3ee96417660001b8d8d8d60049060249261181693929190612639565b61181f9161299e565b60001c8e8e60249060389261183693929190612639565b61183f91612970565b60601c87876040516118529291906129bc565b60405190819003812061189c95949392916020019485526001600160e01b031993909316602085015260408401919091526001600160a01b03166060830152608082015260a00190565b60405160208183030381529060405280519060200120611c67565b90506119076118db3083848f8f8b908b8d01926118d693929190612639565b6114ca565b8c8c6004906024926118ef93929190612639565b6118f89161299e565b6001600160a01b031916611ad9565b97508385019450848b019650848a03955060405180608001604052808c8c600490600a9261193793929190612639565b611940916129cc565b60d01c65ffffffffffff1681526020018c8c600a9060109261196493929190612639565b61196d916129cc565b60d01c65ffffffffffff1681526020018c8c60249060389261199193929190612639565b61199a91612970565b60601c6001600160a01b031681526020018c8c6010906024926119bf93929190612639565b6119c891612970565b60601c90526000805160206129fb8339815191526001600160e01b03198e166000908152600291909101602090815260409182902083518154928501518585015165ffffffffffff9283166001600160601b031990951694909417600160301b9290911691909102176bffffffffffffffffffffffff16600160601b6001600160a01b0393841602178155606090930151600190930180546001600160a01b031916938216939093179092555163064acaab60e11b8152908a1690630c95955690611a99908690869060040161260f565b600060405180830381600087803b158015611ab357600080fd5b505af1158015611ac7573d6000803e3d6000fd5b50505050505050505093509350935093565b600081830160601b8260601b81148460601b8214176001600160a01b0384861816151760018114611b0d5760019250611b8f565b6001600160d01b031980851690861681811881831102188686176001600160a01b031617935065ffffffffffff60a01b86169081611b525765ffffffffffff60a01b91505b5065ffffffffffff60a01b851680611b70575065ffffffffffff60a01b5b808218908211021880611b89575065ffffffffffff60a01b5b92909217915b505092915050565b604080518082018252600681526512d95c9b995b60d21b60208083019190915282518084019093526005835264302e322e3360d81b9083015291565b600080516020612a1b8339815191525460501c6001600160a01b03811615611c0d5760405162dc149f60e41b815260040160405180910390fd5b600080516020612a1b8339815191528054600160501b600160f01b031916600160501b6001600160a01b0387169081029190911790915560405163064acaab60e11b8152630c95955690611198908690869060040161260f565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f0000000000000000000000000000000000000000000000000000000000000000461416611d5a5750604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f00000000000000000000000000000000000000000000000000000000000000009181019190915246606082015230608082015260a090205b67190100000000000060005280601a5281603a52604260182090506000603a52919050565b60005b83811015611d9a578181015183820152602001611d82565b50506000910152565b60008151808452611dbb816020860160208601611d7f565b601f01601f19169290920160200192915050565b6020815260006108d26020830184611da3565b6001600160a01b0381168114611df757600080fd5b50565b8035611e0581611de2565b919050565b60008083601f840112611e1c57600080fd5b5081356001600160401b03811115611e3357600080fd5b602083019150836020828501011115611e4b57600080fd5b9250929050565b600080600080600060808688031215611e6a57600080fd5b8535611e7581611de2565b94506020860135611e8581611de2565b93506040860135925060608601356001600160401b03811115611ea757600080fd5b611eb388828901611e0a565b969995985093965092949392505050565b600080600060408486031215611ed957600080fd5b8335925060208401356001600160401b03811115611ef657600080fd5b611f0286828701611e0a565b9497909650939450505050565b80356001600160e01b031981168114611e0557600080fd5b65ffffffffffff81168114611df757600080fd5b600080600080600080600060c0888a031215611f5657600080fd5b611f5f88611f0f565b96506020880135611f6f81611de2565b95506040880135611f7f81611de2565b94506060880135611f8f81611f27565b93506080880135611f9f81611f27565b925060a08801356001600160401b03811115611fba57600080fd5b611fc68a828b01611e0a565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171561201157612011611fd9565b60405290565b60405161016081016001600160401b038111828210171561201157612011611fd9565b604051601f8201601f191681016001600160401b038111828210171561206257612062611fd9565b604052919050565b600082601f83011261207b57600080fd5b81356001600160401b0381111561209457612094611fd9565b6120a7601f8201601f191660200161203a565b8181528460208386010111156120bc57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208083850312156120ec57600080fd5b82356001600160401b038082111561210357600080fd5b818501915085601f83011261211757600080fd5b81358181111561212957612129611fd9565b8060051b61213885820161203a565b918252838101850191858101908984111561215257600080fd5b86860192505b83831015611638578235858111156121705760008081fd5b86016060818c03601f19018113156121885760008081fd5b612190611fef565b8983013561219d81611de2565b81526040838101358b8301529183013591888311156121bc5760008081fd5b6121ca8e8c8587010161206a565b90820152845250509186019190860190612158565b6000602082840312156121f157600080fd5b81356108d281611de2565b60008060006060848603121561221157600080fd5b83356001600160401b0381111561222757600080fd5b8401610160818703121561223a57600080fd5b95602085013595506040909401359392505050565b60006020828403121561226157600080fd5b81356001600160c01b03811681146108d257600080fd5b60006020828403121561228a57600080fd5b6108d282611f0f565b600080600080608085870312156122a957600080fd5b84356122b481611de2565b93506020850135925060408501356001600160401b038111156122d657600080fd5b6122e28782880161206a565b9250506060850135600281106122f757600080fd5b939692955090935050565b60008060006040848603121561231757600080fd5b833561232281611de2565b925060208401356001600160401b03811115611ef657600080fd5b60ff60f81b881681526000602060e08184015261235d60e084018a611da3565b838103604085015261236f818a611da3565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b818110156123c1578351835292840192918401916001016123a5565b50909c9b505050505050505050505050565b600080604083850312156123e657600080fd5b82356123f181611de2565b915060208301356001600160401b0381111561240c57600080fd5b6124188582860161206a565b9150509250929050565b60008083601f84011261243457600080fd5b5081356001600160401b0381111561244b57600080fd5b6020830191508360208260051b8501011115611e4b57600080fd5b60008060008060008060008060a0898b03121561248257600080fd5b883561248d81611de2565b9750602089013561249d81611de2565b965060408901356001600160401b03808211156124b957600080fd5b6124c58c838d01612422565b909850965060608b01359150808211156124de57600080fd5b6124ea8c838d01612422565b909650945060808b013591508082111561250357600080fd5b506125108b828c01611e0a565b999c989b5096995094979396929594505050565b60008060008060008060a0878903121561253d57600080fd5b863561254881611de2565b9550602087013561255881611de2565b9450604087013593506060870135925060808701356001600160401b0381111561258157600080fd5b61258d89828a01611e0a565b979a9699509497509295939492505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b038416815260406020820181905260009061143e908301848661259f565b6000602082840312156125ff57600080fd5b815180151581146108d257600080fd5b602081526000610ad360208301848661259f565b634e487b7160e01b600052603260045260246000fd5b6000808585111561264957600080fd5b8386111561265657600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015611b8f5760049490940360031b84901b1690921692915050565b600061016082360312156126a457600080fd5b6126ac612017565b6126b583611dfa565b81526020830135602082015260408301356001600160401b03808211156126db57600080fd5b6126e73683870161206a565b6040840152606085013591508082111561270057600080fd5b61270c3683870161206a565b60608401526080850135608084015260a085013560a084015260c085013560c084015260e085013560e0840152610100915081850135828401526101209150818501358181111561275c57600080fd5b6127683682880161206a565b83850152506101409150818501358181111561278357600080fd5b61278f3682880161206a565b8385015250505080915050919050565b606081526127b96060820185516001600160a01b03169052565b60208401516080820152600060408501516101608060a08501526127e16101c0850183611da3565b91506060870151605f19808685030160c08701526127ff8483611da3565b9350608089015160e087015260a08901519150610100828188015260c08a01519250610120838189015260e08b0151935061014084818a0152828c0151868a0152818c0151955083898803016101808a015261285b8787611da3565b9650808c0151955050505080868503016101a0870152505061287d8282611da3565b602085019690965250505060400152919050565b6000602082840312156128a357600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b83815260406020820152600061143e60408301848661259f565b600084516128ec818460208901611d7f565b919091019283525060601b6001600160601b0319166020820152603401919050565b60008251612920818460208701611d7f565b9190910192915050565b6000808335601e1984360301811261294157600080fd5b8301803591506001600160401b0382111561295b57600080fd5b602001915036819003821315611e4b57600080fd5b6001600160601b03198135818116916014851015611b8f5760149490940360031b84901b1690921692915050565b80356020831015610fee57600019602084900360031b1b1692915050565b8183823760009101908152919050565b6001600160d01b03198135818116916006851015611b8f5760069490940360031b84901b169092169291505056fe439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd8439ffe7df606b78489639bc0b827913bd09e1246fa6802968a5b3694c53e0dd90000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + "nonce": "0x1db" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x98cccb650873fecf2ce04c1c7c631814d4be62760bc179f425742be214a4bfd5", + "transactionIndex": "0x5", + "blockHash": "0x646d03a5c531523d64b9ab9b5850c6acd8e2bf288af463682ba20fee3db0bbd3", + "blockNumber": "0x2bfa041", + "from": "0xA02CDdFa44B8C01b4257F54ac1c43F75801E8175", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x2d5257", + "gasUsed": "0x24e274", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000a02cddfa44b8c01b4257f54ac1c43f75801e8175", + "0x000000000000000000000000c26880a0af2ea0c7e8130e6ec47af756465452e8" + ], + "data": "0x000000000000000000000000000000000000000000000000002846178c2af7e000000000000000000000000000000000000000000000000002871cce0617f7890000000000000000000000000000000000000000000023ad78b1a2609c9b5ec9000000000000000000000000000000000000000000000000025ed6b679ecffa90000000000000000000000000000000000000000000023ad78d9e87828c656a9", + "blockHash": "0x646d03a5c531523d64b9ab9b5850c6acd8e2bf288af463682ba20fee3db0bbd3", + "blockNumber": "0x2bfa041", + "transactionHash": "0x98cccb650873fecf2ce04c1c7c631814d4be62760bc179f425742be214a4bfd5", + "transactionIndex": "0x5", + "logIndex": "0x12", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000020000000080000040000000000000000000000000000000000000000000000000000000000000000000000000200000000000000020000000000000000001000000000000000000000000004000000000000000000001000008000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x11785e867" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1708379708, + "chain": 80001, + "multi": false, + "commit": "525f3f4" +} \ No newline at end of file diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-1708376910.json b/broadcast/DeployModularPermission.s.sol/80001/run-1708376910.json new file mode 100644 index 00000000..6a75149c --- /dev/null +++ b/broadcast/DeployModularPermission.s.sol/80001/run-1708376910.json @@ -0,0 +1,53 @@ +{ + "transactions": [ + { + "hash": "0x2493846e40436f02051522cde3a043de4ccbae1b9cadd8c40995e1b7a5847f4b", + "transactionType": "CREATE2", + "contractName": "ModularPermissionValidator", + "contractAddress": "0xfdDE9a26b6c3B7ca4b52C5f010d5B9Fb67e09E5A", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x2a44f3", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061213e806100206000396000f3fe6080604052600436106100dd5760003560e01c80638fc925aa1161007f578063b66bd1d211610059578063b66bd1d214610312578063d4085e811461033f578063e89005c71461037d578063ee87c2951461039057600080fd5b80638fc925aa146102bc5780639ea9bd59146102cf578063b52e2c7a146102f257600080fd5b80633ec50c6c116100bb5780633ec50c6c1461013d578063511079bc1461021157806365b8de2e146102245780637ecebe001461025b57600080fd5b80630c959556146100e2578063333daf92146100f75780633a871cdd1461012a575b600080fd5b6100f56100f03660046116a1565b6103a3565b005b34801561010357600080fd5b506101176101123660046116e3565b6103f6565b6040519081526020015b60405180910390f35b61011761013836600461172f565b61089a565b34801561014957600080fd5b506101bb6101583660046117ab565b6001602081815260009384526040808520909152918352912080549181015460028201546003909201546001600160801b03841693600160801b900460a01b926001600160a01b03909216919065ffffffffffff80821691600160301b90041686565b604080516001600160801b0390971687526001600160a01b031990951660208701526001600160a01b0390931693850193909352606084015265ffffffffffff91821660808401521660a082015260c001610121565b6100f561021f366004611865565b610d63565b34801561023057600080fd5b5061024461023f3660046116a1565b61131c565b6040516101219b9a99989796959493929190611a5c565b34801561026757600080fd5b5061029c610276366004611af3565b6003602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610121565b6100f56102ca3660046116a1565b611417565b6102e26102dd366004611b10565b611446565b6040519015158152602001610121565b3480156102fe57600080fd5b5061011761030d366004611b4c565b611483565b34801561031e57600080fd5b5061011761032d366004611af3565b60006020819052908152604090205481565b34801561034b57600080fd5b5061011761035a366004611c2d565b600260209081526000938452604080852082529284528284209052825290205481565b6100f561038b366004611c66565b6114ce565b6100f561039e366004611c7f565b61153a565b60008060008060003660003660003660006103be8d8d61131c565b9a509a509a509a509a509a509a509a509a509a509a506103e78b8b8b8b8b8b8b8b8b8b8b610d63565b50505050505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810182905261042e602060008587611c9a565b61043791611cc4565b602080830182905260009182526001815260408083203384528252808320546003909252909120546001600160801b03918216600160801b90910490911611806104aa575060208181015160009081526001825260408082203383529092522054600160801b900460a01b600160a11b16155b156104b9576001915050610893565b6020818101516000908152600180835260408083203384528452808320815160c08101835281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682880152938201546001600160a01b0316928101929092526002810154606080840191825260039092015465ffffffffffff808216608080870191909152600160301b9092041694840194909452908601849052519185019190915291860190601f1986019036610574601482611cf9565b61057f928290611c9a565b61058891611d0c565b60601c845260003661059b603482611cf9565b906105a7601436611cf9565b926105b493929190611c9a565b6105bd91611cc4565b60408501525b60808401516001600160a01b0316156107ec57608084015160a11c60011615610618576020808501516000908152600282526040808220608088018051845290845281832033845290935290205490526105c3565b36600061062f86608001516001600160a01b031690565b60608701516001600160a01b03919091169085908561064f826014611d3f565b9261065c93929190611c9a565b61066591611d0c565b60601c036106f85760008484886060015160146106829190611d3f565b90896060015160346106949190611d3f565b926106a193929190611c9a565b6106aa91611cc4565b60001c90508484886060015160346106c29190611d3f565b6106cd928290611c9a565b90935091506106dd816034611d3f565b876060018181516106ee9190611d3f565b90525061070e9050565b606086015161070990808587611c9a565b915091505b600061072487608001516001600160a01b031690565b6001600160a01b031663ecfcd9303389600001518a602001518f8c6040015189896040518863ffffffff1660e01b81526004016107679796959493929190611d52565b602060405180830381865afa158015610784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a89190611d9d565b90506107b4888261159a565b602080890151600090815260028252604080822060808c0180518452908452818320338452909352902054905297506105c392505050565b600083604001516001600160a01b0316637a7c6a4f3387602001518c87878b6060015190809261081e93929190611c9a565b6040518663ffffffff1660e01b815260040161083e959493929190611db6565b602060405180830381865afa15801561085b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087f9190611d9d565b905061088b868261159a565b955050505050505b9392505050565b6000336108aa6020860186611af3565b6001600160a01b0316146109055760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d757374206265206d73672e73656e6465720000000000000060448201526064015b60405180910390fd5b6000610915610140860186611def565b61092491602091600091611c9a565b61092d91611cc4565b6000818152600160209081526040808320338452909152902054909150600160801b900460a01b600160a01b16158061099c575060008181526001602090815260408083203384528252808320546003909252909120546001600160801b03918216600160801b909104909116115b156109ab576001915050610893565b6000818152600160208181526040808420338552825292839020835160c08101855281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682850152938201546001600160a01b03169481019490945260028101546060850181905260039091015465ffffffffffff8082166080870152600160301b90910416928401929092525b6001600160a01b03821615610cf05760a082901c60011615610a815760008481526002602090815260408083209483529381528382203383529052919091205490610a3b565b366000610a8f836034611d3f565b610a9d6101408c018c611def565b905010158015610ae857506001600160a01b038416610ac06101408c018c611def565b8590610acd826014611d3f565b92610ada93929190611c9a565b610ae391611d0c565b60601c145b15610c12576000610afd6101408c018c611def565b610b08866014611d3f565b90610b14876034611d3f565b92610b2193929190611c9a565b610b2a91611cc4565b905080610b38856034611d3f565b610b429190611d3f565b610b506101408d018d611def565b90501015610bb35760405162461bcd60e51b815260206004820152602a60248201527f706f6c69637944617461206c656e6774682065786365656473207369676e61746044820152690eae4ca40d8cadccee8d60b31b60648201526084016108fc565b610bc16101408c018c611def565b610bcc866034611d3f565b9083610bd9886034611d3f565b610be39190611d3f565b92610bf093929190611c9a565b9093509150610c00816034611d3f565b610c0a9085611d3f565b935050610c32565b610c206101408b018b611def565b610c2d9185918291611c9a565b915091505b60006001600160a01b0385166001600160a01b031663c92ce35133898e87876040518663ffffffff1660e01b8152600401610c71959493929190611e36565b6020604051808303816000875af1158015610c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb49190611d9d565b9050610cc0888261159a565b600088815260026020908152604080832098835297815287822033835290529590952054949750610a3b92505050565b60408301516000906001600160a01b0316638e0125d233878b610d176101408f018f611def565b610d249189908290611c9a565b6040518663ffffffff1660e01b8152600401610d44959493929190611db6565b6020604051808303816000875af115801561085b573d6000803e3d6000fd5b6001600160a01b03198a16610dba5760405162461bcd60e51b815260206004820152601860248201527f666c61672073686f756c64206e6f7420626520656d707479000000000000000060448201526064016108fc565b336000908152600360205260409020546001600160801b038c811691161480610e17575033600090815260036020526040902054610e02906001600160801b03166001611f79565b6001600160801b03168b6001600160801b0316145b610e5a5760405162461bcd60e51b81526020600482015260146024820152731b9bdb98d9481cda1bdd5b19081899481b995e1d60621b60448201526064016108fc565b33600090815260036020526040812080546001600160801b031691610e7e83611fa0565b91906101000a8154816001600160801b0302191690836001600160801b03160217905550506000610eb78b8b8b8b8b8b8b8b8b8b611483565b9050600160a01b6001600160a01b03198c1601610ee1573360009081526020819052604090208190555b8a60005b87811015610fd557610f15898983818110610f0257610f02611fc6565b905060200201356001600160a01b031690565b6001600160a01b031662282ae03385888886818110610f3657610f36611fc6565b9050602002810190610f489190611def565b6040518563ffffffff1660e01b8152600401610f679493929190611fdc565b600060405180830381600087803b158015610f8157600080fd5b505af1158015610f95573d6000803e3d6000fd5b505050506000610fbd8a8a84818110610fb057610fb0611fc6565b9050602002013560a01c90565b92909216915080610fcd8161200e565b915050610ee5565b5060405163e9b51de560e01b81526001600160a01b038c169063e9b51de59061100890339086908b908b90600401611fdc565b600060405180830381600087803b15801561102257600080fd5b505af1158015611036573d6000803e3d6000fd5b5050505060008888600081811061104f5761104f611fc6565b60200291909101359150506001600160a01b03198216156110c65760405162461bcd60e51b815260206004820152602b60248201527f6572726f72203a207065726d697373696f6e20666c616720657863656564732060448201526a706f6c69637920666c616760a81b60648201526084016108fc565b6040518060c001604052808f6001600160801b031681526020018e6001600160a01b03191681526020018d6001600160a01b031681526020018281526020018c65ffffffffffff1681526020018b65ffffffffffff16815250600160008581526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160801b0302191690836001600160801b0316021790555060208201518160000160106101000a8154816bffffffffffffffffffffffff021916908360a01c021790555060408201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816002015560808201518160030160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060a08201518160030160066101000a81548165ffffffffffff021916908365ffffffffffff1602179055509050506000600190505b888110156112d25789898281811061125f5761125f611fc6565b905060200201356002600086815260200190815260200160002060008c8c60018661128a9190611cf9565b81811061129957611299611fc6565b602090810292909201358352508181019290925260409081016000908120338252909252902055806112ca8161200e565b915050611245565b5060408051338152602081018590527fab0f2b94c33903f7ed343b1bcc3baca5e69eb7d007b8c8207232012f6cffef0e910160405180910390a15050505050505050505050505050565b60008060008060003660003660003660008c8c60009060109261134193929190611c9a565b61134a91612027565b60801c9a508c8c601090601c9261136393929190611c9a565b61136c9161205e565b99508c8c601c9060229261138293929190611c9a565b61138b9161208c565b60d01c97508c8c6022906028926113a493929190611c9a565b6113ad9161208c565b60d01c96508c8c602890603c926113c693929190611c9a565b6113cf91611d0c565b9a9d999c60609b909b1c9b5096999598605c603c8089013589018281019b50810135995081890135890180830199908201359850607c81013501918201965001359350915050565b60208190036114315761142d61038b8284611cc4565b5050565b61142d61143e8284612027565b60801c61153a565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064016108fc565b60008a8a8a8a8a8a8a8a8a8a6040516020016114a89a999897969594939291906120ba565b6040516020818303038152906040528051906020012090509a9950505050505050505050565b6000818152600160209081526040808320338085529083529281902080546bffffffffffffffffffffffff60801b1916905580519283529082018390527f789770131846de4d1f28418f0f957cdf4fcabe5eccf70067083e20ecece69a3491015b60405180910390a150565b3360008181526003602090815260409182902080546001600160801b03908116600160801b918716918202179091558251938452908301527f22cd1acb7e7a306800a1b2c0ca9b0280187bbc00b7fbf55d38ad6cbf73082aec910161152f565b600081830160601b8260601b81148460601b8214176001600160a01b03848618161517600181146115ce5760019250611650565b6001600160d01b031980851690861681811881831102188686176001600160a01b031617935065ffffffffffff60a01b861690816116135765ffffffffffff60a01b91505b5065ffffffffffff60a01b851680611631575065ffffffffffff60a01b5b80821890821102188061164a575065ffffffffffff60a01b5b92909217915b505092915050565b60008083601f84011261166a57600080fd5b50813567ffffffffffffffff81111561168257600080fd5b60208301915083602082850101111561169a57600080fd5b9250929050565b600080602083850312156116b457600080fd5b823567ffffffffffffffff8111156116cb57600080fd5b6116d785828601611658565b90969095509350505050565b6000806000604084860312156116f857600080fd5b83359250602084013567ffffffffffffffff81111561171657600080fd5b61172286828701611658565b9497909650939450505050565b60008060006060848603121561174457600080fd5b833567ffffffffffffffff81111561175b57600080fd5b8401610160818703121561176e57600080fd5b95602085013595506040909401359392505050565b6001600160a01b038116811461179857600080fd5b50565b80356117a681611783565b919050565b600080604083850312156117be57600080fd5b8235915060208301356117d081611783565b809150509250929050565b80356001600160801b03811681146117a657600080fd5b80356001600160a01b0319811681146117a657600080fd5b803565ffffffffffff811681146117a657600080fd5b60008083601f84011261183257600080fd5b50813567ffffffffffffffff81111561184a57600080fd5b6020830191508360208260051b850101111561169a57600080fd5b60008060008060008060008060008060006101008c8e03121561188757600080fd5b6118908c6117db565b9a5061189e60208d016117f2565b99506118ac60408d0161179b565b98506118ba60608d0161180a565b97506118c860808d0161180a565b965067ffffffffffffffff8060a08e013511156118e457600080fd5b6118f48e60a08f01358f01611820565b909750955060c08d013581101561190a57600080fd5b61191a8e60c08f01358f01611658565b909550935060e08d013581101561193057600080fd5b506119418d60e08e01358e01611820565b81935080925050509295989b509295989b9093969950565b8183526000602080850194508260005b8581101561198557813587529582019590820190600101611969565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000808335601e198436030181126119d057600080fd5b830160208101925035905067ffffffffffffffff8111156119f057600080fd5b80360382131561169a57600080fd5b81835260006020808501808196508560051b810191508460005b87811015611a4f578284038952611a3082886119b9565b611a3b868284611990565b9a87019a9550505090840190600101611a19565b5091979650505050505050565b6001600160801b038c1681526001600160a01b03198b1660208201526001600160a01b038a16604082015265ffffffffffff89811660608301528816608082015261010060a08201819052600090611ab7838201898b611959565b905082810360c0840152611acc818789611990565b905082810360e0840152611ae18185876119ff565b9e9d5050505050505050505050505050565b600060208284031215611b0557600080fd5b813561089381611783565b600080600060408486031215611b2557600080fd5b8335611b3081611783565b9250602084013567ffffffffffffffff81111561171657600080fd5b60008060008060008060008060008060e08b8d031215611b6b57600080fd5b611b748b6117f2565b995060208b0135611b8481611783565b9850611b9260408c0161180a565b9750611ba060608c0161180a565b965060808b013567ffffffffffffffff80821115611bbd57600080fd5b611bc98e838f01611820565b909850965060a08d0135915080821115611be257600080fd5b611bee8e838f01611658565b909650945060c08d0135915080821115611c0757600080fd5b50611c148d828e01611820565b915080935050809150509295989b9194979a5092959850565b600080600060608486031215611c4257600080fd5b83359250602084013591506040840135611c5b81611783565b809150509250925092565b600060208284031215611c7857600080fd5b5035919050565b600060208284031215611c9157600080fd5b610893826117db565b60008085851115611caa57600080fd5b83861115611cb757600080fd5b5050820193919092039150565b80356020831015611cdd57600019602084900360031b1b165b92915050565b634e487b7160e01b600052601160045260246000fd5b81810381811115611cdd57611cdd611ce3565b6bffffffffffffffffffffffff1981358181169160148510156116505760149490940360031b84901b1690921692915050565b80820180821115611cdd57611cdd611ce3565b600060018060a01b03808a16835280891660208401525086604083015285606083015284608083015260c060a0830152611d9060c083018486611990565b9998505050505050505050565b600060208284031215611daf57600080fd5b5051919050565b60018060a01b0386168152846020820152836040820152608060608201526000611de4608083018486611990565b979650505050505050565b6000808335601e19843603018112611e0657600080fd5b83018035915067ffffffffffffffff821115611e2157600080fd5b60200191503681900382131561169a57600080fd5b6001600160a01b038616815260208101859052608060408201819052611e6e908201611e618661179b565b6001600160a01b03169052565b602084013560a08201526000611e8760408601866119b9565b6101608060c0860152611e9f6101e086018385611990565b9250611eae60608901896119b9565b9250607f19808786030160e0880152611ec8858584611990565b9450610100935060808a013584880152610120915060a08a01358288015261014060c08b01358189015260e08b013584890152848b0135610180890152611f11838c018c6119b9565b9550935081888703016101a0890152611f2b868686611990565b9550611f39818c018c6119b9565b955093505080878603016101c08801525050611f56838383611990565b925050508281036060840152611f6d818587611990565b98975050505050505050565b6001600160801b03818116838216019080821115611f9957611f99611ce3565b5092915050565b60006001600160801b03808316818103611fbc57611fbc611ce3565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b60018060a01b0385168152836020820152606060408201526000612004606083018486611990565b9695505050505050565b60006001820161202057612020611ce3565b5060010190565b6fffffffffffffffffffffffffffffffff1981358181169160108510156116505760109490940360031b84901b1690921692915050565b6001600160a01b0319813581811691600c85101561165057600c9490940360031b84901b1690921692915050565b6001600160d01b031981358181169160068510156116505760069490940360031b84901b1690921692915050565b6001600160a01b03198b1681526001600160a01b038a16602082015265ffffffffffff89811660408301528816606082015260e060808201819052600090612105908301888a611959565b82810360a0840152612118818789611990565b905082810360c084015261212d8185876119ff565b9d9c5050505050505050505050505056", + "nonce": "0x1d9" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xacb6b9d3cefa73943e48b34dea77c6744a47ebef09d1b943b53e0927175c3790", + "transactionType": "CREATE2", + "contractName": "SignaturePolicy", + "contractAddress": "0xdb5F74349Dd2FB2A09eEc2C6A39e77B68ca2852C", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x7d529", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506105c0806100206000396000f3fe60806040526004361061003e5760003560e01c8062282ae014610043578063bd89752f14610058578063c92ce351146100b6578063ecfcd930146100dd575b600080fd5b6100566100513660046102f1565b6100fd565b005b34801561006457600080fd5b506100a161007336600461034b565b6000602081815294815260408082208652938152838120855291825282822090935291825290205460ff1681565b60405190151581526020015b60405180910390f35b6100cf6100c4366004610398565b600095945050505050565b6040519081526020016100ad565b3480156100e957600080fd5b506100cf6100f8366004610426565b610237565b600061010b828401846104be565b905060005b815181101561022f5760006001600160a01b031682828151811061013657610136610583565b60200260200101516001600160a01b03160361018a573360009081526020818152604080832088845282528083206001600160a01b038a16845282528083209091529020805460ff1916600117905561021d565b3360009081526020818152604080832088845290915281208351600192908590859081106101ba576101ba610583565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8061022781610599565b915050610110565b505050505050565b3360009081526020818152604080832088845282528083206001600160a01b038a81168552908352818420908b16845290915281205460ff161561027d57506000610281565b5060015b979650505050505050565b80356001600160a01b03811681146102a357600080fd5b919050565b60008083601f8401126102ba57600080fd5b50813567ffffffffffffffff8111156102d257600080fd5b6020830191508360208285010111156102ea57600080fd5b9250929050565b6000806000806060858703121561030757600080fd5b6103108561028c565b935060208501359250604085013567ffffffffffffffff81111561033357600080fd5b61033f878288016102a8565b95989497509550505050565b6000806000806080858703121561036157600080fd5b61036a8561028c565b93506020850135925061037f6040860161028c565b915061038d6060860161028c565b905092959194509250565b6000806000806000608086880312156103b057600080fd5b6103b98661028c565b945060208601359350604086013567ffffffffffffffff808211156103dd57600080fd5b90870190610160828a0312156103f257600080fd5b9093506060870135908082111561040857600080fd5b50610415888289016102a8565b969995985093965092949392505050565b600080600080600080600060c0888a03121561044157600080fd5b61044a8861028c565b96506104586020890161028c565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff81111561048957600080fd5b6104958a828b016102a8565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156104d157600080fd5b823567ffffffffffffffff808211156104e957600080fd5b818501915085601f8301126104fd57600080fd5b81358181111561050f5761050f6104a8565b8060051b604051601f19603f83011681018181108582111715610534576105346104a8565b60405291825284820192508381018501918883111561055257600080fd5b938501935b82851015610577576105688561028c565b84529385019392850192610557565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b6000600182016105b957634e487b7160e01b600052601160045260246000fd5b506001019056", + "nonce": "0x1da" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0x2493846e40436f02051522cde3a043de4ccbae1b9cadd8c40995e1b7a5847f4b", + "0xacb6b9d3cefa73943e48b34dea77c6744a47ebef09d1b943b53e0927175c3790" + ], + "returns": {}, + "timestamp": 1708376910, + "chain": 80001, + "multi": false, + "commit": "525f3f4" +} \ No newline at end of file diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-1708376917.json b/broadcast/DeployModularPermission.s.sol/80001/run-1708376917.json new file mode 100644 index 00000000..f2adf578 --- /dev/null +++ b/broadcast/DeployModularPermission.s.sol/80001/run-1708376917.json @@ -0,0 +1,117 @@ +{ + "transactions": [ + { + "hash": "0x2493846e40436f02051522cde3a043de4ccbae1b9cadd8c40995e1b7a5847f4b", + "transactionType": "CREATE2", + "contractName": "ModularPermissionValidator", + "contractAddress": "0xfdDE9a26b6c3B7ca4b52C5f010d5B9Fb67e09E5A", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x2a44f3", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061213e806100206000396000f3fe6080604052600436106100dd5760003560e01c80638fc925aa1161007f578063b66bd1d211610059578063b66bd1d214610312578063d4085e811461033f578063e89005c71461037d578063ee87c2951461039057600080fd5b80638fc925aa146102bc5780639ea9bd59146102cf578063b52e2c7a146102f257600080fd5b80633ec50c6c116100bb5780633ec50c6c1461013d578063511079bc1461021157806365b8de2e146102245780637ecebe001461025b57600080fd5b80630c959556146100e2578063333daf92146100f75780633a871cdd1461012a575b600080fd5b6100f56100f03660046116a1565b6103a3565b005b34801561010357600080fd5b506101176101123660046116e3565b6103f6565b6040519081526020015b60405180910390f35b61011761013836600461172f565b61089a565b34801561014957600080fd5b506101bb6101583660046117ab565b6001602081815260009384526040808520909152918352912080549181015460028201546003909201546001600160801b03841693600160801b900460a01b926001600160a01b03909216919065ffffffffffff80821691600160301b90041686565b604080516001600160801b0390971687526001600160a01b031990951660208701526001600160a01b0390931693850193909352606084015265ffffffffffff91821660808401521660a082015260c001610121565b6100f561021f366004611865565b610d63565b34801561023057600080fd5b5061024461023f3660046116a1565b61131c565b6040516101219b9a99989796959493929190611a5c565b34801561026757600080fd5b5061029c610276366004611af3565b6003602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610121565b6100f56102ca3660046116a1565b611417565b6102e26102dd366004611b10565b611446565b6040519015158152602001610121565b3480156102fe57600080fd5b5061011761030d366004611b4c565b611483565b34801561031e57600080fd5b5061011761032d366004611af3565b60006020819052908152604090205481565b34801561034b57600080fd5b5061011761035a366004611c2d565b600260209081526000938452604080852082529284528284209052825290205481565b6100f561038b366004611c66565b6114ce565b6100f561039e366004611c7f565b61153a565b60008060008060003660003660003660006103be8d8d61131c565b9a509a509a509a509a509a509a509a509a509a509a506103e78b8b8b8b8b8b8b8b8b8b8b610d63565b50505050505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810182905261042e602060008587611c9a565b61043791611cc4565b602080830182905260009182526001815260408083203384528252808320546003909252909120546001600160801b03918216600160801b90910490911611806104aa575060208181015160009081526001825260408082203383529092522054600160801b900460a01b600160a11b16155b156104b9576001915050610893565b6020818101516000908152600180835260408083203384528452808320815160c08101835281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682880152938201546001600160a01b0316928101929092526002810154606080840191825260039092015465ffffffffffff808216608080870191909152600160301b9092041694840194909452908601849052519185019190915291860190601f1986019036610574601482611cf9565b61057f928290611c9a565b61058891611d0c565b60601c845260003661059b603482611cf9565b906105a7601436611cf9565b926105b493929190611c9a565b6105bd91611cc4565b60408501525b60808401516001600160a01b0316156107ec57608084015160a11c60011615610618576020808501516000908152600282526040808220608088018051845290845281832033845290935290205490526105c3565b36600061062f86608001516001600160a01b031690565b60608701516001600160a01b03919091169085908561064f826014611d3f565b9261065c93929190611c9a565b61066591611d0c565b60601c036106f85760008484886060015160146106829190611d3f565b90896060015160346106949190611d3f565b926106a193929190611c9a565b6106aa91611cc4565b60001c90508484886060015160346106c29190611d3f565b6106cd928290611c9a565b90935091506106dd816034611d3f565b876060018181516106ee9190611d3f565b90525061070e9050565b606086015161070990808587611c9a565b915091505b600061072487608001516001600160a01b031690565b6001600160a01b031663ecfcd9303389600001518a602001518f8c6040015189896040518863ffffffff1660e01b81526004016107679796959493929190611d52565b602060405180830381865afa158015610784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a89190611d9d565b90506107b4888261159a565b602080890151600090815260028252604080822060808c0180518452908452818320338452909352902054905297506105c392505050565b600083604001516001600160a01b0316637a7c6a4f3387602001518c87878b6060015190809261081e93929190611c9a565b6040518663ffffffff1660e01b815260040161083e959493929190611db6565b602060405180830381865afa15801561085b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087f9190611d9d565b905061088b868261159a565b955050505050505b9392505050565b6000336108aa6020860186611af3565b6001600160a01b0316146109055760405162461bcd60e51b815260206004820152601960248201527f73656e646572206d757374206265206d73672e73656e6465720000000000000060448201526064015b60405180910390fd5b6000610915610140860186611def565b61092491602091600091611c9a565b61092d91611cc4565b6000818152600160209081526040808320338452909152902054909150600160801b900460a01b600160a01b16158061099c575060008181526001602090815260408083203384528252808320546003909252909120546001600160801b03918216600160801b909104909116115b156109ab576001915050610893565b6000818152600160208181526040808420338552825292839020835160c08101855281546001600160801b0381168252600160801b900460a090811b6001600160a01b03191682850152938201546001600160a01b03169481019490945260028101546060850181905260039091015465ffffffffffff8082166080870152600160301b90910416928401929092525b6001600160a01b03821615610cf05760a082901c60011615610a815760008481526002602090815260408083209483529381528382203383529052919091205490610a3b565b366000610a8f836034611d3f565b610a9d6101408c018c611def565b905010158015610ae857506001600160a01b038416610ac06101408c018c611def565b8590610acd826014611d3f565b92610ada93929190611c9a565b610ae391611d0c565b60601c145b15610c12576000610afd6101408c018c611def565b610b08866014611d3f565b90610b14876034611d3f565b92610b2193929190611c9a565b610b2a91611cc4565b905080610b38856034611d3f565b610b429190611d3f565b610b506101408d018d611def565b90501015610bb35760405162461bcd60e51b815260206004820152602a60248201527f706f6c69637944617461206c656e6774682065786365656473207369676e61746044820152690eae4ca40d8cadccee8d60b31b60648201526084016108fc565b610bc16101408c018c611def565b610bcc866034611d3f565b9083610bd9886034611d3f565b610be39190611d3f565b92610bf093929190611c9a565b9093509150610c00816034611d3f565b610c0a9085611d3f565b935050610c32565b610c206101408b018b611def565b610c2d9185918291611c9a565b915091505b60006001600160a01b0385166001600160a01b031663c92ce35133898e87876040518663ffffffff1660e01b8152600401610c71959493929190611e36565b6020604051808303816000875af1158015610c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb49190611d9d565b9050610cc0888261159a565b600088815260026020908152604080832098835297815287822033835290529590952054949750610a3b92505050565b60408301516000906001600160a01b0316638e0125d233878b610d176101408f018f611def565b610d249189908290611c9a565b6040518663ffffffff1660e01b8152600401610d44959493929190611db6565b6020604051808303816000875af115801561085b573d6000803e3d6000fd5b6001600160a01b03198a16610dba5760405162461bcd60e51b815260206004820152601860248201527f666c61672073686f756c64206e6f7420626520656d707479000000000000000060448201526064016108fc565b336000908152600360205260409020546001600160801b038c811691161480610e17575033600090815260036020526040902054610e02906001600160801b03166001611f79565b6001600160801b03168b6001600160801b0316145b610e5a5760405162461bcd60e51b81526020600482015260146024820152731b9bdb98d9481cda1bdd5b19081899481b995e1d60621b60448201526064016108fc565b33600090815260036020526040812080546001600160801b031691610e7e83611fa0565b91906101000a8154816001600160801b0302191690836001600160801b03160217905550506000610eb78b8b8b8b8b8b8b8b8b8b611483565b9050600160a01b6001600160a01b03198c1601610ee1573360009081526020819052604090208190555b8a60005b87811015610fd557610f15898983818110610f0257610f02611fc6565b905060200201356001600160a01b031690565b6001600160a01b031662282ae03385888886818110610f3657610f36611fc6565b9050602002810190610f489190611def565b6040518563ffffffff1660e01b8152600401610f679493929190611fdc565b600060405180830381600087803b158015610f8157600080fd5b505af1158015610f95573d6000803e3d6000fd5b505050506000610fbd8a8a84818110610fb057610fb0611fc6565b9050602002013560a01c90565b92909216915080610fcd8161200e565b915050610ee5565b5060405163e9b51de560e01b81526001600160a01b038c169063e9b51de59061100890339086908b908b90600401611fdc565b600060405180830381600087803b15801561102257600080fd5b505af1158015611036573d6000803e3d6000fd5b5050505060008888600081811061104f5761104f611fc6565b60200291909101359150506001600160a01b03198216156110c65760405162461bcd60e51b815260206004820152602b60248201527f6572726f72203a207065726d697373696f6e20666c616720657863656564732060448201526a706f6c69637920666c616760a81b60648201526084016108fc565b6040518060c001604052808f6001600160801b031681526020018e6001600160a01b03191681526020018d6001600160a01b031681526020018281526020018c65ffffffffffff1681526020018b65ffffffffffff16815250600160008581526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160801b0302191690836001600160801b0316021790555060208201518160000160106101000a8154816bffffffffffffffffffffffff021916908360a01c021790555060408201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816002015560808201518160030160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060a08201518160030160066101000a81548165ffffffffffff021916908365ffffffffffff1602179055509050506000600190505b888110156112d25789898281811061125f5761125f611fc6565b905060200201356002600086815260200190815260200160002060008c8c60018661128a9190611cf9565b81811061129957611299611fc6565b602090810292909201358352508181019290925260409081016000908120338252909252902055806112ca8161200e565b915050611245565b5060408051338152602081018590527fab0f2b94c33903f7ed343b1bcc3baca5e69eb7d007b8c8207232012f6cffef0e910160405180910390a15050505050505050505050505050565b60008060008060003660003660003660008c8c60009060109261134193929190611c9a565b61134a91612027565b60801c9a508c8c601090601c9261136393929190611c9a565b61136c9161205e565b99508c8c601c9060229261138293929190611c9a565b61138b9161208c565b60d01c97508c8c6022906028926113a493929190611c9a565b6113ad9161208c565b60d01c96508c8c602890603c926113c693929190611c9a565b6113cf91611d0c565b9a9d999c60609b909b1c9b5096999598605c603c8089013589018281019b50810135995081890135890180830199908201359850607c81013501918201965001359350915050565b60208190036114315761142d61038b8284611cc4565b5050565b61142d61143e8284612027565b60801c61153a565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201526000906064016108fc565b60008a8a8a8a8a8a8a8a8a8a6040516020016114a89a999897969594939291906120ba565b6040516020818303038152906040528051906020012090509a9950505050505050505050565b6000818152600160209081526040808320338085529083529281902080546bffffffffffffffffffffffff60801b1916905580519283529082018390527f789770131846de4d1f28418f0f957cdf4fcabe5eccf70067083e20ecece69a3491015b60405180910390a150565b3360008181526003602090815260409182902080546001600160801b03908116600160801b918716918202179091558251938452908301527f22cd1acb7e7a306800a1b2c0ca9b0280187bbc00b7fbf55d38ad6cbf73082aec910161152f565b600081830160601b8260601b81148460601b8214176001600160a01b03848618161517600181146115ce5760019250611650565b6001600160d01b031980851690861681811881831102188686176001600160a01b031617935065ffffffffffff60a01b861690816116135765ffffffffffff60a01b91505b5065ffffffffffff60a01b851680611631575065ffffffffffff60a01b5b80821890821102188061164a575065ffffffffffff60a01b5b92909217915b505092915050565b60008083601f84011261166a57600080fd5b50813567ffffffffffffffff81111561168257600080fd5b60208301915083602082850101111561169a57600080fd5b9250929050565b600080602083850312156116b457600080fd5b823567ffffffffffffffff8111156116cb57600080fd5b6116d785828601611658565b90969095509350505050565b6000806000604084860312156116f857600080fd5b83359250602084013567ffffffffffffffff81111561171657600080fd5b61172286828701611658565b9497909650939450505050565b60008060006060848603121561174457600080fd5b833567ffffffffffffffff81111561175b57600080fd5b8401610160818703121561176e57600080fd5b95602085013595506040909401359392505050565b6001600160a01b038116811461179857600080fd5b50565b80356117a681611783565b919050565b600080604083850312156117be57600080fd5b8235915060208301356117d081611783565b809150509250929050565b80356001600160801b03811681146117a657600080fd5b80356001600160a01b0319811681146117a657600080fd5b803565ffffffffffff811681146117a657600080fd5b60008083601f84011261183257600080fd5b50813567ffffffffffffffff81111561184a57600080fd5b6020830191508360208260051b850101111561169a57600080fd5b60008060008060008060008060008060006101008c8e03121561188757600080fd5b6118908c6117db565b9a5061189e60208d016117f2565b99506118ac60408d0161179b565b98506118ba60608d0161180a565b97506118c860808d0161180a565b965067ffffffffffffffff8060a08e013511156118e457600080fd5b6118f48e60a08f01358f01611820565b909750955060c08d013581101561190a57600080fd5b61191a8e60c08f01358f01611658565b909550935060e08d013581101561193057600080fd5b506119418d60e08e01358e01611820565b81935080925050509295989b509295989b9093969950565b8183526000602080850194508260005b8581101561198557813587529582019590820190600101611969565b509495945050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000808335601e198436030181126119d057600080fd5b830160208101925035905067ffffffffffffffff8111156119f057600080fd5b80360382131561169a57600080fd5b81835260006020808501808196508560051b810191508460005b87811015611a4f578284038952611a3082886119b9565b611a3b868284611990565b9a87019a9550505090840190600101611a19565b5091979650505050505050565b6001600160801b038c1681526001600160a01b03198b1660208201526001600160a01b038a16604082015265ffffffffffff89811660608301528816608082015261010060a08201819052600090611ab7838201898b611959565b905082810360c0840152611acc818789611990565b905082810360e0840152611ae18185876119ff565b9e9d5050505050505050505050505050565b600060208284031215611b0557600080fd5b813561089381611783565b600080600060408486031215611b2557600080fd5b8335611b3081611783565b9250602084013567ffffffffffffffff81111561171657600080fd5b60008060008060008060008060008060e08b8d031215611b6b57600080fd5b611b748b6117f2565b995060208b0135611b8481611783565b9850611b9260408c0161180a565b9750611ba060608c0161180a565b965060808b013567ffffffffffffffff80821115611bbd57600080fd5b611bc98e838f01611820565b909850965060a08d0135915080821115611be257600080fd5b611bee8e838f01611658565b909650945060c08d0135915080821115611c0757600080fd5b50611c148d828e01611820565b915080935050809150509295989b9194979a5092959850565b600080600060608486031215611c4257600080fd5b83359250602084013591506040840135611c5b81611783565b809150509250925092565b600060208284031215611c7857600080fd5b5035919050565b600060208284031215611c9157600080fd5b610893826117db565b60008085851115611caa57600080fd5b83861115611cb757600080fd5b5050820193919092039150565b80356020831015611cdd57600019602084900360031b1b165b92915050565b634e487b7160e01b600052601160045260246000fd5b81810381811115611cdd57611cdd611ce3565b6bffffffffffffffffffffffff1981358181169160148510156116505760149490940360031b84901b1690921692915050565b80820180821115611cdd57611cdd611ce3565b600060018060a01b03808a16835280891660208401525086604083015285606083015284608083015260c060a0830152611d9060c083018486611990565b9998505050505050505050565b600060208284031215611daf57600080fd5b5051919050565b60018060a01b0386168152846020820152836040820152608060608201526000611de4608083018486611990565b979650505050505050565b6000808335601e19843603018112611e0657600080fd5b83018035915067ffffffffffffffff821115611e2157600080fd5b60200191503681900382131561169a57600080fd5b6001600160a01b038616815260208101859052608060408201819052611e6e908201611e618661179b565b6001600160a01b03169052565b602084013560a08201526000611e8760408601866119b9565b6101608060c0860152611e9f6101e086018385611990565b9250611eae60608901896119b9565b9250607f19808786030160e0880152611ec8858584611990565b9450610100935060808a013584880152610120915060a08a01358288015261014060c08b01358189015260e08b013584890152848b0135610180890152611f11838c018c6119b9565b9550935081888703016101a0890152611f2b868686611990565b9550611f39818c018c6119b9565b955093505080878603016101c08801525050611f56838383611990565b925050508281036060840152611f6d818587611990565b98975050505050505050565b6001600160801b03818116838216019080821115611f9957611f99611ce3565b5092915050565b60006001600160801b03808316818103611fbc57611fbc611ce3565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b60018060a01b0385168152836020820152606060408201526000612004606083018486611990565b9695505050505050565b60006001820161202057612020611ce3565b5060010190565b6fffffffffffffffffffffffffffffffff1981358181169160108510156116505760109490940360031b84901b1690921692915050565b6001600160a01b0319813581811691600c85101561165057600c9490940360031b84901b1690921692915050565b6001600160d01b031981358181169160068510156116505760069490940360031b84901b1690921692915050565b6001600160a01b03198b1681526001600160a01b038a16602082015265ffffffffffff89811660408301528816606082015260e060808201819052600090612105908301888a611959565b82810360a0840152612118818789611990565b905082810360c084015261212d8185876119ff565b9d9c5050505050505050505050505056", + "nonce": "0x1d9" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xacb6b9d3cefa73943e48b34dea77c6744a47ebef09d1b943b53e0927175c3790", + "transactionType": "CREATE2", + "contractName": "SignaturePolicy", + "contractAddress": "0xdb5F74349Dd2FB2A09eEc2C6A39e77B68ca2852C", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x7d529", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b506105c0806100206000396000f3fe60806040526004361061003e5760003560e01c8062282ae014610043578063bd89752f14610058578063c92ce351146100b6578063ecfcd930146100dd575b600080fd5b6100566100513660046102f1565b6100fd565b005b34801561006457600080fd5b506100a161007336600461034b565b6000602081815294815260408082208652938152838120855291825282822090935291825290205460ff1681565b60405190151581526020015b60405180910390f35b6100cf6100c4366004610398565b600095945050505050565b6040519081526020016100ad565b3480156100e957600080fd5b506100cf6100f8366004610426565b610237565b600061010b828401846104be565b905060005b815181101561022f5760006001600160a01b031682828151811061013657610136610583565b60200260200101516001600160a01b03160361018a573360009081526020818152604080832088845282528083206001600160a01b038a16845282528083209091529020805460ff1916600117905561021d565b3360009081526020818152604080832088845290915281208351600192908590859081106101ba576101ba610583565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8061022781610599565b915050610110565b505050505050565b3360009081526020818152604080832088845282528083206001600160a01b038a81168552908352818420908b16845290915281205460ff161561027d57506000610281565b5060015b979650505050505050565b80356001600160a01b03811681146102a357600080fd5b919050565b60008083601f8401126102ba57600080fd5b50813567ffffffffffffffff8111156102d257600080fd5b6020830191508360208285010111156102ea57600080fd5b9250929050565b6000806000806060858703121561030757600080fd5b6103108561028c565b935060208501359250604085013567ffffffffffffffff81111561033357600080fd5b61033f878288016102a8565b95989497509550505050565b6000806000806080858703121561036157600080fd5b61036a8561028c565b93506020850135925061037f6040860161028c565b915061038d6060860161028c565b905092959194509250565b6000806000806000608086880312156103b057600080fd5b6103b98661028c565b945060208601359350604086013567ffffffffffffffff808211156103dd57600080fd5b90870190610160828a0312156103f257600080fd5b9093506060870135908082111561040857600080fd5b50610415888289016102a8565b969995985093965092949392505050565b600080600080600080600060c0888a03121561044157600080fd5b61044a8861028c565b96506104586020890161028c565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff81111561048957600080fd5b6104958a828b016102a8565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156104d157600080fd5b823567ffffffffffffffff808211156104e957600080fd5b818501915085601f8301126104fd57600080fd5b81358181111561050f5761050f6104a8565b8060051b604051601f19603f83011681018181108582111715610534576105346104a8565b60405291825284820192508381018501918883111561055257600080fd5b938501935b82851015610577576105688561028c565b84529385019392850192610557565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b6000600182016105b957634e487b7160e01b600052601160045260246000fd5b506001019056", + "nonce": "0x1da" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x2493846e40436f02051522cde3a043de4ccbae1b9cadd8c40995e1b7a5847f4b", + "transactionIndex": "0x1", + "blockHash": "0xfd0f9244799d12c47e27e4d722a9baa399eff8f3172ff96cdaabb373ac3d84a1", + "blockNumber": "0x2bf9b5b", + "from": "0xA02CDdFa44B8C01b4257F54ac1c43F75801E8175", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x1e6361", + "gasUsed": "0x1ce907", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000a02cddfa44b8c01b4257f54ac1c43f75801e8175", + "0x000000000000000000000000cfef2a3dc244ef7d0fb93c45e762d671445c4569" + ], + "data": "0x0000000000000000000000000000000000000000000000000025315a3e903c3d00000000000000000000000000000000000000000000000002b39a3b72883523000000000000000000000000000000000000000000000186d106828989afc7bd000000000000000000000000000000000000000000000000028e68e133f7f8e6000000000000000000000000000000000000000000000186d12bb3e3c84003fa", + "blockHash": "0xfd0f9244799d12c47e27e4d722a9baa399eff8f3172ff96cdaabb373ac3d84a1", + "blockNumber": "0x2bf9b5b", + "transactionHash": "0x2493846e40436f02051522cde3a043de4ccbae1b9cadd8c40995e1b7a5847f4b", + "transactionIndex": "0x1", + "logIndex": "0x3", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000020100000000000000000000000000000000000000000000000000020000000080000040000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000008000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000040000100000", + "type": "0x0", + "effectiveGasPrice": "0x1495773aa" + }, + { + "transactionHash": "0xacb6b9d3cefa73943e48b34dea77c6744a47ebef09d1b943b53e0927175c3790", + "transactionIndex": "0x2", + "blockHash": "0xfd0f9244799d12c47e27e4d722a9baa399eff8f3172ff96cdaabb373ac3d84a1", + "blockNumber": "0x2bf9b5b", + "from": "0xA02CDdFa44B8C01b4257F54ac1c43F75801E8175", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x240f73", + "gasUsed": "0x5ac12", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000a02cddfa44b8c01b4257f54ac1c43f75801e8175", + "0x000000000000000000000000cfef2a3dc244ef7d0fb93c45e762d671445c4569" + ], + "data": "0x00000000000000000000000000000000000000000000000000074c132bd944e6000000000000000000000000000000000000000000000000028e68e13246517d000000000000000000000000000000000000000000000186d12bb3e3c84003fa00000000000000000000000000000000000000000000000002871cce066d0c97000000000000000000000000000000000000000000000186d132fff6f41948e0", + "blockHash": "0xfd0f9244799d12c47e27e4d722a9baa399eff8f3172ff96cdaabb373ac3d84a1", + "blockNumber": "0x2bf9b5b", + "transactionHash": "0xacb6b9d3cefa73943e48b34dea77c6744a47ebef09d1b943b53e0927175c3790", + "transactionIndex": "0x2", + "logIndex": "0x4", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000020100000000000000000000000000000000000000000000000000020000000080000040000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000008000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000040000100000", + "type": "0x0", + "effectiveGasPrice": "0x1495773aa" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1708376917, + "chain": 80001, + "multi": false, + "commit": "525f3f4" +} \ No newline at end of file diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-1708453269.json b/broadcast/DeployModularPermission.s.sol/80001/run-1708453269.json new file mode 100644 index 00000000..e35e1066 --- /dev/null +++ b/broadcast/DeployModularPermission.s.sol/80001/run-1708453269.json @@ -0,0 +1,33 @@ +{ + "transactions": [ + { + "hash": "0xb43feb372e43cfdeb632df85d5996b631baf9bd6a07747beafbdb79b6e14ba18", + "transactionType": "CREATE2", + "contractName": "ECDSASigner", + "contractAddress": "0x5569b550050F6537D9ac3329001be7F4C6659Cb0", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x9a6bf", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061074e806100206000396000f3fe60806040526004361061003f5760003560e01c806367249d69146100445780637a7c6a4f146100a75780638e0125d2146100d5578063e9b51de5146100e8575b600080fd5b34801561005057600080fd5b5061008a61005f366004610566565b600060208181529381526040808220855292815282812090935282529020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100b357600080fd5b506100c76100c23660046105eb565b6100fd565b60405190815260200161009e565b6100c76100e33660046105eb565b610261565b6100fb6100f6366004610653565b610345565b005b3360009081526020818152604080832087845282528083206001600160a01b0389811685529252822054168061014e5760405162461bcd60e51b8152600401610145906106ad565b60405180910390fd5b806001600160a01b031661019a85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9392505061048e9050565b6001600160a01b0316036101b2576000915050610258565b60006101e3866020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b9050600061022986868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869392505061048e9050565b9050826001600160a01b0316816001600160a01b0316036102505760009350505050610258565b600193505050505b95945050505050565b3360009081526020818152604080832087845282528083206001600160a01b0389811685529252822054166102a85760405162461bcd60e51b8152600401610145906106ad565b60006102f584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506102ef925089915061051f9050565b9061048e565b336000908152602081815260408083208a845282528083206001600160a01b038c8116855292529091205491925090811690821603610338576000915050610258565b5060019695505050505050565b3360009081526020818152604080832086845282528083206001600160a01b03888116855292529091205416156103cd5760405162461bcd60e51b815260206004820152602660248201527f45434453415369676e65723a206b65726e656c20616c726561647920726567696044820152651cdd195c995960d21b6064820152608401610145565b601481146104295760405162461bcd60e51b815260206004820152602360248201527f45434453415369676e65723a20696e76616c6964207369676e6572206164647260448201526265737360e81b6064820152608401610145565b600061043860148284866106ef565b61044191610719565b336000908152602081815260408083209783529681528682206001600160a01b03989098168252969096529390942080546001600160a01b03191660609490941c93909317909255505050565b60405160019083600052602083015160405260408351036104ca57604083015160ff81901c601b016020526001600160ff1b03166060526104f0565b60418351036104eb57606083015160001a60205260408301516060526104f0565b600091505b6020600160806000855afa5191503d61051157638baa579f6000526004601cfd5b600060605260405292915050565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b80356001600160a01b038116811461056157600080fd5b919050565b60008060006060848603121561057b57600080fd5b6105848461054a565b9250602084013591506105996040850161054a565b90509250925092565b60008083601f8401126105b457600080fd5b50813567ffffffffffffffff8111156105cc57600080fd5b6020830191508360208285010111156105e457600080fd5b9250929050565b60008060008060006080868803121561060357600080fd5b61060c8661054a565b94506020860135935060408601359250606086013567ffffffffffffffff81111561063657600080fd5b610642888289016105a2565b969995985093965092949392505050565b6000806000806060858703121561066957600080fd5b6106728561054a565b935060208501359250604085013567ffffffffffffffff81111561069557600080fd5b6106a1878288016105a2565b95989497509550505050565b60208082526022908201527f45434453415369676e65723a206b65726e656c206e6f74207265676973746572604082015261195960f21b606082015260800190565b600080858511156106ff57600080fd5b8386111561070c57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107465780818660140360031b1b83161692505b50509291505056", + "nonce": "0x1dc" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [], + "libraries": [], + "pending": [ + "0xb43feb372e43cfdeb632df85d5996b631baf9bd6a07747beafbdb79b6e14ba18" + ], + "returns": {}, + "timestamp": 1708453269, + "chain": 80001, + "multi": false, + "commit": "525f3f4" +} \ No newline at end of file diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-1708453276.json b/broadcast/DeployModularPermission.s.sol/80001/run-1708453276.json new file mode 100644 index 00000000..bba56a29 --- /dev/null +++ b/broadcast/DeployModularPermission.s.sol/80001/run-1708453276.json @@ -0,0 +1,65 @@ +{ + "transactions": [ + { + "hash": "0xb43feb372e43cfdeb632df85d5996b631baf9bd6a07747beafbdb79b6e14ba18", + "transactionType": "CREATE2", + "contractName": "ECDSASigner", + "contractAddress": "0x5569b550050F6537D9ac3329001be7F4C6659Cb0", + "function": null, + "arguments": null, + "transaction": { + "type": "0x00", + "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x9a6bf", + "value": "0x0", + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061074e806100206000396000f3fe60806040526004361061003f5760003560e01c806367249d69146100445780637a7c6a4f146100a75780638e0125d2146100d5578063e9b51de5146100e8575b600080fd5b34801561005057600080fd5b5061008a61005f366004610566565b600060208181529381526040808220855292815282812090935282529020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100b357600080fd5b506100c76100c23660046105eb565b6100fd565b60405190815260200161009e565b6100c76100e33660046105eb565b610261565b6100fb6100f6366004610653565b610345565b005b3360009081526020818152604080832087845282528083206001600160a01b0389811685529252822054168061014e5760405162461bcd60e51b8152600401610145906106ad565b60405180910390fd5b806001600160a01b031661019a85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9392505061048e9050565b6001600160a01b0316036101b2576000915050610258565b60006101e3866020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b9050600061022986868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869392505061048e9050565b9050826001600160a01b0316816001600160a01b0316036102505760009350505050610258565b600193505050505b95945050505050565b3360009081526020818152604080832087845282528083206001600160a01b0389811685529252822054166102a85760405162461bcd60e51b8152600401610145906106ad565b60006102f584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506102ef925089915061051f9050565b9061048e565b336000908152602081815260408083208a845282528083206001600160a01b038c8116855292529091205491925090811690821603610338576000915050610258565b5060019695505050505050565b3360009081526020818152604080832086845282528083206001600160a01b03888116855292529091205416156103cd5760405162461bcd60e51b815260206004820152602660248201527f45434453415369676e65723a206b65726e656c20616c726561647920726567696044820152651cdd195c995960d21b6064820152608401610145565b601481146104295760405162461bcd60e51b815260206004820152602360248201527f45434453415369676e65723a20696e76616c6964207369676e6572206164647260448201526265737360e81b6064820152608401610145565b600061043860148284866106ef565b61044191610719565b336000908152602081815260408083209783529681528682206001600160a01b03989098168252969096529390942080546001600160a01b03191660609490941c93909317909255505050565b60405160019083600052602083015160405260408351036104ca57604083015160ff81901c601b016020526001600160ff1b03166060526104f0565b60418351036104eb57606083015160001a60205260408301516060526104f0565b600091505b6020600160806000855afa5191503d61051157638baa579f6000526004601cfd5b600060605260405292915050565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b80356001600160a01b038116811461056157600080fd5b919050565b60008060006060848603121561057b57600080fd5b6105848461054a565b9250602084013591506105996040850161054a565b90509250925092565b60008083601f8401126105b457600080fd5b50813567ffffffffffffffff8111156105cc57600080fd5b6020830191508360208285010111156105e457600080fd5b9250929050565b60008060008060006080868803121561060357600080fd5b61060c8661054a565b94506020860135935060408601359250606086013567ffffffffffffffff81111561063657600080fd5b610642888289016105a2565b969995985093965092949392505050565b6000806000806060858703121561066957600080fd5b6106728561054a565b935060208501359250604085013567ffffffffffffffff81111561069557600080fd5b6106a1878288016105a2565b95989497509550505050565b60208082526022908201527f45434453415369676e65723a206b65726e656c206e6f74207265676973746572604082015261195960f21b606082015260800190565b600080858511156106ff57600080fd5b8386111561070c57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107465780818660140360031b1b83161692505b50509291505056", + "nonce": "0x1dc" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0xb43feb372e43cfdeb632df85d5996b631baf9bd6a07747beafbdb79b6e14ba18", + "transactionIndex": "0x1", + "blockHash": "0xfabf9a00e6b3fd459d70aaccea2ec5114c2f5137ae56e47163240afba173bb69", + "blockNumber": "0x2c024a3", + "from": "0xA02CDdFa44B8C01b4257F54ac1c43F75801E8175", + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "cumulativeGasUsed": "0x836a4", + "gasUsed": "0x6fd3f", + "contractAddress": null, + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000a02cddfa44b8c01b4257f54ac1c43f75801e8175", + "0x0000000000000000000000005082f249cdb2f2c1ee035e4f423c46ea2dab3ab1" + ], + "data": "0x000000000000000000000000000000000000000000000000002847570687177a000000000000000000000000000000000000000000000000025ed6b677c3badd000000000000000000000000000000000000000000000676b39435257e8230fb00000000000000000000000000000000000000000000000002368f5f713ca363000000000000000000000000000000000000000000000676b3bc7c7c85094875", + "blockHash": "0xfabf9a00e6b3fd459d70aaccea2ec5114c2f5137ae56e47163240afba173bb69", + "blockNumber": "0x2c024a3", + "transactionHash": "0xb43feb372e43cfdeb632df85d5996b631baf9bd6a07747beafbdb79b6e14ba18", + "transactionIndex": "0x1", + "logIndex": "0x1", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000020000000000000002000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000020000000080000040000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000008000000000000000000000000100000000000000000000000000080000000000000000000000000000000000000000000100000", + "type": "0x0", + "effectiveGasPrice": "0x5c350d816" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1708453276, + "chain": 80001, + "multi": false, + "commit": "525f3f4" +} \ No newline at end of file diff --git a/broadcast/DeployModularPermission.s.sol/80001/run-latest.json b/broadcast/DeployModularPermission.s.sol/80001/run-latest.json index af2b7e09..bba56a29 100644 --- a/broadcast/DeployModularPermission.s.sol/80001/run-latest.json +++ b/broadcast/DeployModularPermission.s.sol/80001/run-latest.json @@ -1,20 +1,20 @@ { "transactions": [ { - "hash": "0x89e6d563669543b286e9a46b28a735c7fffe00a561b93a88e0a853dda955ccfb", + "hash": "0xb43feb372e43cfdeb632df85d5996b631baf9bd6a07747beafbdb79b6e14ba18", "transactionType": "CREATE2", - "contractName": "SudoPolicy", - "contractAddress": "0x9262C3A894328f9036Aa7a3f0f2cE8CF684ad20f", + "contractName": "ECDSASigner", + "contractAddress": "0x5569b550050F6537D9ac3329001be7F4C6659Cb0", "function": null, "arguments": null, "transaction": { "type": "0x00", "from": "0xa02cddfa44b8c01b4257f54ac1c43f75801e8175", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x3f7cc", + "gas": "0x9a6bf", "value": "0x0", - "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b50610270806100206000396000f3fe6080604052600436106100335760003560e01c8062282ae014610038578063c92ce3511461004e578063ecfcd93014610079575b600080fd5b61004c610046366004610106565b50505050565b005b61006761005c366004610160565b600095945050505050565b60405190815260200160405180910390f35b34801561008557600080fd5b506100676100943660046101ee565b6000979650505050505050565b80356001600160a01b03811681146100b857600080fd5b919050565b60008083601f8401126100cf57600080fd5b50813567ffffffffffffffff8111156100e757600080fd5b6020830191508360208285010111156100ff57600080fd5b9250929050565b6000806000806060858703121561011c57600080fd5b610125856100a1565b935060208501359250604085013567ffffffffffffffff81111561014857600080fd5b610154878288016100bd565b95989497509550505050565b60008060008060006080868803121561017857600080fd5b610181866100a1565b945060208601359350604086013567ffffffffffffffff808211156101a557600080fd5b90870190610160828a0312156101ba57600080fd5b909350606087013590808211156101d057600080fd5b506101dd888289016100bd565b969995985093965092949392505050565b600080600080600080600060c0888a03121561020957600080fd5b610212886100a1565b9650610220602089016100a1565b955060408801359450606088013593506080880135925060a088013567ffffffffffffffff81111561025157600080fd5b61025d8a828b016100bd565b989b979a5095985093969295929350505056", - "nonce": "0x1d8" + "data": "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5061074e806100206000396000f3fe60806040526004361061003f5760003560e01c806367249d69146100445780637a7c6a4f146100a75780638e0125d2146100d5578063e9b51de5146100e8575b600080fd5b34801561005057600080fd5b5061008a61005f366004610566565b600060208181529381526040808220855292815282812090935282529020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100b357600080fd5b506100c76100c23660046105eb565b6100fd565b60405190815260200161009e565b6100c76100e33660046105eb565b610261565b6100fb6100f6366004610653565b610345565b005b3360009081526020818152604080832087845282528083206001600160a01b0389811685529252822054168061014e5760405162461bcd60e51b8152600401610145906106ad565b60405180910390fd5b806001600160a01b031661019a85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9392505061048e9050565b6001600160a01b0316036101b2576000915050610258565b60006101e3866020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b9050600061022986868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869392505061048e9050565b9050826001600160a01b0316816001600160a01b0316036102505760009350505050610258565b600193505050505b95945050505050565b3360009081526020818152604080832087845282528083206001600160a01b0389811685529252822054166102a85760405162461bcd60e51b8152600401610145906106ad565b60006102f584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506102ef925089915061051f9050565b9061048e565b336000908152602081815260408083208a845282528083206001600160a01b038c8116855292529091205491925090811690821603610338576000915050610258565b5060019695505050505050565b3360009081526020818152604080832086845282528083206001600160a01b03888116855292529091205416156103cd5760405162461bcd60e51b815260206004820152602660248201527f45434453415369676e65723a206b65726e656c20616c726561647920726567696044820152651cdd195c995960d21b6064820152608401610145565b601481146104295760405162461bcd60e51b815260206004820152602360248201527f45434453415369676e65723a20696e76616c6964207369676e6572206164647260448201526265737360e81b6064820152608401610145565b600061043860148284866106ef565b61044191610719565b336000908152602081815260408083209783529681528682206001600160a01b03989098168252969096529390942080546001600160a01b03191660609490941c93909317909255505050565b60405160019083600052602083015160405260408351036104ca57604083015160ff81901c601b016020526001600160ff1b03166060526104f0565b60418351036104eb57606083015160001a60205260408301516060526104f0565b600091505b6020600160806000855afa5191503d61051157638baa579f6000526004601cfd5b600060605260405292915050565b6020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b80356001600160a01b038116811461056157600080fd5b919050565b60008060006060848603121561057b57600080fd5b6105848461054a565b9250602084013591506105996040850161054a565b90509250925092565b60008083601f8401126105b457600080fd5b50813567ffffffffffffffff8111156105cc57600080fd5b6020830191508360208285010111156105e457600080fd5b9250929050565b60008060008060006080868803121561060357600080fd5b61060c8661054a565b94506020860135935060408601359250606086013567ffffffffffffffff81111561063657600080fd5b610642888289016105a2565b969995985093965092949392505050565b6000806000806060858703121561066957600080fd5b6106728561054a565b935060208501359250604085013567ffffffffffffffff81111561069557600080fd5b6106a1878288016105a2565b95989497509550505050565b60208082526022908201527f45434453415369676e65723a206b65726e656c206e6f74207265676973746572604082015261195960f21b606082015260800190565b600080858511156106ff57600080fd5b8386111561070c57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156107465780818660140360031b1b83161692505b50509291505056", + "nonce": "0x1dc" }, "additionalContracts": [], "isFixedGasLimit": false @@ -22,14 +22,14 @@ ], "receipts": [ { - "transactionHash": "0x89e6d563669543b286e9a46b28a735c7fffe00a561b93a88e0a853dda955ccfb", - "transactionIndex": "0x3", - "blockHash": "0x9e7b7d9ca8c172613bfc0fa847fb7d588487008d1b7b7c1e5de7658bd07f7700", - "blockNumber": "0x2bdc57c", + "transactionHash": "0xb43feb372e43cfdeb632df85d5996b631baf9bd6a07747beafbdb79b6e14ba18", + "transactionIndex": "0x1", + "blockHash": "0xfabf9a00e6b3fd459d70aaccea2ec5114c2f5137ae56e47163240afba173bb69", + "blockNumber": "0x2c024a3", "from": "0xA02CDdFa44B8C01b4257F54ac1c43F75801E8175", "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "cumulativeGasUsed": "0x11750a", - "gasUsed": "0x2df96", + "cumulativeGasUsed": "0x836a4", + "gasUsed": "0x6fd3f", "contractAddress": null, "logs": [ { @@ -38,28 +38,28 @@ "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", "0x0000000000000000000000000000000000000000000000000000000000001010", "0x000000000000000000000000a02cddfa44b8c01b4257f54ac1c43f75801e8175", - "0x000000000000000000000000be188d6641e8b680743a4815dfa0f6208038960f" + "0x0000000000000000000000005082f249cdb2f2c1ee035e4f423c46ea2dab3ab1" ], - "data": "0x000000000000000000000000000000000000000000000000000100e681fc8a0000000000000000000000000000000000000000000000000002b49b1af88c2ced00000000000000000000000000000000000000000000365882a68791112f118100000000000000000000000000000000000000000000000002b39a34768fa2ed00000000000000000000000000000000000000000000365882a78877932b9b81", - "blockHash": "0x9e7b7d9ca8c172613bfc0fa847fb7d588487008d1b7b7c1e5de7658bd07f7700", - "blockNumber": "0x2bdc57c", - "transactionHash": "0x89e6d563669543b286e9a46b28a735c7fffe00a561b93a88e0a853dda955ccfb", - "transactionIndex": "0x3", - "logIndex": "0x8", + "data": "0x000000000000000000000000000000000000000000000000002847570687177a000000000000000000000000000000000000000000000000025ed6b677c3badd000000000000000000000000000000000000000000000676b39435257e8230fb00000000000000000000000000000000000000000000000002368f5f713ca363000000000000000000000000000000000000000000000676b3bc7c7c85094875", + "blockHash": "0xfabf9a00e6b3fd459d70aaccea2ec5114c2f5137ae56e47163240afba173bb69", + "blockNumber": "0x2c024a3", + "transactionHash": "0xb43feb372e43cfdeb632df85d5996b631baf9bd6a07747beafbdb79b6e14ba18", + "transactionIndex": "0x1", + "logIndex": "0x1", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000004000000000000000000000000000000000000000020000000080000040000000000000000000000000000000000000000000000000000080000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000008000000000000000000000000100040000000000000000000000000000000000000000000000000000000000000000000100000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000020000000000000002000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000020000000080000040000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000008000000000000000000000000100000000000000000000000000080000000000000000000000000000000000000000000100000", "type": "0x0", - "effectiveGasPrice": "0x59682f0f" + "effectiveGasPrice": "0x5c350d816" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1708112117, + "timestamp": 1708453276, "chain": 80001, "multi": false, - "commit": "c6d2eff" + "commit": "525f3f4" } \ No newline at end of file diff --git a/script/DeployModularPermission.s.sol b/script/DeployModularPermission.s.sol index d18b2eaf..839d909d 100644 --- a/script/DeployModularPermission.s.sol +++ b/script/DeployModularPermission.s.sol @@ -10,11 +10,11 @@ import "forge-std/Script.sol"; import "forge-std/console.sol"; contract DeployModularPermission is Script { - address constant EXPECTED_MODULAR_PERMISSION_ADDRESS = 0x965Bea0f8b65aABD1F5148F64654BbAAfB9d2Efa; - address constant EXPECTED_ECDSA_SIGNER_ADDRESS = 0xF9E712F44A360ED8820aD624e41164f74a5a7456; + address constant EXPECTED_MODULAR_PERMISSION_ADDRESS = 0xfdDE9a26b6c3B7ca4b52C5f010d5B9Fb67e09E5A; + address constant EXPECTED_ECDSA_SIGNER_ADDRESS = 0x5569b550050F6537D9ac3329001be7F4C6659Cb0; address constant EXPECTED_GAS_POLICY_ADDRESS = 0x62868E950Efbb336DCFf033598Ee5E602f0a93cD; address constant EXPECTED_MERKLE_POLICY_ADDRESS = 0xb808D75B5ACf6B5513eb816d3980C733ae6Be468; - address constant EXPECTED_SIGNATURE_POLICY_ADDRESS = 0x60e9a007782EB649B291608dCa9E74Aaa966D122; + address constant EXPECTED_SIGNATURE_POLICY_ADDRESS = 0xdb5F74349Dd2FB2A09eEc2C6A39e77B68ca2852C; address constant EXPECTED_SUDO_POLICY_ADDRESS = 0x9262C3A894328f9036Aa7a3f0f2cE8CF684ad20f; function run() public { diff --git a/src/validator/modularPermission/ModularPermissionValidator.sol b/src/validator/modularPermission/ModularPermissionValidator.sol index 4d209e36..7602b6c2 100644 --- a/src/validator/modularPermission/ModularPermissionValidator.sol +++ b/src/validator/modularPermission/ModularPermissionValidator.sol @@ -20,7 +20,7 @@ struct Permission { } struct Nonce { - uint128 next; + uint128 lastNonce; uint128 revoked; } @@ -115,7 +115,10 @@ contract ModularPermissionValidator is IKernelValidator { bytes[] calldata policyData ) public payable { require(flag != toFlag(0), "flag should not be empty"); - require(nonce == nonces[msg.sender].next++, "nonce should be next"); + require( + nonce == nonces[msg.sender].lastNonce || nonce == nonces[msg.sender].lastNonce + 1, "nonce should be next" + ); + nonces[msg.sender].lastNonce++; bytes32 permissionId = getPermissionId(flag, signer, validAfter, validUntil, policy, signerData, policyData); if (flag == MAX_FLAG) { priorityPermission[msg.sender] = permissionId; diff --git a/src/validator/modularPermission/mock/MockRequestor.sol b/src/validator/modularPermission/mock/MockRequestor.sol new file mode 100644 index 00000000..d6b4872a --- /dev/null +++ b/src/validator/modularPermission/mock/MockRequestor.sol @@ -0,0 +1,11 @@ +pragma solidity ^0.8.0; + +interface KernelERC1271 { + function isValidSignature(bytes32 hash, bytes calldata signature) external view returns (bytes4); +} + +contract MockRequestor { + function verifySignature(address kernel, bytes32 hash, bytes calldata signature) external payable returns (bool) { + return KernelERC1271(kernel).isValidSignature(hash, signature) == 0x1626ba7e; + } +} diff --git a/src/validator/modularPermission/signers/ECDSASigner.sol b/src/validator/modularPermission/signers/ECDSASigner.sol index 574bae45..f617b9d8 100644 --- a/src/validator/modularPermission/signers/ECDSASigner.sol +++ b/src/validator/modularPermission/signers/ECDSASigner.sol @@ -37,9 +37,14 @@ contract ECDSASigner is ISigner { override returns (ValidationData) { - require(signer[msg.sender][permissionId][kernel] != address(0), "ECDSASigner: kernel not registered"); - address recovered = messageHash.recover(signature); - if (recovered == signer[msg.sender][permissionId][kernel]) { + address signerAddress = signer[msg.sender][permissionId][kernel]; + require(signerAddress != address(0), "ECDSASigner: kernel not registered"); + if (messageHash.recover(signature) == signerAddress) { + return ValidationData.wrap(0); + } + bytes32 ethHash = ECDSA.toEthSignedMessageHash(messageHash); + address recovered = ethHash.recover(signature); + if (recovered == signerAddress) { return ValidationData.wrap(0); } return SIG_VALIDATION_FAILED;