packages feed

cleveland-0.3.1: test/TestSuite/Cleveland/ImplicitTickets.hs

-- SPDX-FileCopyrightText: 2023 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

module TestSuite.Cleveland.ImplicitTickets
  ( test_ticket_to_implicit
  , test_ticket_from_implicit
  ) where

import Lorentz hiding (assert)
import Test.Tasty (TestTree)

import Test.Cleveland

import Morley.Util.SizedList.Types

test_ticket_to_implicit :: TestTree
test_ticket_to_implicit = testScenario "sending tickets to implicit addresses works" $ scenario do
  ticketer <- originate "ticketer" () $ ticketerContract @Integer
  senderAddr ::< receiverAddr ::< Nil' <- newAddresses $ "sender" :< "receiver" :< Nil

  withSender senderAddr $ inBatch do
    transfer ticketer $ calling def (123, 3)
    transferTicket receiverAddr def ticketer (123 :: Integer) 1
    unsafeTransferTicket receiverAddr def ticketer (123 :: Integer) 1
    pure ()

  getTicketBalance senderAddr ticketer (123 :: Integer) @@== 1
  getTicketBalance receiverAddr ticketer (123 :: Integer) @@== 2

test_ticket_from_implicit :: TestTree
test_ticket_from_implicit = testScenario "sending tickets from implicit addresses works" $ scenario do
  ticketer <- originate "ticketer" () $ ticketerContract @Integer
  tbh <- originate "ticketBlackHole" () $ ticketBlackHole @Integer
  senderAddr <- newAddress "sender"

  withSender senderAddr $ inBatch do
    transfer ticketer $ calling def (123, 3)
    transferTicket tbh def ticketer 123 2
    unsafeTransferTicket tbh def ticketer (123 :: Integer) 1
    pure ()

  getTicketBalance senderAddr ticketer (123 :: Integer) @@== 0

ticketerContract
  :: forall t. (HasAnnotation t, NiceParameter t, NiceComparable t)
  => Contract (t, Natural) () ()
ticketerContract = defaultContract
  $ unpair
  # dip
    ( nil
    #  sender
    #  contract @(Ticket t)
    #  assertSome [mt|Failed to convert to contract|]
    #  push 0
    )
  # unpair
  # ticket
  # assertSome [mt|Failed to create ticket|]
  # transferTokens
  # cons
  # pair

ticketBlackHole
  :: forall t. (NiceParameter t, NiceComparable t, HasAnnotation t)
  => Contract (Ticket t) () ()
ticketBlackHole = defaultContract $ cdr # nil # pair