Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions GPU/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@

settings/Mainnet.toml
settings/Testnet.toml
history.txt
4 changes: 4 additions & 0 deletions GPU/.vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@

{
"deno.enable": true,
}
18 changes: 18 additions & 0 deletions GPU/.vscode/tasks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@

{
"version": "2.0.0",
"tasks": [
{
"label": "check contracts",
"group": "test",
"type": "shell",
"command": "clarinet check"
},
{
"label": "test contracts",
"group": "test",
"type": "shell",
"command": "clarinet test"
}
]
}
11 changes: 11 additions & 0 deletions GPU/Clarinet.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[project]
name = "GPU"
authors = []
description = ""
telemetry = true
requirements = []
analysis = ["check_checker"]
costs_version = 2
[contracts.farm]
path = "contracts/farm.clar"
depends_on = []
258 changes: 258 additions & 0 deletions GPU/contracts/farm.clar
Original file line number Diff line number Diff line change
@@ -0,0 +1,258 @@
;; Decentralized GPU Rendering Farm - Clarity Smart Contract
;; Features: Provider management, Job handling, Payments, Reputation system

;; ============ DATA STRUCTURES ============

;; GPU Provider information
(define-map gpu-providers principal
{
owner: principal,
gpu-count: uint,
memory-gb: uint,
reputation: uint,
active: bool,
total-jobs: uint,
successful-jobs: uint
}
)

;; Rendering Jobs
(define-map rendering-jobs uint
{
requester: principal,
provider: (optional principal),
status: (string-ascii 20),
complexity: uint,
reward: uint,
timestamp: uint,
completion-time: (optional uint)
}
)

;; Job assignments
(define-map job-assignments uint
{
provider: principal,
start-time: uint,
estimated-duration: uint
}
)

;; Payment ledger
(define-map payments principal uint)

;; ============ CONSTANTS ============

(define-constant CONTRACT-OWNER tx-sender)
(define-constant MIN-STAKE u1000000)
(define-constant MIN-REPUTATION u1)
(define-constant JOB-TIMEOUT u86400)
(define-constant PLATFORM-FEE u2)

;; ============ STATE VARIABLES ============

(define-data-var next-job-id uint u1)
(define-data-var total-volume uint u0)

;; ============ ERRORS ============

(define-constant ERR-NOT-OWNER u101)
(define-constant ERR-INVALID-PROVIDER u102)
(define-constant ERR-INSUFFICIENT-STAKE u103)
(define-constant ERR-JOB-NOT-FOUND u104)
(define-constant ERR-INVALID-STATUS u105)
(define-constant ERR-LOW-REPUTATION u106)
(define-constant ERR-UNAUTHORIZED u107)

;; ============ PROVIDER MANAGEMENT ============

(define-public (register-gpu-provider (gpu-count uint) (memory-gb uint))
(begin
(asserts! (> gpu-count u0) (err ERR-INVALID-PROVIDER))
(asserts! (> memory-gb u0) (err ERR-INVALID-PROVIDER))
(map-set gpu-providers tx-sender
{
owner: tx-sender,
gpu-count: gpu-count,
memory-gb: memory-gb,
reputation: u100,
active: true,
total-jobs: u0,
successful-jobs: u0
}
)
(ok true)
)
)

(define-public (update-provider-resources (gpu-count uint) (memory-gb uint))
(let ((provider (map-get? gpu-providers tx-sender)))
(asserts! (is-some provider) (err ERR-INVALID-PROVIDER))
(map-set gpu-providers tx-sender
(merge (unwrap-panic provider) {gpu-count: gpu-count, memory-gb: memory-gb})
)
(ok true)
)
)

(define-public (toggle-provider-status)
(let ((provider (map-get? gpu-providers tx-sender)))
(asserts! (is-some provider) (err ERR-INVALID-PROVIDER))
(let ((data (unwrap-panic provider)))
(map-set gpu-providers tx-sender
(merge data {active: (not (get active data))})
)
)
(ok true)
)
)

;; ============ JOB MANAGEMENT ============

(define-public (create-job (complexity uint) (reward uint))
(let ((job-id (var-get next-job-id)))
(asserts! (> reward u0) (err ERR-INVALID-STATUS))
(asserts! (> complexity u0) (err ERR-INVALID-STATUS))
(map-set rendering-jobs job-id
{
requester: tx-sender,
provider: none,
status: "pending",
complexity: complexity,
reward: reward,
timestamp: block-height,
completion-time: none
}
)
(var-set next-job-id (+ job-id u1))
(ok job-id)
)
)

(define-public (assign-job (job-id uint) (provider principal) (duration uint))
(let ((job (map-get? rendering-jobs job-id))
(prov (map-get? gpu-providers provider)))
(asserts! (is-some job) (err ERR-JOB-NOT-FOUND))
(asserts! (is-some prov) (err ERR-INVALID-PROVIDER))
(let ((job-data (unwrap-panic job))
(prov-data (unwrap-panic prov)))
;; replaced equal? with is-eq for Clarity built-in function
(asserts! (is-eq (get status job-data) "pending") (err ERR-INVALID-STATUS))
(asserts! (get active prov-data) (err ERR-INVALID-PROVIDER))
(asserts! (>= (get reputation prov-data) MIN-REPUTATION) (err ERR-LOW-REPUTATION))
(map-set rendering-jobs job-id
(merge job-data {provider: (some provider), status: "in-progress"})
)
(map-set job-assignments job-id
{provider: provider, start-time: block-height, estimated-duration: duration}
)
(ok true)
)
)
)

(define-public (complete-job (job-id uint))
(let ((job (map-get? rendering-jobs job-id))
(assignment (map-get? job-assignments job-id)))
(asserts! (is-some job) (err ERR-JOB-NOT-FOUND))
(asserts! (is-some assignment) (err ERR-INVALID-STATUS))
(let ((job-data (unwrap-panic job))
(assign-data (unwrap-panic assignment))
(provider (get provider assign-data)))
;; replaced equal? with is-eq for Clarity built-in function
(asserts! (is-eq (get status job-data) "in-progress") (err ERR-INVALID-STATUS))
(asserts! (is-eq tx-sender provider) (err ERR-UNAUTHORIZED))
(map-set rendering-jobs job-id
(merge job-data {status: "completed", completion-time: (some block-height)})
)
(let ((prov (map-get? gpu-providers provider)))
(if (is-some prov)
(let ((p (unwrap-panic prov)))
(map-set gpu-providers provider
(merge p {
total-jobs: (+ (get total-jobs p) u1),
successful-jobs: (+ (get successful-jobs p) u1),
reputation: (+ (get reputation p) u10)
})
)
)
true
)
)
(ok true)
)
)
)

;; ============ PAYMENT SYSTEM ============

(define-public (claim-reward (job-id uint))
(let ((job (map-get? rendering-jobs job-id))
(assignment (map-get? job-assignments job-id)))
(asserts! (is-some job) (err ERR-JOB-NOT-FOUND))
(let ((job-data (unwrap-panic job)))
;; replaced equal? with is-eq for Clarity built-in function
(asserts! (is-eq (get status job-data) "completed") (err ERR-INVALID-STATUS))
(let ((provider (get provider job-data))
(reward (get reward job-data)))
(asserts! (is-eq provider (some tx-sender)) (err ERR-UNAUTHORIZED))
(let ((current-balance (default-to u0 (map-get? payments tx-sender))))
(map-set payments tx-sender (+ current-balance reward))
(var-set total-volume (+ (var-get total-volume) reward))
(ok reward)
)
)
)
)
)

(define-public (withdraw-earnings (amount uint))
(let ((balance (default-to u0 (map-get? payments tx-sender))))
(asserts! (>= balance amount) (err ERR-INSUFFICIENT-STAKE))
(begin
(map-set payments tx-sender (- balance amount))
(ok amount)
)
)
)

;; ============ VIEW FUNCTIONS ============

(define-read-only (get-provider-info (provider principal))
(map-get? gpu-providers provider)
)

(define-read-only (get-job-info (job-id uint))
(map-get? rendering-jobs job-id)
)

(define-read-only (get-provider-balance (provider principal))
(default-to u0 (map-get? payments provider))
)

(define-read-only (get-next-job-id)
(var-get next-job-id)
)

(define-read-only (get-total-volume)
(var-get total-volume)
)

(define-read-only (get-provider-stats (provider principal))
(let ((prov (map-get? gpu-providers provider)))
(if (is-some prov)
(let ((data (unwrap-panic prov)))
(ok {
total-jobs: (get total-jobs data),
successful-jobs: (get successful-jobs data),
success-rate: (if (> (get total-jobs data) u0)
(/ (* (get successful-jobs data) u100) (get total-jobs data))
u0
),
reputation: (get reputation data)
})
)
(err ERR-INVALID-PROVIDER)
)
)
)
Loading