app.gainforest.wallet.primary

gainforest.earth

{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "main": {
      "description": "An account's canonical donation wallet (personal profile or organization): a Splits SmartVault (ERC-4337 passkey multisig) whose address is derived deterministically with CREATE2 from the account DID and the founding signer set. Because owner, signers, threshold, and the salt scheme are all recorded here, anyone can recompute SmartVaultFactory.getAddress(...) and verify that `address` really belongs to this account — the derivation is the proof; no signature is needed. Fixed rkey `self`: one canonical wallet per account. While no code exists at the address and it holds no funds, the signer set and threshold may still change (the address is re-derived); once the vault is deployed on-chain this record is frozen and changes happen on-chain. Succeeds the legacy `app.gainforest.wallet.splitsVault` collection: records are read from both and migrated here on their next write.",
      "key": "literal:self",
      "record": {
        "properties": {
          "address": {
            "description": "Predicted deterministic vault address (0x…, 20 bytes).",
            "type": "string"
          },
          "chainId": {
            "description": "EVM chain id the donation flow settles on (the address is identical on every chain where the factory is deployed).",
            "type": "integer"
          },
          "createdAt": {
            "format": "datetime",
            "type": "string"
          },
          "factory": {
            "description": "SmartVaultFactory address the prediction was made against.",
            "type": "string"
          },
          "name": {
            "description": "Plain-language wallet label.",
            "maxGraphemes": 80,
            "maxLength": 800,
            "type": "string"
          },
          "owner": {
            "description": "The vault's Ownable superuser slot. Always the zero address: only the signer set controls the vault.",
            "type": "string"
          },
          "saltScheme": {
            "description": "Versioned salt derivation label; the CREATE2 salt is keccak256(saltScheme + ':' + account DID).",
            "type": "string"
          },
          "signers": {
            "description": "Founding signer set, in derivation order — a CREATE2 input.",
            "items": {
              "ref": "#passkeySigner",
              "type": "ref"
            },
            "minLength": 1,
            "type": "array"
          },
          "threshold": {
            "description": "Number of distinct passkey approvals required per operation (m-of-n). A CREATE2 input — changing it re-derives the address.",
            "maximum": 255,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "address",
          "factory",
          "chainId",
          "owner",
          "threshold",
          "saltScheme",
          "signers",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    },
    "passkeySigner": {
      "properties": {
        "addedAt": {
          "format": "datetime",
          "type": "string"
        },
        "credentialId": {
          "description": "WebAuthn credential id (base64url) so the member's browser can find the passkey again.",
          "type": "string"
        },
        "kind": {
          "enum": [
            "passkey"
          ],
          "type": "string"
        },
        "label": {
          "description": "Plain-language signer label.",
          "maxGraphemes": 80,
          "maxLength": 800,
          "type": "string"
        },
        "memberDid": {
          "description": "DID of the account member this passkey belongs to.",
          "format": "did",
          "type": "string"
        },
        "publicKeyX": {
          "description": "32-byte hex, secp256r1 public key X coordinate (SmartVault Signer slot1).",
          "type": "string"
        },
        "publicKeyY": {
          "description": "32-byte hex, secp256r1 public key Y coordinate (SmartVault Signer slot2).",
          "type": "string"
        }
      },
      "required": [
        "kind",
        "publicKeyX",
        "publicKeyY",
        "credentialId",
        "memberDid",
        "addedAt"
      ],
      "type": "object"
    }
  },
  "id": "app.gainforest.wallet.primary",
  "lexicon": 1
}

Validate Record

Validate a record against app.gainforest.wallet.primary

Validation Options
Treat any remaining unresolved references as valid

Metadata

DID
did:plc:qoti4acfmc5wg6zzmtix6hse
CID
bafyreiaelezzvhss3di4brdp7clnpgwv2l66vmgrbalelj4h2rdzb3atzi
Indexed At
2026-07-17 15:04 UTC
AT-URI
at://did:plc:qoti4acfmc5wg6zzmtix6hse/com.atproto.lexicon.schema/app.gainforest.wallet.primary

Version History (2 versions)

Similar Lexicons

Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.

  • LEGACY — superseded by app.gainforest.wallet.primary; existing records are still read and are migrated to the primary collection on their next write. An organization's shared donation wallet: a Splits SmartVault (ERC-…

Lexicon Garden

@