app.gainforest.wallet.splitsVault

gainforest.earth

{
  "id": "app.gainforest.wallet.splitsVault",
  "defs": {
    "main": {
      "key": "literal:self",
      "type": "record",
      "record": {
        "type": "object",
        "required": [
          "address",
          "factory",
          "chainId",
          "owner",
          "threshold",
          "saltScheme",
          "signers",
          "createdAt"
        ],
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 800,
            "description": "Plain-language wallet label.",
            "maxGraphemes": 80
          },
          "owner": {
            "type": "string",
            "description": "The vault's Ownable superuser slot. Always the zero address: only the signer set controls the vault."
          },
          "address": {
            "type": "string",
            "description": "Predicted deterministic vault address (0x…, 20 bytes)."
          },
          "chainId": {
            "type": "integer",
            "description": "EVM chain id the donation flow settles on (the address is identical on every chain where the factory is deployed)."
          },
          "factory": {
            "type": "string",
            "description": "SmartVaultFactory address the prediction was made against."
          },
          "signers": {
            "type": "array",
            "items": {
              "ref": "#passkeySigner",
              "type": "ref"
            },
            "minLength": 1,
            "description": "Founding signer set, in derivation order — a CREATE2 input."
          },
          "createdAt": {
            "type": "string",
            "format": "datetime"
          },
          "threshold": {
            "type": "integer",
            "minimum": 1,
            "description": "Number of signer approvals required per operation."
          },
          "saltScheme": {
            "type": "string",
            "description": "Versioned salt derivation label; the CREATE2 salt is keccak256(saltScheme + ':' + organization DID)."
          }
        }
      },
      "description": "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-4337 passkey multisig) whose address is derived deterministically with CREATE2 from the organization 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 organization — the derivation is the proof; no signature is needed. Fixed rkey `self`: one canonical wallet per organization. While no code exists at the address the signer set may still change (the address is re-derived); once the vault is deployed on-chain this record is frozen and signer changes happen on-chain."
    },
    "passkeySigner": {
      "type": "object",
      "required": [
        "kind",
        "publicKeyX",
        "publicKeyY",
        "credentialId",
        "memberDid",
        "addedAt"
      ],
      "properties": {
        "kind": {
          "enum": [
            "passkey"
          ],
          "type": "string"
        },
        "label": {
          "type": "string",
          "maxLength": 800,
          "description": "Plain-language signer label.",
          "maxGraphemes": 80
        },
        "addedAt": {
          "type": "string",
          "format": "datetime"
        },
        "memberDid": {
          "type": "string",
          "format": "did",
          "description": "DID of the organization member this passkey belongs to."
        },
        "publicKeyX": {
          "type": "string",
          "description": "32-byte hex, secp256r1 public key X coordinate (SmartVault Signer slot1)."
        },
        "publicKeyY": {
          "type": "string",
          "description": "32-byte hex, secp256r1 public key Y coordinate (SmartVault Signer slot2)."
        },
        "credentialId": {
          "type": "string",
          "description": "WebAuthn credential id (base64url) so the member's browser can find the passkey again."
        }
      }
    }
  },
  "$type": "com.atproto.lexicon.schema",
  "lexicon": 1
}

Validate Record

Validate a record against app.gainforest.wallet.splitsVault

Validation Options
Treat any remaining unresolved references as valid

Metadata

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

Lexicon Garden

@