Core Contracts
Syscalls.sol
Low-level Solidity wrappers for the supported Neo N3 syscall surface. This is the lowest-level devpack surface — every other contract and library ultimately delegates to Syscalls.
| Category | Syscalls | Examples |
|---|---|---|
| Storage | GetContext, Get, Put, Delete, Find, AsReadOnly, Local.* | storageGet(), storagePut(), storageFind() |
| Runtime | CheckWitness, GetTime, GasLeft, Notify, Log, BurnGas | checkWitness(), gasLeft(), notify() |
| Contract | Call, GetCallFlags, CreateStandardAccount, CreateMultisigAccount | contractCall(), getCallFlags() |
| Crypto | CheckSig, CheckMultisig (via System.Crypto.*) | checkSig(), checkMultisig() |
| CryptoLib | SHA256, RIPEMD160, Keccak256, VerifyWithECDsa, Ed25519, BLS12-381, Murmur32 | sha256(), verifyWithECDsa(), bls12381Pairing() |
| StdLib | serialize, deserialize, JSON, base64/58, hex, string ops, itoa/atoi | jsonSerialize(), base64Encode(), stringSplit() |
| Iterator | Next, Value | iteratorNext(), iteratorValue() |
| Advanced | GetRandom, GetNetwork, GetAddressVersion, GetInvocationCounter | getCurrentRandom(), getNetwork() |
Syscalls.sol also defines the core data structures used throughout the devpack:
| Struct | Description |
|---|---|
Block | Trimmed block: hash, version, previousHash, merkleRoot, timestamp, nonce, index, primaryIndex, nextConsensus, txCount |
Transaction | Base transaction: hash, version, nonce, sender, systemFee, networkFee, validUntilBlock, script |
Witness | invocationScript + verificationScript |
Signer | account, scopes, allowedContracts, allowedGroups, rules |
WitnessRule | action (deny/allow) + condition bytes |
StorageContext | Contract storage context (id + isReadOnly) |
Iterator | NeoVM iterator handle (id, hasNext, currentKey, currentValue) |
Notification | scriptHash, eventName, state array |
ContractStateNative | id, updateCounter, hash, nef, manifest |
TIP
Prefer NativeCalls wrappers over raw Syscalls.contractCall() — they generate specific manifest permissions instead of wildcards.
NativeCalls.sol
Direct wrappers for all Neo N3 native contracts. Each function calls through Syscalls.contractCall() with a deterministic contract hash constant, enabling the compiler to infer exact manifest permissions.
| Native Contract | Hash Constant | Key Functions |
|---|---|---|
| NEO Token | NEO_CONTRACT | neoBalanceOf(), neoTransfer(), vote(), getCandidates(), getAccountState(), unclaimedGas() |
| GAS Token | GAS_CONTRACT | gasBalanceOf(), gasTransfer(), gasTotalSupply() |
| ContractManagement | CONTRACT_MANAGEMENT | deployContract(), updateContract(), destroyContract(), getContract(), hasMethod() |
| Policy | POLICY_CONTRACT | getFeePerByte(), getExecFeeFactor(), getStoragePrice(), blockAccount(), isBlocked() |
| Oracle | ORACLE_CONTRACT | requestOracleData(), getOraclePrice(), setOraclePrice() |
| RoleManagement | ROLE_MANAGEMENT | designateAsRole(), getDesignatedByRole() |
| Notary | NOTARY_CONTRACT | notaryVerify(), notaryBalanceOf(), notaryLockDepositUntil(), notaryWithdraw() |
| Treasury | TREASURY_CONTRACT | treasuryVerify(), treasuryOnNEP17Payment(), treasuryOnNEP11Payment() |
| Ledger | LEDGER_CONTRACT | currentIndex(), currentHash(), getBlock(), getTransaction() |
Reference constants for CryptoLib (CRYPTO_LIB) and StdLib (STD_LIB) are also defined, but their methods are exposed through Syscalls.sol directly (e.g., Syscalls.sha256(), Syscalls.base64Encode()).
// Transfer GAS — generates permission: {"contract":"0xd2a4...","methods":["transfer"]}
bool ok = NativeCalls.gasTransfer(from, to, amount, "");
// Query NEO governance
NativeCalls.NeoCandidate[] memory candidates = NativeCalls.getCandidates();
uint256 unclaimed = NativeCalls.unclaimedGas(account, NativeCalls.currentIndex());FrameworkBase.sol
Base contract providing common infrastructure for Neo N3 Solidity contracts:
- Ownership —
transferOwnership(),renounceOwnership(),onlyOwnermodifier - Initialization —
whenInitializedmodifier, version tracking - Witness-based access control —
withWitnessmodifier (callsRuntime.checkWitness) - Gas limit guards —
withGasLimit(minGas)modifier (callsRuntime.gasLeft) - Contract lifecycle —
upgradeContract()with NEF + manifest update - Events —
FrameworkInitialized,OwnershipTransferred,ContractUpgraded,EmergencyStop
contract MyToken is FrameworkBase {
function adminAction() public onlyOwner withWitness withGasLimit(20000000) {
// Only owner, witness-verified, with at least 0.2 GAS remaining
}
}Framework.sol
Extended framework that inherits FrameworkBase. Previously exposed a fully dynamic callContract(address, string, bytes) surface, but this forced wildcard permissions in the manifest ({"contract":"*","methods":"*"}).
Strict-Manifest Mode
Framework.callContract() is intentionally disabled — it reverts at runtime. Use explicit NativeCalls.* or Syscalls.contractCall(KNOWN_HASH, ...) wrappers instead. If truly dynamic dispatch is unavoidable, compile with --manifest-permissions to supply explicit overrides.
OracleService.sol
Convenience wrapper around the Neo N3 Oracle native contract:
request(url, filter, userData, gasForResponse)— issue an oracle data request, returns arequestIdoracleCallback(url, userData, code, result)— receives the native Oracle callback (restricted toonlyOracleNative)- Forwards responses to the original requester via
IOracleServiceReceiver.onOracleResponse() - Uses a fixed callback method name to avoid wildcard manifest permissions
- Tracks request metadata (requester, URL, filter, timestamps, completion status)
contract MyOracle is IOracleServiceReceiver {
OracleService private _oracle;
function fetchPrice(string calldata url) external {
_oracle.request(url, "$.price", "", 100000000);
}
function onOracleResponse(
uint256 requestId, uint256 code, bytes calldata result, bytes calldata userData
) external override {
// Handle oracle response
}
}NEP17Rescue.sol
Optional extension for NEP-17 tokens that enables emergency recovery of accidentally sent native tokens (NEO and GAS only). In strict-manifest mode, rescuing arbitrary NEP-17 tokens is not supported because it would require wildcard contract permissions.
contract MyToken is NEP17Rescue {
// Inherits emergencyTokenRecovery(token, to, amount, data)
// Restricted to NEO_CONTRACT and GAS_CONTRACT targets
}