Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
c1da9ec
support add tee game type
JimmyShi22 Mar 20, 2026
7a0118a
fix check bug
JimmyShi22 Mar 20, 2026
53c5781
add time and register logic
JimmyShi22 Mar 23, 2026
53dace3
add list game scripts
JimmyShi22 Mar 24, 2026
a956677
simply
JimmyShi22 Mar 24, 2026
12e5c0d
port
JimmyShi22 Mar 24, 2026
3a057c4
anchor state
JimmyShi22 Mar 24, 2026
11319ee
compose
JimmyShi22 Mar 24, 2026
8b8d757
proposer
JimmyShi22 Mar 24, 2026
739e8bb
optimize list game
JimmyShi22 Mar 24, 2026
525f512
add mock tee rpc tool
JimmyShi22 Mar 25, 2026
fbeda74
add build docker
JimmyShi22 Mar 25, 2026
3b187c4
add run tee game
JimmyShi22 Mar 25, 2026
4191fa3
optimize
JimmyShi22 Mar 25, 2026
8778ad8
recover
JimmyShi22 Mar 25, 2026
e27180a
use config
JimmyShi22 Mar 25, 2026
9888591
feat: add mockteeprover and split TEE services into docker-compose-te…
googgoog Mar 26, 2026
86d1532
feat: add mockteeprover config to example.env
googgoog Mar 26, 2026
8e3a51b
feat: add MockTeeProver image build step in init.sh
googgoog Mar 26, 2026
e4797b4
feat: add TEE signer key and fix tee-challenger game-window
googgoog Mar 26, 2026
f202975
fix: use correct TEE signer key matching registered enclave address
googgoog Mar 26, 2026
2bbfe76
fix: update mockteeprover routes from /task/ to /tee/task/
googgoog Mar 26, 2026
619553f
refactor(tee-challenger): use proposer key and add selective claim re…
googgoog Mar 27, 2026
ac8676f
chore: update TEE signer key and add CHALLENGER_ADDRESS in example.env
googgoog Mar 27, 2026
aec4c35
fix: derive enclave address from TEE_SIGNER_PRIVATE_KEY instead of OP…
googgoog Mar 27, 2026
543732f
fix url prob
JimmyShi22 Mar 27, 2026
7499291
feat(mockteeprover): add EIP-712 signing to match new TeeDisputeGame …
googgoog Mar 27, 2026
55a8bc5
feat(mockteeprover): support per-request chainId and teeProofVerifier…
googgoog Mar 30, 2026
0c374da
fix(op-succinct): fix TRANSACTOR key mismatch and add PROPOSER/CHALLE…
googgoog Mar 30, 2026
27c4cf9
rm /v1
JimmyShi22 Mar 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,4 @@ tools/adventure/txhashes.log
**/build/

local
.omc
3 changes: 2 additions & 1 deletion devnet/0-all.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ set -e
./3-op-init.sh
./4-op-start-service.sh
./5-run-op-succinct.sh
./6-run-kailua.sh
./6-run-kailua.sh
./7-run-tee-game.sh
25 changes: 19 additions & 6 deletions devnet/5-run-op-succinct.sh
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,14 @@ sed_inplace "s|^L2_NODE_RPC=.*|L2_NODE_RPC=$L2_NODE_RPC_URL_IN_DOCKER|" "$OP_SUC
sed_inplace "s|^FACTORY_ADDRESS=.*|FACTORY_ADDRESS=$DISPUTE_GAME_FACTORY_ADDRESS|" "$OP_SUCCINCT_DIR"/.env.deploy
sed_inplace "s|^OPTIMISM_PORTAL2_ADDRESS=.*|OPTIMISM_PORTAL2_ADDRESS=$OPTIMISM_PORTAL_PROXY_ADDRESS|" "$OP_SUCCINCT_DIR"/.env.deploy
sed_inplace "s|^ANCHOR_STATE_REGISTRY=.*|ANCHOR_STATE_REGISTRY=$ANCHOR_STATE_REGISTRY|" "$OP_SUCCINCT_DIR"/.env.deploy
sed_inplace "s|^TRANSACTOR_ADDRESS=.*|TRANSACTOR_ADDRESS=$TRANSACTOR|" "$OP_SUCCINCT_DIR"/.env.deploy
sed_inplace "s|^TRANSACTOR=.*|TRANSACTOR=$TRANSACTOR|" "$OP_SUCCINCT_DIR"/.env.deploy
sed_inplace "s|^PROPOSER_ADDRESSES=.*|PROPOSER_ADDRESSES=$PROPOSER_ADDRESS|" "$OP_SUCCINCT_DIR"/.env.deploy
sed_inplace "s|^CHALLENGER_ADDRESSES=.*|CHALLENGER_ADDRESSES=$CHALLENGER_ADDRESS|" "$OP_SUCCINCT_DIR"/.env.deploy
sed_inplace "s|^STARTING_L2_BLOCK_NUMBER=.*|STARTING_L2_BLOCK_NUMBER=$((FORK_BLOCK + 1))|" "$OP_SUCCINCT_DIR"/.env.deploy

sed_inplace "s|^OP_SUCCINCT_MOCK=.*|OP_SUCCINCT_MOCK=$PROOF_MOCK_MODE|" "$OP_SUCCINCT_DIR"/.env.deploy

STARTING_L2_BLOCK_NUMBER=$(cast call "$ANCHOR_STATE_REGISTRY" "getAnchorRoot()(bytes32,uint256)" --json | jq -r '.[1]')
STARTING_L2_BLOCK_NUMBER=$(cast call "$ANCHOR_STATE_REGISTRY" "getAnchorRoot()(bytes32,uint256)" --json -r "$L1_RPC_URL" | jq -r '.[1]')
sed_inplace "s|^STARTING_L2_BLOCK_NUMBER=.*|STARTING_L2_BLOCK_NUMBER=$STARTING_L2_BLOCK_NUMBER|" "$OP_SUCCINCT_DIR"/.env.deploy

# update .env.proposer
Expand All @@ -74,15 +76,26 @@ sed_inplace "s|^MOCK_MODE=.*|MOCK_MODE=$PROOF_MOCK_MODE|" "$OP_SUCCINCT_DIR"/.en
sed_inplace "s|^L1_RPC=.*|L1_RPC=$L1_RPC_URL_IN_DOCKER|" "$OP_SUCCINCT_DIR"/.env.challenger
sed_inplace "s|^L2_RPC=.*|L2_RPC=$L2_RPC_URL_IN_DOCKER|" "$OP_SUCCINCT_DIR"/.env.challenger
sed_inplace "s|^FACTORY_ADDRESS=.*|FACTORY_ADDRESS=$DISPUTE_GAME_FACTORY_ADDRESS|" "$OP_SUCCINCT_DIR"/.env.challenger
grep -q "^RUST_LOG=" "$OP_SUCCINCT_DIR"/.env.challenger || echo "RUST_LOG=info" >> "$OP_SUCCINCT_DIR"/.env.challenger

docker compose up op-succinct-fetch-config
OP_DEPLOYER_ADDR=$(cast wallet a "$DEPLOYER_PRIVATE_KEY")
cast send --private-key "$RICH_L1_PRIVATE_KEY" --value 1ether "$OP_DEPLOYER_ADDR" --legacy --rpc-url "$L1_RPC_URL"
docker compose up op-succinct-contracts

cast send "$ANCHOR_STATE_REGISTRY" "setRespectedGameType(uint32)" 42 --private-key="$DEPLOYER_PRIVATE_KEY"
# Update ANCHOR_STATE_REGISTRY_ADDRESS in .env.proposer with the address from the newly deployed game implementation
NEW_GAME_IMPL=$(cast call "$DISPUTE_GAME_FACTORY_ADDRESS" 'gameImpls(uint32)(address)' 42 -r "$L1_RPC_URL")
NEW_ANCHOR_STATE_REGISTRY=$(cast call "$NEW_GAME_IMPL" 'anchorStateRegistry()(address)' -r "$L1_RPC_URL")
grep -q "^ANCHOR_STATE_REGISTRY_ADDRESS=" "$OP_SUCCINCT_DIR"/.env.proposer \
&& sed_inplace "s|^ANCHOR_STATE_REGISTRY_ADDRESS=.*|ANCHOR_STATE_REGISTRY_ADDRESS=$NEW_ANCHOR_STATE_REGISTRY|" "$OP_SUCCINCT_DIR"/.env.proposer \
|| echo "ANCHOR_STATE_REGISTRY_ADDRESS=$NEW_ANCHOR_STATE_REGISTRY" >> "$OP_SUCCINCT_DIR"/.env.proposer
grep -q "^ANCHOR_STATE_REGISTRY_ADDRESS=" "$OP_SUCCINCT_DIR"/.env.challenger \
&& sed_inplace "s|^ANCHOR_STATE_REGISTRY_ADDRESS=.*|ANCHOR_STATE_REGISTRY_ADDRESS=$NEW_ANCHOR_STATE_REGISTRY|" "$OP_SUCCINCT_DIR"/.env.challenger \
|| echo "ANCHOR_STATE_REGISTRY_ADDRESS=$NEW_ANCHOR_STATE_REGISTRY" >> "$OP_SUCCINCT_DIR"/.env.challenger

TARGET_HEIGHT=$(cast call "$ANCHOR_STATE_REGISTRY" "getAnchorRoot()(bytes32,uint256)" --json | jq -r '.[1]')
cast send "$ANCHOR_STATE_REGISTRY" "setRespectedGameType(uint32)" 42 --private-key="$DEPLOYER_PRIVATE_KEY" --rpc-url "$L1_RPC_URL"

TARGET_HEIGHT=$(cast call "$ANCHOR_STATE_REGISTRY" "getAnchorRoot()(bytes32,uint256)" --json -r "$L1_RPC_URL" | jq -r '.[1]')

while true; do
CURRENT_HEIGHT=$(cast bn -r "$L2_RPC_URL" finalized 2>/dev/null || echo "0")
Expand All @@ -101,8 +114,8 @@ docker compose up -d op-succinct-proposer
echo " ✓ Proposer started"

if [ "$MIN_RUN" = "false" ]; then
docker-compose down op-proposer
docker-compose down op-challenger
docker compose down op-proposer
docker compose down op-challenger
echo " ✓ Older proposer and challenger stopped"
fi

Expand Down
78 changes: 78 additions & 0 deletions devnet/7-run-tee-game.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#!/bin/bash
set -e

source .env

PWD_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SCRIPTS_DIR=$PWD_DIR/scripts

# Check required images exist
MISSING_IMAGES=()
for IMG_VAR in OP_CONTRACTS_TEE_IMAGE_TAG OP_STACK_TEE_IMAGE_TAG MOCKTEERPC_IMAGE_TAG MOCKTEEPROVER_IMAGE_TAG; do
IMG="${!IMG_VAR}"
if ! docker image inspect "$IMG" > /dev/null 2>&1; then
MISSING_IMAGES+=("$IMG_VAR=$IMG")
fi
done

if [ ${#MISSING_IMAGES[@]} -gt 0 ]; then
echo "❌ The following required Docker images are missing:"
for ENTRY in "${MISSING_IMAGES[@]}"; do
echo " - $ENTRY"
done
echo ""
echo "To build them, set the corresponding SKIP flags to 'false' in .env:"
for ENTRY in "${MISSING_IMAGES[@]}"; do
VAR_NAME="${ENTRY%%=*}"
case "$VAR_NAME" in
OP_CONTRACTS_TEE_IMAGE_TAG) echo " SKIP_OP_CONTRACTS_TEE_BUILD=false" ;;
OP_STACK_TEE_IMAGE_TAG) echo " SKIP_OP_STACK_TEE_BUILD=false" ;;
MOCKTEERPC_IMAGE_TAG) echo " SKIP_MOCKTEERPC_BUILD=false" ;;
MOCKTEEPROVER_IMAGE_TAG) echo " SKIP_MOCKTEEPROVER_BUILD=false" ;;
esac
done
echo ""
echo "Then run: bash init.sh"
echo ""
echo "After init.sh completes, re-run this script: bash 7-run-tee-game.sh"
exit 1
fi

ENCLAVE_ADDRESS=$(cast wallet address --private-key "$TEE_SIGNER_PRIVATE_KEY")

echo "🔧 Adding TEE game type..."
echo " Image: $OP_CONTRACTS_TEE_IMAGE_TAG"
echo " Enclave address: $ENCLAVE_ADDRESS"

# Create a temp .env with L1_RPC_URL replaced by docker-internal URL,
# because add-tee-game-type.sh sources .env internally and would overwrite -e overrides.
TEMP_ENV=$(mktemp)
trap "rm -f $TEMP_ENV" EXIT
sed "s|^L1_RPC_URL=.*|L1_RPC_URL=$L1_RPC_URL_IN_DOCKER|" .env > "$TEMP_ENV"

docker run --rm \
--network "$DOCKER_NETWORK" \
-v "$(pwd)/scripts:/devnet/scripts" \
-v "$TEMP_ENV:/devnet/.env" \
"$OP_CONTRACTS_TEE_IMAGE_TAG" \
bash /devnet/scripts/add-tee-game-type.sh \
--max-challenge-duration "$GAME_WINDOW" \
--max-prove-duration "$GAME_WINDOW" \
--mock-verifier \
--enclave "$ENCLAVE_ADDRESS" \
/app/packages/contracts-bedrock

# Query L1 chain ID and TEE proof verifier address for EIP-712 domain separator
export L1_CHAIN_ID=$(cast chain-id --rpc-url "$L1_RPC_URL")
TEE_GAME_IMPL=$(cast call --rpc-url "$L1_RPC_URL" "$DISPUTE_GAME_FACTORY_ADDRESS" 'gameImpls(uint32)(address)' "$TEE_GAME_TYPE")
export TEE_PROOF_VERIFIER_ADDRESS=$(cast call --rpc-url "$L1_RPC_URL" "$TEE_GAME_IMPL" 'teeProofVerifier()(address)')
echo " L1 Chain ID: $L1_CHAIN_ID"
echo " TEE Proof Verifier: $TEE_PROOF_VERIFIER_ADDRESS"

echo "🚀 Starting TEE services..."
docker compose -f docker-compose.yml -f docker-compose-tee.yml up -d mockteerpc mockteeprover tee-proposer tee-challenger

echo "✅ TEE game setup complete!"
echo ""
echo "To list all games, run:"
echo " bash scripts/list-game.sh"
74 changes: 74 additions & 0 deletions devnet/docker-compose-tee.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
networks:
default:
name: ${DOCKER_NETWORK:-dev-op}

services:
mockteerpc:
image: "${MOCKTEERPC_IMAGE_TAG}"
container_name: mockteerpc
command:
- --delay
- 1000ms
- --init-height
- "500000000"
ports:
- "8090:8090"

mockteeprover:
image: "${MOCKTEEPROVER_IMAGE_TAG}"
container_name: mockteeprover
environment:
- SIGNER_PRIVATE_KEY=${TEE_SIGNER_PRIVATE_KEY}
- CHAIN_ID=${L1_CHAIN_ID:-1337}
- VERIFYING_CONTRACT=${TEE_PROOF_VERIFIER_ADDRESS}
- TASK_DELAY=${TEE_TASK_DELAY:-2s}
ports:
- "8690:8690"

tee-proposer:
image: "${OP_STACK_TEE_IMAGE_TAG}"
container_name: tee-proposer
environment:
- DISPUTE_GAME_FACTORY_ADDRESS=${DISPUTE_GAME_FACTORY_ADDRESS}
- OP_PROPOSER_PRIVATE_KEY=${OP_PROPOSER_PRIVATE_KEY}
command:
- /app/op-proposer/bin/op-proposer
- --l1-eth-rpc=${L1_RPC_URL_IN_DOCKER}
- --tee-rollup-rpc=http://mockteerpc:8090
- --game-type=${TEE_GAME_TYPE:-1960}
- --game-factory-address=${DISPUTE_GAME_FACTORY_ADDRESS}
- --private-key=${OP_PROPOSER_PRIVATE_KEY}
- --poll-interval=2s
- --proposal-interval=35s
- --rpc.port=7302
- --log.level=info
depends_on:
- mockteerpc
- op-batcher

tee-challenger:
image: "${OP_STACK_TEE_IMAGE_TAG}"
container_name: tee-challenger
environment:
- DISPUTE_GAME_FACTORY_ADDRESS=${DISPUTE_GAME_FACTORY_ADDRESS}
- OP_PROPOSER_PRIVATE_KEY=${OP_PROPOSER_PRIVATE_KEY}
volumes:
- ./data/tee-challenger-data:/data
command:
- /app/op-challenger/bin/op-challenger
- --log.level=debug
- --l1-eth-rpc=${L1_RPC_URL_IN_DOCKER}
- --l1-beacon=${L1_BEACON_URL_IN_DOCKER}
- --game-factory-address=${DISPUTE_GAME_FACTORY_ADDRESS}
- --private-key=${OP_PROPOSER_PRIVATE_KEY}
- --game-types=tee
- --datadir=/data
- --http-poll-interval=2s
- --tee-prover-rpc=http://mockteeprover:8690
- --tee-prove-poll-interval=2s
- --tee-prove-timeout=120s
- --selective-claim-resolution
- --game-window=86400s
depends_on:
- mockteeprover
- tee-proposer
2 changes: 1 addition & 1 deletion devnet/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -935,7 +935,7 @@ services:
volumes:
- ./op-succinct/.env.challenger:/app/.env
ports:
- "9001:9001"
- "9002:9001"
command:
- challenger
- --env-file=/app/.env
Expand Down
26 changes: 26 additions & 0 deletions devnet/example.env
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
# OP Stack Configuration
# ==============================================================================
OP_STACK_LOCAL_DIRECTORY=
OP_STACK_BRANCH=dev
SKIP_OP_STACK_BUILD=true
OP_STACK_IMAGE_TAG=op-stack:latest

Expand Down Expand Up @@ -61,6 +62,29 @@ KAILUA_LOCAL_DIRECTORY=
SKIP_KAILUA_BUILD=true
KAILUA_IMAGE_TAG=kailua:latest

# ==============================================================================
# OP Stack TEE Configuration (independent from op-stack, built from tz/dev branch)
# ==============================================================================
OP_STACK_TEE_LOCAL_DIRECTORY=
OP_STACK_TEE_BRANCH=tz/dev
SKIP_OP_STACK_TEE_BUILD=true
OP_STACK_TEE_IMAGE_TAG=op-stack:tee
SKIP_OP_CONTRACTS_TEE_BUILD=true
OP_CONTRACTS_TEE_IMAGE_TAG=op-contracts:tee

# ==============================================================================
# MockTeeRPC Configuration
# ==============================================================================
SKIP_MOCKTEERPC_BUILD=true
MOCKTEERPC_IMAGE_TAG=mockteerpc:latest

# ==============================================================================
# MockTeeProver Configuration
# ==============================================================================
SKIP_MOCKTEEPROVER_BUILD=true
MOCKTEEPROVER_IMAGE_TAG=mockteeprover:latest
TEE_SIGNER_PRIVATE_KEY=0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d

# ==============================================================================
# Build Configuration
# ==============================================================================
Expand Down Expand Up @@ -117,6 +141,7 @@ OP_CHALLENGER_PRIVATE_KEY=0x8b3a350cf5c34c9194ca9aa3f146b2b9afed22cd83d3c5f6a3f2
# ==============================================================================
DEPLOYER_ADDRESS=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
PROPOSER_ADDRESS=0x70997970C51812dc3A010C7d01b50e0d17dc79C8
CHALLENGER_ADDRESS=0x7d18A1B858253b5588f61fb5739d52e4b84e2cdA
ADMIN_OWNER_ADDRESS=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266

SAFE_ADDRESS=0x0000000000000000000000000000000000000000
Expand Down Expand Up @@ -147,6 +172,7 @@ TEMP_GAME_WINDOW=60
MAX_CLOCK_DURATION=20
CLOCK_EXTENSION=10
GAME_WINDOW=60
TEE_GAME_TYPE=1960

# AnchorStateRegistry configure
DISPUTE_GAME_FINALITY_DELAY_SECONDS=5
Expand Down
Loading