bobcat-proxy 0.7.47

bobcat-sdk utilities for creating proxy code on Arbitrum Stylus.
Documentation
// 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
}