- Removed the following typedefs to
uint64_t
:account_name
permission_name
scope_name
table_name
action_name
- Added a
uint64_t
typedef calledcapi_name
to replace the removed typedefs above:- These have been replaced by
capi_name
and as a practice should not be used when writing C++ contract code. Instead, the new version of theeosio::name
type from the eosiolib C++ API should be used to replace these instances. This decision was made because of bad implicit casting issues withuint64_t
and the new pattern should allow for better type safety.
- These have been replaced by
- Removed
symbol_name
typedef:- This has no C equivalent to replace it. When writing C++ contract code, the
eosio::symbol_code
struct should be used instead. As with the previously mentioned named types, this was removed and replaced witheosio::symbol_code
to allow for better type safety in contracts. To use a symbol, i.e. symbol name and precision, use theeosio::symbol
class.
- This has no C equivalent to replace it. When writing C++ contract code, the
- Removed
time
andweight_type
typedefs. - Removed the
transaction_id_type
andblock_id_type
typedefs. - Removed the
account_permission
struct. - Renamed the following typedefs:
checksum160
->capi_checksum160
checksum256
->capi_checksum256
checksum512
->capi_checksum512
public_key
->capi_public_key
signature
->capi_signature
- Removed the non-existent intrinsics declarations
require_write_lock
andrequire_read_lock
.
- Removed eosiolib/vector.hpp:
- Removed alias
eosio::vector
and typedefbytes
. - Going forward contract writers should include
<vector>
from the STL and usestd::vector<char>
instead of bytes.
- Removed alias
- Removed eosiolib/types.hpp.
- Removed eosiolib/optional.hpp. Use
std::optional
as a replacement. - Removed eosiolib/core_symbol.hpp. The contract writer should explicitly specify the symbol.
- Added eosiolib/name.hpp.
- Moved the typedef
eosio::extensions_types
to eosiolib/transaction.hpp. - Removed comparison functions for
checksum
structs. - Removal of
eosio::char_to_symbol
,eosio::string_to_name
,eosio::name_suffix
functions - Removal of the
N
macro. The""_n
operator or thename
constructor should be used as a type safe replacement. Example:N(foo)
->"foo"_n
, orN(foo)
->name("foo")
. - Moved
eosio::name
struct definition and""_n
operator to eosiolib/name.hpp.
- Removed implicit and explicit conversions to
uint64_t
. - Added
enum class
eosio::name::raw
which is implicitly converted from aneosio::name
(used for template non-type parameters). - Added
bool
conversion operator for conditionally testing if a name is empty. - All constructors are now
constexpr
. These take either auint64_t
, aneosio::name::raw
or astd::string_view
. - Added
constexpr
methodseosio::name::length
andeosio::name::suffix
. - Added equivalence, inverted equivalence and less than operators to
eosio::name
.
- Removed
eosio::symbol_type
struct and replaced witheosio::symbol
class. - Added struct
eosio::symbol_code
:- Added two
constexpr
constructors that take either a rawuint64_t
or anstd::string_view
. - Added
constexpr
methodsis_valid
,length
andraw
. - Added a print method.
- Added
bool
conversion operator to test issymbol_code
is empty.
- Added two
- Removed
eosio::string_to_symbol
,eosio::is_valid_symbol
,eosio::symbol_name_length
functions. - Removed the
S
macro. The symbol constructor should be used as a type safe replacement. Example:S(4,SYS)
->symbol(symbol_code("SYS"), 4)
(or simplysymbol("SYS", 4)
as of v1.3.1). - Added struct
eosio::symbol
:- Added three
constexpr
constructors that take either a rawuint64_t
,symbol_code
and auint8_t
precision or anstd::string_view
and auint8_t
precision. - Added
constexpr
methodsis_valid
,precision
,code
, andraw
. These, respectively, check if thesymbol
is valid, get theuint8_t
precision, get thesymbol_code
part of thesymbol
, and get the rawuint64_t
representation ofsymbol
. - Added equivalence, inverted equivalence and less than operators to
eosio::symbol
.
- Added three
- Modified struct
eosio::extended_symbol
:- Restricted fields to private.
- Added
constexpr
constructor that takes aeosio::symbol
and aneosio::name
. - Added
constexpr
methodsget_symbol
andget_contract
. - Made existing comparison operators
constexpr
.
- The main constructor now requires a
int64_t
(quantity) andeosio::symbol
explicitly. - The default constructor no longer initializes the instance to a valid zero quantity asset with a symbol equivalent to "core symbol". Instead the default constructed
eosio::asset
is a bit representation of all zeros (which will causeis_valid
to fail) so that check is bypassed to allow formulti_index
anddatastream
to work. - Old contracts that use
eosio::asset()
should be changed to either use the core symbol of the specific chain they are targeting i.e.eosio::asset(0, symbol(symbol_code("SYS"),4))
. To reduce writingsymbol(symbol_code("SYS"),4)
over and over, aconstexpr
function to return the symbol orconstexpr
global variable should be used.
- The constructor for
eosio::contract
now takes aneosio::name
for the receiver, aneosio::name
for the code, and aeosio::datastream<const char*>
for the datastream used for the contract. The last argument is for manually unpacking an action, see the section oneosio::ignore
for a more indepth usage.
- Renamed the macro
EOSIO_ABI
toEOSIO_DISPATCH
as this is more descriptive of what this macro actually does. - Modified the definition of
EOSIO_DISPATCH
to work with the new constructor foreosio::contract
.
- The first template parameter for
indexed_by
now requires the argument be convertible toeosio::name::raw
(replacinguint64_t
). - The first template parameter for
multi_index
now requires the argument be convertible toeosio::name::raw
(replacinguint64_t
). - The constructor now takes an
eosio::name
type for the code (replacinguint64_t
). Scope is stilluint64_t
. - Various other replacements of
uint64_t
toeosio::name
.
- The first template parameter for
eosio::singleton
now requires the argument be convertible toeosio::name::raw
(replacinguint64_t
). - The constructor now takes an
eosio::name
type for the code. - In the methods
get_or_create
andset
, the argumentbill_to_account
is now of typeeosio::name
(replacinguint64_t
).
- Added C++ function
eosio::require_auth
. - Added C++ function
eosio::has_auth
. - Added C++ function
eosio::is_account
. - Redefined
eosio::permission_level
to useeosio::name
in place ofuint64_t
. - Removed the macro
ACTION
. (The identifierACTION
has been reused for another macro described below in the Macros section.)
- The optional provided_keys argument of the function
eosio::check_transaction_authorization
is now of the typestd::set<eosio::public_key>
rather than the typestd::set<capi_public_key>
. C++ contract code should most likely be using theeosio::public_key
struct (defined in "eosiolib/public_key.hpp") if they need to deal with EOSIO-compatible public keys rather than thecapi_public_key
struct (now renamed from its original name of::public_key
) from the eosiolib C API. Note that existing contract code that just referred to the typepublic_key
without namespace qualification may have accidentally been using thecapi_public_key
struct and therefore should ideally be modified to use theeosio::public_key
C++ type. - The
account
andpermission
arguments ofeosio::check_transaction_authorization
are botheosio::name
now instead ofuint64_t
.
- Added new type
ignore
:- This type acts as a placeholder for actions that don't want to deserialize their fields but want the types to be reflected in the ABI.
ACTION action(ignore<some_type>) { some_type st; _ds >> st; }
- This type acts as a placeholder for actions that don't want to deserialize their fields but want the types to be reflected in the ABI.
- Added new type
ignore_wrapper
:- This allows for calling
SEND_INLINE_ACTION
withignore_wrapper(some_value)
against an action with anignore
of matching types.
- This allows for calling
- Added
ACTION
macro which is simply a shortcut for[[eosio::action]] void
. - Added
TABLE
macro which is simply a shortcut forstruct [[eosio::table]]
. - Added
CONTRACT
macro which is simply a shortcut forclass [[eosio::contract]]
.
- Added
eosio.cdt-config.cmake
to allow forfind_package(eosio.cdt)
. See eosio.cdt/examples/hello or eosio.cdt/examples/template for an example. - Added new macro
add_contract
. This new contract takes a contract name, cmake target, then any normal arguments you would give toadd_executable
. See eosio.cdt/examples/hello or eosio.cdt/examples/template. - New version checking mechanism is included. See eosio.contracts/CMakeLists.txt to see this in use.
- Replaced
printf
,sprintf
, andsnprintf
with new minimal variants. This allows contracts to use these functions without causing stack overflow issues.
- Removed
sstream
with the intent to return this after more has been done. - Added
__cxa_pure_virtual
to allow for pure virtual methods in contract classes. std::to_string
now works without the issues of stack overflows.
- Added
[[eosio::ignore]]
attribute to flag a type as being ignored by the deserializer. This attribute is primarily only used for internal use within eosiolib. - Added
[[eosio::contract]]
attribute. This new attribute is used to mark a contract class as "contract" with the name being either the C++ name of the class or a user specified name (i.e.[[eosio::contract("somecontract")]]
). This attribute can also be used in conjunction with theeosio::action
andeosio::table
attributes for tables that you would like to define outside of theeosio::contract
class. This is used in conjunction with either the raweosio-cpp
option--contract <name>
,-o <name>.wasm
or with CMakeadd_contract
. It acts as a filter enabling contract developers to include a header file with attributes from another contract (e.g. eosio.token) while generating an ABI devoid of those actions and tables.The above code will produce the tables#include <eosiolib/eosio.hpp> using namespace eosio; CONTRACT test : public eosio::contract { public: using contract::contract; ACTION acta(){} TABLE taba { uint64_t a; float b; uint64_t primary_key() const { return a; } }; }; struct [[eosio::table, eosio::contract("test")]] tabb { uint64_t a; int b; }; typedef eosio::multi_index<"testtaba"_n, test::taba> table_a; typedef eosio::multi_index<"testtabb"_n, tabb> table_b; EOSIO_DISPATCH( test, (acta) )
testtaba
andtesttabb
in your ABI. Example:eosio-cpp -abigen test.cpp -o test.wasm
will mark this compilation and ABI generation for theeosio::contract
test
. The same thing can be done witheosio-cpp -abigen test.cpp -o test_contract.wasm --contract test
or with the CMake commandadd_contract( test, test_contract, test.cpp )
. Either of the previous two approaches will produce a test_contract.wasm and test_contract.abi generated under the context of the contract name oftest
.
- Boost is now part of the library. No more external dependence on Boost and all system inclusion are within it's
sysroot
. (Boost will be removed in a future release.)