Claude
Skills
Sign in
Back

sails-ethexe-architecture

Included with Lifetime
$97 forever

Use when a builder needs to design or review architecture for a Sails ethexe app with dual-transport, payable methods, Solidity interface generation, or Ethereum-style events. Do not use for standard Gear/Vara Sails apps without ethexe.

Designscriptsassets

What this skill does


# Sails Ethexe Architecture

## Goal

Turn an approved spec into an ethexe-specific architecture artifact before implementation, covering transport strategy, payable design, event model, Solidity interface generation, and the constraints the ethexe feature imposes.

If the app does NOT need ethexe, use `../sails-architecture/SKILL.md` instead.

## Inputs

- `../../references/sails-ethexe-patterns.md` — ethexe diff table, transport rules, type requirements, gated syscalls
- `../../references/sails-header-wire-format.md` — interface ID stability, entry ID derivation
- `../../references/sails-idl-v2-syntax.md` — IDL v2 annotations
- `../../assets/architecture-template.md`
- `../../references/vara-domain-overview.md`
- `../../references/sails-program-and-service-architecture.md`
- `../../references/gear-messaging-and-replies.md`

Write the result to `docs/plans/YYYY-MM-DD-<topic>-architecture.md`.

## Architecture Decisions Specific to Ethexe

### Transport Strategy

The architecture must name the transport per service and per method:

| Pattern | When to use |
|---------|-------------|
| Dual transport (default `#[export]`) | Methods callable from both Gear programs and EVM |
| Scale-only (`#[export(scale)]`) | Internal program-to-program calls, no EVM exposure needed |
| Ethabi-only (`#[export(ethabi)]`) | Methods only meaningful from EVM side |
| Payable (`#[export(ethabi, payable)]`) | Methods that accept value — requires ethabi |

Document the transport choice per method in the architecture artifact. Dual transport is the default but not always desirable — scale-only methods reduce the ABI surface.

### Payable Design

- Which methods accept value? Name each one.
- What happens to received value? (stored in program, forwarded, refunded on error?)
- Non-payable methods panic if value > 0 — is this acceptable for all non-payable paths?
- Constructors can also be payable — document if the program requires initial funding.

### Event Model

Decide between:
- `emit_event()` — standard Gear event (visible to Gear tooling, explorers)
- `emit_eth_event()` — Ethereum-style event (visible to EVM tooling, indexed topics)
- Both — if the same event must be visible to both ecosystems (requires two separate emissions)

For `emit_eth_event()`:
- Which fields are `#[indexed]`? (max 3 per variant, these become topics)
- Are any reserved variant names used? (forbidden list in reference)
- Is the event inventory aligned with what `sails-sol-gen` will produce in the Solidity interface?

### Solidity Interface

`sails-sol-gen` generates Solidity contract interfaces from the IDL. Architecture must consider:
- Will EVM consumers use the generated Solidity interface directly?
- Do method names, parameter types, and return types map cleanly to Solidity types?
- Are `payable` and `indexed` annotations in the IDL correct for the generated interface?

### Gated Syscalls

Three syscalls are unavailable under ethexe:
- `Syscall::signal_from()` — no signal handling
- `Syscall::signal_code()` — no signal handling
- `Syscall::system_reserve_gas()` — no system gas reservation

If the design depends on signals or system gas reservation, it cannot run under ethexe.

### Workspace Structure

Ethexe apps use a separate workspace (`rs/ethexe/` in the Sails repo). The architecture must name:
- Whether this is a new ethexe workspace or an addition to an existing one
- The dependency pattern: `sails-rs = { ..., features = ["ethexe"] }` for deps, build-deps, and dev-deps
- Whether the build script needs `features = ["ethexe", "wasm-builder"]`

## Review Checklist

- Is the transport strategy (scale/ethabi/dual) explicit per method?
- Are payable methods named, and is value handling documented?
- Is the event model clear (Gear events vs eth events vs both)?
- Are `#[indexed]` fields chosen and within the 3-field limit?
- Are there any signal or system_reserve_gas dependencies? (incompatible)
- Are service names PascalCase and free of Solidity reserved keywords?
- Is interface ID stability considered for contract evolution?
- Does the Solidity interface generation produce the expected ABI?
- Are type requirements met? (types in ethabi methods must be ABI-encodable)

## Guardrails

- If the spec is missing, stop and create it first.
- Do not design around signals or system gas reservation — they are gated out.
- Do not assume all methods need dual transport — name the strategy per method.
- Do not exceed 3 `#[indexed]` fields per event variant.
- Do not use reserved event variant names.
- Keep implementation detail out of the architecture note unless it changes the public contract.
- Route implementation to `../sails-ethexe-implementer/SKILL.md` after architecture approval.

Related in Design