Docs/Objects/Action objects
Action objects
The exact signed issuance and redemption payloads brands create before submission.
SignedOperation#
| Field | Type | Required | Meaning |
|---|---|---|---|
id | string | yes | Cursor ID and operation identifier. |
kind | issuance | redemption | yes | Which contract function this action targets. |
status | pending | submitted | mined | rejected | cancelled | yes | Wire status. The UI labels pending as Created and mined as Completed. |
verifyingContract | address | yes | Factory address to submit. |
issuer | address | yes | Brand signer. |
holder | address | yes | Recipient for issuance or holder for redemption. |
deadline | uint256 string | yes | Execution deadline copied into the contract call. 0 means no deadline. |
metadata | Metadata | null | yes | Present on issuance operations, null on redemptions. |
signature | hex bytes | yes | Brand signature for the exact action fields. |
relayTxHash | bytes32 | null | yes | Set after a relayer submits the transaction. |
{
"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",
"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#
| Field | Type | Required | Meaning |
|---|---|---|---|
issuer | address | yes | Brand wallet that signs the action. |
to | address | yes | Customer wallet receiving the tokenized loyalty balance. |
loyaltyId | bytes32 | yes | Brand-scoped program ID. |
amount | uint256 string | yes | Amount of offchain loyalty value to tokenize. Must be greater than zero. |
expiresAt | uint256 string | yes | Use 0 for no expiry, or a Unix timestamp for an expiring bucket. |
deadline | uint256 string | yes | Last Unix timestamp when the issuance can be submitted. Use 0 for no execution deadline. |
nonce | bytes32 | yes | Unique per issuer. Replays are rejected. |
chainId | uint256 string | yes | Expected chain ID. Production uses Base mainnet 8453; non-production uses Base Sepolia 84532. |
verifyingContract | address | yes | The Loyfin factory that will execute the action. |
operationHash | bytes32 | optional | Brand reference hash for correlating this action with an internal database row. Defaults to zero bytes when omitted. |
metadata | Metadata | yes | Program metadata. Required for issuance because the first issuance can create the program. |
data | hex bytes | optional | Brand-defined data. Defaults to 0x. Max 2048 bytes. |
RedemptionAction#
| Field | Type | Required | Meaning |
|---|---|---|---|
issuer | address | yes | Brand wallet that signs the redemption. |
from | address | yes | Customer wallet whose tokenized loyalty balance is redeemed. |
loyaltyId | bytes32 | yes | Brand-scoped program ID. |
amount | uint256 string | yes | Tokenized loyalty amount to redeem. Must be greater than zero. |
expiresAt | uint256 string | yes | The exact bucket to redeem. Use 0 for non-expiring rewards. |
deadline | uint256 string | yes | Last Unix timestamp when the redemption can be submitted. Use 0 for no execution deadline. |
nonce | bytes32 | yes | Unique per issuer. Replays are rejected. |
chainId | uint256 string | yes | Expected chain ID. Production uses Base mainnet 8453; non-production uses Base Sepolia 84532. |
verifyingContract | address | yes | The Loyfin factory that will execute the action. |
operationHash | bytes32 | optional | Brand reference hash for correlating this action with an internal database row. Defaults to zero bytes when omitted. |
data | hex bytes | optional | Brand-defined fulfillment data. Defaults to 0x. Max 2048 bytes. |
Metadata#
| Field | Type | Required | Meaning |
|---|---|---|---|
loyaltyId | bytes32 | yes | Must match the action loyaltyId. |
name | string | yes | Customer-facing program name. Max 96 UTF-8 bytes. |
symbol | string | yes | Short program ticker or label. Max 24 UTF-8 bytes. |
media | string | yes | Default artwork URL. Max 512 UTF-8 bytes. |
description | string | optional | Program description. Empty string is allowed. Max 1024 UTF-8 bytes. |
contractURI | string | optional | Collection-level metadata override. Empty string uses generated metadata. Max 512 UTF-8 bytes. |
tokenURI | string | optional | Token metadata override. Empty string uses generated metadata. Max 512 UTF-8 bytes. |