Spaces:
Sleeping
Sleeping
| 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 = """ | |
| <script> | |
| function copyCode() { | |
| const codeElement = document.querySelector('.output-box pre'); | |
| const codeText = codeElement.innerText; | |
| navigator.clipboard.writeText(codeText).then(() => { | |
| alert('Code copied to clipboard!'); | |
| }); | |
| } | |
| </script> | |
| """ | |
| # 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() |