Pre-launch. The protocol is not publicly live yet. This documentation describes the contracts as implemented; deployed addresses are published at launch.

TokenSocials

On-chain metadata registry. One packed bytes32 per token, plus an owner and a last-updated timestamp packed into a single slot.

Contract Type

Singleton — one per chain. Written by the factory at registration, by the token owner thereafter, and by the hook on CTO finalization. No owner of its own.

Functions

register_token(token: address, initial_owner: address, packed: bytes32) external

Factory only. Called inside deploy_pair. The protocol token path does not register.

set_socials(token: address, packed: bytes32) external

Current owner only. Replaces the packed record wholesale and refreshes the timestamp.

Emits

SocialsUpdated(token, packed)

transfer_owner(token: address, new_owner: address) external

Transfer metadata ownership. Callable by the current owner, or by the hook / graduation manager during CTO finalization so socials follow the deployer role.

Emits

OwnerTransferred(token, old_owner, new_owner)

View Functions

FunctionReturns
get_socials(token) -> bytes32The packed record
get_owner(token) -> addressCurrent metadata owner
get_record(token) -> (bytes32, address, uint256)(packed, owner, updated_at) in one call
is_registered(token) -> boolWhether the token has a record
get_factory() -> addressAuthorized factory
get_liquidity_gen_hook() -> addressAuthorized hook / manager

Storage Packing

Owner and timestamp share one slot: the address occupies the high 160 bits, the timestamp the low 96. get_record() unpacks both and returns them with the socials blob, so a full read is two SLOADs.

Interpretation is off-chain

The contract stores 32 opaque bytes and takes no view on their meaning. Encoding — which handles, which URLs, which scheme version — is an application-layer convention. Consumers should tolerate records that do not decode.