Skip to content

Commit

Permalink
Try #3436:
Browse files Browse the repository at this point in the history
  • Loading branch information
iohk-bors[bot] committed Sep 28, 2022
2 parents 7b01921 + b1d922a commit ac78e50
Show file tree
Hide file tree
Showing 22 changed files with 4,368 additions and 1,932 deletions.
3 changes: 3 additions & 0 deletions lib/wallet/cardano-wallet.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,7 @@ library
Cardano.Wallet.Util
Cardano.Wallet.Version
Cardano.Wallet.Version.TH
Cardano.Wallet.Write.Tx
Control.Concurrent.Concierge
Control.Monad.Exception.Unchecked
Control.Monad.Random.Extra
Expand Down Expand Up @@ -584,6 +585,7 @@ test-suite unit
, cardano-crypto-class
, cardano-crypto-wrapper
, cardano-ledger-alonzo
, cardano-ledger-alonzo-test
, cardano-ledger-babbage
, cardano-ledger-byron
, cardano-ledger-byron-test
Expand Down Expand Up @@ -780,6 +782,7 @@ test-suite unit
Cardano.Wallet.Shelley.TransactionSpec
Cardano.Wallet.TokenMetadataSpec
Cardano.Wallet.Read.Tx.CBORSpec
Cardano.Wallet.Write.TxSpec
Cardano.WalletSpec
Control.Concurrent.ConciergeSpec
Control.Monad.Random.ExtraSpec
Expand Down
6 changes: 3 additions & 3 deletions lib/wallet/integration/src/Test/Integration/Plutus.hs
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ pingPong_2 =
"id": "{{transactionId}}",
"index": 0,
"address": "addr1w9xh9n6kngee5x98myczxyuc8atwpktv63daevwk2yku56sce02jy",
"datum": "923918e403bf43c34b4ef6b48eb2ee04babed17320d8d1b9ff9ad086e86f44ec",
"datum": { "hash": "923918e403bf43c34b4ef6b48eb2ee04babed17320d8d1b9ff9ad086e86f44ec"},
"amount": {
"quantity": 2000000,
"unit": "lovelace"
Expand Down Expand Up @@ -167,7 +167,7 @@ game_2 =
"id": "{{transactionId}}",
"index": 0,
"address": "addr1w89gquc23wc7h8k4chyaad268mjft7t0c08wqertwms70sc5pc6gt",
"datum": "14845e067bf83c19a97207c8a2057d9499624783f1fce1ef5abf600392240ad0",
"datum": { "hash": "14845e067bf83c19a97207c8a2057d9499624783f1fce1ef5abf600392240ad0"},
"amount": {
"quantity": 10000000,
"unit": "lovelace"
Expand Down Expand Up @@ -203,7 +203,7 @@ game_3 =
"id": "{{transactionId}}",
"index": 0,
"address": "addr1w89gquc23wc7h8k4chyaad268mjft7t0c08wqertwms70sc5pc6gt",
"datum": "4401f9f4de01abb2164d77909afb1249f2c519331aa034bbfc5248e50b08db86",
"datum": {"hash": "4401f9f4de01abb2164d77909afb1249f2c519331aa034bbfc5248e50b08db86"},
"amount": {
"quantity": 10000000,
"unit": "lovelace"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}

Expand All @@ -31,8 +32,12 @@ import Cardano.Address.Script
)
import Cardano.Api
( CardanoEra (..), InAnyCardanoEra (..) )
import Cardano.Api.Extra
( addInputs, addReferenceInputs, emptyTx, paymentPartialTx )
import Cardano.Crypto.DSIGN.Class
( rawDeserialiseVerKeyDSIGN )
import Cardano.Crypto.Hash.Class
( Hash (UnsafeHash) )
import Cardano.Mnemonic
( SomeMnemonic (..) )
import Cardano.Wallet.Api.Types
Expand Down Expand Up @@ -109,12 +114,15 @@ import Cardano.Wallet.Primitive.Types.Tx
, TxIn (..)
, TxMetadata (..)
, TxMetadataValue (..)
, TxOut (..)
, TxScriptValidity (..)
, TxStatus (..)
, cardanoTxIdeallyNoLaterThan
, getSealedTxBody
, sealedTxFromCardanoBody
)
import Cardano.Wallet.Shelley.Compatibility
( fromCardanoTxOut )
import Cardano.Wallet.Transaction
( AnyScript (..), ValidityIntervalExplicit (..) )
import Cardano.Wallet.Unsafe
Expand All @@ -129,12 +137,18 @@ import Control.Monad.Trans.Resource
( runResourceT )
import Data.Aeson
( toJSON, (.=) )
import Data.ByteArray.Encoding
( Base (..), convertToBase )
import Data.ByteString.Short
( toShort )
import Data.Function
( (&) )
import Data.Generics.Internal.VL.Lens
( view, (^.) )
import Data.List
( elemIndex )
import Data.Maybe
( fromJust, isJust )
( fromJust, fromMaybe, isJust )
import Data.Proxy
( Proxy (..) )
import Data.Quantity
Expand Down Expand Up @@ -185,6 +199,7 @@ import Test.Integration.Framework.DSL
, rewardWallet
, selectCoins
, signTx
, submitTx
, submitTxWithWid
, unsafeRequest
, verify
Expand Down Expand Up @@ -224,8 +239,10 @@ import qualified Cardano.Ledger.Crypto as Ledger
import qualified Cardano.Ledger.Keys as Ledger
import qualified Cardano.Wallet.Api.Link as Link
import qualified Cardano.Wallet.Primitive.AddressDerivation.Shelley as Shelley
import qualified Cardano.Wallet.Primitive.Types.Hash as W
import qualified Cardano.Wallet.Primitive.Types.TokenMap as TokenMap
import qualified Data.Aeson as Aeson
import qualified Data.ByteString.Char8 as B8
import qualified Data.List.NonEmpty as NE
import qualified Data.Map.Strict as Map
import qualified Data.Set as Set
Expand Down Expand Up @@ -1682,6 +1699,173 @@ spec = describe "NEW_SHELLEY_TRANSACTIONS" $ do
, expectResponseCode HTTP.status202
]

it "TRANS_NEW_BALANCE_06 - ref scripts" $ \ctx -> runResourceT $ do
wa <- fixtureWallet ctx
let
serializeTxToHex =
B8.unpack . convertToBase Base16 . Cardano.serialiseToCBOR

balanceSignSubmit payload = do
rTx <- request @ApiSerialisedTransaction ctx
(Link.balanceTransaction @'Shelley wa) Default payload
verify rTx
[ expectResponseCode HTTP.status202
]

let apiTx = getFromResponse #serialisedTxSealed rTx
signedTx <- signTx ctx wa apiTx [ expectResponseCode HTTP.status202 ]
_ <- submitTx ctx signedTx
[ expectSuccess
, expectResponseCode HTTP.status202
]
return signedTx

payOutput
:: Cardano.TxOut Cardano.CtxUTxO Cardano.BabbageEra
-> IO ((ApiT (W.Hash "Tx")), Int)
payOutput out = do
let tx = serializeTxToHex $ paymentPartialTx [out]
let partialTx = Json [json|{
"transaction": #{tx},
"inputs": [],
"redeemers": []
}|]

submittedTx <- balanceSignSubmit partialTx

rDecodedTx <- request @(ApiDecodedTransaction n) ctx
(Link.decodeTransaction @'Shelley wa) Default
(Json $ toJSON submittedTx)

let outs = getFromResponse #outputs rDecodedTx
let txId = getFromResponse #id rDecodedTx

let addrFromOutput :: ApiTxOutputGeneral n -> Address
addrFromOutput (ExternalOutput (AddressAmount (ApiT a, _) _ _)) = a
addrFromOutput (WalletOutput (ApiWalletOutput (ApiT a, _) _ _ _)) = a

let TxOut targetOutAddr _ = fromCardanoTxOut out
let outputAddresses = map addrFromOutput outs

let ix = fromMaybe (error "payOutput: couldn't find addr in tx")
$ elemIndex targetOutAddr outputAddresses

return (txId, ix)

let lovelaceToVal = Cardano.lovelaceToValue . Cardano.Lovelace

let minAdaVal = 12_000_000
let someAdaVal = 1_000_000_000

let txOutVal = Cardano.TxOutValue Cardano.MultiAssetInBabbageEra

let hashScriptInAnyLang :: Cardano.ScriptInAnyLang -> Cardano.ScriptHash
hashScriptInAnyLang (Cardano.ScriptInAnyLang _ script) = Cardano.hashScript script

-- https://github.com/input-output-hk/cardano-node/blob/be290c5197fe7ffe2b5f58021b384ea0927ac51d/scripts/plutus/example-babbage-script-usage.sh
let scriptJSON = [json|{
"type": "PlutusScriptV2",
"description": "",
"cborHex": "5908f85908f5010000323233223232323322323232323322323232323232323232323232323232323232323232322223232533532323302132533533029001488100102a102b376600c660426a038666aa03a60462400246664002a04e002605066aa0584002664002a046902a19aa8159aa980d8900099aaa810004004991a80091111111111100628009a80e199aa80e98118900091999000a813800981419aa8161000999000a811a40a866aa0566aa60362400266aaa040010012646a002444444444444016a00226a002440046666ae68cdc39aab9d5002480008cc8848cc00400c008c8c8c8c8c8c8c8c8c8c8c8c8c8cccd5cd19b8735573aa018900011999999999999111111111110919999999999980080680600580500480400380300280200180119a80b80c1aba1500c33501701835742a01666a02e0326ae854028ccd5406dd7280d1aba150093335501b75ca0346ae854020cd405c080d5d0a803999aa80d810bad35742a00c6464646666ae68cdc39aab9d5002480008cc8848cc00400c008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a815bad35742a00460586ae84d5d1280111931901719ab9c02f02e02c135573ca00226ea8004d5d0a8011919191999ab9a3370e6aae754009200023322123300100300233502b75a6ae854008c0b0d5d09aba2500223263202e33573805e05c05826aae7940044dd50009aba135744a004464c6405466ae700ac0a80a04d55cf280089baa00135742a00a66a02eeb8d5d0a802199aa80d80e90009aba150033335501b75c40026ae854008c07cd5d09aba2500223263202633573804e04c04826ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aab9e5001137540026ae854008c03cd5d09aba2500223263201833573803203002c202e264c6402e66ae712410350543500017135573ca00226ea80048d400488880088d40048800448c88c008dd6000990009aa811911999aab9f0012501f233501e30043574200460066ae880080488c8c8cccd5cd19b8735573aa004900011991091980080180118051aba150023005357426ae8940088c98c8048cd5ce00980900809aab9e5001137540024646464646666ae68cdc39aab9d5004480008cccc888848cccc00401401000c008c8c8c8cccd5cd19b8735573aa004900011991091980080180118099aba1500233500d012357426ae8940088c98c805ccd5ce00c00b80a89aab9e5001137540026ae854010ccd54021d728039aba150033232323333573466e1d4005200423025357426aae79400c8cccd5cd19b875002480088c84888c004010dd71aba135573ca00846666ae68cdc3a801a400042444006464c6403266ae7006806405c0580544d55cea80089baa00135742a00466a012eb8d5d09aba2500223263201333573802802602226ae8940044d5d1280089aab9e500113754002266aa002eb9d6889119118011bab00132001355020223233335573e0044a03a466a03866442466002006004600c6aae754008c014d55cf280118021aba200301013574200224464646666ae68cdc3a800a400046a02a600a6ae84d55cf280191999ab9a3370ea00490011280a91931900819ab9c01101000e00d135573aa00226ea80048c8c8cccd5cd19b875001480188c848888c010014c01cd5d09aab9e500323333573466e1d400920042321222230020053009357426aae7940108cccd5cd19b875003480088c848888c004014c01cd5d09aab9e500523333573466e1d40112000232122223003005375c6ae84d55cf280311931900819ab9c01101000e00d00c00b135573aa00226ea80048c8c8cccd5cd19b8735573aa004900011991091980080180118029aba15002375a6ae84d5d1280111931900619ab9c00d00c00a135573ca00226ea80048c8cccd5cd19b8735573aa002900011bae357426aae7940088c98c8028cd5ce00580500409baa001232323232323333573466e1d4005200c21222222200323333573466e1d4009200a21222222200423333573466e1d400d2008233221222222233001009008375c6ae854014dd69aba135744a00a46666ae68cdc3a8022400c4664424444444660040120106eb8d5d0a8039bae357426ae89401c8cccd5cd19b875005480108cc8848888888cc018024020c030d5d0a8049bae357426ae8940248cccd5cd19b875006480088c848888888c01c020c034d5d09aab9e500b23333573466e1d401d2000232122222223005008300e357426aae7940308c98c804ccd5ce00a00980880800780700680600589aab9d5004135573ca00626aae7940084d55cf280089baa0012323232323333573466e1d400520022333222122333001005004003375a6ae854010dd69aba15003375a6ae84d5d1280191999ab9a3370ea0049000119091180100198041aba135573ca00c464c6401866ae700340300280244d55cea80189aba25001135573ca00226ea80048c8c8cccd5cd19b875001480088c8488c00400cdd71aba135573ca00646666ae68cdc3a8012400046424460040066eb8d5d09aab9e500423263200933573801401200e00c26aae7540044dd500089119191999ab9a3370ea00290021091100091999ab9a3370ea00490011190911180180218031aba135573ca00846666ae68cdc3a801a400042444004464c6401466ae7002c02802001c0184d55cea80089baa0012323333573466e1d40052002201623333573466e1d40092000201623263200633573800e00c00800626aae74dd5000a4c2400292103505431003200135501122112253350011500e22133500f3004002335530061200100400112533500121010100e11222333550033212330012253350022100310010025004253353003001135006001150050011212230020031122001111222300330020012253350021001100a123750002640026aa0124422444a66a00226a00644002442666a00a440046008004666aa600e2400200a008002224400424424466002008006244a666a0042a666a002200c4200c4200c42a666a004200c42666ae68cdd78010008040039080390a999a801080310803909980300100090911180100211199ab9a3371e00400200800624400424400222446004002224646002002446600660040040021"
}|]

let script' =
either (error . show) Prelude.id
. Cardano.deserialiseFromTextEnvelope (Cardano.AsScript Cardano.AsPlutusScriptV2)
. either (error . show) Prelude.id
. Aeson.eitherDecode
. Aeson.encode
$ scriptJSON
-- gah... cardano-api...
let scriptInAnyLang =
Cardano.ScriptInAnyLang
(Cardano.PlutusScriptLanguage Cardano.PlutusScriptV2)
script'

let refScript = Cardano.ReferenceScript
Cardano.ReferenceTxInsScriptsInlineDatumsInBabbageEra scriptInAnyLang
let shelleyAddr = Cardano.makeShelleyAddress
Cardano.Mainnet
(Cardano.PaymentCredentialByScript
(hashScriptInAnyLang scriptInAnyLang))
Cardano.NoStakeAddress
let addr = Cardano.AddressInEra
(Cardano.ShelleyAddressInEra Cardano.ShelleyBasedEraBabbage)
shelleyAddr

let addrText = Cardano.serialiseToBech32 shelleyAddr

let (datum42 :: Cardano.ScriptData) = either (error . show) Prelude.id
$ Cardano.deserialiseFromCBOR Cardano.AsScriptData
$ unsafeFromHex "182a"

(refScriptUTxOId, refScriptUTxOIx) <- liftIO . payOutput $
Cardano.TxOut
addr
(txOutVal $ lovelaceToVal minAdaVal)
(Cardano.TxOutDatumInline
Cardano.ReferenceTxInsScriptsInlineDatumsInBabbageEra
datum42)
refScript

(lockedFundsTxId, lockedFundsTxIx) <- liftIO . payOutput $
Cardano.TxOut
addr
(txOutVal $ lovelaceToVal someAdaVal)
(Cardano.TxOutDatumInline
Cardano.ReferenceTxInsScriptsInlineDatumsInBabbageEra
datum42)
Cardano.ReferenceScriptNone

let tx = emptyTx
& addReferenceInputs [toCardanoTxIn $ TxIn (getApiT refScriptUTxOId) (fromIntegral refScriptUTxOIx)]
& addInputs [toCardanoTxIn $ TxIn (getApiT lockedFundsTxId) (fromIntegral lockedFundsTxIx)]

let partialTx = Json [json|{
"transaction": #{serializeTxToHex tx},
"inputs": [
{ "id": #{refScriptUTxOId}
, "index": #{refScriptUTxOIx}
, "address": #{addrText}
, "amount": {
"quantity": #{minAdaVal},
"unit": "lovelace"
}
, "assets": []
, "datum": {"inline": "182a"}
, "script": #{scriptJSON}
},
{ "id": #{lockedFundsTxId}
, "index": #{lockedFundsTxIx}
, "address": #{addrText}
, "amount": {
"quantity": #{someAdaVal},
"unit": "lovelace"
}
, "assets": []
, "datum": {"inline": "182a"}
}
],
"redeemers": [
{
"purpose": "spending",
"input": {
"id": #{lockedFundsTxId},
"index": #{lockedFundsTxIx}
},
"data": "182a"
}
]
}|]

liftIO $ print partialTx

res <- liftIO $ balanceSignSubmit partialTx

liftIO $ print res

return ()

it "TRANS_NEW_BALANCE_02a - Cannot balance on empty wallet" $
\ctx -> runResourceT $ do
wa <- emptyWallet ctx
Expand Down Expand Up @@ -4384,3 +4568,11 @@ spec = describe "NEW_SHELLEY_TRANSACTIONS" $ do
, expectField (#assets . #total . #getApiT)
(`shouldBe` TokenMap.empty)
]


toCardanoTxIn :: TxIn -> Cardano.TxIn
toCardanoTxIn (TxIn tid ix) =
Cardano.TxIn (toCardanoTxId tid) (Cardano.TxIx (fromIntegral ix))

toCardanoTxId :: W.Hash "Tx" -> Cardano.TxId
toCardanoTxId (W.Hash h) = Cardano.TxId $ UnsafeHash $ toShort h

0 comments on commit ac78e50

Please sign in to comment.