Skip to content

feat(verifier): implement POST /transfer and GET /verify/:hash/history on Stellar - #961

Merged
mftee merged 2 commits into
CodeGirlsInc:mainfrom
mijinummi:feat/stellar-ownership-transfer
Jul 24, 2026
Merged

feat(verifier): implement POST /transfer and GET /verify/:hash/history on Stellar#961
mftee merged 2 commits into
CodeGirlsInc:mainfrom
mijinummi:feat/stellar-ownership-transfer

Conversation

@mijinummi

Copy link
Copy Markdown
Contributor

📝 Summary

Implements POST /transfer and GET /verify/:hash/history in the Rust verifier (#856) to record land document ownership transfers permanently on the Stellar blockchain via ManageData entries and maintain an indexed transfer history.

Closes #856

🛠️ Changes Introduced

  • contract/src/models/transfer.rs:
    • Added request/response structs: TransferRequest, TransferPayload, TransferResponse, TransferRecord, and TransferHistoryResponse.
  • contract/src/stellar/transfer.rs:
    • Implemented key generation helper build_transfer_key() ensuring keys comply with Stellar's 64-byte ManageData limits (transfer_ prefix for initial, tr_ + counter suffix for subsequent transfers).
    • Added record_transfer_on_stellar() to serialize transfer payloads and record ManageData transactions on Stellar.
  • contract/src/handlers/transfer.rs:
    • POST /transfer: Validates document anchor existence in Redis (returns 404 if unanchored), writes transfer record on Stellar, updates the cached owner in Redis, and increments the document's monotonic transfer counter.
    • GET /verify/:hash/history: Validates anchor existence and aggregates transfer history records sequentially in chronological order.
  • contract/src/lib.rs:
    • Wired /transfer and /verify/{hash}/history routes into the Actix web service configuration.

🧪 How to Test

  1. Verify Unanchored Transfer Rejection (404):
    curl -X POST http://localhost:8080/transfer \
      -H "Content-Type: application/json" \
      -d '{
        "hash": "nonexistent_hash_123",
        "fromPublicKey": "GXXX...",
        "toPublicKey": "GYYY...",
        "reason": "sale"
      }'

@vercel

vercel Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

@mijinummi is attempting to deploy a commit to the Mftee's projects Team on Vercel.

A member of the Team first needs to authorize it.

POST /transfer and GET /verify/:hash/history are already fully
implemented on main (record_transfer, verify_document_history in
lib.rs), using axum and the project's existing AppState/cache/stellar
abstractions, and are already wired into the Router.

This PR's own implementation was written against actix-web instead of
axum, referenced an errors::AppError and state::AppState that don't
exist anywhere in the codebase, and declared a duplicate `mod stellar;`
colliding with the existing `pub mod stellar;`. None of it was reachable
from main.rs (configure_routes was never called), and it broke
`cargo fmt`/`cargo build` outright because contract/src/handlers.rs
was never created for the `mod handlers;` declaration to resolve.

Removing it since the functionality it targets already exists and
works; this leaves the PR as a no-op against main rather than
reimplementing already-shipped code against the wrong framework.
@mftee
mftee merged commit c518f0b into CodeGirlsInc:main Jul 24, 2026
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[CT-03] Implement POST /transfer in Rust verifier — record ownership transfer on Stellar

2 participants