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.
literal:self
Fixed literal value
Properties
address
string
Required
Predicted deterministic vault address (0x…, 20 bytes).
chainId
integer
Required
EVM chain id the donation flow settles on (the address is identical on every chain where the factory is deployed).
createdAt
string
datetime
Required
An RFC 3339 formatted timestamp.
factory
string
Required
SmartVaultFactory address the prediction was made against.
name
string
Optional
Plain-language wallet label.
maxLength: 800 bytesmaxGraphemes: 80 graphemesowner
string
Required
The vault's Ownable superuser slot. Always the zero address: only the signer set controls the vault.
saltScheme
string
Required
Versioned salt derivation label; the CREATE2 salt is keccak256(saltScheme + ':' + organization DID).
signers
array
of
ref
#passkeySigner
Required
Founding signer set, in derivation order — a CREATE2 input.
minLength: 1 itemsthreshold
integer
Required
Number of signer approvals required per operation.
minimum: 1View raw schema
{
"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."
}