def METHOD_NAME() -> None:
    args = parse_args()
    if len(args.contract_source) == 2:
        # Source code is file.sol or project directory
        source_code, target = args.contract_source
        slither = Slither(source_code, **vars(args))
    else:
        # Source code is published and retrieved via etherscan
        target = args.contract_source[0]
        slither = Slither(target, **vars(args))
    if args.contract_name:
        contracts = slither.get_contract_from_name(args.contract_name)
    else:
        contracts = slither.contracts
    rpc_info = None
    if args.rpc_url:
        valid = ["latest", "earliest", "pending", "safe", "finalized"]
        block = args.block if args.block in valid else int(args.block)
        rpc_info = RpcInfo(args.rpc_url, block)
    srs = SlitherReadStorage(contracts, args.max_depth, rpc_info)
    srs.unstructured = bool(args.unstructured)
    # Remove target prefix e.g. rinkeby:0x0 -> 0x0.
    address = target[target.find(":") + 1 :]
    # Default to implementation address unless a storage address is given.
    if not args.storage_address:
        args.storage_address = address
    srs.storage_address = args.storage_address
    if args.variable_name:
        # Use a lambda func to only return variables that have same name as target.
        # x is a tuple (`Contract`, `StateVariable`).
        srs.get_all_storage_variables(lambda x: bool(x[1].name == args.variable_name))
        srs.get_target_variables(**vars(args))
    else:
        srs.get_all_storage_variables()
        srs.get_storage_layout()
    # To retrieve slot values an rpc url is required.
    if args.value:
        assert args.rpc_url
        srs.walk_slot_info(srs.get_slot_values)
    if args.table:
        srs.walk_slot_info(srs.convert_slot_info_to_rows)
        print(srs.table)
    if args.json:
        with open(args.json, "w", encoding="utf-8") as file:
            slot_infos_json = srs.to_json()
            json.dump(slot_infos_json, file, indent=4)