Source Code

;; Title: Verdant Orchard
;; Author: rozar.btc
;; Synopsis:
;; Farmers produce two times more energy than other creature types in the verdant orchard.
;; Apples begin to rot after 1 million energy, so make sure to harvest them by then.

(impl-trait .dao-traits-v2.extension-trait)

(define-constant err-unauthorized (err u401))
(define-constant contract (as-contract tx-sender))
(define-constant farmers u1)

(define-data-var factor uint u100000000)
(define-data-var max-energy uint u1000000)

;; --- Authorization check

(define-read-only (is-dao-or-extension)
	(ok (asserts! (or (is-eq tx-sender 'SP2D5BGGJ956A635JG7CJQ59FTRFRB0893514EZPJ.dungeon-master) (contract-call? 'SP2D5BGGJ956A635JG7CJQ59FTRFRB0893514EZPJ.dungeon-master is-extension contract-caller)) err-unauthorized))
)

(define-read-only (get-factor)
	(var-get factor)
)

(define-public (set-factor (new-factor uint))
	(begin
		(try! (is-dao-or-extension))
		(ok (var-set factor new-factor))
	)
)

(define-read-only (get-max-energy)
	(var-get max-energy)
)

(define-public (set-max-energy (new-max-energy uint))
	(begin
		(try! (is-dao-or-extension))
		(ok (var-set max-energy new-max-energy))
	)
)

(define-public (harvest (creature-id uint))
    (let
        (
            (tapped-out (unwrap-panic (contract-call? .creatures-energy tap creature-id)))
            (ENERGY (get ENERGY tapped-out))
            (max-energy-amount (get-max-energy))
            (energy-amount (if (> ENERGY max-energy-amount) max-energy-amount ENERGY))
            (fuji-amount (* ENERGY (get-factor)))
            (TOKENS (if (is-eq creature-id farmers) (* fuji-amount u2) fuji-amount))
            (sender tx-sender)
        )
        (as-contract (mint TOKENS sender))
    )
)

(define-read-only (get-claimable-amount (creature-id uint))
    (let
        (
            (untapped-energy (unwrap-panic (contract-call? .creatures-energy get-untapped-amount creature-id tx-sender)))
            (max-energy-amount (get-max-energy))
            (energy-amount (if (> untapped-energy max-energy-amount) max-energy-amount untapped-energy))
            (fuji-amount (* energy-amount (get-factor)))
        )
        (if (is-eq creature-id farmers) (* fuji-amount u2) fuji-amount)
    )
)

(define-public (mint (amount uint) (recipient principal))
    (begin
        (try! (is-dao-or-extension))
        (try! (contract-call? 'SP2D5BGGJ956A635JG7CJQ59FTRFRB0893514EZPJ.dme000-governance-token dmg-mint amount contract))
        (try! (contract-call? .liquid-staked-charisma stake amount))
        (let 
            (
                (scha-amount (unwrap-panic (contract-call? .liquid-staked-charisma get-balance contract)))
                (index-input (/ scha-amount u2))
            )
            (try! (contract-call? .fuji-apples add-liquidity index-input))
        )
        (let 
            (
                (fuji-amount (unwrap-panic (contract-call? .fuji-apples get-balance contract)))
            )
            (try! (contract-call? .fuji-apples transfer fuji-amount contract recipient none))
        )
        (ok {
            type: "mint-fuji-apples",
            amount: amount,
            recipient: recipient
        })
    )
)

;; --- Extension callback

(define-public (callback (sender principal) (memo (buff 34)))
	(ok true)
)

Functions (9)

FunctionAccessArgs
is-dao-or-extensionread-only
get-factorread-only
set-factorpublicnew-factor: uint
get-max-energyread-only
set-max-energypublicnew-max-energy: uint
harvestpubliccreature-id: uint
get-claimable-amountread-onlycreature-id: uint
mintpublicamount: uint, recipient: principal
callbackpublicsender: principal, memo: (buff 34