Source Code

(define-constant ERR_INVALID_AMOUNT u100)
(define-constant ERR_TRANSFER_FAILED u101)
(define-constant ERR_TRANSFER_NOT_FOUND u102)

(define-map transfer-log uint {
  sender: principal,
  recipient: principal,
  amount: uint,
  timestamp: uint
})

(define-map sender-last-transfer principal uint)

(define-data-var next-transfer-id uint u0)

(define-public (send-stx (recipient principal) (amount uint))
  (begin
    (asserts! (> amount u0) (err ERR_INVALID_AMOUNT))
    (unwrap! (stx-transfer? amount tx-sender recipient) (err ERR_TRANSFER_FAILED))
    (let
      (
        (transfer-id (var-get next-transfer-id))
        (timestamp stacks-block-time)
      )
      (map-set transfer-log transfer-id {
        sender: tx-sender,
        recipient: recipient,
        amount: amount,
        timestamp: timestamp
      })
      (map-set sender-last-transfer tx-sender timestamp)
      (var-set next-transfer-id (+ transfer-id u1))
      (ok transfer-id)
    )
  )
)

(define-read-only (get-transfer (transfer-id uint))
  (match (map-get? transfer-log transfer-id)
    transfer (ok transfer)
    (err ERR_TRANSFER_NOT_FOUND))
)

(define-read-only (get-transfer-timestamp (transfer-id uint))
  (match (map-get? transfer-log transfer-id)
    transfer (ok (get timestamp transfer))
    (err ERR_TRANSFER_NOT_FOUND))
)

(define-read-only (get-last-transfer-timestamp (sender principal))
  (ok (default-to u0 (map-get? sender-last-transfer sender)))
)

(define-read-only (get-next-transfer-id)
  (ok (var-get next-transfer-id))
)

Functions (5)

FunctionAccessArgs
send-stxpublicrecipient: principal, amount: uint
get-transferread-onlytransfer-id: uint
get-transfer-timestampread-onlytransfer-id: uint
get-last-transfer-timestampread-onlysender: principal
get-next-transfer-idread-only