Skip to content

Conversation

nkrishang
Copy link
Contributor

No description provided.

Comment on lines +86 to +97
function overrideExtensionForFunction(bytes4 _selector, address _extension) external {
require(_canOverrideExtensions(), "Entrypoint: cannot override extensions.");

EntrypointOverrideableStorage.Data storage data = EntrypointOverrideableStorage.entrypointStorage();
data.extensionOverride[_selector] = _extension;

if (_extension != address(0)) {
data.functions.add(bytes32(_selector));
} else {
data.functions.remove(bytes32(_selector));
}
}

Check warning

Code scanning / Slither

Unused return

EntrypointOverrideable.overrideExtensionForFunction(bytes4,address) (contracts/extension/plugin/EntrypointOverrideable.sol#86-97) ignores return value by data.functions.remove(bytes32(_selector)) (contracts/extension/plugin/EntrypointOverrideable.sol#95)
Comment on lines +86 to +97
function overrideExtensionForFunction(bytes4 _selector, address _extension) external {
require(_canOverrideExtensions(), "Entrypoint: cannot override extensions.");

EntrypointOverrideableStorage.Data storage data = EntrypointOverrideableStorage.entrypointStorage();
data.extensionOverride[_selector] = _extension;

if (_extension != address(0)) {
data.functions.add(bytes32(_selector));
} else {
data.functions.remove(bytes32(_selector));
}
}

Check warning

Code scanning / Slither

Unused return

EntrypointOverrideable.overrideExtensionForFunction(bytes4,address) (contracts/extension/plugin/EntrypointOverrideable.sol#86-97) ignores return value by data.functions.add(bytes32(_selector)) (contracts/extension/plugin/EntrypointOverrideable.sol#93)
Comment on lines +57 to +80
function _delegate(address implementation) internal virtual {
assembly {
// Copy msg.data. We take full control of memory in this inline assembly
// block because it will not return to Solidity code. We overwrite the
// Solidity scratch pad at memory position 0.
calldatacopy(0, 0, calldatasize())

// Call the implementation.
// out and outsize are 0 because we don't know the size yet.
let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)

// Copy the returned data.
returndatacopy(0, 0, returndatasize())

switch result
// delegatecall returns 0 on error.
case 0 {
revert(0, returndatasize())
}
default {
return(0, returndatasize())
}
}
}

Check warning

Code scanning / Slither

Assembly usage

EntrypointOverrideable._delegate(address) (contracts/extension/plugin/EntrypointOverrideable.sol#57-80) uses assembly - INLINE ASM (contracts/extension/plugin/EntrypointOverrideable.sol#58-79)
Comment on lines +17 to +22
function entrypointStorage() internal pure returns (Data storage entrypointData) {
bytes32 position = ENTRYPOINT_OVERRIDEABLE_STORAGE_POSITION;
assembly {
entrypointData.slot := position
}
}

Check warning

Code scanning / Slither

Assembly usage

EntrypointOverrideableStorage.entrypointStorage() (contracts/extension/plugin/EntrypointOverrideable.sol#17-22) uses assembly - INLINE ASM (contracts/extension/plugin/EntrypointOverrideable.sol#19-21)
Comment on lines +25 to +120
abstract contract EntrypointOverrideable is Multicall, IEntrypointOverrideable {
using EnumerableSet for EnumerableSet.Bytes32Set;

/*///////////////////////////////////////////////////////////////
State variables
//////////////////////////////////////////////////////////////*/

address public immutable functionMap;

/*///////////////////////////////////////////////////////////////
Constructor + initializer logic
//////////////////////////////////////////////////////////////*/

constructor(address _functionMap) {
functionMap = _functionMap;
}

/*///////////////////////////////////////////////////////////////
Generic contract logic
//////////////////////////////////////////////////////////////*/

fallback() external payable virtual {
address extension = _getExtensionOverride(msg.sig);
if (extension == address(0)) {
extension = IMap(functionMap).getExtensionForFunction(msg.sig);
}

_delegate(extension);
}

receive() external payable {}

function _delegate(address implementation) internal virtual {
assembly {
// Copy msg.data. We take full control of memory in this inline assembly
// block because it will not return to Solidity code. We overwrite the
// Solidity scratch pad at memory position 0.
calldatacopy(0, 0, calldatasize())

// Call the implementation.
// out and outsize are 0 because we don't know the size yet.
let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)

// Copy the returned data.
returndatacopy(0, 0, returndatasize())

switch result
// delegatecall returns 0 on error.
case 0 {
revert(0, returndatasize())
}
default {
return(0, returndatasize())
}
}
}

/*///////////////////////////////////////////////////////////////
External functions
//////////////////////////////////////////////////////////////*/

function overrideExtensionForFunction(bytes4 _selector, address _extension) external {
require(_canOverrideExtensions(), "Entrypoint: cannot override extensions.");

EntrypointOverrideableStorage.Data storage data = EntrypointOverrideableStorage.entrypointStorage();
data.extensionOverride[_selector] = _extension;

if (_extension != address(0)) {
data.functions.add(bytes32(_selector));
} else {
data.functions.remove(bytes32(_selector));
}
}

function getAllOverriden() external view returns (ExtensionMap[] memory functionExtensionPairs) {
EntrypointOverrideableStorage.Data storage data = EntrypointOverrideableStorage.entrypointStorage();
uint256 len = data.functions.length();
functionExtensionPairs = new ExtensionMap[](len);

for (uint256 i = 0; i < len; i += 1) {
bytes4 selector = bytes4(data.functions.at(i));
functionExtensionPairs[i] = ExtensionMap(selector, data.extensionOverride[selector]);
}
}

/*///////////////////////////////////////////////////////////////
Internal functions
//////////////////////////////////////////////////////////////*/

function _getExtensionOverride(bytes4 _selector) internal view returns (address) {
EntrypointOverrideableStorage.Data storage data = EntrypointOverrideableStorage.entrypointStorage();
return data.extensionOverride[_selector];
}

function _canOverrideExtensions() internal view virtual returns (bool);
}

Check warning

Code scanning / Slither

Unimplemented functions

EntrypointOverrideable (contracts/extension/plugin/EntrypointOverrideable.sol#25-120) does not implement functions: - EntrypointOverrideable._canOverrideExtensions() (contracts/extension/plugin/EntrypointOverrideable.sol#119)
@nkrishang nkrishang merged commit 267383e into main Dec 11, 2022
@nkrishang nkrishang deleted the entrypoint-opt-in-upgrades branch December 26, 2022 19:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant