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.
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.
ethers v6 or viem are recommended.npm install ethers # or: npm install viem
https://rpc.alkebuleum.com and start querying.import { JsonRpcProvider } from "ethers"; const provider = new JsonRpcProvider("https://rpc.alkebuleum.com"); // Verify connection const block = await provider.getBlockNumber(); console.log("Latest block:", block);
Network Config
All parameters needed to add Alkebuleum Mainnet to any EVM wallet or toolchain.
| Network name | Alkebuleum Mainnet |
| RPC endpoint | https://rpc.alkebuleum.com |
| Chain ID | 237422 |
| Currency symbol | ALKE |
| Decimals | 18 |
| Block explorer | explorer.alkebuleum.com ↗ |
| WebSocket RPC | wss://rpc.alkebuleum.com |
| EIP-1559 | Supported |
chainId: 237422 in your Hardhat or Foundry config.module.exports = { networks: { alkebuleum: { url: "https://rpc.alkebuleum.com", chainId: 237422, accounts: [process.env.PRIVATE_KEY] } }, solidity: "0.8.24" };
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.
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 type | Permissioned institutional authority |
| Validator onboarding | Council vote + ALKE stake |
| Block time | ~5 seconds |
| Soft finality | 2 confirmations (~10 s) |
| Hard finality | 6 confirmations (~30 s) |
| Slashing | Yes — stake at risk for double-signing |
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 name | Alkecoin |
| Primary ticker | ALKE |
| Alias | AKE |
| Type | Native utility token — not a security |
| Total genesis supply | 1,000,000,000 ALKE |
| Decimals | 18 |
| ICO / presale | None |
| Uses | Gas, staking, governance, network access |
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);
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.
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.
# 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.
interface IDRIS { function verify(bytes32 documentHash) external view returns (bool valid, address issuer, uint256 timestamp); function register(bytes32 documentHash, string calldata metadata) external; }
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 RPC | https://rpc.alkebuleum.com |
| WebSocket | wss://rpc.alkebuleum.com |
| Rate limit | 100 req/s (public) · contact for higher limits |
| Auth | None required for public endpoints |
{ "jsonrpc": "2.0", "method": "eth_blockNumber", "params": [], "id": 1 }
// Response: { "result": "0x1a4f6" }
{ "jsonrpc": "2.0", "method": "eth_getBalance",
"params": ["0xYourAddress", "latest"], "id": 1 }
// Response: { "result": "0x8AC7230489E80000" } (10 ALKE in wei)
Submit a signed and RLP-encoded transaction. Returns the transaction hash. Sign the transaction using your wallet or ethers.Wallet.signTransaction().
Executes a contract function without creating a transaction. Used for reading state from smart contracts (balances, identities, document hashes). Standard Ethereum ABI encoding applies.
Filter events by contract address, topic, and block range. Maximum block range per query: 10,000 blocks. Use fromBlock and toBlock to paginate.
eth_*, net_*, web3_*) are supported. Refer to the EIP-1474 spec for the full method list.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.
name.alke and custom namespacesAINRegistry
v1.4.0The 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.
[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_RECOVERY | Cold key or multisig for account recovery. |
ROLE_DELEGATE | Hot session key for dApp interaction. Default login role. |
ROLE_AUTHENTICATOR | Explicit login key for primary identity claim. Default login role. |
ROLE_AA_WALLET | ERC-4337 smart contract wallet address. |
ROLE_GUARDIAN | Trusted party for social recovery or oversight. |
ROLE_BENEFICIARY | Designated recipient (inheritance, DAO payouts). |
ROLE_OPERATOR | Delegated operator for protocol actions. |
ROLE_CUSTODIAN | Address mirror of the custodianAIN controller. |
ROLE_CUSTOM | Fallback for custom roles. Or use keccak256("YOUR_ROLE") directly. |
Key Read Functions
Returns IdentityRecord containing: itype, owner (immutable original), controller (current key), custodianAIN, registeredAt, status, metadataDigest, controllerNonce.
const record = await registry.getRecord("AA00000001"); // { itype: 0, owner: "0x...", controller: "0x...", // custodianAIN: "0x00...", status: 0, ... }
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.
const ROLE_DELEGATE = ethers.id("ALKE_ROLE_DELEGATE"); const delegate = await registry.getLinkedAddress(ain, ROLE_DELEGATE);
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.
const [ain, valid] = await registry.resolvePrimaryIdentity(walletAddress); if (!valid) promptRelink();
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
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.0The 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.
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
custodianAIN is optional for humans — pass bytes32(0) for self-sovereign. If provided, the custodian must be Active. Returns bytes32 ain.
// 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();
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.
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
HUMAN | Optional. bytes32(0) for self-sovereign. |
AI_AGENT | Required. Must be HUMAN or DAO type. Must be Active. |
DAO | Optional. bytes32(0) for self-sovereign. |
DEVICE | Required. Any Active AIN accepted as custodian. |
SERVICE | Required. 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.0Multi-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 = 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
ANNUAL | Yearly subscription. Renew with renewWithExtension() before expiry + 30-day grace period. |
FIVE_YEAR | 5-year subscription. Cheaper per-year rate. |
LIFETIME | Permanent. Never expires. Higher one-time fee. |
Key Functions
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.
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 } );
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.
const ain = await ans.resolveWithExtension("satoshi", "alke"); if (ain === ethers.ZeroHash) handleNotFound();
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.
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.
const KEY_WEBSITE = ethers.id("KEY_WEBSITE"); await ans.setRecordWithExtension("satoshi", "alke", KEY_WEBSITE, "https://mysite.com");
// 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 }
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.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 ↗ |