Continuity and recovery
Receivables registered on SPCR are recorded on a public blockchain, not within SPCR. SPCR is an interface for reading and writing that record. If SPCR ceased to operate, every certificate would continue to exist, remain held by the same address, and remain readable by anyone.
The blockchain does not record which certificate corresponds to which loan. A certificate's identifier is a hash and cannot be reversed to a Loan ID; it is computed from the Loan ID and the passkey. Continuity therefore requires you to retain that data.
Retain a copy of your Loan IDs and pool passkeys. This is the only action required from you to ensure continuity.
An identifier is SHA-256( UPPERCASE(TRIM(Loan ID)) + "|" + pool passkey ).
With the Loan IDs and the passkey, you can compute every identifier in a pool and
locate it on chain without SPCR. A lost passkey cannot be recovered from the
blockchain.
The loan tape offered after each registration contains both. Retain it.
Data locations
| Data | Location | Available without SPCR |
|---|---|---|
| Identifier and current owner | The blockchain | Yes |
| Transfer history | The blockchain | Yes |
| Loan IDs, pools and passkeys | SPCR's database and your own records | Only if you retain a copy |
See Data and privacy for a complete description of what is stored and where.
The contract
The details below are read from the live deployment.
These details are for the Stellar testnet, a test network. A production deployment uses a separate contract, address and chain. This table reflects the live deployment.
- Chain
- Stellar testnet (Soroban smart contracts)
- Contract
- CC3KEJ75EV5CP6SRPV33YEJGYXC7MAMWFUDWNG6BVN5QWTZNRKPWLES4
- Standard
- A Soroban contract with the same rules as the ERC-721 registry: registered once, never burned, moved only by the holder or an operator it approved.
- Metadata
- None. The contract stores only each receivable's holder.
- Explorer
- StellarChain
The batch functions follow ERC-1155 naming and signatures (mintBatch,
safeBatchTransferFrom, with amounts and uris parameters), although the
contract is ERC-721. This matches the call format of the custody provider's token
template, so the custody service can use this contract without code changes.
Each entry in amounts must be 1 and uris must be empty; any other value
reverts.
Reading the contract
The contract implements standard ERC-721 and can be read with any block explorer, Ethereum library or public RPC endpoint.
| Function | Returns |
|---|---|
ownerOf(uint256 tokenId) |
The address currently holding the receivable. Reverts if it was never registered. |
balanceOf(address owner) |
The number of certificates held by an address. |
supportsInterface(bytes4) |
Interface support. |
Two events record the full history:
CertificateRegistered(uint256 indexed tokenId, address indexed holder)on registration.- The standard ERC-721
Transfer(address indexed from, address indexed to, uint256 indexed tokenId)on every transfer, including the mint.
tokenId is indexed in both events, so the complete history of a receivable can
be retrieved with a single filtered log query.
Writing to the contract
| Function | Permitted caller |
|---|---|
transferFrom / safeTransferFrom |
The holder, or an operator approved by the holder. Standard ERC-721. |
safeBatchTransferFrom(from, to, ids[], amounts[], data) |
As above. Transfers a pool in a single transaction. |
setApprovalForAll(operator, bool) |
The holder, to delegate transfer rights. |
mint / mintBatch |
MINTER_ROLE only. Registration is restricted to STOKR. |
Transfers are not role-gated. STOKR has no privileged means of transferring
a certificate you hold. Transfer authorisation follows the ERC-721 standard: the
holder, or an operator approved with setApprovalForAll. This has been verified
against the deployed contract, including that MINTER_ROLE does not permit
transferring another holder's certificate.
If you control the holding address, you can transfer your certificates with any Ethereum tooling, independently of STOKR, for as long as the chain operates.
The contract defines two roles, neither of which can transfer your certificates:
MINTER_ROLEregisters new certificates. It is held by STOKR's custody vault and operator.DEFAULT_ADMIN_ROLEgrants and revokesMINTER_ROLEonly. The deploying key renounced this role after setup, which can be verified on chain.
Locating receivables without SPCR
- Retrieve your Loan IDs and the pool passkey from your own records.
- Compute each identifier. Convert the Loan ID to uppercase, remove
surrounding whitespace, append
|followed by the passkey, and apply SHA-256. The result is thetokenIdas a 32-byte hexadecimal value. - Convert to decimal if your tool requires a
uint256. Block explorers display the Token ID in decimal, which is why SPCR shows both formats. - Call
ownerOfwith the result against the contract above.
From any shell:
# One receivable's identifier, in hex.
printf '%s|%s' 'YOURCO-2026-P1-L0001' 'your-pool-passkey' | shasum -a 256
The output is the tokenId. The command does not contact SPCR.
Recovering certificates
The ability to transfer your certificates depends on who holds the key to the holding address. The procedure differs for each of the arrangements below.
STOKR custody
Under this arrangement, STOKR provisions your vault within its own custody workspace.
Under STOKR custody, certificates are released rather than recovered. You do not hold the key and cannot sign the transfer. STOKR operates a defined process to transfer every certificate in your vault to an address you nominate.
Release process
You can prove what you own at any time without STOKR's involvement: compute your
identifiers, call ownerOf, and read the transfer history. STOKR's involvement
is required only to sign the transfer.
A release is initiated by a written request from a signatory nominated in advance, and proceeds as follows:
- Requester verification. STOKR verifies the requester through the contact channel on file, not the channel the request arrived on. Two staff members record the verification independently.
- Destination verification. The destination is normally the confirmed and whitelisted backup address. A different destination requires a new signature proving control. STOKR does not release to an address supplied only in the request. The destination is read back to you in full.
- Manifest. STOKR prepares a manifest of every
tokenIdin your vault, cross-checked against the chain, with the pool each belongs to. The manifest is the basis for approval and is provided to you. - Approval. Compliance and a director approve the release, in addition to operations, because a release is irreversible and removes the certificates from STOKR's control.
- Execution. STOKR executes the release in batches, confirming settlement
and re-reading
ownerOfafter each batch before sending the next, so any partial failure is identified immediately. - Evidence pack. You receive every
tokenIdwith its transaction hash, andownerOfoutput confirming that your address holds each certificate.
The target completion time is 10 business days from a verified request.
If STOKR ceases to operate
Separate arrangements apply if STOKR is no longer operating:
- The release obligation is set out in your agreement, survives termination and binds a liquidator, so an insolvency practitioner is instructed to act rather than given discretion.
- The material required to recover the custody workspace independently of STOKR is held by a third-party escrow agent. Release conditions include STOKR's insolvency or cessation of business, and failure to respond to a valid release request. Request the name of the escrow agent from STOKR so that the arrangement can be verified independently.
Required preparation
The following cannot be arranged during an incident and should be completed in advance:
- Set and confirm a backup address. A backup address is requested when you select STOKR custody. Confirm it by signature from Confirm my address in your workspace, then select Set as my backup address on the result. STOKR does not release to an unconfirmed address. Once confirmed, STOKR whitelists it in custody.
- Confirm your signatories. Nominate two individuals, each with a contact channel, and review them annually. This prevents a forged release request from succeeding.
- Retain the data package. Pools, passkeys, Loan IDs and identifiers. Without it, certificates cannot be mapped to loans, and it is the only data SPCR holds that cannot be reconstructed from the chain.
Moving to self-custody
If you move to your own custody, the release process no longer applies. Your certificates are held at an address you control, and the procedures below apply.
Your own Fireblocks workspace
You control the vault and the certificates. No part of this procedure depends on SPCR.
- Confirm the address. Your vault address is the
toaddress on the registration transactions and the current result ofownerOf. - Connect to the contract. Use your workspace's contract interaction or dApp connection with the contract address above, on the correct chain. The contract is not currently verified on the public explorer, so supply the ABI. The function signatures on this page are sufficient.
- Transfer the certificates. Use
safeTransferFrom(from, to, tokenId)for a single certificate, orsafeBatchTransferFrom(from, to, ids[], amounts[], data)for a pool, with each entry inamountsset to1. - Approve under your policy. The transaction is subject to your workspace's transaction policy.
Other self-custody
Any address you control can be used in the same way, including a self-custodied key, a multisig such as Safe, or a custodian that can sign an arbitrary contract call.
- Compute your identifiers as above and confirm that
ownerOfreturns your address. - Call
transferFromorsafeTransferFromusing your custody tooling. Any tooling that can sign an Ethereum contract call is sufficient. - For smart-contract wallets,
safeTransferFromcalls the recipient'sonERC721Receivedhook. A transfer to a contract that does not implement it reverts, which prevents certificates being sent to an address from which they cannot be moved. UsetransferFromonly where this consequence is understood.