The custodian address
Every Solana time lock names a custodian: the one key that could lift the lock early. On every SolLock lock, the custodian is the address below, which has no key.
EcS8zEEa4dZinCCRWDotMqVqQB1PrHjdnuSeEUBGoZavHow it is made
- Take the text
sollock:no-custodian:v1and add one byte, a counter, starting at 0. - Hash it with SHA-256. That gives 32 bytes, the size of a Solana address.
- Check whether those bytes are a point on the Ed25519 curve. Every wallet address is such a point, because it is a public key. If the bytes are not on the curve, they are not a public key, so no private key can exist for them.
- Keep the first result that is off the curve.
| Counter | SHA-256 | As an address | On the curve? |
|---|---|---|---|
| 0 | ca3bae809d95dab345bbd38f96e021f8c5fde08e96578645572eed5e2e5313cf | EcS8zEEa4dZinCCRWDotMqVqQB1PrHjdnuSeEUBGoZav | No: this is the custodian |
Why nobody can sign for it
Signing needs a private key, and an off-curve address has none. Solana programs can sign for some off-curve addresses, called program-derived addresses, but only for addresses made from that program's own ID with SHA-256. Finding one that comes out as this address would mean breaking SHA-256.
The address is fixed in our code and tests, and stays the same for good once locks exist on mainnet.
Check it yourself
Or run this on your own computer, with code that is not ours:
// Node 20 or later: npm install @noble/curves bs58
import { createHash } from 'node:crypto';
import { ed25519 } from '@noble/curves/ed25519.js';
import bs58 from 'bs58';
const seed = Buffer.from('sollock:no-custodian:v1');
for (let counter = 0; counter < 256; counter++) {
const hash = createHash('sha256').update(Buffer.concat([seed, Buffer.from([counter])])).digest();
let onCurve = true;
try { ed25519.Point.fromBytes(hash); } catch { onCurve = false; }
console.log(counter, bs58.encode(hash), onCurve ? 'on the curve' : 'OFF the curve');
if (!onCurve) break;
}Check a lock
The custodian is stored in the lock itself, on the blockchain. With the Solana command-line tool, solana stake-account <lock address> shows it as "Lockup Custodian". It must be the address above. If a lock shows any other custodian, SolLock did not make it, and someone may be able to unlock it early.