Docs/Reference/Signing

Signing

How brand wallets sign issuance, redemption, and admin messages before anyone can submit them.

Domain#

The signature is bound to Loyfin, one chain, and one verifying contract.

Domain and Issuance typetypescript
const domain = {
  name: "Loyfin",
  version: "1",
  chainId: 8453,
  verifyingContract: loyfinFactoryAddress
};

const types = {
  Metadata: [
    { name: "loyaltyId", type: "bytes32" },
    { name: "name", type: "string" },
    { name: "symbol", type: "string" },
    { name: "media", type: "string" },
    { name: "description", type: "string" },
    { name: "contractURI", type: "string" },
    { name: "tokenURI", type: "string" }
  ],
  Issuance: [
    { name: "issuer", type: "address" },
    { name: "to", type: "address" },
    { name: "loyaltyId", type: "bytes32" },
    { name: "amount", type: "uint256" },
    { name: "expiresAt", type: "uint256" },
    { name: "deadline", type: "uint256" },
    { name: "nonce", type: "bytes32" },
    { name: "chainId", type: "uint256" },
    { name: "verifyingContract", type: "address" },
    { name: "operationHash", type: "bytes32" },
    { name: "metadata", type: "Metadata" },
    { name: "data", type: "bytes" }
  ]
};

Issuance type#

Issuance signatures include metadata because the first tokenization can create the Loyalty Token. Issuance and redemption signatures also include deadline; 0 means the signed action does not expire.

Redemption type#

Redemption typetypescript
const types = {
  Redemption: [
    { name: "issuer", type: "address" },
    { name: "from", type: "address" },
    { name: "loyaltyId", type: "bytes32" },
    { name: "amount", type: "uint256" },
    { name: "expiresAt", type: "uint256" },
    { name: "deadline", type: "uint256" },
    { name: "nonce", type: "bytes32" },
    { name: "chainId", type: "uint256" },
    { name: "verifyingContract", type: "address" },
    { name: "operationHash", type: "bytes32" },
    { name: "data", type: "bytes" }
  ]
};