app.gainforest.wallet.pendingSend

gainforest.earth

Documentation

A transfer from the account's donation wallet (app.gainforest.wallet.primary) that still needs more passkey approvals. Multi-approval wallets (threshold > 1) collect approvals asynchronously: the initiator stores the exact unsigned ERC-4337 UserOperation here together with their own approval, remaining passkey holders approve from their own devices, and the final approver signs the full userOp hash which submits the operation on-chain and deletes this record. Every stored approval is a WebAuthn assertion over the operation's LIGHT hash (the SmartVault scheme where all but the last signer sign a gas-bounded subset of the operation). Approvals are verified off-chain before being stored and re-verified before submission, so a hand-crafted record cannot forge or brick a transfer. Fixed rkey `self`: one pending transfer per wallet at a time.

main record

A transfer from the account's donation wallet (app.gainforest.wallet.primary) that still needs more passkey approvals. Multi-approval wallets (threshold > 1) collect approvals asynchronously: the initiator stores the exact unsigned ERC-4337 UserOperation here together with their own approval, remaining passkey holders approve from their own devices, and the final approver signs the full userOp hash which submits the operation on-chain and deletes this record. Every stored approval is a WebAuthn assertion over the operation's LIGHT hash (the SmartVault scheme where all but the last signer sign a gas-bounded subset of the operation). Approvals are verified off-chain before being stored and re-verified before submission, so a hand-crafted record cannot forge or brick a transfer. Fixed rkey `self`: one pending transfer per wallet at a time.

Record Key literal:self Fixed literal value

Properties

amountUnits string Required

Raw token units as a decimal string. Redundant with callData, for display.

approvals array of ref #approval Required

Light-hash approvals collected so far, in signing order (at most threshold − 1; the final approval is never stored).

createdAt string datetime Required

An RFC 3339 formatted timestamp.

createdBy string did Required

DID of the signed-in account that started the transfer.

hash string Required

Full EntryPoint v0.7 userOp hash — signed by the final approver.

lightHash string Required

SmartVault light userOp hash — signed by every earlier approver.

threshold integer Required

Approval requirement of the wallet when this transfer was started; a mismatch with the current wallet invalidates the transfer.

minimum: 2maximum: 255
to string Required

Recipient address (0x…, 20 bytes). Redundant with callData, for display; the server re-derives it from the operation.

token string Required

What is being sent.

Allowed: ETH, USDC, USDT
userOp ref #userOp Required

No description available.

View raw schema
{
  "description": "A transfer from the account's donation wallet (app.gainforest.wallet.primary) that still needs more passkey approvals. Multi-approval wallets (threshold > 1) collect approvals asynchronously: the initiator stores the exact unsigned ERC-4337 UserOperation here together with their own approval, remaining passkey holders approve from their own devices, and the final approver signs the full userOp hash which submits the operation on-chain and deletes this record. Every stored approval is a WebAuthn assertion over the operation's LIGHT hash (the SmartVault scheme where all but the last signer sign a gas-bounded subset of the operation). Approvals are verified off-chain before being stored and re-verified before submission, so a hand-crafted record cannot forge or brick a transfer. Fixed rkey `self`: one pending transfer per wallet at a time.",
  "key": "literal:self",
  "record": {
    "properties": {
      "amountUnits": {
        "description": "Raw token units as a decimal string. Redundant with callData, for display.",
        "type": "string"
      },
      "approvals": {
        "description": "Light-hash approvals collected so far, in signing order (at most threshold − 1; the final approval is never stored).",
        "items": {
          "ref": "#approval",
          "type": "ref"
        },
        "type": "array"
      },
      "createdAt": {
        "format": "datetime",
        "type": "string"
      },
      "createdBy": {
        "description": "DID of the signed-in account that started the transfer.",
        "format": "did",
        "type": "string"
      },
      "hash": {
        "description": "Full EntryPoint v0.7 userOp hash — signed by the final approver.",
        "type": "string"
      },
      "lightHash": {
        "description": "SmartVault light userOp hash — signed by every earlier approver.",
        "type": "string"
      },
      "threshold": {
        "description": "Approval requirement of the wallet when this transfer was started; a mismatch with the current wallet invalidates the transfer.",
        "maximum": 255,
        "minimum": 2,
        "type": "integer"
      },
      "to": {
        "description": "Recipient address (0x…, 20 bytes). Redundant with callData, for display; the server re-derives it from the operation.",
        "type": "string"
      },
      "token": {
        "description": "What is being sent.",
        "enum": [
          "ETH",
          "USDC",
          "USDT"
        ],
        "type": "string"
      },
      "userOp": {
        "ref": "#userOp",
        "type": "ref"
      }
    },
    "required": [
      "token",
      "to",
      "amountUnits",
      "userOp",
      "hash",
      "lightHash",
      "threshold",
      "approvals",
      "createdBy",
      "createdAt"
    ],
    "type": "object"
  },
  "type": "record"
}
approval object

A WebAuthn assertion over the light userOp hash by one enrolled passkey signer.

Properties

addedAt string datetime Required

An RFC 3339 formatted timestamp.

addedBy string did Required

DID of the signed-in account that added this approval.

authenticatorData string Required

Authenticator data of the assertion, hex.

challengeIndex integer Required

Index of "challenge" in clientDataJSON.

clientDataJSON string Required

Client data JSON of the assertion.

credentialId string Required

WebAuthn credential id of the enrolled signer that approved.

r string Required

secp256r1 signature r, decimal string.

s string Required

secp256r1 signature s (low-s), decimal string.

typeIndex integer Required

Index of "type" in clientDataJSON.

View raw schema
{
  "description": "A WebAuthn assertion over the light userOp hash by one enrolled passkey signer.",
  "properties": {
    "addedAt": {
      "format": "datetime",
      "type": "string"
    },
    "addedBy": {
      "description": "DID of the signed-in account that added this approval.",
      "format": "did",
      "type": "string"
    },
    "authenticatorData": {
      "description": "Authenticator data of the assertion, hex.",
      "type": "string"
    },
    "challengeIndex": {
      "description": "Index of \"challenge\" in clientDataJSON.",
      "type": "integer"
    },
    "clientDataJSON": {
      "description": "Client data JSON of the assertion.",
      "type": "string"
    },
    "credentialId": {
      "description": "WebAuthn credential id of the enrolled signer that approved.",
      "type": "string"
    },
    "r": {
      "description": "secp256r1 signature r, decimal string.",
      "type": "string"
    },
    "s": {
      "description": "secp256r1 signature s (low-s), decimal string.",
      "type": "string"
    },
    "typeIndex": {
      "description": "Index of \"type\" in clientDataJSON.",
      "type": "integer"
    }
  },
  "required": [
    "credentialId",
    "authenticatorData",
    "clientDataJSON",
    "challengeIndex",
    "typeIndex",
    "r",
    "s",
    "addedBy",
    "addedAt"
  ],
  "type": "object"
}
userOp object

The unsigned ERC-4337 v0.7 UserOperation, exactly as it will be submitted. Gas and fee fields are decimal strings.

Properties

callData string Required

vault.execute(...) calldata — exactly one ETH/USDC/USDT transfer.

callGasLimit string Required

No description available.

factory string Optional

SmartVaultFactory address — present only while the vault is undeployed.

factoryData string Optional

createAccount calldata deploying the vault on first send.

maxFeePerGas string Required

No description available.

maxPriorityFeePerGas string Required

No description available.

nonce string Required

EntryPoint nonce at preparation time; consumed nonces invalidate the transfer.

preVerificationGas string Required

No description available.

sender string Required

The wallet's vault address.

verificationGasLimit string Required

No description available.

View raw schema
{
  "description": "The unsigned ERC-4337 v0.7 UserOperation, exactly as it will be submitted. Gas and fee fields are decimal strings.",
  "properties": {
    "callData": {
      "description": "vault.execute(...) calldata — exactly one ETH/USDC/USDT transfer.",
      "type": "string"
    },
    "callGasLimit": {
      "type": "string"
    },
    "factory": {
      "description": "SmartVaultFactory address — present only while the vault is undeployed.",
      "type": "string"
    },
    "factoryData": {
      "description": "createAccount calldata deploying the vault on first send.",
      "type": "string"
    },
    "maxFeePerGas": {
      "type": "string"
    },
    "maxPriorityFeePerGas": {
      "type": "string"
    },
    "nonce": {
      "description": "EntryPoint nonce at preparation time; consumed nonces invalidate the transfer.",
      "type": "string"
    },
    "preVerificationGas": {
      "type": "string"
    },
    "sender": {
      "description": "The wallet's vault address.",
      "type": "string"
    },
    "verificationGasLimit": {
      "type": "string"
    }
  },
  "required": [
    "sender",
    "nonce",
    "callData",
    "callGasLimit",
    "verificationGasLimit",
    "preVerificationGas",
    "maxFeePerGas",
    "maxPriorityFeePerGas"
  ],
  "type": "object"
}

Lexicon Garden

@