From 9f45fd9624ba499295d8cfec37e1ebe420e4beff Mon Sep 17 00:00:00 2001 From: Satya Date: Sat, 17 Oct 2026 13:28:42 +0800 Subject: [PATCH] Viewer: re-run a transaction's scripts in the browser (Script Lab) The Scripts tab of a transaction can now re-run every script with julc: the transaction is rebuilt from Yaci Store data and each redeemer runs with the cost model and protocol version of its epoch. Results show julc's budget next to the declared one ("Reproduced exactly", or reproduced with the builder's margin), traces, the failure and last builtins, and the exact ScriptContext. - replay/build.ts: MockTransaction per redeemer in ledger order (inputs, values, mint, withdrawals, votes), slot -> POSIX time (Shelley constants for public networks, /genesis for devnets), epoch cost models and tx limits; explains runs it can't rebuild (Byron addresses, proposals, unsupported certificates) and adds notes on known gaps. - replay/fix-context.ts: workarounds until julc builds ledger-exact contexts (julc#244): asset values in ledger order, the complete redeemer map (withdraw-zero validators), datums given by hash, and V1 list shapes. Corrected contexts are run again with the VM; each result says what changed. - cbor.ts: Plutus data encoder (Plutus-library style), round-trip tested. - load.ts: fetches the rest only on click; certificates and votes only when a script needs them; falls back to the latest parameters when an epoch's are missing. Mainnet checks: 40 recent transactions, 108 runs, all passed (80 exact, 5 with builder margin). 2023 Plutus V1 history: 8 of 17 runs pass; julc's V1 fixes after pre18 should improve this. Co-Authored-By: Claude Opus 5.5 --- applications/viewer/README.md | 13 +- applications/viewer/src/lib/cbor.test.ts | 28 +- applications/viewer/src/lib/cbor.ts | 72 ++++ .../viewer/src/lib/julc/ScriptCode.svelte | 2 +- .../viewer/src/lib/julc/ScriptRuns.svelte | 319 ++++++++++++++++ .../viewer/src/lib/julc/replay/build.test.ts | 139 +++++++ .../viewer/src/lib/julc/replay/build.ts | 354 ++++++++++++++++++ .../src/lib/julc/replay/fix-context.test.ts | 82 ++++ .../viewer/src/lib/julc/replay/fix-context.ts | 168 +++++++++ .../julc/replay/fixtures/mainnet-mint.json | 1 + .../lib/julc/replay/fixtures/mainnet-v3.json | 1 + .../replay/fixtures/mainnet-withdrawZero.json | 1 + .../viewer/src/lib/julc/replay/load.ts | 88 +++++ .../viewer/src/lib/julc/replay/slots.ts | 39 ++ applications/viewer/src/lib/julc/types.ts | 103 +++++ .../viewer/src/lib/tx/ScriptCard.svelte | 9 +- .../src/routes/transactions/[id]/+page.svelte | 13 +- applications/viewer/tests/script-lab.spec.ts | 31 +- 18 files changed, 1446 insertions(+), 17 deletions(-) create mode 100644 applications/viewer/src/lib/julc/ScriptRuns.svelte create mode 100644 applications/viewer/src/lib/julc/replay/build.test.ts create mode 100644 applications/viewer/src/lib/julc/replay/build.ts create mode 100644 applications/viewer/src/lib/julc/replay/fix-context.test.ts create mode 100644 applications/viewer/src/lib/julc/replay/fix-context.ts create mode 100644 applications/viewer/src/lib/julc/replay/fixtures/mainnet-mint.json create mode 100644 applications/viewer/src/lib/julc/replay/fixtures/mainnet-v3.json create mode 100644 applications/viewer/src/lib/julc/replay/fixtures/mainnet-withdrawZero.json create mode 100644 applications/viewer/src/lib/julc/replay/load.ts create mode 100644 applications/viewer/src/lib/julc/replay/slots.ts diff --git a/applications/viewer/README.md b/applications/viewer/README.md index a90e9db..282c98e 100644 --- a/applications/viewer/README.md +++ b/applications/viewer/README.md @@ -8,8 +8,10 @@ A live Cardano explorer for your Yaci DevKit devnet, or any [Yaci Store](https:/ transaction, address, stake address, pool, DRep, policy, asset, fingerprint, script, datum or epoch. - **Transactions you can read:** inputs flow into outputs, scripts show their execution budget, redeemers and datums are decoded from CBOR, plus mints, metadata, collateral, reference inputs and the raw JSON. -- **Script Lab:** decode any Plutus script into searchable UPLC, see the builtins it uses and verify its hash. It runs - in your browser with the [julc](https://github.com/bloxbean/julc) WebAssembly engine. +- **Script Lab:** in your browser, with the [julc](https://github.com/bloxbean/julc) WebAssembly engine: + - decode any Plutus script into searchable UPLC, see the builtins it uses and verify its hash; + - re-run every script of a transaction with the cost model of its epoch, compare the budget with what was declared + on chain, and see the exact ScriptContext the validator received. - Addresses, stake accounts, assets, epochs and protocol parameters, pools, rewards, certificates, Ada pots and Conway governance. - Light and dark themes; works on a phone. @@ -69,7 +71,12 @@ into `static/julc/` (git-ignored). The engine is only downloaded by the browser release's `julc-wasm--SHA256SUMS.txt`. - The engine needs WebAssembly GC and exception handling (exnref): current Chrome, Edge, Firefox and Safari. Other browsers get a message instead. Playwright's bundled Chromium is too old, so run the Script Lab test with Chrome: - `SCRIPT_LAB_HASH= PW_CHANNEL=chrome npx playwright test script-lab`. + `SCRIPT_LAB_HASH= SCRIPT_LAB_TX= PW_CHANNEL=chrome npx playwright test script-lab`. +- Re-runs rebuild the transaction from Yaci Store data (`src/lib/julc/replay/`). Until julc builds contexts exactly + as the ledger does ([julc#244](https://github.com/bloxbean/julc/issues/244)), the viewer corrects julc's context + (asset order, the other redeemers, datums given by hash, Plutus V1 shapes) and runs the script again; each result + says what was corrected. Proposal (guardrail) scripts and most certificate kinds aren't replayed yet, and Plutus V1 + (pre-2023 history) is partly reproduced. SvelteKit 2, Svelte 5 and Tailwind. Shared code lives in `src/lib`: `api/` (Yaci Store client), `live/` (WebSocket with a polling fallback), `ui/` (components), `shell/` (layout, navigation, search), `julc/` (Script Lab) and `format.ts`, `cbor.ts`, diff --git a/applications/viewer/src/lib/cbor.test.ts b/applications/viewer/src/lib/cbor.test.ts index 25af651..c09d131 100644 --- a/applications/viewer/src/lib/cbor.test.ts +++ b/applications/viewer/src/lib/cbor.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { decodePlutusData, tryDecodePlutusData } from './cbor'; +import { decodePlutusData, encodePlutusData, tryDecodePlutusData, type PlutusData } from './cbor'; describe('decodePlutusData', () => { it('decodes constructors', () => { @@ -28,3 +28,29 @@ describe('decodePlutusData', () => { expect(tryDecodePlutusData(null)).toBeNull(); }); }); + +describe('encodePlutusData', () => { + it('encodes the way the Plutus libraries do', () => { + expect(encodePlutusData({ constructor: 0, fields: [] })).toBe('d87980'); + expect(encodePlutusData({ constructor: 0, fields: [{ int: '42' }, { bytes: 'cafe' }] })).toBe('d8799f182a42cafeff'); + expect(encodePlutusData({ constructor: 7, fields: [] })).toBe('d9050080'); + expect(encodePlutusData({ constructor: 200, fields: [] })).toBe('d8668218c880'); + expect(encodePlutusData({ int: '-1' })).toBe('20'); + expect(encodePlutusData({ map: [{ k: { int: '1' }, v: { int: '2' } }] })).toBe('a10102'); + expect(encodePlutusData({ int: (1n << 64n).toString() })).toBe('c249010000000000000000'); + expect(encodePlutusData({ int: (-(1n << 64n) - 1n).toString() })).toBe('c349010000000000000000'); + expect(encodePlutusData({ int: (-(1n << 64n)).toString() })).toBe('3bffffffffffffffff'); + }); + + it('round-trips through the decoder, including chunked bytes', () => { + const samples: PlutusData[] = [ + { bytes: 'ab'.repeat(100) }, + { constructor: 2, fields: [{ list: [{ map: [] }, { int: '18446744073709551615' }, { int: '-18446744073709551617' }] }] }, + { map: [{ k: { bytes: '' }, v: { constructor: 130, fields: [{ int: '0' }] } }, { k: { bytes: '' }, v: { list: [] } }] } + ]; + for (const d of samples) expect(decodePlutusData(encodePlutusData(d))).toEqual(d); + const long = encodePlutusData({ bytes: 'ab'.repeat(100) }); + expect(long.startsWith('5f5840')).toBe(true); + expect(long.endsWith('ff')).toBe(true); + }); +}); diff --git a/applications/viewer/src/lib/cbor.ts b/applications/viewer/src/lib/cbor.ts index 68b5785..85f859d 100644 --- a/applications/viewer/src/lib/cbor.ts +++ b/applications/viewer/src/lib/cbor.ts @@ -144,3 +144,75 @@ export function tryDecodePlutusData(hex: string | null | undefined): PlutusData return null; } } + +// Not `'constructor' in d`: every object inherits a `constructor` property. +const isConstr = (d: PlutusData): d is { constructor: number; fields: PlutusData[] } => typeof (d as { constructor: unknown }).constructor === 'number'; + +/* + * Encode Plutus data to CBOR hex the way the Plutus libraries do: indefinite-length lists (definite when empty), + * byte strings over 64 bytes in 64-byte chunks, integers beyond 64 bits as bignums, and constructor tags + * 121-127 / 1280-1400 / 102. Used to hand a modified ScriptContext back to the julc VM. + */ +export function encodePlutusData(d: PlutusData): string { + const out: number[] = []; + const head = (major: number, n: bigint) => { + const m = major << 5; + if (n < 24n) out.push(m | Number(n)); + else if (n < 0x100n) out.push(m | 24, Number(n)); + else if (n < 0x10000n) out.push(m | 25, Number(n >> 8n), Number(n & 0xffn)); + else if (n < 0x100000000n) out.push(m | 26, ...[24n, 16n, 8n, 0n].map((s) => Number((n >> s) & 0xffn))); + else out.push(m | 27, ...[56n, 48n, 40n, 32n, 24n, 16n, 8n, 0n].map((s) => Number((n >> s) & 0xffn))); + }; + const bytes = (b: number[]) => { + if (b.length <= 64) { + head(2, BigInt(b.length)); + out.push(...b); + return; + } + out.push(0x5f); + for (let i = 0; i < b.length; i += 64) { + const chunk = b.slice(i, i + 64); + head(2, BigInt(chunk.length)); + out.push(...chunk); + } + out.push(0xff); + }; + const list = (items: PlutusData[]) => { + if (!items.length) return out.push(0x80); + out.push(0x9f); + items.forEach(write); + out.push(0xff); + }; + const write = (x: PlutusData): void => { + if (isConstr(x)) { + const c = x.constructor; + if (c <= 6) head(6, BigInt(121 + c)); + else if (c <= 127) head(6, BigInt(1280 + c - 7)); + else { + head(6, 102n); + out.push(0x82); + head(0, BigInt(c)); + } + list(x.fields); + } else if ('int' in x) { + const v = BigInt(x.int); + const n = v < 0n ? -1n - v : v; + if (n < 1n << 64n) head(v < 0n ? 1 : 0, n); + else { + head(6, v < 0n ? 3n : 2n); + const hex = n.toString(16); + bytes((hex.length % 2 ? '0' + hex : hex).match(/../g)!.map((h) => parseInt(h, 16))); + } + } else if ('bytes' in x) bytes((x.bytes.match(/../g) ?? []).map((h) => parseInt(h, 16))); + else if ('list' in x) list(x.list); + else { + head(5, BigInt(x.map.length)); + for (const { k, v } of x.map) { + write(k); + write(v); + } + } + }; + write(d); + return out.map((b) => b.toString(16).padStart(2, '0')).join(''); +} diff --git a/applications/viewer/src/lib/julc/ScriptCode.svelte b/applications/viewer/src/lib/julc/ScriptCode.svelte index 2175cec..3f99bde 100644 --- a/applications/viewer/src/lib/julc/ScriptCode.svelte +++ b/applications/viewer/src/lib/julc/ScriptCode.svelte @@ -96,7 +96,7 @@ {:else if failure} diff --git a/applications/viewer/src/lib/julc/ScriptRuns.svelte b/applications/viewer/src/lib/julc/ScriptRuns.svelte new file mode 100644 index 0000000..9971b45 --- /dev/null +++ b/applications/viewer/src/lib/julc/ScriptRuns.svelte @@ -0,0 +1,319 @@ + + +{#if runnable && installed !== false} +
+
+ +
+

Re-run in your browser

+

+ {#if !supported} + This browser can’t run the julc engine (it needs WebAssembly GC and exception handling). Use a current Chrome, Edge, Firefox or Safari. + {:else} + Execute {runnable === 1 ? 'the script' : `all ${runnable} scripts`} again with julc, using the cost model of epoch {page.epoch ?? 'latest'}, and compare with the budget declared on chain. + {/if} +

+ {#if invalid} +

This transaction failed script validation on chain. A re-run shows which script failed and why.

+ {/if} +
+ {#if supported} +
+ {#if phase === 'loading' || phase === 'running'} + + + {phase === 'loading' ? 'Rebuilding the transaction…' : julc.status === 'loading' ? 'Starting the julc engine…' : 'Running…'} + + {:else} + + {/if} + +
+ {/if} +
+ {#if phase === 'done' && done.length} +
+ {#if summary.exact}{summary.exact} reproduced exactly{/if} + {#if summary.margin}{summary.margin} reproduced with the builder’s margin{/if} + {#if summary.passed - summary.exact - summary.margin}{summary.passed - summary.exact - summary.margin} passed{/if} + {#if summary.failed}{summary.failed} failed{/if} + {#if summary.other}{summary.other} couldn’t run{/if} +
+ {/if} + {#if failure}

{failure}

{/if} +
+{/if} + +
+ {#each page.scripts as s, i (s.script_hash + i)} + {@const key = keyOf(s)} + {@const r = key ? results[key] : undefined} + + {#if r} +
+
+ julc re-run + {#if r.state === 'running'} + Waiting… + {:else if r.state === 'skipped' || r.state === 'error'} + Couldn’t run + {:else if passed(r)} + Passed + {@const m = margin(r)} + {#if exact(r)} + Reproduced exactly + {:else if m != null} + Reproduced · declared with a {m}% margin + {/if} + {:else} + {r.evaluation?.status === 'budgetExhausted' ? 'Out of budget' : 'Failed'} + {/if} + {#if r.ms != null}{r.ms} ms{/if} +
+ + {#if r.error}

{r.error}

{/if} + + {#if r.evaluation} + {@const ev = r.evaluation} + {#if r.plan.declared} +
+ {#each [{ label: 'Memory', got: ev.mem, want: r.plan.declared.mem }, { label: 'CPU steps', got: ev.cpu, want: r.plan.declared.steps }] as b (b.label)} +
+ + {b.label} + {num(b.got)} / {num(b.want)} declared + {#if b.got !== b.want} + {pct(b.got, b.want)}% + {/if} +
+ {/each} +
+ {/if} + {#if !passed(r) && ev.message}

{ev.message}

{/if} + {#if invalid} +

+ {passed(r) ? 'Passed here, though the transaction failed on chain: another script in it may have failed, or the rebuilt context differs.' : 'Failed on chain too.'} +

+ {/if} + {#if ev.traces?.length} +
+
Traces
+
    + {#each ev.traces as t, n}
  1. {n + 1}{t}
  2. {/each} +
+
+ {/if} + {#if !passed(r) && ev.lastBuiltins?.length} +
+ Last builtins + {#each ev.lastBuiltins as b}{b}{/each} +
+ {/if} + {#if ev.scriptContextCbor} +
+ What the validator saw (ScriptContext) +
+
+ {/if} + {/if} + + {#if r.plan.notes.length && r.state !== 'skipped'} +
    + {#each r.plan.notes as note}
  • {note}
  • {/each} +
+ {/if} +
+ {/if} +
+ {/each} +
diff --git a/applications/viewer/src/lib/julc/replay/build.test.ts b/applications/viewer/src/lib/julc/replay/build.test.ts new file mode 100644 index 0000000..a995cea --- /dev/null +++ b/applications/viewer/src/lib/julc/replay/build.test.ts @@ -0,0 +1,139 @@ +import { describe, expect, it } from 'vitest'; +import { bech32Encode } from '$lib/bech32'; +import { buildRuns, type ReplayInput, type StoreCert } from './build'; +import { slotConfigFor, slotToPosixMs } from './slots'; +import withdrawZero from './fixtures/mainnet-withdrawZero.json'; +import v3 from './fixtures/mainnet-v3.json'; +import mint from './fixtures/mainnet-mint.json'; + +/* + * Fixtures are Mainnet transactions captured from Yaci Store with the same requests as load.ts (script bodies + * trimmed). They were re-run in the browser with julc: withdrawZero's two spend redeemers reproduce their on-chain + * budgets exactly; its reward redeemer fails because the context lacks the other redeemers (julc#244). + */ + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function inputOf(f: any): ReplayInput { + const certificates: StoreCert[] = [ + ...f.stakes.map((s: { cert_index: number; address: string; registration: boolean }) => ({ cert_index: s.cert_index, type: s.registration ? 'registration' : 'deregistration', address: s.address })), + ...f.delegations.map((d: { cert_index: number; address: string; pool_id: string }) => ({ cert_index: d.cert_index, type: 'delegation', address: d.address, pool_id: d.pool_id })) + ]; + return { hash: f.hash, tx: f.tx, scripts: f.scripts, withdrawals: f.withdrawals, mints: f.mints, votes: f.votes, certificates, datums: {}, params: f.params, slots: slotConfigFor(f.genesis.network_magic, f.genesis) }; +} + +const stakeAddr = (header: number, fill: number) => bech32Encode('stake', new Uint8Array([header, ...Array(28).fill(fill)])); + +describe('slots', () => { + it('uses Shelley constants for public networks and genesis for devnets', () => { + const mainnet = slotConfigFor(764824073, { system_start: 1506203091, slot_length: 1 })!; + expect(slotToPosixMs(4492800, mainnet)).toBe(1596059091000n); + expect(slotToPosixMs(200642780, mainnet)).toBe(1596059091000n + (200642780n - 4492800n) * 1000n); + const devnet = slotConfigFor(42, { network_magic: 42, system_start: 1792193424, slot_length: 0.2 })!; + expect(slotToPosixMs(0, devnet)).toBe(1792193424000n); + expect(slotToPosixMs(10, devnet)).toBe(1792193426000n); + expect(slotConfigFor(42, null)).toBeNull(); + }); +}); + +describe('buildRuns', () => { + it('rebuilds a withdraw-zero transaction (Plutus V2) in ledger order', () => { + const runs = buildRuns(inputOf(withdrawZero)); + expect(runs.map((r) => r.key).sort()).toEqual(['reward#0', 'spend#0', 'spend#1']); + for (const r of runs) expect(r.skip).toBeUndefined(); + + const spend = runs.find((r) => r.key === 'spend#0')!; + const tx = spend.request!.transaction; + expect(spend.language).toBe('V2'); + expect(spend.declared).toEqual({ mem: 77308n, steps: 23525984n }); + expect(tx.purpose).toEqual({ type: 'spend', index: 0 }); + expect(tx.txId).toBe(withdrawZero.hash); + const refs = tx.inputs.map((i) => `${i.txId}#${i.index}`); + expect(refs).toEqual([...refs].sort()); + expect(tx.inputs[0].datum.kind).toBe('inline'); + expect(tx.validRange).toEqual({ + from: 1596059091000n + (BigInt(withdrawZero.tx.validity_interval_start) - 4492800n) * 1000n, + fromInclusive: true, + to: 1596059091000n + (BigInt(withdrawZero.tx.ttl) - 4492800n) * 1000n, + toInclusive: false + }); + expect(tx.signatories).toEqual(withdrawZero.tx.required_signers); + expect(tx.withdrawals).toEqual([{ credential: withdrawZero.withdrawals[0].address, amount: '0' }]); + + expect(spend.request!.target).toEqual({ language: 'PlutusV2', protocol: 11 }); + expect(spend.request!.costModel!.parameters.length).toBe(withdrawZero.params.cost_models_raw.PlutusV2.length); + expect(spend.notes.join(' ')).toMatch(/julc#244/); + + const reward = runs.find((r) => r.key === 'reward#0')!; + expect(reward.request!.transaction.purpose).toEqual({ type: 'reward', target: 'script:1eae96baf29e27682ea3f815aba361a0c6059d45e4bfbe95bbd2f44a' }); + }); + + it('rebuilds Plutus V3 runs', () => { + const runs = buildRuns(inputOf(v3)); + expect(runs.length).toBe(2); + for (const r of runs) { + expect(r.language).toBe('V3'); + expect(r.request?.target.language).toBe('PlutusV3'); + } + }); + + it('targets the minting policy and sorts the mint', () => { + const runs = buildRuns(inputOf(mint)); + const m = runs.find((r) => r.purpose === 'mint')!; + expect(m.request!.transaction.purpose).toEqual({ type: 'mint', target: m.scriptHash }); + expect(m.request!.transaction.mint).toEqual([{ policyId: mint.mints[0].unit.slice(0, 56), tokenName: mint.mints[0].unit.slice(56), quantity: String(mint.mints[0].quantity) }]); + }); + + it('orders withdrawals as the ledger does: script credentials first', () => { + const key = stakeAddr(0xe1, 0x00); + const script = stakeAddr(0xf1, 0xff); + const input = inputOf(withdrawZero); + input.withdrawals = [ + { address: key, amount: 1 }, + { address: script, amount: 2 } + ]; + const tx = buildRuns(input)[0].request!.transaction; + expect(tx.withdrawals.map((w) => w.credential)).toEqual([script, key]); + }); + + it('explains runs it cannot rebuild', () => { + const input = inputOf(withdrawZero); + const byron = { ...input, tx: { ...input.tx, outputs: [{ ...input.tx.outputs[0], address: 'DdzFFzCqrht4PWfBGtmrQz4x1GkZHYLVGbK7aaBkjWxujxzz3L5GxCgPiTsks5RvMN1Bo8Va6V9C6Rm2vkGQhJmq8dRLPMtJBXCjCC8' }] } }; + expect(buildRuns(byron)[0].skip).toMatch(/Byron/); + expect(buildRuns({ ...input, slots: null })[0].skip).toMatch(/Slot times/); + const propose = { ...input, scripts: [{ ...input.scripts[0], redeemer: { tag: 'propose', index: 0, data: 'd87980', ex_units: { mem: 1, steps: 1 } } }] }; + expect(buildRuns(propose)[0].skip).toMatch(/Proposal/); + const cert = { ...input, scripts: [{ ...input.scripts[0], redeemer: { tag: 'cert', index: 0, data: 'd87980', ex_units: { mem: 1, steps: 1 } } }] }; + expect(buildRuns(cert)[0].skip).toMatch(/certificate/); + }); + + it('normalises purpose names and infers V3 for proposals', () => { + const input = inputOf(withdrawZero); + input.scripts = [{ script_hash: 'ab'.repeat(28), type: null, script_content: null, redeemer: { tag: 'proposing', index: 0, data: 'd87980', ex_units: { mem: 1, steps: 1 } } }]; + const [run] = buildRuns(input); + expect(run.key).toBe('propose#0'); + expect(run.language).toBe('V3'); + expect(run.skip).toMatch(/Proposal/); + }); + + it('treats a 0 TTL and validity start (how Yaci Store reports none) as no bound', () => { + const input = inputOf(withdrawZero); + input.tx = { ...input.tx, ttl: 0, validity_interval_start: 0 }; + input.slots = null; + const [run] = buildRuns(input); + expect(run.skip).toBeUndefined(); + expect(run.request!.transaction.validRange).toEqual({ from: null, fromInclusive: true, to: null, toInclusive: false }); + }); + + it('maps votes in ledger voter order and targets the voting script', () => { + const input = inputOf(v3); + input.votes = [ + { voter_type: 'DREP_KEY_HASH', voter_hash: 'aa'.repeat(28), gov_action_tx_hash: '11'.repeat(32), gov_action_index: 0, vote: 'NO' }, + { voter_type: 'DREP_SCRIPT_HASH', voter_hash: input.scripts[0].script_hash, gov_action_tx_hash: '11'.repeat(32), gov_action_index: 0, vote: 'YES' } + ]; + input.scripts = [{ ...input.scripts[0], redeemer: { tag: 'vote', index: 0, data: 'd87980', ex_units: { mem: 1, steps: 1 } } }]; + const [run] = buildRuns(input); + const tx = run.request!.transaction; + expect(tx.votes.map((v) => v.voter)).toEqual([`script:${input.scripts[0].script_hash}`, `key:${'aa'.repeat(28)}`]); + expect(tx.purpose).toEqual({ type: 'vote', target: `script:${input.scripts[0].script_hash}`, voterType: 'drep' }); + }); +}); diff --git a/applications/viewer/src/lib/julc/replay/build.ts b/applications/viewer/src/lib/julc/replay/build.ts new file mode 100644 index 0000000..1c342b5 --- /dev/null +++ b/applications/viewer/src/lib/julc/replay/build.ts @@ -0,0 +1,354 @@ +import { bech32Decode } from '$lib/bech32'; +import type { DataInput, MockCertificate, MockDatum, MockTransaction, MockTxIn, MockTxOut, MockValue, MockVote, PlutusVersion, Target, TransactionRequest } from '../types'; +import { slotToPosixMs, type SlotConfig } from './slots'; + +/* + * Rebuild a historical transaction from Yaci Store data as a julc MockTransaction, one per redeemer, so each script + * can be re-run in the browser with the cost model of the epoch it ran in. Pure: all store data is passed in. + * + * Ledger order matters (purpose indexes and map order in the ScriptContext): inputs and reference inputs by + * (tx id, index); mint and values by policy, then asset name; withdrawals and votes by credential, with script + * credentials before key hashes, as in cardano-ledger. + * + * Known gaps (julc#244) are reported as notes instead of failing silently. + */ + +export interface StoreUtxo { + tx_hash: string; + output_index: number; + address: string; + amount: { unit: string; quantity: string | number }[]; + data_hash?: string | null; + inline_datum?: string | null; + reference_script_hash?: string | null; +} + +export interface StoreScriptRun { + script_hash: string; + type?: string | null; + script_content?: string | null; + redeemer?: { tag?: string; index?: number; data?: string; ex_units?: { mem: number; steps: number } } | string | null; + datum?: string | null; + datum_hash?: string | null; +} + +export interface StoreVote { + voter_type: string; + voter_hash: string; + gov_action_tx_hash: string; + gov_action_index: number; + vote: string; +} + +export interface StoreCert { + cert_index: number; + type: 'registration' | 'deregistration' | 'delegation'; + address: string; + pool_id?: string | null; +} + +export interface ReplayInput { + hash: string; + tx: { + fees: number | string; + ttl?: number | null; + validity_interval_start?: number | null; + required_signers?: string[] | null; + inputs: StoreUtxo[]; + outputs: StoreUtxo[]; + reference_inputs?: StoreUtxo[] | null; + }; + scripts: StoreScriptRun[]; + withdrawals: { address: string; amount: number | string }[]; + mints: { unit: string; quantity: number | string }[]; + votes: StoreVote[]; + certificates: StoreCert[]; + /** CBOR of datums known by hash (for inputs that carry a datum hash). */ + datums: Record; + /** The epoch the parameters are from; null when the transaction's own epoch wasn't in the store. */ + paramsEpoch?: number | null; + params: { + cost_models_raw?: Record | null; + protocol_major_ver?: number | null; + max_tx_ex_mem?: number | string | null; + max_tx_ex_steps?: number | string | null; + } | null; + slots: SlotConfig | null; +} + +export type Purpose = 'spend' | 'mint' | 'reward' | 'cert' | 'vote' | 'propose'; + +export interface RunPlan { + key: string; + purpose: Purpose; + index: number; + scriptHash: string; + language: PlutusVersion | null; + declared: { mem: bigint; steps: bigint } | null; + redeemer: string | null; + /** CBOR of the spent output's datum (spend runs): the first argument of a V1/V2 spending script. */ + datum: string | null; + /** + * Inputs whose datum is given by hash. julc ignores the datum of an input that also has a hash (it only adds + * datums given without one, under a hash it computes itself), so a spending script's datum would be missing. + * julc gets such datums inline (V2/V3) or without their hash (V1, which has no inline datums), and + * fix-context.ts puts the on-chain hash back. + */ + hashedDatums: { input: number; hash: string; datum: string }[]; + /** + * Datums the transaction likely witnesses (inputs' and outputs' datums known by hash), added to txInfoData by + * fix-context.ts under their on-chain hash (V2/V3). An extra entry is harmless; a missing one breaks lookups. + */ + witnessDatums: { hash: string; datum: string }[]; + /** null when this run can't be rebuilt; `skip` says why. */ + request: TransactionRequest | null; + skip?: string; + /** What may differ from the ledger's context, shown with the result. */ + notes: string[]; +} + +const hexCmp = (a: string, b: string) => (a < b ? -1 : a > b ? 1 : 0); +const byRef = (a: StoreUtxo, b: StoreUtxo) => hexCmp(a.tx_hash, b.tx_hash) || a.output_index - b.output_index; + +/** Purpose names vary by store and era: spend/spending, cert/certifying, reward/rewarding, vote/voting, … */ +export function purposeOf(tag: unknown): Purpose | null { + const t = String(tag ?? '').toLowerCase(); + if (t.startsWith('spend')) return 'spend'; + if (t.startsWith('mint')) return 'mint'; + if (t.startsWith('cert')) return 'cert'; + if (t.startsWith('reward') || t.startsWith('withdraw')) return 'reward'; + if (t.startsWith('vot')) return 'vote'; + if (t.startsWith('propos')) return 'propose'; + return null; +} + +export function plutusVersion(type: string | null | undefined): PlutusVersion | null { + const m = String(type ?? '').match(/plutus\D*v?_?([123])/i); + return m ? (`V${m[1]}` as PlutusVersion) : null; +} + +function redeemerOf(s: StoreScriptRun) { + if (!s.redeemer) return null; + if (typeof s.redeemer !== 'string') return s.redeemer; + try { + return JSON.parse(s.redeemer); + } catch { + return null; + } +} + +function scriptCbor(s: StoreScriptRun): string | null { + if (!s.script_content) return null; + try { + const c = JSON.parse(s.script_content); + return typeof c?.content === 'string' ? c.content : null; + } catch { + return /^[0-9a-f]+$/i.test(s.script_content) ? s.script_content : null; + } +} + +function value(amount: StoreUtxo['amount']): MockValue { + const assets = amount + .filter((a) => a.unit !== 'lovelace') + .map((a) => ({ policyId: a.unit.slice(0, 56), tokenName: a.unit.slice(56), quantity: String(a.quantity) })) + .sort((a, b) => hexCmp(a.policyId, b.policyId) || hexCmp(a.tokenName, b.tokenName)); + return { lovelace: String(amount.find((a) => a.unit === 'lovelace')?.quantity ?? 0), assets }; +} + +const cbor = (value: string): DataInput => ({ format: 'cbor', value }); + +function datum(u: StoreUtxo, datums: Record, attach: boolean): MockDatum { + if (u.inline_datum) return { kind: 'inline', data: cbor(u.inline_datum) }; + if (u.data_hash) { + const known = attach ? datums[u.data_hash] : undefined; + return known ? { kind: 'hash', hash: u.data_hash, data: cbor(known) } : { kind: 'hash', hash: u.data_hash }; + } + return { kind: 'none' }; +} + +const isShelley = (address: string) => /^addr(_test)?1/.test(address); + + +/** Ledger order for credentials: script hashes before key hashes, then by hash. */ +function credentialKey(stakeAddress: string): string { + const d = bech32Decode(stakeAddress); + if (!d || d.bytes.length < 29) return '2' + stakeAddress; + const script = (d.bytes[0] & 0x10) !== 0; + const hash = [...d.bytes.slice(1)].map((b) => b.toString(16).padStart(2, '0')).join(''); + return (script ? '0' : '1') + hash; +} + +const VOTERS: Record = { + CONSTITUTIONAL_COMMITTEE_HOT_SCRIPT_HASH: { voterType: 'committee', prefix: 'script:', order: 0 }, + CONSTITUTIONAL_COMMITTEE_HOT_KEY_HASH: { voterType: 'committee', prefix: 'key:', order: 1 }, + DREP_SCRIPT_HASH: { voterType: 'drep', prefix: 'script:', order: 2 }, + DREP_KEY_HASH: { voterType: 'drep', prefix: 'key:', order: 3 }, + STAKING_POOL_KEY_HASH: { voterType: 'pool', prefix: '', order: 4 } +}; + +function votes(list: StoreVote[]): MockVote[] { + return list + .filter((v) => VOTERS[v.voter_type]) + .sort((a, b) => VOTERS[a.voter_type].order - VOTERS[b.voter_type].order || hexCmp(a.voter_hash, b.voter_hash) || hexCmp(a.gov_action_tx_hash, b.gov_action_tx_hash) || a.gov_action_index - b.gov_action_index) + .map((v) => ({ + voterType: VOTERS[v.voter_type].voterType, + voter: VOTERS[v.voter_type].prefix + v.voter_hash, + actionTxId: v.gov_action_tx_hash, + actionIndex: BigInt(v.gov_action_index), + vote: v.vote.toLowerCase() as MockVote['vote'] + })); +} + +function certificates(list: StoreCert[]): { certs: MockCertificate[]; complete: boolean } { + const sorted = [...list].sort((a, b) => a.cert_index - b.cert_index); + const complete = sorted.every((c, i) => c.cert_index === i); + const certs = sorted.map((c) => + c.type === 'delegation' + ? { type: 'delegStaking', credential: c.address, poolId: c.pool_id ?? null } + : { type: c.type === 'registration' ? 'regStaking' : 'unregStaking', credential: c.address } + ); + return { certs, complete }; +} + +export function buildRuns(input: ReplayInput): RunPlan[] { + // Yaci Store reports a missing TTL or validity start as 0. A real TTL of slot 0 is impossible, and a start of + // slot 0 is the same as none for any script, so 0 means "no bound". + const tx = { ...input.tx, ttl: input.tx.ttl || null, validity_interval_start: input.tx.validity_interval_start || null }; + const inputs = [...tx.inputs].sort(byRef); + const refs = [...(tx.reference_inputs ?? [])].sort(byRef); + const outputs = [...tx.outputs].sort((a, b) => a.output_index - b.output_index); + const runs = input.scripts.map((s) => ({ s, r: redeemerOf(s) })).filter((x) => x.r?.tag); + + // Datums the scripts endpoint resolved for spent inputs are as good as /scripts/datum lookups. + const datums = { ...input.datums }; + for (const { s } of runs) if (s.datum && s.datum_hash) datums[s.datum_hash] ??= s.datum; + + const pv = input.params?.protocol_major_ver ?? null; + const protocol = pv == null ? 11 : Math.min(11, Math.max(10, pv)); + const { certs, complete: certsComplete } = certificates(input.certificates); + const byron = [...inputs, ...refs, ...outputs].some((u) => !isShelley(u.address)); + + const common: Omit = { + inputs: inputs.map((u) => ({ txId: u.tx_hash, index: BigInt(u.output_index), address: { payment: u.address }, value: value(u.amount), datum: datum(u, datums, true), referenceScript: u.reference_script_hash || null })), + referenceInputs: refs.map((u) => ({ txId: u.tx_hash, index: BigInt(u.output_index), address: { payment: u.address }, value: value(u.amount), datum: datum(u, datums, false), referenceScript: u.reference_script_hash || null })), + // Output datums given by hash are left unresolved: the ledger only includes them when the tx witnesses them. + outputs: outputs.map((u) => ({ address: { payment: u.address }, value: value(u.amount), datum: datum(u, datums, false), referenceScript: u.reference_script_hash || null })), + fee: String(tx.fees), + mint: input.mints + .map((m) => ({ policyId: m.unit.slice(0, 56), tokenName: m.unit.slice(56), quantity: String(m.quantity) })) + .sort((a, b) => hexCmp(a.policyId, b.policyId) || hexCmp(a.tokenName, b.tokenName)), + certificates: certs, + withdrawals: [...input.withdrawals] + .sort((a, b) => hexCmp(credentialKey(a.address), credentialKey(b.address))) + .map((w) => ({ credential: w.address, amount: String(w.amount) })), + validRange: { + from: tx.validity_interval_start != null && input.slots ? slotToPosixMs(tx.validity_interval_start, input.slots) : null, + fromInclusive: true, + to: tx.ttl != null && input.slots ? slotToPosixMs(tx.ttl, input.slots) : null, + toInclusive: false + }, + signatories: [...(tx.required_signers ?? [])].sort(hexCmp), + datums: [], + txId: input.hash, + votes: votes(input.votes), + proposals: [] + }; + + // Datums known by hash go to julc inline (V2/V3) or without their hash (V1), and are restored afterwards. + const hashedDatums: RunPlan['hashedDatums'] = []; + const inlinedInputs = common.inputs.map((i, n) => { + if (i.datum.kind !== 'hash' || !('data' in i.datum) || !i.datum.data) return i; + hashedDatums.push({ input: n, hash: i.datum.hash, datum: i.datum.data.value }); + return { ...i, datum: { kind: 'inline' as const, data: i.datum.data } }; + }); + + const v1HashedDatums: RunPlan['hashedDatums'] = []; + const v1Inputs = common.inputs.map((i, n) => { + if (i.datum.kind !== 'hash' || !('data' in i.datum) || !i.datum.data) return i; + v1HashedDatums.push({ input: n, hash: i.datum.hash, datum: i.datum.data.value }); + return { ...i, datum: { kind: 'hash' as const, hash: '', data: i.datum.data } }; + }); + + const witnessDatums = [...new Set([...inputs, ...outputs].map((u) => u.data_hash).filter((h): h is string => !!h && !!datums[h]))].map((hash) => ({ + hash, + datum: datums[hash] + })); + + return runs.map(({ s, r }) => { + const tag = purposeOf(r.tag) ?? (String(r.tag) as Purpose); + const index = Number(r.index ?? 0); + // Voting and proposing scripts only exist in Plutus V3, so a missing type can be inferred. + const language = plutusVersion(s.type) ?? (tag === 'vote' || tag === 'propose' ? 'V3' : null); + const plan: RunPlan = { + key: `${tag}#${index}`, + purpose: tag, + index, + scriptHash: s.script_hash, + language, + declared: r.ex_units ? { mem: BigInt(r.ex_units.mem), steps: BigInt(r.ex_units.steps) } : null, + redeemer: r.data ?? null, + datum: null, + hashedDatums: [], + witnessDatums: [], + request: null, + notes: [] + }; + const code = scriptCbor(s); + const fail = (why: string) => ((plan.skip = why), plan); + if (tag === 'propose') return fail('Proposal (guardrail) scripts aren’t supported yet; they are planned with the governance work.'); + if (!language) return fail('Not a Plutus script.'); + if (!code) return fail('The store did not return the script code.'); + if (!r.data) return fail('The store did not return the redeemer data.'); + if (byron) return fail('The transaction has Byron-era (bootstrap) addresses, which julc can’t represent yet.'); + if ((tx.validity_interval_start != null || tx.ttl != null) && !input.slots) return fail('Slot times for this network are unknown, so the validity range can’t be rebuilt.'); + + let purpose: MockTransaction['purpose']; + switch (tag) { + case 'spend': + if (index >= inputs.length) return fail(`The transaction has no input #${index}.`); + purpose = { type: 'spend', index }; + plan.datum = inputs[index].inline_datum ?? (inputs[index].data_hash ? (datums[inputs[index].data_hash!] ?? null) : null); + break; + case 'mint': + purpose = { type: 'mint', target: s.script_hash }; + break; + case 'reward': + purpose = { type: 'reward', target: `script:${s.script_hash}` }; + break; + case 'cert': + if (!certsComplete || index >= certs.length) return fail('This certificate kind can’t be rebuilt from the store yet (julc#244).'); + purpose = { type: 'certify', index }; + break; + case 'vote': { + const voter = common.votes.find((v) => v.voter === `script:${s.script_hash}`); + if (!voter) return fail('The vote cast by this script was not found in the store.'); + purpose = { type: 'vote', target: voter.voter, voterType: voter.voterType }; + break; + } + default: + return fail(`Unknown purpose “${tag}”.`); + } + + if (runs.length > 1) plan.notes.push('Only this script’s redeemer is in the context (julc#244). A script that reads the other redeemers, such as a withdraw-zero validator, can fail here although it passed on chain.'); + if (input.certificates.length && !certsComplete) plan.notes.push('Some certificates in this transaction couldn’t be rebuilt, so the context lists only part of them.'); + if (input.paramsEpoch === null) plan.notes.push('The store has no parameters for this transaction’s epoch, so the latest epoch’s cost model was used.'); + if (language === 'V1') plan.notes.push('Plutus V1 contexts from julc 0.1.0-pre18 can differ from the ledger’s (V1/V2 translation fixes are on julc main), so some V1 runs fail here although they passed on chain.'); + if (pv != null && pv !== protocol) plan.notes.push(`Evaluated with protocol ${protocol} rules; the transaction ran under protocol ${pv}.`); + + const target: Target = { language: `Plutus${language}`, protocol }; + const costs = input.params?.cost_models_raw?.[`Plutus${language}`]; + if (!costs?.length) plan.notes.push('The store has no cost model for this epoch, so julc’s built-in one was used.'); + plan.hashedDatums = language === 'V1' ? v1HashedDatums : hashedDatums; + plan.witnessDatums = witnessDatums; + plan.request = { + script: { script: code, language }, + transaction: { ...common, inputs: language === 'V1' ? v1Inputs : inlinedInputs, purpose, redeemer: cbor(r.data) }, + target, + costModel: costs?.length ? { target, parameters: costs.map((c) => BigInt(c)) } : null, + // The tx limits of that epoch (julc's defaults otherwise), so a script that ran near them still fits. + ...(input.params?.max_tx_ex_steps ? { maxCpu: BigInt(input.params.max_tx_ex_steps) } : {}), + ...(input.params?.max_tx_ex_mem ? { maxMem: BigInt(input.params.max_tx_ex_mem) } : {}) + }; + return plan; + }); +} diff --git a/applications/viewer/src/lib/julc/replay/fix-context.test.ts b/applications/viewer/src/lib/julc/replay/fix-context.test.ts new file mode 100644 index 0000000..e9691fc --- /dev/null +++ b/applications/viewer/src/lib/julc/replay/fix-context.test.ts @@ -0,0 +1,82 @@ +import { describe, expect, it } from 'vitest'; +import { decodePlutusData, encodePlutusData, type PlutusData } from '$lib/cbor'; +import { fixContext, ownRedeemer } from './fix-context'; + +const b = (hex: string): PlutusData => ({ bytes: hex }); +const i = (n: number): PlutusData => ({ int: String(n) }); +const c = (constructor: number, ...fields: PlutusData[]): PlutusData => ({ constructor, fields }); +const map = (...entries: [PlutusData, PlutusData][]): PlutusData => ({ map: entries.map(([k, v]) => ({ k, v })) }); +const list = (...items: PlutusData[]): PlutusData => ({ list: items }); + +const P1 = 'aa'.repeat(28); +const P2 = '11'.repeat(28); +// Policy P1 before P2: out of ledger order. Token names out of order too. +const unsorted = () => map([b(''), map([b(''), i(5)])], [b(P1), map([b('02'), i(1)], [b('01'), i(2)])], [b(P2), map([b('00'), i(3)])]); +const sorted = map([b(''), map([b(''), i(5)])], [b(P2), map([b('00'), i(3)])], [b(P1), map([b('01'), i(2)], [b('02'), i(1)])]); + +const ownEntry = { k: c(1, c(0, b('ab'.repeat(32)), i(0))), v: c(0) }; + +/** A V3-shaped context: TxInfo with 16 fields, one input with a value and an inline datum. */ +function v3Context(): string { + const txOut = (value: PlutusData) => c(0, c(0, c(1, b('cc'.repeat(28))), c(1)), value, c(2, i(7)), c(1)); + const info = [ + list(c(0, c(0, b('ab'.repeat(32)), i(0)), txOut(unsorted()))), // inputs + list(), // reference inputs + list(txOut(unsorted())), // outputs + i(200000), // fee (integer in V3) + unsorted(), // mint + list(), + map(), + c(0), + list(), + map([ownEntry.k, ownEntry.v]), // redeemers + map(), // data + b('ef'.repeat(32)), + map(), + list(), + c(1), + c(1) + ]; + return encodePlutusData(c(0, c(0, ...info), c(0), c(1))); +} + +const infoOf = (cbor: string) => (decodePlutusData(cbor) as { fields: { fields: PlutusData[] }[] }).fields[0].fields; + +describe('fixContext', () => { + it('puts values in ledger order without touching datums', () => { + const fixed = fixContext(v3Context(), 'V3', null)!; + expect(fixed.sortedValues).toBe(true); + const info = infoOf(fixed.cbor); + const inputOut = (info[0] as { list: { fields: { fields: PlutusData[] }[] }[] }).list[0].fields[1].fields; + expect(inputOut[1]).toEqual(sorted); + expect(inputOut[2]).toEqual(c(2, i(7))); + expect((info[2] as { list: { fields: PlutusData[] }[] }).list[0].fields[1]).toEqual(sorted); + expect(info[4]).toEqual(sorted); + expect(info[3]).toEqual(i(200000)); + }); + + it('returns null when nothing needs changing', () => { + const once = fixContext(v3Context(), 'V3', null)!.cbor; + expect(fixContext(once, 'V3', null)).toBeNull(); + }); + + it('reads the own redeemer and completes the redeemer map', () => { + const ctx = v3Context(); + expect(ownRedeemer(ctx)).toEqual(ownEntry); + const other = { k: c(2, c(1, b('dd'.repeat(28)))), v: i(1) }; + const fixed = fixContext(ctx, 'V3', [ownEntry, other])!; + expect(fixed.completedRedeemers).toBe(true); + expect(infoOf(fixed.cbor)[9]).toEqual({ map: [ownEntry, other] }); + }); + + it('restores datums given by hash and adds witnessed datums in hash order', () => { + const hashA = '99'.repeat(32); + const hashB = '01'.repeat(32); + const fixed = fixContext(v3Context(), 'V3', null, [{ input: 0, hash: hashA, datum: '07' }], [{ hash: hashB, datum: 'd87980' }, { hash: hashA, datum: '07' }])!; + expect(fixed.restoredDatums).toBe(true); + const info = infoOf(fixed.cbor); + const inputOut = (info[0] as { list: { fields: { fields: PlutusData[] }[] }[] }).list[0].fields[1].fields; + expect(inputOut[2]).toEqual(c(1, b(hashA))); + expect(info[10]).toEqual(map([b(hashB), c(0)], [b(hashA), i(7)])); + }); +}); diff --git a/applications/viewer/src/lib/julc/replay/fix-context.ts b/applications/viewer/src/lib/julc/replay/fix-context.ts new file mode 100644 index 0000000..8996de1 --- /dev/null +++ b/applications/viewer/src/lib/julc/replay/fix-context.ts @@ -0,0 +1,168 @@ +import { decodePlutusData, encodePlutusData, type PlutusData } from '$lib/cbor'; +import type { PlutusVersion } from '../types'; +import type { Purpose } from './build'; + +/* + * Corrections to the ScriptContext julc builds from a MockTransaction, until julc does them itself (julc#244): + * + * - Redeemers: julc puts only the evaluated script's own redeemer into txInfoRedeemers, but scripts such as + * withdraw-zero validators look up the others. Every run's context does contain that run's own entry + * (purpose → redeemer), so the viewer collects them all, orders them as the ledger does and puts the complete + * map into each context. + * - Values: julc doesn't keep multi-asset values in ledger order (policy, then token name, ada first), so a script + * comparing an output with the value it expects can fail. Values are re-sorted where the ledger puts them: the + * inputs', reference inputs' and outputs' values, the mint, and the fee in V1/V2. User data (datums) is untouched. + * - Datums by hash: julc drops the datum of an input that also has a hash, so a spending script's datum would be + * missing. build.ts hands such datums to julc inline (V2/V3) or without their hash (V1; julc then hashes them + * itself), and here the inputs get their on-chain hash back. Datums of inputs and outputs known by hash go into + * txInfoData under their on-chain hashes, as the ledger has every datum the transaction witnesses. + * - V1 shape: julc 0.1.0-pre18 encodes V1's withdrawals and datums as maps, where Plutus V1 has lists of pairs + * (fixed on julc main, #233). They are converted, so V1 scripts can read them. + * + * TxInfo field positions: V1 [inputs, outputs, fee, mint, …] + * V2 [inputs, refInputs, outputs, fee, mint, certs, wdrl, range, signers, redeemers, …] + * V3 same as V2, but the fee is an integer. + */ + +type Constr = { constructor: number; fields: PlutusData[] }; +type Entry = { k: PlutusData; v: PlutusData }; + +const REDEEMERS = 9; +const DATA: Record = { V1: 8, V2: 10, V3: 10 }; +const LAYOUT: Record = { + V1: { lists: [0, 1], values: [2, 3], redeemers: null }, + V2: { lists: [0, 1, 2], values: [3, 4], redeemers: REDEEMERS }, + V3: { lists: [0, 1, 2], values: [4], redeemers: REDEEMERS } +}; + +/** Ledger order of redeemers: by tag (spend, mint, cert, reward, vote, propose), then index. */ +export const TAG_ORDER: Record = { spend: 0, mint: 1, cert: 2, reward: 3, vote: 4, propose: 5 }; + +const isConstr = (d: PlutusData | undefined): d is Constr => !!d && typeof (d as Constr).constructor === 'number' && Array.isArray((d as Constr).fields); +const isMap = (d: PlutusData | undefined): d is { map: Entry[] } => !!d && Array.isArray((d as { map?: unknown }).map); +const bytesOf = (d: PlutusData) => ('bytes' in d ? d.bytes : ''); +const byKey = (a: Entry, b: Entry) => (bytesOf(a.k) < bytesOf(b.k) ? -1 : bytesOf(a.k) > bytesOf(b.k) ? 1 : 0); + +function txInfo(context: PlutusData): Constr | null { + return isConstr(context) && isConstr(context.fields[0]) ? context.fields[0] : null; +} + +/** Sort a Value (Map policy (Map name amount)) in place; returns whether anything moved. */ +function sortValue(value: PlutusData | undefined): boolean { + if (!isMap(value)) return false; + let moved = false; + const sortMap = (m: { map: Entry[] }) => { + const before = m.map.map((e) => bytesOf(e.k)).join(); + m.map.sort(byKey); + if (m.map.map((e) => bytesOf(e.k)).join() !== before) moved = true; + }; + sortMap(value); + for (const e of value.map) if (isMap(e.v)) sortMap(e.v); + return moved; +} + +/** The TxOut inside a list element: TxInInfo [outRef, TxOut] or a bare TxOut [address, value, …]. */ +function txOutOf(item: PlutusData): Constr | null { + if (!isConstr(item)) return null; + if (item.fields.length === 2 && isConstr(item.fields[1])) return item.fields[1]; + return item; +} + +/** The single redeemer entry julc put into a context, or null if it isn't there. */ +export function ownRedeemer(contextCbor: string): Entry | null { + try { + const map = txInfo(decodePlutusData(contextCbor))?.fields[REDEEMERS]; + return isMap(map) && map.map.length === 1 ? map.map[0] : null; + } catch { + return null; + } +} + +export interface FixedContext { + cbor: string; + sortedValues: boolean; + completedRedeemers: boolean; + restoredDatums: boolean; + v1Shape?: boolean; +} + +/** Apply the corrections; null when the context isn't in the expected shape or nothing needed changing. */ +export function fixContext( + contextCbor: string, + language: PlutusVersion, + redeemers: Entry[] | null, + hashedDatums: { input: number; hash: string; datum: string }[] = [], + witnessDatums: { hash: string; datum: string }[] = [] +): FixedContext | null { + try { + const context = decodePlutusData(contextCbor); + const info = txInfo(context); + if (!info) return null; + const layout = LAYOUT[language]; + let sortedValues = false; + for (const i of layout.lists) { + const list = info.fields[i]; + if (!list || !('list' in list)) continue; + for (const item of list.list) if (sortValue(txOutOf(item)?.fields[1])) sortedValues = true; + } + for (const i of layout.values) if (sortValue(info.fields[i])) sortedValues = true; + let completedRedeemers = false; + if (redeemers && layout.redeemers != null && isMap(info.fields[layout.redeemers]) && redeemers.length > (info.fields[layout.redeemers] as { map: Entry[] }).map.length) { + info.fields[layout.redeemers] = { map: redeemers }; + completedRedeemers = true; + } + let v1Shape = false; + if (language === 'V1') { + for (const i of [5, 8]) { + const f = info.fields[i]; + if (isMap(f)) { + info.fields[i] = { list: f.map.map((e) => ({ constructor: 0, fields: [e.k, e.v] })) }; + v1Shape = true; + } + } + } + let restoredDatums = false; + const inputs = info.fields[0]; + const data = info.fields[DATA[language]]; + if (language === 'V1' && data && 'list' in data) { + // V1: TxOut datum is Maybe DatumHash, txInfoData a list of (hash, datum) pairs. + if (inputs && 'list' in inputs) { + for (const h of hashedDatums) { + const out = txOutOf(inputs.list[h.input]); + const just = out?.fields[2]; + if (!out || !isConstr(just) || just.constructor !== 0) continue; + const julcHash = bytesOf(just.fields[0]); // the hash julc computed + out.fields[2] = { constructor: 0, fields: [{ bytes: h.hash }] }; // Just (on-chain hash) + for (const pair of data.list) if (isConstr(pair) && bytesOf(pair.fields[0]) === julcHash) pair.fields[0] = { bytes: h.hash }; + restoredDatums = true; + } + } + for (const w of witnessDatums) { + if (data.list.some((pair) => isConstr(pair) && bytesOf(pair.fields[0]) === w.hash)) continue; + data.list.push({ constructor: 0, fields: [{ bytes: w.hash }, decodePlutusData(w.datum)] }); + restoredDatums = true; + } + if (restoredDatums) data.list.sort((a, b) => (isConstr(a) && isConstr(b) ? byKey({ k: a.fields[0], v: a }, { k: b.fields[0], v: b }) : 0)); + } + if (language !== 'V1' && isMap(data)) { + if (inputs && 'list' in inputs) { + for (const h of hashedDatums) { + const out = txOutOf(inputs.list[h.input]); + if (!out || out.fields.length < 3) continue; + out.fields[2] = { constructor: 1, fields: [{ bytes: h.hash }] }; // OutputDatumHash + restoredDatums = true; + } + } + for (const w of witnessDatums) { + if (data.map.some((e) => bytesOf(e.k) === w.hash)) continue; + data.map.push({ k: { bytes: w.hash }, v: decodePlutusData(w.datum) }); + restoredDatums = true; + } + if (restoredDatums) data.map.sort(byKey); + } + if (!sortedValues && !completedRedeemers && !restoredDatums && !v1Shape) return null; + return { cbor: encodePlutusData(context), sortedValues, completedRedeemers, restoredDatums, v1Shape }; + } catch { + return null; + } +} diff --git a/applications/viewer/src/lib/julc/replay/fixtures/mainnet-mint.json b/applications/viewer/src/lib/julc/replay/fixtures/mainnet-mint.json new file mode 100644 index 0000000..c0ddca0 --- /dev/null +++ b/applications/viewer/src/lib/julc/replay/fixtures/mainnet-mint.json @@ -0,0 +1 @@ +{"hash":"436d47e611aadb692a0d47e3467aa517143316251d59b24826c2d1b641049fd1","epoch":662,"tx":{"fees":382925,"ttl":0,"validity_interval_start":0,"required_signers":["d4c35258ed54c3527e0078fa33871e986db11854d9cb4f779d89e604"],"inputs":[{"tx_hash":"5cbbc0f0ddd999614243ee4ebd28b005a239c6cfe10e80bb1ce1a060aff96924","output_index":3,"address":"addr1q82vx5jca42vx5n7qpu05vu8r6vxmvgc2nvuknmhnky7vpx0n6h44fq8ujuyu807vll9atjpc8z6zl0pyv6n2neezysq047pyc","stake_address":"stake1u88eat665sr7fwzwrhlx0lj74equr3dp0hsjxdf4fuu3zgqzy9x8p","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"2473940"}],"data_hash":null,"inline_datum":"d8799fd8799f581cd4c35258ed54c3527e0078fa33871e986db11854d9cb4f779d89e604ff581c233d38f89af8b4d439cedddf071b1b2458b68a1ec01e11cc49091e4ed8799fd8799fd8799f581cf8a2125d27c30abc547b6dc064dec0615a2ccdd88cde4227e4617d98ffd8799f581ccf9eaf5aa407e4b84e1dfe67fe5eae41c1c5a17de12335354f391120ff1a00138800d8799fd8799fd8799f581cd4c35258ed54c3527e0078fa33871e986db11854d9cb4f779d89e604ffd8799fd8799fd8799f581ccf9eaf5aa407e4b84e1dfe67fe5eae41c1c5a17de12335354f391120ffffffffd87980ffd87a9f9f581cf66d78b4a3cb3d37afa0ec36461e51ecbde00f26c8f0a68f94b6988044695553441a0f57abd8ff9f581c1f3aec8bfe7ea4fe14c5f121e2a92e301afe414147860d557cac7e344555534443781a0f332ff7ffff43d87980ff1a00061a801a001e8480ffff","script_ref":null,"reference_script_hash":null,"inline_datum_json":{"constructor":0,"fields":[{"constructor":0,"fields":[{"bytes":"d4c35258ed54c3527e0078fa33871e986db11854d9cb4f779d89e604"}]},{"bytes":"233d38f89af8b4d439cedddf071b1b2458b68a1ec01e11cc49091e4e"},{"constructor":0,"fields":[{"constructor":0,"fields":[{"constructor":0,"fields":[{"bytes":"f8a2125d27c30abc547b6dc064dec0615a2ccdd88cde4227e4617d98"}]},{"constructor":0,"fields":[{"bytes":"cf9eaf5aa407e4b84e1dfe67fe5eae41c1c5a17de12335354f391120"}]},{"int":1280000},{"constructor":0,"fields":[{"constructor":0,"fields":[{"constructor":0,"fields":[{"bytes":"d4c35258ed54c3527e0078fa33871e986db11854d9cb4f779d89e604"}]},{"constructor":0,"fields":[{"constructor":0,"fields":[{"constructor":0,"fields":[{"bytes":"cf9eaf5aa407e4b84e1dfe67fe5eae41c1c5a17de12335354f391120"}]}]}]}]},{"constructor":0,"fields":[]}]},{"constructor":1,"fields":[{"list":[{"bytes":"f66d78b4a3cb3d37afa0ec36461e51ecbde00f26c8f0a68f94b69880"},{"bytes":"69555344"},{"int":257403864}]},{"list":[{"bytes":"1f3aec8bfe7ea4fe14c5f121e2a92e301afe414147860d557cac7e34"},{"bytes":"5553444378"},{"int":255012855}]}]},{"bytes":"d87980"}]},{"int":400000},{"int":2000000}]}]}},{"tx_hash":"5cbbc0f0ddd999614243ee4ebd28b005a239c6cfe10e80bb1ce1a060aff96924","output_index":4,"address":"addr1q82vx5jca42vx5n7qpu05vu8r6vxmvgc2nvuknmhnky7vpx0n6h44fq8ujuyu807vll9atjpc8z6zl0pyv6n2neezysq047pyc","stake_address":"stake1u88eat665sr7fwzwrhlx0lj74equr3dp0hsjxdf4fuu3zgqzy9x8p","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"84359797"}],"data_hash":null,"inline_datum":null,"script_ref":null,"reference_script_hash":null,"inline_datum_json":null},{"tx_hash":"5cbbc0f0ddd999614243ee4ebd28b005a239c6cfe10e80bb1ce1a060aff96924","output_index":5,"address":"addr1q82vx5jca42vx5n7qpu05vu8r6vxmvgc2nvuknmhnky7vpx0n6h44fq8ujuyu807vll9atjpc8z6zl0pyv6n2neezysq047pyc","stake_address":"stake1u88eat665sr7fwzwrhlx0lj74equr3dp0hsjxdf4fuu3zgqzy9x8p","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"4773658"},{"unit":"03b6ddacd60cc1ebd9ed4041d0c298c4c6f48ab61e04fdad4d915cfa000de14050424720766f75636865722033","policy_id":"03b6ddacd60cc1ebd9ed4041d0c298c4c6f48ab61e04fdad4d915cfa","asset_name":"asset1psq3ymfvg6648u4gvcukzaxf3mtu2c53qmdhst","quantity":"1"},{"unit":"03b6ddacd60cc1ebd9ed4041d0c298c4c6f48ab61e04fdad4d915cfa000de14050424720766f7563686572203136","policy_id":"03b6ddacd60cc1ebd9ed4041d0c298c4c6f48ab61e04fdad4d915cfa","asset_name":"asset1k937vwg9h9sc7u2djq6hjn6glkl4ysh92cs9wz","quantity":"1"},{"unit":"03b6ddacd60cc1ebd9ed4041d0c298c4c6f48ab61e04fdad4d915cfa000de14050424720766f7563686572203235","policy_id":"03b6ddacd60cc1ebd9ed4041d0c298c4c6f48ab61e04fdad4d915cfa","asset_name":"asset1eayektglg44svmtv3c72nrs7642au2eu86nwnr","quantity":"1"},{"unit":"03b6ddacd60cc1ebd9ed4041d0c298c4c6f48ab61e04fdad4d915cfa000de14050424720766f7563686572203939","policy_id":"03b6ddacd60cc1ebd9ed4041d0c298c4c6f48ab61e04fdad4d915cfa","asset_name":"asset1qkqpnqsq78cclf4gs3r5pam4w4gm0rkw4hu825","quantity":"1"},{"unit":"0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa4e49474854","policy_id":"0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa","asset_name":"NIGHT","quantity":"5184927239"},{"unit":"0c3b71e6468510341c813626cfa4d008d0b0c50d6ffcea188878e8650014df1059542d534e454b5f504552505f4c50","policy_id":"0c3b71e6468510341c813626cfa4d008d0b0c50d6ffcea188878e865","asset_name":"asset1rtmw62r53qm86ns586sgsgedszu9muf7u7lcmr","quantity":"2048"},{"unit":"1f3aec8bfe7ea4fe14c5f121e2a92e301afe414147860d557cac7e345553444378","policy_id":"1f3aec8bfe7ea4fe14c5f121e2a92e301afe414147860d557cac7e34","asset_name":"USDCx","quantity":"3002753"},{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","policy_id":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f","asset_name":"SNEK","quantity":"50467"},{"unit":"2da97f55d49be13dabc8450a2eabab0412f3075a03f7519d32d469250014df1050554c5345","policy_id":"2da97f55d49be13dabc8450a2eabab0412f3075a03f7519d32d46925","asset_name":"asset1c2e6g2f754j5y47s86r0x3hgez2v9ehd7j7fd7","quantity":"9156162367"},{"unit":"7246a32c1a6dad60da9139f06da8f1a99927f1e1d465f6e71b762e13504247","policy_id":"7246a32c1a6dad60da9139f06da8f1a99927f1e1d465f6e71b762e13","asset_name":"PBG","quantity":"2"},{"unit":"90dab650fe3c852487ea75418e060ebccb98cb84f23e1eedf8e6008e0014df1050756c736550542d4d696e737761704e49474854414441","policy_id":"90dab650fe3c852487ea75418e060ebccb98cb84f23e1eedf8e6008e","asset_name":"asset1sk79xh9f62q0dxk74h04aa958fg574khpw753c","quantity":"2528685536"},{"unit":"93fc7ce799be81dc8dc02189ea79f50a629972c195ad3a2c37a4743d0014df1050554c5345","policy_id":"93fc7ce799be81dc8dc02189ea79f50a629972c195ad3a2c37a4743d","asset_name":"asset18mpl9hmgylxh26whmmh3u36sce8hx8srdeurcg","quantity":"9999998"},{"unit":"c02bceffa5811fe64caa949affc0220a2c862a12f143f10ce55a29af746170707930322d30353430","policy_id":"c02bceffa5811fe64caa949affc0220a2c862a12f143f10ce55a29af","asset_name":"tappy02-0540","quantity":"1"},{"unit":"c0becc47655739fc5bc6d299b868831f6a19d2b46e0ed1c840c2f05c363434636339386333666238636639303933616235336366","policy_id":"c0becc47655739fc5bc6d299b868831f6a19d2b46e0ed1c840c2f05c","asset_name":"644cc98c3fb8cf9093ab53cf","quantity":"1"},{"unit":"c0becc47655739fc5bc6d299b868831f6a19d2b46e0ed1c840c2f05c363435653234393032623630316531336137393834333234","policy_id":"c0becc47655739fc5bc6d299b868831f6a19d2b46e0ed1c840c2f05c","asset_name":"645e24902b601e13a7984324","quantity":"1"},{"unit":"c0becc47655739fc5bc6d299b868831f6a19d2b46e0ed1c840c2f05c363437343566326237323865353530633431333837613137","policy_id":"c0becc47655739fc5bc6d299b868831f6a19d2b46e0ed1c840c2f05c","asset_name":"64745f2b728e550c41387a17","quantity":"1"},{"unit":"f0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9a68656c696f736c616e67","policy_id":"f0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9a","asset_name":"helioslang","quantity":"1"},{"unit":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4ce74c52975908a612d5ce68327040d449aae99f8b463bb6de046a1b23c5713169","policy_id":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c","asset_name":"asset1jqqsmmv0dn8x3xwkt2pkdwztxhrzlfcmft3eqv","quantity":"36396844"}],"data_hash":null,"inline_datum":null,"script_ref":null,"reference_script_hash":null,"inline_datum_json":null},{"tx_hash":"5e777cbb99bc830ff9a41887d8a3b0ff07d8d86b82ad33805727ae7a227bf29d","output_index":1,"address":"addr1q82vx5jca42vx5n7qpu05vu8r6vxmvgc2nvuknmhnky7vpx0n6h44fq8ujuyu807vll9atjpc8z6zl0pyv6n2neezysq047pyc","stake_address":"stake1u88eat665sr7fwzwrhlx0lj74equr3dp0hsjxdf4fuu3zgqzy9x8p","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"2000000"},{"unit":"1f3aec8bfe7ea4fe14c5f121e2a92e301afe414147860d557cac7e345553444378","policy_id":"1f3aec8bfe7ea4fe14c5f121e2a92e301afe414147860d557cac7e34","asset_name":"USDCx","quantity":"256287523"}],"data_hash":null,"inline_datum":null,"script_ref":null,"reference_script_hash":null,"inline_datum_json":null},{"tx_hash":"843d8322bdd867e98df7c2edbf45f796bb62cb19dbdfba7015c6a720e84f82dc","output_index":3,"address":"addr1q82vx5jca42vx5n7qpu05vu8r6vxmvgc2nvuknmhnky7vpx0n6h44fq8ujuyu807vll9atjpc8z6zl0pyv6n2neezysq047pyc","stake_address":"stake1u88eat665sr7fwzwrhlx0lj74equr3dp0hsjxdf4fuu3zgqzy9x8p","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"69232252"}],"data_hash":null,"inline_datum":"00","script_ref":null,"reference_script_hash":null,"inline_datum_json":{"int":0}},{"tx_hash":"849411c3f5b2da1bf903ee8113c0a934c57b82d6ed9243e4fdbc0d8d2c019a64","output_index":3,"address":"addr1q82vx5jca42vx5n7qpu05vu8r6vxmvgc2nvuknmhnky7vpx0n6h44fq8ujuyu807vll9atjpc8z6zl0pyv6n2neezysq047pyc","stake_address":"stake1u88eat665sr7fwzwrhlx0lj74equr3dp0hsjxdf4fuu3zgqzy9x8p","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"44048950"}],"data_hash":null,"inline_datum":null,"script_ref":null,"reference_script_hash":null,"inline_datum_json":null},{"tx_hash":"849411c3f5b2da1bf903ee8113c0a934c57b82d6ed9243e4fdbc0d8d2c019a64","output_index":4,"address":"addr1q82vx5jca42vx5n7qpu05vu8r6vxmvgc2nvuknmhnky7vpx0n6h44fq8ujuyu807vll9atjpc8z6zl0pyv6n2neezysq047pyc","stake_address":"stake1u88eat665sr7fwzwrhlx0lj74equr3dp0hsjxdf4fuu3zgqzy9x8p","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"44048949"}],"data_hash":null,"inline_datum":null,"script_ref":null,"reference_script_hash":null,"inline_datum_json":null},{"tx_hash":"849411c3f5b2da1bf903ee8113c0a934c57b82d6ed9243e4fdbc0d8d2c019a64","output_index":5,"address":"addr1q82vx5jca42vx5n7qpu05vu8r6vxmvgc2nvuknmhnky7vpx0n6h44fq8ujuyu807vll9atjpc8z6zl0pyv6n2neezysq047pyc","stake_address":"stake1u88eat665sr7fwzwrhlx0lj74equr3dp0hsjxdf4fuu3zgqzy9x8p","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"5000000"}],"data_hash":null,"inline_datum":null,"script_ref":null,"reference_script_hash":null,"inline_datum_json":null},{"tx_hash":"94c1c47568b470ef5123b638ce625f8ac640b22ba9ea5943762471560cad6d7c","output_index":3,"address":"addr1q82vx5jca42vx5n7qpu05vu8r6vxmvgc2nvuknmhnky7vpx0n6h44fq8ujuyu807vll9atjpc8z6zl0pyv6n2neezysq047pyc","stake_address":"stake1u88eat665sr7fwzwrhlx0lj74equr3dp0hsjxdf4fuu3zgqzy9x8p","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"70148102"}],"data_hash":null,"inline_datum":"00","script_ref":null,"reference_script_hash":null,"inline_datum_json":{"int":0}},{"tx_hash":"963cd05b847bc5003a568cd6c8c7229c4c74a3157b0290bc48f49b306eb15765","output_index":1,"address":"addr1q82vx5jca42vx5n7qpu05vu8r6vxmvgc2nvuknmhnky7vpx0n6h44fq8ujuyu807vll9atjpc8z6zl0pyv6n2neezysq047pyc","stake_address":"stake1u88eat665sr7fwzwrhlx0lj74equr3dp0hsjxdf4fuu3zgqzy9x8p","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"2000000"},{"unit":"1f3aec8bfe7ea4fe14c5f121e2a92e301afe414147860d557cac7e345553444378","policy_id":"1f3aec8bfe7ea4fe14c5f121e2a92e301afe414147860d557cac7e34","asset_name":"USDCx","quantity":"2199496412"}],"data_hash":null,"inline_datum":null,"script_ref":null,"reference_script_hash":null,"inline_datum_json":null}],"outputs":[{"tx_hash":"436d47e611aadb692a0d47e3467aa517143316251d59b24826c2d1b641049fd1","output_index":0,"address":"addr1q82vx5jca42vx5n7qpu05vu8r6vxmvgc2nvuknmhnky7vpx0n6h44fq8ujuyu807vll9atjpc8z6zl0pyv6n2neezysq047pyc","stake_address":"stake1u88eat665sr7fwzwrhlx0lj74equr3dp0hsjxdf4fuu3zgqzy9x8p","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"327702723"},{"unit":"03b6ddacd60cc1ebd9ed4041d0c298c4c6f48ab61e04fdad4d915cfa000de14050424720766f75636865722033","policy_id":"03b6ddacd60cc1ebd9ed4041d0c298c4c6f48ab61e04fdad4d915cfa","asset_name":"asset1psq3ymfvg6648u4gvcukzaxf3mtu2c53qmdhst","quantity":"1"},{"unit":"03b6ddacd60cc1ebd9ed4041d0c298c4c6f48ab61e04fdad4d915cfa000de14050424720766f7563686572203136","policy_id":"03b6ddacd60cc1ebd9ed4041d0c298c4c6f48ab61e04fdad4d915cfa","asset_name":"asset1k937vwg9h9sc7u2djq6hjn6glkl4ysh92cs9wz","quantity":"1"},{"unit":"03b6ddacd60cc1ebd9ed4041d0c298c4c6f48ab61e04fdad4d915cfa000de14050424720766f7563686572203235","policy_id":"03b6ddacd60cc1ebd9ed4041d0c298c4c6f48ab61e04fdad4d915cfa","asset_name":"asset1eayektglg44svmtv3c72nrs7642au2eu86nwnr","quantity":"1"},{"unit":"03b6ddacd60cc1ebd9ed4041d0c298c4c6f48ab61e04fdad4d915cfa000de14050424720766f7563686572203939","policy_id":"03b6ddacd60cc1ebd9ed4041d0c298c4c6f48ab61e04fdad4d915cfa","asset_name":"asset1qkqpnqsq78cclf4gs3r5pam4w4gm0rkw4hu825","quantity":"1"},{"unit":"0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa4e49474854","policy_id":"0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa","asset_name":"NIGHT","quantity":"5184927239"},{"unit":"0c3b71e6468510341c813626cfa4d008d0b0c50d6ffcea188878e8650014df1059542d534e454b5f504552505f4c50","policy_id":"0c3b71e6468510341c813626cfa4d008d0b0c50d6ffcea188878e865","asset_name":"asset1rtmw62r53qm86ns586sgsgedszu9muf7u7lcmr","quantity":"2048"},{"unit":"1f3aec8bfe7ea4fe14c5f121e2a92e301afe414147860d557cac7e345553444378","policy_id":"1f3aec8bfe7ea4fe14c5f121e2a92e301afe414147860d557cac7e34","asset_name":"USDCx","quantity":"3006688"},{"unit":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b","policy_id":"279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f","asset_name":"SNEK","quantity":"50467"},{"unit":"2da97f55d49be13dabc8450a2eabab0412f3075a03f7519d32d469250014df1050554c5345","policy_id":"2da97f55d49be13dabc8450a2eabab0412f3075a03f7519d32d46925","asset_name":"asset1c2e6g2f754j5y47s86r0x3hgez2v9ehd7j7fd7","quantity":"9156162367"},{"unit":"7246a32c1a6dad60da9139f06da8f1a99927f1e1d465f6e71b762e13504247","policy_id":"7246a32c1a6dad60da9139f06da8f1a99927f1e1d465f6e71b762e13","asset_name":"PBG","quantity":"2"},{"unit":"90dab650fe3c852487ea75418e060ebccb98cb84f23e1eedf8e6008e0014df1050756c736550542d4d696e737761704e49474854414441","policy_id":"90dab650fe3c852487ea75418e060ebccb98cb84f23e1eedf8e6008e","asset_name":"asset1sk79xh9f62q0dxk74h04aa958fg574khpw753c","quantity":"2528685536"},{"unit":"93fc7ce799be81dc8dc02189ea79f50a629972c195ad3a2c37a4743d0014df1050554c5345","policy_id":"93fc7ce799be81dc8dc02189ea79f50a629972c195ad3a2c37a4743d","asset_name":"asset18mpl9hmgylxh26whmmh3u36sce8hx8srdeurcg","quantity":"9999998"},{"unit":"c02bceffa5811fe64caa949affc0220a2c862a12f143f10ce55a29af746170707930322d30353430","policy_id":"c02bceffa5811fe64caa949affc0220a2c862a12f143f10ce55a29af","asset_name":"tappy02-0540","quantity":"1"},{"unit":"c0becc47655739fc5bc6d299b868831f6a19d2b46e0ed1c840c2f05c363434636339386333666238636639303933616235336366","policy_id":"c0becc47655739fc5bc6d299b868831f6a19d2b46e0ed1c840c2f05c","asset_name":"644cc98c3fb8cf9093ab53cf","quantity":"1"},{"unit":"c0becc47655739fc5bc6d299b868831f6a19d2b46e0ed1c840c2f05c363435653234393032623630316531336137393834333234","policy_id":"c0becc47655739fc5bc6d299b868831f6a19d2b46e0ed1c840c2f05c","asset_name":"645e24902b601e13a7984324","quantity":"1"},{"unit":"c0becc47655739fc5bc6d299b868831f6a19d2b46e0ed1c840c2f05c363437343566326237323865353530633431333837613137","policy_id":"c0becc47655739fc5bc6d299b868831f6a19d2b46e0ed1c840c2f05c","asset_name":"64745f2b728e550c41387a17","quantity":"1"},{"unit":"f0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9a68656c696f736c616e67","policy_id":"f0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9a","asset_name":"helioslang","quantity":"1"},{"unit":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4ce74c52975908a612d5ce68327040d449aae99f8b463bb6de046a1b23c5713169","policy_id":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c","asset_name":"asset1jqqsmmv0dn8x3xwkt2pkdwztxhrzlfcmft3eqv","quantity":"36396844"}],"data_hash":null,"inline_datum":null,"script_ref":null,"reference_script_hash":null,"inline_datum_json":null}],"reference_inputs":[{"tx_hash":"76e8e5a5eb9ae1562b7c6afb042037f76c4b097c9857e95c9285a07c5e612ffa","output_index":0,"address":"addr1w8fv8anv93c4fk0shyf7u0xekz39hwmaz5me20tuxmq8apsgzpnyy","stake_address":null,"amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"2801500"},{"unit":"49b5b45b3b600416fee318dc34d9660ebb3a759fbd2db683fef641ff555344435850726f746f636f6c506172616d6574657273","policy_id":"49b5b45b3b600416fee318dc34d9660ebb3a759fbd2db683fef641ff","asset_name":"USDCXProtocolParameters","quantity":"1"}],"data_hash":null,"inline_datum":"d8799f581cd74de93a7e4940462c4509f59c712889422506f8b63dcfd0c266dc7bd8799fd8799f581c7a9aee035f6eff7dd56b4078b497a63853438dffe51611a36d6eee61ffd8799fd8799fd8799f581cc8ab0b5104240cfa85aed8265cef4982cd9dcbc5b0c444ddc689dadaffffffff581c1f3aec8bfe7ea4fe14c5f121e2a92e301afe414147860d557cac7e349f5821022d4b0769063a340abaae3647366096e8b2a8b249f8bb2686d8418860592b2bb8ff9f582102135645a11944958ef8b314b315bc5c7789830c5bc2397c3b96a60ddb90215bf05821032e2f0a4027a75749b7fcf3274672ba3ca83895520cd39b25b2ea3698fe281871ff582102f31c6dd06280b5c32fda1e1333b729be99871b29d62c64becd6f188a6d52cb7f9f581ca0208ec5dafd6479c0faf053a2a10b91d4c131f590ee2d26cee46c62581ca623af1e2fa73daef1dd29e1097ffaa27a9155fbf8b729ad55f2abf9ff01d87980581ca3d5052864638828bc3fbc0d5b9a4223e233620d7911a5376ed4b65801ff","script_ref":null,"reference_script_hash":null,"inline_datum_json":{"constructor":0,"fields":[{"bytes":"d74de93a7e4940462c4509f59c712889422506f8b63dcfd0c266dc7b"},{"constructor":0,"fields":[{"constructor":0,"fields":[{"bytes":"7a9aee035f6eff7dd56b4078b497a63853438dffe51611a36d6eee61"}]},{"constructor":0,"fields":[{"constructor":0,"fields":[{"constructor":0,"fields":[{"bytes":"c8ab0b5104240cfa85aed8265cef4982cd9dcbc5b0c444ddc689dada"}]}]}]}]},{"bytes":"1f3aec8bfe7ea4fe14c5f121e2a92e301afe414147860d557cac7e34"},{"list":[{"bytes":"022d4b0769063a340abaae3647366096e8b2a8b249f8bb2686d8418860592b2bb8"}]},{"list":[{"bytes":"02135645a11944958ef8b314b315bc5c7789830c5bc2397c3b96a60ddb90215bf0"},{"bytes":"032e2f0a4027a75749b7fcf3274672ba3ca83895520cd39b25b2ea3698fe281871"}]},{"bytes":"02f31c6dd06280b5c32fda1e1333b729be99871b29d62c64becd6f188a6d52cb7f"},{"list":[{"bytes":"a0208ec5dafd6479c0faf053a2a10b91d4c131f590ee2d26cee46c62"},{"bytes":"a623af1e2fa73daef1dd29e1097ffaa27a9155fbf8b729ad55f2abf9"}]},{"int":1},{"constructor":0,"fields":[]},{"bytes":"a3d5052864638828bc3fbc0d5b9a4223e233620d7911a5376ed4b658"},{"int":1}]}},{"tx_hash":"86c9f9a54f11627a3b4c0b9577d0a5074eb366b08555192c1d6213239e2854e1","output_index":0,"address":"addr1wxduzjkjzn7lu807ms9gqkeh5xzgc6mwf7yewryt0vkwgzqzlkc89","stake_address":null,"amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"2926490"},{"unit":"9bc14ad214fdfe1dfedc0a805b37a1848c6b6e4f89970c8b7b2ce4081f3aec8bfe7ea4fe14c5f121e2a92e301afe414147860d557cac7e34","policy_id":"9bc14ad214fdfe1dfedc0a805b37a1848c6b6e4f89970c8b7b2ce408","asset_name":"asset1wzt576hzgs6t488p6scr4aq2uzvshkpmdafql0","quantity":"1"}],"data_hash":null,"inline_datum":null,"script_ref":"82035901955901920101003323232323232322232325333007323330083300622533300900114a02a66601466ebcc02cc034004cdd2a400466ae80c034c038dd5191919299980699b87480100084c04000458c040008c030004dd518069806180618071baa300d300c300e37546601044a6660160022c264a66601a646601844a66601e002294054ccc040cdd7980898098008068a5113002301200100137566020601e60226ea8c040c03cc044dd5000880089801980780118078009bac300d0044bd700a5113002300c0013756601660146014601460146014004002940c8c8c94ccc028cdc3a40000042944528180680118048009baa300a30093009002149858c020c028dd5180480098049baa001232300223300323300423300523300623300723300823300923300a23300b23300c23300d23300e23300f233010233011233012233012012001001001001001001001001001001001001001001001001001230022330020020015573eae6955ceaba25742aae793011e581c49b5b45b3b600416fee318dc34d9660ebb3a759fbd2db683fef641ff0001","reference_script_hash":"1f3aec8bfe7ea4fe14c5f121e2a92e301afe414147860d557cac7e34","inline_datum_json":null},{"tx_hash":"d722c14b023979e92aae51978d9ead239ef3f94dc7131939d6a78a10c06eefc7","output_index":0,"address":"addr1wxduzjkjzn7lu807ms9gqkeh5xzgc6mwf7yewryt0vkwgzqzlkc89","stake_address":null,"amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"26450470"},{"unit":"9bc14ad214fdfe1dfedc0a805b37a1848c6b6e4f89970c8b7b2ce408d74de93a7e4940462c4509f59c712889422506f8b63dcfd0c266dc7b","policy_id":"9bc14ad214fdfe1dfedc0a805b37a1848c6b6e4f89970c8b7b2ce408","asset_name":"asset1x5hudqrkqmp9es0wvuw2s004hgeh2u9m9c4ym5","quantity":"1"}],"data_hash":null,"inline_datum":null,"script_ref":"82035916e75916e40101003323232323232323232323232322232323232323232323232323232323232533301b3370e90020010a99980d99980d980a180e802a504a22646464a66603c66e1d20000021323232323232323232323232323232323232323232323232533303633032303800e3038001153330363302e32323253330393370e9000001099ba5480092f5c02a66607266e1d20020021613374a90001981b1ba937286eccc0ec0052f5c0607800460700026ea8c0e0008c0e002454ccc0d8cc0b8c8c8c94ccc0e4cdc3a4000004266e952000330363374a90001981b181d800a5eb812f5c0266e9520024bd70181e001181c0009baa303830390093038303900113253330373302f3039303a00300113253330383033303b00113232533303a3035303d001132533303b3375e6078006002264a66607866ebcc0f40053010645555344437800132323232533304032323253330433303f3045002304500113303b304530460023045304600114a0608c6ea8008c114dd5182181818210018a9998201981c182118218008050a99982019191919299982219b87480000084c8c8c94ccc11ccdc3a40000042944528182500118230009baa004153330443370e90010010991919299982399b87480080084cdd7982480218248008a50304a002304600137540082646464a66608e66e1d200400213375e609200860920022940c128008c118004dd5002182380118218009baa30430023374a900025eb804c94ccc104c0f0c1100044c8c94ccc10cc0f8c11800454ccc10ccdd79822001004899299982219baf30450014c010645555344437800132323232533304833040304a304b00101213253330493044304c00113232533304b3046304e001132533304c3375e609a00600226464a66609c66ebcc13c0040084c94ccc13ccdd79829801000899299982818009829182a1baa305200b132325333052304d30553055305500113253330533375e00260aa0042646464646464a6660b2660a6660a6660a6660a6660a6660a6660a6660a6660a6660a666e1cdd6982d81aa400466e2120000023330593371e6eb8c16c0c12201200000000000000000000000000000000000000000000000000000000000000000004a0944ccc164cdc79bae305b02f489200000000000000000000000000000000000000000000000000000000000000000004a0944cdc39bad305b033482a27004cdc79bae305b032378e66e28dd700f9bae4c0106455553444378003371000200466e24004dd6982d81719b89375a60b660b808400266e24cdc08010009bad305d01e3370e0060042930b1bad305c015375a60b2064a6660ac66ebc01000454ccc158ccc158c13cc160c16409d282511533305690029250a510a99982b19baf006374e660a6008660a660b004e660a6980103d87a80004bd70099299982b0008b0a99982b9829182d000899299982c19baf305900101e132533305800116153330593054305c001132533305a3375e60b6002980106455553444378001375a60bc0022c60b60022c6eacc17000458c16400458dd5982c0230b0b0b099299982b99b90375c00a002264a6660b066e40008dd70008c80248c94ccc168cdd78051ba733057008300133057305c305d02b4bd700a99982d19baf002374e6002660ae006660ae98103d87a80004bd7009919299982e182b982f800899191919299983019baf003026153330603375e00202a264a6660c00022c2a6660c260b860c8002264a6660c466ebcc18c0053001064555534443780013253330620011615333063305e306600113253330643375e60ca0020302a6660c866ebcc1a00040584dd698340018b0b18328008b1bab306600416306300116375660c80082c2a6660c066ebc00409854ccc180cdd780180a89929998300008b0a999830982e1832000899299983119baf30630014c01064555534443780013253330620011615333063305e306600113253330643375e60ca0020302a6660c866ebcc1a00040584dd698340018b0b18328008b1bab306600616306300116375660c80042c2c60c000260c000660bc00260bc0042c60bc0026eacc1701285858c158012c16305902816375c00260ae052a6660a866e20005200018010991919299982b99827982c982d000810899299982c1829982d80089919299982d182a982e8008a99982d19baf305b00200f132533305b3375e60b800201e2a6660b666ebcc17c00403454ccc16cc030c174c17cdd5182e803899299982e182b982f982f982f9bac0011800800858c8c8c94ccc178cdc3a4008004260c00022c60c200460ba0026ea8c174014585858c1700045858dd5982e800982d0008b182d1bab305900216305900130580013058375460ac6660a4444a6660ae66e212006002133003337020049003182d182d182d000899982a911299982d19b88480000084cc00ccdc08012400460ba00220020040020020206eb4c154c1580c858c15009058dd6000991919299982999b87480100084c15400458c158008c148004dd518290048b182599ba548008cc1300112f5c02c6ea1200216304f00337529110016304d034163756609c00260960022c60966eacc12800858c128004c124004c124dd51823800999821111299982399b88480180084cc00ccdc08012400c609460946094002266608a444a66609466e212000002133003337020049001182680088008010009bad304602300816304500116163756608c00260860022c60866eacc108008585858c108004c104004c104dd5181f80099981d111299981f99b88480180084cc00ccdc08012400c608460846084002266607a444a66608466e212000002133003337020049001182280088008010009bad303e01c00b16303d00216303c028163756607a00260740022c60746eacc0e401058cdd2a400497ae016161630393754606e006606e002606c002606c6ea8c0d0004ccc0bc8894ccc0d0cdc42400c00426600666e0400920063037303730370011333032222533303733710900000109980199b8100248008c0e80044004008004dd698198091bac30330223332223253330343370e00890000a99981a199bb4375c606c006002666e31200048200040085261615333033003161332253330363370e00490000a99981b199bb4375c6070002006666e31200048200040105261615333035001161332253330383370e00490000a99981c199bb4375c607400200a666e312000482000401852616153330370011613322533303a3370e00490000a99981d199bb4375c607800200e666e312000482000402052616153330390011613322533303c3370e00490000a99981e199bb4375c607c002012666e3120004820004028526161533303b00116133303a222533303f3370e00490000a99981f999bb4375c6082002018666e3120004820004034526161533303e00116133003337020049001182100099b8100248008c0fc004cdc080124004607a00266e040092002303b001337020049001181c80099b8100448008c0dc00cde38081bad30320123758606403a6eb8c0c8c0cc038c0c8004ccc0b08894ccc0c00046400aeb2c132325333033533303332533303300114a0264a66606800229404c8c94ccc0d80045280991981919819198191981919baf30390013752911003033303b0023375e6072006607404266ebcc0f0004dd4240046066607600860720026eacc0e8004c0dc004c0dc004dd5981a800899817981a981b9baa30350023374a900119818181a80e25eb805280c80249a6600b00132323253330363370e90020010981c0008b181c801181a8009baa30353036001181b00184cc014010c0d800cc0d4004c0d4dd51819981a181a9baa30330018011bac3030021303030303758605e6060002605e002605c002605a0026058002605600260540026052002605000264a66604a66e1cdc680119b80001483800c54ccc094cdc7999b8c480012008002489045a2e0acd001323233024375066f2928999b8c48021200800433024375066f2928999b8c48041204000433024375066f2928999b8c481412008004330243752666e31205848100010cc0914ccc09ccdc380124004266e952000330243752666e3120a001480e00112f5c02a66604e66e1c009200413374a9001198121ba9333718905000a407000897ae016330243752666e3120d80148100010cc090dd4999b8c4826009204000433024375066f2928999b8c48360092040004330243752666e3120980348100010cc090dd3a99981399b87371a002905f00899191919198141ba933371890002408000a660506ea0cde525133371890202400400a66050a66605666e1c009200013374a900125eb8054ccc0accdc380124004266e952000330283752666e312044481000152f5c02c66050a66605666e1c005200013374a900125eb8054ccc0accdc3800a4004266e952000330283374a9000198141ba9333718904300a407000a97ae04bd700a99981599b87001480104cdd2a40006605066e952002330283752666e31208601480e00152f5c097ae0164bd7019bca4a200466f2928801199b8c482100520020023337189021240040022c97ae033371890700180100199bca4a2666e31209801480200085858cde5251333718906c01a40100026eb8c094004dd6181200298120009811800981100098108008a99980f19b87480080084c8cc074894ccc08000454ccc084cdc399b80375a60460066eb4c08cc090c090c090c090c090c090c090c090c090c090c090dd61811981200199b8148000c94ccc0840045854ccc088c074c0940044c94ccc08ccdd79812000981280889929998118008b0a999812180f9813800899299981299baf30260014c106455553444378001375a60520022c604c0022c6eacc09c00458c09000458dd598118088a4c2c2a6660426603a6046604a6ea8c08cc094dd51811981218129baa30230013374a90011980f181180525eb80584c008c090004dd6181080918109919299981019b87371a00466e00005209001153330203371e666e3120004802000922104070afbc20013301d375066f2928999b8c4802120400023301d375066f2928999b8c4812120400023301d374e6464a66604466e1cdc680119b80001482a01454ccc088cdc7999b8c48001200800248904ca85def70013301f375066f2928999b8c4802120080023301f375066f2928999b8c4804120080023301f375066f2928999b8c4806120080023301f3752666e31202048100008cc07cdd4999b8c4818120400023301f3752666e3120a00148100008cc07cdd4999b8c483800520400023301f3752666e3120a00248100008cc07cdd4999b8c483800920400023301f3752666e3120a00348100008cc07cdd4999b8c483800d20400023301f375066f2928999b8c482801120400023301f3752666e3120e00448100008cc07cdd39919299981219b87371a00466e0000520e001153330243371e666e312000480200092201046b20f62a0013233022375066f2928999b8c48021200800333022375066f2928999b8c480412008003330223752666e3120184810000ccc0894ccc094cdc3800a4004266e952000330223752666e312060480e000d2f5c02a66604a66e1c005200413374a9001198111ba933371890302407000697ae016330223752666e312098014810000ccc088dd4999b8c483800400800d2f5c066f2928999b8c481612008002161633794944ccdc6241b0029004000999b8c482a0140040092f5c02c2c66f2928999b8c4828015200800133371890480080080125eb805858cde5251333718904400a40100026eb8c0800044c94ccc0780045854ccc07cc068c0880044c8c94ccc084cdd7981100080109929998108008b0a999811180e981280089919299981219baf302500100213253330253375e60520040022646464646464a6660566002605a605e6ea8c0b400c4c94ccc0b0c09cc0bc0044c8c94ccc0b8c0a4c0c400454ccc0b8cdd79817801007899299981799baf303000100d13253330303375e606800400226464a666064660546068606a0020042646464a66606a60606070002264a66606c66ebc004c0e004454ccc0d8cdd7981c001181c181c80809999981a11111299981d0008b0991919299981f180a182018211baa3040003132533303f303a3042001132325333041303c3044001153330413375e6084004044264a66608466ebcc10c00408054ccc108cdd798230008098a9998211981d182218228028090991919299982298201824000899299982319b9000e001153330463371e01e0022a66608c66608c607e6090004941288a99982319b88480080344cccc040dd7182400180099b8100d48008c1240304c94ccc11ccdd798248020008a99982399b90002375c0022930b0b18240100b0b0b1bae304700316304700130460013758646464a66608a66e1d20040021304700116304800230440013754608800a2c2c2c60860022c2c6eacc110004c10400458c104dd598200010b1820000981f800981f9baa303d001375c60700066eb8004dd6809181c8078b0b181b8018b181b800981b0009bac32323253330353370e90020010981b8008b181c001181a0009baa30340011630340083374a900125eb8058dd4240042c60600022c2c6eacc0c4004c0b800458c0b8dd598168010b181319ba548008cc09c02d2f5c0605800260586ea8c0a8004dd6181480c181480099981191129998138008c8015d65826464a666054a66605464a66605400229404c94ccc0ac0045280991929998168008a50132330293302933029330293375e606000201a6054606400466ebcc0c000c040cdd798198009ba848008c0a8c0c8010c0c0004dd59818800981700098170009bab302c001133026302c302e3754605800466e9520023302700b4bd700a5019004934cc016002646464a66605a66e1d20040021302f001163030002302c00137546058605a002302d0030998028021816801981600098161baa302a302b302c375460540030023758604e0302c604c00e2c604a0046ea5220100163756604a0022c604400460420102c6eacc080038c084008c074004dd5180e8078b0a99980d99b874801800854ccc06cc8c8c94ccc078cdc380124004266e24dd698100049991199980f1111299981180188008a9998118010800899191919299981419b8f0020011333008302b007302b0063370000a90010a99981419b900020011333008302b0070060051333008007302b006005375c0046eb8008c09c00cc09800c008005200037586040604260426042604201c6eb0c08002854ccc078cdc38012400c266ebc005300107d87a9fd87a80ff0014a0603e60406042004603a0026ea8c074c0780045261616301e002301a001375460346036018603400260320026030002602e602e602e002602c002602a0026028602a6ea8c8c8c94ccc050cdc3a40080042602c0022c602e00460260026ea8c04cc050c050c054dd51809980a180a9baa3300f225333012001161325333014323301322533301600114a02a66602e66ebcc060c06400403852889801180d0008009bab3016301730183754602c602e60306ea800440044c00cc05c008c054004dd61809801980998098009809000980880098089baa300f002300f001300f375400244646464a66601a66e1d2000002132323253330103370e9000001099baf3012004301200114a06026004601e0026ea80104c8c8c94ccc040cdc3a40000042940528980980118078009baa0043010002300c0013754004466e1cc024dd5000a4004446660100040029415d191191919299980499b87480000084c8c8c94ccc030cdc3a4000004266ebcc038010c038004528180780118058009baa0041323232533300c3370e90000010a5013375e601c008601c002601e00460160026ea8010c030008c020004dd50012ba0232300223300323300423300523300623300723300823300923300a23300b23300c23300d23300e23300f233010233011233012233012012001001001001001001001001001001001001001001001001001230022330020020015573eae6955ceaba15744aae793011e581c49b5b45b3b600416fee318dc34d9660ebb3a759fbd2db683fef641ff0001","reference_script_hash":"d74de93a7e4940462c4509f59c712889422506f8b63dcfd0c266dc7b","inline_datum_json":null}],"invalid":false},"scripts":[{"tx_hash":"436d47e611aadb692a0d47e3467aa517143316251d59b24826c2d1b641049fd1","script_hash":"1f3aec8bfe7ea4fe14c5f121e2a92e301afe414147860d557cac7e34","script_content":"{\"type\":\"PlutusScriptV3\",\"content\":\"590195590192010100332323…trimmed\"}","type":"PLUTUS_V3","redeemer":{"tag":"mint","index":0,"data":"d87980","ex_units":{"mem":36633,"steps":14843322}},"datum":null,"datum_hash":null},{"tx_hash":"436d47e611aadb692a0d47e3467aa517143316251d59b24826c2d1b641049fd1","script_hash":"d74de93a7e4940462c4509f59c712889422506f8b63dcfd0c266dc7b","script_content":"{\"type\":\"PlutusScriptV3\",\"content\":\"5916e75916e4010100332323…trimmed\"}","type":"PLUTUS_V3","redeemer":{"tag":"reward","index":0,"data":"d87a9f5f5840070afbc2000000000000000000000000000000000000000000000000000000000190cf67000000000000000000000000000000000000000000000000000000005840001e8480000001c4ca85def700000001000000000000000000000000000000000000000077777777dcc4d5a8b6e418fd04d8997ef11000ee00000000000000005840000000002222222d7164433c4c09b0b0d809a9b52c04c205000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000584000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000866e992217e0bfb8371f9ad32a53dcc47d1aa04e0000000000000000584000000000b1f653c30f59172dad00879ff90f0d1e7b2d3949000000000000000000000000866e992217e0bfb8371f9ad32a53dcc47d1aa04e00000000000000005840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009241b620fec7887bd49527fb5840ed32400a46d8b1160b168de929810f1d3f19a3fe95adea0c000000706b20f62a00000001000027149ea9794d33dbcef3f77718e903816e877ab2577f4d7ee6535840638f1f60fc671dd600000001d4c35258ed54c3527e0078fa33871e986db11854d9cb4f779d89e6040000000000000000000000000000000000000000000000004c000000000000000000000000ffff","ex_units":{"mem":241069,"steps":91006141}},"datum":null,"datum_hash":null}],"withdrawals":[{"block_number":14078655,"block_time":1792211479,"address":"stake178t5m6f60ey5q33vg5ylt8r39zy5yfgxlzmrmn7scfndc7cwh3zx9","tx_hash":"436d47e611aadb692a0d47e3467aa517143316251d59b24826c2d1b641049fd1","tx_index":2,"amount":0,"epoch":662,"slot":200645188}],"mints":[{"unit":"1f3aec8bfe7ea4fe14c5f121e2a92e301afe414147860d557cac7e345553444378","quantity":-2455780000}],"votes":[],"stakes":[],"delegations":[],"params":{"cost_models_raw":{"PlutusV1":[100788,420,1,1,1000,173,0,1,1000,59957,4,1,11183,32,201305,8356,4,16000,100,16000,100,16000,100,16000,100,16000,100,16000,100,100,100,16000,100,94375,32,132994,32,61462,4,72010,178,0,1,22151,32,91189,769,4,2,85848,228465,122,0,1,1,1000,42921,4,2,30623,28755,75,1,898148,27279,1,51775,558,1,39184,1000,60594,1,141895,32,83150,32,15299,32,76049,1,13169,4,22100,10,28999,74,1,28999,74,1,43285,552,1,44749,541,1,33852,32,68246,32,72362,32,7243,32,7391,32,11546,32,85848,228465,122,0,1,1,90434,519,0,1,74433,32,85848,228465,122,0,1,1,85848,228465,122,0,1,1,270652,22588,4,1457325,64566,4,20467,1,4,0,141992,32,100788,420,1,1,81663,32,59498,32,20142,32,24588,32,20744,32,25933,32,24623,32,53384111,14333,10,955506,213312,0,2,43053543,10,43574283,26308,10,16000,100,16000,100,962335,18,2780678,6,442008,1,52538055,3756,18,267929,18,76433006,8868,18,52948122,18,1995836,36,3227919,12,901022,1,166917843,4307,36,284546,36,158221314,26549,36,74698472,36,333849714,1,254006273,72,2174038,72,2261318,64571,4,207616,8310,4,1293828,28716,63,0,1,1006041,43623,251,0,1,100181,726,719,0,1,100181,726,719,0,1,100181,726,719,0,1,107878,680,0,1,95336,1,281145,18848,0,1,180194,159,1,1,158519,8942,0,1,159378,8813,0,1,107490,3298,1,106057,655,1,1964219,24520,3,607153,231697,53144,0,1,116711,1957,4,231883,10,1000,24838,7,1,232010,32,321837444,25087669,18,617887431,67302824,36,356924,18413,45,21,219951,9444,1,1000,172116,183150,6,24,21,213283,618401,1998,28258,1,1000,38159,2,22,1000,95933,1,1,11,1000,277577,12,21],"PlutusV2":[100788,420,1,1,1000,173,0,1,1000,59957,4,1,11183,32,201305,8356,4,16000,100,16000,100,16000,100,16000,100,16000,100,16000,100,100,100,16000,100,94375,32,132994,32,61462,4,72010,178,0,1,22151,32,91189,769,4,2,85848,228465,122,0,1,1,1000,42921,4,2,30623,28755,75,1,898148,27279,1,51775,558,1,39184,1000,60594,1,141895,32,83150,32,15299,32,76049,1,13169,4,22100,10,28999,74,1,28999,74,1,43285,552,1,44749,541,1,33852,32,68246,32,72362,32,7243,32,7391,32,11546,32,85848,228465,122,0,1,1,90434,519,0,1,74433,32,85848,228465,122,0,1,1,85848,228465,122,0,1,1,955506,213312,0,2,270652,22588,4,1457325,64566,4,20467,1,4,0,141992,32,100788,420,1,1,81663,32,59498,32,20142,32,24588,32,20744,32,25933,32,24623,32,43053543,10,53384111,14333,10,43574283,26308,10,1293828,28716,63,0,1,1006041,43623,251,0,1,16000,100,16000,100,962335,18,2780678,6,442008,1,52538055,3756,18,267929,18,76433006,8868,18,52948122,18,1995836,36,3227919,12,901022,1,166917843,4307,36,284546,36,158221314,26549,36,74698472,36,333849714,1,254006273,72,2174038,72,2261318,64571,4,207616,8310,4,100181,726,719,0,1,100181,726,719,0,1,100181,726,719,0,1,107878,680,0,1,95336,1,281145,18848,0,1,180194,159,1,1,158519,8942,0,1,159378,8813,0,1,107490,3298,1,106057,655,1,1964219,24520,3,607153,231697,53144,0,1,116711,1957,4,231883,10,1000,24838,7,1,232010,32,321837444,25087669,18,617887431,67302824,36,356924,18413,45,21,219951,9444,1,1000,172116,183150,6,24,21,213283,618401,1998,28258,1,1000,38159,2,22,1000,95933,1,1,11,1000,277577,12,21],"PlutusV3":[100788,420,1,1,1000,173,0,1,1000,59957,4,1,11183,32,201305,8356,4,16000,100,16000,100,16000,100,16000,100,16000,100,16000,100,100,100,16000,100,94375,32,132994,32,61462,4,72010,178,0,1,22151,32,91189,769,4,2,85848,123203,7305,-900,1716,960,57,85848,0,1,1,1000,42921,4,2,30623,28755,75,1,898148,27279,1,51775,558,1,39184,1000,60594,1,141895,32,83150,32,15299,32,76049,1,13169,4,22100,10,28999,74,1,28999,74,1,43285,552,1,44749,541,1,33852,32,68246,32,72362,32,7243,32,7391,32,11546,32,85848,123203,7305,-900,1716,960,57,85848,0,1,90434,519,0,1,74433,32,85848,123203,7305,-900,1716,960,57,85848,0,1,1,85848,123203,7305,-900,1716,960,57,85848,0,1,955506,213312,0,2,270652,22588,4,1457325,64566,4,20467,1,4,0,141992,32,100788,420,1,1,81663,32,59498,32,20142,32,24588,32,20744,32,25933,32,24623,32,43053543,10,53384111,14333,10,43574283,26308,10,16000,100,16000,100,962335,18,2780678,6,442008,1,52538055,3756,18,267929,18,76433006,8868,18,52948122,18,1995836,36,3227919,12,901022,1,166917843,4307,36,284546,36,158221314,26549,36,74698472,36,333849714,1,254006273,72,2174038,72,2261318,64571,4,207616,8310,4,1293828,28716,63,0,1,1006041,43623,251,0,1,100181,726,719,0,1,100181,726,719,0,1,100181,726,719,0,1,107878,680,0,1,95336,1,281145,18848,0,1,180194,159,1,1,158519,8942,0,1,159378,8813,0,1,107490,3298,1,106057,655,1,1964219,24520,3,607153,231697,53144,0,1,116711,1957,4,231883,10,1000,24838,7,1,232010,32,321837444,25087669,18,617887431,67302824,36,356924,18413,45,21,219951,9444,1,1000,172116,183150,6,24,21,213283,618401,1998,28258,1,1000,38159,2,22,1000,95933,1,1,11,1000,277577,12,21]},"protocol_major_ver":11},"genesis":{"active_slots_coefficient":0.05,"update_quorum":5,"max_lovelace_supply":"45000000000000000","network_magic":764824073,"epoch_length":432000,"system_start":1506203091,"slots_per_kes_period":129600,"slot_length":1,"max_kes_evolutions":62,"security_param":2160}} diff --git a/applications/viewer/src/lib/julc/replay/fixtures/mainnet-v3.json b/applications/viewer/src/lib/julc/replay/fixtures/mainnet-v3.json new file mode 100644 index 0000000..b81a6f3 --- /dev/null +++ b/applications/viewer/src/lib/julc/replay/fixtures/mainnet-v3.json @@ -0,0 +1 @@ +{"hash":"1aa7054609376511faa874f43c34f5f4ff68db88a623df05140442d9e5602fde","epoch":662,"tx":{"fees":490233,"ttl":200646316,"validity_interval_start":200645956,"required_signers":["661ae4b23b24ba9656d78b7637e6a66e889fa788c16c88017e494052","36340cb51d3bf2a96914a041b77fce26e200da6a0f2e385ef3cd64cf"],"inputs":[{"tx_hash":"c6cf76c3d2aa02bfcb5d499a834a7b5459ae12af141d51dabbbf9393440d584d","output_index":1,"address":"addr1qymrgr94r5al92tfzjsyrdmlecnwyqx6dg8juwz770xkfnetuksxal52w53p6vrc0s8f3zn8j4wstq6kgk6z6r44pmusnsctvh","stake_address":"stake1uy47tgrwl6982gsaxpu8cr5c3fne2hg9sdtytdpdp66sa7gk0wzjc","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"5544352"},{"unit":"0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa4e49474854","policy_id":"0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa","asset_name":"NIGHT","quantity":"50479730"}],"data_hash":null,"inline_datum":null,"script_ref":null,"reference_script_hash":null,"inline_datum_json":null},{"tx_hash":"d35733f875afe519acfd0288d2ff5577a8103e4d26aa9ad610fa56ec1aebecc6","output_index":3,"address":"addr1qymrgr94r5al92tfzjsyrdmlecnwyqx6dg8juwz770xkfnetuksxal52w53p6vrc0s8f3zn8j4wstq6kgk6z6r44pmusnsctvh","stake_address":"stake1uy47tgrwl6982gsaxpu8cr5c3fne2hg9sdtytdpdp66sa7gk0wzjc","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"3939846"},{"unit":"0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa4e49474854","policy_id":"0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa","asset_name":"NIGHT","quantity":"562334350"},{"unit":"1c9cc348fcb844ba233b1d9582d177a99c25b0117cbb4ca14b9bcebb4354565f5661756c745365656b65725f436f6d6d6f6e5f30323332","policy_id":"1c9cc348fcb844ba233b1d9582d177a99c25b0117cbb4ca14b9bcebb","asset_name":"CTV_VaultSeeker_Common_0232","quantity":"1"},{"unit":"97582816c1b128480a10840f2ec96ff57f7eece61290fdc9a16309cd4563686f","policy_id":"97582816c1b128480a10840f2ec96ff57f7eece61290fdc9a16309cd","asset_name":"Echo","quantity":"9272920"},{"unit":"c02bceffa5811fe64caa949affc0220a2c862a12f143f10ce55a29af746170707930322d30393238","policy_id":"c02bceffa5811fe64caa949affc0220a2c862a12f143f10ce55a29af","asset_name":"tappy02-0928","quantity":"1"},{"unit":"e992ef75f2367e6ecd93716ae88eba0d005dd91fd3a21f650b6496b55355524745","policy_id":"e992ef75f2367e6ecd93716ae88eba0d005dd91fd3a21f650b6496b5","asset_name":"SURGE","quantity":"56410583632"},{"unit":"f0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9a68616e646c65313233","policy_id":"f0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9a","asset_name":"handle123","quantity":"1"}],"data_hash":null,"inline_datum":null,"script_ref":null,"reference_script_hash":null,"inline_datum_json":null},{"tx_hash":"fe6e9ad8f95ca32e319c13fe139bb4553f2bcdc9da2a2523b6475423aa5d27ad","output_index":0,"address":"addr1x8vtd879xcmme7kmc3rfpqlhq67zj06dn53fvervtjsk0wlu8fyauwwxpsemmdm52t9qp00kgpnkqjldsaf5z47zkxks7gcmh8","stake_address":"stake1787r5jw788rqcvaaka699jsqhhmyqemqf0kcw56p2lptrtgexgmwc","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"51882395265"},{"unit":"0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa4e49474854","policy_id":"0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa","asset_name":"NIGHT","quantity":"230840295631"},{"unit":"d8b69fc53637bcfadbc4469083f706bc293f4d9d2296646c5ca167bbe52e7facd0b8784e27b271082a030a60cdabef1619480a507896eeacb0c5c264","policy_id":"d8b69fc53637bcfadbc4469083f706bc293f4d9d2296646c5ca167bb","asset_name":"asset1gt9tnvc5apz4344g3vw23tmxr9fq4x2mnv8d93","quantity":"1"}],"data_hash":null,"inline_datum":"d8799f9f4040ff9f581c0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa454e49474854ff181e1a3794ae191b00000001274dfd3a1a27af4d40d8799f1b004b5d4bcf53aa881b002386f26fc10000ffd8799f1b005a93a7fa0d6b121b002386f26fc10000ff1a0005f9b41a00200fac1b0000002d0f3ee467190296ff","script_ref":null,"reference_script_hash":null,"inline_datum_json":{"constructor":0,"fields":[{"list":[{"bytes":""},{"bytes":""}]},{"list":[{"bytes":"0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa"},{"bytes":"4e49474854"}]},{"int":30},{"int":932490777},{"int":4954389818},{"int":665800000},{"constructor":0,"fields":[{"int":21213203435596424},{"int":10000000000000000}]},{"constructor":0,"fields":[{"int":25495097567963920},{"int":10000000000000000}]},{"int":391604},{"int":2101164},{"int":193529308263},{"int":662}]}}],"outputs":[{"tx_hash":"1aa7054609376511faa874f43c34f5f4ff68db88a623df05140442d9e5602fde","output_index":0,"address":"addr1x8vtd879xcmme7kmc3rfpqlhq67zj06dn53fvervtjsk0wlu8fyauwwxpsemmdm52t9qp00kgpnkqjldsaf5z47zkxks7gcmh8","stake_address":"stake1787r5jw788rqcvaaka699jsqhhmyqemqf0kcw56p2lptrtgexgmwc","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"51798024789"},{"unit":"0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa4e49474854","policy_id":"0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa","asset_name":"NIGHT","quantity":"231291197948"},{"unit":"d8b69fc53637bcfadbc4469083f706bc293f4d9d2296646c5ca167bbe52e7facd0b8784e27b271082a030a60cdabef1619480a507896eeacb0c5c264","policy_id":"d8b69fc53637bcfadbc4469083f706bc293f4d9d2296646c5ca167bb","asset_name":"asset1gt9tnvc5apz4344g3vw23tmxr9fq4x2mnv8d93","quantity":"1"}],"data_hash":null,"inline_datum":"d8799f9f4040ff9f581c0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa454e49474854ff181e1a3794ae191b0000000127500da01a27b0d3e0d8799f1b004b5d4bcf53aa881b002386f26fc10000ffd8799f1b005a93a7fa0d6b121b002386f26fc10000ff1a0005f9b41a00200fac1b0000002d0f3ee467190296ff","script_ref":null,"reference_script_hash":null,"inline_datum_json":{"constructor":0,"fields":[{"list":[{"bytes":""},{"bytes":""}]},{"list":[{"bytes":"0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa"},{"bytes":"4e49474854"}]},{"int":30},{"int":932490777},{"int":4954525088},{"int":665900000},{"constructor":0,"fields":[{"int":21213203435596424},{"int":10000000000000000}]},{"constructor":0,"fields":[{"int":25495097567963920},{"int":10000000000000000}]},{"int":391604},{"int":2101164},{"int":193529308263},{"int":662}]}},{"tx_hash":"1aa7054609376511faa874f43c34f5f4ff68db88a623df05140442d9e5602fde","output_index":1,"address":"addr1w8p79rpkcdz8x9d6tft0x0dx5mwuzac2sa4gm8cvkw5hcnqst2ctf","stake_address":null,"amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"4000000"},{"unit":"0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa4e49474854","policy_id":"0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa","asset_name":"NIGHT","quantity":"161911763"}],"data_hash":null,"inline_datum":"d8799fd8799f581c36340cb51d3bf2a96914a041b77fce26e200da6a0f2e385ef3cd64cfffd8799fd8799f581c36340cb51d3bf2a96914a041b77fce26e200da6a0f2e385ef3cd64cfffd8799fd8799fd8799f581c2be5a06efe8a75221d30787c0e988a67955d05835645b42d0eb50ef9ffffffffd87980d8799fd8799f581c36340cb51d3bf2a96914a041b77fce26e200da6a0f2e385ef3cd64cfffd8799fd8799fd8799f581c2be5a06efe8a75221d30787c0e988a67955d05835645b42d0eb50ef9ffffffffd87980d8799f581cf5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c5820697ad50acfc26540cb2c4ca02fa2a89aab8b5ad77672164ecf1799232336ea2cffd905029f82d8799fd8799f581cf5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c5820697ad50acfc26540cb2c4ca02fa2a89aab8b5ad77672164ecf1799232336ea2cffd87a80ffd8799fd8799f581cf5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c582014642f8656ab7122d915564a9f1813537426af54d486f86d9c82348b92d7e727ffd87980ffd8799f1a09a693d3ff1a01debfa5ff1a001e8480d87a80ff","script_ref":null,"reference_script_hash":null,"inline_datum_json":{"constructor":0,"fields":[{"constructor":0,"fields":[{"bytes":"36340cb51d3bf2a96914a041b77fce26e200da6a0f2e385ef3cd64cf"}]},{"constructor":0,"fields":[{"constructor":0,"fields":[{"bytes":"36340cb51d3bf2a96914a041b77fce26e200da6a0f2e385ef3cd64cf"}]},{"constructor":0,"fields":[{"constructor":0,"fields":[{"constructor":0,"fields":[{"bytes":"2be5a06efe8a75221d30787c0e988a67955d05835645b42d0eb50ef9"}]}]}]}]},{"constructor":0,"fields":[]},{"constructor":0,"fields":[{"constructor":0,"fields":[{"bytes":"36340cb51d3bf2a96914a041b77fce26e200da6a0f2e385ef3cd64cf"}]},{"constructor":0,"fields":[{"constructor":0,"fields":[{"constructor":0,"fields":[{"bytes":"2be5a06efe8a75221d30787c0e988a67955d05835645b42d0eb50ef9"}]}]}]}]},{"constructor":0,"fields":[]},{"constructor":0,"fields":[{"bytes":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c"},{"bytes":"697ad50acfc26540cb2c4ca02fa2a89aab8b5ad77672164ecf1799232336ea2c"}]},{"constructor":9,"fields":[{"list":[{"constructor":0,"fields":[{"constructor":0,"fields":[{"bytes":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c"},{"bytes":"697ad50acfc26540cb2c4ca02fa2a89aab8b5ad77672164ecf1799232336ea2c"}]},{"constructor":1,"fields":[]}]},{"constructor":0,"fields":[{"constructor":0,"fields":[{"bytes":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c"},{"bytes":"14642f8656ab7122d915564a9f1813537426af54d486f86d9c82348b92d7e727"}]},{"constructor":0,"fields":[]}]}]},{"constructor":0,"fields":[{"int":161911763}]},{"int":31375269}]},{"int":2000000},{"constructor":1,"fields":[]}]}},{"tx_hash":"1aa7054609376511faa874f43c34f5f4ff68db88a623df05140442d9e5602fde","output_index":2,"address":"addr1q9w4rju5zsmwp70v0evwzlxkzc0krc80vxyeuwfuxe9fvclkwymls3p25f9f9quvhtchu7jlfzrx6z3pylvpapcq0qmsc9v6e7","stake_address":"stake1u8m8zdlcgs42yj5jswxt4ut70f053pndpgsj0kq7suq8sdcze8shk","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"1000000"}],"data_hash":null,"inline_datum":null,"script_ref":null,"reference_script_hash":null,"inline_datum_json":null},{"tx_hash":"1aa7054609376511faa874f43c34f5f4ff68db88a623df05140442d9e5602fde","output_index":3,"address":"addr1qymrgr94r5al92tfzjsyrdmlecnwyqx6dg8juwz770xkfnetuksxal52w53p6vrc0s8f3zn8j4wstq6kgk6z6r44pmusnsctvh","stake_address":"stake1uy47tgrwl6982gsaxpu8cr5c3fne2hg9sdtytdpdp66sa7gk0wzjc","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"88364441"},{"unit":"1c9cc348fcb844ba233b1d9582d177a99c25b0117cbb4ca14b9bcebb4354565f5661756c745365656b65725f436f6d6d6f6e5f30323332","policy_id":"1c9cc348fcb844ba233b1d9582d177a99c25b0117cbb4ca14b9bcebb","asset_name":"CTV_VaultSeeker_Common_0232","quantity":"1"},{"unit":"97582816c1b128480a10840f2ec96ff57f7eece61290fdc9a16309cd4563686f","policy_id":"97582816c1b128480a10840f2ec96ff57f7eece61290fdc9a16309cd","asset_name":"Echo","quantity":"9272920"},{"unit":"c02bceffa5811fe64caa949affc0220a2c862a12f143f10ce55a29af746170707930322d30393238","policy_id":"c02bceffa5811fe64caa949affc0220a2c862a12f143f10ce55a29af","asset_name":"tappy02-0928","quantity":"1"},{"unit":"e992ef75f2367e6ecd93716ae88eba0d005dd91fd3a21f650b6496b55355524745","policy_id":"e992ef75f2367e6ecd93716ae88eba0d005dd91fd3a21f650b6496b5","asset_name":"SURGE","quantity":"56410583632"},{"unit":"f0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9a68616e646c65313233","policy_id":"f0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9a","asset_name":"handle123","quantity":"1"}],"data_hash":null,"inline_datum":null,"script_ref":null,"reference_script_hash":null,"inline_datum_json":null}],"reference_inputs":[{"tx_hash":"64d111b957e7d7848ffdde5149aa77fa4090a7fa1ad0ac108067900614848501","output_index":0,"address":"addr1zysreurmyly2rhs8e3x376f89x97gd48x5nyrrkmjl9unffctd0zw3ydwgtk9hpse3mgyezedms0y054fa47vfkt08qs8ptaac","stake_address":"stake1uyu9kh38gjxhy9mzmscvca5zv3vkac8j862576lxym9hnsgw6zrqw","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"43522380"}],"data_hash":null,"inline_datum":"d87980","script_ref":"820359267b5926780101003333222229800aba2aba1aba0aab9faab9eaab9dab9a9bae0059bae0049bae0039bae00248888888888966003300130073754019370e90004dc024003223232330010010042259800800c00e2646644b30013372200e00515980099b8f0070028800c01900d44cc014014c04c01100d1bae300c0013756601a002601e002806852f5bded8c1370e900148a6002003337026e34008006004b8c4dd2a40092300b300c0019ba54800a6e2120009ba548002466ebcdd3800a61049f4040ff009b874801a6e1d20089b87480112222222222222229800980d007cc06403e444b300130110018801456600266e2000520068cc00400e603a0053010001400d15980099b894805000633001003980e980e980e980e980e980e980e980e980e980e8014cdc0000a4026801a2b3001337129005000c66002007301d301d301d301d301d00299b8000148025003466002007301d301d301d00299b8000148015003202e405c80b90174888c8cc88cc008008004896600200300389919912cc004cdc8803801456600266e3c01c00a20030064075133005005302300440746eb8c070004dd6980e800980f800a03a3301000400314800244466e3ccc034dd7191919800800802912cc0040062d1325980099baf004301c0018980e800c4cc00c00cc08400901b180f800a03a300c3301b0024bd70240046601a002900148888c966002602660346ea8006266e00cdc199b81375a603c60366ea8004dd69806980d9baa004375a603c603e603e603e60366ea8010dd6980f180f980f980d9baa0048b2032323259800980a180d9baa001898059980f180f9bac301f301c375400297ae0898069980f1ba937306e64dd7180f980e1baa0014bd70203432598009808980d9baa00189991192cc00566002601e00715980099b89003001899b893370200200600514a080ea294101d44c038cc084dd3998109ba800333021375000297ae04bd7045300114d87a9f4f74782074696d6520696e76616c6964ff00407464b30013014301e37540031375a6044603e6ea80062b30014a3148002266e0000c00901d203a3021301e37546020603c6ea8020dd6980f980e1baa00133704b30013014301b37540051375a603e60386ea800a290740120340038a6114d87a9f4f74782074696d65206e6f7420736574ff004068603c60366ea8c078c06cdd500298049980e1ba80024bd70244444466446530012222222301b9800acc004c07800a26464b3001302030273754003132598009919800800804912cc00400629422b30013371e6eb8c0b800400e2946266004004605e002814902c44dd598161816801c590271bae302b302837540031640986054604e6ea8c0a8004c098dd51814981518131baa330080060018acc004c06c00a26eacc0a4c0a8c098dd51814981518131baa330080070018b20484091004801a01a9811004cc078dd5001a444b3001301a00189991199119194c004c0b0c0b00066eb8c0acc0a0dd50064c00d2002488966002604600313322323298009819000cc0bcdd51819001cde40022444b3001301d30313754007159800981398189baa303530360048acc004cdd7981a80118119981a1ba90094bd7044c966002605660646ea80062646464646464646464646464b300130430018991919912cc004c11c00e264646644b3001304b003899912cc004c104c120dd5000c4c8c966002609e003198009bad304e0029bad304e0019827008a444b30013046304d37540031323259800982a000c660026eb4c14c00a6eb4c14c0066eb4c14c04d22259800cc004cdd79ba7014374e0214a14a2828a2b3001598009820808452846600294294294505120a28acc004cdc419b820080023370400600f132598009800804c566002600201115980098008024566002600200715980098261bad305701e8acc004c130dd6982b80ec56600260886eb4c15c0662b30013044375a60ae03115980099b89480000362b30013371201a90504e00c56600266e1cdd6982b80b4c004c15c0b29811cd8799f18491b0000017fae70a0381901481a19bfcc001a19bfcc00ff00a41a00b483403d039456600260986eb4c15c0722646464b3001304c375a60b4007132325980099b8700733225980099b8800100288014400505919b81003001375a60b860ba00915980099b89001003899912cc004cdd79ba6001374c660ba66ec0dd48182610101003305d337606ea40a8dd4004a5eb7bdb1822946266ebcdd30009ba63305d337606ea40a8dd40049982e99bb0375206098010101004bd6f7b63020b25980080144c96600266ebcc174c1780a8c124cc170c124cc1700052f5c097ae08acc004c8cc004004dd6182f01a112cc00400629422653001305c3754003375e60c060ba6ea800660c20049112cc004c16000e2b300130020078a51899803003000a0bc8acc004c12c00e2b300130020078a51899803003000a0bc8acc004c13400e2b300130020078a51899803003000a0bc899803003000a0bc417882f060be00282ea29345905845905818251982d9ba9379066e28cdc519b8a3371466e28cdc519b8a3371466e2a60029469001520065e49221ff5907440101003333222229800aba2aba1aba0aab9faab9eaab9dab9a9bae0059bae0049bae0039bae00248888888888966003300130073754019370e9000488c8c8cc004004010896600200300389919912cc004cdc8803801456600266e3c01c00a20030064035133005005301300440346eb8c030004dd598068009807800a01a14bd6f7b6304dc3a4005229800800ccdc09b8d0020018012e312232330010010032259800800c5a264b30013375e00860160031300c00189980180198080012014300e0014031374a90024dc3a400d374a90014dd2a400091111111114c004c05402a6028015222598009806000c400a2b3001337100029003466002007ff301800299b8000148005003456600266e2520140018cc00400e6030603060306030603060306030603060306030005337000029009a0068acc004cdc4a401400319800801cc060c060c060c060c06000a66e000052009400d19800801cc060c060c06000a66e000052005400c8091012202440492232330010013300b0030022259800800c528456600266e1cdc69bae3014301800148102294626600400460320028099016488cdc7998040012400466010002900124444530013019005980c980d002cc00c00e444660086eb8cc03400cc030cc06c0092f5c000291111919912cc004cdc3a4008003133223232980098121812800ccdc700224005375660ff48604a604a604a604a604a604a604a604a604a0073025002488896600266ebcc0a0014c058cc09cdd481025eb82264b300159800980e0024528c4c060011024456600266ebc01400633001003980b998141ba90214bd70402500d459024456600266e1c01120088acc004cdd7802a60103d87a80008acc004cdd798149815001180c99814000a5eb822b3001330123756605200404319800801cc05ccc0a0dd4810a5eb82012806a2c81222c81222c81222c8121024180a99813980a99813981418129baa00e4bd7025eb822c811860406ea8c08c004c07cdd518111811980f9baa330053758604400266e380092000375c00e603a6ea802e2b3001300f001ff8cc004c074dd50034888cc02cdd71980a0019808198111ba90024bd70000cdd7003cc074dd5005cc038cc07cdd480c25eb812222298009bad302500598129813002cc09800a6eb0c09400a6e3800d2222298009815801cdd61815001cc005200298131baa00448888c8ca600233001008802c0060550299803a40093007480190124dd618180034dd5981818188012444b300130280068992cc004c0a4022264b30013375e606a00202315980099baf303530360013022330343022330340024bd7025eb8233001003816c04d01445903045903018189baa3034303137546602e00660169003401102f181998181baa00d8acc004cdc3a400800d132598009ff81480444c96600266ebcc0d40040462b30013375e606a606c00260446606860446606800497ae04bd7046600200702d809a0288b20608b206030313754606860626ea8cc05c00cc02d2006802205e30333030375401b159800981100344c96600260520111325980099baf30350010118acc004cdd7981a981b00098111981a18111981a00125eb812f5c119800801c0b602680a22c81822c8180c0c4dd5181a18189baa33017003300b4801a0088178c0ccc0c0dd5006c566002604c00d15980099b87007480222646644b30013375e606c00202515980099baf303630370014c0103d87a80008acc004cdd7981b181b80118131981a98119981a98119981ffa981b18199baa0104bd7025eb812f5c11598009980f9bab303600202e8cc00401202501440691640c51640c51640c51640c4606a00260626ea8c0d0004c0c0dd51819981a18181baa3301600b300a480022c8172006817102e205c40b83758605e002605e605e605e605e605e605e00822646466453001375860480073758604800537586048604a604a604a604a604a604a604a00501e80eccdc7000a40013371c0029001200c3023001375c60446046004603c6ea8c084004c074dd50112036406c444444460306466446600400400244b3001001801c4c8cc896600266e4402400a2b30013371e0120051001803204c8998028029816002204c375c604ac10026eb4c098004c0a00050261980d2cc004c06c00e26464b3001301d30243754003132598009919800800805112cc00400629422b30013371e6eb8c0ac00400e29462660040046058002813102944dd598149815001c590241bae30283025375400316408c604e60486ea8c09c004c08cdd51813181398119baa330090070028acc004c06400e26eacc098c09cc08cdd51813181398119baa330090080028b2042408400a29000180d1baa00422301f330040020011149a26cac802898011e581c0005648906004c012258200005548906004c011e581c0003048906004c012258200002e489020001004bd704526415c6609e6eacc1700cc0c22c82ba2c82b9660020031482026fb80a2900020ac30450188b20aa375a60b200260b200264660020026eacc1600a0896600200314bd709010000810100008101000044c8cc88cc88cc00800800489660020031003899914c004dd7182e0014dd6982e8014c1840066eb4c1800052222332259800acc004cdc781d00644cdc780301c452820c28998329ba8005330653750004660ca6ea00052f5c11325980099baf374e0026e9c0962660cc6ea0010cc198dd4003198331ba80024bd70456600266ebcdd38009ba70218998331ba8004330663750006660cc6ea00192f5c11598009829000c56600266e2520809bee02006880445906245906220c44188660ca6ea4030cc194dd480325eb810611bad3064002375a60c860ca004305e00133002002305f00141706eacc16400cdd7182b00099801801982d801182c800a0ae8b20a48b20a48b20a48b20a48b20a48b20a48b20a48b20a48b20a48b20a48b20a48b20a43712904044bd45905145905145905122c8288c14c004c138dd5000c5904c22c8260c138004c124dd5000c590471bad304a012304a00e8b2090375c60900026eb8c120008c120004dd61823007c590441bae3044001375c608800460880026eb0c1080322c8200c108004c104004c100004c0fc004c0f8004c0f4004c0f0004c0ec004c0e8004c0e4004c0e0004c0ccdd5000c59031181a98191baa0038b20608b20608b206018190009818800991b94337146eb8c0bc006600294290004dd698179818000af2460566ea8c0b8c0acdd5198069bac302e008300648010c0acdd5198069bac302e00730064801a2b3001598009810000c528c4c05c0050294660026eacc0b8c0bcc0bc00e60386605a6ea40092f5c100940451640a48148605600260546054004605060500026e38008dd700118111baa00b8acc004c05c006330013022375400d375c005302237540169114c004c0a000e6050605200737566050605260526052605260526052605260526052003371c00491111919192cc004cdd79817801003c66002600890014dc6804c888cc00400c009222359800980d001c4a6002900252008800a0048acc004c07000e253001481129002400500245660026048007129800a40094801200280122b3001301b003894c0052002a401100140091640b4816902d205a2259800acc004c0a4cdc319b8100400100289919800800802912cc004c0accdc0800801c52844c96600266e1cc030cdc0000a400001714a313300300300140c866e0400401103145902f466002015006807202e8b205e45902a181718159baa302e302b3754605c605e00260546ea8cc030dd618168030009800a40004566002601a00319800981298111baa006912cc00400629344c966002003149a264b3001337206eb8c094c0a400cdd71812800c4cc010010cc0a0004c0a800a2c8120c0a00050261814000a04a9112cc004c074006200515980099b880014801a3300100398148014c070005003456600266e2520140018cc00400e6052605260526052605260526052605260526052005337000029009a0068acc004cdc4a401400319800801cc0a4c0a4c0a4c0a4c0a400a66e000052009400d19800801cc0a4c0a4c0a400a66e000052005400c81190232046408d3702900048888c8cc004004014896600200313302a337606ea4014dd300225eb7bdb1822653001375c605000337566052003302d00248896600266e4002400e26605c66ec0dd48049ba60080058acc004cdc7804801c6600201300280448cc0bccdd81ba900a374c0020051001401d13302e337606ea400cdd300119803003000a05440a8302b00140a52232330010010032259800800c5300103d87a80008992cc004cdd78021813000c4c058cc0a4c09c0052f5c1133003003302b00240946052002813a44b3001301c30233754005132323322598009816001c0162c8148dd698148009bad3029002302900130243754005164089223259800980e98121baa00189bae302432337606052002605260540026eb0c0a0c094dd5000c5902319198008009980d801801112cc0040062980103d87a80008992cc004cdc39b8d375c604c002902044c058cc0a4dd3998149813000998149813800a5eb812f5c1133003003302b00240946052002813a6eb800a60446ea802d222222222298009804804cc020022444444444464b30013027007899194c0040326028b30015980099b8800c00d8a51899b8800900140dd15980099b8700c301433706600466e0802402ccdc100199b8100900a8804c59037440050374cdc199b803370401090404257af99b823370400a00c01890404257afc01d00419b833370266e08024cdc0180080519b8200b00230013370401401266e00c004028cdc10058011b824828270062c81a8cdc0a4141380200525980099b880014800226010003100140ad232330010010022259800800c52f5bded8c113298009bae302f0019bab303000199801801981a00124453001001801cc8c8010c8cc0040040108966002003149a264b30010018acc004c010dd6981b981d00145268b206a899912cc004cdc81bae3038002375c607000315980098031bad30390028998028029981d800981e801c59037459037181d001181d000a070303a00140dc53001302c001a50a5140c92222264034303200140c130300019bac302f00148888888c8c8c8ca600260740033758607460760033758607400d2222598009819800c401233001004801cc8c8008c040004cc0f4cdd81ba9002375000297adef6c6091111192cc0056600200314a314a082120051300300140fc646600200200a44b300100189982219bb037520126ea00212f5bded8c113298009bae30420019bad304300198238012444b30013372001a007133048337606ea4034dd4006002c56600266e3c03400e264b3001303f001880144cc124cdd81ba900e37500020048228cdc000100644cc120cdd81ba900337500046600c00c00282210440c114005043202a40e537586074009375660740073756607400491111112cc004c0ccc0f4dd500e4660026eb8c104c0f8dd500e4dc700a4dc02400537009001a444464b3001302e0018acc006600202300a805c10207f3004480126008900320488992cc004cdc42400c00313233001001002225980099b880014802229462b3001323298009bab304b00198259826000cc024c02000e609600491112cc004c0dcc12cdd5001c4c966002608a60986ea800626464646464646464646464653001375a60b8003305c0059bad305c0049bad305c0039bad305c0024888896600260c400d13232598009832000c4ca600260ca003375c60c8005375c60c80069112cc004c1a000e33001375c60ce009375c60ce007375a60ce02b375a60ce029375a60ce027375a60ce025306701148888888cc10c0044cc10c0444cdd799826818010982d19836810198369ba69800cc0066002047008804cc118011031401e00d304600340c5488100a44100982300120623306d305e3306d305a3306d374e01a660da6e9c02ccc1b4dd400299836a610100003306d4c10100003306d4c10100003306d0013306d0113306d3750020660da6ea003ccc1b4dd4007198369ba80124bd7025eb80cc1b530103d87a80004bd7022c83286eb0c18c04a2c8308c18c004dd61830808c5905f0c170004c16c004c168004c164004c160004c15c004c158004c154004c150004c14c004c148004c134dd5000c5904b182798261baa0038b2094182580098231baa3049304a3046375466050028600e00313300200230050018a50411082222c8210c008dc680cc5904144c966002606200513259800981e98221baa001899192cc004c12c00633001375a6094005375a6094003980080853011cd8799f18491b0000017fae70a0381901481a19bfcc001a19bfcc00ff00a41a00b483403d02c4cdc01b8d01d4810d22225980099b88480080062646600200200444b30013371000290024528c56600264664530013053305430503754003375660a600530533054002488966002607c60a46ea800626644b3001304d30543754003132323232323232323232323298009bad30640019832002cdd698320024dd69832001cdd69832001244444b3001306a006899192cc004c1b00062653001306d0019bae306c0029bae306c00348896600260e0007198009bae306f0049bae306f0039bad306f0159bad306f0149bad306f0139bad306f0129837808a44444446609600226609602226464b3001306300f8acc004c1b4c1d0dd5012c4c96600260dc60ea6ea8006266004606600a64b3001306f307637540031375a60f460ee6ea80062b30013370e02c05d1480022c83a90751982781c983c983b1baa0018b20e830783075375404b1641cd13300148001200041cc4466446644b300198009839003d28528a0f0899912cc004c1b002633001019804c00a003005806c03206b00e801a09c8cc00406260ae013001801401a01900d81ac03a444530010038024006004803904e20f433223370000c60ae66e0ccdc1182b9bad307f002375a60fe61000200266e08dd6983f9840008011bad307f001307a375400460f46ea8060cc88cdc0002982b99b833370460ae6eb4c1fc008dd6983f80099b82375a60fe6100020046eb4c1fcc20004004c1e8dd5001183d1baa0088b20f0332298009bad307d0029bad307d307e0029bad307d0019bad307d307e00148888cc88c8c96600260f46102026ea8006260e266108026ea0cdc019b803370401600866e0803000cdd69842809841009baa0013308401375066e0920043370266e0801801ccdc100280425eb822c840008c96600266e2000520008a60103d87a80008acc004cdc4800a4005130713308401375000297ae08983899842009ba8329800800c00a66e0cc10c00920044004444b30013371200400310028cc00400e0033370666e00004cdc1802000a400880190830125eb81080012100023370066e08004004cdc119b823370466e09200800b00a3370400c00c66e08014014cdc099b820090023370401400266e0800c004cdc10020010c1e0dd5003183c1baa01622223375e660bc082607a607806060d6660fc05a660fc6e9a600330019800815c0460253370000800e821202100f801a084a44100a4410081a20843307e306f3307e306b3307e374e02c660fc6e9c050cc1f8dd40071983f1ba80023307e3750002660fc6ea0cdc000581a1983f0051983f00d1983f1ba80193307e3750030660fc6ea005ccc1f8dd4019a5eb812f5c0660fc980103d87a80004bd7019b803370266e06600204b00b80620ba007002001337033001025805402505d003192cc004cdc4a4101010101010101010101010101010101010101010101010101010101010101010101010020003133700002907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8fc400507219bca4a330013370004e900252040824ae308b20da1bac306b0128b20d2306b001375860d202316419c30640013063001306200130610013060001305f001305e001305d001305c001305b001305a0013055375400316414c6605400402a60ac60a66ea80062c828860a400260a2002609a6ea8c140c144c134dd51981780d9807000c4cc008008cdc0000a408714a0825904b45904922c8240c128004c114dd5000c5904319912cc004c0ee60026eacc1240066eb8c12400a6eb8c124c12800902d44c9660026064608c6ea800626094608e6ea80062c8228c124c1280062c8220cc118dd481f998231ba903e4bd70182418221baa3047304830443754608e6602e016600a900045660026072005133225980099b8848008006266ebcdd3194c004006005301733049337606ea4024dd31981e805804a5eb7bdb1810011112cc004cdc40012400910018cc00400e601000532332298009827982818261baa0019bab304f002982798280012444b3001303a304e375400313259800982418279baa00189919191919191919191919194c004dd6982f800cc17c0166eb4c17c0126eb4c17c00e6eb4c17c0092222259800983280344c8c96600260ce00313298009834000cdd718338014dd71833801a444b3001306b0038cc004dd718350024dd71835001cdd6983500acdd6983500a4dd69835009cdd698350094c1a804522222223304600113304601113232323322598009835801456600266ebc004c188cc1d4c188cc1d4c190cc1d4dd481aa5eb80cc1d530103d87a80004bd701983a9ba69800cc006600264b3001306c0018a5eb7bdb182264646600200297adef6c602259800800c4cc1e4cdd8261014000374c00697adef6c608994c004dd7183b800cdd5983c000cc1f00092225980099b904890000389983e99bb04c01014000374c00e00b15980099b8f4890000389983e99bb04c01014000374c00e00313307d337606ea400cdd300119803003000a0f241e4307a00141e0646600200297adef6c602259800800c4cc1e0cdd8261014000375000697adef6c608994c004dd7183b000cdd6983b800cc1ec0092225980099b904890000389983e19bb04c01014000375000e00b15980099b8f4890000389983e19bb04c01014000375000e00313307c337606ea400cdd400119803003000a0f041e0307900141dc8390c0c001e06b005a400481ca01b00e804a072806402e01081c8cc1d4c198cc1d409d2f5c0660ea980103d87a80004bd704660020570358024c13800d03945907144c96600260c4027159800983618399baa0288992cc004c1b4c1d0dd5000c4cc008c96600260dc60ea6ea800626eb4c1e4c1d8dd5000c56600266e1c0680ca2900045907420e83304e03830783075375400260640131641cc60ee60e86ea80a22c8392266002900024000839088cc8966002b300133712032609000514a3133712030609000283aa2b30013375e00a60cc660f2058660f26e9a6003300102a808c04a66e0000801103d404201f00140f4660f260d4660f260cc660f26e9c058cc1e4dd380a1983c9ba800e33079375001a660f26ea0030cc1e4dd40059983c8051983c80d1983c9ba8019330793750030660f26ea0018cc1e4dd4019a5eb812f5c0660f298103d87a80004bd7046600205f0398044c14801d03d459075459075182819b833370460a000a66e00cdc099b819800814403e02082e002c004008054c140cdc199b823050005337033001028807403505c00500aa0e233700022002660a606c60646062055300102881940050571bc8001330450210304590680dd6183300945906418330009bac30640118b20c4182f800982f000982e800982e000982d800982d000982c800982c000982b800982b000982a80098281baa0018b209c3052304f3754003164134304e001304d001304937546098609a60926ea8cc0ac05cc028009003208e4c101a0008b20889800806d30011cd8799f18491b0000017fae70a0381901481a19bfcc001a19bfcc00ff00a41a00b483403d02918019b8d01a8acc004c0c000a2b30019800809402e0190418204c01520049802a400c812a264b3001337109003000c4cdd79ba6329800800c00a64b30010018a5eb7bdb1822602e6609266ec0dd48049ba60014bd6f7b63020903303c00a0084004444b30013371000490044400633001003981f8014c8c96600264660020026608200401a44b30010018a508acc004cdc39b8d375c6096609e00290204528c4cc008008c14000504a209a8992cc004c0d8c128dd5000c4c8cc8966002608c005132598009829800c4c8c966002609200313259800982b000c4c8c96600260980031323259800982d00140262c82b8dd7182c000982a1baa0028acc004c12400626464b3001305a002804c590571bae3058001305437540051641488290c148dd5000982a800c5905318289baa0028acc004c11800626464653001375a60ae003375a60ae007375a60ae0049112cc004c16c012015164160305700130560013051375400516413c8278c13cdd50009829000c5905018271baa0038acc004c10c00a2b3001304e37540070018b209e8b2098413060966ea80046600200b00e99811801807520024048609c60966ea80062c8248c134c13800a20068240dd59826000982618241baa304b304c304837546605402c60120048019046260101a0008b2086303b371a03516410916410882110421b80482026fb8090411801a40048b2078181d000981c981c800981c181c000981b801113232332298009bac30290039bac30290029bac3029302a302a302a302a302a302a302a002811c08a66e38005200099b8e0014800900718140009bae3027302800230233754604c00260446ea809d0202040408022302333003002001301f30200063004004229344d95900513011e581cbd23e2977937bb6054f625e5b566e28e294dcd8f7e8d0d33979ed90c004c0122582071b303721562cc44d041bf9c7699991e9be1a9b6ec45f73b38ac5b69569e21f0004c011e581cbc2d3b7cf1009c788b1daf2208a38026ab20d7f8209d896ad1a09c14004c0122582072f9dae79bb2dfa39bd8fadf089ea0c8377b5eaa3caef0549396668aef1f91870001","reference_script_hash":"d8b69fc53637bcfadbc4469083f706bc293f4d9d2296646c5ca167bb","inline_datum_json":{"constructor":0,"fields":[]}},{"tx_hash":"2cafd7c92f7093e5229af274be83dea660b0590b4174bbed79ba662b44fbd1ee","output_index":0,"address":"addr1z8afjx7zl8zzqmnj6ufmcdy85uh8jqg90j4m35myh6lwlrectd0zw3ydwgtk9hpse3mgyezedms0y054fa47vfkt08qsdxsvyq","stake_address":"stake1uyu9kh38gjxhy9mzmscvca5zv3vkac8j862576lxym9hnsgw6zrqw","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"1349030"},{"unit":"bc2d3b7cf1009c788b1daf2208a38026ab20d7f8209d896ad1a09c1472f9dae79bb2dfa39bd8fadf089ea0c8377b5eaa3caef0549396668aef1f9187","policy_id":"bc2d3b7cf1009c788b1daf2208a38026ab20d7f8209d896ad1a09c14","asset_name":"asset14lhphpdaeczcza569khsxrnw92u53x30y4cr2p","quantity":"1"}],"data_hash":null,"inline_datum":"d8799f1903e81a000186a0ff","script_ref":null,"reference_script_hash":null,"inline_datum_json":{"constructor":0,"fields":[{"int":1000},{"int":100000}]}}],"invalid":false},"scripts":[{"tx_hash":"1aa7054609376511faa874f43c34f5f4ff68db88a623df05140442d9e5602fde","script_hash":"d8b69fc53637bcfadbc4469083f706bc293f4d9d2296646c5ca167bb","script_content":"{\"type\":\"PlutusScriptV3\",\"content\":\"59267b592678010100333322…trimmed\"}","type":"PLUTUS_V3","redeemer":{"tag":"spend","index":2,"data":"582402030200ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe51fc6d3","ex_units":{"mem":77265,"steps":25941847}},"datum":"d8799f9f4040ff9f581c0691b2fecca1ac4f53cb6dfb00b7013e561d1f34403b957cbb5af1fa454e49474854ff181e1a3794ae191b00000001274dfd3a1a27af4d40d8799f1b004b5d4bcf53aa881b002386f26fc10000ffd8799f1b005a93a7fa0d6b121b002386f26fc10000ff1a0005f9b41a00200fac1b0000002d0f3ee467190296ff","datum_hash":"9c39c0e2dc8b25265a051794ff07ce01cac449deda4d643517f9e80148e5d99f"},{"tx_hash":"1aa7054609376511faa874f43c34f5f4ff68db88a623df05140442d9e5602fde","script_hash":"d8b69fc53637bcfadbc4469083f706bc293f4d9d2296646c5ca167bb","script_content":"{\"type\":\"PlutusScriptV3\",\"content\":\"59267b592678010100333322…trimmed\"}","type":"PLUTUS_V3","redeemer":{"tag":"reward","index":0,"data":"582400030200ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe51fc6d3","ex_units":{"mem":1050824,"steps":343487730}},"datum":null,"datum_hash":null}],"withdrawals":[{"block_number":14078701,"block_time":1792212424,"address":"stake178vtd879xcmme7kmc3rfpqlhq67zj06dn53fvervtjsk0wczh2pdw","tx_hash":"1aa7054609376511faa874f43c34f5f4ff68db88a623df05140442d9e5602fde","tx_index":12,"amount":0,"epoch":662,"slot":200646133}],"mints":[],"votes":[],"stakes":[],"delegations":[],"params":{"cost_models_raw":{"PlutusV1":[100788,420,1,1,1000,173,0,1,1000,59957,4,1,11183,32,201305,8356,4,16000,100,16000,100,16000,100,16000,100,16000,100,16000,100,100,100,16000,100,94375,32,132994,32,61462,4,72010,178,0,1,22151,32,91189,769,4,2,85848,228465,122,0,1,1,1000,42921,4,2,30623,28755,75,1,898148,27279,1,51775,558,1,39184,1000,60594,1,141895,32,83150,32,15299,32,76049,1,13169,4,22100,10,28999,74,1,28999,74,1,43285,552,1,44749,541,1,33852,32,68246,32,72362,32,7243,32,7391,32,11546,32,85848,228465,122,0,1,1,90434,519,0,1,74433,32,85848,228465,122,0,1,1,85848,228465,122,0,1,1,270652,22588,4,1457325,64566,4,20467,1,4,0,141992,32,100788,420,1,1,81663,32,59498,32,20142,32,24588,32,20744,32,25933,32,24623,32,53384111,14333,10,955506,213312,0,2,43053543,10,43574283,26308,10,16000,100,16000,100,962335,18,2780678,6,442008,1,52538055,3756,18,267929,18,76433006,8868,18,52948122,18,1995836,36,3227919,12,901022,1,166917843,4307,36,284546,36,158221314,26549,36,74698472,36,333849714,1,254006273,72,2174038,72,2261318,64571,4,207616,8310,4,1293828,28716,63,0,1,1006041,43623,251,0,1,100181,726,719,0,1,100181,726,719,0,1,100181,726,719,0,1,107878,680,0,1,95336,1,281145,18848,0,1,180194,159,1,1,158519,8942,0,1,159378,8813,0,1,107490,3298,1,106057,655,1,1964219,24520,3,607153,231697,53144,0,1,116711,1957,4,231883,10,1000,24838,7,1,232010,32,321837444,25087669,18,617887431,67302824,36,356924,18413,45,21,219951,9444,1,1000,172116,183150,6,24,21,213283,618401,1998,28258,1,1000,38159,2,22,1000,95933,1,1,11,1000,277577,12,21],"PlutusV2":[100788,420,1,1,1000,173,0,1,1000,59957,4,1,11183,32,201305,8356,4,16000,100,16000,100,16000,100,16000,100,16000,100,16000,100,100,100,16000,100,94375,32,132994,32,61462,4,72010,178,0,1,22151,32,91189,769,4,2,85848,228465,122,0,1,1,1000,42921,4,2,30623,28755,75,1,898148,27279,1,51775,558,1,39184,1000,60594,1,141895,32,83150,32,15299,32,76049,1,13169,4,22100,10,28999,74,1,28999,74,1,43285,552,1,44749,541,1,33852,32,68246,32,72362,32,7243,32,7391,32,11546,32,85848,228465,122,0,1,1,90434,519,0,1,74433,32,85848,228465,122,0,1,1,85848,228465,122,0,1,1,955506,213312,0,2,270652,22588,4,1457325,64566,4,20467,1,4,0,141992,32,100788,420,1,1,81663,32,59498,32,20142,32,24588,32,20744,32,25933,32,24623,32,43053543,10,53384111,14333,10,43574283,26308,10,1293828,28716,63,0,1,1006041,43623,251,0,1,16000,100,16000,100,962335,18,2780678,6,442008,1,52538055,3756,18,267929,18,76433006,8868,18,52948122,18,1995836,36,3227919,12,901022,1,166917843,4307,36,284546,36,158221314,26549,36,74698472,36,333849714,1,254006273,72,2174038,72,2261318,64571,4,207616,8310,4,100181,726,719,0,1,100181,726,719,0,1,100181,726,719,0,1,107878,680,0,1,95336,1,281145,18848,0,1,180194,159,1,1,158519,8942,0,1,159378,8813,0,1,107490,3298,1,106057,655,1,1964219,24520,3,607153,231697,53144,0,1,116711,1957,4,231883,10,1000,24838,7,1,232010,32,321837444,25087669,18,617887431,67302824,36,356924,18413,45,21,219951,9444,1,1000,172116,183150,6,24,21,213283,618401,1998,28258,1,1000,38159,2,22,1000,95933,1,1,11,1000,277577,12,21],"PlutusV3":[100788,420,1,1,1000,173,0,1,1000,59957,4,1,11183,32,201305,8356,4,16000,100,16000,100,16000,100,16000,100,16000,100,16000,100,100,100,16000,100,94375,32,132994,32,61462,4,72010,178,0,1,22151,32,91189,769,4,2,85848,123203,7305,-900,1716,960,57,85848,0,1,1,1000,42921,4,2,30623,28755,75,1,898148,27279,1,51775,558,1,39184,1000,60594,1,141895,32,83150,32,15299,32,76049,1,13169,4,22100,10,28999,74,1,28999,74,1,43285,552,1,44749,541,1,33852,32,68246,32,72362,32,7243,32,7391,32,11546,32,85848,123203,7305,-900,1716,960,57,85848,0,1,90434,519,0,1,74433,32,85848,123203,7305,-900,1716,960,57,85848,0,1,1,85848,123203,7305,-900,1716,960,57,85848,0,1,955506,213312,0,2,270652,22588,4,1457325,64566,4,20467,1,4,0,141992,32,100788,420,1,1,81663,32,59498,32,20142,32,24588,32,20744,32,25933,32,24623,32,43053543,10,53384111,14333,10,43574283,26308,10,16000,100,16000,100,962335,18,2780678,6,442008,1,52538055,3756,18,267929,18,76433006,8868,18,52948122,18,1995836,36,3227919,12,901022,1,166917843,4307,36,284546,36,158221314,26549,36,74698472,36,333849714,1,254006273,72,2174038,72,2261318,64571,4,207616,8310,4,1293828,28716,63,0,1,1006041,43623,251,0,1,100181,726,719,0,1,100181,726,719,0,1,100181,726,719,0,1,107878,680,0,1,95336,1,281145,18848,0,1,180194,159,1,1,158519,8942,0,1,159378,8813,0,1,107490,3298,1,106057,655,1,1964219,24520,3,607153,231697,53144,0,1,116711,1957,4,231883,10,1000,24838,7,1,232010,32,321837444,25087669,18,617887431,67302824,36,356924,18413,45,21,219951,9444,1,1000,172116,183150,6,24,21,213283,618401,1998,28258,1,1000,38159,2,22,1000,95933,1,1,11,1000,277577,12,21]},"protocol_major_ver":11},"genesis":{"active_slots_coefficient":0.05,"update_quorum":5,"max_lovelace_supply":"45000000000000000","network_magic":764824073,"epoch_length":432000,"system_start":1506203091,"slots_per_kes_period":129600,"slot_length":1,"max_kes_evolutions":62,"security_param":2160}} diff --git a/applications/viewer/src/lib/julc/replay/fixtures/mainnet-withdrawZero.json b/applications/viewer/src/lib/julc/replay/fixtures/mainnet-withdrawZero.json new file mode 100644 index 0000000..a424e1f --- /dev/null +++ b/applications/viewer/src/lib/julc/replay/fixtures/mainnet-withdrawZero.json @@ -0,0 +1 @@ +{"hash":"1da5cdfa6287dc0df7283eb10e50e50c0f236eaa65fcad79516b4d6760c557e4","epoch":662,"tx":{"fees":665642,"ttl":200642960,"validity_interval_start":200642780,"required_signers":["5b7e23228dba75595645fc357d0f97ba258cfccfff5d588d4bb9165b"],"inputs":[{"tx_hash":"23f462fbf5767947c0cb7169dbd3962e6705ce5cdf760a8ac342eb7b935b1329","output_index":1,"address":"addr1z84q0denmyep98ph3tmzwsmw0j7zau9ljmsqx6a4rvaau66j2c79gy9l76sdg0xwhd7r0c0kna0tycz4y5s6mlenh8pq777e2a","stake_address":"stake1u9f9v0z5zzlldgx58n8tklphu8mf7h4jvp2j2gddluemnssjfnkzz","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"467291240921"},{"unit":"a0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235484f534b59","policy_id":"a0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235","asset_name":"HOSKY","quantity":"19604577315792"},{"unit":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c4d5350","policy_id":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c","asset_name":"MSP","quantity":"1"},{"unit":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4ca449f98fa06fff1d6c17b95c65ca609660049dc683cc3e94d3846b05419fc20d","policy_id":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c","asset_name":"asset10mw5qs6xev8uvd33cye8630zmt8djk74t35muv","quantity":"9223369433876135153"}],"data_hash":null,"inline_datum":"d8799fd8799fd87a9f581c1eae96baf29e27682ea3f815aba361a0c6059d45e4bfbe95bbd2f44affffd8799f4040ffd8799f581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c23545484f534b59ff1b0000025e0d9e03181b0000006cc9e9a2631b000011d434cc16ff18321832d8799f190682ffd87980ff","script_ref":null,"reference_script_hash":null,"inline_datum_json":{"constructor":0,"fields":[{"constructor":0,"fields":[{"constructor":1,"fields":[{"bytes":"1eae96baf29e27682ea3f815aba361a0c6059d45e4bfbe95bbd2f44a"}]}]},{"constructor":0,"fields":[{"bytes":""},{"bytes":""}]},{"constructor":0,"fields":[{"bytes":"a0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235"},{"bytes":"484f534b59"}]},{"int":2602978640664},{"int":467243999843},{"int":19603116529407},{"int":50},{"int":50},{"constructor":0,"fields":[{"int":1666}]},{"constructor":0,"fields":[]}]}},{"tx_hash":"3c584cc0a84e6e7f5fdb9d6373af158cb26eb2c88f11a6ae15a573761e28112b","output_index":0,"address":"addr1z8p79rpkcdz8x9d6tft0x0dx5mwuzac2sa4gm8cvkw5hcnzkhwsx5j8l93a3uk4zvq8z50j72cwplnfrg5vwr39e6jhqwtrjt7","stake_address":"stake1u9tthgr2frljc7c7t23xqr328e09v8qle5352x8pcjuaftsr2ggra","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"4000000"},{"unit":"a0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235484f534b59","policy_id":"a0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235","asset_name":"HOSKY","quantity":"25029718269"}],"data_hash":null,"inline_datum":"d8799fd8799f581c1deffc2d9368b1857992c8f308a9ac1eeff1f9770f18ac751df4709bffd8799fd8799f581c1deffc2d9368b1857992c8f308a9ac1eeff1f9770f18ac751df4709bffd8799fd8799fd8799f581c56bba06a48ff2c7b1e5aa2600e2a3e5e561c1fcd234518e1c4b9d4aeffffffffd87980d8799fd8799f581c1deffc2d9368b1857992c8f308a9ac1eeff1f9770f18ac751df4709bffd8799fd8799fd8799f581c56bba06a48ff2c7b1e5aa2600e2a3e5e561c1fcd234518e1c4b9d4aeffffffffd87980d8799f581cf5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c5820a449f98fa06fff1d6c17b95c65ca609660049dc683cc3e94d3846b05419fc20dffd8799fd87980d8799f1b00000005d3e330fdff1a201fd225d87980ff1a001e8480d87a80ff","script_ref":null,"reference_script_hash":null,"inline_datum_json":{"constructor":0,"fields":[{"constructor":0,"fields":[{"bytes":"1deffc2d9368b1857992c8f308a9ac1eeff1f9770f18ac751df4709b"}]},{"constructor":0,"fields":[{"constructor":0,"fields":[{"bytes":"1deffc2d9368b1857992c8f308a9ac1eeff1f9770f18ac751df4709b"}]},{"constructor":0,"fields":[{"constructor":0,"fields":[{"constructor":0,"fields":[{"bytes":"56bba06a48ff2c7b1e5aa2600e2a3e5e561c1fcd234518e1c4b9d4ae"}]}]}]}]},{"constructor":0,"fields":[]},{"constructor":0,"fields":[{"constructor":0,"fields":[{"bytes":"1deffc2d9368b1857992c8f308a9ac1eeff1f9770f18ac751df4709b"}]},{"constructor":0,"fields":[{"constructor":0,"fields":[{"constructor":0,"fields":[{"bytes":"56bba06a48ff2c7b1e5aa2600e2a3e5e561c1fcd234518e1c4b9d4ae"}]}]}]}]},{"constructor":0,"fields":[]},{"constructor":0,"fields":[{"bytes":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c"},{"bytes":"a449f98fa06fff1d6c17b95c65ca609660049dc683cc3e94d3846b05419fc20d"}]},{"constructor":0,"fields":[{"constructor":0,"fields":[]},{"constructor":0,"fields":[{"int":25029718269}]},{"int":538956325},{"constructor":0,"fields":[]}]},{"int":2000000},{"constructor":1,"fields":[]}]}},{"tx_hash":"553144e0d3dc0c6afa05a152386a00d14479de4bc298fd403ab83337364ff141","output_index":2,"address":"addr1q9dhugez3ka82k2kgh7r2lg0j7aztr8uell46kydfwu3vk6n8w2cdu8mn2ha278q6q25a9rc6gmpfeekavuargcd32vsvxhl7e","stake_address":"stake1u9fnh9vx7rae4t740rsdq92wj3udyds5uumwkww35vxc4xgffy4va","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"420008340"}],"data_hash":null,"inline_datum":null,"script_ref":null,"reference_script_hash":null,"inline_datum_json":null}],"outputs":[{"tx_hash":"1da5cdfa6287dc0df7283eb10e50e50c0f236eaa65fcad79516b4d6760c557e4","output_index":0,"address":"addr1qyw7llpdjd5trptejty0xz9f4s0wlu0ewu833tr4rh68px6khwsx5j8l93a3uk4zvq8z50j72cwplnfrg5vwr39e6jhqv309j9","stake_address":"stake1u9tthgr2frljc7c7t23xqr328e09v8qle5352x8pcjuaftsr2ggra","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"594851958"}],"data_hash":null,"inline_datum":null,"script_ref":null,"reference_script_hash":null,"inline_datum_json":null},{"tx_hash":"1da5cdfa6287dc0df7283eb10e50e50c0f236eaa65fcad79516b4d6760c557e4","output_index":1,"address":"addr1z84q0denmyep98ph3tmzwsmw0j7zau9ljmsqx6a4rvaau66j2c79gy9l76sdg0xwhd7r0c0kna0tycz4y5s6mlenh8pq777e2a","stake_address":"stake1u9f9v0z5zzlldgx58n8tklphu8mf7h4jvp2j2gddluemnssjfnkzz","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"466698388963"},{"unit":"a0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235484f534b59","policy_id":"a0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235","asset_name":"HOSKY","quantity":"19629607034061"},{"unit":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c4d5350","policy_id":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c","asset_name":"MSP","quantity":"1"},{"unit":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4ca449f98fa06fff1d6c17b95c65ca609660049dc683cc3e94d3846b05419fc20d","policy_id":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c","asset_name":"asset10mw5qs6xev8uvd33cye8630zmt8djk74t35muv","quantity":"9223369433876135153"}],"data_hash":null,"inline_datum":"d8799fd8799fd87a9f581c1eae96baf29e27682ea3f815aba361a0c6059d45e4bfbe95bbd2f44affffd8799f4040ffd8799f581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c23545484f534b59ff1b0000025e0d9e03181b0000006ca6936e6d1b000011da077123a118321832d8799f190682ffd87980ff","script_ref":null,"reference_script_hash":null,"inline_datum_json":{"constructor":0,"fields":[{"constructor":0,"fields":[{"constructor":1,"fields":[{"bytes":"1eae96baf29e27682ea3f815aba361a0c6059d45e4bfbe95bbd2f44a"}]}]},{"constructor":0,"fields":[{"bytes":""},{"bytes":""}]},{"constructor":0,"fields":[{"bytes":"a0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235"},{"bytes":"484f534b59"}]},{"int":2602978640664},{"int":466651147885},{"int":19628125397921},{"int":50},{"int":50},{"constructor":0,"fields":[{"int":1666}]},{"constructor":0,"fields":[]}]}},{"tx_hash":"1da5cdfa6287dc0df7283eb10e50e50c0f236eaa65fcad79516b4d6760c557e4","output_index":2,"address":"addr1q9dhugez3ka82k2kgh7r2lg0j7aztr8uell46kydfwu3vk6n8w2cdu8mn2ha278q6q25a9rc6gmpfeekavuargcd32vsvxhl7e","stake_address":"stake1u9fnh9vx7rae4t740rsdq92wj3udyds5uumwkww35vxc4xgffy4va","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"421342698"}],"data_hash":null,"inline_datum":null,"script_ref":null,"reference_script_hash":null,"inline_datum_json":null}],"reference_inputs":[{"tx_hash":"0dc17712e37a4e741767db2f90d4ffbf69faf88b9bed4c47864f7bd912924bea","output_index":0,"address":"addr1w86cprpvnyxcdkj5hlyhmzwwumh6yrxcgctpvdv50rvkknqyhz3rc","stake_address":null,"amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"1961050"},{"unit":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c4d534753","policy_id":"f5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c","asset_name":"MSGS","quantity":"1"}],"data_hash":null,"inline_datum":"d8799f9fd8799f581c5b7e23228dba75595645fc357d0f97ba258cfccfff5d588d4bb9165bffffd8799f581cac1871003b670526048af46deffac5aa1e40043652771d58cf210be8ffd8799f581cac1871003b670526048af46deffac5aa1e40043652771d58cf210be8ffd8799f581cc4121a88897f44e5da27899320861e020e2977b34f6b2c8afaa6f3c3ffd8799f581c25af0fc61d7285b51293a67742b588e3a6e6ad20a1b7ff5dd3379587ffd87a9f581c4abd7063ce15ef6b959630a16dc5df3b56db667ee6c9c539c2511f2affff","script_ref":null,"reference_script_hash":null,"inline_datum_json":{"constructor":0,"fields":[{"list":[{"constructor":0,"fields":[{"bytes":"5b7e23228dba75595645fc357d0f97ba258cfccfff5d588d4bb9165b"}]}]},{"constructor":0,"fields":[{"bytes":"ac1871003b670526048af46deffac5aa1e40043652771d58cf210be8"}]},{"constructor":0,"fields":[{"bytes":"ac1871003b670526048af46deffac5aa1e40043652771d58cf210be8"}]},{"constructor":0,"fields":[{"bytes":"c4121a88897f44e5da27899320861e020e2977b34f6b2c8afaa6f3c3"}]},{"constructor":0,"fields":[{"bytes":"25af0fc61d7285b51293a67742b588e3a6e6ad20a1b7ff5dd3379587"}]},{"constructor":1,"fields":[{"bytes":"4abd7063ce15ef6b959630a16dc5df3b56db667ee6c9c539c2511f2a"}]}]}},{"tx_hash":"cf4ecddde0d81f9ce8fcc881a85eb1f8ccdaf6807f03fea4cd02da896a621776","output_index":0,"address":"addr1qyqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzj2c79gy9l76sdg0xwhd7r0c0kna0tycz4y5s6mlenh8pq6a0h00","stake_address":"stake1u9f9v0z5zzlldgx58n8tklphu8mf7h4jvp2j2gddluemnssjfnkzz","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"12486070"}],"data_hash":null,"inline_datum":null,"script_ref":"8202590a63590a600100003332323232323232323222222533300832323232533300c3370e900118058008991919299980799b87480000084cc004dd5980a180a980a980a980a980a980a98068030060a99980799b87480080084c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc080cdc3a4000002264646600200200e44a66604c00229404c8c94ccc094cdc78010028a51133004004001302a002375c60500026eb8c094c07800854ccc080cdc3a40040022646464646600200202844a66605000229404c8c94ccc09ccdd798161812981618129816181698128010028a51133004004001302c002302a0013374a9001198131ba90014bd701bae3026001301e002153330203370e900200089980900419ba548000cc090cdd2a400466048604a603c00497ae04bd70099981019b87375a6044604a66446464a66604866e1d200200114bd6f7b63009bab302930220023022001323300100100322533302700114c103d87a800013232323253330283371e00e004266e9520003302c374c00297ae0133006006003375660520066eb8c09c008c0ac008c0a4004c8cc004004030894ccc09400452f5bded8c0264646464a66604c66e3d22100002100313302a337606ea4008dd3000998030030019bab3027003375c604a0046052004604e0026eb8c094c07800920004a0944c078004c08c004c06c060c8c8c8c8c8c8c94ccc08ccdc3a40000022646464646464646464646464646464646464a6660706076004264646464646464649319299981e99b87480000044c8c94ccc108c1140084c92632375a60840046eb4c10000458c8cdd81822000982218228009bac3043001303b0091533303d3370e90010008a999820181d8048a4c2c2c607601064a66607866e1d2000001132323232323232325333047304a002132498c09401458cdc3a400460886ea8c120004c120008dd6982300098230011822000982200119b8748008c0f8dd51821000981d0060a99981e19b87480080044c8c8c8c8c8c94ccc114c1200084c926302300316375a608c002608c0046088002608800466e1d2002303e3754608400260740182a66607866e1d2004001132323232323232325333047304a002132498c09401458dd6982400098240011bad30460013046002304400130440023370e9001181f1baa3042001303a00c1533303c3370e9003000899191919191919192999823982500109924c604a00a2c66e1d200230443754609000260900046eb4c118004c118008c110004c110008cdc3a4004607c6ea8c108004c0e803054ccc0f0cdc3a40100022646464646464a66608a60900042649319299982199b87480000044c8c8c8c94ccc128c13400852616375a609600260960046eb4c124004c10401854ccc10ccdc3a4004002264646464a666094609a0042930b1bad304b001304b002375a6092002608200c2c608200a2c66e1d200230423754608c002608c0046eb4c110004c110008c108004c0e803054ccc0f0cdc3a401400226464646464646464a66608e60940042649318130038b19b8748008c110dd5182400098240011bad30460013046002375a60880026088004608400260740182a66607866e1d200c001132323232323232325333047304a002132498c09801458cdc3a400460886ea8c120004c120008dd6982300098230011822000982200119b8748008c0f8dd51821000981d0060a99981e19b87480380044c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc134c14000852616375a609c002609c0046eb4c130004c130008dd6982500098250011bad30480013048002375a608c002608c0046eb4c110004c110008cdc3a4004607c6ea8c108004c0e803054ccc0f0cdc3a4020002264646464646464646464a66609260980042649318140048b19b8748008c118dd5182500098250011bad30480013048002375a608c002608c0046eb4c110004c110008c108004c0e803054ccc0f0cdc3a40240022646464646464a66608a60900042646493181200219198008008031129998238008a4c2646600600660960046464a66608c66e1d2000001132323232533304d3050002132498c0b400c58cdc3a400460946ea8c138004c138008c130004c11000858c110004c12400458dd698230009823001182200098220011bac3042001303a00c1533303c3370e900a0008a99981f981d0060a4c2c2c6074016603a018603001a603001c602c01e602c02064a66606c66e1d200000113232533303b303e002149858dd7181e000981a0090a99981b19b87480080044c8c94ccc0ecc0f800852616375c607800260680242a66606c66e1d200400113232533303b303e002149858dd7181e000981a0090a99981b19b87480180044c8c94ccc0ecc0f800852616375c607800260680242c60680222c607200260720046eb4c0dc004c0dc008c0d4004c0d4008c0cc004c0cc008c0c4004c0c4008c0bc004c0bc008c0b4004c0b4008c0ac004c0ac008c0a4004c08407858c0840748c94ccc08ccdc3a40000022a66604c60420042930b0a99981199b87480080044c8c94ccc0a0c0ac00852616375c605200260420042a66604666e1d2004001132325333028302b002149858dd7181480098108010b1810800919299981119b87480000044c8c8c8c94ccc0a4c0b00084c8c9263253330283370e9000000899192999816981800109924c64a66605666e1d20000011323253330303033002132498c04400458c0c4004c0a400854ccc0accdc3a40040022646464646464a666068606e0042930b1bad30350013035002375a606600260660046eb4c0c4004c0a400858c0a400458c0b8004c09800c54ccc0a0cdc3a40040022a666056604c0062930b0b181300118050018b18150009815001181400098100010b1810000919299981099b87480000044c8c94ccc098c0a400852616375a604e002603e0042a66604266e1d20020011323253330263029002149858dd69813800980f8010b180f800919299981019b87480000044c8c94ccc094c0a000852616375a604c002603c0042a66604066e1d20020011323253330253028002149858dd69813000980f0010b180f000919299980f99b87480000044c8c8c8c94ccc098c0a400852616375c604e002604e0046eb8c094004c07400858c0740048c94ccc078cdc3a400000226464a666046604c0042930b1bae3024001301c0021533301e3370e900100089919299981198130010a4c2c6eb8c090004c07000858c070004dd618100009810000980f8011bab301d001301d001301c00237566034002603400260320026030002602e0046eb0c054004c0340184cc004dd5980a180a980a980a980a980a980a980680300591191980080080191299980a8008a50132323253330153375e00c00229444cc014014008c054008c064008c05c004c03001cc94ccc034cdc3a40000022a666020601600e2930b0a99980699b874800800454ccc040c02c01c526161533300d3370e90020008a99980818058038a4c2c2c601600c2c60200026020004601c002600c00229309b2b118029baa001230033754002ae6955ceaab9e5573eae815d0aba24c126d8799fd87a9f581c1eae96baf29e27682ea3f815aba361a0c6059d45e4bfbe95bbd2f44affff004c0126d8799fd87a9f581cc8b0cc61374d409ff9c8512317003e7196a3e4d48553398c656cc124ffff0001","reference_script_hash":"c3e28c36c3447315ba5a56f33da6a6ddc1770a876a8d9f0cb3a97c4c","inline_datum_json":null},{"tx_hash":"2536194d2a976370a932174c10975493ab58fd7c16395d50e62b7c0e1949baea","output_index":0,"address":"addr1qyqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzj2c79gy9l76sdg0xwhd7r0c0kna0tycz4y5s6mlenh8pq6a0h00","stake_address":"stake1u9f9v0z5zzlldgx58n8tklphu8mf7h4jvp2j2gddluemnssjfnkzz","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"18114930"}],"data_hash":null,"inline_datum":null,"script_ref":"8202590f7d590f7a010000332323232323232323223222232323232533300c3232323253330103370e90011807800899191919299980a19b87480000084cc004dd5980c980d180d180d180d180d180d1809003980c98090078991919191919191919191919299981019b87480080384c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc0c8cdc3a4000606200226464646464646464646464646464646464a666086666605600204002c0262a6660866660580400160022a666086605c605e032264646464646464646464646464646464a6660a6a6660a666e1cccc0e002413d221034d535000480084cdd79ba6009374c00629404c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc1f8cdc3a4000002264a6660fe66ebc0a405454ccc1fccdd78138098a99983f99baf0250111533307f3370e04601e2a6660fe66e1c08403454ccc1fccdc380f8058a99983fa99983f80b8801899983f801a504a22a6660fe66ebc0dc0c454ccc1fcccc0f002520a01f4802854ccc1fcccc0f001d20a01f4802840045280a5014a029405280a5014a029405280a5032533307f3370e90010008a51133303c375a61080260fa00a904827241083460fa0082a6660fc66e1d20020011533307e3375e0500282a6660fc66ebc09804854ccc1f8cdd78120080a99983f19b8702200e1533307e3370e0400182a6660fc66e1c07802854ccc1f8cdc380e0040a99983f19b8701a0061533307e3375e030008266ebc0d80c05280a5014a029405280a5014a02940528099baf07902b307c05c3370e9001183e9baa308101001308101002307f001307f002375a60fa00260fa0046eb4c1ec004c1ec008dd6983c800983c8011bad30770013077002375a60ea00260ea00460e600260e600460e200260e200460de00260ce02c66e1d20023069375460da00260da00460d600260d60046eb4c1a4004c1a4008dd6983380098338011bad30650013065002375a60c600260c60046eb4c184004c184008c17c004c17c008c174004c174008c16c004c14c140c12c004c0dc00458c15c004c15c008dd5982a800982a8011829800982599817013000982880098248019bab304f001304f002304d0013045001304b001304b0013042011222533304633712006004266e2400400c5280a5014a02940c94ccc10ccdc3a4000002200e2a66608666e1d2002001100210043041021304600130460023044001304400130430023041001304100130380013301c014035303d0013035001303b001303b001303200130380013030001163301300e0203758606a002606a00260680046eacc0c8004c0c8004c0c4008dd59817800981780098170011bac302c001302c0023758605400260540046eb0c0a0004c080054c098004c0780684c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc0c0cdc3a4000605e0022646464646464646464646464a666078666604800203602201c2a66607866604a03600c0022a666078604e6050028264646464646464646464646464646464646464a66609ea66609e66ebc03401c54ccc13ccdd7825001099b8733303400b04b4881034d535000480085280a501323232323232323232323232323232323232323375e6e98060dd31999812999981280f00400319b8100c533306253330623371e0109110013371e00c9110014a0266e0400520c0a8a50410010040023370201466608e03c00800466608c03a00e00a6eb8c194004c194008dd71831800982d8051bae30610013061002375c60be00260ae0106eb4c174004c174008dd6982d800982d800982d001182c000982c001182b000982b00098268250b18228009818800982880098288011bab304f001304f002304d001304533028022001304b0013043003375660920026092004608e002607e002608a002608a002607801a4444a66608266e1c005200010041323233001001006225333047001133048337606ea4018dd3001a5eb7bdb1804c8c8c8c94ccc120cdd79980600500126103d879800013304c337606ea4028dd30038028a99982419b8f00a00213232533304a3370e900000089982719bb03752018609e609000400a200a609000264a666092a66609800229445280a60103d87a800013374a9000198269ba60014bd70191980080080111299982680089982719bb037520166ea00292f5bded8c0264646464a66609c66ebccc04803c00930103d8798000133052337606ea403cdd40070028a99982719b8f00f0021323253330503370e900000089982a19bb0375202260aa609c00400a200a609c00264a66609e66e1c005200014c103d87a800013374a9000198299ba80014bd7019b8000100e133052337606ea4008dd4000998030030019bad304f003375c609a00460a2004609e00226609866ec0dd48011ba600133006006003375660920066eb8c11c008c12c008c124004c8c8008c8cc004004008894ccc11c004526132533304800114984c8c8c8c8c8c8c94ccc130cdc3a4000002266014014660a000c00a2c60940026601c0040026eb8c12800cdd7182480198268019825801182500118250009982299bb037520046ea00052f5bded8c044a66607c66e400080045300103d87980001533303e3371e0040022980103d87a800014c103d87b800014a0294052818200009820000981f800981b0009980d00a019981d8009819800981c800981c8009818000981b00098170008b1980880700f1bac303300130330013032002375660600026060002605e0046eacc0b4004c0b4004c0b0008dd6181500098150011bac302800130280023758604c002603c026446464a66604c605200420022c604e00266016004466ebcc09cc080c09cc08000400888cc0180088cdd79813180f8008011119299981019b8748000c07c0044c8c8c8c8c8c8c8c8c8c94ccc0a8cdc39998078018062441044d53475300480084c8c8008c94ccc0b0cdc3a40000022646464646464646464646464a666076607c00426464646464649318120031811803981100418108049810005191980080080611299981e8008a4c2646600600660820046042607e0022c607800260780046074002607400460700026070004606c002606c004606800260680046eb0c0c8004c0a800858c0a8004c03800458c0b8004c0b8008dd59816000981600098118009814800981480098100009813000980f0008b1980280111919191919191919299981419b87480080044cdc79bae302d302600200a14a0604c0026056002604600260520026042002604e002604e002603c002464a66603c66e1d200400113023301c00216301c00122232323253330213370e90010008a400026eb4c098c07c008c07c004c94ccc080cdc3a40040022980103d87a8000132323300100100222533302600114c103d87a800013232323253330273371e014004266e9520003302b375000297ae0133006006003375a60500066eb8c098008c0a8008c0a0004dd59812980f001180f00099198008008021129998118008a6103d87a800013232323253330243371e010004266e95200033028374c00297ae01330060060033756604a0066eb8c08c008c09c008c09400488c8cc00400400c894ccc0840045300103d87a8000132325333020300500213374a90001981200125eb804cc010010004c094008c08c0048c94ccc06ccdc3a400000226464a66604060460042930b1bae302100130190021533301b3370e900100089919299981018118010a4c2c6eb8c084004c06400854ccc06ccdc3a400800226464a66604060460042930b1bae30210013019002163019001222232533301d3370e900000089919198008008021129998118008a501323253330223371e00400a29444cc010010004c09c008dd718128009bae3022301b0051533301d3370e9001000899191919198008008041129998128008a501323253330243375e605260446052604460526054604400400a29444cc010010004c0a4008c09c004cdd2a4004660466ea40052f5c06eb8c08c004c06c0144cc02800ccdd2a40006604266e952002330213022301b0054bd7025eb80c06c010888c8c8c94ccc080c08c0044c8cc00400401c894ccc0880045288991929998109919191919191919299981499b87480080044c8c94ccc0accdd78020080a51132533302c3370e9001000899b8f002375c606260540262a66605866e1d200400113371e0046eb8c0c4c0a804c52818150091bae302f001302700214a2604e002605800260480026054002604400260500026050002603e0042660080080022940c098008c09000458cc0180148cdd78011811180d9811180d98111811980d8009810000980c00111191980080080191299980e8008a5eb804c8c94ccc070c0140084cc080008cc0100100044cc010010004c084008c07c0048cdd79ba60014c0101a0002323300100100222533301a00114bd6f7b630099191919299980d99b8f488100002100313301f337606ea4008dd3000998030030019bab301c003375c6034004603c004603800244646600200200644a66603400229404c8c8c94ccc068cdd78030008a51133005005002301a002301e002301c001301100c3016001300e00116301400130140023012001300a00514984d958c94ccc030cdc3a40000022a66601e601400c2930b0a99980619b87480080044c8c94ccc044c0500084c92632533300f3370e90000008a99980918068010a4c2c2a66601e66e1d200200115333012300d00214985854ccc03ccdc3a40080022a666024601a0042930b0b18068008b180900098050030a99980619b874801000454ccc03cc0280185261616300a0053001005232533300b3370e9000000899191919191919191919191919191919191919192999811181280109919191924c64a66604666e1d2000001132325333028302b002149858dd6981480098108038a99981199b874800800454ccc098c08401c52616163021006301901130180123253330203370e9000000899192999812981400109924c64a66604666e1d2000001132325333028302b002149858dd7181480098108010a99981199b87480080044c8c94ccc0a0c0ac00852616375c605200260420042c60420022c604c002603c0282a66604066e1d200200113232323232325333029302c002149858dd6981500098150011bad30280013028002375a604c002603c0282c603c0262c66e1d2002301f375460460026046004604200260420046eb4c07c004c07c008dd6980e800980e8011bad301b001301b002375a603200260320046eb4c05c004c05c008c054004c054008c04c004c04c008c044004c02400858c0240048c94ccc028cdc3a4000002264646464a66602260280042930b1bae30120013012002375c602000260100042c60100026eb80048c014dd5000918019baa0015734aae7555cf2ab9f5740ae855d126011e581cf5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c0001","reference_script_hash":"ea07b733d932129c378af627436e7cbc2ef0bf96e0036bb51b3bde6b","inline_datum_json":null},{"tx_hash":"d46bd227bd2cf93dedd22ae9b6d92d30140cf0d68b756f6608e38d680c61ad17","output_index":0,"address":"addr1qyqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzj2c79gy9l76sdg0xwhd7r0c0kna0tycz4y5s6mlenh8pq6a0h00","stake_address":"stake1u9f9v0z5zzlldgx58n8tklphu8mf7h4jvp2j2gddluemnssjfnkzz","amount":[{"unit":"lovelace","policy_id":null,"asset_name":"lovelace","quantity":"68429870"}],"data_hash":null,"inline_datum":null,"script_ref":"8202593d17593d1401000033323232323232323232232222323232533300b32323232533300f3370e90021807000899191919191919191919191919191919191919191919191919191919191919191919191919191919191919299981d299981d19299981d99b87480000044c8c8cc004004074894ccc10400452809919299982019b8f00200514a2266008008002608a0046eb8c10c004dd71820181c8018a99981d99b87480080044c8c8c8c8cc0040040b4894ccc10c00452809919299982119baf304730403047304030473048304000200514a2266008008002608e004608a00266e95200233041375200297ae0375c60820026072006264646600200204244a66608200229404c8c8c94ccc104cdd78030008a511330050050023041002304500230430013374a90001981f99ba548008cc0fcc100c0e400d2f5c097ae030390021533303a300101113375e6e98c8cc004004088894ccc0fc00452f5bded8c0264646464a66608066e3d2201000021003133044337606ea4008dd3000998030030019bab3041003375c607e00460860046082002980101a00014a029404c8c8c8c8c8c8c8c8c8c8c94ccc1154ccc114cdc39b8d01c300100813300300a00914a02a66609001429404c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc17c05c4c8c8c94ccc188c1940c84c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8cdd79ba7001374e6464646464646464646464646464666660020020800d40b202244444646464646464646464646464646464646464646464646464646464646464646464a66614a02a66614a0266e212000003153330a50133710900000f8a9998528099b8901f003153330a5013375e07c00e264a66614c0266e1d200200114a226466e241d0dd69854009919bb030ad0100130ad0130ae01001375861580200261480200461480200229405280a5014a02646464a6661560204620042666660520520460020420046eb0c2a404008dd61853808009929998530099b87480000044c8c8c8c8c8c8c8c8c8c94ccc2c004cdc42400000a266ec0dd39999999999999999981901100100d00c00b00a004803826825815023822821816801919b89006001374e0022c616a0205c61660205a66e1d200230ae0137546164020026164020046eb4c2c004004c2c004008c2b804004c2b804008cdc3a40046150026ea8c2b004004c2900401854ccc29804cdc3a400400226464646464646464a66615c0266e2120000031337606e9cccccccccccccccccc0c008000806005805004801c01412c1240a011410c1040ad28119b89001004374e0022c6166020586162020566eb4c2c004004c2c004008c2b804004c2b804008cdc3a40046150026ea8c2b004004c2900401854ccc29804cdc3a4008002264646464646464646464a66616002a6661600266e21200000513371090000018a501337606e9cccccccccccccccccc0c808800806806005805002401c13412c0a811c11410c0b528129998588099b8900600114a2266e24004010dd38008b185a808171859808169bad30b20100130b201002375a616002002616002004615c02002615c0200466e1d200230a801375461580200261480200c2a66614c0266e1d200600113232323232323232323253330b001337109000002899bb0374e646464646464646464646464646464646464646464646464646464646464a66619c0266e21200000113253330cf0100113253330d0013333053036034001022153330d0010291330d401375066e04cdc00100028021986a009ba83370203c04a661a8026ea0cdc000e0029986a009ba83370203404a661a8026ea00612f5c02661a8026ea0cdc08100129986a009ba83370266e00078014010cc35004dd419b8101c025330d401375066e00068014cc35004dd400c25eb8058cccccccc15410412402c02401c01401009054ccc33c054ccc33c040884cccc1480e40dccc14c10412408452808260b19b89003001163253330ce013370e900000089bad30d30130cc010251323253330d001337129000000899b813330a10104200c00a00116375a61a80200261980204a6198020486660e20020140bea6661960266e2008002c4cdc019b833370466e0803408120a09c013370466e0402c080cdc0a4141380201290010b1bae30cf0100130cf01002375c619a02002618a020166eb8c32c04004c32c04008dd71864808009860808049bad30c70100130c701002375a618a02002618a020046eb4c30c04004c30c04008c30404004c30404008c2fc040054ccc2e4040484cc2f404158cc2f404150cc2f404dd40049985e809ba8007330bd0137500a097ae01330bd01054330bd01056330bd01375000e6617a026ea0024cc2f404dd402725eb80dd6985e80800985e808011bad30bb0100130bb01002375a6172020026172020046eb4c2dc04004c2dc040b8dd6985a808169ba70011630b50102e30b30102d3370e90011857009baa30b20100130b201002375a616002002616002004615c02002615c0200466e1d200230a801375461580200261480200c2a66614c0266e1d20080011323232323232323253330ae01337109000002899bb0374e646464646464646464646464646464646464646464646464a66618c02a66618c0266e252000002153330c601337129000000899b8848000cdc00010008a5014a0264646464646464a66619a02002264a66619c0266660a20680640020442661a4026ea0cdc099b8002000a007330d201375066e04cdc000f00480299869009ba833700038014661a4026ea0cdc000d00499869009ba83370003000697ae016333307e333307e333307e333307e03f4890048810033702900002380a80999b814800002404403ccdc0a400001001a0160042a66619a02a66619a02044266660a006e06a660a207e08e0422940412858cdc48118009bad30d00100130d001002375a619c02002619c020046eb4c33004004c8c94ccc32004cdc4000801099191919867809ba8333305500200106205e330cf014c01010000330cf01375066e0ccdc119b813370400e00200402a66e00cdc100e80080125eb80dd69866008011bad30ca010013333305100400301a01805f153330c8013371000400226464646619e02981010000330cf01375066660aa0040020c00bc6619e026ea0cdc199b823370266e08018004008054cdc019b8201b0010024bd701bad30cc01002375a619402002666660a20060080300340ba266198029801010000330cc014c1010000330cc01375000497ae03370666e0800804405ccdc199b8200201001816375a618e020046eb4c31404004c94ccc31004cdc3a400000226466ec0c32804004c32804c32c04004c308040744c8c8c8c94ccc320054ccc32004cdc4a4000006266e25200000114a0266ec0dd419b813330990103a01000e003375066e04ccc264040e803002800458dd69866008009866008011bad30ca0100130c20101d30c20101c375c618e02002618e020046eb8c31404004c2f404160dd71861808009861808011bae30c10100130b901056375c617e02002617e020046eb8c2f404004c2d404150dd6985d80800985d808011bad30b90100130b901002375a616e02002616e020046eb4c2d404004c2d4040b0dd69859808159ba70011630b30102c30b10102b3370e90011856009baa30b00100130b001002375a615c02002615c0200461580200261480200c2a66614c0266e1d200a00113232323232323232323253330b00153330b001337109000003899b8848000014528099bb0374e64646464646464646464646464646464646464646464a66618c0266e21200000113232323253330ca0100113253330cb01333304e03102f00101d1330cf01375066e0406c010cc33c04dd419b81019003330cf01375066e0405c010cc33c04dd419b81015003330cf01375066e0404c0192f5c02c66660f666660f666660f666660f60789110048810033702900002200400319b814800001404003800c03002800854ccc328054ccc328040744cccc1340d00c8cc1380f011007052808238b29998648099b8902000213371203c0022940dd69865008011bad30c801001333304d01601400100e163253330c6013370e900000089bad30cb0130c40101f1323253330c801337129000000899b813330990103a00600400116375a61980200261880203e61880203c6eb8c32404004c32404008dd7186380800985f8082d1bae30c50100130c501002375c6186020026176020b06eb8c30404004c30404008dd7185f80800985b8082b1bad30bd0100130bd01002375a6176020026176020046eb4c2e404004c2e404008dd6985b80800985b808171bad30b50102d374e0022c616a0205c61660205a66e1d200230ae0137546164020026164020046eb4c2c004004c2c004008dd69857008009857008011856008009852008030a9998530099b87480300044c8c8c8c8c8c8c8c8c8c94ccc2c004cdc42400000a266ec0dd39919191919191919191919191919191919191929998618099b88480000044c8c8c8c8c8c8c94ccc328040044c94ccc32c04cccc1380c40bc00407454ccc32c040904cc33c04dd419b8101b007330cf01375066e04cdc080c80280199867809ba8017330cf01375066e0405400ccc33c04dd419b810130094bd70099867809ba83370266e0406c00c01ccc33c04dd419b81019005330cf01375066e0405c00ccc33c04dd400a99867809ba83370202601297ae016333307b333307b333307b03c4890048810033702900002200580499b814800002003c03400854ccc328054ccc328040744cccc1340d00c8cc1380f011007052808238b19b8901e001375a619a02002619a020046eb4c32c04004c32c04008dd69864808009919191919299986400810899866009ba833306d00405f05b330cc014c01010000330cc01375066e0000ccccc1b800800401017d2f5c026619802981010000330cc0137506660da0060ba0b666198026ea0cdc0002199983700080100182ea5eb80cdc080a80119b81016002375a618e020046eb4c31404004cccc12804c04400402c58c94ccc30c04cdc3a400000226eb4c32004c304040684c8c94ccc31404cdc4a4000002266e04ccc258040dc01801000458dd698648080098608080d18608080c9bae30c60100130c601002375c6188020026178020ae6eb8c30804004c30804008dd7186000800985c00800a99985c80809082a082b1bad30bd0100130bd01002375a6176020026176020046eb4c2e404004c2e404008dd6985b80800985b808171bad30b50102d374e0022c616a0205c61660205a66e1d200230ae0137546164020026164020046eb4c2c004004c2c004008c2b804004c2b804008cdc3a40046150026ea8c2b004004c2900401854ccc29804cdc3a401c002264646464646464646464646464646464646464a66617202a6661720266e21200000e153330b9013371090000060a99985c8099b884800002854ccc2e404cdc4240000102a6661720266e240200404cdc48198030a5014a029405280a501323232323232323232323232323253330c70153330c7010011323232323232323253330cf013375e002006266ebc10c01c52819ba548000cc348040e8cc348040e0cc348040d8cc348040d0cc348040c8cc348040c0cc34804cdd2a401c661a40266619c0204e98103d87a80004c0103d8798000330d2013750014661a4026ea008ccc34804dd401099869009ba83370203e900119869009ba801d330d201375003697ae0330d201375066e040b0120cc348040a92f5c060ec002660f41520200261a00200261a002002619e02004619a02002618a0202626660dc05a056026266ec0dd399865809ba800d330cb01375001666196026ea0024cc32c04dd400399865809ba80054bd701ba7012163370e90011863809baa30cb0100130cb01002375a6192020026192020046eb4c31c04004c31c04008dd69862808009862808011bad30c30100130c301002375a6182020026182020046eb4c2fc04004c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc368054ccc36804cdc42400000a2a6661b40266e240a40144cdd79ba6001374c0442940528099299986d8081a09986f809ba83370266e0008801800ccc37c04dd419b81020004330df01375066e00078018cc37c04dd419b8101c004330df013750034661be026ea0014cc37c04ccc36c0400530103d87a80004c0103d87980004bd7009986f809ba833702044008661be026ea0cdc099b80020006003330df01375066e04078010cc37c04dd419b8001c006330df013750034661be026ea0014cc37c04ccc36c04005300103d87a80004c0103d87980004bd70299986d0099b88480080ac4cdc48148020a50163333333305f04b05300c00a00800600400233307d00300d06b333307d01000e00200c3370205a002a6661aa0266e240b000440b04004c8c8c8c94ccc36004cdc42400000220022c66e0c008004cdc101480119b813370466e080a8004030cdc119b82028482827004038cdc0a414138020126eb8c36004004c36004008dd7186b008009867008059bae30d40100130d401002375c61a4020026194020126eb4c34004004c34004008dd69867008009867008011bad30cc0100130cc0100230ca0100130ca0100230c80100153330c20101b1330c60105f330c60105d330c60137500126618c026ea001ccc31804dd402ca5eb804cc31804174cc3180417ccc31804dd400399863009ba8009330c60137500ae97ae0375a618c02002618c020046eb4c31004004c31004008dd69861008009861008011bad30c00100130c001037375a617c0206c2c6eacc2f404004c2f404004c2d004008c2ec040d0c2e4040ccdd6985c00800985c008011bad30b60100130b601002375a6168020026168020046eb4c2c804004c2c804008dd69858008009858008011bad30ae0100130ae010023370e90011854009baa30ac0100130a401006153330a6013370e90080008991919191919191919191919299985900a9998590099b884800002454ccc2c804cdc42400000e266e21200000514a029404cdd81ba73232323232323232323232323232323232323232323253330c8013371090000008991919191919191919299986880800899299986900999982a81c01b00081109986b009ba83370266e04080014024cc35804dd419b813370203c00600e661ac026ea0cdc080e0029986b009ba833702034006661ac026ea0cdc080c005a5eb8058cccc20804cccc20804cccc20804cccc2080410d22010048810033702900002580680599b814800002805404c01004403c00854ccc344054ccc344040884cccc1500ec0e4cc15410c12c08452808270b19b89023003375a61a80200261a8020046eb4c34804004c34804008dd69868008009868008011bad30ce010013232323232323253330cf0133710002004264661a8026ea0ccc1d400419c18ccc35005301010000330d401375066e0401c004cc35004dd419b8000633330760050040010674bd70199999982b8030028020018130120330a9998678099b88002001132330d4014c01010000330d40137506660ea0020ca0c6661a8026ea0cdc0003999983b0020028008329986a009ba83370200c00297ae033333330570050060030040240260641330d3014c1010000330d3014c1010000330d301375000c661a6026ea00152f5c066e08010094cdc100201119b81018002337020320046eb4c33004008dd6986500800999982780b00a0008070b1929998640099b87480000044dd69866809863008108991929998650099b89480000044cdc099984d8081e0030020008b1bad30ce0100130c60102130c601020375c6196020026196020046eb8c32404004c30404170dd71863808009863808011bae30c50100130bd0105a375c6186020026186020046eb8c30404004c2e404160dd6985f80800985f808011bad30bd0100130bd01002375a6176020026176020046eb4c2e404004c2e4040c0dd6985b808179ba70011630b70103030b50102f3370e90011858009baa30b40100130b401002375a6164020026164020046eb4c2c004004c2c004008dd69857008009857008011856008009852008030a9998530099b87480500044cdd81ba7323232323232323232323232323232323232323253330ba0153330ba013371290000010a99985d0099b89480000044cdc42400066e000080045280a501330be01375066e00050008cc2f804dd419b80012001330be01375066e00040008cc2f804dd419b8000e001330be01375001897ae01633308a0102b00500353330b8013306a008006133702002064264a6661720266e240cc004400858ccc224040a92210048810033308801029007005375c6176020026176020046eb8c2e404004c2c404138dd7185b80800985b808011bae30b50100130ad0104c375a6166020026166020046eb4c2c404004c2c404008dd69857808009857808011bad30ad0100130ad01024375a6156020466e9c09458c2900401458c2a404004c2a404008dd6985380800985380801185280800985280801185180800985180801185080800985080801184f80800984f80801184e80800984e80801184d80800984d80801184c80800984880801181d8009981f837000984a80800984a808011bab309301001309301002309101001308901001308f01001308f01001308601004308d01005375a61160200861160200a6112020084444444444444444464646464646464646464646464646464646464646464a66614a0266e212000001132323253330a801001153330a80153330a801323232323232323253330b0013370e9000000899baf02e007153330b0013375e05c00e2660b000805a2940c2b804004c2cc04004c2ac040acc2c404004c2c404004c2c004008c2b804004c298040a44c8c8c94ccc2ac04cdc3a4000002266ebcc2c004c2a404008dd3181b8018991919191919191919baf374c0166e98cccccccc0e40d40ac010008dd7185c008009bae30b80130b90100100f00e30b001005375c616c02002616c020046eb8c2d004004c2b004008c2bc04008c2b4040054ccc2ac0409c4cdd8012812099bb002402530a9010013333222253330ad013305f00400313232323253330b401002153330b10102d13374a90001985a809ba6330b501337609801014000374c6616a0266ec13001014000375066e04004cdc0014806a5eb7bdb180cc2d404cdd81ba9006374c6616a0266ec0dd48029ba800c4bd6f7b63025eb7bdb1812f5c02c26464a66616c020042646464a66617202004008264a666174020022646464a66617402a66617402a666174026661740206c94128899b8f00500f14a0266e3c0040385280a99985d0099b8801600213374a90001985f009ba6330be0133760981014000374c6617c0266ec13001014000375066e00cdc080501900aa5eb7bdb180cc2f804cdd81ba9005374c6617c0266ec0dd48009ba83370200402c97adef6c604bd6f7b63025eb8054ccc2e804cdc380100b099ba548000cc2f804dd31985f0099bb04c1014000374c6617c0266ec13001014000375066e00cdc080501900aa5eb7bdb1812f5bded8c097ae01614c103d87a8000375c6174020046eb4c2e804004c2f00400c014c2f004008dd7185b008011bab30b60100130b80100400114c103d87a800030b701002375a616402616a026eacc2c804008c2d404008c2cc04004c0e40bc5300103d87a8000375c6068614e020466eb8c0b8c29c0408cdd7181a1853808111bae302e30a7010223756605a614c02052294054ccc2a0040904cc2b004dd419b813370003200800466158026ea0cdc080b80199856009ba83370002a00866158026ea0cdc080980199856009ba80114bd70099856009ba83370203200666158026ea0cdc099b80017004002330ac01375066e0405400ccc2b004dd419b80013004330ac01375002297ae016153330a80153330a80101b1333302b0280273302c02a02002914a020382c603200466609600400e036666609601401000200c2c64a66614a0266e1d20000011375a61540261460204026464a66614e0266e2520000011337026660f005200c0080022c6eb4c2ac04004c28c04080c28c0407cdd71854008009854008011bae30a601001309e01007375a6148020026148020046eb4c28804004c28804008dd6985000800985000801184f00800a99984c0080a09984e008091984e009ba80093309c01375000e66138026ea003d2f5c02661380202266138026ea001ccc27004dd40049984e009ba800e4bd701bad309c01001309c01002375a6134020026134020046eb4c26004004c26004008dd6984b00800984b008021bad309401003222232323232323232323232533308b013370e900000088020a999845808020998198028068a50308901001308e0100130860100b5333087013375e01400a266ebcdd30041ba600314a06116020026116020046eacc22404004c22404008c21c04004c1fc00488cccc0bc009221004881003370400290009184080984100800911111112999841009981a00300289999819999981980424410048810033702900019b800070020040030011533308201330340040031333303333330330084881004881003370200200e00c00a66e052000002133330333333033333303300848810048810033702900000380300299b814800000801000c0048888cdd81ba83370666e08008010004dd419b8333704004006002444444464646466e0ccdc0980799b813370400200266e08cdc12401000466e08cdc124141380201066e04cdc100300499b8200500a00133704900200119b803370466e08014008cdc000300419b820043370266e0801d20a09c013370400401266e0800c004cdc0a41413802002444446464646466ec0dd419b81300d33702601c00266e08cdc1001a4141380266e0520a09c01005001375066e08008cdc0a4141380200a66e08cdc099b824801120a09c0100400333704900219b800060043370466e0920083370000a00666e04cdc1002980580219b823370400c00800666e08cdc0002001001911119299983d99b87480080045200013370666e08cdc10028019bad30800130790023370466e0801120a09c01482827004c1e40048c1ec0048c8cc004004008894ccc1e800452f5bded8c02660f66466ec0c1e4004c1e8004c1f0004cc008008c1f400494ccc1d0cdc4000a40002c2a6660e866e1c005200014800054ccc1d0cdc3800a4004290010a99983a19b87001480105200213232333001001003002222533307833710002004266600600600266e0ccdc019b83005001001480104008cdc019b830014801120022337040020026eb0c1d8004c1d8008dd6183a000983a001183900098390011bad30700013070002375a60dc00260dc00460d800260d800460d400260d400460d000260c06666660220a400200a0bc940010c198004c198004c17400c58c18c0c4c188084c1840844c94ccc180c18c0744c8c94ccc188c1940e04c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc1eccdc3a402460f400a26464646464646464a6661060266e1d2000308201058132325333085015333085013371090000068a9998428099b884800009c54ccc21404cdc48138068a9998428099981600a8098140a999842809929998430099b874800800452889919b89054375a6110026466ec0c23404004c23404c23804004dd61846008009842008061842008058a9998428099baf01100315333085013371090000028a99984280998218250048a999842809826000899b89371a00290030a5014a029405280a5014a029405280a50132323232323232323232323232323232323232323232323232323232323232323253330a6013371090000008991929998540099b8902800213375e6e98004dd301f8a503333058333305833330580434890048810033702900002480480399b814800000801400c004ccc0780040800a858c94ccc29804cdc3a400000226eb4c2ac04c290040a04c8c94ccc2a004cdc4a4000002266e04ccc1e411002802000458dd69856008009852008141852008139bae30a90100130a901002375c614e02002613e0200a6eb8c29404004c29404008dd7185180800984d80801299984e0080508010802299984d8080608038802984f80800984f80801184e80800984a80805984d80800984d80801184c8080098488080419b8748008c24c04dd5184b80800984b8080098470080319b8748008c24004dd5184a00800984a008009845808021982a80319b81304800648008c24004014cc14c038cdc0982300724004611c0201a600200244446464646464a666126020082002266660120120020080046464646464646464646464646464646464646464646464646464646464646464a66615e0266ebc07400c4c8c8c8c8c8c94ccc2d404cdc42400005a26464a66616e0266e212000002153330b70153330b701009153330b7013370e66e04cdc000d0178008098a99985b8099b87337020300040222a66616e0266e1ccdc000b017807899b873370202800401a29405280a50153330b7013370e66e0406800804c54ccc2dc04cdc399b813370003005e0020222a66616e0266e1ccdc080b001007899b873370002805e01a29405280a501002161633305b02e00201e333305b00500302d00116375a6172020026172020046eb4c2dc04004c2dc04008dd6985a80800a99985780800899859809ba8012330b301375002066166026ea006d2f5c0266166026ea0040cc2cc04dd400919859809ba80194bd700b19b8748008c2bc04dd518598080098598080118588080098548080f1bad30af0100130af01002375a615a02002615a020046eb4c2ac04004c2ac04024dd69854808041bad30a80100130a801002375a614c02002614c020046eb4c29004004c29004010dd69851008019bac30a10100130a1010023758613e02002613e02004613a02002613a020046eb4c26c04004c26c04008dd6984c80800984c80801184b80800984b80800984b00800984680802184a008021849008019849008019848008011919199980080080182602d911119191919191929998488099baf374e00a980101800015333091015333091013375e9801018000374e006266ebd301018000374e00229404cc25404ccc02c0180100092f5c02c26612a0266601600c008004666601401400a006002612c0200c61280200a61280200a6124020086124020086120020064446666660700f2611c02611e02610e0200600410a02944004ccc1180052f5c04466092002660a00980042c6eb8c22404004c2040416058c21c04004c1fcc21804014dd69842808009842808011841808009841808011bac308101001307900516307f001307f002375a60fa00260fa00460f600260f600460f200260f200460ee00260ee00460ea00260ea00260e800260e600260d400460280026603008e0086eacc1b8004c1b8004c194028c1ac004c1ac008dd598348009834800983000098330009833000982e8018b1bad3063037306204716306101c22232533305f3370e90010008a4000266e0ccdc119b82004003375a60c860ba00466e0920a09c01482827004c1740048888c8c8cdc199b820010053370066e0920a09c010060013370400200666e0520a09c0100122232323232323232323253330653370e900000088010a9998328010998068028058a5030630023375e01400c60ce00260be01060ca00260ca00260c800460c400260b40024466ebc004c94ccc16ccdc3a40000022980103d87980001533305b3370e9001000899ba548008cc17cc180c16400d2f5c0266e9520043305f37526e50dd99830182c801a5eb80c1640088c94ccc164cdc3a40000022646464646464646464646464646464646464a6660dc60e2004264646464646464649319299983999b87480000044c8c94ccc1e0c1ec0084c92632375a60f00046eb4c1d800458c8cdd8183d000983d183d8009bac30790013071009153330733370e90010008a99983b18388048a4c2c2c60e201064a6660e466e1d200000113232323232323232533307d308001002132498c09801458cdc3a400460f46ea8c1f8004c1f8008dd6983e000983e001183d000983d00119b8748008c1d0dd5183c00098380060a99983919b87480080044c8c8c8c8c8c94ccc1ecc1f80084c926302400316375a60f800260f800460f400260f400466e1d20023074375460f000260e00182a6660e466e1d200400113232323232323232533307d308001002132498c09801458dd6983f000983f0011bad307c001307c002307a001307a0023370e9001183a1baa3078001307000c153330723370e900300089919191919191919299983e98400080109924c604c00a2c66e1d2002307a375460fc00260fc0046eb4c1f0004c1f0008c1e8004c1e8008cdc3a400460e86ea8c1e0004c1c003054ccc1c8cdc3a40100022646464646464a6660f660fc0042649319299983c99b87480000044c8c8c8c94ccc20004c20c0400852616375a6102020026102020046eb4c1fc004c1dc01854ccc1e4cdc3a4004002264646464a666100026106020042930b1bad308101001308101002375a60fe00260ee00c2c60ee00a2c66e1d20023078375460f800260f80046eb4c1e8004c1e8008c1e0004c1c003054ccc1c8cdc3a401400226464646464646464a6660fa6100020042649318138038b19b8748008c1e8dd5183f000983f0011bad307c001307c002375a60f400260f400460f000260e00182a6660e466e1d200c00113232323232323232533307d308001002132498c09c01458cdc3a400460f46ea8c1f8004c1f8008dd6983e000983e001183d000983d00119b8748008c1d0dd5183c00098380060a99983919b87480380044c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc20c04c2180400852616375a6108020026108020046eb4c20804004c20804008dd69840008009840008011bad307e001307e002375a60f800260f80046eb4c1e8004c1e8008cdc3a400460e86ea8c1e0004c1c003054ccc1c8cdc3a4020002264646464646464646464a6660fe6104020042649318148048b19b8748008c1f0dd51840008009840008011bad307e001307e002375a60f800260f80046eb4c1e8004c1e8008c1e0004c1c003054ccc1c8cdc3a40240022646464646464a6660f660fc0042646493181280219837802919299983d19b87480000044c8c8c8c94ccc20404c210040084c9263037003163370e9001183f1baa308201001308201002308001001307800216307800116375a60f800260f800460f400260f40046eb0c1e0004c1c003054ccc1c8cdc3a40280022a6660ea60e00182930b0b18380059814806180c806980c807180b807980b80819299983619b87480000044c8c94ccc1c4c1d000852616375c60e400260d40242a6660d866e1d20020011323253330713074002149858dd7183900098350090a99983619b87480100044c8c94ccc1c4c1d000852616375c60e400260d40242a6660d866e1d20060011323253330713074002149858dd7183900098350090b18350088b183780098378011bad306d001306d002306b001306b0023069001306900230670013067002306500130650023063001306300230610013061002305f001305700216305700123253330583370e90000008a99982d982b0010a4c2c2a6660b066e1d200200113232533305d3060002149858dd7182f000982b0010a99982c19b87480100044c8c94ccc174c18000852616375c60bc00260ac0042c60ac002464a6660ae66e1d2000001132323232533305e306100213232498c94ccc174cdc3a400000226464a6660c460ca00426493180b8008b1831800982d8018a99982e99b874800800454ccc180c16c00c5261616305b002301500316305f001305f002305d001305500216305500123253330563370e900000089919299982d982f0010a4c2c6eb4c170004c15000854ccc158cdc3a400400226464a6660b660bc0042930b1bad305c001305400216305400123253330553370e900000089919299982d182e8010a4c2c6eb4c16c004c14c00854ccc154cdc3a400400226464a6660b460ba0042930b1bad305b0013053002163053001223253330553370e90020008982d18298010a99982a99b87480080044c8c8cc004004014894ccc16c004584c8c8c8c94ccc170cdc78038010800899803003001982e8019bae305b002305f002305d001375c60b460a60042c60a60024444446464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464a66611e02a66611e02074266e1c08c0345288a99984780a9998478099baf0290131533308f013375e05207c2a66611e0266ebc0dc0c454ccc23c04cdd78138088a9998478099baf02500f1533308f013370e03a00e2a66611e0266e1c06c01454ccc23c04cdd780c8018a9998478080b8800899984780800a504a229405280a5014a029405280a5014a02646464646464646464646464646464646464646464a66614802a6661480266ebcdd30011ba604a153330a4013375e6e98004dd3022099b873370200600866e040e00885280a5013374a9000198540081e198540081d198540080619854009ba833305403204e02c330a80137506660a806009c058661500205c66150026e9ccc2a004dd401b19854009ba8034330a801375001066150026ea0018cc2a004dd401c25eb80cc2a004dd399854009ba8020330a801375003c66150026ea001ccc2a004dd400299854009ba80224bd7025eb8058cccc150cccc150cccc150cccc150cccc1512f5bded8c009e9101034d5350004800804c04401803c03401013c03000922010048810048302a29410cccc14ccccc14ccccc14ccccc14ccccc14d2f5bded8c009c911034d5350004800804804001803803001013802c00922010048810048302a29410ccc1c8104134028ccc1c4118130024ccc1c00fc02c024ccc1bc110028020dd6984f808011bad309d01001533309b013304d00b0091337606ea0cdc080124181514a086ea0cdc0800a4181514a08266ec0dd40011ba800133306b03a00a00833306a03f0090073374a90001984e009ba90443309c01375200297ae0304d3304e304d3304e007005304d3304e003001375c6136020026136020046eb8c26404004c244040a4dd7184b80800984b808011bae309501001308d0102716163370e90011847809baa309301001309301002309101001309101002375a611e02002611e020046eb4c23404004c23404008dd69845808009845808011bad308901001308901002375a610e02002610e02004610a02002610a0200461060200261060200461020200260f2004605a002609602e66e1d20023079375460fa00260fa00460f600260f60046eb4c1e4004c1e4008dd6983b800983b8011bad30750013075002375a60e600260e60046eb4c1c4004c1c4008c1bc004c1bc008c1b4004c1b4008c1ac004c18c008c05c004c0d401cc19c004c19c008dd5983280098328011831800982d805183080098308011bab305f001305f002305d0013055005222325333054333008001482807d200a100116533305300113253330543370e9001000880209919299982b199805000a4120069000099b8000100616375a60b400260a400660a400420064444a6660a666e1c00520001004132323300100100622533305900113305a337606ea4018dd3001a5eb7bdb1804c8c8c8c94ccc168cdd799807805001260103d879800013305e337606ea4028dd30038028a99982d19b8f00a00213232533305c3370e900000089983019bb0375201860c260b400400a200a60b400264a6660b6a6660bc00229445280a60103d87a800013374a90001982f9ba60014bd70191980080080111299982f80089983019bb037520166ea00292f5bded8c0264646464a6660c066ebccc05403c00930103d8798000133064337606ea403cdd40070028a99983019b8f00f0021323253330623370e900000089983319bb0375202260ce60c000400a200a60c000264a6660c266e1c005200014c103d87a800013374a9000198329ba80014bd7019b8000100e133064337606ea4008dd4000998030030019bad3061003375c60be00460c600460c20022660bc66ec0dd48011ba600133006006003375660b60066eb8c164008c174008c16c004c8c8008c8cc004004008894ccc164004526132533305a00114984c8c8c8c8c8c8c94ccc178cdc3a4000002266014014660c400c00a2c60b8002660220040026eb8c17000cdd7182d801982f801982e801182e001182e0009982b99bb037520046ea00052f5bded8c044a6660a066e3c00922010013371e0029110014a0464a66609e66e1d20000011323232323232323232323232323232323232323253330663069002132323232498c178018c078044c074048c06c04c58cdc3a400460c66ea8c19c004c19c008c194004c194008dd6983180098318011bad30610013061002375a60be00260be0046eb4c174004c174008dd6982d800982d801182c800982c801182b800982b801182a80098268010b1826800911299982799b890030021337120020062940894ccc134cdc80010008a60103d87980001533304d3371e0040022980103d87a800014c103d87b8000237260024466e280080048c94ccc128cdc3a400000226464a66609e60a40042649318030008b182800098240010a99982519b87480080044c8c8c8c8c8c94ccc14cc15800852616375a60a800260a80046eb4c148004c148008dd6982800098240010b1824000919299982499b87480000044c8c8c8c94ccc140c14c00852616375c60a200260a20046eb8c13c004c11c00858c11c0048c94ccc120cdc3a400000226464a66609a60a00042930b1bae304e0013046002153330483370e900100089919299982698280010a4c2c6eb8c138004c11800858c118004c12c02858c004004894ccc12000452000133700900119801001182580098008009112999823801099baf374e00298010180001533304700114a026660060066094004609400266600202e97ae022330040013300b00500222232323330010010040022225333046337100029000080109998018019980299b8e00700100233702002900119b81371a0069001111982200080119801815919191919191919299982299982299baf0010404a09444c94ccc118cdc3a4000002266608c66ebc008cdd2a4000660946096608801c97ae04a094454ccc118cdc3a4004002266608c66ebc008cdd2a4004660946096608801c97ae04a09444ccc118cdd780119ba548008cc128c12cc1100392f5c09412898220068a50304900130410013047001303f00130450013045001303c0013300202623375e608460766084607600207066002052466ebcc104c0e8c104c0e8c104c108c0e80040dc88c8cc00400400c894ccc10400452f5c026464a666080600a00426608800466008008002266008008002608a00460860022c464a66607666e212000001132333001001489400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000480008894ccc0f8cdc48020008a511323253330403370e00290010a50133300500533714666e312000002004337169001199b8c337000049001241000200866e0000d20023371c00600266e380140045281b8d001330010060133001001222533303933712900a0008999801801981f981f981f981f981f981f981f981f981f981f80119b81001480504cc010008004c0040048894ccc0dccdc4800a4000260780042666006006607a00466e0400520023232323232323232533303b3370e9001181d00189919299981e99b8748008c0f000c4c8c94ccc0fccdc499b810010033370466e092014481e120d00f13370066e0ccdc0800801a40080062c6eb4c10c004c0ec00c58dd69820800981c8018b181f800981b801981e800981a801981d800981d801181c800981880a9bac3037001302f001323253330323370e90001818800899191919191919191919299981e19b8733300d003038489044d53475300480084c8c8008c94ccc0f8cdc3a40000022646464646464646464646464a66609a60a0004264646464646493180f803180f003980e804180e004980d805198208059180d8008b18270009827001182600098260011825000982500118240009824001182300098230011bac3044001303c00216303c001300e00116304000130400023756607c002607c002606a002607600260760026064002607000260600022c646600200203c44a66606c002298103d87a80001323253330353232323232323232533303d3370e9001000899b8f375c608460760040722940c0ec004c100004c0e0004c0f8004c0d8004c0f0004c0f0004c0cc0084cdd2a40006607200497ae0133004004001303a002303800123253330323370e900000089919299981b981d0010a4c2c6eb8c0e0004c0c000854ccc0c8cdc3a400400226464a66606e60740042930b1bae30380013030002153330323370e900200089919299981b981d0010a4c2c6eb8c0e0004c0c000858c0c0004888c8c8c94ccc0d4cdc3a40040022900009bad303a303300230330013253330343370e90010008a6103d87a8000132323300100100222533303a00114c103d87a8000132323232533303b3371e014004266e9520003303f375000297ae0133006006003375a60780066eb8c0e8008c0f8008c0f0004dd5981c98190011819000991980080080211299981b8008a6103d87a800013232323253330383371e010004266e9520003303c374c00297ae0133006006003375660720066eb8c0dc008c0ec008c0e40048c94ccc0c0cdc3a40080022606a605c0042c605c0026eb0c0c8004c0c8008c0c0004c0c0008dd7181700098170011bac302c001302c002375a6054002604403c6eacc0a0004c0a0004c09c008dd618128009812801181180098118011bab3021001302100130200023756603c002603c002603a0046eb0c06c004c06c008dd6180c800980c8011bac3017001300f0053015001300d00116301300130130023011001300900414984d958c94ccc02ccdc3a4000002264646464646464646464a6660306036004264646493198070019180800099299980b99b87480000044c8c94ccc070c07c00852616375c603a002602a00a2a66602e66e1d20020011533301a301500514985858c054010cc03001c8dd68008b1bac3019001301900230170013017002375c602a002602a0046eb0c04c004c04c008dd6980880098048028b18048021119198008008019129998080008a4c26466006006602800460066024002464a66601466e1d200000113232533300f3012002149858dd6980800098040010a99980519b874800800454ccc034c02000852616163008001375c0024600a6ea80048c00cdd5000ab9a5573aaae7955cfaba05742ae8930011e581cf5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c004c0122d87a9f581cea07b733d932129c378af627436e7cbc2ef0bf96e0036bb51b3bde6bff0001","reference_script_hash":"1eae96baf29e27682ea3f815aba361a0c6059d45e4bfbe95bbd2f44a","inline_datum_json":null}],"invalid":false},"scripts":[{"tx_hash":"1da5cdfa6287dc0df7283eb10e50e50c0f236eaa65fcad79516b4d6760c557e4","script_hash":"c3e28c36c3447315ba5a56f33da6a6ddc1770a876a8d9f0cb3a97c4c","script_content":"{\"type\":\"PlutusScriptV2\",\"content\":\"590a63590a60010000333232…trimmed\"}","type":"PLUTUS_V2","redeemer":{"tag":"spend","index":1,"data":"d87980","ex_units":{"mem":25305,"steps":8177555}},"datum":"d8799fd8799f581c1deffc2d9368b1857992c8f308a9ac1eeff1f9770f18ac751df4709bffd8799fd8799f581c1deffc2d9368b1857992c8f308a9ac1eeff1f9770f18ac751df4709bffd8799fd8799fd8799f581c56bba06a48ff2c7b1e5aa2600e2a3e5e561c1fcd234518e1c4b9d4aeffffffffd87980d8799fd8799f581c1deffc2d9368b1857992c8f308a9ac1eeff1f9770f18ac751df4709bffd8799fd8799fd8799f581c56bba06a48ff2c7b1e5aa2600e2a3e5e561c1fcd234518e1c4b9d4aeffffffffd87980d8799f581cf5808c2c990d86da54bfc97d89cee6efa20cd8461616359478d96b4c5820a449f98fa06fff1d6c17b95c65ca609660049dc683cc3e94d3846b05419fc20dffd8799fd87980d8799f1b00000005d3e330fdff1a201fd225d87980ff1a001e8480d87a80ff","datum_hash":"a68a4714db51b7c1c5d840ccd7091457ac71e929809c83d74d2b325fdb289598"},{"tx_hash":"1da5cdfa6287dc0df7283eb10e50e50c0f236eaa65fcad79516b4d6760c557e4","script_hash":"ea07b733d932129c378af627436e7cbc2ef0bf96e0036bb51b3bde6b","script_content":"{\"type\":\"PlutusScriptV2\",\"content\":\"590f7d590f7a010000332323…trimmed\"}","type":"PLUTUS_V2","redeemer":{"tag":"spend","index":0,"data":"d87980","ex_units":{"mem":77308,"steps":23525984}},"datum":"d8799fd8799fd87a9f581c1eae96baf29e27682ea3f815aba361a0c6059d45e4bfbe95bbd2f44affffd8799f4040ffd8799f581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c23545484f534b59ff1b0000025e0d9e03181b0000006cc9e9a2631b000011d434cc16ff18321832d8799f190682ffd87980ff","datum_hash":"8905d200e7126f9342ecbbb6e958792ab264ac5e2edc1cd0722ba5e4354c69a7"},{"tx_hash":"1da5cdfa6287dc0df7283eb10e50e50c0f236eaa65fcad79516b4d6760c557e4","script_hash":"1eae96baf29e27682ea3f815aba361a0c6059d45e4bfbe95bbd2f44a","script_content":"{\"type\":\"PlutusScriptV2\",\"content\":\"593d17593d14010000333232…trimmed\"}","type":"PLUTUS_V2","redeemer":{"tag":"reward","index":0,"data":"d8799f009f1a001e8480ff4100d87a809fd87a80ffff","ex_units":{"mem":1336746,"steps":430057225}},"datum":null,"datum_hash":null}],"withdrawals":[{"block_number":14078555,"block_time":1792209120,"address":"stake17y02a946720zw6pw50upt2arvxsvvpvaghjtl054h0f0gjsfyjz59","tx_hash":"1da5cdfa6287dc0df7283eb10e50e50c0f236eaa65fcad79516b4d6760c557e4","tx_index":14,"amount":0,"epoch":662,"slot":200642829}],"mints":[],"votes":[],"stakes":[],"delegations":[],"params":{"cost_models_raw":{"PlutusV1":[100788,420,1,1,1000,173,0,1,1000,59957,4,1,11183,32,201305,8356,4,16000,100,16000,100,16000,100,16000,100,16000,100,16000,100,100,100,16000,100,94375,32,132994,32,61462,4,72010,178,0,1,22151,32,91189,769,4,2,85848,228465,122,0,1,1,1000,42921,4,2,30623,28755,75,1,898148,27279,1,51775,558,1,39184,1000,60594,1,141895,32,83150,32,15299,32,76049,1,13169,4,22100,10,28999,74,1,28999,74,1,43285,552,1,44749,541,1,33852,32,68246,32,72362,32,7243,32,7391,32,11546,32,85848,228465,122,0,1,1,90434,519,0,1,74433,32,85848,228465,122,0,1,1,85848,228465,122,0,1,1,270652,22588,4,1457325,64566,4,20467,1,4,0,141992,32,100788,420,1,1,81663,32,59498,32,20142,32,24588,32,20744,32,25933,32,24623,32,53384111,14333,10,955506,213312,0,2,43053543,10,43574283,26308,10,16000,100,16000,100,962335,18,2780678,6,442008,1,52538055,3756,18,267929,18,76433006,8868,18,52948122,18,1995836,36,3227919,12,901022,1,166917843,4307,36,284546,36,158221314,26549,36,74698472,36,333849714,1,254006273,72,2174038,72,2261318,64571,4,207616,8310,4,1293828,28716,63,0,1,1006041,43623,251,0,1,100181,726,719,0,1,100181,726,719,0,1,100181,726,719,0,1,107878,680,0,1,95336,1,281145,18848,0,1,180194,159,1,1,158519,8942,0,1,159378,8813,0,1,107490,3298,1,106057,655,1,1964219,24520,3,607153,231697,53144,0,1,116711,1957,4,231883,10,1000,24838,7,1,232010,32,321837444,25087669,18,617887431,67302824,36,356924,18413,45,21,219951,9444,1,1000,172116,183150,6,24,21,213283,618401,1998,28258,1,1000,38159,2,22,1000,95933,1,1,11,1000,277577,12,21],"PlutusV2":[100788,420,1,1,1000,173,0,1,1000,59957,4,1,11183,32,201305,8356,4,16000,100,16000,100,16000,100,16000,100,16000,100,16000,100,100,100,16000,100,94375,32,132994,32,61462,4,72010,178,0,1,22151,32,91189,769,4,2,85848,228465,122,0,1,1,1000,42921,4,2,30623,28755,75,1,898148,27279,1,51775,558,1,39184,1000,60594,1,141895,32,83150,32,15299,32,76049,1,13169,4,22100,10,28999,74,1,28999,74,1,43285,552,1,44749,541,1,33852,32,68246,32,72362,32,7243,32,7391,32,11546,32,85848,228465,122,0,1,1,90434,519,0,1,74433,32,85848,228465,122,0,1,1,85848,228465,122,0,1,1,955506,213312,0,2,270652,22588,4,1457325,64566,4,20467,1,4,0,141992,32,100788,420,1,1,81663,32,59498,32,20142,32,24588,32,20744,32,25933,32,24623,32,43053543,10,53384111,14333,10,43574283,26308,10,1293828,28716,63,0,1,1006041,43623,251,0,1,16000,100,16000,100,962335,18,2780678,6,442008,1,52538055,3756,18,267929,18,76433006,8868,18,52948122,18,1995836,36,3227919,12,901022,1,166917843,4307,36,284546,36,158221314,26549,36,74698472,36,333849714,1,254006273,72,2174038,72,2261318,64571,4,207616,8310,4,100181,726,719,0,1,100181,726,719,0,1,100181,726,719,0,1,107878,680,0,1,95336,1,281145,18848,0,1,180194,159,1,1,158519,8942,0,1,159378,8813,0,1,107490,3298,1,106057,655,1,1964219,24520,3,607153,231697,53144,0,1,116711,1957,4,231883,10,1000,24838,7,1,232010,32,321837444,25087669,18,617887431,67302824,36,356924,18413,45,21,219951,9444,1,1000,172116,183150,6,24,21,213283,618401,1998,28258,1,1000,38159,2,22,1000,95933,1,1,11,1000,277577,12,21],"PlutusV3":[100788,420,1,1,1000,173,0,1,1000,59957,4,1,11183,32,201305,8356,4,16000,100,16000,100,16000,100,16000,100,16000,100,16000,100,100,100,16000,100,94375,32,132994,32,61462,4,72010,178,0,1,22151,32,91189,769,4,2,85848,123203,7305,-900,1716,960,57,85848,0,1,1,1000,42921,4,2,30623,28755,75,1,898148,27279,1,51775,558,1,39184,1000,60594,1,141895,32,83150,32,15299,32,76049,1,13169,4,22100,10,28999,74,1,28999,74,1,43285,552,1,44749,541,1,33852,32,68246,32,72362,32,7243,32,7391,32,11546,32,85848,123203,7305,-900,1716,960,57,85848,0,1,90434,519,0,1,74433,32,85848,123203,7305,-900,1716,960,57,85848,0,1,1,85848,123203,7305,-900,1716,960,57,85848,0,1,955506,213312,0,2,270652,22588,4,1457325,64566,4,20467,1,4,0,141992,32,100788,420,1,1,81663,32,59498,32,20142,32,24588,32,20744,32,25933,32,24623,32,43053543,10,53384111,14333,10,43574283,26308,10,16000,100,16000,100,962335,18,2780678,6,442008,1,52538055,3756,18,267929,18,76433006,8868,18,52948122,18,1995836,36,3227919,12,901022,1,166917843,4307,36,284546,36,158221314,26549,36,74698472,36,333849714,1,254006273,72,2174038,72,2261318,64571,4,207616,8310,4,1293828,28716,63,0,1,1006041,43623,251,0,1,100181,726,719,0,1,100181,726,719,0,1,100181,726,719,0,1,107878,680,0,1,95336,1,281145,18848,0,1,180194,159,1,1,158519,8942,0,1,159378,8813,0,1,107490,3298,1,106057,655,1,1964219,24520,3,607153,231697,53144,0,1,116711,1957,4,231883,10,1000,24838,7,1,232010,32,321837444,25087669,18,617887431,67302824,36,356924,18413,45,21,219951,9444,1,1000,172116,183150,6,24,21,213283,618401,1998,28258,1,1000,38159,2,22,1000,95933,1,1,11,1000,277577,12,21]},"protocol_major_ver":11},"genesis":{"active_slots_coefficient":0.05,"update_quorum":5,"max_lovelace_supply":"45000000000000000","network_magic":764824073,"epoch_length":432000,"system_start":1506203091,"slots_per_kes_period":129600,"slot_length":1,"max_kes_evolutions":62,"security_param":2160}} diff --git a/applications/viewer/src/lib/julc/replay/load.ts b/applications/viewer/src/lib/julc/replay/load.ts new file mode 100644 index 0000000..7a8d375 --- /dev/null +++ b/applications/viewer/src/lib/julc/replay/load.ts @@ -0,0 +1,88 @@ +import { api, tryApi } from '$lib/api/client'; +import { purposeOf, type ReplayInput, type StoreCert, type StoreScriptRun, type StoreUtxo, type StoreVote } from './build'; +import { slotConfigFor, type Genesis } from './slots'; + +/* + * The store data a replay needs beyond what the transaction page already loaded: the epoch's cost models and + * protocol version, genesis (slot times), votes, certificates and datums referenced by hash. Fetched in the + * browser only when the user asks for a re-run. + */ + +export interface PageTx { + hash: string; + tx: ReplayInput['tx']; + scripts: StoreScriptRun[]; + withdrawals: { address: string; amount: number | string }[]; + mints: { unit: string; quantity: number | string }[]; + epoch: number | null; +} + +function safeJson(text: string) { + try { + return JSON.parse(text); + } catch { + return null; + } +} + +interface BfStake { + cert_index: number; + address: string; + registration: boolean; +} +interface BfDelegation { + cert_index: number; + address: string; + pool_id: string; +} + +export async function loadReplayInput(page: PageTx): Promise { + const { hash, tx } = page; + // Certificates and votes are only fetched when a script runs for one: some stores don't allow these + // endpoints from the browser (no CORS), and most transactions have neither. + const tags = new Set(page.scripts.map((s) => purposeOf((typeof s.redeemer === 'string' ? safeJson(s.redeemer) : s.redeemer)?.tag))); + const [epochParams, genesis, votes, stakes, delegations] = await Promise.all([ + page.epoch != null ? tryApi(`/epochs/${page.epoch}/parameters`) : null, + tryApi('/genesis'), + tags.has('vote') ? tryApi(`/governance/votes/txs/${hash}`) : null, + tags.has('cert') ? tryApi(`/blockfrost/txs/${hash}/stakes`) : null, + tags.has('cert') ? tryApi(`/blockfrost/txs/${hash}/delegations`) : null + ]); + // A store may lack an epoch's parameters (a devnet's epoch 0): use the latest ones, and say so. + const params = epochParams ?? (await api('/epochs/latest/parameters')); + + // Datums given by hash on inputs and outputs, unless the scripts endpoint already resolved them. + const known = new Set(page.scripts.filter((s) => s.datum && s.datum_hash).map((s) => s.datum_hash)); + const wanted = [...new Set([...tx.inputs, ...tx.outputs].map((u: StoreUtxo) => u.data_hash).filter((h): h is string => !!h && !known.has(h)))]; + const found = await Promise.all(wanted.map((h) => tryApi<{ cbor: string }>(`/scripts/datum/${h}/cbor`).then((d) => [h, d?.cbor] as const))); + const datums: Record = {}; + for (const [h, c] of found) if (c) datums[h] = c; + + const certificates: StoreCert[] = [ + ...(Array.isArray(stakes) ? stakes : []).map((s) => ({ cert_index: s.cert_index, type: s.registration ? ('registration' as const) : ('deregistration' as const), address: s.address })), + ...(Array.isArray(delegations) ? delegations : []).map((d) => ({ cert_index: d.cert_index, type: 'delegation' as const, address: d.address, pool_id: d.pool_id })) + ]; + + // Some stores leave out the script body (or its type) of a run; fetch those by hash. + const scripts = await Promise.all( + page.scripts.map(async (s) => { + if (!s.redeemer || (s.script_content && s.type)) return s; + const [info, body] = await Promise.all([s.type ? null : tryApi<{ type?: string }>(`/scripts/${s.script_hash}`), s.script_content ? null : tryApi<{ cbor?: string }>(`/scripts/${s.script_hash}/cbor`)]); + return { ...s, type: s.type ?? info?.type ?? null, script_content: s.script_content ?? (body?.cbor ? JSON.stringify({ content: body.cbor }) : null) }; + }) + ); + + return { + paramsEpoch: epochParams ? page.epoch : null, + hash, + tx, + scripts, + withdrawals: page.withdrawals, + mints: page.mints, + votes: Array.isArray(votes) ? votes : [], + certificates, + datums, + params, + slots: slotConfigFor(genesis?.network_magic, genesis) + }; +} diff --git a/applications/viewer/src/lib/julc/replay/slots.ts b/applications/viewer/src/lib/julc/replay/slots.ts new file mode 100644 index 0000000..5f47c4c --- /dev/null +++ b/applications/viewer/src/lib/julc/replay/slots.ts @@ -0,0 +1,39 @@ +/* + * Slot → POSIX time (ms), which is how a ScriptContext expresses a transaction's validity range. + * + * Public networks started in the Byron era with 20 s slots, so their genesis start time can't be used directly: + * they use the time and slot where Shelley (1 s slots) began. Devnets (and other custom networks) have no Byron + * slots, so time = system start + slot × slot length, from Yaci Store's /genesis. + */ + +export interface SlotConfig { + /** POSIX ms of `zeroSlot`. */ + zeroTime: number; + zeroSlot: number; + /** Slot length in ms. */ + slotLength: number; +} + +const KNOWN: Record = { + 764824073: { zeroTime: 1596059091000, zeroSlot: 4492800, slotLength: 1000 }, // mainnet + 1: { zeroTime: 1655769600000, zeroSlot: 86400, slotLength: 1000 }, // preprod + 2: { zeroTime: 1666656000000, zeroSlot: 0, slotLength: 1000 } // preview +}; + +export interface Genesis { + network_magic?: number; + /** Seconds since the epoch. */ + system_start?: number; + /** Seconds (may be fractional on fast devnets). */ + slot_length?: number; +} + +export function slotConfigFor(magic: number | null | undefined, genesis: Genesis | null | undefined): SlotConfig | null { + if (magic != null && KNOWN[magic]) return KNOWN[magic]; + if (genesis?.system_start == null || !genesis.slot_length) return null; + return { zeroTime: Math.round(genesis.system_start * 1000), zeroSlot: 0, slotLength: Math.round(genesis.slot_length * 1000) }; +} + +export function slotToPosixMs(slot: number, config: SlotConfig): bigint { + return BigInt(config.zeroTime) + BigInt(slot - config.zeroSlot) * BigInt(config.slotLength); +} diff --git a/applications/viewer/src/lib/julc/types.ts b/applications/viewer/src/lib/julc/types.ts index cfaa760..d1cc93d 100644 --- a/applications/viewer/src/lib/julc/types.ts +++ b/applications/viewer/src/lib/julc/types.ts @@ -35,6 +35,103 @@ export interface DecodeResponse { uplcText: string | null; } +/** A transaction described as JSON; julc builds the ScriptContext from it (MockTransaction in julc-models.d.ts). */ +export interface MockTxIn { + txId: string; + index: bigint; + address: { payment: string; stake?: string }; + value: MockValue; + datum: MockDatum; + referenceScript?: string | null; +} +export interface MockTxOut { + address: { payment: string; stake?: string }; + value: MockValue; + datum: MockDatum; + referenceScript?: string | null; +} +export interface MockValue { + lovelace: string; + assets: { policyId: string; tokenName: string; quantity: string }[]; +} +export type MockDatum = { kind: 'none' } | { kind: 'inline'; data: DataInput } | { kind: 'hash'; hash: string; data?: DataInput }; +export interface MockCertificate { + type: 'regStaking' | 'unregStaking' | 'delegStaking' | 'regDRep' | 'unregDRep' | 'updateDRep'; + credential: string; + deposit?: string | null; + poolId?: string | null; +} +export interface MockVote { + voterType: 'drep' | 'committee' | 'pool'; + voter: string; + actionTxId: string; + actionIndex: bigint; + vote: 'yes' | 'no' | 'abstain'; +} +export interface MockPurpose { + type: 'spend' | 'mint' | 'reward' | 'certify' | 'vote' | 'propose'; + index?: number; + target?: string; + voterType?: 'drep' | 'committee' | 'pool'; +} +export interface MockTransaction { + purpose: MockPurpose; + redeemer: DataInput; + inputs: MockTxIn[]; + referenceInputs: MockTxIn[]; + outputs: MockTxOut[]; + fee: string; + mint: { policyId: string; tokenName: string; quantity: string }[]; + certificates: MockCertificate[]; + withdrawals: { credential: string; amount: string }[]; + validRange: { from: bigint | null; fromInclusive: boolean; to: bigint | null; toInclusive: boolean }; + signatories: string[]; + datums: DataInput[]; + txId: string; + votes: MockVote[]; + proposals: []; +} + +export interface Target { + language: 'PlutusV1' | 'PlutusV2' | 'PlutusV3'; + protocol: number; +} + +export interface TransactionRequest { + script: ScriptInput; + transaction: MockTransaction; + target: Target; + costModel?: { target: Target; parameters: bigint[] } | null; + maxCpu?: bigint; + maxMem?: bigint; +} + +export interface Span { + startLine: number; + startColumn: number; + endLine: number; + endColumn: number; +} + +export interface Evaluation { + ok: boolean; + error: string | null; + status: 'success' | 'failure' | 'budgetExhausted' | string | null; + accepted: boolean; + message: string | null; + cpu: bigint; + mem: bigint; + traces: string[] | null; + failedSpan: Span | null; + result: string | null; + lastBuiltins: string[] | null; + scriptContext: string | null; + scriptContextCbor: string | null; + scriptHash: string | null; + language: string | null; + costModelId?: string; +} + export type FeatureGroup = 'vm' | 'debug' | 'compiler' | 'uplc' | 'sourceDebug' | 'sourceDebugLocals'; export interface Features { @@ -61,6 +158,12 @@ export interface JulcClient { decode(request: { script: ScriptInput }): Promise; hash(request: { script: ScriptInput }): Promise<{ scriptHash: string }>; prettyPrint(request: { script: ScriptInput; width?: number }): Promise<{ uplcText: string }>; + /** Apply the script to raw arguments (V3: the context; V1/V2: datum, redeemer, context). */ + evaluate(request: Omit & { args: DataInput[] }): Promise; + }; + /** Full engine only. */ + uplc?: { + evaluateTransaction(request: TransactionRequest): Promise; }; } diff --git a/applications/viewer/src/lib/tx/ScriptCard.svelte b/applications/viewer/src/lib/tx/ScriptCard.svelte index b956f7a..f4618b0 100644 --- a/applications/viewer/src/lib/tx/ScriptCard.svelte +++ b/applications/viewer/src/lib/tx/ScriptCard.svelte @@ -1,4 +1,5 @@