Skip to content

Commit a37b8ba

Browse files
committed
Add submitTxFromBlueprint and deprecate older variants
1 parent d1cb2fe commit a37b8ba

File tree

3 files changed

+79
-16
lines changed

3 files changed

+79
-16
lines changed

examples/AdditionalUtxos.purs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,12 @@ import Contract.Sync (withoutSync)
4242
import Contract.Transaction
4343
( ScriptRef(NativeScriptRef)
4444
, awaitTxConfirmed
45-
, balanceTx
4645
, buildTx
4746
, createAdditionalUtxos
47+
, defaultBalancer
4848
, signTransaction
4949
, submit
50+
, submitTxFromBlueprint
5051
, withBalancedTx
5152
)
5253
import Contract.Utxos (UtxoMap)
@@ -135,16 +136,20 @@ spendFromValidator validator additionalUtxos _datum = do
135136
fromUtxoMap (Map.difference additionalUtxos scriptUtxos) <#> \output ->
136137
SpendOutput output Nothing
137138

138-
plan = spendScriptOutputs <> spendPubkeyOutputs
139+
buildSteps = spendScriptOutputs <> spendPubkeyOutputs
139140

140141
balancerConstraints :: BalancerConstraints
141142
balancerConstraints =
142143
mustUseAdditionalUtxos additionalUtxos
143144

144-
unbalancedTx <- buildTx plan
145-
balancedTx <- balanceTx unbalancedTx additionalUtxos balancerConstraints
146-
balancedSignedTx <- signTransaction balancedTx
147-
txHash <- submit balancedSignedTx
145+
{ txHash } <- submitTxFromBlueprint
146+
{ buildSteps
147+
, balancer: defaultBalancer
148+
, balancerCtx:
149+
{ balancerConstraints
150+
, extraUtxos: additionalUtxos
151+
}
152+
}
148153

149154
awaitTxConfirmed txHash
150155
logInfo' "Successfully spent additional utxos from the validator address."

src/Contract/Transaction.purs

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
-- | A module that defines the different transaction data types, balancing
22
-- | functionality, transaction fees, signing and submission.
33
module Contract.Transaction
4-
( balanceMultipleTxs
4+
( TxBlueprint
5+
, TxReceipt
6+
, balanceMultipleTxs
57
, balanceTx
68
, balanceTxE
79
, balanceTxs
@@ -18,6 +20,7 @@ module Contract.Transaction
1820
, mkPoolPubKeyHash
1921
, hashTransaction
2022
, buildTx
23+
, submitTxFromBlueprint
2124
, submitTxFromBuildPlan
2225
) where
2326

@@ -98,8 +101,13 @@ import Contract.UnbalancedTx (mkUnbalancedTx)
98101
import Control.Monad.Error.Class (catchError, liftEither, throwError)
99102
import Control.Monad.Reader (ReaderT, asks, runReaderT)
100103
import Control.Monad.Reader.Class (ask)
101-
import Ctl.Internal.BalanceTx (CtlBalancer, CtlBalancerContext, defaultBalancer) as X
102-
import Ctl.Internal.BalanceTx (defaultBalancer)
104+
import Ctl.Internal.BalanceTx
105+
( CtlBalancer
106+
, CtlBalancerContext
107+
, defaultBalancer
108+
, defaultBalancerErr
109+
) as X
110+
import Ctl.Internal.BalanceTx (defaultBalancerErr)
103111
import Ctl.Internal.Contract.AwaitTxConfirmed
104112
( awaitTxConfirmed
105113
, awaitTxConfirmedWithTimeout
@@ -273,7 +281,7 @@ balanceTxE
273281
-> BalancerConstraints
274282
-> Contract (Either BalanceTxError.BalanceTxError Transaction)
275283
balanceTxE tx utxos constraints =
276-
defaultBalancer tx
284+
defaultBalancerErr tx
277285
{ balancerConstraints: constraints
278286
, extraUtxos: utxos
279287
}
@@ -389,7 +397,11 @@ createAdditionalUtxos tx = do
389397
foldl (\utxo txOut -> Map.insert (txIn $ length utxo) txOut utxo) Map.empty
390398

391399
submitTxFromConstraints
392-
:: ScriptLookups
400+
:: Warn
401+
( Text
402+
"Contract.TxConstraints is deprecated. Use `submitTxFromBlueprint` instead"
403+
)
404+
=> ScriptLookups
393405
-> TxConstraints
394406
-> Contract TransactionHash
395407
submitTxFromConstraints lookups constraints = do
@@ -399,7 +411,8 @@ submitTxFromConstraints lookups constraints = do
399411
submit balancedSignedTx
400412

401413
submitTxFromBuildPlan
402-
:: UtxoMap
414+
:: Warn (Text "Deprecated, use `submitTxFromBlueprint` instead")
415+
=> UtxoMap
403416
-> BalancerConstraints
404417
-> Array TransactionBuilderStep
405418
-> Contract Transaction
@@ -410,6 +423,40 @@ submitTxFromBuildPlan usedUtxos balancerConstraints plan = do
410423
void $ submit balancedSignedTx
411424
pure balancedSignedTx
412425

426+
-- | Blueprint containing the steps and context required to construct
427+
-- | and balance a transaction.
428+
type TxBlueprint (ctx :: Type) =
429+
{ buildSteps :: Array TransactionBuilderStep
430+
, balancer :: TxBalancer Contract Error ctx
431+
, balancerCtx :: ctx
432+
}
433+
434+
-- | Represents the result of submitting a transaction via
435+
-- | `submitTxFromBlueprint`, which includes the balanced signed transaction
436+
-- | along with its hash.
437+
type TxReceipt =
438+
{ submittedTx :: Transaction
439+
, txHash :: TransactionHash
440+
}
441+
442+
-- | Builds, balances, signs, and submits a transaction defined by the given
443+
-- | `TxBlueprint`. Returns a `TxReceipt` containing the submitted transaction
444+
-- | and its hash.
445+
submitTxFromBlueprint
446+
:: forall (ctx :: Type)
447+
. TxBlueprint ctx
448+
-> Contract TxReceipt
449+
submitTxFromBlueprint blueprint = do
450+
unbalancedTx <- buildTx blueprint.buildSteps
451+
balancedTx <- liftEither =<< blueprint.balancer unbalancedTx
452+
blueprint.balancerCtx
453+
balancedSignedTx <- signTransaction balancedTx
454+
txHash <- submit balancedSignedTx
455+
pure
456+
{ submittedTx: balancedSignedTx
457+
, txHash
458+
}
459+
413460
lookupTxHash
414461
:: TransactionHash -> UtxoMap -> Array TransactionUnspentOutput
415462
lookupTxHash txHash utxos =

src/Internal/BalanceTx/BalanceTx.purs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ module Ctl.Internal.BalanceTx
22
( CtlBalancer
33
, CtlBalancerContext
44
, defaultBalancer
5+
, defaultBalancerErr
56
) where
67

78
import Prelude
@@ -11,7 +12,10 @@ import Cardano.Transaction.Balancer.Constraints
1112
( BalancerConstraints
1213
, buildBalancerConfig
1314
)
14-
import Cardano.Transaction.Balancer.Error (BalanceTxError)
15+
import Cardano.Transaction.Balancer.Error
16+
( BalanceTxError
17+
, explainBalanceTxError
18+
)
1519
import Cardano.Types (UtxoMap)
1620
import Contract.Log (logInfo')
1721
import Control.Monad.Reader.Class (ask)
@@ -28,21 +32,28 @@ import Ctl.Internal.Contract.Wallet
2832
, getWalletUtxos
2933
) as Wallet
3034
import Ctl.Internal.Types.TxBalancer (TxBalancer)
35+
import Data.Bifunctor (lmap)
3136
import Data.Maybe (isNothing)
3237
import Data.Newtype (unwrap)
3338
import Effect.Aff.Class (liftAff)
39+
import Effect.Exception (Error, error)
3440

3541
type CtlBalancerContext =
3642
{ balancerConstraints :: BalancerConstraints
3743
, extraUtxos :: UtxoMap
3844
}
3945

40-
type CtlBalancer = TxBalancer Contract BalanceTxError CtlBalancerContext
46+
type CtlBalancer (err :: Type) = TxBalancer Contract err CtlBalancerContext
47+
48+
defaultBalancer :: CtlBalancer Error
49+
defaultBalancer transaction =
50+
map (lmap (error <<< explainBalanceTxError))
51+
<<< defaultBalancerErr transaction
4152

4253
-- | Balances an unbalanced transaction using the specified balancer
4354
-- | constraints.
44-
defaultBalancer :: CtlBalancer
45-
defaultBalancer transaction ctx = do
55+
defaultBalancerErr :: CtlBalancer BalanceTxError
56+
defaultBalancerErr transaction ctx = do
4657
contractEnv <- ask
4758
isCip30Wallet <- Sync.isCip30Wallet
4859
ownAddresses <- Wallet.getWalletAddresses

0 commit comments

Comments
 (0)