Files
aitbc/scripts/deployment/deploy_openclaw_dao.py
aitbc 3b8249d299 refactor: comprehensive scripts directory reorganization by functionality
Scripts Directory Reorganization - Complete:
 FUNCTIONAL ORGANIZATION: Scripts sorted into 8 logical categories
- github/: GitHub and Git operations (6 files)
- sync/: Synchronization and data replication (4 files)
- security/: Security and audit operations (2 files)
- monitoring/: System and service monitoring (6 files)
- maintenance/: System maintenance and cleanup (4 files)
- deployment/: Deployment and provisioning (11 files)
- testing/: Testing and quality assurance (13 files)
- utils/: Utility scripts and helpers (47 files)

 ROOT DIRECTORY CLEANED: Only README.md remains in scripts root
- scripts/README.md: Main documentation
- scripts/SCRIPTS_ORGANIZATION.md: Complete organization guide
- All functional scripts moved to appropriate subdirectories

 SCRIPTS CATEGORIZATION:
📁 GitHub Operations: PR resolution, repository management, Git workflows
📁 Synchronization: Bulk sync, fast sync, sync detection, SystemD sync
📁 Security: Security audits, monitoring, vulnerability scanning
📁 Monitoring: Health checks, log monitoring, network monitoring, production monitoring
📁 Maintenance: Cleanup operations, performance tuning, weekly maintenance
📁 Deployment: Release building, node provisioning, DAO deployment, production deployment
📁 Testing: E2E testing, workflow testing, QA cycles, service testing
📁 Utilities: System management, setup scripts, helpers, tools

 ORGANIZATION BENEFITS:
- Better Navigation: Scripts grouped by functionality
- Easier Maintenance: Related scripts grouped together
- Scalable Structure: Easy to add new scripts to appropriate categories
- Clear Documentation: Comprehensive organization guide with descriptions
- Improved Workflow: Quick access to relevant scripts by category

 DOCUMENTATION ENHANCED:
- SCRIPTS_ORGANIZATION.md: Complete directory structure and usage guide
- Quick Reference: Common script usage examples
- Script Descriptions: Purpose and functionality for each script
- Maintenance Guidelines: How to keep organization current

DIRECTORY STRUCTURE:
📁 scripts/
├── README.md (Main documentation)
├── SCRIPTS_ORGANIZATION.md (Organization guide)
├── github/ (6 files - GitHub operations)
├── sync/ (4 files - Synchronization)
├── security/ (2 files - Security)
├── monitoring/ (6 files - Monitoring)
├── maintenance/ (4 files - Maintenance)
├── deployment/ (11 files - Deployment)
├── testing/ (13 files - Testing)
├── utils/ (47 files - Utilities)
├── ci/ (existing - CI/CD)
├── deployment/ (existing - legacy deployment)
├── development/ (existing - Development tools)
├── monitoring/ (existing - Legacy monitoring)
├── services/ (existing - Service management)
├── testing/ (existing - Legacy testing)
├── utils/ (existing - Legacy utilities)
├── workflow/ (existing - Workflow automation)
└── workflow-openclaw/ (existing - OpenClaw workflows)

RESULT: Successfully reorganized 27 unorganized scripts into 8 functional categories, creating a clean, maintainable, and well-documented scripts directory structure with comprehensive organization guide.
2026-03-30 17:13:27 +02:00

286 lines
12 KiB
Python
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
OpenClaw DAO Deployment Script
Deploys and configures the complete OpenClaw DAO governance system
"""
import asyncio
import json
import time
from web3 import Web3
from web3.contract import Contract
class OpenClawDAODeployment:
def __init__(self, web3_provider: str, private_key: str):
self.w3 = Web3(Web3.HTTPProvider(web3_provider))
self.account = self.w3.eth.account.from_key(private_key)
self.address = self.account.address
# Contract addresses (will be set after deployment)
self.dao_contract = None
self.agent_wallet_template = None
self.gpu_staking = None
self.timelock = None
self.governance_token = None
async def deploy_all(self, governance_token_address: str) -> dict:
"""Deploy complete OpenClaw DAO system"""
print("🚀 Deploying OpenClaw DAO Governance System...")
# 1. Deploy TimelockController
print("1⃣ Deploying TimelockController...")
self.timelock = await self.deploy_timelock()
# 2. Deploy OpenClawDAO
print("2⃣ Deploying OpenClawDAO...")
self.dao_contract = await self.deploy_dao(governance_token_address)
# 3. Deploy AgentWallet template
print("3⃣ Deploying AgentWallet template...")
self.agent_wallet_template = await self.deploy_agent_wallet_template()
# 4. Deploy GPUStaking
print("4⃣ Deploying GPUStaking...")
self.gpu_staking = await self.deploy_gpu_staking(governance_token_address)
# 5. Configure system
print("5⃣ Configuring system...")
await self.configure_system()
# 6. Create initial snapshot
print("6⃣ Creating initial voting snapshot...")
await self.create_initial_snapshot()
# 7. Register initial agents
print("7⃣ Registering initial agents...")
await self.register_initial_agents()
# 8. Create initial staking pool
print("8⃣ Creating initial staking pool...")
await self.create_staking_pool()
deployment_info = {
"dao_address": self.dao_contract.address,
"timelock_address": self.timelock.address,
"agent_wallet_template": self.agent_wallet_template.address,
"gpu_staking_address": self.gpu_staking.address,
"governance_token": governance_token_address,
"deployer": self.address,
"deployment_time": time.time(),
"network": self.w3.eth.chain_id
}
print("✅ OpenClaw DAO deployment complete!")
return deployment_info
async def deploy_timelock(self) -> Contract:
"""Deploy TimelockController contract"""
# Timelock constructor parameters
min_delay = 2 * 24 * 60 * 60 # 2 days
proposers = [self.address] # Deployer as initial proposer
executors = [self.address] # Deployer as initial executor
# Timelock bytecode (simplified - use actual compiled bytecode)
timelock_bytecode = "0x..." # Actual bytecode needed
timelock_abi = [] # Actual ABI needed
# Deploy contract
contract = self.w3.eth.contract(abi=timelock_abi, bytecode=timelock_bytecode)
tx_hash = self.w3.eth.send_transaction({
'from': self.address,
'data': contract.constructor(min_delay, proposers, executors).encode_transaction_data(),
'gas': 3000000,
'gasPrice': self.w3.eth.gas_price,
'nonce': self.w3.eth.get_transaction_count(self.address)
})
receipt = self.w3.eth.wait_for_transaction_receipt(tx_hash)
return self.w3.eth.contract(address=receipt.contractAddress, abi=timelock_abi)
async def deploy_dao(self, governance_token_address: str) -> Contract:
"""Deploy OpenClawDAO contract"""
# DAO bytecode and ABI (from compiled contract)
dao_bytecode = "0x..." # Actual bytecode needed
dao_abi = [] # Actual ABI needed
contract = self.w3.eth.contract(abi=dao_abi, bytecode=dao_bytecode)
tx_hash = self.w3.eth.send_transaction({
'from': self.address,
'data': contract.constructor(governance_token_address, self.timelock.address).encode_transaction_data(),
'gas': 5000000,
'gasPrice': self.w3.eth.gas_price,
'nonce': self.w3.eth.get_transaction_count(self.address)
})
receipt = self.w3.eth.wait_for_transaction_receipt(tx_hash)
return self.w3.eth.contract(address=receipt.contractAddress, abi=dao_abi)
async def deploy_agent_wallet_template(self) -> Contract:
"""Deploy AgentWallet template contract"""
agent_wallet_bytecode = "0x..." # Actual bytecode needed
agent_wallet_abi = [] # Actual ABI needed
contract = self.w3.eth.contract(abi=agent_wallet_abi, bytecode=agent_wallet_bytecode)
tx_hash = self.w3.eth.send_transaction({
'from': self.address,
'data': contract.constructor(
self.address,
1, # PROVIDER role as default
self.dao_contract.address,
self.governance_token
).encode_transaction_data(),
'gas': 2000000,
'gasPrice': self.w3.eth.gas_price,
'nonce': self.w3.eth.get_transaction_count(self.address)
})
receipt = self.w3.eth.wait_for_transaction_receipt(tx_hash)
return self.w3.eth.contract(address=receipt.contractAddress, abi=agent_wallet_abi)
async def deploy_gpu_staking(self, governance_token_address: str) -> Contract:
"""Deploy GPUStaking contract"""
gpu_staking_bytecode = "0x..." # Actual bytecode needed
gpu_staking_abi = [] # Actual ABI needed
contract = self.w3.eth.contract(abi=gpu_staking_abi, bytecode=gpu_staking_bytecode)
tx_hash = self.w3.eth.send_transaction({
'from': self.address,
'data': contract.constructor(governance_token_address).encode_transaction_data(),
'gas': 3000000,
'gasPrice': self.w3.eth.gas_price,
'nonce': self.w3.eth.get_transaction_count(self.address)
})
receipt = self.w3.eth.wait_for_transaction_receipt(tx_hash)
return self.w3.eth.contract(address=receipt.contractAddress, abi=gpu_staking_abi)
async def configure_system(self):
"""Configure the deployed system"""
# Transfer timelock ownership to DAO
tx_hash = self.w3.eth.send_transaction({
'from': self.address,
'to': self.timelock.address,
'data': self.timelock.functions.transferOwnership(self.dao_contract.address).encode_transaction_data(),
'gas': 100000,
'gasPrice': self.w3.eth.gas_price,
'nonce': self.w3.eth.get_transaction_count(self.address)
})
self.w3.eth.wait_for_transaction_receipt(tx_hash)
# Set up multi-sig signers
multi_sig_signers = [
self.address,
"0x1234567890123456789012345678901234567890", # Additional signer 1
"0x2345678901234567890123456789012345678901", # Additional signer 2
]
for signer in multi_sig_signers:
tx_hash = self.w3.eth.send_transaction({
'from': self.address,
'to': self.dao_contract.address,
'data': self.dao_contract.functions.addMultiSigSigner(signer).encode_transaction_data(),
'gas': 100000,
'gasPrice': self.w3.eth.gas_price,
'nonce': self.w3.eth.get_transaction_count(self.address)
})
self.w3.eth.wait_for_transaction_receipt(tx_hash)
async def create_initial_snapshot(self):
"""Create initial voting snapshot"""
tx_hash = self.w3.eth.send_transaction({
'from': self.address,
'to': self.dao_contract.address,
'data': self.dao_contract.functions.createVotingSnapshot().encode_transaction_data(),
'gas': 200000,
'gasPrice': self.w3.eth.gas_price,
'nonce': self.w3.eth.get_transaction_count(self.address)
})
self.w3.eth.wait_for_transaction_receipt(tx_hash)
async def register_initial_agents(self):
"""Register initial agent wallets"""
agent_configs = [
{"address": "0x3456789012345678901234567890123456789012", "role": 1}, # PROVIDER
{"address": "0x4567890123456789012345678901234567890123", "role": 2}, # CONSUMER
{"address": "0x5678901234567890123456789012345678901234", "role": 3}, # BUILDER
{"address": "0x6789012345678901234567890123456789012345", "role": 4}, # COORDINATOR
]
for config in agent_configs:
# Deploy agent wallet
agent_wallet = await self.deploy_agent_wallet(
config["address"],
config["role"]
)
# Register with DAO
tx_hash = self.w3.eth.send_transaction({
'from': self.address,
'to': self.dao_contract.address,
'data': self.dao_contract.functions.registerAgentWallet(
agent_wallet.address,
config["role"]
).encode_transaction_data(),
'gas': 200000,
'gasPrice': self.w3.eth.gas_price,
'nonce': self.w3.eth.get_transaction_count(self.address)
})
self.w3.eth.wait_for_transaction_receipt(tx_hash)
async def deploy_agent_wallet(self, owner_address: str, role: int) -> Contract:
"""Deploy individual agent wallet"""
agent_wallet_bytecode = "0x..." # Actual bytecode needed
agent_wallet_abi = [] # Actual ABI needed
contract = self.w3.eth.contract(abi=agent_wallet_abi, bytecode=agent_wallet_bytecode)
tx_hash = self.w3.eth.send_transaction({
'from': self.address,
'data': contract.constructor(
owner_address,
role,
self.dao_contract.address,
self.governance_token
).encode_transaction_data(),
'gas': 2000000,
'gasPrice': self.w3.eth.gas_price,
'nonce': self.w3.eth.get_transaction_count(self.address)
})
receipt = self.w3.eth.wait_for_transaction_receipt(tx_hash)
return self.w3.eth.contract(address=receipt.contractAddress, abi=agent_wallet_abi)
async def create_staking_pool(self):
"""Create initial GPU staking pool"""
tx_hash = self.w3.eth.send_transaction({
'from': self.address,
'to': self.gpu_staking.address,
'data': self.gpu_staking.functions.createPool(
"Initial GPU Pool",
1e15 # Base reward rate
).encode_transaction_data(),
'gas': 300000,
'gasPrice': self.w3.eth.gas_price,
'nonce': self.w3.eth.get_transaction_count(self.address)
})
self.w3.eth.wait_for_transaction_receipt(tx_hash)
async def main():
"""Main deployment function"""
# Configuration
WEB3_PROVIDER = "http://localhost:8545" # Local Ethereum node
PRIVATE_KEY = "0x..." # Deployer private key
GOVERNANCE_TOKEN = "0x..." # Existing AITBC token address
# Deploy system
deployer = OpenClawDAODeployment(WEB3_PROVIDER, PRIVATE_KEY)
deployment_info = await deployer.deploy_all(GOVERNANCE_TOKEN)
# Save deployment info
with open("openclaw_dao_deployment.json", "w") as f:
json.dump(deployment_info, f, indent=2)
print(f"🎉 Deployment complete! Check openclaw_dao_deployment.json for details")
if __name__ == "__main__":
asyncio.run(main())