Source Code


;; Nova Multi-Sig Coordinator
;; Coordinates multi-signature transaction approvals

(define-constant ERR-NOT-AUTHORIZED (err u100))
(define-constant ERR-ALREADY-CONFIRMED (err u101))
(define-constant ERR-INVALID-TX (err u102))

(define-data-var required-signatures uint u2)
(define-data-var owner-count uint u3)

(define-map transactions 
    { tx-id: uint }
    { 
        destination: principal,
        amount: uint,
        execution-height: uint,
        confirmations: uint,
        executed: bool
    }
)

(define-map confirmations 
    { tx-id: uint, owner: principal }
    { confirmed: bool }
)

(define-data-var tx-nonce uint u0)

(define-public (submit-transaction (destination principal) (amount uint))
    (let
        (
            (tx-id (+ (var-get tx-nonce) u1))
        )
        (var-set tx-nonce tx-id)
        (ok (map-set transactions 
            { tx-id: tx-id }
            {
                destination: destination,
                amount: amount,
                execution-height: block-height,
                confirmations: u0,
                executed: false
            }
        ))
    )
)

(define-public (confirm-transaction (tx-id uint))
    (let
        (
            (tx (unwrap! (map-get? transactions { tx-id: tx-id }) ERR-INVALID-TX))
            (is-confirmed (default-to { confirmed: false } (map-get? confirmations { tx-id: tx-id, owner: tx-sender })))
        )
        (asserts! (not (get confirmed is-confirmed)) ERR-ALREADY-CONFIRMED)
        
        (map-set confirmations { tx-id: tx-id, owner: tx-sender } { confirmed: true })
        (ok (map-set transactions
            { tx-id: tx-id }
            (merge tx { confirmations: (+ (get confirmations tx) u1) })
        ))
    )
)

Functions (2)

FunctionAccessArgs
submit-transactionpublicdestination: principal, amount: uint
confirm-transactionpublictx-id: uint