Node Network
🏠 Home > Core Concepts > Node Network
Aurellion's node network is the physical infrastructure layer of the protocol. Nodes are verified storage and logistics locations that anchor real-world assets to the blockchain, provide custody, and enable the transfer of physical goods.
What is a Node?
A node is a physical location operated by a registered entity that:
- Stores physical commodities (warehouses, farms, markets, distribution centres)
- Mints ERC-1155 tokens representing the goods they hold
- Lists tokens for sale on the CLOB
- Participates in the logistics chain as senders/receivers of journeys
- Earns fees from order processing and logistics participation
Node Types
| Type | Description | Example |
|---|---|---|
WAREHOUSE |
General storage facility | Urban logistics hub |
FARM |
Agricultural production | Livestock farm, crop field |
MARKET |
Trading hub with storage | Livestock market, commodity exchange |
PROCESSOR |
Processing and transformation | Grain mill, abattoir |
PORT |
Import/export terminal | Shipping port facility |
CUSTOM |
Any other type | Defined by operator |
Node Registration Flow
Operator decides to join Aurellion
│
▼
1. Register node: NodesFacet.registerNode(nodeType, capacity, lat, lng, addressName)
→ nodeHash generated (bytes32)
→ active=true, validNode=false
→ NodeRegistered event
│
▼
2. Admin validates node (off-chain verification: location, capacity, legitimacy)
→ NodesFacet.validateNode(nodeHash)
→ validNode=true
│
▼
3. Operator adds supported asset types:
→ NodesFacet.addSupportedAsset(nodeHash, token, tokenId, price, capacity)
→ SupportedAssetAdded event
│
▼
4. Operator mints first tokens:
→ AssetsFacet.nodeMint(account, assetDef, amount, className, "")
→ MintedAsset event
│
▼
5. Operator lists tokens on CLOB:
→ OrderRouterFacet.placeNodeSellOrder(...)
│
▼
Node is now active and generating revenueNode Asset Inventory
Nodes maintain two types of inventory:
External Inventory (ERC-1155 balances)
Standard ERC-1155 balance tracked in erc1155Balances[tokenId][nodeAddress]. This is the public balance visible to any ERC-1155 query.
Internal Inventory (Node Token Balances)
An additional internal accounting layer tracked in:
nodeTokenBalances[nodeHash][tokenId] = uint256This tracks tokens that are "in the Diamond" under the node's management — used for:
- Validating node sell orders (
placeNodeSellOrderchecks this) - Inter-node transfers
- Custody without requiring ERC-1155 transfers
Multi-Node Ownership
An operator can own multiple nodes:
ownerNodes[operatorAddress] = [nodeHash1, nodeHash2, nodeHash3]Each node has independent:
- Capacity tracking
- Asset support list
- Token inventory
- Location data
Capacity Management
Each supported asset has a capacity:
NodeAsset {
token: 0xABC... (ERC-1155 contract)
tokenId: 1 (asset type)
price: 500 USDC (per unit)
capacity: 100 (available units)
}When an order is placed against a node:
reduceCapacityForOrder(nodeHash, token, tokenId, amount)is called- Capacity decrements atomically:
capacity -= amount - If
capacity < amount: transaction reverts
Capacity is replenished by:
- Minting new tokens (when new physical goods arrive)
- Cancelling orders (capacity restored)
- Manual update via
updateNodeCapacity()
Fee Distribution
When an order is settled via AuSysFacet.settleOrder(), the 2% transaction fee is distributed proportionally across all nodes involved in the order's journey chain:
txFee = orderValue × 2% = 200 USDC (for a 10,000 USDC order)
Nodes in order: [Node A, Node B, Node C]
Each node receives: 200 / 3 ≈ 66.67 USDCThis incentivises nodes to participate in complex multi-hop deliveries.
Supporting Documents
Nodes can attach compliance documents on-chain:
type SupportingDocument = {
url: string; // IPFS link or HTTPS URL
title: string;
description: string;
documentType: string; // "LICENCE", "INSURANCE", "CERTIFICATE", "PHOTO"
isFrozen: boolean; // Frozen docs cannot be removed
timestamp: number;
addedBy: string;
};Documents are immutable if isFrozen=true. This enables regulatory compliance proof that cannot be deleted after the fact.
Node Analytics
The Ponder indexer aggregates node data for the explorer:
query NodeOverview($nodeHash: String!) {
nodeRegisteredEventss(where: { nodeHash: $nodeHash }) {
items {
owner
nodeType
block_timestamp
}
}
supportedAssetAddedEventss(where: { nodeHash: $nodeHash }) {
items {
token
tokenId
price
capacity
}
}
nodeFeeDistributedEventss(where: { node: $nodeHash }) {
items {
amount
block_timestamp
}
}
}Node Explorer
The frontend's node explorer (/node/explorer) displays:
- Map view with all registered nodes (GPS coordinates)
- Node details: type, owner, supported assets, capacity
- Order history for each node
- Real-time availability
Revenue Model for Node Operators
| Revenue Source | Amount | When |
|---|---|---|
| CLOB sell orders | Market price × quantity | When sell order fills |
| Node fee share | 2% txFee ÷ nodes | When order settles |
| RWY staking | Yield from processing | When RWY opportunity completes |
| Logistics participation | Part of bounty | Per journey as sender/receiver |