app.gainforest.link.evm
A verifiable link between an ATProto DID and an EVM wallet address, with platform attestation. The user proves wallet ownership via EIP-712 signature, and the platform co-signs to attest the linking occurred through a trusted service.
Details · record, key any
| Kind | record |
|---|---|
| Record key | any |
| Authority | link.gainforest.app |
| Indexed |
Checks
Valid Lint pass{
"$type": "com.atproto.lexicon.schema",
"defs": {
"eip712Message": {
"description": "The EIP-712 typed data message signed by the user's wallet.",
"properties": {
"chainId": {
"description": "EVM chain ID as string (bigint serialized). The EIP-712 domain is chain-specific; verifiers should treat this attestation as valid only for the specified chain.",
"maxLength": 78,
"minLength": 1,
"type": "string"
},
"did": {
"description": "The ATProto DID being linked to the EVM address.",
"format": "did",
"maxLength": 256,
"type": "string"
},
"evmAddress": {
"description": "The EVM wallet address (must match the top-level address field).",
"maxLength": 42,
"minLength": 42,
"type": "string"
},
"nonce": {
"description": "Replay-protection nonce (bigint serialized).",
"maxLength": 78,
"minLength": 1,
"type": "string"
},
"timestamp": {
"description": "Unix timestamp when the attestation was created (bigint serialized).",
"maxLength": 78,
"minLength": 1,
"type": "string"
}
},
"required": [
"did",
"evmAddress",
"chainId",
"timestamp",
"nonce"
],
"type": "object"
},
"eip712PlatformAttestation": {
"description": "Platform's EIP-712 attestation that this DID-wallet link was created through a trusted service. The platform signs over the user's signature to bind its attestation to the specific linking event.",
"properties": {
"platformAddress": {
"description": "The platform's signing wallet address (0x-prefixed). Verifiers should check this against known/trusted platform addresses.",
"maxLength": 42,
"minLength": 42,
"type": "string"
},
"signature": {
"description": "Platform's ECDSA signature over the signedData (hex-encoded with 0x prefix, 64 or 65 bytes).",
"maxLength": 132,
"minLength": 130,
"type": "string"
},
"signedData": {
"description": "The user's signature that the platform signed over (hex-encoded with 0x prefix). This binds the platform attestation to the specific user proof.",
"maxLength": 132,
"minLength": 130,
"type": "string"
}
},
"required": [
"signature",
"platformAddress",
"signedData"
],
"type": "object"
},
"eip712Proof": {
"description": "EOA wallet ownership proof via EIP-712 typed data signature.",
"properties": {
"message": {
"description": "The EIP-712 structured message fields that were signed.",
"ref": "#eip712Message",
"type": "ref"
},
"signature": {
"description": "User's ECDSA signature over the EIP-712 hash (hex-encoded with 0x prefix, 64 or 65 bytes).",
"maxLength": 132,
"minLength": 130,
"type": "string"
}
},
"required": [
"signature",
"message"
],
"type": "object"
},
"main": {
"description": "A verifiable link between an ATProto DID and an EVM wallet address, with platform attestation. The user proves wallet ownership via EIP-712 signature, and the platform co-signs to attest the linking occurred through a trusted service.",
"key": "any",
"record": {
"properties": {
"address": {
"description": "EVM wallet address (0x-prefixed, checksummed).",
"maxLength": 42,
"minLength": 42,
"type": "string"
},
"createdAt": {
"description": "Client-declared timestamp when this record was originally created.",
"format": "datetime",
"type": "string"
},
"name": {
"description": "Optional user-defined name for this wallet link (e.g. 'Personal Wallet', 'Project Treasury'). Helps users identify which wallet this record represents when they have multiple linked wallets.",
"maxLength": 100,
"type": "string"
},
"platformAttestation": {
"description": "Platform's co-signature attesting that this link was created through the trusted service. Open union to support future attestation methods.",
"refs": [
"#eip712PlatformAttestation"
],
"type": "union"
},
"userProof": {
"description": "User's cryptographic proof of wallet ownership. Open union to support future signature methods (ERC-1271, ERC-6492).",
"refs": [
"#eip712Proof"
],
"type": "union"
}
},
"required": [
"address",
"userProof",
"platformAttestation",
"createdAt"
],
"type": "object"
},
"type": "record"
}
},
"id": "app.gainforest.link.evm",
"lexicon": 1
}