Skip to content

Instantly share code, notes, and snippets.

@ealmansi
Created October 19, 2017 16:57
Show Gist options
  • Save ealmansi/333f1a34f1ac8188dc5910d0b7952d0a to your computer and use it in GitHub Desktop.
Save ealmansi/333f1a34f1ac8188dc5910d0b7952d0a to your computer and use it in GitHub Desktop.
Solidity - Visibility.
pragma solidity ^0.4.17;
contract Base {
event Called(string name);
function public_fn() public { Called("Base.public_fn"); }
function private_fn() private { Called("Base.private_fn"); }
function external_fn() external { Called("Base.external_fn"); }
function internal_fn() internal { Called("Base.internal_fn"); }
function () public payable { Called("Base.fallback"); }
function fn() public {
// Function called internally.
public_fn(); // Calls: Base.public_fn
private_fn(); // Calls: Base.private_fn
//external_fn(); // Error: Undeclared identifier.
internal_fn(); // Calls: Base.internal_fn
// Function called externally.
this.public_fn(); // Calls: Base.public_fn
//this.private_fn(); // Error: Member "private_fn" not found or not visible after argument-dependent lookup in contract Base
this.external_fn(); // Calls: Base.external_fn
//this.internal_fn(); // Error: Member "internal_fn" not found or not visible after argument-dependent lookup in contract Base
// Function called on contract type.
Base.public_fn(); // Calls: Base.public_fn
//Base.private_fn(); // Error: Member "private_fn" not found or not visible after argument-dependent lookup in type(contract Base)
//Base.external_fn(); // Error: Member "external_fn" not found or not visible after argument-dependent lookup in type(contract Base)
Base.internal_fn(); // Calls: Base.internal_fn
// Function called dynamically on raw address.
address(this).call(bytes4(keccak256("public_fn()"))); // Calls: Base.public_fn
address(this).call(bytes4(keccak256("private_fn()"))); // Calls: Base.fallback
address(this).call(bytes4(keccak256("external_fn()"))); // Calls: Base.external_fn
address(this).call(bytes4(keccak256("internal_fn()"))); // Calls: Base.fallback
}
}
contract Derived is Base {
event Called(string name);
function public_fn() public { Called("Derived.public_fn"); }
function private_fn() private { Called("Derived.private_fn"); }
function external_fn() external { Called("Derived.external_fn"); }
function internal_fn() internal { Called("Derived.internal_fn"); }
function () public payable { Called("Derived.fallback"); }
function fn() public {
// Function called internally.
public_fn(); // Calls: Derived.public_fn
private_fn(); // Calls: Derived.private_fn
//external_fn(); // Error: Undeclared identifier.
internal_fn(); // Calls: Derived.internal_fn
// Function called externally.
this.public_fn(); // Calls: Derived.public_fn
//this.private_fn(); // Error: Member "private_fn" not found or not visible after argument-dependent lookup in contract Derived
this.external_fn(); // Calls: Derived.external_fn
//this.internal_fn(); // Error: Member "internal_fn" not found or not visible after argument-dependent lookup in contract Derived
// Function called on contract type.
Derived.public_fn(); // Calls: Derived.public_fn
//Derived.private_fn(); // Error: Member "private_fn" not found or not visible after argument-dependent lookup in type(contract Derived)
//Derived.external_fn(); // Error: Member "external_fn" not found or not visible after argument-dependent lookup in type(contract Derived)
Derived.internal_fn(); // Calls: Derived.internal_fn
// Function called on parent contract type.
Base.public_fn(); // Calls: Base.public_fn
//Base.private_fn(); // Error: Member "private_fn" not found or not visible after argument-dependent lookup in type(contract Base)
//Base.external_fn(); // Error: Member "external_fn" not found or not visible after argument-dependent lookup in type(contract Base)
Base.internal_fn(); // Calls: Base.internal_fn
// Function called dynamically on raw address.
address(this).call(bytes4(keccak256("public_fn()"))); // Calls: Derived.public_fn
address(this).call(bytes4(keccak256("private_fn()"))); // Calls: Derived.fallback
address(this).call(bytes4(keccak256("external_fn()"))); // Calls: Derived.external_fn
address(this).call(bytes4(keccak256("internal_fn()"))); // Calls: Derived.fallback
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment