Legacy
Historical referenceLegacy deployments
Historical contract transactions and migration evidence.
Preservation record
Snapshot
Record existing state
Legacy
Historical referenceHistorical contract transactions and migration evidence.
Preservation record
Snapshot
Record existing state
Upgrade
Historical proxy transaction
Compare
Verify retained rights
This page records the retired NFT product and its historical deployment procedures. It does not deploy the new topup contract. Use Deployment for current instructions.
Mainnet is not deployed. This page preserves the earlier testnet rehearsal and proposed mainnet preconditions. Legacy testnet minting was paused at block 140880178 on 5 November 2026; reward claims remain unpaused. Use Addresses for the pause transaction and active payment deployment.
Do not deploy to mainnet until all of these are true:
PassRenderer, AgentPassSingle, and RewardDistributor. Initialize both the inherited pass state and membership version 2 before opening mint.KEEPER_ROLE to the keeper and TaxSplitter.AirdropVesting.On 3 November 2026, the existing chain-97 proxy was upgraded to AgentPassSingle at block 140541776. The original NFT #1 retained its owner, edition 0, 10,000 weight, stored handle, and reward balance. Minting returned to its previous unpaused state.
| Operation | Transaction |
|---|---|
| Proxy upgrade | View transaction |
| Repeat mint with USDT, NFT #2 | View transaction |
| Repeat mint with BNB, NFT #3 | View transaction |
Both mints used the original holder's wallet. It held NFTs #1, #2, and #3 with aggregate weight 30,000 after the checks. The USDT mint charged 5 mock USDT; the BNB mint charged 8416666666666666 wei at the configured mock oracle price, including the 1% buffer.
The application migration completed at 2026-11-03T08:29:20.224Z after an application-schema backup. It preserved the existing $1.50 grant and five usage records totaling $0.000142. Confirmed-pass synchronization then granted $5 for each new NFT. The verified balance was $11.499858 from $11.50 granted. Repeated synchronization did not duplicate grants.
The contract suite passed 243 tests, and storage validation passed for the upgrade. A local fork rehearsal also verified preservation before the live testnet transaction. These checks do not replace an independent audit. Deployment records are in packages/contracts/deployments/; the new addresses are on Addresses.
PassRenderer.AgentPassSingle implementation and proxy, then initialize membership.RewardDistributor implementation and proxy.TaxSplitter after the token exists.AirdropVesting after the snapshot.The deploy script grants roles to the admin and keeper, then renounces the deployer roles when the addresses differ.
Check the case-insensitive comparison. A checksummed address and a lowercase address are the same account.
After deployment, verify:
mintOpen() == truetotalMinted() == 0soldOut() == falserewardDistributor() is setoracle() is the Chainlink feedusdt() is BSC USDTagentIdRegistry() is the Agent ID registryRewardDistributor.solvent() == trueAirdropVesting.start() is in the futureFor the existing testnet proxy, use packages/contracts/scripts/upgrade-membership.ts. It validates storage, pauses minting, snapshots existing NFTs and holder rewards, deploys the implementation and renderer, calls upgradeToAndCall with initializeMembership, verifies preservation, and restores the previous pause state. It records the transaction in packages/contracts/deployments/.
Stop chat traffic and let in-flight requests finish before applying apps/web/migrations/002-single-membership.sql. Back up the application schema first. Fresh databases need apps/web/supabase.sql before this migration. The migration is replay-safe and preserves existing credit grants and usage. Deploy the matching app build after the database and proxy are ready. The indexer retains its existing proxy address and PassMinted event signature.
The testnet command, run from packages/contracts, is:
The general mainnet process remains:
upgradeToAndCall through the admin Safe.There is no timelock. Treat every upgrade as a high-risk operation.
After the membership migration, apply apps/web/migrations/003-inference-api.sql before deploying the inference app build. Back up the app schema first. The migration adds API keys, key audit events, and a nullable api_key_id on requests. It does not rewrite grants or usage and is replay-safe. Fresh databases apply supabase.sql, 002-single-membership.sql, and 003-inference-api.sql in that order.
Use the existing server-only OPENROUTER_API_KEY, OPENROUTER_BASE_URL, DATABASE_URL, SESSION_SECRET, and ADMIN_WALLETS configuration. Configure the host to allow at least 120 seconds for the completions route and disable proxy buffering for SSE. The provider deadline is 90 seconds. Apply infrastructure limits to unauthenticated traffic; application limits apply to admitted inference requests. Smoke-test key creation, models, a completion, streaming, usage settlement, and revocation using the steps in API.
AgentPass to stop minting.RewardDistributor to stop deposits and claims.TaxSplitter to stop tax distribution.See Addresses.
hasRole(DEFAULT_ADMIN_ROLE, admin) == true
hasRole(UPGRADER_ROLE, admin) == true
hasRole(PAUSER_ROLE, admin) == true
hasRole(KEEPER_ROLE, keeper) == true
hasRole(KEEPER_ROLE, taxSplitter) == true
hasRole(DEFAULT_ADMIN_ROLE, deployer) == false
PASS_ADDRESS=<existing_proxy> bun run upgrade:membership:bscTestnet