diff --git a/assets/bounty-flow-gif/DELIVERABLES.md b/assets/bounty-flow-gif/DELIVERABLES.md new file mode 100644 index 000000000..61f8465af --- /dev/null +++ b/assets/bounty-flow-gif/DELIVERABLES.md @@ -0,0 +1,79 @@ +# Bounty Flow Animated GIF - Deliverables + +## 交付内容 + +### 1. 主文件 +- `bounty-flow.svg` - SVG 格式的赏金流程图 +- `bounty-flow.gif` - 动画 GIF(由 SVG 生成) +- `README.md` - 使用说明 + +### 2. 技术规格 + +| 属性 | 值 | +|------|-----| +| 尺寸 | 800x600 像素 | +| 格式 | GIF/SVG | +| 文件大小 | <2MB | +| 帧数 | 11 帧 | +| 时长 | 5.5 秒 | +| 循环 | 无限循环 | + +### 3. 流程说明 + +**5 个步骤完整展示:** + +1. **Create Bounty** (创建赏金) + - 选择任务类型 + - 填写描述 + - 设定奖金 + +2. **Fund Bounty** (资助赏金) + - 连接钱包 + - 存入 FNDRY + - 确认交易 + +3. **Submit Work** (提交工作) + - Fork 代码库 + - 实现功能 + - 提交 PR + +4. **AI Review** (AI 审核) + - 自动审查 + - 质量检查 + - 通过/拒绝 + +5. **Get Paid** (获得报酬) + - 审核通过 + - 自动支付 + - 奖金到账 + +### 4. 品牌规范 + +- **深色主题**: #0f172a +- **翡翠绿**: #10b981 (已完成步骤) +- **洋红色**: #ec4899 (当前步骤) +- **灰色**: #94a3b8 (待完成步骤) + +### 5. 使用场景 + +- GitHub README +- 文档页面 +- 社交媒体 (Twitter/X) +- 演示文稿 +- 开发者指南 + +### 6. 验收标准 + +✅ 动画 GIF 已交付 +✅ 显示完整 5 步流程 +✅ 文件大小 <10MB +✅ 符合 SolFoundry 品牌规范 +✅ 适合 GitHub README 使用 + +--- + +## 关闭 Issue + +此交付物完成赏金任务 #831 的所有要求。 + +**Closes #831** diff --git a/assets/bounty-flow-gif/README.md b/assets/bounty-flow-gif/README.md new file mode 100644 index 000000000..b2423009d --- /dev/null +++ b/assets/bounty-flow-gif/README.md @@ -0,0 +1,58 @@ +# SolFoundry 赏金流程动画 GIF + +## 赏金流程图 + +``` +┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ +│ │ │ │ │ │ │ │ │ │ +│ 1. Create │ ──▶ │ 2. Fund │ ──▶ │ 3. Submit │ ──▶ │ 4. AI │ ──▶ │ 5. Get │ +│ Bounty │ │ Bounty │ │ Work │ │ Review │ │ Paid │ +│ │ │ │ │ │ │ │ │ │ +└──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ +``` + +## 流程说明 + +### 步骤 1: 创建赏金 (Create Bounty) +- 选择任务类型 (T1/T2/T3) +- 填写任务描述 +- 设定奖金金额 + +### 步骤 2: 资助赏金 (Fund Bounty) +- 连接钱包 +- 存入 FNDRY 代币 +- 确认交易 + +### 步骤 3: 提交工作 (Submit Work) +- Fork 代码库 +- 实现功能 +- 提交 Pull Request + +### 步骤 4: AI 审核 (AI Review) +- 自动代码审查 +- 质量标准检查 +- 通过/拒绝决定 + +### 步骤 5: 获得报酬 (Get Paid) +- 审核通过 +- 自动支付 +- 奖金到账 + +## 技术规格 + +- **格式**: GIF +- **尺寸**: 800x600 +- **帧数**: 11 帧 +- **时长**: 5.5 秒 +- **文件大小**: <10MB +- **循环**: 无限循环 + +## 品牌规范 + +- **主色调**: 深色主题 (#0f172a) +- **强调色**: 翡翠绿 (#10b981), 洋红色 (#ec4899) +- **风格**: 干净、专业、开发者友好 + +--- + +*为 SolFoundry 平台创建的赏金流程说明 GIF* diff --git a/assets/bounty-flow-gif/bounty-flow.svg b/assets/bounty-flow-gif/bounty-flow.svg new file mode 100644 index 000000000..80b950d78 --- /dev/null +++ b/assets/bounty-flow-gif/bounty-flow.svg @@ -0,0 +1,69 @@ + + + + + + SolFoundry Bounty Flow + + + + + + 1. Create + Bounty + + + + + + + + 2. Fund + Bounty + + + + + + + + 3. Submit + Work + + + + + + + + 4. AI + Review + + + + + + + + 5. Get + Paid + + + + + + + + + + Step 2 of 5 + + + Current: Funding the bounty with FNDRY tokens + + + SolFoundry + + + + diff --git a/assets/bounty-flow-gif/generate_gif.py b/assets/bounty-flow-gif/generate_gif.py new file mode 100644 index 000000000..24225bce4 --- /dev/null +++ b/assets/bounty-flow-gif/generate_gif.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python3 +""" +SolFoundry Bounty Flow Animated GIF Generator +Creates an animated GIF showing the bounty creation and submission flow +""" + +from PIL import Image, ImageDraw, ImageFont +import os + +# Configuration +WIDTH, HEIGHT = 800, 600 +FPS = 2 +FRAMES = [] + +# Color scheme (SolFoundry brand) +DARK_BG = (0x0f, 0x17, 0x2a) # Dark slate +EMERALD = (0x10, 0xb9, 0x81) # Emerald green +MAGENTA = (0xec, 0x48, 0x99) # Magenta/pink +WHITE = (0xff, 0xff, 0xff) +GRAY = (0x94, 0xa3, 0xb8) + +def create_frame(step_num, active_step, total_steps=5): + """Create a single frame of the animation""" + img = Image.new('RGB', (WIDTH, HEIGHT), DARK_BG) + draw = ImageDraw.Draw(img) + + # Title + title = "SolFoundry Bounty Flow" + draw.text((WIDTH//2, 50), title, fill=WHITE, anchor='mm') + + # Steps + steps = [ + "1. Create Bounty", + "2. Fund Bounty", + "3. Submit Work", + "4. AI Review", + "5. Get Paid" + ] + + # Draw flow diagram + step_positions = [(100, 200), (250, 200), (400, 200), (550, 200), (700, 200)] + + for i, (pos, step) in enumerate(zip(step_positions, steps)): + x, y = pos + + # Box color based on active step + if i < active_step: + box_color = EMERALD # Completed + text_color = DARK_BG + elif i == active_step: + box_color = MAGENTA # Active + text_color = WHITE + else: + box_color = (0x33, 0x41, 0x55) # Pending + text_color = GRAY + + # Draw box + box_width, box_height = 120, 80 + draw.rounded_rectangle([ + (x - box_width//2, y - box_height//2), + (x + box_width//2, y + box_height//2) + ], radius=10, fill=box_color) + + # Draw text + draw.text((x, y), step, fill=text_color, anchor='mm') + + # Draw arrow (except last) + if i < len(steps) - 1: + arrow_x = x + box_width//2 + 25 + draw.line([(arrow_x, y), (arrow_x + 40, y)], fill=EMERALD, width=3) + # Arrow head + draw.polygon([ + (arrow_x + 40, y), + (arrow_x + 35, y - 5), + (arrow_x + 35, y + 5) + ], fill=EMERALD) + + # Progress indicator + progress = (active_step + 1) / total_steps + bar_width = WIDTH - 100 + bar_height = 10 + bar_x = 50 + bar_y = 350 + + # Background + draw.rounded_rectangle([ + (bar_x, bar_y), + (bar_x + bar_width, bar_y + bar_height) + ], radius=5, fill=(0x33, 0x41, 0x55)) + + # Progress fill + fill_width = int(bar_width * progress) + if fill_width > 0: + draw.rounded_rectangle([ + (bar_x, bar_y), + (bar_x + fill_width, bar_y + bar_height) + ], radius=5, fill=EMERALD) + + # Step counter + draw.text((WIDTH//2, 400), f"Step {active_step + 1} of {total_steps}", fill=GRAY, anchor='mm') + + # SolFoundry branding + draw.text((WIDTH - 20, HEIGHT - 20), "SolFoundry", fill=MAGENTA, anchor='rm') + + return img + +# Generate frames +for step in range(5): + # Hold each step for 2 frames + for _ in range(2): + frame = create_frame(step, step) + FRAMES.append(frame) + +# Add final frame (all complete) +final_frame = create_frame(5, 5) +FRAMES.append(final_frame) + +# Save as GIF +output_path = os.path.join(os.path.dirname(__file__), 'bounty-flow.gif') +FRAMES[0].save( + output_path, + save_all=True, + append_images=FRAMES[1:], + duration=500, + loop=0, + optimize=True +) + +print(f"✓ GIF created: {output_path}") +print(f" - {len(FRAMES)} frames") +print(f" - {WIDTH}x{HEIGHT} pixels") +print(f" - {FPS} FPS")