app.gainforest.wallet.splitsVault
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.
Details · record, key literal:self
| Kind | record |
|---|---|
| Record key | literal:self |
| Authority | wallet.gainforest.app |
| Indexed |
Checks
Validunlimited-stringdefs.main.record.properties.addressNo maxLength, maxGraphemes or format limits this string.unlimited-stringdefs.main.record.properties.factoryNo maxLength, maxGraphemes or format limits this string.unlimited-stringdefs.main.record.properties.ownerNo maxLength, maxGraphemes or format limits this string.unlimited-stringdefs.main.record.properties.saltSchemeNo maxLength, maxGraphemes or format limits this string.unlimited-stringdefs.passkeySigner.properties.credentialIdNo maxLength, maxGraphemes or format limits this string.unlimited-stringdefs.passkeySigner.properties.kindNo maxLength, maxGraphemes or format limits this string.unlimited-stringdefs.passkeySigner.properties.publicKeyXNo maxLength, maxGraphemes or format limits this string.unlimited-stringdefs.passkeySigner.properties.publicKeyYNo maxLength, maxGraphemes or format limits this string.
{
"$type": "com.atproto.lexicon.schema",
"defs": {
"main": {
"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.",
"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 + ':' + organization 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 signer approvals required per operation.",
"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 organization 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.splitsVault",
"lexicon": 1
}