export const routerTemplate = `//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- // GENERATED CODE - do not edit manually!! // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- contract {{{moduleName}}} { error UnknownSelector(bytes4 sel); {{{modules}}} {{#receive}} {{{receive}}}{{/receive}} {{^receive}}{{/receive}} fallback() external payable { // Lookup table: Function selector => implementation contract bytes4 sig4 = msg.sig; address implementation; assembly { let sig32 := shr(224, sig4) function findImplementation(sig) -> result { {{{selectors}}} } implementation := findImplementation(sig32) } if (implementation == address(0)) { revert UnknownSelector(sig4); } // Delegatecall to the implementation contract assembly { calldatacopy(0, 0, calldatasize()) let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) returndatacopy(0, 0, returndatasize()) switch result case 0 { revert(0, returndatasize()) } default { return(0, returndatasize()) } } } } `;