Privacy-preserving AI character NFTs on NEAR with one-time deposit, TEE-metered chat, on-chain attestation receipts, and Web4 SPA.
near-private-characters/
├─ contracts/character_nft/ # Rust contract (NFT + sessions + attestation + Web4)
└─ tee-agent/ # Node/TS TEE-like agent (NEAR AI chat + image gen + metering)
cd contracts/character_nft
rustup target add wasm32-unknown-unknown
cargo build --release --target wasm32-unknown-unknownnear create-account characters.your.testnet --masterAccount your.testnet
near deploy characters.your.testnet --wasmFile target/wasm32-unknown-unknown/release/character_nft.wasm
near call characters.your.testnet new '{
"owner_id":"your.testnet",
"metadata": {"spec":"nft-1.0.0","name":"Private Characters","symbol":"CHAR"},
"fee_vault":"vault.your.testnet",
"tee_signer":"tee.characters.your.testnet"
}' --accountId your.testnetnear create-account tee.characters.your.testnet --masterAccount your.testnet
near add-key characters.your.testnet <PUBKEY> --contract-id characters.your.testnet --method-names record_usage_receipt --allowance 1cd tee-agent
cp .env.example .env # Fill NEAR creds and NEAR AI endpoints
npm i
npm run devPublish attested key to contract:
# Fetch attestation
curl http://localhost:8787/attestation
# Use pubkey (base64) and measurement (hex) to set on contract
near call characters.your.testnet set_attested_key '{
"pubkey": "<base64->bytes>",
"measurement": "<hex->bytes>"
}' --accountId your.testnetThe contract embeds a small SPA at / with wallet connect, deposit, character creation (calls the agent to seal prompt + generate image using NEAR AI), mint, and chat (WS binding).
- NEAR AI endpoints are OpenAI-compatible in this template; adjust payloads/URLs to your deployment.
- The agent currently maps 1 unit per user message; refine metering (tokens/minutes) as needed.
- For real TEEs, replace
measurement()and signing with hardware-backed attestation + sealed keys.