mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
211 lines
15 KiB
ReStructuredText
211 lines
15 KiB
ReStructuredText
**********
|
|
Cheatsheet
|
|
**********
|
|
|
|
.. index:: precedence
|
|
|
|
.. _order:
|
|
|
|
Order of Precedence of Operators
|
|
================================
|
|
|
|
The following is the order of precedence for operators, listed in order of evaluation.
|
|
|
|
+------------+-------------------------------------+--------------------------------------------+
|
|
| Precedence | Description | Operator |
|
|
+============+=====================================+============================================+
|
|
| *1* | Postfix increment and decrement | ``++``, ``--`` |
|
|
+ +-------------------------------------+--------------------------------------------+
|
|
| | New expression | ``new <typename>`` |
|
|
+ +-------------------------------------+--------------------------------------------+
|
|
| | Array subscripting | ``<array>[<index>]`` |
|
|
+ +-------------------------------------+--------------------------------------------+
|
|
| | Member access | ``<object>.<member>`` |
|
|
+ +-------------------------------------+--------------------------------------------+
|
|
| | Function-like call | ``<func>(<args...>)`` |
|
|
+ +-------------------------------------+--------------------------------------------+
|
|
| | Parentheses | ``(<statement>)`` |
|
|
+------------+-------------------------------------+--------------------------------------------+
|
|
| *2* | Prefix increment and decrement | ``++``, ``--`` |
|
|
+ +-------------------------------------+--------------------------------------------+
|
|
| | Unary minus | ``-`` |
|
|
+ +-------------------------------------+--------------------------------------------+
|
|
| | Unary operations | ``delete`` |
|
|
+ +-------------------------------------+--------------------------------------------+
|
|
| | Logical NOT | ``!`` |
|
|
+ +-------------------------------------+--------------------------------------------+
|
|
| | Bitwise NOT | ``~`` |
|
|
+------------+-------------------------------------+--------------------------------------------+
|
|
| *3* | Exponentiation | ``**`` |
|
|
+------------+-------------------------------------+--------------------------------------------+
|
|
| *4* | Multiplication, division and modulo | ``*``, ``/``, ``%`` |
|
|
+------------+-------------------------------------+--------------------------------------------+
|
|
| *5* | Addition and subtraction | ``+``, ``-`` |
|
|
+------------+-------------------------------------+--------------------------------------------+
|
|
| *6* | Bitwise shift operators | ``<<``, ``>>`` |
|
|
+------------+-------------------------------------+--------------------------------------------+
|
|
| *7* | Bitwise AND | ``&`` |
|
|
+------------+-------------------------------------+--------------------------------------------+
|
|
| *8* | Bitwise XOR | ``^`` |
|
|
+------------+-------------------------------------+--------------------------------------------+
|
|
| *9* | Bitwise OR | ``|`` |
|
|
+------------+-------------------------------------+--------------------------------------------+
|
|
| *10* | Inequality operators | ``<``, ``>``, ``<=``, ``>=`` |
|
|
+------------+-------------------------------------+--------------------------------------------+
|
|
| *11* | Equality operators | ``==``, ``!=`` |
|
|
+------------+-------------------------------------+--------------------------------------------+
|
|
| *12* | Logical AND | ``&&`` |
|
|
+------------+-------------------------------------+--------------------------------------------+
|
|
| *13* | Logical OR | ``||`` |
|
|
+------------+-------------------------------------+--------------------------------------------+
|
|
| *14* | Ternary operator | ``<conditional> ? <if-true> : <if-false>`` |
|
|
+ +-------------------------------------+--------------------------------------------+
|
|
| | Assignment operators | ``=``, ``|=``, ``^=``, ``&=``, ``<<=``, |
|
|
| | | ``>>=``, ``+=``, ``-=``, ``*=``, ``/=``, |
|
|
| | | ``%=`` |
|
|
+------------+-------------------------------------+--------------------------------------------+
|
|
| *15* | Comma operator | ``,`` |
|
|
+------------+-------------------------------------+--------------------------------------------+
|
|
|
|
.. index:: assert, block, coinbase, difficulty, number, block;number, timestamp, block;timestamp, msg, data, gas, sender, value, gas price, origin, revert, require, keccak256, ripemd160, sha256, ecrecover, addmod, mulmod, cryptography, this, super, selfdestruct, balance, codehash, send
|
|
|
|
Global Variables
|
|
================
|
|
|
|
- ``abi.decode(bytes memory encodedData, (...)) returns (...)``: :ref:`ABI <ABI>`-decodes
|
|
the provided data. The types are given in parentheses as second argument.
|
|
Example: ``(uint a, uint[2] memory b, bytes memory c) = abi.decode(data, (uint, uint[2], bytes))``
|
|
- ``abi.encode(...) returns (bytes memory)``: :ref:`ABI <ABI>`-encodes the given arguments
|
|
- ``abi.encodePacked(...) returns (bytes memory)``: Performs :ref:`packed encoding <abi_packed_mode>` of
|
|
the given arguments. Note that this encoding can be ambiguous!
|
|
- ``abi.encodeWithSelector(bytes4 selector, ...) returns (bytes memory)``: :ref:`ABI <ABI>`-encodes
|
|
the given arguments starting from the second and prepends the given four-byte selector
|
|
- ``abi.encodeCall(function functionPointer, (...)) returns (bytes memory)``: ABI-encodes a call to ``functionPointer`` with the arguments found in the
|
|
tuple. Performs a full type-check, ensuring the types match the function signature. Result equals ``abi.encodeWithSelector(functionPointer.selector, (...))``
|
|
- ``abi.encodeWithSignature(string memory signature, ...) returns (bytes memory)``: Equivalent
|
|
to ``abi.encodeWithSelector(bytes4(keccak256(bytes(signature)), ...)``
|
|
- ``bytes.concat(...) returns (bytes memory)``: :ref:`Concatenates variable number of
|
|
arguments to one byte array<bytes-concat>`
|
|
- ``block.basefee`` (``uint``): current block's base fee (`EIP-3198 <https://eips.ethereum.org/EIPS/eip-3198>`_ and `EIP-1559 <https://eips.ethereum.org/EIPS/eip-1559>`_)
|
|
- ``block.chainid`` (``uint``): current chain id
|
|
- ``block.coinbase`` (``address payable``): current block miner's address
|
|
- ``block.difficulty`` (``uint``): current block difficulty
|
|
- ``block.gaslimit`` (``uint``): current block gaslimit
|
|
- ``block.number`` (``uint``): current block number
|
|
- ``block.timestamp`` (``uint``): current block timestamp
|
|
- ``gasleft() returns (uint256)``: remaining gas
|
|
- ``msg.data`` (``bytes``): complete calldata
|
|
- ``msg.sender`` (``address``): sender of the message (current call)
|
|
- ``msg.sig`` (``bytes4``): first four bytes of the calldata (i.e. function identifier)
|
|
- ``msg.value`` (``uint``): number of wei sent with the message
|
|
- ``tx.gasprice`` (``uint``): gas price of the transaction
|
|
- ``tx.origin`` (``address``): sender of the transaction (full call chain)
|
|
- ``assert(bool condition)``: abort execution and revert state changes if condition is ``false`` (use for internal error)
|
|
- ``require(bool condition)``: abort execution and revert state changes if condition is ``false`` (use
|
|
for malformed input or error in external component)
|
|
- ``require(bool condition, string memory message)``: abort execution and revert state changes if
|
|
condition is ``false`` (use for malformed input or error in external component). Also provide error message.
|
|
- ``revert()``: abort execution and revert state changes
|
|
- ``revert(string memory message)``: abort execution and revert state changes providing an explanatory string
|
|
- ``blockhash(uint blockNumber) returns (bytes32)``: hash of the given block - only works for 256 most recent blocks
|
|
- ``keccak256(bytes memory) returns (bytes32)``: compute the Keccak-256 hash of the input
|
|
- ``sha256(bytes memory) returns (bytes32)``: compute the SHA-256 hash of the input
|
|
- ``ripemd160(bytes memory) returns (bytes20)``: compute the RIPEMD-160 hash of the input
|
|
- ``ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address)``: recover address associated with
|
|
the public key from elliptic curve signature, return zero on error
|
|
- ``addmod(uint x, uint y, uint k) returns (uint)``: compute ``(x + y) % k`` where the addition is performed with
|
|
arbitrary precision and does not wrap around at ``2**256``. Assert that ``k != 0`` starting from version 0.5.0.
|
|
- ``mulmod(uint x, uint y, uint k) returns (uint)``: compute ``(x * y) % k`` where the multiplication is performed
|
|
with arbitrary precision and does not wrap around at ``2**256``. Assert that ``k != 0`` starting from version 0.5.0.
|
|
- ``this`` (current contract's type): the current contract, explicitly convertible to ``address`` or ``address payable``
|
|
- ``super``: the contract one level higher in the inheritance hierarchy
|
|
- ``selfdestruct(address payable recipient)``: destroy the current contract, sending its funds to the given address
|
|
- ``<address>.balance`` (``uint256``): balance of the :ref:`address` in Wei
|
|
- ``<address>.code`` (``bytes memory``): code at the :ref:`address` (can be empty)
|
|
- ``<address>.codehash`` (``bytes32``): the codehash of the :ref:`address`
|
|
- ``<address payable>.send(uint256 amount) returns (bool)``: send given amount of Wei to :ref:`address`,
|
|
returns ``false`` on failure
|
|
- ``<address payable>.transfer(uint256 amount)``: send given amount of Wei to :ref:`address`, throws on failure
|
|
- ``type(C).name`` (``string``): the name of the contract
|
|
- ``type(C).creationCode`` (``bytes memory``): creation bytecode of the given contract, see :ref:`Type Information<meta-type>`.
|
|
- ``type(C).runtimeCode`` (``bytes memory``): runtime bytecode of the given contract, see :ref:`Type Information<meta-type>`.
|
|
- ``type(I).interfaceId`` (``bytes4``): value containing the EIP-165 interface identifier of the given interface, see :ref:`Type Information<meta-type>`.
|
|
- ``type(T).min`` (``T``): the minimum value representable by the integer type ``T``, see :ref:`Type Information<meta-type>`.
|
|
- ``type(T).max`` (``T``): the maximum value representable by the integer type ``T``, see :ref:`Type Information<meta-type>`.
|
|
|
|
.. note::
|
|
When contracts are evaluated off-chain rather than in context of a transaction included in a
|
|
block, you should not assume that ``block.*`` and ``tx.*`` refer to values from any specific
|
|
block or transaction. These values are provided by the EVM implementation that executes the
|
|
contract and can be arbitrary.
|
|
|
|
.. note::
|
|
Do not rely on ``block.timestamp`` or ``blockhash`` as a source of randomness,
|
|
unless you know what you are doing.
|
|
|
|
Both the timestamp and the block hash can be influenced by miners to some degree.
|
|
Bad actors in the mining community can for example run a casino payout function on a chosen hash
|
|
and just retry a different hash if they did not receive any money.
|
|
|
|
The current block timestamp must be strictly larger than the timestamp of the last block,
|
|
but the only guarantee is that it will be somewhere between the timestamps of two
|
|
consecutive blocks in the canonical chain.
|
|
|
|
.. note::
|
|
The block hashes are not available for all blocks for scalability reasons.
|
|
You can only access the hashes of the most recent 256 blocks, all other
|
|
values will be zero.
|
|
|
|
.. note::
|
|
In version 0.5.0, the following aliases were removed: ``suicide`` as alias for ``selfdestruct``,
|
|
``msg.gas`` as alias for ``gasleft``, ``block.blockhash`` as alias for ``blockhash`` and
|
|
``sha3`` as alias for ``keccak256``.
|
|
.. note::
|
|
In version 0.7.0, the alias ``now`` (for ``block.timestamp``) was removed.
|
|
|
|
.. index:: visibility, public, private, external, internal
|
|
|
|
Function Visibility Specifiers
|
|
==============================
|
|
|
|
.. code-block:: solidity
|
|
:force:
|
|
|
|
function myFunction() <visibility specifier> returns (bool) {
|
|
return true;
|
|
}
|
|
|
|
- ``public``: visible externally and internally (creates a :ref:`getter function<getter-functions>` for storage/state variables)
|
|
- ``private``: only visible in the current contract
|
|
- ``external``: only visible externally (only for functions) - i.e. can only be message-called (via ``this.func``)
|
|
- ``internal``: only visible internally
|
|
|
|
|
|
.. index:: modifiers, pure, view, payable, constant, anonymous, indexed
|
|
|
|
Modifiers
|
|
=========
|
|
|
|
- ``pure`` for functions: Disallows modification or access of state.
|
|
- ``view`` for functions: Disallows modification of state.
|
|
- ``payable`` for functions: Allows them to receive Ether together with a call.
|
|
- ``constant`` for state variables: Disallows assignment (except initialisation), does not occupy storage slot.
|
|
- ``immutable`` for state variables: Allows exactly one assignment at construction time and is constant afterwards. Is stored in code.
|
|
- ``anonymous`` for events: Does not store event signature as topic.
|
|
- ``indexed`` for event parameters: Stores the parameter as topic.
|
|
- ``virtual`` for functions and modifiers: Allows the function's or modifier's
|
|
behaviour to be changed in derived contracts.
|
|
- ``override``: States that this function, modifier or public state variable changes
|
|
the behaviour of a function or modifier in a base contract.
|
|
|
|
Reserved Keywords
|
|
=================
|
|
|
|
These keywords are reserved in Solidity. They might become part of the syntax in the future:
|
|
|
|
``after``, ``alias``, ``apply``, ``auto``, ``byte``, ``case``, ``copyof``, ``default``,
|
|
``define``, ``final``, ``implements``, ``in``, ``inline``, ``let``, ``macro``, ``match``,
|
|
``mutable``, ``null``, ``of``, ``partial``, ``promise``, ``reference``, ``relocatable``,
|
|
``sealed``, ``sizeof``, ``static``, ``supports``, ``switch``, ``typedef``, ``typeof``,
|
|
``var``.
|