Developer Documentation

Build on Africa's
sovereign blockchain

Alkebuleum is an EVM-compatible Layer 1 designed for identity, documents, payments, and trusted records across Africa and the diaspora. Everything you need to connect, deploy, and integrate.

01 · Getting Started

Quick Start

Connect to Alkebuleum in under five minutes. The network is fully EVM-compatible — any Ethereum tooling (ethers.js, viem, Hardhat, Foundry, Remix) works out of the box.

01
Add the network to MetaMask
Open MetaMask → Settings → Networks → Add a network. Enter the values from the Network Config section below, or click Add to MetaMask from alkebuleum.org/network.
02
Install a JavaScript client
Use any standard Ethereum library. ethers v6 or viem are recommended.
bash
npm install ethers   # or: npm install viem
03
Connect to the RPC
Point your provider at https://rpc.alkebuleum.com and start querying.
javascript
import { JsonRpcProvider } from "ethers";

const provider = new JsonRpcProvider("https://rpc.alkebuleum.com");

// Verify connection
const block = await provider.getBlockNumber();
console.log("Latest block:", block);
04
Deploy your first contract
Compile with Hardhat (or Foundry), set the Alkebuleum RPC as your network, and deploy. See Smart Contracts for a full guide.
02 · Network Configuration

Network Config

All parameters needed to add Alkebuleum Mainnet to any EVM wallet or toolchain.

Chain ID
237422
Unique identifier for Alkebuleum Mainnet
Block Time
~5 s
Average block production time
Consensus
PORA
Proof of Reputable Authority
EVM Version
EIP-1559
Full EVM compatibility
Native Token
ALKE
Alkecoin — 18 decimals
Total Supply
1 B ALKE
Genesis supply, no ICO
Network nameAlkebuleum Mainnet
RPC endpointhttps://rpc.alkebuleum.com
Chain ID237422
Currency symbolALKE
Decimals18
Block explorerexplorer.alkebuleum.com ↗
WebSocket RPCwss://rpc.alkebuleum.com
EIP-1559Supported
Alkebuleum is fully EVM-compatible. Contracts written for Ethereum, Polygon, or any EVM chain compile and deploy on Alkebuleum without modification. Use chainId: 237422 in your Hardhat or Foundry config.
hardhat.config.js
module.exports = {
  networks: {
    alkebuleum: {
      url: "https://rpc.alkebuleum.com",
      chainId: 237422,
      accounts: [process.env.PRIVATE_KEY]
    }
  },
  solidity: "0.8.24"
};
03 · Core Concepts

PORA Consensus

Proof of Reputable Authority (PORA) is Alkebuleum's bespoke consensus mechanism — designed for institutional trust, African governance structures, and long-term network integrity.

Developer note: PORA produces deterministic ~5-second blocks. For most application use-cases, finality can be assumed after 2 block confirmations (~10 seconds). For high-value institutional transactions, wait for 6 confirmations.

How PORA works

PORA validators are permissioned participants — governments, foundations, universities, and registered institutions — who stake ALKE and are voted in by the Alkebuleum Council. Unlike proof-of-work, PORA produces no wasted computation. Unlike proof-of-stake, validator selection is bounded by real-world reputation, reducing sybil risk in African institutional contexts.

Validator typePermissioned institutional authority
Validator onboardingCouncil vote + ALKE stake
Block time~5 seconds
Soft finality2 confirmations (~10 s)
Hard finality6 confirmations (~30 s)
SlashingYes — stake at risk for double-signing
04 · Alkecoin (ALKE)

Working with ALKE

ALKE is the native utility token of Alkebuleum. It is used for transaction fees, smart contract gas, validator staking, governance votes, and network access. There was no ICO or presale.

Token nameAlkecoin
Primary tickerALKE
AliasAKE
TypeNative utility token — not a security
Total genesis supply1,000,000,000 ALKE
Decimals18
ICO / presaleNone
UsesGas, staking, governance, network access
javascript — send ALKE
import { Wallet, parseEther } from "ethers";

const wallet = new Wallet(privateKey, provider);

const tx = await wallet.sendTransaction({
  to: "0xRecipientAddress",
  value: parseEther("10"),  // 10 ALKE
});

await tx.wait(2);  // wait 2 confirmations
console.log("Transfer confirmed:", tx.hash);
ALKE is a utility token used to pay for gas on Alkebuleum. It is not a financial instrument or investment product. See alkebuleum.org/alkecoin for exchange listing details.
05 · Identity Layer

Identity & AfPass

Alkebuleum is built around sovereign digital identity. AfPass is the decentralised identity passport layer. DRIS handles institutional document signing and registry. Together they form the trust infrastructure for the network.

Full AfPass SDK and DID specification docs are at afpass.org. The overview below covers on-chain identity primitives available to any builder on Alkebuleum.

On-chain DID format

Alkebuleum uses the did:alke: method. Each DID maps to an Alkebuleum address and a verifiable credential document anchored on-chain.

DID format
# Alkebuleum DID method
did:alke:0xYourAlkebuleumAddress

# Example
did:alke:0x3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b

DRIS — Document Registry

DRIS enables governments, universities, and institutions to register, sign, and verify documents on-chain. Verification is fully permissionless — any app can call the DRIS contract to confirm a document's authenticity.

solidity — verify a document hash
interface IDRIS {
    function verify(bytes32 documentHash)
        external view
        returns (bool valid, address issuer, uint256 timestamp);

    function register(bytes32 documentHash, string calldata metadata)
        external;
}
06 · RPC Reference

RPC Reference

Alkebuleum exposes a standard JSON-RPC 2.0 interface compatible with all Ethereum tooling. The endpoint supports both HTTP and WebSocket connections.

HTTP RPChttps://rpc.alkebuleum.com
WebSocketwss://rpc.alkebuleum.com
Rate limit100 req/s (public) · contact for higher limits
AuthNone required for public endpoints
ETH eth_blockNumber Returns the latest block number
JSON-RPC
{ "jsonrpc": "2.0", "method": "eth_blockNumber", "params": [], "id": 1 }
// Response: { "result": "0x1a4f6" }
ETH eth_getBalance Returns ALKE balance for an address
JSON-RPC
{ "jsonrpc": "2.0", "method": "eth_getBalance",
  "params": ["0xYourAddress", "latest"], "id": 1 }
// Response: { "result": "0x8AC7230489E80000" } (10 ALKE in wei)
ETH eth_sendRawTransaction Broadcasts a signed transaction

Submit a signed and RLP-encoded transaction. Returns the transaction hash. Sign the transaction using your wallet or ethers.Wallet.signTransaction().

ETH eth_call Execute a read-only contract call

Executes a contract function without creating a transaction. Used for reading state from smart contracts (balances, identities, document hashes). Standard Ethereum ABI encoding applies.

ETH eth_getLogs Query event logs with filters

Filter events by contract address, topic, and block range. Maximum block range per query: 10,000 blocks. Use fromBlock and toBlock to paginate.

All standard Ethereum JSON-RPC methods (eth_*, net_*, web3_*) are supported. Refer to the EIP-1474 spec for the full method list.
07 · Core Protocol

Core Protocol Contracts

Alkebuleum ships a set of sovereign identity and naming contracts that any developer can read from, integrate with, or build on top of. These are not third-party libraries — they are the live on-chain infrastructure of the network.

v1.4.0
AINRegistry
Identity records, controller rotation, address roles, modules, primary identity
v1.1.0
AINRegistrar
Authorised entry-point for registering all five identity types on-chain
v2.0
ANSRegistryV2
Multi-extension Alkebuleum Name Service — register name.alke and custom namespaces

AINRegistry

v1.4.0

The canonical on-chain phone book for Alkebuleum. Stores identity records (type, controller, custodian, status, metadata) and manages address link roles. Every AIN — Human, AI Agent, DAO, Device, or Service — lives here.

AIN format: [2 letters][8 digits] — e.g. AA00000001 to ZZ99999999. 67.6 billion unique slots. Left-aligned in bytes32. Derived deterministically from keccak256(type, controller, chainId, salt).

Identity Types

HUMAN (0)Individual user. Self-sovereign — no custodian required.
AI_AGENT (1)Autonomous AI agent. Requires a HUMAN or DAO custodian for on-chain accountability.
DAO (2)Decentralised organisation. Controller is typically a multisig or governor contract.
DEVICE (3)IoT or hardware node. Requires a custodian.
SERVICE (4)Off-chain API or protocol endpoint. Requires a custodian.

Address Link Roles

Each AIN can link multiple addresses to named roles. Roles are bytes32 constants — compute them as keccak256("ALKE_ROLE_<NAME>"). One address per role per AIN.

ROLE_RECOVERYCold key or multisig for account recovery.
ROLE_DELEGATEHot session key for dApp interaction. Default login role.
ROLE_AUTHENTICATORExplicit login key for primary identity claim. Default login role.
ROLE_AA_WALLETERC-4337 smart contract wallet address.
ROLE_GUARDIANTrusted party for social recovery or oversight.
ROLE_BENEFICIARYDesignated recipient (inheritance, DAO payouts).
ROLE_OPERATORDelegated operator for protocol actions.
ROLE_CUSTODIANAddress mirror of the custodianAIN controller.
ROLE_CUSTOMFallback for custom roles. Or use keccak256("YOUR_ROLE") directly.

Key Read Functions

VIEW getRecord(bytes32 ain) Returns the full IdentityRecord struct

Returns IdentityRecord containing: itype, owner (immutable original), controller (current key), custodianAIN, registeredAt, status, metadataDigest, controllerNonce.

javascript
const record = await registry.getRecord("AA00000001");
// { itype: 0, owner: "0x...", controller: "0x...",
//   custodianAIN: "0x00...", status: 0, ... }
VIEW isActive(bytes32 ain) Returns true if AIN exists and status is Active

The most common read you'll make. Use this to gate access to any feature that requires an active Alkebuleum identity. Returns false for Suspended, Deprecated, or Compromised AIns.

VIEW getLinkedAddress(bytes32 ain, bytes32 role) Returns the address linked to a role
javascript
const ROLE_DELEGATE = ethers.id("ALKE_ROLE_DELEGATE");
const delegate = await registry.getLinkedAddress(ain, ROLE_DELEGATE);
VIEW resolvePrimaryIdentity(address addr) Returns the AIN and validity for a wallet address

v1.4.0 login resolution. Returns (bytes32 ain, bool valid). If valid=false, the key no longer holds a qualifying login role and the user must re-claim. Use this as the first step in any sign-in flow.

javascript
const [ain, valid] = await registry.resolvePrimaryIdentity(walletAddress);
if (!valid) promptRelink();
VIEW findFreeAIN(type, controller, startSalt) Preview the AIN that would be minted — zero gas

Returns (bytes32 ain, uint256 effectiveSalt). Use in your UI to show users their AIN before they sign. Pass the returned salt back to the registrar's registration call.

Gating your app with AIN

solidity — identity gate pattern
interface IAINRegistry {
    function isActive(bytes32 ain) external view returns (bool);
    function controllerToAIN(address ctrl) external view returns (bytes32);
}

contract MyAlkeApp {
    IAINRegistry public immutable registry;

    constructor(address _registry) { registry = IAINRegistry(_registry); }

    modifier onlyVerifiedIdentity() {
        bytes32 ain = registry.controllerToAIN(msg.sender);
        require(ain != bytes32(0), "No AIN");
        require(registry.isActive(ain), "AIN not active");
        _;
    }

    function doSomething() external onlyVerifiedIdentity {
        // caller is a verified, active Alkebuleum identity
    }
}

AINRegistrar

v1.1.0

The authorised entry-point for creating new identities. Sits in front of AINRegistry and handles per-type registration logic, custodian validation, and per-type gates. You call the Registrar — it calls the Registry.

v1.1.0 breaking change: The separate referrerAIN parameter has been removed from all registration functions. Use custodianAIN instead — it is written permanently into the identity record at mint time and serves as the on-chain lineage/referral record. Pass bytes32(0) for self-sovereign with no referrer.

Registration Functions

WRITE registerHuman(controller, metadataDigest, salt, custodianAIN) Register a HUMAN identity

custodianAIN is optional for humans — pass bytes32(0) for self-sovereign. If provided, the custodian must be Active. Returns bytes32 ain.

javascript
// 1. Preview the AIN first (no gas)
const [previewAIN, salt] = await registry.findFreeAIN(0, userAddress, 0);

// 2. Register
const tx = await registrar.registerHuman(
  userAddress,   // controller
  ethers.ZeroHash, // metadataDigest (0 = skip)
  salt,          // from findFreeAIN
  ethers.ZeroHash  // custodianAIN (0 = self-sovereign)
);
const receipt = await tx.wait();
WRITE registerAIAgent(agentController, custodianAIN, metadataDigest, salt) Register an AI_AGENT — custodian required

AI agents must have a custodian that is a registered, Active identity of type HUMAN or DAO. This enforces on-chain accountability for every AI deployed on the network. Passing bytes32(0) reverts with CustodianRequired.

VIEW previewAIN(itype, controller, startSalt) Show the user their AIN before they sign

Zero-gas static call. Returns (bytes32 ain, uint256 effectiveSalt). Display the AIN in your onboarding UI, then pass effectiveSalt back to the registration call.

Custodian Rules by Type

HUMANOptional. bytes32(0) for self-sovereign.
AI_AGENTRequired. Must be HUMAN or DAO type. Must be Active.
DAOOptional. bytes32(0) for self-sovereign.
DEVICERequired. Any Active AIN accepted as custodian.
SERVICERequired. Any Active AIN accepted as custodian.

Setup note: after deploying the Registrar, call registry.setRegistrar(registrarAddr, true) — otherwise all registration calls revert with NotRegistrar.

ANSRegistryV2

v2.0

Multi-extension Alkebuleum Name Service. Registers human-readable names like satoshi.alke and links them to an AIN. Third parties can create custom extensions (e.g. name.yourorg) by paying the extension creation fee. Names are ERC-721 NFTs.

Node derivation: node = keccak256(abi.encode(extHash, labelHash)) where extHash = keccak256("alke") and labelHash = keccak256(label). All functions accept plain strings — the contract hashes them internally. Use the getNode(label, ext) pure helper to derive a node off-chain.

Registration Tiers

ANNUALYearly subscription. Renew with renewWithExtension() before expiry + 30-day grace period.
FIVE_YEAR5-year subscription. Cheaper per-year rate.
LIFETIMEPermanent. Never expires. Higher one-time fee.

Key Functions

WRITE registerForWithExtension(label, ext, tier, ain, recipient) Register a name — supports sponsored registration

Payable. Pass ext = "alke" for the default namespace. recipient receives the NFT. If ain is provided it must be controlled by recipient (not msg.sender) — this prevents sponsors from linking AIns without consent. Pass ain = bytes32(0) to link later.

javascript
const price = await ans.quoteInExtension("alke", 0 /*ANNUAL*/, 1);

await ans.registerForWithExtension(
  "satoshi",       // label
  "alke",          // extension
  0,               // Tier.ANNUAL
  ain,             // AIN to link (bytes32(0) to skip)
  userAddress,     // recipient — owns the NFT
  { value: price }
);
VIEW resolveWithExtension(label, ext) Resolve a name → AIN

Returns the bytes32 AIN linked to the name, or bytes32(0) if the name has expired or has no AIN. Also checks that the linked AIN is still Active in the registry.

javascript
const ain = await ans.resolveWithExtension("satoshi", "alke");
if (ain === ethers.ZeroHash) handleNotFound();
VIEW isAvailableInExtension(label, ext) Check if a name is available to register

Returns false if the name is active, in grace period, reserved, or the extension doesn't exist. Only returns true if the name is genuinely claimable right now.

WRITE setRecordWithExtension(label, ext, key, value) Set a text record on a name

Store arbitrary key-value text records on a name (website, avatar, email, etc). key is bytes32 — compute as keccak256("KEY_NAME") client-side. Records are epoch-versioned: they are automatically invalidated on name transfer or re-registration.

javascript
const KEY_WEBSITE = ethers.id("KEY_WEBSITE");
await ans.setRecordWithExtension("satoshi", "alke", KEY_WEBSITE, "https://mysite.com");
javascript — full name lookup flow
// Resolve a .alke name to an identity record
const ain = await ans.resolveWithExtension("satoshi", "alke");

if (ain !== ethers.ZeroHash) {
  const record = await registry.getRecord(ain);
  console.log("Type:",       record.itype);      // 0 = HUMAN
  console.log("Controller:", record.controller);
  console.log("Status:",     record.status);     // 0 = Active
}
Deploy order: (1) Deploy AINRegistry, (2) Deploy AINRegistrar(registryAddr), (3) Call registry.setRegistrar(registrarAddr, true), (4) Deploy ANSRegistryV2(admin, treasury, registryAddr, ...prices). ANS reads the registry directly — no extra setup required.
08 · Ecosystem

Ecosystem SDKs

Alkebuleum's ecosystem products each provide their own SDK and documentation. All run on Alkebuleum and accept ALKE for gas.

Product Ticker / ID Description Docs
Nuru AI Live nuruai.org Sovereign AI assistant for identity and finance on Alkebuleum. Provides AI-powered document analysis and identity verification. nuruai.org ↗
AfPass Coming Soon afpass.org Decentralised identity passport for Africa. DID issuance, verifiable credentials, and biometric binding on-chain. afpass.org ↗
DRIS Coming Soon dris.cc Document registry and institutional signing on-chain. Issue, anchor, and verify official documents with government-grade trust. dris.cc ↗
Amvault Live amvault.net Self-custodial wallet and identity hub. The primary end-user wallet for Alkebuleum and ecosystem apps. amvault.net ↗
JollofSwap Live JSWAP Native decentralised exchange built on Alkebuleum. Swap ALKE and ecosystem tokens with on-chain liquidity pools. jollofswap.com ↗
Building an integration? Each ecosystem product exposes its own REST or on-chain interface. Start with AfPass for identity primitives and DRIS for document trust. For developer support, reach out to dev@alkebuleum.org.
docs.alkebuleum.org
alkebuleum.org Block Explorer GitHub dev@alkebuleum.org
© 2025 Alkebuleum Foundation