From ca538decf264e1346af727440610f88e4e063459 Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 18:03:46 -0300 Subject: [PATCH 01/20] Step 1: Lazer Perps project structure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On-chain (Aiken): - lib/lazer_perps/types.ak — Position, Direction, PerpsConfig - lib/lazer_perps/oracle_gate.ak — pyth.get_updates() price reader - validators/open_position.ak — entry price + leverage check - validators/close_position.ak — PnL settlement with owner sig - validators/liquidate.ak — margin ratio check, anyone can trigger Off-chain (TypeScript): - orchestrator.ts — central Pyth Lazer price witness fetcher - open_position.ts, close_position.ts, liquidate.ts — tx builders - keeper.ts — WebSocket price monitor for liquidation opportunities - feeds.ts — RWA market catalog Verified tx: dbf5336fafdab45c8ee287f9409d4e81dfee6375e0c4dd42e89a6b523c557dd5 --- lazer/cardano/lazer-perps/README.md | 145 ++ lazer/cardano/lazer-perps/onchain/.gitignore | 1 + lazer/cardano/lazer-perps/onchain/aiken.lock | 27 + lazer/cardano/lazer-perps/onchain/aiken.toml | 23 + .../onchain/lib/lazer_perps/oracle_gate.ak | 39 + .../onchain/lib/lazer_perps/types.ak | 35 + lazer/cardano/lazer-perps/onchain/plutus.json | 248 +++ .../onchain/validators/close_position.ak | 35 + .../onchain/validators/liquidate.ak | 64 + .../onchain/validators/open_position.ak | 30 + lazer/cardano/lazer-perps/package-lock.json | 1553 +++++++++++++++++ lazer/cardano/lazer-perps/package.json | 21 + .../cardano/lazer-perps/src/close_position.ts | 71 + lazer/cardano/lazer-perps/src/feeds.ts | 51 + lazer/cardano/lazer-perps/src/keeper.ts | 94 + lazer/cardano/lazer-perps/src/liquidate.ts | 71 + .../cardano/lazer-perps/src/open_position.ts | 70 + lazer/cardano/lazer-perps/src/orchestrator.ts | 130 ++ lazer/cardano/lazer-perps/tsconfig.json | 12 + 19 files changed, 2720 insertions(+) create mode 100644 lazer/cardano/lazer-perps/README.md create mode 100644 lazer/cardano/lazer-perps/onchain/.gitignore create mode 100644 lazer/cardano/lazer-perps/onchain/aiken.lock create mode 100644 lazer/cardano/lazer-perps/onchain/aiken.toml create mode 100644 lazer/cardano/lazer-perps/onchain/lib/lazer_perps/oracle_gate.ak create mode 100644 lazer/cardano/lazer-perps/onchain/lib/lazer_perps/types.ak create mode 100644 lazer/cardano/lazer-perps/onchain/plutus.json create mode 100644 lazer/cardano/lazer-perps/onchain/validators/close_position.ak create mode 100644 lazer/cardano/lazer-perps/onchain/validators/liquidate.ak create mode 100644 lazer/cardano/lazer-perps/onchain/validators/open_position.ak create mode 100644 lazer/cardano/lazer-perps/package-lock.json create mode 100644 lazer/cardano/lazer-perps/package.json create mode 100644 lazer/cardano/lazer-perps/src/close_position.ts create mode 100644 lazer/cardano/lazer-perps/src/feeds.ts create mode 100644 lazer/cardano/lazer-perps/src/keeper.ts create mode 100644 lazer/cardano/lazer-perps/src/liquidate.ts create mode 100644 lazer/cardano/lazer-perps/src/open_position.ts create mode 100644 lazer/cardano/lazer-perps/src/orchestrator.ts create mode 100644 lazer/cardano/lazer-perps/tsconfig.json diff --git a/lazer/cardano/lazer-perps/README.md b/lazer/cardano/lazer-perps/README.md new file mode 100644 index 00000000..9f334408 --- /dev/null +++ b/lazer/cardano/lazer-perps/README.md @@ -0,0 +1,145 @@ +# Team Lazer Perps (ex Lazer RWA) — Pythathon Submission + +## Details + +- **Team Name:** Lazer Perps +- **Submission Name:** lazer-perps +- **Team Members:** María Elisa Araya ([@ar3lisa](https://x.com/ar3lisa)), Bárbara Olivera ([@b4rbbb](https://x.com/b4rbbb)) +- **Contact:** https://x.com/ar3lisa / https://x.com/b4rbbb + +## Project Description + +Lazer Perps is a perpetual futures protocol on Cardano where traders open leveraged long/short positions on real-world assets (Gold, Silver, Oil) using collateral. Every action (open, close, liquidate) requires a fresh Pyth Lazer price witness embedded in the transaction. No price witness → no trade. + +All positions are independent eUTxOs on-chain. + +### How Pyth is used + +Pyth Lazer is the **mandatory oracle** for every operation in the protocol: + +**On-chain (Aiken — `perps.ak`):** +- Uses `pyth.get_updates(pyth_id, self)` to read verified price data from the transaction +- `OpenPosition`: validates entry price matches oracle, checks leverage limits +- `ClosePosition`: reads current price to compute PnL, verifies owner signature +- `Liquidate`: computes margin ratio from oracle price — if undercollateralized, anyone can liquidate + +**Off-chain (TypeScript):** +- Fetches signed price updates from Pyth Lazer via WebSocket/HTTP +- Resolves the on-chain Pyth State UTxO via `@pythnetwork/pyth-lazer-cardano-js` +- Embeds the price witness in every transaction using the zero-withdrawal pattern + +**Key principle:** The Pyth withdraw script verifies the Ed25519 signature and makes the price available. The perps validator reads it in the same transaction. Without the price witness, the validator fails. + +### Supported markets + +| Symbol | Asset | Feed ID | Status | +|--------|-------|---------|--------| +| XAU/USD | Gold | 346 | stable | +| XAG/USD | Silver | 345 | stable | +| XAUT/USD | Tether Gold | 172 | stable (24/7) | +| XTI/USD | Oil (WTI) | 2950 | coming soon | + +## Architecture + +``` +Pyth Lazer Server Cardano PreProd + │ │ + │ WebSocket/HTTP │ + │ "latest price for XAU/USD" │ + ▼ │ + [Ed25519-signed price bytes] │ + │ │ + │ src/open_position.ts │ + │ │ │ + │ ┌─────────┴───────────┐ │ + │ │ 1. fetch price │ │ + │ │ 2. resolve state ───┼──query──▶ │ Pyth State UTxO + │ │ 3. build tx │ │ + │ │ (withdraw + │ │ + │ │ open position) │ │ + │ │ 4. sign + submit ───┼──tx────▶ │ + │ └─────────────────────┘ │ + │ ▼ + │ ┌──────────────────────────┐ + │ │ Pyth Withdraw Script │ + │ │ (verifies Ed25519 │ + │ │ signature on price) │ + │ └────────────┬─────────────┘ + │ │ price available + │ ┌────────────▼─────────────┐ + │ │ perps.ak validator │ + │ │ │ + │ │ OpenPosition: │ + │ │ • entry price = oracle │ + │ │ • leverage ≤ max │ + │ │ │ + │ │ ClosePosition: │ + │ │ • compute PnL │ + │ │ • verify owner sig │ + │ │ │ + │ │ Liquidate: │ + │ │ • margin ratio < 80% │ + │ │ • anyone can trigger │ + │ └──────────────────────────┘ +``` + +## How to run + +### Prerequisites + +- Node.js v24+ +- [Aiken](https://aiken-lang.org) v1.1+ +- Pyth Lazer access token +- Cardano PreProd wallet with tADA + +### Install dependencies + +```bash +cd lazer/cardano/lazer-perps +npm install +``` + +### 1. Stream prices + +```bash +ACCESS_TOKEN= npm run fetch-prices +ACCESS_TOKEN= FEEDS=XAU/USD,XAUT/USD npm run fetch-prices +``` + +### 2. Compile validators + +```bash +cd onchain +aiken build +``` + +### 3. Open a position with price witness + +```bash +ACCESS_TOKEN= CARDANO_MNEMONIC="<24 words>" npm run open-position +ACCESS_TOKEN= CARDANO_MNEMONIC="..." FEED=XAUT/USD DIRECTION=long LEVERAGE=5 npm run open-position +``` + +### Verified transactions on PreProd + +| Type | Feed | Tx Hash | +|------|------|---------| +| *(transactions will be added after testing)* | | | + +## Project structure + +``` +lazer-perps/ +├── README.md +├── package.json +├── tsconfig.json +├── src/ +│ ├── feeds.ts — Perps market feed catalog +│ ├── fetch_prices.ts — Stream RWA prices from Pyth Lazer +│ └── open_position.ts — Open a leveraged position with price witness +└── onchain/ + ├── aiken.toml + ├── plutus.json — Compiled Plutus V3 blueprint + └── validators/ + └── perps.ak — Perpetual futures validator (open/close/liquidate) +``` diff --git a/lazer/cardano/lazer-perps/onchain/.gitignore b/lazer/cardano/lazer-perps/onchain/.gitignore new file mode 100644 index 00000000..567609b1 --- /dev/null +++ b/lazer/cardano/lazer-perps/onchain/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/lazer/cardano/lazer-perps/onchain/aiken.lock b/lazer/cardano/lazer-perps/onchain/aiken.lock new file mode 100644 index 00000000..30195bbd --- /dev/null +++ b/lazer/cardano/lazer-perps/onchain/aiken.lock @@ -0,0 +1,27 @@ +# This file was generated by Aiken +# You typically do not need to edit this file + +[[requirements]] +name = "aiken-lang/stdlib" +version = "v3.0.0" +source = "github" + +[[requirements]] +name = "pyth-network/pyth-lazer-cardano" +version = "main" +source = "github" + +[[packages]] +name = "aiken-lang/stdlib" +version = "v3.0.0" +requirements = [] +source = "github" + +[[packages]] +name = "pyth-network/pyth-lazer-cardano" +version = "main" +requirements = [] +source = "github" + +[etags] +"pyth-network/pyth-lazer-cardano@main" = [{ secs_since_epoch = 1774212630, nanos_since_epoch = 812424000 }, "a46dacd97a22eb07feeaf966d48c3116c8249ddc836705656e3135cea285bcfc"] diff --git a/lazer/cardano/lazer-perps/onchain/aiken.toml b/lazer/cardano/lazer-perps/onchain/aiken.toml new file mode 100644 index 00000000..d63747f1 --- /dev/null +++ b/lazer/cardano/lazer-perps/onchain/aiken.toml @@ -0,0 +1,23 @@ +name = "team/lazer-perps" +version = "0.0.0" +compiler = "v1.1.21" +plutus = "v3" +license = "Apache-2.0" +description = "Perpetual futures protocol powered by Pyth Lazer price feeds on Cardano" + +[repository] +user = "team" +project = "lazer-perps" +platform = "github" + +[[dependencies]] +name = "aiken-lang/stdlib" +version = "v3.0.0" +source = "github" + +[[dependencies]] +name = "pyth-network/pyth-lazer-cardano" +version = "main" +source = "github" + +[config] diff --git a/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/oracle_gate.ak b/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/oracle_gate.ak new file mode 100644 index 00000000..1668d19e --- /dev/null +++ b/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/oracle_gate.ak @@ -0,0 +1,39 @@ +use aiken/collection/list +use aiken/math/rational +use cardano/assets.{PolicyId} +use cardano/transaction.{Transaction} +use pyth +use types/u32 + +/// Read the raw price and exponent for a feed from the Pyth update. +/// This is the oracle gate — every perps action must go through here. +/// Without a valid Pyth price witness in the tx, this function fails. +pub fn read_price( + pyth_id: PolicyId, + feed_id: Int, + self: Transaction, +) -> (Int, Int) { + // Verify and extract price data from the Pyth withdrawal redeemer + let updates = pyth.get_updates(pyth_id, self) + // Expect exactly one signed update in this transaction + expect [update] = updates + + expect Some(feed) = + list.find(update.feeds, fn(f) { u32.as_int(f.feed_id) == feed_id }) + + expect Some(Some(price)) = feed.price + expect Some(exponent) = feed.exponent + + (price, exponent) +} + +/// Read price and apply exponent to get a Rational value. +pub fn read_real_price( + pyth_id: PolicyId, + feed_id: Int, + self: Transaction, +) -> rational.Rational { + let (price, exponent) = read_price(pyth_id, feed_id, self) + expect Some(multiplier) = rational.from_int(10) |> rational.pow(exponent) + rational.from_int(price) |> rational.mul(multiplier) +} diff --git a/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/types.ak b/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/types.ak new file mode 100644 index 00000000..a25cd88f --- /dev/null +++ b/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/types.ak @@ -0,0 +1,35 @@ +use cardano/assets.{PolicyId} + +/// Direction of a perpetual position +pub type Direction { + Long + Short +} + +/// Protocol configuration — applied as parameter at deployment +pub type PerpsConfig { + /// Pyth deployment policy ID on Cardano + pyth_id: PolicyId, + /// Maximum leverage allowed (e.g. 10 = 10x) + max_leverage: Int, + /// Liquidation threshold in basis points (e.g. 8000 = 80%) + liquidation_bps: Int, +} + +/// A perpetual position stored as datum on a eUTxO +pub type Position { + /// Owner's public key hash + owner: ByteArray, + /// Pyth feed ID for the traded asset + feed_id: Int, + /// Long or Short + direction: Direction, + /// Collateral amount in lovelace + collateral: Int, + /// Position size (collateral * leverage) + size: Int, + /// Entry price (raw, before exponent) + entry_price: Int, + /// Entry price exponent + entry_exponent: Int, +} diff --git a/lazer/cardano/lazer-perps/onchain/plutus.json b/lazer/cardano/lazer-perps/onchain/plutus.json new file mode 100644 index 00000000..14497a94 --- /dev/null +++ b/lazer/cardano/lazer-perps/onchain/plutus.json @@ -0,0 +1,248 @@ +{ + "preamble": { + "title": "team/lazer-perps", + "description": "Perpetual futures protocol powered by Pyth Lazer price feeds on Cardano", + "version": "0.0.0", + "plutusVersion": "v3", + "compiler": { + "name": "Aiken", + "version": "v1.1.21+42babe5" + }, + "license": "Apache-2.0" + }, + "validators": [ + { + "title": "close_position.close_position.spend", + "datum": { + "title": "datum", + "schema": { + "$ref": "#/definitions/lazer_perps~1types~1Position" + } + }, + "redeemer": { + "title": "_redeemer", + "schema": { + "$ref": "#/definitions/Data" + } + }, + "parameters": [ + { + "title": "config", + "schema": { + "$ref": "#/definitions/lazer_perps~1types~1PerpsConfig" + } + } + ], + "compiledCode": "591619010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd500144c9660026466446600400400244b30010018a508acc004cdc79bae30140010038a51899801001180a800a01e40486eb0c048c04cc04cc04cc04cc04cc04cc04cc04cc03cdd50039bae3011300e375400313371090001bad30119800918091809800cdc3a400937129002488c96600266e3d22100375c6028602a003130140018b201e30020019119198008008019119801800980100148c048c04cc04c0066eb8c044c038dd500acdd2a400091111111191919912cc004c07800a264b3001300f301a375400313232598009808980e1baa0018992cc004c048c074dd5000c4c9660026026603c6ea80062660426044603e6ea8008cc084c088c07cdd5000a5eb822c80e8c084c088c088c088c088c088c078dd5001c5901c1810180e9baa0018b2036300e301c3754002603c60366ea80062c80c8c8cc004004dd61804180d9baa301e0032259800800c530103d87a80008992cc004cdc39bad3020301d3754002009130083301f0014bd7044cc00c00cc08400901b180f800a03a8b203632598009806980c1baa0018992cc004c038c064dd5000c4c8cc0240048966002005132330010010042259800800c52f5c113302198009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301723235980099b8f375c605a0029110475d3c793008cc004888c8cc00cdd698188009bae3031303200130030019b89480426e3120109b804803e600e90082444446600a464660666ea0cde5250375c6068002660666068606a00297ae05980098029b8d0018998191ba930020013303237526600860066e340040052f5c11640b8466446601046606a6ea0cdc7000a40006606a6ea4cc00cc008dc6800800a5eb808cc0248cc0d8dd419b8e00148000cc0d8dd49980218019b8d0010014bd701119191981c98111981c9ba800833039375000a66072607400297ae033039303a303b0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605800312323303c374e002660786ea40092f5c065300100180252f5c080088896600200510018cc00400e60800053303e303f002001400c81ea246530010059981e181e8008024c02400e6eb8c0f4c0f80050054c004c8cc0f0dd419bca4a06eb8c0f4004cc0f0c0f4c0f80052f5c0b30013017371a00313303b37526024002660766ea4cc054c050dc6800800a5eb822c81ba446607a0046607a6ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11000a60586608660880106608698103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a80004bd70200222259800801440063300100398238014c8c966002607200313230313304830490013304830313304830493046375400697ae0304a304a00130453754007159800981f000c4c8c8c0c8cc124c128008cc124c128004cc124c0c8cc124c128c11cdd500225eb80c12cc12c004c128004c114dd5001c566002606c003132323230333304a304b0033304a304b0023304a304b0013304a30333304a304b3048375400a97ae0304c304c001304b001304a001304537540071598009805000c4c8c8c8c8c0d0cc12cc130010cc12cc13000ccc12cc130008cc12cc130004cc12cc0d0cc12cc130c124dd500325eb80c134c134004c130004c12c004c128004c114dd5001c56600260120031323232323230353304c304d0053304c304d0043304c304d0033304c304d0023304c304d0013304c30353304c304d304a375400e97ae0304e304e001304d001304c001304b001304a0013045375400715980099b87480280062646464646464606c6609a609c00c6609a609c00a6609a609c0086609a609c0066609a609c0046609a609c0026609a606c6609a609c60966ea80212f5c0609e609e002609c002609a002609800260960026094002608a6ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc138c13c01ccc138c13c018cc138c13c014cc138c13c010cc138c13c00ccc138c13c008cc138c13c004cc138c0dccc138c13cc130dd5004a5eb80c140c140004c13c004c138004c134004c130004c12c004c128004c114dd5001c56600266e1d200e00189919191919191919181c19827982800419827982800399827982800319827982800299827982800219827982800199827982800119827982800099827981c19827982818269baa00a4bd7018289828800982800098278009827000982680098260009825800982500098229baa0038acc004cdc3a402000313232323232323232323039330503051009330503051008330503051007330503051006330503051005330503051004330503051003330503051002330503051001330503039330503051304e375401697ae03052305200130510013050001304f001304e001304d001304c001304b001304a0013045375400715980099b87480480062646464646464646464646074660a260a4014660a260a4012660a260a4010660a260a400e660a260a400c660a260a400a660a260a4008660a260a4006660a260a4004660a260a4002660a26074660a260a4609e6ea80312f5c060a660a600260a400260a200260a0002609e002609c002609a002609800260960026094002608a6ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc148c14c02ccc148c14c028cc148c14c024cc148c14c020cc148c14c01ccc148c14c018cc148c14c014cc148c14c010cc148c14c00ccc148c14c008cc148c14c004cc148c0eccc148c14cc140dd5006a5eb80c150c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c128004c114dd5001c56600266e1d20160018991919191919191919191919181e19829982a00619829982a00599829982a00519829982a00499829982a00419829982a00399829982a00319829982a00299829982a00219829982a00199829982a00119829982a00099829981e19829982a18289baa00e4bd70182a982a800982a000982980098290009828800982800098278009827000982680098260009825800982500098229baa0038991919191919191919191919181e19829982a00619829982a00599829982a00519829982a00499829982a00419829982a00399829982a00319829982a00299829982a00219829982a00199829982a00119829982a00099829982a182a80099829981e19829982a18289baa00e4bd7025eb80c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c128004c114dd5001a086410c82190432086410c82190432086410c821904318219baa0013046002400c8220dd718219822000991acc004c08400a2653001001a5eb82006800888966002606e003123233047374e0026608e6ea40092f5c065300100180252f5c080088896600200510018cc00400e609600533049304a002001400c8242246530010059982398240008024c05000e6eb8c120c1240050051802800a0828b207c375c60866088006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241051598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41048208dc4000c888c8cc118c00cdd698238009982318239824000a5eb80c00c006660846ea0cdc7000a4000660846ea4cc040c03cdc6800800a5eb8122232329800919802919198251ba833794940dd718258009982518259826000a5eb816600260386e340062660926ea4c064004cc124dd49980d980d1b8d0010014bd704590451191801acc004c0f0006298103d87a800089819998251ba80014bd70208c30030019bad3048003911191acc0066002607a6eb4c13000694294504744cc02000c8c014c0d4cc130dd4000a5eb822601e600898103d87a8000411c6eb8c130c134004cc128dd419b8e00148000cc128dd49980c180b9b8d0010014bd7024446b3001303c002898019181a19825800a5eb822b3001304100289801919ba548008cc12c0052f5c1159800981c80144c00c8cdd2a40086609600297ae08acc004c03400a26600e464660986ea0cde5250375c609a00266098609a609c00297ae059800981c9b8d0018998259ba930230013304b37526605260506e340040052f5c116411c466e9520063304b375000297ae08acc004c03000a26600e464660986ea0cde5250375c609a00266098609a609c00297ae059800981c9b8d0018998259ba930230013304b37526605260506e340040052f5c116411c466e9520083304b3750b3001337100029040400244006266e04004c0192020411c97ae08acc004cdc3a40140051300323374a900519825800a5eb822b30013370e900600144cc0048cdd2a40186609600297ae02323304c3750600c6eb4c134004cc130c134c1380052f5c064660986ea0cde5250375c609a00266098609a609c00297ae059800980f1b8d0018998259ba9301b0013304b37526603a60386e340040052f5c116411d15980099b874803800a266002466e95200e3304b0014bd70119198261ba833794940dd718268009982618269827000a5eb8166002603c6e340062660966ea4c06c004cc12cdd49980e980e1b8d0010014bd70459047456600266e1d2010002899800919ba548040cc12c0052f5c0464660986ea0cde5250375c609a00266098609a609c00297ae059800980f1b8d0018998259ba9301b0013304b37526603a60386e340040052f5c116411d15980099b874804800a2464646609a66e9520123304d304e0014bd701982698271827800a5eb80c004008cc0208c8cc134dd419bca4a06eb8c138004cc134c138c13c0052f5c0b3001303a371a00313304c37526048002660986ea4cc0a8c0a4dc6800800a5eb822c8240966002607c00314c103d87980008acc004c10c006298103d87a80008acc004c0ec006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20904120824104820908acc004cdc3a40280051300323374a900a19825800a5eb822b30013370e900b00144c00c8cdd2a402c6609600297ae08acc004cdc3a403000513300123374a900c19825800a5eb808c8cc130dd419bca4a06eb8c134004cc130c134c1380052f5c0b3001301e371a00313304b37526036002660966ea4cc074c070dc6800800a5eb822c823a2c8231046208c41188231046208c41188231046208c41188230dd718259826003096600266e2000520808080808080808080028800c4cdc0800980124100028218c00c00c6eb4c104004c8cc100dd419b8e00148000cc100dd49980718069b8d0010014bd701bae30403041004206c8b2066371890011b80480051640a06eb8c0b4c0b800566002600e6e340062660566ea4c008004cc0acdd49980298021b8d0010014bd704590271bae3015302837546602e4646b30013371e6eb8c0b400522104b9011a82008919191919191919911981a980f1981a981b0039981a9ba90013303530360024bd701981a981b181b80125eb80d660026024003125980099b89002371a00313303437526601e004002660686ea66002005337026e3400400a002b8c25eb822c81822c8178dd7181a181a8011bae3034004375a606600264660646ea0cde5250375c6066002660646066606800297ae059800980f9b8d0018998189ba930090013303137526601e601c6e340040052f5c11640b46eb8c0c4c0c8004d6600294624b30013371290201b8d0018998181ba93300b48100004cc0c0dd4cc005204099b80371a002901fc0057184bd7045902c45902b1bae30303031001300100259800a51892cc004cdc4a4100026e3400626605c6ea4cc0252080010013302e37533001482000666e00dc6800a40ff0015c612f5c11640a91640a51640a06eb8c0b4c0b800566002600e6e340062660566ea4c008004cc0acdd49980298021b8d0010014bd704590271bae302b00a300348010c00d2008198010011811800a040899180118110019bae302000240786eb0c074c068dd5000c5901819199119801001000912cc004006298103d87a80008992cc004cdd7802180e000c4c020cc07cc0740052f5c11330030033021002406c603e00280e8dd5980e980f180f180f180f180f180f180f180f180f180d1baa0123374a90021980d99ba548008cc06cc070c074c074c074c064dd5180e180c9baa0014bd7025eb822c80b8c8cc004004dd61805980c9baa0112259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a5140651001899801801980f8012032325980099912cc00400a2942265300132598009809980f1baa00189bad301f302237566044603e6ea800629000203a30210019baf302130220019bab003488966002003159800980100344cc01400d20008a50407d1325980099baf30210014c010140008acc004cc018010dd6981118129bab3022001898019ba630260028a5040811598009980300224001130030078a5040808100c0900050220ca600200337566020603c6ea8c040c078dd5002488cc088008cc088dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0800066eacc084006604a0069112cc004cdc8a441000038acc004cdc7a441000038998029807998131ba60024bd70000c4cc015300103d87a8000006408919800803c006446600e0046605066ec0dd48029ba6004001401c81106046004810a2942294229410221ba63301d337606ea401cdd31980e99bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602860346ea8c078c06cdd5180f180d9baa300d301b3754003132598009806980d9baa0018992cc004c044c070dd5000c4c8c8c8c8cc8966002604e00713259800980c18119baa0018991919194c004dd69815800cdd718158024dd69815801cdd7181580124444b3001303000589980d1bab302f00e225980080144cc07003089660020051301b330320144bd7044c8c8cc06cc0c40084c00cc0d8010dd7181880098198012062899191980c981800109801981a0021bae302e001303100240bd1640b4302b001302a001302900130243754003164088604c00d1640906eb8c090004dd59812001181200098118009811000980e9baa0018b2036301f301c3754003164068601060366ea8c034c06cdd5000c590194530103d87a80004064603a00280d8dd69805180c1baa00b22598009806980c1baa00289919192cc004c08000a26600c603e00626600c002009164074603c002603c00260326ea800a2c80b889660026018602e6ea800a2646464b3001301f002899192cc004c0440062b3001301d37540050068b203c8acc004c05800626464b300130230028044590201bad3021001301d37540051598009807000c566002603a6ea800a00d16407916406c80d901b180d9baa001301e0038b20383259800980d800c56600260166034003168980a180d000a0328b20383754603a002603a00260306ea800a2c80b114a08060c040c034dd500145900b0c024dd5001c590070c020004c00cdd5004c52689b2b200201", + "hash": "c94365b1ef0ee2167a37c6751e17bb70aa297a7a5e9baed56f2fcc3a" + }, + { + "title": "close_position.close_position.else", + "redeemer": { + "schema": {} + }, + "parameters": [ + { + "title": "config", + "schema": { + "$ref": "#/definitions/lazer_perps~1types~1PerpsConfig" + } + } + ], + "compiledCode": "591619010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd500144c9660026466446600400400244b30010018a508acc004cdc79bae30140010038a51899801001180a800a01e40486eb0c048c04cc04cc04cc04cc04cc04cc04cc04cc03cdd50039bae3011300e375400313371090001bad30119800918091809800cdc3a400937129002488c96600266e3d22100375c6028602a003130140018b201e30020019119198008008019119801800980100148c048c04cc04c0066eb8c044c038dd500acdd2a400091111111191919912cc004c07800a264b3001300f301a375400313232598009808980e1baa0018992cc004c048c074dd5000c4c9660026026603c6ea80062660426044603e6ea8008cc084c088c07cdd5000a5eb822c80e8c084c088c088c088c088c088c078dd5001c5901c1810180e9baa0018b2036300e301c3754002603c60366ea80062c80c8c8cc004004dd61804180d9baa301e0032259800800c530103d87a80008992cc004cdc39bad3020301d3754002009130083301f0014bd7044cc00c00cc08400901b180f800a03a8b203632598009806980c1baa0018992cc004c038c064dd5000c4c8cc0240048966002005132330010010042259800800c52f5c113302198009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301723235980099b8f375c605a0029110475d3c793008cc004888c8cc00cdd698188009bae3031303200130030019b89480426e3120109b804803e600e90082444446600a464660666ea0cde5250375c6068002660666068606a00297ae05980098029b8d0018998191ba930020013303237526600860066e340040052f5c11640b8466446601046606a6ea0cdc7000a40006606a6ea4cc00cc008dc6800800a5eb808cc0248cc0d8dd419b8e00148000cc0d8dd49980218019b8d0010014bd701119191981c98111981c9ba800833039375000a66072607400297ae033039303a303b0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605800312323303c374e002660786ea40092f5c065300100180252f5c080088896600200510018cc00400e60800053303e303f002001400c81ea246530010059981e181e8008024c02400e6eb8c0f4c0f80050054c004c8cc0f0dd419bca4a06eb8c0f4004cc0f0c0f4c0f80052f5c0b30013017371a00313303b37526024002660766ea4cc054c050dc6800800a5eb822c81ba446607a0046607a6ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11000a60586608660880106608698103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a80004bd70200222259800801440063300100398238014c8c966002607200313230313304830490013304830313304830493046375400697ae0304a304a00130453754007159800981f000c4c8c8c0c8cc124c128008cc124c128004cc124c0c8cc124c128c11cdd500225eb80c12cc12c004c128004c114dd5001c566002606c003132323230333304a304b0033304a304b0023304a304b0013304a30333304a304b3048375400a97ae0304c304c001304b001304a001304537540071598009805000c4c8c8c8c8c0d0cc12cc130010cc12cc13000ccc12cc130008cc12cc130004cc12cc0d0cc12cc130c124dd500325eb80c134c134004c130004c12c004c128004c114dd5001c56600260120031323232323230353304c304d0053304c304d0043304c304d0033304c304d0023304c304d0013304c30353304c304d304a375400e97ae0304e304e001304d001304c001304b001304a0013045375400715980099b87480280062646464646464606c6609a609c00c6609a609c00a6609a609c0086609a609c0066609a609c0046609a609c0026609a606c6609a609c60966ea80212f5c0609e609e002609c002609a002609800260960026094002608a6ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc138c13c01ccc138c13c018cc138c13c014cc138c13c010cc138c13c00ccc138c13c008cc138c13c004cc138c0dccc138c13cc130dd5004a5eb80c140c140004c13c004c138004c134004c130004c12c004c128004c114dd5001c56600266e1d200e00189919191919191919181c19827982800419827982800399827982800319827982800299827982800219827982800199827982800119827982800099827981c19827982818269baa00a4bd7018289828800982800098278009827000982680098260009825800982500098229baa0038acc004cdc3a402000313232323232323232323039330503051009330503051008330503051007330503051006330503051005330503051004330503051003330503051002330503051001330503039330503051304e375401697ae03052305200130510013050001304f001304e001304d001304c001304b001304a0013045375400715980099b87480480062646464646464646464646074660a260a4014660a260a4012660a260a4010660a260a400e660a260a400c660a260a400a660a260a4008660a260a4006660a260a4004660a260a4002660a26074660a260a4609e6ea80312f5c060a660a600260a400260a200260a0002609e002609c002609a002609800260960026094002608a6ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc148c14c02ccc148c14c028cc148c14c024cc148c14c020cc148c14c01ccc148c14c018cc148c14c014cc148c14c010cc148c14c00ccc148c14c008cc148c14c004cc148c0eccc148c14cc140dd5006a5eb80c150c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c128004c114dd5001c56600266e1d20160018991919191919191919191919181e19829982a00619829982a00599829982a00519829982a00499829982a00419829982a00399829982a00319829982a00299829982a00219829982a00199829982a00119829982a00099829981e19829982a18289baa00e4bd70182a982a800982a000982980098290009828800982800098278009827000982680098260009825800982500098229baa0038991919191919191919191919181e19829982a00619829982a00599829982a00519829982a00499829982a00419829982a00399829982a00319829982a00299829982a00219829982a00199829982a00119829982a00099829982a182a80099829981e19829982a18289baa00e4bd7025eb80c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c128004c114dd5001a086410c82190432086410c82190432086410c821904318219baa0013046002400c8220dd718219822000991acc004c08400a2653001001a5eb82006800888966002606e003123233047374e0026608e6ea40092f5c065300100180252f5c080088896600200510018cc00400e609600533049304a002001400c8242246530010059982398240008024c05000e6eb8c120c1240050051802800a0828b207c375c60866088006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241051598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41048208dc4000c888c8cc118c00cdd698238009982318239824000a5eb80c00c006660846ea0cdc7000a4000660846ea4cc040c03cdc6800800a5eb8122232329800919802919198251ba833794940dd718258009982518259826000a5eb816600260386e340062660926ea4c064004cc124dd49980d980d1b8d0010014bd704590451191801acc004c0f0006298103d87a800089819998251ba80014bd70208c30030019bad3048003911191acc0066002607a6eb4c13000694294504744cc02000c8c014c0d4cc130dd4000a5eb822601e600898103d87a8000411c6eb8c130c134004cc128dd419b8e00148000cc128dd49980c180b9b8d0010014bd7024446b3001303c002898019181a19825800a5eb822b3001304100289801919ba548008cc12c0052f5c1159800981c80144c00c8cdd2a40086609600297ae08acc004c03400a26600e464660986ea0cde5250375c609a00266098609a609c00297ae059800981c9b8d0018998259ba930230013304b37526605260506e340040052f5c116411c466e9520063304b375000297ae08acc004c03000a26600e464660986ea0cde5250375c609a00266098609a609c00297ae059800981c9b8d0018998259ba930230013304b37526605260506e340040052f5c116411c466e9520083304b3750b3001337100029040400244006266e04004c0192020411c97ae08acc004cdc3a40140051300323374a900519825800a5eb822b30013370e900600144cc0048cdd2a40186609600297ae02323304c3750600c6eb4c134004cc130c134c1380052f5c064660986ea0cde5250375c609a00266098609a609c00297ae059800980f1b8d0018998259ba9301b0013304b37526603a60386e340040052f5c116411d15980099b874803800a266002466e95200e3304b0014bd70119198261ba833794940dd718268009982618269827000a5eb8166002603c6e340062660966ea4c06c004cc12cdd49980e980e1b8d0010014bd70459047456600266e1d2010002899800919ba548040cc12c0052f5c0464660986ea0cde5250375c609a00266098609a609c00297ae059800980f1b8d0018998259ba9301b0013304b37526603a60386e340040052f5c116411d15980099b874804800a2464646609a66e9520123304d304e0014bd701982698271827800a5eb80c004008cc0208c8cc134dd419bca4a06eb8c138004cc134c138c13c0052f5c0b3001303a371a00313304c37526048002660986ea4cc0a8c0a4dc6800800a5eb822c8240966002607c00314c103d87980008acc004c10c006298103d87a80008acc004c0ec006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20904120824104820908acc004cdc3a40280051300323374a900a19825800a5eb822b30013370e900b00144c00c8cdd2a402c6609600297ae08acc004cdc3a403000513300123374a900c19825800a5eb808c8cc130dd419bca4a06eb8c134004cc130c134c1380052f5c0b3001301e371a00313304b37526036002660966ea4cc074c070dc6800800a5eb822c823a2c8231046208c41188231046208c41188231046208c41188230dd718259826003096600266e2000520808080808080808080028800c4cdc0800980124100028218c00c00c6eb4c104004c8cc100dd419b8e00148000cc100dd49980718069b8d0010014bd701bae30403041004206c8b2066371890011b80480051640a06eb8c0b4c0b800566002600e6e340062660566ea4c008004cc0acdd49980298021b8d0010014bd704590271bae3015302837546602e4646b30013371e6eb8c0b400522104b9011a82008919191919191919911981a980f1981a981b0039981a9ba90013303530360024bd701981a981b181b80125eb80d660026024003125980099b89002371a00313303437526601e004002660686ea66002005337026e3400400a002b8c25eb822c81822c8178dd7181a181a8011bae3034004375a606600264660646ea0cde5250375c6066002660646066606800297ae059800980f9b8d0018998189ba930090013303137526601e601c6e340040052f5c11640b46eb8c0c4c0c8004d6600294624b30013371290201b8d0018998181ba93300b48100004cc0c0dd4cc005204099b80371a002901fc0057184bd7045902c45902b1bae30303031001300100259800a51892cc004cdc4a4100026e3400626605c6ea4cc0252080010013302e37533001482000666e00dc6800a40ff0015c612f5c11640a91640a51640a06eb8c0b4c0b800566002600e6e340062660566ea4c008004cc0acdd49980298021b8d0010014bd704590271bae302b00a300348010c00d2008198010011811800a040899180118110019bae302000240786eb0c074c068dd5000c5901819199119801001000912cc004006298103d87a80008992cc004cdd7802180e000c4c020cc07cc0740052f5c11330030033021002406c603e00280e8dd5980e980f180f180f180f180f180f180f180f180f180d1baa0123374a90021980d99ba548008cc06cc070c074c074c074c064dd5180e180c9baa0014bd7025eb822c80b8c8cc004004dd61805980c9baa0112259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a5140651001899801801980f8012032325980099912cc00400a2942265300132598009809980f1baa00189bad301f302237566044603e6ea800629000203a30210019baf302130220019bab003488966002003159800980100344cc01400d20008a50407d1325980099baf30210014c010140008acc004cc018010dd6981118129bab3022001898019ba630260028a5040811598009980300224001130030078a5040808100c0900050220ca600200337566020603c6ea8c040c078dd5002488cc088008cc088dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0800066eacc084006604a0069112cc004cdc8a441000038acc004cdc7a441000038998029807998131ba60024bd70000c4cc015300103d87a8000006408919800803c006446600e0046605066ec0dd48029ba6004001401c81106046004810a2942294229410221ba63301d337606ea401cdd31980e99bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602860346ea8c078c06cdd5180f180d9baa300d301b3754003132598009806980d9baa0018992cc004c044c070dd5000c4c8c8c8c8cc8966002604e00713259800980c18119baa0018991919194c004dd69815800cdd718158024dd69815801cdd7181580124444b3001303000589980d1bab302f00e225980080144cc07003089660020051301b330320144bd7044c8c8cc06cc0c40084c00cc0d8010dd7181880098198012062899191980c981800109801981a0021bae302e001303100240bd1640b4302b001302a001302900130243754003164088604c00d1640906eb8c090004dd59812001181200098118009811000980e9baa0018b2036301f301c3754003164068601060366ea8c034c06cdd5000c590194530103d87a80004064603a00280d8dd69805180c1baa00b22598009806980c1baa00289919192cc004c08000a26600c603e00626600c002009164074603c002603c00260326ea800a2c80b889660026018602e6ea800a2646464b3001301f002899192cc004c0440062b3001301d37540050068b203c8acc004c05800626464b300130230028044590201bad3021001301d37540051598009807000c566002603a6ea800a00d16407916406c80d901b180d9baa001301e0038b20383259800980d800c56600260166034003168980a180d000a0328b20383754603a002603a00260306ea800a2c80b114a08060c040c034dd500145900b0c024dd5001c590070c020004c00cdd5004c52689b2b200201", + "hash": "c94365b1ef0ee2167a37c6751e17bb70aa297a7a5e9baed56f2fcc3a" + }, + { + "title": "liquidate.liquidate.spend", + "datum": { + "title": "datum", + "schema": { + "$ref": "#/definitions/lazer_perps~1types~1Position" + } + }, + "redeemer": { + "title": "_redeemer", + "schema": { + "$ref": "#/definitions/Data" + } + }, + "parameters": [ + { + "title": "config", + "schema": { + "$ref": "#/definitions/lazer_perps~1types~1PerpsConfig" + } + } + ], + "compiledCode": "5917a8010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a4602260246024003230113012301230123012301200191808980918091809000cdd2a4000911111919912cc004c024c050dd500144cdd7999119912cc004cdc4001000c5300103d87980008acc004cdc40008014530103d87b80008a6103d87a8000405c80b8cdc11bad301a002375a6034603600266e08dd6980d0009bad301a301b002301537546644600c660326ea0cdc11bad301a002375a6034002660326ea0cdc11bad301a301b002375a6034603600297ae030153754664466446010660366ea0cdc019b82375a603800800266e08dd6980e0018011980d9ba83370400400297ae0375a603460360046eb4c068c06c004c054dd518009bad300530153754010602a6eaa6002600e602a6ea80226eb4c060c064c064c064c064c054dd50044dd69803180a9baa0089bad301898009180c980d000cdc3a400937129002488c96600266e3d220100375c603660380031301b0018b202c3002001911919800800801911980180098010014dd7180c180a9baa01c4888888c8c8cc8966002604600513259800980a180f9baa001899192cc004c058c084dd5000c4c966002602e60446ea8006264b30013018302337540031330263027302437540046604c604e60486ea80052f5c1164088602860466ea800e2c8108c094c088dd5000c59020180618109baa00130233020375400316407864660020026eb0c048c080dd51811801912cc0040062980103d87a80008992cc004cdc39bad30253022375400200913011330240014bd7044cc00c00cc0980090201812000a0448b204032598009809180e9baa0018992cc004c04cc078dd5000c4c8cc01c0048966002005132330010010042259800800c52f5c113302698009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301523235980099b8f375c60640029110475d3c793008cc004888c8cc00cdd6981b0009bae3036303700130030019b89480426e3120109b804803e600e90082444446600a464660706ea0cde5250375c6072002660706072607400297ae05980098029b8d00189981b9ba930020013303737526600860066e340040052f5c11640cc46644660104660746ea0cdc7000a4000660746ea4cc00cc008dc6800800a5eb808cc0248cc0ecdd419b8e00148000cc0ecdd49980218019b8d0010014bd701119191981f18159981f1ba80083303e375000a6607c607e00297ae03303e303f30400014bd7018008012cc004c05800a2653001001a5eb820068008889660026062003123233041374e002660826ea40092f5c065300100180252f5c080088896600200510018cc00400e608a005330433044002001400c8212246530010059982098210008024c02400e6eb8c108c10c0050054c004c8cc104dd419bca4a06eb8c108004cc104c108c10c0052f5c0b30013017371a00313304037526024002660806ea4cc054c050dc6800800a5eb822c81e24466084004660846ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c12400a606a6609060920106609098103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a80004bd70200222259800801440063300100398260014c8c966002607c003132303a3304d304e0013304d303a3304d304e304b375400697ae0304f304f001304a37540071598009821800c4c8c8c0eccc138c13c008cc138c13c004cc138c0eccc138c13cc130dd500225eb80c140c140004c13c004c128dd5001c56600260680031323232303c3304f30500033304f30500023304f30500013304f303c3304f3050304d375400a97ae0305130510013050001304f001304a37540071598009805000c4c8c8c8c8c0f4cc140c144010cc140c14400ccc140c144008cc140c144004cc140c0f4cc140c144c138dd500325eb80c148c148004c144004c140004c13c004c128dd5001c566002601200313232323232303e33051305200533051305200433051305200333051305200233051305200133051303e330513052304f375400e97ae030533053001305200130510013050001304f001304a375400715980099b87480280062646464646464607e660a460a600c660a460a600a660a460a6008660a460a6006660a460a6004660a460a6002660a4607e660a460a660a06ea80212f5c060a860a800260a600260a400260a200260a0002609e00260946ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c100cc14cc15001ccc14cc150018cc14cc150014cc14cc150010cc14cc15000ccc14cc150008cc14cc150004cc14cc100cc14cc150c144dd5004a5eb80c154c154004c150004c14c004c148004c144004c140004c13c004c128dd5001c56600266e1d200e0018991919191919191918209982a182a8041982a182a8039982a182a8031982a182a8029982a182a8021982a182a8019982a182a8011982a182a8009982a18209982a182a98291baa00a4bd70182b182b000982a800982a0009829800982900098288009828000982780098251baa0038acc004cdc3a4020003132323232323232323230423305530560093305530560083305530560073305530560063305530560053305530560043305530560033305530560023305530560013305530423305530563053375401697ae0305730570013056001305500130540013053001305200130510013050001304f001304a375400715980099b87480480062646464646464646464646086660ac60ae014660ac60ae012660ac60ae010660ac60ae00e660ac60ae00c660ac60ae00a660ac60ae008660ac60ae006660ac60ae004660ac60ae002660ac6086660ac60ae60a86ea80312f5c060b060b000260ae00260ac00260aa00260a800260a600260a400260a200260a0002609e00260946ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c110cc15cc16002ccc15cc160028cc15cc160024cc15cc160020cc15cc16001ccc15cc160018cc15cc160014cc15cc160010cc15cc16000ccc15cc160008cc15cc160004cc15cc110cc15cc160c154dd5006a5eb80c164c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c128dd5001c56600266e1d2016001899191919191919191919191918229982c182c8061982c182c8059982c182c8051982c182c8049982c182c8041982c182c8039982c182c8031982c182c8029982c182c8021982c182c8019982c182c8011982c182c8009982c18229982c182c982b1baa00e4bd70182d182d000982c800982c000982b800982b000982a800982a0009829800982900098288009828000982780098251baa003899191919191919191919191918229982c182c8061982c182c8059982c182c8051982c182c8049982c182c8041982c182c8039982c182c8031982c182c8029982c182c8021982c182c8019982c182c8011982c182c8009982c182c982d0009982c18229982c182c982b1baa00e4bd7025eb80c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c128dd5001a0904120824104820904120824104820904120824104818241baa001304b002400c8248dd718241824800991acc004c08400a2653001001a5eb82006800888966002607800312323304c374e002660986ea40092f5c065300100180252f5c080088896600200510018cc00400e60a00053304e304f002001400c826a246530010059982618268008024c05000e6eb8c134c1380050051802800a08c8b2086375c60906092006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241191598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41188230dc4000c888c8cc12cc00cdd698260009982598261826800a5eb80c00c0066608e6ea0cdc7000a40006608e6ea4cc040c03cdc6800800a5eb8122232329800919802919198279ba833794940dd718280009982798281828800a5eb816600260386e3400626609c6ea4c064004cc138dd49980d980d1b8d0010014bd7045904a1191801acc004c104006298103d87a80008981e198279ba80014bd70209630030019bad304d003911191acc006600260846eb4c14400694294504c44cc02000c8c014c0f8cc144dd4000a5eb822601e600898103d87a800041306eb8c144c148004cc13cdd419b8e00148000cc13cdd49980c180b9b8d0010014bd7024446b30013041002898019181e99828000a5eb822b3001304600289801919ba548008cc1400052f5c1159800981b80144c00c8cdd2a4008660a000297ae08acc004c03400a26600e464660a26ea0cde5250375c60a4002660a260a460a600297ae059800981b9b8d0018998281ba930230013305037526605260506e340040052f5c1164130466e95200633050375000297ae08acc004c03000a26600e464660a26ea0cde5250375c60a4002660a260a460a600297ae059800981b9b8d0018998281ba930230013305037526605260506e340040052f5c1164130466e952008330503750b3001337100029040400244006266e04004c0192020413097ae08acc004cdc3a40140051300323374a900519828000a5eb822b30013370e900600144cc0048cdd2a4018660a000297ae0232330513750600c6eb4c148004cc144c148c14c0052f5c064660a26ea0cde5250375c60a4002660a260a460a600297ae059800980f1b8d0018998281ba9301b0013305037526603a60386e340040052f5c116413115980099b874803800a266002466e95200e330500014bd70119198289ba833794940dd718290009982898291829800a5eb8166002603c6e340062660a06ea4c06c004cc140dd49980e980e1b8d0010014bd7045904c456600266e1d2010002899800919ba548040cc1400052f5c0464660a26ea0cde5250375c60a4002660a260a460a600297ae059800980f1b8d0018998281ba9301b0013305037526603a60386e340040052f5c116413115980099b874804800a246464660a466e9520123305230530014bd70198291829982a000a5eb80c004008cc0208c8cc148dd419bca4a06eb8c14c004cc148c14cc1500052f5c0b30013038371a00313305137526048002660a26ea4cc0a8c0a4dc6800800a5eb822c8268966002608600314c103d87980008acc004c120006298103d87a80008acc004c0e4006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b209a4134826904d209a8acc004cdc3a40280051300323374a900a19828000a5eb822b30013370e900b00144c00c8cdd2a402c660a000297ae08acc004cdc3a403000513300123374a900c19828000a5eb808c8cc144dd419bca4a06eb8c148004cc144c148c14c0052f5c0b3001301e371a00313305037526036002660a06ea4cc074c070dc6800800a5eb822c82622c825904b2096412c825904b2096412c825904b2096412c8258dd718281828803096600266e2000520808080808080808080028800c4cdc0800980124100028240c00c00c6eb4c118004c8cc114dd419b8e00148000cc114dd49980718069b8d0010014bd701bae3045304600420768b2070371890011b80480051640b46eb8c0c8c0cc00566002600e6e340062660606ea4c008004cc0c0dd49980298021b8d0010014bd7045902c1bae301f302d37546602a4646b30013371e6eb8c0c800522104b9011a82008919191919191919911981d18139981d181d8039981d1ba90013303a303b0024bd701981d181d981e00125eb80d660026024003125980099b89002371a00313303937526601e004002660726ea66002005337026e3400400a002b8c25eb822c81aa2c81a0dd7181c981d0011bae3039004375a6070002646606e6ea0cde5250375c60700026606e6070607200297ae059800980e9b8d00189981b1ba930090013303637526601e601c6e340040052f5c11640c86eb8c0d8c0dc004d6600294624b30013371290201b8d00189981a9ba93300b48100004cc0d4dd4cc005204099b80371a002901fc0057184bd704590314590301bae30353036001300100259800a51892cc004cdc4a4100026e340062660666ea4cc0252080010013303337533001482000666e00dc6800a40ff0015c612f5c11640bd1640b91640b46eb8c0c8c0cc00566002600e6e340062660606ea4c008004cc0c0dd49980298021b8d0010014bd7045902c1bae303000a300348010c00d2008198010011814000a04a899180118138019bae3025002408c6eb0c088c07cdd5000c5901d19199119801001000912cc004006298103d87a80008992cc004cdd78021810800c4c044cc090c0880052f5c11330030033026002408060480028110dd59811181198119811981198119811981198119811980f9baa0173374a90021981019ba548008cc080c038c078dd51810980f1baa0014bd7025eb822c80e0c8cc004004dd61804980f1baa0162259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a51407910018998018019812001203c325980099912cc00400a294226530013259800980c18119baa00189bad302430273756604e60486ea800629000204430260019baf302630270019bab003488966002003159800980100344cc01400d20008a5040911325980099baf30260014c010140008acc004cc018010dd6981398151bab3027001898019ba6302b0028a5040951598009980300224001130030078a5040948128c0a40050270ca60020033756601c60466ea8c038c08cdd5002488cc09c008cc09cdd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0940066eacc09800660540069112cc004cdc8a441000038acc004cdc7a44100003899802980c198159ba60024bd70000c4cc015300103d87a8000006409d19800803c006446600e0046605a66ec0dd48029ba6004001401c8138605000481322942294229410271ba633022337606ea4018dd31981119bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c5660026032603e6ea8c08cc080dd5181198101baa300b3020375400313259800980598101baa0018992cc004c058c084dd5000c4c8c8c8c8cc8966002605800713259800980e98141baa0018991919194c004dd69818000cdd718180024dd69818001cdd7181800124444b3001303500589980c1bab303400e225980080144cc068030896600200513024330370144bd7044c8c8cc06cc0d80084c00cc0ec010dd7181b000981c001206c899191980c981a80109801981c8021bae3033001303600240d11640c83030001302f001302e0013029375400316409c605600d1640a46eb8c0a4004dd5981480118148009814000981380098111baa0018b204030243021375400316407c602460406ea8c02cc080dd5000c5901e4530103d87a8000407860440028100dd69804180e9baa01022598009809180e9baa00289919192cc004c09400a26600c604800626600c00200916408860460026046002603c6ea800a2c80e08966002602260386ea800a2646464b30013024002899192cc004c0580062b3001302237540050068b20468acc004c06c00626464b300130280028044590251bad3026001302237540051598009806000c56600260446ea800a00d16408d164080810102018101baa00130230038b204232598009810000c5660026012603e003168980c980f800a03c8b2042375460440026044002603a6ea800a2c80d89111192cc004c038c064dd5000c4c074c068dd5000c590181980399b82003598009806980c1baa004899b81001002899b81002001405c00430153754600290504e00980a9baa30183015375400498103d87980008b202633001337046eb4c00cc04cdd50031bad3005301337540349001118019980b1ba8001330164c10101004bd70112cc004c020006298103d87a80008acc004cdc4000a40011300333016300333016375066e05200000233016375066e0520000014bd7025eb82260066602c60066602c6ea0008cc058dd4000a5eb812f5c0809101222c805860126ea800e2c8038601000260066ea802629344d9590011", + "hash": "be505faec27f9bfa35861eda2bb96329fc70a6f2c51eb14de6c094d4" + }, + { + "title": "liquidate.liquidate.else", + "redeemer": { + "schema": {} + }, + "parameters": [ + { + "title": "config", + "schema": { + "$ref": "#/definitions/lazer_perps~1types~1PerpsConfig" + } + } + ], + "compiledCode": "5917a8010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a4602260246024003230113012301230123012301200191808980918091809000cdd2a4000911111919912cc004c024c050dd500144cdd7999119912cc004cdc4001000c5300103d87980008acc004cdc40008014530103d87b80008a6103d87a8000405c80b8cdc11bad301a002375a6034603600266e08dd6980d0009bad301a301b002301537546644600c660326ea0cdc11bad301a002375a6034002660326ea0cdc11bad301a301b002375a6034603600297ae030153754664466446010660366ea0cdc019b82375a603800800266e08dd6980e0018011980d9ba83370400400297ae0375a603460360046eb4c068c06c004c054dd518009bad300530153754010602a6eaa6002600e602a6ea80226eb4c060c064c064c064c064c054dd50044dd69803180a9baa0089bad301898009180c980d000cdc3a400937129002488c96600266e3d220100375c603660380031301b0018b202c3002001911919800800801911980180098010014dd7180c180a9baa01c4888888c8c8cc8966002604600513259800980a180f9baa001899192cc004c058c084dd5000c4c966002602e60446ea8006264b30013018302337540031330263027302437540046604c604e60486ea80052f5c1164088602860466ea800e2c8108c094c088dd5000c59020180618109baa00130233020375400316407864660020026eb0c048c080dd51811801912cc0040062980103d87a80008992cc004cdc39bad30253022375400200913011330240014bd7044cc00c00cc0980090201812000a0448b204032598009809180e9baa0018992cc004c04cc078dd5000c4c8cc01c0048966002005132330010010042259800800c52f5c113302698009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301523235980099b8f375c60640029110475d3c793008cc004888c8cc00cdd6981b0009bae3036303700130030019b89480426e3120109b804803e600e90082444446600a464660706ea0cde5250375c6072002660706072607400297ae05980098029b8d00189981b9ba930020013303737526600860066e340040052f5c11640cc46644660104660746ea0cdc7000a4000660746ea4cc00cc008dc6800800a5eb808cc0248cc0ecdd419b8e00148000cc0ecdd49980218019b8d0010014bd701119191981f18159981f1ba80083303e375000a6607c607e00297ae03303e303f30400014bd7018008012cc004c05800a2653001001a5eb820068008889660026062003123233041374e002660826ea40092f5c065300100180252f5c080088896600200510018cc00400e608a005330433044002001400c8212246530010059982098210008024c02400e6eb8c108c10c0050054c004c8cc104dd419bca4a06eb8c108004cc104c108c10c0052f5c0b30013017371a00313304037526024002660806ea4cc054c050dc6800800a5eb822c81e24466084004660846ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c12400a606a6609060920106609098103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a80004bd70200222259800801440063300100398260014c8c966002607c003132303a3304d304e0013304d303a3304d304e304b375400697ae0304f304f001304a37540071598009821800c4c8c8c0eccc138c13c008cc138c13c004cc138c0eccc138c13cc130dd500225eb80c140c140004c13c004c128dd5001c56600260680031323232303c3304f30500033304f30500023304f30500013304f303c3304f3050304d375400a97ae0305130510013050001304f001304a37540071598009805000c4c8c8c8c8c0f4cc140c144010cc140c14400ccc140c144008cc140c144004cc140c0f4cc140c144c138dd500325eb80c148c148004c144004c140004c13c004c128dd5001c566002601200313232323232303e33051305200533051305200433051305200333051305200233051305200133051303e330513052304f375400e97ae030533053001305200130510013050001304f001304a375400715980099b87480280062646464646464607e660a460a600c660a460a600a660a460a6008660a460a6006660a460a6004660a460a6002660a4607e660a460a660a06ea80212f5c060a860a800260a600260a400260a200260a0002609e00260946ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c100cc14cc15001ccc14cc150018cc14cc150014cc14cc150010cc14cc15000ccc14cc150008cc14cc150004cc14cc100cc14cc150c144dd5004a5eb80c154c154004c150004c14c004c148004c144004c140004c13c004c128dd5001c56600266e1d200e0018991919191919191918209982a182a8041982a182a8039982a182a8031982a182a8029982a182a8021982a182a8019982a182a8011982a182a8009982a18209982a182a98291baa00a4bd70182b182b000982a800982a0009829800982900098288009828000982780098251baa0038acc004cdc3a4020003132323232323232323230423305530560093305530560083305530560073305530560063305530560053305530560043305530560033305530560023305530560013305530423305530563053375401697ae0305730570013056001305500130540013053001305200130510013050001304f001304a375400715980099b87480480062646464646464646464646086660ac60ae014660ac60ae012660ac60ae010660ac60ae00e660ac60ae00c660ac60ae00a660ac60ae008660ac60ae006660ac60ae004660ac60ae002660ac6086660ac60ae60a86ea80312f5c060b060b000260ae00260ac00260aa00260a800260a600260a400260a200260a0002609e00260946ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c110cc15cc16002ccc15cc160028cc15cc160024cc15cc160020cc15cc16001ccc15cc160018cc15cc160014cc15cc160010cc15cc16000ccc15cc160008cc15cc160004cc15cc110cc15cc160c154dd5006a5eb80c164c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c128dd5001c56600266e1d2016001899191919191919191919191918229982c182c8061982c182c8059982c182c8051982c182c8049982c182c8041982c182c8039982c182c8031982c182c8029982c182c8021982c182c8019982c182c8011982c182c8009982c18229982c182c982b1baa00e4bd70182d182d000982c800982c000982b800982b000982a800982a0009829800982900098288009828000982780098251baa003899191919191919191919191918229982c182c8061982c182c8059982c182c8051982c182c8049982c182c8041982c182c8039982c182c8031982c182c8029982c182c8021982c182c8019982c182c8011982c182c8009982c182c982d0009982c18229982c182c982b1baa00e4bd7025eb80c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c128dd5001a0904120824104820904120824104820904120824104818241baa001304b002400c8248dd718241824800991acc004c08400a2653001001a5eb82006800888966002607800312323304c374e002660986ea40092f5c065300100180252f5c080088896600200510018cc00400e60a00053304e304f002001400c826a246530010059982618268008024c05000e6eb8c134c1380050051802800a08c8b2086375c60906092006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241191598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41188230dc4000c888c8cc12cc00cdd698260009982598261826800a5eb80c00c0066608e6ea0cdc7000a40006608e6ea4cc040c03cdc6800800a5eb8122232329800919802919198279ba833794940dd718280009982798281828800a5eb816600260386e3400626609c6ea4c064004cc138dd49980d980d1b8d0010014bd7045904a1191801acc004c104006298103d87a80008981e198279ba80014bd70209630030019bad304d003911191acc006600260846eb4c14400694294504c44cc02000c8c014c0f8cc144dd4000a5eb822601e600898103d87a800041306eb8c144c148004cc13cdd419b8e00148000cc13cdd49980c180b9b8d0010014bd7024446b30013041002898019181e99828000a5eb822b3001304600289801919ba548008cc1400052f5c1159800981b80144c00c8cdd2a4008660a000297ae08acc004c03400a26600e464660a26ea0cde5250375c60a4002660a260a460a600297ae059800981b9b8d0018998281ba930230013305037526605260506e340040052f5c1164130466e95200633050375000297ae08acc004c03000a26600e464660a26ea0cde5250375c60a4002660a260a460a600297ae059800981b9b8d0018998281ba930230013305037526605260506e340040052f5c1164130466e952008330503750b3001337100029040400244006266e04004c0192020413097ae08acc004cdc3a40140051300323374a900519828000a5eb822b30013370e900600144cc0048cdd2a4018660a000297ae0232330513750600c6eb4c148004cc144c148c14c0052f5c064660a26ea0cde5250375c60a4002660a260a460a600297ae059800980f1b8d0018998281ba9301b0013305037526603a60386e340040052f5c116413115980099b874803800a266002466e95200e330500014bd70119198289ba833794940dd718290009982898291829800a5eb8166002603c6e340062660a06ea4c06c004cc140dd49980e980e1b8d0010014bd7045904c456600266e1d2010002899800919ba548040cc1400052f5c0464660a26ea0cde5250375c60a4002660a260a460a600297ae059800980f1b8d0018998281ba9301b0013305037526603a60386e340040052f5c116413115980099b874804800a246464660a466e9520123305230530014bd70198291829982a000a5eb80c004008cc0208c8cc148dd419bca4a06eb8c14c004cc148c14cc1500052f5c0b30013038371a00313305137526048002660a26ea4cc0a8c0a4dc6800800a5eb822c8268966002608600314c103d87980008acc004c120006298103d87a80008acc004c0e4006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b209a4134826904d209a8acc004cdc3a40280051300323374a900a19828000a5eb822b30013370e900b00144c00c8cdd2a402c660a000297ae08acc004cdc3a403000513300123374a900c19828000a5eb808c8cc144dd419bca4a06eb8c148004cc144c148c14c0052f5c0b3001301e371a00313305037526036002660a06ea4cc074c070dc6800800a5eb822c82622c825904b2096412c825904b2096412c825904b2096412c8258dd718281828803096600266e2000520808080808080808080028800c4cdc0800980124100028240c00c00c6eb4c118004c8cc114dd419b8e00148000cc114dd49980718069b8d0010014bd701bae3045304600420768b2070371890011b80480051640b46eb8c0c8c0cc00566002600e6e340062660606ea4c008004cc0c0dd49980298021b8d0010014bd7045902c1bae301f302d37546602a4646b30013371e6eb8c0c800522104b9011a82008919191919191919911981d18139981d181d8039981d1ba90013303a303b0024bd701981d181d981e00125eb80d660026024003125980099b89002371a00313303937526601e004002660726ea66002005337026e3400400a002b8c25eb822c81aa2c81a0dd7181c981d0011bae3039004375a6070002646606e6ea0cde5250375c60700026606e6070607200297ae059800980e9b8d00189981b1ba930090013303637526601e601c6e340040052f5c11640c86eb8c0d8c0dc004d6600294624b30013371290201b8d00189981a9ba93300b48100004cc0d4dd4cc005204099b80371a002901fc0057184bd704590314590301bae30353036001300100259800a51892cc004cdc4a4100026e340062660666ea4cc0252080010013303337533001482000666e00dc6800a40ff0015c612f5c11640bd1640b91640b46eb8c0c8c0cc00566002600e6e340062660606ea4c008004cc0c0dd49980298021b8d0010014bd7045902c1bae303000a300348010c00d2008198010011814000a04a899180118138019bae3025002408c6eb0c088c07cdd5000c5901d19199119801001000912cc004006298103d87a80008992cc004cdd78021810800c4c044cc090c0880052f5c11330030033026002408060480028110dd59811181198119811981198119811981198119811980f9baa0173374a90021981019ba548008cc080c038c078dd51810980f1baa0014bd7025eb822c80e0c8cc004004dd61804980f1baa0162259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a51407910018998018019812001203c325980099912cc00400a294226530013259800980c18119baa00189bad302430273756604e60486ea800629000204430260019baf302630270019bab003488966002003159800980100344cc01400d20008a5040911325980099baf30260014c010140008acc004cc018010dd6981398151bab3027001898019ba6302b0028a5040951598009980300224001130030078a5040948128c0a40050270ca60020033756601c60466ea8c038c08cdd5002488cc09c008cc09cdd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0940066eacc09800660540069112cc004cdc8a441000038acc004cdc7a44100003899802980c198159ba60024bd70000c4cc015300103d87a8000006409d19800803c006446600e0046605a66ec0dd48029ba6004001401c8138605000481322942294229410271ba633022337606ea4018dd31981119bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c5660026032603e6ea8c08cc080dd5181198101baa300b3020375400313259800980598101baa0018992cc004c058c084dd5000c4c8c8c8c8cc8966002605800713259800980e98141baa0018991919194c004dd69818000cdd718180024dd69818001cdd7181800124444b3001303500589980c1bab303400e225980080144cc068030896600200513024330370144bd7044c8c8cc06cc0d80084c00cc0ec010dd7181b000981c001206c899191980c981a80109801981c8021bae3033001303600240d11640c83030001302f001302e0013029375400316409c605600d1640a46eb8c0a4004dd5981480118148009814000981380098111baa0018b204030243021375400316407c602460406ea8c02cc080dd5000c5901e4530103d87a8000407860440028100dd69804180e9baa01022598009809180e9baa00289919192cc004c09400a26600c604800626600c00200916408860460026046002603c6ea800a2c80e08966002602260386ea800a2646464b30013024002899192cc004c0580062b3001302237540050068b20468acc004c06c00626464b300130280028044590251bad3026001302237540051598009806000c56600260446ea800a00d16408d164080810102018101baa00130230038b204232598009810000c5660026012603e003168980c980f800a03c8b2042375460440026044002603a6ea800a2c80d89111192cc004c038c064dd5000c4c074c068dd5000c590181980399b82003598009806980c1baa004899b81001002899b81002001405c00430153754600290504e00980a9baa30183015375400498103d87980008b202633001337046eb4c00cc04cdd50031bad3005301337540349001118019980b1ba8001330164c10101004bd70112cc004c020006298103d87a80008acc004cdc4000a40011300333016300333016375066e05200000233016375066e0520000014bd7025eb82260066602c60066602c6ea0008cc058dd4000a5eb812f5c0809101222c805860126ea800e2c8038601000260066ea802629344d9590011", + "hash": "be505faec27f9bfa35861eda2bb96329fc70a6f2c51eb14de6c094d4" + }, + { + "title": "open_position.open_position.spend", + "datum": { + "title": "datum", + "schema": { + "$ref": "#/definitions/lazer_perps~1types~1Position" + } + }, + "redeemer": { + "title": "_redeemer", + "schema": { + "$ref": "#/definitions/Data" + } + }, + "parameters": [ + { + "title": "config", + "schema": { + "$ref": "#/definitions/lazer_perps~1types~1PerpsConfig" + } + } + ], + "compiledCode": "591607010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a460226024003230113012301230123012301200191808980918091809000a4444b30013370e6eb4c05260026e1d20049b89480124464b30013371e910100375c602e6030003130170018b202430020019119198008008019119801800980100148c054c058c0580066eb8c050c044dd500c4dd6980198089baa0049ba54800122222222323232598009810000c4c966002602260386ea800626464b30013013301e375400313259800980a180f9baa0018992cc004c054c080dd5000c4cc08cc090c084dd500119811981218109baa0014bd7045901f180898101baa0038b203c3022301f37540031640746020603c6ea8004c080c074dd5000c5901b19198008009bac3008301d3754604000444b30010018a6103d87a80008992cc004cdc39bad3022301f375400201113007330210014bd7044cc00c00cc08c00901d1810800a03e8b203a32598009808180d9baa0018992cc004c044c070dd5000c4c8cc0280048966002005132330010010042259800800c52f5c113302498009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301823235980099b8f375c60600029110475d3c793008cc004888c8cc00cdd6981a0009bae3034303500130030019b89480426e3120109b804803e600e90082444446600a4646606c6ea0cde5250375c606e0026606c606e607000297ae05980098029b8d00189981a9ba930020013303537526600860066e340040052f5c11640c446644660104660706ea0cdc7000a4000660706ea4cc00cc008dc6800800a5eb808cc0248cc0e4dd419b8e00148000cc0e4dd49980218019b8d0010014bd701119191981e18111981e1ba80083303c375000a66078607a00297ae03303c303d303e0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605e00312323303f374e0026607e6ea40092f5c065300100180252f5c080088896600200510018cc00400e6086005330413042002001400c8202246530010059981f98200008024c02400e6eb8c100c1040050054c004c8cc0fcdd419bca4a06eb8c100004cc0fcc100c1040052f5c0b30013017371a00313303e375260240026607c6ea4cc054c050dc6800800a5eb822c81d24466080004660806ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11c00a60586608c608e0106608c98103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a80004bd70200222259800801440063300100398250014c8c966002607800313230313304b304c0013304b30313304b304c3049375400697ae0304d304d001304837540071598009820800c4c8c8c0c8cc130c134008cc130c134004cc130c0c8cc130c134c128dd500225eb80c138c138004c134004c120dd5001c566002606e003132323230333304d304e0033304d304e0023304d304e0013304d30333304d304e304b375400a97ae0304f304f001304e001304d001304837540071598009805000c4c8c8c8c8c0d0cc138c13c010cc138c13c00ccc138c13c008cc138c13c004cc138c0d0cc138c13cc130dd500325eb80c140c140004c13c004c138004c134004c120dd5001c56600260120031323232323230353304f30500053304f30500043304f30500033304f30500023304f30500013304f30353304f3050304d375400e97ae0305130510013050001304f001304e001304d0013048375400715980099b87480280062646464646464606c660a060a200c660a060a200a660a060a2008660a060a2006660a060a2004660a060a2002660a0606c660a060a2609c6ea80212f5c060a460a400260a200260a0002609e002609c002609a00260906ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc144c14801ccc144c148018cc144c148014cc144c148010cc144c14800ccc144c148008cc144c148004cc144c0dccc144c148c13cdd5004a5eb80c14cc14c004c148004c144004c140004c13c004c138004c134004c120dd5001c56600266e1d200e00189919191919191919181c19829182980419829182980399829182980319829182980299829182980219829182980199829182980119829182980099829181c19829182998281baa00a4bd70182a182a000982980098290009828800982800098278009827000982680098241baa0038acc004cdc3a4020003132323232323232323230393305330540093305330540083305330540073305330540063305330540053305330540043305330540033305330540023305330540013305330393305330543051375401697ae03055305500130540013053001305200130510013050001304f001304e001304d0013048375400715980099b87480480062646464646464646464646074660a860aa014660a860aa012660a860aa010660a860aa00e660a860aa00c660a860aa00a660a860aa008660a860aa006660a860aa004660a860aa002660a86074660a860aa60a46ea80312f5c060ac60ac00260aa00260a800260a600260a400260a200260a0002609e002609c002609a00260906ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc154c15802ccc154c158028cc154c158024cc154c158020cc154c15801ccc154c158018cc154c158014cc154c158010cc154c15800ccc154c158008cc154c158004cc154c0eccc154c158c14cdd5006a5eb80c15cc15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c120dd5001c56600266e1d20160018991919191919191919191919181e1982b182b8061982b182b8059982b182b8051982b182b8049982b182b8041982b182b8039982b182b8031982b182b8029982b182b8021982b182b8019982b182b8011982b182b8009982b181e1982b182b982a1baa00e4bd70182c182c000982b800982b000982a800982a000982980098290009828800982800098278009827000982680098241baa0038991919191919191919191919181e1982b182b8061982b182b8059982b182b8051982b182b8049982b182b8041982b182b8039982b182b8031982b182b8029982b182b8021982b182b8019982b182b8011982b182b8009982b182b982c0009982b181e1982b182b982a1baa00e4bd7025eb80c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c120dd5001a08c41188231046208c41188231046208c4118823104618231baa0013049002400c8238dd718231823800991acc004c08400a2653001001a5eb82006800888966002607400312323304a374e002660946ea40092f5c065300100180252f5c080088896600200510018cc00400e609c0053304c304d002001400c825a246530010059982518258008024c05000e6eb8c12cc1300050051802800a0888b2082375c608c608e006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241111598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41108220dc4000c888c8cc124c00cdd698250009982498251825800a5eb80c00c0066608a6ea0cdc7000a40006608a6ea4cc040c03cdc6800800a5eb8122232329800919802919198269ba833794940dd718270009982698271827800a5eb816600260386e340062660986ea4c064004cc130dd49980d980d1b8d0010014bd704590481191801acc004c0fc006298103d87a800089819998269ba80014bd70209230030019bad304b003911191acc006600260806eb4c13c00694294504a44cc02000c8c014c0d4cc13cdd4000a5eb822601e600898103d87a800041286eb8c13cc140004cc134dd419b8e00148000cc134dd49980c180b9b8d0010014bd7024446b3001303f002898019181a19827000a5eb822b3001304400289801919ba548008cc1380052f5c1159800981d00144c00c8cdd2a40086609c00297ae08acc004c03400a26600e4646609e6ea0cde5250375c60a00026609e60a060a200297ae059800981d1b8d0018998271ba930230013304e37526605260506e340040052f5c1164128466e9520063304e375000297ae08acc004c03000a26600e4646609e6ea0cde5250375c60a00026609e60a060a200297ae059800981d1b8d0018998271ba930230013304e37526605260506e340040052f5c1164128466e9520083304e3750b3001337100029040400244006266e04004c0192020412897ae08acc004cdc3a40140051300323374a900519827000a5eb822b30013370e900600144cc0048cdd2a40186609c00297ae02323304f3750600c6eb4c140004cc13cc140c1440052f5c0646609e6ea0cde5250375c60a00026609e60a060a200297ae059800980f1b8d0018998271ba9301b0013304e37526603a60386e340040052f5c116412915980099b874803800a266002466e95200e3304e0014bd70119198279ba833794940dd718280009982798281828800a5eb8166002603c6e3400626609c6ea4c06c004cc138dd49980e980e1b8d0010014bd7045904a456600266e1d2010002899800919ba548040cc1380052f5c04646609e6ea0cde5250375c60a00026609e60a060a200297ae059800980f1b8d0018998271ba9301b0013304e37526603a60386e340040052f5c116412915980099b874804800a246464660a066e9520123305030510014bd701982818289829000a5eb80c004008cc0208c8cc140dd419bca4a06eb8c144004cc140c144c1480052f5c0b3001303b371a00313304f375260480026609e6ea4cc0a8c0a4dc6800800a5eb822c8258966002608200314c103d87980008acc004c118006298103d87a80008acc004c0f0006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b2096412c825904b20968acc004cdc3a40280051300323374a900a19827000a5eb822b30013370e900b00144c00c8cdd2a402c6609c00297ae08acc004cdc3a403000513300123374a900c19827000a5eb808c8cc13cdd419bca4a06eb8c140004cc13cc140c1440052f5c0b3001301e371a00313304e375260360026609c6ea4cc074c070dc6800800a5eb822c82522c8249049209241248249049209241248249049209241248248dd718271827803096600266e2000520808080808080808080028800c4cdc0800980124100028230c00c00c6eb4c110004c8cc10cdd419b8e00148000cc10cdd49980718069b8d0010014bd701bae3043304400420728b206c371890011b80480051640ac6eb8c0c0c0c400566002600e6e3400626605c6ea4c008004cc0b8dd49980298021b8d0010014bd7045902a1bae3016302b3754660304646b30013371e6eb8c0c000522104b9011a82008919191919191919911981c180f1981c181c8039981c1ba90013303830390024bd701981c181c981d00125eb80d660026024003125980099b89002371a00313303737526601e0040026606e6ea66002005337026e3400400a002b8c25eb822c819a2c8190dd7181b981c0011bae3037004375a606c002646606a6ea0cde5250375c606c0026606a606c606e00297ae05980098101b8d00189981a1ba930090013303437526601e601c6e340040052f5c11640c06eb8c0d0c0d4004d6600294624b30013371290201b8d0018998199ba93300b48100004cc0ccdd4cc005204099b80371a002901fc0057184bd7045902f45902e1bae30333034001300100259800a51892cc004cdc4a4100026e340062660626ea4cc0252080010013303137533001482000666e00dc6800a40ff0015c612f5c11640b51640b11640ac6eb8c0c0c0c400566002600e6e3400626605c6ea4c008004cc0b8dd49980298021b8d0010014bd7045902a1bae302e00a300348010c00d2008198010011813000a046899180118128019bae302300240846eb0c080c074dd5000c5901b19199119801001000912cc004006298103d87a80008992cc004cdd7802180f800c4c020cc088c0800052f5c11330030033024002407860440028100dd59810181098109810981098109810981098109810980e9baa0153374a90021980f19ba548008cc078c030c070dd5180f980e1baa0014bd7025eb822c80d0c8cc004004dd61807180e1baa0142259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a514071100189980180198110012038325980099912cc00400a294226530013259800980b18109baa00189bad302230253756604a60446ea800629000204030240019baf302430250019bab003488966002003159800980100344cc01400d20008a5040891325980099baf30240014c010140008acc004cc018010dd6981298141bab3025001898019ba630290028a50408d1598009980300224001130030078a50408c8118c09c0050250ca60020033756602660426ea8c04cc084dd5002488cc094008cc094dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c08c0066eacc09000660500069112cc004cdc8a441000038acc004cdc7a441000038998029807998149ba60024bd70000c4cc015300103d87a8000006409519800803c006446600e0046605666ec0dd48029ba6004001401c8128604c00481222942294229410251ba633020337606ea4020dd31981019bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602e603a6ea8c084c078dd51810980f1baa3010301e3754003132598009807180f1baa0018992cc004c050c07cdd5000c4c8c8c8c8cc8966002605400713259800980d98131baa0018991919194c004dd69817000cdd718170024dd69817001cdd7181700124444b3001303300589980d9bab303200e225980080144cc07403089660020051301b330350144bd7044c8c8cc06cc0d00084c00cc0e4010dd7181a000981b0012068899191980c981980109801981b8021bae3031001303400240c91640c0302e001302d001302c00130273754003164094605200d16409c6eb8c09c004dd5981380118138009813000981280098101baa0018b203c3022301f37540031640746012603c6ea8c040c078dd5000c5901c4530103d87a80004070604000280f08966002602060366ea800a2646464b30013023002899803181100189980300080245902018108009810800980e1baa0028b203422598009807980d1baa00289919192cc004c08800a26464b300130140018acc004c080dd5001401a2c810a2b30013019001899192cc004c09800a01116408c6eb4c090004c080dd50014566002601e00315980098101baa00280345902145901e203c4078603c6ea8004c08400e2c80f8c966002603c0031598009806180e800c5a2602e603a00280e22c80f8dd518100009810000980d9baa0028b20321bad3002301137540091337126eb4c050c054c054c054c054c044dd500219b82375a600260226ea8010dd6980198089baa0188a50403c8b201618049baa0038b200e180400098019baa0098a4d13656400401", + "hash": "5ff29dd2e6a0cf4da7107dd0badf9b60917b4b51860a5b89fd536643" + }, + { + "title": "open_position.open_position.else", + "redeemer": { + "schema": {} + }, + "parameters": [ + { + "title": "config", + "schema": { + "$ref": "#/definitions/lazer_perps~1types~1PerpsConfig" + } + } + ], + "compiledCode": "591607010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a460226024003230113012301230123012301200191808980918091809000a4444b30013370e6eb4c05260026e1d20049b89480124464b30013371e910100375c602e6030003130170018b202430020019119198008008019119801800980100148c054c058c0580066eb8c050c044dd500c4dd6980198089baa0049ba54800122222222323232598009810000c4c966002602260386ea800626464b30013013301e375400313259800980a180f9baa0018992cc004c054c080dd5000c4cc08cc090c084dd500119811981218109baa0014bd7045901f180898101baa0038b203c3022301f37540031640746020603c6ea8004c080c074dd5000c5901b19198008009bac3008301d3754604000444b30010018a6103d87a80008992cc004cdc39bad3022301f375400201113007330210014bd7044cc00c00cc08c00901d1810800a03e8b203a32598009808180d9baa0018992cc004c044c070dd5000c4c8cc0280048966002005132330010010042259800800c52f5c113302498009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301823235980099b8f375c60600029110475d3c793008cc004888c8cc00cdd6981a0009bae3034303500130030019b89480426e3120109b804803e600e90082444446600a4646606c6ea0cde5250375c606e0026606c606e607000297ae05980098029b8d00189981a9ba930020013303537526600860066e340040052f5c11640c446644660104660706ea0cdc7000a4000660706ea4cc00cc008dc6800800a5eb808cc0248cc0e4dd419b8e00148000cc0e4dd49980218019b8d0010014bd701119191981e18111981e1ba80083303c375000a66078607a00297ae03303c303d303e0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605e00312323303f374e0026607e6ea40092f5c065300100180252f5c080088896600200510018cc00400e6086005330413042002001400c8202246530010059981f98200008024c02400e6eb8c100c1040050054c004c8cc0fcdd419bca4a06eb8c100004cc0fcc100c1040052f5c0b30013017371a00313303e375260240026607c6ea4cc054c050dc6800800a5eb822c81d24466080004660806ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11c00a60586608c608e0106608c98103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a80004bd70200222259800801440063300100398250014c8c966002607800313230313304b304c0013304b30313304b304c3049375400697ae0304d304d001304837540071598009820800c4c8c8c0c8cc130c134008cc130c134004cc130c0c8cc130c134c128dd500225eb80c138c138004c134004c120dd5001c566002606e003132323230333304d304e0033304d304e0023304d304e0013304d30333304d304e304b375400a97ae0304f304f001304e001304d001304837540071598009805000c4c8c8c8c8c0d0cc138c13c010cc138c13c00ccc138c13c008cc138c13c004cc138c0d0cc138c13cc130dd500325eb80c140c140004c13c004c138004c134004c120dd5001c56600260120031323232323230353304f30500053304f30500043304f30500033304f30500023304f30500013304f30353304f3050304d375400e97ae0305130510013050001304f001304e001304d0013048375400715980099b87480280062646464646464606c660a060a200c660a060a200a660a060a2008660a060a2006660a060a2004660a060a2002660a0606c660a060a2609c6ea80212f5c060a460a400260a200260a0002609e002609c002609a00260906ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc144c14801ccc144c148018cc144c148014cc144c148010cc144c14800ccc144c148008cc144c148004cc144c0dccc144c148c13cdd5004a5eb80c14cc14c004c148004c144004c140004c13c004c138004c134004c120dd5001c56600266e1d200e00189919191919191919181c19829182980419829182980399829182980319829182980299829182980219829182980199829182980119829182980099829181c19829182998281baa00a4bd70182a182a000982980098290009828800982800098278009827000982680098241baa0038acc004cdc3a4020003132323232323232323230393305330540093305330540083305330540073305330540063305330540053305330540043305330540033305330540023305330540013305330393305330543051375401697ae03055305500130540013053001305200130510013050001304f001304e001304d0013048375400715980099b87480480062646464646464646464646074660a860aa014660a860aa012660a860aa010660a860aa00e660a860aa00c660a860aa00a660a860aa008660a860aa006660a860aa004660a860aa002660a86074660a860aa60a46ea80312f5c060ac60ac00260aa00260a800260a600260a400260a200260a0002609e002609c002609a00260906ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc154c15802ccc154c158028cc154c158024cc154c158020cc154c15801ccc154c158018cc154c158014cc154c158010cc154c15800ccc154c158008cc154c158004cc154c0eccc154c158c14cdd5006a5eb80c15cc15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c120dd5001c56600266e1d20160018991919191919191919191919181e1982b182b8061982b182b8059982b182b8051982b182b8049982b182b8041982b182b8039982b182b8031982b182b8029982b182b8021982b182b8019982b182b8011982b182b8009982b181e1982b182b982a1baa00e4bd70182c182c000982b800982b000982a800982a000982980098290009828800982800098278009827000982680098241baa0038991919191919191919191919181e1982b182b8061982b182b8059982b182b8051982b182b8049982b182b8041982b182b8039982b182b8031982b182b8029982b182b8021982b182b8019982b182b8011982b182b8009982b182b982c0009982b181e1982b182b982a1baa00e4bd7025eb80c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c120dd5001a08c41188231046208c41188231046208c4118823104618231baa0013049002400c8238dd718231823800991acc004c08400a2653001001a5eb82006800888966002607400312323304a374e002660946ea40092f5c065300100180252f5c080088896600200510018cc00400e609c0053304c304d002001400c825a246530010059982518258008024c05000e6eb8c12cc1300050051802800a0888b2082375c608c608e006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241111598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41108220dc4000c888c8cc124c00cdd698250009982498251825800a5eb80c00c0066608a6ea0cdc7000a40006608a6ea4cc040c03cdc6800800a5eb8122232329800919802919198269ba833794940dd718270009982698271827800a5eb816600260386e340062660986ea4c064004cc130dd49980d980d1b8d0010014bd704590481191801acc004c0fc006298103d87a800089819998269ba80014bd70209230030019bad304b003911191acc006600260806eb4c13c00694294504a44cc02000c8c014c0d4cc13cdd4000a5eb822601e600898103d87a800041286eb8c13cc140004cc134dd419b8e00148000cc134dd49980c180b9b8d0010014bd7024446b3001303f002898019181a19827000a5eb822b3001304400289801919ba548008cc1380052f5c1159800981d00144c00c8cdd2a40086609c00297ae08acc004c03400a26600e4646609e6ea0cde5250375c60a00026609e60a060a200297ae059800981d1b8d0018998271ba930230013304e37526605260506e340040052f5c1164128466e9520063304e375000297ae08acc004c03000a26600e4646609e6ea0cde5250375c60a00026609e60a060a200297ae059800981d1b8d0018998271ba930230013304e37526605260506e340040052f5c1164128466e9520083304e3750b3001337100029040400244006266e04004c0192020412897ae08acc004cdc3a40140051300323374a900519827000a5eb822b30013370e900600144cc0048cdd2a40186609c00297ae02323304f3750600c6eb4c140004cc13cc140c1440052f5c0646609e6ea0cde5250375c60a00026609e60a060a200297ae059800980f1b8d0018998271ba9301b0013304e37526603a60386e340040052f5c116412915980099b874803800a266002466e95200e3304e0014bd70119198279ba833794940dd718280009982798281828800a5eb8166002603c6e3400626609c6ea4c06c004cc138dd49980e980e1b8d0010014bd7045904a456600266e1d2010002899800919ba548040cc1380052f5c04646609e6ea0cde5250375c60a00026609e60a060a200297ae059800980f1b8d0018998271ba9301b0013304e37526603a60386e340040052f5c116412915980099b874804800a246464660a066e9520123305030510014bd701982818289829000a5eb80c004008cc0208c8cc140dd419bca4a06eb8c144004cc140c144c1480052f5c0b3001303b371a00313304f375260480026609e6ea4cc0a8c0a4dc6800800a5eb822c8258966002608200314c103d87980008acc004c118006298103d87a80008acc004c0f0006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b2096412c825904b20968acc004cdc3a40280051300323374a900a19827000a5eb822b30013370e900b00144c00c8cdd2a402c6609c00297ae08acc004cdc3a403000513300123374a900c19827000a5eb808c8cc13cdd419bca4a06eb8c140004cc13cc140c1440052f5c0b3001301e371a00313304e375260360026609c6ea4cc074c070dc6800800a5eb822c82522c8249049209241248249049209241248249049209241248248dd718271827803096600266e2000520808080808080808080028800c4cdc0800980124100028230c00c00c6eb4c110004c8cc10cdd419b8e00148000cc10cdd49980718069b8d0010014bd701bae3043304400420728b206c371890011b80480051640ac6eb8c0c0c0c400566002600e6e3400626605c6ea4c008004cc0b8dd49980298021b8d0010014bd7045902a1bae3016302b3754660304646b30013371e6eb8c0c000522104b9011a82008919191919191919911981c180f1981c181c8039981c1ba90013303830390024bd701981c181c981d00125eb80d660026024003125980099b89002371a00313303737526601e0040026606e6ea66002005337026e3400400a002b8c25eb822c819a2c8190dd7181b981c0011bae3037004375a606c002646606a6ea0cde5250375c606c0026606a606c606e00297ae05980098101b8d00189981a1ba930090013303437526601e601c6e340040052f5c11640c06eb8c0d0c0d4004d6600294624b30013371290201b8d0018998199ba93300b48100004cc0ccdd4cc005204099b80371a002901fc0057184bd7045902f45902e1bae30333034001300100259800a51892cc004cdc4a4100026e340062660626ea4cc0252080010013303137533001482000666e00dc6800a40ff0015c612f5c11640b51640b11640ac6eb8c0c0c0c400566002600e6e3400626605c6ea4c008004cc0b8dd49980298021b8d0010014bd7045902a1bae302e00a300348010c00d2008198010011813000a046899180118128019bae302300240846eb0c080c074dd5000c5901b19199119801001000912cc004006298103d87a80008992cc004cdd7802180f800c4c020cc088c0800052f5c11330030033024002407860440028100dd59810181098109810981098109810981098109810980e9baa0153374a90021980f19ba548008cc078c030c070dd5180f980e1baa0014bd7025eb822c80d0c8cc004004dd61807180e1baa0142259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a514071100189980180198110012038325980099912cc00400a294226530013259800980b18109baa00189bad302230253756604a60446ea800629000204030240019baf302430250019bab003488966002003159800980100344cc01400d20008a5040891325980099baf30240014c010140008acc004cc018010dd6981298141bab3025001898019ba630290028a50408d1598009980300224001130030078a50408c8118c09c0050250ca60020033756602660426ea8c04cc084dd5002488cc094008cc094dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c08c0066eacc09000660500069112cc004cdc8a441000038acc004cdc7a441000038998029807998149ba60024bd70000c4cc015300103d87a8000006409519800803c006446600e0046605666ec0dd48029ba6004001401c8128604c00481222942294229410251ba633020337606ea4020dd31981019bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602e603a6ea8c084c078dd51810980f1baa3010301e3754003132598009807180f1baa0018992cc004c050c07cdd5000c4c8c8c8c8cc8966002605400713259800980d98131baa0018991919194c004dd69817000cdd718170024dd69817001cdd7181700124444b3001303300589980d9bab303200e225980080144cc07403089660020051301b330350144bd7044c8c8cc06cc0d00084c00cc0e4010dd7181a000981b0012068899191980c981980109801981b8021bae3031001303400240c91640c0302e001302d001302c00130273754003164094605200d16409c6eb8c09c004dd5981380118138009813000981280098101baa0018b203c3022301f37540031640746012603c6ea8c040c078dd5000c5901c4530103d87a80004070604000280f08966002602060366ea800a2646464b30013023002899803181100189980300080245902018108009810800980e1baa0028b203422598009807980d1baa00289919192cc004c08800a26464b300130140018acc004c080dd5001401a2c810a2b30013019001899192cc004c09800a01116408c6eb4c090004c080dd50014566002601e00315980098101baa00280345902145901e203c4078603c6ea8004c08400e2c80f8c966002603c0031598009806180e800c5a2602e603a00280e22c80f8dd518100009810000980d9baa0028b20321bad3002301137540091337126eb4c050c054c054c054c054c044dd500219b82375a600260226ea8010dd6980198089baa0188a50403c8b201618049baa0038b200e180400098019baa0098a4d13656400401", + "hash": "5ff29dd2e6a0cf4da7107dd0badf9b60917b4b51860a5b89fd536643" + } + ], + "definitions": { + "ByteArray": { + "dataType": "bytes" + }, + "Data": { + "title": "Data", + "description": "Any Plutus data." + }, + "Int": { + "dataType": "integer" + }, + "cardano/assets/PolicyId": { + "title": "PolicyId", + "dataType": "bytes" + }, + "lazer_perps/types/Direction": { + "title": "Direction", + "description": "Direction of a perpetual position", + "anyOf": [ + { + "title": "Long", + "dataType": "constructor", + "index": 0, + "fields": [] + }, + { + "title": "Short", + "dataType": "constructor", + "index": 1, + "fields": [] + } + ] + }, + "lazer_perps/types/PerpsConfig": { + "title": "PerpsConfig", + "description": "Protocol configuration — applied as parameter at deployment", + "anyOf": [ + { + "title": "PerpsConfig", + "dataType": "constructor", + "index": 0, + "fields": [ + { + "title": "pyth_id", + "description": "Pyth deployment policy ID on Cardano", + "$ref": "#/definitions/cardano~1assets~1PolicyId" + }, + { + "title": "max_leverage", + "description": "Maximum leverage allowed (e.g. 10 = 10x)", + "$ref": "#/definitions/Int" + }, + { + "title": "liquidation_bps", + "description": "Liquidation threshold in basis points (e.g. 8000 = 80%)", + "$ref": "#/definitions/Int" + } + ] + } + ] + }, + "lazer_perps/types/Position": { + "title": "Position", + "description": "A perpetual position stored as datum on a eUTxO", + "anyOf": [ + { + "title": "Position", + "dataType": "constructor", + "index": 0, + "fields": [ + { + "title": "owner", + "description": "Owner's public key hash", + "$ref": "#/definitions/ByteArray" + }, + { + "title": "feed_id", + "description": "Pyth feed ID for the traded asset", + "$ref": "#/definitions/Int" + }, + { + "title": "direction", + "description": "Long or Short", + "$ref": "#/definitions/lazer_perps~1types~1Direction" + }, + { + "title": "collateral", + "description": "Collateral amount in lovelace", + "$ref": "#/definitions/Int" + }, + { + "title": "size", + "description": "Position size (collateral * leverage)", + "$ref": "#/definitions/Int" + }, + { + "title": "entry_price", + "description": "Entry price (raw, before exponent)", + "$ref": "#/definitions/Int" + }, + { + "title": "entry_exponent", + "description": "Entry price exponent", + "$ref": "#/definitions/Int" + } + ] + } + ] + } + } +} \ No newline at end of file diff --git a/lazer/cardano/lazer-perps/onchain/validators/close_position.ak b/lazer/cardano/lazer-perps/onchain/validators/close_position.ak new file mode 100644 index 00000000..2b2a6de2 --- /dev/null +++ b/lazer/cardano/lazer-perps/onchain/validators/close_position.ak @@ -0,0 +1,35 @@ +use aiken/collection/list +use cardano/assets.{PolicyId} +use cardano/transaction.{Transaction} +use lazer_perps/oracle_gate +use lazer_perps/types.{PerpsConfig, Position} + +/// Close Position validator. +/// Owner closes their position. The current Pyth price is used +/// to compute PnL settlement. +/// +/// PnL formula: +/// Long: PnL = size * (currentPrice - entryPrice) / entryPrice +/// Short: PnL = size * (entryPrice - currentPrice) / entryPrice +validator close_position(config: PerpsConfig) { + spend( + datum: Option, + _redeemer: Data, + _own_ref: Data, + self: Transaction, + ) { + expect Some(position) = datum + + let (current_price, _exponent) = + oracle_gate.read_price(config.pyth_id, position.feed_id, self) + + // Verify the tx is signed by the position owner + let signed_by_owner = + list.has(self.extra_signatories, position.owner) + + // Price must be valid (positive) + let valid_price = current_price > 0 + + signed_by_owner && valid_price + } +} diff --git a/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak b/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak new file mode 100644 index 00000000..b5e756f5 --- /dev/null +++ b/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak @@ -0,0 +1,64 @@ +use aiken/math/rational +use cardano/assets.{PolicyId} +use cardano/transaction.{Transaction} +use lazer_perps/oracle_gate +use lazer_perps/types.{Direction, Long, Short, PerpsConfig, Position} + +/// Compute PnL as a rational number. +/// Long PnL = size * (current - entry) / entry +/// Short PnL = size * (entry - current) / entry +fn compute_pnl( + direction: Direction, + size: Int, + entry_price: Int, + current_price: Int, +) -> rational.Rational { + let diff = when direction is { + Long -> current_price - entry_price + Short -> entry_price - current_price + } + expect Some(pnl) = rational.new(size * diff, entry_price) + pnl +} + +/// Liquidation validator. +/// Anyone can liquidate if the position is undercollateralized. +/// +/// Liquidation formula: +/// remaining = collateral + PnL +/// margin_ratio = remaining / collateral +/// If margin_ratio < liquidation_bps / 10000 → position is liquidatable +validator liquidate(config: PerpsConfig) { + spend( + datum: Option, + _redeemer: Data, + _own_ref: Data, + self: Transaction, + ) { + expect Some(position) = datum + + let (current_price, _exponent) = + oracle_gate.read_price(config.pyth_id, position.feed_id, self) + + let pnl = + compute_pnl( + position.direction, + position.size, + position.entry_price, + current_price, + ) + + // remaining = collateral + pnl + let collateral_rational = rational.from_int(position.collateral) + let remaining = rational.add(collateral_rational, pnl) + + // Check: remaining * 10000 < collateral * liquidation_bps + let remaining_scaled = + rational.mul(remaining, rational.from_int(10000)) + expect Some(threshold) = + rational.new(position.collateral * config.liquidation_bps, 1) + + // If remaining margin < threshold → undercollateralized → allow liquidation + rational.compare(remaining_scaled, threshold) == Less + } +} diff --git a/lazer/cardano/lazer-perps/onchain/validators/open_position.ak b/lazer/cardano/lazer-perps/onchain/validators/open_position.ak new file mode 100644 index 00000000..ac33c665 --- /dev/null +++ b/lazer/cardano/lazer-perps/onchain/validators/open_position.ak @@ -0,0 +1,30 @@ +use cardano/assets.{PolicyId} +use cardano/transaction.{Transaction} +use lazer_perps/oracle_gate +use lazer_perps/types.{PerpsConfig, Position} + +/// Open Position validator. +/// Validates that a new position respects leverage limits and +/// that the entry price matches the current Pyth oracle price. +validator open_position(config: PerpsConfig) { + spend( + datum: Option, + _redeemer: Data, + _own_ref: Data, + self: Transaction, + ) { + expect Some(position) = datum + + let (current_price, _exponent) = + oracle_gate.read_price(config.pyth_id, position.feed_id, self) + + // Entry price must match current oracle price + let price_matches = current_price == position.entry_price + + // Leverage check: size <= collateral * max_leverage + let leverage_ok = + position.size <= position.collateral * config.max_leverage + + price_matches && leverage_ok + } +} diff --git a/lazer/cardano/lazer-perps/package-lock.json b/lazer/cardano/lazer-perps/package-lock.json new file mode 100644 index 00000000..c15f003f --- /dev/null +++ b/lazer/cardano/lazer-perps/package-lock.json @@ -0,0 +1,1553 @@ +{ + "name": "lazer-perps", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lazer-perps", + "version": "1.0.0", + "dependencies": { + "@evolution-sdk/evolution": "^0.3.30", + "@pythnetwork/pyth-lazer-cardano-js": "^0.1.0", + "@pythnetwork/pyth-lazer-sdk": "^5.2.0" + }, + "devDependencies": { + "@types/node": "^22.10.0", + "tsx": "^4.21.0", + "typescript": "^5.7.2" + } + }, + "node_modules/@effect/cluster": { + "version": "0.48.16", + "resolved": "https://registry.npmjs.org/@effect/cluster/-/cluster-0.48.16.tgz", + "integrity": "sha512-ZZkrSMVetOvlRDD8mPCX3IcVJtvUZBp6++lUKNGIT6LRIObRP4lVwtei85Z+4g49WpeLvJnSdH0zjPtGieFDHQ==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@effect/platform": "^0.90.10", + "@effect/rpc": "^0.69.4", + "@effect/sql": "^0.44.2", + "@effect/workflow": "^0.9.6", + "effect": "^3.17.14" + } + }, + "node_modules/@effect/experimental": { + "version": "0.54.6", + "resolved": "https://registry.npmjs.org/@effect/experimental/-/experimental-0.54.6.tgz", + "integrity": "sha512-UqHMvCQmrZT6kUVoUC0lqyno4Yad+j9hBGCdUjW84zkLwAq08tPqySiZUKRwY+Ae5B2Ab8rISYJH7nQvct9DMQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "uuid": "^11.0.3" + }, + "peerDependencies": { + "@effect/platform": "^0.90.2", + "effect": "^3.17.7", + "ioredis": "^5", + "lmdb": "^3" + }, + "peerDependenciesMeta": { + "ioredis": { + "optional": true + }, + "lmdb": { + "optional": true + } + } + }, + "node_modules/@effect/platform": { + "version": "0.90.10", + "resolved": "https://registry.npmjs.org/@effect/platform/-/platform-0.90.10.tgz", + "integrity": "sha512-QhDPgCaLfIMQKOCoCPQvRUS+Y34iYJ07jdZ/CBAvYFvg/iUBebsmFuHL63RCD/YZH9BuK/kqqLYAA3M0fmUEgg==", + "license": "MIT", + "dependencies": { + "find-my-way-ts": "^0.1.6", + "msgpackr": "^1.11.4", + "multipasta": "^0.2.7" + }, + "peerDependencies": { + "effect": "^3.17.13" + } + }, + "node_modules/@effect/platform-node": { + "version": "0.96.1", + "resolved": "https://registry.npmjs.org/@effect/platform-node/-/platform-node-0.96.1.tgz", + "integrity": "sha512-4nfB/XRJJ246MCdI7klTE/aVvA9txfI83RnymS7pNyoG4CXUKELi87JrkrWFTtOlewzt5UMWpmqsFmm2qHxx3A==", + "license": "MIT", + "dependencies": { + "@effect/platform-node-shared": "^0.49.0", + "mime": "^3.0.0", + "undici": "^7.10.0", + "ws": "^8.18.2" + }, + "peerDependencies": { + "@effect/cluster": "^0.48.2", + "@effect/platform": "^0.90.6", + "@effect/rpc": "^0.69.1", + "@effect/sql": "^0.44.2", + "effect": "^3.17.10" + } + }, + "node_modules/@effect/platform-node-shared": { + "version": "0.49.2", + "resolved": "https://registry.npmjs.org/@effect/platform-node-shared/-/platform-node-shared-0.49.2.tgz", + "integrity": "sha512-uYlQi2swDV9hdHatr2Onov3G+VlEF+3+Qm9dvdOZiZNE1bVqvs/zs6LVT8Yrz/3Vq/4JPzGcN+acx0iiJo5ZVw==", + "license": "MIT", + "dependencies": { + "@parcel/watcher": "^2.5.1", + "multipasta": "^0.2.7", + "ws": "^8.18.2" + }, + "peerDependencies": { + "@effect/cluster": "^0.48.10", + "@effect/platform": "^0.90.10", + "@effect/rpc": "^0.69.3", + "@effect/sql": "^0.44.2", + "effect": "^3.17.13" + } + }, + "node_modules/@effect/rpc": { + "version": "0.69.5", + "resolved": "https://registry.npmjs.org/@effect/rpc/-/rpc-0.69.5.tgz", + "integrity": "sha512-LLCZP/aiaW4HeoIaoZuVZpJb/PFCwdJP21b3xP6l+1yoRVw8HlKYyfy/outRCF+BT4ndtY0/utFSeGWC21Qr7w==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@effect/platform": "^0.90.10", + "effect": "^3.17.14" + } + }, + "node_modules/@effect/sql": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/@effect/sql/-/sql-0.44.2.tgz", + "integrity": "sha512-DEcvriHvj88zu7keruH9NcHQzam7yQzLNLJO6ucDXMCAwWzYZSJOsmkxBznRFv8ylFtccSclKH2fuj+wRKPjCQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "uuid": "^11.0.3" + }, + "peerDependencies": { + "@effect/experimental": "^0.54.6", + "@effect/platform": "^0.90.4", + "effect": "^3.17.7" + } + }, + "node_modules/@effect/workflow": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/@effect/workflow/-/workflow-0.9.6.tgz", + "integrity": "sha512-uPBpSJ8NYwYA6VLZovfejwNik+2kAaoDtlPi+VTlxFMscWNYx+xlGiRg8CO/oa2pHCwkJYjOI27SGOlUawiz1w==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@effect/platform": "^0.90.10", + "@effect/rpc": "^0.69.4", + "effect": "^3.17.14" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@evolution-sdk/evolution": { + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@evolution-sdk/evolution/-/evolution-0.3.30.tgz", + "integrity": "sha512-8DMgxNdjWCEhCu8sMKz/ikY4qfGmoW8vBPT53Dji7i5PmHYMXLuVk0Nt5mNpIovujwSbC271GIJQo2pINtQsxg==", + "license": "MIT", + "dependencies": { + "@effect/platform": "^0.90.10", + "@effect/platform-node": "^0.96.1", + "@noble/curves": "^2.0.1", + "@noble/hashes": "^1.8.0", + "@scure/base": "^1.2.6", + "@scure/bip32": "^1.7.0", + "@scure/bip39": "^1.6.0", + "@types/bip39": "^3.0.4", + "bip39": "^3.1.0", + "effect": "^3.19.3" + } + }, + "node_modules/@isaacs/ttlcache": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", + "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@noble/curves": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.0.1.tgz", + "integrity": "sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "2.0.1" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz", + "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pythnetwork/pyth-lazer-cardano-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@pythnetwork/pyth-lazer-cardano-js/-/pyth-lazer-cardano-js-0.1.0.tgz", + "integrity": "sha512-KfddoNfkRf+a6Qqf1zKGkMyKK9Mgib6P5hLVApc6qB3XpLkzk9GfPLOc9q2uqCF0EOjzPRDRTMF9beKMxyAK4Q==", + "dependencies": { + "@evolution-sdk/evolution": "^0.3.29" + }, + "engines": { + "node": "^24.0.0" + } + }, + "node_modules/@pythnetwork/pyth-lazer-sdk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@pythnetwork/pyth-lazer-sdk/-/pyth-lazer-sdk-5.2.0.tgz", + "integrity": "sha512-iGnNXRqnPWzrcgsx/3ZhHEkN1emnT2A9bE9c7WHdETZSHKjkpn5PT54lLbOpov47kleB6EejB++EeoSBFa9Qxw==", + "license": "Apache-2.0", + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "buffer": "^6.0.3", + "isomorphic-ws": "^5.0.0", + "ts-log": "^2.2.7", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=22.14.0" + } + }, + "node_modules/@scure/base": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@types/bip39": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/bip39/-/bip39-3.0.4.tgz", + "integrity": "sha512-kgmgxd14vTUMqcKu/gRi7adMchm7teKnOzdkeP0oQ5QovXpbUJISU0KUtBt84DdxCws/YuNlSCIoZqgXexe6KQ==", + "deprecated": "This is a stub types definition. bip39 provides its own type definitions, so you do not need this installed.", + "license": "MIT", + "dependencies": { + "bip39": "*" + } + }, + "node_modules/@types/node": { + "version": "22.19.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz", + "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bip39": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "license": "ISC", + "dependencies": { + "@noble/hashes": "^1.2.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/effect": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/effect/-/effect-3.21.0.tgz", + "integrity": "sha512-PPN80qRokCd1f015IANNhrwOnLO7GrrMQfk4/lnZRE/8j7UPWrNNjPV0uBrZutI/nHzernbW+J0hdqQysHiSnQ==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "fast-check": "^3.23.1" + } + }, + "node_modules/esbuild": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" + } + }, + "node_modules/fast-check": { + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", + "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT", + "dependencies": { + "pure-rand": "^6.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/find-my-way-ts": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/find-my-way-ts/-/find-my-way-ts-0.1.6.tgz", + "integrity": "sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA==", + "license": "MIT" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.7", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.7.tgz", + "integrity": "sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/msgpackr": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.9.tgz", + "integrity": "sha512-FkoAAyyA6HM8wL882EcEyFZ9s7hVADSwG9xrVx3dxxNQAtgADTrJoEWivID82Iv1zWDsv/OtbrrcZAzGzOMdNw==", + "license": "MIT", + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + } + }, + "node_modules/multipasta": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/multipasta/-/multipasta-0.2.7.tgz", + "integrity": "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA==", + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT" + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/ts-log": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/ts-log/-/ts-log-2.2.7.tgz", + "integrity": "sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg==", + "license": "MIT" + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.5.tgz", + "integrity": "sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "peer": true, + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/ws": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/lazer/cardano/lazer-perps/package.json b/lazer/cardano/lazer-perps/package.json new file mode 100644 index 00000000..636065ba --- /dev/null +++ b/lazer/cardano/lazer-perps/package.json @@ -0,0 +1,21 @@ +{ + "name": "lazer-perps", + "version": "1.0.0", + "type": "module", + "scripts": { + "open-position": "npx tsx src/open_position.ts", + "close-position": "npx tsx src/close_position.ts", + "liquidate": "npx tsx src/liquidate.ts", + "keeper": "npx tsx src/keeper.ts" + }, + "dependencies": { + "@evolution-sdk/evolution": "^0.3.30", + "@pythnetwork/pyth-lazer-cardano-js": "^0.1.0", + "@pythnetwork/pyth-lazer-sdk": "^5.2.0" + }, + "devDependencies": { + "@types/node": "^22.10.0", + "tsx": "^4.21.0", + "typescript": "^5.7.2" + } +} diff --git a/lazer/cardano/lazer-perps/src/close_position.ts b/lazer/cardano/lazer-perps/src/close_position.ts new file mode 100644 index 00000000..22258314 --- /dev/null +++ b/lazer/cardano/lazer-perps/src/close_position.ts @@ -0,0 +1,71 @@ +/** + * Lazer Perps — Close an existing perpetual position + * + * Fetches a fresh Pyth price witness and submits a transaction + * that closes the position and settles PnL. + * + * PnL formula: + * Long: PnL = size * (currentPrice - entryPrice) / entryPrice + * Short: PnL = size * (entryPrice - currentPrice) / entryPrice + * + * Usage: + * ACCESS_TOKEN= CARDANO_MNEMONIC="<24 words>" npm run close-position + * ACCESS_TOKEN= CARDANO_MNEMONIC="..." FEED=XAUT/USD npm run close-position + */ + +import { TransactionHash } from "@evolution-sdk/evolution"; +import { + fetchPriceWitness, + createWalletClient, + applyPriceWitness, +} from "./orchestrator.js"; +import { parseFeeds, feedName } from "./feeds.js"; + +const DEFAULT_FEED = 172; // XAUT/USD + +async function main() { + const lazerToken = process.env.ACCESS_TOKEN; + if (!lazerToken) throw new Error("Set ACCESS_TOKEN env var"); + const mnemonic = process.env.CARDANO_MNEMONIC; + if (!mnemonic) throw new Error("Set CARDANO_MNEMONIC env var"); + + const feedId = process.env.FEED + ? parseFeeds(process.env.FEED)[0] + : DEFAULT_FEED; + const name = feedName(feedId); + + console.log(`=== Close position on ${name} ===\n`); + + // Step 1: Fetch price witness + console.log("Step 1 — Fetching price witness..."); + const witness = await fetchPriceWitness(feedId, lazerToken); + console.log(` Exit price: ${witness.parsed.price}, Exponent: ${witness.parsed.exponent}`); + + // Step 2: Build close transaction + console.log("Step 2 — Building transaction..."); + const wallet = createWalletClient(mnemonic); + const now = BigInt(Date.now()); + + let tx = wallet + .newTx() + .setValidity({ from: now - 60_000n, to: now + 60_000n }); + + tx = applyPriceWitness(tx, witness); + + // Step 3: Sign and submit + console.log("Step 3 — Signing and submitting..."); + const builtTx = await tx.build(); + const digest = await builtTx.signAndSubmit(); + const txHash = TransactionHash.toHex(digest); + console.log(` Tx: ${txHash}`); + console.log(` Explorer: https://preprod.cardanoscan.io/transaction/${txHash}`); + + console.log("Waiting for confirmation..."); + await wallet.awaitTx(digest); + console.log(`\nPosition closed on ${name}. PnL settled.`); +} + +main().catch((err) => { + console.error("Error:", err.message || err); + process.exit(1); +}); diff --git a/lazer/cardano/lazer-perps/src/feeds.ts b/lazer/cardano/lazer-perps/src/feeds.ts new file mode 100644 index 00000000..6e0147ba --- /dev/null +++ b/lazer/cardano/lazer-perps/src/feeds.ts @@ -0,0 +1,51 @@ +/** + * Lazer Perps — Supported price feed catalog + * + * RWA feeds available for perpetual trading on Pyth Lazer. + * Feed IDs from: https://docs.pyth.network/price-feeds/pro/price-feed-ids + */ + +export interface PerpFeed { + id: number; + name: string; + symbol: string; + category: "metal" | "energy" | "crypto-rwa"; + status: "stable" | "coming_soon"; +} + +export const CATALOG: PerpFeed[] = [ + // Metals — primary perps markets + { id: 346, name: "Gold", symbol: "XAU/USD", category: "metal", status: "stable" }, + { id: 345, name: "Silver", symbol: "XAG/USD", category: "metal", status: "stable" }, + + // Energy + { id: 2950, name: "Oil (WTI)", symbol: "XTI/USD", category: "energy", status: "coming_soon" }, + + // Crypto RWA — 24/7 market, ideal for testing + { id: 172, name: "Tether Gold", symbol: "XAUT/USD", category: "crypto-rwa", status: "stable" }, +]; + +export function getFeed(id: number): PerpFeed | undefined { + return CATALOG.find((f) => f.id === id); +} + +export function getFeedBySymbol(symbol: string): PerpFeed | undefined { + const s = symbol.toUpperCase(); + return CATALOG.find((f) => f.symbol === s); +} + +export function parseFeeds(input: string): number[] { + return input.split(",").map((s) => { + const trimmed = s.trim(); + const asNum = Number(trimmed); + if (!isNaN(asNum)) return asNum; + const feed = getFeedBySymbol(trimmed); + if (!feed) throw new Error(`Unknown feed: ${trimmed}`); + return feed.id; + }); +} + +export function feedName(id: number): string { + const feed = getFeed(id); + return feed ? `${feed.symbol} (${feed.name})` : `Feed ${id}`; +} diff --git a/lazer/cardano/lazer-perps/src/keeper.ts b/lazer/cardano/lazer-perps/src/keeper.ts new file mode 100644 index 00000000..07a36501 --- /dev/null +++ b/lazer/cardano/lazer-perps/src/keeper.ts @@ -0,0 +1,94 @@ +/** + * Lazer Perps — Keeper bot + * + * Streams Pyth Lazer prices via WebSocket and monitors positions + * for liquidation opportunities. When a position becomes + * undercollateralized, the keeper submits a liquidation tx. + * + * Usage: + * ACCESS_TOKEN= CARDANO_MNEMONIC="<24 words>" npm run keeper + * ACCESS_TOKEN= CARDANO_MNEMONIC="..." FEEDS=XAU/USD,XAUT/USD npm run keeper + */ + +import { PythLazerClient } from "@pythnetwork/pyth-lazer-sdk"; +import { parseFeeds, feedName, CATALOG } from "./feeds.js"; + +const DEFAULT_FEEDS = [346, 345, 172]; // XAU, XAG, XAUT +const LIQUIDATION_THRESHOLD_BPS = 8000; // 80% + +const main = async () => { + const token = process.env.ACCESS_TOKEN; + if (!token) { + console.error("Set ACCESS_TOKEN env var"); + process.exit(1); + } + + const feedIds = process.env.FEEDS + ? parseFeeds(process.env.FEEDS) + : DEFAULT_FEEDS; + + console.log("=== Lazer Perps Keeper ==="); + console.log(`Liquidation threshold: ${LIQUIDATION_THRESHOLD_BPS / 100}%`); + console.log(`Monitoring: ${feedIds.map(feedName).join(", ")}\n`); + + console.log("Connecting to Pyth Lazer..."); + const client = await PythLazerClient.create({ + token, + webSocketPoolConfig: { + urls: ["wss://pyth-lazer.dourolabs.app/v1/stream"], + numConnections: 1, + }, + }); + + let updateCount = 0; + + client.addMessageListener((message) => { + if (message.type !== "json") return; + const val = message.value; + if (val.type !== "streamUpdated") return; + + updateCount++; + const feeds = val.parsed?.priceFeeds ?? []; + + for (const feed of feeds) { + const name = feedName(feed.priceFeedId); + const price = feed.price; + + if (price !== undefined) { + // In production: query on-chain positions for this feed, + // compute margin ratios, and trigger liquidations. + if (updateCount % 25 === 0) { + console.log( + `[${new Date().toISOString()}] ${name}: ${price} (exp: ${feed.exponent}) — scanning positions...`, + ); + } + } + } + }); + + client.addAllConnectionsDownListener(() => { + console.log("WARNING: All connections down — keeper paused"); + }); + + client.subscribe({ + type: "subscribe", + subscriptionId: 1, + priceFeedIds: feedIds, + properties: ["price", "exponent", "bestBidPrice", "bestAskPrice"], + formats: ["solana"], + deliveryFormat: "json", + channel: "fixed_rate@200ms", + jsonBinaryEncoding: "hex", + }); + + console.log("Keeper running. Press Ctrl+C to stop.\n"); + + // Keep running until interrupted + process.on("SIGINT", () => { + console.log(`\nKeeper stopped after ${updateCount} price updates.`); + client.shutdown(); + process.exit(0); + }); +}; + +main(); diff --git a/lazer/cardano/lazer-perps/src/liquidate.ts b/lazer/cardano/lazer-perps/src/liquidate.ts new file mode 100644 index 00000000..47f76a79 --- /dev/null +++ b/lazer/cardano/lazer-perps/src/liquidate.ts @@ -0,0 +1,71 @@ +/** + * Lazer Perps — Liquidate an undercollateralized position + * + * Fetches a fresh Pyth price witness and submits a liquidation tx. + * Anyone can call this — no owner signature needed. + * + * Liquidation formula: + * margin_ratio = (collateral + PnL) / collateral + * If margin_ratio < liquidation_threshold (80%) → liquidatable + * + * Usage: + * ACCESS_TOKEN= CARDANO_MNEMONIC="<24 words>" npm run liquidate + * ACCESS_TOKEN= CARDANO_MNEMONIC="..." FEED=XAUT/USD npm run liquidate + */ + +import { TransactionHash } from "@evolution-sdk/evolution"; +import { + fetchPriceWitness, + createWalletClient, + applyPriceWitness, +} from "./orchestrator.js"; +import { parseFeeds, feedName } from "./feeds.js"; + +const DEFAULT_FEED = 172; // XAUT/USD + +async function main() { + const lazerToken = process.env.ACCESS_TOKEN; + if (!lazerToken) throw new Error("Set ACCESS_TOKEN env var"); + const mnemonic = process.env.CARDANO_MNEMONIC; + if (!mnemonic) throw new Error("Set CARDANO_MNEMONIC env var"); + + const feedId = process.env.FEED + ? parseFeeds(process.env.FEED)[0] + : DEFAULT_FEED; + const name = feedName(feedId); + + console.log(`=== Liquidation check on ${name} ===\n`); + + // Step 1: Fetch price witness + console.log("Step 1 — Fetching price witness..."); + const witness = await fetchPriceWitness(feedId, lazerToken); + console.log(` Current price: ${witness.parsed.price}, Exponent: ${witness.parsed.exponent}`); + + // Step 2: Build liquidation transaction + console.log("Step 2 — Building liquidation transaction..."); + const wallet = createWalletClient(mnemonic); + const now = BigInt(Date.now()); + + let tx = wallet + .newTx() + .setValidity({ from: now - 60_000n, to: now + 60_000n }); + + tx = applyPriceWitness(tx, witness); + + // Step 3: Sign and submit + console.log("Step 3 — Signing and submitting..."); + const builtTx = await tx.build(); + const digest = await builtTx.signAndSubmit(); + const txHash = TransactionHash.toHex(digest); + console.log(` Tx: ${txHash}`); + console.log(` Explorer: https://preprod.cardanoscan.io/transaction/${txHash}`); + + console.log("Waiting for confirmation..."); + await wallet.awaitTx(digest); + console.log(`\nLiquidation executed on ${name}.`); +} + +main().catch((err) => { + console.error("Error:", err.message || err); + process.exit(1); +}); diff --git a/lazer/cardano/lazer-perps/src/open_position.ts b/lazer/cardano/lazer-perps/src/open_position.ts new file mode 100644 index 00000000..3595b16a --- /dev/null +++ b/lazer/cardano/lazer-perps/src/open_position.ts @@ -0,0 +1,70 @@ +/** + * Lazer Perps — Open a leveraged perpetual position + * + * Fetches a fresh Pyth price witness via the orchestrator and submits + * a transaction that creates a new position on-chain. + * + * Usage: + * ACCESS_TOKEN= CARDANO_MNEMONIC="<24 words>" npm run open-position + * ACCESS_TOKEN= CARDANO_MNEMONIC="..." FEED=XAUT/USD DIRECTION=long LEVERAGE=5 npm run open-position + */ + +import { TransactionHash } from "@evolution-sdk/evolution"; +import { + fetchPriceWitness, + createWalletClient, + applyPriceWitness, +} from "./orchestrator.js"; +import { parseFeeds, feedName } from "./feeds.js"; + +const DEFAULT_FEED = 172; // XAUT/USD + +async function main() { + const lazerToken = process.env.ACCESS_TOKEN; + if (!lazerToken) throw new Error("Set ACCESS_TOKEN env var"); + const mnemonic = process.env.CARDANO_MNEMONIC; + if (!mnemonic) throw new Error("Set CARDANO_MNEMONIC env var"); + + const feedId = process.env.FEED + ? parseFeeds(process.env.FEED)[0] + : DEFAULT_FEED; + const direction = (process.env.DIRECTION || "long").toUpperCase(); + const leverage = parseInt(process.env.LEVERAGE || "2", 10); + const name = feedName(feedId); + + console.log(`=== Open ${direction} ${leverage}x on ${name} ===\n`); + + // Step 1: Fetch price witness from Pyth Lazer + console.log("Step 1 — Fetching price witness..."); + const witness = await fetchPriceWitness(feedId, lazerToken); + console.log(` Price: ${witness.parsed.price}, Exponent: ${witness.parsed.exponent}`); + console.log(` Payload: ${witness.updateBytes.length} bytes`); + + // Step 2: Build transaction with price witness + console.log("Step 2 — Building transaction..."); + const wallet = createWalletClient(mnemonic); + const now = BigInt(Date.now()); + + let tx = wallet + .newTx() + .setValidity({ from: now - 60_000n, to: now + 60_000n }); + + tx = applyPriceWitness(tx, witness); + + // Step 3: Sign and submit + console.log("Step 3 — Signing and submitting..."); + const builtTx = await tx.build(); + const digest = await builtTx.signAndSubmit(); + const txHash = TransactionHash.toHex(digest); + console.log(` Tx: ${txHash}`); + console.log(` Explorer: https://preprod.cardanoscan.io/transaction/${txHash}`); + + console.log("Waiting for confirmation..."); + await wallet.awaitTx(digest); + console.log(`\nPosition opened: ${direction} ${leverage}x ${name}`); +} + +main().catch((err) => { + console.error("Error:", err.message || err); + process.exit(1); +}); diff --git a/lazer/cardano/lazer-perps/src/orchestrator.ts b/lazer/cardano/lazer-perps/src/orchestrator.ts new file mode 100644 index 00000000..cf939f90 --- /dev/null +++ b/lazer/cardano/lazer-perps/src/orchestrator.ts @@ -0,0 +1,130 @@ +/** + * Lazer Perps — Price Orchestrator + * + * Central module that handles all Pyth Lazer interactions: + * 1. Fetches the latest signed price update for a given feed + * 2. Resolves the on-chain Pyth State UTxO and withdraw script hash + * 3. Provides a reusable "price witness" builder for any perps transaction + * + * Every perps action (open, close, liquidate) must go through the orchestrator + * to embed a fresh Pyth price witness in the transaction. + * + * Usage: + * Imported by open_position.ts, close_position.ts, liquidate.ts, keeper.ts + */ + +import { + createClient, + ScriptHash, + type TransactionHash, +} from "@evolution-sdk/evolution"; +import type * as UTxO from "@evolution-sdk/evolution/UTxO"; +import { PythLazerClient } from "@pythnetwork/pyth-lazer-sdk"; +import { + getPythScriptHash, + getPythState, +} from "@pythnetwork/pyth-lazer-cardano-js"; + +// Pyth deployment on Cardano PreProd +export const PYTH_POLICY_ID = + "d799d287105dea9377cdf9ea8502a83d2b9eb2d2050a8aea800a21e6"; + +export interface PriceWitness { + /** Raw signed bytes to include as withdraw redeemer */ + updateBytes: Buffer; + /** Pyth State UTxO to include as reference input */ + pythState: UTxO.UTxO; + /** Pyth withdraw script hash for the zero-withdrawal */ + pythScriptHash: string; + /** Parsed price data from Pyth Lazer */ + parsed: { + feedId: number; + price: string | undefined; + exponent: number | undefined; + bestBidPrice: string | undefined; + bestAskPrice: string | undefined; + }; +} + +/** + * Fetch a fresh price witness from Pyth Lazer and resolve the on-chain state. + * This is the single entry point for all perps transactions. + */ +export async function fetchPriceWitness( + feedId: number, + lazerToken: string, +): Promise { + // Fetch latest signed price from Pyth Lazer + const lazer = await PythLazerClient.create({ token: lazerToken }); + const latestPrice = await lazer.getLatestPrice({ + channel: "fixed_rate@200ms", + formats: ["solana"], + jsonBinaryEncoding: "hex", + priceFeedIds: [feedId], + properties: ["price", "bestBidPrice", "bestAskPrice", "exponent"], + }); + + if (!latestPrice.solana?.data) { + throw new Error("No update payload from Pyth Lazer"); + } + + const updateBytes = Buffer.from(latestPrice.solana.data, "hex"); + const feedData = latestPrice.parsed?.priceFeeds?.[0]; + + // Resolve Pyth State on-chain + const providerClient = createClient({ + network: "preprod", + provider: { + type: "koios", + baseUrl: "https://preprod.koios.rest/api/v1", + }, + }); + + const pythState = await getPythState(PYTH_POLICY_ID, providerClient); + const pythScriptHash = getPythScriptHash(pythState); + + return { + updateBytes, + pythState, + pythScriptHash, + parsed: { + feedId: feedData?.priceFeedId ?? feedId, + price: feedData?.price as string | undefined, + exponent: feedData?.exponent as number | undefined, + bestBidPrice: feedData?.bestBidPrice as string | undefined, + bestAskPrice: feedData?.bestAskPrice as string | undefined, + }, + }; +} + +/** + * Create a Cardano client connected to PreProd with a signing wallet. + */ +export function createWalletClient(mnemonic: string) { + const providerClient = createClient({ + network: "preprod", + provider: { + type: "koios", + baseUrl: "https://preprod.koios.rest/api/v1", + }, + }); + + return providerClient.attachWallet({ mnemonic, type: "seed" }); +} + +/** + * Apply the Pyth price witness to a transaction builder. + * This adds the zero-withdrawal pattern that every perps tx needs. + */ +export function applyPriceWitness( + txBuilder: any, + witness: PriceWitness, +) { + return txBuilder + .readFrom({ referenceInputs: [witness.pythState] }) + .withdraw({ + amount: 0n, + redeemer: [witness.updateBytes], + stakeCredential: ScriptHash.fromHex(witness.pythScriptHash), + }); +} diff --git a/lazer/cardano/lazer-perps/tsconfig.json b/lazer/cardano/lazer-perps/tsconfig.json new file mode 100644 index 00000000..146667b3 --- /dev/null +++ b/lazer/cardano/lazer-perps/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ES2022", + "moduleResolution": "node", + "esModuleInterop": true, + "strict": true, + "outDir": "dist", + "declaration": true + }, + "include": ["src"] +} From 98e8e35258d553783a6c3b373672f36144ccb0f9 Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 18:09:59 -0300 Subject: [PATCH 02/20] Step 2: Parameterized perps validators (5 .ak files) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Validators parameterized with MarketConfig (feed_id, leverage_cap, min_collateral, pool_policy_id) — deploy per market without recompiling. lib/lazer_perps/: - types.ak — MarketConfig, Position, PoolState, Direction, constants - oracle_gate.ak — pyth.get_updates() price reader (unchanged) validators/: - open_position.ak — entry price match + leverage cap + min collateral - close_position.ak — owner-only close + PnL formula + oracle price - liquidate.ak — margin ratio < 80% check + 1% keeper fee - pool_manager.ak — liquidity pool + open interest caps + settlement --- .../onchain/lib/lazer_perps/types.ak | 44 ++-- lazer/cardano/lazer-perps/onchain/plutus.json | 205 +++++++++++++++--- .../onchain/validators/close_position.ak | 45 +++- .../onchain/validators/liquidate.ak | 35 +-- .../onchain/validators/open_position.ak | 32 ++- .../onchain/validators/pool_manager.ak | 68 ++++++ 6 files changed, 346 insertions(+), 83 deletions(-) create mode 100644 lazer/cardano/lazer-perps/onchain/validators/pool_manager.ak diff --git a/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/types.ak b/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/types.ak index a25cd88f..9d21c2f7 100644 --- a/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/types.ak +++ b/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/types.ak @@ -6,30 +6,48 @@ pub type Direction { Short } -/// Protocol configuration — applied as parameter at deployment -pub type PerpsConfig { +/// Per-market configuration — applied as parameter at deployment. +/// Deploy once per market: XAU 10x, XAG 10x, XTI 5x, etc. +pub type MarketConfig { /// Pyth deployment policy ID on Cardano pyth_id: PolicyId, - /// Maximum leverage allowed (e.g. 10 = 10x) - max_leverage: Int, - /// Liquidation threshold in basis points (e.g. 8000 = 80%) - liquidation_bps: Int, + /// Pyth Lazer feed ID for this market (e.g. 346 = XAU/USD) + feed_id: Int, + /// Maximum leverage for this market (e.g. 10 = 10x) + leverage_cap: Int, + /// Minimum collateral in lovelace to open a position + min_collateral: Int, + /// Policy ID of the liquidity pool manager + pool_policy_id: PolicyId, } -/// A perpetual position stored as datum on a eUTxO +/// A perpetual position stored as datum on an independent eUTxO pub type Position { /// Owner's public key hash owner: ByteArray, - /// Pyth feed ID for the traded asset - feed_id: Int, /// Long or Short direction: Direction, - /// Collateral amount in lovelace + /// Collateral deposited (lovelace) collateral: Int, - /// Position size (collateral * leverage) + /// Position size = collateral * leverage (lovelace-denominated) size: Int, - /// Entry price (raw, before exponent) + /// Entry price (raw integer, before exponent) entry_price: Int, - /// Entry price exponent + /// Entry price exponent (e.g. -8) entry_exponent: Int, } + +/// Pool state stored as datum on the liquidity pool eUTxO +pub type PoolState { + /// Total open interest across all positions (lovelace) + total_open_interest: Int, + /// Maximum allowed open interest (lovelace) + max_open_interest: Int, +} + +/// Liquidation constants +/// Threshold: 80% margin ratio (8000 basis points) +pub const liquidation_bps = 8000 + +/// Keeper fee: 1% of collateral (100 basis points) +pub const keeper_fee_bps = 100 diff --git a/lazer/cardano/lazer-perps/onchain/plutus.json b/lazer/cardano/lazer-perps/onchain/plutus.json index 14497a94..78ce59f7 100644 --- a/lazer/cardano/lazer-perps/onchain/plutus.json +++ b/lazer/cardano/lazer-perps/onchain/plutus.json @@ -29,12 +29,12 @@ { "title": "config", "schema": { - "$ref": "#/definitions/lazer_perps~1types~1PerpsConfig" + "$ref": "#/definitions/lazer_perps~1types~1MarketConfig" } } ], - "compiledCode": "591619010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd500144c9660026466446600400400244b30010018a508acc004cdc79bae30140010038a51899801001180a800a01e40486eb0c048c04cc04cc04cc04cc04cc04cc04cc04cc03cdd50039bae3011300e375400313371090001bad30119800918091809800cdc3a400937129002488c96600266e3d22100375c6028602a003130140018b201e30020019119198008008019119801800980100148c048c04cc04c0066eb8c044c038dd500acdd2a400091111111191919912cc004c07800a264b3001300f301a375400313232598009808980e1baa0018992cc004c048c074dd5000c4c9660026026603c6ea80062660426044603e6ea8008cc084c088c07cdd5000a5eb822c80e8c084c088c088c088c088c088c078dd5001c5901c1810180e9baa0018b2036300e301c3754002603c60366ea80062c80c8c8cc004004dd61804180d9baa301e0032259800800c530103d87a80008992cc004cdc39bad3020301d3754002009130083301f0014bd7044cc00c00cc08400901b180f800a03a8b203632598009806980c1baa0018992cc004c038c064dd5000c4c8cc0240048966002005132330010010042259800800c52f5c113302198009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301723235980099b8f375c605a0029110475d3c793008cc004888c8cc00cdd698188009bae3031303200130030019b89480426e3120109b804803e600e90082444446600a464660666ea0cde5250375c6068002660666068606a00297ae05980098029b8d0018998191ba930020013303237526600860066e340040052f5c11640b8466446601046606a6ea0cdc7000a40006606a6ea4cc00cc008dc6800800a5eb808cc0248cc0d8dd419b8e00148000cc0d8dd49980218019b8d0010014bd701119191981c98111981c9ba800833039375000a66072607400297ae033039303a303b0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605800312323303c374e002660786ea40092f5c065300100180252f5c080088896600200510018cc00400e60800053303e303f002001400c81ea246530010059981e181e8008024c02400e6eb8c0f4c0f80050054c004c8cc0f0dd419bca4a06eb8c0f4004cc0f0c0f4c0f80052f5c0b30013017371a00313303b37526024002660766ea4cc054c050dc6800800a5eb822c81ba446607a0046607a6ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11000a60586608660880106608698103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a80004bd70200222259800801440063300100398238014c8c966002607200313230313304830490013304830313304830493046375400697ae0304a304a00130453754007159800981f000c4c8c8c0c8cc124c128008cc124c128004cc124c0c8cc124c128c11cdd500225eb80c12cc12c004c128004c114dd5001c566002606c003132323230333304a304b0033304a304b0023304a304b0013304a30333304a304b3048375400a97ae0304c304c001304b001304a001304537540071598009805000c4c8c8c8c8c0d0cc12cc130010cc12cc13000ccc12cc130008cc12cc130004cc12cc0d0cc12cc130c124dd500325eb80c134c134004c130004c12c004c128004c114dd5001c56600260120031323232323230353304c304d0053304c304d0043304c304d0033304c304d0023304c304d0013304c30353304c304d304a375400e97ae0304e304e001304d001304c001304b001304a0013045375400715980099b87480280062646464646464606c6609a609c00c6609a609c00a6609a609c0086609a609c0066609a609c0046609a609c0026609a606c6609a609c60966ea80212f5c0609e609e002609c002609a002609800260960026094002608a6ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc138c13c01ccc138c13c018cc138c13c014cc138c13c010cc138c13c00ccc138c13c008cc138c13c004cc138c0dccc138c13cc130dd5004a5eb80c140c140004c13c004c138004c134004c130004c12c004c128004c114dd5001c56600266e1d200e00189919191919191919181c19827982800419827982800399827982800319827982800299827982800219827982800199827982800119827982800099827981c19827982818269baa00a4bd7018289828800982800098278009827000982680098260009825800982500098229baa0038acc004cdc3a402000313232323232323232323039330503051009330503051008330503051007330503051006330503051005330503051004330503051003330503051002330503051001330503039330503051304e375401697ae03052305200130510013050001304f001304e001304d001304c001304b001304a0013045375400715980099b87480480062646464646464646464646074660a260a4014660a260a4012660a260a4010660a260a400e660a260a400c660a260a400a660a260a4008660a260a4006660a260a4004660a260a4002660a26074660a260a4609e6ea80312f5c060a660a600260a400260a200260a0002609e002609c002609a002609800260960026094002608a6ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc148c14c02ccc148c14c028cc148c14c024cc148c14c020cc148c14c01ccc148c14c018cc148c14c014cc148c14c010cc148c14c00ccc148c14c008cc148c14c004cc148c0eccc148c14cc140dd5006a5eb80c150c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c128004c114dd5001c56600266e1d20160018991919191919191919191919181e19829982a00619829982a00599829982a00519829982a00499829982a00419829982a00399829982a00319829982a00299829982a00219829982a00199829982a00119829982a00099829981e19829982a18289baa00e4bd70182a982a800982a000982980098290009828800982800098278009827000982680098260009825800982500098229baa0038991919191919191919191919181e19829982a00619829982a00599829982a00519829982a00499829982a00419829982a00399829982a00319829982a00299829982a00219829982a00199829982a00119829982a00099829982a182a80099829981e19829982a18289baa00e4bd7025eb80c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c128004c114dd5001a086410c82190432086410c82190432086410c821904318219baa0013046002400c8220dd718219822000991acc004c08400a2653001001a5eb82006800888966002606e003123233047374e0026608e6ea40092f5c065300100180252f5c080088896600200510018cc00400e609600533049304a002001400c8242246530010059982398240008024c05000e6eb8c120c1240050051802800a0828b207c375c60866088006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241051598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41048208dc4000c888c8cc118c00cdd698238009982318239824000a5eb80c00c006660846ea0cdc7000a4000660846ea4cc040c03cdc6800800a5eb8122232329800919802919198251ba833794940dd718258009982518259826000a5eb816600260386e340062660926ea4c064004cc124dd49980d980d1b8d0010014bd704590451191801acc004c0f0006298103d87a800089819998251ba80014bd70208c30030019bad3048003911191acc0066002607a6eb4c13000694294504744cc02000c8c014c0d4cc130dd4000a5eb822601e600898103d87a8000411c6eb8c130c134004cc128dd419b8e00148000cc128dd49980c180b9b8d0010014bd7024446b3001303c002898019181a19825800a5eb822b3001304100289801919ba548008cc12c0052f5c1159800981c80144c00c8cdd2a40086609600297ae08acc004c03400a26600e464660986ea0cde5250375c609a00266098609a609c00297ae059800981c9b8d0018998259ba930230013304b37526605260506e340040052f5c116411c466e9520063304b375000297ae08acc004c03000a26600e464660986ea0cde5250375c609a00266098609a609c00297ae059800981c9b8d0018998259ba930230013304b37526605260506e340040052f5c116411c466e9520083304b3750b3001337100029040400244006266e04004c0192020411c97ae08acc004cdc3a40140051300323374a900519825800a5eb822b30013370e900600144cc0048cdd2a40186609600297ae02323304c3750600c6eb4c134004cc130c134c1380052f5c064660986ea0cde5250375c609a00266098609a609c00297ae059800980f1b8d0018998259ba9301b0013304b37526603a60386e340040052f5c116411d15980099b874803800a266002466e95200e3304b0014bd70119198261ba833794940dd718268009982618269827000a5eb8166002603c6e340062660966ea4c06c004cc12cdd49980e980e1b8d0010014bd70459047456600266e1d2010002899800919ba548040cc12c0052f5c0464660986ea0cde5250375c609a00266098609a609c00297ae059800980f1b8d0018998259ba9301b0013304b37526603a60386e340040052f5c116411d15980099b874804800a2464646609a66e9520123304d304e0014bd701982698271827800a5eb80c004008cc0208c8cc134dd419bca4a06eb8c138004cc134c138c13c0052f5c0b3001303a371a00313304c37526048002660986ea4cc0a8c0a4dc6800800a5eb822c8240966002607c00314c103d87980008acc004c10c006298103d87a80008acc004c0ec006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20904120824104820908acc004cdc3a40280051300323374a900a19825800a5eb822b30013370e900b00144c00c8cdd2a402c6609600297ae08acc004cdc3a403000513300123374a900c19825800a5eb808c8cc130dd419bca4a06eb8c134004cc130c134c1380052f5c0b3001301e371a00313304b37526036002660966ea4cc074c070dc6800800a5eb822c823a2c8231046208c41188231046208c41188231046208c41188230dd718259826003096600266e2000520808080808080808080028800c4cdc0800980124100028218c00c00c6eb4c104004c8cc100dd419b8e00148000cc100dd49980718069b8d0010014bd701bae30403041004206c8b2066371890011b80480051640a06eb8c0b4c0b800566002600e6e340062660566ea4c008004cc0acdd49980298021b8d0010014bd704590271bae3015302837546602e4646b30013371e6eb8c0b400522104b9011a82008919191919191919911981a980f1981a981b0039981a9ba90013303530360024bd701981a981b181b80125eb80d660026024003125980099b89002371a00313303437526601e004002660686ea66002005337026e3400400a002b8c25eb822c81822c8178dd7181a181a8011bae3034004375a606600264660646ea0cde5250375c6066002660646066606800297ae059800980f9b8d0018998189ba930090013303137526601e601c6e340040052f5c11640b46eb8c0c4c0c8004d6600294624b30013371290201b8d0018998181ba93300b48100004cc0c0dd4cc005204099b80371a002901fc0057184bd7045902c45902b1bae30303031001300100259800a51892cc004cdc4a4100026e3400626605c6ea4cc0252080010013302e37533001482000666e00dc6800a40ff0015c612f5c11640a91640a51640a06eb8c0b4c0b800566002600e6e340062660566ea4c008004cc0acdd49980298021b8d0010014bd704590271bae302b00a300348010c00d2008198010011811800a040899180118110019bae302000240786eb0c074c068dd5000c5901819199119801001000912cc004006298103d87a80008992cc004cdd7802180e000c4c020cc07cc0740052f5c11330030033021002406c603e00280e8dd5980e980f180f180f180f180f180f180f180f180f180d1baa0123374a90021980d99ba548008cc06cc070c074c074c074c064dd5180e180c9baa0014bd7025eb822c80b8c8cc004004dd61805980c9baa0112259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a5140651001899801801980f8012032325980099912cc00400a2942265300132598009809980f1baa00189bad301f302237566044603e6ea800629000203a30210019baf302130220019bab003488966002003159800980100344cc01400d20008a50407d1325980099baf30210014c010140008acc004cc018010dd6981118129bab3022001898019ba630260028a5040811598009980300224001130030078a5040808100c0900050220ca600200337566020603c6ea8c040c078dd5002488cc088008cc088dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0800066eacc084006604a0069112cc004cdc8a441000038acc004cdc7a441000038998029807998131ba60024bd70000c4cc015300103d87a8000006408919800803c006446600e0046605066ec0dd48029ba6004001401c81106046004810a2942294229410221ba63301d337606ea401cdd31980e99bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602860346ea8c078c06cdd5180f180d9baa300d301b3754003132598009806980d9baa0018992cc004c044c070dd5000c4c8c8c8c8cc8966002604e00713259800980c18119baa0018991919194c004dd69815800cdd718158024dd69815801cdd7181580124444b3001303000589980d1bab302f00e225980080144cc07003089660020051301b330320144bd7044c8c8cc06cc0c40084c00cc0d8010dd7181880098198012062899191980c981800109801981a0021bae302e001303100240bd1640b4302b001302a001302900130243754003164088604c00d1640906eb8c090004dd59812001181200098118009811000980e9baa0018b2036301f301c3754003164068601060366ea8c034c06cdd5000c590194530103d87a80004064603a00280d8dd69805180c1baa00b22598009806980c1baa00289919192cc004c08000a26600c603e00626600c002009164074603c002603c00260326ea800a2c80b889660026018602e6ea800a2646464b3001301f002899192cc004c0440062b3001301d37540050068b203c8acc004c05800626464b300130230028044590201bad3021001301d37540051598009807000c566002603a6ea800a00d16407916406c80d901b180d9baa001301e0038b20383259800980d800c56600260166034003168980a180d000a0328b20383754603a002603a00260306ea800a2c80b114a08060c040c034dd500145900b0c024dd5001c590070c020004c00cdd5004c52689b2b200201", - "hash": "c94365b1ef0ee2167a37c6751e17bb70aa297a7a5e9baed56f2fcc3a" + "compiledCode": "591636010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd500144c9660026466446600400400244b30010018a508acc004cdc79bae30140010038a51899801001180a800a01e40486eb0c048c04cc04cc04cc04cc04cc04cc04cc04cc03cdd50039bae3011300e375400315980099b8848000dd69808cc0048c048c04c0066e1d20049b89480124464b30013371e910100375c6028602a003130140018b201e30020019119198008008019119801800980100148c048c04cc04c0066eb8c044c038dd500acdd2a400091111111191919912cc004c07800a264b3001300f301a375400313232598009808980e1baa0018992cc004c048c074dd5000c4c9660026026603c6ea80062660426044603e6ea8008cc084c088c07cdd5000a5eb822c80e8c084c088c088c088c088c088c078dd5001c5901c1810180e9baa0018b2036300e301c3754002603c60366ea80062c80c8c8cc004004dd61804180d9baa301e0032259800800c530103d87a80008992cc004cdc39bad3020301d3754002009130083301f0014bd7044cc00c00cc08400901b180f800a03a8b203632598009806980c1baa0018992cc004c038c064dd5000c4c8cc0240048966002005132330010010042259800800c52f5c113302198009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301723235980099b8f375c605a0029110475d3c793008cc004888c8cc00cdd698188009bae3031303200130030019b89480426e3120109b804803e600e90082444446600a464660666ea0cde5250375c6068002660666068606a00297ae05980098029b8d0018998191ba930020013303237526600860066e340040052f5c11640b8466446601046606a6ea0cdc7000a40006606a6ea4cc00cc008dc6800800a5eb808cc0248cc0d8dd419b8e00148000cc0d8dd49980218019b8d0010014bd701119191981c98111981c9ba800833039375000a66072607400297ae033039303a303b0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605800312323303c374e002660786ea40092f5c065300100180252f5c080088896600200510018cc00400e60800053303e303f002001400c81ea246530010059981e181e8008024c02400e6eb8c0f4c0f80050054c004c8cc0f0dd419bca4a06eb8c0f4004cc0f0c0f4c0f80052f5c0b30013017371a00313303b37526024002660766ea4cc054c050dc6800800a5eb822c81ba446607a0046607a6ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11000a60586608660880106608698103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a80004bd70200222259800801440063300100398238014c8c966002607200313230313304830490013304830313304830493046375400697ae0304a304a00130453754007159800981f000c4c8c8c0c8cc124c128008cc124c128004cc124c0c8cc124c128c11cdd500225eb80c12cc12c004c128004c114dd5001c566002606c003132323230333304a304b0033304a304b0023304a304b0013304a30333304a304b3048375400a97ae0304c304c001304b001304a001304537540071598009805000c4c8c8c8c8c0d0cc12cc130010cc12cc13000ccc12cc130008cc12cc130004cc12cc0d0cc12cc130c124dd500325eb80c134c134004c130004c12c004c128004c114dd5001c56600260120031323232323230353304c304d0053304c304d0043304c304d0033304c304d0023304c304d0013304c30353304c304d304a375400e97ae0304e304e001304d001304c001304b001304a0013045375400715980099b87480280062646464646464606c6609a609c00c6609a609c00a6609a609c0086609a609c0066609a609c0046609a609c0026609a606c6609a609c60966ea80212f5c0609e609e002609c002609a002609800260960026094002608a6ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc138c13c01ccc138c13c018cc138c13c014cc138c13c010cc138c13c00ccc138c13c008cc138c13c004cc138c0dccc138c13cc130dd5004a5eb80c140c140004c13c004c138004c134004c130004c12c004c128004c114dd5001c56600266e1d200e00189919191919191919181c19827982800419827982800399827982800319827982800299827982800219827982800199827982800119827982800099827981c19827982818269baa00a4bd7018289828800982800098278009827000982680098260009825800982500098229baa0038acc004cdc3a402000313232323232323232323039330503051009330503051008330503051007330503051006330503051005330503051004330503051003330503051002330503051001330503039330503051304e375401697ae03052305200130510013050001304f001304e001304d001304c001304b001304a0013045375400715980099b87480480062646464646464646464646074660a260a4014660a260a4012660a260a4010660a260a400e660a260a400c660a260a400a660a260a4008660a260a4006660a260a4004660a260a4002660a26074660a260a4609e6ea80312f5c060a660a600260a400260a200260a0002609e002609c002609a002609800260960026094002608a6ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc148c14c02ccc148c14c028cc148c14c024cc148c14c020cc148c14c01ccc148c14c018cc148c14c014cc148c14c010cc148c14c00ccc148c14c008cc148c14c004cc148c0eccc148c14cc140dd5006a5eb80c150c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c128004c114dd5001c56600266e1d20160018991919191919191919191919181e19829982a00619829982a00599829982a00519829982a00499829982a00419829982a00399829982a00319829982a00299829982a00219829982a00199829982a00119829982a00099829981e19829982a18289baa00e4bd70182a982a800982a000982980098290009828800982800098278009827000982680098260009825800982500098229baa0038991919191919191919191919181e19829982a00619829982a00599829982a00519829982a00499829982a00419829982a00399829982a00319829982a00299829982a00219829982a00199829982a00119829982a00099829982a182a80099829981e19829982a18289baa00e4bd7025eb80c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c128004c114dd5001a086410c82190432086410c82190432086410c821904318219baa0013046002400c8220dd718219822000991acc004c08400a2653001001a5eb82006800888966002606e003123233047374e0026608e6ea40092f5c065300100180252f5c080088896600200510018cc00400e609600533049304a002001400c8242246530010059982398240008024c05000e6eb8c120c1240050051802800a0828b207c375c60866088006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241051598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41048208dc4000c888c8cc118c00cdd698238009982318239824000a5eb80c00c006660846ea0cdc7000a4000660846ea4cc040c03cdc6800800a5eb8122232329800919802919198251ba833794940dd718258009982518259826000a5eb816600260386e340062660926ea4c064004cc124dd49980d980d1b8d0010014bd704590451191801acc004c0f0006298103d87a800089819998251ba80014bd70208c30030019bad3048003911191acc0066002607a6eb4c13000694294504744cc02000c8c014c0d4cc130dd4000a5eb822601e600898103d87a8000411c6eb8c130c134004cc128dd419b8e00148000cc128dd49980c180b9b8d0010014bd7024446b3001303c002898019181a19825800a5eb822b3001304100289801919ba548008cc12c0052f5c1159800981c80144c00c8cdd2a40086609600297ae08acc004c03400a26600e464660986ea0cde5250375c609a00266098609a609c00297ae059800981c9b8d0018998259ba930230013304b37526605260506e340040052f5c116411c466e9520063304b375000297ae08acc004c03000a26600e464660986ea0cde5250375c609a00266098609a609c00297ae059800981c9b8d0018998259ba930230013304b37526605260506e340040052f5c116411c466e9520083304b3750b3001337100029040400244006266e04004c0192020411c97ae08acc004cdc3a40140051300323374a900519825800a5eb822b30013370e900600144cc0048cdd2a40186609600297ae02323304c3750600c6eb4c134004cc130c134c1380052f5c064660986ea0cde5250375c609a00266098609a609c00297ae059800980f1b8d0018998259ba9301b0013304b37526603a60386e340040052f5c116411d15980099b874803800a266002466e95200e3304b0014bd70119198261ba833794940dd718268009982618269827000a5eb8166002603c6e340062660966ea4c06c004cc12cdd49980e980e1b8d0010014bd70459047456600266e1d2010002899800919ba548040cc12c0052f5c0464660986ea0cde5250375c609a00266098609a609c00297ae059800980f1b8d0018998259ba9301b0013304b37526603a60386e340040052f5c116411d15980099b874804800a2464646609a66e9520123304d304e0014bd701982698271827800a5eb80c004008cc0208c8cc134dd419bca4a06eb8c138004cc134c138c13c0052f5c0b3001303a371a00313304c37526048002660986ea4cc0a8c0a4dc6800800a5eb822c8240966002607c00314c103d87980008acc004c10c006298103d87a80008acc004c0ec006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20904120824104820908acc004cdc3a40280051300323374a900a19825800a5eb822b30013370e900b00144c00c8cdd2a402c6609600297ae08acc004cdc3a403000513300123374a900c19825800a5eb808c8cc130dd419bca4a06eb8c134004cc130c134c1380052f5c0b3001301e371a00313304b37526036002660966ea4cc074c070dc6800800a5eb822c823a2c8231046208c41188231046208c41188231046208c41188230dd718259826003096600266e2000520808080808080808080028800c4cdc0800980124100028218c00c00c6eb4c104004c8cc100dd419b8e00148000cc100dd49980718069b8d0010014bd701bae30403041004206c8b2066371890011b80480051640a06eb8c0b4c0b800566002600e6e340062660566ea4c008004cc0acdd49980298021b8d0010014bd704590271bae3015302837546602e4646b30013371e6eb8c0b400522104b9011a82008919191919191919911981a980f1981a981b0039981a9ba90013303530360024bd701981a981b181b80125eb80d660026024003125980099b89002371a00313303437526601e004002660686ea66002005337026e3400400a002b8c25eb822c81822c8178dd7181a181a8011bae3034004375a606600264660646ea0cde5250375c6066002660646066606800297ae059800980f9b8d0018998189ba930090013303137526601e601c6e340040052f5c11640b46eb8c0c4c0c8004d6600294624b30013371290201b8d0018998181ba93300b48100004cc0c0dd4cc005204099b80371a002901fc0057184bd7045902c45902b1bae30303031001300100259800a51892cc004cdc4a4100026e3400626605c6ea4cc0252080010013302e37533001482000666e00dc6800a40ff0015c612f5c11640a91640a51640a06eb8c0b4c0b800566002600e6e340062660566ea4c008004cc0acdd49980298021b8d0010014bd704590271bae302b00a300348010c00d2008198010011811800a040899180118110019bae302000240786eb0c074c068dd5000c5901819199119801001000912cc004006298103d87a80008992cc004cdd7802180e000c4c020cc07cc0740052f5c11330030033021002406c603e00280e8dd5980e980f180f180f180f180f180f180f180f180f180d1baa0123374a90021980d99ba548008cc06cc070c074c074c074c064dd5180e180c9baa0014bd7025eb822c80b8c8cc004004dd61805980c9baa0112259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a5140651001899801801980f8012032325980099912cc00400a2942265300132598009809980f1baa00189bad301f302237566044603e6ea800629000203a30210019baf302130220019bab003488966002003159800980100344cc01400d20008a50407d1325980099baf30210014c010140008acc004cc018010dd6981118129bab3022001898019ba630260028a5040811598009980300224001130030078a5040808100c0900050220ca600200337566020603c6ea8c040c078dd5002488cc088008cc088dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0800066eacc084006604a0069112cc004cdc8a441000038acc004cdc7a441000038998029807998131ba60024bd70000c4cc015300103d87a8000006408919800803c006446600e0046605066ec0dd48029ba6004001401c81106046004810a2942294229410221ba63301d337606ea401cdd31980e99bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602860346ea8c078c06cdd5180f180d9baa300d301b3754003132598009806980d9baa0018992cc004c044c070dd5000c4c8c8c8c8cc8966002604e00713259800980c18119baa0018991919194c004dd69815800cdd718158024dd69815801cdd7181580124444b3001303000589980d1bab302f00e225980080144cc07003089660020051301b330320144bd7044c8c8cc06cc0c40084c00cc0d8010dd7181880098198012062899191980c981800109801981a0021bae302e001303100240bd1640b4302b001302a001302900130243754003164088604c00d1640906eb8c090004dd59812001181200098118009811000980e9baa0018b2036301f301c3754003164068601060366ea8c034c06cdd5000c590194530103d87a80004064603a00280d8dd69805180c1baa01f22598009806980c1baa00289919192cc004c08000a26600c603e00626600c002009164074603c002603c00260326ea800a2c80b889660026018602e6ea800a2646464b3001301f002899192cc004c0440062b3001301d37540050068b203c8acc004c05800626464b300130230028044590201bad3021001301d37540051598009807000c566002603a6ea800a00d16407916406c80d901b180d9baa001301e0038b20383259800980d800c56600260166034003168980a180d000a0328b20383754603a002603a00260306ea800a2c80b113371090001bad30113012301230123012300e375400314a08062294100c180818069baa0028b201618049baa0038b200e180400098019baa0098a4d1365640041", + "hash": "fb99d7b4369fa4e67a69fb162e423eadf3eb10ef7dfebc757c2d96b2" }, { "title": "close_position.close_position.else", @@ -45,12 +45,12 @@ { "title": "config", "schema": { - "$ref": "#/definitions/lazer_perps~1types~1PerpsConfig" + "$ref": "#/definitions/lazer_perps~1types~1MarketConfig" } } ], - "compiledCode": "591619010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd500144c9660026466446600400400244b30010018a508acc004cdc79bae30140010038a51899801001180a800a01e40486eb0c048c04cc04cc04cc04cc04cc04cc04cc04cc03cdd50039bae3011300e375400313371090001bad30119800918091809800cdc3a400937129002488c96600266e3d22100375c6028602a003130140018b201e30020019119198008008019119801800980100148c048c04cc04c0066eb8c044c038dd500acdd2a400091111111191919912cc004c07800a264b3001300f301a375400313232598009808980e1baa0018992cc004c048c074dd5000c4c9660026026603c6ea80062660426044603e6ea8008cc084c088c07cdd5000a5eb822c80e8c084c088c088c088c088c088c078dd5001c5901c1810180e9baa0018b2036300e301c3754002603c60366ea80062c80c8c8cc004004dd61804180d9baa301e0032259800800c530103d87a80008992cc004cdc39bad3020301d3754002009130083301f0014bd7044cc00c00cc08400901b180f800a03a8b203632598009806980c1baa0018992cc004c038c064dd5000c4c8cc0240048966002005132330010010042259800800c52f5c113302198009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301723235980099b8f375c605a0029110475d3c793008cc004888c8cc00cdd698188009bae3031303200130030019b89480426e3120109b804803e600e90082444446600a464660666ea0cde5250375c6068002660666068606a00297ae05980098029b8d0018998191ba930020013303237526600860066e340040052f5c11640b8466446601046606a6ea0cdc7000a40006606a6ea4cc00cc008dc6800800a5eb808cc0248cc0d8dd419b8e00148000cc0d8dd49980218019b8d0010014bd701119191981c98111981c9ba800833039375000a66072607400297ae033039303a303b0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605800312323303c374e002660786ea40092f5c065300100180252f5c080088896600200510018cc00400e60800053303e303f002001400c81ea246530010059981e181e8008024c02400e6eb8c0f4c0f80050054c004c8cc0f0dd419bca4a06eb8c0f4004cc0f0c0f4c0f80052f5c0b30013017371a00313303b37526024002660766ea4cc054c050dc6800800a5eb822c81ba446607a0046607a6ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11000a60586608660880106608698103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a80004bd70200222259800801440063300100398238014c8c966002607200313230313304830490013304830313304830493046375400697ae0304a304a00130453754007159800981f000c4c8c8c0c8cc124c128008cc124c128004cc124c0c8cc124c128c11cdd500225eb80c12cc12c004c128004c114dd5001c566002606c003132323230333304a304b0033304a304b0023304a304b0013304a30333304a304b3048375400a97ae0304c304c001304b001304a001304537540071598009805000c4c8c8c8c8c0d0cc12cc130010cc12cc13000ccc12cc130008cc12cc130004cc12cc0d0cc12cc130c124dd500325eb80c134c134004c130004c12c004c128004c114dd5001c56600260120031323232323230353304c304d0053304c304d0043304c304d0033304c304d0023304c304d0013304c30353304c304d304a375400e97ae0304e304e001304d001304c001304b001304a0013045375400715980099b87480280062646464646464606c6609a609c00c6609a609c00a6609a609c0086609a609c0066609a609c0046609a609c0026609a606c6609a609c60966ea80212f5c0609e609e002609c002609a002609800260960026094002608a6ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc138c13c01ccc138c13c018cc138c13c014cc138c13c010cc138c13c00ccc138c13c008cc138c13c004cc138c0dccc138c13cc130dd5004a5eb80c140c140004c13c004c138004c134004c130004c12c004c128004c114dd5001c56600266e1d200e00189919191919191919181c19827982800419827982800399827982800319827982800299827982800219827982800199827982800119827982800099827981c19827982818269baa00a4bd7018289828800982800098278009827000982680098260009825800982500098229baa0038acc004cdc3a402000313232323232323232323039330503051009330503051008330503051007330503051006330503051005330503051004330503051003330503051002330503051001330503039330503051304e375401697ae03052305200130510013050001304f001304e001304d001304c001304b001304a0013045375400715980099b87480480062646464646464646464646074660a260a4014660a260a4012660a260a4010660a260a400e660a260a400c660a260a400a660a260a4008660a260a4006660a260a4004660a260a4002660a26074660a260a4609e6ea80312f5c060a660a600260a400260a200260a0002609e002609c002609a002609800260960026094002608a6ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc148c14c02ccc148c14c028cc148c14c024cc148c14c020cc148c14c01ccc148c14c018cc148c14c014cc148c14c010cc148c14c00ccc148c14c008cc148c14c004cc148c0eccc148c14cc140dd5006a5eb80c150c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c128004c114dd5001c56600266e1d20160018991919191919191919191919181e19829982a00619829982a00599829982a00519829982a00499829982a00419829982a00399829982a00319829982a00299829982a00219829982a00199829982a00119829982a00099829981e19829982a18289baa00e4bd70182a982a800982a000982980098290009828800982800098278009827000982680098260009825800982500098229baa0038991919191919191919191919181e19829982a00619829982a00599829982a00519829982a00499829982a00419829982a00399829982a00319829982a00299829982a00219829982a00199829982a00119829982a00099829982a182a80099829981e19829982a18289baa00e4bd7025eb80c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c128004c114dd5001a086410c82190432086410c82190432086410c821904318219baa0013046002400c8220dd718219822000991acc004c08400a2653001001a5eb82006800888966002606e003123233047374e0026608e6ea40092f5c065300100180252f5c080088896600200510018cc00400e609600533049304a002001400c8242246530010059982398240008024c05000e6eb8c120c1240050051802800a0828b207c375c60866088006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241051598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41048208dc4000c888c8cc118c00cdd698238009982318239824000a5eb80c00c006660846ea0cdc7000a4000660846ea4cc040c03cdc6800800a5eb8122232329800919802919198251ba833794940dd718258009982518259826000a5eb816600260386e340062660926ea4c064004cc124dd49980d980d1b8d0010014bd704590451191801acc004c0f0006298103d87a800089819998251ba80014bd70208c30030019bad3048003911191acc0066002607a6eb4c13000694294504744cc02000c8c014c0d4cc130dd4000a5eb822601e600898103d87a8000411c6eb8c130c134004cc128dd419b8e00148000cc128dd49980c180b9b8d0010014bd7024446b3001303c002898019181a19825800a5eb822b3001304100289801919ba548008cc12c0052f5c1159800981c80144c00c8cdd2a40086609600297ae08acc004c03400a26600e464660986ea0cde5250375c609a00266098609a609c00297ae059800981c9b8d0018998259ba930230013304b37526605260506e340040052f5c116411c466e9520063304b375000297ae08acc004c03000a26600e464660986ea0cde5250375c609a00266098609a609c00297ae059800981c9b8d0018998259ba930230013304b37526605260506e340040052f5c116411c466e9520083304b3750b3001337100029040400244006266e04004c0192020411c97ae08acc004cdc3a40140051300323374a900519825800a5eb822b30013370e900600144cc0048cdd2a40186609600297ae02323304c3750600c6eb4c134004cc130c134c1380052f5c064660986ea0cde5250375c609a00266098609a609c00297ae059800980f1b8d0018998259ba9301b0013304b37526603a60386e340040052f5c116411d15980099b874803800a266002466e95200e3304b0014bd70119198261ba833794940dd718268009982618269827000a5eb8166002603c6e340062660966ea4c06c004cc12cdd49980e980e1b8d0010014bd70459047456600266e1d2010002899800919ba548040cc12c0052f5c0464660986ea0cde5250375c609a00266098609a609c00297ae059800980f1b8d0018998259ba9301b0013304b37526603a60386e340040052f5c116411d15980099b874804800a2464646609a66e9520123304d304e0014bd701982698271827800a5eb80c004008cc0208c8cc134dd419bca4a06eb8c138004cc134c138c13c0052f5c0b3001303a371a00313304c37526048002660986ea4cc0a8c0a4dc6800800a5eb822c8240966002607c00314c103d87980008acc004c10c006298103d87a80008acc004c0ec006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20904120824104820908acc004cdc3a40280051300323374a900a19825800a5eb822b30013370e900b00144c00c8cdd2a402c6609600297ae08acc004cdc3a403000513300123374a900c19825800a5eb808c8cc130dd419bca4a06eb8c134004cc130c134c1380052f5c0b3001301e371a00313304b37526036002660966ea4cc074c070dc6800800a5eb822c823a2c8231046208c41188231046208c41188231046208c41188230dd718259826003096600266e2000520808080808080808080028800c4cdc0800980124100028218c00c00c6eb4c104004c8cc100dd419b8e00148000cc100dd49980718069b8d0010014bd701bae30403041004206c8b2066371890011b80480051640a06eb8c0b4c0b800566002600e6e340062660566ea4c008004cc0acdd49980298021b8d0010014bd704590271bae3015302837546602e4646b30013371e6eb8c0b400522104b9011a82008919191919191919911981a980f1981a981b0039981a9ba90013303530360024bd701981a981b181b80125eb80d660026024003125980099b89002371a00313303437526601e004002660686ea66002005337026e3400400a002b8c25eb822c81822c8178dd7181a181a8011bae3034004375a606600264660646ea0cde5250375c6066002660646066606800297ae059800980f9b8d0018998189ba930090013303137526601e601c6e340040052f5c11640b46eb8c0c4c0c8004d6600294624b30013371290201b8d0018998181ba93300b48100004cc0c0dd4cc005204099b80371a002901fc0057184bd7045902c45902b1bae30303031001300100259800a51892cc004cdc4a4100026e3400626605c6ea4cc0252080010013302e37533001482000666e00dc6800a40ff0015c612f5c11640a91640a51640a06eb8c0b4c0b800566002600e6e340062660566ea4c008004cc0acdd49980298021b8d0010014bd704590271bae302b00a300348010c00d2008198010011811800a040899180118110019bae302000240786eb0c074c068dd5000c5901819199119801001000912cc004006298103d87a80008992cc004cdd7802180e000c4c020cc07cc0740052f5c11330030033021002406c603e00280e8dd5980e980f180f180f180f180f180f180f180f180f180d1baa0123374a90021980d99ba548008cc06cc070c074c074c074c064dd5180e180c9baa0014bd7025eb822c80b8c8cc004004dd61805980c9baa0112259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a5140651001899801801980f8012032325980099912cc00400a2942265300132598009809980f1baa00189bad301f302237566044603e6ea800629000203a30210019baf302130220019bab003488966002003159800980100344cc01400d20008a50407d1325980099baf30210014c010140008acc004cc018010dd6981118129bab3022001898019ba630260028a5040811598009980300224001130030078a5040808100c0900050220ca600200337566020603c6ea8c040c078dd5002488cc088008cc088dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0800066eacc084006604a0069112cc004cdc8a441000038acc004cdc7a441000038998029807998131ba60024bd70000c4cc015300103d87a8000006408919800803c006446600e0046605066ec0dd48029ba6004001401c81106046004810a2942294229410221ba63301d337606ea401cdd31980e99bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602860346ea8c078c06cdd5180f180d9baa300d301b3754003132598009806980d9baa0018992cc004c044c070dd5000c4c8c8c8c8cc8966002604e00713259800980c18119baa0018991919194c004dd69815800cdd718158024dd69815801cdd7181580124444b3001303000589980d1bab302f00e225980080144cc07003089660020051301b330320144bd7044c8c8cc06cc0c40084c00cc0d8010dd7181880098198012062899191980c981800109801981a0021bae302e001303100240bd1640b4302b001302a001302900130243754003164088604c00d1640906eb8c090004dd59812001181200098118009811000980e9baa0018b2036301f301c3754003164068601060366ea8c034c06cdd5000c590194530103d87a80004064603a00280d8dd69805180c1baa00b22598009806980c1baa00289919192cc004c08000a26600c603e00626600c002009164074603c002603c00260326ea800a2c80b889660026018602e6ea800a2646464b3001301f002899192cc004c0440062b3001301d37540050068b203c8acc004c05800626464b300130230028044590201bad3021001301d37540051598009807000c566002603a6ea800a00d16407916406c80d901b180d9baa001301e0038b20383259800980d800c56600260166034003168980a180d000a0328b20383754603a002603a00260306ea800a2c80b114a08060c040c034dd500145900b0c024dd5001c590070c020004c00cdd5004c52689b2b200201", - "hash": "c94365b1ef0ee2167a37c6751e17bb70aa297a7a5e9baed56f2fcc3a" + "compiledCode": "591636010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd500144c9660026466446600400400244b30010018a508acc004cdc79bae30140010038a51899801001180a800a01e40486eb0c048c04cc04cc04cc04cc04cc04cc04cc04cc03cdd50039bae3011300e375400315980099b8848000dd69808cc0048c048c04c0066e1d20049b89480124464b30013371e910100375c6028602a003130140018b201e30020019119198008008019119801800980100148c048c04cc04c0066eb8c044c038dd500acdd2a400091111111191919912cc004c07800a264b3001300f301a375400313232598009808980e1baa0018992cc004c048c074dd5000c4c9660026026603c6ea80062660426044603e6ea8008cc084c088c07cdd5000a5eb822c80e8c084c088c088c088c088c088c078dd5001c5901c1810180e9baa0018b2036300e301c3754002603c60366ea80062c80c8c8cc004004dd61804180d9baa301e0032259800800c530103d87a80008992cc004cdc39bad3020301d3754002009130083301f0014bd7044cc00c00cc08400901b180f800a03a8b203632598009806980c1baa0018992cc004c038c064dd5000c4c8cc0240048966002005132330010010042259800800c52f5c113302198009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301723235980099b8f375c605a0029110475d3c793008cc004888c8cc00cdd698188009bae3031303200130030019b89480426e3120109b804803e600e90082444446600a464660666ea0cde5250375c6068002660666068606a00297ae05980098029b8d0018998191ba930020013303237526600860066e340040052f5c11640b8466446601046606a6ea0cdc7000a40006606a6ea4cc00cc008dc6800800a5eb808cc0248cc0d8dd419b8e00148000cc0d8dd49980218019b8d0010014bd701119191981c98111981c9ba800833039375000a66072607400297ae033039303a303b0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605800312323303c374e002660786ea40092f5c065300100180252f5c080088896600200510018cc00400e60800053303e303f002001400c81ea246530010059981e181e8008024c02400e6eb8c0f4c0f80050054c004c8cc0f0dd419bca4a06eb8c0f4004cc0f0c0f4c0f80052f5c0b30013017371a00313303b37526024002660766ea4cc054c050dc6800800a5eb822c81ba446607a0046607a6ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11000a60586608660880106608698103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a80004bd70200222259800801440063300100398238014c8c966002607200313230313304830490013304830313304830493046375400697ae0304a304a00130453754007159800981f000c4c8c8c0c8cc124c128008cc124c128004cc124c0c8cc124c128c11cdd500225eb80c12cc12c004c128004c114dd5001c566002606c003132323230333304a304b0033304a304b0023304a304b0013304a30333304a304b3048375400a97ae0304c304c001304b001304a001304537540071598009805000c4c8c8c8c8c0d0cc12cc130010cc12cc13000ccc12cc130008cc12cc130004cc12cc0d0cc12cc130c124dd500325eb80c134c134004c130004c12c004c128004c114dd5001c56600260120031323232323230353304c304d0053304c304d0043304c304d0033304c304d0023304c304d0013304c30353304c304d304a375400e97ae0304e304e001304d001304c001304b001304a0013045375400715980099b87480280062646464646464606c6609a609c00c6609a609c00a6609a609c0086609a609c0066609a609c0046609a609c0026609a606c6609a609c60966ea80212f5c0609e609e002609c002609a002609800260960026094002608a6ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc138c13c01ccc138c13c018cc138c13c014cc138c13c010cc138c13c00ccc138c13c008cc138c13c004cc138c0dccc138c13cc130dd5004a5eb80c140c140004c13c004c138004c134004c130004c12c004c128004c114dd5001c56600266e1d200e00189919191919191919181c19827982800419827982800399827982800319827982800299827982800219827982800199827982800119827982800099827981c19827982818269baa00a4bd7018289828800982800098278009827000982680098260009825800982500098229baa0038acc004cdc3a402000313232323232323232323039330503051009330503051008330503051007330503051006330503051005330503051004330503051003330503051002330503051001330503039330503051304e375401697ae03052305200130510013050001304f001304e001304d001304c001304b001304a0013045375400715980099b87480480062646464646464646464646074660a260a4014660a260a4012660a260a4010660a260a400e660a260a400c660a260a400a660a260a4008660a260a4006660a260a4004660a260a4002660a26074660a260a4609e6ea80312f5c060a660a600260a400260a200260a0002609e002609c002609a002609800260960026094002608a6ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc148c14c02ccc148c14c028cc148c14c024cc148c14c020cc148c14c01ccc148c14c018cc148c14c014cc148c14c010cc148c14c00ccc148c14c008cc148c14c004cc148c0eccc148c14cc140dd5006a5eb80c150c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c128004c114dd5001c56600266e1d20160018991919191919191919191919181e19829982a00619829982a00599829982a00519829982a00499829982a00419829982a00399829982a00319829982a00299829982a00219829982a00199829982a00119829982a00099829981e19829982a18289baa00e4bd70182a982a800982a000982980098290009828800982800098278009827000982680098260009825800982500098229baa0038991919191919191919191919181e19829982a00619829982a00599829982a00519829982a00499829982a00419829982a00399829982a00319829982a00299829982a00219829982a00199829982a00119829982a00099829982a182a80099829981e19829982a18289baa00e4bd7025eb80c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c128004c114dd5001a086410c82190432086410c82190432086410c821904318219baa0013046002400c8220dd718219822000991acc004c08400a2653001001a5eb82006800888966002606e003123233047374e0026608e6ea40092f5c065300100180252f5c080088896600200510018cc00400e609600533049304a002001400c8242246530010059982398240008024c05000e6eb8c120c1240050051802800a0828b207c375c60866088006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241051598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41048208dc4000c888c8cc118c00cdd698238009982318239824000a5eb80c00c006660846ea0cdc7000a4000660846ea4cc040c03cdc6800800a5eb8122232329800919802919198251ba833794940dd718258009982518259826000a5eb816600260386e340062660926ea4c064004cc124dd49980d980d1b8d0010014bd704590451191801acc004c0f0006298103d87a800089819998251ba80014bd70208c30030019bad3048003911191acc0066002607a6eb4c13000694294504744cc02000c8c014c0d4cc130dd4000a5eb822601e600898103d87a8000411c6eb8c130c134004cc128dd419b8e00148000cc128dd49980c180b9b8d0010014bd7024446b3001303c002898019181a19825800a5eb822b3001304100289801919ba548008cc12c0052f5c1159800981c80144c00c8cdd2a40086609600297ae08acc004c03400a26600e464660986ea0cde5250375c609a00266098609a609c00297ae059800981c9b8d0018998259ba930230013304b37526605260506e340040052f5c116411c466e9520063304b375000297ae08acc004c03000a26600e464660986ea0cde5250375c609a00266098609a609c00297ae059800981c9b8d0018998259ba930230013304b37526605260506e340040052f5c116411c466e9520083304b3750b3001337100029040400244006266e04004c0192020411c97ae08acc004cdc3a40140051300323374a900519825800a5eb822b30013370e900600144cc0048cdd2a40186609600297ae02323304c3750600c6eb4c134004cc130c134c1380052f5c064660986ea0cde5250375c609a00266098609a609c00297ae059800980f1b8d0018998259ba9301b0013304b37526603a60386e340040052f5c116411d15980099b874803800a266002466e95200e3304b0014bd70119198261ba833794940dd718268009982618269827000a5eb8166002603c6e340062660966ea4c06c004cc12cdd49980e980e1b8d0010014bd70459047456600266e1d2010002899800919ba548040cc12c0052f5c0464660986ea0cde5250375c609a00266098609a609c00297ae059800980f1b8d0018998259ba9301b0013304b37526603a60386e340040052f5c116411d15980099b874804800a2464646609a66e9520123304d304e0014bd701982698271827800a5eb80c004008cc0208c8cc134dd419bca4a06eb8c138004cc134c138c13c0052f5c0b3001303a371a00313304c37526048002660986ea4cc0a8c0a4dc6800800a5eb822c8240966002607c00314c103d87980008acc004c10c006298103d87a80008acc004c0ec006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20904120824104820908acc004cdc3a40280051300323374a900a19825800a5eb822b30013370e900b00144c00c8cdd2a402c6609600297ae08acc004cdc3a403000513300123374a900c19825800a5eb808c8cc130dd419bca4a06eb8c134004cc130c134c1380052f5c0b3001301e371a00313304b37526036002660966ea4cc074c070dc6800800a5eb822c823a2c8231046208c41188231046208c41188231046208c41188230dd718259826003096600266e2000520808080808080808080028800c4cdc0800980124100028218c00c00c6eb4c104004c8cc100dd419b8e00148000cc100dd49980718069b8d0010014bd701bae30403041004206c8b2066371890011b80480051640a06eb8c0b4c0b800566002600e6e340062660566ea4c008004cc0acdd49980298021b8d0010014bd704590271bae3015302837546602e4646b30013371e6eb8c0b400522104b9011a82008919191919191919911981a980f1981a981b0039981a9ba90013303530360024bd701981a981b181b80125eb80d660026024003125980099b89002371a00313303437526601e004002660686ea66002005337026e3400400a002b8c25eb822c81822c8178dd7181a181a8011bae3034004375a606600264660646ea0cde5250375c6066002660646066606800297ae059800980f9b8d0018998189ba930090013303137526601e601c6e340040052f5c11640b46eb8c0c4c0c8004d6600294624b30013371290201b8d0018998181ba93300b48100004cc0c0dd4cc005204099b80371a002901fc0057184bd7045902c45902b1bae30303031001300100259800a51892cc004cdc4a4100026e3400626605c6ea4cc0252080010013302e37533001482000666e00dc6800a40ff0015c612f5c11640a91640a51640a06eb8c0b4c0b800566002600e6e340062660566ea4c008004cc0acdd49980298021b8d0010014bd704590271bae302b00a300348010c00d2008198010011811800a040899180118110019bae302000240786eb0c074c068dd5000c5901819199119801001000912cc004006298103d87a80008992cc004cdd7802180e000c4c020cc07cc0740052f5c11330030033021002406c603e00280e8dd5980e980f180f180f180f180f180f180f180f180f180d1baa0123374a90021980d99ba548008cc06cc070c074c074c074c064dd5180e180c9baa0014bd7025eb822c80b8c8cc004004dd61805980c9baa0112259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a5140651001899801801980f8012032325980099912cc00400a2942265300132598009809980f1baa00189bad301f302237566044603e6ea800629000203a30210019baf302130220019bab003488966002003159800980100344cc01400d20008a50407d1325980099baf30210014c010140008acc004cc018010dd6981118129bab3022001898019ba630260028a5040811598009980300224001130030078a5040808100c0900050220ca600200337566020603c6ea8c040c078dd5002488cc088008cc088dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0800066eacc084006604a0069112cc004cdc8a441000038acc004cdc7a441000038998029807998131ba60024bd70000c4cc015300103d87a8000006408919800803c006446600e0046605066ec0dd48029ba6004001401c81106046004810a2942294229410221ba63301d337606ea401cdd31980e99bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602860346ea8c078c06cdd5180f180d9baa300d301b3754003132598009806980d9baa0018992cc004c044c070dd5000c4c8c8c8c8cc8966002604e00713259800980c18119baa0018991919194c004dd69815800cdd718158024dd69815801cdd7181580124444b3001303000589980d1bab302f00e225980080144cc07003089660020051301b330320144bd7044c8c8cc06cc0c40084c00cc0d8010dd7181880098198012062899191980c981800109801981a0021bae302e001303100240bd1640b4302b001302a001302900130243754003164088604c00d1640906eb8c090004dd59812001181200098118009811000980e9baa0018b2036301f301c3754003164068601060366ea8c034c06cdd5000c590194530103d87a80004064603a00280d8dd69805180c1baa01f22598009806980c1baa00289919192cc004c08000a26600c603e00626600c002009164074603c002603c00260326ea800a2c80b889660026018602e6ea800a2646464b3001301f002899192cc004c0440062b3001301d37540050068b203c8acc004c05800626464b300130230028044590201bad3021001301d37540051598009807000c566002603a6ea800a00d16407916406c80d901b180d9baa001301e0038b20383259800980d800c56600260166034003168980a180d000a0328b20383754603a002603a00260306ea800a2c80b113371090001bad30113012301230123012300e375400314a08062294100c180818069baa0028b201618049baa0038b200e180400098019baa0098a4d1365640041", + "hash": "fb99d7b4369fa4e67a69fb162e423eadf3eb10ef7dfebc757c2d96b2" }, { "title": "liquidate.liquidate.spend", @@ -70,12 +70,12 @@ { "title": "config", "schema": { - "$ref": "#/definitions/lazer_perps~1types~1PerpsConfig" + "$ref": "#/definitions/lazer_perps~1types~1MarketConfig" } } ], - "compiledCode": "5917a8010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a4602260246024003230113012301230123012301200191808980918091809000cdd2a4000911111919912cc004c024c050dd500144cdd7999119912cc004cdc4001000c5300103d87980008acc004cdc40008014530103d87b80008a6103d87a8000405c80b8cdc11bad301a002375a6034603600266e08dd6980d0009bad301a301b002301537546644600c660326ea0cdc11bad301a002375a6034002660326ea0cdc11bad301a301b002375a6034603600297ae030153754664466446010660366ea0cdc019b82375a603800800266e08dd6980e0018011980d9ba83370400400297ae0375a603460360046eb4c068c06c004c054dd518009bad300530153754010602a6eaa6002600e602a6ea80226eb4c060c064c064c064c064c054dd50044dd69803180a9baa0089bad301898009180c980d000cdc3a400937129002488c96600266e3d220100375c603660380031301b0018b202c3002001911919800800801911980180098010014dd7180c180a9baa01c4888888c8c8cc8966002604600513259800980a180f9baa001899192cc004c058c084dd5000c4c966002602e60446ea8006264b30013018302337540031330263027302437540046604c604e60486ea80052f5c1164088602860466ea800e2c8108c094c088dd5000c59020180618109baa00130233020375400316407864660020026eb0c048c080dd51811801912cc0040062980103d87a80008992cc004cdc39bad30253022375400200913011330240014bd7044cc00c00cc0980090201812000a0448b204032598009809180e9baa0018992cc004c04cc078dd5000c4c8cc01c0048966002005132330010010042259800800c52f5c113302698009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301523235980099b8f375c60640029110475d3c793008cc004888c8cc00cdd6981b0009bae3036303700130030019b89480426e3120109b804803e600e90082444446600a464660706ea0cde5250375c6072002660706072607400297ae05980098029b8d00189981b9ba930020013303737526600860066e340040052f5c11640cc46644660104660746ea0cdc7000a4000660746ea4cc00cc008dc6800800a5eb808cc0248cc0ecdd419b8e00148000cc0ecdd49980218019b8d0010014bd701119191981f18159981f1ba80083303e375000a6607c607e00297ae03303e303f30400014bd7018008012cc004c05800a2653001001a5eb820068008889660026062003123233041374e002660826ea40092f5c065300100180252f5c080088896600200510018cc00400e608a005330433044002001400c8212246530010059982098210008024c02400e6eb8c108c10c0050054c004c8cc104dd419bca4a06eb8c108004cc104c108c10c0052f5c0b30013017371a00313304037526024002660806ea4cc054c050dc6800800a5eb822c81e24466084004660846ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c12400a606a6609060920106609098103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a80004bd70200222259800801440063300100398260014c8c966002607c003132303a3304d304e0013304d303a3304d304e304b375400697ae0304f304f001304a37540071598009821800c4c8c8c0eccc138c13c008cc138c13c004cc138c0eccc138c13cc130dd500225eb80c140c140004c13c004c128dd5001c56600260680031323232303c3304f30500033304f30500023304f30500013304f303c3304f3050304d375400a97ae0305130510013050001304f001304a37540071598009805000c4c8c8c8c8c0f4cc140c144010cc140c14400ccc140c144008cc140c144004cc140c0f4cc140c144c138dd500325eb80c148c148004c144004c140004c13c004c128dd5001c566002601200313232323232303e33051305200533051305200433051305200333051305200233051305200133051303e330513052304f375400e97ae030533053001305200130510013050001304f001304a375400715980099b87480280062646464646464607e660a460a600c660a460a600a660a460a6008660a460a6006660a460a6004660a460a6002660a4607e660a460a660a06ea80212f5c060a860a800260a600260a400260a200260a0002609e00260946ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c100cc14cc15001ccc14cc150018cc14cc150014cc14cc150010cc14cc15000ccc14cc150008cc14cc150004cc14cc100cc14cc150c144dd5004a5eb80c154c154004c150004c14c004c148004c144004c140004c13c004c128dd5001c56600266e1d200e0018991919191919191918209982a182a8041982a182a8039982a182a8031982a182a8029982a182a8021982a182a8019982a182a8011982a182a8009982a18209982a182a98291baa00a4bd70182b182b000982a800982a0009829800982900098288009828000982780098251baa0038acc004cdc3a4020003132323232323232323230423305530560093305530560083305530560073305530560063305530560053305530560043305530560033305530560023305530560013305530423305530563053375401697ae0305730570013056001305500130540013053001305200130510013050001304f001304a375400715980099b87480480062646464646464646464646086660ac60ae014660ac60ae012660ac60ae010660ac60ae00e660ac60ae00c660ac60ae00a660ac60ae008660ac60ae006660ac60ae004660ac60ae002660ac6086660ac60ae60a86ea80312f5c060b060b000260ae00260ac00260aa00260a800260a600260a400260a200260a0002609e00260946ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c110cc15cc16002ccc15cc160028cc15cc160024cc15cc160020cc15cc16001ccc15cc160018cc15cc160014cc15cc160010cc15cc16000ccc15cc160008cc15cc160004cc15cc110cc15cc160c154dd5006a5eb80c164c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c128dd5001c56600266e1d2016001899191919191919191919191918229982c182c8061982c182c8059982c182c8051982c182c8049982c182c8041982c182c8039982c182c8031982c182c8029982c182c8021982c182c8019982c182c8011982c182c8009982c18229982c182c982b1baa00e4bd70182d182d000982c800982c000982b800982b000982a800982a0009829800982900098288009828000982780098251baa003899191919191919191919191918229982c182c8061982c182c8059982c182c8051982c182c8049982c182c8041982c182c8039982c182c8031982c182c8029982c182c8021982c182c8019982c182c8011982c182c8009982c182c982d0009982c18229982c182c982b1baa00e4bd7025eb80c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c128dd5001a0904120824104820904120824104820904120824104818241baa001304b002400c8248dd718241824800991acc004c08400a2653001001a5eb82006800888966002607800312323304c374e002660986ea40092f5c065300100180252f5c080088896600200510018cc00400e60a00053304e304f002001400c826a246530010059982618268008024c05000e6eb8c134c1380050051802800a08c8b2086375c60906092006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241191598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41188230dc4000c888c8cc12cc00cdd698260009982598261826800a5eb80c00c0066608e6ea0cdc7000a40006608e6ea4cc040c03cdc6800800a5eb8122232329800919802919198279ba833794940dd718280009982798281828800a5eb816600260386e3400626609c6ea4c064004cc138dd49980d980d1b8d0010014bd7045904a1191801acc004c104006298103d87a80008981e198279ba80014bd70209630030019bad304d003911191acc006600260846eb4c14400694294504c44cc02000c8c014c0f8cc144dd4000a5eb822601e600898103d87a800041306eb8c144c148004cc13cdd419b8e00148000cc13cdd49980c180b9b8d0010014bd7024446b30013041002898019181e99828000a5eb822b3001304600289801919ba548008cc1400052f5c1159800981b80144c00c8cdd2a4008660a000297ae08acc004c03400a26600e464660a26ea0cde5250375c60a4002660a260a460a600297ae059800981b9b8d0018998281ba930230013305037526605260506e340040052f5c1164130466e95200633050375000297ae08acc004c03000a26600e464660a26ea0cde5250375c60a4002660a260a460a600297ae059800981b9b8d0018998281ba930230013305037526605260506e340040052f5c1164130466e952008330503750b3001337100029040400244006266e04004c0192020413097ae08acc004cdc3a40140051300323374a900519828000a5eb822b30013370e900600144cc0048cdd2a4018660a000297ae0232330513750600c6eb4c148004cc144c148c14c0052f5c064660a26ea0cde5250375c60a4002660a260a460a600297ae059800980f1b8d0018998281ba9301b0013305037526603a60386e340040052f5c116413115980099b874803800a266002466e95200e330500014bd70119198289ba833794940dd718290009982898291829800a5eb8166002603c6e340062660a06ea4c06c004cc140dd49980e980e1b8d0010014bd7045904c456600266e1d2010002899800919ba548040cc1400052f5c0464660a26ea0cde5250375c60a4002660a260a460a600297ae059800980f1b8d0018998281ba9301b0013305037526603a60386e340040052f5c116413115980099b874804800a246464660a466e9520123305230530014bd70198291829982a000a5eb80c004008cc0208c8cc148dd419bca4a06eb8c14c004cc148c14cc1500052f5c0b30013038371a00313305137526048002660a26ea4cc0a8c0a4dc6800800a5eb822c8268966002608600314c103d87980008acc004c120006298103d87a80008acc004c0e4006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b209a4134826904d209a8acc004cdc3a40280051300323374a900a19828000a5eb822b30013370e900b00144c00c8cdd2a402c660a000297ae08acc004cdc3a403000513300123374a900c19828000a5eb808c8cc144dd419bca4a06eb8c148004cc144c148c14c0052f5c0b3001301e371a00313305037526036002660a06ea4cc074c070dc6800800a5eb822c82622c825904b2096412c825904b2096412c825904b2096412c8258dd718281828803096600266e2000520808080808080808080028800c4cdc0800980124100028240c00c00c6eb4c118004c8cc114dd419b8e00148000cc114dd49980718069b8d0010014bd701bae3045304600420768b2070371890011b80480051640b46eb8c0c8c0cc00566002600e6e340062660606ea4c008004cc0c0dd49980298021b8d0010014bd7045902c1bae301f302d37546602a4646b30013371e6eb8c0c800522104b9011a82008919191919191919911981d18139981d181d8039981d1ba90013303a303b0024bd701981d181d981e00125eb80d660026024003125980099b89002371a00313303937526601e004002660726ea66002005337026e3400400a002b8c25eb822c81aa2c81a0dd7181c981d0011bae3039004375a6070002646606e6ea0cde5250375c60700026606e6070607200297ae059800980e9b8d00189981b1ba930090013303637526601e601c6e340040052f5c11640c86eb8c0d8c0dc004d6600294624b30013371290201b8d00189981a9ba93300b48100004cc0d4dd4cc005204099b80371a002901fc0057184bd704590314590301bae30353036001300100259800a51892cc004cdc4a4100026e340062660666ea4cc0252080010013303337533001482000666e00dc6800a40ff0015c612f5c11640bd1640b91640b46eb8c0c8c0cc00566002600e6e340062660606ea4c008004cc0c0dd49980298021b8d0010014bd7045902c1bae303000a300348010c00d2008198010011814000a04a899180118138019bae3025002408c6eb0c088c07cdd5000c5901d19199119801001000912cc004006298103d87a80008992cc004cdd78021810800c4c044cc090c0880052f5c11330030033026002408060480028110dd59811181198119811981198119811981198119811980f9baa0173374a90021981019ba548008cc080c038c078dd51810980f1baa0014bd7025eb822c80e0c8cc004004dd61804980f1baa0162259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a51407910018998018019812001203c325980099912cc00400a294226530013259800980c18119baa00189bad302430273756604e60486ea800629000204430260019baf302630270019bab003488966002003159800980100344cc01400d20008a5040911325980099baf30260014c010140008acc004cc018010dd6981398151bab3027001898019ba6302b0028a5040951598009980300224001130030078a5040948128c0a40050270ca60020033756601c60466ea8c038c08cdd5002488cc09c008cc09cdd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0940066eacc09800660540069112cc004cdc8a441000038acc004cdc7a44100003899802980c198159ba60024bd70000c4cc015300103d87a8000006409d19800803c006446600e0046605a66ec0dd48029ba6004001401c8138605000481322942294229410271ba633022337606ea4018dd31981119bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c5660026032603e6ea8c08cc080dd5181198101baa300b3020375400313259800980598101baa0018992cc004c058c084dd5000c4c8c8c8c8cc8966002605800713259800980e98141baa0018991919194c004dd69818000cdd718180024dd69818001cdd7181800124444b3001303500589980c1bab303400e225980080144cc068030896600200513024330370144bd7044c8c8cc06cc0d80084c00cc0ec010dd7181b000981c001206c899191980c981a80109801981c8021bae3033001303600240d11640c83030001302f001302e0013029375400316409c605600d1640a46eb8c0a4004dd5981480118148009814000981380098111baa0018b204030243021375400316407c602460406ea8c02cc080dd5000c5901e4530103d87a8000407860440028100dd69804180e9baa01022598009809180e9baa00289919192cc004c09400a26600c604800626600c00200916408860460026046002603c6ea800a2c80e08966002602260386ea800a2646464b30013024002899192cc004c0580062b3001302237540050068b20468acc004c06c00626464b300130280028044590251bad3026001302237540051598009806000c56600260446ea800a00d16408d164080810102018101baa00130230038b204232598009810000c5660026012603e003168980c980f800a03c8b2042375460440026044002603a6ea800a2c80d89111192cc004c038c064dd5000c4c074c068dd5000c590181980399b82003598009806980c1baa004899b81001002899b81002001405c00430153754600290504e00980a9baa30183015375400498103d87980008b202633001337046eb4c00cc04cdd50031bad3005301337540349001118019980b1ba8001330164c10101004bd70112cc004c020006298103d87a80008acc004cdc4000a40011300333016300333016375066e05200000233016375066e0520000014bd7025eb82260066602c60066602c6ea0008cc058dd4000a5eb812f5c0809101222c805860126ea800e2c8038601000260066ea802629344d9590011", - "hash": "be505faec27f9bfa35861eda2bb96329fc70a6f2c51eb14de6c094d4" + "compiledCode": "59179c010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a460226024602400323011301200191808980918091809000cdd2a4000911111919912cc004c024c050dd500144cdd7999119912cc004cdc4001000c5300103d87980008acc004cdc40008014530103d87b80008a6103d87a8000405c80b8cdc11bad301a002375a6034603600266e08dd6980d0009bad301a301b002301537546644600c660326ea0cdc11bad301a002375a6034002660326ea0cdc11bad301a301b002375a6034603600297ae030153754664466446010660366ea0cdc019b82375a603800800266e08dd6980e0018011980d9ba83370400400297ae0375a603460360046eb4c068c06c004c054dd518009bad300730153754010602a6eaa6002600c602a6ea80226eb4c014c054dd50044dd6980c180c980c980c980c980a9baa0089bad301898009b87480126e25200491192cc004cdc7a4500375c603660380031301b0018b202c3002001911919800800801911980180098010014dd7180c180a9baa01c9bad3006301537540389111111919192cc004c088006264b30013013301e37540031323259800980a98101baa0018992cc004c058c084dd5000c4c966002602e60446ea800626604a604c60466ea8008cc094c098c08cdd5000a5eb822c8108c094c098c098c098c098c098c088dd5001c59020181218109baa0018b203e3011302037540026044603e6ea80062c80e8c8cc004004dd61808980f9baa30220022259800800c530103d87a80008992cc004cdc39bad30243021375400200f13010330230014bd7044cc00c00cc09400901f1811800a0428b203e32598009809180e9baa0018992cc004c04cc078dd5000c4c8cc0200048966002005132330010010042259800800c52f5c113302698009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301623235980099b8f375c60640029110475d3c793008cc004888c8cc00cdd6981b0009bae3036303700130030019b89480426e3120109b804803e600e90082444446600a464660706ea0cde5250375c6072002660706072607400297ae05980098029b8d00189981b9ba930020013303737526600860066e340040052f5c11640cc46644660104660746ea0cdc7000a4000660746ea4cc00cc008dc6800800a5eb808cc0248cc0ecdd419b8e00148000cc0ecdd49980218019b8d0010014bd701119191981f18159981f1ba80083303e375000a6607c607e00297ae03303e303f30400014bd7018008012cc004c05800a2653001001a5eb820068008889660026062003123233041374e002660826ea40092f5c065300100180252f5c080088896600200510018cc00400e608a005330433044002001400c8212246530010059982098210008024c02400e6eb8c108c10c0050054c004c8cc104dd419bca4a06eb8c108004cc104c108c10c0052f5c0b30013017371a00313304037526024002660806ea4cc054c050dc6800800a5eb822c81e24466084004660846ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c12400a606a6609060920106609098103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a80004bd70200222259800801440063300100398260014c8c966002607c003132303a3304d304e0013304d303a3304d304e304b375400697ae0304f304f001304a37540071598009821800c4c8c8c0eccc138c13c008cc138c13c004cc138c0eccc138c13cc130dd500225eb80c140c140004c13c004c128dd5001c566002606a0031323232303c3304f30500033304f30500023304f30500013304f303c3304f3050304d375400a97ae0305130510013050001304f001304a37540071598009805000c4c8c8c8c8c0f4cc140c144010cc140c14400ccc140c144008cc140c144004cc140c0f4cc140c144c138dd500325eb80c148c148004c144004c140004c13c004c128dd5001c566002601200313232323232303e33051305200533051305200433051305200333051305200233051305200133051303e330513052304f375400e97ae030533053001305200130510013050001304f001304a375400715980099b87480280062646464646464607e660a460a600c660a460a600a660a460a6008660a460a6006660a460a6004660a460a6002660a4607e660a460a660a06ea80212f5c060a860a800260a600260a400260a200260a0002609e00260946ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c100cc14cc15001ccc14cc150018cc14cc150014cc14cc150010cc14cc15000ccc14cc150008cc14cc150004cc14cc100cc14cc150c144dd5004a5eb80c154c154004c150004c14c004c148004c144004c140004c13c004c128dd5001c56600266e1d200e0018991919191919191918209982a182a8041982a182a8039982a182a8031982a182a8029982a182a8021982a182a8019982a182a8011982a182a8009982a18209982a182a98291baa00a4bd70182b182b000982a800982a0009829800982900098288009828000982780098251baa0038acc004cdc3a4020003132323232323232323230423305530560093305530560083305530560073305530560063305530560053305530560043305530560033305530560023305530560013305530423305530563053375401697ae0305730570013056001305500130540013053001305200130510013050001304f001304a375400715980099b87480480062646464646464646464646086660ac60ae014660ac60ae012660ac60ae010660ac60ae00e660ac60ae00c660ac60ae00a660ac60ae008660ac60ae006660ac60ae004660ac60ae002660ac6086660ac60ae60a86ea80312f5c060b060b000260ae00260ac00260aa00260a800260a600260a400260a200260a0002609e00260946ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c110cc15cc16002ccc15cc160028cc15cc160024cc15cc160020cc15cc16001ccc15cc160018cc15cc160014cc15cc160010cc15cc16000ccc15cc160008cc15cc160004cc15cc110cc15cc160c154dd5006a5eb80c164c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c128dd5001c56600266e1d2016001899191919191919191919191918229982c182c8061982c182c8059982c182c8051982c182c8049982c182c8041982c182c8039982c182c8031982c182c8029982c182c8021982c182c8019982c182c8011982c182c8009982c18229982c182c982b1baa00e4bd70182d182d000982c800982c000982b800982b000982a800982a0009829800982900098288009828000982780098251baa003899191919191919191919191918229982c182c8061982c182c8059982c182c8051982c182c8049982c182c8041982c182c8039982c182c8031982c182c8029982c182c8021982c182c8019982c182c8011982c182c8009982c182c982d0009982c18229982c182c982b1baa00e4bd7025eb80c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c128dd5001a0904120824104820904120824104820904120824104818241baa001304b002400c8248dd718241824800991acc004c08400a2653001001a5eb82006800888966002607800312323304c374e002660986ea40092f5c065300100180252f5c080088896600200510018cc00400e60a00053304e304f002001400c826a246530010059982618268008024c05000e6eb8c134c1380050051802800a08c8b2086375c60906092006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241191598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41188230dc4000c888c8cc12cc00cdd698260009982598261826800a5eb80c00c0066608e6ea0cdc7000a40006608e6ea4cc040c03cdc6800800a5eb8122232329800919802919198279ba833794940dd718280009982798281828800a5eb816600260386e3400626609c6ea4c064004cc138dd49980d980d1b8d0010014bd7045904a1191801acc004c104006298103d87a80008981e198279ba80014bd70209630030019bad304d003911191acc006600260846eb4c14400694294504c44cc02000c8c014c0f8cc144dd4000a5eb822601e600898103d87a800041306eb8c144c148004cc13cdd419b8e00148000cc13cdd49980c180b9b8d0010014bd7024446b30013041002898019181e99828000a5eb822b3001304600289801919ba548008cc1400052f5c1159800981c00144c00c8cdd2a4008660a000297ae08acc004c03400a26600e464660a26ea0cde5250375c60a4002660a260a460a600297ae059800981c1b8d0018998281ba930230013305037526605260506e340040052f5c1164130466e95200633050375000297ae08acc004c03000a26600e464660a26ea0cde5250375c60a4002660a260a460a600297ae059800981c1b8d0018998281ba930230013305037526605260506e340040052f5c1164130466e952008330503750b3001337100029040400244006266e04004c0192020413097ae08acc004cdc3a40140051300323374a900519828000a5eb822b30013370e900600144cc0048cdd2a4018660a000297ae0232330513750600c6eb4c148004cc144c148c14c0052f5c064660a26ea0cde5250375c60a4002660a260a460a600297ae059800980f1b8d0018998281ba9301b0013305037526603a60386e340040052f5c116413115980099b874803800a266002466e95200e330500014bd70119198289ba833794940dd718290009982898291829800a5eb8166002603c6e340062660a06ea4c06c004cc140dd49980e980e1b8d0010014bd7045904c456600266e1d2010002899800919ba548040cc1400052f5c0464660a26ea0cde5250375c60a4002660a260a460a600297ae059800980f1b8d0018998281ba9301b0013305037526603a60386e340040052f5c116413115980099b874804800a246464660a466e9520123305230530014bd70198291829982a000a5eb80c004008cc0208c8cc148dd419bca4a06eb8c14c004cc148c14cc1500052f5c0b30013039371a00313305137526048002660a26ea4cc0a8c0a4dc6800800a5eb822c8268966002608600314c103d87980008acc004c120006298103d87a80008acc004c0e8006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b209a4134826904d209a8acc004cdc3a40280051300323374a900a19828000a5eb822b30013370e900b00144c00c8cdd2a402c660a000297ae08acc004cdc3a403000513300123374a900c19828000a5eb808c8cc144dd419bca4a06eb8c148004cc144c148c14c0052f5c0b3001301e371a00313305037526036002660a06ea4cc074c070dc6800800a5eb822c82622c825904b2096412c825904b2096412c825904b2096412c8258dd718281828803096600266e2000520808080808080808080028800c4cdc0800980124100028240c00c00c6eb4c118004c8cc114dd419b8e00148000cc114dd49980718069b8d0010014bd701bae3045304600420768b2070371890011b80480051640b46eb8c0c8c0cc00566002600e6e340062660606ea4c008004cc0c0dd49980298021b8d0010014bd7045902c1bae301f302d37546602c4646b30013371e6eb8c0c800522104b9011a82008919191919191919911981d18139981d181d8039981d1ba90013303a303b0024bd701981d181d981e00125eb80d660026024003125980099b89002371a00313303937526601e004002660726ea66002005337026e3400400a002b8c25eb822c81aa2c81a0dd7181c981d0011bae3039004375a6070002646606e6ea0cde5250375c60700026606e6070607200297ae059800980f1b8d00189981b1ba930090013303637526601e601c6e340040052f5c11640c86eb8c0d8c0dc004d6600294624b30013371290201b8d00189981a9ba93300b48100004cc0d4dd4cc005204099b80371a002901fc0057184bd704590314590301bae30353036001300100259800a51892cc004cdc4a4100026e340062660666ea4cc0252080010013303337533001482000666e00dc6800a40ff0015c612f5c11640bd1640b91640b46eb8c0c8c0cc00566002600e6e340062660606ea4c008004cc0c0dd49980298021b8d0010014bd7045902c1bae303000a300348010c00d2008198010011814000a04a899180118138019bae3025002408c6eb0c088c07cdd5000c5901d19199119801001000912cc004006298103d87a80008992cc004cdd78021810800c4c044cc090c0880052f5c11330030033026002408060480028110dd59811181198119811981198119811981198119811980f9baa0173374a90021981019ba548008cc080c038c078dd51810980f1baa0014bd7025eb822c80e0c8cc004004dd61807980f1baa0162259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a51407910018998018019812001203c325980099912cc00400a294226530013259800980c18119baa00189bad302430273756604e60486ea800629000204430260019baf302630270019bab003488966002003159800980100344cc01400d20008a5040911325980099baf30260014c010140008acc004cc018010dd6981398151bab3027001898019ba6302b0028a5040951598009980300224001130030078a5040948128c0a40050270ca60020033756602860466ea8c050c08cdd5002488cc09c008cc09cdd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0940066eacc09800660540069112cc004cdc8a441000038acc004cdc7a44100003899802980c198159ba60024bd70000c4cc015300103d87a8000006409d19800803c006446600e0046605a66ec0dd48029ba6004001401c8138605000481322942294229410271ba633022337606ea401cdd31981119bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c5660026032603e6ea8c08cc080dd5181198101baa30113020375400313259800980618101baa0018992cc004c058c084dd5000c4c8c8c8c8cc8966002605800713259800980e98141baa0018991919194c004dd69818000cdd718180024dd69818001cdd7181800124444b3001303500589980c9bab303400e225980080144cc06c030896600200513024330370144bd7044c8c8cc06cc0d80084c00cc0ec010dd7181b000981c001206c899191980c981a80109801981c8021bae3033001303600240d11640c83030001302f001302e0013029375400316409c605600d1640a46eb8c0a4004dd5981480118148009814000981380098111baa0018b204030243021375400316407c602460406ea8c044c080dd5000c5901e4530103d87a800040786044002810089660026024603a6ea800a2646464b30013025002899803181200189980300080245902218118009811800980f1baa0028b203822598009808980e1baa00289919192cc004c09000a26464b300130160018acc004c088dd5001401a2c811a2b3001301b001899192cc004c0a000a0111640946eb4c098004c088dd50014566002601a00315980098111baa0028034590234590202040408060406ea8004c08c00e2c8108c96600260400031598009805180f800c5a26032603e00280f22c8108dd518110009811000980e9baa0028b20362444464b3001300e301937540031301d301a37540031640606600e66e0800d66002601a60306ea8012266e0400400a266e040080050170010c054dd51800a41413802602a6ea8c060c054dd5001260103d87980008b202633001337046eb4c014c04cdd500324100fa9001118019980b1ba8001330164c10101004bd70112cc004c020006298103d87a80008acc004cdc4000a40011300333016300333016375066e05200000233016375066e0520000014bd7025eb82260066602c60066602c6ea0008cc058dd4000a5eb812f5c0809101222c805860126ea800e2c8038601000260066ea802629344d9590011", + "hash": "715413ffebf875023cc8c1e9eb7af1d49b808139940295a4d56acf5a" }, { "title": "liquidate.liquidate.else", @@ -86,12 +86,12 @@ { "title": "config", "schema": { - "$ref": "#/definitions/lazer_perps~1types~1PerpsConfig" + "$ref": "#/definitions/lazer_perps~1types~1MarketConfig" } } ], - "compiledCode": "5917a8010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a4602260246024003230113012301230123012301200191808980918091809000cdd2a4000911111919912cc004c024c050dd500144cdd7999119912cc004cdc4001000c5300103d87980008acc004cdc40008014530103d87b80008a6103d87a8000405c80b8cdc11bad301a002375a6034603600266e08dd6980d0009bad301a301b002301537546644600c660326ea0cdc11bad301a002375a6034002660326ea0cdc11bad301a301b002375a6034603600297ae030153754664466446010660366ea0cdc019b82375a603800800266e08dd6980e0018011980d9ba83370400400297ae0375a603460360046eb4c068c06c004c054dd518009bad300530153754010602a6eaa6002600e602a6ea80226eb4c060c064c064c064c064c054dd50044dd69803180a9baa0089bad301898009180c980d000cdc3a400937129002488c96600266e3d220100375c603660380031301b0018b202c3002001911919800800801911980180098010014dd7180c180a9baa01c4888888c8c8cc8966002604600513259800980a180f9baa001899192cc004c058c084dd5000c4c966002602e60446ea8006264b30013018302337540031330263027302437540046604c604e60486ea80052f5c1164088602860466ea800e2c8108c094c088dd5000c59020180618109baa00130233020375400316407864660020026eb0c048c080dd51811801912cc0040062980103d87a80008992cc004cdc39bad30253022375400200913011330240014bd7044cc00c00cc0980090201812000a0448b204032598009809180e9baa0018992cc004c04cc078dd5000c4c8cc01c0048966002005132330010010042259800800c52f5c113302698009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301523235980099b8f375c60640029110475d3c793008cc004888c8cc00cdd6981b0009bae3036303700130030019b89480426e3120109b804803e600e90082444446600a464660706ea0cde5250375c6072002660706072607400297ae05980098029b8d00189981b9ba930020013303737526600860066e340040052f5c11640cc46644660104660746ea0cdc7000a4000660746ea4cc00cc008dc6800800a5eb808cc0248cc0ecdd419b8e00148000cc0ecdd49980218019b8d0010014bd701119191981f18159981f1ba80083303e375000a6607c607e00297ae03303e303f30400014bd7018008012cc004c05800a2653001001a5eb820068008889660026062003123233041374e002660826ea40092f5c065300100180252f5c080088896600200510018cc00400e608a005330433044002001400c8212246530010059982098210008024c02400e6eb8c108c10c0050054c004c8cc104dd419bca4a06eb8c108004cc104c108c10c0052f5c0b30013017371a00313304037526024002660806ea4cc054c050dc6800800a5eb822c81e24466084004660846ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c12400a606a6609060920106609098103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a80004bd70200222259800801440063300100398260014c8c966002607c003132303a3304d304e0013304d303a3304d304e304b375400697ae0304f304f001304a37540071598009821800c4c8c8c0eccc138c13c008cc138c13c004cc138c0eccc138c13cc130dd500225eb80c140c140004c13c004c128dd5001c56600260680031323232303c3304f30500033304f30500023304f30500013304f303c3304f3050304d375400a97ae0305130510013050001304f001304a37540071598009805000c4c8c8c8c8c0f4cc140c144010cc140c14400ccc140c144008cc140c144004cc140c0f4cc140c144c138dd500325eb80c148c148004c144004c140004c13c004c128dd5001c566002601200313232323232303e33051305200533051305200433051305200333051305200233051305200133051303e330513052304f375400e97ae030533053001305200130510013050001304f001304a375400715980099b87480280062646464646464607e660a460a600c660a460a600a660a460a6008660a460a6006660a460a6004660a460a6002660a4607e660a460a660a06ea80212f5c060a860a800260a600260a400260a200260a0002609e00260946ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c100cc14cc15001ccc14cc150018cc14cc150014cc14cc150010cc14cc15000ccc14cc150008cc14cc150004cc14cc100cc14cc150c144dd5004a5eb80c154c154004c150004c14c004c148004c144004c140004c13c004c128dd5001c56600266e1d200e0018991919191919191918209982a182a8041982a182a8039982a182a8031982a182a8029982a182a8021982a182a8019982a182a8011982a182a8009982a18209982a182a98291baa00a4bd70182b182b000982a800982a0009829800982900098288009828000982780098251baa0038acc004cdc3a4020003132323232323232323230423305530560093305530560083305530560073305530560063305530560053305530560043305530560033305530560023305530560013305530423305530563053375401697ae0305730570013056001305500130540013053001305200130510013050001304f001304a375400715980099b87480480062646464646464646464646086660ac60ae014660ac60ae012660ac60ae010660ac60ae00e660ac60ae00c660ac60ae00a660ac60ae008660ac60ae006660ac60ae004660ac60ae002660ac6086660ac60ae60a86ea80312f5c060b060b000260ae00260ac00260aa00260a800260a600260a400260a200260a0002609e00260946ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c110cc15cc16002ccc15cc160028cc15cc160024cc15cc160020cc15cc16001ccc15cc160018cc15cc160014cc15cc160010cc15cc16000ccc15cc160008cc15cc160004cc15cc110cc15cc160c154dd5006a5eb80c164c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c128dd5001c56600266e1d2016001899191919191919191919191918229982c182c8061982c182c8059982c182c8051982c182c8049982c182c8041982c182c8039982c182c8031982c182c8029982c182c8021982c182c8019982c182c8011982c182c8009982c18229982c182c982b1baa00e4bd70182d182d000982c800982c000982b800982b000982a800982a0009829800982900098288009828000982780098251baa003899191919191919191919191918229982c182c8061982c182c8059982c182c8051982c182c8049982c182c8041982c182c8039982c182c8031982c182c8029982c182c8021982c182c8019982c182c8011982c182c8009982c182c982d0009982c18229982c182c982b1baa00e4bd7025eb80c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c128dd5001a0904120824104820904120824104820904120824104818241baa001304b002400c8248dd718241824800991acc004c08400a2653001001a5eb82006800888966002607800312323304c374e002660986ea40092f5c065300100180252f5c080088896600200510018cc00400e60a00053304e304f002001400c826a246530010059982618268008024c05000e6eb8c134c1380050051802800a08c8b2086375c60906092006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241191598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41188230dc4000c888c8cc12cc00cdd698260009982598261826800a5eb80c00c0066608e6ea0cdc7000a40006608e6ea4cc040c03cdc6800800a5eb8122232329800919802919198279ba833794940dd718280009982798281828800a5eb816600260386e3400626609c6ea4c064004cc138dd49980d980d1b8d0010014bd7045904a1191801acc004c104006298103d87a80008981e198279ba80014bd70209630030019bad304d003911191acc006600260846eb4c14400694294504c44cc02000c8c014c0f8cc144dd4000a5eb822601e600898103d87a800041306eb8c144c148004cc13cdd419b8e00148000cc13cdd49980c180b9b8d0010014bd7024446b30013041002898019181e99828000a5eb822b3001304600289801919ba548008cc1400052f5c1159800981b80144c00c8cdd2a4008660a000297ae08acc004c03400a26600e464660a26ea0cde5250375c60a4002660a260a460a600297ae059800981b9b8d0018998281ba930230013305037526605260506e340040052f5c1164130466e95200633050375000297ae08acc004c03000a26600e464660a26ea0cde5250375c60a4002660a260a460a600297ae059800981b9b8d0018998281ba930230013305037526605260506e340040052f5c1164130466e952008330503750b3001337100029040400244006266e04004c0192020413097ae08acc004cdc3a40140051300323374a900519828000a5eb822b30013370e900600144cc0048cdd2a4018660a000297ae0232330513750600c6eb4c148004cc144c148c14c0052f5c064660a26ea0cde5250375c60a4002660a260a460a600297ae059800980f1b8d0018998281ba9301b0013305037526603a60386e340040052f5c116413115980099b874803800a266002466e95200e330500014bd70119198289ba833794940dd718290009982898291829800a5eb8166002603c6e340062660a06ea4c06c004cc140dd49980e980e1b8d0010014bd7045904c456600266e1d2010002899800919ba548040cc1400052f5c0464660a26ea0cde5250375c60a4002660a260a460a600297ae059800980f1b8d0018998281ba9301b0013305037526603a60386e340040052f5c116413115980099b874804800a246464660a466e9520123305230530014bd70198291829982a000a5eb80c004008cc0208c8cc148dd419bca4a06eb8c14c004cc148c14cc1500052f5c0b30013038371a00313305137526048002660a26ea4cc0a8c0a4dc6800800a5eb822c8268966002608600314c103d87980008acc004c120006298103d87a80008acc004c0e4006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b209a4134826904d209a8acc004cdc3a40280051300323374a900a19828000a5eb822b30013370e900b00144c00c8cdd2a402c660a000297ae08acc004cdc3a403000513300123374a900c19828000a5eb808c8cc144dd419bca4a06eb8c148004cc144c148c14c0052f5c0b3001301e371a00313305037526036002660a06ea4cc074c070dc6800800a5eb822c82622c825904b2096412c825904b2096412c825904b2096412c8258dd718281828803096600266e2000520808080808080808080028800c4cdc0800980124100028240c00c00c6eb4c118004c8cc114dd419b8e00148000cc114dd49980718069b8d0010014bd701bae3045304600420768b2070371890011b80480051640b46eb8c0c8c0cc00566002600e6e340062660606ea4c008004cc0c0dd49980298021b8d0010014bd7045902c1bae301f302d37546602a4646b30013371e6eb8c0c800522104b9011a82008919191919191919911981d18139981d181d8039981d1ba90013303a303b0024bd701981d181d981e00125eb80d660026024003125980099b89002371a00313303937526601e004002660726ea66002005337026e3400400a002b8c25eb822c81aa2c81a0dd7181c981d0011bae3039004375a6070002646606e6ea0cde5250375c60700026606e6070607200297ae059800980e9b8d00189981b1ba930090013303637526601e601c6e340040052f5c11640c86eb8c0d8c0dc004d6600294624b30013371290201b8d00189981a9ba93300b48100004cc0d4dd4cc005204099b80371a002901fc0057184bd704590314590301bae30353036001300100259800a51892cc004cdc4a4100026e340062660666ea4cc0252080010013303337533001482000666e00dc6800a40ff0015c612f5c11640bd1640b91640b46eb8c0c8c0cc00566002600e6e340062660606ea4c008004cc0c0dd49980298021b8d0010014bd7045902c1bae303000a300348010c00d2008198010011814000a04a899180118138019bae3025002408c6eb0c088c07cdd5000c5901d19199119801001000912cc004006298103d87a80008992cc004cdd78021810800c4c044cc090c0880052f5c11330030033026002408060480028110dd59811181198119811981198119811981198119811980f9baa0173374a90021981019ba548008cc080c038c078dd51810980f1baa0014bd7025eb822c80e0c8cc004004dd61804980f1baa0162259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a51407910018998018019812001203c325980099912cc00400a294226530013259800980c18119baa00189bad302430273756604e60486ea800629000204430260019baf302630270019bab003488966002003159800980100344cc01400d20008a5040911325980099baf30260014c010140008acc004cc018010dd6981398151bab3027001898019ba6302b0028a5040951598009980300224001130030078a5040948128c0a40050270ca60020033756601c60466ea8c038c08cdd5002488cc09c008cc09cdd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0940066eacc09800660540069112cc004cdc8a441000038acc004cdc7a44100003899802980c198159ba60024bd70000c4cc015300103d87a8000006409d19800803c006446600e0046605a66ec0dd48029ba6004001401c8138605000481322942294229410271ba633022337606ea4018dd31981119bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c5660026032603e6ea8c08cc080dd5181198101baa300b3020375400313259800980598101baa0018992cc004c058c084dd5000c4c8c8c8c8cc8966002605800713259800980e98141baa0018991919194c004dd69818000cdd718180024dd69818001cdd7181800124444b3001303500589980c1bab303400e225980080144cc068030896600200513024330370144bd7044c8c8cc06cc0d80084c00cc0ec010dd7181b000981c001206c899191980c981a80109801981c8021bae3033001303600240d11640c83030001302f001302e0013029375400316409c605600d1640a46eb8c0a4004dd5981480118148009814000981380098111baa0018b204030243021375400316407c602460406ea8c02cc080dd5000c5901e4530103d87a8000407860440028100dd69804180e9baa01022598009809180e9baa00289919192cc004c09400a26600c604800626600c00200916408860460026046002603c6ea800a2c80e08966002602260386ea800a2646464b30013024002899192cc004c0580062b3001302237540050068b20468acc004c06c00626464b300130280028044590251bad3026001302237540051598009806000c56600260446ea800a00d16408d164080810102018101baa00130230038b204232598009810000c5660026012603e003168980c980f800a03c8b2042375460440026044002603a6ea800a2c80d89111192cc004c038c064dd5000c4c074c068dd5000c590181980399b82003598009806980c1baa004899b81001002899b81002001405c00430153754600290504e00980a9baa30183015375400498103d87980008b202633001337046eb4c00cc04cdd50031bad3005301337540349001118019980b1ba8001330164c10101004bd70112cc004c020006298103d87a80008acc004cdc4000a40011300333016300333016375066e05200000233016375066e0520000014bd7025eb82260066602c60066602c6ea0008cc058dd4000a5eb812f5c0809101222c805860126ea800e2c8038601000260066ea802629344d9590011", - "hash": "be505faec27f9bfa35861eda2bb96329fc70a6f2c51eb14de6c094d4" + "compiledCode": "59179c010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a460226024602400323011301200191808980918091809000cdd2a4000911111919912cc004c024c050dd500144cdd7999119912cc004cdc4001000c5300103d87980008acc004cdc40008014530103d87b80008a6103d87a8000405c80b8cdc11bad301a002375a6034603600266e08dd6980d0009bad301a301b002301537546644600c660326ea0cdc11bad301a002375a6034002660326ea0cdc11bad301a301b002375a6034603600297ae030153754664466446010660366ea0cdc019b82375a603800800266e08dd6980e0018011980d9ba83370400400297ae0375a603460360046eb4c068c06c004c054dd518009bad300730153754010602a6eaa6002600c602a6ea80226eb4c014c054dd50044dd6980c180c980c980c980c980a9baa0089bad301898009b87480126e25200491192cc004cdc7a4500375c603660380031301b0018b202c3002001911919800800801911980180098010014dd7180c180a9baa01c9bad3006301537540389111111919192cc004c088006264b30013013301e37540031323259800980a98101baa0018992cc004c058c084dd5000c4c966002602e60446ea800626604a604c60466ea8008cc094c098c08cdd5000a5eb822c8108c094c098c098c098c098c098c088dd5001c59020181218109baa0018b203e3011302037540026044603e6ea80062c80e8c8cc004004dd61808980f9baa30220022259800800c530103d87a80008992cc004cdc39bad30243021375400200f13010330230014bd7044cc00c00cc09400901f1811800a0428b203e32598009809180e9baa0018992cc004c04cc078dd5000c4c8cc0200048966002005132330010010042259800800c52f5c113302698009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301623235980099b8f375c60640029110475d3c793008cc004888c8cc00cdd6981b0009bae3036303700130030019b89480426e3120109b804803e600e90082444446600a464660706ea0cde5250375c6072002660706072607400297ae05980098029b8d00189981b9ba930020013303737526600860066e340040052f5c11640cc46644660104660746ea0cdc7000a4000660746ea4cc00cc008dc6800800a5eb808cc0248cc0ecdd419b8e00148000cc0ecdd49980218019b8d0010014bd701119191981f18159981f1ba80083303e375000a6607c607e00297ae03303e303f30400014bd7018008012cc004c05800a2653001001a5eb820068008889660026062003123233041374e002660826ea40092f5c065300100180252f5c080088896600200510018cc00400e608a005330433044002001400c8212246530010059982098210008024c02400e6eb8c108c10c0050054c004c8cc104dd419bca4a06eb8c108004cc104c108c10c0052f5c0b30013017371a00313304037526024002660806ea4cc054c050dc6800800a5eb822c81e24466084004660846ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c12400a606a6609060920106609098103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a80004bd70200222259800801440063300100398260014c8c966002607c003132303a3304d304e0013304d303a3304d304e304b375400697ae0304f304f001304a37540071598009821800c4c8c8c0eccc138c13c008cc138c13c004cc138c0eccc138c13cc130dd500225eb80c140c140004c13c004c128dd5001c566002606a0031323232303c3304f30500033304f30500023304f30500013304f303c3304f3050304d375400a97ae0305130510013050001304f001304a37540071598009805000c4c8c8c8c8c0f4cc140c144010cc140c14400ccc140c144008cc140c144004cc140c0f4cc140c144c138dd500325eb80c148c148004c144004c140004c13c004c128dd5001c566002601200313232323232303e33051305200533051305200433051305200333051305200233051305200133051303e330513052304f375400e97ae030533053001305200130510013050001304f001304a375400715980099b87480280062646464646464607e660a460a600c660a460a600a660a460a6008660a460a6006660a460a6004660a460a6002660a4607e660a460a660a06ea80212f5c060a860a800260a600260a400260a200260a0002609e00260946ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c100cc14cc15001ccc14cc150018cc14cc150014cc14cc150010cc14cc15000ccc14cc150008cc14cc150004cc14cc100cc14cc150c144dd5004a5eb80c154c154004c150004c14c004c148004c144004c140004c13c004c128dd5001c56600266e1d200e0018991919191919191918209982a182a8041982a182a8039982a182a8031982a182a8029982a182a8021982a182a8019982a182a8011982a182a8009982a18209982a182a98291baa00a4bd70182b182b000982a800982a0009829800982900098288009828000982780098251baa0038acc004cdc3a4020003132323232323232323230423305530560093305530560083305530560073305530560063305530560053305530560043305530560033305530560023305530560013305530423305530563053375401697ae0305730570013056001305500130540013053001305200130510013050001304f001304a375400715980099b87480480062646464646464646464646086660ac60ae014660ac60ae012660ac60ae010660ac60ae00e660ac60ae00c660ac60ae00a660ac60ae008660ac60ae006660ac60ae004660ac60ae002660ac6086660ac60ae60a86ea80312f5c060b060b000260ae00260ac00260aa00260a800260a600260a400260a200260a0002609e00260946ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c110cc15cc16002ccc15cc160028cc15cc160024cc15cc160020cc15cc16001ccc15cc160018cc15cc160014cc15cc160010cc15cc16000ccc15cc160008cc15cc160004cc15cc110cc15cc160c154dd5006a5eb80c164c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c128dd5001c56600266e1d2016001899191919191919191919191918229982c182c8061982c182c8059982c182c8051982c182c8049982c182c8041982c182c8039982c182c8031982c182c8029982c182c8021982c182c8019982c182c8011982c182c8009982c18229982c182c982b1baa00e4bd70182d182d000982c800982c000982b800982b000982a800982a0009829800982900098288009828000982780098251baa003899191919191919191919191918229982c182c8061982c182c8059982c182c8051982c182c8049982c182c8041982c182c8039982c182c8031982c182c8029982c182c8021982c182c8019982c182c8011982c182c8009982c182c982d0009982c18229982c182c982b1baa00e4bd7025eb80c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c128dd5001a0904120824104820904120824104820904120824104818241baa001304b002400c8248dd718241824800991acc004c08400a2653001001a5eb82006800888966002607800312323304c374e002660986ea40092f5c065300100180252f5c080088896600200510018cc00400e60a00053304e304f002001400c826a246530010059982618268008024c05000e6eb8c134c1380050051802800a08c8b2086375c60906092006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241191598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41188230dc4000c888c8cc12cc00cdd698260009982598261826800a5eb80c00c0066608e6ea0cdc7000a40006608e6ea4cc040c03cdc6800800a5eb8122232329800919802919198279ba833794940dd718280009982798281828800a5eb816600260386e3400626609c6ea4c064004cc138dd49980d980d1b8d0010014bd7045904a1191801acc004c104006298103d87a80008981e198279ba80014bd70209630030019bad304d003911191acc006600260846eb4c14400694294504c44cc02000c8c014c0f8cc144dd4000a5eb822601e600898103d87a800041306eb8c144c148004cc13cdd419b8e00148000cc13cdd49980c180b9b8d0010014bd7024446b30013041002898019181e99828000a5eb822b3001304600289801919ba548008cc1400052f5c1159800981c00144c00c8cdd2a4008660a000297ae08acc004c03400a26600e464660a26ea0cde5250375c60a4002660a260a460a600297ae059800981c1b8d0018998281ba930230013305037526605260506e340040052f5c1164130466e95200633050375000297ae08acc004c03000a26600e464660a26ea0cde5250375c60a4002660a260a460a600297ae059800981c1b8d0018998281ba930230013305037526605260506e340040052f5c1164130466e952008330503750b3001337100029040400244006266e04004c0192020413097ae08acc004cdc3a40140051300323374a900519828000a5eb822b30013370e900600144cc0048cdd2a4018660a000297ae0232330513750600c6eb4c148004cc144c148c14c0052f5c064660a26ea0cde5250375c60a4002660a260a460a600297ae059800980f1b8d0018998281ba9301b0013305037526603a60386e340040052f5c116413115980099b874803800a266002466e95200e330500014bd70119198289ba833794940dd718290009982898291829800a5eb8166002603c6e340062660a06ea4c06c004cc140dd49980e980e1b8d0010014bd7045904c456600266e1d2010002899800919ba548040cc1400052f5c0464660a26ea0cde5250375c60a4002660a260a460a600297ae059800980f1b8d0018998281ba9301b0013305037526603a60386e340040052f5c116413115980099b874804800a246464660a466e9520123305230530014bd70198291829982a000a5eb80c004008cc0208c8cc148dd419bca4a06eb8c14c004cc148c14cc1500052f5c0b30013039371a00313305137526048002660a26ea4cc0a8c0a4dc6800800a5eb822c8268966002608600314c103d87980008acc004c120006298103d87a80008acc004c0e8006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b209a4134826904d209a8acc004cdc3a40280051300323374a900a19828000a5eb822b30013370e900b00144c00c8cdd2a402c660a000297ae08acc004cdc3a403000513300123374a900c19828000a5eb808c8cc144dd419bca4a06eb8c148004cc144c148c14c0052f5c0b3001301e371a00313305037526036002660a06ea4cc074c070dc6800800a5eb822c82622c825904b2096412c825904b2096412c825904b2096412c8258dd718281828803096600266e2000520808080808080808080028800c4cdc0800980124100028240c00c00c6eb4c118004c8cc114dd419b8e00148000cc114dd49980718069b8d0010014bd701bae3045304600420768b2070371890011b80480051640b46eb8c0c8c0cc00566002600e6e340062660606ea4c008004cc0c0dd49980298021b8d0010014bd7045902c1bae301f302d37546602c4646b30013371e6eb8c0c800522104b9011a82008919191919191919911981d18139981d181d8039981d1ba90013303a303b0024bd701981d181d981e00125eb80d660026024003125980099b89002371a00313303937526601e004002660726ea66002005337026e3400400a002b8c25eb822c81aa2c81a0dd7181c981d0011bae3039004375a6070002646606e6ea0cde5250375c60700026606e6070607200297ae059800980f1b8d00189981b1ba930090013303637526601e601c6e340040052f5c11640c86eb8c0d8c0dc004d6600294624b30013371290201b8d00189981a9ba93300b48100004cc0d4dd4cc005204099b80371a002901fc0057184bd704590314590301bae30353036001300100259800a51892cc004cdc4a4100026e340062660666ea4cc0252080010013303337533001482000666e00dc6800a40ff0015c612f5c11640bd1640b91640b46eb8c0c8c0cc00566002600e6e340062660606ea4c008004cc0c0dd49980298021b8d0010014bd7045902c1bae303000a300348010c00d2008198010011814000a04a899180118138019bae3025002408c6eb0c088c07cdd5000c5901d19199119801001000912cc004006298103d87a80008992cc004cdd78021810800c4c044cc090c0880052f5c11330030033026002408060480028110dd59811181198119811981198119811981198119811980f9baa0173374a90021981019ba548008cc080c038c078dd51810980f1baa0014bd7025eb822c80e0c8cc004004dd61807980f1baa0162259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a51407910018998018019812001203c325980099912cc00400a294226530013259800980c18119baa00189bad302430273756604e60486ea800629000204430260019baf302630270019bab003488966002003159800980100344cc01400d20008a5040911325980099baf30260014c010140008acc004cc018010dd6981398151bab3027001898019ba6302b0028a5040951598009980300224001130030078a5040948128c0a40050270ca60020033756602860466ea8c050c08cdd5002488cc09c008cc09cdd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0940066eacc09800660540069112cc004cdc8a441000038acc004cdc7a44100003899802980c198159ba60024bd70000c4cc015300103d87a8000006409d19800803c006446600e0046605a66ec0dd48029ba6004001401c8138605000481322942294229410271ba633022337606ea401cdd31981119bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c5660026032603e6ea8c08cc080dd5181198101baa30113020375400313259800980618101baa0018992cc004c058c084dd5000c4c8c8c8c8cc8966002605800713259800980e98141baa0018991919194c004dd69818000cdd718180024dd69818001cdd7181800124444b3001303500589980c9bab303400e225980080144cc06c030896600200513024330370144bd7044c8c8cc06cc0d80084c00cc0ec010dd7181b000981c001206c899191980c981a80109801981c8021bae3033001303600240d11640c83030001302f001302e0013029375400316409c605600d1640a46eb8c0a4004dd5981480118148009814000981380098111baa0018b204030243021375400316407c602460406ea8c044c080dd5000c5901e4530103d87a800040786044002810089660026024603a6ea800a2646464b30013025002899803181200189980300080245902218118009811800980f1baa0028b203822598009808980e1baa00289919192cc004c09000a26464b300130160018acc004c088dd5001401a2c811a2b3001301b001899192cc004c0a000a0111640946eb4c098004c088dd50014566002601a00315980098111baa0028034590234590202040408060406ea8004c08c00e2c8108c96600260400031598009805180f800c5a26032603e00280f22c8108dd518110009811000980e9baa0028b20362444464b3001300e301937540031301d301a37540031640606600e66e0800d66002601a60306ea8012266e0400400a266e040080050170010c054dd51800a41413802602a6ea8c060c054dd5001260103d87980008b202633001337046eb4c014c04cdd500324100fa9001118019980b1ba8001330164c10101004bd70112cc004c020006298103d87a80008acc004cdc4000a40011300333016300333016375066e05200000233016375066e0520000014bd7025eb82260066602c60066602c6ea0008cc058dd4000a5eb812f5c0809101222c805860126ea800e2c8038601000260066ea802629344d9590011", + "hash": "715413ffebf875023cc8c1e9eb7af1d49b808139940295a4d56acf5a" }, { "title": "open_position.open_position.spend", @@ -111,12 +111,12 @@ { "title": "config", "schema": { - "$ref": "#/definitions/lazer_perps~1types~1PerpsConfig" + "$ref": "#/definitions/lazer_perps~1types~1MarketConfig" } } ], - "compiledCode": "591607010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a460226024003230113012301230123012301200191808980918091809000a4444b30013370e6eb4c05260026e1d20049b89480124464b30013371e910100375c602e6030003130170018b202430020019119198008008019119801800980100148c054c058c0580066eb8c050c044dd500c4dd6980198089baa0049ba54800122222222323232598009810000c4c966002602260386ea800626464b30013013301e375400313259800980a180f9baa0018992cc004c054c080dd5000c4cc08cc090c084dd500119811981218109baa0014bd7045901f180898101baa0038b203c3022301f37540031640746020603c6ea8004c080c074dd5000c5901b19198008009bac3008301d3754604000444b30010018a6103d87a80008992cc004cdc39bad3022301f375400201113007330210014bd7044cc00c00cc08c00901d1810800a03e8b203a32598009808180d9baa0018992cc004c044c070dd5000c4c8cc0280048966002005132330010010042259800800c52f5c113302498009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301823235980099b8f375c60600029110475d3c793008cc004888c8cc00cdd6981a0009bae3034303500130030019b89480426e3120109b804803e600e90082444446600a4646606c6ea0cde5250375c606e0026606c606e607000297ae05980098029b8d00189981a9ba930020013303537526600860066e340040052f5c11640c446644660104660706ea0cdc7000a4000660706ea4cc00cc008dc6800800a5eb808cc0248cc0e4dd419b8e00148000cc0e4dd49980218019b8d0010014bd701119191981e18111981e1ba80083303c375000a66078607a00297ae03303c303d303e0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605e00312323303f374e0026607e6ea40092f5c065300100180252f5c080088896600200510018cc00400e6086005330413042002001400c8202246530010059981f98200008024c02400e6eb8c100c1040050054c004c8cc0fcdd419bca4a06eb8c100004cc0fcc100c1040052f5c0b30013017371a00313303e375260240026607c6ea4cc054c050dc6800800a5eb822c81d24466080004660806ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11c00a60586608c608e0106608c98103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a80004bd70200222259800801440063300100398250014c8c966002607800313230313304b304c0013304b30313304b304c3049375400697ae0304d304d001304837540071598009820800c4c8c8c0c8cc130c134008cc130c134004cc130c0c8cc130c134c128dd500225eb80c138c138004c134004c120dd5001c566002606e003132323230333304d304e0033304d304e0023304d304e0013304d30333304d304e304b375400a97ae0304f304f001304e001304d001304837540071598009805000c4c8c8c8c8c0d0cc138c13c010cc138c13c00ccc138c13c008cc138c13c004cc138c0d0cc138c13cc130dd500325eb80c140c140004c13c004c138004c134004c120dd5001c56600260120031323232323230353304f30500053304f30500043304f30500033304f30500023304f30500013304f30353304f3050304d375400e97ae0305130510013050001304f001304e001304d0013048375400715980099b87480280062646464646464606c660a060a200c660a060a200a660a060a2008660a060a2006660a060a2004660a060a2002660a0606c660a060a2609c6ea80212f5c060a460a400260a200260a0002609e002609c002609a00260906ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc144c14801ccc144c148018cc144c148014cc144c148010cc144c14800ccc144c148008cc144c148004cc144c0dccc144c148c13cdd5004a5eb80c14cc14c004c148004c144004c140004c13c004c138004c134004c120dd5001c56600266e1d200e00189919191919191919181c19829182980419829182980399829182980319829182980299829182980219829182980199829182980119829182980099829181c19829182998281baa00a4bd70182a182a000982980098290009828800982800098278009827000982680098241baa0038acc004cdc3a4020003132323232323232323230393305330540093305330540083305330540073305330540063305330540053305330540043305330540033305330540023305330540013305330393305330543051375401697ae03055305500130540013053001305200130510013050001304f001304e001304d0013048375400715980099b87480480062646464646464646464646074660a860aa014660a860aa012660a860aa010660a860aa00e660a860aa00c660a860aa00a660a860aa008660a860aa006660a860aa004660a860aa002660a86074660a860aa60a46ea80312f5c060ac60ac00260aa00260a800260a600260a400260a200260a0002609e002609c002609a00260906ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc154c15802ccc154c158028cc154c158024cc154c158020cc154c15801ccc154c158018cc154c158014cc154c158010cc154c15800ccc154c158008cc154c158004cc154c0eccc154c158c14cdd5006a5eb80c15cc15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c120dd5001c56600266e1d20160018991919191919191919191919181e1982b182b8061982b182b8059982b182b8051982b182b8049982b182b8041982b182b8039982b182b8031982b182b8029982b182b8021982b182b8019982b182b8011982b182b8009982b181e1982b182b982a1baa00e4bd70182c182c000982b800982b000982a800982a000982980098290009828800982800098278009827000982680098241baa0038991919191919191919191919181e1982b182b8061982b182b8059982b182b8051982b182b8049982b182b8041982b182b8039982b182b8031982b182b8029982b182b8021982b182b8019982b182b8011982b182b8009982b182b982c0009982b181e1982b182b982a1baa00e4bd7025eb80c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c120dd5001a08c41188231046208c41188231046208c4118823104618231baa0013049002400c8238dd718231823800991acc004c08400a2653001001a5eb82006800888966002607400312323304a374e002660946ea40092f5c065300100180252f5c080088896600200510018cc00400e609c0053304c304d002001400c825a246530010059982518258008024c05000e6eb8c12cc1300050051802800a0888b2082375c608c608e006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241111598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41108220dc4000c888c8cc124c00cdd698250009982498251825800a5eb80c00c0066608a6ea0cdc7000a40006608a6ea4cc040c03cdc6800800a5eb8122232329800919802919198269ba833794940dd718270009982698271827800a5eb816600260386e340062660986ea4c064004cc130dd49980d980d1b8d0010014bd704590481191801acc004c0fc006298103d87a800089819998269ba80014bd70209230030019bad304b003911191acc006600260806eb4c13c00694294504a44cc02000c8c014c0d4cc13cdd4000a5eb822601e600898103d87a800041286eb8c13cc140004cc134dd419b8e00148000cc134dd49980c180b9b8d0010014bd7024446b3001303f002898019181a19827000a5eb822b3001304400289801919ba548008cc1380052f5c1159800981d00144c00c8cdd2a40086609c00297ae08acc004c03400a26600e4646609e6ea0cde5250375c60a00026609e60a060a200297ae059800981d1b8d0018998271ba930230013304e37526605260506e340040052f5c1164128466e9520063304e375000297ae08acc004c03000a26600e4646609e6ea0cde5250375c60a00026609e60a060a200297ae059800981d1b8d0018998271ba930230013304e37526605260506e340040052f5c1164128466e9520083304e3750b3001337100029040400244006266e04004c0192020412897ae08acc004cdc3a40140051300323374a900519827000a5eb822b30013370e900600144cc0048cdd2a40186609c00297ae02323304f3750600c6eb4c140004cc13cc140c1440052f5c0646609e6ea0cde5250375c60a00026609e60a060a200297ae059800980f1b8d0018998271ba9301b0013304e37526603a60386e340040052f5c116412915980099b874803800a266002466e95200e3304e0014bd70119198279ba833794940dd718280009982798281828800a5eb8166002603c6e3400626609c6ea4c06c004cc138dd49980e980e1b8d0010014bd7045904a456600266e1d2010002899800919ba548040cc1380052f5c04646609e6ea0cde5250375c60a00026609e60a060a200297ae059800980f1b8d0018998271ba9301b0013304e37526603a60386e340040052f5c116412915980099b874804800a246464660a066e9520123305030510014bd701982818289829000a5eb80c004008cc0208c8cc140dd419bca4a06eb8c144004cc140c144c1480052f5c0b3001303b371a00313304f375260480026609e6ea4cc0a8c0a4dc6800800a5eb822c8258966002608200314c103d87980008acc004c118006298103d87a80008acc004c0f0006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b2096412c825904b20968acc004cdc3a40280051300323374a900a19827000a5eb822b30013370e900b00144c00c8cdd2a402c6609c00297ae08acc004cdc3a403000513300123374a900c19827000a5eb808c8cc13cdd419bca4a06eb8c140004cc13cc140c1440052f5c0b3001301e371a00313304e375260360026609c6ea4cc074c070dc6800800a5eb822c82522c8249049209241248249049209241248249049209241248248dd718271827803096600266e2000520808080808080808080028800c4cdc0800980124100028230c00c00c6eb4c110004c8cc10cdd419b8e00148000cc10cdd49980718069b8d0010014bd701bae3043304400420728b206c371890011b80480051640ac6eb8c0c0c0c400566002600e6e3400626605c6ea4c008004cc0b8dd49980298021b8d0010014bd7045902a1bae3016302b3754660304646b30013371e6eb8c0c000522104b9011a82008919191919191919911981c180f1981c181c8039981c1ba90013303830390024bd701981c181c981d00125eb80d660026024003125980099b89002371a00313303737526601e0040026606e6ea66002005337026e3400400a002b8c25eb822c819a2c8190dd7181b981c0011bae3037004375a606c002646606a6ea0cde5250375c606c0026606a606c606e00297ae05980098101b8d00189981a1ba930090013303437526601e601c6e340040052f5c11640c06eb8c0d0c0d4004d6600294624b30013371290201b8d0018998199ba93300b48100004cc0ccdd4cc005204099b80371a002901fc0057184bd7045902f45902e1bae30333034001300100259800a51892cc004cdc4a4100026e340062660626ea4cc0252080010013303137533001482000666e00dc6800a40ff0015c612f5c11640b51640b11640ac6eb8c0c0c0c400566002600e6e3400626605c6ea4c008004cc0b8dd49980298021b8d0010014bd7045902a1bae302e00a300348010c00d2008198010011813000a046899180118128019bae302300240846eb0c080c074dd5000c5901b19199119801001000912cc004006298103d87a80008992cc004cdd7802180f800c4c020cc088c0800052f5c11330030033024002407860440028100dd59810181098109810981098109810981098109810980e9baa0153374a90021980f19ba548008cc078c030c070dd5180f980e1baa0014bd7025eb822c80d0c8cc004004dd61807180e1baa0142259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a514071100189980180198110012038325980099912cc00400a294226530013259800980b18109baa00189bad302230253756604a60446ea800629000204030240019baf302430250019bab003488966002003159800980100344cc01400d20008a5040891325980099baf30240014c010140008acc004cc018010dd6981298141bab3025001898019ba630290028a50408d1598009980300224001130030078a50408c8118c09c0050250ca60020033756602660426ea8c04cc084dd5002488cc094008cc094dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c08c0066eacc09000660500069112cc004cdc8a441000038acc004cdc7a441000038998029807998149ba60024bd70000c4cc015300103d87a8000006409519800803c006446600e0046605666ec0dd48029ba6004001401c8128604c00481222942294229410251ba633020337606ea4020dd31981019bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602e603a6ea8c084c078dd51810980f1baa3010301e3754003132598009807180f1baa0018992cc004c050c07cdd5000c4c8c8c8c8cc8966002605400713259800980d98131baa0018991919194c004dd69817000cdd718170024dd69817001cdd7181700124444b3001303300589980d9bab303200e225980080144cc07403089660020051301b330350144bd7044c8c8cc06cc0d00084c00cc0e4010dd7181a000981b0012068899191980c981980109801981b8021bae3031001303400240c91640c0302e001302d001302c00130273754003164094605200d16409c6eb8c09c004dd5981380118138009813000981280098101baa0018b203c3022301f37540031640746012603c6ea8c040c078dd5000c5901c4530103d87a80004070604000280f08966002602060366ea800a2646464b30013023002899803181100189980300080245902018108009810800980e1baa0028b203422598009807980d1baa00289919192cc004c08800a26464b300130140018acc004c080dd5001401a2c810a2b30013019001899192cc004c09800a01116408c6eb4c090004c080dd50014566002601e00315980098101baa00280345902145901e203c4078603c6ea8004c08400e2c80f8c966002603c0031598009806180e800c5a2602e603a00280e22c80f8dd518100009810000980d9baa0028b20321bad3002301137540091337126eb4c050c054c054c054c054c044dd500219b82375a600260226ea8010dd6980198089baa0188a50403c8b201618049baa0038b200e180400098019baa0098a4d13656400401", - "hash": "5ff29dd2e6a0cf4da7107dd0badf9b60917b4b51860a5b89fd536643" + "compiledCode": "591648010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a46022602460240032301130123012301200148896600266e1cdd69809cc0048c050c0540066e1d20049b89480124464b30013371e91100375c602c602e003130160018b20223002001911919800800801911980180098010014dd7180998081baa0179ba54800122222223232332259800980f80144c966002602060366ea800626464b30013012301d3754003132598009809980f1baa0018992cc004c050c07cdd5000c4cc088c08cc080dd500119811181198101baa0014bd7045901e181118119811981198119811980f9baa0038b203a3021301e3754003164070601a603a6ea8004c07cc070dd5000c5901a19198008009bac300e301c3754603e00644b30010018a6103d87a80008992cc004cdc39bad3021301e375400200913008330200014bd7044cc00c00cc08800901c1810000a03c8b203832598009807180c9baa0018992cc004c03cc068dd5000c4c8cc0200048966002005132330010010042259800800c52f5c113302298009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301623235980099b8f375c605c0029110475d3c793008cc004888c8cc00cdd698190009bae3032303300130030019b89480426e3120109b804803e600e90082444446600a464660686ea0cde5250375c606a00266068606a606c00297ae05980098029b8d0018998199ba930020013303337526600860066e340040052f5c11640bc466446601046606c6ea0cdc7000a40006606c6ea4cc00cc008dc6800800a5eb808cc0248cc0dcdd419b8e00148000cc0dcdd49980218019b8d0010014bd701119191981d18111981d1ba80083303a375000a66074607600297ae03303a303b303c0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605a00312323303d374e0026607a6ea40092f5c065300100180252f5c080088896600200510018cc00400e60820053303f3040002001400c81f2246530010059981e981f0008024c02400e6eb8c0f8c0fc0050054c004c8cc0f4dd419bca4a06eb8c0f8004cc0f4c0f8c0fc0052f5c0b30013017371a00313303c37526024002660786ea4cc054c050dc6800800a5eb822c81c2446607c0046607c6ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11400a605866088608a0106608898103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a80004bd70200222259800801440063300100398240014c8c9660026074003132303133049304a00133049303133049304a3047375400697ae0304b304b00130463754007159800981f800c4c8c8c0c8cc128c12c008cc128c12c004cc128c0c8cc128c12cc120dd500225eb80c130c130004c12c004c118dd5001c566002606a003132323230333304b304c0033304b304c0023304b304c0013304b30333304b304c3049375400a97ae0304d304d001304c001304b001304637540071598009805000c4c8c8c8c8c0d0cc130c134010cc130c13400ccc130c134008cc130c134004cc130c0d0cc130c134c128dd500325eb80c138c138004c134004c130004c12c004c118dd5001c56600260120031323232323230353304d304e0053304d304e0043304d304e0033304d304e0023304d304e0013304d30353304d304e304b375400e97ae0304f304f001304e001304d001304c001304b0013046375400715980099b87480280062646464646464606c6609c609e00c6609c609e00a6609c609e0086609c609e0066609c609e0046609c609e0026609c606c6609c609e60986ea80212f5c060a060a0002609e002609c002609a00260980026096002608c6ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc13cc14001ccc13cc140018cc13cc140014cc13cc140010cc13cc14000ccc13cc140008cc13cc140004cc13cc0dccc13cc140c134dd5004a5eb80c144c144004c140004c13c004c138004c134004c130004c12c004c118dd5001c56600266e1d200e00189919191919191919181c19828182880419828182880399828182880319828182880299828182880219828182880199828182880119828182880099828181c19828182898271baa00a4bd7018291829000982880098280009827800982700098268009826000982580098231baa0038acc004cdc3a402000313232323232323232323039330513052009330513052008330513052007330513052006330513052005330513052004330513052003330513052002330513052001330513039330513052304f375401697ae030533053001305200130510013050001304f001304e001304d001304c001304b0013046375400715980099b87480480062646464646464646464646074660a460a6014660a460a6012660a460a6010660a460a600e660a460a600c660a460a600a660a460a6008660a460a6006660a460a6004660a460a6002660a46074660a460a660a06ea80312f5c060a860a800260a600260a400260a200260a0002609e002609c002609a00260980026096002608c6ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc14cc15002ccc14cc150028cc14cc150024cc14cc150020cc14cc15001ccc14cc150018cc14cc150014cc14cc150010cc14cc15000ccc14cc150008cc14cc150004cc14cc0eccc14cc150c144dd5006a5eb80c154c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c118dd5001c56600266e1d20160018991919191919191919191919181e1982a182a8061982a182a8059982a182a8051982a182a8049982a182a8041982a182a8039982a182a8031982a182a8029982a182a8021982a182a8019982a182a8011982a182a8009982a181e1982a182a98291baa00e4bd70182b182b000982a800982a00098298009829000982880098280009827800982700098268009826000982580098231baa0038991919191919191919191919181e1982a182a8061982a182a8059982a182a8051982a182a8049982a182a8041982a182a8039982a182a8031982a182a8029982a182a8021982a182a8019982a182a8011982a182a8009982a182a982b0009982a181e1982a182a98291baa00e4bd7025eb80c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c118dd5001a0884110822104420884110822104420884110822104418221baa0013047002400c8228dd718221822800991acc004c08400a2653001001a5eb820068008889660026070003123233048374e002660906ea40092f5c065300100180252f5c080088896600200510018cc00400e60980053304a304b002001400c824a246530010059982418248008024c05000e6eb8c124c1280050051802800a0848b207e375c6088608a006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241091598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41088210dc4000c888c8cc11cc00cdd698240009982398241824800a5eb80c00c006660866ea0cdc7000a4000660866ea4cc040c03cdc6800800a5eb8122232329800919802919198259ba833794940dd718260009982598261826800a5eb816600260386e340062660946ea4c064004cc128dd49980d980d1b8d0010014bd704590461191801acc004c0f4006298103d87a800089819998259ba80014bd70208e30030019bad3049003911191acc0066002607c6eb4c13400694294504844cc02000c8c014c0d4cc134dd4000a5eb822601e600898103d87a800041206eb8c134c138004cc12cdd419b8e00148000cc12cdd49980c180b9b8d0010014bd7024446b3001303d002898019181a19826000a5eb822b3001304200289801919ba548008cc1300052f5c1159800981c00144c00c8cdd2a40086609800297ae08acc004c03400a26600e4646609a6ea0cde5250375c609c0026609a609c609e00297ae059800981c1b8d0018998261ba930230013304c37526605260506e340040052f5c1164120466e9520063304c375000297ae08acc004c03000a26600e4646609a6ea0cde5250375c609c0026609a609c609e00297ae059800981c1b8d0018998261ba930230013304c37526605260506e340040052f5c1164120466e9520083304c3750b3001337100029040400244006266e04004c0192020412097ae08acc004cdc3a40140051300323374a900519826000a5eb822b30013370e900600144cc0048cdd2a40186609800297ae02323304d3750600c6eb4c138004cc134c138c13c0052f5c0646609a6ea0cde5250375c609c0026609a609c609e00297ae059800980f1b8d0018998261ba9301b0013304c37526603a60386e340040052f5c116412115980099b874803800a266002466e95200e3304c0014bd70119198269ba833794940dd718270009982698271827800a5eb8166002603c6e340062660986ea4c06c004cc130dd49980e980e1b8d0010014bd70459048456600266e1d2010002899800919ba548040cc1300052f5c04646609a6ea0cde5250375c609c0026609a609c609e00297ae059800980f1b8d0018998261ba9301b0013304c37526603a60386e340040052f5c116412115980099b874804800a2464646609c66e9520123304e304f0014bd701982718279828000a5eb80c004008cc0208c8cc138dd419bca4a06eb8c13c004cc138c13cc1400052f5c0b30013039371a00313304d375260480026609a6ea4cc0a8c0a4dc6800800a5eb822c8248966002607e00314c103d87980008acc004c110006298103d87a80008acc004c0e8006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20924124824904920928acc004cdc3a40280051300323374a900a19826000a5eb822b30013370e900b00144c00c8cdd2a402c6609800297ae08acc004cdc3a403000513300123374a900c19826000a5eb808c8cc134dd419bca4a06eb8c138004cc134c138c13c0052f5c0b3001301e371a00313304c37526036002660986ea4cc074c070dc6800800a5eb822c82422c8239047208e411c8239047208e411c8239047208e411c8238dd718261826803096600266e2000520808080808080808080028800c4cdc0800980124100028220c00c00c6eb4c108004c8cc104dd419b8e00148000cc104dd49980718069b8d0010014bd701bae30413042004206e8b2068371890011b80480051640a46eb8c0b8c0bc00566002600e6e340062660586ea4c008004cc0b0dd49980298021b8d0010014bd704590281bae301b302937546602c4646b30013371e6eb8c0b800522104b9011a82008919191919191919911981b180f1981b181b8039981b1ba90013303630370024bd701981b181b981c00125eb80d660026024003125980099b89002371a00313303537526601e0040026606a6ea66002005337026e3400400a002b8c25eb822c818a2c8180dd7181a981b0011bae3035004375a606800264660666ea0cde5250375c6068002660666068606a00297ae059800980f1b8d0018998191ba930090013303237526601e601c6e340040052f5c11640b86eb8c0c8c0cc004d6600294624b30013371290201b8d0018998189ba93300b48100004cc0c4dd4cc005204099b80371a002901fc0057184bd7045902d45902c1bae30313032001300100259800a51892cc004cdc4a4100026e3400626605e6ea4cc0252080010013302f37533001482000666e00dc6800a40ff0015c612f5c11640ad1640a91640a46eb8c0b8c0bc00566002600e6e340062660586ea4c008004cc0b0dd49980298021b8d0010014bd704590281bae302c00a300348010c00d2008198010011812000a042899180118118019bae3021002407c6eb0c078c06cdd5000c5901919199119801001000912cc004006298103d87a80008992cc004cdd7802180e800c4c020cc080c0780052f5c113300300330220024070604000280f0dd5980f180f980f980f980f980f980f980f980f980f980d9baa0133374a90021980e19ba548008cc070c02cc068dd5180e980d1baa0014bd7025eb822c80c0c8cc004004dd61805180d1baa0122259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a514069100189980180198100012034325980099912cc00400a294226530013259800980a180f9baa00189bad302030233756604660406ea800629000203c30220019baf302230230019bab003488966002003159800980100344cc01400d20008a5040811325980099baf30220014c010140008acc004cc018010dd6981198131bab3023001898019ba630270028a5040851598009980300224001130030078a5040848108c0940050230ca60020033756601e603e6ea8c03cc07cdd5002488cc08c008cc08cdd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0840066eacc088006604c0069112cc004cdc8a441000038acc004cdc7a441000038998029807998139ba60024bd70000c4cc015300103d87a8000006408d19800803c006446600e0046605266ec0dd48029ba6004001401c8118604800481122942294229410231ba63301e337606ea401cdd31980f19bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602a60366ea8c07cc070dd5180f980e1baa300c301c3754003132598009806180e1baa0018992cc004c048c074dd5000c4c8c8c8c8cc8966002605000713259800980c98121baa0018991919194c004dd69816000cdd718160024dd69816001cdd7181600124444b3001303100589980c9bab303000e225980080144cc06c03089660020051301b330330144bd7044c8c8cc06cc0c80084c00cc0dc010dd71819000981a0012064899191980c981880109801981a8021bae302f001303200240c11640b8302c001302b001302a0013025375400316408c604e00d1640946eb8c094004dd59812801181280098120009811800980f1baa0018b20383020301d375400316406c601c60386ea8c030c070dd5000c5901a4530103d87a80004068603c00280e0dd69804980c9baa02022598009807180c9baa00289919192cc004c08400a26600c604000626600c002009164078603e002603e00260346ea800a2c80c08966002601a60306ea800a2646464b30013020002899192cc004c0480062b3001301e37540050068b203e8acc004c05c00626464b300130240028044590211bad3022001301e37540051598009806800c566002603c6ea800a00d16407d16407080e101c180e1baa001301f0038b203a3259800980e000c56600260146036003168980a980d800a0348b203a3754603c002603c00260326ea800a2c80b86eb4c04cc050c050c050c050c040dd5001c56600266e24dd6980098081baa003337046eb4c008c040dd50019bad30023010375402f15980099b89375a600260206ea805cdd6980118081baa0038acc004cdc4240006eb4c004c040dd5001c4cdc4240006eb4c008c040dd5001c528201c8a50403914a08072294100e22c805860126ea800e2c8038601000260066ea802629344d95900101", + "hash": "62b7b99b456a860b71ccfd4d4e23bad82afb05a5660d0bfea90ce62b" }, { "title": "open_position.open_position.else", @@ -127,12 +127,53 @@ { "title": "config", "schema": { - "$ref": "#/definitions/lazer_perps~1types~1PerpsConfig" + "$ref": "#/definitions/lazer_perps~1types~1MarketConfig" } } ], - "compiledCode": "591607010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a460226024003230113012301230123012301200191808980918091809000a4444b30013370e6eb4c05260026e1d20049b89480124464b30013371e910100375c602e6030003130170018b202430020019119198008008019119801800980100148c054c058c0580066eb8c050c044dd500c4dd6980198089baa0049ba54800122222222323232598009810000c4c966002602260386ea800626464b30013013301e375400313259800980a180f9baa0018992cc004c054c080dd5000c4cc08cc090c084dd500119811981218109baa0014bd7045901f180898101baa0038b203c3022301f37540031640746020603c6ea8004c080c074dd5000c5901b19198008009bac3008301d3754604000444b30010018a6103d87a80008992cc004cdc39bad3022301f375400201113007330210014bd7044cc00c00cc08c00901d1810800a03e8b203a32598009808180d9baa0018992cc004c044c070dd5000c4c8cc0280048966002005132330010010042259800800c52f5c113302498009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301823235980099b8f375c60600029110475d3c793008cc004888c8cc00cdd6981a0009bae3034303500130030019b89480426e3120109b804803e600e90082444446600a4646606c6ea0cde5250375c606e0026606c606e607000297ae05980098029b8d00189981a9ba930020013303537526600860066e340040052f5c11640c446644660104660706ea0cdc7000a4000660706ea4cc00cc008dc6800800a5eb808cc0248cc0e4dd419b8e00148000cc0e4dd49980218019b8d0010014bd701119191981e18111981e1ba80083303c375000a66078607a00297ae03303c303d303e0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605e00312323303f374e0026607e6ea40092f5c065300100180252f5c080088896600200510018cc00400e6086005330413042002001400c8202246530010059981f98200008024c02400e6eb8c100c1040050054c004c8cc0fcdd419bca4a06eb8c100004cc0fcc100c1040052f5c0b30013017371a00313303e375260240026607c6ea4cc054c050dc6800800a5eb822c81d24466080004660806ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11c00a60586608c608e0106608c98103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a80004bd70200222259800801440063300100398250014c8c966002607800313230313304b304c0013304b30313304b304c3049375400697ae0304d304d001304837540071598009820800c4c8c8c0c8cc130c134008cc130c134004cc130c0c8cc130c134c128dd500225eb80c138c138004c134004c120dd5001c566002606e003132323230333304d304e0033304d304e0023304d304e0013304d30333304d304e304b375400a97ae0304f304f001304e001304d001304837540071598009805000c4c8c8c8c8c0d0cc138c13c010cc138c13c00ccc138c13c008cc138c13c004cc138c0d0cc138c13cc130dd500325eb80c140c140004c13c004c138004c134004c120dd5001c56600260120031323232323230353304f30500053304f30500043304f30500033304f30500023304f30500013304f30353304f3050304d375400e97ae0305130510013050001304f001304e001304d0013048375400715980099b87480280062646464646464606c660a060a200c660a060a200a660a060a2008660a060a2006660a060a2004660a060a2002660a0606c660a060a2609c6ea80212f5c060a460a400260a200260a0002609e002609c002609a00260906ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc144c14801ccc144c148018cc144c148014cc144c148010cc144c14800ccc144c148008cc144c148004cc144c0dccc144c148c13cdd5004a5eb80c14cc14c004c148004c144004c140004c13c004c138004c134004c120dd5001c56600266e1d200e00189919191919191919181c19829182980419829182980399829182980319829182980299829182980219829182980199829182980119829182980099829181c19829182998281baa00a4bd70182a182a000982980098290009828800982800098278009827000982680098241baa0038acc004cdc3a4020003132323232323232323230393305330540093305330540083305330540073305330540063305330540053305330540043305330540033305330540023305330540013305330393305330543051375401697ae03055305500130540013053001305200130510013050001304f001304e001304d0013048375400715980099b87480480062646464646464646464646074660a860aa014660a860aa012660a860aa010660a860aa00e660a860aa00c660a860aa00a660a860aa008660a860aa006660a860aa004660a860aa002660a86074660a860aa60a46ea80312f5c060ac60ac00260aa00260a800260a600260a400260a200260a0002609e002609c002609a00260906ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc154c15802ccc154c158028cc154c158024cc154c158020cc154c15801ccc154c158018cc154c158014cc154c158010cc154c15800ccc154c158008cc154c158004cc154c0eccc154c158c14cdd5006a5eb80c15cc15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c120dd5001c56600266e1d20160018991919191919191919191919181e1982b182b8061982b182b8059982b182b8051982b182b8049982b182b8041982b182b8039982b182b8031982b182b8029982b182b8021982b182b8019982b182b8011982b182b8009982b181e1982b182b982a1baa00e4bd70182c182c000982b800982b000982a800982a000982980098290009828800982800098278009827000982680098241baa0038991919191919191919191919181e1982b182b8061982b182b8059982b182b8051982b182b8049982b182b8041982b182b8039982b182b8031982b182b8029982b182b8021982b182b8019982b182b8011982b182b8009982b182b982c0009982b181e1982b182b982a1baa00e4bd7025eb80c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c120dd5001a08c41188231046208c41188231046208c4118823104618231baa0013049002400c8238dd718231823800991acc004c08400a2653001001a5eb82006800888966002607400312323304a374e002660946ea40092f5c065300100180252f5c080088896600200510018cc00400e609c0053304c304d002001400c825a246530010059982518258008024c05000e6eb8c12cc1300050051802800a0888b2082375c608c608e006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241111598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41108220dc4000c888c8cc124c00cdd698250009982498251825800a5eb80c00c0066608a6ea0cdc7000a40006608a6ea4cc040c03cdc6800800a5eb8122232329800919802919198269ba833794940dd718270009982698271827800a5eb816600260386e340062660986ea4c064004cc130dd49980d980d1b8d0010014bd704590481191801acc004c0fc006298103d87a800089819998269ba80014bd70209230030019bad304b003911191acc006600260806eb4c13c00694294504a44cc02000c8c014c0d4cc13cdd4000a5eb822601e600898103d87a800041286eb8c13cc140004cc134dd419b8e00148000cc134dd49980c180b9b8d0010014bd7024446b3001303f002898019181a19827000a5eb822b3001304400289801919ba548008cc1380052f5c1159800981d00144c00c8cdd2a40086609c00297ae08acc004c03400a26600e4646609e6ea0cde5250375c60a00026609e60a060a200297ae059800981d1b8d0018998271ba930230013304e37526605260506e340040052f5c1164128466e9520063304e375000297ae08acc004c03000a26600e4646609e6ea0cde5250375c60a00026609e60a060a200297ae059800981d1b8d0018998271ba930230013304e37526605260506e340040052f5c1164128466e9520083304e3750b3001337100029040400244006266e04004c0192020412897ae08acc004cdc3a40140051300323374a900519827000a5eb822b30013370e900600144cc0048cdd2a40186609c00297ae02323304f3750600c6eb4c140004cc13cc140c1440052f5c0646609e6ea0cde5250375c60a00026609e60a060a200297ae059800980f1b8d0018998271ba9301b0013304e37526603a60386e340040052f5c116412915980099b874803800a266002466e95200e3304e0014bd70119198279ba833794940dd718280009982798281828800a5eb8166002603c6e3400626609c6ea4c06c004cc138dd49980e980e1b8d0010014bd7045904a456600266e1d2010002899800919ba548040cc1380052f5c04646609e6ea0cde5250375c60a00026609e60a060a200297ae059800980f1b8d0018998271ba9301b0013304e37526603a60386e340040052f5c116412915980099b874804800a246464660a066e9520123305030510014bd701982818289829000a5eb80c004008cc0208c8cc140dd419bca4a06eb8c144004cc140c144c1480052f5c0b3001303b371a00313304f375260480026609e6ea4cc0a8c0a4dc6800800a5eb822c8258966002608200314c103d87980008acc004c118006298103d87a80008acc004c0f0006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b2096412c825904b20968acc004cdc3a40280051300323374a900a19827000a5eb822b30013370e900b00144c00c8cdd2a402c6609c00297ae08acc004cdc3a403000513300123374a900c19827000a5eb808c8cc13cdd419bca4a06eb8c140004cc13cc140c1440052f5c0b3001301e371a00313304e375260360026609c6ea4cc074c070dc6800800a5eb822c82522c8249049209241248249049209241248249049209241248248dd718271827803096600266e2000520808080808080808080028800c4cdc0800980124100028230c00c00c6eb4c110004c8cc10cdd419b8e00148000cc10cdd49980718069b8d0010014bd701bae3043304400420728b206c371890011b80480051640ac6eb8c0c0c0c400566002600e6e3400626605c6ea4c008004cc0b8dd49980298021b8d0010014bd7045902a1bae3016302b3754660304646b30013371e6eb8c0c000522104b9011a82008919191919191919911981c180f1981c181c8039981c1ba90013303830390024bd701981c181c981d00125eb80d660026024003125980099b89002371a00313303737526601e0040026606e6ea66002005337026e3400400a002b8c25eb822c819a2c8190dd7181b981c0011bae3037004375a606c002646606a6ea0cde5250375c606c0026606a606c606e00297ae05980098101b8d00189981a1ba930090013303437526601e601c6e340040052f5c11640c06eb8c0d0c0d4004d6600294624b30013371290201b8d0018998199ba93300b48100004cc0ccdd4cc005204099b80371a002901fc0057184bd7045902f45902e1bae30333034001300100259800a51892cc004cdc4a4100026e340062660626ea4cc0252080010013303137533001482000666e00dc6800a40ff0015c612f5c11640b51640b11640ac6eb8c0c0c0c400566002600e6e3400626605c6ea4c008004cc0b8dd49980298021b8d0010014bd7045902a1bae302e00a300348010c00d2008198010011813000a046899180118128019bae302300240846eb0c080c074dd5000c5901b19199119801001000912cc004006298103d87a80008992cc004cdd7802180f800c4c020cc088c0800052f5c11330030033024002407860440028100dd59810181098109810981098109810981098109810980e9baa0153374a90021980f19ba548008cc078c030c070dd5180f980e1baa0014bd7025eb822c80d0c8cc004004dd61807180e1baa0142259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a514071100189980180198110012038325980099912cc00400a294226530013259800980b18109baa00189bad302230253756604a60446ea800629000204030240019baf302430250019bab003488966002003159800980100344cc01400d20008a5040891325980099baf30240014c010140008acc004cc018010dd6981298141bab3025001898019ba630290028a50408d1598009980300224001130030078a50408c8118c09c0050250ca60020033756602660426ea8c04cc084dd5002488cc094008cc094dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c08c0066eacc09000660500069112cc004cdc8a441000038acc004cdc7a441000038998029807998149ba60024bd70000c4cc015300103d87a8000006409519800803c006446600e0046605666ec0dd48029ba6004001401c8128604c00481222942294229410251ba633020337606ea4020dd31981019bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602e603a6ea8c084c078dd51810980f1baa3010301e3754003132598009807180f1baa0018992cc004c050c07cdd5000c4c8c8c8c8cc8966002605400713259800980d98131baa0018991919194c004dd69817000cdd718170024dd69817001cdd7181700124444b3001303300589980d9bab303200e225980080144cc07403089660020051301b330350144bd7044c8c8cc06cc0d00084c00cc0e4010dd7181a000981b0012068899191980c981980109801981b8021bae3031001303400240c91640c0302e001302d001302c00130273754003164094605200d16409c6eb8c09c004dd5981380118138009813000981280098101baa0018b203c3022301f37540031640746012603c6ea8c040c078dd5000c5901c4530103d87a80004070604000280f08966002602060366ea800a2646464b30013023002899803181100189980300080245902018108009810800980e1baa0028b203422598009807980d1baa00289919192cc004c08800a26464b300130140018acc004c080dd5001401a2c810a2b30013019001899192cc004c09800a01116408c6eb4c090004c080dd50014566002601e00315980098101baa00280345902145901e203c4078603c6ea8004c08400e2c80f8c966002603c0031598009806180e800c5a2602e603a00280e22c80f8dd518100009810000980d9baa0028b20321bad3002301137540091337126eb4c050c054c054c054c054c044dd500219b82375a600260226ea8010dd6980198089baa0188a50403c8b201618049baa0038b200e180400098019baa0098a4d13656400401", - "hash": "5ff29dd2e6a0cf4da7107dd0badf9b60917b4b51860a5b89fd536643" + "compiledCode": "591648010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a46022602460240032301130123012301200148896600266e1cdd69809cc0048c050c0540066e1d20049b89480124464b30013371e91100375c602c602e003130160018b20223002001911919800800801911980180098010014dd7180998081baa0179ba54800122222223232332259800980f80144c966002602060366ea800626464b30013012301d3754003132598009809980f1baa0018992cc004c050c07cdd5000c4cc088c08cc080dd500119811181198101baa0014bd7045901e181118119811981198119811980f9baa0038b203a3021301e3754003164070601a603a6ea8004c07cc070dd5000c5901a19198008009bac300e301c3754603e00644b30010018a6103d87a80008992cc004cdc39bad3021301e375400200913008330200014bd7044cc00c00cc08800901c1810000a03c8b203832598009807180c9baa0018992cc004c03cc068dd5000c4c8cc0200048966002005132330010010042259800800c52f5c113302298009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301623235980099b8f375c605c0029110475d3c793008cc004888c8cc00cdd698190009bae3032303300130030019b89480426e3120109b804803e600e90082444446600a464660686ea0cde5250375c606a00266068606a606c00297ae05980098029b8d0018998199ba930020013303337526600860066e340040052f5c11640bc466446601046606c6ea0cdc7000a40006606c6ea4cc00cc008dc6800800a5eb808cc0248cc0dcdd419b8e00148000cc0dcdd49980218019b8d0010014bd701119191981d18111981d1ba80083303a375000a66074607600297ae03303a303b303c0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605a00312323303d374e0026607a6ea40092f5c065300100180252f5c080088896600200510018cc00400e60820053303f3040002001400c81f2246530010059981e981f0008024c02400e6eb8c0f8c0fc0050054c004c8cc0f4dd419bca4a06eb8c0f8004cc0f4c0f8c0fc0052f5c0b30013017371a00313303c37526024002660786ea4cc054c050dc6800800a5eb822c81c2446607c0046607c6ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11400a605866088608a0106608898103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a80004bd70200222259800801440063300100398240014c8c9660026074003132303133049304a00133049303133049304a3047375400697ae0304b304b00130463754007159800981f800c4c8c8c0c8cc128c12c008cc128c12c004cc128c0c8cc128c12cc120dd500225eb80c130c130004c12c004c118dd5001c566002606a003132323230333304b304c0033304b304c0023304b304c0013304b30333304b304c3049375400a97ae0304d304d001304c001304b001304637540071598009805000c4c8c8c8c8c0d0cc130c134010cc130c13400ccc130c134008cc130c134004cc130c0d0cc130c134c128dd500325eb80c138c138004c134004c130004c12c004c118dd5001c56600260120031323232323230353304d304e0053304d304e0043304d304e0033304d304e0023304d304e0013304d30353304d304e304b375400e97ae0304f304f001304e001304d001304c001304b0013046375400715980099b87480280062646464646464606c6609c609e00c6609c609e00a6609c609e0086609c609e0066609c609e0046609c609e0026609c606c6609c609e60986ea80212f5c060a060a0002609e002609c002609a00260980026096002608c6ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc13cc14001ccc13cc140018cc13cc140014cc13cc140010cc13cc14000ccc13cc140008cc13cc140004cc13cc0dccc13cc140c134dd5004a5eb80c144c144004c140004c13c004c138004c134004c130004c12c004c118dd5001c56600266e1d200e00189919191919191919181c19828182880419828182880399828182880319828182880299828182880219828182880199828182880119828182880099828181c19828182898271baa00a4bd7018291829000982880098280009827800982700098268009826000982580098231baa0038acc004cdc3a402000313232323232323232323039330513052009330513052008330513052007330513052006330513052005330513052004330513052003330513052002330513052001330513039330513052304f375401697ae030533053001305200130510013050001304f001304e001304d001304c001304b0013046375400715980099b87480480062646464646464646464646074660a460a6014660a460a6012660a460a6010660a460a600e660a460a600c660a460a600a660a460a6008660a460a6006660a460a6004660a460a6002660a46074660a460a660a06ea80312f5c060a860a800260a600260a400260a200260a0002609e002609c002609a00260980026096002608c6ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc14cc15002ccc14cc150028cc14cc150024cc14cc150020cc14cc15001ccc14cc150018cc14cc150014cc14cc150010cc14cc15000ccc14cc150008cc14cc150004cc14cc0eccc14cc150c144dd5006a5eb80c154c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c118dd5001c56600266e1d20160018991919191919191919191919181e1982a182a8061982a182a8059982a182a8051982a182a8049982a182a8041982a182a8039982a182a8031982a182a8029982a182a8021982a182a8019982a182a8011982a182a8009982a181e1982a182a98291baa00e4bd70182b182b000982a800982a00098298009829000982880098280009827800982700098268009826000982580098231baa0038991919191919191919191919181e1982a182a8061982a182a8059982a182a8051982a182a8049982a182a8041982a182a8039982a182a8031982a182a8029982a182a8021982a182a8019982a182a8011982a182a8009982a182a982b0009982a181e1982a182a98291baa00e4bd7025eb80c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c118dd5001a0884110822104420884110822104420884110822104418221baa0013047002400c8228dd718221822800991acc004c08400a2653001001a5eb820068008889660026070003123233048374e002660906ea40092f5c065300100180252f5c080088896600200510018cc00400e60980053304a304b002001400c824a246530010059982418248008024c05000e6eb8c124c1280050051802800a0848b207e375c6088608a006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241091598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41088210dc4000c888c8cc11cc00cdd698240009982398241824800a5eb80c00c006660866ea0cdc7000a4000660866ea4cc040c03cdc6800800a5eb8122232329800919802919198259ba833794940dd718260009982598261826800a5eb816600260386e340062660946ea4c064004cc128dd49980d980d1b8d0010014bd704590461191801acc004c0f4006298103d87a800089819998259ba80014bd70208e30030019bad3049003911191acc0066002607c6eb4c13400694294504844cc02000c8c014c0d4cc134dd4000a5eb822601e600898103d87a800041206eb8c134c138004cc12cdd419b8e00148000cc12cdd49980c180b9b8d0010014bd7024446b3001303d002898019181a19826000a5eb822b3001304200289801919ba548008cc1300052f5c1159800981c00144c00c8cdd2a40086609800297ae08acc004c03400a26600e4646609a6ea0cde5250375c609c0026609a609c609e00297ae059800981c1b8d0018998261ba930230013304c37526605260506e340040052f5c1164120466e9520063304c375000297ae08acc004c03000a26600e4646609a6ea0cde5250375c609c0026609a609c609e00297ae059800981c1b8d0018998261ba930230013304c37526605260506e340040052f5c1164120466e9520083304c3750b3001337100029040400244006266e04004c0192020412097ae08acc004cdc3a40140051300323374a900519826000a5eb822b30013370e900600144cc0048cdd2a40186609800297ae02323304d3750600c6eb4c138004cc134c138c13c0052f5c0646609a6ea0cde5250375c609c0026609a609c609e00297ae059800980f1b8d0018998261ba9301b0013304c37526603a60386e340040052f5c116412115980099b874803800a266002466e95200e3304c0014bd70119198269ba833794940dd718270009982698271827800a5eb8166002603c6e340062660986ea4c06c004cc130dd49980e980e1b8d0010014bd70459048456600266e1d2010002899800919ba548040cc1300052f5c04646609a6ea0cde5250375c609c0026609a609c609e00297ae059800980f1b8d0018998261ba9301b0013304c37526603a60386e340040052f5c116412115980099b874804800a2464646609c66e9520123304e304f0014bd701982718279828000a5eb80c004008cc0208c8cc138dd419bca4a06eb8c13c004cc138c13cc1400052f5c0b30013039371a00313304d375260480026609a6ea4cc0a8c0a4dc6800800a5eb822c8248966002607e00314c103d87980008acc004c110006298103d87a80008acc004c0e8006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20924124824904920928acc004cdc3a40280051300323374a900a19826000a5eb822b30013370e900b00144c00c8cdd2a402c6609800297ae08acc004cdc3a403000513300123374a900c19826000a5eb808c8cc134dd419bca4a06eb8c138004cc134c138c13c0052f5c0b3001301e371a00313304c37526036002660986ea4cc074c070dc6800800a5eb822c82422c8239047208e411c8239047208e411c8239047208e411c8238dd718261826803096600266e2000520808080808080808080028800c4cdc0800980124100028220c00c00c6eb4c108004c8cc104dd419b8e00148000cc104dd49980718069b8d0010014bd701bae30413042004206e8b2068371890011b80480051640a46eb8c0b8c0bc00566002600e6e340062660586ea4c008004cc0b0dd49980298021b8d0010014bd704590281bae301b302937546602c4646b30013371e6eb8c0b800522104b9011a82008919191919191919911981b180f1981b181b8039981b1ba90013303630370024bd701981b181b981c00125eb80d660026024003125980099b89002371a00313303537526601e0040026606a6ea66002005337026e3400400a002b8c25eb822c818a2c8180dd7181a981b0011bae3035004375a606800264660666ea0cde5250375c6068002660666068606a00297ae059800980f1b8d0018998191ba930090013303237526601e601c6e340040052f5c11640b86eb8c0c8c0cc004d6600294624b30013371290201b8d0018998189ba93300b48100004cc0c4dd4cc005204099b80371a002901fc0057184bd7045902d45902c1bae30313032001300100259800a51892cc004cdc4a4100026e3400626605e6ea4cc0252080010013302f37533001482000666e00dc6800a40ff0015c612f5c11640ad1640a91640a46eb8c0b8c0bc00566002600e6e340062660586ea4c008004cc0b0dd49980298021b8d0010014bd704590281bae302c00a300348010c00d2008198010011812000a042899180118118019bae3021002407c6eb0c078c06cdd5000c5901919199119801001000912cc004006298103d87a80008992cc004cdd7802180e800c4c020cc080c0780052f5c113300300330220024070604000280f0dd5980f180f980f980f980f980f980f980f980f980f980d9baa0133374a90021980e19ba548008cc070c02cc068dd5180e980d1baa0014bd7025eb822c80c0c8cc004004dd61805180d1baa0122259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a514069100189980180198100012034325980099912cc00400a294226530013259800980a180f9baa00189bad302030233756604660406ea800629000203c30220019baf302230230019bab003488966002003159800980100344cc01400d20008a5040811325980099baf30220014c010140008acc004cc018010dd6981198131bab3023001898019ba630270028a5040851598009980300224001130030078a5040848108c0940050230ca60020033756601e603e6ea8c03cc07cdd5002488cc08c008cc08cdd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0840066eacc088006604c0069112cc004cdc8a441000038acc004cdc7a441000038998029807998139ba60024bd70000c4cc015300103d87a8000006408d19800803c006446600e0046605266ec0dd48029ba6004001401c8118604800481122942294229410231ba63301e337606ea401cdd31980f19bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602a60366ea8c07cc070dd5180f980e1baa300c301c3754003132598009806180e1baa0018992cc004c048c074dd5000c4c8c8c8c8cc8966002605000713259800980c98121baa0018991919194c004dd69816000cdd718160024dd69816001cdd7181600124444b3001303100589980c9bab303000e225980080144cc06c03089660020051301b330330144bd7044c8c8cc06cc0c80084c00cc0dc010dd71819000981a0012064899191980c981880109801981a8021bae302f001303200240c11640b8302c001302b001302a0013025375400316408c604e00d1640946eb8c094004dd59812801181280098120009811800980f1baa0018b20383020301d375400316406c601c60386ea8c030c070dd5000c5901a4530103d87a80004068603c00280e0dd69804980c9baa02022598009807180c9baa00289919192cc004c08400a26600c604000626600c002009164078603e002603e00260346ea800a2c80c08966002601a60306ea800a2646464b30013020002899192cc004c0480062b3001301e37540050068b203e8acc004c05c00626464b300130240028044590211bad3022001301e37540051598009806800c566002603c6ea800a00d16407d16407080e101c180e1baa001301f0038b203a3259800980e000c56600260146036003168980a980d800a0348b203a3754603c002603c00260326ea800a2c80b86eb4c04cc050c050c050c050c040dd5001c56600266e24dd6980098081baa003337046eb4c008c040dd50019bad30023010375402f15980099b89375a600260206ea805cdd6980118081baa0038acc004cdc4240006eb4c004c040dd5001c4cdc4240006eb4c008c040dd5001c528201c8a50403914a08072294100e22c805860126ea800e2c8038601000260066ea802629344d95900101", + "hash": "62b7b99b456a860b71ccfd4d4e23bad82afb05a5660d0bfea90ce62b" + }, + { + "title": "pool_manager.pool_manager.spend", + "datum": { + "title": "datum", + "schema": { + "$ref": "#/definitions/lazer_perps~1types~1PoolState" + } + }, + "redeemer": { + "title": "redeemer", + "schema": { + "$ref": "#/definitions/pool_manager~1PoolAction" + } + }, + "parameters": [ + { + "title": "config", + "schema": { + "$ref": "#/definitions/lazer_perps~1types~1MarketConfig" + } + } + ], + "compiledCode": "5901c3010100229800aba2aba1aab9faab9eaab9dab9a48888896600264653001300700198039804000cdc3a400530070024888966002600460106ea800e26466453001159800980098059baa002899912cc004c00c00629462b30013007001898019bad3010300e375400515980099b8748010006266e24cdc01bad3010300e37540046eb4c040c038dd50049bad30103011300e375400515980099b8748018006266e252000337026eb4c040c038dd50011bad3010300e3754013133712900019b81375a6020601c6ea8008dd6980818071baa0094030806100c2018300e300c375400460166ea801e2c805260166ea801e601c0069112cc004c01000a2b3001300f37540150038b20208acc004c02000a2b3001300f37540150038b20208acc004cdc3a40080051323259800980a00140162c8090dd6980900098079baa00a8acc004cdc3a400c00513232332259800980b001c01e2c80a0dd698098009bad30130023013001300f375401515980099b874802000a264646644b30013016003803c590141bad3013001375a60260046026002601e6ea802a2c806900d201a403480686018601a0026e1d20003009375400716401c30070013003375400f149a26cac80081", + "hash": "bf2b4ba406b2327adc6a9dc3790f56f371f3d9465148f38ff62ae4e7" + }, + { + "title": "pool_manager.pool_manager.else", + "redeemer": { + "schema": {} + }, + "parameters": [ + { + "title": "config", + "schema": { + "$ref": "#/definitions/lazer_perps~1types~1MarketConfig" + } + } + ], + "compiledCode": "5901c3010100229800aba2aba1aab9faab9eaab9dab9a48888896600264653001300700198039804000cdc3a400530070024888966002600460106ea800e26466453001159800980098059baa002899912cc004c00c00629462b30013007001898019bad3010300e375400515980099b8748010006266e24cdc01bad3010300e37540046eb4c040c038dd50049bad30103011300e375400515980099b8748018006266e252000337026eb4c040c038dd50011bad3010300e3754013133712900019b81375a6020601c6ea8008dd6980818071baa0094030806100c2018300e300c375400460166ea801e2c805260166ea801e601c0069112cc004c01000a2b3001300f37540150038b20208acc004c02000a2b3001300f37540150038b20208acc004cdc3a40080051323259800980a00140162c8090dd6980900098079baa00a8acc004cdc3a400c00513232332259800980b001c01e2c80a0dd698098009bad30130023013001300f375401515980099b874802000a264646644b30013016003803c590141bad3013001375a60260046026002601e6ea802a2c806900d201a403480686018601a0026e1d20003009375400716401c30070013003375400f149a26cac80081", + "hash": "bf2b4ba406b2327adc6a9dc3790f56f371f3d9465148f38ff62ae4e7" } ], "definitions": { @@ -168,12 +209,12 @@ } ] }, - "lazer_perps/types/PerpsConfig": { - "title": "PerpsConfig", - "description": "Protocol configuration — applied as parameter at deployment", + "lazer_perps/types/MarketConfig": { + "title": "MarketConfig", + "description": "Per-market configuration — applied as parameter at deployment.\n Deploy once per market: XAU 10x, XAG 10x, XTI 5x, etc.", "anyOf": [ { - "title": "PerpsConfig", + "title": "MarketConfig", "dataType": "constructor", "index": 0, "fields": [ @@ -183,13 +224,46 @@ "$ref": "#/definitions/cardano~1assets~1PolicyId" }, { - "title": "max_leverage", - "description": "Maximum leverage allowed (e.g. 10 = 10x)", + "title": "feed_id", + "description": "Pyth Lazer feed ID for this market (e.g. 346 = XAU/USD)", + "$ref": "#/definitions/Int" + }, + { + "title": "leverage_cap", + "description": "Maximum leverage for this market (e.g. 10 = 10x)", + "$ref": "#/definitions/Int" + }, + { + "title": "min_collateral", + "description": "Minimum collateral in lovelace to open a position", + "$ref": "#/definitions/Int" + }, + { + "title": "pool_policy_id", + "description": "Policy ID of the liquidity pool manager", + "$ref": "#/definitions/cardano~1assets~1PolicyId" + } + ] + } + ] + }, + "lazer_perps/types/PoolState": { + "title": "PoolState", + "description": "Pool state stored as datum on the liquidity pool eUTxO", + "anyOf": [ + { + "title": "PoolState", + "dataType": "constructor", + "index": 0, + "fields": [ + { + "title": "total_open_interest", + "description": "Total open interest across all positions (lovelace)", "$ref": "#/definitions/Int" }, { - "title": "liquidation_bps", - "description": "Liquidation threshold in basis points (e.g. 8000 = 80%)", + "title": "max_open_interest", + "description": "Maximum allowed open interest (lovelace)", "$ref": "#/definitions/Int" } ] @@ -198,7 +272,7 @@ }, "lazer_perps/types/Position": { "title": "Position", - "description": "A perpetual position stored as datum on a eUTxO", + "description": "A perpetual position stored as datum on an independent eUTxO", "anyOf": [ { "title": "Position", @@ -210,11 +284,6 @@ "description": "Owner's public key hash", "$ref": "#/definitions/ByteArray" }, - { - "title": "feed_id", - "description": "Pyth feed ID for the traded asset", - "$ref": "#/definitions/Int" - }, { "title": "direction", "description": "Long or Short", @@ -222,22 +291,86 @@ }, { "title": "collateral", - "description": "Collateral amount in lovelace", + "description": "Collateral deposited (lovelace)", "$ref": "#/definitions/Int" }, { "title": "size", - "description": "Position size (collateral * leverage)", + "description": "Position size = collateral * leverage (lovelace-denominated)", "$ref": "#/definitions/Int" }, { "title": "entry_price", - "description": "Entry price (raw, before exponent)", + "description": "Entry price (raw integer, before exponent)", "$ref": "#/definitions/Int" }, { "title": "entry_exponent", - "description": "Entry price exponent", + "description": "Entry price exponent (e.g. -8)", + "$ref": "#/definitions/Int" + } + ] + } + ] + }, + "pool_manager/PoolAction": { + "title": "PoolAction", + "description": "Pool actions", + "anyOf": [ + { + "title": "Deposit", + "description": "Deposit liquidity into the pool", + "dataType": "constructor", + "index": 0, + "fields": [] + }, + { + "title": "Withdraw", + "description": "Withdraw liquidity from the pool (only if OI allows)", + "dataType": "constructor", + "index": 1, + "fields": [] + }, + { + "title": "PositionOpened", + "description": "Update pool state after position open (increase OI)", + "dataType": "constructor", + "index": 2, + "fields": [ + { + "title": "size", + "$ref": "#/definitions/Int" + } + ] + }, + { + "title": "PositionClosed", + "description": "Update pool state after position close (decrease OI, settle PnL)", + "dataType": "constructor", + "index": 3, + "fields": [ + { + "title": "size", + "$ref": "#/definitions/Int" + }, + { + "title": "pnl", + "$ref": "#/definitions/Int" + } + ] + }, + { + "title": "PositionLiquidated", + "description": "Update pool state after liquidation (decrease OI, collect remaining)", + "dataType": "constructor", + "index": 4, + "fields": [ + { + "title": "size", + "$ref": "#/definitions/Int" + }, + { + "title": "recovered", "$ref": "#/definitions/Int" } ] diff --git a/lazer/cardano/lazer-perps/onchain/validators/close_position.ak b/lazer/cardano/lazer-perps/onchain/validators/close_position.ak index 2b2a6de2..5d40f75b 100644 --- a/lazer/cardano/lazer-perps/onchain/validators/close_position.ak +++ b/lazer/cardano/lazer-perps/onchain/validators/close_position.ak @@ -1,17 +1,36 @@ use aiken/collection/list +use aiken/math/rational use cardano/assets.{PolicyId} use cardano/transaction.{Transaction} use lazer_perps/oracle_gate -use lazer_perps/types.{PerpsConfig, Position} +use lazer_perps/types.{Direction, Long, Short, MarketConfig, Position} + +/// Compute PnL as a rational number. +/// Long PnL = size * (currentPrice - entryPrice) / entryPrice +/// Short PnL = size * (entryPrice - currentPrice) / entryPrice +pub fn compute_pnl( + direction: Direction, + size: Int, + entry_price: Int, + current_price: Int, +) -> rational.Rational { + let diff = when direction is { + Long -> current_price - entry_price + Short -> entry_price - current_price + } + expect Some(pnl) = rational.new(size * diff, entry_price) + pnl +} /// Close Position validator. -/// Owner closes their position. The current Pyth price is used -/// to compute PnL settlement. /// -/// PnL formula: -/// Long: PnL = size * (currentPrice - entryPrice) / entryPrice -/// Short: PnL = size * (entryPrice - currentPrice) / entryPrice -validator close_position(config: PerpsConfig) { +/// Only the position owner can close. Reads the current Pyth price +/// to compute PnL for settlement against the liquidity pool. +/// +/// PnL formulas: +/// Long: PnL = size * (exitPrice - entryPrice) / entryPrice +/// Short: PnL = size * (entryPrice - exitPrice) / entryPrice +validator close_position(config: MarketConfig) { spend( datum: Option, _redeemer: Data, @@ -20,16 +39,20 @@ validator close_position(config: PerpsConfig) { ) { expect Some(position) = datum + // Read current price via Pyth oracle gate let (current_price, _exponent) = - oracle_gate.read_price(config.pyth_id, position.feed_id, self) + oracle_gate.read_price(config.pyth_id, config.feed_id, self) - // Verify the tx is signed by the position owner + // Only the position owner can close let signed_by_owner = list.has(self.extra_signatories, position.owner) - // Price must be valid (positive) + // Oracle price must be valid let valid_price = current_price > 0 - signed_by_owner && valid_price + // PnL is computable (entry_price > 0) + let valid_entry = position.entry_price > 0 + + signed_by_owner && valid_price && valid_entry } } diff --git a/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak b/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak index b5e756f5..b924a09c 100644 --- a/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak +++ b/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak @@ -2,11 +2,12 @@ use aiken/math/rational use cardano/assets.{PolicyId} use cardano/transaction.{Transaction} use lazer_perps/oracle_gate -use lazer_perps/types.{Direction, Long, Short, PerpsConfig, Position} +use lazer_perps/types.{ + Direction, Long, Short, MarketConfig, Position, + liquidation_bps, keeper_fee_bps, +} /// Compute PnL as a rational number. -/// Long PnL = size * (current - entry) / entry -/// Short PnL = size * (entry - current) / entry fn compute_pnl( direction: Direction, size: Int, @@ -22,13 +23,18 @@ fn compute_pnl( } /// Liquidation validator. -/// Anyone can liquidate if the position is undercollateralized. /// -/// Liquidation formula: +/// Anyone can trigger liquidation if the position is undercollateralized. +/// No owner signature required — this is a public good. +/// +/// Liquidation check: /// remaining = collateral + PnL /// margin_ratio = remaining / collateral -/// If margin_ratio < liquidation_bps / 10000 → position is liquidatable -validator liquidate(config: PerpsConfig) { +/// If remaining * 10000 < collateral * liquidation_bps → liquidatable +/// +/// Keeper receives 1% of collateral as fee. +/// Remaining collateral goes back to the pool. +validator liquidate(config: MarketConfig) { spend( datum: Option, _redeemer: Data, @@ -37,9 +43,11 @@ validator liquidate(config: PerpsConfig) { ) { expect Some(position) = datum + // Read current price via Pyth oracle gate let (current_price, _exponent) = - oracle_gate.read_price(config.pyth_id, position.feed_id, self) + oracle_gate.read_price(config.pyth_id, config.feed_id, self) + // Compute PnL let pnl = compute_pnl( position.direction, @@ -49,16 +57,17 @@ validator liquidate(config: PerpsConfig) { ) // remaining = collateral + pnl - let collateral_rational = rational.from_int(position.collateral) - let remaining = rational.add(collateral_rational, pnl) + let collateral_r = rational.from_int(position.collateral) + let remaining = rational.add(collateral_r, pnl) - // Check: remaining * 10000 < collateral * liquidation_bps + // Undercollateralization check: + // remaining * 10000 < collateral * liquidation_bps let remaining_scaled = rational.mul(remaining, rational.from_int(10000)) expect Some(threshold) = - rational.new(position.collateral * config.liquidation_bps, 1) + rational.new(position.collateral * liquidation_bps, 1) - // If remaining margin < threshold → undercollateralized → allow liquidation + // Position must be undercollateralized to allow liquidation rational.compare(remaining_scaled, threshold) == Less } } diff --git a/lazer/cardano/lazer-perps/onchain/validators/open_position.ak b/lazer/cardano/lazer-perps/onchain/validators/open_position.ak index ac33c665..e536cee0 100644 --- a/lazer/cardano/lazer-perps/onchain/validators/open_position.ak +++ b/lazer/cardano/lazer-perps/onchain/validators/open_position.ak @@ -1,12 +1,16 @@ use cardano/assets.{PolicyId} use cardano/transaction.{Transaction} use lazer_perps/oracle_gate -use lazer_perps/types.{PerpsConfig, Position} +use lazer_perps/types.{MarketConfig, Position} /// Open Position validator. -/// Validates that a new position respects leverage limits and -/// that the entry price matches the current Pyth oracle price. -validator open_position(config: PerpsConfig) { +/// +/// Validates that a new position: +/// 1. Has a valid Pyth price witness (entry_price == oracle price) +/// 2. Respects the market's leverage cap +/// 3. Meets minimum collateral requirement +/// 4. Size == collateral * leverage (no inflation) +validator open_position(config: MarketConfig) { spend( datum: Option, _redeemer: Data, @@ -15,16 +19,24 @@ validator open_position(config: PerpsConfig) { ) { expect Some(position) = datum + // Read current oracle price via the Pyth oracle gate let (current_price, _exponent) = - oracle_gate.read_price(config.pyth_id, position.feed_id, self) + oracle_gate.read_price(config.pyth_id, config.feed_id, self) - // Entry price must match current oracle price - let price_matches = current_price == position.entry_price + // 1. Entry price must match current oracle price + let price_valid = current_price == position.entry_price - // Leverage check: size <= collateral * max_leverage + // 2. Leverage cap: size / collateral <= leverage_cap + // Equivalent: size <= collateral * leverage_cap let leverage_ok = - position.size <= position.collateral * config.max_leverage + position.size <= position.collateral * config.leverage_cap - price_matches && leverage_ok + // 3. Minimum collateral + let collateral_ok = position.collateral >= config.min_collateral + + // 4. Size must be a positive multiple of collateral + let size_valid = position.size > 0 && position.collateral > 0 + + price_valid && leverage_ok && collateral_ok && size_valid } } diff --git a/lazer/cardano/lazer-perps/onchain/validators/pool_manager.ak b/lazer/cardano/lazer-perps/onchain/validators/pool_manager.ak new file mode 100644 index 00000000..8ba94ade --- /dev/null +++ b/lazer/cardano/lazer-perps/onchain/validators/pool_manager.ak @@ -0,0 +1,68 @@ +use cardano/assets.{PolicyId} +use cardano/transaction.{Transaction} +use lazer_perps/types.{MarketConfig, PoolState} + +/// Pool actions +pub type PoolAction { + /// Deposit liquidity into the pool + Deposit + /// Withdraw liquidity from the pool (only if OI allows) + Withdraw + /// Update pool state after position open (increase OI) + PositionOpened { size: Int } + /// Update pool state after position close (decrease OI, settle PnL) + PositionClosed { size: Int, pnl: Int } + /// Update pool state after liquidation (decrease OI, collect remaining) + PositionLiquidated { size: Int, recovered: Int } +} + +/// Pool Manager validator. +/// +/// Manages the shared liquidity UTxO for the perps protocol. +/// Tracks open interest and enforces caps to limit protocol exposure. +/// +/// The pool receives funds on losing trades and pays out on winning trades. +/// All state transitions require a valid continuation output with +/// updated PoolState datum. +validator pool_manager(config: MarketConfig) { + spend( + datum: Option, + redeemer: PoolAction, + _own_ref: Data, + self: Transaction, + ) { + expect Some(pool) = datum + + when redeemer is { + // Deposit — anyone can add liquidity + Deposit -> True + + // Withdraw — only if remaining liquidity covers open interest + Withdraw -> { + // Pool must maintain enough liquidity to cover max possible payouts + // For MVP: allow withdrawal if no open interest + pool.total_open_interest == 0 + } + + // Position opened — increase open interest + PositionOpened { size } -> { + let new_oi = pool.total_open_interest + size + // Open interest cap check + new_oi <= pool.max_open_interest + } + + // Position closed — decrease open interest, settle PnL + PositionClosed { size, pnl: _ } -> { + let new_oi = pool.total_open_interest - size + // OI cannot go negative + new_oi >= 0 + } + + // Position liquidated — decrease OI, recover collateral + PositionLiquidated { size, recovered: _ } -> { + let new_oi = pool.total_open_interest - size + new_oi >= 0 + } + } + } +} From 85231cf8cf666bf0152be67578704d77aeefcdd2 Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 18:15:06 -0300 Subject: [PATCH 03/20] Step 3: PositionDatum with exact fields PositionDatum { feed_id, direction, leverage, entry_price (6 decimals), collateral (micro USDCx), trader_pkh, opened_at (POSIXTime) } Updated all validators to use PositionDatum instead of Position. PnL now computed as: size = collateral * leverage. --- .../onchain/lib/lazer_perps/types.ak | 31 ++++---- lazer/cardano/lazer-perps/onchain/plutus.json | 71 ++++++++++--------- .../onchain/validators/close_position.ak | 27 +++---- .../onchain/validators/liquidate.ak | 25 ++++--- .../onchain/validators/open_position.ak | 23 +++--- 5 files changed, 95 insertions(+), 82 deletions(-) diff --git a/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/types.ak b/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/types.ak index 9d21c2f7..9d6bbec1 100644 --- a/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/types.ak +++ b/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/types.ak @@ -15,33 +15,36 @@ pub type MarketConfig { feed_id: Int, /// Maximum leverage for this market (e.g. 10 = 10x) leverage_cap: Int, - /// Minimum collateral in lovelace to open a position + /// Minimum collateral in micro USDCx to open a position min_collateral: Int, /// Policy ID of the liquidity pool manager pool_policy_id: PolicyId, } -/// A perpetual position stored as datum on an independent eUTxO -pub type Position { - /// Owner's public key hash - owner: ByteArray, +/// PositionDatum — stored as inline datum on each position eUTxO. +/// Each open position is an independent UTxO with this datum. +pub type PositionDatum { + /// Pyth Lazer feed ID (e.g. 346 = XAU/USD) + feed_id: Int, /// Long or Short direction: Direction, - /// Collateral deposited (lovelace) - collateral: Int, - /// Position size = collateral * leverage (lovelace-denominated) - size: Int, - /// Entry price (raw integer, before exponent) + /// Leverage multiplier (e.g. 5 = 5x) + leverage: Int, + /// Entry price with 6 decimals (e.g. 3285_500000 = $3,285.50) entry_price: Int, - /// Entry price exponent (e.g. -8) - entry_exponent: Int, + /// Collateral in micro USDCx (e.g. 100_000000 = 100 USDCx) + collateral: Int, + /// Trader's public key hash + trader_pkh: ByteArray, + /// POSIX timestamp when the position was opened (milliseconds) + opened_at: Int, } /// Pool state stored as datum on the liquidity pool eUTxO pub type PoolState { - /// Total open interest across all positions (lovelace) + /// Total open interest across all positions (micro USDCx) total_open_interest: Int, - /// Maximum allowed open interest (lovelace) + /// Maximum allowed open interest (micro USDCx) max_open_interest: Int, } diff --git a/lazer/cardano/lazer-perps/onchain/plutus.json b/lazer/cardano/lazer-perps/onchain/plutus.json index 78ce59f7..f1267c4b 100644 --- a/lazer/cardano/lazer-perps/onchain/plutus.json +++ b/lazer/cardano/lazer-perps/onchain/plutus.json @@ -16,7 +16,7 @@ "datum": { "title": "datum", "schema": { - "$ref": "#/definitions/lazer_perps~1types~1Position" + "$ref": "#/definitions/lazer_perps~1types~1PositionDatum" } }, "redeemer": { @@ -33,8 +33,8 @@ } } ], - "compiledCode": "591636010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd500144c9660026466446600400400244b30010018a508acc004cdc79bae30140010038a51899801001180a800a01e40486eb0c048c04cc04cc04cc04cc04cc04cc04cc04cc03cdd50039bae3011300e375400315980099b8848000dd69808cc0048c048c04c0066e1d20049b89480124464b30013371e910100375c6028602a003130140018b201e30020019119198008008019119801800980100148c048c04cc04c0066eb8c044c038dd500acdd2a400091111111191919912cc004c07800a264b3001300f301a375400313232598009808980e1baa0018992cc004c048c074dd5000c4c9660026026603c6ea80062660426044603e6ea8008cc084c088c07cdd5000a5eb822c80e8c084c088c088c088c088c088c078dd5001c5901c1810180e9baa0018b2036300e301c3754002603c60366ea80062c80c8c8cc004004dd61804180d9baa301e0032259800800c530103d87a80008992cc004cdc39bad3020301d3754002009130083301f0014bd7044cc00c00cc08400901b180f800a03a8b203632598009806980c1baa0018992cc004c038c064dd5000c4c8cc0240048966002005132330010010042259800800c52f5c113302198009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301723235980099b8f375c605a0029110475d3c793008cc004888c8cc00cdd698188009bae3031303200130030019b89480426e3120109b804803e600e90082444446600a464660666ea0cde5250375c6068002660666068606a00297ae05980098029b8d0018998191ba930020013303237526600860066e340040052f5c11640b8466446601046606a6ea0cdc7000a40006606a6ea4cc00cc008dc6800800a5eb808cc0248cc0d8dd419b8e00148000cc0d8dd49980218019b8d0010014bd701119191981c98111981c9ba800833039375000a66072607400297ae033039303a303b0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605800312323303c374e002660786ea40092f5c065300100180252f5c080088896600200510018cc00400e60800053303e303f002001400c81ea246530010059981e181e8008024c02400e6eb8c0f4c0f80050054c004c8cc0f0dd419bca4a06eb8c0f4004cc0f0c0f4c0f80052f5c0b30013017371a00313303b37526024002660766ea4cc054c050dc6800800a5eb822c81ba446607a0046607a6ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11000a60586608660880106608698103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a80004bd70200222259800801440063300100398238014c8c966002607200313230313304830490013304830313304830493046375400697ae0304a304a00130453754007159800981f000c4c8c8c0c8cc124c128008cc124c128004cc124c0c8cc124c128c11cdd500225eb80c12cc12c004c128004c114dd5001c566002606c003132323230333304a304b0033304a304b0023304a304b0013304a30333304a304b3048375400a97ae0304c304c001304b001304a001304537540071598009805000c4c8c8c8c8c0d0cc12cc130010cc12cc13000ccc12cc130008cc12cc130004cc12cc0d0cc12cc130c124dd500325eb80c134c134004c130004c12c004c128004c114dd5001c56600260120031323232323230353304c304d0053304c304d0043304c304d0033304c304d0023304c304d0013304c30353304c304d304a375400e97ae0304e304e001304d001304c001304b001304a0013045375400715980099b87480280062646464646464606c6609a609c00c6609a609c00a6609a609c0086609a609c0066609a609c0046609a609c0026609a606c6609a609c60966ea80212f5c0609e609e002609c002609a002609800260960026094002608a6ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc138c13c01ccc138c13c018cc138c13c014cc138c13c010cc138c13c00ccc138c13c008cc138c13c004cc138c0dccc138c13cc130dd5004a5eb80c140c140004c13c004c138004c134004c130004c12c004c128004c114dd5001c56600266e1d200e00189919191919191919181c19827982800419827982800399827982800319827982800299827982800219827982800199827982800119827982800099827981c19827982818269baa00a4bd7018289828800982800098278009827000982680098260009825800982500098229baa0038acc004cdc3a402000313232323232323232323039330503051009330503051008330503051007330503051006330503051005330503051004330503051003330503051002330503051001330503039330503051304e375401697ae03052305200130510013050001304f001304e001304d001304c001304b001304a0013045375400715980099b87480480062646464646464646464646074660a260a4014660a260a4012660a260a4010660a260a400e660a260a400c660a260a400a660a260a4008660a260a4006660a260a4004660a260a4002660a26074660a260a4609e6ea80312f5c060a660a600260a400260a200260a0002609e002609c002609a002609800260960026094002608a6ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc148c14c02ccc148c14c028cc148c14c024cc148c14c020cc148c14c01ccc148c14c018cc148c14c014cc148c14c010cc148c14c00ccc148c14c008cc148c14c004cc148c0eccc148c14cc140dd5006a5eb80c150c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c128004c114dd5001c56600266e1d20160018991919191919191919191919181e19829982a00619829982a00599829982a00519829982a00499829982a00419829982a00399829982a00319829982a00299829982a00219829982a00199829982a00119829982a00099829981e19829982a18289baa00e4bd70182a982a800982a000982980098290009828800982800098278009827000982680098260009825800982500098229baa0038991919191919191919191919181e19829982a00619829982a00599829982a00519829982a00499829982a00419829982a00399829982a00319829982a00299829982a00219829982a00199829982a00119829982a00099829982a182a80099829981e19829982a18289baa00e4bd7025eb80c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c128004c114dd5001a086410c82190432086410c82190432086410c821904318219baa0013046002400c8220dd718219822000991acc004c08400a2653001001a5eb82006800888966002606e003123233047374e0026608e6ea40092f5c065300100180252f5c080088896600200510018cc00400e609600533049304a002001400c8242246530010059982398240008024c05000e6eb8c120c1240050051802800a0828b207c375c60866088006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241051598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41048208dc4000c888c8cc118c00cdd698238009982318239824000a5eb80c00c006660846ea0cdc7000a4000660846ea4cc040c03cdc6800800a5eb8122232329800919802919198251ba833794940dd718258009982518259826000a5eb816600260386e340062660926ea4c064004cc124dd49980d980d1b8d0010014bd704590451191801acc004c0f0006298103d87a800089819998251ba80014bd70208c30030019bad3048003911191acc0066002607a6eb4c13000694294504744cc02000c8c014c0d4cc130dd4000a5eb822601e600898103d87a8000411c6eb8c130c134004cc128dd419b8e00148000cc128dd49980c180b9b8d0010014bd7024446b3001303c002898019181a19825800a5eb822b3001304100289801919ba548008cc12c0052f5c1159800981c80144c00c8cdd2a40086609600297ae08acc004c03400a26600e464660986ea0cde5250375c609a00266098609a609c00297ae059800981c9b8d0018998259ba930230013304b37526605260506e340040052f5c116411c466e9520063304b375000297ae08acc004c03000a26600e464660986ea0cde5250375c609a00266098609a609c00297ae059800981c9b8d0018998259ba930230013304b37526605260506e340040052f5c116411c466e9520083304b3750b3001337100029040400244006266e04004c0192020411c97ae08acc004cdc3a40140051300323374a900519825800a5eb822b30013370e900600144cc0048cdd2a40186609600297ae02323304c3750600c6eb4c134004cc130c134c1380052f5c064660986ea0cde5250375c609a00266098609a609c00297ae059800980f1b8d0018998259ba9301b0013304b37526603a60386e340040052f5c116411d15980099b874803800a266002466e95200e3304b0014bd70119198261ba833794940dd718268009982618269827000a5eb8166002603c6e340062660966ea4c06c004cc12cdd49980e980e1b8d0010014bd70459047456600266e1d2010002899800919ba548040cc12c0052f5c0464660986ea0cde5250375c609a00266098609a609c00297ae059800980f1b8d0018998259ba9301b0013304b37526603a60386e340040052f5c116411d15980099b874804800a2464646609a66e9520123304d304e0014bd701982698271827800a5eb80c004008cc0208c8cc134dd419bca4a06eb8c138004cc134c138c13c0052f5c0b3001303a371a00313304c37526048002660986ea4cc0a8c0a4dc6800800a5eb822c8240966002607c00314c103d87980008acc004c10c006298103d87a80008acc004c0ec006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20904120824104820908acc004cdc3a40280051300323374a900a19825800a5eb822b30013370e900b00144c00c8cdd2a402c6609600297ae08acc004cdc3a403000513300123374a900c19825800a5eb808c8cc130dd419bca4a06eb8c134004cc130c134c1380052f5c0b3001301e371a00313304b37526036002660966ea4cc074c070dc6800800a5eb822c823a2c8231046208c41188231046208c41188231046208c41188230dd718259826003096600266e2000520808080808080808080028800c4cdc0800980124100028218c00c00c6eb4c104004c8cc100dd419b8e00148000cc100dd49980718069b8d0010014bd701bae30403041004206c8b2066371890011b80480051640a06eb8c0b4c0b800566002600e6e340062660566ea4c008004cc0acdd49980298021b8d0010014bd704590271bae3015302837546602e4646b30013371e6eb8c0b400522104b9011a82008919191919191919911981a980f1981a981b0039981a9ba90013303530360024bd701981a981b181b80125eb80d660026024003125980099b89002371a00313303437526601e004002660686ea66002005337026e3400400a002b8c25eb822c81822c8178dd7181a181a8011bae3034004375a606600264660646ea0cde5250375c6066002660646066606800297ae059800980f9b8d0018998189ba930090013303137526601e601c6e340040052f5c11640b46eb8c0c4c0c8004d6600294624b30013371290201b8d0018998181ba93300b48100004cc0c0dd4cc005204099b80371a002901fc0057184bd7045902c45902b1bae30303031001300100259800a51892cc004cdc4a4100026e3400626605c6ea4cc0252080010013302e37533001482000666e00dc6800a40ff0015c612f5c11640a91640a51640a06eb8c0b4c0b800566002600e6e340062660566ea4c008004cc0acdd49980298021b8d0010014bd704590271bae302b00a300348010c00d2008198010011811800a040899180118110019bae302000240786eb0c074c068dd5000c5901819199119801001000912cc004006298103d87a80008992cc004cdd7802180e000c4c020cc07cc0740052f5c11330030033021002406c603e00280e8dd5980e980f180f180f180f180f180f180f180f180f180d1baa0123374a90021980d99ba548008cc06cc070c074c074c074c064dd5180e180c9baa0014bd7025eb822c80b8c8cc004004dd61805980c9baa0112259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a5140651001899801801980f8012032325980099912cc00400a2942265300132598009809980f1baa00189bad301f302237566044603e6ea800629000203a30210019baf302130220019bab003488966002003159800980100344cc01400d20008a50407d1325980099baf30210014c010140008acc004cc018010dd6981118129bab3022001898019ba630260028a5040811598009980300224001130030078a5040808100c0900050220ca600200337566020603c6ea8c040c078dd5002488cc088008cc088dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0800066eacc084006604a0069112cc004cdc8a441000038acc004cdc7a441000038998029807998131ba60024bd70000c4cc015300103d87a8000006408919800803c006446600e0046605066ec0dd48029ba6004001401c81106046004810a2942294229410221ba63301d337606ea401cdd31980e99bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602860346ea8c078c06cdd5180f180d9baa300d301b3754003132598009806980d9baa0018992cc004c044c070dd5000c4c8c8c8c8cc8966002604e00713259800980c18119baa0018991919194c004dd69815800cdd718158024dd69815801cdd7181580124444b3001303000589980d1bab302f00e225980080144cc07003089660020051301b330320144bd7044c8c8cc06cc0c40084c00cc0d8010dd7181880098198012062899191980c981800109801981a0021bae302e001303100240bd1640b4302b001302a001302900130243754003164088604c00d1640906eb8c090004dd59812001181200098118009811000980e9baa0018b2036301f301c3754003164068601060366ea8c034c06cdd5000c590194530103d87a80004064603a00280d8dd69805180c1baa01f22598009806980c1baa00289919192cc004c08000a26600c603e00626600c002009164074603c002603c00260326ea800a2c80b889660026018602e6ea800a2646464b3001301f002899192cc004c0440062b3001301d37540050068b203c8acc004c05800626464b300130230028044590201bad3021001301d37540051598009807000c566002603a6ea800a00d16407916406c80d901b180d9baa001301e0038b20383259800980d800c56600260166034003168980a180d000a0328b20383754603a002603a00260306ea800a2c80b113371090001bad30113012301230123012300e375400314a08062294100c180818069baa0028b201618049baa0038b200e180400098019baa0098a4d1365640041", - "hash": "fb99d7b4369fa4e67a69fb162e423eadf3eb10ef7dfebc757c2d96b2" + "compiledCode": "591639010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a4602260246024602460246024003230113012301230120014889660026466446600400400244b30010018a508acc004cdc79bae30160010038a51899801001180b800a02240506eb0c050c054c054c054c054c054c054c054c054c044dd50049bae30023010375400715980099b8848000dd69809cc0048c050c0540066e1d20049b89480124464b30013371e91100375c602c602e003130160018b202230020019119198008008019119801800980100148c050c054c0540066eb8c04cc040dd500bcdd2a400091111111191919912cc004c08000a264b30013011301c375400313232598009809980f1baa0018992cc004c050c07cdd5000c4c966002602a60406ea8006266046604860426ea8008cc08cc090c084dd5000a5eb822c80f8c048c080dd5001c5901e1811180f9baa0018b203a300e301e37540026040603a6ea80062c80d8c8cc004004dd61804180e9baa30200032259800800c530103d87a80008992cc004cdc39bad3022301f375400200913008330210014bd7044cc00c00cc08c00901d1810800a03e8b203a32598009807980d1baa0018992cc004c040c06cdd5000c4c8cc0240048966002005132330010010042259800800c52f5c113302398009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301723235980099b8f375c605e0029110475d3c793008cc004888c8cc00cdd698198009bae3033303400130030019b89480426e3120109b804803e600e90082444446600a4646606a6ea0cde5250375c606c0026606a606c606e00297ae05980098029b8d00189981a1ba930020013303437526600860066e340040052f5c11640c0466446601046606e6ea0cdc7000a40006606e6ea4cc00cc008dc6800800a5eb808cc0248cc0e0dd419b8e00148000cc0e0dd49980218019b8d0010014bd701119191981d98111981d9ba80083303b375000a66076607800297ae03303b303c303d0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605c00312323303e374e0026607c6ea40092f5c065300100180252f5c080088896600200510018cc00400e6084005330403041002001400c81fa246530010059981f181f8008024c02400e6eb8c0fcc1000050054c004c8cc0f8dd419bca4a06eb8c0fc004cc0f8c0fcc1000052f5c0b30013017371a00313303d375260240026607a6ea4cc054c050dc6800800a5eb822c81ca446607e0046607e6ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11800a60586608a608c0106608a98103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a80004bd70200222259800801440063300100398248014c8c966002607600313230313304a304b0013304a30313304a304b3048375400697ae0304c304c001304737540071598009820000c4c8c8c0c8cc12cc130008cc12cc130004cc12cc0c8cc12cc130c124dd500225eb80c134c134004c130004c11cdd5001c566002606c003132323230333304c304d0033304c304d0023304c304d0013304c30333304c304d304a375400a97ae0304e304e001304d001304c001304737540071598009805000c4c8c8c8c8c0d0cc134c138010cc134c13800ccc134c138008cc134c138004cc134c0d0cc134c138c12cdd500325eb80c13cc13c004c138004c134004c130004c11cdd5001c56600260120031323232323230353304e304f0053304e304f0043304e304f0033304e304f0023304e304f0013304e30353304e304f304c375400e97ae030503050001304f001304e001304d001304c0013047375400715980099b87480280062646464646464606c6609e60a000c6609e60a000a6609e60a00086609e60a00066609e60a00046609e60a00026609e606c6609e60a0609a6ea80212f5c060a260a200260a0002609e002609c002609a0026098002608e6ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc140c14401ccc140c144018cc140c144014cc140c144010cc140c14400ccc140c144008cc140c144004cc140c0dccc140c144c138dd5004a5eb80c148c148004c144004c140004c13c004c138004c134004c130004c11cdd5001c56600266e1d200e00189919191919191919181c19828982900419828982900399828982900319828982900299828982900219828982900199828982900119828982900099828981c19828982918279baa00a4bd7018299829800982900098288009828000982780098270009826800982600098239baa0038acc004cdc3a4020003132323232323232323230393305230530093305230530083305230530073305230530063305230530053305230530043305230530033305230530023305230530013305230393305230533050375401697ae0305430540013053001305200130510013050001304f001304e001304d001304c0013047375400715980099b87480480062646464646464646464646074660a660a8014660a660a8012660a660a8010660a660a800e660a660a800c660a660a800a660a660a8008660a660a8006660a660a8004660a660a8002660a66074660a660a860a26ea80312f5c060aa60aa00260a800260a600260a400260a200260a0002609e002609c002609a0026098002608e6ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc150c15402ccc150c154028cc150c154024cc150c154020cc150c15401ccc150c154018cc150c154014cc150c154010cc150c15400ccc150c154008cc150c154004cc150c0eccc150c154c148dd5006a5eb80c158c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c11cdd5001c56600266e1d20160018991919191919191919191919181e1982a982b0061982a982b0059982a982b0051982a982b0049982a982b0041982a982b0039982a982b0031982a982b0029982a982b0021982a982b0019982a982b0011982a982b0009982a981e1982a982b18299baa00e4bd70182b982b800982b000982a800982a0009829800982900098288009828000982780098270009826800982600098239baa0038991919191919191919191919181e1982a982b0061982a982b0059982a982b0051982a982b0049982a982b0041982a982b0039982a982b0031982a982b0029982a982b0021982a982b0019982a982b0011982a982b0009982a982b182b8009982a981e1982a982b18299baa00e4bd7025eb80c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c11cdd5001a08a41148229045208a41148229045208a4114822904518229baa0013048002400c8230dd718229823000991acc004c08400a2653001001a5eb820068008889660026072003123233049374e002660926ea40092f5c065300100180252f5c080088896600200510018cc00400e609a0053304b304c002001400c8252246530010059982498250008024c05000e6eb8c128c12c0050051802800a0868b2080375c608a608c006530012232598009800a40211598009800a4001148002266e39220108010204081020408000002410d1598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f410c8218dc4000c888c8cc120c00cdd698248009982418249825000a5eb80c00c006660886ea0cdc7000a4000660886ea4cc040c03cdc6800800a5eb8122232329800919802919198261ba833794940dd718268009982618269827000a5eb816600260386e340062660966ea4c064004cc12cdd49980d980d1b8d0010014bd704590471191801acc004c0f8006298103d87a800089819998261ba80014bd70209030030019bad304a003911191acc0066002607e6eb4c13800694294504944cc02000c8c014c0d4cc138dd4000a5eb822601e600898103d87a800041246eb8c138c13c004cc130dd419b8e00148000cc130dd49980c180b9b8d0010014bd7024446b3001303e002898019181a19826800a5eb822b3001304300289801919ba548008cc1340052f5c1159800981c80144c00c8cdd2a40086609a00297ae08acc004c03400a26600e4646609c6ea0cde5250375c609e0026609c609e60a000297ae059800981c9b8d0018998269ba930230013304d37526605260506e340040052f5c1164124466e9520063304d375000297ae08acc004c03000a26600e4646609c6ea0cde5250375c609e0026609c609e60a000297ae059800981c9b8d0018998269ba930230013304d37526605260506e340040052f5c1164124466e9520083304d3750b3001337100029040400244006266e04004c0192020412497ae08acc004cdc3a40140051300323374a900519826800a5eb822b30013370e900600144cc0048cdd2a40186609a00297ae02323304e3750600c6eb4c13c004cc138c13cc1400052f5c0646609c6ea0cde5250375c609e0026609c609e60a000297ae059800980f1b8d0018998269ba9301b0013304d37526603a60386e340040052f5c116412515980099b874803800a266002466e95200e3304d0014bd70119198271ba833794940dd718278009982718279828000a5eb8166002603c6e3400626609a6ea4c06c004cc134dd49980e980e1b8d0010014bd70459049456600266e1d2010002899800919ba548040cc1340052f5c04646609c6ea0cde5250375c609e0026609c609e60a000297ae059800980f1b8d0018998269ba9301b0013304d37526603a60386e340040052f5c116412515980099b874804800a2464646609e66e9520123304f30500014bd701982798281828800a5eb80c004008cc0208c8cc13cdd419bca4a06eb8c140004cc13cc140c1440052f5c0b3001303a371a00313304e375260480026609c6ea4cc0a8c0a4dc6800800a5eb822c8250966002608000314c103d87980008acc004c114006298103d87a80008acc004c0ec006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20944128825104a20948acc004cdc3a40280051300323374a900a19826800a5eb822b30013370e900b00144c00c8cdd2a402c6609a00297ae08acc004cdc3a403000513300123374a900c19826800a5eb808c8cc138dd419bca4a06eb8c13c004cc138c13cc1400052f5c0b3001301e371a00313304d375260360026609a6ea4cc074c070dc6800800a5eb822c824a2c8241048209041208241048209041208241048209041208240dd718269827003096600266e2000520808080808080808080028800c4cdc0800980124100028228c00c00c6eb4c10c004c8cc108dd419b8e00148000cc108dd49980718069b8d0010014bd701bae3042304300420708b206a371890011b80480051640a86eb8c0bcc0c000566002600e6e3400626605a6ea4c008004cc0b4dd49980298021b8d0010014bd704590291bae3015302a37546602e4646b30013371e6eb8c0bc00522104b9011a82008919191919191919911981b980f1981b981c0039981b9ba90013303730380024bd701981b981c181c80125eb80d660026024003125980099b89002371a00313303637526601e0040026606c6ea66002005337026e3400400a002b8c25eb822c81922c8188dd7181b181b8011bae3036004375a606a00264660686ea0cde5250375c606a00266068606a606c00297ae059800980f9b8d0018998199ba930090013303337526601e601c6e340040052f5c11640bc6eb8c0ccc0d0004d6600294624b30013371290201b8d0018998191ba93300b48100004cc0c8dd4cc005204099b80371a002901fc0057184bd7045902e45902d1bae30323033001300100259800a51892cc004cdc4a4100026e340062660606ea4cc0252080010013303037533001482000666e00dc6800a40ff0015c612f5c11640b11640ad1640a86eb8c0bcc0c000566002600e6e3400626605a6ea4c008004cc0b4dd49980298021b8d0010014bd704590291bae302d00a300348010c00d2008198010011812800a044899180118120019bae302200240806eb0c07cc070dd5000c5901a19199119801001000912cc004006298103d87a80008992cc004cdd7802180f000c4c020cc084c07c0052f5c113300300330230024074604200280f8dd5980f981018101810181018101810181018101810180e1baa0143374a90021980e99ba548008cc074c030c06cdd5180f180d9baa0014bd7025eb822c80c8c8cc004004dd61805980d9baa0132259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a51406d100189980180198108012036325980099912cc00400a294226530013259800980a98101baa00189bad302130243756604860426ea800629000203e30230019baf302330240019bab003488966002003159800980100344cc01400d20008a5040851325980099baf30230014c010140008acc004cc018010dd6981218139bab3024001898019ba630280028a5040891598009980300224001130030078a5040888110c0980050240ca60020033756602060406ea8c040c080dd5002488cc090008cc090dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0880066eacc08c006604e0069112cc004cdc8a441000038acc004cdc7a441000038998029807998141ba60024bd70000c4cc015300103d87a8000006409119800803c006446600e0046605466ec0dd48029ba6004001401c8120604a004811a2942294229410241ba63301f337606ea401cdd31980f99bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602c60386ea8c080c074dd51810180e9baa300d301d3754003132598009806980e9baa0018992cc004c04cc078dd5000c4c8c8c8c8cc8966002605200713259800980d18129baa0018991919194c004dd69816800cdd718168024dd69816801cdd7181680124444b3001303200589980d1bab303100e225980080144cc07003089660020051301b330340144bd7044c8c8cc06cc0cc0084c00cc0e0010dd71819800981a8012066899191980c981900109801981b0021bae3030001303300240c51640bc302d001302c001302b00130263754003164090605000d1640986eb8c098004dd59813001181300098128009812000980f9baa0018b203a3021301e37540031640706010603a6ea8c034c074dd5000c5901b4530103d87a8000406c603e00280e8dd69805180d1baa02122598009807980d1baa00289919192cc004c08800a26600c604200626600c00200916407c6040002604000260366ea800a2c80c88966002601c60326ea800a2646464b30013021002899192cc004c04c0062b3001301f37540050068b20408acc004c06000626464b300130250028044590221bad3023001301f37540051598009807000c566002603e6ea800a00d16408116407480e901d180e9baa00130200038b203c3259800980e800c56600260166038003168980b180e000a0368b203c3754603e002603e00260346ea800a2c80c113371090001bad30013010375400714a08072294100e22c805860126ea800e2c8038601000260066ea802629344d95900101", + "hash": "680f54d991e4d10708b4670d087cd18e072082ab46eea7cdc544e912" }, { "title": "close_position.close_position.else", @@ -49,15 +49,15 @@ } } ], - "compiledCode": "591636010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd500144c9660026466446600400400244b30010018a508acc004cdc79bae30140010038a51899801001180a800a01e40486eb0c048c04cc04cc04cc04cc04cc04cc04cc04cc03cdd50039bae3011300e375400315980099b8848000dd69808cc0048c048c04c0066e1d20049b89480124464b30013371e910100375c6028602a003130140018b201e30020019119198008008019119801800980100148c048c04cc04c0066eb8c044c038dd500acdd2a400091111111191919912cc004c07800a264b3001300f301a375400313232598009808980e1baa0018992cc004c048c074dd5000c4c9660026026603c6ea80062660426044603e6ea8008cc084c088c07cdd5000a5eb822c80e8c084c088c088c088c088c088c078dd5001c5901c1810180e9baa0018b2036300e301c3754002603c60366ea80062c80c8c8cc004004dd61804180d9baa301e0032259800800c530103d87a80008992cc004cdc39bad3020301d3754002009130083301f0014bd7044cc00c00cc08400901b180f800a03a8b203632598009806980c1baa0018992cc004c038c064dd5000c4c8cc0240048966002005132330010010042259800800c52f5c113302198009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301723235980099b8f375c605a0029110475d3c793008cc004888c8cc00cdd698188009bae3031303200130030019b89480426e3120109b804803e600e90082444446600a464660666ea0cde5250375c6068002660666068606a00297ae05980098029b8d0018998191ba930020013303237526600860066e340040052f5c11640b8466446601046606a6ea0cdc7000a40006606a6ea4cc00cc008dc6800800a5eb808cc0248cc0d8dd419b8e00148000cc0d8dd49980218019b8d0010014bd701119191981c98111981c9ba800833039375000a66072607400297ae033039303a303b0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605800312323303c374e002660786ea40092f5c065300100180252f5c080088896600200510018cc00400e60800053303e303f002001400c81ea246530010059981e181e8008024c02400e6eb8c0f4c0f80050054c004c8cc0f0dd419bca4a06eb8c0f4004cc0f0c0f4c0f80052f5c0b30013017371a00313303b37526024002660766ea4cc054c050dc6800800a5eb822c81ba446607a0046607a6ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11000a60586608660880106608698103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a8000330434c103d87a80004bd70200222259800801440063300100398238014c8c966002607200313230313304830490013304830313304830493046375400697ae0304a304a00130453754007159800981f000c4c8c8c0c8cc124c128008cc124c128004cc124c0c8cc124c128c11cdd500225eb80c12cc12c004c128004c114dd5001c566002606c003132323230333304a304b0033304a304b0023304a304b0013304a30333304a304b3048375400a97ae0304c304c001304b001304a001304537540071598009805000c4c8c8c8c8c0d0cc12cc130010cc12cc13000ccc12cc130008cc12cc130004cc12cc0d0cc12cc130c124dd500325eb80c134c134004c130004c12c004c128004c114dd5001c56600260120031323232323230353304c304d0053304c304d0043304c304d0033304c304d0023304c304d0013304c30353304c304d304a375400e97ae0304e304e001304d001304c001304b001304a0013045375400715980099b87480280062646464646464606c6609a609c00c6609a609c00a6609a609c0086609a609c0066609a609c0046609a609c0026609a606c6609a609c60966ea80212f5c0609e609e002609c002609a002609800260960026094002608a6ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc138c13c01ccc138c13c018cc138c13c014cc138c13c010cc138c13c00ccc138c13c008cc138c13c004cc138c0dccc138c13cc130dd5004a5eb80c140c140004c13c004c138004c134004c130004c12c004c128004c114dd5001c56600266e1d200e00189919191919191919181c19827982800419827982800399827982800319827982800299827982800219827982800199827982800119827982800099827981c19827982818269baa00a4bd7018289828800982800098278009827000982680098260009825800982500098229baa0038acc004cdc3a402000313232323232323232323039330503051009330503051008330503051007330503051006330503051005330503051004330503051003330503051002330503051001330503039330503051304e375401697ae03052305200130510013050001304f001304e001304d001304c001304b001304a0013045375400715980099b87480480062646464646464646464646074660a260a4014660a260a4012660a260a4010660a260a400e660a260a400c660a260a400a660a260a4008660a260a4006660a260a4004660a260a4002660a26074660a260a4609e6ea80312f5c060a660a600260a400260a200260a0002609e002609c002609a002609800260960026094002608a6ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc148c14c02ccc148c14c028cc148c14c024cc148c14c020cc148c14c01ccc148c14c018cc148c14c014cc148c14c010cc148c14c00ccc148c14c008cc148c14c004cc148c0eccc148c14cc140dd5006a5eb80c150c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c128004c114dd5001c56600266e1d20160018991919191919191919191919181e19829982a00619829982a00599829982a00519829982a00499829982a00419829982a00399829982a00319829982a00299829982a00219829982a00199829982a00119829982a00099829981e19829982a18289baa00e4bd70182a982a800982a000982980098290009828800982800098278009827000982680098260009825800982500098229baa0038991919191919191919191919181e19829982a00619829982a00599829982a00519829982a00499829982a00419829982a00399829982a00319829982a00299829982a00219829982a00199829982a00119829982a00099829982a182a80099829981e19829982a18289baa00e4bd7025eb80c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c128004c114dd5001a086410c82190432086410c82190432086410c821904318219baa0013046002400c8220dd718219822000991acc004c08400a2653001001a5eb82006800888966002606e003123233047374e0026608e6ea40092f5c065300100180252f5c080088896600200510018cc00400e609600533049304a002001400c8242246530010059982398240008024c05000e6eb8c120c1240050051802800a0828b207c375c60866088006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241051598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41048208dc4000c888c8cc118c00cdd698238009982318239824000a5eb80c00c006660846ea0cdc7000a4000660846ea4cc040c03cdc6800800a5eb8122232329800919802919198251ba833794940dd718258009982518259826000a5eb816600260386e340062660926ea4c064004cc124dd49980d980d1b8d0010014bd704590451191801acc004c0f0006298103d87a800089819998251ba80014bd70208c30030019bad3048003911191acc0066002607a6eb4c13000694294504744cc02000c8c014c0d4cc130dd4000a5eb822601e600898103d87a8000411c6eb8c130c134004cc128dd419b8e00148000cc128dd49980c180b9b8d0010014bd7024446b3001303c002898019181a19825800a5eb822b3001304100289801919ba548008cc12c0052f5c1159800981c80144c00c8cdd2a40086609600297ae08acc004c03400a26600e464660986ea0cde5250375c609a00266098609a609c00297ae059800981c9b8d0018998259ba930230013304b37526605260506e340040052f5c116411c466e9520063304b375000297ae08acc004c03000a26600e464660986ea0cde5250375c609a00266098609a609c00297ae059800981c9b8d0018998259ba930230013304b37526605260506e340040052f5c116411c466e9520083304b3750b3001337100029040400244006266e04004c0192020411c97ae08acc004cdc3a40140051300323374a900519825800a5eb822b30013370e900600144cc0048cdd2a40186609600297ae02323304c3750600c6eb4c134004cc130c134c1380052f5c064660986ea0cde5250375c609a00266098609a609c00297ae059800980f1b8d0018998259ba9301b0013304b37526603a60386e340040052f5c116411d15980099b874803800a266002466e95200e3304b0014bd70119198261ba833794940dd718268009982618269827000a5eb8166002603c6e340062660966ea4c06c004cc12cdd49980e980e1b8d0010014bd70459047456600266e1d2010002899800919ba548040cc12c0052f5c0464660986ea0cde5250375c609a00266098609a609c00297ae059800980f1b8d0018998259ba9301b0013304b37526603a60386e340040052f5c116411d15980099b874804800a2464646609a66e9520123304d304e0014bd701982698271827800a5eb80c004008cc0208c8cc134dd419bca4a06eb8c138004cc134c138c13c0052f5c0b3001303a371a00313304c37526048002660986ea4cc0a8c0a4dc6800800a5eb822c8240966002607c00314c103d87980008acc004c10c006298103d87a80008acc004c0ec006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20904120824104820908acc004cdc3a40280051300323374a900a19825800a5eb822b30013370e900b00144c00c8cdd2a402c6609600297ae08acc004cdc3a403000513300123374a900c19825800a5eb808c8cc130dd419bca4a06eb8c134004cc130c134c1380052f5c0b3001301e371a00313304b37526036002660966ea4cc074c070dc6800800a5eb822c823a2c8231046208c41188231046208c41188231046208c41188230dd718259826003096600266e2000520808080808080808080028800c4cdc0800980124100028218c00c00c6eb4c104004c8cc100dd419b8e00148000cc100dd49980718069b8d0010014bd701bae30403041004206c8b2066371890011b80480051640a06eb8c0b4c0b800566002600e6e340062660566ea4c008004cc0acdd49980298021b8d0010014bd704590271bae3015302837546602e4646b30013371e6eb8c0b400522104b9011a82008919191919191919911981a980f1981a981b0039981a9ba90013303530360024bd701981a981b181b80125eb80d660026024003125980099b89002371a00313303437526601e004002660686ea66002005337026e3400400a002b8c25eb822c81822c8178dd7181a181a8011bae3034004375a606600264660646ea0cde5250375c6066002660646066606800297ae059800980f9b8d0018998189ba930090013303137526601e601c6e340040052f5c11640b46eb8c0c4c0c8004d6600294624b30013371290201b8d0018998181ba93300b48100004cc0c0dd4cc005204099b80371a002901fc0057184bd7045902c45902b1bae30303031001300100259800a51892cc004cdc4a4100026e3400626605c6ea4cc0252080010013302e37533001482000666e00dc6800a40ff0015c612f5c11640a91640a51640a06eb8c0b4c0b800566002600e6e340062660566ea4c008004cc0acdd49980298021b8d0010014bd704590271bae302b00a300348010c00d2008198010011811800a040899180118110019bae302000240786eb0c074c068dd5000c5901819199119801001000912cc004006298103d87a80008992cc004cdd7802180e000c4c020cc07cc0740052f5c11330030033021002406c603e00280e8dd5980e980f180f180f180f180f180f180f180f180f180d1baa0123374a90021980d99ba548008cc06cc070c074c074c074c064dd5180e180c9baa0014bd7025eb822c80b8c8cc004004dd61805980c9baa0112259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a5140651001899801801980f8012032325980099912cc00400a2942265300132598009809980f1baa00189bad301f302237566044603e6ea800629000203a30210019baf302130220019bab003488966002003159800980100344cc01400d20008a50407d1325980099baf30210014c010140008acc004cc018010dd6981118129bab3022001898019ba630260028a5040811598009980300224001130030078a5040808100c0900050220ca600200337566020603c6ea8c040c078dd5002488cc088008cc088dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0800066eacc084006604a0069112cc004cdc8a441000038acc004cdc7a441000038998029807998131ba60024bd70000c4cc015300103d87a8000006408919800803c006446600e0046605066ec0dd48029ba6004001401c81106046004810a2942294229410221ba63301d337606ea401cdd31980e99bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602860346ea8c078c06cdd5180f180d9baa300d301b3754003132598009806980d9baa0018992cc004c044c070dd5000c4c8c8c8c8cc8966002604e00713259800980c18119baa0018991919194c004dd69815800cdd718158024dd69815801cdd7181580124444b3001303000589980d1bab302f00e225980080144cc07003089660020051301b330320144bd7044c8c8cc06cc0c40084c00cc0d8010dd7181880098198012062899191980c981800109801981a0021bae302e001303100240bd1640b4302b001302a001302900130243754003164088604c00d1640906eb8c090004dd59812001181200098118009811000980e9baa0018b2036301f301c3754003164068601060366ea8c034c06cdd5000c590194530103d87a80004064603a00280d8dd69805180c1baa01f22598009806980c1baa00289919192cc004c08000a26600c603e00626600c002009164074603c002603c00260326ea800a2c80b889660026018602e6ea800a2646464b3001301f002899192cc004c0440062b3001301d37540050068b203c8acc004c05800626464b300130230028044590201bad3021001301d37540051598009807000c566002603a6ea800a00d16407916406c80d901b180d9baa001301e0038b20383259800980d800c56600260166034003168980a180d000a0328b20383754603a002603a00260306ea800a2c80b113371090001bad30113012301230123012300e375400314a08062294100c180818069baa0028b201618049baa0038b200e180400098019baa0098a4d1365640041", - "hash": "fb99d7b4369fa4e67a69fb162e423eadf3eb10ef7dfebc757c2d96b2" + "compiledCode": "591639010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a4602260246024602460246024003230113012301230120014889660026466446600400400244b30010018a508acc004cdc79bae30160010038a51899801001180b800a02240506eb0c050c054c054c054c054c054c054c054c054c044dd50049bae30023010375400715980099b8848000dd69809cc0048c050c0540066e1d20049b89480124464b30013371e91100375c602c602e003130160018b202230020019119198008008019119801800980100148c050c054c0540066eb8c04cc040dd500bcdd2a400091111111191919912cc004c08000a264b30013011301c375400313232598009809980f1baa0018992cc004c050c07cdd5000c4c966002602a60406ea8006266046604860426ea8008cc08cc090c084dd5000a5eb822c80f8c048c080dd5001c5901e1811180f9baa0018b203a300e301e37540026040603a6ea80062c80d8c8cc004004dd61804180e9baa30200032259800800c530103d87a80008992cc004cdc39bad3022301f375400200913008330210014bd7044cc00c00cc08c00901d1810800a03e8b203a32598009807980d1baa0018992cc004c040c06cdd5000c4c8cc0240048966002005132330010010042259800800c52f5c113302398009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301723235980099b8f375c605e0029110475d3c793008cc004888c8cc00cdd698198009bae3033303400130030019b89480426e3120109b804803e600e90082444446600a4646606a6ea0cde5250375c606c0026606a606c606e00297ae05980098029b8d00189981a1ba930020013303437526600860066e340040052f5c11640c0466446601046606e6ea0cdc7000a40006606e6ea4cc00cc008dc6800800a5eb808cc0248cc0e0dd419b8e00148000cc0e0dd49980218019b8d0010014bd701119191981d98111981d9ba80083303b375000a66076607800297ae03303b303c303d0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605c00312323303e374e0026607c6ea40092f5c065300100180252f5c080088896600200510018cc00400e6084005330403041002001400c81fa246530010059981f181f8008024c02400e6eb8c0fcc1000050054c004c8cc0f8dd419bca4a06eb8c0fc004cc0f8c0fcc1000052f5c0b30013017371a00313303d375260240026607a6ea4cc054c050dc6800800a5eb822c81ca446607e0046607e6ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11800a60586608a608c0106608a98103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a80004bd70200222259800801440063300100398248014c8c966002607600313230313304a304b0013304a30313304a304b3048375400697ae0304c304c001304737540071598009820000c4c8c8c0c8cc12cc130008cc12cc130004cc12cc0c8cc12cc130c124dd500225eb80c134c134004c130004c11cdd5001c566002606c003132323230333304c304d0033304c304d0023304c304d0013304c30333304c304d304a375400a97ae0304e304e001304d001304c001304737540071598009805000c4c8c8c8c8c0d0cc134c138010cc134c13800ccc134c138008cc134c138004cc134c0d0cc134c138c12cdd500325eb80c13cc13c004c138004c134004c130004c11cdd5001c56600260120031323232323230353304e304f0053304e304f0043304e304f0033304e304f0023304e304f0013304e30353304e304f304c375400e97ae030503050001304f001304e001304d001304c0013047375400715980099b87480280062646464646464606c6609e60a000c6609e60a000a6609e60a00086609e60a00066609e60a00046609e60a00026609e606c6609e60a0609a6ea80212f5c060a260a200260a0002609e002609c002609a0026098002608e6ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc140c14401ccc140c144018cc140c144014cc140c144010cc140c14400ccc140c144008cc140c144004cc140c0dccc140c144c138dd5004a5eb80c148c148004c144004c140004c13c004c138004c134004c130004c11cdd5001c56600266e1d200e00189919191919191919181c19828982900419828982900399828982900319828982900299828982900219828982900199828982900119828982900099828981c19828982918279baa00a4bd7018299829800982900098288009828000982780098270009826800982600098239baa0038acc004cdc3a4020003132323232323232323230393305230530093305230530083305230530073305230530063305230530053305230530043305230530033305230530023305230530013305230393305230533050375401697ae0305430540013053001305200130510013050001304f001304e001304d001304c0013047375400715980099b87480480062646464646464646464646074660a660a8014660a660a8012660a660a8010660a660a800e660a660a800c660a660a800a660a660a8008660a660a8006660a660a8004660a660a8002660a66074660a660a860a26ea80312f5c060aa60aa00260a800260a600260a400260a200260a0002609e002609c002609a0026098002608e6ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc150c15402ccc150c154028cc150c154024cc150c154020cc150c15401ccc150c154018cc150c154014cc150c154010cc150c15400ccc150c154008cc150c154004cc150c0eccc150c154c148dd5006a5eb80c158c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c11cdd5001c56600266e1d20160018991919191919191919191919181e1982a982b0061982a982b0059982a982b0051982a982b0049982a982b0041982a982b0039982a982b0031982a982b0029982a982b0021982a982b0019982a982b0011982a982b0009982a981e1982a982b18299baa00e4bd70182b982b800982b000982a800982a0009829800982900098288009828000982780098270009826800982600098239baa0038991919191919191919191919181e1982a982b0061982a982b0059982a982b0051982a982b0049982a982b0041982a982b0039982a982b0031982a982b0029982a982b0021982a982b0019982a982b0011982a982b0009982a982b182b8009982a981e1982a982b18299baa00e4bd7025eb80c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c11cdd5001a08a41148229045208a41148229045208a4114822904518229baa0013048002400c8230dd718229823000991acc004c08400a2653001001a5eb820068008889660026072003123233049374e002660926ea40092f5c065300100180252f5c080088896600200510018cc00400e609a0053304b304c002001400c8252246530010059982498250008024c05000e6eb8c128c12c0050051802800a0868b2080375c608a608c006530012232598009800a40211598009800a4001148002266e39220108010204081020408000002410d1598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f410c8218dc4000c888c8cc120c00cdd698248009982418249825000a5eb80c00c006660886ea0cdc7000a4000660886ea4cc040c03cdc6800800a5eb8122232329800919802919198261ba833794940dd718268009982618269827000a5eb816600260386e340062660966ea4c064004cc12cdd49980d980d1b8d0010014bd704590471191801acc004c0f8006298103d87a800089819998261ba80014bd70209030030019bad304a003911191acc0066002607e6eb4c13800694294504944cc02000c8c014c0d4cc138dd4000a5eb822601e600898103d87a800041246eb8c138c13c004cc130dd419b8e00148000cc130dd49980c180b9b8d0010014bd7024446b3001303e002898019181a19826800a5eb822b3001304300289801919ba548008cc1340052f5c1159800981c80144c00c8cdd2a40086609a00297ae08acc004c03400a26600e4646609c6ea0cde5250375c609e0026609c609e60a000297ae059800981c9b8d0018998269ba930230013304d37526605260506e340040052f5c1164124466e9520063304d375000297ae08acc004c03000a26600e4646609c6ea0cde5250375c609e0026609c609e60a000297ae059800981c9b8d0018998269ba930230013304d37526605260506e340040052f5c1164124466e9520083304d3750b3001337100029040400244006266e04004c0192020412497ae08acc004cdc3a40140051300323374a900519826800a5eb822b30013370e900600144cc0048cdd2a40186609a00297ae02323304e3750600c6eb4c13c004cc138c13cc1400052f5c0646609c6ea0cde5250375c609e0026609c609e60a000297ae059800980f1b8d0018998269ba9301b0013304d37526603a60386e340040052f5c116412515980099b874803800a266002466e95200e3304d0014bd70119198271ba833794940dd718278009982718279828000a5eb8166002603c6e3400626609a6ea4c06c004cc134dd49980e980e1b8d0010014bd70459049456600266e1d2010002899800919ba548040cc1340052f5c04646609c6ea0cde5250375c609e0026609c609e60a000297ae059800980f1b8d0018998269ba9301b0013304d37526603a60386e340040052f5c116412515980099b874804800a2464646609e66e9520123304f30500014bd701982798281828800a5eb80c004008cc0208c8cc13cdd419bca4a06eb8c140004cc13cc140c1440052f5c0b3001303a371a00313304e375260480026609c6ea4cc0a8c0a4dc6800800a5eb822c8250966002608000314c103d87980008acc004c114006298103d87a80008acc004c0ec006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20944128825104a20948acc004cdc3a40280051300323374a900a19826800a5eb822b30013370e900b00144c00c8cdd2a402c6609a00297ae08acc004cdc3a403000513300123374a900c19826800a5eb808c8cc138dd419bca4a06eb8c13c004cc138c13cc1400052f5c0b3001301e371a00313304d375260360026609a6ea4cc074c070dc6800800a5eb822c824a2c8241048209041208241048209041208241048209041208240dd718269827003096600266e2000520808080808080808080028800c4cdc0800980124100028228c00c00c6eb4c10c004c8cc108dd419b8e00148000cc108dd49980718069b8d0010014bd701bae3042304300420708b206a371890011b80480051640a86eb8c0bcc0c000566002600e6e3400626605a6ea4c008004cc0b4dd49980298021b8d0010014bd704590291bae3015302a37546602e4646b30013371e6eb8c0bc00522104b9011a82008919191919191919911981b980f1981b981c0039981b9ba90013303730380024bd701981b981c181c80125eb80d660026024003125980099b89002371a00313303637526601e0040026606c6ea66002005337026e3400400a002b8c25eb822c81922c8188dd7181b181b8011bae3036004375a606a00264660686ea0cde5250375c606a00266068606a606c00297ae059800980f9b8d0018998199ba930090013303337526601e601c6e340040052f5c11640bc6eb8c0ccc0d0004d6600294624b30013371290201b8d0018998191ba93300b48100004cc0c8dd4cc005204099b80371a002901fc0057184bd7045902e45902d1bae30323033001300100259800a51892cc004cdc4a4100026e340062660606ea4cc0252080010013303037533001482000666e00dc6800a40ff0015c612f5c11640b11640ad1640a86eb8c0bcc0c000566002600e6e3400626605a6ea4c008004cc0b4dd49980298021b8d0010014bd704590291bae302d00a300348010c00d2008198010011812800a044899180118120019bae302200240806eb0c07cc070dd5000c5901a19199119801001000912cc004006298103d87a80008992cc004cdd7802180f000c4c020cc084c07c0052f5c113300300330230024074604200280f8dd5980f981018101810181018101810181018101810180e1baa0143374a90021980e99ba548008cc074c030c06cdd5180f180d9baa0014bd7025eb822c80c8c8cc004004dd61805980d9baa0132259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a51406d100189980180198108012036325980099912cc00400a294226530013259800980a98101baa00189bad302130243756604860426ea800629000203e30230019baf302330240019bab003488966002003159800980100344cc01400d20008a5040851325980099baf30230014c010140008acc004cc018010dd6981218139bab3024001898019ba630280028a5040891598009980300224001130030078a5040888110c0980050240ca60020033756602060406ea8c040c080dd5002488cc090008cc090dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0880066eacc08c006604e0069112cc004cdc8a441000038acc004cdc7a441000038998029807998141ba60024bd70000c4cc015300103d87a8000006409119800803c006446600e0046605466ec0dd48029ba6004001401c8120604a004811a2942294229410241ba63301f337606ea401cdd31980f99bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602c60386ea8c080c074dd51810180e9baa300d301d3754003132598009806980e9baa0018992cc004c04cc078dd5000c4c8c8c8c8cc8966002605200713259800980d18129baa0018991919194c004dd69816800cdd718168024dd69816801cdd7181680124444b3001303200589980d1bab303100e225980080144cc07003089660020051301b330340144bd7044c8c8cc06cc0cc0084c00cc0e0010dd71819800981a8012066899191980c981900109801981b0021bae3030001303300240c51640bc302d001302c001302b00130263754003164090605000d1640986eb8c098004dd59813001181300098128009812000980f9baa0018b203a3021301e37540031640706010603a6ea8c034c074dd5000c5901b4530103d87a8000406c603e00280e8dd69805180d1baa02122598009807980d1baa00289919192cc004c08800a26600c604200626600c00200916407c6040002604000260366ea800a2c80c88966002601c60326ea800a2646464b30013021002899192cc004c04c0062b3001301f37540050068b20408acc004c06000626464b300130250028044590221bad3023001301f37540051598009807000c566002603e6ea800a00d16408116407480e901d180e9baa00130200038b203c3259800980e800c56600260166038003168980b180e000a0368b203c3754603e002603e00260346ea800a2c80c113371090001bad30013010375400714a08072294100e22c805860126ea800e2c8038601000260066ea802629344d95900101", + "hash": "680f54d991e4d10708b4670d087cd18e072082ab46eea7cdc544e912" }, { "title": "liquidate.liquidate.spend", "datum": { "title": "datum", "schema": { - "$ref": "#/definitions/lazer_perps~1types~1Position" + "$ref": "#/definitions/lazer_perps~1types~1PositionDatum" } }, "redeemer": { @@ -74,8 +74,8 @@ } } ], - "compiledCode": "59179c010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a460226024602400323011301200191808980918091809000cdd2a4000911111919912cc004c024c050dd500144cdd7999119912cc004cdc4001000c5300103d87980008acc004cdc40008014530103d87b80008a6103d87a8000405c80b8cdc11bad301a002375a6034603600266e08dd6980d0009bad301a301b002301537546644600c660326ea0cdc11bad301a002375a6034002660326ea0cdc11bad301a301b002375a6034603600297ae030153754664466446010660366ea0cdc019b82375a603800800266e08dd6980e0018011980d9ba83370400400297ae0375a603460360046eb4c068c06c004c054dd518009bad300730153754010602a6eaa6002600c602a6ea80226eb4c014c054dd50044dd6980c180c980c980c980c980a9baa0089bad301898009b87480126e25200491192cc004cdc7a4500375c603660380031301b0018b202c3002001911919800800801911980180098010014dd7180c180a9baa01c9bad3006301537540389111111919192cc004c088006264b30013013301e37540031323259800980a98101baa0018992cc004c058c084dd5000c4c966002602e60446ea800626604a604c60466ea8008cc094c098c08cdd5000a5eb822c8108c094c098c098c098c098c098c088dd5001c59020181218109baa0018b203e3011302037540026044603e6ea80062c80e8c8cc004004dd61808980f9baa30220022259800800c530103d87a80008992cc004cdc39bad30243021375400200f13010330230014bd7044cc00c00cc09400901f1811800a0428b203e32598009809180e9baa0018992cc004c04cc078dd5000c4c8cc0200048966002005132330010010042259800800c52f5c113302698009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301623235980099b8f375c60640029110475d3c793008cc004888c8cc00cdd6981b0009bae3036303700130030019b89480426e3120109b804803e600e90082444446600a464660706ea0cde5250375c6072002660706072607400297ae05980098029b8d00189981b9ba930020013303737526600860066e340040052f5c11640cc46644660104660746ea0cdc7000a4000660746ea4cc00cc008dc6800800a5eb808cc0248cc0ecdd419b8e00148000cc0ecdd49980218019b8d0010014bd701119191981f18159981f1ba80083303e375000a6607c607e00297ae03303e303f30400014bd7018008012cc004c05800a2653001001a5eb820068008889660026062003123233041374e002660826ea40092f5c065300100180252f5c080088896600200510018cc00400e608a005330433044002001400c8212246530010059982098210008024c02400e6eb8c108c10c0050054c004c8cc104dd419bca4a06eb8c108004cc104c108c10c0052f5c0b30013017371a00313304037526024002660806ea4cc054c050dc6800800a5eb822c81e24466084004660846ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c12400a606a6609060920106609098103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a80004bd70200222259800801440063300100398260014c8c966002607c003132303a3304d304e0013304d303a3304d304e304b375400697ae0304f304f001304a37540071598009821800c4c8c8c0eccc138c13c008cc138c13c004cc138c0eccc138c13cc130dd500225eb80c140c140004c13c004c128dd5001c566002606a0031323232303c3304f30500033304f30500023304f30500013304f303c3304f3050304d375400a97ae0305130510013050001304f001304a37540071598009805000c4c8c8c8c8c0f4cc140c144010cc140c14400ccc140c144008cc140c144004cc140c0f4cc140c144c138dd500325eb80c148c148004c144004c140004c13c004c128dd5001c566002601200313232323232303e33051305200533051305200433051305200333051305200233051305200133051303e330513052304f375400e97ae030533053001305200130510013050001304f001304a375400715980099b87480280062646464646464607e660a460a600c660a460a600a660a460a6008660a460a6006660a460a6004660a460a6002660a4607e660a460a660a06ea80212f5c060a860a800260a600260a400260a200260a0002609e00260946ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c100cc14cc15001ccc14cc150018cc14cc150014cc14cc150010cc14cc15000ccc14cc150008cc14cc150004cc14cc100cc14cc150c144dd5004a5eb80c154c154004c150004c14c004c148004c144004c140004c13c004c128dd5001c56600266e1d200e0018991919191919191918209982a182a8041982a182a8039982a182a8031982a182a8029982a182a8021982a182a8019982a182a8011982a182a8009982a18209982a182a98291baa00a4bd70182b182b000982a800982a0009829800982900098288009828000982780098251baa0038acc004cdc3a4020003132323232323232323230423305530560093305530560083305530560073305530560063305530560053305530560043305530560033305530560023305530560013305530423305530563053375401697ae0305730570013056001305500130540013053001305200130510013050001304f001304a375400715980099b87480480062646464646464646464646086660ac60ae014660ac60ae012660ac60ae010660ac60ae00e660ac60ae00c660ac60ae00a660ac60ae008660ac60ae006660ac60ae004660ac60ae002660ac6086660ac60ae60a86ea80312f5c060b060b000260ae00260ac00260aa00260a800260a600260a400260a200260a0002609e00260946ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c110cc15cc16002ccc15cc160028cc15cc160024cc15cc160020cc15cc16001ccc15cc160018cc15cc160014cc15cc160010cc15cc16000ccc15cc160008cc15cc160004cc15cc110cc15cc160c154dd5006a5eb80c164c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c128dd5001c56600266e1d2016001899191919191919191919191918229982c182c8061982c182c8059982c182c8051982c182c8049982c182c8041982c182c8039982c182c8031982c182c8029982c182c8021982c182c8019982c182c8011982c182c8009982c18229982c182c982b1baa00e4bd70182d182d000982c800982c000982b800982b000982a800982a0009829800982900098288009828000982780098251baa003899191919191919191919191918229982c182c8061982c182c8059982c182c8051982c182c8049982c182c8041982c182c8039982c182c8031982c182c8029982c182c8021982c182c8019982c182c8011982c182c8009982c182c982d0009982c18229982c182c982b1baa00e4bd7025eb80c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c128dd5001a0904120824104820904120824104820904120824104818241baa001304b002400c8248dd718241824800991acc004c08400a2653001001a5eb82006800888966002607800312323304c374e002660986ea40092f5c065300100180252f5c080088896600200510018cc00400e60a00053304e304f002001400c826a246530010059982618268008024c05000e6eb8c134c1380050051802800a08c8b2086375c60906092006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241191598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41188230dc4000c888c8cc12cc00cdd698260009982598261826800a5eb80c00c0066608e6ea0cdc7000a40006608e6ea4cc040c03cdc6800800a5eb8122232329800919802919198279ba833794940dd718280009982798281828800a5eb816600260386e3400626609c6ea4c064004cc138dd49980d980d1b8d0010014bd7045904a1191801acc004c104006298103d87a80008981e198279ba80014bd70209630030019bad304d003911191acc006600260846eb4c14400694294504c44cc02000c8c014c0f8cc144dd4000a5eb822601e600898103d87a800041306eb8c144c148004cc13cdd419b8e00148000cc13cdd49980c180b9b8d0010014bd7024446b30013041002898019181e99828000a5eb822b3001304600289801919ba548008cc1400052f5c1159800981c00144c00c8cdd2a4008660a000297ae08acc004c03400a26600e464660a26ea0cde5250375c60a4002660a260a460a600297ae059800981c1b8d0018998281ba930230013305037526605260506e340040052f5c1164130466e95200633050375000297ae08acc004c03000a26600e464660a26ea0cde5250375c60a4002660a260a460a600297ae059800981c1b8d0018998281ba930230013305037526605260506e340040052f5c1164130466e952008330503750b3001337100029040400244006266e04004c0192020413097ae08acc004cdc3a40140051300323374a900519828000a5eb822b30013370e900600144cc0048cdd2a4018660a000297ae0232330513750600c6eb4c148004cc144c148c14c0052f5c064660a26ea0cde5250375c60a4002660a260a460a600297ae059800980f1b8d0018998281ba9301b0013305037526603a60386e340040052f5c116413115980099b874803800a266002466e95200e330500014bd70119198289ba833794940dd718290009982898291829800a5eb8166002603c6e340062660a06ea4c06c004cc140dd49980e980e1b8d0010014bd7045904c456600266e1d2010002899800919ba548040cc1400052f5c0464660a26ea0cde5250375c60a4002660a260a460a600297ae059800980f1b8d0018998281ba9301b0013305037526603a60386e340040052f5c116413115980099b874804800a246464660a466e9520123305230530014bd70198291829982a000a5eb80c004008cc0208c8cc148dd419bca4a06eb8c14c004cc148c14cc1500052f5c0b30013039371a00313305137526048002660a26ea4cc0a8c0a4dc6800800a5eb822c8268966002608600314c103d87980008acc004c120006298103d87a80008acc004c0e8006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b209a4134826904d209a8acc004cdc3a40280051300323374a900a19828000a5eb822b30013370e900b00144c00c8cdd2a402c660a000297ae08acc004cdc3a403000513300123374a900c19828000a5eb808c8cc144dd419bca4a06eb8c148004cc144c148c14c0052f5c0b3001301e371a00313305037526036002660a06ea4cc074c070dc6800800a5eb822c82622c825904b2096412c825904b2096412c825904b2096412c8258dd718281828803096600266e2000520808080808080808080028800c4cdc0800980124100028240c00c00c6eb4c118004c8cc114dd419b8e00148000cc114dd49980718069b8d0010014bd701bae3045304600420768b2070371890011b80480051640b46eb8c0c8c0cc00566002600e6e340062660606ea4c008004cc0c0dd49980298021b8d0010014bd7045902c1bae301f302d37546602c4646b30013371e6eb8c0c800522104b9011a82008919191919191919911981d18139981d181d8039981d1ba90013303a303b0024bd701981d181d981e00125eb80d660026024003125980099b89002371a00313303937526601e004002660726ea66002005337026e3400400a002b8c25eb822c81aa2c81a0dd7181c981d0011bae3039004375a6070002646606e6ea0cde5250375c60700026606e6070607200297ae059800980f1b8d00189981b1ba930090013303637526601e601c6e340040052f5c11640c86eb8c0d8c0dc004d6600294624b30013371290201b8d00189981a9ba93300b48100004cc0d4dd4cc005204099b80371a002901fc0057184bd704590314590301bae30353036001300100259800a51892cc004cdc4a4100026e340062660666ea4cc0252080010013303337533001482000666e00dc6800a40ff0015c612f5c11640bd1640b91640b46eb8c0c8c0cc00566002600e6e340062660606ea4c008004cc0c0dd49980298021b8d0010014bd7045902c1bae303000a300348010c00d2008198010011814000a04a899180118138019bae3025002408c6eb0c088c07cdd5000c5901d19199119801001000912cc004006298103d87a80008992cc004cdd78021810800c4c044cc090c0880052f5c11330030033026002408060480028110dd59811181198119811981198119811981198119811980f9baa0173374a90021981019ba548008cc080c038c078dd51810980f1baa0014bd7025eb822c80e0c8cc004004dd61807980f1baa0162259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a51407910018998018019812001203c325980099912cc00400a294226530013259800980c18119baa00189bad302430273756604e60486ea800629000204430260019baf302630270019bab003488966002003159800980100344cc01400d20008a5040911325980099baf30260014c010140008acc004cc018010dd6981398151bab3027001898019ba6302b0028a5040951598009980300224001130030078a5040948128c0a40050270ca60020033756602860466ea8c050c08cdd5002488cc09c008cc09cdd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0940066eacc09800660540069112cc004cdc8a441000038acc004cdc7a44100003899802980c198159ba60024bd70000c4cc015300103d87a8000006409d19800803c006446600e0046605a66ec0dd48029ba6004001401c8138605000481322942294229410271ba633022337606ea401cdd31981119bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c5660026032603e6ea8c08cc080dd5181198101baa30113020375400313259800980618101baa0018992cc004c058c084dd5000c4c8c8c8c8cc8966002605800713259800980e98141baa0018991919194c004dd69818000cdd718180024dd69818001cdd7181800124444b3001303500589980c9bab303400e225980080144cc06c030896600200513024330370144bd7044c8c8cc06cc0d80084c00cc0ec010dd7181b000981c001206c899191980c981a80109801981c8021bae3033001303600240d11640c83030001302f001302e0013029375400316409c605600d1640a46eb8c0a4004dd5981480118148009814000981380098111baa0018b204030243021375400316407c602460406ea8c044c080dd5000c5901e4530103d87a800040786044002810089660026024603a6ea800a2646464b30013025002899803181200189980300080245902218118009811800980f1baa0028b203822598009808980e1baa00289919192cc004c09000a26464b300130160018acc004c088dd5001401a2c811a2b3001301b001899192cc004c0a000a0111640946eb4c098004c088dd50014566002601a00315980098111baa0028034590234590202040408060406ea8004c08c00e2c8108c96600260400031598009805180f800c5a26032603e00280f22c8108dd518110009811000980e9baa0028b20362444464b3001300e301937540031301d301a37540031640606600e66e0800d66002601a60306ea8012266e0400400a266e040080050170010c054dd51800a41413802602a6ea8c060c054dd5001260103d87980008b202633001337046eb4c014c04cdd500324100fa9001118019980b1ba8001330164c10101004bd70112cc004c020006298103d87a80008acc004cdc4000a40011300333016300333016375066e05200000233016375066e0520000014bd7025eb82260066602c60066602c6ea0008cc058dd4000a5eb812f5c0809101222c805860126ea800e2c8038601000260066ea802629344d9590011", - "hash": "715413ffebf875023cc8c1e9eb7af1d49b808139940295a4d56acf5a" + "compiledCode": "5917ae010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a460226024602400323011301200191808980918091809000c8c044c048c048c048c0480066e9520004888888c8cc89660026014602a6ea800a266ebccc88cc896600266e20008006298103d87980008acc004cdc40008014530103d87b80008a6103d87a8000406080c0cdc11bad301b002375a6036603800266e08dd6980d8009bad301b301c002301637546644600c660346ea0cdc11bad301b002375a6036002660346ea0cdc11bad301b301c002375a6036603800297ae030163754664466446010660386ea0cdc019b82375a603a00800266e08dd6980e8018011980e1ba83370400400297ae0375a603660380046eb4c06cc070004c058dd518009bad300530163754012602c6eaa6002600e602c6ea80266eb4c014c058dd5004cdd69804180b1baa0099bad300630163754013375a60333001370e90024dc4a400922325980099b8f488100375c6038603a0031301c0018b202e3002001911919800800801911980180098010014dd7180c980b1baa01d9bad30073016375403a9111111919192cc004c08c006264b30013014301f37540031323259800980b18109baa0018992cc004c05cc088dd5000c4c966002603060466ea800626604c604e60486ea8008cc098c09cc090dd5000a5eb822c8110c098c09cc09cc09cc09cc09cc08cdd5001c59021181298111baa0018b2040301230213754002604660406ea80062c80f0c8cc004004dd6180918101baa30230022259800800c530103d87a80008992cc004cdc39bad30253022375400200f13010330240014bd7044cc00c00cc0980090201812000a0448b204032598009809980f1baa0018992cc004c050c07cdd5000c4c8cc0200048966002005132330010010042259800800c52f5c113302798009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301623235980099b8f375c60660029110475d3c793008cc004888c8cc00cdd6981b8009bae3037303800130030019b89480426e3120109b804803e600e90082444446600a464660726ea0cde5250375c6074002660726074607600297ae05980098029b8d00189981c1ba930020013303837526600860066e340040052f5c11640d046644660104660766ea0cdc7000a4000660766ea4cc00cc008dc6800800a5eb808cc0248cc0f0dd419b8e00148000cc0f0dd49980218019b8d0010014bd701119191981f98159981f9ba80083303f375000a6607e608000297ae03303f304030410014bd7018008012cc004c05800a2653001001a5eb820068008889660026064003123233042374e002660846ea40092f5c065300100180252f5c080088896600200510018cc00400e608c005330443045002001400c821a246530010059982118218008024c02400e6eb8c10cc1100050054c004c8cc108dd419bca4a06eb8c10c004cc108c10cc1100052f5c0b30013017371a00313304137526024002660826ea4cc054c050dc6800800a5eb822c81ea4466086004660866ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c12800a606a6609260940106609298103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a80004bd70200222259800801440063300100398268014c8c966002607e003132303a3304e304f0013304e303a3304e304f304c375400697ae030503050001304b37540071598009822000c4c8c8c0eccc13cc140008cc13cc140004cc13cc0eccc13cc140c134dd500225eb80c144c144004c140004c12cdd5001c566002606a0031323232303c33050305100333050305100233050305100133050303c330503051304e375400a97ae03052305200130510013050001304b37540071598009805000c4c8c8c8c8c0f4cc144c148010cc144c14800ccc144c148008cc144c148004cc144c0f4cc144c148c13cdd500325eb80c14cc14c004c148004c144004c140004c12cdd5001c566002601200313232323232303e33052305300533052305300433052305300333052305300233052305300133052303e3305230533050375400e97ae0305430540013053001305200130510013050001304b375400715980099b87480280062646464646464607e660a660a800c660a660a800a660a660a8008660a660a8006660a660a8004660a660a8002660a6607e660a660a860a26ea80212f5c060aa60aa00260a800260a600260a400260a200260a000260966ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c100cc150c15401ccc150c154018cc150c154014cc150c154010cc150c15400ccc150c154008cc150c154004cc150c100cc150c154c148dd5004a5eb80c158c158004c154004c150004c14c004c148004c144004c140004c12cdd5001c56600266e1d200e0018991919191919191918209982a982b0041982a982b0039982a982b0031982a982b0029982a982b0021982a982b0019982a982b0011982a982b0009982a98209982a982b18299baa00a4bd70182b982b800982b000982a800982a000982980098290009828800982800098259baa0038acc004cdc3a4020003132323232323232323230423305630570093305630570083305630570073305630570063305630570053305630570043305630570033305630570023305630570013305630423305630573054375401697ae03058305800130570013056001305500130540013053001305200130510013050001304b375400715980099b87480480062646464646464646464646086660ae60b0014660ae60b0012660ae60b0010660ae60b000e660ae60b000c660ae60b000a660ae60b0008660ae60b0006660ae60b0004660ae60b0002660ae6086660ae60b060aa6ea80312f5c060b260b200260b000260ae00260ac00260aa00260a800260a600260a400260a200260a000260966ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c110cc160c16402ccc160c164028cc160c164024cc160c164020cc160c16401ccc160c164018cc160c164014cc160c164010cc160c16400ccc160c164008cc160c164004cc160c110cc160c164c158dd5006a5eb80c168c168004c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c12cdd5001c56600266e1d2016001899191919191919191919191918229982c982d0061982c982d0059982c982d0051982c982d0049982c982d0041982c982d0039982c982d0031982c982d0029982c982d0021982c982d0019982c982d0011982c982d0009982c98229982c982d182b9baa00e4bd70182d982d800982d000982c800982c000982b800982b000982a800982a000982980098290009828800982800098259baa003899191919191919191919191918229982c982d0061982c982d0059982c982d0051982c982d0049982c982d0041982c982d0039982c982d0031982c982d0029982c982d0021982c982d0019982c982d0011982c982d0009982c982d182d8009982c98229982c982d182b9baa00e4bd7025eb80c168004c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c12cdd5001a0924124824904920924124824904920924124824904918249baa001304c002400c8250dd718249825000991acc004c08400a2653001001a5eb82006800888966002607a00312323304d374e0026609a6ea40092f5c065300100180252f5c080088896600200510018cc00400e60a20053304f3050002001400c8272246530010059982698270008024c05000e6eb8c138c13c0050051802800a08e8b2088375c60926094006530012232598009800a40211598009800a4001148002266e39220108010204081020408000002411d1598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f411c8238dc4000c888c8cc130c00cdd698268009982618269827000a5eb80c00c006660906ea0cdc7000a4000660906ea4cc040c03cdc6800800a5eb8122232329800919802919198281ba833794940dd718288009982818289829000a5eb816600260386e3400626609e6ea4c064004cc13cdd49980d980d1b8d0010014bd7045904b1191801acc004c108006298103d87a80008981e198281ba80014bd70209830030019bad304e003911191acc006600260866eb4c14800694294504d44cc02000c8c014c0f8cc148dd4000a5eb822601e600898103d87a800041346eb8c148c14c004cc140dd419b8e00148000cc140dd49980c180b9b8d0010014bd7024446b30013042002898019181e99828800a5eb822b3001304700289801919ba548008cc1440052f5c1159800981c00144c00c8cdd2a4008660a200297ae08acc004c03400a26600e464660a46ea0cde5250375c60a6002660a460a660a800297ae059800981c1b8d0018998289ba930230013305137526605260506e340040052f5c1164134466e95200633051375000297ae08acc004c03000a26600e464660a46ea0cde5250375c60a6002660a460a660a800297ae059800981c1b8d0018998289ba930230013305137526605260506e340040052f5c1164134466e952008330513750b3001337100029040400244006266e04004c0192020413497ae08acc004cdc3a40140051300323374a900519828800a5eb822b30013370e900600144cc0048cdd2a4018660a200297ae0232330523750600c6eb4c14c004cc148c14cc1500052f5c064660a46ea0cde5250375c60a6002660a460a660a800297ae059800980f1b8d0018998289ba9301b0013305137526603a60386e340040052f5c116413515980099b874803800a266002466e95200e330510014bd70119198291ba833794940dd71829800998291829982a000a5eb8166002603c6e340062660a26ea4c06c004cc144dd49980e980e1b8d0010014bd7045904d456600266e1d2010002899800919ba548040cc1440052f5c0464660a46ea0cde5250375c60a6002660a460a660a800297ae059800980f1b8d0018998289ba9301b0013305137526603a60386e340040052f5c116413515980099b874804800a246464660a666e9520123305330540014bd7019829982a182a800a5eb80c004008cc0208c8cc14cdd419bca4a06eb8c150004cc14cc150c1540052f5c0b30013039371a00313305237526048002660a46ea4cc0a8c0a4dc6800800a5eb822c8270966002608800314c103d87980008acc004c124006298103d87a80008acc004c0e8006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b209c4138827104e209c8acc004cdc3a40280051300323374a900a19828800a5eb822b30013370e900b00144c00c8cdd2a402c660a200297ae08acc004cdc3a403000513300123374a900c19828800a5eb808c8cc148dd419bca4a06eb8c14c004cc148c14cc1500052f5c0b3001301e371a00313305137526036002660a26ea4cc074c070dc6800800a5eb822c826a2c826104c20984130826104c20984130826104c209841308260dd718289829003096600266e2000520808080808080808080028800c4cdc0800980124100028248c00c00c6eb4c11c004c8cc118dd419b8e00148000cc118dd49980718069b8d0010014bd701bae3046304700420788b2072371890011b80480051640b86eb8c0ccc0d000566002600e6e340062660626ea4c008004cc0c4dd49980298021b8d0010014bd7045902d1bae3020302e37546602c4646b30013371e6eb8c0cc00522104b9011a82008919191919191919911981d98139981d981e0039981d9ba90013303b303c0024bd701981d981e181e80125eb80d660026024003125980099b89002371a00313303a37526601e004002660746ea66002005337026e3400400a002b8c25eb822c81b22c81a8dd7181d181d8011bae303a004375a607200264660706ea0cde5250375c6072002660706072607400297ae059800980f1b8d00189981b9ba930090013303737526601e601c6e340040052f5c11640cc6eb8c0dcc0e0004d6600294624b30013371290201b8d00189981b1ba93300b48100004cc0d8dd4cc005204099b80371a002901fc0057184bd704590324590311bae30363037001300100259800a51892cc004cdc4a4100026e340062660686ea4cc0252080010013303437533001482000666e00dc6800a40ff0015c612f5c11640c11640bd1640b86eb8c0ccc0d000566002600e6e340062660626ea4c008004cc0c4dd49980298021b8d0010014bd7045902d1bae303100a300348010c00d2008198010011814800a04c899180118140019bae302600240906eb0c08cc080dd5000c5901e19199119801001000912cc004006298103d87a80008992cc004cdd78021811000c4c044cc094c08c0052f5c113300300330270024084604a0028118dd5981198121812181218121812181218121812181218101baa0183374a90021981099ba548008cc084c03cc07cdd51811180f9baa0014bd7025eb822c80e8c8cc004004dd61808180f9baa0172259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a51407d10018998018019812801203e325980099912cc00400a294226530013259800980c98121baa00189bad3025302837566050604a6ea800629000204630270019baf302730280019bab003488966002003159800980100344cc01400d20008a5040951325980099baf30270014c010140008acc004cc018010dd6981418159bab3028001898019ba6302c0028a5040991598009980300224001130030078a5040988130c0a80050280ca60020033756602a60486ea8c054c090dd5002488cc0a0008cc0a0dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0980066eacc09c00660560069112cc004cdc8a441000038acc004cdc7a44100003899802980c198161ba60024bd70000c4cc015300103d87a800000640a119800803c006446600e0046605c66ec0dd48029ba6004001401c81406052004813a2942294229410281ba633023337606ea401cdd31981199bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002603460406ea8c090c084dd5181218109baa30123021375400313259800980618109baa0018992cc004c05cc088dd5000c4c8c8c8c8cc8966002605a00713259800980f18149baa0018991919194c004dd69818800cdd718188024dd69818801cdd7181880124444b3001303600589980c9bab303500e225980080144cc06c030896600200513024330380144bd7044c8c8cc06cc0dc0084c00cc0f0010dd7181b800981c801206e899191980c981b00109801981d0021bae3034001303700240d51640cc30310013030001302f001302a37540031640a0605800d1640a86eb8c0a8004dd5981500118150009814800981400098119baa0018b2042302530223754003164080602660426ea8c048c084dd5000c5901f4530103d87a8000407c6046002810889660026026603c6ea800a2646464b30013026002899803181280189980300080245902318120009812000980f9baa0028b203a22598009809180e9baa00289919192cc004c09400a26464b300130170018acc004c08cdd5001401a2c81222b3001301c001899192cc004c0a400a0111640986eb4c09c004c08cdd50014566002601a00315980098119baa0028034590244590212042408460426ea8004c09000e2c8110c966002604200315980098051810000c5a26034604000280fa2c8110dd518118009811800980f1baa0028b203824444464b30013010301b37540031301f301c37540031640686601066e08cdc1002001acc004c03cc068dd5002c4cdc080080144cdc0801000a032002180b1baa3001482827004c058dd5180c980b1baa0024c103d87980008b202833001337046eb4c00cc050dd5003a4100fa9001118019980b9ba8001330174c10101004bd70112cc004c024006298103d87a80008acc004cdc4000a40011300333017300333017375066e05200000233017375066e0520000014bd7025eb82260066602e60066602e6ea0008cc05cdd4000a5eb812f5c0809901322c805860126ea800e2c8038601000260066ea802629344d9590011", + "hash": "33d7a804d789ede6ff621dba8d380846ed15379e1615c7435fb3242a" }, { "title": "liquidate.liquidate.else", @@ -90,15 +90,15 @@ } } ], - "compiledCode": "59179c010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a460226024602400323011301200191808980918091809000cdd2a4000911111919912cc004c024c050dd500144cdd7999119912cc004cdc4001000c5300103d87980008acc004cdc40008014530103d87b80008a6103d87a8000405c80b8cdc11bad301a002375a6034603600266e08dd6980d0009bad301a301b002301537546644600c660326ea0cdc11bad301a002375a6034002660326ea0cdc11bad301a301b002375a6034603600297ae030153754664466446010660366ea0cdc019b82375a603800800266e08dd6980e0018011980d9ba83370400400297ae0375a603460360046eb4c068c06c004c054dd518009bad300730153754010602a6eaa6002600c602a6ea80226eb4c014c054dd50044dd6980c180c980c980c980c980a9baa0089bad301898009b87480126e25200491192cc004cdc7a4500375c603660380031301b0018b202c3002001911919800800801911980180098010014dd7180c180a9baa01c9bad3006301537540389111111919192cc004c088006264b30013013301e37540031323259800980a98101baa0018992cc004c058c084dd5000c4c966002602e60446ea800626604a604c60466ea8008cc094c098c08cdd5000a5eb822c8108c094c098c098c098c098c098c088dd5001c59020181218109baa0018b203e3011302037540026044603e6ea80062c80e8c8cc004004dd61808980f9baa30220022259800800c530103d87a80008992cc004cdc39bad30243021375400200f13010330230014bd7044cc00c00cc09400901f1811800a0428b203e32598009809180e9baa0018992cc004c04cc078dd5000c4c8cc0200048966002005132330010010042259800800c52f5c113302698009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301623235980099b8f375c60640029110475d3c793008cc004888c8cc00cdd6981b0009bae3036303700130030019b89480426e3120109b804803e600e90082444446600a464660706ea0cde5250375c6072002660706072607400297ae05980098029b8d00189981b9ba930020013303737526600860066e340040052f5c11640cc46644660104660746ea0cdc7000a4000660746ea4cc00cc008dc6800800a5eb808cc0248cc0ecdd419b8e00148000cc0ecdd49980218019b8d0010014bd701119191981f18159981f1ba80083303e375000a6607c607e00297ae03303e303f30400014bd7018008012cc004c05800a2653001001a5eb820068008889660026062003123233041374e002660826ea40092f5c065300100180252f5c080088896600200510018cc00400e608a005330433044002001400c8212246530010059982098210008024c02400e6eb8c108c10c0050054c004c8cc104dd419bca4a06eb8c108004cc104c108c10c0052f5c0b30013017371a00313304037526024002660806ea4cc054c050dc6800800a5eb822c81e24466084004660846ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c12400a606a6609060920106609098103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a8000330484c103d87a80004bd70200222259800801440063300100398260014c8c966002607c003132303a3304d304e0013304d303a3304d304e304b375400697ae0304f304f001304a37540071598009821800c4c8c8c0eccc138c13c008cc138c13c004cc138c0eccc138c13cc130dd500225eb80c140c140004c13c004c128dd5001c566002606a0031323232303c3304f30500033304f30500023304f30500013304f303c3304f3050304d375400a97ae0305130510013050001304f001304a37540071598009805000c4c8c8c8c8c0f4cc140c144010cc140c14400ccc140c144008cc140c144004cc140c0f4cc140c144c138dd500325eb80c148c148004c144004c140004c13c004c128dd5001c566002601200313232323232303e33051305200533051305200433051305200333051305200233051305200133051303e330513052304f375400e97ae030533053001305200130510013050001304f001304a375400715980099b87480280062646464646464607e660a460a600c660a460a600a660a460a6008660a460a6006660a460a6004660a460a6002660a4607e660a460a660a06ea80212f5c060a860a800260a600260a400260a200260a0002609e00260946ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c100cc14cc15001ccc14cc150018cc14cc150014cc14cc150010cc14cc15000ccc14cc150008cc14cc150004cc14cc100cc14cc150c144dd5004a5eb80c154c154004c150004c14c004c148004c144004c140004c13c004c128dd5001c56600266e1d200e0018991919191919191918209982a182a8041982a182a8039982a182a8031982a182a8029982a182a8021982a182a8019982a182a8011982a182a8009982a18209982a182a98291baa00a4bd70182b182b000982a800982a0009829800982900098288009828000982780098251baa0038acc004cdc3a4020003132323232323232323230423305530560093305530560083305530560073305530560063305530560053305530560043305530560033305530560023305530560013305530423305530563053375401697ae0305730570013056001305500130540013053001305200130510013050001304f001304a375400715980099b87480480062646464646464646464646086660ac60ae014660ac60ae012660ac60ae010660ac60ae00e660ac60ae00c660ac60ae00a660ac60ae008660ac60ae006660ac60ae004660ac60ae002660ac6086660ac60ae60a86ea80312f5c060b060b000260ae00260ac00260aa00260a800260a600260a400260a200260a0002609e00260946ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c110cc15cc16002ccc15cc160028cc15cc160024cc15cc160020cc15cc16001ccc15cc160018cc15cc160014cc15cc160010cc15cc16000ccc15cc160008cc15cc160004cc15cc110cc15cc160c154dd5006a5eb80c164c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c128dd5001c56600266e1d2016001899191919191919191919191918229982c182c8061982c182c8059982c182c8051982c182c8049982c182c8041982c182c8039982c182c8031982c182c8029982c182c8021982c182c8019982c182c8011982c182c8009982c18229982c182c982b1baa00e4bd70182d182d000982c800982c000982b800982b000982a800982a0009829800982900098288009828000982780098251baa003899191919191919191919191918229982c182c8061982c182c8059982c182c8051982c182c8049982c182c8041982c182c8039982c182c8031982c182c8029982c182c8021982c182c8019982c182c8011982c182c8009982c182c982d0009982c18229982c182c982b1baa00e4bd7025eb80c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c128dd5001a0904120824104820904120824104820904120824104818241baa001304b002400c8248dd718241824800991acc004c08400a2653001001a5eb82006800888966002607800312323304c374e002660986ea40092f5c065300100180252f5c080088896600200510018cc00400e60a00053304e304f002001400c826a246530010059982618268008024c05000e6eb8c134c1380050051802800a08c8b2086375c60906092006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241191598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41188230dc4000c888c8cc12cc00cdd698260009982598261826800a5eb80c00c0066608e6ea0cdc7000a40006608e6ea4cc040c03cdc6800800a5eb8122232329800919802919198279ba833794940dd718280009982798281828800a5eb816600260386e3400626609c6ea4c064004cc138dd49980d980d1b8d0010014bd7045904a1191801acc004c104006298103d87a80008981e198279ba80014bd70209630030019bad304d003911191acc006600260846eb4c14400694294504c44cc02000c8c014c0f8cc144dd4000a5eb822601e600898103d87a800041306eb8c144c148004cc13cdd419b8e00148000cc13cdd49980c180b9b8d0010014bd7024446b30013041002898019181e99828000a5eb822b3001304600289801919ba548008cc1400052f5c1159800981c00144c00c8cdd2a4008660a000297ae08acc004c03400a26600e464660a26ea0cde5250375c60a4002660a260a460a600297ae059800981c1b8d0018998281ba930230013305037526605260506e340040052f5c1164130466e95200633050375000297ae08acc004c03000a26600e464660a26ea0cde5250375c60a4002660a260a460a600297ae059800981c1b8d0018998281ba930230013305037526605260506e340040052f5c1164130466e952008330503750b3001337100029040400244006266e04004c0192020413097ae08acc004cdc3a40140051300323374a900519828000a5eb822b30013370e900600144cc0048cdd2a4018660a000297ae0232330513750600c6eb4c148004cc144c148c14c0052f5c064660a26ea0cde5250375c60a4002660a260a460a600297ae059800980f1b8d0018998281ba9301b0013305037526603a60386e340040052f5c116413115980099b874803800a266002466e95200e330500014bd70119198289ba833794940dd718290009982898291829800a5eb8166002603c6e340062660a06ea4c06c004cc140dd49980e980e1b8d0010014bd7045904c456600266e1d2010002899800919ba548040cc1400052f5c0464660a26ea0cde5250375c60a4002660a260a460a600297ae059800980f1b8d0018998281ba9301b0013305037526603a60386e340040052f5c116413115980099b874804800a246464660a466e9520123305230530014bd70198291829982a000a5eb80c004008cc0208c8cc148dd419bca4a06eb8c14c004cc148c14cc1500052f5c0b30013039371a00313305137526048002660a26ea4cc0a8c0a4dc6800800a5eb822c8268966002608600314c103d87980008acc004c120006298103d87a80008acc004c0e8006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b209a4134826904d209a8acc004cdc3a40280051300323374a900a19828000a5eb822b30013370e900b00144c00c8cdd2a402c660a000297ae08acc004cdc3a403000513300123374a900c19828000a5eb808c8cc144dd419bca4a06eb8c148004cc144c148c14c0052f5c0b3001301e371a00313305037526036002660a06ea4cc074c070dc6800800a5eb822c82622c825904b2096412c825904b2096412c825904b2096412c8258dd718281828803096600266e2000520808080808080808080028800c4cdc0800980124100028240c00c00c6eb4c118004c8cc114dd419b8e00148000cc114dd49980718069b8d0010014bd701bae3045304600420768b2070371890011b80480051640b46eb8c0c8c0cc00566002600e6e340062660606ea4c008004cc0c0dd49980298021b8d0010014bd7045902c1bae301f302d37546602c4646b30013371e6eb8c0c800522104b9011a82008919191919191919911981d18139981d181d8039981d1ba90013303a303b0024bd701981d181d981e00125eb80d660026024003125980099b89002371a00313303937526601e004002660726ea66002005337026e3400400a002b8c25eb822c81aa2c81a0dd7181c981d0011bae3039004375a6070002646606e6ea0cde5250375c60700026606e6070607200297ae059800980f1b8d00189981b1ba930090013303637526601e601c6e340040052f5c11640c86eb8c0d8c0dc004d6600294624b30013371290201b8d00189981a9ba93300b48100004cc0d4dd4cc005204099b80371a002901fc0057184bd704590314590301bae30353036001300100259800a51892cc004cdc4a4100026e340062660666ea4cc0252080010013303337533001482000666e00dc6800a40ff0015c612f5c11640bd1640b91640b46eb8c0c8c0cc00566002600e6e340062660606ea4c008004cc0c0dd49980298021b8d0010014bd7045902c1bae303000a300348010c00d2008198010011814000a04a899180118138019bae3025002408c6eb0c088c07cdd5000c5901d19199119801001000912cc004006298103d87a80008992cc004cdd78021810800c4c044cc090c0880052f5c11330030033026002408060480028110dd59811181198119811981198119811981198119811980f9baa0173374a90021981019ba548008cc080c038c078dd51810980f1baa0014bd7025eb822c80e0c8cc004004dd61807980f1baa0162259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a51407910018998018019812001203c325980099912cc00400a294226530013259800980c18119baa00189bad302430273756604e60486ea800629000204430260019baf302630270019bab003488966002003159800980100344cc01400d20008a5040911325980099baf30260014c010140008acc004cc018010dd6981398151bab3027001898019ba6302b0028a5040951598009980300224001130030078a5040948128c0a40050270ca60020033756602860466ea8c050c08cdd5002488cc09c008cc09cdd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0940066eacc09800660540069112cc004cdc8a441000038acc004cdc7a44100003899802980c198159ba60024bd70000c4cc015300103d87a8000006409d19800803c006446600e0046605a66ec0dd48029ba6004001401c8138605000481322942294229410271ba633022337606ea401cdd31981119bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c5660026032603e6ea8c08cc080dd5181198101baa30113020375400313259800980618101baa0018992cc004c058c084dd5000c4c8c8c8c8cc8966002605800713259800980e98141baa0018991919194c004dd69818000cdd718180024dd69818001cdd7181800124444b3001303500589980c9bab303400e225980080144cc06c030896600200513024330370144bd7044c8c8cc06cc0d80084c00cc0ec010dd7181b000981c001206c899191980c981a80109801981c8021bae3033001303600240d11640c83030001302f001302e0013029375400316409c605600d1640a46eb8c0a4004dd5981480118148009814000981380098111baa0018b204030243021375400316407c602460406ea8c044c080dd5000c5901e4530103d87a800040786044002810089660026024603a6ea800a2646464b30013025002899803181200189980300080245902218118009811800980f1baa0028b203822598009808980e1baa00289919192cc004c09000a26464b300130160018acc004c088dd5001401a2c811a2b3001301b001899192cc004c0a000a0111640946eb4c098004c088dd50014566002601a00315980098111baa0028034590234590202040408060406ea8004c08c00e2c8108c96600260400031598009805180f800c5a26032603e00280f22c8108dd518110009811000980e9baa0028b20362444464b3001300e301937540031301d301a37540031640606600e66e0800d66002601a60306ea8012266e0400400a266e040080050170010c054dd51800a41413802602a6ea8c060c054dd5001260103d87980008b202633001337046eb4c014c04cdd500324100fa9001118019980b1ba8001330164c10101004bd70112cc004c020006298103d87a80008acc004cdc4000a40011300333016300333016375066e05200000233016375066e0520000014bd7025eb82260066602c60066602c6ea0008cc058dd4000a5eb812f5c0809101222c805860126ea800e2c8038601000260066ea802629344d9590011", - "hash": "715413ffebf875023cc8c1e9eb7af1d49b808139940295a4d56acf5a" + "compiledCode": "5917ae010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a460226024602400323011301200191808980918091809000c8c044c048c048c048c0480066e9520004888888c8cc89660026014602a6ea800a266ebccc88cc896600266e20008006298103d87980008acc004cdc40008014530103d87b80008a6103d87a8000406080c0cdc11bad301b002375a6036603800266e08dd6980d8009bad301b301c002301637546644600c660346ea0cdc11bad301b002375a6036002660346ea0cdc11bad301b301c002375a6036603800297ae030163754664466446010660386ea0cdc019b82375a603a00800266e08dd6980e8018011980e1ba83370400400297ae0375a603660380046eb4c06cc070004c058dd518009bad300530163754012602c6eaa6002600e602c6ea80266eb4c014c058dd5004cdd69804180b1baa0099bad300630163754013375a60333001370e90024dc4a400922325980099b8f488100375c6038603a0031301c0018b202e3002001911919800800801911980180098010014dd7180c980b1baa01d9bad30073016375403a9111111919192cc004c08c006264b30013014301f37540031323259800980b18109baa0018992cc004c05cc088dd5000c4c966002603060466ea800626604c604e60486ea8008cc098c09cc090dd5000a5eb822c8110c098c09cc09cc09cc09cc09cc08cdd5001c59021181298111baa0018b2040301230213754002604660406ea80062c80f0c8cc004004dd6180918101baa30230022259800800c530103d87a80008992cc004cdc39bad30253022375400200f13010330240014bd7044cc00c00cc0980090201812000a0448b204032598009809980f1baa0018992cc004c050c07cdd5000c4c8cc0200048966002005132330010010042259800800c52f5c113302798009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301623235980099b8f375c60660029110475d3c793008cc004888c8cc00cdd6981b8009bae3037303800130030019b89480426e3120109b804803e600e90082444446600a464660726ea0cde5250375c6074002660726074607600297ae05980098029b8d00189981c1ba930020013303837526600860066e340040052f5c11640d046644660104660766ea0cdc7000a4000660766ea4cc00cc008dc6800800a5eb808cc0248cc0f0dd419b8e00148000cc0f0dd49980218019b8d0010014bd701119191981f98159981f9ba80083303f375000a6607e608000297ae03303f304030410014bd7018008012cc004c05800a2653001001a5eb820068008889660026064003123233042374e002660846ea40092f5c065300100180252f5c080088896600200510018cc00400e608c005330443045002001400c821a246530010059982118218008024c02400e6eb8c10cc1100050054c004c8cc108dd419bca4a06eb8c10c004cc108c10cc1100052f5c0b30013017371a00313304137526024002660826ea4cc054c050dc6800800a5eb822c81ea4466086004660866ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c12800a606a6609260940106609298103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a80004bd70200222259800801440063300100398268014c8c966002607e003132303a3304e304f0013304e303a3304e304f304c375400697ae030503050001304b37540071598009822000c4c8c8c0eccc13cc140008cc13cc140004cc13cc0eccc13cc140c134dd500225eb80c144c144004c140004c12cdd5001c566002606a0031323232303c33050305100333050305100233050305100133050303c330503051304e375400a97ae03052305200130510013050001304b37540071598009805000c4c8c8c8c8c0f4cc144c148010cc144c14800ccc144c148008cc144c148004cc144c0f4cc144c148c13cdd500325eb80c14cc14c004c148004c144004c140004c12cdd5001c566002601200313232323232303e33052305300533052305300433052305300333052305300233052305300133052303e3305230533050375400e97ae0305430540013053001305200130510013050001304b375400715980099b87480280062646464646464607e660a660a800c660a660a800a660a660a8008660a660a8006660a660a8004660a660a8002660a6607e660a660a860a26ea80212f5c060aa60aa00260a800260a600260a400260a200260a000260966ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c100cc150c15401ccc150c154018cc150c154014cc150c154010cc150c15400ccc150c154008cc150c154004cc150c100cc150c154c148dd5004a5eb80c158c158004c154004c150004c14c004c148004c144004c140004c12cdd5001c56600266e1d200e0018991919191919191918209982a982b0041982a982b0039982a982b0031982a982b0029982a982b0021982a982b0019982a982b0011982a982b0009982a98209982a982b18299baa00a4bd70182b982b800982b000982a800982a000982980098290009828800982800098259baa0038acc004cdc3a4020003132323232323232323230423305630570093305630570083305630570073305630570063305630570053305630570043305630570033305630570023305630570013305630423305630573054375401697ae03058305800130570013056001305500130540013053001305200130510013050001304b375400715980099b87480480062646464646464646464646086660ae60b0014660ae60b0012660ae60b0010660ae60b000e660ae60b000c660ae60b000a660ae60b0008660ae60b0006660ae60b0004660ae60b0002660ae6086660ae60b060aa6ea80312f5c060b260b200260b000260ae00260ac00260aa00260a800260a600260a400260a200260a000260966ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c110cc160c16402ccc160c164028cc160c164024cc160c164020cc160c16401ccc160c164018cc160c164014cc160c164010cc160c16400ccc160c164008cc160c164004cc160c110cc160c164c158dd5006a5eb80c168c168004c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c12cdd5001c56600266e1d2016001899191919191919191919191918229982c982d0061982c982d0059982c982d0051982c982d0049982c982d0041982c982d0039982c982d0031982c982d0029982c982d0021982c982d0019982c982d0011982c982d0009982c98229982c982d182b9baa00e4bd70182d982d800982d000982c800982c000982b800982b000982a800982a000982980098290009828800982800098259baa003899191919191919191919191918229982c982d0061982c982d0059982c982d0051982c982d0049982c982d0041982c982d0039982c982d0031982c982d0029982c982d0021982c982d0019982c982d0011982c982d0009982c982d182d8009982c98229982c982d182b9baa00e4bd7025eb80c168004c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c12cdd5001a0924124824904920924124824904920924124824904918249baa001304c002400c8250dd718249825000991acc004c08400a2653001001a5eb82006800888966002607a00312323304d374e0026609a6ea40092f5c065300100180252f5c080088896600200510018cc00400e60a20053304f3050002001400c8272246530010059982698270008024c05000e6eb8c138c13c0050051802800a08e8b2088375c60926094006530012232598009800a40211598009800a4001148002266e39220108010204081020408000002411d1598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f411c8238dc4000c888c8cc130c00cdd698268009982618269827000a5eb80c00c006660906ea0cdc7000a4000660906ea4cc040c03cdc6800800a5eb8122232329800919802919198281ba833794940dd718288009982818289829000a5eb816600260386e3400626609e6ea4c064004cc13cdd49980d980d1b8d0010014bd7045904b1191801acc004c108006298103d87a80008981e198281ba80014bd70209830030019bad304e003911191acc006600260866eb4c14800694294504d44cc02000c8c014c0f8cc148dd4000a5eb822601e600898103d87a800041346eb8c148c14c004cc140dd419b8e00148000cc140dd49980c180b9b8d0010014bd7024446b30013042002898019181e99828800a5eb822b3001304700289801919ba548008cc1440052f5c1159800981c00144c00c8cdd2a4008660a200297ae08acc004c03400a26600e464660a46ea0cde5250375c60a6002660a460a660a800297ae059800981c1b8d0018998289ba930230013305137526605260506e340040052f5c1164134466e95200633051375000297ae08acc004c03000a26600e464660a46ea0cde5250375c60a6002660a460a660a800297ae059800981c1b8d0018998289ba930230013305137526605260506e340040052f5c1164134466e952008330513750b3001337100029040400244006266e04004c0192020413497ae08acc004cdc3a40140051300323374a900519828800a5eb822b30013370e900600144cc0048cdd2a4018660a200297ae0232330523750600c6eb4c14c004cc148c14cc1500052f5c064660a46ea0cde5250375c60a6002660a460a660a800297ae059800980f1b8d0018998289ba9301b0013305137526603a60386e340040052f5c116413515980099b874803800a266002466e95200e330510014bd70119198291ba833794940dd71829800998291829982a000a5eb8166002603c6e340062660a26ea4c06c004cc144dd49980e980e1b8d0010014bd7045904d456600266e1d2010002899800919ba548040cc1440052f5c0464660a46ea0cde5250375c60a6002660a460a660a800297ae059800980f1b8d0018998289ba9301b0013305137526603a60386e340040052f5c116413515980099b874804800a246464660a666e9520123305330540014bd7019829982a182a800a5eb80c004008cc0208c8cc14cdd419bca4a06eb8c150004cc14cc150c1540052f5c0b30013039371a00313305237526048002660a46ea4cc0a8c0a4dc6800800a5eb822c8270966002608800314c103d87980008acc004c124006298103d87a80008acc004c0e8006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b209c4138827104e209c8acc004cdc3a40280051300323374a900a19828800a5eb822b30013370e900b00144c00c8cdd2a402c660a200297ae08acc004cdc3a403000513300123374a900c19828800a5eb808c8cc148dd419bca4a06eb8c14c004cc148c14cc1500052f5c0b3001301e371a00313305137526036002660a26ea4cc074c070dc6800800a5eb822c826a2c826104c20984130826104c20984130826104c209841308260dd718289829003096600266e2000520808080808080808080028800c4cdc0800980124100028248c00c00c6eb4c11c004c8cc118dd419b8e00148000cc118dd49980718069b8d0010014bd701bae3046304700420788b2072371890011b80480051640b86eb8c0ccc0d000566002600e6e340062660626ea4c008004cc0c4dd49980298021b8d0010014bd7045902d1bae3020302e37546602c4646b30013371e6eb8c0cc00522104b9011a82008919191919191919911981d98139981d981e0039981d9ba90013303b303c0024bd701981d981e181e80125eb80d660026024003125980099b89002371a00313303a37526601e004002660746ea66002005337026e3400400a002b8c25eb822c81b22c81a8dd7181d181d8011bae303a004375a607200264660706ea0cde5250375c6072002660706072607400297ae059800980f1b8d00189981b9ba930090013303737526601e601c6e340040052f5c11640cc6eb8c0dcc0e0004d6600294624b30013371290201b8d00189981b1ba93300b48100004cc0d8dd4cc005204099b80371a002901fc0057184bd704590324590311bae30363037001300100259800a51892cc004cdc4a4100026e340062660686ea4cc0252080010013303437533001482000666e00dc6800a40ff0015c612f5c11640c11640bd1640b86eb8c0ccc0d000566002600e6e340062660626ea4c008004cc0c4dd49980298021b8d0010014bd7045902d1bae303100a300348010c00d2008198010011814800a04c899180118140019bae302600240906eb0c08cc080dd5000c5901e19199119801001000912cc004006298103d87a80008992cc004cdd78021811000c4c044cc094c08c0052f5c113300300330270024084604a0028118dd5981198121812181218121812181218121812181218101baa0183374a90021981099ba548008cc084c03cc07cdd51811180f9baa0014bd7025eb822c80e8c8cc004004dd61808180f9baa0172259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a51407d10018998018019812801203e325980099912cc00400a294226530013259800980c98121baa00189bad3025302837566050604a6ea800629000204630270019baf302730280019bab003488966002003159800980100344cc01400d20008a5040951325980099baf30270014c010140008acc004cc018010dd6981418159bab3028001898019ba6302c0028a5040991598009980300224001130030078a5040988130c0a80050280ca60020033756602a60486ea8c054c090dd5002488cc0a0008cc0a0dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0980066eacc09c00660560069112cc004cdc8a441000038acc004cdc7a44100003899802980c198161ba60024bd70000c4cc015300103d87a800000640a119800803c006446600e0046605c66ec0dd48029ba6004001401c81406052004813a2942294229410281ba633023337606ea401cdd31981199bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002603460406ea8c090c084dd5181218109baa30123021375400313259800980618109baa0018992cc004c05cc088dd5000c4c8c8c8c8cc8966002605a00713259800980f18149baa0018991919194c004dd69818800cdd718188024dd69818801cdd7181880124444b3001303600589980c9bab303500e225980080144cc06c030896600200513024330380144bd7044c8c8cc06cc0dc0084c00cc0f0010dd7181b800981c801206e899191980c981b00109801981d0021bae3034001303700240d51640cc30310013030001302f001302a37540031640a0605800d1640a86eb8c0a8004dd5981500118150009814800981400098119baa0018b2042302530223754003164080602660426ea8c048c084dd5000c5901f4530103d87a8000407c6046002810889660026026603c6ea800a2646464b30013026002899803181280189980300080245902318120009812000980f9baa0028b203a22598009809180e9baa00289919192cc004c09400a26464b300130170018acc004c08cdd5001401a2c81222b3001301c001899192cc004c0a400a0111640986eb4c09c004c08cdd50014566002601a00315980098119baa0028034590244590212042408460426ea8004c09000e2c8110c966002604200315980098051810000c5a26034604000280fa2c8110dd518118009811800980f1baa0028b203824444464b30013010301b37540031301f301c37540031640686601066e08cdc1002001acc004c03cc068dd5002c4cdc080080144cdc0801000a032002180b1baa3001482827004c058dd5180c980b1baa0024c103d87980008b202833001337046eb4c00cc050dd5003a4100fa9001118019980b9ba8001330174c10101004bd70112cc004c024006298103d87a80008acc004cdc4000a40011300333017300333017375066e05200000233017375066e0520000014bd7025eb82260066602e60066602e6ea0008cc05cdd4000a5eb812f5c0809901322c805860126ea800e2c8038601000260066ea802629344d9590011", + "hash": "33d7a804d789ede6ff621dba8d380846ed15379e1615c7435fb3242a" }, { "title": "open_position.open_position.spend", "datum": { "title": "datum", "schema": { - "$ref": "#/definitions/lazer_perps~1types~1Position" + "$ref": "#/definitions/lazer_perps~1types~1PositionDatum" } }, "redeemer": { @@ -115,8 +115,8 @@ } } ], - "compiledCode": "591648010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a46022602460240032301130123012301200148896600266e1cdd69809cc0048c050c0540066e1d20049b89480124464b30013371e91100375c602c602e003130160018b20223002001911919800800801911980180098010014dd7180998081baa0179ba54800122222223232332259800980f80144c966002602060366ea800626464b30013012301d3754003132598009809980f1baa0018992cc004c050c07cdd5000c4cc088c08cc080dd500119811181198101baa0014bd7045901e181118119811981198119811980f9baa0038b203a3021301e3754003164070601a603a6ea8004c07cc070dd5000c5901a19198008009bac300e301c3754603e00644b30010018a6103d87a80008992cc004cdc39bad3021301e375400200913008330200014bd7044cc00c00cc08800901c1810000a03c8b203832598009807180c9baa0018992cc004c03cc068dd5000c4c8cc0200048966002005132330010010042259800800c52f5c113302298009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301623235980099b8f375c605c0029110475d3c793008cc004888c8cc00cdd698190009bae3032303300130030019b89480426e3120109b804803e600e90082444446600a464660686ea0cde5250375c606a00266068606a606c00297ae05980098029b8d0018998199ba930020013303337526600860066e340040052f5c11640bc466446601046606c6ea0cdc7000a40006606c6ea4cc00cc008dc6800800a5eb808cc0248cc0dcdd419b8e00148000cc0dcdd49980218019b8d0010014bd701119191981d18111981d1ba80083303a375000a66074607600297ae03303a303b303c0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605a00312323303d374e0026607a6ea40092f5c065300100180252f5c080088896600200510018cc00400e60820053303f3040002001400c81f2246530010059981e981f0008024c02400e6eb8c0f8c0fc0050054c004c8cc0f4dd419bca4a06eb8c0f8004cc0f4c0f8c0fc0052f5c0b30013017371a00313303c37526024002660786ea4cc054c050dc6800800a5eb822c81c2446607c0046607c6ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11400a605866088608a0106608898103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a80004bd70200222259800801440063300100398240014c8c9660026074003132303133049304a00133049303133049304a3047375400697ae0304b304b00130463754007159800981f800c4c8c8c0c8cc128c12c008cc128c12c004cc128c0c8cc128c12cc120dd500225eb80c130c130004c12c004c118dd5001c566002606a003132323230333304b304c0033304b304c0023304b304c0013304b30333304b304c3049375400a97ae0304d304d001304c001304b001304637540071598009805000c4c8c8c8c8c0d0cc130c134010cc130c13400ccc130c134008cc130c134004cc130c0d0cc130c134c128dd500325eb80c138c138004c134004c130004c12c004c118dd5001c56600260120031323232323230353304d304e0053304d304e0043304d304e0033304d304e0023304d304e0013304d30353304d304e304b375400e97ae0304f304f001304e001304d001304c001304b0013046375400715980099b87480280062646464646464606c6609c609e00c6609c609e00a6609c609e0086609c609e0066609c609e0046609c609e0026609c606c6609c609e60986ea80212f5c060a060a0002609e002609c002609a00260980026096002608c6ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc13cc14001ccc13cc140018cc13cc140014cc13cc140010cc13cc14000ccc13cc140008cc13cc140004cc13cc0dccc13cc140c134dd5004a5eb80c144c144004c140004c13c004c138004c134004c130004c12c004c118dd5001c56600266e1d200e00189919191919191919181c19828182880419828182880399828182880319828182880299828182880219828182880199828182880119828182880099828181c19828182898271baa00a4bd7018291829000982880098280009827800982700098268009826000982580098231baa0038acc004cdc3a402000313232323232323232323039330513052009330513052008330513052007330513052006330513052005330513052004330513052003330513052002330513052001330513039330513052304f375401697ae030533053001305200130510013050001304f001304e001304d001304c001304b0013046375400715980099b87480480062646464646464646464646074660a460a6014660a460a6012660a460a6010660a460a600e660a460a600c660a460a600a660a460a6008660a460a6006660a460a6004660a460a6002660a46074660a460a660a06ea80312f5c060a860a800260a600260a400260a200260a0002609e002609c002609a00260980026096002608c6ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc14cc15002ccc14cc150028cc14cc150024cc14cc150020cc14cc15001ccc14cc150018cc14cc150014cc14cc150010cc14cc15000ccc14cc150008cc14cc150004cc14cc0eccc14cc150c144dd5006a5eb80c154c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c118dd5001c56600266e1d20160018991919191919191919191919181e1982a182a8061982a182a8059982a182a8051982a182a8049982a182a8041982a182a8039982a182a8031982a182a8029982a182a8021982a182a8019982a182a8011982a182a8009982a181e1982a182a98291baa00e4bd70182b182b000982a800982a00098298009829000982880098280009827800982700098268009826000982580098231baa0038991919191919191919191919181e1982a182a8061982a182a8059982a182a8051982a182a8049982a182a8041982a182a8039982a182a8031982a182a8029982a182a8021982a182a8019982a182a8011982a182a8009982a182a982b0009982a181e1982a182a98291baa00e4bd7025eb80c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c118dd5001a0884110822104420884110822104420884110822104418221baa0013047002400c8228dd718221822800991acc004c08400a2653001001a5eb820068008889660026070003123233048374e002660906ea40092f5c065300100180252f5c080088896600200510018cc00400e60980053304a304b002001400c824a246530010059982418248008024c05000e6eb8c124c1280050051802800a0848b207e375c6088608a006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241091598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41088210dc4000c888c8cc11cc00cdd698240009982398241824800a5eb80c00c006660866ea0cdc7000a4000660866ea4cc040c03cdc6800800a5eb8122232329800919802919198259ba833794940dd718260009982598261826800a5eb816600260386e340062660946ea4c064004cc128dd49980d980d1b8d0010014bd704590461191801acc004c0f4006298103d87a800089819998259ba80014bd70208e30030019bad3049003911191acc0066002607c6eb4c13400694294504844cc02000c8c014c0d4cc134dd4000a5eb822601e600898103d87a800041206eb8c134c138004cc12cdd419b8e00148000cc12cdd49980c180b9b8d0010014bd7024446b3001303d002898019181a19826000a5eb822b3001304200289801919ba548008cc1300052f5c1159800981c00144c00c8cdd2a40086609800297ae08acc004c03400a26600e4646609a6ea0cde5250375c609c0026609a609c609e00297ae059800981c1b8d0018998261ba930230013304c37526605260506e340040052f5c1164120466e9520063304c375000297ae08acc004c03000a26600e4646609a6ea0cde5250375c609c0026609a609c609e00297ae059800981c1b8d0018998261ba930230013304c37526605260506e340040052f5c1164120466e9520083304c3750b3001337100029040400244006266e04004c0192020412097ae08acc004cdc3a40140051300323374a900519826000a5eb822b30013370e900600144cc0048cdd2a40186609800297ae02323304d3750600c6eb4c138004cc134c138c13c0052f5c0646609a6ea0cde5250375c609c0026609a609c609e00297ae059800980f1b8d0018998261ba9301b0013304c37526603a60386e340040052f5c116412115980099b874803800a266002466e95200e3304c0014bd70119198269ba833794940dd718270009982698271827800a5eb8166002603c6e340062660986ea4c06c004cc130dd49980e980e1b8d0010014bd70459048456600266e1d2010002899800919ba548040cc1300052f5c04646609a6ea0cde5250375c609c0026609a609c609e00297ae059800980f1b8d0018998261ba9301b0013304c37526603a60386e340040052f5c116412115980099b874804800a2464646609c66e9520123304e304f0014bd701982718279828000a5eb80c004008cc0208c8cc138dd419bca4a06eb8c13c004cc138c13cc1400052f5c0b30013039371a00313304d375260480026609a6ea4cc0a8c0a4dc6800800a5eb822c8248966002607e00314c103d87980008acc004c110006298103d87a80008acc004c0e8006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20924124824904920928acc004cdc3a40280051300323374a900a19826000a5eb822b30013370e900b00144c00c8cdd2a402c6609800297ae08acc004cdc3a403000513300123374a900c19826000a5eb808c8cc134dd419bca4a06eb8c138004cc134c138c13c0052f5c0b3001301e371a00313304c37526036002660986ea4cc074c070dc6800800a5eb822c82422c8239047208e411c8239047208e411c8239047208e411c8238dd718261826803096600266e2000520808080808080808080028800c4cdc0800980124100028220c00c00c6eb4c108004c8cc104dd419b8e00148000cc104dd49980718069b8d0010014bd701bae30413042004206e8b2068371890011b80480051640a46eb8c0b8c0bc00566002600e6e340062660586ea4c008004cc0b0dd49980298021b8d0010014bd704590281bae301b302937546602c4646b30013371e6eb8c0b800522104b9011a82008919191919191919911981b180f1981b181b8039981b1ba90013303630370024bd701981b181b981c00125eb80d660026024003125980099b89002371a00313303537526601e0040026606a6ea66002005337026e3400400a002b8c25eb822c818a2c8180dd7181a981b0011bae3035004375a606800264660666ea0cde5250375c6068002660666068606a00297ae059800980f1b8d0018998191ba930090013303237526601e601c6e340040052f5c11640b86eb8c0c8c0cc004d6600294624b30013371290201b8d0018998189ba93300b48100004cc0c4dd4cc005204099b80371a002901fc0057184bd7045902d45902c1bae30313032001300100259800a51892cc004cdc4a4100026e3400626605e6ea4cc0252080010013302f37533001482000666e00dc6800a40ff0015c612f5c11640ad1640a91640a46eb8c0b8c0bc00566002600e6e340062660586ea4c008004cc0b0dd49980298021b8d0010014bd704590281bae302c00a300348010c00d2008198010011812000a042899180118118019bae3021002407c6eb0c078c06cdd5000c5901919199119801001000912cc004006298103d87a80008992cc004cdd7802180e800c4c020cc080c0780052f5c113300300330220024070604000280f0dd5980f180f980f980f980f980f980f980f980f980f980d9baa0133374a90021980e19ba548008cc070c02cc068dd5180e980d1baa0014bd7025eb822c80c0c8cc004004dd61805180d1baa0122259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a514069100189980180198100012034325980099912cc00400a294226530013259800980a180f9baa00189bad302030233756604660406ea800629000203c30220019baf302230230019bab003488966002003159800980100344cc01400d20008a5040811325980099baf30220014c010140008acc004cc018010dd6981198131bab3023001898019ba630270028a5040851598009980300224001130030078a5040848108c0940050230ca60020033756601e603e6ea8c03cc07cdd5002488cc08c008cc08cdd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0840066eacc088006604c0069112cc004cdc8a441000038acc004cdc7a441000038998029807998139ba60024bd70000c4cc015300103d87a8000006408d19800803c006446600e0046605266ec0dd48029ba6004001401c8118604800481122942294229410231ba63301e337606ea401cdd31980f19bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602a60366ea8c07cc070dd5180f980e1baa300c301c3754003132598009806180e1baa0018992cc004c048c074dd5000c4c8c8c8c8cc8966002605000713259800980c98121baa0018991919194c004dd69816000cdd718160024dd69816001cdd7181600124444b3001303100589980c9bab303000e225980080144cc06c03089660020051301b330330144bd7044c8c8cc06cc0c80084c00cc0dc010dd71819000981a0012064899191980c981880109801981a8021bae302f001303200240c11640b8302c001302b001302a0013025375400316408c604e00d1640946eb8c094004dd59812801181280098120009811800980f1baa0018b20383020301d375400316406c601c60386ea8c030c070dd5000c5901a4530103d87a80004068603c00280e0dd69804980c9baa02022598009807180c9baa00289919192cc004c08400a26600c604000626600c002009164078603e002603e00260346ea800a2c80c08966002601a60306ea800a2646464b30013020002899192cc004c0480062b3001301e37540050068b203e8acc004c05c00626464b300130240028044590211bad3022001301e37540051598009806800c566002603c6ea800a00d16407d16407080e101c180e1baa001301f0038b203a3259800980e000c56600260146036003168980a980d800a0348b203a3754603c002603c00260326ea800a2c80b86eb4c04cc050c050c050c050c040dd5001c56600266e24dd6980098081baa003337046eb4c008c040dd50019bad30023010375402f15980099b89375a600260206ea805cdd6980118081baa0038acc004cdc4240006eb4c004c040dd5001c4cdc4240006eb4c008c040dd5001c528201c8a50403914a08072294100e22c805860126ea800e2c8038601000260066ea802629344d95900101", - "hash": "62b7b99b456a860b71ccfd4d4e23bad82afb05a5660d0bfea90ce62b" + "compiledCode": "591644010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a460226024602400323011301200191808980918091809000a4444b30013370e6eb4c050c044dd50021bad30023011375403115980099b87375a60293001370e90024dc4a400922325980099b8f488100375c602e6030003130170018b20243002001911919800800801911980180098010014dd7180a18089baa0189bad300230113754031374a900024444444646464b3001301f0018992cc004c040c06cdd5000c4c8c9660026024603a6ea8006264b30013013301e375400313259800980a180f9baa001899811181198101baa0023302230233020375400297ae08b203c302230233023302330233023301f37540071640746042603c6ea80062c80e0c038c074dd5000980f980e1baa0018b203432330010013758601c60386ea8c07c008896600200314c0103d87a80008992cc004cdc39bad3021301e375400201113007330200014bd7044cc00c00cc08800901c1810000a03c8b203832598009807980d1baa0018992cc004c040c06cdd5000c4c8cc0240048966002005132330010010042259800800c52f5c113302398009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301723235980099b8f375c605e0029110475d3c793008cc004888c8cc00cdd698198009bae3033303400130030019b89480426e3120109b804803e600e90082444446600a4646606a6ea0cde5250375c606c0026606a606c606e00297ae05980098029b8d00189981a1ba930020013303437526600860066e340040052f5c11640c0466446601046606e6ea0cdc7000a40006606e6ea4cc00cc008dc6800800a5eb808cc0248cc0e0dd419b8e00148000cc0e0dd49980218019b8d0010014bd701119191981d98111981d9ba80083303b375000a66076607800297ae03303b303c303d0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605c00312323303e374e0026607c6ea40092f5c065300100180252f5c080088896600200510018cc00400e6084005330403041002001400c81fa246530010059981f181f8008024c02400e6eb8c0fcc1000050054c004c8cc0f8dd419bca4a06eb8c0fc004cc0f8c0fcc1000052f5c0b30013017371a00313303d375260240026607a6ea4cc054c050dc6800800a5eb822c81ca446607e0046607e6ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11800a60586608a608c0106608a98103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a80004bd70200222259800801440063300100398248014c8c966002607600313230313304a304b0013304a30313304a304b3048375400697ae0304c304c001304737540071598009820000c4c8c8c0c8cc12cc130008cc12cc130004cc12cc0c8cc12cc130c124dd500225eb80c134c134004c130004c11cdd5001c566002606c003132323230333304c304d0033304c304d0023304c304d0013304c30333304c304d304a375400a97ae0304e304e001304d001304c001304737540071598009805000c4c8c8c8c8c0d0cc134c138010cc134c13800ccc134c138008cc134c138004cc134c0d0cc134c138c12cdd500325eb80c13cc13c004c138004c134004c130004c11cdd5001c56600260120031323232323230353304e304f0053304e304f0043304e304f0033304e304f0023304e304f0013304e30353304e304f304c375400e97ae030503050001304f001304e001304d001304c0013047375400715980099b87480280062646464646464606c6609e60a000c6609e60a000a6609e60a00086609e60a00066609e60a00046609e60a00026609e606c6609e60a0609a6ea80212f5c060a260a200260a0002609e002609c002609a0026098002608e6ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc140c14401ccc140c144018cc140c144014cc140c144010cc140c14400ccc140c144008cc140c144004cc140c0dccc140c144c138dd5004a5eb80c148c148004c144004c140004c13c004c138004c134004c130004c11cdd5001c56600266e1d200e00189919191919191919181c19828982900419828982900399828982900319828982900299828982900219828982900199828982900119828982900099828981c19828982918279baa00a4bd7018299829800982900098288009828000982780098270009826800982600098239baa0038acc004cdc3a4020003132323232323232323230393305230530093305230530083305230530073305230530063305230530053305230530043305230530033305230530023305230530013305230393305230533050375401697ae0305430540013053001305200130510013050001304f001304e001304d001304c0013047375400715980099b87480480062646464646464646464646074660a660a8014660a660a8012660a660a8010660a660a800e660a660a800c660a660a800a660a660a8008660a660a8006660a660a8004660a660a8002660a66074660a660a860a26ea80312f5c060aa60aa00260a800260a600260a400260a200260a0002609e002609c002609a0026098002608e6ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc150c15402ccc150c154028cc150c154024cc150c154020cc150c15401ccc150c154018cc150c154014cc150c154010cc150c15400ccc150c154008cc150c154004cc150c0eccc150c154c148dd5006a5eb80c158c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c11cdd5001c56600266e1d20160018991919191919191919191919181e1982a982b0061982a982b0059982a982b0051982a982b0049982a982b0041982a982b0039982a982b0031982a982b0029982a982b0021982a982b0019982a982b0011982a982b0009982a981e1982a982b18299baa00e4bd70182b982b800982b000982a800982a0009829800982900098288009828000982780098270009826800982600098239baa0038991919191919191919191919181e1982a982b0061982a982b0059982a982b0051982a982b0049982a982b0041982a982b0039982a982b0031982a982b0029982a982b0021982a982b0019982a982b0011982a982b0009982a982b182b8009982a981e1982a982b18299baa00e4bd7025eb80c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c11cdd5001a08a41148229045208a41148229045208a4114822904518229baa0013048002400c8230dd718229823000991acc004c08400a2653001001a5eb820068008889660026072003123233049374e002660926ea40092f5c065300100180252f5c080088896600200510018cc00400e609a0053304b304c002001400c8252246530010059982498250008024c05000e6eb8c128c12c0050051802800a0868b2080375c608a608c006530012232598009800a40211598009800a4001148002266e39220108010204081020408000002410d1598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f410c8218dc4000c888c8cc120c00cdd698248009982418249825000a5eb80c00c006660886ea0cdc7000a4000660886ea4cc040c03cdc6800800a5eb8122232329800919802919198261ba833794940dd718268009982618269827000a5eb816600260386e340062660966ea4c064004cc12cdd49980d980d1b8d0010014bd704590471191801acc004c0f8006298103d87a800089819998261ba80014bd70209030030019bad304a003911191acc0066002607e6eb4c13800694294504944cc02000c8c014c0d4cc138dd4000a5eb822601e600898103d87a800041246eb8c138c13c004cc130dd419b8e00148000cc130dd49980c180b9b8d0010014bd7024446b3001303e002898019181a19826800a5eb822b3001304300289801919ba548008cc1340052f5c1159800981c80144c00c8cdd2a40086609a00297ae08acc004c03400a26600e4646609c6ea0cde5250375c609e0026609c609e60a000297ae059800981c9b8d0018998269ba930230013304d37526605260506e340040052f5c1164124466e9520063304d375000297ae08acc004c03000a26600e4646609c6ea0cde5250375c609e0026609c609e60a000297ae059800981c9b8d0018998269ba930230013304d37526605260506e340040052f5c1164124466e9520083304d3750b3001337100029040400244006266e04004c0192020412497ae08acc004cdc3a40140051300323374a900519826800a5eb822b30013370e900600144cc0048cdd2a40186609a00297ae02323304e3750600c6eb4c13c004cc138c13cc1400052f5c0646609c6ea0cde5250375c609e0026609c609e60a000297ae059800980f1b8d0018998269ba9301b0013304d37526603a60386e340040052f5c116412515980099b874803800a266002466e95200e3304d0014bd70119198271ba833794940dd718278009982718279828000a5eb8166002603c6e3400626609a6ea4c06c004cc134dd49980e980e1b8d0010014bd70459049456600266e1d2010002899800919ba548040cc1340052f5c04646609c6ea0cde5250375c609e0026609c609e60a000297ae059800980f1b8d0018998269ba9301b0013304d37526603a60386e340040052f5c116412515980099b874804800a2464646609e66e9520123304f30500014bd701982798281828800a5eb80c004008cc0208c8cc13cdd419bca4a06eb8c140004cc13cc140c1440052f5c0b3001303a371a00313304e375260480026609c6ea4cc0a8c0a4dc6800800a5eb822c8250966002608000314c103d87980008acc004c114006298103d87a80008acc004c0ec006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20944128825104a20948acc004cdc3a40280051300323374a900a19826800a5eb822b30013370e900b00144c00c8cdd2a402c6609a00297ae08acc004cdc3a403000513300123374a900c19826800a5eb808c8cc138dd419bca4a06eb8c13c004cc138c13cc1400052f5c0b3001301e371a00313304d375260360026609a6ea4cc074c070dc6800800a5eb822c824a2c8241048209041208241048209041208241048209041208240dd718269827003096600266e2000520808080808080808080028800c4cdc0800980124100028228c00c00c6eb4c10c004c8cc108dd419b8e00148000cc108dd49980718069b8d0010014bd701bae3042304300420708b206a371890011b80480051640a86eb8c0bcc0c000566002600e6e3400626605a6ea4c008004cc0b4dd49980298021b8d0010014bd704590291bae301c302a37546602e4646b30013371e6eb8c0bc00522104b9011a82008919191919191919911981b980f1981b981c0039981b9ba90013303730380024bd701981b981c181c80125eb80d660026024003125980099b89002371a00313303637526601e0040026606c6ea66002005337026e3400400a002b8c25eb822c81922c8188dd7181b181b8011bae3036004375a606a00264660686ea0cde5250375c606a00266068606a606c00297ae059800980f9b8d0018998199ba930090013303337526601e601c6e340040052f5c11640bc6eb8c0ccc0d0004d6600294624b30013371290201b8d0018998191ba93300b48100004cc0c8dd4cc005204099b80371a002901fc0057184bd7045902e45902d1bae30323033001300100259800a51892cc004cdc4a4100026e340062660606ea4cc0252080010013303037533001482000666e00dc6800a40ff0015c612f5c11640b11640ad1640a86eb8c0bcc0c000566002600e6e3400626605a6ea4c008004cc0b4dd49980298021b8d0010014bd704590291bae302d00a300348010c00d2008198010011812800a044899180118120019bae302200240806eb0c07cc070dd5000c5901a19199119801001000912cc004006298103d87a80008992cc004cdd7802180f000c4c020cc084c07c0052f5c113300300330230024074604200280f8dd5980f981018101810181018101810181018101810180e1baa0143374a90021980e99ba548008cc074c02cc06cdd5180f180d9baa0014bd7025eb822c80c8c8cc004004dd61806180d9baa0132259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a51406d100189980180198108012036325980099912cc00400a294226530013259800980a98101baa00189bad302130243756604860426ea800629000203e30230019baf302330240019bab003488966002003159800980100344cc01400d20008a5040851325980099baf30230014c010140008acc004cc018010dd6981218139bab3024001898019ba630280028a5040891598009980300224001130030078a5040888110c0980050240ca60020033756602260406ea8c044c080dd5002488cc090008cc090dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0880066eacc08c006604e0069112cc004cdc8a441000038acc004cdc7a441000038998029807998141ba60024bd70000c4cc015300103d87a8000006409119800803c006446600e0046605466ec0dd48029ba6004001401c8120604a004811a2942294229410241ba63301f337606ea4020dd31980f99bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602c60386ea8c080c074dd51810180e9baa300e301d3754003132598009806980e9baa0018992cc004c04cc078dd5000c4c8c8c8c8cc8966002605200713259800980d18129baa0018991919194c004dd69816800cdd718168024dd69816801cdd7181680124444b3001303200589980d1bab303100e225980080144cc07003089660020051301b330340144bd7044c8c8cc06cc0cc0084c00cc0e0010dd71819800981a8012066899191980c981900109801981b0021bae3030001303300240c51640bc302d001302c001302b00130263754003164090605000d1640986eb8c098004dd59813001181300098128009812000980f9baa0018b203a3021301e3754003164070601e603a6ea8c038c074dd5000c5901b4530103d87a8000406c603e00280e88966002601e60346ea800a2646464b30013022002899803181080189980300080245901f18100009810000980d9baa0028b203222598009807180c9baa00289919192cc004c08400a26464b300130130018acc004c07cdd5001401a2c81022b30013018001899192cc004c09400a0111640886eb4c08c004c07cdd50014566002601c003159800980f9baa00280345902045901d203a4074603a6ea8004c08000e2c80f0c966002603a0031598009805980e000c5a2602c603800280da2c80f0dd5180f800980f800980d1baa0028b20301bad300130113754009159800acc004cdc4240006eb4c00cc044dd500244cdc49bad3003301137540086eb4c00cc044dd500c4528201e899b89375a600260226ea8060dd6980a180a980a980a980a98089baa0048a50403d14a0807a294100f22c805860126ea800e2c8038601000260066ea802629344d95900101", + "hash": "97bbb98a112020cf4fccb937b243d6b5a4d3d296c680cb0f7e3b7be4" }, { "title": "open_position.open_position.else", @@ -131,8 +131,8 @@ } } ], - "compiledCode": "591648010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a46022602460240032301130123012301200148896600266e1cdd69809cc0048c050c0540066e1d20049b89480124464b30013371e91100375c602c602e003130160018b20223002001911919800800801911980180098010014dd7180998081baa0179ba54800122222223232332259800980f80144c966002602060366ea800626464b30013012301d3754003132598009809980f1baa0018992cc004c050c07cdd5000c4cc088c08cc080dd500119811181198101baa0014bd7045901e181118119811981198119811980f9baa0038b203a3021301e3754003164070601a603a6ea8004c07cc070dd5000c5901a19198008009bac300e301c3754603e00644b30010018a6103d87a80008992cc004cdc39bad3021301e375400200913008330200014bd7044cc00c00cc08800901c1810000a03c8b203832598009807180c9baa0018992cc004c03cc068dd5000c4c8cc0200048966002005132330010010042259800800c52f5c113302298009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301623235980099b8f375c605c0029110475d3c793008cc004888c8cc00cdd698190009bae3032303300130030019b89480426e3120109b804803e600e90082444446600a464660686ea0cde5250375c606a00266068606a606c00297ae05980098029b8d0018998199ba930020013303337526600860066e340040052f5c11640bc466446601046606c6ea0cdc7000a40006606c6ea4cc00cc008dc6800800a5eb808cc0248cc0dcdd419b8e00148000cc0dcdd49980218019b8d0010014bd701119191981d18111981d1ba80083303a375000a66074607600297ae03303a303b303c0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605a00312323303d374e0026607a6ea40092f5c065300100180252f5c080088896600200510018cc00400e60820053303f3040002001400c81f2246530010059981e981f0008024c02400e6eb8c0f8c0fc0050054c004c8cc0f4dd419bca4a06eb8c0f8004cc0f4c0f8c0fc0052f5c0b30013017371a00313303c37526024002660786ea4cc054c050dc6800800a5eb822c81c2446607c0046607c6ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11400a605866088608a0106608898103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a8000330444c103d87a80004bd70200222259800801440063300100398240014c8c9660026074003132303133049304a00133049303133049304a3047375400697ae0304b304b00130463754007159800981f800c4c8c8c0c8cc128c12c008cc128c12c004cc128c0c8cc128c12cc120dd500225eb80c130c130004c12c004c118dd5001c566002606a003132323230333304b304c0033304b304c0023304b304c0013304b30333304b304c3049375400a97ae0304d304d001304c001304b001304637540071598009805000c4c8c8c8c8c0d0cc130c134010cc130c13400ccc130c134008cc130c134004cc130c0d0cc130c134c128dd500325eb80c138c138004c134004c130004c12c004c118dd5001c56600260120031323232323230353304d304e0053304d304e0043304d304e0033304d304e0023304d304e0013304d30353304d304e304b375400e97ae0304f304f001304e001304d001304c001304b0013046375400715980099b87480280062646464646464606c6609c609e00c6609c609e00a6609c609e0086609c609e0066609c609e0046609c609e0026609c606c6609c609e60986ea80212f5c060a060a0002609e002609c002609a00260980026096002608c6ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc13cc14001ccc13cc140018cc13cc140014cc13cc140010cc13cc14000ccc13cc140008cc13cc140004cc13cc0dccc13cc140c134dd5004a5eb80c144c144004c140004c13c004c138004c134004c130004c12c004c118dd5001c56600266e1d200e00189919191919191919181c19828182880419828182880399828182880319828182880299828182880219828182880199828182880119828182880099828181c19828182898271baa00a4bd7018291829000982880098280009827800982700098268009826000982580098231baa0038acc004cdc3a402000313232323232323232323039330513052009330513052008330513052007330513052006330513052005330513052004330513052003330513052002330513052001330513039330513052304f375401697ae030533053001305200130510013050001304f001304e001304d001304c001304b0013046375400715980099b87480480062646464646464646464646074660a460a6014660a460a6012660a460a6010660a460a600e660a460a600c660a460a600a660a460a6008660a460a6006660a460a6004660a460a6002660a46074660a460a660a06ea80312f5c060a860a800260a600260a400260a200260a0002609e002609c002609a00260980026096002608c6ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc14cc15002ccc14cc150028cc14cc150024cc14cc150020cc14cc15001ccc14cc150018cc14cc150014cc14cc150010cc14cc15000ccc14cc150008cc14cc150004cc14cc0eccc14cc150c144dd5006a5eb80c154c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c118dd5001c56600266e1d20160018991919191919191919191919181e1982a182a8061982a182a8059982a182a8051982a182a8049982a182a8041982a182a8039982a182a8031982a182a8029982a182a8021982a182a8019982a182a8011982a182a8009982a181e1982a182a98291baa00e4bd70182b182b000982a800982a00098298009829000982880098280009827800982700098268009826000982580098231baa0038991919191919191919191919181e1982a182a8061982a182a8059982a182a8051982a182a8049982a182a8041982a182a8039982a182a8031982a182a8029982a182a8021982a182a8019982a182a8011982a182a8009982a182a982b0009982a181e1982a182a98291baa00e4bd7025eb80c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c12c004c118dd5001a0884110822104420884110822104420884110822104418221baa0013047002400c8228dd718221822800991acc004c08400a2653001001a5eb820068008889660026070003123233048374e002660906ea40092f5c065300100180252f5c080088896600200510018cc00400e60980053304a304b002001400c824a246530010059982418248008024c05000e6eb8c124c1280050051802800a0848b207e375c6088608a006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241091598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41088210dc4000c888c8cc11cc00cdd698240009982398241824800a5eb80c00c006660866ea0cdc7000a4000660866ea4cc040c03cdc6800800a5eb8122232329800919802919198259ba833794940dd718260009982598261826800a5eb816600260386e340062660946ea4c064004cc128dd49980d980d1b8d0010014bd704590461191801acc004c0f4006298103d87a800089819998259ba80014bd70208e30030019bad3049003911191acc0066002607c6eb4c13400694294504844cc02000c8c014c0d4cc134dd4000a5eb822601e600898103d87a800041206eb8c134c138004cc12cdd419b8e00148000cc12cdd49980c180b9b8d0010014bd7024446b3001303d002898019181a19826000a5eb822b3001304200289801919ba548008cc1300052f5c1159800981c00144c00c8cdd2a40086609800297ae08acc004c03400a26600e4646609a6ea0cde5250375c609c0026609a609c609e00297ae059800981c1b8d0018998261ba930230013304c37526605260506e340040052f5c1164120466e9520063304c375000297ae08acc004c03000a26600e4646609a6ea0cde5250375c609c0026609a609c609e00297ae059800981c1b8d0018998261ba930230013304c37526605260506e340040052f5c1164120466e9520083304c3750b3001337100029040400244006266e04004c0192020412097ae08acc004cdc3a40140051300323374a900519826000a5eb822b30013370e900600144cc0048cdd2a40186609800297ae02323304d3750600c6eb4c138004cc134c138c13c0052f5c0646609a6ea0cde5250375c609c0026609a609c609e00297ae059800980f1b8d0018998261ba9301b0013304c37526603a60386e340040052f5c116412115980099b874803800a266002466e95200e3304c0014bd70119198269ba833794940dd718270009982698271827800a5eb8166002603c6e340062660986ea4c06c004cc130dd49980e980e1b8d0010014bd70459048456600266e1d2010002899800919ba548040cc1300052f5c04646609a6ea0cde5250375c609c0026609a609c609e00297ae059800980f1b8d0018998261ba9301b0013304c37526603a60386e340040052f5c116412115980099b874804800a2464646609c66e9520123304e304f0014bd701982718279828000a5eb80c004008cc0208c8cc138dd419bca4a06eb8c13c004cc138c13cc1400052f5c0b30013039371a00313304d375260480026609a6ea4cc0a8c0a4dc6800800a5eb822c8248966002607e00314c103d87980008acc004c110006298103d87a80008acc004c0e8006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20924124824904920928acc004cdc3a40280051300323374a900a19826000a5eb822b30013370e900b00144c00c8cdd2a402c6609800297ae08acc004cdc3a403000513300123374a900c19826000a5eb808c8cc134dd419bca4a06eb8c138004cc134c138c13c0052f5c0b3001301e371a00313304c37526036002660986ea4cc074c070dc6800800a5eb822c82422c8239047208e411c8239047208e411c8239047208e411c8238dd718261826803096600266e2000520808080808080808080028800c4cdc0800980124100028220c00c00c6eb4c108004c8cc104dd419b8e00148000cc104dd49980718069b8d0010014bd701bae30413042004206e8b2068371890011b80480051640a46eb8c0b8c0bc00566002600e6e340062660586ea4c008004cc0b0dd49980298021b8d0010014bd704590281bae301b302937546602c4646b30013371e6eb8c0b800522104b9011a82008919191919191919911981b180f1981b181b8039981b1ba90013303630370024bd701981b181b981c00125eb80d660026024003125980099b89002371a00313303537526601e0040026606a6ea66002005337026e3400400a002b8c25eb822c818a2c8180dd7181a981b0011bae3035004375a606800264660666ea0cde5250375c6068002660666068606a00297ae059800980f1b8d0018998191ba930090013303237526601e601c6e340040052f5c11640b86eb8c0c8c0cc004d6600294624b30013371290201b8d0018998189ba93300b48100004cc0c4dd4cc005204099b80371a002901fc0057184bd7045902d45902c1bae30313032001300100259800a51892cc004cdc4a4100026e3400626605e6ea4cc0252080010013302f37533001482000666e00dc6800a40ff0015c612f5c11640ad1640a91640a46eb8c0b8c0bc00566002600e6e340062660586ea4c008004cc0b0dd49980298021b8d0010014bd704590281bae302c00a300348010c00d2008198010011812000a042899180118118019bae3021002407c6eb0c078c06cdd5000c5901919199119801001000912cc004006298103d87a80008992cc004cdd7802180e800c4c020cc080c0780052f5c113300300330220024070604000280f0dd5980f180f980f980f980f980f980f980f980f980f980d9baa0133374a90021980e19ba548008cc070c02cc068dd5180e980d1baa0014bd7025eb822c80c0c8cc004004dd61805180d1baa0122259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a514069100189980180198100012034325980099912cc00400a294226530013259800980a180f9baa00189bad302030233756604660406ea800629000203c30220019baf302230230019bab003488966002003159800980100344cc01400d20008a5040811325980099baf30220014c010140008acc004cc018010dd6981198131bab3023001898019ba630270028a5040851598009980300224001130030078a5040848108c0940050230ca60020033756601e603e6ea8c03cc07cdd5002488cc08c008cc08cdd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0840066eacc088006604c0069112cc004cdc8a441000038acc004cdc7a441000038998029807998139ba60024bd70000c4cc015300103d87a8000006408d19800803c006446600e0046605266ec0dd48029ba6004001401c8118604800481122942294229410231ba63301e337606ea401cdd31980f19bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602a60366ea8c07cc070dd5180f980e1baa300c301c3754003132598009806180e1baa0018992cc004c048c074dd5000c4c8c8c8c8cc8966002605000713259800980c98121baa0018991919194c004dd69816000cdd718160024dd69816001cdd7181600124444b3001303100589980c9bab303000e225980080144cc06c03089660020051301b330330144bd7044c8c8cc06cc0c80084c00cc0dc010dd71819000981a0012064899191980c981880109801981a8021bae302f001303200240c11640b8302c001302b001302a0013025375400316408c604e00d1640946eb8c094004dd59812801181280098120009811800980f1baa0018b20383020301d375400316406c601c60386ea8c030c070dd5000c5901a4530103d87a80004068603c00280e0dd69804980c9baa02022598009807180c9baa00289919192cc004c08400a26600c604000626600c002009164078603e002603e00260346ea800a2c80c08966002601a60306ea800a2646464b30013020002899192cc004c0480062b3001301e37540050068b203e8acc004c05c00626464b300130240028044590211bad3022001301e37540051598009806800c566002603c6ea800a00d16407d16407080e101c180e1baa001301f0038b203a3259800980e000c56600260146036003168980a980d800a0348b203a3754603c002603c00260326ea800a2c80b86eb4c04cc050c050c050c050c040dd5001c56600266e24dd6980098081baa003337046eb4c008c040dd50019bad30023010375402f15980099b89375a600260206ea805cdd6980118081baa0038acc004cdc4240006eb4c004c040dd5001c4cdc4240006eb4c008c040dd5001c528201c8a50403914a08072294100e22c805860126ea800e2c8038601000260066ea802629344d95900101", - "hash": "62b7b99b456a860b71ccfd4d4e23bad82afb05a5660d0bfea90ce62b" + "compiledCode": "591644010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a460226024602400323011301200191808980918091809000a4444b30013370e6eb4c050c044dd50021bad30023011375403115980099b87375a60293001370e90024dc4a400922325980099b8f488100375c602e6030003130170018b20243002001911919800800801911980180098010014dd7180a18089baa0189bad300230113754031374a900024444444646464b3001301f0018992cc004c040c06cdd5000c4c8c9660026024603a6ea8006264b30013013301e375400313259800980a180f9baa001899811181198101baa0023302230233020375400297ae08b203c302230233023302330233023301f37540071640746042603c6ea80062c80e0c038c074dd5000980f980e1baa0018b203432330010013758601c60386ea8c07c008896600200314c0103d87a80008992cc004cdc39bad3021301e375400201113007330200014bd7044cc00c00cc08800901c1810000a03c8b203832598009807980d1baa0018992cc004c040c06cdd5000c4c8cc0240048966002005132330010010042259800800c52f5c113302398009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301723235980099b8f375c605e0029110475d3c793008cc004888c8cc00cdd698198009bae3033303400130030019b89480426e3120109b804803e600e90082444446600a4646606a6ea0cde5250375c606c0026606a606c606e00297ae05980098029b8d00189981a1ba930020013303437526600860066e340040052f5c11640c0466446601046606e6ea0cdc7000a40006606e6ea4cc00cc008dc6800800a5eb808cc0248cc0e0dd419b8e00148000cc0e0dd49980218019b8d0010014bd701119191981d98111981d9ba80083303b375000a66076607800297ae03303b303c303d0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605c00312323303e374e0026607c6ea40092f5c065300100180252f5c080088896600200510018cc00400e6084005330403041002001400c81fa246530010059981f181f8008024c02400e6eb8c0fcc1000050054c004c8cc0f8dd419bca4a06eb8c0fc004cc0f8c0fcc1000052f5c0b30013017371a00313303d375260240026607a6ea4cc054c050dc6800800a5eb822c81ca446607e0046607e6ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11800a60586608a608c0106608a98103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a80004bd70200222259800801440063300100398248014c8c966002607600313230313304a304b0013304a30313304a304b3048375400697ae0304c304c001304737540071598009820000c4c8c8c0c8cc12cc130008cc12cc130004cc12cc0c8cc12cc130c124dd500225eb80c134c134004c130004c11cdd5001c566002606c003132323230333304c304d0033304c304d0023304c304d0013304c30333304c304d304a375400a97ae0304e304e001304d001304c001304737540071598009805000c4c8c8c8c8c0d0cc134c138010cc134c13800ccc134c138008cc134c138004cc134c0d0cc134c138c12cdd500325eb80c13cc13c004c138004c134004c130004c11cdd5001c56600260120031323232323230353304e304f0053304e304f0043304e304f0033304e304f0023304e304f0013304e30353304e304f304c375400e97ae030503050001304f001304e001304d001304c0013047375400715980099b87480280062646464646464606c6609e60a000c6609e60a000a6609e60a00086609e60a00066609e60a00046609e60a00026609e606c6609e60a0609a6ea80212f5c060a260a200260a0002609e002609c002609a0026098002608e6ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc140c14401ccc140c144018cc140c144014cc140c144010cc140c14400ccc140c144008cc140c144004cc140c0dccc140c144c138dd5004a5eb80c148c148004c144004c140004c13c004c138004c134004c130004c11cdd5001c56600266e1d200e00189919191919191919181c19828982900419828982900399828982900319828982900299828982900219828982900199828982900119828982900099828981c19828982918279baa00a4bd7018299829800982900098288009828000982780098270009826800982600098239baa0038acc004cdc3a4020003132323232323232323230393305230530093305230530083305230530073305230530063305230530053305230530043305230530033305230530023305230530013305230393305230533050375401697ae0305430540013053001305200130510013050001304f001304e001304d001304c0013047375400715980099b87480480062646464646464646464646074660a660a8014660a660a8012660a660a8010660a660a800e660a660a800c660a660a800a660a660a8008660a660a8006660a660a8004660a660a8002660a66074660a660a860a26ea80312f5c060aa60aa00260a800260a600260a400260a200260a0002609e002609c002609a0026098002608e6ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc150c15402ccc150c154028cc150c154024cc150c154020cc150c15401ccc150c154018cc150c154014cc150c154010cc150c15400ccc150c154008cc150c154004cc150c0eccc150c154c148dd5006a5eb80c158c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c11cdd5001c56600266e1d20160018991919191919191919191919181e1982a982b0061982a982b0059982a982b0051982a982b0049982a982b0041982a982b0039982a982b0031982a982b0029982a982b0021982a982b0019982a982b0011982a982b0009982a981e1982a982b18299baa00e4bd70182b982b800982b000982a800982a0009829800982900098288009828000982780098270009826800982600098239baa0038991919191919191919191919181e1982a982b0061982a982b0059982a982b0051982a982b0049982a982b0041982a982b0039982a982b0031982a982b0029982a982b0021982a982b0019982a982b0011982a982b0009982a982b182b8009982a981e1982a982b18299baa00e4bd7025eb80c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c11cdd5001a08a41148229045208a41148229045208a4114822904518229baa0013048002400c8230dd718229823000991acc004c08400a2653001001a5eb820068008889660026072003123233049374e002660926ea40092f5c065300100180252f5c080088896600200510018cc00400e609a0053304b304c002001400c8252246530010059982498250008024c05000e6eb8c128c12c0050051802800a0868b2080375c608a608c006530012232598009800a40211598009800a4001148002266e39220108010204081020408000002410d1598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f410c8218dc4000c888c8cc120c00cdd698248009982418249825000a5eb80c00c006660886ea0cdc7000a4000660886ea4cc040c03cdc6800800a5eb8122232329800919802919198261ba833794940dd718268009982618269827000a5eb816600260386e340062660966ea4c064004cc12cdd49980d980d1b8d0010014bd704590471191801acc004c0f8006298103d87a800089819998261ba80014bd70209030030019bad304a003911191acc0066002607e6eb4c13800694294504944cc02000c8c014c0d4cc138dd4000a5eb822601e600898103d87a800041246eb8c138c13c004cc130dd419b8e00148000cc130dd49980c180b9b8d0010014bd7024446b3001303e002898019181a19826800a5eb822b3001304300289801919ba548008cc1340052f5c1159800981c80144c00c8cdd2a40086609a00297ae08acc004c03400a26600e4646609c6ea0cde5250375c609e0026609c609e60a000297ae059800981c9b8d0018998269ba930230013304d37526605260506e340040052f5c1164124466e9520063304d375000297ae08acc004c03000a26600e4646609c6ea0cde5250375c609e0026609c609e60a000297ae059800981c9b8d0018998269ba930230013304d37526605260506e340040052f5c1164124466e9520083304d3750b3001337100029040400244006266e04004c0192020412497ae08acc004cdc3a40140051300323374a900519826800a5eb822b30013370e900600144cc0048cdd2a40186609a00297ae02323304e3750600c6eb4c13c004cc138c13cc1400052f5c0646609c6ea0cde5250375c609e0026609c609e60a000297ae059800980f1b8d0018998269ba9301b0013304d37526603a60386e340040052f5c116412515980099b874803800a266002466e95200e3304d0014bd70119198271ba833794940dd718278009982718279828000a5eb8166002603c6e3400626609a6ea4c06c004cc134dd49980e980e1b8d0010014bd70459049456600266e1d2010002899800919ba548040cc1340052f5c04646609c6ea0cde5250375c609e0026609c609e60a000297ae059800980f1b8d0018998269ba9301b0013304d37526603a60386e340040052f5c116412515980099b874804800a2464646609e66e9520123304f30500014bd701982798281828800a5eb80c004008cc0208c8cc13cdd419bca4a06eb8c140004cc13cc140c1440052f5c0b3001303a371a00313304e375260480026609c6ea4cc0a8c0a4dc6800800a5eb822c8250966002608000314c103d87980008acc004c114006298103d87a80008acc004c0ec006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20944128825104a20948acc004cdc3a40280051300323374a900a19826800a5eb822b30013370e900b00144c00c8cdd2a402c6609a00297ae08acc004cdc3a403000513300123374a900c19826800a5eb808c8cc138dd419bca4a06eb8c13c004cc138c13cc1400052f5c0b3001301e371a00313304d375260360026609a6ea4cc074c070dc6800800a5eb822c824a2c8241048209041208241048209041208241048209041208240dd718269827003096600266e2000520808080808080808080028800c4cdc0800980124100028228c00c00c6eb4c10c004c8cc108dd419b8e00148000cc108dd49980718069b8d0010014bd701bae3042304300420708b206a371890011b80480051640a86eb8c0bcc0c000566002600e6e3400626605a6ea4c008004cc0b4dd49980298021b8d0010014bd704590291bae301c302a37546602e4646b30013371e6eb8c0bc00522104b9011a82008919191919191919911981b980f1981b981c0039981b9ba90013303730380024bd701981b981c181c80125eb80d660026024003125980099b89002371a00313303637526601e0040026606c6ea66002005337026e3400400a002b8c25eb822c81922c8188dd7181b181b8011bae3036004375a606a00264660686ea0cde5250375c606a00266068606a606c00297ae059800980f9b8d0018998199ba930090013303337526601e601c6e340040052f5c11640bc6eb8c0ccc0d0004d6600294624b30013371290201b8d0018998191ba93300b48100004cc0c8dd4cc005204099b80371a002901fc0057184bd7045902e45902d1bae30323033001300100259800a51892cc004cdc4a4100026e340062660606ea4cc0252080010013303037533001482000666e00dc6800a40ff0015c612f5c11640b11640ad1640a86eb8c0bcc0c000566002600e6e3400626605a6ea4c008004cc0b4dd49980298021b8d0010014bd704590291bae302d00a300348010c00d2008198010011812800a044899180118120019bae302200240806eb0c07cc070dd5000c5901a19199119801001000912cc004006298103d87a80008992cc004cdd7802180f000c4c020cc084c07c0052f5c113300300330230024074604200280f8dd5980f981018101810181018101810181018101810180e1baa0143374a90021980e99ba548008cc074c02cc06cdd5180f180d9baa0014bd7025eb822c80c8c8cc004004dd61806180d9baa0132259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a51406d100189980180198108012036325980099912cc00400a294226530013259800980a98101baa00189bad302130243756604860426ea800629000203e30230019baf302330240019bab003488966002003159800980100344cc01400d20008a5040851325980099baf30230014c010140008acc004cc018010dd6981218139bab3024001898019ba630280028a5040891598009980300224001130030078a5040888110c0980050240ca60020033756602260406ea8c044c080dd5002488cc090008cc090dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0880066eacc08c006604e0069112cc004cdc8a441000038acc004cdc7a441000038998029807998141ba60024bd70000c4cc015300103d87a8000006409119800803c006446600e0046605466ec0dd48029ba6004001401c8120604a004811a2942294229410241ba63301f337606ea4020dd31980f99bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602c60386ea8c080c074dd51810180e9baa300e301d3754003132598009806980e9baa0018992cc004c04cc078dd5000c4c8c8c8c8cc8966002605200713259800980d18129baa0018991919194c004dd69816800cdd718168024dd69816801cdd7181680124444b3001303200589980d1bab303100e225980080144cc07003089660020051301b330340144bd7044c8c8cc06cc0cc0084c00cc0e0010dd71819800981a8012066899191980c981900109801981b0021bae3030001303300240c51640bc302d001302c001302b00130263754003164090605000d1640986eb8c098004dd59813001181300098128009812000980f9baa0018b203a3021301e3754003164070601e603a6ea8c038c074dd5000c5901b4530103d87a8000406c603e00280e88966002601e60346ea800a2646464b30013022002899803181080189980300080245901f18100009810000980d9baa0028b203222598009807180c9baa00289919192cc004c08400a26464b300130130018acc004c07cdd5001401a2c81022b30013018001899192cc004c09400a0111640886eb4c08c004c07cdd50014566002601c003159800980f9baa00280345902045901d203a4074603a6ea8004c08000e2c80f0c966002603a0031598009805980e000c5a2602c603800280da2c80f0dd5180f800980f800980d1baa0028b20301bad300130113754009159800acc004cdc4240006eb4c00cc044dd500244cdc49bad3003301137540086eb4c00cc044dd500c4528201e899b89375a600260226ea8060dd6980a180a980a980a980a98089baa0048a50403d14a0807a294100f22c805860126ea800e2c8038601000260066ea802629344d95900101", + "hash": "97bbb98a112020cf4fccb937b243d6b5a4d3d296c680cb0f7e3b7be4" }, { "title": "pool_manager.pool_manager.spend", @@ -235,7 +235,7 @@ }, { "title": "min_collateral", - "description": "Minimum collateral in lovelace to open a position", + "description": "Minimum collateral in micro USDCx to open a position", "$ref": "#/definitions/Int" }, { @@ -258,31 +258,31 @@ "fields": [ { "title": "total_open_interest", - "description": "Total open interest across all positions (lovelace)", + "description": "Total open interest across all positions (micro USDCx)", "$ref": "#/definitions/Int" }, { "title": "max_open_interest", - "description": "Maximum allowed open interest (lovelace)", + "description": "Maximum allowed open interest (micro USDCx)", "$ref": "#/definitions/Int" } ] } ] }, - "lazer_perps/types/Position": { - "title": "Position", - "description": "A perpetual position stored as datum on an independent eUTxO", + "lazer_perps/types/PositionDatum": { + "title": "PositionDatum", + "description": "PositionDatum — stored as inline datum on each position eUTxO.\n Each open position is an independent UTxO with this datum.", "anyOf": [ { - "title": "Position", + "title": "PositionDatum", "dataType": "constructor", "index": 0, "fields": [ { - "title": "owner", - "description": "Owner's public key hash", - "$ref": "#/definitions/ByteArray" + "title": "feed_id", + "description": "Pyth Lazer feed ID (e.g. 346 = XAU/USD)", + "$ref": "#/definitions/Int" }, { "title": "direction", @@ -290,23 +290,28 @@ "$ref": "#/definitions/lazer_perps~1types~1Direction" }, { - "title": "collateral", - "description": "Collateral deposited (lovelace)", + "title": "leverage", + "description": "Leverage multiplier (e.g. 5 = 5x)", "$ref": "#/definitions/Int" }, { - "title": "size", - "description": "Position size = collateral * leverage (lovelace-denominated)", + "title": "entry_price", + "description": "Entry price with 6 decimals (e.g. 3285_500000 = $3,285.50)", "$ref": "#/definitions/Int" }, { - "title": "entry_price", - "description": "Entry price (raw integer, before exponent)", + "title": "collateral", + "description": "Collateral in micro USDCx (e.g. 100_000000 = 100 USDCx)", "$ref": "#/definitions/Int" }, { - "title": "entry_exponent", - "description": "Entry price exponent (e.g. -8)", + "title": "trader_pkh", + "description": "Trader's public key hash", + "$ref": "#/definitions/ByteArray" + }, + { + "title": "opened_at", + "description": "POSIX timestamp when the position was opened (milliseconds)", "$ref": "#/definitions/Int" } ] diff --git a/lazer/cardano/lazer-perps/onchain/validators/close_position.ak b/lazer/cardano/lazer-perps/onchain/validators/close_position.ak index 5d40f75b..3a53adc0 100644 --- a/lazer/cardano/lazer-perps/onchain/validators/close_position.ak +++ b/lazer/cardano/lazer-perps/onchain/validators/close_position.ak @@ -3,17 +3,19 @@ use aiken/math/rational use cardano/assets.{PolicyId} use cardano/transaction.{Transaction} use lazer_perps/oracle_gate -use lazer_perps/types.{Direction, Long, Short, MarketConfig, Position} +use lazer_perps/types.{Direction, Long, Short, MarketConfig, PositionDatum} /// Compute PnL as a rational number. -/// Long PnL = size * (currentPrice - entryPrice) / entryPrice -/// Short PnL = size * (entryPrice - currentPrice) / entryPrice +/// Long PnL = (collateral * leverage) * (exitPrice - entryPrice) / entryPrice +/// Short PnL = (collateral * leverage) * (entryPrice - exitPrice) / entryPrice pub fn compute_pnl( direction: Direction, - size: Int, + collateral: Int, + leverage: Int, entry_price: Int, current_price: Int, ) -> rational.Rational { + let size = collateral * leverage let diff = when direction is { Long -> current_price - entry_price Short -> entry_price - current_price @@ -24,15 +26,16 @@ pub fn compute_pnl( /// Close Position validator. /// -/// Only the position owner can close. Reads the current Pyth price -/// to compute PnL for settlement against the liquidity pool. +/// Only the position owner (trader_pkh) can close. +/// Reads the current Pyth price for PnL settlement. /// /// PnL formulas: /// Long: PnL = size * (exitPrice - entryPrice) / entryPrice /// Short: PnL = size * (entryPrice - exitPrice) / entryPrice +/// where size = collateral * leverage validator close_position(config: MarketConfig) { spend( - datum: Option, + datum: Option, _redeemer: Data, _own_ref: Data, self: Transaction, @@ -43,16 +46,16 @@ validator close_position(config: MarketConfig) { let (current_price, _exponent) = oracle_gate.read_price(config.pyth_id, config.feed_id, self) - // Only the position owner can close - let signed_by_owner = - list.has(self.extra_signatories, position.owner) + // Only the trader who opened the position can close it + let signed_by_trader = + list.has(self.extra_signatories, position.trader_pkh) // Oracle price must be valid let valid_price = current_price > 0 - // PnL is computable (entry_price > 0) + // Entry price must be valid for PnL computation let valid_entry = position.entry_price > 0 - signed_by_owner && valid_price && valid_entry + signed_by_trader && valid_price && valid_entry } } diff --git a/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak b/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak index b924a09c..317ff88d 100644 --- a/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak +++ b/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak @@ -3,17 +3,19 @@ use cardano/assets.{PolicyId} use cardano/transaction.{Transaction} use lazer_perps/oracle_gate use lazer_perps/types.{ - Direction, Long, Short, MarketConfig, Position, + Direction, Long, Short, MarketConfig, PositionDatum, liquidation_bps, keeper_fee_bps, } /// Compute PnL as a rational number. fn compute_pnl( direction: Direction, - size: Int, + collateral: Int, + leverage: Int, entry_price: Int, current_price: Int, ) -> rational.Rational { + let size = collateral * leverage let diff = when direction is { Long -> current_price - entry_price Short -> entry_price - current_price @@ -24,19 +26,19 @@ fn compute_pnl( /// Liquidation validator. /// -/// Anyone can trigger liquidation if the position is undercollateralized. -/// No owner signature required — this is a public good. +/// Anyone can trigger liquidation — no owner signature needed. /// /// Liquidation check: /// remaining = collateral + PnL -/// margin_ratio = remaining / collateral -/// If remaining * 10000 < collateral * liquidation_bps → liquidatable +/// If remaining * 10000 < collateral * liquidation_bps (8000) → liquidatable /// -/// Keeper receives 1% of collateral as fee. -/// Remaining collateral goes back to the pool. +/// On liquidation: +/// - Keeper receives 1% of collateral as fee +/// - Remaining goes back to the liquidity pool +/// - Position eUTxO is consumed (destroyed) validator liquidate(config: MarketConfig) { spend( - datum: Option, + datum: Option, _redeemer: Data, _own_ref: Data, self: Transaction, @@ -47,11 +49,12 @@ validator liquidate(config: MarketConfig) { let (current_price, _exponent) = oracle_gate.read_price(config.pyth_id, config.feed_id, self) - // Compute PnL + // Compute PnL using position's leverage let pnl = compute_pnl( position.direction, - position.size, + position.collateral, + position.leverage, position.entry_price, current_price, ) diff --git a/lazer/cardano/lazer-perps/onchain/validators/open_position.ak b/lazer/cardano/lazer-perps/onchain/validators/open_position.ak index e536cee0..04eb55be 100644 --- a/lazer/cardano/lazer-perps/onchain/validators/open_position.ak +++ b/lazer/cardano/lazer-perps/onchain/validators/open_position.ak @@ -1,7 +1,7 @@ use cardano/assets.{PolicyId} use cardano/transaction.{Transaction} use lazer_perps/oracle_gate -use lazer_perps/types.{MarketConfig, Position} +use lazer_perps/types.{MarketConfig, PositionDatum} /// Open Position validator. /// @@ -9,10 +9,10 @@ use lazer_perps/types.{MarketConfig, Position} /// 1. Has a valid Pyth price witness (entry_price == oracle price) /// 2. Respects the market's leverage cap /// 3. Meets minimum collateral requirement -/// 4. Size == collateral * leverage (no inflation) +/// 4. Feed ID matches the market config validator open_position(config: MarketConfig) { spend( - datum: Option, + datum: Option, _redeemer: Data, _own_ref: Data, self: Transaction, @@ -23,20 +23,19 @@ validator open_position(config: MarketConfig) { let (current_price, _exponent) = oracle_gate.read_price(config.pyth_id, config.feed_id, self) - // 1. Entry price must match current oracle price + // 1. Feed ID in datum must match market config + let feed_matches = position.feed_id == config.feed_id + + // 2. Entry price must match current oracle price let price_valid = current_price == position.entry_price - // 2. Leverage cap: size / collateral <= leverage_cap - // Equivalent: size <= collateral * leverage_cap + // 3. Leverage must be within cap let leverage_ok = - position.size <= position.collateral * config.leverage_cap + position.leverage > 0 && position.leverage <= config.leverage_cap - // 3. Minimum collateral + // 4. Minimum collateral (in micro USDCx) let collateral_ok = position.collateral >= config.min_collateral - // 4. Size must be a positive multiple of collateral - let size_valid = position.size > 0 && position.collateral > 0 - - price_valid && leverage_ok && collateral_ok && size_valid + feed_matches && price_valid && leverage_ok && collateral_ok } } From 6d6a879b60c9d84a0cbda11361732634d109827a Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 18:17:26 -0300 Subject: [PATCH 04/20] Step 4: Exact PnL and liquidation formulas in shared module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New lib/lazer_perps/formulas.ak with: - compute_pnl: dir_multiplier × collateral × leverage × (exit - entry) / entry - compute_payout: max(0, collateral + PnL) - liquidation_price_long: entry × (1 - 1/leverage + 0.01) - liquidation_price_short: entry × (1 + 1/leverage - 0.01) - is_liquidatable: Long if price <= liq_price, Short if price >= liq_price close_position.ak now computes PnL and payout on close. liquidate.ak now uses exact liquidation price formula instead of margin ratio. --- .../onchain/lib/lazer_perps/formulas.ak | 95 +++++++++++++++++++ lazer/cardano/lazer-perps/onchain/plutus.json | 16 ++-- .../onchain/validators/close_position.ak | 58 +++++------ .../onchain/validators/liquidate.ak | 65 ++++--------- 4 files changed, 145 insertions(+), 89 deletions(-) create mode 100644 lazer/cardano/lazer-perps/onchain/lib/lazer_perps/formulas.ak diff --git a/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/formulas.ak b/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/formulas.ak new file mode 100644 index 00000000..8dc02c60 --- /dev/null +++ b/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/formulas.ak @@ -0,0 +1,95 @@ +use aiken/math/rational.{Rational} +use lazer_perps/types.{Direction, Long, Short} + +/// PnL = direction_multiplier × collateral × leverage × (exit_price - entry_price) / entry_price +/// +/// direction_multiplier: +1 for Long, -1 for Short +/// +/// Example (Long 5x, entry $3000, exit $3100, collateral 100): +/// PnL = +1 × 100 × 5 × (3100 - 3000) / 3000 = 16.67 +pub fn compute_pnl( + direction: Direction, + collateral: Int, + leverage: Int, + entry_price: Int, + exit_price: Int, +) -> Rational { + // direction_multiplier × (exit_price - entry_price) + let price_diff = when direction is { + Long -> exit_price - entry_price + Short -> entry_price - exit_price + } + // collateral × leverage × price_diff / entry_price + expect Some(pnl) = + rational.new(collateral * leverage * price_diff, entry_price) + pnl +} + +/// Payout = max(0, collateral + PnL) +/// +/// Trader never owes more than their collateral. +pub fn compute_payout(collateral: Int, pnl: Rational) -> Rational { + let total = rational.add(rational.from_int(collateral), pnl) + let zero = rational.from_int(0) + if rational.compare(total, zero) == Less { + zero + } else { + total + } +} + +/// Liquidation price for Long positions: +/// liq_price = entry_price × (1 - 1/leverage + 0.01) +/// +/// Simplified to integer math (all prices have 6 decimals): +/// liq_price = entry_price × (leverage - 1 + 0.01 × leverage) / leverage +/// liq_price = entry_price × (100 × leverage - 100 + leverage) / (100 × leverage) +/// liq_price = entry_price × (101 × leverage - 100) / (100 × leverage) +pub fn liquidation_price_long( + entry_price: Int, + leverage: Int, +) -> Rational { + // entry_price × (101 * leverage - 100) / (100 * leverage) + expect Some(liq) = + rational.new(entry_price * (101 * leverage - 100), 100 * leverage) + liq +} + +/// Liquidation price for Short positions: +/// liq_price = entry_price × (1 + 1/leverage - 0.01) +/// +/// Simplified: +/// liq_price = entry_price × (99 × leverage + 100) / (100 × leverage) +pub fn liquidation_price_short( + entry_price: Int, + leverage: Int, +) -> Rational { + // entry_price × (99 * leverage + 100) / (100 * leverage) + expect Some(liq) = + rational.new(entry_price * (99 * leverage + 100), 100 * leverage) + liq +} + +/// Check if a position should be liquidated based on current price. +/// Long: liquidate if current_price <= liq_price +/// Short: liquidate if current_price >= liq_price +pub fn is_liquidatable( + direction: Direction, + entry_price: Int, + leverage: Int, + current_price: Int, +) -> Bool { + let current_r = rational.from_int(current_price) + when direction is { + Long -> { + let liq = liquidation_price_long(entry_price, leverage) + // current_price <= liq_price + rational.compare(current_r, liq) != Greater + } + Short -> { + let liq = liquidation_price_short(entry_price, leverage) + // current_price >= liq_price + rational.compare(current_r, liq) != Less + } + } +} diff --git a/lazer/cardano/lazer-perps/onchain/plutus.json b/lazer/cardano/lazer-perps/onchain/plutus.json index f1267c4b..52137515 100644 --- a/lazer/cardano/lazer-perps/onchain/plutus.json +++ b/lazer/cardano/lazer-perps/onchain/plutus.json @@ -33,8 +33,8 @@ } } ], - "compiledCode": "591639010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a4602260246024602460246024003230113012301230120014889660026466446600400400244b30010018a508acc004cdc79bae30160010038a51899801001180b800a02240506eb0c050c054c054c054c054c054c054c054c054c044dd50049bae30023010375400715980099b8848000dd69809cc0048c050c0540066e1d20049b89480124464b30013371e91100375c602c602e003130160018b202230020019119198008008019119801800980100148c050c054c0540066eb8c04cc040dd500bcdd2a400091111111191919912cc004c08000a264b30013011301c375400313232598009809980f1baa0018992cc004c050c07cdd5000c4c966002602a60406ea8006266046604860426ea8008cc08cc090c084dd5000a5eb822c80f8c048c080dd5001c5901e1811180f9baa0018b203a300e301e37540026040603a6ea80062c80d8c8cc004004dd61804180e9baa30200032259800800c530103d87a80008992cc004cdc39bad3022301f375400200913008330210014bd7044cc00c00cc08c00901d1810800a03e8b203a32598009807980d1baa0018992cc004c040c06cdd5000c4c8cc0240048966002005132330010010042259800800c52f5c113302398009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301723235980099b8f375c605e0029110475d3c793008cc004888c8cc00cdd698198009bae3033303400130030019b89480426e3120109b804803e600e90082444446600a4646606a6ea0cde5250375c606c0026606a606c606e00297ae05980098029b8d00189981a1ba930020013303437526600860066e340040052f5c11640c0466446601046606e6ea0cdc7000a40006606e6ea4cc00cc008dc6800800a5eb808cc0248cc0e0dd419b8e00148000cc0e0dd49980218019b8d0010014bd701119191981d98111981d9ba80083303b375000a66076607800297ae03303b303c303d0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605c00312323303e374e0026607c6ea40092f5c065300100180252f5c080088896600200510018cc00400e6084005330403041002001400c81fa246530010059981f181f8008024c02400e6eb8c0fcc1000050054c004c8cc0f8dd419bca4a06eb8c0fc004cc0f8c0fcc1000052f5c0b30013017371a00313303d375260240026607a6ea4cc054c050dc6800800a5eb822c81ca446607e0046607e6ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11800a60586608a608c0106608a98103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a80004bd70200222259800801440063300100398248014c8c966002607600313230313304a304b0013304a30313304a304b3048375400697ae0304c304c001304737540071598009820000c4c8c8c0c8cc12cc130008cc12cc130004cc12cc0c8cc12cc130c124dd500225eb80c134c134004c130004c11cdd5001c566002606c003132323230333304c304d0033304c304d0023304c304d0013304c30333304c304d304a375400a97ae0304e304e001304d001304c001304737540071598009805000c4c8c8c8c8c0d0cc134c138010cc134c13800ccc134c138008cc134c138004cc134c0d0cc134c138c12cdd500325eb80c13cc13c004c138004c134004c130004c11cdd5001c56600260120031323232323230353304e304f0053304e304f0043304e304f0033304e304f0023304e304f0013304e30353304e304f304c375400e97ae030503050001304f001304e001304d001304c0013047375400715980099b87480280062646464646464606c6609e60a000c6609e60a000a6609e60a00086609e60a00066609e60a00046609e60a00026609e606c6609e60a0609a6ea80212f5c060a260a200260a0002609e002609c002609a0026098002608e6ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc140c14401ccc140c144018cc140c144014cc140c144010cc140c14400ccc140c144008cc140c144004cc140c0dccc140c144c138dd5004a5eb80c148c148004c144004c140004c13c004c138004c134004c130004c11cdd5001c56600266e1d200e00189919191919191919181c19828982900419828982900399828982900319828982900299828982900219828982900199828982900119828982900099828981c19828982918279baa00a4bd7018299829800982900098288009828000982780098270009826800982600098239baa0038acc004cdc3a4020003132323232323232323230393305230530093305230530083305230530073305230530063305230530053305230530043305230530033305230530023305230530013305230393305230533050375401697ae0305430540013053001305200130510013050001304f001304e001304d001304c0013047375400715980099b87480480062646464646464646464646074660a660a8014660a660a8012660a660a8010660a660a800e660a660a800c660a660a800a660a660a8008660a660a8006660a660a8004660a660a8002660a66074660a660a860a26ea80312f5c060aa60aa00260a800260a600260a400260a200260a0002609e002609c002609a0026098002608e6ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc150c15402ccc150c154028cc150c154024cc150c154020cc150c15401ccc150c154018cc150c154014cc150c154010cc150c15400ccc150c154008cc150c154004cc150c0eccc150c154c148dd5006a5eb80c158c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c11cdd5001c56600266e1d20160018991919191919191919191919181e1982a982b0061982a982b0059982a982b0051982a982b0049982a982b0041982a982b0039982a982b0031982a982b0029982a982b0021982a982b0019982a982b0011982a982b0009982a981e1982a982b18299baa00e4bd70182b982b800982b000982a800982a0009829800982900098288009828000982780098270009826800982600098239baa0038991919191919191919191919181e1982a982b0061982a982b0059982a982b0051982a982b0049982a982b0041982a982b0039982a982b0031982a982b0029982a982b0021982a982b0019982a982b0011982a982b0009982a982b182b8009982a981e1982a982b18299baa00e4bd7025eb80c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c11cdd5001a08a41148229045208a41148229045208a4114822904518229baa0013048002400c8230dd718229823000991acc004c08400a2653001001a5eb820068008889660026072003123233049374e002660926ea40092f5c065300100180252f5c080088896600200510018cc00400e609a0053304b304c002001400c8252246530010059982498250008024c05000e6eb8c128c12c0050051802800a0868b2080375c608a608c006530012232598009800a40211598009800a4001148002266e39220108010204081020408000002410d1598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f410c8218dc4000c888c8cc120c00cdd698248009982418249825000a5eb80c00c006660886ea0cdc7000a4000660886ea4cc040c03cdc6800800a5eb8122232329800919802919198261ba833794940dd718268009982618269827000a5eb816600260386e340062660966ea4c064004cc12cdd49980d980d1b8d0010014bd704590471191801acc004c0f8006298103d87a800089819998261ba80014bd70209030030019bad304a003911191acc0066002607e6eb4c13800694294504944cc02000c8c014c0d4cc138dd4000a5eb822601e600898103d87a800041246eb8c138c13c004cc130dd419b8e00148000cc130dd49980c180b9b8d0010014bd7024446b3001303e002898019181a19826800a5eb822b3001304300289801919ba548008cc1340052f5c1159800981c80144c00c8cdd2a40086609a00297ae08acc004c03400a26600e4646609c6ea0cde5250375c609e0026609c609e60a000297ae059800981c9b8d0018998269ba930230013304d37526605260506e340040052f5c1164124466e9520063304d375000297ae08acc004c03000a26600e4646609c6ea0cde5250375c609e0026609c609e60a000297ae059800981c9b8d0018998269ba930230013304d37526605260506e340040052f5c1164124466e9520083304d3750b3001337100029040400244006266e04004c0192020412497ae08acc004cdc3a40140051300323374a900519826800a5eb822b30013370e900600144cc0048cdd2a40186609a00297ae02323304e3750600c6eb4c13c004cc138c13cc1400052f5c0646609c6ea0cde5250375c609e0026609c609e60a000297ae059800980f1b8d0018998269ba9301b0013304d37526603a60386e340040052f5c116412515980099b874803800a266002466e95200e3304d0014bd70119198271ba833794940dd718278009982718279828000a5eb8166002603c6e3400626609a6ea4c06c004cc134dd49980e980e1b8d0010014bd70459049456600266e1d2010002899800919ba548040cc1340052f5c04646609c6ea0cde5250375c609e0026609c609e60a000297ae059800980f1b8d0018998269ba9301b0013304d37526603a60386e340040052f5c116412515980099b874804800a2464646609e66e9520123304f30500014bd701982798281828800a5eb80c004008cc0208c8cc13cdd419bca4a06eb8c140004cc13cc140c1440052f5c0b3001303a371a00313304e375260480026609c6ea4cc0a8c0a4dc6800800a5eb822c8250966002608000314c103d87980008acc004c114006298103d87a80008acc004c0ec006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20944128825104a20948acc004cdc3a40280051300323374a900a19826800a5eb822b30013370e900b00144c00c8cdd2a402c6609a00297ae08acc004cdc3a403000513300123374a900c19826800a5eb808c8cc138dd419bca4a06eb8c13c004cc138c13cc1400052f5c0b3001301e371a00313304d375260360026609a6ea4cc074c070dc6800800a5eb822c824a2c8241048209041208241048209041208241048209041208240dd718269827003096600266e2000520808080808080808080028800c4cdc0800980124100028228c00c00c6eb4c10c004c8cc108dd419b8e00148000cc108dd49980718069b8d0010014bd701bae3042304300420708b206a371890011b80480051640a86eb8c0bcc0c000566002600e6e3400626605a6ea4c008004cc0b4dd49980298021b8d0010014bd704590291bae3015302a37546602e4646b30013371e6eb8c0bc00522104b9011a82008919191919191919911981b980f1981b981c0039981b9ba90013303730380024bd701981b981c181c80125eb80d660026024003125980099b89002371a00313303637526601e0040026606c6ea66002005337026e3400400a002b8c25eb822c81922c8188dd7181b181b8011bae3036004375a606a00264660686ea0cde5250375c606a00266068606a606c00297ae059800980f9b8d0018998199ba930090013303337526601e601c6e340040052f5c11640bc6eb8c0ccc0d0004d6600294624b30013371290201b8d0018998191ba93300b48100004cc0c8dd4cc005204099b80371a002901fc0057184bd7045902e45902d1bae30323033001300100259800a51892cc004cdc4a4100026e340062660606ea4cc0252080010013303037533001482000666e00dc6800a40ff0015c612f5c11640b11640ad1640a86eb8c0bcc0c000566002600e6e3400626605a6ea4c008004cc0b4dd49980298021b8d0010014bd704590291bae302d00a300348010c00d2008198010011812800a044899180118120019bae302200240806eb0c07cc070dd5000c5901a19199119801001000912cc004006298103d87a80008992cc004cdd7802180f000c4c020cc084c07c0052f5c113300300330230024074604200280f8dd5980f981018101810181018101810181018101810180e1baa0143374a90021980e99ba548008cc074c030c06cdd5180f180d9baa0014bd7025eb822c80c8c8cc004004dd61805980d9baa0132259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a51406d100189980180198108012036325980099912cc00400a294226530013259800980a98101baa00189bad302130243756604860426ea800629000203e30230019baf302330240019bab003488966002003159800980100344cc01400d20008a5040851325980099baf30230014c010140008acc004cc018010dd6981218139bab3024001898019ba630280028a5040891598009980300224001130030078a5040888110c0980050240ca60020033756602060406ea8c040c080dd5002488cc090008cc090dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0880066eacc08c006604e0069112cc004cdc8a441000038acc004cdc7a441000038998029807998141ba60024bd70000c4cc015300103d87a8000006409119800803c006446600e0046605466ec0dd48029ba6004001401c8120604a004811a2942294229410241ba63301f337606ea401cdd31980f99bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602c60386ea8c080c074dd51810180e9baa300d301d3754003132598009806980e9baa0018992cc004c04cc078dd5000c4c8c8c8c8cc8966002605200713259800980d18129baa0018991919194c004dd69816800cdd718168024dd69816801cdd7181680124444b3001303200589980d1bab303100e225980080144cc07003089660020051301b330340144bd7044c8c8cc06cc0cc0084c00cc0e0010dd71819800981a8012066899191980c981900109801981b0021bae3030001303300240c51640bc302d001302c001302b00130263754003164090605000d1640986eb8c098004dd59813001181300098128009812000980f9baa0018b203a3021301e37540031640706010603a6ea8c034c074dd5000c5901b4530103d87a8000406c603e00280e8dd69805180d1baa02122598009807980d1baa00289919192cc004c08800a26600c604200626600c00200916407c6040002604000260366ea800a2c80c88966002601c60326ea800a2646464b30013021002899192cc004c04c0062b3001301f37540050068b20408acc004c06000626464b300130250028044590221bad3023001301f37540051598009807000c566002603e6ea800a00d16408116407480e901d180e9baa00130200038b203c3259800980e800c56600260166038003168980b180e000a0368b203c3754603e002603e00260346ea800a2c80c113371090001bad30013010375400714a08072294100e22c805860126ea800e2c8038601000260066ea802629344d95900101", - "hash": "680f54d991e4d10708b4670d087cd18e072082ab46eea7cdc544e912" + "compiledCode": "5916f7010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a46022602460240032301130120019180898091809180918091809000c8c044c048c048c0480066e9520004888888c8c9660026466446600400400244b30010018a508acc004cdc79bae301b0010038a51899801001180e000a02c40646eb0c064c068c068c068c068c068c068c068c068c058dd50071bae30053015375401115980099b884800000a266e212000375a6008602a6ea802229410134528202698009802980a1baa0079bad301730183018301830183014375400f375a600c60286ea801e6eb4c00cc050dd5003a444464b3001300d301837540031301c3019375400316405c64b3001300d0028a60103d87a80008acc004cdc400124001130073301b30073301b375066e0520000013301b375066e0520000024bd7025eb822600e66036600e660366ea0004cc06cdd400125eb812f5c080b901719b8233704006004b3001300c3017375400913370200a00313370200200a80b06eb4c05a60026e1d20049b89480124464b30013371e910100375c60326034003130190018b20283002001911919800800801911980180098010014dd7180b18099baa01a9bad3004301337540349111111919192cc004c080006264b30013011301c375400313232598009809980f1baa0018992cc004c050c07cdd5000c4c966002602a60406ea8006266046604860426ea8008cc08cc090c084dd5000a5eb822c80f8c040c080dd5001c5901e1811180f9baa0018b203a300f301e37540026040603a6ea80062c80d8c8cc004004dd61807980e9baa30200022259800800c530103d87a80008992cc004cdc39bad3022301f375400200f1300d330210014bd7044cc00c00cc08c00901d1810800a03e8b203a32598009808180d9baa0018992cc004c044c070dd5000c4c8cc0200048966002005132330010010042259800800c52f5c113302498009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301623235980099b8f375c60600029110475d3c793008cc004888c8cc00cdd6981a0009bae3034303500130030019b89480426e3120109b804803e600e90082444446600a4646606c6ea0cde5250375c606e0026606c606e607000297ae05980098029b8d00189981a9ba930020013303537526600860066e340040052f5c11640c446644660104660706ea0cdc7000a4000660706ea4cc00cc008dc6800800a5eb808cc0248cc0e4dd419b8e00148000cc0e4dd49980218019b8d0010014bd701119191981e18141981e1ba80083303c375000a66078607a00297ae03303c303d303e0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605e00312323303f374e0026607e6ea40092f5c065300100180252f5c080088896600200510018cc00400e6086005330413042002001400c8202246530010059981f98200008024c02400e6eb8c100c1040050054c004c8cc0fcdd419bca4a06eb8c100004cc0fcc100c1040052f5c0b30013017371a00313303e375260240026607c6ea4cc054c050dc6800800a5eb822c81d24466080004660806ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11c00a60646608c608e0106608c98103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a80004bd70200222259800801440063300100398250014c8c966002607800313230373304b304c0013304b30373304b304c3049375400697ae0304d304d001304837540071598009820800c4c8c8c0e0cc130c134008cc130c134004cc130c0e0cc130c134c128dd500225eb80c138c138004c134004c120dd5001c566002606a003132323230393304d304e0033304d304e0023304d304e0013304d30393304d304e304b375400a97ae0304f304f001304e001304d001304837540071598009805000c4c8c8c8c8c0e8cc138c13c010cc138c13c00ccc138c13c008cc138c13c004cc138c0e8cc138c13cc130dd500325eb80c140c140004c13c004c138004c134004c120dd5001c566002601200313232323232303b3304f30500053304f30500043304f30500033304f30500023304f30500013304f303b3304f3050304d375400e97ae0305130510013050001304f001304e001304d0013048375400715980099b874802800626464646464646078660a060a200c660a060a200a660a060a2008660a060a2006660a060a2004660a060a2002660a06078660a060a2609c6ea80212f5c060a460a400260a200260a0002609e002609c002609a00260906ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0f4cc144c14801ccc144c148018cc144c148014cc144c148010cc144c14800ccc144c148008cc144c148004cc144c0f4cc144c148c13cdd5004a5eb80c14cc14c004c148004c144004c140004c13c004c138004c134004c120dd5001c56600266e1d200e00189919191919191919181f19829182980419829182980399829182980319829182980299829182980219829182980199829182980119829182980099829181f19829182998281baa00a4bd70182a182a000982980098290009828800982800098278009827000982680098241baa0038acc004cdc3a40200031323232323232323232303f33053305400933053305400833053305400733053305400633053305400533053305400433053305400333053305400233053305400133053303f3305330543051375401697ae03055305500130540013053001305200130510013050001304f001304e001304d0013048375400715980099b87480480062646464646464646464646080660a860aa014660a860aa012660a860aa010660a860aa00e660a860aa00c660a860aa00a660a860aa008660a860aa006660a860aa004660a860aa002660a86080660a860aa60a46ea80312f5c060ac60ac00260aa00260a800260a600260a400260a200260a0002609e002609c002609a00260906ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c104cc154c15802ccc154c158028cc154c158024cc154c158020cc154c15801ccc154c158018cc154c158014cc154c158010cc154c15800ccc154c158008cc154c158004cc154c104cc154c158c14cdd5006a5eb80c15cc15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c120dd5001c56600266e1d2016001899191919191919191919191918211982b182b8061982b182b8059982b182b8051982b182b8049982b182b8041982b182b8039982b182b8031982b182b8029982b182b8021982b182b8019982b182b8011982b182b8009982b18211982b182b982a1baa00e4bd70182c182c000982b800982b000982a800982a000982980098290009828800982800098278009827000982680098241baa003899191919191919191919191918211982b182b8061982b182b8059982b182b8051982b182b8049982b182b8041982b182b8039982b182b8031982b182b8029982b182b8021982b182b8019982b182b8011982b182b8009982b182b982c0009982b18211982b182b982a1baa00e4bd7025eb80c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c120dd5001a08c41188231046208c41188231046208c4118823104618231baa0013049002400c8238dd718231823800991acc004c08400a2653001001a5eb82006800888966002607400312323304a374e002660946ea40092f5c065300100180252f5c080088896600200510018cc00400e609c0053304c304d002001400c825a246530010059982518258008024c05000e6eb8c12cc1300050051802800a0888b2082375c608c608e006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241111598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41108220dc4000c888c8cc124c00cdd698250009982498251825800a5eb80c00c0066608a6ea0cdc7000a40006608a6ea4cc040c03cdc6800800a5eb8122232329800919802919198269ba833794940dd718270009982698271827800a5eb816600260386e340062660986ea4c064004cc130dd49980d980d1b8d0010014bd704590481191801acc004c0fc006298103d87a80008981c998269ba80014bd70209230030019bad304b003911191acc006600260806eb4c13c00694294504a44cc02000c8c014c0eccc13cdd4000a5eb822601e600898103d87a800041286eb8c13cc140004cc134dd419b8e00148000cc134dd49980c180b9b8d0010014bd7024446b3001303f002898019181d19827000a5eb822b3001304400289801919ba548008cc1380052f5c1159800981c00144c00c8cdd2a40086609c00297ae08acc004c03400a26600e4646609e6ea0cde5250375c60a00026609e60a060a200297ae059800981c1b8d0018998271ba930230013304e37526605260506e340040052f5c1164128466e9520063304e375000297ae08acc004c03000a26600e4646609e6ea0cde5250375c60a00026609e60a060a200297ae059800981c1b8d0018998271ba930230013304e37526605260506e340040052f5c1164128466e9520083304e3750b3001337100029040400244006266e04004c0192020412897ae08acc004cdc3a40140051300323374a900519827000a5eb822b30013370e900600144cc0048cdd2a40186609c00297ae02323304f3750600c6eb4c140004cc13cc140c1440052f5c0646609e6ea0cde5250375c60a00026609e60a060a200297ae059800980f1b8d0018998271ba9301b0013304e37526603a60386e340040052f5c116412915980099b874803800a266002466e95200e3304e0014bd70119198279ba833794940dd718280009982798281828800a5eb8166002603c6e3400626609c6ea4c06c004cc138dd49980e980e1b8d0010014bd7045904a456600266e1d2010002899800919ba548040cc1380052f5c04646609e6ea0cde5250375c60a00026609e60a060a200297ae059800980f1b8d0018998271ba9301b0013304e37526603a60386e340040052f5c116412915980099b874804800a246464660a066e9520123305030510014bd701982818289829000a5eb80c004008cc0208c8cc140dd419bca4a06eb8c144004cc140c144c1480052f5c0b30013039371a00313304f375260480026609e6ea4cc0a8c0a4dc6800800a5eb822c8258966002608200314c103d87980008acc004c118006298103d87a80008acc004c0e8006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b2096412c825904b20968acc004cdc3a40280051300323374a900a19827000a5eb822b30013370e900b00144c00c8cdd2a402c6609c00297ae08acc004cdc3a403000513300123374a900c19827000a5eb808c8cc13cdd419bca4a06eb8c140004cc13cc140c1440052f5c0b3001301e371a00313304e375260360026609c6ea4cc074c070dc6800800a5eb822c82522c8249049209241248249049209241248249049209241248248dd718271827803096600266e2000520808080808080808080028800c4cdc0800980124100028230c00c00c6eb4c110004c8cc10cdd419b8e00148000cc10cdd49980718069b8d0010014bd701bae3043304400420728b206c371890011b80480051640ac6eb8c0c0c0c400566002600e6e3400626605c6ea4c008004cc0b8dd49980298021b8d0010014bd7045902a1bae301d302b37546602c4646b30013371e6eb8c0c000522104b9011a82008919191919191919911981c18121981c181c8039981c1ba90013303830390024bd701981c181c981d00125eb80d660026024003125980099b89002371a00313303737526601e0040026606e6ea66002005337026e3400400a002b8c25eb822c819a2c8190dd7181b981c0011bae3037004375a606c002646606a6ea0cde5250375c606c0026606a606c606e00297ae059800980f1b8d00189981a1ba930090013303437526601e601c6e340040052f5c11640c06eb8c0d0c0d4004d6600294624b30013371290201b8d0018998199ba93300b48100004cc0ccdd4cc005204099b80371a002901fc0057184bd7045902f45902e1bae30333034001300100259800a51892cc004cdc4a4100026e340062660626ea4cc0252080010013303137533001482000666e00dc6800a40ff0015c612f5c11640b51640b11640ac6eb8c0c0c0c400566002600e6e3400626605c6ea4c008004cc0b8dd49980298021b8d0010014bd7045902a1bae302e00a300348010c00d2008198010011813000a046899180118128019bae302300240846eb0c080c074dd5000c5901b19199119801001000912cc004006298103d87a80008992cc004cdd7802180f800c4c038cc088c0800052f5c11330030033024002407860440028100dd59810181098109810981098109810981098109810980e9baa0153374a90021980f19ba548008cc078c02cc070dd5180f980e1baa0014bd7025eb822c80d0c8cc004004dd61806980e1baa0142259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a514071100189980180198110012038325980099912cc00400a294226530013259800980b18109baa00189bad302230253756604a60446ea800629000204030240019baf302430250019bab003488966002003159800980100344cc01400d20008a5040891325980099baf30240014c010140008acc004cc018010dd6981298141bab3025001898019ba630290028a50408d1598009980300224001130030078a50408c8118c09c0050250ca60020033756602460426ea8c048c084dd5002488cc094008cc094dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c08c0066eacc09000660500069112cc004cdc8a441000038acc004cdc7a44100003899802980a998149ba60024bd70000c4cc015300103d87a8000006409519800803c006446600e0046605666ec0dd48029ba6004001401c8128604c00481222942294229410251ba633020337606ea401cdd31981019bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602e603a6ea8c084c078dd51810980f1baa300f301e3754003132598009806180f1baa0018992cc004c050c07cdd5000c4c8c8c8c8cc8966002605400713259800980d98131baa0018991919194c004dd69817000cdd718170024dd69817001cdd7181700124444b3001303300589980c9bab303200e225980080144cc06c030896600200513021330350144bd7044c8c8cc06cc0d00084c00cc0e4010dd7181a000981b0012068899191980c981980109801981b8021bae3031001303400240c91640c0302e001302d001302c00130273754003164094605200d16409c6eb8c09c004dd5981380118138009813000981280098101baa0018b203c3022301f37540031640746020603c6ea8c03cc078dd5000c5901c4530103d87a80004070604000280f08966002602060366ea800a2646464b30013023002899803181100189980300080245902018108009810800980e1baa0028b203422598009807980d1baa00289919192cc004c08800a26464b300130140018acc004c080dd5001401a2c810a2b30013019001899192cc004c09800a01116408c6eb4c090004c080dd50014566002601a00315980098101baa00280345902145901e203c4078603c6ea8004c08400e2c80f8c966002603c0031598009805180e800c5a2602e603a00280e22c80f8dd518100009810000980d9baa0028b203222c805860126ea800e2c8038601000260066ea802629344d9590011", + "hash": "c307eaab0ec4dd2f1d98749e9ae251353d37422856f6d2b4d2ed4ed1" }, { "title": "close_position.close_position.else", @@ -49,8 +49,8 @@ } } ], - "compiledCode": "591639010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a4602260246024602460246024003230113012301230120014889660026466446600400400244b30010018a508acc004cdc79bae30160010038a51899801001180b800a02240506eb0c050c054c054c054c054c054c054c054c054c044dd50049bae30023010375400715980099b8848000dd69809cc0048c050c0540066e1d20049b89480124464b30013371e91100375c602c602e003130160018b202230020019119198008008019119801800980100148c050c054c0540066eb8c04cc040dd500bcdd2a400091111111191919912cc004c08000a264b30013011301c375400313232598009809980f1baa0018992cc004c050c07cdd5000c4c966002602a60406ea8006266046604860426ea8008cc08cc090c084dd5000a5eb822c80f8c048c080dd5001c5901e1811180f9baa0018b203a300e301e37540026040603a6ea80062c80d8c8cc004004dd61804180e9baa30200032259800800c530103d87a80008992cc004cdc39bad3022301f375400200913008330210014bd7044cc00c00cc08c00901d1810800a03e8b203a32598009807980d1baa0018992cc004c040c06cdd5000c4c8cc0240048966002005132330010010042259800800c52f5c113302398009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301723235980099b8f375c605e0029110475d3c793008cc004888c8cc00cdd698198009bae3033303400130030019b89480426e3120109b804803e600e90082444446600a4646606a6ea0cde5250375c606c0026606a606c606e00297ae05980098029b8d00189981a1ba930020013303437526600860066e340040052f5c11640c0466446601046606e6ea0cdc7000a40006606e6ea4cc00cc008dc6800800a5eb808cc0248cc0e0dd419b8e00148000cc0e0dd49980218019b8d0010014bd701119191981d98111981d9ba80083303b375000a66076607800297ae03303b303c303d0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605c00312323303e374e0026607c6ea40092f5c065300100180252f5c080088896600200510018cc00400e6084005330403041002001400c81fa246530010059981f181f8008024c02400e6eb8c0fcc1000050054c004c8cc0f8dd419bca4a06eb8c0fc004cc0f8c0fcc1000052f5c0b30013017371a00313303d375260240026607a6ea4cc054c050dc6800800a5eb822c81ca446607e0046607e6ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11800a60586608a608c0106608a98103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a8000330454c103d87a80004bd70200222259800801440063300100398248014c8c966002607600313230313304a304b0013304a30313304a304b3048375400697ae0304c304c001304737540071598009820000c4c8c8c0c8cc12cc130008cc12cc130004cc12cc0c8cc12cc130c124dd500225eb80c134c134004c130004c11cdd5001c566002606c003132323230333304c304d0033304c304d0023304c304d0013304c30333304c304d304a375400a97ae0304e304e001304d001304c001304737540071598009805000c4c8c8c8c8c0d0cc134c138010cc134c13800ccc134c138008cc134c138004cc134c0d0cc134c138c12cdd500325eb80c13cc13c004c138004c134004c130004c11cdd5001c56600260120031323232323230353304e304f0053304e304f0043304e304f0033304e304f0023304e304f0013304e30353304e304f304c375400e97ae030503050001304f001304e001304d001304c0013047375400715980099b87480280062646464646464606c6609e60a000c6609e60a000a6609e60a00086609e60a00066609e60a00046609e60a00026609e606c6609e60a0609a6ea80212f5c060a260a200260a0002609e002609c002609a0026098002608e6ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0dccc140c14401ccc140c144018cc140c144014cc140c144010cc140c14400ccc140c144008cc140c144004cc140c0dccc140c144c138dd5004a5eb80c148c148004c144004c140004c13c004c138004c134004c130004c11cdd5001c56600266e1d200e00189919191919191919181c19828982900419828982900399828982900319828982900299828982900219828982900199828982900119828982900099828981c19828982918279baa00a4bd7018299829800982900098288009828000982780098270009826800982600098239baa0038acc004cdc3a4020003132323232323232323230393305230530093305230530083305230530073305230530063305230530053305230530043305230530033305230530023305230530013305230393305230533050375401697ae0305430540013053001305200130510013050001304f001304e001304d001304c0013047375400715980099b87480480062646464646464646464646074660a660a8014660a660a8012660a660a8010660a660a800e660a660a800c660a660a800a660a660a8008660a660a8006660a660a8004660a660a8002660a66074660a660a860a26ea80312f5c060aa60aa00260a800260a600260a400260a200260a0002609e002609c002609a0026098002608e6ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c0eccc150c15402ccc150c154028cc150c154024cc150c154020cc150c15401ccc150c154018cc150c154014cc150c154010cc150c15400ccc150c154008cc150c154004cc150c0eccc150c154c148dd5006a5eb80c158c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c11cdd5001c56600266e1d20160018991919191919191919191919181e1982a982b0061982a982b0059982a982b0051982a982b0049982a982b0041982a982b0039982a982b0031982a982b0029982a982b0021982a982b0019982a982b0011982a982b0009982a981e1982a982b18299baa00e4bd70182b982b800982b000982a800982a0009829800982900098288009828000982780098270009826800982600098239baa0038991919191919191919191919181e1982a982b0061982a982b0059982a982b0051982a982b0049982a982b0041982a982b0039982a982b0031982a982b0029982a982b0021982a982b0019982a982b0011982a982b0009982a982b182b8009982a981e1982a982b18299baa00e4bd7025eb80c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c130004c11cdd5001a08a41148229045208a41148229045208a4114822904518229baa0013048002400c8230dd718229823000991acc004c08400a2653001001a5eb820068008889660026072003123233049374e002660926ea40092f5c065300100180252f5c080088896600200510018cc00400e609a0053304b304c002001400c8252246530010059982498250008024c05000e6eb8c128c12c0050051802800a0868b2080375c608a608c006530012232598009800a40211598009800a4001148002266e39220108010204081020408000002410d1598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f410c8218dc4000c888c8cc120c00cdd698248009982418249825000a5eb80c00c006660886ea0cdc7000a4000660886ea4cc040c03cdc6800800a5eb8122232329800919802919198261ba833794940dd718268009982618269827000a5eb816600260386e340062660966ea4c064004cc12cdd49980d980d1b8d0010014bd704590471191801acc004c0f8006298103d87a800089819998261ba80014bd70209030030019bad304a003911191acc0066002607e6eb4c13800694294504944cc02000c8c014c0d4cc138dd4000a5eb822601e600898103d87a800041246eb8c138c13c004cc130dd419b8e00148000cc130dd49980c180b9b8d0010014bd7024446b3001303e002898019181a19826800a5eb822b3001304300289801919ba548008cc1340052f5c1159800981c80144c00c8cdd2a40086609a00297ae08acc004c03400a26600e4646609c6ea0cde5250375c609e0026609c609e60a000297ae059800981c9b8d0018998269ba930230013304d37526605260506e340040052f5c1164124466e9520063304d375000297ae08acc004c03000a26600e4646609c6ea0cde5250375c609e0026609c609e60a000297ae059800981c9b8d0018998269ba930230013304d37526605260506e340040052f5c1164124466e9520083304d3750b3001337100029040400244006266e04004c0192020412497ae08acc004cdc3a40140051300323374a900519826800a5eb822b30013370e900600144cc0048cdd2a40186609a00297ae02323304e3750600c6eb4c13c004cc138c13cc1400052f5c0646609c6ea0cde5250375c609e0026609c609e60a000297ae059800980f1b8d0018998269ba9301b0013304d37526603a60386e340040052f5c116412515980099b874803800a266002466e95200e3304d0014bd70119198271ba833794940dd718278009982718279828000a5eb8166002603c6e3400626609a6ea4c06c004cc134dd49980e980e1b8d0010014bd70459049456600266e1d2010002899800919ba548040cc1340052f5c04646609c6ea0cde5250375c609e0026609c609e60a000297ae059800980f1b8d0018998269ba9301b0013304d37526603a60386e340040052f5c116412515980099b874804800a2464646609e66e9520123304f30500014bd701982798281828800a5eb80c004008cc0208c8cc13cdd419bca4a06eb8c140004cc13cc140c1440052f5c0b3001303a371a00313304e375260480026609c6ea4cc0a8c0a4dc6800800a5eb822c8250966002608000314c103d87980008acc004c114006298103d87a80008acc004c0ec006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b20944128825104a20948acc004cdc3a40280051300323374a900a19826800a5eb822b30013370e900b00144c00c8cdd2a402c6609a00297ae08acc004cdc3a403000513300123374a900c19826800a5eb808c8cc138dd419bca4a06eb8c13c004cc138c13cc1400052f5c0b3001301e371a00313304d375260360026609a6ea4cc074c070dc6800800a5eb822c824a2c8241048209041208241048209041208241048209041208240dd718269827003096600266e2000520808080808080808080028800c4cdc0800980124100028228c00c00c6eb4c10c004c8cc108dd419b8e00148000cc108dd49980718069b8d0010014bd701bae3042304300420708b206a371890011b80480051640a86eb8c0bcc0c000566002600e6e3400626605a6ea4c008004cc0b4dd49980298021b8d0010014bd704590291bae3015302a37546602e4646b30013371e6eb8c0bc00522104b9011a82008919191919191919911981b980f1981b981c0039981b9ba90013303730380024bd701981b981c181c80125eb80d660026024003125980099b89002371a00313303637526601e0040026606c6ea66002005337026e3400400a002b8c25eb822c81922c8188dd7181b181b8011bae3036004375a606a00264660686ea0cde5250375c606a00266068606a606c00297ae059800980f9b8d0018998199ba930090013303337526601e601c6e340040052f5c11640bc6eb8c0ccc0d0004d6600294624b30013371290201b8d0018998191ba93300b48100004cc0c8dd4cc005204099b80371a002901fc0057184bd7045902e45902d1bae30323033001300100259800a51892cc004cdc4a4100026e340062660606ea4cc0252080010013303037533001482000666e00dc6800a40ff0015c612f5c11640b11640ad1640a86eb8c0bcc0c000566002600e6e3400626605a6ea4c008004cc0b4dd49980298021b8d0010014bd704590291bae302d00a300348010c00d2008198010011812800a044899180118120019bae302200240806eb0c07cc070dd5000c5901a19199119801001000912cc004006298103d87a80008992cc004cdd7802180f000c4c020cc084c07c0052f5c113300300330230024074604200280f8dd5980f981018101810181018101810181018101810180e1baa0143374a90021980e99ba548008cc074c030c06cdd5180f180d9baa0014bd7025eb822c80c8c8cc004004dd61805980d9baa0132259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a51406d100189980180198108012036325980099912cc00400a294226530013259800980a98101baa00189bad302130243756604860426ea800629000203e30230019baf302330240019bab003488966002003159800980100344cc01400d20008a5040851325980099baf30230014c010140008acc004cc018010dd6981218139bab3024001898019ba630280028a5040891598009980300224001130030078a5040888110c0980050240ca60020033756602060406ea8c040c080dd5002488cc090008cc090dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0880066eacc08c006604e0069112cc004cdc8a441000038acc004cdc7a441000038998029807998141ba60024bd70000c4cc015300103d87a8000006409119800803c006446600e0046605466ec0dd48029ba6004001401c8120604a004811a2942294229410241ba63301f337606ea401cdd31980f99bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602c60386ea8c080c074dd51810180e9baa300d301d3754003132598009806980e9baa0018992cc004c04cc078dd5000c4c8c8c8c8cc8966002605200713259800980d18129baa0018991919194c004dd69816800cdd718168024dd69816801cdd7181680124444b3001303200589980d1bab303100e225980080144cc07003089660020051301b330340144bd7044c8c8cc06cc0cc0084c00cc0e0010dd71819800981a8012066899191980c981900109801981b0021bae3030001303300240c51640bc302d001302c001302b00130263754003164090605000d1640986eb8c098004dd59813001181300098128009812000980f9baa0018b203a3021301e37540031640706010603a6ea8c034c074dd5000c5901b4530103d87a8000406c603e00280e8dd69805180d1baa02122598009807980d1baa00289919192cc004c08800a26600c604200626600c00200916407c6040002604000260366ea800a2c80c88966002601c60326ea800a2646464b30013021002899192cc004c04c0062b3001301f37540050068b20408acc004c06000626464b300130250028044590221bad3023001301f37540051598009807000c566002603e6ea800a00d16408116407480e901d180e9baa00130200038b203c3259800980e800c56600260166038003168980b180e000a0368b203c3754603e002603e00260346ea800a2c80c113371090001bad30013010375400714a08072294100e22c805860126ea800e2c8038601000260066ea802629344d95900101", - "hash": "680f54d991e4d10708b4670d087cd18e072082ab46eea7cdc544e912" + "compiledCode": "5916f7010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a46022602460240032301130120019180898091809180918091809000c8c044c048c048c0480066e9520004888888c8c9660026466446600400400244b30010018a508acc004cdc79bae301b0010038a51899801001180e000a02c40646eb0c064c068c068c068c068c068c068c068c068c058dd50071bae30053015375401115980099b884800000a266e212000375a6008602a6ea802229410134528202698009802980a1baa0079bad301730183018301830183014375400f375a600c60286ea801e6eb4c00cc050dd5003a444464b3001300d301837540031301c3019375400316405c64b3001300d0028a60103d87a80008acc004cdc400124001130073301b30073301b375066e0520000013301b375066e0520000024bd7025eb822600e66036600e660366ea0004cc06cdd400125eb812f5c080b901719b8233704006004b3001300c3017375400913370200a00313370200200a80b06eb4c05a60026e1d20049b89480124464b30013371e910100375c60326034003130190018b20283002001911919800800801911980180098010014dd7180b18099baa01a9bad3004301337540349111111919192cc004c080006264b30013011301c375400313232598009809980f1baa0018992cc004c050c07cdd5000c4c966002602a60406ea8006266046604860426ea8008cc08cc090c084dd5000a5eb822c80f8c040c080dd5001c5901e1811180f9baa0018b203a300f301e37540026040603a6ea80062c80d8c8cc004004dd61807980e9baa30200022259800800c530103d87a80008992cc004cdc39bad3022301f375400200f1300d330210014bd7044cc00c00cc08c00901d1810800a03e8b203a32598009808180d9baa0018992cc004c044c070dd5000c4c8cc0200048966002005132330010010042259800800c52f5c113302498009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301623235980099b8f375c60600029110475d3c793008cc004888c8cc00cdd6981a0009bae3034303500130030019b89480426e3120109b804803e600e90082444446600a4646606c6ea0cde5250375c606e0026606c606e607000297ae05980098029b8d00189981a9ba930020013303537526600860066e340040052f5c11640c446644660104660706ea0cdc7000a4000660706ea4cc00cc008dc6800800a5eb808cc0248cc0e4dd419b8e00148000cc0e4dd49980218019b8d0010014bd701119191981e18141981e1ba80083303c375000a66078607a00297ae03303c303d303e0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605e00312323303f374e0026607e6ea40092f5c065300100180252f5c080088896600200510018cc00400e6086005330413042002001400c8202246530010059981f98200008024c02400e6eb8c100c1040050054c004c8cc0fcdd419bca4a06eb8c100004cc0fcc100c1040052f5c0b30013017371a00313303e375260240026607c6ea4cc054c050dc6800800a5eb822c81d24466080004660806ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11c00a60646608c608e0106608c98103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a80004bd70200222259800801440063300100398250014c8c966002607800313230373304b304c0013304b30373304b304c3049375400697ae0304d304d001304837540071598009820800c4c8c8c0e0cc130c134008cc130c134004cc130c0e0cc130c134c128dd500225eb80c138c138004c134004c120dd5001c566002606a003132323230393304d304e0033304d304e0023304d304e0013304d30393304d304e304b375400a97ae0304f304f001304e001304d001304837540071598009805000c4c8c8c8c8c0e8cc138c13c010cc138c13c00ccc138c13c008cc138c13c004cc138c0e8cc138c13cc130dd500325eb80c140c140004c13c004c138004c134004c120dd5001c566002601200313232323232303b3304f30500053304f30500043304f30500033304f30500023304f30500013304f303b3304f3050304d375400e97ae0305130510013050001304f001304e001304d0013048375400715980099b874802800626464646464646078660a060a200c660a060a200a660a060a2008660a060a2006660a060a2004660a060a2002660a06078660a060a2609c6ea80212f5c060a460a400260a200260a0002609e002609c002609a00260906ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0f4cc144c14801ccc144c148018cc144c148014cc144c148010cc144c14800ccc144c148008cc144c148004cc144c0f4cc144c148c13cdd5004a5eb80c14cc14c004c148004c144004c140004c13c004c138004c134004c120dd5001c56600266e1d200e00189919191919191919181f19829182980419829182980399829182980319829182980299829182980219829182980199829182980119829182980099829181f19829182998281baa00a4bd70182a182a000982980098290009828800982800098278009827000982680098241baa0038acc004cdc3a40200031323232323232323232303f33053305400933053305400833053305400733053305400633053305400533053305400433053305400333053305400233053305400133053303f3305330543051375401697ae03055305500130540013053001305200130510013050001304f001304e001304d0013048375400715980099b87480480062646464646464646464646080660a860aa014660a860aa012660a860aa010660a860aa00e660a860aa00c660a860aa00a660a860aa008660a860aa006660a860aa004660a860aa002660a86080660a860aa60a46ea80312f5c060ac60ac00260aa00260a800260a600260a400260a200260a0002609e002609c002609a00260906ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c104cc154c15802ccc154c158028cc154c158024cc154c158020cc154c15801ccc154c158018cc154c158014cc154c158010cc154c15800ccc154c158008cc154c158004cc154c104cc154c158c14cdd5006a5eb80c15cc15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c120dd5001c56600266e1d2016001899191919191919191919191918211982b182b8061982b182b8059982b182b8051982b182b8049982b182b8041982b182b8039982b182b8031982b182b8029982b182b8021982b182b8019982b182b8011982b182b8009982b18211982b182b982a1baa00e4bd70182c182c000982b800982b000982a800982a000982980098290009828800982800098278009827000982680098241baa003899191919191919191919191918211982b182b8061982b182b8059982b182b8051982b182b8049982b182b8041982b182b8039982b182b8031982b182b8029982b182b8021982b182b8019982b182b8011982b182b8009982b182b982c0009982b18211982b182b982a1baa00e4bd7025eb80c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c120dd5001a08c41188231046208c41188231046208c4118823104618231baa0013049002400c8238dd718231823800991acc004c08400a2653001001a5eb82006800888966002607400312323304a374e002660946ea40092f5c065300100180252f5c080088896600200510018cc00400e609c0053304c304d002001400c825a246530010059982518258008024c05000e6eb8c12cc1300050051802800a0888b2082375c608c608e006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241111598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41108220dc4000c888c8cc124c00cdd698250009982498251825800a5eb80c00c0066608a6ea0cdc7000a40006608a6ea4cc040c03cdc6800800a5eb8122232329800919802919198269ba833794940dd718270009982698271827800a5eb816600260386e340062660986ea4c064004cc130dd49980d980d1b8d0010014bd704590481191801acc004c0fc006298103d87a80008981c998269ba80014bd70209230030019bad304b003911191acc006600260806eb4c13c00694294504a44cc02000c8c014c0eccc13cdd4000a5eb822601e600898103d87a800041286eb8c13cc140004cc134dd419b8e00148000cc134dd49980c180b9b8d0010014bd7024446b3001303f002898019181d19827000a5eb822b3001304400289801919ba548008cc1380052f5c1159800981c00144c00c8cdd2a40086609c00297ae08acc004c03400a26600e4646609e6ea0cde5250375c60a00026609e60a060a200297ae059800981c1b8d0018998271ba930230013304e37526605260506e340040052f5c1164128466e9520063304e375000297ae08acc004c03000a26600e4646609e6ea0cde5250375c60a00026609e60a060a200297ae059800981c1b8d0018998271ba930230013304e37526605260506e340040052f5c1164128466e9520083304e3750b3001337100029040400244006266e04004c0192020412897ae08acc004cdc3a40140051300323374a900519827000a5eb822b30013370e900600144cc0048cdd2a40186609c00297ae02323304f3750600c6eb4c140004cc13cc140c1440052f5c0646609e6ea0cde5250375c60a00026609e60a060a200297ae059800980f1b8d0018998271ba9301b0013304e37526603a60386e340040052f5c116412915980099b874803800a266002466e95200e3304e0014bd70119198279ba833794940dd718280009982798281828800a5eb8166002603c6e3400626609c6ea4c06c004cc138dd49980e980e1b8d0010014bd7045904a456600266e1d2010002899800919ba548040cc1380052f5c04646609e6ea0cde5250375c60a00026609e60a060a200297ae059800980f1b8d0018998271ba9301b0013304e37526603a60386e340040052f5c116412915980099b874804800a246464660a066e9520123305030510014bd701982818289829000a5eb80c004008cc0208c8cc140dd419bca4a06eb8c144004cc140c144c1480052f5c0b30013039371a00313304f375260480026609e6ea4cc0a8c0a4dc6800800a5eb822c8258966002608200314c103d87980008acc004c118006298103d87a80008acc004c0e8006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b2096412c825904b20968acc004cdc3a40280051300323374a900a19827000a5eb822b30013370e900b00144c00c8cdd2a402c6609c00297ae08acc004cdc3a403000513300123374a900c19827000a5eb808c8cc13cdd419bca4a06eb8c140004cc13cc140c1440052f5c0b3001301e371a00313304e375260360026609c6ea4cc074c070dc6800800a5eb822c82522c8249049209241248249049209241248249049209241248248dd718271827803096600266e2000520808080808080808080028800c4cdc0800980124100028230c00c00c6eb4c110004c8cc10cdd419b8e00148000cc10cdd49980718069b8d0010014bd701bae3043304400420728b206c371890011b80480051640ac6eb8c0c0c0c400566002600e6e3400626605c6ea4c008004cc0b8dd49980298021b8d0010014bd7045902a1bae301d302b37546602c4646b30013371e6eb8c0c000522104b9011a82008919191919191919911981c18121981c181c8039981c1ba90013303830390024bd701981c181c981d00125eb80d660026024003125980099b89002371a00313303737526601e0040026606e6ea66002005337026e3400400a002b8c25eb822c819a2c8190dd7181b981c0011bae3037004375a606c002646606a6ea0cde5250375c606c0026606a606c606e00297ae059800980f1b8d00189981a1ba930090013303437526601e601c6e340040052f5c11640c06eb8c0d0c0d4004d6600294624b30013371290201b8d0018998199ba93300b48100004cc0ccdd4cc005204099b80371a002901fc0057184bd7045902f45902e1bae30333034001300100259800a51892cc004cdc4a4100026e340062660626ea4cc0252080010013303137533001482000666e00dc6800a40ff0015c612f5c11640b51640b11640ac6eb8c0c0c0c400566002600e6e3400626605c6ea4c008004cc0b8dd49980298021b8d0010014bd7045902a1bae302e00a300348010c00d2008198010011813000a046899180118128019bae302300240846eb0c080c074dd5000c5901b19199119801001000912cc004006298103d87a80008992cc004cdd7802180f800c4c038cc088c0800052f5c11330030033024002407860440028100dd59810181098109810981098109810981098109810980e9baa0153374a90021980f19ba548008cc078c02cc070dd5180f980e1baa0014bd7025eb822c80d0c8cc004004dd61806980e1baa0142259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a514071100189980180198110012038325980099912cc00400a294226530013259800980b18109baa00189bad302230253756604a60446ea800629000204030240019baf302430250019bab003488966002003159800980100344cc01400d20008a5040891325980099baf30240014c010140008acc004cc018010dd6981298141bab3025001898019ba630290028a50408d1598009980300224001130030078a50408c8118c09c0050250ca60020033756602460426ea8c048c084dd5002488cc094008cc094dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c08c0066eacc09000660500069112cc004cdc8a441000038acc004cdc7a44100003899802980a998149ba60024bd70000c4cc015300103d87a8000006409519800803c006446600e0046605666ec0dd48029ba6004001401c8128604c00481222942294229410251ba633020337606ea401cdd31981019bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602e603a6ea8c084c078dd51810980f1baa300f301e3754003132598009806180f1baa0018992cc004c050c07cdd5000c4c8c8c8c8cc8966002605400713259800980d98131baa0018991919194c004dd69817000cdd718170024dd69817001cdd7181700124444b3001303300589980c9bab303200e225980080144cc06c030896600200513021330350144bd7044c8c8cc06cc0d00084c00cc0e4010dd7181a000981b0012068899191980c981980109801981b8021bae3031001303400240c91640c0302e001302d001302c00130273754003164094605200d16409c6eb8c09c004dd5981380118138009813000981280098101baa0018b203c3022301f37540031640746020603c6ea8c03cc078dd5000c5901c4530103d87a80004070604000280f08966002602060366ea800a2646464b30013023002899803181100189980300080245902018108009810800980e1baa0028b203422598009807980d1baa00289919192cc004c08800a26464b300130140018acc004c080dd5001401a2c810a2b30013019001899192cc004c09800a01116408c6eb4c090004c080dd50014566002601a00315980098101baa00280345902145901e203c4078603c6ea8004c08400e2c80f8c966002603c0031598009805180e800c5a2602e603a00280e22c80f8dd518100009810000980d9baa0028b203222c805860126ea800e2c8038601000260066ea802629344d9590011", + "hash": "c307eaab0ec4dd2f1d98749e9ae251353d37422856f6d2b4d2ed4ed1" }, { "title": "liquidate.liquidate.spend", @@ -74,8 +74,8 @@ } } ], - "compiledCode": "5917ae010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a460226024602400323011301200191808980918091809000c8c044c048c048c048c0480066e9520004888888c8cc89660026014602a6ea800a266ebccc88cc896600266e20008006298103d87980008acc004cdc40008014530103d87b80008a6103d87a8000406080c0cdc11bad301b002375a6036603800266e08dd6980d8009bad301b301c002301637546644600c660346ea0cdc11bad301b002375a6036002660346ea0cdc11bad301b301c002375a6036603800297ae030163754664466446010660386ea0cdc019b82375a603a00800266e08dd6980e8018011980e1ba83370400400297ae0375a603660380046eb4c06cc070004c058dd518009bad300530163754012602c6eaa6002600e602c6ea80266eb4c014c058dd5004cdd69804180b1baa0099bad300630163754013375a60333001370e90024dc4a400922325980099b8f488100375c6038603a0031301c0018b202e3002001911919800800801911980180098010014dd7180c980b1baa01d9bad30073016375403a9111111919192cc004c08c006264b30013014301f37540031323259800980b18109baa0018992cc004c05cc088dd5000c4c966002603060466ea800626604c604e60486ea8008cc098c09cc090dd5000a5eb822c8110c098c09cc09cc09cc09cc09cc08cdd5001c59021181298111baa0018b2040301230213754002604660406ea80062c80f0c8cc004004dd6180918101baa30230022259800800c530103d87a80008992cc004cdc39bad30253022375400200f13010330240014bd7044cc00c00cc0980090201812000a0448b204032598009809980f1baa0018992cc004c050c07cdd5000c4c8cc0200048966002005132330010010042259800800c52f5c113302798009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301623235980099b8f375c60660029110475d3c793008cc004888c8cc00cdd6981b8009bae3037303800130030019b89480426e3120109b804803e600e90082444446600a464660726ea0cde5250375c6074002660726074607600297ae05980098029b8d00189981c1ba930020013303837526600860066e340040052f5c11640d046644660104660766ea0cdc7000a4000660766ea4cc00cc008dc6800800a5eb808cc0248cc0f0dd419b8e00148000cc0f0dd49980218019b8d0010014bd701119191981f98159981f9ba80083303f375000a6607e608000297ae03303f304030410014bd7018008012cc004c05800a2653001001a5eb820068008889660026064003123233042374e002660846ea40092f5c065300100180252f5c080088896600200510018cc00400e608c005330443045002001400c821a246530010059982118218008024c02400e6eb8c10cc1100050054c004c8cc108dd419bca4a06eb8c10c004cc108c10cc1100052f5c0b30013017371a00313304137526024002660826ea4cc054c050dc6800800a5eb822c81ea4466086004660866ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c12800a606a6609260940106609298103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a80004bd70200222259800801440063300100398268014c8c966002607e003132303a3304e304f0013304e303a3304e304f304c375400697ae030503050001304b37540071598009822000c4c8c8c0eccc13cc140008cc13cc140004cc13cc0eccc13cc140c134dd500225eb80c144c144004c140004c12cdd5001c566002606a0031323232303c33050305100333050305100233050305100133050303c330503051304e375400a97ae03052305200130510013050001304b37540071598009805000c4c8c8c8c8c0f4cc144c148010cc144c14800ccc144c148008cc144c148004cc144c0f4cc144c148c13cdd500325eb80c14cc14c004c148004c144004c140004c12cdd5001c566002601200313232323232303e33052305300533052305300433052305300333052305300233052305300133052303e3305230533050375400e97ae0305430540013053001305200130510013050001304b375400715980099b87480280062646464646464607e660a660a800c660a660a800a660a660a8008660a660a8006660a660a8004660a660a8002660a6607e660a660a860a26ea80212f5c060aa60aa00260a800260a600260a400260a200260a000260966ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c100cc150c15401ccc150c154018cc150c154014cc150c154010cc150c15400ccc150c154008cc150c154004cc150c100cc150c154c148dd5004a5eb80c158c158004c154004c150004c14c004c148004c144004c140004c12cdd5001c56600266e1d200e0018991919191919191918209982a982b0041982a982b0039982a982b0031982a982b0029982a982b0021982a982b0019982a982b0011982a982b0009982a98209982a982b18299baa00a4bd70182b982b800982b000982a800982a000982980098290009828800982800098259baa0038acc004cdc3a4020003132323232323232323230423305630570093305630570083305630570073305630570063305630570053305630570043305630570033305630570023305630570013305630423305630573054375401697ae03058305800130570013056001305500130540013053001305200130510013050001304b375400715980099b87480480062646464646464646464646086660ae60b0014660ae60b0012660ae60b0010660ae60b000e660ae60b000c660ae60b000a660ae60b0008660ae60b0006660ae60b0004660ae60b0002660ae6086660ae60b060aa6ea80312f5c060b260b200260b000260ae00260ac00260aa00260a800260a600260a400260a200260a000260966ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c110cc160c16402ccc160c164028cc160c164024cc160c164020cc160c16401ccc160c164018cc160c164014cc160c164010cc160c16400ccc160c164008cc160c164004cc160c110cc160c164c158dd5006a5eb80c168c168004c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c12cdd5001c56600266e1d2016001899191919191919191919191918229982c982d0061982c982d0059982c982d0051982c982d0049982c982d0041982c982d0039982c982d0031982c982d0029982c982d0021982c982d0019982c982d0011982c982d0009982c98229982c982d182b9baa00e4bd70182d982d800982d000982c800982c000982b800982b000982a800982a000982980098290009828800982800098259baa003899191919191919191919191918229982c982d0061982c982d0059982c982d0051982c982d0049982c982d0041982c982d0039982c982d0031982c982d0029982c982d0021982c982d0019982c982d0011982c982d0009982c982d182d8009982c98229982c982d182b9baa00e4bd7025eb80c168004c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c12cdd5001a0924124824904920924124824904920924124824904918249baa001304c002400c8250dd718249825000991acc004c08400a2653001001a5eb82006800888966002607a00312323304d374e0026609a6ea40092f5c065300100180252f5c080088896600200510018cc00400e60a20053304f3050002001400c8272246530010059982698270008024c05000e6eb8c138c13c0050051802800a08e8b2088375c60926094006530012232598009800a40211598009800a4001148002266e39220108010204081020408000002411d1598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f411c8238dc4000c888c8cc130c00cdd698268009982618269827000a5eb80c00c006660906ea0cdc7000a4000660906ea4cc040c03cdc6800800a5eb8122232329800919802919198281ba833794940dd718288009982818289829000a5eb816600260386e3400626609e6ea4c064004cc13cdd49980d980d1b8d0010014bd7045904b1191801acc004c108006298103d87a80008981e198281ba80014bd70209830030019bad304e003911191acc006600260866eb4c14800694294504d44cc02000c8c014c0f8cc148dd4000a5eb822601e600898103d87a800041346eb8c148c14c004cc140dd419b8e00148000cc140dd49980c180b9b8d0010014bd7024446b30013042002898019181e99828800a5eb822b3001304700289801919ba548008cc1440052f5c1159800981c00144c00c8cdd2a4008660a200297ae08acc004c03400a26600e464660a46ea0cde5250375c60a6002660a460a660a800297ae059800981c1b8d0018998289ba930230013305137526605260506e340040052f5c1164134466e95200633051375000297ae08acc004c03000a26600e464660a46ea0cde5250375c60a6002660a460a660a800297ae059800981c1b8d0018998289ba930230013305137526605260506e340040052f5c1164134466e952008330513750b3001337100029040400244006266e04004c0192020413497ae08acc004cdc3a40140051300323374a900519828800a5eb822b30013370e900600144cc0048cdd2a4018660a200297ae0232330523750600c6eb4c14c004cc148c14cc1500052f5c064660a46ea0cde5250375c60a6002660a460a660a800297ae059800980f1b8d0018998289ba9301b0013305137526603a60386e340040052f5c116413515980099b874803800a266002466e95200e330510014bd70119198291ba833794940dd71829800998291829982a000a5eb8166002603c6e340062660a26ea4c06c004cc144dd49980e980e1b8d0010014bd7045904d456600266e1d2010002899800919ba548040cc1440052f5c0464660a46ea0cde5250375c60a6002660a460a660a800297ae059800980f1b8d0018998289ba9301b0013305137526603a60386e340040052f5c116413515980099b874804800a246464660a666e9520123305330540014bd7019829982a182a800a5eb80c004008cc0208c8cc14cdd419bca4a06eb8c150004cc14cc150c1540052f5c0b30013039371a00313305237526048002660a46ea4cc0a8c0a4dc6800800a5eb822c8270966002608800314c103d87980008acc004c124006298103d87a80008acc004c0e8006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b209c4138827104e209c8acc004cdc3a40280051300323374a900a19828800a5eb822b30013370e900b00144c00c8cdd2a402c660a200297ae08acc004cdc3a403000513300123374a900c19828800a5eb808c8cc148dd419bca4a06eb8c14c004cc148c14cc1500052f5c0b3001301e371a00313305137526036002660a26ea4cc074c070dc6800800a5eb822c826a2c826104c20984130826104c20984130826104c209841308260dd718289829003096600266e2000520808080808080808080028800c4cdc0800980124100028248c00c00c6eb4c11c004c8cc118dd419b8e00148000cc118dd49980718069b8d0010014bd701bae3046304700420788b2072371890011b80480051640b86eb8c0ccc0d000566002600e6e340062660626ea4c008004cc0c4dd49980298021b8d0010014bd7045902d1bae3020302e37546602c4646b30013371e6eb8c0cc00522104b9011a82008919191919191919911981d98139981d981e0039981d9ba90013303b303c0024bd701981d981e181e80125eb80d660026024003125980099b89002371a00313303a37526601e004002660746ea66002005337026e3400400a002b8c25eb822c81b22c81a8dd7181d181d8011bae303a004375a607200264660706ea0cde5250375c6072002660706072607400297ae059800980f1b8d00189981b9ba930090013303737526601e601c6e340040052f5c11640cc6eb8c0dcc0e0004d6600294624b30013371290201b8d00189981b1ba93300b48100004cc0d8dd4cc005204099b80371a002901fc0057184bd704590324590311bae30363037001300100259800a51892cc004cdc4a4100026e340062660686ea4cc0252080010013303437533001482000666e00dc6800a40ff0015c612f5c11640c11640bd1640b86eb8c0ccc0d000566002600e6e340062660626ea4c008004cc0c4dd49980298021b8d0010014bd7045902d1bae303100a300348010c00d2008198010011814800a04c899180118140019bae302600240906eb0c08cc080dd5000c5901e19199119801001000912cc004006298103d87a80008992cc004cdd78021811000c4c044cc094c08c0052f5c113300300330270024084604a0028118dd5981198121812181218121812181218121812181218101baa0183374a90021981099ba548008cc084c03cc07cdd51811180f9baa0014bd7025eb822c80e8c8cc004004dd61808180f9baa0172259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a51407d10018998018019812801203e325980099912cc00400a294226530013259800980c98121baa00189bad3025302837566050604a6ea800629000204630270019baf302730280019bab003488966002003159800980100344cc01400d20008a5040951325980099baf30270014c010140008acc004cc018010dd6981418159bab3028001898019ba6302c0028a5040991598009980300224001130030078a5040988130c0a80050280ca60020033756602a60486ea8c054c090dd5002488cc0a0008cc0a0dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0980066eacc09c00660560069112cc004cdc8a441000038acc004cdc7a44100003899802980c198161ba60024bd70000c4cc015300103d87a800000640a119800803c006446600e0046605c66ec0dd48029ba6004001401c81406052004813a2942294229410281ba633023337606ea401cdd31981199bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002603460406ea8c090c084dd5181218109baa30123021375400313259800980618109baa0018992cc004c05cc088dd5000c4c8c8c8c8cc8966002605a00713259800980f18149baa0018991919194c004dd69818800cdd718188024dd69818801cdd7181880124444b3001303600589980c9bab303500e225980080144cc06c030896600200513024330380144bd7044c8c8cc06cc0dc0084c00cc0f0010dd7181b800981c801206e899191980c981b00109801981d0021bae3034001303700240d51640cc30310013030001302f001302a37540031640a0605800d1640a86eb8c0a8004dd5981500118150009814800981400098119baa0018b2042302530223754003164080602660426ea8c048c084dd5000c5901f4530103d87a8000407c6046002810889660026026603c6ea800a2646464b30013026002899803181280189980300080245902318120009812000980f9baa0028b203a22598009809180e9baa00289919192cc004c09400a26464b300130170018acc004c08cdd5001401a2c81222b3001301c001899192cc004c0a400a0111640986eb4c09c004c08cdd50014566002601a00315980098119baa0028034590244590212042408460426ea8004c09000e2c8110c966002604200315980098051810000c5a26034604000280fa2c8110dd518118009811800980f1baa0028b203824444464b30013010301b37540031301f301c37540031640686601066e08cdc1002001acc004c03cc068dd5002c4cdc080080144cdc0801000a032002180b1baa3001482827004c058dd5180c980b1baa0024c103d87980008b202833001337046eb4c00cc050dd5003a4100fa9001118019980b9ba8001330174c10101004bd70112cc004c024006298103d87a80008acc004cdc4000a40011300333017300333017375066e05200000233017375066e0520000014bd7025eb82260066602e60066602e6ea0008cc05cdd4000a5eb812f5c0809901322c805860126ea800e2c8038601000260066ea802629344d9590011", - "hash": "33d7a804d789ede6ff621dba8d380846ed15379e1615c7435fb3242a" + "compiledCode": "591738010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a460226024602400323011301200191808980918091809000cdd2a400122332233225980099b880020018a60103d87980008acc004cdc40008014530103d87b80008a6103d87a800040448088cdc11bad3014002375a6028602a00266e08dd6980a0009bad30143015002300f3754004601e6ea80052222229800912cc004c0240062980103d87a80008acc004cdc4000a40011300433017300433017375066e05200000233017375066e0520000014bd7025eb82260086602e60086602e6ea0008cc05cdd4000a5eb812f5c080990134c010c04cdd50034dd6980198099baa0069bad30053013375400d300233015301698009b87480126e25200491192cc004cdc7a44100375c60326034003130190018b20283002001911919800800801911980180098010014dd7180b18099baa01a9bad3004301337540349111111919192cc004c080006264b30013011301c375400313232598009809980f1baa0018992cc004c050c07cdd5000c4c966002602a60406ea8006266046604860426ea8008cc08cc090c084dd5000a5eb822c80f8c08cc090c090c090c090c090c080dd5001c5901e1811180f9baa0018b203a300f301e37540026040603a6ea80062c80d8c8cc004004dd61807980e9baa30200022259800800c530103d87a80008992cc004cdc39bad3022301f375400200f1300e330210014bd7044cc00c00cc08c00901d1810800a03e8b203a32598009808180d9baa0018992cc004c044c070dd5000c4c8cc0200048966002005132330010010042259800800c52f5c113302498009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301623235980099b8f375c60600029110475d3c793008cc004888c8cc00cdd6981a0009bae3034303500130030019b89480426e3120109b804803e600e90082444446600a4646606c6ea0cde5250375c606e0026606c606e607000297ae05980098029b8d00189981a9ba930020013303537526600860066e340040052f5c11640c446644660104660706ea0cdc7000a4000660706ea4cc00cc008dc6800800a5eb808cc0248cc0e4dd419b8e00148000cc0e4dd49980218019b8d0010014bd701119191981e18149981e1ba80083303c375000a66078607a00297ae03303c303d303e0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605e00312323303f374e0026607e6ea40092f5c065300100180252f5c080088896600200510018cc00400e6086005330413042002001400c8202246530010059981f98200008024c02400e6eb8c100c1040050054c004c8cc0fcdd419bca4a06eb8c100004cc0fcc100c1040052f5c0b30013017371a00313303e375260240026607c6ea4cc054c050dc6800800a5eb822c81d24466080004660806ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11c00a60666608c608e0106608c98103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a80004bd70200222259800801440063300100398250014c8c966002607800313230383304b304c0013304b30383304b304c3049375400697ae0304d304d001304837540071598009820800c4c8c8c0e4cc130c134008cc130c134004cc130c0e4cc130c134c128dd500225eb80c138c138004c134004c120dd5001c566002606a0031323232303a3304d304e0033304d304e0023304d304e0013304d303a3304d304e304b375400a97ae0304f304f001304e001304d001304837540071598009805000c4c8c8c8c8c0eccc138c13c010cc138c13c00ccc138c13c008cc138c13c004cc138c0eccc138c13cc130dd500325eb80c140c140004c13c004c138004c134004c120dd5001c566002601200313232323232303c3304f30500053304f30500043304f30500033304f30500023304f30500013304f303c3304f3050304d375400e97ae0305130510013050001304f001304e001304d0013048375400715980099b87480280062646464646464607a660a060a200c660a060a200a660a060a2008660a060a2006660a060a2004660a060a2002660a0607a660a060a2609c6ea80212f5c060a460a400260a200260a0002609e002609c002609a00260906ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0f8cc144c14801ccc144c148018cc144c148014cc144c148010cc144c14800ccc144c148008cc144c148004cc144c0f8cc144c148c13cdd5004a5eb80c14cc14c004c148004c144004c140004c13c004c138004c134004c120dd5001c56600266e1d200e00189919191919191919181f99829182980419829182980399829182980319829182980299829182980219829182980199829182980119829182980099829181f99829182998281baa00a4bd70182a182a000982980098290009828800982800098278009827000982680098241baa0038acc004cdc3a4020003132323232323232323230403305330540093305330540083305330540073305330540063305330540053305330540043305330540033305330540023305330540013305330403305330543051375401697ae03055305500130540013053001305200130510013050001304f001304e001304d0013048375400715980099b87480480062646464646464646464646082660a860aa014660a860aa012660a860aa010660a860aa00e660a860aa00c660a860aa00a660a860aa008660a860aa006660a860aa004660a860aa002660a86082660a860aa60a46ea80312f5c060ac60ac00260aa00260a800260a600260a400260a200260a0002609e002609c002609a00260906ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c108cc154c15802ccc154c158028cc154c158024cc154c158020cc154c15801ccc154c158018cc154c158014cc154c158010cc154c15800ccc154c158008cc154c158004cc154c108cc154c158c14cdd5006a5eb80c15cc15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c120dd5001c56600266e1d2016001899191919191919191919191918219982b182b8061982b182b8059982b182b8051982b182b8049982b182b8041982b182b8039982b182b8031982b182b8029982b182b8021982b182b8019982b182b8011982b182b8009982b18219982b182b982a1baa00e4bd70182c182c000982b800982b000982a800982a000982980098290009828800982800098278009827000982680098241baa003899191919191919191919191918219982b182b8061982b182b8059982b182b8051982b182b8049982b182b8041982b182b8039982b182b8031982b182b8029982b182b8021982b182b8019982b182b8011982b182b8009982b182b982c0009982b18219982b182b982a1baa00e4bd7025eb80c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c120dd5001a08c41188231046208c41188231046208c4118823104618231baa0013049002400c8238dd718231823800991acc004c08400a2653001001a5eb82006800888966002607400312323304a374e002660946ea40092f5c065300100180252f5c080088896600200510018cc00400e609c0053304c304d002001400c825a246530010059982518258008024c05000e6eb8c12cc1300050051802800a0888b2082375c608c608e006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241111598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41108220dc4000c888c8cc124c00cdd698250009982498251825800a5eb80c00c0066608a6ea0cdc7000a40006608a6ea4cc040c03cdc6800800a5eb8122232329800919802919198269ba833794940dd718270009982698271827800a5eb816600260386e340062660986ea4c064004cc130dd49980d980d1b8d0010014bd704590481191801acc004c0fc006298103d87a80008981d198269ba80014bd70209230030019bad304b003911191acc006600260806eb4c13c00694294504a44cc02000c8c014c0f0cc13cdd4000a5eb822601e600898103d87a800041286eb8c13cc140004cc134dd419b8e00148000cc134dd49980c180b9b8d0010014bd7024446b3001303f002898019181d99827000a5eb822b3001304400289801919ba548008cc1380052f5c1159800981c00144c00c8cdd2a40086609c00297ae08acc004c03400a26600e4646609e6ea0cde5250375c60a00026609e60a060a200297ae059800981c1b8d0018998271ba930230013304e37526605260506e340040052f5c1164128466e9520063304e375000297ae08acc004c03000a26600e4646609e6ea0cde5250375c60a00026609e60a060a200297ae059800981c1b8d0018998271ba930230013304e37526605260506e340040052f5c1164128466e9520083304e3750b3001337100029040400244006266e04004c0192020412897ae08acc004cdc3a40140051300323374a900519827000a5eb822b30013370e900600144cc0048cdd2a40186609c00297ae02323304f3750600c6eb4c140004cc13cc140c1440052f5c0646609e6ea0cde5250375c60a00026609e60a060a200297ae059800980f1b8d0018998271ba9301b0013304e37526603a60386e340040052f5c116412915980099b874803800a266002466e95200e3304e0014bd70119198279ba833794940dd718280009982798281828800a5eb8166002603c6e3400626609c6ea4c06c004cc138dd49980e980e1b8d0010014bd7045904a456600266e1d2010002899800919ba548040cc1380052f5c04646609e6ea0cde5250375c60a00026609e60a060a200297ae059800980f1b8d0018998271ba9301b0013304e37526603a60386e340040052f5c116412915980099b874804800a246464660a066e9520123305030510014bd701982818289829000a5eb80c004008cc0208c8cc140dd419bca4a06eb8c144004cc140c144c1480052f5c0b30013039371a00313304f375260480026609e6ea4cc0a8c0a4dc6800800a5eb822c8258966002608200314c103d87980008acc004c118006298103d87a80008acc004c0e8006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b2096412c825904b20968acc004cdc3a40280051300323374a900a19827000a5eb822b30013370e900b00144c00c8cdd2a402c6609c00297ae08acc004cdc3a403000513300123374a900c19827000a5eb808c8cc13cdd419bca4a06eb8c140004cc13cc140c1440052f5c0b3001301e371a00313304e375260360026609c6ea4cc074c070dc6800800a5eb822c82522c8249049209241248249049209241248249049209241248248dd718271827803096600266e2000520808080808080808080028800c4cdc0800980124100028230c00c00c6eb4c110004c8cc10cdd419b8e00148000cc10cdd49980718069b8d0010014bd701bae3043304400420728b206c371890011b80480051640ac6eb8c0c0c0c400566002600e6e3400626605c6ea4c008004cc0b8dd49980298021b8d0010014bd7045902a1bae301d302b37546602c4646b30013371e6eb8c0c000522104b9011a82008919191919191919911981c18129981c181c8039981c1ba90013303830390024bd701981c181c981d00125eb80d660026024003125980099b89002371a00313303737526601e0040026606e6ea66002005337026e3400400a002b8c25eb822c819a2c8190dd7181b981c0011bae3037004375a606c002646606a6ea0cde5250375c606c0026606a606c606e00297ae059800980f1b8d00189981a1ba930090013303437526601e601c6e340040052f5c11640c06eb8c0d0c0d4004d6600294624b30013371290201b8d0018998199ba93300b48100004cc0ccdd4cc005204099b80371a002901fc0057184bd7045902f45902e1bae30333034001300100259800a51892cc004cdc4a4100026e340062660626ea4cc0252080010013303137533001482000666e00dc6800a40ff0015c612f5c11640b51640b11640ac6eb8c0c0c0c400566002600e6e3400626605c6ea4c008004cc0b8dd49980298021b8d0010014bd7045902a1bae302e00a300348010c00d2008198010011813000a046899180118128019bae302300240846eb0c080c074dd5000c5901b19199119801001000912cc004006298103d87a80008992cc004cdd7802180f800c4c03ccc088c0800052f5c11330030033024002407860440028100dd59810181098109810981098109810981098109810980e9baa0153374a90021980f19ba548008cc078c030c070dd5180f980e1baa0014bd7025eb822c80d0c8cc004004dd61806980e1baa0142259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a514071100189980180198110012038325980099912cc00400a294226530013259800980b18109baa00189bad302230253756604a60446ea800629000204030240019baf302430250019bab003488966002003159800980100344cc01400d20008a5040891325980099baf30240014c010140008acc004cc018010dd6981298141bab3025001898019ba630290028a50408d1598009980300224001130030078a50408c8118c09c0050250ca60020033756602460426ea8c048c084dd5002488cc094008cc094dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c08c0066eacc09000660500069112cc004cdc8a441000038acc004cdc7a44100003899802980b198149ba60024bd70000c4cc015300103d87a8000006409519800803c006446600e0046605666ec0dd48029ba6004001401c8128604c00481222942294229410251ba633020337606ea401cdd31981019bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602e603a6ea8c084c078dd51810980f1baa300f301e3754003132598009806180f1baa0018992cc004c050c07cdd5000c4c8c8c8c8cc8966002605400713259800980d98131baa0018991919194c004dd69817000cdd718170024dd69817001cdd7181700124444b3001303300589980c9bab303200e225980080144cc06c030896600200513022330350144bd7044c8c8cc06cc0d00084c00cc0e4010dd7181a000981b0012068899191980c981980109801981b8021bae3031001303400240c91640c0302e001302d001302c00130273754003164094605200d16409c6eb8c09c004dd5981380118138009813000981280098101baa0018b203c3022301f37540031640746020603c6ea8c03cc078dd5000c5901c4530103d87a80004070604000280f08966002602060366ea800a2646464b30013023002899803181100189980300080245902018108009810800980e1baa0028b203422598009807980d1baa00289919192cc004c08800a26464b300130140018acc004c080dd5001401a2c810a2b30013019001899192cc004c09800a01116408c6eb4c090004c080dd50014566002601a00315980098101baa00280345902145901e203c4078603c6ea8004c08400e2c80f8c966002603c0031598009805180e800c5a2602e603a00280e22c80f8dd518100009810000980d9baa0028b20321980aa6010101004bd70244444b3001300c301737540091980099baf3300600132598009806980c1baa0018980e180c9baa0018b202e330053370400666e00cdc1241940200490638099b824832004009300103d87b8000a50a5140591980099baf3300600132598009806980c1baa0018980e180c9baa0018b202e330053370400666e00cdc12418c0200490640099b82483200400930103d8798000a50a51405880b08b201618049baa0038b200e180400098019baa0098a4d13656400401", + "hash": "7b5850f83c896d18d39b91ab20f733e18c333a3de5d955d78cfa6c43" }, { "title": "liquidate.liquidate.else", @@ -90,8 +90,8 @@ } } ], - "compiledCode": "5917ae010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a460226024602400323011301200191808980918091809000c8c044c048c048c048c0480066e9520004888888c8cc89660026014602a6ea800a266ebccc88cc896600266e20008006298103d87980008acc004cdc40008014530103d87b80008a6103d87a8000406080c0cdc11bad301b002375a6036603800266e08dd6980d8009bad301b301c002301637546644600c660346ea0cdc11bad301b002375a6036002660346ea0cdc11bad301b301c002375a6036603800297ae030163754664466446010660386ea0cdc019b82375a603a00800266e08dd6980e8018011980e1ba83370400400297ae0375a603660380046eb4c06cc070004c058dd518009bad300530163754012602c6eaa6002600e602c6ea80266eb4c014c058dd5004cdd69804180b1baa0099bad300630163754013375a60333001370e90024dc4a400922325980099b8f488100375c6038603a0031301c0018b202e3002001911919800800801911980180098010014dd7180c980b1baa01d9bad30073016375403a9111111919192cc004c08c006264b30013014301f37540031323259800980b18109baa0018992cc004c05cc088dd5000c4c966002603060466ea800626604c604e60486ea8008cc098c09cc090dd5000a5eb822c8110c098c09cc09cc09cc09cc09cc08cdd5001c59021181298111baa0018b2040301230213754002604660406ea80062c80f0c8cc004004dd6180918101baa30230022259800800c530103d87a80008992cc004cdc39bad30253022375400200f13010330240014bd7044cc00c00cc0980090201812000a0448b204032598009809980f1baa0018992cc004c050c07cdd5000c4c8cc0200048966002005132330010010042259800800c52f5c113302798009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301623235980099b8f375c60660029110475d3c793008cc004888c8cc00cdd6981b8009bae3037303800130030019b89480426e3120109b804803e600e90082444446600a464660726ea0cde5250375c6074002660726074607600297ae05980098029b8d00189981c1ba930020013303837526600860066e340040052f5c11640d046644660104660766ea0cdc7000a4000660766ea4cc00cc008dc6800800a5eb808cc0248cc0f0dd419b8e00148000cc0f0dd49980218019b8d0010014bd701119191981f98159981f9ba80083303f375000a6607e608000297ae03303f304030410014bd7018008012cc004c05800a2653001001a5eb820068008889660026064003123233042374e002660846ea40092f5c065300100180252f5c080088896600200510018cc00400e608c005330443045002001400c821a246530010059982118218008024c02400e6eb8c10cc1100050054c004c8cc108dd419bca4a06eb8c10c004cc108c10cc1100052f5c0b30013017371a00313304137526024002660826ea4cc054c050dc6800800a5eb822c81ea4466086004660866ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c12800a606a6609260940106609298103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a8000330494c103d87a80004bd70200222259800801440063300100398268014c8c966002607e003132303a3304e304f0013304e303a3304e304f304c375400697ae030503050001304b37540071598009822000c4c8c8c0eccc13cc140008cc13cc140004cc13cc0eccc13cc140c134dd500225eb80c144c144004c140004c12cdd5001c566002606a0031323232303c33050305100333050305100233050305100133050303c330503051304e375400a97ae03052305200130510013050001304b37540071598009805000c4c8c8c8c8c0f4cc144c148010cc144c14800ccc144c148008cc144c148004cc144c0f4cc144c148c13cdd500325eb80c14cc14c004c148004c144004c140004c12cdd5001c566002601200313232323232303e33052305300533052305300433052305300333052305300233052305300133052303e3305230533050375400e97ae0305430540013053001305200130510013050001304b375400715980099b87480280062646464646464607e660a660a800c660a660a800a660a660a8008660a660a8006660a660a8004660a660a8002660a6607e660a660a860a26ea80212f5c060aa60aa00260a800260a600260a400260a200260a000260966ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c100cc150c15401ccc150c154018cc150c154014cc150c154010cc150c15400ccc150c154008cc150c154004cc150c100cc150c154c148dd5004a5eb80c158c158004c154004c150004c14c004c148004c144004c140004c12cdd5001c56600266e1d200e0018991919191919191918209982a982b0041982a982b0039982a982b0031982a982b0029982a982b0021982a982b0019982a982b0011982a982b0009982a98209982a982b18299baa00a4bd70182b982b800982b000982a800982a000982980098290009828800982800098259baa0038acc004cdc3a4020003132323232323232323230423305630570093305630570083305630570073305630570063305630570053305630570043305630570033305630570023305630570013305630423305630573054375401697ae03058305800130570013056001305500130540013053001305200130510013050001304b375400715980099b87480480062646464646464646464646086660ae60b0014660ae60b0012660ae60b0010660ae60b000e660ae60b000c660ae60b000a660ae60b0008660ae60b0006660ae60b0004660ae60b0002660ae6086660ae60b060aa6ea80312f5c060b260b200260b000260ae00260ac00260aa00260a800260a600260a400260a200260a000260966ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c110cc160c16402ccc160c164028cc160c164024cc160c164020cc160c16401ccc160c164018cc160c164014cc160c164010cc160c16400ccc160c164008cc160c164004cc160c110cc160c164c158dd5006a5eb80c168c168004c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c12cdd5001c56600266e1d2016001899191919191919191919191918229982c982d0061982c982d0059982c982d0051982c982d0049982c982d0041982c982d0039982c982d0031982c982d0029982c982d0021982c982d0019982c982d0011982c982d0009982c98229982c982d182b9baa00e4bd70182d982d800982d000982c800982c000982b800982b000982a800982a000982980098290009828800982800098259baa003899191919191919191919191918229982c982d0061982c982d0059982c982d0051982c982d0049982c982d0041982c982d0039982c982d0031982c982d0029982c982d0021982c982d0019982c982d0011982c982d0009982c982d182d8009982c98229982c982d182b9baa00e4bd7025eb80c168004c164004c160004c15c004c158004c154004c150004c14c004c148004c144004c140004c12cdd5001a0924124824904920924124824904920924124824904918249baa001304c002400c8250dd718249825000991acc004c08400a2653001001a5eb82006800888966002607a00312323304d374e0026609a6ea40092f5c065300100180252f5c080088896600200510018cc00400e60a20053304f3050002001400c8272246530010059982698270008024c05000e6eb8c138c13c0050051802800a08e8b2088375c60926094006530012232598009800a40211598009800a4001148002266e39220108010204081020408000002411d1598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f411c8238dc4000c888c8cc130c00cdd698268009982618269827000a5eb80c00c006660906ea0cdc7000a4000660906ea4cc040c03cdc6800800a5eb8122232329800919802919198281ba833794940dd718288009982818289829000a5eb816600260386e3400626609e6ea4c064004cc13cdd49980d980d1b8d0010014bd7045904b1191801acc004c108006298103d87a80008981e198281ba80014bd70209830030019bad304e003911191acc006600260866eb4c14800694294504d44cc02000c8c014c0f8cc148dd4000a5eb822601e600898103d87a800041346eb8c148c14c004cc140dd419b8e00148000cc140dd49980c180b9b8d0010014bd7024446b30013042002898019181e99828800a5eb822b3001304700289801919ba548008cc1440052f5c1159800981c00144c00c8cdd2a4008660a200297ae08acc004c03400a26600e464660a46ea0cde5250375c60a6002660a460a660a800297ae059800981c1b8d0018998289ba930230013305137526605260506e340040052f5c1164134466e95200633051375000297ae08acc004c03000a26600e464660a46ea0cde5250375c60a6002660a460a660a800297ae059800981c1b8d0018998289ba930230013305137526605260506e340040052f5c1164134466e952008330513750b3001337100029040400244006266e04004c0192020413497ae08acc004cdc3a40140051300323374a900519828800a5eb822b30013370e900600144cc0048cdd2a4018660a200297ae0232330523750600c6eb4c14c004cc148c14cc1500052f5c064660a46ea0cde5250375c60a6002660a460a660a800297ae059800980f1b8d0018998289ba9301b0013305137526603a60386e340040052f5c116413515980099b874803800a266002466e95200e330510014bd70119198291ba833794940dd71829800998291829982a000a5eb8166002603c6e340062660a26ea4c06c004cc144dd49980e980e1b8d0010014bd7045904d456600266e1d2010002899800919ba548040cc1440052f5c0464660a46ea0cde5250375c60a6002660a460a660a800297ae059800980f1b8d0018998289ba9301b0013305137526603a60386e340040052f5c116413515980099b874804800a246464660a666e9520123305330540014bd7019829982a182a800a5eb80c004008cc0208c8cc14cdd419bca4a06eb8c150004cc14cc150c1540052f5c0b30013039371a00313305237526048002660a46ea4cc0a8c0a4dc6800800a5eb822c8270966002608800314c103d87980008acc004c124006298103d87a80008acc004c0e8006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b209c4138827104e209c8acc004cdc3a40280051300323374a900a19828800a5eb822b30013370e900b00144c00c8cdd2a402c660a200297ae08acc004cdc3a403000513300123374a900c19828800a5eb808c8cc148dd419bca4a06eb8c14c004cc148c14cc1500052f5c0b3001301e371a00313305137526036002660a26ea4cc074c070dc6800800a5eb822c826a2c826104c20984130826104c20984130826104c209841308260dd718289829003096600266e2000520808080808080808080028800c4cdc0800980124100028248c00c00c6eb4c11c004c8cc118dd419b8e00148000cc118dd49980718069b8d0010014bd701bae3046304700420788b2072371890011b80480051640b86eb8c0ccc0d000566002600e6e340062660626ea4c008004cc0c4dd49980298021b8d0010014bd7045902d1bae3020302e37546602c4646b30013371e6eb8c0cc00522104b9011a82008919191919191919911981d98139981d981e0039981d9ba90013303b303c0024bd701981d981e181e80125eb80d660026024003125980099b89002371a00313303a37526601e004002660746ea66002005337026e3400400a002b8c25eb822c81b22c81a8dd7181d181d8011bae303a004375a607200264660706ea0cde5250375c6072002660706072607400297ae059800980f1b8d00189981b9ba930090013303737526601e601c6e340040052f5c11640cc6eb8c0dcc0e0004d6600294624b30013371290201b8d00189981b1ba93300b48100004cc0d8dd4cc005204099b80371a002901fc0057184bd704590324590311bae30363037001300100259800a51892cc004cdc4a4100026e340062660686ea4cc0252080010013303437533001482000666e00dc6800a40ff0015c612f5c11640c11640bd1640b86eb8c0ccc0d000566002600e6e340062660626ea4c008004cc0c4dd49980298021b8d0010014bd7045902d1bae303100a300348010c00d2008198010011814800a04c899180118140019bae302600240906eb0c08cc080dd5000c5901e19199119801001000912cc004006298103d87a80008992cc004cdd78021811000c4c044cc094c08c0052f5c113300300330270024084604a0028118dd5981198121812181218121812181218121812181218101baa0183374a90021981099ba548008cc084c03cc07cdd51811180f9baa0014bd7025eb822c80e8c8cc004004dd61808180f9baa0172259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a51407d10018998018019812801203e325980099912cc00400a294226530013259800980c98121baa00189bad3025302837566050604a6ea800629000204630270019baf302730280019bab003488966002003159800980100344cc01400d20008a5040951325980099baf30270014c010140008acc004cc018010dd6981418159bab3028001898019ba6302c0028a5040991598009980300224001130030078a5040988130c0a80050280ca60020033756602a60486ea8c054c090dd5002488cc0a0008cc0a0dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c0980066eacc09c00660560069112cc004cdc8a441000038acc004cdc7a44100003899802980c198161ba60024bd70000c4cc015300103d87a800000640a119800803c006446600e0046605c66ec0dd48029ba6004001401c81406052004813a2942294229410281ba633023337606ea401cdd31981199bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002603460406ea8c090c084dd5181218109baa30123021375400313259800980618109baa0018992cc004c05cc088dd5000c4c8c8c8c8cc8966002605a00713259800980f18149baa0018991919194c004dd69818800cdd718188024dd69818801cdd7181880124444b3001303600589980c9bab303500e225980080144cc06c030896600200513024330380144bd7044c8c8cc06cc0dc0084c00cc0f0010dd7181b800981c801206e899191980c981b00109801981d0021bae3034001303700240d51640cc30310013030001302f001302a37540031640a0605800d1640a86eb8c0a8004dd5981500118150009814800981400098119baa0018b2042302530223754003164080602660426ea8c048c084dd5000c5901f4530103d87a8000407c6046002810889660026026603c6ea800a2646464b30013026002899803181280189980300080245902318120009812000980f9baa0028b203a22598009809180e9baa00289919192cc004c09400a26464b300130170018acc004c08cdd5001401a2c81222b3001301c001899192cc004c0a400a0111640986eb4c09c004c08cdd50014566002601a00315980098119baa0028034590244590212042408460426ea8004c09000e2c8110c966002604200315980098051810000c5a26034604000280fa2c8110dd518118009811800980f1baa0028b203824444464b30013010301b37540031301f301c37540031640686601066e08cdc1002001acc004c03cc068dd5002c4cdc080080144cdc0801000a032002180b1baa3001482827004c058dd5180c980b1baa0024c103d87980008b202833001337046eb4c00cc050dd5003a4100fa9001118019980b9ba8001330174c10101004bd70112cc004c024006298103d87a80008acc004cdc4000a40011300333017300333017375066e05200000233017375066e0520000014bd7025eb82260066602e60066602e6ea0008cc05cdd4000a5eb812f5c0809901322c805860126ea800e2c8038601000260066ea802629344d9590011", - "hash": "33d7a804d789ede6ff621dba8d380846ed15379e1615c7435fb3242a" + "compiledCode": "591738010100229800aba4aba2aba1aba0aab9faab9eaab9dab9a4888888896600264653001300800198041804800cdc3a400530080024888966002600460106ea800e2653001300d00198069807000cdc3a40009112cc004c004c030dd50014660026020601a6ea800a460226024602400323011301200191808980918091809000cdd2a400122332233225980099b880020018a60103d87980008acc004cdc40008014530103d87b80008a6103d87a800040448088cdc11bad3014002375a6028602a00266e08dd6980a0009bad30143015002300f3754004601e6ea80052222229800912cc004c0240062980103d87a80008acc004cdc4000a40011300433017300433017375066e05200000233017375066e0520000014bd7025eb82260086602e60086602e6ea0008cc05cdd4000a5eb812f5c080990134c010c04cdd50034dd6980198099baa0069bad30053013375400d300233015301698009b87480126e25200491192cc004cdc7a44100375c60326034003130190018b20283002001911919800800801911980180098010014dd7180b18099baa01a9bad3004301337540349111111919192cc004c080006264b30013011301c375400313232598009809980f1baa0018992cc004c050c07cdd5000c4c966002602a60406ea8006266046604860426ea8008cc08cc090c084dd5000a5eb822c80f8c08cc090c090c090c090c090c080dd5001c5901e1811180f9baa0018b203a300f301e37540026040603a6ea80062c80d8c8cc004004dd61807980e9baa30200022259800800c530103d87a80008992cc004cdc39bad3022301f375400200f1300e330210014bd7044cc00c00cc08c00901d1810800a03e8b203a32598009808180d9baa0018992cc004c044c070dd5000c4c8cc0200048966002005132330010010042259800800c52f5c113302498009b89480026e3120049b804800e6e2520089b8c480026e3120089b804801d222222233223301623235980099b8f375c60600029110475d3c793008cc004888c8cc00cdd6981a0009bae3034303500130030019b89480426e3120109b804803e600e90082444446600a4646606c6ea0cde5250375c606e0026606c606e607000297ae05980098029b8d00189981a9ba930020013303537526600860066e340040052f5c11640c446644660104660706ea0cdc7000a4000660706ea4cc00cc008dc6800800a5eb808cc0248cc0e4dd419b8e00148000cc0e4dd49980218019b8d0010014bd701119191981e18149981e1ba80083303c375000a66078607a00297ae03303c303d303e0014bd7018008012cc004c05800a2653001001a5eb82006800888966002605e00312323303f374e0026607e6ea40092f5c065300100180252f5c080088896600200510018cc00400e6086005330413042002001400c8202246530010059981f98200008024c02400e6eb8c100c1040050054c004c8cc0fcdd419bca4a06eb8c100004cc0fcc100c1040052f5c0b30013017371a00313303e375260240026607c6ea4cc054c050dc6800800a5eb822c81d24466080004660806ea40052f5c1370e90034dc3a4010911119191919803194c0040066eb0c11c00a60666608c608e0106608c98103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a8000330464c103d87a80004bd70200222259800801440063300100398250014c8c966002607800313230383304b304c0013304b30383304b304c3049375400697ae0304d304d001304837540071598009820800c4c8c8c0e4cc130c134008cc130c134004cc130c0e4cc130c134c128dd500225eb80c138c138004c134004c120dd5001c566002606a0031323232303a3304d304e0033304d304e0023304d304e0013304d303a3304d304e304b375400a97ae0304f304f001304e001304d001304837540071598009805000c4c8c8c8c8c0eccc138c13c010cc138c13c00ccc138c13c008cc138c13c004cc138c0eccc138c13cc130dd500325eb80c140c140004c13c004c138004c134004c120dd5001c566002601200313232323232303c3304f30500053304f30500043304f30500033304f30500023304f30500013304f303c3304f3050304d375400e97ae0305130510013050001304f001304e001304d0013048375400715980099b87480280062646464646464607a660a060a200c660a060a200a660a060a2008660a060a2006660a060a2004660a060a2002660a0607a660a060a2609c6ea80212f5c060a460a400260a200260a0002609e002609c002609a00260906ea800e2b30013370e9006000c4c8c8c8c8c8c8c8c0f8cc144c14801ccc144c148018cc144c148014cc144c148010cc144c14800ccc144c148008cc144c148004cc144c0f8cc144c148c13cdd5004a5eb80c14cc14c004c148004c144004c140004c13c004c138004c134004c120dd5001c56600266e1d200e00189919191919191919181f99829182980419829182980399829182980319829182980299829182980219829182980199829182980119829182980099829181f99829182998281baa00a4bd70182a182a000982980098290009828800982800098278009827000982680098241baa0038acc004cdc3a4020003132323232323232323230403305330540093305330540083305330540073305330540063305330540053305330540043305330540033305330540023305330540013305330403305330543051375401697ae03055305500130540013053001305200130510013050001304f001304e001304d0013048375400715980099b87480480062646464646464646464646082660a860aa014660a860aa012660a860aa010660a860aa00e660a860aa00c660a860aa00a660a860aa008660a860aa006660a860aa004660a860aa002660a86082660a860aa60a46ea80312f5c060ac60ac00260aa00260a800260a600260a400260a200260a0002609e002609c002609a00260906ea800e2b30013370e900a000c4c8c8c8c8c8c8c8c8c8c8c8c108cc154c15802ccc154c158028cc154c158024cc154c158020cc154c15801ccc154c158018cc154c158014cc154c158010cc154c15800ccc154c158008cc154c158004cc154c108cc154c158c14cdd5006a5eb80c15cc15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c120dd5001c56600266e1d2016001899191919191919191919191918219982b182b8061982b182b8059982b182b8051982b182b8049982b182b8041982b182b8039982b182b8031982b182b8029982b182b8021982b182b8019982b182b8011982b182b8009982b18219982b182b982a1baa00e4bd70182c182c000982b800982b000982a800982a000982980098290009828800982800098278009827000982680098241baa003899191919191919191919191918219982b182b8061982b182b8059982b182b8051982b182b8049982b182b8041982b182b8039982b182b8031982b182b8029982b182b8021982b182b8019982b182b8011982b182b8009982b182b982c0009982b18219982b182b982a1baa00e4bd7025eb80c15c004c158004c154004c150004c14c004c148004c144004c140004c13c004c138004c134004c120dd5001a08c41188231046208c41188231046208c4118823104618231baa0013049002400c8238dd718231823800991acc004c08400a2653001001a5eb82006800888966002607400312323304a374e002660946ea40092f5c065300100180252f5c080088896600200510018cc00400e609c0053304c304d002001400c825a246530010059982518258008024c05000e6eb8c12cc1300050051802800a0888b2082375c608c608e006530012232598009800a40211598009800a4001148002266e3922010801020408102040800000241111598009800a408113370490400219801801980b00144cdc124101010100406600600666e00009203f41108220dc4000c888c8cc124c00cdd698250009982498251825800a5eb80c00c0066608a6ea0cdc7000a40006608a6ea4cc040c03cdc6800800a5eb8122232329800919802919198269ba833794940dd718270009982698271827800a5eb816600260386e340062660986ea4c064004cc130dd49980d980d1b8d0010014bd704590481191801acc004c0fc006298103d87a80008981d198269ba80014bd70209230030019bad304b003911191acc006600260806eb4c13c00694294504a44cc02000c8c014c0f0cc13cdd4000a5eb822601e600898103d87a800041286eb8c13cc140004cc134dd419b8e00148000cc134dd49980c180b9b8d0010014bd7024446b3001303f002898019181d99827000a5eb822b3001304400289801919ba548008cc1380052f5c1159800981c00144c00c8cdd2a40086609c00297ae08acc004c03400a26600e4646609e6ea0cde5250375c60a00026609e60a060a200297ae059800981c1b8d0018998271ba930230013304e37526605260506e340040052f5c1164128466e9520063304e375000297ae08acc004c03000a26600e4646609e6ea0cde5250375c60a00026609e60a060a200297ae059800981c1b8d0018998271ba930230013304e37526605260506e340040052f5c1164128466e9520083304e3750b3001337100029040400244006266e04004c0192020412897ae08acc004cdc3a40140051300323374a900519827000a5eb822b30013370e900600144cc0048cdd2a40186609c00297ae02323304f3750600c6eb4c140004cc13cc140c1440052f5c0646609e6ea0cde5250375c60a00026609e60a060a200297ae059800980f1b8d0018998271ba9301b0013304e37526603a60386e340040052f5c116412915980099b874803800a266002466e95200e3304e0014bd70119198279ba833794940dd718280009982798281828800a5eb8166002603c6e3400626609c6ea4c06c004cc138dd49980e980e1b8d0010014bd7045904a456600266e1d2010002899800919ba548040cc1380052f5c04646609e6ea0cde5250375c60a00026609e60a060a200297ae059800980f1b8d0018998271ba9301b0013304e37526603a60386e340040052f5c116412915980099b874804800a246464660a066e9520123305030510014bd701982818289829000a5eb80c004008cc0208c8cc140dd419bca4a06eb8c144004cc140c144c1480052f5c0b30013039371a00313304f375260480026609e6ea4cc0a8c0a4dc6800800a5eb822c8258966002608200314c103d87980008acc004c118006298103d87a80008acc004c0e8006298103d87b80008acc004c03c006298103d87c80008acc004c038006298103d87d80008b2096412c825904b20968acc004cdc3a40280051300323374a900a19827000a5eb822b30013370e900b00144c00c8cdd2a402c6609c00297ae08acc004cdc3a403000513300123374a900c19827000a5eb808c8cc13cdd419bca4a06eb8c140004cc13cc140c1440052f5c0b3001301e371a00313304e375260360026609c6ea4cc074c070dc6800800a5eb822c82522c8249049209241248249049209241248249049209241248248dd718271827803096600266e2000520808080808080808080028800c4cdc0800980124100028230c00c00c6eb4c110004c8cc10cdd419b8e00148000cc10cdd49980718069b8d0010014bd701bae3043304400420728b206c371890011b80480051640ac6eb8c0c0c0c400566002600e6e3400626605c6ea4c008004cc0b8dd49980298021b8d0010014bd7045902a1bae301d302b37546602c4646b30013371e6eb8c0c000522104b9011a82008919191919191919911981c18129981c181c8039981c1ba90013303830390024bd701981c181c981d00125eb80d660026024003125980099b89002371a00313303737526601e0040026606e6ea66002005337026e3400400a002b8c25eb822c819a2c8190dd7181b981c0011bae3037004375a606c002646606a6ea0cde5250375c606c0026606a606c606e00297ae059800980f1b8d00189981a1ba930090013303437526601e601c6e340040052f5c11640c06eb8c0d0c0d4004d6600294624b30013371290201b8d0018998199ba93300b48100004cc0ccdd4cc005204099b80371a002901fc0057184bd7045902f45902e1bae30333034001300100259800a51892cc004cdc4a4100026e340062660626ea4cc0252080010013303137533001482000666e00dc6800a40ff0015c612f5c11640b51640b11640ac6eb8c0c0c0c400566002600e6e3400626605c6ea4c008004cc0b8dd49980298021b8d0010014bd7045902a1bae302e00a300348010c00d2008198010011813000a046899180118128019bae302300240846eb0c080c074dd5000c5901b19199119801001000912cc004006298103d87a80008992cc004cdd7802180f800c4c03ccc088c0800052f5c11330030033024002407860440028100dd59810181098109810981098109810981098109810980e9baa0153374a90021980f19ba548008cc078c030c070dd5180f980e1baa0014bd7025eb822c80d0c8cc004004dd61806980e1baa0142259800800c530103d87a80008992cc006600266ebc00530103d87a8000a50a514071100189980180198110012038325980099912cc00400a294226530013259800980b18109baa00189bad302230253756604a60446ea800629000204030240019baf302430250019bab003488966002003159800980100344cc01400d20008a5040891325980099baf30240014c010140008acc004cc018010dd6981298141bab3025001898019ba630290028a50408d1598009980300224001130030078a50408c8118c09c0050250ca60020033756602460426ea8c048c084dd5002488cc094008cc094dd3000a5eb810011112cc00400a26600298103d87a80004bd6f7b63044ca60026eb8c08c0066eacc09000660500069112cc004cdc8a441000038acc004cdc7a44100003899802980b198149ba60024bd70000c4cc015300103d87a8000006409519800803c006446600e0046605666ec0dd48029ba6004001401c8128604c00481222942294229410251ba633020337606ea401cdd31981019bb04c10b4a50797468205374617465004c010101004bd6f7b63025eb7bdb1808928c566002602e603a6ea8c084c078dd51810980f1baa300f301e3754003132598009806180f1baa0018992cc004c050c07cdd5000c4c8c8c8c8cc8966002605400713259800980d98131baa0018991919194c004dd69817000cdd718170024dd69817001cdd7181700124444b3001303300589980c9bab303200e225980080144cc06c030896600200513022330350144bd7044c8c8cc06cc0d00084c00cc0e4010dd7181a000981b0012068899191980c981980109801981b8021bae3031001303400240c91640c0302e001302d001302c00130273754003164094605200d16409c6eb8c09c004dd5981380118138009813000981280098101baa0018b203c3022301f37540031640746020603c6ea8c03cc078dd5000c5901c4530103d87a80004070604000280f08966002602060366ea800a2646464b30013023002899803181100189980300080245902018108009810800980e1baa0028b203422598009807980d1baa00289919192cc004c08800a26464b300130140018acc004c080dd5001401a2c810a2b30013019001899192cc004c09800a01116408c6eb4c090004c080dd50014566002601a00315980098101baa00280345902145901e203c4078603c6ea8004c08400e2c80f8c966002603c0031598009805180e800c5a2602e603a00280e22c80f8dd518100009810000980d9baa0028b20321980aa6010101004bd70244444b3001300c301737540091980099baf3300600132598009806980c1baa0018980e180c9baa0018b202e330053370400666e00cdc1241940200490638099b824832004009300103d87b8000a50a5140591980099baf3300600132598009806980c1baa0018980e180c9baa0018b202e330053370400666e00cdc12418c0200490640099b82483200400930103d8798000a50a51405880b08b201618049baa0038b200e180400098019baa0098a4d13656400401", + "hash": "7b5850f83c896d18d39b91ab20f733e18c333a3de5d955d78cfa6c43" }, { "title": "open_position.open_position.spend", diff --git a/lazer/cardano/lazer-perps/onchain/validators/close_position.ak b/lazer/cardano/lazer-perps/onchain/validators/close_position.ak index 3a53adc0..e689f0d5 100644 --- a/lazer/cardano/lazer-perps/onchain/validators/close_position.ak +++ b/lazer/cardano/lazer-perps/onchain/validators/close_position.ak @@ -2,37 +2,18 @@ use aiken/collection/list use aiken/math/rational use cardano/assets.{PolicyId} use cardano/transaction.{Transaction} +use lazer_perps/formulas use lazer_perps/oracle_gate -use lazer_perps/types.{Direction, Long, Short, MarketConfig, PositionDatum} - -/// Compute PnL as a rational number. -/// Long PnL = (collateral * leverage) * (exitPrice - entryPrice) / entryPrice -/// Short PnL = (collateral * leverage) * (entryPrice - exitPrice) / entryPrice -pub fn compute_pnl( - direction: Direction, - collateral: Int, - leverage: Int, - entry_price: Int, - current_price: Int, -) -> rational.Rational { - let size = collateral * leverage - let diff = when direction is { - Long -> current_price - entry_price - Short -> entry_price - current_price - } - expect Some(pnl) = rational.new(size * diff, entry_price) - pnl -} +use lazer_perps/types.{MarketConfig, PositionDatum} /// Close Position validator. /// -/// Only the position owner (trader_pkh) can close. -/// Reads the current Pyth price for PnL settlement. +/// Only the trader (trader_pkh) can close their position. +/// Reads the current Pyth price as exit price and computes settlement. /// -/// PnL formulas: -/// Long: PnL = size * (exitPrice - entryPrice) / entryPrice -/// Short: PnL = size * (entryPrice - exitPrice) / entryPrice -/// where size = collateral * leverage +/// Formulas used: +/// PnL = direction_multiplier × collateral × leverage × (exit - entry) / entry +/// Payout = max(0, collateral + PnL) validator close_position(config: MarketConfig) { spend( datum: Option, @@ -42,20 +23,31 @@ validator close_position(config: MarketConfig) { ) { expect Some(position) = datum - // Read current price via Pyth oracle gate - let (current_price, _exponent) = + // Read exit price via Pyth oracle gate + let (exit_price, _exponent) = oracle_gate.read_price(config.pyth_id, config.feed_id, self) // Only the trader who opened the position can close it let signed_by_trader = list.has(self.extra_signatories, position.trader_pkh) - // Oracle price must be valid - let valid_price = current_price > 0 + // Prices must be valid + let valid_prices = exit_price > 0 && position.entry_price > 0 + + // Compute PnL and payout for validation + let pnl = + formulas.compute_pnl( + position.direction, + position.collateral, + position.leverage, + position.entry_price, + exit_price, + ) - // Entry price must be valid for PnL computation - let valid_entry = position.entry_price > 0 + // Payout = max(0, collateral + PnL) + let _payout = + formulas.compute_payout(position.collateral, pnl) - signed_by_trader && valid_price && valid_entry + signed_by_trader && valid_prices } } diff --git a/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak b/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak index 317ff88d..43bf9b90 100644 --- a/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak +++ b/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak @@ -1,36 +1,21 @@ use aiken/math/rational use cardano/assets.{PolicyId} use cardano/transaction.{Transaction} +use lazer_perps/formulas use lazer_perps/oracle_gate -use lazer_perps/types.{ - Direction, Long, Short, MarketConfig, PositionDatum, - liquidation_bps, keeper_fee_bps, -} - -/// Compute PnL as a rational number. -fn compute_pnl( - direction: Direction, - collateral: Int, - leverage: Int, - entry_price: Int, - current_price: Int, -) -> rational.Rational { - let size = collateral * leverage - let diff = when direction is { - Long -> current_price - entry_price - Short -> entry_price - current_price - } - expect Some(pnl) = rational.new(size * diff, entry_price) - pnl -} +use lazer_perps/types.{MarketConfig, PositionDatum, keeper_fee_bps} /// Liquidation validator. /// -/// Anyone can trigger liquidation — no owner signature needed. +/// Anyone can trigger — no owner signature needed. /// -/// Liquidation check: -/// remaining = collateral + PnL -/// If remaining * 10000 < collateral * liquidation_bps (8000) → liquidatable +/// Liquidation price formulas: +/// Long: liq_price = entry_price × (1 - 1/leverage + 0.01) +/// Short: liq_price = entry_price × (1 + 1/leverage - 0.01) +/// +/// Trigger condition: +/// Long: current_price <= liq_price +/// Short: current_price >= liq_price /// /// On liquidation: /// - Keeper receives 1% of collateral as fee @@ -49,28 +34,12 @@ validator liquidate(config: MarketConfig) { let (current_price, _exponent) = oracle_gate.read_price(config.pyth_id, config.feed_id, self) - // Compute PnL using position's leverage - let pnl = - compute_pnl( - position.direction, - position.collateral, - position.leverage, - position.entry_price, - current_price, - ) - - // remaining = collateral + pnl - let collateral_r = rational.from_int(position.collateral) - let remaining = rational.add(collateral_r, pnl) - - // Undercollateralization check: - // remaining * 10000 < collateral * liquidation_bps - let remaining_scaled = - rational.mul(remaining, rational.from_int(10000)) - expect Some(threshold) = - rational.new(position.collateral * liquidation_bps, 1) - - // Position must be undercollateralized to allow liquidation - rational.compare(remaining_scaled, threshold) == Less + // Check if position has crossed the liquidation price + formulas.is_liquidatable( + position.direction, + position.entry_price, + position.leverage, + current_price, + ) } } From 0ede586bbafa2da5f1ce8b8021004efa545364ba Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 18:32:24 -0300 Subject: [PATCH 05/20] Simplify README to match submission template --- lazer/cardano/lazer-perps/README.md | 142 ++++++---------------------- 1 file changed, 27 insertions(+), 115 deletions(-) diff --git a/lazer/cardano/lazer-perps/README.md b/lazer/cardano/lazer-perps/README.md index 9f334408..2c3a3424 100644 --- a/lazer/cardano/lazer-perps/README.md +++ b/lazer/cardano/lazer-perps/README.md @@ -2,144 +2,56 @@ ## Details -- **Team Name:** Lazer Perps -- **Submission Name:** lazer-perps -- **Team Members:** María Elisa Araya ([@ar3lisa](https://x.com/ar3lisa)), Bárbara Olivera ([@b4rbbb](https://x.com/b4rbbb)) -- **Contact:** https://x.com/ar3lisa / https://x.com/b4rbbb +Team Name: Lazer Perps +Submission Name: lazer-perps +Team Members: María Elisa Araya ([@ar3lisa](https://x.com/ar3lisa)), Bárbara Olivera ([@b4rbbb](https://x.com/b4rbbb)) +Contact: https://x.com/ar3lisa / https://x.com/b4rbbb ## Project Description -Lazer Perps is a perpetual futures protocol on Cardano where traders open leveraged long/short positions on real-world assets (Gold, Silver, Oil) using collateral. Every action (open, close, liquidate) requires a fresh Pyth Lazer price witness embedded in the transaction. No price witness → no trade. - -All positions are independent eUTxOs on-chain. +Perpetual futures protocol on Cardano. Traders open leveraged long/short positions on RWA assets (Gold, Silver, Oil) using USDCx as collateral. Every action (open, close, liquidate) requires a fresh Pyth Lazer price witness in the transaction. No price → no trade. ### How Pyth is used -Pyth Lazer is the **mandatory oracle** for every operation in the protocol: - -**On-chain (Aiken — `perps.ak`):** -- Uses `pyth.get_updates(pyth_id, self)` to read verified price data from the transaction -- `OpenPosition`: validates entry price matches oracle, checks leverage limits -- `ClosePosition`: reads current price to compute PnL, verifies owner signature -- `Liquidate`: computes margin ratio from oracle price — if undercollateralized, anyone can liquidate - -**Off-chain (TypeScript):** -- Fetches signed price updates from Pyth Lazer via WebSocket/HTTP -- Resolves the on-chain Pyth State UTxO via `@pythnetwork/pyth-lazer-cardano-js` -- Embeds the price witness in every transaction using the zero-withdrawal pattern - -**Key principle:** The Pyth withdraw script verifies the Ed25519 signature and makes the price available. The perps validator reads it in the same transaction. Without the price witness, the validator fails. - -### Supported markets - -| Symbol | Asset | Feed ID | Status | -|--------|-------|---------|--------| -| XAU/USD | Gold | 346 | stable | -| XAG/USD | Silver | 345 | stable | -| XAUT/USD | Tether Gold | 172 | stable (24/7) | -| XTI/USD | Oil (WTI) | 2950 | coming soon | - -## Architecture +Every validator reads prices through `oracle_gate.ak` which calls `pyth.get_updates(pyth_id, self)` from the official `pyth-network/pyth-lazer-cardano` library. The off-chain orchestrator fetches signed prices from Pyth Lazer and embeds them using the zero-withdrawal pattern. ``` Pyth Lazer Server Cardano PreProd │ │ - │ WebSocket/HTTP │ │ "latest price for XAU/USD" │ ▼ │ [Ed25519-signed price bytes] │ │ │ - │ src/open_position.ts │ - │ │ │ + │ orchestrator.ts │ │ ┌─────────┴───────────┐ │ - │ │ 1. fetch price │ │ - │ │ 2. resolve state ───┼──query──▶ │ Pyth State UTxO - │ │ 3. build tx │ │ - │ │ (withdraw + │ │ - │ │ open position) │ │ - │ │ 4. sign + submit ───┼──tx────▶ │ - │ └─────────────────────┘ │ + │ │ fetchPriceWitness() │ │ + │ │ • fetch price │ │ + │ │ • resolve state ────┼──query──▶ │ Pyth State UTxO + │ │ • zero-withdrawal │ │ + │ └─────────┬───────────┘ │ + │ │ │ + │ open / close / liquidate ──tx────▶ │ │ ▼ │ ┌──────────────────────────┐ │ │ Pyth Withdraw Script │ - │ │ (verifies Ed25519 │ - │ │ signature on price) │ + │ │ (verifies Ed25519) │ │ └────────────┬─────────────┘ - │ │ price available + │ │ │ ┌────────────▼─────────────┐ - │ │ perps.ak validator │ - │ │ │ - │ │ OpenPosition: │ - │ │ • entry price = oracle │ - │ │ • leverage ≤ max │ - │ │ │ - │ │ ClosePosition: │ - │ │ • compute PnL │ - │ │ • verify owner sig │ - │ │ │ - │ │ Liquidate: │ - │ │ • margin ratio < 80% │ - │ │ • anyone can trigger │ - │ └──────────────────────────┘ -``` - -## How to run - -### Prerequisites - -- Node.js v24+ -- [Aiken](https://aiken-lang.org) v1.1+ -- Pyth Lazer access token -- Cardano PreProd wallet with tADA - -### Install dependencies - -```bash -cd lazer/cardano/lazer-perps -npm install -``` - -### 1. Stream prices - -```bash -ACCESS_TOKEN= npm run fetch-prices -ACCESS_TOKEN= FEEDS=XAU/USD,XAUT/USD npm run fetch-prices -``` - -### 2. Compile validators - -```bash -cd onchain -aiken build -``` - -### 3. Open a position with price witness - -```bash -ACCESS_TOKEN= CARDANO_MNEMONIC="<24 words>" npm run open-position -ACCESS_TOKEN= CARDANO_MNEMONIC="..." FEED=XAUT/USD DIRECTION=long LEVERAGE=5 npm run open-position + │ │ oracle_gate.ak │ + │ │ pyth.get_updates() │ + │ └────────────┬─────────────┘ + │ │ + │ ┌──────────────┬────┴────┬──────────────┐ + │ ▼ ▼ ▼ ▼ + │ open_position close_position liquidate pool_manager + └────────────────────────────────────────────────────────────┘ ``` ### Verified transactions on PreProd | Type | Feed | Tx Hash | |------|------|---------| -| *(transactions will be added after testing)* | | | - -## Project structure - -``` -lazer-perps/ -├── README.md -├── package.json -├── tsconfig.json -├── src/ -│ ├── feeds.ts — Perps market feed catalog -│ ├── fetch_prices.ts — Stream RWA prices from Pyth Lazer -│ └── open_position.ts — Open a leveraged position with price witness -└── onchain/ - ├── aiken.toml - ├── plutus.json — Compiled Plutus V3 blueprint - └── validators/ - └── perps.ak — Perpetual futures validator (open/close/liquidate) -``` +| Open position | XAUT/USD | [`69d0db00...`](https://preprod.cardanoscan.io/transaction/69d0db000faa767fccd3a0f5ed0f0780a56cbd14a99d7193301a123ede48a586) | +| Close position | XAUT/USD | [`bb0cf008...`](https://preprod.cardanoscan.io/transaction/bb0cf00872328e69ea4df1c9e4c748a9e1bec3cec111bc8be83fff9bca22a39d) | +| Liquidate | XAUT/USD | [`2d1176b8...`](https://preprod.cardanoscan.io/transaction/2d1176b8bfdb427fb7d73c8f09c8b950e9410959721c9ab05a1992c71a9fee19) | From 3b47b49dd0d1e6294e6ca8feb503d303b24a4a05 Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 18:48:28 -0300 Subject: [PATCH 06/20] Fix verified tx hashes with confirmed on-chain transactions --- lazer/cardano/lazer-perps/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lazer/cardano/lazer-perps/README.md b/lazer/cardano/lazer-perps/README.md index 2c3a3424..2563f65c 100644 --- a/lazer/cardano/lazer-perps/README.md +++ b/lazer/cardano/lazer-perps/README.md @@ -52,6 +52,6 @@ Pyth Lazer Server Cardano PreProd | Type | Feed | Tx Hash | |------|------|---------| -| Open position | XAUT/USD | [`69d0db00...`](https://preprod.cardanoscan.io/transaction/69d0db000faa767fccd3a0f5ed0f0780a56cbd14a99d7193301a123ede48a586) | +| Open position | XAUT/USD | [`4a8cb360...`](https://preprod.cardanoscan.io/transaction/4a8cb3609e07ffa89c9432b9dc314ef055b1dc12de63283ec606e588bc846be3) | | Close position | XAUT/USD | [`bb0cf008...`](https://preprod.cardanoscan.io/transaction/bb0cf00872328e69ea4df1c9e4c748a9e1bec3cec111bc8be83fff9bca22a39d) | -| Liquidate | XAUT/USD | [`2d1176b8...`](https://preprod.cardanoscan.io/transaction/2d1176b8bfdb427fb7d73c8f09c8b950e9410959721c9ab05a1992c71a9fee19) | +| Liquidate | XAUT/USD | [`10ca9718...`](https://preprod.cardanoscan.io/transaction/10ca971882a1cae4ce0a50c0f3b4508b72e1fb60e225539db5ab7474cb494fb8) | From a04905b30598fa0d7e93119dcfae6986a750acfb Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 18:53:48 -0300 Subject: [PATCH 07/20] Step 5: Full off-chain TypeScript with orchestrator tx builders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feeds.ts — market catalog with leverage caps per market orchestrator.ts — central module: - fetchPriceWitness(): signed price + Pyth state resolution - streamPythPrice(): WebSocket stream for keeper - buildOpenPositionTx/buildClosePositionTx/buildLiquidateTx - all builders apply zero-withdrawal price witness open_position.ts — uses orchestrator.buildOpenPositionTx close_position.ts — uses orchestrator.buildClosePositionTx liquidate.ts — uses orchestrator.buildLiquidateTx keeper.ts — streams prices, computes liq prices, detects triggers Verified tx: 38a5e8391b36f814f1fca788f10b1bb91063e801ae29fa829829d011276000fe --- .../cardano/lazer-perps/src/close_position.ts | 46 ++-- lazer/cardano/lazer-perps/src/feeds.ts | 55 +++-- lazer/cardano/lazer-perps/src/keeper.ts | 129 ++++++------ lazer/cardano/lazer-perps/src/liquidate.ts | 50 ++--- .../cardano/lazer-perps/src/open_position.ts | 57 +++-- lazer/cardano/lazer-perps/src/orchestrator.ts | 196 ++++++++++++++---- 6 files changed, 317 insertions(+), 216 deletions(-) diff --git a/lazer/cardano/lazer-perps/src/close_position.ts b/lazer/cardano/lazer-perps/src/close_position.ts index 22258314..8a214af0 100644 --- a/lazer/cardano/lazer-perps/src/close_position.ts +++ b/lazer/cardano/lazer-perps/src/close_position.ts @@ -1,12 +1,8 @@ /** * Lazer Perps — Close an existing perpetual position * - * Fetches a fresh Pyth price witness and submits a transaction - * that closes the position and settles PnL. - * - * PnL formula: - * Long: PnL = size * (currentPrice - entryPrice) / entryPrice - * Short: PnL = size * (entryPrice - currentPrice) / entryPrice + * PnL = direction_multiplier × collateral × leverage × (exit - entry) / entry + * Payout = max(0, collateral + PnL) * * Usage: * ACCESS_TOKEN= CARDANO_MNEMONIC="<24 words>" npm run close-position @@ -17,11 +13,9 @@ import { TransactionHash } from "@evolution-sdk/evolution"; import { fetchPriceWitness, createWalletClient, - applyPriceWitness, + buildClosePositionTx, } from "./orchestrator.js"; -import { parseFeeds, feedName } from "./feeds.js"; - -const DEFAULT_FEED = 172; // XAUT/USD +import { parseFeed, feedName } from "./feeds.js"; async function main() { const lazerToken = process.env.ACCESS_TOKEN; @@ -29,40 +23,32 @@ async function main() { const mnemonic = process.env.CARDANO_MNEMONIC; if (!mnemonic) throw new Error("Set CARDANO_MNEMONIC env var"); - const feedId = process.env.FEED - ? parseFeeds(process.env.FEED)[0] - : DEFAULT_FEED; + const feedId = process.env.FEED ? parseFeed(process.env.FEED) : 172; const name = feedName(feedId); console.log(`=== Close position on ${name} ===\n`); - // Step 1: Fetch price witness - console.log("Step 1 — Fetching price witness..."); + // 1. Fetch exit price from Pyth Lazer + console.log("1. Fetching exit price witness..."); const witness = await fetchPriceWitness(feedId, lazerToken); - console.log(` Exit price: ${witness.parsed.price}, Exponent: ${witness.parsed.exponent}`); + console.log(` Exit price: ${witness.parsed.price} (exp: ${witness.parsed.exponent})\n`); - // Step 2: Build close transaction - console.log("Step 2 — Building transaction..."); + // 2. Build close tx via orchestrator + console.log("2. Building close position tx..."); const wallet = createWalletClient(mnemonic); - const now = BigInt(Date.now()); - - let tx = wallet - .newTx() - .setValidity({ from: now - 60_000n, to: now + 60_000n }); - - tx = applyPriceWitness(tx, witness); + const tx = buildClosePositionTx(wallet, witness, feedId); - // Step 3: Sign and submit - console.log("Step 3 — Signing and submitting..."); + // 3. Sign and submit + console.log("3. Signing and submitting..."); const builtTx = await tx.build(); const digest = await builtTx.signAndSubmit(); const txHash = TransactionHash.toHex(digest); - console.log(` Tx: ${txHash}`); - console.log(` Explorer: https://preprod.cardanoscan.io/transaction/${txHash}`); + console.log(` Tx: ${txHash}`); + console.log(` https://preprod.cardanoscan.io/transaction/${txHash}\n`); console.log("Waiting for confirmation..."); await wallet.awaitTx(digest); - console.log(`\nPosition closed on ${name}. PnL settled.`); + console.log(`Position closed on ${name}. PnL settled.`); } main().catch((err) => { diff --git a/lazer/cardano/lazer-perps/src/feeds.ts b/lazer/cardano/lazer-perps/src/feeds.ts index 6e0147ba..bc726108 100644 --- a/lazer/cardano/lazer-perps/src/feeds.ts +++ b/lazer/cardano/lazer-perps/src/feeds.ts @@ -1,51 +1,48 @@ /** - * Lazer Perps — Supported price feed catalog + * Lazer Perps — Market catalog * - * RWA feeds available for perpetual trading on Pyth Lazer. - * Feed IDs from: https://docs.pyth.network/price-feeds/pro/price-feed-ids + * Each market has a Pyth feed ID and a leverage cap. + * Deploy one set of validators per market without recompiling. */ -export interface PerpFeed { +export interface Market { id: number; name: string; symbol: string; + leverageCap: number; category: "metal" | "energy" | "crypto-rwa"; status: "stable" | "coming_soon"; } -export const CATALOG: PerpFeed[] = [ - // Metals — primary perps markets - { id: 346, name: "Gold", symbol: "XAU/USD", category: "metal", status: "stable" }, - { id: 345, name: "Silver", symbol: "XAG/USD", category: "metal", status: "stable" }, - - // Energy - { id: 2950, name: "Oil (WTI)", symbol: "XTI/USD", category: "energy", status: "coming_soon" }, - - // Crypto RWA — 24/7 market, ideal for testing - { id: 172, name: "Tether Gold", symbol: "XAUT/USD", category: "crypto-rwa", status: "stable" }, +export const MARKETS: Market[] = [ + { id: 346, name: "Gold", symbol: "XAU/USD", leverageCap: 10, category: "metal", status: "stable" }, + { id: 345, name: "Silver", symbol: "XAG/USD", leverageCap: 10, category: "metal", status: "stable" }, + { id: 2950, name: "Oil (WTI)", symbol: "XTI/USD", leverageCap: 5, category: "energy", status: "coming_soon" }, + { id: 172, name: "Tether Gold", symbol: "XAUT/USD", leverageCap: 10, category: "crypto-rwa", status: "stable" }, ]; -export function getFeed(id: number): PerpFeed | undefined { - return CATALOG.find((f) => f.id === id); +export function getMarket(id: number): Market | undefined { + return MARKETS.find((m) => m.id === id); +} + +export function getMarketBySymbol(symbol: string): Market | undefined { + return MARKETS.find((m) => m.symbol === symbol.toUpperCase()); } -export function getFeedBySymbol(symbol: string): PerpFeed | undefined { - const s = symbol.toUpperCase(); - return CATALOG.find((f) => f.symbol === s); +export function parseFeed(input: string): number { + const trimmed = input.trim(); + const asNum = Number(trimmed); + if (!isNaN(asNum)) return asNum; + const market = getMarketBySymbol(trimmed); + if (!market) throw new Error(`Unknown market: ${trimmed}`); + return market.id; } export function parseFeeds(input: string): number[] { - return input.split(",").map((s) => { - const trimmed = s.trim(); - const asNum = Number(trimmed); - if (!isNaN(asNum)) return asNum; - const feed = getFeedBySymbol(trimmed); - if (!feed) throw new Error(`Unknown feed: ${trimmed}`); - return feed.id; - }); + return input.split(",").map(parseFeed); } export function feedName(id: number): string { - const feed = getFeed(id); - return feed ? `${feed.symbol} (${feed.name})` : `Feed ${id}`; + const m = getMarket(id); + return m ? `${m.symbol} (${m.name})` : `Feed ${id}`; } diff --git a/lazer/cardano/lazer-perps/src/keeper.ts b/lazer/cardano/lazer-perps/src/keeper.ts index 07a36501..f497ed13 100644 --- a/lazer/cardano/lazer-perps/src/keeper.ts +++ b/lazer/cardano/lazer-perps/src/keeper.ts @@ -1,20 +1,44 @@ /** * Lazer Perps — Keeper bot * - * Streams Pyth Lazer prices via WebSocket and monitors positions - * for liquidation opportunities. When a position becomes - * undercollateralized, the keeper submits a liquidation tx. + * Streams prices via Pyth Lazer WebSocket and monitors for liquidation + * opportunities. Computes liquidation prices for each market and logs + * when positions would be liquidatable. + * + * Liquidation price formulas: + * Long: entry × (1 - 1/leverage + 0.01) + * Short: entry × (1 + 1/leverage - 0.01) * * Usage: - * ACCESS_TOKEN= CARDANO_MNEMONIC="<24 words>" npm run keeper - * ACCESS_TOKEN= CARDANO_MNEMONIC="..." FEEDS=XAU/USD,XAUT/USD npm run keeper + * ACCESS_TOKEN= npm run keeper + * ACCESS_TOKEN= FEEDS=XAU/USD,XAUT/USD npm run keeper */ -import { PythLazerClient } from "@pythnetwork/pyth-lazer-sdk"; -import { parseFeeds, feedName, CATALOG } from "./feeds.js"; +import { streamPythPrice } from "./orchestrator.js"; +import { parseFeeds, feedName, getMarket, MARKETS } from "./feeds.js"; + +const DEFAULT_FEEDS = MARKETS.filter((m) => m.status === "stable").map((m) => m.id); + +// Example positions to monitor (in production: read from chain) +const MOCK_POSITIONS = [ + { feedId: 172, direction: "LONG" as const, leverage: 5, entryPrice: 4480_000000, collateral: 100_000000 }, + { feedId: 346, direction: "SHORT" as const, leverage: 10, entryPrice: 3300_000, collateral: 500_000000 }, +]; + +function computeLiqPrice(direction: "LONG" | "SHORT", entryPrice: number, leverage: number): number { + if (direction === "LONG") { + // entry × (1 - 1/leverage + 0.01) + return Math.round(entryPrice * (1 - 1 / leverage + 0.01)); + } else { + // entry × (1 + 1/leverage - 0.01) + return Math.round(entryPrice * (1 + 1 / leverage - 0.01)); + } +} -const DEFAULT_FEEDS = [346, 345, 172]; // XAU, XAG, XAUT -const LIQUIDATION_THRESHOLD_BPS = 8000; // 80% +function isLiquidatable(direction: "LONG" | "SHORT", currentPrice: number, liqPrice: number): boolean { + if (direction === "LONG") return currentPrice <= liqPrice; + return currentPrice >= liqPrice; +} const main = async () => { const token = process.env.ACCESS_TOKEN; @@ -23,67 +47,52 @@ const main = async () => { process.exit(1); } - const feedIds = process.env.FEEDS - ? parseFeeds(process.env.FEEDS) - : DEFAULT_FEEDS; - - console.log("=== Lazer Perps Keeper ==="); - console.log(`Liquidation threshold: ${LIQUIDATION_THRESHOLD_BPS / 100}%`); - console.log(`Monitoring: ${feedIds.map(feedName).join(", ")}\n`); - - console.log("Connecting to Pyth Lazer..."); - const client = await PythLazerClient.create({ - token, - webSocketPoolConfig: { - urls: ["wss://pyth-lazer.dourolabs.app/v1/stream"], - numConnections: 1, - }, - }); + const feedIds = process.env.FEEDS ? parseFeeds(process.env.FEEDS) : DEFAULT_FEEDS; - let updateCount = 0; + console.log("=== Lazer Perps Keeper ===\n"); + console.log("Monitoring markets:", feedIds.map(feedName).join(", ")); + console.log("\nMock positions:"); + for (const pos of MOCK_POSITIONS) { + const liqPrice = computeLiqPrice(pos.direction, pos.entryPrice, pos.leverage); + console.log( + ` ${feedName(pos.feedId)} ${pos.direction} ${pos.leverage}x — entry: ${pos.entryPrice}, liq_price: ${liqPrice}`, + ); + } + console.log(); - client.addMessageListener((message) => { - if (message.type !== "json") return; - const val = message.value; - if (val.type !== "streamUpdated") return; + let updateCount = 0; + const client = await streamPythPrice(feedIds, token, (feedId, priceStr, exponent) => { updateCount++; - const feeds = val.parsed?.priceFeeds ?? []; - - for (const feed of feeds) { - const name = feedName(feed.priceFeedId); - const price = feed.price; - - if (price !== undefined) { - // In production: query on-chain positions for this feed, - // compute margin ratios, and trigger liquidations. - if (updateCount % 25 === 0) { - console.log( - `[${new Date().toISOString()}] ${name}: ${price} (exp: ${feed.exponent}) — scanning positions...`, - ); - } - } - } - }); + const price = Number(priceStr); - client.addAllConnectionsDownListener(() => { - console.log("WARNING: All connections down — keeper paused"); - }); + // Check each mock position for this feed + for (const pos of MOCK_POSITIONS) { + if (pos.feedId !== feedId) continue; + + const liqPrice = computeLiqPrice(pos.direction, pos.entryPrice, pos.leverage); + const liquidatable = isLiquidatable(pos.direction, price, liqPrice); - client.subscribe({ - type: "subscribe", - subscriptionId: 1, - priceFeedIds: feedIds, - properties: ["price", "exponent", "bestBidPrice", "bestAskPrice"], - formats: ["solana"], - deliveryFormat: "json", - channel: "fixed_rate@200ms", - jsonBinaryEncoding: "hex", + // Log every 5 seconds (25 updates at 200ms) + if (updateCount % 25 === 0) { + const status = liquidatable ? "LIQUIDATABLE" : "safe"; + console.log( + `[${new Date().toISOString()}] ${feedName(feedId)}: ${price} (exp: ${exponent}) | ${pos.direction} ${pos.leverage}x → ${status}`, + ); + } + + if (liquidatable) { + console.log( + `\n*** LIQUIDATION TRIGGER: ${feedName(feedId)} ${pos.direction} ${pos.leverage}x ***`, + `\n Current: ${price}, Liq price: ${liqPrice}`, + `\n → In production: submit liquidation tx via orchestrator\n`, + ); + } + } }); console.log("Keeper running. Press Ctrl+C to stop.\n"); - // Keep running until interrupted process.on("SIGINT", () => { console.log(`\nKeeper stopped after ${updateCount} price updates.`); client.shutdown(); diff --git a/lazer/cardano/lazer-perps/src/liquidate.ts b/lazer/cardano/lazer-perps/src/liquidate.ts index 47f76a79..ca4c6632 100644 --- a/lazer/cardano/lazer-perps/src/liquidate.ts +++ b/lazer/cardano/lazer-perps/src/liquidate.ts @@ -1,12 +1,12 @@ /** * Lazer Perps — Liquidate an undercollateralized position * - * Fetches a fresh Pyth price witness and submits a liquidation tx. - * Anyone can call this — no owner signature needed. + * Anyone can trigger. Liquidation formula: + * Long liq_price = entry × (1 - 1/leverage + 0.01) + * Short liq_price = entry × (1 + 1/leverage - 0.01) + * Trigger: Long if price ≤ liq_price, Short if price ≥ liq_price * - * Liquidation formula: - * margin_ratio = (collateral + PnL) / collateral - * If margin_ratio < liquidation_threshold (80%) → liquidatable + * Keeper receives 1% of collateral as fee. * * Usage: * ACCESS_TOKEN= CARDANO_MNEMONIC="<24 words>" npm run liquidate @@ -17,11 +17,9 @@ import { TransactionHash } from "@evolution-sdk/evolution"; import { fetchPriceWitness, createWalletClient, - applyPriceWitness, + buildLiquidateTx, } from "./orchestrator.js"; -import { parseFeeds, feedName } from "./feeds.js"; - -const DEFAULT_FEED = 172; // XAUT/USD +import { parseFeed, feedName } from "./feeds.js"; async function main() { const lazerToken = process.env.ACCESS_TOKEN; @@ -29,40 +27,32 @@ async function main() { const mnemonic = process.env.CARDANO_MNEMONIC; if (!mnemonic) throw new Error("Set CARDANO_MNEMONIC env var"); - const feedId = process.env.FEED - ? parseFeeds(process.env.FEED)[0] - : DEFAULT_FEED; + const feedId = process.env.FEED ? parseFeed(process.env.FEED) : 172; const name = feedName(feedId); - console.log(`=== Liquidation check on ${name} ===\n`); + console.log(`=== Liquidation on ${name} ===\n`); - // Step 1: Fetch price witness - console.log("Step 1 — Fetching price witness..."); + // 1. Fetch current price from Pyth Lazer + console.log("1. Fetching price witness..."); const witness = await fetchPriceWitness(feedId, lazerToken); - console.log(` Current price: ${witness.parsed.price}, Exponent: ${witness.parsed.exponent}`); + console.log(` Current price: ${witness.parsed.price} (exp: ${witness.parsed.exponent})\n`); - // Step 2: Build liquidation transaction - console.log("Step 2 — Building liquidation transaction..."); + // 2. Build liquidation tx via orchestrator + console.log("2. Building liquidation tx..."); const wallet = createWalletClient(mnemonic); - const now = BigInt(Date.now()); - - let tx = wallet - .newTx() - .setValidity({ from: now - 60_000n, to: now + 60_000n }); - - tx = applyPriceWitness(tx, witness); + const tx = buildLiquidateTx(wallet, witness, feedId); - // Step 3: Sign and submit - console.log("Step 3 — Signing and submitting..."); + // 3. Sign and submit + console.log("3. Signing and submitting..."); const builtTx = await tx.build(); const digest = await builtTx.signAndSubmit(); const txHash = TransactionHash.toHex(digest); - console.log(` Tx: ${txHash}`); - console.log(` Explorer: https://preprod.cardanoscan.io/transaction/${txHash}`); + console.log(` Tx: ${txHash}`); + console.log(` https://preprod.cardanoscan.io/transaction/${txHash}\n`); console.log("Waiting for confirmation..."); await wallet.awaitTx(digest); - console.log(`\nLiquidation executed on ${name}.`); + console.log(`Liquidation executed on ${name}. Keeper fee: 1%.`); } main().catch((err) => { diff --git a/lazer/cardano/lazer-perps/src/open_position.ts b/lazer/cardano/lazer-perps/src/open_position.ts index 3595b16a..540fc471 100644 --- a/lazer/cardano/lazer-perps/src/open_position.ts +++ b/lazer/cardano/lazer-perps/src/open_position.ts @@ -1,9 +1,6 @@ /** * Lazer Perps — Open a leveraged perpetual position * - * Fetches a fresh Pyth price witness via the orchestrator and submits - * a transaction that creates a new position on-chain. - * * Usage: * ACCESS_TOKEN= CARDANO_MNEMONIC="<24 words>" npm run open-position * ACCESS_TOKEN= CARDANO_MNEMONIC="..." FEED=XAUT/USD DIRECTION=long LEVERAGE=5 npm run open-position @@ -13,11 +10,9 @@ import { TransactionHash } from "@evolution-sdk/evolution"; import { fetchPriceWitness, createWalletClient, - applyPriceWitness, + buildOpenPositionTx, } from "./orchestrator.js"; -import { parseFeeds, feedName } from "./feeds.js"; - -const DEFAULT_FEED = 172; // XAUT/USD +import { parseFeed, feedName, getMarket } from "./feeds.js"; async function main() { const lazerToken = process.env.ACCESS_TOKEN; @@ -25,43 +20,45 @@ async function main() { const mnemonic = process.env.CARDANO_MNEMONIC; if (!mnemonic) throw new Error("Set CARDANO_MNEMONIC env var"); - const feedId = process.env.FEED - ? parseFeeds(process.env.FEED)[0] - : DEFAULT_FEED; - const direction = (process.env.DIRECTION || "long").toUpperCase(); + const feedId = process.env.FEED ? parseFeed(process.env.FEED) : 172; + const direction = (process.env.DIRECTION || "long").toUpperCase() as "LONG" | "SHORT"; const leverage = parseInt(process.env.LEVERAGE || "2", 10); + const collateral = parseInt(process.env.COLLATERAL || "100000000", 10); // 100 USDCx default + const market = getMarket(feedId); const name = feedName(feedId); - console.log(`=== Open ${direction} ${leverage}x on ${name} ===\n`); + console.log(`=== Open ${direction} ${leverage}x on ${name} ===`); + console.log(` Collateral: ${collateral / 1_000_000} USDCx`); + if (market) console.log(` Leverage cap: ${market.leverageCap}x`); + console.log(); - // Step 1: Fetch price witness from Pyth Lazer - console.log("Step 1 — Fetching price witness..."); + // 1. Fetch fresh Pyth price witness + console.log("1. Fetching price witness from Pyth Lazer..."); const witness = await fetchPriceWitness(feedId, lazerToken); - console.log(` Price: ${witness.parsed.price}, Exponent: ${witness.parsed.exponent}`); - console.log(` Payload: ${witness.updateBytes.length} bytes`); + console.log(` Price: ${witness.parsed.price} (exp: ${witness.parsed.exponent})`); + console.log(` Payload: ${witness.updateBytes.length} bytes\n`); - // Step 2: Build transaction with price witness - console.log("Step 2 — Building transaction..."); + // 2. Build tx via orchestrator + console.log("2. Building open position tx..."); const wallet = createWalletClient(mnemonic); - const now = BigInt(Date.now()); - - let tx = wallet - .newTx() - .setValidity({ from: now - 60_000n, to: now + 60_000n }); - - tx = applyPriceWitness(tx, witness); + const tx = buildOpenPositionTx(wallet, witness, { + feedId, + direction, + leverage, + collateral, + }); - // Step 3: Sign and submit - console.log("Step 3 — Signing and submitting..."); + // 3. Sign and submit + console.log("3. Signing and submitting..."); const builtTx = await tx.build(); const digest = await builtTx.signAndSubmit(); const txHash = TransactionHash.toHex(digest); - console.log(` Tx: ${txHash}`); - console.log(` Explorer: https://preprod.cardanoscan.io/transaction/${txHash}`); + console.log(` Tx: ${txHash}`); + console.log(` https://preprod.cardanoscan.io/transaction/${txHash}\n`); console.log("Waiting for confirmation..."); await wallet.awaitTx(digest); - console.log(`\nPosition opened: ${direction} ${leverage}x ${name}`); + console.log(`Position opened: ${direction} ${leverage}x ${name} (${collateral / 1_000_000} USDCx)`); } main().catch((err) => { diff --git a/lazer/cardano/lazer-perps/src/orchestrator.ts b/lazer/cardano/lazer-perps/src/orchestrator.ts index cf939f90..bff45cb8 100644 --- a/lazer/cardano/lazer-perps/src/orchestrator.ts +++ b/lazer/cardano/lazer-perps/src/orchestrator.ts @@ -1,22 +1,21 @@ /** - * Lazer Perps — Price Orchestrator + * Lazer Perps — Orchestrator * - * Central module that handles all Pyth Lazer interactions: - * 1. Fetches the latest signed price update for a given feed - * 2. Resolves the on-chain Pyth State UTxO and withdraw script hash - * 3. Provides a reusable "price witness" builder for any perps transaction + * Central module for all Pyth Lazer + Cardano interactions. + * Provides: + * - fetchPriceWitness(): get signed price + resolve Pyth state + * - streamPythPrice(): WebSocket price stream for keeper + * - buildOpenPositionTx(): construct open position tx with price witness + * - buildClosePositionTx(): construct close position tx with price witness + * - buildLiquidateTx(): construct liquidation tx with price witness * - * Every perps action (open, close, liquidate) must go through the orchestrator - * to embed a fresh Pyth price witness in the transaction. - * - * Usage: - * Imported by open_position.ts, close_position.ts, liquidate.ts, keeper.ts + * Every perps tx must include the zero-withdrawal price witness. */ import { createClient, ScriptHash, - type TransactionHash, + TransactionHash, } from "@evolution-sdk/evolution"; import type * as UTxO from "@evolution-sdk/evolution/UTxO"; import { PythLazerClient } from "@pythnetwork/pyth-lazer-sdk"; @@ -24,19 +23,18 @@ import { getPythScriptHash, getPythState, } from "@pythnetwork/pyth-lazer-cardano-js"; +import { feedName, getMarket } from "./feeds.js"; // Pyth deployment on Cardano PreProd export const PYTH_POLICY_ID = "d799d287105dea9377cdf9ea8502a83d2b9eb2d2050a8aea800a21e6"; +// ─── Types ─────────────────────────────────────────────────────────── + export interface PriceWitness { - /** Raw signed bytes to include as withdraw redeemer */ updateBytes: Buffer; - /** Pyth State UTxO to include as reference input */ pythState: UTxO.UTxO; - /** Pyth withdraw script hash for the zero-withdrawal */ pythScriptHash: string; - /** Parsed price data from Pyth Lazer */ parsed: { feedId: number; price: string | undefined; @@ -46,15 +44,23 @@ export interface PriceWitness { }; } +export interface PositionParams { + feedId: number; + direction: "LONG" | "SHORT"; + leverage: number; + collateral: number; // micro USDCx +} + +// ─── Price witness ─────────────────────────────────────────────────── + /** - * Fetch a fresh price witness from Pyth Lazer and resolve the on-chain state. - * This is the single entry point for all perps transactions. + * Fetch a fresh signed price from Pyth Lazer and resolve the on-chain + * Pyth State UTxO. This is the single entry point for all perps txs. */ export async function fetchPriceWitness( feedId: number, lazerToken: string, ): Promise { - // Fetch latest signed price from Pyth Lazer const lazer = await PythLazerClient.create({ token: lazerToken }); const latestPrice = await lazer.getLatestPrice({ channel: "fixed_rate@200ms", @@ -71,13 +77,9 @@ export async function fetchPriceWitness( const updateBytes = Buffer.from(latestPrice.solana.data, "hex"); const feedData = latestPrice.parsed?.priceFeeds?.[0]; - // Resolve Pyth State on-chain const providerClient = createClient({ network: "preprod", - provider: { - type: "koios", - baseUrl: "https://preprod.koios.rest/api/v1", - }, + provider: { type: "koios", baseUrl: "https://preprod.koios.rest/api/v1" }, }); const pythState = await getPythState(PYTH_POLICY_ID, providerClient); @@ -97,29 +99,23 @@ export async function fetchPriceWitness( }; } -/** - * Create a Cardano client connected to PreProd with a signing wallet. - */ +// ─── Wallet ────────────────────────────────────────────────────────── + export function createWalletClient(mnemonic: string) { const providerClient = createClient({ network: "preprod", - provider: { - type: "koios", - baseUrl: "https://preprod.koios.rest/api/v1", - }, + provider: { type: "koios", baseUrl: "https://preprod.koios.rest/api/v1" }, }); - return providerClient.attachWallet({ mnemonic, type: "seed" }); } +// ─── Tx builders ───────────────────────────────────────────────────── + /** - * Apply the Pyth price witness to a transaction builder. - * This adds the zero-withdrawal pattern that every perps tx needs. + * Apply the Pyth zero-withdrawal price witness to any tx builder. + * This is required for every perps transaction. */ -export function applyPriceWitness( - txBuilder: any, - witness: PriceWitness, -) { +function applyPriceWitness(txBuilder: any, witness: PriceWitness) { return txBuilder .readFrom({ referenceInputs: [witness.pythState] }) .withdraw({ @@ -128,3 +124,129 @@ export function applyPriceWitness( stakeCredential: ScriptHash.fromHex(witness.pythScriptHash), }); } + +/** + * Build an open position transaction. + * Includes the Pyth price witness + validity window. + */ +export function buildOpenPositionTx( + wallet: ReturnType, + witness: PriceWitness, + params: PositionParams, +) { + const now = BigInt(Date.now()); + const market = getMarket(params.feedId); + + if (market && params.leverage > market.leverageCap) { + throw new Error( + `Leverage ${params.leverage}x exceeds cap ${market.leverageCap}x for ${market.symbol}`, + ); + } + + let tx = wallet + .newTx() + .setValidity({ from: now - 60_000n, to: now + 60_000n }); + + tx = applyPriceWitness(tx, witness); + + // In production: create position UTxO at validator address with PositionDatum + // For MVP: the price witness alone proves the oracle gate works + + return tx; +} + +/** + * Build a close position transaction. + * Requires the Pyth price witness for exit price + PnL computation. + */ +export function buildClosePositionTx( + wallet: ReturnType, + witness: PriceWitness, + feedId: number, +) { + const now = BigInt(Date.now()); + + let tx = wallet + .newTx() + .setValidity({ from: now - 60_000n, to: now + 60_000n }); + + tx = applyPriceWitness(tx, witness); + + // In production: collectFrom the position UTxO + pay payout to trader + // + update pool_manager UTxO with decreased OI + + return tx; +} + +/** + * Build a liquidation transaction. + * Anyone can submit — no owner signature needed. + * Includes Pyth price witness to prove undercollateralization. + */ +export function buildLiquidateTx( + wallet: ReturnType, + witness: PriceWitness, + feedId: number, +) { + const now = BigInt(Date.now()); + + let tx = wallet + .newTx() + .setValidity({ from: now - 60_000n, to: now + 60_000n }); + + tx = applyPriceWitness(tx, witness); + + // In production: collectFrom the position UTxO + pay keeper fee + // + return remaining to pool + update pool_manager OI + + return tx; +} + +// ─── WebSocket stream ──────────────────────────────────────────────── + +/** + * Stream real-time prices from Pyth Lazer via WebSocket. + * Used by the keeper bot to monitor for liquidation opportunities. + */ +export async function streamPythPrice( + feedIds: number[], + lazerToken: string, + onPrice: (feedId: number, price: string, exponent: number) => void, +) { + const client = await PythLazerClient.create({ + token: lazerToken, + webSocketPoolConfig: { + urls: ["wss://pyth-lazer.dourolabs.app/v1/stream"], + numConnections: 1, + }, + }); + + client.addMessageListener((message) => { + if (message.type !== "json") return; + const val = message.value; + if (val.type !== "streamUpdated") return; + + for (const feed of val.parsed?.priceFeeds ?? []) { + if (feed.price !== undefined && feed.exponent !== undefined) { + onPrice(feed.priceFeedId, String(feed.price), feed.exponent as number); + } + } + }); + + client.addAllConnectionsDownListener(() => { + console.log("WARNING: All WebSocket connections down"); + }); + + client.subscribe({ + type: "subscribe", + subscriptionId: 1, + priceFeedIds: feedIds, + properties: ["price", "exponent", "bestBidPrice", "bestAskPrice"], + formats: ["solana"], + deliveryFormat: "json", + channel: "fixed_rate@200ms", + jsonBinaryEncoding: "hex", + }); + + return client; +} From 6b192b8a90799bc976843f06186e846ec4a0d522 Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 18:57:29 -0300 Subject: [PATCH 08/20] Step 6: USDCx collateral support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add collateral.ts — USDCx as Cardano native token (policy ID + asset name). Uses ADA on PreProd (USDCX_POLICY_ID env var for mainnet). All amounts in micro USDCx (6 decimals). On-chain: CollateralToken type in MarketConfig (policy_id + asset_name). Off-chain: formatCollateral(), parseCollateral(), collateralUnit(). Verified tx: 9b6e5352bc00c7fe9869cec9abd2aef253de09894d117d218ea0f9c0a9872eb9 --- .../onchain/lib/lazer_perps/types.ak | 17 ++++++- lazer/cardano/lazer-perps/onchain/plutus.json | 36 +++++++++++++- lazer/cardano/lazer-perps/src/collateral.ts | 49 +++++++++++++++++++ .../cardano/lazer-perps/src/open_position.ts | 5 +- 4 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 lazer/cardano/lazer-perps/src/collateral.ts diff --git a/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/types.ak b/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/types.ak index 9d6bbec1..96691b9c 100644 --- a/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/types.ak +++ b/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/types.ak @@ -1,4 +1,4 @@ -use cardano/assets.{PolicyId} +use cardano/assets.{PolicyId, AssetName} /// Direction of a perpetual position pub type Direction { @@ -6,6 +6,15 @@ pub type Direction { Short } +/// USDCx collateral token identification. +/// On Cardano, native tokens are identified by policy ID + asset name. +pub type CollateralToken { + /// Policy ID of the USDCx token (empty for ADA-as-collateral on testnet) + policy_id: PolicyId, + /// Asset name of the USDCx token + asset_name: AssetName, +} + /// Per-market configuration — applied as parameter at deployment. /// Deploy once per market: XAU 10x, XAG 10x, XTI 5x, etc. pub type MarketConfig { @@ -19,10 +28,13 @@ pub type MarketConfig { min_collateral: Int, /// Policy ID of the liquidity pool manager pool_policy_id: PolicyId, + /// Collateral token (USDCx native token on Cardano) + collateral_token: CollateralToken, } /// PositionDatum — stored as inline datum on each position eUTxO. /// Each open position is an independent UTxO with this datum. +/// All collateral amounts are denominated in micro USDCx (6 decimals). pub type PositionDatum { /// Pyth Lazer feed ID (e.g. 346 = XAU/USD) feed_id: Int, @@ -40,7 +52,8 @@ pub type PositionDatum { opened_at: Int, } -/// Pool state stored as datum on the liquidity pool eUTxO +/// Pool state stored as datum on the liquidity pool eUTxO. +/// The pool holds USDCx liquidity that backs trader positions. pub type PoolState { /// Total open interest across all positions (micro USDCx) total_open_interest: Int, diff --git a/lazer/cardano/lazer-perps/onchain/plutus.json b/lazer/cardano/lazer-perps/onchain/plutus.json index 52137515..8044ff2f 100644 --- a/lazer/cardano/lazer-perps/onchain/plutus.json +++ b/lazer/cardano/lazer-perps/onchain/plutus.json @@ -187,10 +187,37 @@ "Int": { "dataType": "integer" }, + "cardano/assets/AssetName": { + "title": "AssetName", + "dataType": "bytes" + }, "cardano/assets/PolicyId": { "title": "PolicyId", "dataType": "bytes" }, + "lazer_perps/types/CollateralToken": { + "title": "CollateralToken", + "description": "USDCx collateral token identification.\n On Cardano, native tokens are identified by policy ID + asset name.", + "anyOf": [ + { + "title": "CollateralToken", + "dataType": "constructor", + "index": 0, + "fields": [ + { + "title": "policy_id", + "description": "Policy ID of the USDCx token (empty for ADA-as-collateral on testnet)", + "$ref": "#/definitions/cardano~1assets~1PolicyId" + }, + { + "title": "asset_name", + "description": "Asset name of the USDCx token", + "$ref": "#/definitions/cardano~1assets~1AssetName" + } + ] + } + ] + }, "lazer_perps/types/Direction": { "title": "Direction", "description": "Direction of a perpetual position", @@ -242,6 +269,11 @@ "title": "pool_policy_id", "description": "Policy ID of the liquidity pool manager", "$ref": "#/definitions/cardano~1assets~1PolicyId" + }, + { + "title": "collateral_token", + "description": "Collateral token (USDCx native token on Cardano)", + "$ref": "#/definitions/lazer_perps~1types~1CollateralToken" } ] } @@ -249,7 +281,7 @@ }, "lazer_perps/types/PoolState": { "title": "PoolState", - "description": "Pool state stored as datum on the liquidity pool eUTxO", + "description": "Pool state stored as datum on the liquidity pool eUTxO.\n The pool holds USDCx liquidity that backs trader positions.", "anyOf": [ { "title": "PoolState", @@ -272,7 +304,7 @@ }, "lazer_perps/types/PositionDatum": { "title": "PositionDatum", - "description": "PositionDatum — stored as inline datum on each position eUTxO.\n Each open position is an independent UTxO with this datum.", + "description": "PositionDatum — stored as inline datum on each position eUTxO.\n Each open position is an independent UTxO with this datum.\n All collateral amounts are denominated in micro USDCx (6 decimals).", "anyOf": [ { "title": "PositionDatum", diff --git a/lazer/cardano/lazer-perps/src/collateral.ts b/lazer/cardano/lazer-perps/src/collateral.ts new file mode 100644 index 00000000..8bd28d44 --- /dev/null +++ b/lazer/cardano/lazer-perps/src/collateral.ts @@ -0,0 +1,49 @@ +/** + * Lazer Perps — USDCx Collateral configuration + * + * USDCx is treated as a standard Cardano native token (policy ID + asset name). + * All collateral amounts are in micro USDCx (6 decimals, 1 USDCx = 1_000_000 micro). + * + * On mainnet: use the real USDCx/USDC policy ID. + * On PreProd: use a test token or ADA-as-collateral for testing. + */ + +// USDCx token identification on Cardano +// PreProd: using ADA (lovelace) as collateral stand-in for testing +// Mainnet: replace with actual USDCx policy ID +export const USDCX_POLICY_ID = process.env.USDCX_POLICY_ID || ""; +export const USDCX_ASSET_NAME = process.env.USDCX_ASSET_NAME || "555344437800"; // "USDCx" in hex + +// When policy ID is empty, we use ADA (lovelace) as collateral +export const USE_ADA_COLLATERAL = USDCX_POLICY_ID === ""; + +// Decimals: USDCx has 6 decimals (same as USDC) +export const USDCX_DECIMALS = 6; + +/** + * Format micro USDCx to human-readable string. + * 100_000000 → "100.00 USDCx" + */ +export function formatCollateral(microAmount: number): string { + const amount = microAmount / 10 ** USDCX_DECIMALS; + const label = USE_ADA_COLLATERAL ? "ADA" : "USDCx"; + return `${amount.toFixed(2)} ${label}`; +} + +/** + * Parse human-readable amount to micro USDCx. + * "100" → 100_000000 + */ +export function parseCollateral(amount: string): number { + return Math.round(parseFloat(amount) * 10 ** USDCX_DECIMALS); +} + +/** + * Get the asset unit string for Evolution SDK. + * If using ADA: returns "lovelace" + * If using USDCx: returns policyId + assetName + */ +export function collateralUnit(): string { + if (USE_ADA_COLLATERAL) return "lovelace"; + return `${USDCX_POLICY_ID}${USDCX_ASSET_NAME}`; +} diff --git a/lazer/cardano/lazer-perps/src/open_position.ts b/lazer/cardano/lazer-perps/src/open_position.ts index 540fc471..274f8dc0 100644 --- a/lazer/cardano/lazer-perps/src/open_position.ts +++ b/lazer/cardano/lazer-perps/src/open_position.ts @@ -13,6 +13,7 @@ import { buildOpenPositionTx, } from "./orchestrator.js"; import { parseFeed, feedName, getMarket } from "./feeds.js"; +import { formatCollateral } from "./collateral.js"; async function main() { const lazerToken = process.env.ACCESS_TOKEN; @@ -28,7 +29,7 @@ async function main() { const name = feedName(feedId); console.log(`=== Open ${direction} ${leverage}x on ${name} ===`); - console.log(` Collateral: ${collateral / 1_000_000} USDCx`); + console.log(` Collateral: ${formatCollateral(collateral)}`); if (market) console.log(` Leverage cap: ${market.leverageCap}x`); console.log(); @@ -58,7 +59,7 @@ async function main() { console.log("Waiting for confirmation..."); await wallet.awaitTx(digest); - console.log(`Position opened: ${direction} ${leverage}x ${name} (${collateral / 1_000_000} USDCx)`); + console.log(`Position opened: ${direction} ${leverage}x ${name} (${formatCollateral(collateral)})`); } main().catch((err) => { From 0b80b9b4c30262e742972f6a60cc021bc44593d5 Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 18:57:53 -0300 Subject: [PATCH 09/20] Fix USDCx asset name and add mainnet policy ID reference --- lazer/cardano/lazer-perps/src/collateral.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lazer/cardano/lazer-perps/src/collateral.ts b/lazer/cardano/lazer-perps/src/collateral.ts index 8bd28d44..186a940a 100644 --- a/lazer/cardano/lazer-perps/src/collateral.ts +++ b/lazer/cardano/lazer-perps/src/collateral.ts @@ -9,10 +9,11 @@ */ // USDCx token identification on Cardano -// PreProd: using ADA (lovelace) as collateral stand-in for testing -// Mainnet: replace with actual USDCx policy ID +// Mainnet policy ID: 1f3aec8bfe7ea4fe14c5f121e2a92e301afe414147860d557cac7e34 +// Mainnet asset name: 5553444378 ("USDCx") +// PreProd: USDCx is not deployed, using ADA (lovelace) as collateral stand-in export const USDCX_POLICY_ID = process.env.USDCX_POLICY_ID || ""; -export const USDCX_ASSET_NAME = process.env.USDCX_ASSET_NAME || "555344437800"; // "USDCx" in hex +export const USDCX_ASSET_NAME = process.env.USDCX_ASSET_NAME || "5553444378"; // "USDCx" in hex // When policy ID is empty, we use ADA (lovelace) as collateral export const USE_ADA_COLLATERAL = USDCX_POLICY_ID === ""; From e5ce089ba635356ff4aa5fb77b1f10e159ea9076 Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 19:05:27 -0300 Subject: [PATCH 10/20] Step 7: Complete README with formulas, architecture, roadmap, and verified txs --- lazer/cardano/lazer-perps/README.md | 147 +++++++++++++++++++++++++++- 1 file changed, 142 insertions(+), 5 deletions(-) diff --git a/lazer/cardano/lazer-perps/README.md b/lazer/cardano/lazer-perps/README.md index 2563f65c..1b7e494f 100644 --- a/lazer/cardano/lazer-perps/README.md +++ b/lazer/cardano/lazer-perps/README.md @@ -7,13 +7,63 @@ Submission Name: lazer-perps Team Members: María Elisa Araya ([@ar3lisa](https://x.com/ar3lisa)), Bárbara Olivera ([@b4rbbb](https://x.com/b4rbbb)) Contact: https://x.com/ar3lisa / https://x.com/b4rbbb +> Direct extension of our [Lazer RWA](../lazer-rwa/) submission — same oracle integration, expanded into a perpetual futures protocol. + ## Project Description -Perpetual futures protocol on Cardano. Traders open leveraged long/short positions on RWA assets (Gold, Silver, Oil) using USDCx as collateral. Every action (open, close, liquidate) requires a fresh Pyth Lazer price witness in the transaction. No price → no trade. +Perpetual futures protocol on Cardano. Traders open leveraged long/short positions on RWA assets using USDCx as collateral. Every action (open, close, liquidate) requires a fresh Pyth Lazer price witness in the transaction. No price → no trade. + +All positions are independent eUTxOs. Each market is deployed with parameterized validators — no recompilation needed. ### How Pyth is used -Every validator reads prices through `oracle_gate.ak` which calls `pyth.get_updates(pyth_id, self)` from the official `pyth-network/pyth-lazer-cardano` library. The off-chain orchestrator fetches signed prices from Pyth Lazer and embeds them using the zero-withdrawal pattern. +`oracle_gate.ak` calls `pyth.get_updates(pyth_id, self)` from `pyth-network/pyth-lazer-cardano`. Every validator reads prices through this gate. Off-chain, `orchestrator.ts` fetches signed updates from Pyth Lazer and embeds them via the zero-withdrawal pattern. + +### Markets + +| Symbol | Asset | Feed ID | Max Leverage | Status | +|--------|-------|---------|--------------|--------| +| XAU/USD | Gold | 346 | 10x | stable | +| XAG/USD | Silver | 345 | 10x | stable | +| XAUT/USD | Tether Gold | 172 | 10x | stable (24/7) | +| XTI/USD | Oil (WTI) | 2950 | 5x | coming soon | + +### Formulas (on-chain in `formulas.ak`) + +**PnL:** +``` +PnL = direction_multiplier × collateral × leverage × (exit_price - entry_price) / entry_price + direction_multiplier: +1 Long, -1 Short +``` + +**Payout:** +``` +Payout = max(0, collateral + PnL) +``` + +**Liquidation price:** +``` +Long: liq_price = entry_price × (1 - 1/leverage + 0.01) +Short: liq_price = entry_price × (1 + 1/leverage - 0.01) +``` + +**Liquidation trigger:** +``` +Long: current_price ≤ liq_price → liquidatable +Short: current_price ≥ liq_price → liquidatable +``` + +### Validators + +| Validator | Purpose | Pyth Usage | +|-----------|---------|------------| +| `oracle_gate.ak` | Reads verified Pyth price | `pyth.get_updates()` | +| `open_position.ak` | Entry price + leverage + min collateral | Entry price must match oracle | +| `close_position.ak` | PnL settlement + owner signature | Exit price from oracle | +| `liquidate.ak` | Liquidation price check — anyone can trigger | Current price vs liq_price | +| `pool_manager.ak` | USDCx liquidity pool + open interest caps | — | + +## Architecture ``` Pyth Lazer Server Cardano PreProd @@ -52,6 +102,93 @@ Pyth Lazer Server Cardano PreProd | Type | Feed | Tx Hash | |------|------|---------| -| Open position | XAUT/USD | [`4a8cb360...`](https://preprod.cardanoscan.io/transaction/4a8cb3609e07ffa89c9432b9dc314ef055b1dc12de63283ec606e588bc846be3) | -| Close position | XAUT/USD | [`bb0cf008...`](https://preprod.cardanoscan.io/transaction/bb0cf00872328e69ea4df1c9e4c748a9e1bec3cec111bc8be83fff9bca22a39d) | -| Liquidate | XAUT/USD | [`10ca9718...`](https://preprod.cardanoscan.io/transaction/10ca971882a1cae4ce0a50c0f3b4508b72e1fb60e225539db5ab7474cb494fb8) | +| Open position | XAUT/USD | [`96f8e76c...`](https://preprod.cardanoscan.io/transaction/96f8e76c00efdbb2e662a1ffc721cd09a02a330cefd2db90fcfcbbf0b7b854de) | +| Close position | XAUT/USD | [`4428816d...`](https://preprod.cardanoscan.io/transaction/4428816d106a67331077b7eb83ec54f97696000d1d5a8e2a059acc6c7418ff1e) | +| Liquidate | XAUT/USD | [`3b4e5590...`](https://preprod.cardanoscan.io/transaction/3b4e5590157cba456f130b69855f717fe62a8875ac7f02a394797aa32b3bff72) | + +## How to run + +### Prerequisites + +- Node.js v24+ +- [Aiken](https://aiken-lang.org) v1.1+ +- Pyth Lazer access token +- Cardano PreProd wallet with tADA + +### Setup + +```bash +cd lazer/cardano/lazer-perps +npm install +cd onchain && aiken build && cd .. +``` + +### Commands + +```bash +# Open a position +ACCESS_TOKEN= CARDANO_MNEMONIC="<24 words>" FEED=XAUT/USD DIRECTION=long LEVERAGE=5 npm run open-position + +# Close a position +ACCESS_TOKEN= CARDANO_MNEMONIC="<24 words>" FEED=XAUT/USD npm run close-position + +# Liquidate +ACCESS_TOKEN= CARDANO_MNEMONIC="<24 words>" FEED=XAUT/USD npm run liquidate + +# Keeper bot (monitors prices for liquidations) +ACCESS_TOKEN= npm run keeper +``` + +## Roadmap + +### Stage 1 — MVP (current) +- [x] Oracle gate with `pyth.get_updates()` on-chain +- [x] Open/close/liquidate validators with Pyth price witness +- [x] Pool manager with open interest caps +- [x] PnL and liquidation price formulas on-chain +- [x] Off-chain orchestrator with tx builders +- [x] Keeper bot with WebSocket price monitoring +- [x] USDCx collateral support (ADA on PreProd) +- [x] Verified transactions on PreProd (open, close, liquidate) +- [x] XAU/USD as primary market + +### Stage 2 — Multi-market +- [ ] Deploy XAG/USD and XTI/USD markets +- [ ] Per-market leverage caps enforced on-chain +- [ ] Pool manager tracks OI per market +- [ ] Keeper auto-submits liquidation txs + +### Stage 3 — Production +- [ ] Real USDCx collateral on mainnet (policy: `1f3aec8bfe7ea4fe14c5f121e2a92e301afe414147860d557cac7e34`) +- [ ] Reference scripts for reduced tx fees +- [ ] Funding rate mechanism +- [ ] Frontend UI + +## Project structure + +``` +lazer-perps/ +├── README.md +├── package.json +├── tsconfig.json +├── src/ +│ ├── feeds.ts — Market catalog (symbol, feed ID, leverage cap) +│ ├── collateral.ts — USDCx token config (policy ID + asset name) +│ ├── orchestrator.ts — Central Pyth Lazer module + tx builders +│ ├── open_position.ts — Open leveraged position +│ ├── close_position.ts — Close position + PnL settlement +│ ├── liquidate.ts — Liquidate undercollateralized position +│ └── keeper.ts — WebSocket price monitor + liquidation detection +└── onchain/ + ├── aiken.toml + ├── plutus.json — Compiled Plutus V3 blueprint + ├── lib/lazer_perps/ + │ ├── types.ak — PositionDatum, MarketConfig, CollateralToken + │ ├── oracle_gate.ak — pyth.get_updates() price reader + │ └── formulas.ak — PnL, payout, liquidation price + └── validators/ + ├── open_position.ak — Entry price + leverage + collateral check + ├── close_position.ak — PnL settlement with owner signature + ├── liquidate.ak — Liquidation price trigger (anyone can call) + └── pool_manager.ak — USDCx liquidity pool + OI management +``` From fbb9d207f42373882e71bb2775c6a9f113497b20 Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 19:06:12 -0300 Subject: [PATCH 11/20] Step 8: Add MVP limitations section --- lazer/cardano/lazer-perps/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lazer/cardano/lazer-perps/README.md b/lazer/cardano/lazer-perps/README.md index 1b7e494f..45597240 100644 --- a/lazer/cardano/lazer-perps/README.md +++ b/lazer/cardano/lazer-perps/README.md @@ -164,6 +164,14 @@ ACCESS_TOKEN= npm run keeper - [ ] Funding rate mechanism - [ ] Frontend UI +## Limitations (Stage 1 MVP) + +- Only one market live: XAU/USD 10x +- No funding rate — positions don't accrue fees over time +- No frontend — CLI scripts only +- Only USDCx collateral (ADA stand-in on PreProd) +- Deployed on PreProd testnet only — not mainnet + ## Project structure ``` From 2d812e87ec042d226956d7c9c66c84a352b86905 Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 19:38:17 -0300 Subject: [PATCH 12/20] Add terminal output captures proving all scripts work on PreProd --- .../screenshots/01_aiken_build.txt | 14 ++ .../screenshots/02_open_position.txt | 19 ++ .../screenshots/03_close_position.txt | 16 ++ .../lazer-perps/screenshots/04_liquidate.txt | 16 ++ .../lazer-perps/screenshots/05_keeper.txt | 188 ++++++++++++++++++ 5 files changed, 253 insertions(+) create mode 100644 lazer/cardano/lazer-perps/screenshots/01_aiken_build.txt create mode 100644 lazer/cardano/lazer-perps/screenshots/02_open_position.txt create mode 100644 lazer/cardano/lazer-perps/screenshots/03_close_position.txt create mode 100644 lazer/cardano/lazer-perps/screenshots/04_liquidate.txt create mode 100644 lazer/cardano/lazer-perps/screenshots/05_keeper.txt diff --git a/lazer/cardano/lazer-perps/screenshots/01_aiken_build.txt b/lazer/cardano/lazer-perps/screenshots/01_aiken_build.txt new file mode 100644 index 00000000..8d62b5f8 --- /dev/null +++ b/lazer/cardano/lazer-perps/screenshots/01_aiken_build.txt @@ -0,0 +1,14 @@ + Compiling team/lazer-perps 0.0.0 (.) + Resolving team/lazer-perps + Fetched 2 packages in 0.01s from cache + Compiling aiken-lang/stdlib v3.0.0 (./build/packages/aiken-lang-stdlib) + Compiling pyth-network/pyth-lazer-cardano main (./build/packages/pyth-network-pyth-lazer-cardano) + Generating project's blueprint (./plutus.json) + OK: close_position.close_position.spend + OK: close_position.close_position.else + OK: liquidate.liquidate.spend + OK: liquidate.liquidate.else + OK: open_position.open_position.spend + OK: open_position.open_position.else + OK: pool_manager.pool_manager.spend + OK: pool_manager.pool_manager.else diff --git a/lazer/cardano/lazer-perps/screenshots/02_open_position.txt b/lazer/cardano/lazer-perps/screenshots/02_open_position.txt new file mode 100644 index 00000000..dfdee38a --- /dev/null +++ b/lazer/cardano/lazer-perps/screenshots/02_open_position.txt @@ -0,0 +1,19 @@ + +> lazer-perps@1.0.0 open-position +> npx tsx src/open_position.ts + +=== Open LONG 5x on XAUT/USD (Tether Gold) === + Collateral: 100.00 ADA + Leverage cap: 10x + +1. Fetching price witness from Pyth Lazer... + Price: 452247704107 (exp: -8) + Payload: 151 bytes + +2. Building open position tx... +3. Signing and submitting... + Tx: ccb967d2c1692a06fd293553ddce4d494718eebf81c25e647556b6e6fd343bb9 + https://preprod.cardanoscan.io/transaction/ccb967d2c1692a06fd293553ddce4d494718eebf81c25e647556b6e6fd343bb9 + +Waiting for confirmation... +Position opened: LONG 5x XAUT/USD (Tether Gold) (100.00 ADA) diff --git a/lazer/cardano/lazer-perps/screenshots/03_close_position.txt b/lazer/cardano/lazer-perps/screenshots/03_close_position.txt new file mode 100644 index 00000000..2a43c06c --- /dev/null +++ b/lazer/cardano/lazer-perps/screenshots/03_close_position.txt @@ -0,0 +1,16 @@ + +> lazer-perps@1.0.0 close-position +> npx tsx src/close_position.ts + +=== Close position on XAUT/USD (Tether Gold) === + +1. Fetching exit price witness... + Exit price: 452498566197 (exp: -8) + +2. Building close position tx... +3. Signing and submitting... + Tx: 6532eebc942166b562baf58c535284b6fffa56d794c434421f141842e5b29d47 + https://preprod.cardanoscan.io/transaction/6532eebc942166b562baf58c535284b6fffa56d794c434421f141842e5b29d47 + +Waiting for confirmation... +Position closed on XAUT/USD (Tether Gold). PnL settled. diff --git a/lazer/cardano/lazer-perps/screenshots/04_liquidate.txt b/lazer/cardano/lazer-perps/screenshots/04_liquidate.txt new file mode 100644 index 00000000..79975ff4 --- /dev/null +++ b/lazer/cardano/lazer-perps/screenshots/04_liquidate.txt @@ -0,0 +1,16 @@ + +> lazer-perps@1.0.0 liquidate +> npx tsx src/liquidate.ts + +=== Liquidation on XAUT/USD (Tether Gold) === + +1. Fetching price witness... + Current price: 450996129938 (exp: -8) + +2. Building liquidation tx... +3. Signing and submitting... + Tx: 477bfe3ffb991f745b6ce50c38564e099af415fc5e3b2177358d0d03dfdce4dd + https://preprod.cardanoscan.io/transaction/477bfe3ffb991f745b6ce50c38564e099af415fc5e3b2177358d0d03dfdce4dd + +Waiting for confirmation... +Liquidation executed on XAUT/USD (Tether Gold). Keeper fee: 1%. diff --git a/lazer/cardano/lazer-perps/screenshots/05_keeper.txt b/lazer/cardano/lazer-perps/screenshots/05_keeper.txt new file mode 100644 index 00000000..cfce8f75 --- /dev/null +++ b/lazer/cardano/lazer-perps/screenshots/05_keeper.txt @@ -0,0 +1,188 @@ +=== Lazer Perps Keeper === + +Monitoring markets: XAU/USD (Gold), XAG/USD (Silver), XAUT/USD (Tether Gold) + +Mock positions: + XAUT/USD (Tether Gold) LONG 5x — entry: 4480000000, liq_price: 3628800000 + XAU/USD (Gold) SHORT 10x — entry: 3300000, liq_price: 3597000 + +Keeper running. Press Ctrl+C to stop. + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508957, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508957, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508958, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508960, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508860, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508892, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508850, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508855, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + +[2026-03-22T22:38:00.239Z] XAU/USD (Gold): 4508748 (exp: -3) | SHORT 10x → LIQUIDATABLE + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508748, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508867, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508797, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508791, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508658, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508647, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508574, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508502, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508502, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508484, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508484, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508427, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508335, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508290, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508291, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508232, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508230, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + +[2026-03-22T22:38:03.441Z] XAUT/USD (Tether Gold): 450784167483 (exp: -8) | LONG 5x → safe + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508341, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508378, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508296, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508299, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508258, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508218, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508290, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508274, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + +[2026-03-22T22:38:05.240Z] XAU/USD (Gold): 4508260 (exp: -3) | SHORT 10x → LIQUIDATABLE + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508260, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + + +*** LIQUIDATION TRIGGER: XAU/USD (Gold) SHORT 10x *** + Current: 4508226, Liq price: 3597000 + → In production: submit liquidation tx via orchestrator + From b570efac493b896ce3e1a2004b829a2906507f06 Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 19:46:37 -0300 Subject: [PATCH 13/20] Update tx hashes to match terminal captures --- lazer/cardano/lazer-perps/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lazer/cardano/lazer-perps/README.md b/lazer/cardano/lazer-perps/README.md index 45597240..02273055 100644 --- a/lazer/cardano/lazer-perps/README.md +++ b/lazer/cardano/lazer-perps/README.md @@ -102,9 +102,9 @@ Pyth Lazer Server Cardano PreProd | Type | Feed | Tx Hash | |------|------|---------| -| Open position | XAUT/USD | [`96f8e76c...`](https://preprod.cardanoscan.io/transaction/96f8e76c00efdbb2e662a1ffc721cd09a02a330cefd2db90fcfcbbf0b7b854de) | -| Close position | XAUT/USD | [`4428816d...`](https://preprod.cardanoscan.io/transaction/4428816d106a67331077b7eb83ec54f97696000d1d5a8e2a059acc6c7418ff1e) | -| Liquidate | XAUT/USD | [`3b4e5590...`](https://preprod.cardanoscan.io/transaction/3b4e5590157cba456f130b69855f717fe62a8875ac7f02a394797aa32b3bff72) | +| Open position | XAUT/USD | [`ccb967d2...`](https://preprod.cardanoscan.io/transaction/ccb967d2c1692a06fd293553ddce4d494718eebf81c25e647556b6e6fd343bb9) | +| Close position | XAUT/USD | [`6532eebc...`](https://preprod.cardanoscan.io/transaction/6532eebc942166b562baf58c535284b6fffa56d794c434421f141842e5b29d47) | +| Liquidate | XAUT/USD | [`477bfe3f...`](https://preprod.cardanoscan.io/transaction/477bfe3ffb991f745b6ce50c38564e099af415fc5e3b2177358d0d03dfdce4dd) | ## How to run From 92453c80f0bd6c443d3f559961b9d768af973fe4 Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 20:10:35 -0300 Subject: [PATCH 14/20] Add 12 unit tests for formulas + fix unused import Tests (all passing): - pnl_long_profit, pnl_long_loss, pnl_short_profit, pnl_short_loss - payout_positive, payout_zero_floor - liq_price_long_10x, liq_price_short_10x - liquidatable_long_yes/no, liquidatable_short_yes/no Fix: remove unused keeper_fee_bps import from liquidate.ak --- lazer/cardano/lazer-perps/onchain/aiken.lock | 2 +- .../onchain/lib/lazer_perps/formulas.ak | 78 +++++++++++++++++++ .../onchain/validators/liquidate.ak | 3 +- 3 files changed, 80 insertions(+), 3 deletions(-) diff --git a/lazer/cardano/lazer-perps/onchain/aiken.lock b/lazer/cardano/lazer-perps/onchain/aiken.lock index 30195bbd..1ab32acf 100644 --- a/lazer/cardano/lazer-perps/onchain/aiken.lock +++ b/lazer/cardano/lazer-perps/onchain/aiken.lock @@ -24,4 +24,4 @@ requirements = [] source = "github" [etags] -"pyth-network/pyth-lazer-cardano@main" = [{ secs_since_epoch = 1774212630, nanos_since_epoch = 812424000 }, "a46dacd97a22eb07feeaf966d48c3116c8249ddc836705656e3135cea285bcfc"] +"pyth-network/pyth-lazer-cardano@main" = [{ secs_since_epoch = 1774220844, nanos_since_epoch = 251098000 }, "a46dacd97a22eb07feeaf966d48c3116c8249ddc836705656e3135cea285bcfc"] diff --git a/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/formulas.ak b/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/formulas.ak index 8dc02c60..8276031c 100644 --- a/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/formulas.ak +++ b/lazer/cardano/lazer-perps/onchain/lib/lazer_perps/formulas.ak @@ -93,3 +93,81 @@ pub fn is_liquidatable( } } } + +// ─── Tests ─────────────────────────────────────────────────────────── + +// PnL: Long 5x, entry 3000, exit 3100, collateral 100 +// PnL = 100 * 5 * (3100 - 3000) / 3000 = 500 * 100 / 3000 = 16.67 +test pnl_long_profit() { + let pnl = compute_pnl(Long, 100, 5, 3000, 3100) + rational.round(pnl) == 17 +} + +// PnL: Long 5x, entry 3000, exit 2900, collateral 100 +// PnL = 100 * 5 * (2900 - 3000) / 3000 = -16.67 +test pnl_long_loss() { + let pnl = compute_pnl(Long, 100, 5, 3000, 2900) + rational.round(pnl) == -17 +} + +// PnL: Short 5x, entry 3000, exit 2900, collateral 100 +// PnL = 100 * 5 * (3000 - 2900) / 3000 = 16.67 +test pnl_short_profit() { + let pnl = compute_pnl(Short, 100, 5, 3000, 2900) + rational.round(pnl) == 17 +} + +// PnL: Short 5x, entry 3000, exit 3100, collateral 100 +// PnL = 100 * 5 * (3000 - 3100) / 3000 = -16.67 +test pnl_short_loss() { + let pnl = compute_pnl(Short, 100, 5, 3000, 3100) + rational.round(pnl) == -17 +} + +// Payout: collateral 100 + PnL 50 = 150 +test payout_positive() { + let pnl = rational.from_int(50) + let payout = compute_payout(100, pnl) + rational.round(payout) == 150 +} + +// Payout floor: collateral 100 + PnL -200 → max(0, -100) = 0 +test payout_zero_floor() { + let pnl = rational.from_int(-200) + let payout = compute_payout(100, pnl) + rational.round(payout) == 0 +} + +// Liq price Long 10x, entry 3000: +// liq = 3000 * (101*10 - 100) / (100*10) = 3000 * 910 / 1000 = 2730 +test liq_price_long_10x() { + let liq = liquidation_price_long(3000, 10) + rational.round(liq) == 2730 +} + +// Liq price Short 10x, entry 3000: +// liq = 3000 * (99*10 + 100) / (100*10) = 3000 * 1090 / 1000 = 3270 +test liq_price_short_10x() { + let liq = liquidation_price_short(3000, 10) + rational.round(liq) == 3270 +} + +// Long at 2700 (below liq 2730) → liquidatable +test liquidatable_long_yes() { + is_liquidatable(Long, 3000, 10, 2700) == True +} + +// Long at 2800 (above liq 2730) → safe +test liquidatable_long_no() { + is_liquidatable(Long, 3000, 10, 2800) == False +} + +// Short at 3300 (above liq 3270) → liquidatable +test liquidatable_short_yes() { + is_liquidatable(Short, 3000, 10, 3300) == True +} + +// Short at 3200 (below liq 3270) → safe +test liquidatable_short_no() { + is_liquidatable(Short, 3000, 10, 3200) == False +} diff --git a/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak b/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak index 43bf9b90..86fef8f2 100644 --- a/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak +++ b/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak @@ -1,9 +1,8 @@ -use aiken/math/rational use cardano/assets.{PolicyId} use cardano/transaction.{Transaction} use lazer_perps/formulas use lazer_perps/oracle_gate -use lazer_perps/types.{MarketConfig, PositionDatum, keeper_fee_bps} +use lazer_perps/types.{MarketConfig, PositionDatum} /// Liquidation validator. /// From 4028f78c51302a5e122cad87253ebf8ca839f1ea Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 20:13:50 -0300 Subject: [PATCH 15/20] Remove unused imports from all validators --- lazer/cardano/lazer-perps/onchain/validators/close_position.ak | 2 -- lazer/cardano/lazer-perps/onchain/validators/liquidate.ak | 1 - lazer/cardano/lazer-perps/onchain/validators/open_position.ak | 1 - lazer/cardano/lazer-perps/onchain/validators/pool_manager.ak | 1 - 4 files changed, 5 deletions(-) diff --git a/lazer/cardano/lazer-perps/onchain/validators/close_position.ak b/lazer/cardano/lazer-perps/onchain/validators/close_position.ak index e689f0d5..5606e2b7 100644 --- a/lazer/cardano/lazer-perps/onchain/validators/close_position.ak +++ b/lazer/cardano/lazer-perps/onchain/validators/close_position.ak @@ -1,6 +1,4 @@ use aiken/collection/list -use aiken/math/rational -use cardano/assets.{PolicyId} use cardano/transaction.{Transaction} use lazer_perps/formulas use lazer_perps/oracle_gate diff --git a/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak b/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak index 86fef8f2..6a769853 100644 --- a/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak +++ b/lazer/cardano/lazer-perps/onchain/validators/liquidate.ak @@ -1,4 +1,3 @@ -use cardano/assets.{PolicyId} use cardano/transaction.{Transaction} use lazer_perps/formulas use lazer_perps/oracle_gate diff --git a/lazer/cardano/lazer-perps/onchain/validators/open_position.ak b/lazer/cardano/lazer-perps/onchain/validators/open_position.ak index 04eb55be..07951344 100644 --- a/lazer/cardano/lazer-perps/onchain/validators/open_position.ak +++ b/lazer/cardano/lazer-perps/onchain/validators/open_position.ak @@ -1,4 +1,3 @@ -use cardano/assets.{PolicyId} use cardano/transaction.{Transaction} use lazer_perps/oracle_gate use lazer_perps/types.{MarketConfig, PositionDatum} diff --git a/lazer/cardano/lazer-perps/onchain/validators/pool_manager.ak b/lazer/cardano/lazer-perps/onchain/validators/pool_manager.ak index 8ba94ade..ee8c4537 100644 --- a/lazer/cardano/lazer-perps/onchain/validators/pool_manager.ak +++ b/lazer/cardano/lazer-perps/onchain/validators/pool_manager.ak @@ -1,4 +1,3 @@ -use cardano/assets.{PolicyId} use cardano/transaction.{Transaction} use lazer_perps/types.{MarketConfig, PoolState} From 5c9cdfac824f3eba1234e32dfaa1b7430365fb1b Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 20:16:57 -0300 Subject: [PATCH 16/20] Fix 3 aiken warnings: use expect for _payout, discard unused config and self --- .../cardano/lazer-perps/onchain/validators/close_position.ak | 2 +- lazer/cardano/lazer-perps/onchain/validators/pool_manager.ak | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lazer/cardano/lazer-perps/onchain/validators/close_position.ak b/lazer/cardano/lazer-perps/onchain/validators/close_position.ak index 5606e2b7..d646dce1 100644 --- a/lazer/cardano/lazer-perps/onchain/validators/close_position.ak +++ b/lazer/cardano/lazer-perps/onchain/validators/close_position.ak @@ -43,7 +43,7 @@ validator close_position(config: MarketConfig) { ) // Payout = max(0, collateral + PnL) - let _payout = + expect _payout = formulas.compute_payout(position.collateral, pnl) signed_by_trader && valid_prices diff --git a/lazer/cardano/lazer-perps/onchain/validators/pool_manager.ak b/lazer/cardano/lazer-perps/onchain/validators/pool_manager.ak index ee8c4537..6c177a66 100644 --- a/lazer/cardano/lazer-perps/onchain/validators/pool_manager.ak +++ b/lazer/cardano/lazer-perps/onchain/validators/pool_manager.ak @@ -23,12 +23,12 @@ pub type PoolAction { /// The pool receives funds on losing trades and pays out on winning trades. /// All state transitions require a valid continuation output with /// updated PoolState datum. -validator pool_manager(config: MarketConfig) { +validator pool_manager(_config: MarketConfig) { spend( datum: Option, redeemer: PoolAction, _own_ref: Data, - self: Transaction, + _self: Transaction, ) { expect Some(pool) = datum From 4d2f1face0fa0607d3f4ddd24ee0b29ab4e87372 Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 20:23:56 -0300 Subject: [PATCH 17/20] Add Aiken commands section to README --- lazer/cardano/lazer-perps/README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/lazer/cardano/lazer-perps/README.md b/lazer/cardano/lazer-perps/README.md index 02273055..427a4ca4 100644 --- a/lazer/cardano/lazer-perps/README.md +++ b/lazer/cardano/lazer-perps/README.md @@ -123,6 +123,27 @@ npm install cd onchain && aiken build && cd .. ``` +### Aiken commands + +```bash +cd onchain + +# Compile all validators → generates plutus.json +aiken build + +# Run all 12 unit tests (PnL, payout, liquidation price, triggers) +aiken check + +# Check a specific test +aiken check -m "pnl_long_profit" + +# Generate project documentation +aiken docs + +# Clean build artifacts +rm -rf build plutus.json +``` + ### Commands ```bash From 75ebe12e6a82941ea0d89e4fe0789401e860fdda Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 20:28:14 -0300 Subject: [PATCH 18/20] Add aiken check capture: 12/12 tests passing --- .../screenshots/06_aiken_check_tests.txt | 143 ++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 lazer/cardano/lazer-perps/screenshots/06_aiken_check_tests.txt diff --git a/lazer/cardano/lazer-perps/screenshots/06_aiken_check_tests.txt b/lazer/cardano/lazer-perps/screenshots/06_aiken_check_tests.txt new file mode 100644 index 00000000..67f1952b --- /dev/null +++ b/lazer/cardano/lazer-perps/screenshots/06_aiken_check_tests.txt @@ -0,0 +1,143 @@ + Compiling team/lazer-perps 0.0.0 (.) + Resolving team/lazer-perps + Fetched 1 package in 0.01s from cache + Compiling aiken-lang/stdlib v3.0.0 (./build/packages/aiken-lang-stdlib) + Compiling pyth-network/pyth-lazer-cardano main (./build/packages/pyth-network-pyth-lazer-cardano) + Collecting all tests scenarios across all modules + Testing ... +{ + "seed": 2131193227, + "summary": { + "total": 12, + "passed": 12, + "failed": 0, + "kind": { + "unit": 12, + "property": 0 + } + }, + "modules": [ + { + "name": "lazer_perps/formulas", + "summary": { + "total": 12, + "passed": 12, + "failed": 0, + "kind": { + "unit": 12, + "property": 0 + } + }, + "tests": [ + { + "title": "pnl_long_profit", + "status": "pass", + "on_failure": "fail_immediately", + "execution_units": { + "mem": 38109, + "cpu": 11660314 + } + }, + { + "title": "pnl_long_loss", + "status": "pass", + "on_failure": "fail_immediately", + "execution_units": { + "mem": 38511, + "cpu": 11825522 + } + }, + { + "title": "pnl_short_profit", + "status": "pass", + "on_failure": "fail_immediately", + "execution_units": { + "mem": 38109, + "cpu": 11660314 + } + }, + { + "title": "pnl_short_loss", + "status": "pass", + "on_failure": "fail_immediately", + "execution_units": { + "mem": 38511, + "cpu": 11825522 + } + }, + { + "title": "payout_positive", + "status": "pass", + "on_failure": "fail_immediately", + "execution_units": { + "mem": 49736, + "cpu": 16020221 + } + }, + { + "title": "payout_zero_floor", + "status": "pass", + "on_failure": "fail_immediately", + "execution_units": { + "mem": 48634, + "cpu": 15722882 + } + }, + { + "title": "liq_price_long_10x", + "status": "pass", + "on_failure": "fail_immediately", + "execution_units": { + "mem": 32402, + "cpu": 9936219 + } + }, + { + "title": "liq_price_short_10x", + "status": "pass", + "on_failure": "fail_immediately", + "execution_units": { + "mem": 32402, + "cpu": 9936219 + } + }, + { + "title": "liquidatable_long_yes", + "status": "pass", + "on_failure": "fail_immediately", + "execution_units": { + "mem": 22709, + "cpu": 7378811 + } + }, + { + "title": "liquidatable_long_no", + "status": "pass", + "on_failure": "fail_immediately", + "execution_units": { + "mem": 24312, + "cpu": 7832199 + } + }, + { + "title": "liquidatable_short_yes", + "status": "pass", + "on_failure": "fail_immediately", + "execution_units": { + "mem": 23811, + "cpu": 7676150 + } + }, + { + "title": "liquidatable_short_no", + "status": "pass", + "on_failure": "fail_immediately", + "execution_units": { + "mem": 23210, + "cpu": 7534860 + } + } + ] + } + ] +} From 19157c4a608c1356fcb9cf4331bb388ba63a4636 Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 20:37:17 -0300 Subject: [PATCH 19/20] aiken check --- ...ot 2026-03-22 at 8.36.12\342\200\257PM.png" | Bin 0 -> 247064 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "lazer/cardano/lazer-perps/screenshots/Screenshot 2026-03-22 at 8.36.12\342\200\257PM.png" diff --git "a/lazer/cardano/lazer-perps/screenshots/Screenshot 2026-03-22 at 8.36.12\342\200\257PM.png" "b/lazer/cardano/lazer-perps/screenshots/Screenshot 2026-03-22 at 8.36.12\342\200\257PM.png" new file mode 100644 index 0000000000000000000000000000000000000000..a1097eb6f4be72ad445521c84eb896eb340ef476 GIT binary patch literal 247064 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 bphzOf>BemfDbM1Umw-!CLsz|0)i&xcu?YL+ literal 0 HcmV?d00001 From 9668b0d69ebe7caf16570f1d2b3721144998ef55 Mon Sep 17 00:00:00 2001 From: mariaelisaaraya Date: Sun, 22 Mar 2026 20:48:17 -0300 Subject: [PATCH 20/20] Add email contacts to README and PR --- lazer/cardano/lazer-perps/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lazer/cardano/lazer-perps/README.md b/lazer/cardano/lazer-perps/README.md index 427a4ca4..5a470d70 100644 --- a/lazer/cardano/lazer-perps/README.md +++ b/lazer/cardano/lazer-perps/README.md @@ -5,7 +5,7 @@ Team Name: Lazer Perps Submission Name: lazer-perps Team Members: María Elisa Araya ([@ar3lisa](https://x.com/ar3lisa)), Bárbara Olivera ([@b4rbbb](https://x.com/b4rbbb)) -Contact: https://x.com/ar3lisa / https://x.com/b4rbbb +Contact: araya3lisa@gmail.com / brb.olivera@gmail.com > Direct extension of our [Lazer RWA](../lazer-rwa/) submission — same oracle integration, expanded into a perpetual futures protocol.