@@ -52,32 +52,40 @@ feeReserveMultiplier = 4.0
5252
5353-- | Converting a set of holding inputs to inputs for an amulet transfer,
5454-- unlocking any expired LockedAmulet holdings on the fly.
55- holdingToTransferInputs : ForOwner -> PaymentTransferContext -> [ContractId Holding] -> Update [TransferInput]
56- holdingToTransferInputs forOwner paymentContext inputHoldingCids =
55+ holdingToTransferInputs : ForOwner -> Either PaymentTransferContext ExternalPartyPaymentTransferContext -> [ContractId Holding] -> Update [TransferInput]
56+ holdingToTransferInputs forOwner paymentContextE inputHoldingCids =
5757 forA inputHoldingCids $ \holdingCid -> do
5858 holding <- fetchCheckedInterface @Holding forOwner holdingCid
5959 case fromInterface holding of
6060 Some (LockedAmulet {}) -> do
6161 let lockedAmuletCid : ContractId LockedAmulet = fromInterfaceContractId holdingCid
6262 -- We assume the lock is expired, and if not then we rely `LockedAmulet_OwnerExpireLock` to fail
63- result <- exercise lockedAmuletCid LockedAmulet_OwnerExpireLock with
64- openRoundCid = paymentContext.context.openMiningRound
65- pure $ InputAmulet result.amuletSum.amulet
63+ case paymentContextE of
64+ Left paymentContext -> do
65+ result <- exercise lockedAmuletCid LockedAmulet_OwnerExpireLock with
66+ openRoundCid = paymentContext.context.openMiningRound
67+ pure $ InputAmulet result.amuletSum.amulet
68+ Right externalPartyPaymentContext -> do
69+ result <- exercise lockedAmuletCid LockedAmulet_ExternalPartyOwnerExpireLock with
70+ externalPartyConfigStateCid = externalPartyPaymentContext.context.externalPartyConfigState
71+ pure $ InputAmulet result.amuletSum.amulet
6672 None -> pure $ InputAmulet $ coerceContractId holdingCid
6773
6874-- | Prepare a two-step transfer of amulet by locking the funds.
6975prepareTwoStepTransfer
70- : TwoStepTransfer -> Time -> [ContractId Holding] -> PaymentTransferContext
76+ : TwoStepTransfer -> Time -> [ContractId Holding] -> Either PaymentTransferContext ExternalPartyPaymentTransferContext
7177 -> Update (ContractId LockedAmulet, [ContractId Holding], Metadata)
7278prepareTwoStepTransfer TwoStepTransfer{..} requestedAt inputHoldingCids paymentContext = do
7379 require "requestedAt < transferBefore" (requestedAt < transferBefore)
7480 -- over-approximate fees that will be due on the actual transfer
75- let receiverOutputForActualTransfer = TransferOutput with
76- receiver
77- amount
78- receiverFeeRatio = 0.0 -- all fees are paid by the sender
79- lock = None
80- [expectedTransferFees] <- exerciseComputeFees dso paymentContext sender [receiverOutputForActualTransfer]
81+ -- let receiverOutputForActualTransfer = TransferOutput with
82+ -- receiver
83+ -- amount
84+ -- receiverFeeRatio = 0.0 -- all fees are paid by the sender
85+ -- lock = None
86+ -- FIXME: consider if we do need to preserve this in some form but don't see why
87+ -- [expectedTransferFees] <- exerciseComputeFees dso paymentContext sender [receiverOutputForActualTransfer]
88+ let expectedTransferFees = 0.0
8189 let feesReserveAmount = expectedTransferFees * feeReserveMultiplier
8290
8391 -- lock the amulet
@@ -98,7 +106,7 @@ prepareTwoStepTransfer TwoStepTransfer{..} requestedAt inputHoldingCids paymentC
98106 inputs = transferInputs
99107 beneficiaries = None
100108
101- result <- exercisePaymentTransfer dso paymentContext transfer
109+ result <- exerciseExternalPartyPaymentTransferWithFallback dso paymentContext transfer
102110 let [TransferResultLockedAmulet lockedAmulet] = result.createdAmulets
103111 pure
104112 ( lockedAmulet
@@ -121,9 +129,8 @@ executeTwoStepTransfer TwoStepTransfer{..} lockedAmuletCid extraArgs = do
121129 -- ignore beneficiaries in case we are not allowing featuring
122130 context <- unfeaturedPaymentContextFromChoiceContext dso extraArgs.context
123131 pure (context, None)
124- let openRoundCid = paymentContext.context.openMiningRound
125132 -- unlock amulet
126- unlockResult <- exercise lockedAmuletCid LockedAmulet_Unlock with openRoundCid
133+ unlockResult <- unlockAmulet paymentContext lockedAmuletCid
127134 let amuletCid = unlockResult.amuletSum.amulet
128135 -- execute transfer
129136 let receiverOutput = TransferOutput with
@@ -137,7 +144,7 @@ executeTwoStepTransfer TwoStepTransfer{..} lockedAmuletCid extraArgs = do
137144 inputs = [InputAmulet amuletCid]
138145 outputs = [receiverOutput]
139146 beneficiaries
140- result <- exercisePaymentTransfer dso paymentContext amuletRulesTransfer
147+ result <- exerciseExternalPartyPaymentTransferWithFallback dso paymentContext amuletRulesTransfer
141148 pure
142149 ( optionalToList (toInterfaceContractId <$> result.senderChangeAmulet)
143150 , createdAmuletToHolding <$> result.createdAmulets
@@ -149,6 +156,7 @@ abortTwoStepTransfer TwoStepTransfer{..} lockedAmuletCid extraArgs = do
149156 expireLockedAmulet <- getFromContextU @Bool extraArgs.context expireLockKey
150157 if expireLockedAmulet
151158 then do
159+ -- FIXME
152160 openRoundCid <- getFromContextU @(ContractId OpenMiningRound) extraArgs.context openRoundContextKey
153161 -- prudent engineering: check the DSO party
154162 _ <- fetchChecked (ForDso with dso) openRoundCid
@@ -159,3 +167,10 @@ abortTwoStepTransfer TwoStepTransfer{..} lockedAmuletCid extraArgs = do
159167 assertDeadlineExceeded transferBeforeDeadline transferBefore
160168 pure []
161169
170+ unlockAmulet : Either PaymentTransferContext ExternalPartyPaymentTransferContext -> ContractId LockedAmulet -> Update LockedAmulet_UnlockResult
171+ unlockAmulet transferContextE lockedAmuletCid = do
172+ case transferContextE of
173+ Left paymentContext -> do
174+ exercise lockedAmuletCid LockedAmulet_Unlock with openRoundCid = paymentContext.context.openMiningRound
175+ Right externalPartyPaymentContext -> do
176+ exercise lockedAmuletCid LockedAmulet_ExternalPartyUnlock with externalPartyConfigStateCid = externalPartyPaymentContext.context.externalPartyConfigState
0 commit comments