Advertisement
Guest User

Untitled

a guest
Apr 21st, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.57 KB | None | 0 0
  1. module MyCrowdFunding where
  2.  
  3. import qualified Language.PlutusTx as PlutusTx
  4. import qualified Ledger.Interval as Interval
  5. import Ledger.Slot (SlotRange)
  6. import qualified Ledger.Slot as Slot
  7. import qualified Language.PlutusTx.Prelude as P
  8. import Ledger
  9. import qualified Ledger.Ada.TH as Ada
  10. import Ledger.Ada (Ada)
  11. import Ledger.Validation
  12. import Playground.Contract
  13. import Wallet as Wallet
  14.  
  15.  
  16. data Campaign = Campaign
  17. { campaignDeadline :: Slot
  18. , campaignTarget :: Ada
  19. , campaignCollectionDeadline :: Slot
  20. , campaignOwner :: PubKey
  21. } deriving (Generic, ToJSON, FromJSON, ToSchema)
  22.  
  23. PlutusTx.makeLift ''Campaign
  24.  
  25. data CampaignAction = Collect | Refund
  26. deriving (Generic, ToJSON, FromJSON, ToSchema)
  27.  
  28. PlutusTx.makeLift ''CampaignAction
  29.  
  30.  
  31.  
  32.  
  33.  
  34. myValidatorScript :: Campaign -> ValidatorScript
  35. myValidatorScript campaign = ValidatorScript $ Ledger.applyScript validator (Ledger.lifted campaign)
  36. where
  37. validator = $$(Ledger.compileScript [||
  38. \Campaign{..} (contributor :: PubKey) (action :: CampaignAction) (ptx :: PendingTx) ->
  39. case action of
  40. Collect -> ()
  41. Refund -> ()
  42. ||])
  43.  
  44.  
  45. contractAddress :: Campaign -> Address
  46. contractAddress campaign = Ledger.scriptAddress $ myValidatorScript campaign
  47.  
  48.  
  49. contribute :: MonadWallet m => Campaign -> Ada -> m ()
  50. contribute campaign value = do
  51. _ <- if value <= 0
  52. then throwOtherError "Must contribute a positive value"
  53. else pure ()
  54.  
  55. ownPK <- ownPubKey
  56.  
  57. let dataScript = DataScript $ Ledger.lifted ownPK
  58. range = Wallet.defaultSlotRange
  59. amount = $$(Ada.toValue) value
  60. address = contractAddress campaign
  61.  
  62. tx <- payToScript range address amount dataScript
  63. logMsg "Submitted contribution"
  64.  
  65. register (refundTrigger address) $ refundHandler campaign (Ledger.hashTx tx)
  66. logMsg "Registered refund trigger"
  67.  
  68.  
  69. collectFundsTrigger :: Campaign->EventTrigger
  70. collectFundsTrigger campaign = hasFunds `andT` collectionTime
  71. where
  72. hasFunds = fundsAtAddressT (contractAddress campaign) $ Wallet.intervalFrom ($$(Ada.toValue) 1)
  73. collectionTime = slotRangeT $ Wallet.interval 10 15
  74.  
  75.  
  76. collectFundsHandler :: MonadWallet m => Campaign->EventHandler m
  77. collectFundsHandler campaign = EventHandler $ \_ -> do
  78. logMsg "Collecting funds"
  79.  
  80.  
  81. let redeemerScript = RedeemerScript $ Ledger.lifted Collect
  82. range = Wallet.interval 10 15
  83. validatorScript = myValidatorScript campaign
  84.  
  85. collectFromScript range validatorScript redeemerScript
  86.  
  87.  
  88. scheduleCollection :: MonadWallet m => Campaign->m ()
  89. scheduleCollection campaign = do
  90. register (collectFundsTrigger campaign) (collectFundsHandler campaign)
  91.  
  92.  
  93. refundTrigger :: Address -> EventTrigger
  94. refundTrigger address = hasFunds `andT` isRefundTime
  95. where
  96. hasFunds = fundsAtAddressT address $ Wallet.intervalFrom ($$(Ada.toValue) 1)
  97. isRefundTime = slotRangeT $ Wallet.intervalFrom 15
  98.  
  99.  
  100. refundHandler :: MonadWallet m => Campaign -> TxId -> EventHandler m
  101. refundHandler campaign txid = EventHandler $ \_ -> do
  102. logMsg "Claiming refund"
  103.  
  104. let redeemerScript = RedeemerScript $ Ledger.lifted Refund
  105. range = Wallet.intervalFrom 15
  106. validatorScript = myValidatorScript campaign
  107.  
  108. collectFromScriptTxn range validatorScript redeemerScript txid
  109.  
  110.  
  111. $(mkFunctions ['contribute, 'scheduleCollection])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement