- Add Chinese version: AGPL-VIOLATION-REPORT-ChainOpera.md - Add English version: AGPL-VIOLATION-REPORT-ChainOpera-EN.md - Document timeline evidence, technical comparison, and legal analysis - Address "Python rewrite" defense with AGPL and copyright law references
9.3 KiB
AGPL Violation Evidence Report: ChainOpera Plagiarized NOFX
Report Date: December 20, 2025 Reporting Party: NOFX Open Source Community Project URL: https://github.com/NoFxAiOS/nofx Accused Party: ChainOpera (COAI) License Involved: GNU Affero General Public License v3.0 (AGPL-3.0)
1. Executive Summary
ChainOpera used the equity-history-batch API interface design from the NOFX project, which is protected under AGPL-3.0, on their website trading-test.chainopera.ai, but refused to release their source code, violating the AGPL-3.0 license terms.
ChainOpera claims the interface was "rewritten in Python." This report will prove from both legal and technical perspectives that: even a rewrite still constitutes an AGPL violation.
2. Timeline Evidence
2.1 AGPL License Effective Date
| Item | Details |
|---|---|
| Effective Time | 2025-11-03 19:50:50 (UTC+8) |
| Commit Hash | e88f84215831d1682e05141eb0c27216dcbd6d47 |
| Author | SkywalkerJi skywalkerji.cn@gmail.com |
| Commit Message | "Upgrade this repository's open-source license to AGPL." |
2.2 equity-history-batch Interface Creation Date
| Item | Details |
|---|---|
| Creation Time | 2025-11-03 20:14:39 (UTC+8) |
| Commit Hash | 5af5c0b51773737f166eacea646e3960cee29f59 |
| Author | icy icyoung520@gmail.com |
| Commit Message | "Enhance leaderboard and security for trader management" |
2.3 Key Conclusion
AGPL Effective Time: 2025-11-03 19:50:50
Interface Creation: 2025-11-03 20:14:39
Time Difference: 24 minutes
Conclusion: The equity-history-batch interface has been protected
under AGPL-3.0 since its creation.
3. Technical Evidence: Code Comparison
3.1 API Path Comparison
| Project | API Path | HTTP Method |
|---|---|---|
| NOFX | /api/equity-history-batch |
POST |
| ChainOpera | /api/equity-history-batch |
POST |
Similarity: 100%
3.2 Response Structure Comparison
NOFX Original Code (api/server.go lines 2725-2729):
result["histories"] = histories
result["count"] = len(histories)
if len(errors) > 0 {
result["errors"] = errors
}
ChainOpera Actual Response (from network request screenshot):
{
"histories": {...},
"errors": {},
"count": 1
}
Comparison Results:
| Field | NOFX | ChainOpera | Similarity |
|---|---|---|---|
histories |
✓ | ✓ | 100% |
errors |
✓ | ✓ | 100% |
count |
✓ | ✓ | 100% |
3.3 History Data Fields Comparison
NOFX Original Code (api/server.go lines 2676-2682):
history = append(history, map[string]interface{}{
"timestamp": snap.Timestamp,
"total_equity": snap.TotalEquity,
"total_pnl": snap.UnrealizedPnL,
"total_pnl_pct": pnlPct,
"balance": snap.Balance,
})
ChainOpera Actual Response:
{
"timestamp": "2025-12-15T11:21:05.432240",
"balance": 227.30274403,
"equity": 227.30274403,
"total_pnl": 0
}
Comparison Results:
| NOFX Field | ChainOpera Field | Similarity |
|---|---|---|
timestamp |
timestamp |
100% |
balance |
balance |
100% |
total_equity |
equity |
Semantically identical |
total_pnl |
total_pnl |
100% |
3.4 Originality Evidence
equity-history-batch is an original design by NOFX:
- Interface Naming:
equity-history-batchis a self-created compound term, not an industry standard - Batch Query Design: Supporting multiple trader_id queries simultaneously is a unique design for performance optimization
- Response Structure: The
{histories, errors, count}triplet is an original design - Time Filtering: The
hoursparameter design is an original feature
4. Legal Rebuttal to the "Python Rewrite" Defense
4.1 AGPL-3.0 Definition of "Modify"
AGPL-3.0 Section 0:
"To 'modify' a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy."
Key Point: Rewriting in another language (Go → Python) constitutes "adaptation" and remains subject to AGPL.
4.2 Legal Definition of Derivative Works
AGPL-3.0 Section 0:
A "covered work" means either the unmodified Program or a work based on the Program.
U.S. Copyright Law 17 U.S.C. § 101:
A "derivative work" is a work based upon one or more preexisting works, such as a translation... in which a work may be recast, transformed, or adapted.
Key Point: "Translating" Go code to Python code falls under the legal definition of a "derivative work."
4.3 Why "Rewriting" Still Constitutes Infringement
| Argument | Legal Analysis |
|---|---|
| "We rewrote it in Python" | Language conversion is "adaptation"; derivative works must comply with the original license |
| "The code is completely different" | Copyright protects expression; API design is a form of expression |
| "This is generic functionality" | equity-history-batch naming and {histories, errors, count} structure are original designs, not generic functionality |
4.4 Case Reference
Oracle v. Google (2021):
The U.S. Supreme Court confirmed that API designs are subject to copyright protection. Even though Google reimplemented the Java API, copyright issues still needed to be considered.
Key Implications:
- The Structure, Sequence, and Organization (SSO) of APIs is protected by copyright
- Even if implemented in a different language, identical API designs may still constitute infringement
5. Questions ChainOpera Must Answer
ChainOpera has not responded to the following core questions:
| # | Question | ChainOpera Response |
|---|---|---|
| 1 | Why is the API path identical to NOFX? | ❌ No response |
| 2 | Why is the response structure {histories, errors, count} identical? |
❌ No response |
| 3 | Why are field names timestamp, balance, total_pnl identical? |
❌ No response |
| 4 | If independently developed, why is it highly consistent with NOFX? | ❌ No response |
| 5 | Are you willing to release source code per AGPL-3.0? | ❌ No response |
6. Git Evidence Verification Method
Anyone can verify the authenticity of the evidence with the following commands:
# Clone the repository
git clone https://github.com/NoFxAiOS/nofx.git
cd nofx
# Verify AGPL license effective date
git show e88f84215831d1682e05141eb0c27216dcbd6d47 --format="%H %ai %s" --no-patch
# Output: e88f8421... 2025-11-03 19:50:50 +0800 Upgrade this repository's open-source license to AGPL.
# Verify equity-history-batch interface creation date
git show 5af5c0b51773737f166eacea646e3960cee29f59 --format="%H %ai %s" --no-patch
# Output: 5af5c0b5... 2025-11-03 20:14:39 +0800 Enhance leaderboard and security for trader management
# View interface implementation code
git show 5af5c0b51773737f166eacea646e3960cee29f59:api/server.go | grep -A 50 "handleEquityHistoryBatch"
7. Legal Basis Summary
7.1 Key AGPL-3.0 Provisions
Section 13 - Remote Network Interaction:
Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network... an opportunity to receive the Corresponding Source of your version.
7.2 ChainOpera's Violations
| Violation | Description |
|---|---|
| Using AGPL code | Used NOFX's API design |
| Providing network service | Operating publicly at trading-test.chainopera.ai |
| Not releasing source code | No source code access provided |
| Not declaring license | Did not declare use of AGPL code |
8. Evidence List
| # | Evidence Type | Description | Preservation Method |
|---|---|---|---|
| 1 | Git Commit | AGPL license effective record | SHA-1: e88f8421... |
| 2 | Git Commit | equity-history-batch creation record | SHA-1: 5af5c0b5... |
| 3 | Source Code | api/server.go lines 2542-2732 | Git repository |
| 4 | Website Screenshot | ChainOpera API response | Blockchain timestamping recommended |
| 5 | Network Request | trading-test.chainopera.ai request logs | Notarization recommended |
9. Conclusions
-
Timeline evidence is conclusive: The
equity-history-batchinterface was created 24 minutes after AGPL took effect; it has been protected since inception. -
Technical evidence is sufficient: API path, response structure, and field naming are highly consistent, beyond reasonable coincidence.
-
"Python rewrite" defense is invalid:
- Language conversion constitutes "adaptation"; derivative works must comply with AGPL
- API design itself is protected by copyright
- Identical structure, sequence, and organization proves copying, not independent development
-
ChainOpera must either:
- Release their complete source code in compliance with AGPL-3.0; OR
- Cease using the related functionality and take down the service
10. Contact Information
For any questions, please contact:
- GitHub Issues: https://github.com/NoFxAiOS/nofx/issues
- Email: [Project maintainer email]
Disclaimer: This report only states facts and legal analysis. The NOFX community reserves the right to pursue legal action for infringement.
Report Version: 1.0 Last Updated: 2025-12-20