Source Code

(define-constant CONTRACT_OWNER tx-sender)
(define-constant ERR_NOT_AUTHORIZED (err u1700))
(define-constant ERR_COUNCIL_NOT_FOUND (err u1701))
(define-constant ERR_AGENT_NOT_FOUND (err u1702))
(define-constant ERR_PROPOSAL_NOT_FOUND (err u1703))

(define-data-var next-council-id uint u1)
(define-data-var next-agent-id uint u1)
(define-data-var next-proposal-id uint u1)

(define-map councils
  uint
  {
    name: (string-ascii 128),
    creator: principal,
    member-count: uint,
    created-at: uint,
    active: bool
  }
)

(define-map ai-agents
  uint
  {
    owner: principal,
    agent-type: (string-ascii 64),
    public-key: (buff 33),
    capabilities: (buff 256),
    reputation-score: uint,
    created-at: uint
  }
)

(define-map council-members
  {council-id: uint, agent-id: uint}
  bool
)

(define-map proposals
  uint
  {
    council-id: uint,
    proposer: uint,
    description: (string-ascii 512),
    votes-for: uint,
    votes-against: uint,
    status: (string-ascii 20),
    created-at: uint
  }
)

(define-map agent-votes
  {proposal-id: uint, agent-id: uint}
  bool
)

(define-read-only (get-contract-hash)
  (contract-hash? .ai-agent-council)
)

(define-read-only (get-council (council-id uint))
  (ok (unwrap! (map-get? councils council-id) ERR_COUNCIL_NOT_FOUND))
)

(define-read-only (get-agent (agent-id uint))
  (ok (unwrap! (map-get? ai-agents agent-id) ERR_AGENT_NOT_FOUND))
)

(define-read-only (get-proposal (proposal-id uint))
  (ok (unwrap! (map-get? proposals proposal-id) ERR_PROPOSAL_NOT_FOUND))
)

(define-public (create-council (name (string-ascii 128)))
  (let
    (
      (council-id (var-get next-council-id))
    )
    (map-set councils council-id {
      name: name,
      creator: tx-sender,
      member-count: u0,
      created-at: stacks-block-time,
      active: true
    })
    (var-set next-council-id (+ council-id u1))
    (ok council-id)
  )
)

(define-public (register-agent 
  (agent-type (string-ascii 64))
  (public-key (buff 33))
  (capabilities (buff 256))
)
  (let
    (
      (agent-id (var-get next-agent-id))
    )
    (map-set ai-agents agent-id {
      owner: tx-sender,
      agent-type: agent-type,
      public-key: public-key,
      capabilities: capabilities,
      reputation-score: u100,
      created-at: stacks-block-time
    })
    (var-set next-agent-id (+ agent-id u1))
    (ok agent-id)
  )
)

(define-public (join-council (council-id uint) (agent-id uint))
  (let
    (
      (council-data (unwrap! (map-get? councils council-id) ERR_COUNCIL_NOT_FOUND))
      (agent-data (unwrap! (map-get? ai-agents agent-id) ERR_AGENT_NOT_FOUND))
    )
    (asserts! (is-eq (get owner agent-data) tx-sender) ERR_NOT_AUTHORIZED)
    (asserts! (get active council-data) ERR_NOT_AUTHORIZED)
    (map-set council-members {council-id: council-id, agent-id: agent-id} true)
    (map-set councils council-id (merge council-data {
      member-count: (+ (get member-count council-data) u1)
    }))
    (ok true)
  )
)

(define-public (create-proposal 
  (council-id uint)
  (agent-id uint)
  (description (string-ascii 512))
)
  (let
    (
      (proposal-id (var-get next-proposal-id))
      (is-member (default-to false (map-get? council-members {council-id: council-id, agent-id: agent-id})))
    )
    (asserts! is-member ERR_NOT_AUTHORIZED)
    (map-set proposals proposal-id {
      council-id: council-id,
      proposer: agent-id,
      description: description,
      votes-for: u0,
      votes-against: u0,
      status: "Active",
      created-at: stacks-block-time
    })
    (var-set next-proposal-id (+ proposal-id u1))
    (ok proposal-id)
  )
)

(define-public (vote-on-proposal 
  (proposal-id uint)
  (agent-id uint)
  (vote-for bool)
)
  (let
    (
      (proposal-data (unwrap! (map-get? proposals proposal-id) ERR_PROPOSAL_NOT_FOUND))
      (agent-data (unwrap! (map-get? ai-agents agent-id) ERR_AGENT_NOT_FOUND))
      (is-member (default-to false (map-get? council-members {council-id: (get council-id proposal-data), agent-id: agent-id})))
      (already-voted (default-to false (map-get? agent-votes {proposal-id: proposal-id, agent-id: agent-id})))
    )
    (asserts! (is-eq (get owner agent-data) tx-sender) ERR_NOT_AUTHORIZED)
    (asserts! is-member ERR_NOT_AUTHORIZED)
    (asserts! (not already-voted) ERR_NOT_AUTHORIZED)
    (map-set agent-votes {proposal-id: proposal-id, agent-id: agent-id} true)
    (if vote-for
      (map-set proposals proposal-id (merge proposal-data {
        votes-for: (+ (get votes-for proposal-data) u1)
      }))
      (map-set proposals proposal-id (merge proposal-data {
        votes-against: (+ (get votes-against proposal-data) u1)
      }))
    )
    (ok true)
  )
)

(define-public (execute-proposal (proposal-id uint))
  (let
    (
      (proposal-data (unwrap! (map-get? proposals proposal-id) ERR_PROPOSAL_NOT_FOUND))
    )
    (asserts! (> (get votes-for proposal-data) (get votes-against proposal-data)) ERR_NOT_AUTHORIZED)
    (map-set proposals proposal-id (merge proposal-data {status: "Executed"}))
    (ok true)
  )
)

(define-public (update-reputation (agent-id uint) (new-score uint))
  (let
    (
      (agent-data (unwrap! (map-get? ai-agents agent-id) ERR_AGENT_NOT_FOUND))
    )
    (asserts! (is-eq tx-sender CONTRACT_OWNER) ERR_NOT_AUTHORIZED)
    (map-set ai-agents agent-id (merge agent-data {reputation-score: new-score}))
    (ok true)
  )
)

(define-read-only (verify-agent-signature 
  (agent-id uint)
  (message (buff 32))
  (signature (buff 64))
)
  (let
    (
      (agent-data (unwrap! (map-get? ai-agents agent-id) ERR_AGENT_NOT_FOUND))
    )
    (ok (secp256r1-verify message signature (get public-key agent-data)))
  )
)

(define-read-only (get-time)
  stacks-block-time
)

Functions (12)

FunctionAccessArgs
get-contract-hashread-only
get-councilread-onlycouncil-id: uint
get-agentread-onlyagent-id: uint
get-proposalread-onlyproposal-id: uint
create-councilpublicname: (string-ascii 128
register-agentpublicagent-type: (string-ascii 64
join-councilpubliccouncil-id: uint, agent-id: uint
create-proposalpubliccouncil-id: uint, agent-id: uint, description: (string-ascii 512
execute-proposalpublicproposal-id: uint
update-reputationpublicagent-id: uint, new-score: uint
verify-agent-signatureread-onlyagent-id: uint, message: (buff 32
get-timeread-only