import gradio as gr from transformers import AutoTokenizer, AutoModelForCausalLM import torch # Load the CodeParrot model and tokenizer model_name = "codeparrot/codeparrot-small" # Replace with your desired model tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained(model_name) # Function to generate smart contract code def generate_smart_contract(language, requirements): try: # Create a prompt for the model prompt = f"Generate a {language} smart contract with the following requirements: {requirements}" # Tokenize the input inputs = tokenizer(prompt, return_tensors="pt").to("cuda" if torch.cuda.is_available() else "cpu") # Generate code outputs = model.generate(**inputs, max_length=500) # Adjust max_length as needed generated_code = tokenizer.decode(outputs[0], skip_special_tokens=True) return generated_code except Exception as e: return f"Error generating smart contract: {str(e)}" # Custom CSS for a dark box with green text and copy button custom_css = """ body { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%); color: #fff; perspective: 1000px; overflow: hidden; } .gradio-container { background: rgba(255, 255, 255, 0.1); border-radius: 15px; padding: 20px; box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1); backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.3); transform-style: preserve-3d; transform: rotateY(0deg) rotateX(0deg); transition: transform 0.5s ease; } .gradio-container:hover { transform: rotateY(10deg) rotateX(10deg); } .gradio-input, .gradio-output { background: rgba(255, 255, 255, 0.2); border: none; border-radius: 10px; padding: 10px; color: #fff; transform-style: preserve-3d; transition: transform 0.3s ease; } .gradio-input:focus, .gradio-output:focus { background: rgba(255, 255, 255, 0.3); outline: none; transform: translateZ(20px); } .gradio-button { background: linear-gradient(135deg, #6a11cb 0%, #2575fc 100%); border: none; border-radius: 10px; color: #fff; padding: 10px 20px; font-size: 16px; cursor: pointer; transition: background 0.3s ease, transform 0.3s ease; transform-style: preserve-3d; } .gradio-button:hover { background: linear-gradient(135deg, #2575fc 0%, #6a11cb 100%); transform: translateZ(10px); } h1 { text-align: center; font-size: 2.5em; margin-bottom: 20px; color: white; /* White title color */ transform-style: preserve-3d; transform: translateZ(30px); } @keyframes float { 0% { transform: translateY(0) translateZ(0); } 50% { transform: translateY(-10px) translateZ(10px); } 100% { transform: translateY(0) translateZ(0); } } .gradio-container { animation: float 4s ease-in-out infinite; } /* Dark box with green text for output */ .output-box { background: #1e1e1e; /* Dark background */ padding: 15px; border-radius: 10px; color: #00ff00; /* Green text */ font-family: 'Courier New', Courier, monospace; font-size: 14px; line-height: 1.5; overflow-x: auto; white-space: pre-wrap; /* Preserve formatting */ position: relative; } /* Copy button */ .copy-button { position: absolute; top: 10px; right: 10px; background: #2575fc; border: none; border-radius: 5px; color: #fff; padding: 5px 10px; font-size: 12px; cursor: pointer; transition: background 0.3s ease; } .copy-button:hover { background: #6a11cb; } """ # JavaScript for the copy button copy_js = """ """ # Gradio interface for the app def generate_contract(language, requirements): return generate_smart_contract(language, requirements) # Dropdown options for programming languages languages = ["Solidity", "Vyper", "Rust", "JavaScript", "Python"] # Create a custom layout with gr.Blocks(css=custom_css) as demo: gr.Markdown("# Smart Contract Generator") gr.Markdown("Generate smart contracts using AI.") # Inject JavaScript gr.HTML(copy_js) # Output box with copy button with gr.Column(): output_box = gr.HTML(label="Generated Smart Contract", elem_classes="output-box") copy_button = gr.Button("Copy Code", elem_classes="copy-button") # Input row with gr.Row(equal_height=True, variant="panel"): language_dropdown = gr.Dropdown(label="Programming Language", choices=languages, value="Solidity") requirements_input = gr.Textbox(label="Requirements", placeholder="e.g., ERC20 token with minting functionality") submit_button = gr.Button("Generate", variant="primary") # Link the function to the inputs and output submit_button.click( generate_contract, inputs=[language_dropdown, requirements_input], outputs=output_box ) # Launch the Gradio app demo.launch()