Global Functions & Operators
NexScript has several built-in functions for things like cryptographic and arithmetic applications, and it includes many common arithmetic and other operators that you would expect in a programming language.
Arithmetic functions
abs()
int abs(int a)
Returns the absolute value of argument a.
min()
int min(int a, int b)
Returns the minimum value of arguments a and b.
max()
int max(int a, int b)
Returns the maximum value of arguments a and b.
within()
bool within(int x, int lower, int upper)
Returns true if and only if x >= lower && x < upper.
Hashing functions
ripemd160()
bytes20 ripemd160(any x)
Returns the RIPEMD-160 hash of argument x.
sha1()
bytes20 sha1(any x)
Returns the SHA-1 hash of argument x.
sha256()
bytes32 sha256(any x)
Returns the SHA-256 hash of argument x.
hash160()
bytes20 hash160(any x)
Returns the RIPEMD-160 hash of the SHA-256 hash of argument x.
hash256()
bytes32 hash256(any x)
Returns the double SHA-256 hash of argument x.
Signature checking functions
All signature checking functions must comply with the NULLFAIL rule. This means that if you want to use the output of a signature check inside the condition of an if-statement, the input signature needs to either be correct, or an empty byte array. When you use an incorrect signature as an input, the script will fail.
checkSig()
bool checksig(sig s, pubkey pk)
Checks that transaction signature s is valid for the current transaction and matches with public key pk.
checkMultiSig()
bool checkMultiSig(sig[] sigs, pubkey[] pks)
Performs a multi-signature check using a list of transaction signatures and public keys.
While this function can be used inside your smart contracts, it is not supported by the JavaScript SDK, so it is recommended not to use it. Instead a checkMultiSig() call can be simulated using multiple checkSig() calls.
checkDataSig()
bool checkDataSig(datasig s, bytes msg, pubkey pk)
Checks that sig s is a valid signature for message msg and matches with public key pk.
encodeNumber()
bytes encodeNumber(int number)
Minimally encodes the number to VM data. Useful in covenants and digest building. Currently limited to positive number only.
encodeData()
bytes encodeData(bytes data)
Minimally encodes the data to VM data. Useful in covenants and digest building. Currently limited to data sizes less than 76 to be compatible with OP_PUSHDATA1.
Token functions
hasAuthority()
bool hasAuthority(int flags, int required)
Checks that flags is a token authority (a negative authority field, as returned by tokenAuthority) that has every flag in required. required is a sum of the constants below; 0 only checks that flags is an authority.
| Constant | Flag |
|---|---|
AUTHORITY_MINT | Can mint tokens |
AUTHORITY_MELT | Can melt tokens |
AUTHORITY_BATON | Can create authority outputs, including passing itself on |
AUTHORITY_RESCRIPT | Can change the redeem script |
AUTHORITY_SUBGROUP | Can create subgroups |
// output 0 must carry an authority that can mint and pass itself on
require(hasAuthority(tx.outputs[0].tokenAuthority, AUTHORITY_MINT + AUTHORITY_BATON));
The authority field is a 64 bit number with the AUTHORITY flag in bit 63, so it is negative as a script number, and script numbers are sign-magnitude. Testing its bits with & directly does not work; hasAuthority() converts it to its 8 byte two's complement form first.
Operators
An overview of all supported operators and their precedence is included below. Notable is a lack of exponentiation, since these operations are not supported by the underlying Script.
| Precedence | Description | Operator |
|---|---|---|
| 1 | Parentheses | (<expression>) |
| 2 | Type cast | <type>(<expression>) |
| 3 | Object instantiation | new <class>(<args...>) |
| 4 | Function call | <function>(<args...>) |
| 5 | Tuple index | <tuple>[<index>] |
| 6 | Member access | <object>.<member> |
| 7 | Unary minus | - |
| 7 | Logical NOT | ! |
| 8 | Multiplication, division and modulo | *, /, % |
| 9 | Addition and subtraction | +, - |
| 9 | String / bytes concatenation | + |
| 10 | Numeric comparison | <, >, <=, >= |
| 11 | Equality and inequality | ==, != |
| 12 | Bitwise AND | & |
| 13 | Bitwise XOR | ^ |
| 14 | Bitwise OR | | |
| 15 | Logical AND | && |
| 16 | Logical OR | || |
| 17 | Assignment | = |