[{"data":1,"prerenderedAt":1789},["ShallowReactive",2],{"navigation":3,"page-en-\u002Fconcepts\u002Fsmart-contracts-in-hydra":160,"surround-en-\u002Fconcepts\u002Fsmart-contracts-in-hydra":1784},[4,28,65,99,130,151],{"title":5,"path":6,"stem":7,"children":8,"icon":27},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,12,17,22],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-house",{"title":13,"path":14,"stem":15,"icon":16},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-rocket",{"title":23,"path":24,"stem":25,"icon":26},"Configuration","\u002Fgetting-started\u002Fconfiguration","1.getting-started\u002F4.configuration","i-lucide-settings-2",false,{"title":29,"path":30,"stem":31,"children":32,"icon":34},"Guides","\u002Fguides","2.guides\u002F1.index",[33,35,40,45,50,55,60],{"title":29,"path":30,"stem":31,"icon":34},"i-lucide-book-open",{"title":36,"path":37,"stem":38,"icon":39},"Build a Wallet App","\u002Fguides\u002Fbuild-wallet-app","2.guides\u002F2.build-wallet-app","i-lucide-wallet",{"title":41,"path":42,"stem":43,"icon":44},"Building Transactions","\u002Fguides\u002Ftransactions","2.guides\u002F3.transactions","i-lucide-file-signature",{"title":46,"path":47,"stem":48,"icon":49},"Mint and Burn Tokens Guide","\u002Fguides\u002Fmint-burn-tokens","2.guides\u002F4.mint-burn-tokens","i-lucide-coins",{"title":51,"path":52,"stem":53,"icon":54},"Hydra Integration Examples","\u002Fguides\u002Fhydra-integration","2.guides\u002F5.hydra-integration","i-lucide-network",{"title":56,"path":57,"stem":58,"icon":59},"Utilities Cookbook","\u002Fguides\u002Futilities-cookbook","2.guides\u002F6.utilities-cookbook","i-lucide-wrench",{"title":61,"path":62,"stem":63,"icon":64},"Integrate from Cardano-CLI","\u002Fguides\u002Fcardano-cli-keys","2.guides\u002F7.cardano-cli-keys","i-lucide-key-round",{"title":66,"path":67,"stem":68,"children":69,"icon":98},"Concepts","\u002Fconcepts","3.concepts\u002F1.index",[70,73,78,83,88,93],{"title":71,"path":67,"stem":68,"icon":72},"Why Hydra?","i-lucide-circle-help",{"title":74,"path":75,"stem":76,"icon":77},"Commit to Hydra","\u002Fconcepts\u002Fcommit-to-hydra","3.concepts\u002F2.commit-to-hydra","i-lucide-arrow-down-to-line",{"title":79,"path":80,"stem":81,"icon":82},"Decommit from Hydra","\u002Fconcepts\u002Fdecommit-from-hydra","3.concepts\u002F3.decommit-from-hydra","i-lucide-arrow-up-from-line",{"title":84,"path":85,"stem":86,"icon":87},"Transactions in Hydra","\u002Fconcepts\u002Ftransactions-in-hydra","3.concepts\u002F4.transactions-in-hydra","i-lucide-arrow-left-right",{"title":89,"path":90,"stem":91,"icon":92},"Smart Contracts in Hydra","\u002Fconcepts\u002Fsmart-contracts-in-hydra","3.concepts\u002F5.smart-contracts-in-hydra","i-lucide-file-code-2",{"title":94,"path":95,"stem":96,"icon":97},"Hydra Protocol Versions","\u002Fconcepts\u002Fhydra-v2-changes","3.concepts\u002F6.hydra-v2-changes","i-lucide-git-compare","i-lucide-lightbulb",{"title":100,"path":101,"stem":102,"children":103,"icon":129},"API Reference","\u002Fapi","4.api\u002F1.index",[104,106,111,116,120,125],{"title":100,"path":101,"stem":102,"icon":105},"i-lucide-book-marked",{"title":107,"path":108,"stem":109,"icon":110},"@hydra-sdk\u002Fcore","\u002Fapi\u002Fcore","4.api\u002F2.core","i-lucide-box",{"title":112,"path":113,"stem":114,"icon":115},"@hydra-sdk\u002Fbridge","\u002Fapi\u002Fbridge","4.api\u002F3.bridge","i-lucide-cable",{"title":117,"path":118,"stem":119,"icon":44},"@hydra-sdk\u002Ftransaction","\u002Fapi\u002Ftransaction","4.api\u002F4.transaction",{"title":121,"path":122,"stem":123,"icon":124},"@hydra-sdk\u002Fcardano-wasm","\u002Fapi\u002Fcardano-wasm","4.api\u002F5.cardano-wasm","i-lucide-cpu",{"title":126,"path":127,"stem":128,"icon":59},"@hydra-sdk\u002Fcore - Utilities","\u002Fapi\u002Futilities","4.api\u002F6.utilities","i-lucide-braces",{"title":131,"icon":132,"path":133,"stem":134,"children":135,"page":27},"Resources","i-lucide-archive","\u002Fresources","5.resources",[136,141,146],{"title":137,"path":138,"stem":139,"icon":140},"Change Logs","\u002Fresources\u002Fchangelog","5.resources\u002F1.changelog","i-lucide-history",{"title":142,"path":143,"stem":144,"icon":145},"Migration","\u002Fresources\u002Fmigration","5.resources\u002F2.migration","i-lucide-arrow-right-left",{"title":147,"path":148,"stem":149,"icon":150},"Performance & Comparison","\u002Fresources\u002Fperformance","5.resources\u002F3.performance","i-lucide-gauge",{"title":152,"path":153,"stem":154,"children":155,"icon":159},"AI","\u002Fai","6.ai\u002F1.index",[156],{"title":157,"path":153,"stem":154,"icon":158},"Use with AI","i-lucide-bot","i-lucide-sparkles",{"id":161,"title":89,"body":162,"description":1775,"extension":1776,"links":1777,"meta":1778,"navigation":1781,"path":90,"seo":1782,"stem":91,"__hash__":1783},"docs_en\u002F3.concepts\u002F5.smart-contracts-in-hydra.md",{"type":163,"value":164,"toc":1761},"minimark",[165,174,179,184,190,209,220,224,227,231,248,252,423,426,438,442,449,460,941,952,1647,1651,1693,1697,1714,1718,1729,1733,1757],[166,167,168,169,173],"p",{},"Hydra Heads support ",[170,171,172],"strong",{},"isomorphic"," smart contracts — the same Plutus scripts that run on Layer 1 work identically in Layer 2. This enables complex DeFi protocols, NFT mechanisms, and DApp logic with instant finality and minimal fees.",[175,176,178],"h2",{"id":177},"isomorphic-smart-contracts","Isomorphic Smart Contracts",[180,181,183],"h3",{"id":182},"what-does-isomorphic-mean","What does isomorphic mean?",[166,185,186,189],{},[170,187,188],{},"Isomorphic"," means Hydra Heads use the same execution environment as Layer 1:",[191,192,193,197,200,203,206],"ul",{},[194,195,196],"li",{},"✅ Same validator scripts",[194,198,199],{},"✅ Same validation logic",[194,201,202],{},"✅ Same datum\u002Fredeemer structure",[194,204,205],{},"✅ Same native asset support",[194,207,208],{},"✅ No code changes required",[210,211,216],"pre",{"className":212,"code":214,"language":215},[213],"language-text","┌──────────────────────────────┐\n│    Your validator script     │\n│                              │\n│  validator :: Datum ->       │\n│              Redeemer ->     │\n│              ScriptContext ->│\n│              Bool            │\n└──────────┬─────────┬─────────┘\n           │         │\n     ┌─────▼─────┐   │\n     │ Layer 1   │   │\n     │ Mainnet   │   │\n     └───────────┘   │\n                     │\n              ┌──────▼──────┐\n              │ Hydra Head  │\n              │  (Layer 2)  │\n              └─────────────┘\n","text",[217,218,214],"code",{"__ignoreMap":219},"",[175,221,223],{"id":222},"using-smart-contracts-in-hydra","Using Smart Contracts in Hydra",[166,225,226],{},"Plutus smart contracts operate inside a Hydra Head the same way they operate on Cardano Layer 1. That means you can reuse the validator, datum, and redeemer without changing the on-chain logic while benefiting from fast transactions, low fees, and instant finality inside the Head.",[180,228,230],{"id":229},"quick-process-summary","Quick process summary",[191,232,233,236,239,242,245],{},[194,234,235],{},"Write your Layer 1 validator as usual — keep datum\u002Fredeemer formats consistent.",[194,237,238],{},"Lock a script UTxO on Layer 1 (for example, commit it to a Head or reference an existing script UTxO).",[194,240,241],{},"In the Hydra Head, build an (off-chain) transaction that uses the same script, datum, and redeemer.",[194,243,244],{},"The transaction is validated by Head participants against the validator rules; if valid, the Head’s state updates.",[194,246,247],{},"When the Head is closed\u002Fsettled, the final state is posted to L1 and the changes are applied by the script validator.",[180,249,251],{"id":250},"example-validator-aiken-always-true","Example: validator (Aiken, Always True)",[210,253,257],{"className":254,"code":255,"language":256,"meta":219,"style":219},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# always-true.ak (apps\u002Fnodejs-playground\u002Fsrc\u002Fcontract\u002Falways-true.ak)\n\nuse cardano\u002Ftransaction.{ OutputReference, Transaction}\nvalidator always_true {\n    spend (\n        _datum: Option\u003CData>,\n        _redeemer: Data,\n        _output_ref: OutputReference,\n        _tx: Transaction,\n    ) {\n        True\n    }\n\n    else(_) {\n        fail\n    }\n}\n","sh",[217,258,259,268,275,292,304,314,339,348,357,366,375,381,387,392,406,412,417],{"__ignoreMap":219},[260,261,264],"span",{"class":262,"line":263},"line",1,[260,265,267],{"class":266},"sHwdD","# always-true.ak (apps\u002Fnodejs-playground\u002Fsrc\u002Fcontract\u002Falways-true.ak)\n",[260,269,271],{"class":262,"line":270},2,[260,272,274],{"emptyLinePlaceholder":273},true,"\n",[260,276,278,282,286,289],{"class":262,"line":277},3,[260,279,281],{"class":280},"sBMFI","use",[260,283,285],{"class":284},"sfazB"," cardano\u002Ftransaction.{",[260,287,288],{"class":284}," OutputReference,",[260,290,291],{"class":284}," Transaction}\n",[260,293,295,298,301],{"class":262,"line":294},4,[260,296,297],{"class":280},"validator",[260,299,300],{"class":284}," always_true",[260,302,303],{"class":284}," {\n",[260,305,307,310],{"class":262,"line":306},5,[260,308,309],{"class":280},"    spend",[260,311,313],{"class":312},"sTEyZ"," (\n",[260,315,317,320,323,327,330,333,336],{"class":262,"line":316},6,[260,318,319],{"class":280},"        _datum:",[260,321,322],{"class":284}," Option",[260,324,326],{"class":325},"sMK4o","\u003C",[260,328,329],{"class":284},"Dat",[260,331,332],{"class":312},"a",[260,334,335],{"class":325},">",[260,337,338],{"class":284},",\n",[260,340,342,345],{"class":262,"line":341},7,[260,343,344],{"class":280},"        _redeemer:",[260,346,347],{"class":284}," Data,\n",[260,349,351,354],{"class":262,"line":350},8,[260,352,353],{"class":280},"        _output_ref:",[260,355,356],{"class":284}," OutputReference,\n",[260,358,360,363],{"class":262,"line":359},9,[260,361,362],{"class":280},"        _tx:",[260,364,365],{"class":284}," Transaction,\n",[260,367,369,372],{"class":262,"line":368},10,[260,370,371],{"class":312},"    ) ",[260,373,374],{"class":325},"{\n",[260,376,378],{"class":262,"line":377},11,[260,379,380],{"class":280},"        True\n",[260,382,384],{"class":262,"line":383},12,[260,385,386],{"class":325},"    }\n",[260,388,390],{"class":262,"line":389},13,[260,391,274],{"emptyLinePlaceholder":273},[260,393,395,398,401,404],{"class":262,"line":394},14,[260,396,397],{"class":312},"    else(",[260,399,400],{"class":280},"_",[260,402,403],{"class":312},") ",[260,405,374],{"class":325},[260,407,409],{"class":262,"line":408},15,[260,410,411],{"class":280},"        fail\n",[260,413,415],{"class":262,"line":414},16,[260,416,386],{"class":325},[260,418,420],{"class":262,"line":419},17,[260,421,422],{"class":312},"}\n",[166,424,425],{},"After compilation you will get the file:",[166,427,428,431,432],{},[217,429,430],{},"always-true.json",": ",[332,433,437],{"href":434,"rel":435},"https:\u002F\u002Fgithub.com\u002FVtechcom\u002Fhydra-sdk\u002Fblob\u002Fmaster\u002Fapps\u002Fnodejs-playground\u002Fsrc\u002Fcontract\u002Falways-true.json",[436],"nofollow","nodejs-playground\u002Fsrc\u002Fcontract\u002Falways-true.json",[180,439,441],{"id":440},"example-using-the-sdk-typescript","Example: using the SDK (TypeScript)",[166,443,444,445,448],{},"The sample scripts in ",[217,446,447],{},"apps\u002Fnodejs-playground\u002Fsrc\u002Fcontract\u002F"," demonstrate lock\u002Funlock flows:",[191,450,451],{},[194,452,453,456,457],{},[170,454,455],{},"Lock",": create a script UTxO → ",[217,458,459],{},"npx tsx src\u002Fcontract\u002Fhydra-lock.ts",[210,461,465],{"className":462,"code":463,"language":464,"meta":219,"style":219},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import contract from '.\u002Falways-true.json'\nimport { DatumUtils, Deserializer, TimeUtils, SLOT_CONFIG_NETWORK } from '@hydra-sdk\u002Fcore'\nimport { buildRedeemer, emptyRedeemer, TxBuilder } from '@hydra-sdk\u002Ftransaction'\n\n\u002F\u002F Build datum\nconst { paymentCredentialHash: pubKeyHash } = Deserializer.deserializeAddress(walletAddress)\nconst system_unlocked_at = Date.now() + 1 * 60 * 1000 \u002F\u002F now + 1 minute\n\nconst datum = DatumUtils.mkConstr(0, [\n      DatumUtils.mkBytes(pubKeyHash!),\n      DatumUtils.mkInt(system_unlocked_at),\n])\n\nconst txBuilder = new TxBuilder({\n      isHydra: true,\n      params: {\n            minFeeA: 0,\n            minFeeB: 0\n      }\n})\nconst txLock = await txBuilder\n      .setInputs(addressUTxO)\n      .addOutput({\n            address: contract.address,\n            amount: [{ unit: 'lovelace', quantity: String(2_000_000) }]\n      })\n      .txOutInlineDatumValue(datum)\n      .changeAddress(walletAddress)\n      .complete()\n\n","ts",[217,466,467,488,526,555,559,564,600,642,646,673,694,708,713,717,735,748,757,769,780,786,794,810,822,834,852,901,909,920,930],{"__ignoreMap":219},[260,468,469,473,476,479,482,485],{"class":262,"line":263},[260,470,472],{"class":471},"s7zQu","import",[260,474,475],{"class":312}," contract ",[260,477,478],{"class":471},"from",[260,480,481],{"class":325}," '",[260,483,484],{"class":284},".\u002Falways-true.json",[260,486,487],{"class":325},"'\n",[260,489,490,492,495,498,501,504,506,509,511,514,517,520,522,524],{"class":262,"line":270},[260,491,472],{"class":471},[260,493,494],{"class":325}," {",[260,496,497],{"class":312}," DatumUtils",[260,499,500],{"class":325},",",[260,502,503],{"class":312}," Deserializer",[260,505,500],{"class":325},[260,507,508],{"class":312}," TimeUtils",[260,510,500],{"class":325},[260,512,513],{"class":312}," SLOT_CONFIG_NETWORK",[260,515,516],{"class":325}," }",[260,518,519],{"class":471}," from",[260,521,481],{"class":325},[260,523,107],{"class":284},[260,525,487],{"class":325},[260,527,528,530,532,535,537,540,542,545,547,549,551,553],{"class":262,"line":277},[260,529,472],{"class":471},[260,531,494],{"class":325},[260,533,534],{"class":312}," buildRedeemer",[260,536,500],{"class":325},[260,538,539],{"class":312}," emptyRedeemer",[260,541,500],{"class":325},[260,543,544],{"class":312}," TxBuilder",[260,546,516],{"class":325},[260,548,519],{"class":471},[260,550,481],{"class":325},[260,552,117],{"class":284},[260,554,487],{"class":325},[260,556,557],{"class":262,"line":294},[260,558,274],{"emptyLinePlaceholder":273},[260,560,561],{"class":262,"line":306},[260,562,563],{"class":266},"\u002F\u002F Build datum\n",[260,565,566,570,572,576,579,582,585,588,590,593,597],{"class":262,"line":316},[260,567,569],{"class":568},"spNyl","const",[260,571,494],{"class":325},[260,573,575],{"class":574},"swJcz"," paymentCredentialHash",[260,577,578],{"class":325},":",[260,580,581],{"class":312}," pubKeyHash ",[260,583,584],{"class":325},"}",[260,586,587],{"class":325}," =",[260,589,503],{"class":312},[260,591,592],{"class":325},".",[260,594,596],{"class":595},"s2Zo4","deserializeAddress",[260,598,599],{"class":312},"(walletAddress)\n",[260,601,602,604,607,610,613,615,618,621,624,628,631,634,636,639],{"class":262,"line":341},[260,603,569],{"class":568},[260,605,606],{"class":312}," system_unlocked_at ",[260,608,609],{"class":325},"=",[260,611,612],{"class":312}," Date",[260,614,592],{"class":325},[260,616,617],{"class":595},"now",[260,619,620],{"class":312},"() ",[260,622,623],{"class":325},"+",[260,625,627],{"class":626},"sbssI"," 1",[260,629,630],{"class":325}," *",[260,632,633],{"class":626}," 60",[260,635,630],{"class":325},[260,637,638],{"class":626}," 1000",[260,640,641],{"class":266}," \u002F\u002F now + 1 minute\n",[260,643,644],{"class":262,"line":350},[260,645,274],{"emptyLinePlaceholder":273},[260,647,648,650,653,655,657,659,662,665,668,670],{"class":262,"line":359},[260,649,569],{"class":568},[260,651,652],{"class":312}," datum ",[260,654,609],{"class":325},[260,656,497],{"class":312},[260,658,592],{"class":325},[260,660,661],{"class":595},"mkConstr",[260,663,664],{"class":312},"(",[260,666,667],{"class":626},"0",[260,669,500],{"class":325},[260,671,672],{"class":312}," [\n",[260,674,675,678,680,683,686,689,692],{"class":262,"line":368},[260,676,677],{"class":312},"      DatumUtils",[260,679,592],{"class":325},[260,681,682],{"class":595},"mkBytes",[260,684,685],{"class":312},"(pubKeyHash",[260,687,688],{"class":325},"!",[260,690,691],{"class":312},")",[260,693,338],{"class":325},[260,695,696,698,700,703,706],{"class":262,"line":377},[260,697,677],{"class":312},[260,699,592],{"class":325},[260,701,702],{"class":595},"mkInt",[260,704,705],{"class":312},"(system_unlocked_at)",[260,707,338],{"class":325},[260,709,710],{"class":262,"line":383},[260,711,712],{"class":312},"])\n",[260,714,715],{"class":262,"line":389},[260,716,274],{"emptyLinePlaceholder":273},[260,718,719,721,724,726,729,731,733],{"class":262,"line":394},[260,720,569],{"class":568},[260,722,723],{"class":312}," txBuilder ",[260,725,609],{"class":325},[260,727,728],{"class":325}," new",[260,730,544],{"class":595},[260,732,664],{"class":312},[260,734,374],{"class":325},[260,736,737,740,742,746],{"class":262,"line":408},[260,738,739],{"class":574},"      isHydra",[260,741,578],{"class":325},[260,743,745],{"class":744},"sfNiH"," true",[260,747,338],{"class":325},[260,749,750,753,755],{"class":262,"line":414},[260,751,752],{"class":574},"      params",[260,754,578],{"class":325},[260,756,303],{"class":325},[260,758,759,762,764,767],{"class":262,"line":419},[260,760,761],{"class":574},"            minFeeA",[260,763,578],{"class":325},[260,765,766],{"class":626}," 0",[260,768,338],{"class":325},[260,770,772,775,777],{"class":262,"line":771},18,[260,773,774],{"class":574},"            minFeeB",[260,776,578],{"class":325},[260,778,779],{"class":626}," 0\n",[260,781,783],{"class":262,"line":782},19,[260,784,785],{"class":325},"      }\n",[260,787,789,791],{"class":262,"line":788},20,[260,790,584],{"class":325},[260,792,793],{"class":312},")\n",[260,795,797,799,802,804,807],{"class":262,"line":796},21,[260,798,569],{"class":568},[260,800,801],{"class":312}," txLock ",[260,803,609],{"class":325},[260,805,806],{"class":471}," await",[260,808,809],{"class":312}," txBuilder\n",[260,811,813,816,819],{"class":262,"line":812},22,[260,814,815],{"class":325},"      .",[260,817,818],{"class":595},"setInputs",[260,820,821],{"class":312},"(addressUTxO)\n",[260,823,825,827,830,832],{"class":262,"line":824},23,[260,826,815],{"class":325},[260,828,829],{"class":595},"addOutput",[260,831,664],{"class":312},[260,833,374],{"class":325},[260,835,837,840,842,845,847,850],{"class":262,"line":836},24,[260,838,839],{"class":574},"            address",[260,841,578],{"class":325},[260,843,844],{"class":312}," contract",[260,846,592],{"class":325},[260,848,849],{"class":312},"address",[260,851,338],{"class":325},[260,853,855,858,860,863,866,869,871,873,876,879,881,884,886,889,891,894,896,898],{"class":262,"line":854},25,[260,856,857],{"class":574},"            amount",[260,859,578],{"class":325},[260,861,862],{"class":312}," [",[260,864,865],{"class":325},"{",[260,867,868],{"class":574}," unit",[260,870,578],{"class":325},[260,872,481],{"class":325},[260,874,875],{"class":284},"lovelace",[260,877,878],{"class":325},"'",[260,880,500],{"class":325},[260,882,883],{"class":574}," quantity",[260,885,578],{"class":325},[260,887,888],{"class":595}," String",[260,890,664],{"class":312},[260,892,893],{"class":626},"2_000_000",[260,895,403],{"class":312},[260,897,584],{"class":325},[260,899,900],{"class":312},"]\n",[260,902,904,907],{"class":262,"line":903},26,[260,905,906],{"class":325},"      }",[260,908,793],{"class":312},[260,910,912,914,917],{"class":262,"line":911},27,[260,913,815],{"class":325},[260,915,916],{"class":595},"txOutInlineDatumValue",[260,918,919],{"class":312},"(datum)\n",[260,921,923,925,928],{"class":262,"line":922},28,[260,924,815],{"class":325},[260,926,927],{"class":595},"changeAddress",[260,929,599],{"class":312},[260,931,933,935,938],{"class":262,"line":932},29,[260,934,815],{"class":325},[260,936,937],{"class":595},"complete",[260,939,940],{"class":312},"()\n",[191,942,943],{},[194,944,945,948,949],{},[170,946,947],{},"Unlock",": consume the script UTxO → ",[217,950,951],{},"npx tsx src\u002Fcontract\u002Fhydra-unlock.ts \u003CtxHash#index>",[210,953,955],{"className":462,"code":954,"language":464,"meta":219,"style":219},"import contract from '.\u002Falways-true.json'\nimport { DatumUtils, Deserializer, TimeUtils, SLOT_CONFIG_NETWORK } from '@hydra-sdk\u002Fcore'\nimport { buildRedeemer, emptyRedeemer, TxBuilder } from '@hydra-sdk\u002Ftransaction'\n\nconst txBuilder = new TxBuilder({\n      isHydra: true,\n      params: {\n            minFeeA: 0,\n            minFeeB: 0\n      }\n})\n\nconst SLOT_CONFIG: (typeof SLOT_CONFIG_NETWORK)['PREPROD'] = {\n      zeroTime: 1762267312000, \u002F\u002F Timestamp in ms when start hydra head network\n      zeroSlot: 0,\n      slotLength: 1000,\n      epochLength: 432000,\n      startEpoch: 0,\n} as const;\n\nconst txUnlock = await txBuilder\n      .setInputs(inputUTxOs)\n      .txIn(\n            scriptUTxO.input.txHash, \n            scriptUTxO.input.outputIndex, \n            scriptUTxO.output.amount, \n            scriptUTxO.output.address\n      )\n      .txInScript(contract.cborHex)\n      .txInInlineDatum(scriptUTxO.output.inlineDatum!)\n      .txInRedeemerValue(\n            emptyRedeemer({ type: 'int', exUnits: { mem: '100000', steps: '25000000' } })\n      )\n      .txInCollateral(\n            collateralUTxO.input.txHash,\n            collateralUTxO.input.outputIndex,\n            collateralUTxO.output.amount,\n            collateralUTxO.output.address\n      )\n      .addOutput({\n            address: walletAddress,\n            amount: scriptUTxO.output.amount \u002F\u002F send all assets back to myself\n      })\n      .changeAddress(walletAddress)\n      .invalidBefore(TimeUtils.unixTimeToEnclosingSlot(Date.now(), SLOT_CONFIG)) \u002F\u002F must be after current slot\n      .invalidAfter(TimeUtils.unixTimeToEnclosingSlot(Date.now() + 60 * 60 * 1000, SLOT_CONFIG)) \u002F\u002F must be within 1 hour\n      .complete()\n",[217,956,957,971,1001,1027,1031,1047,1057,1065,1075,1083,1087,1093,1097,1129,1144,1155,1166,1178,1189,1202,1206,1219,1228,1238,1258,1275,1293,1306,1311,1326,1350,1360,1423,1428,1438,1454,1469,1484,1497,1502,1513,1525,1547,1554,1563,1597,1638],{"__ignoreMap":219},[260,958,959,961,963,965,967,969],{"class":262,"line":263},[260,960,472],{"class":471},[260,962,475],{"class":312},[260,964,478],{"class":471},[260,966,481],{"class":325},[260,968,484],{"class":284},[260,970,487],{"class":325},[260,972,973,975,977,979,981,983,985,987,989,991,993,995,997,999],{"class":262,"line":270},[260,974,472],{"class":471},[260,976,494],{"class":325},[260,978,497],{"class":312},[260,980,500],{"class":325},[260,982,503],{"class":312},[260,984,500],{"class":325},[260,986,508],{"class":312},[260,988,500],{"class":325},[260,990,513],{"class":312},[260,992,516],{"class":325},[260,994,519],{"class":471},[260,996,481],{"class":325},[260,998,107],{"class":284},[260,1000,487],{"class":325},[260,1002,1003,1005,1007,1009,1011,1013,1015,1017,1019,1021,1023,1025],{"class":262,"line":277},[260,1004,472],{"class":471},[260,1006,494],{"class":325},[260,1008,534],{"class":312},[260,1010,500],{"class":325},[260,1012,539],{"class":312},[260,1014,500],{"class":325},[260,1016,544],{"class":312},[260,1018,516],{"class":325},[260,1020,519],{"class":471},[260,1022,481],{"class":325},[260,1024,117],{"class":284},[260,1026,487],{"class":325},[260,1028,1029],{"class":262,"line":294},[260,1030,274],{"emptyLinePlaceholder":273},[260,1032,1033,1035,1037,1039,1041,1043,1045],{"class":262,"line":306},[260,1034,569],{"class":568},[260,1036,723],{"class":312},[260,1038,609],{"class":325},[260,1040,728],{"class":325},[260,1042,544],{"class":595},[260,1044,664],{"class":312},[260,1046,374],{"class":325},[260,1048,1049,1051,1053,1055],{"class":262,"line":316},[260,1050,739],{"class":574},[260,1052,578],{"class":325},[260,1054,745],{"class":744},[260,1056,338],{"class":325},[260,1058,1059,1061,1063],{"class":262,"line":341},[260,1060,752],{"class":574},[260,1062,578],{"class":325},[260,1064,303],{"class":325},[260,1066,1067,1069,1071,1073],{"class":262,"line":350},[260,1068,761],{"class":574},[260,1070,578],{"class":325},[260,1072,766],{"class":626},[260,1074,338],{"class":325},[260,1076,1077,1079,1081],{"class":262,"line":359},[260,1078,774],{"class":574},[260,1080,578],{"class":325},[260,1082,779],{"class":626},[260,1084,1085],{"class":262,"line":368},[260,1086,785],{"class":325},[260,1088,1089,1091],{"class":262,"line":377},[260,1090,584],{"class":325},[260,1092,793],{"class":312},[260,1094,1095],{"class":262,"line":383},[260,1096,274],{"emptyLinePlaceholder":273},[260,1098,1099,1101,1104,1106,1109,1112,1115,1117,1120,1122,1125,1127],{"class":262,"line":389},[260,1100,569],{"class":568},[260,1102,1103],{"class":312}," SLOT_CONFIG",[260,1105,578],{"class":325},[260,1107,1108],{"class":312}," (",[260,1110,1111],{"class":325},"typeof",[260,1113,1114],{"class":312}," SLOT_CONFIG_NETWORK)[",[260,1116,878],{"class":325},[260,1118,1119],{"class":284},"PREPROD",[260,1121,878],{"class":325},[260,1123,1124],{"class":312},"] ",[260,1126,609],{"class":325},[260,1128,303],{"class":325},[260,1130,1131,1134,1136,1139,1141],{"class":262,"line":394},[260,1132,1133],{"class":574},"      zeroTime",[260,1135,578],{"class":325},[260,1137,1138],{"class":626}," 1762267312000",[260,1140,500],{"class":325},[260,1142,1143],{"class":266}," \u002F\u002F Timestamp in ms when start hydra head network\n",[260,1145,1146,1149,1151,1153],{"class":262,"line":408},[260,1147,1148],{"class":574},"      zeroSlot",[260,1150,578],{"class":325},[260,1152,766],{"class":626},[260,1154,338],{"class":325},[260,1156,1157,1160,1162,1164],{"class":262,"line":414},[260,1158,1159],{"class":574},"      slotLength",[260,1161,578],{"class":325},[260,1163,638],{"class":626},[260,1165,338],{"class":325},[260,1167,1168,1171,1173,1176],{"class":262,"line":419},[260,1169,1170],{"class":574},"      epochLength",[260,1172,578],{"class":325},[260,1174,1175],{"class":626}," 432000",[260,1177,338],{"class":325},[260,1179,1180,1183,1185,1187],{"class":262,"line":771},[260,1181,1182],{"class":574},"      startEpoch",[260,1184,578],{"class":325},[260,1186,766],{"class":626},[260,1188,338],{"class":325},[260,1190,1191,1193,1196,1199],{"class":262,"line":782},[260,1192,584],{"class":325},[260,1194,1195],{"class":471}," as",[260,1197,1198],{"class":568}," const",[260,1200,1201],{"class":325},";\n",[260,1203,1204],{"class":262,"line":788},[260,1205,274],{"emptyLinePlaceholder":273},[260,1207,1208,1210,1213,1215,1217],{"class":262,"line":796},[260,1209,569],{"class":568},[260,1211,1212],{"class":312}," txUnlock ",[260,1214,609],{"class":325},[260,1216,806],{"class":471},[260,1218,809],{"class":312},[260,1220,1221,1223,1225],{"class":262,"line":812},[260,1222,815],{"class":325},[260,1224,818],{"class":595},[260,1226,1227],{"class":312},"(inputUTxOs)\n",[260,1229,1230,1232,1235],{"class":262,"line":824},[260,1231,815],{"class":325},[260,1233,1234],{"class":595},"txIn",[260,1236,1237],{"class":312},"(\n",[260,1239,1240,1243,1245,1248,1250,1253,1255],{"class":262,"line":836},[260,1241,1242],{"class":312},"            scriptUTxO",[260,1244,592],{"class":325},[260,1246,1247],{"class":312},"input",[260,1249,592],{"class":325},[260,1251,1252],{"class":312},"txHash",[260,1254,500],{"class":325},[260,1256,1257],{"class":312}," \n",[260,1259,1260,1262,1264,1266,1268,1271,1273],{"class":262,"line":854},[260,1261,1242],{"class":312},[260,1263,592],{"class":325},[260,1265,1247],{"class":312},[260,1267,592],{"class":325},[260,1269,1270],{"class":312},"outputIndex",[260,1272,500],{"class":325},[260,1274,1257],{"class":312},[260,1276,1277,1279,1281,1284,1286,1289,1291],{"class":262,"line":903},[260,1278,1242],{"class":312},[260,1280,592],{"class":325},[260,1282,1283],{"class":312},"output",[260,1285,592],{"class":325},[260,1287,1288],{"class":312},"amount",[260,1290,500],{"class":325},[260,1292,1257],{"class":312},[260,1294,1295,1297,1299,1301,1303],{"class":262,"line":911},[260,1296,1242],{"class":312},[260,1298,592],{"class":325},[260,1300,1283],{"class":312},[260,1302,592],{"class":325},[260,1304,1305],{"class":312},"address\n",[260,1307,1308],{"class":262,"line":922},[260,1309,1310],{"class":312},"      )\n",[260,1312,1313,1315,1318,1321,1323],{"class":262,"line":932},[260,1314,815],{"class":325},[260,1316,1317],{"class":595},"txInScript",[260,1319,1320],{"class":312},"(contract",[260,1322,592],{"class":325},[260,1324,1325],{"class":312},"cborHex)\n",[260,1327,1329,1331,1334,1337,1339,1341,1343,1346,1348],{"class":262,"line":1328},30,[260,1330,815],{"class":325},[260,1332,1333],{"class":595},"txInInlineDatum",[260,1335,1336],{"class":312},"(scriptUTxO",[260,1338,592],{"class":325},[260,1340,1283],{"class":312},[260,1342,592],{"class":325},[260,1344,1345],{"class":312},"inlineDatum",[260,1347,688],{"class":325},[260,1349,793],{"class":312},[260,1351,1353,1355,1358],{"class":262,"line":1352},31,[260,1354,815],{"class":325},[260,1356,1357],{"class":595},"txInRedeemerValue",[260,1359,1237],{"class":312},[260,1361,1363,1366,1368,1370,1373,1375,1377,1380,1382,1384,1387,1389,1391,1394,1396,1398,1401,1403,1405,1408,1410,1412,1415,1417,1419,1421],{"class":262,"line":1362},32,[260,1364,1365],{"class":595},"            emptyRedeemer",[260,1367,664],{"class":312},[260,1369,865],{"class":325},[260,1371,1372],{"class":574}," type",[260,1374,578],{"class":325},[260,1376,481],{"class":325},[260,1378,1379],{"class":284},"int",[260,1381,878],{"class":325},[260,1383,500],{"class":325},[260,1385,1386],{"class":574}," exUnits",[260,1388,578],{"class":325},[260,1390,494],{"class":325},[260,1392,1393],{"class":574}," mem",[260,1395,578],{"class":325},[260,1397,481],{"class":325},[260,1399,1400],{"class":284},"100000",[260,1402,878],{"class":325},[260,1404,500],{"class":325},[260,1406,1407],{"class":574}," steps",[260,1409,578],{"class":325},[260,1411,481],{"class":325},[260,1413,1414],{"class":284},"25000000",[260,1416,878],{"class":325},[260,1418,516],{"class":325},[260,1420,516],{"class":325},[260,1422,793],{"class":312},[260,1424,1426],{"class":262,"line":1425},33,[260,1427,1310],{"class":312},[260,1429,1431,1433,1436],{"class":262,"line":1430},34,[260,1432,815],{"class":325},[260,1434,1435],{"class":595},"txInCollateral",[260,1437,1237],{"class":312},[260,1439,1441,1444,1446,1448,1450,1452],{"class":262,"line":1440},35,[260,1442,1443],{"class":312},"            collateralUTxO",[260,1445,592],{"class":325},[260,1447,1247],{"class":312},[260,1449,592],{"class":325},[260,1451,1252],{"class":312},[260,1453,338],{"class":325},[260,1455,1457,1459,1461,1463,1465,1467],{"class":262,"line":1456},36,[260,1458,1443],{"class":312},[260,1460,592],{"class":325},[260,1462,1247],{"class":312},[260,1464,592],{"class":325},[260,1466,1270],{"class":312},[260,1468,338],{"class":325},[260,1470,1472,1474,1476,1478,1480,1482],{"class":262,"line":1471},37,[260,1473,1443],{"class":312},[260,1475,592],{"class":325},[260,1477,1283],{"class":312},[260,1479,592],{"class":325},[260,1481,1288],{"class":312},[260,1483,338],{"class":325},[260,1485,1487,1489,1491,1493,1495],{"class":262,"line":1486},38,[260,1488,1443],{"class":312},[260,1490,592],{"class":325},[260,1492,1283],{"class":312},[260,1494,592],{"class":325},[260,1496,1305],{"class":312},[260,1498,1500],{"class":262,"line":1499},39,[260,1501,1310],{"class":312},[260,1503,1505,1507,1509,1511],{"class":262,"line":1504},40,[260,1506,815],{"class":325},[260,1508,829],{"class":595},[260,1510,664],{"class":312},[260,1512,374],{"class":325},[260,1514,1516,1518,1520,1523],{"class":262,"line":1515},41,[260,1517,839],{"class":574},[260,1519,578],{"class":325},[260,1521,1522],{"class":312}," walletAddress",[260,1524,338],{"class":325},[260,1526,1528,1530,1532,1535,1537,1539,1541,1544],{"class":262,"line":1527},42,[260,1529,857],{"class":574},[260,1531,578],{"class":325},[260,1533,1534],{"class":312}," scriptUTxO",[260,1536,592],{"class":325},[260,1538,1283],{"class":312},[260,1540,592],{"class":325},[260,1542,1543],{"class":312},"amount ",[260,1545,1546],{"class":266},"\u002F\u002F send all assets back to myself\n",[260,1548,1550,1552],{"class":262,"line":1549},43,[260,1551,906],{"class":325},[260,1553,793],{"class":312},[260,1555,1557,1559,1561],{"class":262,"line":1556},44,[260,1558,815],{"class":325},[260,1560,927],{"class":595},[260,1562,599],{"class":312},[260,1564,1566,1568,1571,1574,1576,1579,1582,1584,1586,1589,1591,1594],{"class":262,"line":1565},45,[260,1567,815],{"class":325},[260,1569,1570],{"class":595},"invalidBefore",[260,1572,1573],{"class":312},"(TimeUtils",[260,1575,592],{"class":325},[260,1577,1578],{"class":595},"unixTimeToEnclosingSlot",[260,1580,1581],{"class":312},"(Date",[260,1583,592],{"class":325},[260,1585,617],{"class":595},[260,1587,1588],{"class":312},"()",[260,1590,500],{"class":325},[260,1592,1593],{"class":312}," SLOT_CONFIG)) ",[260,1595,1596],{"class":266},"\u002F\u002F must be after current slot\n",[260,1598,1600,1602,1605,1607,1609,1611,1613,1615,1617,1619,1621,1623,1625,1627,1629,1631,1633,1635],{"class":262,"line":1599},46,[260,1601,815],{"class":325},[260,1603,1604],{"class":595},"invalidAfter",[260,1606,1573],{"class":312},[260,1608,592],{"class":325},[260,1610,1578],{"class":595},[260,1612,1581],{"class":312},[260,1614,592],{"class":325},[260,1616,617],{"class":595},[260,1618,620],{"class":312},[260,1620,623],{"class":325},[260,1622,633],{"class":626},[260,1624,630],{"class":325},[260,1626,633],{"class":626},[260,1628,630],{"class":325},[260,1630,638],{"class":626},[260,1632,500],{"class":325},[260,1634,1593],{"class":312},[260,1636,1637],{"class":266},"\u002F\u002F must be within 1 hour\n",[260,1639,1641,1643,1645],{"class":262,"line":1640},47,[260,1642,815],{"class":325},[260,1644,937],{"class":595},[260,1646,940],{"class":312},[180,1648,1650],{"id":1649},"interaction-flow-mermaid","Interaction flow (Mermaid)",[210,1652,1656],{"className":1653,"code":1654,"language":1655,"meta":219,"style":219},"language-mermaid shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","flowchart TD\n      A[Participant A] -->|Build & Sign tx| B[Hydra Head]\n    C[Participant B\u002FC] -->|Validate & Sign| B\n    B -->|Plutus Validator| D{Valid?}\n    D -->|✅| E[Update Head State]\n    D -->|❌| F[Reject Tx]\n    E -->|Close\u002FContest| G[Settle L1]\n","mermaid",[217,1657,1658,1663,1668,1673,1678,1683,1688],{"__ignoreMap":219},[260,1659,1660],{"class":262,"line":263},[260,1661,1662],{},"flowchart TD\n",[260,1664,1665],{"class":262,"line":270},[260,1666,1667],{},"      A[Participant A] -->|Build & Sign tx| B[Hydra Head]\n",[260,1669,1670],{"class":262,"line":277},[260,1671,1672],{},"    C[Participant B\u002FC] -->|Validate & Sign| B\n",[260,1674,1675],{"class":262,"line":294},[260,1676,1677],{},"    B -->|Plutus Validator| D{Valid?}\n",[260,1679,1680],{"class":262,"line":306},[260,1681,1682],{},"    D -->|✅| E[Update Head State]\n",[260,1684,1685],{"class":262,"line":316},[260,1686,1687],{},"    D -->|❌| F[Reject Tx]\n",[260,1689,1690],{"class":262,"line":341},[260,1691,1692],{},"    E -->|Close\u002FContest| G[Settle L1]\n",[180,1694,1696],{"id":1695},"notes-best-practices","Notes & Best Practices",[191,1698,1699,1702,1705,1708,1711],{},[194,1700,1701],{},"Collateral: Consuming scripts on L1 still requires collateral; within a Head, the bonding\u002Fcollateral rules depend on how you build the transaction bundle and the Head’s security policy.",[194,1703,1704],{},"Consistency: Always serialize datum\u002Fredeemer in the same format between L1 and Head.",[194,1706,1707],{},"Off-chain code: Off-chain logic (backend or dApp) is responsible for coordinating signatures, communicating with the Hydra node, and attaching the correct datum\u002Fredeemer values.",[194,1709,1710],{},"Testing: Validate your validator on an L1 testnet and test multi-participant Head scenarios to ensure identical behavior.",[194,1712,1713],{},"Minting\u002FBurning: Mint\u002Fburn flows that use Plutus minting policies will still work in a Head if the policy doesn't depend on L1-specific data or time; keep policy semantics compatible.",[180,1715,1717],{"id":1716},"limitations-warnings","Limitations & Warnings",[191,1719,1720,1723,1726],{},[194,1721,1722],{},"Opening\u002Fclosing a Head is still an L1 transaction — settlement costs and L1 fees still apply for those actions.",[194,1724,1725],{},"Some validators that depend on L1-specific data (e.g., temporal constraints or slot-based checks) may need special handling when executed in a Head — verify semantics in context.",[194,1727,1728],{},"Data availability: Ensure participants maintain necessary off-chain data to reconstruct state for dispute or close flows.",[180,1730,1732],{"id":1731},"references","References",[191,1734,1735,1739,1743,1750],{},[194,1736,1737],{},[332,1738,74],{"href":75},[194,1740,1741],{},[332,1742,84],{"href":85},[194,1744,1745],{},[332,1746,1749],{"href":1747,"rel":1748},"https:\u002F\u002Fhydra.family\u002Fhead-protocol\u002F",[436],"Hydra Head Protocol",[194,1751,1752],{},[332,1753,1756],{"href":1754,"rel":1755},"https:\u002F\u002Fhydra.family\u002Fhead-protocol\u002Fdocs\u002Fknown-issues",[436],"Hydra Known Issues",[1758,1759,1760],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":219,"searchDepth":263,"depth":270,"links":1762},[1763,1766],{"id":177,"depth":270,"text":178,"children":1764},[1765],{"id":182,"depth":277,"text":183},{"id":222,"depth":270,"text":223,"children":1767},[1768,1769,1770,1771,1772,1773,1774],{"id":229,"depth":277,"text":230},{"id":250,"depth":277,"text":251},{"id":440,"depth":277,"text":441},{"id":1649,"depth":277,"text":1650},{"id":1695,"depth":277,"text":1696},{"id":1716,"depth":277,"text":1717},{"id":1731,"depth":277,"text":1732},"Learn how to use Plutus smart contracts in Hydra Heads for complex DeFi and DApp logic","md",null,{"author":1779,"date":1780},"Ania","2025-11-26",{"icon":92},{"title":89,"description":1775},"uEElttXBqK9x00zIJjArCu0uhFGOTFQyqT3RCO6-BnA",[1785,1787],{"title":84,"path":85,"stem":86,"description":1786,"icon":87,"children":-1},"Learn how to build and execute transactions within a Hydra Head for instant, low-cost operations",{"title":94,"path":95,"stem":96,"description":1788,"icon":97,"children":-1},"Hydra Head protocol release timeline, and which hydra-node versions each @hydra-sdk\u002Fbridge major supports.",1784812305585]