-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdeploy.py
More file actions
151 lines (125 loc) · 4.74 KB
/
deploy.py
File metadata and controls
151 lines (125 loc) · 4.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#!/usr/bin/env python3
import argparse
import os
import sys
from pytezos import pytezos
from pytezos.crypto.key import Key
from hashlib import sha256
from utils import ContractDeployment, Network, load_lambda_from_name, get_tezos_storage
from templates import get_fragments_from_template
def get_wallet_from_env():
"""Get wallet from environment variable"""
private_key = os.getenv('TEZOS_PRIVATE_KEY')
if not private_key:
print("Error: TEZOS_PRIVATE_KEY environment variable not set")
print("Please set your private key: export TEZOS_PRIVATE_KEY='your_private_key_here'")
sys.exit(1)
try:
return Key.from_encoded_key(private_key)
except Exception as e:
print(f"Error: Invalid private key format: {e}")
print("Please ensure TEZOS_PRIVATE_KEY is a valid Tezos private key")
sys.exit(1)
def get_wallet_test(name):
"""Get test wallet (for development only)"""
return Key.from_secret_exponent(sha256(name.encode()).digest())
def main():
parser = argparse.ArgumentParser(description='Deploy bootloader contracts to Tezos')
parser.add_argument(
'--network',
choices=['ghostnet', 'mainnet'],
required=True,
help='Network to deploy to (ghostnet or mainnet)'
)
parser.add_argument(
'--use-cache',
action='store_true',
help='Use cached contract addresses when available'
)
parser.add_argument(
'--clear-cache',
action='store_true',
help='Clear cached contract addresses before deployment'
)
parser.add_argument(
'--test-wallet',
action='store_true',
help='Use test wallet instead of environment key (development only)'
)
args = parser.parse_args()
# Get network
if args.network == 'ghostnet':
network = Network.ghostnet
elif args.network == 'mainnet':
network = Network.mainnet
# Get wallet
if args.test_wallet:
print("WARNING: Using test wallet (development only)")
wallet = get_wallet_test("bootloader_test")
else:
wallet = get_wallet_from_env()
print(f"Deploying with wallet: {wallet.public_key_hash()}")
print(f"Network: {args.network}")
# Initialize PyTezos client
pt = pytezos.using(key=wallet.secret_key(), shell=network)
# Load template fragments
fragments = get_fragments_from_template('templates/v0.0.1')
# Try existing randomiser on ghostnet first
print("Deploying randomiser contract")
randomiser_deployer = ContractDeployment.from_name('randomiser')
randomiser_deployer.update_storage({
"testnet_mode": network == Network.ghostnet
})
randomiser_deployer.set_pytezos_client(pt)
randomiser_deployer.set_network(network)
if args.use_cache:
randomiser_deployer.use_cache()
if args.clear_cache:
randomiser_deployer.clear_cache()
randomiser_address = randomiser_deployer.deploy()
metadata = get_tezos_storage(
name="bootloader:",
description="open experimental on-chain long-form generative art",
imageUri="ipfs://bafkreic2zzpvkzfztgwrlavpit2psrip5xcgqfov4hq6ec4r5ds5didxim",
homepage=f"https://{'ghostnet.' if args.network == 'ghostnet' else ''}bootloader.art",
)
# Deploy bootloader contract
print("Deploying bootloader contract")
nft_deployer = ContractDeployment.from_name('bootloader')
nft_deployer.update_storage({
"metadata": metadata,
"administrator": wallet.public_key_hash(),
"rng_contract": randomiser_address,
"treasury": wallet.public_key_hash(),
"platform_fee_bps": 2_000,
})
nft_deployer.set_pytezos_client(pt)
nft_deployer.set_network(network)
if args.use_cache:
nft_deployer.use_cache()
if args.clear_cache:
nft_deployer.clear_cache()
nft_address = nft_deployer.deploy()
nft = pt.contract(nft_address)
print("Adding generator type")
# Load the lambda function
bootloader = load_lambda_from_name('lambda_0_0_1')
if args.network == 'ghostnet':
bootloader = load_lambda_from_name('lambda_0_0_1_ghostnet')
# Add bootloader to contract
operation_hash = nft.add_bootloader(
version='svg-js:0.0.1'.encode(),
fragments=[f.encode() for f in fragments],
fun=bootloader,
storage_limits={
"code": 30000,
"desc": 8000,
"name": 100,
"author": 36,
}
).send(min_confirmations=1).hash()
print(f"Bootloader added successfully: {operation_hash}")
print(f"Bootloader contract: {nft_address}")
print(f"Randomiser contract: {randomiser_address}")
if __name__ == "__main__":
main()