Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions .github/workflows/publish-crates.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: Publish crates.io packages

on:
workflow_dispatch:
inputs:
tag:
description: Existing release tag, such as v0.2.0
required: true
type: string
resume:
description: Skip versions that already exist after a reviewed partial publication
required: false
default: false
type: boolean

permissions:
contents: read

concurrency:
group: crates-io-${{ inputs.tag }}
cancel-in-progress: false

jobs:
publish:
name: Publish packages
runs-on: ubuntu-latest
environment: crates-io
permissions:
contents: read
id-token: write

steps:
- name: Check out the release tag
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
with:
ref: ${{ inputs.tag }}
fetch-depth: 0

- name: Install Rust 1.90
uses: actions-rust-lang/setup-rust-toolchain@166cdcfd11aee3cb47222f9ddb555ce30ddb9659 # v1
with:
toolchain: 1.90.0
override: true

- name: Verify the tag and main branch
shell: bash
env:
RELEASE_TAG: ${{ inputs.tag }}
run: |
workspace_version="$(awk -F ' *= *' '$1 == "version" { gsub(/"/, "", $2); print $2; exit }' Cargo.toml)"
test "$RELEASE_TAG" = "v$workspace_version"
test "$(git rev-parse HEAD)" = "$(git rev-parse "${RELEASE_TAG}^{commit}")"
git merge-base --is-ancestor HEAD origin/main
test -z "$(git status --porcelain)"

- name: Request a crates.io token
id: crates_io_auth
uses: rust-lang/crates-io-auth-action@c6f97d42243bad5fab37ca0427f495c86d5b1a18 # v1.0.5

- name: Publish packages
env:
ALLOW_EXISTING: ${{ inputs.resume }}
CARGO_REGISTRY_TOKEN: ${{ steps.crates_io_auth.outputs.token }}
PUBLISH_CRATES_CONFIRM: ${{ inputs.tag }}
RELEASE_TAG: ${{ inputs.tag }}
run: ./scripts/publish-crates.sh "$RELEASE_TAG"
43 changes: 36 additions & 7 deletions .github/workflows/rust-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ jobs:
. -> target

- name: cargo clippy -D warnings
run: cargo clippy --all --all-targets -- -D warnings
run: cargo clippy --workspace --all-targets --all-features --locked -- -D warnings

check:
name: Cargo check
Expand All @@ -81,10 +81,10 @@ jobs:
. -> target

- name: cargo check
run: cargo check
run: cargo check --workspace --locked

- name: cargo check --all --all-targets
run: cargo check --all --all-targets
- name: cargo check all targets
run: cargo check --workspace --all-targets --all-features --locked

test:
name: Tests + doctests
Expand All @@ -104,8 +104,37 @@ jobs:
workspaces: |
. -> target

- name: cargo test --all --all-targets
run: cargo test --all --all-targets
- name: cargo test all targets
run: cargo test --workspace --all-targets --all-features --locked

- name: cargo test --doc
run: cargo test --doc --all
run: cargo test --doc --workspace --all-features --locked

- name: cargo doc
env:
RUSTDOCFLAGS: -D warnings
run: cargo doc --workspace --all-features --no-deps --locked

msrv:
name: Rust 1.90 and package archives
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install Rust 1.90
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: 1.90.0
override: true

- name: Cache cargo
uses: Swatinem/rust-cache@v2
with:
workspaces: |
. -> target

- name: Check the minimum Rust version
run: cargo check --workspace --all-targets --all-features --locked

- name: Test package archives
run: ./scripts/check-packages.sh
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
target/
Cargo.lock
.DS_Store

# Local configuration and credentials.
Expand Down
31 changes: 20 additions & 11 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,34 @@ The format is based on [Keep a Changelog], and this project adheres to

## [Unreleased]

## [0.2.0-rc.1] - 2026-08-27

### Added

- Add `sui-move`: core Move-shaped type layer (traits, abilities, decoding).
- Keep Move framework declarations out of the `sui-move` core so generated package bindings define
- Add `talus-sui-move`: core layer for Move types, traits, abilities, and decoding.
- Keep Move framework declarations out of the `talus-sui-move` core so generated package bindings define
`UID`, `Coin<T>`, `Balance<T>`, containers, and other framework shapes.
- Add `sui-move-derive` and the `sui-move` `derive` feature for defining Move-shaped structs via macros.
- Add `sui-move-call`: typed Move call descriptions (`CallSpec`) plus typed wrappers for Sui `Input` kinds (pure, immutable/owned, shared, receiving).
- Add `sui-move-ptb`: minimal PTB builder that consumes `CallSpec` and produces `ProgrammableTransaction`.
- Add `sui-move-runtime`: cursor-driven runtime for the Read → Tx → Commit mental model:
- runtime-owned handles (`Object<T>`) that auto-update from transaction effects,
- explicit input-mode views (`shared_immutable`, `shared_mutable`, `receiving`),
- finality-aware `Receipt` plus recovery hooks (`Runtime::sync_transaction`, `Read::refresh*`),
- ergonomic transaction macro (`sui_move_runtime::tx!`).
- Add `sui-move-codegen`: fetch + normalize package metadata (`NormalizedPackage`) and render typed Rust bindings (Move-shaped types + `CallSpec` builders).
- Add `talus-sui-move-derive` and the `talus-sui-move` `derive` feature for defining Rust structs
that represent Move structs.
- Add `talus-sui-move-call`: typed Move call descriptions (`CallSpec`) plus typed wrappers for Sui `Input` kinds (pure, immutable/owned, shared, receiving).
- Add `talus-sui-move-ptb`: minimal PTB builder that consumes `CallSpec` and produces `ProgrammableTransaction`.
- Add `talus-sui-move-runtime`: runtime with a cursor for the Read → Tx → Commit mental model:
- handles owned by the runtime (`Object<T>`) that update from transaction effects,
- explicit input mode views (`shared_immutable`, `shared_mutable`, `receiving`),
- `Receipt` values that record finality plus recovery hooks (`Runtime::sync_transaction`,
`Read::refresh*`),
- ergonomic transaction macro (`talus_sui_move_runtime::tx!`).
- Add `talus-sui-move-codegen`: fetch and normalize package metadata (`NormalizedPackage`) and
render typed Rust bindings for Move types and `CallSpec` builders.

### Changed

- Publish the workspace under the `talus-sui-move-*` crates.io package names owned by Talus and use
the matching `talus_sui_move*` Rust library names.
- Generated package scopes now resolve type identity by module and datatype while calls continue to
use the current package address.

[Keep a Changelog]: https://keepachangelog.com/en/1.1.0/
[Semantic Versioning]: https://semver.org/spec/v2.0.0.html
[Unreleased]: https://github.com/Talus-Network/move-binding/compare/v0.2.0-rc.1...HEAD
[0.2.0-rc.1]: https://github.com/Talus-Network/move-binding/compare/v0.1.0...v0.2.0-rc.1
23 changes: 4 additions & 19 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Thank you for considering contributing to this project. These guidelines keep th
and preserve the structure of the workspace.

This workspace is a set of layered Rust crates for typed Sui Move interactions. Changes should
preserve the layer boundaries described in `MODEL.md`: low-level Move type modeling should not
preserve the layer boundaries described in `MODEL.md`: foundational Move type modeling should not
depend on transaction building or runtime behavior, and runtime code should not hide the
Read -> Tx -> Commit boundary.

Expand All @@ -26,7 +26,7 @@ code.
4. Add tests for new functionality or behavior changes.
5. Do not introduce `unsafe` Rust unless the safety invariant is documented and reviewed
explicitly.
6. Update documentation to complement user-facing code changes.
6. Update documentation to complement changes to the public API.
7. Update `CHANGELOG.md` for externally visible changes.

## Local Checks
Expand Down Expand Up @@ -56,7 +56,7 @@ CI runs formatting and clippy strictly, plus stable Rust checks and tests.
- Ensure your branch is up to date with `main`.
- Add or update tests for public API behavior, generated output, transaction construction, and
runtime cursor/effects handling.
- Update the relevant crate README when changing user-facing APIs.
- Update the relevant crate README when changing public APIs.
- A maintainer will review and may request changes before merge.

## Writing Commit Messages
Expand All @@ -67,29 +67,14 @@ CI runs formatting and clippy strictly, plus stable Rust checks and tests.
- Use imperative tone, for example `fix: reject duplicate object inputs` instead of
`fix: rejects duplicate object inputs`.
- Reference a ticket if applicable.
- Add context and an explanation for non-trivial contributions.
- Add context and an explanation for complex contributions.

## Dependencies

Prefer crates.io dependencies with explicit versions. Git dependencies are acceptable only when
they are intentional and should also include a version requirement when the crate exists on
crates.io, so the workspace can be packaged predictably.

## Publishing

Publish crates in dependency order:

1. `sui-move-derive`
2. `sui-move`
3. `sui-move-call`
4. `sui-move-ptb`
5. `sui-move-runtime`
6. `sui-move-codegen`

Before the first crates.io release, `cargo package --workspace` is expected to fail for crates
whose normal dependencies are not published yet. Package each crate after its normal dependencies
are available in the registry.

## License

By contributing, you agree that your contributions will be licensed under the same license as the
Expand Down
Loading
Loading