Skip to main content

types — wire / transfer

Package types defines the shared data model. Import path: github.com/NickCarducci/Shyware-SDK/shywire/types


AssetRecord

An asset registered by the operator. shyware does not issue assets — it provides the anonymous transfer layer for an existing asset (e.g. USDC, a sovereign token).

type AssetRecord struct {
AssetID string `json:"asset_id"` // operator-defined identifier (e.g. "usdc")
Name string `json:"name"` // human-readable label
Decimals uint8 `json:"decimals"` // precision; 6 for USDC-equivalent
TotalSupply int64 `json:"total_supply"` // TotalMinted - TotalBurned; enforced by state
CreatedAt int64 `json:"created_at"`
}

AssetID is the canonical key. Choose a short, stable identifier — it appears in every TransferRecord and cannot be changed after registration.


TransferRecord — List 1

An anonymous transfer. Contains the amount and asset, never the sender or recipient identity.

// TransferRecord is List 1 — an anonymous transfer with no identity field.
//
// transfer_id = H(TransferNonce) is random and unlinkable to the nullifier.
// Amount is plaintext in this scaffold; the production circuit replaces it with a
// Pedersen commitment (see TODO(circuit) in tx/tx.go).
type TransferRecord struct {
SubmissionID string `json:"submission_id"` // H(TransferNonce) — no identity encoded
AssetID string `json:"asset_id"`
Amount int64 `json:"amount"` // TODO(circuit): AmountCommitment []byte
Timestamp int64 `json:"timestamp"`
Height int64 `json:"height"`
}

SubmissionID is the only receipt the sender holds. It can be used to prove a transfer occurred (the record exists in List 1) without revealing the sender's identity.


ParticipantRecord — List 2

A participation record. Contains the nullifier (a commitment to identity) never the amount.

// ParticipantRecord is List 2 — a participation record with no amount field.
//
// nullifier = H(wallet_address, transfer_id) prevents double-spend identically to how
// the voting protocol's ZK nullifier prevents double-voting.
type ParticipantRecord struct {
SubmissionID string `json:"submission_id"`
IdentityHash string `json:"identity_hash"` // nullifier = H(wallet_address, transfer_id)
Height int64 `json:"height"`
}

IdentityHash is the nullifier. It is stored in List 2 and checked for uniqueness on every transfer. A duplicate nullifier causes the transaction to be rejected.


AccountRecord

The on-chain balance for an account. The account is identified by a commitment — the wallet address itself never appears on-chain.

// AccountRecord holds the on-chain balance for an account.
// In the production circuit, Balance is replaced with a BalanceCommitment
// (Pedersen commitment) so balances are hidden while conservation is provable.
type AccountRecord struct {
AccountCommitment string `json:"account_commitment"` // H(wallet_address) — public identifier
AssetID string `json:"asset_id"`
Balance int64 `json:"balance"` // TODO(circuit): BalanceCommitment []byte
UpdatedAt int64 `json:"updated_at"`
Height int64 `json:"height"`
}

One AccountRecord per (AccountCommitment, AssetID) pair. An account must be registered with TxTypeRegisterAccount before it can receive or send transfers.


SupplyRecord

Tracks the total minted and burned for an asset. Publicly queryable.

// SupplyRecord tracks total minted and burned for an asset.
// TotalSupply == TotalMinted - TotalBurned is enforced on every Mint and Burn tx.
type SupplyRecord struct {
AssetID string `json:"asset_id"`
TotalMinted int64 `json:"total_minted"`
TotalBurned int64 `json:"total_burned"`
TotalSupply int64 `json:"total_supply"` // invariant: TotalMinted - TotalBurned
UpdatedAt int64 `json:"updated_at"`
}

TotalSupply is the only quantity visible to the public. Individual balances are not queryable without operator credentials.


Error types

// Returned when a transfer would take sender.Balance below zero.
type ErrorInsufficientBalance struct {
AccountCommitment string
AssetID string
Have int64
Need int64
}

// Returned when a transfer references an unregistered asset.
type ErrorUnknownAsset struct {
AssetID string
}

// Returned when a nullifier has already been used (double-spend attempt).
type ErrorDuplicateTransfer struct {
IdentityHash string
}