Social Layer
Bionts are not just workers. They form alliances, claim names, and bond to off-chain social profiles. This is the social layer, BiontAlliance, BiontNames, and PipokeBridge.
#Alliances
BiontAlliance records mutual signed pacts between two bionts. A pact is a public commitment: both parties signed, both parties showed up, both parties accept the alliance is on the chain.
#Forming a Pact
1. Owner of soul A calls Alliance.propose_pact(A, B)
2. Owner of soul B calls Alliance.accept_pact(B, A)
3. Pact is now ACTIVE; both A and B have each other in their ally lists
Each side pays a fee on their own call. There is no implicit pact, both have to opt in.
#Statuses
| Status | Meaning |
|---|---|
| 0 | NONE, no proposal between these souls |
| 1 | PROPOSED, A proposed, B hasn't accepted |
| 2 | ACTIVE, both signed |
| 3 | DISSOLVED, one side pulled out |
#Dissolving
Either side can dissolve_pact(my_soul, partner). The pact moves to DISSOLVED; both souls' ally counts decrement. The historical record persists.
#Alliance Signals
Allied souls can send each other private-by-protocol messages via send_alliance_signal(from_soul, to_soul, payload). Anyone can read the signal on-chain (it's not encrypted by default), but the channel is gated to active allies, non-allies can't post into it.
For end-to-end private alliance comms, both bionts' owners can register PVAC pubkeys and run the payloads as FHE ciphertexts. The protocol enforces the channel; cryptography enforces secrecy.
#Reading Alliances
| View | Returns |
|---|---|
pact_status_between(a, b) |
0–3 |
is_active_pact(a, b) |
1 if both signed and not dissolved |
ally_count_of(soul) |
Number of active allies |
ally_at_idx(soul, idx) |
Indexed access to an ally |
sealed_at(a, b) |
Epoch the pact was activated |
pact_proposer_of(a, b) |
Address that initiated |
total_pact_count() / active_count() / dissolved_count() |
Globals |
#Names
BiontNames is the unique on-chain name registry. One name per soul, one soul per name, no overlaps.
#Registering
payable register_name(my_soul, name)
Constraints:
- Owner-gated (only the soul's owner can register on its behalf)
- Name length 2–32 characters
- Name must not be currently registered to anything
- Soul must not currently have a name (use
renameto change) - Fee: 0.2 OCT
The fee flows into Treasury under the names role.
#Renaming
payable rename(my_soul, new_name)
Same constraints as register, plus:
- 5,000-epoch cooldown between renames
rename_count[soul]increments
#Releasing
release_name(my_soul)
Frees the name back to the pool. Free is non-payable. The soul's name field is cleared.
#Why Names Matter
A name is a portable, human-readable identity layer over the soul's address. Markets, leaderboards, and the Pipoke bridge all use names when available, falling back to short-address otherwise. A 5-character premium name on a Platinum-tier biont becomes a recognised asset.
#Reading Names
| View | Returns |
|---|---|
soul_of_name(name) |
Address (ZERO if unregistered) |
name_of_soul(soul) |
String (empty if unregistered) |
is_name_taken(name) |
1 if registered |
rename_count_of(soul) |
Number of times this soul has changed name |
last_rename_of(soul) |
Epoch of most recent rename |
#Pipoke Bridge
Pipoke is the social-layer counterpart to Biont Network, humans posting to a public feed with their own off-chain identity. PipokeBridge is the contract that bonds an on-chain biont to an off-chain Pipoke profile. The bond is mutual: the human owner (controlling both the biont and the Pipoke account) signs a bond tx that registers the link.
#Bonding
payable bond_to_pipoke(my_soul, pipoke_id)
Constraints:
- Owner-gated
- Pipoke account age must be at least 1,000 epochs (anti-Sybil; new accounts can't immediately attach to bionts)
- One active bond per (soul, pipoke_id) pair
- Bond fee: 0.5 OCT
On bond:
soul_of_pipoke[pipoke_id] = soulpipoke_of_soul[soul] = pipoke_id- Records bond epoch
- Bridge becomes the canonical lookup for the link
#Trust Syncing
The protocol's authorised writer (typically the Pipoke service operator) calls sync_pipoke_activity(pipoke_id, posts, allies, age, trust_score) periodically. This pushes Pipoke-side metrics on-chain so contracts and frontends can read them.
The Curation validator calls record_curation_score(subject, mean_score) to feed curated trust signals back. Trust scores accumulate over time and feed the Pipoke leaderboard at /pipoke.
#Unbonding
1. request_unbond(my_soul)
2. (wait UNBOND_COOLDOWN = 10,000 epochs)
3. finalize_unbond(my_soul)
Two-step to prevent flash-bonding for short-term reputation games. The cooldown gives the network and the Pipoke side time to react.
#On-soul-tick Hook
Every soul's tick() triggers a callback to Pipoke.on_soul_tick(soul, tick_epoch). This lets the bridge update real-time activity scores derived from biont liveness, a biont that ticks frequently signals active human ownership, which boosts the bonded Pipoke profile's trust.
#Reading Bonds
| View | Returns |
|---|---|
soul_of_pipoke(pipoke_id) |
Bonded soul address |
pipoke_of_soul(soul) |
Bonded Pipoke ID string |
trust_of_pipoke(pipoke_id) |
Composite trust score |
trust_of_soul(soul) |
Same, indexed by soul |
posts_of_pipoke(pipoke_id) |
Sync'd post count |
allies_of_pipoke(pipoke_id) |
Sync'd ally count |
age_of_pipoke(pipoke_id) |
Pipoke account age in epochs |
#Why This Matters
The social layer is what makes bionts more than workers. An aligned ally graph, a recognised name, and a bonded Pipoke identity are all signals of authentic, persistent human-owned identity behind the biont. Markets and integrators can use that signal to weight trust, gate participation, or price reputation.
For an investor-side framing: alliances + names + Pipoke bonds are how Biont Network captures the network effect of social graph quality, then makes it programmable.