|
| 1 | +import { Callout } from 'nextra-theme-docs' |
| 2 | + |
| 3 | +# Blueprint |
| 4 | + |
| 5 | +Plutus Contract Blueprint, as introduced by [CIP-57](https://cips.cardano.org/cip/CIP-0057) is an effective way of communicating desired structure of validator's associated types such as datum & redeemer to your off-chain code. |
| 6 | + |
| 7 | +With Atlas, you can easily have these types generated for you based on provided schema, along with some helper utilities, yay! |
| 8 | + |
| 9 | +<Callout> |
| 10 | + |
| 11 | +If your validator is parameterised, parameters must be "data" encoded (instead of scott or sums-of-products encoding[^1]) as blueprint notation desires it (data) to be primary binary interface. This is not an issue for datums & redeemers as they are required to be data encoded anyway. |
| 12 | + |
| 13 | +Validators written by tools such as Aiken uses data encoding for validator parameters. |
| 14 | +</Callout> |
| 15 | + |
| 16 | +[Here](https://github.com/geniusyield/atlas/blob/main/tests/aiken/bar/validators/baz.ak) we have a parameterised Aiken validator. Mainly, it checks that sum of integers and length of bytestrings given in parameters, datum & redeemer sum up to a specific value. |
| 17 | + |
| 18 | +For it, we have a simple off-chain code [here](https://github.com/geniusyield/atlas/blob/main/tests-privnet/GeniusYield/Test/Privnet/Blueprint.hs), have a look at it and we provide some description for it below. |
| 19 | + |
| 20 | +We first use Template Haskell to splice declarations from [`makeBPTypes`](https://haddock.atlas-app.io/GeniusYield-Types-Blueprint-TH.html#v:makeBPTypes) and [`uponBPTypes`](https://haddock.atlas-app.io/GeniusYield-Types-Blueprint-TH.html#v:uponBPTypes). `makeBPTypes` introduces types from definitions given in blueprint file and `uponBPTypes` creates data related instances such as [`ToData`](https://plutus.cardano.intersectmbo.org/haddock/latest/plutus-ledger-api/PlutusLedgerApi-Common.html#t:ToData), [`FromData`](https://plutus.cardano.intersectmbo.org/haddock/latest/plutus-ledger-api/PlutusLedgerApi-Common.html#t:FromData) for these types[^2]. |
| 21 | + |
| 22 | +It is useful to see generated Template Haskell code to know for type and provided utility names which can be done via `-ddump-splices` GHC flag. You may combine this with `-ddump-to-file` to save the output to a file. If you are using cabal, see [this](https://stackoverflow.com/questions/24717500/viewing-core-when-compiling-with-cabal/69678961#69678961) answer on where one can find dumped splice files. |
| 23 | + |
| 24 | +Now we can apply parameters (whose types have been generated by Atlas) to our validator with provided `applyParamsToBPValidator_baz_baz_spend` function and obtain `GYScript` from it using `scriptFromBPSerialisedScript` function. Likewise we have types generated for our datum & redeemer, sweet! |
| 25 | + |
| 26 | +Rest of the off-chain code just tries to interact with the validator by creating a UTxO towards it and then later consuming from it. |
| 27 | + |
| 28 | +<Callout> |
| 29 | + |
| 30 | +To interact with blueprint file, you'll usually just need to import [`GeniusYield.Types.Blueprint.TH`](https://haddock.atlas-app.io/GeniusYield-Types-Blueprint-TH.html) module (which is exposed by `GeniusYield.Types` module), however if you want to inspect the parsed blueprint file, you can use [`readBlueprint`](https://haddock.atlas-app.io/GeniusYield-Types-Blueprint.html#v:readBlueprint). |
| 31 | +</Callout> |
| 32 | + |
| 33 | +[^1]: See [CIP-85](https://cips.cardano.org/cip/CIP-0085) to understand about different encodings used. |
| 34 | +[^2]: We could however achieve both in single splice, however, since we are using utilities from PlutusTx to derive `ToData` etc. instances, they require type to be in scope first. |
0 commit comments