Docs/Objects/Action objects

Action objects

The exact signed issuance and redemption payloads brands create before submission.

SignedOperation#

FieldTypeRequiredMeaning
idstringyesCursor ID and operation identifier.
kindissuance | redemptionyesWhich contract function this action targets.
statusrequires_holder_signature | pending | submitted | mined | rejected | cancelled | expiredyesWire status. The UI labels pending as Created and mined as Completed.
verifyingContractaddressyesFactory address to submit.
issueraddressyesBrand signer.
holderaddressyesRecipient for issuance or holder for redemption.
deadlineuint256 stringyesExecution deadline copied into the contract call. 0 means no deadline.
metadataMetadata | nullyesPresent on issuance operations, null on redemptions.
signaturehex bytesyesBrand signature for the exact action fields.
holderSignaturehex bytes | nullyesRecipient or holder authorization for dual-signature checkout operations.
signatureSchemelegacy | dualyesSelects issue/redeem or issueClaimable/redeemClaimable.
claimHashbytes32 | nullyesDerived EIP-712 digest used by the recipient or holder authorization in a dual-signature operation.
relayTxHashbytes32 | nullyesSet after a relayer submits the transaction.
SignedOperationjson
{
  "id": "128",
  "kind": "issuance",
  "status": "pending",
  "chainId": "8453",
  "verifyingContract": "0x3333333333333333333333333333333333333333",
  "issuer": "0x1111111111111111111111111111111111111111",
  "holder": "0x2222222222222222222222222222222222222222",
  "loyaltyId": "0x4242424242424242424242424242424242424242424242424242424242424242",
  "amount": "1000",
  "expiresAt": "0",
  "deadline": "0",
  "nonce": "0x7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a",
  "operationHash": "0x9999999999999999999999999999999999999999999999999999999999999999",
  "signature": "0xababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab",
  "holderSignature": "0xababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab",
  "signatureScheme": "dual",
  "claimHash": "0x9999999999999999999999999999999999999999999999999999999999999999",
  "data": "0x",
  "metadata": {
    "loyaltyId": "0x4242424242424242424242424242424242424242424242424242424242424242",
    "name": "Bloom Coffee Rewards",
    "symbol": "BLOOM",
    "media": "ipfs://bafy.../bloom.png",
    "description": "Rewards for Bloom Coffee customers.",
    "contractURI": "",
    "tokenURI": ""
  },
  "relayTxHash": null,
  "createdAt": "2026-06-20T10:15:00.000Z"
}

IssuanceAction#

FieldTypeRequiredMeaning
issueraddressyesBrand wallet that signs the action.
toaddresssessionCustomer wallet receiving tokenized loyalty value. Not part of the issuer-signed terms; add it with the recipient signature or collect it on checkout.
loyaltyIdbytes32yesBrand-scoped program ID.
amountuint256 stringyesAmount of offchain loyalty value to tokenize. Must be greater than zero.
expiresAtuint256 stringyesUse 0 for no expiry, or a Unix timestamp for an expiring bucket.
deadlineuint256 stringyesLast Unix timestamp when the issuance can be submitted. Use 0 for no execution deadline.
noncebytes32yesUnique per issuer. Replays are rejected.
chainIduint256 stringyesExpected chain ID. Loyfin uses Base 8453.
verifyingContractaddressyesThe Loyfin factory that will execute the action.
operationHashbytes32optionalBrand reference hash for correlating this action with an internal database row. Defaults to zero bytes when omitted.
metadataMetadatayesProgram metadata. Required for issuance because the first issuance can create the program.
datahex bytesoptionalBrand-defined data. Defaults to 0x. Max 2048 bytes.

RedemptionAction#

FieldTypeRequiredMeaning
issueraddressyesBrand wallet that signs the redemption.
fromaddresssessionCustomer wallet whose tokenized balance is burned. Not part of the issuer-signed terms; add it with the holder signature or collect it on checkout.
loyaltyIdbytes32yesBrand-scoped program ID.
amountuint256 stringyesTokenized loyalty amount to burn and reconcile offchain. Must be greater than zero.
expiresAtuint256 stringyesThe exact bucket to burn. Use 0 for non-expiring balances.
deadlineuint256 stringyesLast Unix timestamp when the redemption can be submitted. Use 0 for no execution deadline.
noncebytes32yesUnique per issuer. Replays are rejected.
chainIduint256 stringyesExpected chain ID. Loyfin uses Base 8453.
verifyingContractaddressyesThe Loyfin factory that will execute the action.
operationHashbytes32optionalBrand reference hash for correlating this action with an internal database row. Defaults to zero bytes when omitted.
datahex bytesoptionalBrand-defined fulfillment data. Defaults to 0x. Max 2048 bytes.

Metadata#

FieldTypeRequiredMeaning
loyaltyIdbytes32yesMust match the action loyaltyId.
namestringyesCustomer-facing program name. Max 96 UTF-8 bytes.
symbolstringyesShort program ticker or label. Max 24 UTF-8 bytes.
mediastringyesDefault artwork URL. Max 512 UTF-8 bytes.
descriptionstringoptionalProgram description. Empty string is allowed. Max 1024 UTF-8 bytes.
contractURIstringoptionalCollection-level metadata override. Empty string uses generated metadata. Max 512 UTF-8 bytes.
tokenURIstringoptionalToken metadata override. Empty string uses generated metadata. Max 512 UTF-8 bytes.
Loyfin is built onBase