<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Extension Examples :: Unofficial EVE Frontier Development Notes</title>
    <link>https://f76f6398.frontier-scetrov-live.pages.dev/develop/world-contracts/extension-examples/index.html</link>
    <description>The contracts/extension_examples/ package contains Layer 3: Player Extension examples that demonstrate how builders can extend EVE Frontier assembly behavior using the typed witness pattern. These are reference implementations showing common extension patterns.&#xA;How Extensions Work Extensions are custom Move packages that interact with world assemblies (Gates, Storage Units, Turrets) through a typed authentication witness pattern:&#xA;The assembly owner registers an extension’s witness type on their assembly. The extension module creates instances of its witness type to call assembly functions. The assembly verifies the witness type is registered before allowing the operation. sequenceDiagram participant Owner participant Assembly participant Extension Owner-&gt;&gt;Assembly: authorize_extension of Auth Note over Assembly: Auth TypeName added to allowlist participant Player Player-&gt;&gt;Extension: call custom entry function Extension-&gt;&gt;Assembly: pass Auth witness Assembly-&gt;&gt;Assembly: verify Auth is registered Assembly--&gt;&gt;Extension: operation succeeds Modules in This Section Module Description config.move Shared configuration object with dynamic field helpers for extension rule storage. tribe_permit.move Gate extension using shared ExtensionConfig — tribe-based jump permits with dynamic fields. corpse_gate_bounty.move Combined Storage Unit + Gate extension — bounty collection grants gate access. turret.move Turret extension — custom targeting priority logic using the OnlineReceipt hot potato pattern. Tip These examples can be used as starting points for your own extensions. The builder-scaffold repository provides a complete project template for building and testing extensions locally.</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 08 Mar 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://f76f6398.frontier-scetrov-live.pages.dev/develop/world-contracts/extension-examples/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>config.move</title>
      <link>https://f76f6398.frontier-scetrov-live.pages.dev/develop/world-contracts/extension-examples/config.move/index.html</link>
      <pubDate>Sat, 21 Feb 2026 12:23:00 +0000</pubDate>
      <guid>https://f76f6398.frontier-scetrov-live.pages.dev/develop/world-contracts/extension-examples/config.move/index.html</guid>
      <description>The config.move module provides a shared configuration object for builder extensions. It publishes a single ExtensionConfig shared object at package publish time, allowing other extension modules to attach typed rule/config structs as dynamic fields.&#xA;1. Core Component Architecture classDiagram class ExtensionConfig { +UID id } class AdminCap { +UID id } class XAuth { &lt;&lt;witness - drop&gt;&gt; } class DynamicField_K_V { +K key +V value } AdminCap ..&gt; ExtensionConfig : guards mutations ExtensionConfig *-- DynamicField_K_V : stores rules as dynamic fields XAuth ..&gt; Assemblies : authenticates extension calls Key Components ExtensionConfig — A shared object acting as a key-value store for extension rules. Other modules attach their own typed config structs as Sui dynamic fields under this object. AdminCap — An owned capability object transferred to the deployer at init. Required for all mutation operations on the config. XAuth — A witness type (has drop) used to authenticate extension calls to world assemblies. Any extension module in this package can create XAuth instances via config::x_auth(). 2. Dynamic Field Pattern The module provides CRUD helpers for managing typed rules as dynamic fields:</description>
    </item>
    <item>
      <title>tribe_permit.move</title>
      <link>https://f76f6398.frontier-scetrov-live.pages.dev/develop/world-contracts/extension-examples/tribe_permit.move/index.html</link>
      <pubDate>Sat, 21 Feb 2026 12:23:00 +0000</pubDate>
      <guid>https://f76f6398.frontier-scetrov-live.pages.dev/develop/world-contracts/extension-examples/tribe_permit.move/index.html</guid>
      <description>The tribe_permit.move module is a config-based builder extension for world::gate. Like gate.move, it enforces tribe-based jump rules, but instead of managing its own shared objects, it stores configuration as dynamic fields under the shared ExtensionConfig object.&#xA;1. Core Component Architecture classDiagram class ExtensionConfig { +UID id } class TribeConfig { +u32 tribe } class TribeConfigKey { &lt;&lt;key - copy, drop, store&gt;&gt; } ExtensionConfig *-- TribeConfig : dynamic field via TribeConfigKey TribeConfig ..&gt; Gate : enforces tribe check Key Components TribeConfig — A store + drop struct holding the required tribe ID. Stored as a dynamic field value under ExtensionConfig. TribeConfigKey — A copy + drop + store struct used as the dynamic field key to locate TribeConfig. Note This module does not define its own AdminCap or XAuth. It reuses both from config.move, demonstrating how multiple extensions can share a common configuration infrastructure and authentication witness.</description>
    </item>
    <item>
      <title>corpse_gate_bounty.move</title>
      <link>https://f76f6398.frontier-scetrov-live.pages.dev/develop/world-contracts/extension-examples/corpse_gate_bounty.move/index.html</link>
      <pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://f76f6398.frontier-scetrov-live.pages.dev/develop/world-contracts/extension-examples/corpse_gate_bounty.move/index.html</guid>
      <description>The corpse_gate_bounty.move module is a combined Storage Unit + Gate extension that demonstrates cross-assembly interaction. Players submit a corpse item to a storage unit and receive a gate jump permit in return — a “bounty collection” mechanic.&#xA;1. Core Component Architecture classDiagram class ExtensionConfig { +UID id } class BountyConfig { +u64 bounty_type_id } class BountyConfigKey { &lt;&lt;key - copy, drop, store&gt;&gt; } ExtensionConfig *-- BountyConfig : dynamic field via BountyConfigKey Key Components BountyConfig — Stores the bounty_type_id that identifies which item type qualifies as a valid bounty. Stored as a dynamic field under ExtensionConfig. BountyConfigKey — Dynamic field key used to locate BountyConfig on the shared ExtensionConfig. 2. Bounty Collection Flow sequenceDiagram participant Player participant Ext as corpse_gate_bounty participant Config as ExtensionConfig participant SU as StorageUnit participant Gate as world::gate Player-&gt;&gt;Ext: collect_corpse_bounty(...) Ext-&gt;&gt;Config: borrow_rule → BountyConfig Ext-&gt;&gt;SU: withdraw_by_owner(corpse_item_id) Note over Ext: assert corpse.type_id() == bounty_type_id Ext-&gt;&gt;SU: deposit_item of XAuth (corpse into owner inventory) Ext-&gt;&gt;Gate: issue_jump_permit of XAuth (5-day expiry) Gate--&gt;&gt;Player: JumpPermit transferred How It Works The admin configures which item type qualifies as a bounty via set_bounty_type_id(). A player calls collect_corpse_bounty() with: Their storage unit (containing the corpse) Source and destination gates Their character and OwnerCap The corpse item ID The extension: Withdraws the corpse from the player’s inventory (owner-authorized) Validates the corpse’s type_id matches the configured bounty type Deposits the corpse into the storage unit’s owner inventory Issues a 5-day JumpPermit for the specified gate route 3. Cross-Assembly Interaction This is the most complex extension example because it interacts with two different assembly types in a single transaction:</description>
    </item>
    <item>
      <title>turret.move (extension)</title>
      <link>https://f76f6398.frontier-scetrov-live.pages.dev/develop/world-contracts/extension-examples/turret.move/index.html</link>
      <pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://f76f6398.frontier-scetrov-live.pages.dev/develop/world-contracts/extension-examples/turret.move/index.html</guid>
      <description>The turret.move extension is a builder extension example for world::turret. It demonstrates how builders can implement custom targeting behavior by overriding the default priority-list logic using the typed witness pattern.&#xA;How It Works When a turret has an authorized extension, the game resolves the extension’s package ID from the configured TypeName and calls the extension’s get_target_priority_list function instead of the built-in default.&#xA;The extension receives:&#xA;The Turret object (read-only) The owner Character (read-only) The target candidate list as BCS-encoded vector&lt;TargetCandidate&gt; — each candidate already contains a behaviour_change: BehaviourChangeReason field describing what changed (entered range, started attack, stopped attack) An OnlineReceipt hot potato proving the turret is online The extension must:</description>
    </item>
  </channel>
</rss>