Skip to main content
Deno 2 is finally here 🎉️
Learn more
Module

x/lucid/mod.ts>Core.PlutusDatumSchema

Lucid is a library, which allows you to create Cardano transactions and off-chain code for your Plutus contracts in JavaScript, Deno and Node.js.
Go to Latest
enum Core.PlutusDatumSchema
import { Core } from "https://deno.land/x/lucid@0.5.2/mod.ts";
const { PlutusDatumSchema } = Core;

JSON <-> PlutusData conversion schemas. Follows ScriptDataJsonSchema in cardano-cli defined at: https://github.com/input-output-hk/cardano-node/blob/master/cardano-api/src/Cardano/Api/ScriptData.hs#L254

All methods here have the following restrictions due to limitations on dependencies:

  • JSON numbers above u64::MAX (positive) or below i64::MIN (negative) will throw errors
  • Hex strings for bytes don't accept odd-length (half-byte) strings. cardano-cli seems to support these however but it seems to be different than just 0-padding on either side when tested so proceed with caution

Members

BasicConversions

ScriptDataJsonNoSchema in cardano-node.

This is the format used by --script-data-value in cardano-cli This tries to accept most JSON but does not support the full spectrum of Plutus datums. From JSON:

  • null/true/false/floats NOT supported
  • strings starting with 0x are treated as hex bytes. All other strings are encoded as their utf8 bytes. To JSON:
  • ConstrPlutusData not supported in ANY FORM (neither keys nor values)
  • Lists not supported in keys
  • Maps not supported in keys
DetailedSchema

ScriptDataJsonDetailedSchema in cardano-node.

This is the format used by --script-data-file in cardano-cli This covers almost all (only minor exceptions) Plutus datums, but the JSON must conform to a strict schema. The schema specifies that ALL keys and ALL values must be contained in a JSON map with 2 cases:

  1. For ConstrPlutusData there must be two fields "constructor" contianing a number and "fields" containing its fields e.g. { "constructor": 2, "fields": [{"int": 2}, {"list": [{"bytes": "CAFEF00D"}]}]}
  2. For all other cases there must be only one field named "int", "bytes", "list" or "map" Integer's value is a JSON number e.g. {"int": 100} Bytes' value is a hex string representing the bytes WITHOUT any prefix e.g. {"bytes": "CAFEF00D"} Lists' value is a JSON list of its elements encoded via the same schema e.g. {"list": [{"bytes": "CAFEF00D"}]} Maps' value is a JSON list of objects, one for each key-value pair in the map, with keys "k" and "v" respectively with their values being the plutus datum encoded via this same schema e.g. {"map": [ {"k": {"int": 2}, "v": {"int": 5}}, {"k": {"map": [{"k": {"list": [{"int": 1}]}, "v": {"bytes": "FF03"}}]}, "v": {"list": []}} ]} From JSON:
  • null/true/false/floats NOT supported
  • the JSON must conform to a very specific schema To JSON:
  • all Plutus datums should be fully supported outside of the integer range limitations outlined above.