Runbook
Verified against: F-018 (2026-11-10), F-019 (2026-11-10) · F-154 (2026-11-09) · docs/work/interface-p0.md (2026-11-10) · config.yaml oracle max ages · evidence/G2/keeper-key-20261109T2050Z.log · mirrors docs/RUNBOOK.md
Status: commands target the P0 interface deployed on testnet on 2026-11-09 (G2 PASS 2026-11-09T20:55Z, commit 5f27f44). P1 and P2 commands are marked as such and do not exist in the P0 build.
Ids from packages/config/config.yaml:
CORE=nectar-core.nectar.testnet # nectar-core account
OWNER=nectar.testnet # owner account (keychain)
Standing duties
- Owner price every 24 h while the session is closed. The oracle max age is 120 s in session and 86,400 s closed (
max_age_s_session,max_age_s_closedin config.yaml;set_oracle_paramson chain). An older price makes borrows andtrigger_preliquidationfail withoracle stale. Refresh withupdate_owner_price(below). - Keeper allowance.
keeper.nectar.testnethas only a function-call key with a 1 NEAR allowance and no full-access key, so the key cannot be rotated or topped up in place. When the allowance runs out, follow Rotate the keeper. - Owner balance.
nectar.testnetholds less than 1 NEAR. Top it up from the testnet faucet https://near-faucet.io/ (F-154) before owner transactions.
Health
near contract call-function as-read-only "$CORE" get_config json-args '{}' network-config testnet now
near contract call-function as-read-only "$CORE" get_exit_capacity json-args '{"symbol":"NVDAx"}' network-config testnet now
near contract call-function as-read-only "$CORE" get_pool json-args '{}' network-config testnet now
Pause and unpause
near contract call-function as-transaction "$CORE" pause json-args '{}' prepaid-gas '30 Tgas' attached-deposit '0 NEAR' sign-as "$OWNER" network-config testnet sign-with-keychain send
near contract call-function as-transaction "$CORE" unpause json-args '{}' prepaid-gas '30 Tgas' attached-deposit '0 NEAR' sign-as "$OWNER" network-config testnet sign-with-keychain send
Owner price (P0 oracle)
Within the band:
near contract call-function as-transaction "$CORE" update_owner_price json-args '{"symbol":"NVDAx","price_usd_e6":"185000000"}' prepaid-gas '30 Tgas' attached-deposit '0 NEAR' sign-as "$OWNER" network-config testnet sign-with-keychain send
Outside the band (two-step override):
near contract call-function as-transaction "$CORE" propose_price json-args '{"symbol":"NVDAx","price_usd_e6":"150000000"}' prepaid-gas '30 Tgas' attached-deposit '0 NEAR' sign-as "$OWNER" network-config testnet sign-with-keychain send
near contract call-function as-transaction "$CORE" apply_price json-args '{"symbol":"NVDAx"}' prepaid-gas '30 Tgas' attached-deposit '0 NEAR' sign-as "$OWNER" network-config testnet sign-with-keychain send
Rotate the keeper
The keeper account has no full-access key, so rotation means a new keeper account. Create the account (it has a full-access key at first), add the scoped key as on Run a keeper, delete the new account's full-access key, then switch the contract:
near contract call-function as-transaction "$CORE" set_keeper json-args '{"keeper":"<new_keeper>"}' prepaid-gas '30 Tgas' attached-deposit '0 NEAR' sign-as "$OWNER" network-config testnet sign-with-keychain send
near account delete-keys <new_keeper> public-keys <full_access_public_key> network-config testnet sign-with-keychain send
Point KEEPER_ACCOUNT_ID and KEEPER_KEY_PATH at the new account and restart. The old account's key cannot be deleted (no full-access key) and is inert after set_keeper.
Gas reserve
fund_gas_reserve is payable and owner-only. Keep it at the 5 NEAR target (gas_reserve_target_near). P0 does not spend it. P1 and P2 cross-contract calls do.
P1 only
set_quoter_pin with an empty pin disables TEE pricing, and settlement then uses max_discount_bps. The method does not exist in the P0 build.
Command grammar: F-018 (call-function), F-019 (delete-keys). Incident playbooks: Incident response.
P1 scripts
Contract upgrades, quoter publish and pin, quoter secrets and the G4 run use scripts/25, 26, 30, 35 and 45. See Upgrades.