// sel-beacon-proxy: Select a specific proxy to delegate to, by
// forwarding the selector to a proxy that tells us which address to call
// from. Invokes implementation(bytes4) on the beacon for an address.
#define constant BEACON = 0x7118eAe2EdaF51b06eD0f09e0aAbD977fc2759A6
// There might be a usecase for a user to change this, so this is here
// for users to set themselves.
#define constant SEL_IMPL = 0x6f73cbd8
// Example contract that you could use with selector mining (this is how
// we use 9lives):
/*
pragma solidity 0.8.20;
contract NineLivesBeacon {
address public admin;
address public mint;
address public quotes;
address public price;
address public extras;
event NewAdmin(address indexed newAdmin);
event UpgradedMint(address indexed impl);
event UpgradedQuotes(address indexed impl);
event UpgradedPrice(address indexed price);
event UpgradedExtras(address indexed extras);
constructor(
address _admin,
address _mintImpl,
address _quotesImpl,
address _priceImpl,
address _extrasImpl
) {
admin = _admin;
mint = _mintImpl;
quotes = _quotesImpl;
price = _priceImpl;
extras = _extrasImpl;
}
function implementation(bytes4 _sel) external view returns (address) {
uint8 sel = uint8(_sel[2]);
if (sel == 1) return mint;
else if (sel == 2) return quotes;
else if (sel == 3) return price;
else return extras;
}
}
*/
#define macro MAIN() = takes(0) returns(0) {
0x24 0x04 0x20 calldatasize dup3 dup3 calldataload
0x00 0x00 calldatasize dup7
[SEL_IMPL] 0x00 mstore
dup6 0x00 dup10 calldatacopy
dup1 dup11 dup1 0x1c [BEACON] gas staticcall
iszero REVERT jumpi
dup10 mload
calldatasize dup11 dup13 calldatacopy
gas delegatecall
returndatasize 0x0 0x0 returndatacopy
0x00 returndatasize swap2 iszero REVERT jumpi return
REVERT:
revert
}