@effectstream/sync 0.104.0 → 0.200.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +8 -8
- package/src/sync-protocols/avail/AvailClient.ts +3 -0
- package/src/sync-protocols/midnight/MidnightClient.ts +7 -4
- package/src/sync-protocols/midnight/contract-state-decoder.ts +29 -0
- package/src/sync-protocols/midnight/fetcher.ts +4 -7
- package/src/sync-protocols/midnight/mint-decoder.ts +29 -21
- package/src/sync-protocols/midnight/strict-hex.ts +16 -0
- package/src/sync-protocols/midnight/types.ts +5 -3
- package/src/sync-protocols/midnight/zswap-decoder.ts +33 -28
- package/test/contract-state-decoder.test.ts +39 -0
- package/test/fixtures/midnight-rc4/README.md +81 -0
- package/test/fixtures/midnight-rc4/counter-deploy.json +34 -0
- package/test/fixtures/midnight-rc4/counter-increment.json +34 -0
- package/test/fixtures/midnight-rc4/counter-mint-shielded.json +57 -0
- package/test/fixtures/midnight-rc4/counter-mint-unshielded.json +51 -0
- package/test/fixtures/midnight-rc4/fund-alice-to-bob-with-shielded-input.json +92 -0
- package/test/fixtures/midnight-rc4/fund-genesis-to-alice.json +92 -0
- package/test/live-midnight-rc4-follow.ts +187 -0
- package/test/midnight-rc4-corpus.test.ts +239 -0
- package/test/mint-decoder.test.ts +41 -12
- package/test/zswap-decoder.test.ts +46 -16
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effectstream/sync",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.200.1",
|
|
4
4
|
"license": "(MIT OR Apache-2.0)",
|
|
5
5
|
"homepage": "https://effectstream.github.io/docs/",
|
|
6
6
|
"repository": {
|
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
},
|
|
14
14
|
"exports": "./src/mod.ts",
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@effectstream/config": "0.
|
|
17
|
-
"@effectstream/db": "0.
|
|
18
|
-
"@effectstream/log": "0.
|
|
19
|
-
"@effectstream/utils": "0.
|
|
20
|
-
"@
|
|
21
|
-
"@midnight-ntwrk/midnight-js-indexer-public-data-provider": "
|
|
22
|
-
"@midnight-ntwrk/onchain-runtime": "npm:@
|
|
16
|
+
"@effectstream/config": "0.200.1",
|
|
17
|
+
"@effectstream/db": "0.200.1",
|
|
18
|
+
"@effectstream/log": "0.200.1",
|
|
19
|
+
"@effectstream/utils": "0.200.1",
|
|
20
|
+
"@midnightntwrk/ledger-v9": "1.0.0-rc.3",
|
|
21
|
+
"@midnight-ntwrk/midnight-js-indexer-public-data-provider": "5.0.0-beta.6",
|
|
22
|
+
"@midnight-ntwrk/onchain-runtime": "npm:@midnightntwrk/onchain-runtime-v4@4.0.0-rc.3",
|
|
23
23
|
"effection": "3.5.0",
|
|
24
24
|
"graphql-ws": "^6.0.6",
|
|
25
25
|
"ntp-time-sync": "^0.5.0",
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// MUST stay first: avail-js-sdk requires the CJS @polkadot build, and
|
|
2
|
+
// @polkadot/util reads the flag this sets while loading.
|
|
3
|
+
import "@effectstream/utils/polkadot-esm-cjs-warning";
|
|
1
4
|
import { SDK } from "avail-js-sdk";
|
|
2
5
|
import { DEFAULT_REQUEST_TIMEOUT_MS, fetchWithTimeout } from "../common/http.ts";
|
|
3
6
|
import type {
|
|
@@ -17,14 +17,16 @@ export interface MidnightGqlBlockState {
|
|
|
17
17
|
};
|
|
18
18
|
transactions: {
|
|
19
19
|
hash: string;
|
|
20
|
+
protocolVersion: number;
|
|
20
21
|
contractActions: {
|
|
21
22
|
address: string;
|
|
22
23
|
state: string;
|
|
23
24
|
}[];
|
|
24
25
|
zswapLedgerEvents?: {
|
|
25
|
-
id:
|
|
26
|
-
raw:
|
|
27
|
-
maxId:
|
|
26
|
+
id: number;
|
|
27
|
+
raw: string;
|
|
28
|
+
maxId: number;
|
|
29
|
+
protocolVersion: number;
|
|
28
30
|
}[];
|
|
29
31
|
unshieldedSpentOutputs?: {
|
|
30
32
|
intentHash: string;
|
|
@@ -155,7 +157,7 @@ export class MidnightClient {
|
|
|
155
157
|
? `contractActions { address state }`
|
|
156
158
|
: "";
|
|
157
159
|
const zswapField = zswapLedgerEvents
|
|
158
|
-
? `zswapLedgerEvents { id raw maxId }`
|
|
160
|
+
? `zswapLedgerEvents { id raw maxId protocolVersion }`
|
|
159
161
|
: "";
|
|
160
162
|
const unshieldedSpentField = unshieldedSpentOutputs
|
|
161
163
|
? `unshieldedSpentOutputs { intentHash outputIndex owner value tokenType }`
|
|
@@ -187,6 +189,7 @@ export class MidnightClient {
|
|
|
187
189
|
}
|
|
188
190
|
transactions {
|
|
189
191
|
hash
|
|
192
|
+
protocolVersion
|
|
190
193
|
${contractActionsField}
|
|
191
194
|
${zswapField}
|
|
192
195
|
${unshieldedSpentField}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ContractState } from "@midnight-ntwrk/onchain-runtime";
|
|
2
|
+
import { strictHexToBytes } from "./strict-hex.ts";
|
|
3
|
+
|
|
4
|
+
export class ContractStateDecodeError extends Error {
|
|
5
|
+
override readonly name = "ContractStateDecodeError";
|
|
6
|
+
|
|
7
|
+
constructor(
|
|
8
|
+
message: string,
|
|
9
|
+
readonly rawHex: string,
|
|
10
|
+
readonly decodeCause?: unknown,
|
|
11
|
+
) {
|
|
12
|
+
super(message);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** Decode generic indexer contract state through the strict raw-hex gate. */
|
|
17
|
+
export function decodeContractState(rawHex: string): ContractState {
|
|
18
|
+
try {
|
|
19
|
+
return ContractState.deserialize(strictHexToBytes(rawHex));
|
|
20
|
+
} catch (decodeCause) {
|
|
21
|
+
throw new ContractStateDecodeError(
|
|
22
|
+
`onchain-runtime-v4 could not deserialize Midnight contract state: ${
|
|
23
|
+
(decodeCause as Error)?.message ?? String(decodeCause)
|
|
24
|
+
}`,
|
|
25
|
+
rawHex,
|
|
26
|
+
decodeCause,
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -18,9 +18,10 @@ import type {
|
|
|
18
18
|
import type { RootOutput, RootPage } from "../types.ts";
|
|
19
19
|
import { bound } from "@effectstream/utils";
|
|
20
20
|
import { MidnightClient, type BlockFetchOptions, type MidnightGqlBlockState } from "./MidnightClient.ts";
|
|
21
|
-
import {
|
|
21
|
+
import { StateValue } from "@midnight-ntwrk/onchain-runtime";
|
|
22
22
|
import { decodeZswapEvent } from "./zswap-decoder.ts";
|
|
23
23
|
import { decodeTokenMints } from "./mint-decoder.ts";
|
|
24
|
+
import { decodeContractState } from "./contract-state-decoder.ts";
|
|
24
25
|
|
|
25
26
|
export class MidnightFetcher extends BaseDataFetcher<
|
|
26
27
|
Input,
|
|
@@ -215,7 +216,6 @@ export class MidnightFetcher extends BaseDataFetcher<
|
|
|
215
216
|
for (const tx of block.block.transactions) {
|
|
216
217
|
for (const event of tx.zswapLedgerEvents ?? []) {
|
|
217
218
|
const decoded = decodeZswapEvent(event.raw);
|
|
218
|
-
if (!decoded) continue;
|
|
219
219
|
if (decoded.kind === "nullifier" && capture === "commitments") continue;
|
|
220
220
|
if (decoded.kind === "commitment" && capture === "nullifiers") continue;
|
|
221
221
|
results.push({
|
|
@@ -346,7 +346,7 @@ export class MidnightFetcher extends BaseDataFetcher<
|
|
|
346
346
|
}
|
|
347
347
|
|
|
348
348
|
// Decode custom token mints out of each regular transaction's raw bytes
|
|
349
|
-
// (ledger-
|
|
349
|
+
// (ledger-v9 deserialize → contract call transcript effects). One input per
|
|
350
350
|
// (tx, call, domainSep, kind) that actually applied on chain — see
|
|
351
351
|
// mint-decoder.ts for the segment semantics. System transactions carry no
|
|
352
352
|
// transactionResult and are skipped.
|
|
@@ -424,10 +424,7 @@ export class MidnightFetcher extends BaseDataFetcher<
|
|
|
424
424
|
if (typeof ledgerFromTxStateHex === "function") {
|
|
425
425
|
state = ledgerFromTxStateHex(rawState);
|
|
426
426
|
} else {
|
|
427
|
-
const
|
|
428
|
-
if (!hexBytes) throw new Error("contract state is empty");
|
|
429
|
-
const byteState = new Uint8Array(hexBytes.map(byte => parseInt(byte, 16)));
|
|
430
|
-
const contractState = ContractState.deserialize(byteState);
|
|
427
|
+
const contractState = decodeContractState(rawState);
|
|
431
428
|
const stateValue = contractState.data.state;
|
|
432
429
|
const generatedFields = f?.ledger(stateValue) ?? {};
|
|
433
430
|
const schemaFields = primitive.parseAdditionalLedgerFields?.(stateValue) ?? {};
|
|
@@ -1,16 +1,26 @@
|
|
|
1
1
|
import { Buffer } from "node:buffer";
|
|
2
|
-
import * as ledger from "@
|
|
2
|
+
import * as ledger from "@midnightntwrk/ledger-v9";
|
|
3
|
+
import { strictHexToBytes } from "./strict-hex.ts";
|
|
3
4
|
|
|
4
5
|
// Decodes custom token mints out of a raw Midnight transaction. A contract
|
|
5
6
|
// call's transcript effects record mints as `domain_sep → amount` maps
|
|
6
7
|
// (`shieldedMints` / `unshieldedMints`); the resulting token type ("color")
|
|
7
8
|
// is `rawTokenType(domain_sep, contract_address)`. Neither the indexer's
|
|
8
9
|
// GraphQL nor the wallet expose this mapping, so the only route is
|
|
9
|
-
// deserializing the transaction bytes with ledger-
|
|
10
|
+
// deserializing the transaction bytes with ledger-v9 — same approach as
|
|
10
11
|
// zswap-decoder.ts for nullifier events.
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
|
|
13
|
+
export class MintTransactionDecodeError extends Error {
|
|
14
|
+
override readonly name = "MintTransactionDecodeError";
|
|
15
|
+
|
|
16
|
+
constructor(
|
|
17
|
+
message: string,
|
|
18
|
+
readonly rawHex: string,
|
|
19
|
+
readonly decodeCause?: unknown,
|
|
20
|
+
) {
|
|
21
|
+
super(message);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
14
24
|
|
|
15
25
|
export interface TokenMintRecord {
|
|
16
26
|
/** Address of the minting contract, hex */
|
|
@@ -31,11 +41,6 @@ export interface TxResultLike {
|
|
|
31
41
|
segments?: { id: number; success: boolean }[] | null;
|
|
32
42
|
}
|
|
33
43
|
|
|
34
|
-
function hexToBytes(hex: string): Uint8Array {
|
|
35
|
-
const clean = hex.startsWith("0x") ? hex.slice(2) : hex;
|
|
36
|
-
return Uint8Array.from(Buffer.from(clean, "hex"));
|
|
37
|
-
}
|
|
38
|
-
|
|
39
44
|
function bytesToHex(bytes: Uint8Array): string {
|
|
40
45
|
return Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
41
46
|
}
|
|
@@ -65,15 +70,16 @@ export function decodeTokenMints(
|
|
|
65
70
|
"signature",
|
|
66
71
|
"proof",
|
|
67
72
|
"binding",
|
|
68
|
-
|
|
73
|
+
strictHexToBytes(rawHex),
|
|
69
74
|
);
|
|
70
|
-
} catch (
|
|
71
|
-
|
|
72
|
-
`
|
|
73
|
-
(
|
|
75
|
+
} catch (decodeCause) {
|
|
76
|
+
throw new MintTransactionDecodeError(
|
|
77
|
+
`ledger-v9 could not deserialize protocolVersion 2000000 transaction: ${
|
|
78
|
+
(decodeCause as Error)?.message ?? String(decodeCause)
|
|
74
79
|
}`,
|
|
80
|
+
rawHex,
|
|
81
|
+
decodeCause,
|
|
75
82
|
);
|
|
76
|
-
return [];
|
|
77
83
|
}
|
|
78
84
|
|
|
79
85
|
const records: TokenMintRecord[] = [];
|
|
@@ -87,11 +93,13 @@ export function decodeTokenMints(
|
|
|
87
93
|
if (!(action instanceof ledger.ContractCall)) continue;
|
|
88
94
|
try {
|
|
89
95
|
records.push(...mintsOfCall(action, fallibleApplied));
|
|
90
|
-
} catch (
|
|
91
|
-
|
|
92
|
-
`
|
|
96
|
+
} catch (decodeCause) {
|
|
97
|
+
throw new MintTransactionDecodeError(
|
|
98
|
+
`ledger-v9 failed to read mint transcripts for contract ${
|
|
93
99
|
(action as any)?.address ?? "?"
|
|
94
|
-
}: ${(
|
|
100
|
+
}: ${(decodeCause as Error)?.message ?? String(decodeCause)}`,
|
|
101
|
+
rawHex,
|
|
102
|
+
decodeCause,
|
|
95
103
|
);
|
|
96
104
|
}
|
|
97
105
|
}
|
|
@@ -138,7 +146,7 @@ function mintsOfCall(
|
|
|
138
146
|
contractAddress: normalizeHex(String(call.address)),
|
|
139
147
|
domainSep,
|
|
140
148
|
rawTokenType: normalizeHex(
|
|
141
|
-
String(ledger.rawTokenType(
|
|
149
|
+
String(ledger.rawTokenType(strictHexToBytes(domainSep), call.address)),
|
|
142
150
|
),
|
|
143
151
|
kind,
|
|
144
152
|
amount: amount.toString(),
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Convert raw indexer hex without JavaScript's truncation/NaN coercions. */
|
|
2
|
+
export function strictHexToBytes(rawHex: string): Uint8Array {
|
|
3
|
+
const clean = rawHex.startsWith("0x") ? rawHex.slice(2) : rawHex;
|
|
4
|
+
if (clean.length % 2 !== 0) {
|
|
5
|
+
throw new Error(`raw hex must have an even length (received ${clean.length})`);
|
|
6
|
+
}
|
|
7
|
+
if (!/^[0-9a-fA-F]*$/.test(clean)) {
|
|
8
|
+
throw new Error("raw hex contains a non-hexadecimal byte");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const bytes = new Uint8Array(clean.length / 2);
|
|
12
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
13
|
+
bytes[i] = Number.parseInt(clean.slice(i * 2, i * 2 + 2), 16);
|
|
14
|
+
}
|
|
15
|
+
return bytes;
|
|
16
|
+
}
|
|
@@ -64,9 +64,10 @@ interface Transaction {
|
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
export interface ZswapLedgerEvent {
|
|
67
|
-
id:
|
|
68
|
-
raw:
|
|
69
|
-
maxId:
|
|
67
|
+
id: number;
|
|
68
|
+
raw: string;
|
|
69
|
+
maxId: number;
|
|
70
|
+
protocolVersion: number;
|
|
70
71
|
}
|
|
71
72
|
|
|
72
73
|
export interface Block {
|
|
@@ -79,6 +80,7 @@ export interface Block {
|
|
|
79
80
|
};
|
|
80
81
|
transactions: {
|
|
81
82
|
hash: MidnightTxHash;
|
|
83
|
+
protocolVersion: number;
|
|
82
84
|
contractActions: {
|
|
83
85
|
address: MidnightAddress;
|
|
84
86
|
state: string;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import * as ledger from '@
|
|
1
|
+
import * as ledger from '@midnightntwrk/ledger-v9';
|
|
2
|
+
import { strictHexToBytes } from "./strict-hex.ts";
|
|
2
3
|
|
|
3
|
-
// Wire format of a raw zswap ledger event, for reference (midnight-ledger
|
|
4
|
+
// Wire format of a raw zswap ledger event, for reference (midnight-ledger 9.x,
|
|
4
5
|
// `midnight-ledger/ledger/src/events.rs` + `storage-core/src/arena.rs`):
|
|
5
6
|
//
|
|
6
|
-
//
|
|
7
|
+
// 20 bytes outer tag "midnight:event[v14]:"
|
|
7
8
|
// then a TopoSortedNodes envelope (NOT the struct directly):
|
|
8
9
|
// compact_u32 node count, and per node: compact_u32 child count,
|
|
9
10
|
// compact_u64 child indices, compact_u32 data length, data bytes.
|
|
@@ -23,16 +24,7 @@ function normalizeHex(hex: string): string {
|
|
|
23
24
|
return (hex.startsWith("0x") ? hex.slice(2) : hex).toLowerCase();
|
|
24
25
|
}
|
|
25
26
|
|
|
26
|
-
|
|
27
|
-
const clean = hex.startsWith("0x") ? hex.slice(2) : hex;
|
|
28
|
-
const arr = new Uint8Array(clean.length / 2);
|
|
29
|
-
for (let i = 0; i < arr.length; i++) {
|
|
30
|
-
arr[i] = parseInt(clean.slice(i * 2, i * 2 + 2), 16);
|
|
31
|
-
}
|
|
32
|
-
return arr;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/** A zswap ledger event decoded via the native ledger-v8 bindings. */
|
|
27
|
+
/** A zswap ledger event decoded via the native ledger-v9 bindings. */
|
|
36
28
|
export type DecodedZswapEvent =
|
|
37
29
|
| {
|
|
38
30
|
kind: "nullifier";
|
|
@@ -59,23 +51,37 @@ export type DecodedZswapEvent =
|
|
|
59
51
|
contract?: string;
|
|
60
52
|
};
|
|
61
53
|
|
|
54
|
+
export class ZswapEventDecodeError extends Error {
|
|
55
|
+
override readonly name = "ZswapEventDecodeError";
|
|
56
|
+
|
|
57
|
+
constructor(
|
|
58
|
+
message: string,
|
|
59
|
+
readonly rawHex: string,
|
|
60
|
+
readonly decodeCause?: unknown,
|
|
61
|
+
) {
|
|
62
|
+
super(message);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
62
66
|
/**
|
|
63
67
|
* Decode a raw zswap ledger event (ZswapInput or ZswapOutput) using the
|
|
64
|
-
* native ledger-
|
|
65
|
-
* field only ever carries these two variants
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
+
* native ledger-v9 WASM deserializer. The indexer's `zswapLedgerEvents`
|
|
69
|
+
* field only ever carries these two variants. A deserialization or variant
|
|
70
|
+
* mismatch is a hard error: silently skipping it would permanently omit a
|
|
71
|
+
* nullifier or commitment from the synchronized state.
|
|
68
72
|
*/
|
|
69
|
-
export function decodeZswapEvent(rawHex: string): DecodedZswapEvent
|
|
73
|
+
export function decodeZswapEvent(rawHex: string): DecodedZswapEvent {
|
|
70
74
|
let event: ledger.Event;
|
|
71
75
|
try {
|
|
72
|
-
event = ledger.Event.deserialize(
|
|
73
|
-
} catch (
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
76
|
+
event = ledger.Event.deserialize(strictHexToBytes(rawHex));
|
|
77
|
+
} catch (decodeCause) {
|
|
78
|
+
throw new ZswapEventDecodeError(
|
|
79
|
+
`ledger-v9 could not deserialize protocolVersion 2000000 zswap event: ${
|
|
80
|
+
(decodeCause as Error)?.message ?? String(decodeCause)
|
|
81
|
+
}`,
|
|
82
|
+
rawHex,
|
|
83
|
+
decodeCause,
|
|
77
84
|
);
|
|
78
|
-
return null;
|
|
79
85
|
}
|
|
80
86
|
// EventDetails is an open union ({ tag: string } catch-all), so narrow manually.
|
|
81
87
|
const content = event.content as {
|
|
@@ -113,9 +119,8 @@ export function decodeZswapEvent(rawHex: string): DecodedZswapEvent | null {
|
|
|
113
119
|
...source,
|
|
114
120
|
};
|
|
115
121
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
122
|
+
throw new ZswapEventDecodeError(
|
|
123
|
+
`ledger-v9 returned unexpected zswap event variant "${content.tag}" for protocolVersion 2000000`,
|
|
124
|
+
rawHex,
|
|
119
125
|
);
|
|
120
|
-
return null;
|
|
121
126
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { Buffer } from "node:buffer";
|
|
3
|
+
import { ContractState } from "@midnight-ntwrk/onchain-runtime";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
ContractStateDecodeError,
|
|
7
|
+
decodeContractState,
|
|
8
|
+
} from "../src/sync-protocols/midnight/contract-state-decoder.ts";
|
|
9
|
+
|
|
10
|
+
function expectDecodeFailure(raw: string): void {
|
|
11
|
+
try {
|
|
12
|
+
decodeContractState(raw);
|
|
13
|
+
throw new Error("expected decodeContractState to throw");
|
|
14
|
+
} catch (error) {
|
|
15
|
+
expect(error).toBeInstanceOf(ContractStateDecodeError);
|
|
16
|
+
expect((error as ContractStateDecodeError).rawHex).toBe(raw);
|
|
17
|
+
expect(String(error)).toContain("onchain-runtime-v4");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
describe("decodeContractState", () => {
|
|
22
|
+
test("round-trips a valid generic contract state", () => {
|
|
23
|
+
const raw = Buffer.from(new ContractState().serialize()).toString("hex");
|
|
24
|
+
expect(decodeContractState(raw)).toBeInstanceOf(ContractState);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("rejects non-hex semantic bytes, invalid suffixes, and odd length", () => {
|
|
28
|
+
const raw = Buffer.from(new ContractState().serialize()).toString("hex");
|
|
29
|
+
const semanticOffset = 48 * 2;
|
|
30
|
+
expect(raw.length).toBeGreaterThan(semanticOffset + 2);
|
|
31
|
+
const semanticByte = `${raw.slice(0, semanticOffset)}zz${
|
|
32
|
+
raw.slice(semanticOffset + 2)
|
|
33
|
+
}`;
|
|
34
|
+
|
|
35
|
+
for (const malformed of [semanticByte, `${raw}zz`, `${raw}0`]) {
|
|
36
|
+
expectDecodeFailure(malformed);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
});
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Midnight rc.4 decoder corpus
|
|
2
|
+
|
|
3
|
+
These fixtures are immutable GraphQL snapshots from a disposable Midnight 2.x
|
|
4
|
+
stack. They are real finalized transactions and ledger events, not synthetic
|
|
5
|
+
wire payloads. Every transaction and event reports protocol version `2000000`.
|
|
6
|
+
|
|
7
|
+
## Source stack
|
|
8
|
+
|
|
9
|
+
- Capture time: 2026-08-23, after the indexer had finalized block 254.
|
|
10
|
+
- Compose project: `effectstream-00016-m4-13580`.
|
|
11
|
+
- Network ID: `undeployed`.
|
|
12
|
+
- Node: `midnightntwrk/midnight-node:2.0.0-rc.4`, local image ID
|
|
13
|
+
`sha256:caf93d6f9fb3630c906ef3e714c151655377f3d28f907d17545de1870514da2e`.
|
|
14
|
+
- Indexer: `midnightntwrk/indexer-standalone:4.4.0-rc.1`, local image ID
|
|
15
|
+
`sha256:5d79f3a20da9ed86236c7f7dc9d93b1beeb0b0c47c9c43a791041322eb80b74e`.
|
|
16
|
+
- Proof server: `midnightntwrk/proof-server:9.0.0-rc.5`, local image ID
|
|
17
|
+
`sha256:d96a4d0f3f0f10f82698288443f2873a32fed180eb8f93c0bae83572c0a187a9`.
|
|
18
|
+
- Indexer source: `/api/v4/graphql`. The capture selected block hash,
|
|
19
|
+
height, protocol version, timestamp, parent, and each transaction's hash,
|
|
20
|
+
protocol version, raw bytes, contract action address, unshielded spent/created
|
|
21
|
+
outputs, raw zswap ledger events, zswap root, and transaction result.
|
|
22
|
+
|
|
23
|
+
The stack was started and checked with:
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
ENV_FILE=/tmp/effectstream-00016-m4-13580.env ./up.sh
|
|
27
|
+
ENV_FILE=/tmp/effectstream-00016-m4-13580.env ./verify.sh
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Funding was generated with the demo-infra toolkit:
|
|
31
|
+
|
|
32
|
+
```sh
|
|
33
|
+
ENV_FILE=/tmp/effectstream-00016-m4-13580.env ./scripts/fund-wallet.sh \
|
|
34
|
+
de1100000000000000000000000000000000000000000000000000000000a11ce \
|
|
35
|
+
--shielded-amount 100000000
|
|
36
|
+
|
|
37
|
+
ENV_FILE=/tmp/effectstream-00016-m4-13580.env ./scripts/fund-wallet.sh \
|
|
38
|
+
de1100000000000000000000000000000000000000000000000000000000b0b00 \
|
|
39
|
+
--from-seed de1100000000000000000000000000000000000000000000000000000000a11ce \
|
|
40
|
+
--amount 1000000 --shielded-amount 50000000 --no-dust
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The deploy/call cases use the repository counter source at
|
|
44
|
+
`e2e/shared/contracts/midnight/contract-counter/src/counter.compact`, mounted
|
|
45
|
+
read-only and compiled in disposable Docker with
|
|
46
|
+
`compact-toolchain:0.33.0-rc.2`. Its generated
|
|
47
|
+
`compiler/contract-manifest.json` SHA-256 was
|
|
48
|
+
`217bbe58580880341fe04ea9e9195ce130f89ac78e8b68438a0ff46a425a3029`.
|
|
49
|
+
The v9-only capture process used the genesis-2 seed to deploy contract
|
|
50
|
+
`3f9b35fec2b6f7a069ee41999217ef90fda0ecbcb05d054549242650cbce1a63`,
|
|
51
|
+
then called `increment`, `mint_shielded(d4…d4, 1000000, nonce)`, and
|
|
52
|
+
`mint_unshielded(e5…e5, 1000000, genesis-2-address)`.
|
|
53
|
+
|
|
54
|
+
## Cases
|
|
55
|
+
|
|
56
|
+
| Fixture | Height | Block | Transaction | Coverage |
|
|
57
|
+
|---|---:|---|---|---|
|
|
58
|
+
| `fund-genesis-to-alice.json` | 45 | `8987d1fa…aae70` | `490def5c…e6fbc` | NIGHT spends/creates, nullifier, commitments, root |
|
|
59
|
+
| `fund-alice-to-bob-with-shielded-input.json` | 72 | `19f0c4f5…16c52` | `2f29a591…cb311` | shielded-input nullifier, NIGHT spends/creates, commitments, root |
|
|
60
|
+
| `counter-deploy.json` | 234 | `d8aba571…c8fcd` | `1dac099b…a8f9e` | deploy raw transaction and root |
|
|
61
|
+
| `counter-increment.json` | 239 | `663f17a0…09080` | `3c5cf600…6c3af` | contract call raw transaction and root |
|
|
62
|
+
| `counter-mint-shielded.json` | 247 | `4e9157d8…2b2c9` | `16005a23…40818` | shielded mint and commitment |
|
|
63
|
+
| `counter-mint-unshielded.json` | 254 | `62eb5ec0…6cffb` | `c570f640…12d70` | unshielded mint/create |
|
|
64
|
+
|
|
65
|
+
Each zswap event retains the exact indexer `raw` input and an `expected`
|
|
66
|
+
object decoded during capture directly with
|
|
67
|
+
`@midnightntwrk/ledger-v9@1.0.0-rc.3`. Each transaction likewise retains its
|
|
68
|
+
exact serialized `raw` input; mint expectations were produced from its applied
|
|
69
|
+
contract-call transcripts. Tests compare the production decoders to these
|
|
70
|
+
pinned values and separately assert the indexer's unshielded rows and roots.
|
|
71
|
+
|
|
72
|
+
## Integrity
|
|
73
|
+
|
|
74
|
+
```text
|
|
75
|
+
a9482a98e7745439464a87ed4d172992dd7b8615f15eb42479a3574f0259d07e counter-deploy.json
|
|
76
|
+
007db6ce86eebe0aba7ef9654e33893a6e4644f30d028fbef43d7c88b5175a62 counter-increment.json
|
|
77
|
+
bc02ca34a5a8951f92ba1403181e4f64e9bf3153aa1e15727972da71334e1872 counter-mint-shielded.json
|
|
78
|
+
b3f04e2a8a04526fe28a656d48e5ca1a3c5497c886562a6e893a555a9dd27f00 counter-mint-unshielded.json
|
|
79
|
+
9be8e50e209e1d8328b4efa92a2f85f18044b95966a9a537e896bf1d75f51eba fund-alice-to-bob-with-shielded-input.json
|
|
80
|
+
cb89697ffa07fe2a520eef0c8d286e3b82ab8a4ce4c26c05e7b5d6a56977986b fund-genesis-to-alice.json
|
|
81
|
+
```
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "counter-deploy",
|
|
3
|
+
"purpose": "deploy",
|
|
4
|
+
"block": {
|
|
5
|
+
"hash": "d8aba57120dc61c9606cd5f6e9c1b8f4f2c100a47db85fe44a78a31432cc8fcd",
|
|
6
|
+
"height": 234,
|
|
7
|
+
"protocolVersion": 2000000,
|
|
8
|
+
"timestamp": 1787514666006,
|
|
9
|
+
"parent": {
|
|
10
|
+
"hash": "7133aacc2ee8cdb430d624379be632bfbf6b14f7205384cc25fc5d5d6e68309a"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"transaction": {
|
|
14
|
+
"__typename": "RegularTransaction",
|
|
15
|
+
"id": 32,
|
|
16
|
+
"hash": "1dac099bfd8f42f26fd911a036bab2993af9a6242f5aaf7411434db92c4a8f9e",
|
|
17
|
+
"protocolVersion": 2000000,
|
|
18
|
+
"raw": "6d69646e696768743a7472616e73616374696f6e5b7631325d287369676e61747572655b76325d2c70726f6f662c706564657273656e2d7363686e6f72725b76315d293ae0000801000008400804040401040808010400040004100402041408010440100c181810101010101010101010101008020c08081c080410042004030424000428080104042ce1010304e6cd010104030401080410080104010401084008000108020c4001040000010801040401040104010840080001080104040104020401040000010801040401040204010400000104000001040000010400000104000001040000010400000104000001040000010400000104000001040000010400000038346d696e745f736869656c64656400c12001ad20010000000001010000000000000000010839000000030e22000000b5b4ea7388cb7ad405497db6686a6efd7e6a32cca03af358d9aa95cb9900830664bc22730c66de6070e9acee2d411f848adc6591771166fdd240a1eabfe969567029e570dde7a8218659835c6afda4b26acf0a7b5dadd53a13e78c7a64fd7413b847d0d1b69d483148014025d9569d3634eb52e295d5ea45308cb4ae5c5d47b56f0dedc25f2f5d1b19465d87c0c28113af75dc81ea16f432adb11392e486872f8b0cd269c777843c37ef6e832b6baf3ea4b8b3fbe9b208b10a6a5c808734fe3d86908a23a0c0c6853b75a1bc4d83b37a7bf93520dec8fdcce355bf1faf346fce264e80b026ebcceff767f7f6008f9be7a50c97f7d6abed2c0e2c1fc44c67e75c2dac0cc9784592daf2bbe72de6330c4d52841e8e7a538fbe29a109be024458b382aad10b1c91edd3cae9336cc9d78d0db92ca60adefa5370def58b1a657be5d2abc3d51e1452c626209451a99ea0c9f8a52bbb518db5c80a295a49a0a51245bb095fb27a69ae4f791ab25454c80da8a20a8f2e39b61d9bfd1362f2dc97baa0c5b872cdd261a8983112035a2fe2915b971a808944a6704a37e82a08a92b8f292fc37ab98475571ddf3a16bd9974c627718e0343febb6f1b5c8912d47fd6240f6cc19c7b1aa7f6d63b0073315d0e214cbfbce9b55b0ac71063253519994937331ca66919abdc8e41488adae2f640d850cddfea4bcab093e8fa3546950b801cb0576d01aa6bca88b47624571c080340acec8a70a1129fddcc1119f3dffb165ef52794fb61fa61c455dd040fb3819d09d80dc2225a87caf3e6de7eeb0f3de687f5e9abb7a1a0fcceb63aab98be82fafc9abe4a47a57cccf00eb05b4b9dc6f039948c26bcc6ac649fb2fa291811bb2ff4a95e89e89becf2615ceaa2b199d9175c65292413a7164e4eddd7d57421ac84bfdbf6a733d2b55848d2cf310b26277388750c869657c92afcbdf892692273f1fc48c1861043f942b867c93abc4c98e29a6b2077aa6ee3cefed5f155f5dded2bd22833a2363f7378098e7686f21dec28f8cd55b3990c024581fc360c5d9add75ab5c8b7506de0c7a57596eaabb87463d33e8f78be3f4c20f5370407cec6862e8c7144660d4c6bf493e80f5c46f27058dd3df88dcacb7e6e0495eeb4123edaef42548b2c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5b07e2d55626c2b64524b5f7fda1be617754c6f0595ebfce314debf625d1b31681f38f8f4fa7bc36c9a28121eb60828b38733c9de58060ae914afa76987f149f0de7cd4cdbb5fee0bd59b432d18b89e9ec22c8648c08223a803151fa10374d2ad14438e62709bb9713e12578754caa8220cd0b6fa0226339e98480cc6debc7c06261a3096c992881aec9e8c44260c7d9371848cd752044e04e8acc9c68d17e64b2afb5a9967dc4b975ede3aa5ede99b5598305f6d4b8d61fad2fa7f42da1c01ab502d767f1c8f51a3668cca51e46f963df331508d0cac0ef3d6ee1f6c8487c473f720668d9d428085c51ea5b1000ad8b496ca2f8bfb861414c118f91ea13a3d6b570b1f9922a5c30633f16b7c084ab2abd10e30d97c701508c9d5743a0b667796d7f770c2dc7a63e7c214cbe53c10ad2b9187538db0ecaa9480ae375a7224dc1ae662bc526e84704e7498f71681e33c88366b1208badf12c22766fad315130693c8de0c2a06634841a2ce2e5da6adfb2646fe802e39e6d93ff7b7fed5b4566e8171911325cdfddb5bc57880e39204c14db4b9fb9e4335312c584ec19b092b1dcf85dd30a6aa4160d81bc13ff82850268de068429037331cdf7e71d25c2a5e93161cc44e42c53528221515b035650dd5720e76e2b0aeb43cf4463c745d852519962fec58244fe1416d63076943455b54ac162869cf75027d7725e2d7a2eedda49721512af067dcde795f35b97a6b8052b81616e90ac82e2be50469d8c2d792a2437f5ac5ea616523425185e0b1fc8b4b1797b1293529b23e5c796664ea82f6448585e8b5f007554d1f3e15451050fa12db3eb25b3ae3cfc3bc263b652c5ff9f7a548be07daf1289120f58a85c3048f9e974b761bc85805f62b29c0bce54e8ce575b0e48ebc288cbb85c534953f0f1b192e60db530fb4489c0b6efd91f90b3e67b00e61d16c5f68b918cb6ac4864cb4d9d9b1dc7fc94a3a3cd102273d002c07c93bcf06cce091bb84e2b1581d0306052c88ef596eb400cd13619c89907dc20f64c8684ed442182b7f8c4f3d2ef57f2428f7a05267562388c3191dc8448f2eb7898b6aca8196f16faf52721594acec645e81fca16ac79968fd73d1358bbb0a70110d8ca8a7840b9b30a7a6aba70d23960e835c7283a9992e61630b87a753a9b81f2f9d0175f70b338817761edfb7141e484667e3a9ffb31fabea1dd88c94243184b131afe8f366e673f6bd0c593d1e7c9deb62d7f0b7f56bbdde73d5a48c54be5161a3074a36e802f9ce9890c04b1b9cf898fe85a9311268e8032d2e6866e6c2cde2cd0fd6462ec75c19ee234bb450885b42451d4109a5d405a6340e3c9d1664f4b9cafaa324fed587bd1c8109071ccb0d659ff3ba350f86d84dc19f06f162a691700c628984bd276c21d940ffd4990f7d802df5d67dec97e71b46a158b1e759e89e3b367c93990b4a76a38b2c27570d40a9287a922f9dcf5bf242b33f12b268eb80986f7215a9b5e4bc69608acaeb755cc0ed4dd7bd88976da07e9c47756f1c9b90ef494c5cc3031ac6c9b5570fe5c45d96272716f15497ab9d41bde0af25af17b2fb7d1e99f32492fb35b5480e2cf566253a4c6c24d8f31cc4dd998de5c9c99f9122ec84aed83fdb08cbb610fea3ac11cae3eedb5f4262146848ebd602a0cd7cbe0604c2bbbd1f0d6edba74f9ea2e92b000008343800043c08010404409003043f8074acd4285f018eb45e3104599206a12605250617dff21a6bb0bcc0ab668056d00028246164645f656e74727900c11401ad14010000000001000000000000000000010836000000030913000000a7adf703f0de026dcb51028876635f530c5887113c842a9313515407e77a81a126d473213fd3cf8d6d93a6a9037f0ad5b1a5ec820ad068fb0addb214126b57ee85972d8d4b76633d23350d386d87b82e356d3d542beb4d2695e1fdd238ef0d70894b53a26d1607e1745a4bbab0931404647cf5477282b87eef93dbdb0e39c13d4498ff632a8f9ee665eb186aa16380b6b5b5a99be0c4218f42813890f1a50189313d44398d20b713c91a8666192c9e6d18a653dd2b39159e617f926b80e38b8fb869c76feed9e67e137fe117474bcb4f1f7df43fd028fe47354b8aa289cd91689b64d5947e85b43b561a29622692098ea5f4380a9fcb3f7ee88fb9766809ce2af2830124ebbdc9d388fd9ade581397ba1ced59d0848e91edf16b5ca950032812a8abd2d62b22d80593d89d1f0e3e80a712128403514fcc58550d758cce39ec8dc3d8612f279d40eef46f7e4e6c88522094bea1717672096e24f97a31354cbc706716c487a08b638c3ed2a9a2b6c365096e518b11446cae2365ca8855b4af62eac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094075db7ef4827d4ad1160e3b15681867581c5d36f8655f14e10241f0cc81d0455577efae8e5b51510b2db3bdc36f347a53e71efb5daded7fe1fb15b7094c4313d170f04f6133d8320b10e93bcc6f3369c4b2ef6a1361511e52997340c2a6e3eab1cbaf7018a432884634cd8f6f6a60331363aa2337a9d96c53dbbceb51829d4b51e1153c64f097fcbc57848ba43a4aba7b27003761fcbcbcc18399872baeabda2bb47a2df25cbba1df786ed03102d2369833bb77560c268d2994083f32ec4c1a4e489863b327b8fb025b0219ae5c6d725ea9903cc394a7e54bb7bc1903905db21ae2f70be80ef7891771dc9934fbd3ac000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009352799a6af4433fdac61bb7778953b4d87465ab3c191b5605d2561be44fb8463faacfddbfa36f9945ea82c1321d672aa53e71efb5daded7fe1fb15b7094c4313d170f04f6133d8320b10e93bcc6f3369c4b2ef6a1361511e52997340c2a6e3eb393ce71e25d59b1bebda78cfe3b9685e8abfa0a13b427e77c8289e9f5987ddd24e914f83327ac4b0217199d667b7116b408240bf83c42d2a0752e986409a1f9993bd098c6fd509dadd0453840bfe92f5c37fa24ae9e10c7522a981ef6c783b4ad947eab97950f65dc9a84e5a32a4001c00136a54169b6027620df958aa185b8e6266ca949322e3ccd503f018375ae56904e065db5811a3e2bc9a076ce7a9c575beea88b819d1a1570397ef0a6842f63b70b597f7378c6b5396c07a0088619b9a882396e019b0e372223a29fcc436ba4f4108796424efb4ab5b33e224f0f873fcd6715dab86e55bd4f10230ca8f136e88439db58c1dc02f4fba94515fa3f0583f9f1171ba1024ac818d9e9845c80a30d4fb6c41527bb4767ecdcce64ddc3979cb9d341d456f47ec242f9615e6f08189a378d130055f2cb9ae302899e90818d3ebb927cb2ca532792efc1d4ed8045fcbcad9976080f3f33c9c41ac7ed41fe24a92d58a95dfd584210e381b5b5f86943ca4a6cfd7c7bbe5c1be1f1ceb8493c9e7480986f7215a9b5e4bc69608acaeb755cc0ed4dd7bd88976da07e9c47756f1c9b90ef494c5cc3031ac6c9b5570fe5c45d8d4e51cec6dbbbfa67d21a1245e078f89a5358490dd829a93585753c5a15fd793cf1d3a38a3486904108f8d062cc09fb000008484c00045008010404549003043f80051bd949131d5855a2e14b8fdce667b8a88c128a2689b8c1eab9600bdf3aa9c0002824696e6372656d656e7400c11401ad14010000000001000000000000000000010809000000030513000000a2a95d863767e97e003fec05362855eeae8c4c18589bf547d3b4a6398701dd77a02b2072b100d02bbf22a582ff4c9b52a2c46f634373e0b31ad08fd754f0b3e9a7e232420cd0652d234b5627e59d3041e6b6f33c6b5590bf821330f551165b278ddd134df560ab66bc5b3ceaa16a38c669305e1ac648b733bc99d2948cbc713055ea9435c5997849a6be3f1c97a5a438ae4e36d26306f2b4013505698d41fc4345259ee7769cf6bf4d00bd0ab442659d7f44b41c79aac95c20d22e298fefc078ac8d0f2bec66fc9276e8dddf06548d5340a07f9771a0049354d345c369d80d8a44ea309a60e7e2596f599c95546272de9473444b90b86d74512d1cf66ce62518e0c78e875aceb883df5bb4df411a776a6b1cca2eaec24877c9f730618f91abf196eb0f626c4562496a3684e5d8ae09f8f18f4c9eb61e323f289a451cd3cc9208938ed943fa4e27a07bc91a347090b1cf92e3fafd4e4bda9eac15a110b821620cd5fb439f1171175c4da4759c07d5e3300393f6ec0d9ee52989c6d567199219b9c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000946e36e563a6d5ec9b921994b8ca866062ef1d299922d3d5b9f78bf9b6cba441893a2f22c957c69042d0271c2c25d022c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a559ac9e3eefdfdce2e677b18942b7c09a672157bb55364b6b9ebf86d3322eb344880ca961d56c34132e6d879559f1a9c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae212b2b1008492c62ba1e4ef269a630c7401a69669e274db2383d1f213c65bb3a789d0d32cefdaf2cd1dad269a28e3ac000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ed6d858323270760f98dfddfd2da62e40a4ace4512bce524fec9fdcf3150d649c149ba3037da1b45ea57ce7c60e7d62a025a132f3978036f0cf3ce0caedf4f751aed4b905a72ef2e1c49d53af38c874363098f3aac47a67df50f8e98d686f1c8dae5b8a2db48057906081c62395b0ffa1959f6594c9bd450f25c599ee613c2d176a8bde5de367d2941f690ac5509c209239570d5e02cc02649a9ec3afe10b38af44947237a34d6049242498cef9b4590c5a98b2bae0032ba1539b25c8b047438eacc0b986e318484d57ede11b5cfa8e3c0060967c2ca6093a1b23634b77b78e0a5f7bcaa3ebc883c5070e1734c19a2b9122a1d2d8783e92a070cf9df35767ced529a35d8735e6a1364316f21208831b9824816c28799861aa072cc23b14adc5b9d341d456f47ec242f9615e6f08189a378d130055f2cb9ae302899e90818d3ebb927cb2ca532792efc1d4ed8045fcbcad9976080f3f33c9c41ac7ed41fe24a92d58a95dfd584210e381b5b5f86943ca4a6cfd7c7bbe5c1be1f1ceb8493c9e7480986f7215a9b5e4bc69608acaeb755cc0ed4dd7bd88976da07e9c47756f1c9b90ef494c5cc3031ac6c9b5570fe5c45da8d1556a107b408f430c5f052dbd2189671e339faf8fc9d4b5bcd7d751cb3ba580ee6db565ede49a436599ff0671c7c40000085c6000046408010404688c03043e7ca5723bb9e6219c7e943cd692d2c4372b6e86c3a4f1a2350445dc04fffc586e00403c6d696e745f756e736869656c64656400c12001ad20010000000001010000000000000000010855000000030d220000008693f4d7e9ff5417308aca4a8225e1cfe4d55d6ca9220099644b0685eb42b9a5f8782e93cec5540bfa9215a063067deb89dff4a886921055e6c3879560b2545b787d6447a1c95075d9aae59dd1f9964cda0ad48145e49ff67a070422d65474eab567bf64adf5ffd448a97eec9fc16ed7df6931be24cd1b8948559497d2171c605ee6e1a21a7bc59e495ccfc4a6e3049bb5e72ed8074b9e090ca50f4a8502d2bd700554c88eb14242275929c31880d72966f398db833d0729774f193036aa1e6d845797e6a230935f123b07d732b797b3b42110128a49065e0fd10c292b98d0b51ed148008c166e135260415c8c46a8948fa6a82b1b2e51fdf0b7cbb1da4e4cc66633b64796decffa4964c8291dc01c79f4834b6d4b3d365162e8093c6492dfd6a7be130e64a9e3c927763e3530d5c5732e570902b068a5aa95061c07b2d94c8b6d3506c6e3afba373c7d39143d3c06f790287f07a0966c91d813e10f4c031c0464a300a1482bf082cf222efc3bf60d1211893d5be610bbe936cd9d91f241776296e8d6005e5bc7fed9d41548a9dcd87baab47c769c07fb40c2d5899e17a38be140f8f9340a112c17cc9fbfdc2a7fcc159397dc1350dc6a47eceed1614529eb44d69a10bcc4455917146d9e5bcba285f31bbf6ba68186ab8be596cf3e74fba60a95b0817b8e5d001a126b8466b5cb5f1d02ce5b672337ce5aff8f716b365e31150584bdd715dd9cb018b862ea8f219362acc2f4c66e70d1d9342cede6edc84ef9627b93e21bd702c5d859b9da42e3b07941e01c61147801d6c947b743d54b791eb9547727cf8374b9a1ffce71e56c9f729b804d120755013da4c8e46f22fb95fdbb72920fbbb9a80ff3dab976a3315b82b8e10c5ba6bb57ce09e21a68bfd43b8253ce819c0b17837ec4b7ed60be87922755cd1e3e91a2a0b964644d36f479ebd38bb93a35910c0924ae2e9e721af7680ddedb1006db3746abec4d0dba3602fad8b6948d782bf87dde8ed815eead9df289a57ed4395fe22655c42a2dab59618e4f3a8ea280fc9ea9118b5fe2e3fc6a071b5c808b39c7ce9e7d0c4505c003182de998e875e3e9a2e9e65297302492b657a744c655c6ed022e23a2e506e1bd97ec6951a6fae1da1ca6d092f7206576d175bac00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b959d13074d2db0017de176986c41cdd100a302e18ac4b1871a2be2e367d9eb17803d1c27697b66d7b76478087a7094eacd006bdaff9984a5a6d274923f990a97c652e43584d32c37ef077b7ca35698d9903c07bd76507fbdaf0cf0c410ca6a597582bc7ea388c7584e106a611f307e79168d0e724fb6a1e2487d4fb944c1e5ce6061fcf80850a0f69305cf1820ac530a24a53624a77503917ccbdd54322c83d80a5170fa7c968075c89f2df33e46076ab0d317cd7aaa69384e25325d7b2311a919e22c12d1905c990d3454ace0d512478994d272f1cd758b53be46fe8da6c6e6ea44c12e36a9447310bc678344ea606a55a425d543e5dc32ccbc11fabe0ff3840eefba4525170c3960d4d19be1f01a4067b7ef9fb7b45a21545660a55011eaf98bf238f267deffa2f625531ea352f0d3aeeda918c4345d6be80777c3b64fcc8e7255f93e5cd1b40099f226e8874c33fafb8728545524f7bdb6feb04061ebdd963ff3b1ce38594c8e83602c6b59f26a56e1ad4b3840ba29345aff9519a671651ab6bf5a7385035fdf8ac53c9bdcb4bbfdd937a3bec050fde88a8bbc8944414313bf83b6f2f52822f490e1d04a7b1aa208b27fbdebaff105ef1df0d4781ae15703f261c835b84c4c1c0c80ea19f876db0b4176b1d9567f68bd1157f8e7a59be66a026e1f6d2d233faf79c205fb31a26230c866a4d88a56aa3daf620347e8e3b1c30392a7f78461c581ecdde18c6d77235b3870ddc3fc0f753694aa3485ef1292fc9034ce9579d2cc3531045a74b1c88b1245954b19e23cbe3e6f6302c6b8f5cfe8f37a46fd150725b6b0b4fb5b94879a4d5c1682a938b7812801892b8b0c420736026a693ae93b946fc30484fd793dc20941d95ab4ac55eab5c6f9b07ae52104cbed720656f9968c57c20431191b62928f5a2245d6a131fe1a55ef8c6048f735b8e81ad6706ebd2641d8507482df5f6cb52bf177876c84b003bc64061086c83a991c225d1060e5e6eb8b8b742b3688c2f9783f3cb38a7c29d99184bec2e4efbc681a11515a8d135f44bac8e16cd282390e591a80387596c8a6ecd1c74a7786788a3304a5b88e27fb22c8746dc25ea30dfa84e986f09af7af27bd65d7a92046509b8edfc70e7e7d7d7d7f938f674b4da44b71df11fbb17c2fce3459b2d4a0584d70ef5fe37b89c2e05b56b612df446670867103f72ff436970aa15dec669783c32884824a53827c29db616e2916f3d6510284f9aafc9d3d787d7e39dc11e72025806c75fc05ce865d07a2daa59165ae4629380df38866c6db139ecec9f9278edd23ea646a3a273ab0af7728be79fad0b9fab4ccbc046cecac843dd31a2d8e14118a16381d3ddb8a1e54be3d6fc2f91a7751c706e1602dbdf30efb45ab62c99158b33042cfeeaae7fa2e4e0030ca948697e99b334b198220ca6e30feb9bd38efd84d1a30be04bdc646a3da0b19a0674af792947f957f05c8280a6cd6794f7c839d480986f7215a9b5e4bc69608acaeb755cc0ed4dd7bd88976da07e9c47756f1c9b90ef494c5cc3031ac6c9b5570fe5c45daf692883b5e03530f44e663866315e944be0acd47f3621d0b07f1341821f0b67cc54a7ea06d4d120c5540f5c345daa29a496f90acbe985889dcf46df774d10940d17b8edc137cae6d8c68511f016f2fe6affcf6e7dffb10bbfd58a8cc0afa7120000087074000478080104047c8c03043e7c16d9bfbd3a47fc324126f1c3bfb73f2359a50970b9acc41bc4bcde39cd46fa40101010101010101010101010106c1080080208004440696e6372656d656e745f6d616e75616c00c11401ad1401000000000100000000000000000001081f0000000307130000008f69f68d885b5e09639f8467d9a999f9284669a2b44101825a965f8ef0c6394943662d51b7dd8dda42ced04d4ddcda2ab1b411f72f94c3a38a48391c869ed1f843e047e6d352c07beb25184dd313903566b33c85c6ebdee7b78f65112123b8b9a0f74ee9444971ff6856c29b42b66fa7e20583d34394f1a48b1431cb96085839efa6a63f0968da743f6cdf32fc83d95fb5f6d3b14c7bc108dcf9b6427cee1d79c09dd4e802bd2f2030bf7ac1e43ac1b5f52ff4116a50caef37168de4d8d97b40b5f33abde375e00b8b007673b1cc83bd290b56189362add6c59cc26a6d11210ba195da09478cd400e680031dcfe5a66a8edbf1745e9b718e2af82dc4594ee22cf29c80bdd20042b99df6ae6ff7797438eba6c7f2c19f3f7a127444040cbd69b6900f4914dc7d07d4e5c6be1925980997d358b121e426223cb8a21d6a41c85cec8b1f22df6d3f1936c46911d96ae47045b86622b72a1394f84df7481054cbeebbed1b1fced49ed3dfc5f85a0ef9f2a880f47e19c8b73e08cb93deb5341a212786c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097aae81d8cd97c372100d3d801c1d9025b43d15fea61dce904bf4bf80a0c328b9a876422db757e556dd4276d773d2c78817fdbc7a44a911c6f1da9d17f6092006261d849b3994a3ff35c4a71e99a2df47a0b15f709e0d383c8a1d620d22d103896dc0f7ceba401aad2fc7a654e2788e205cbf84207dd1444df38a5f9f164d139a614862e22c5efdd79f211e4b24653ad938a435b9625a12fec6b21957491facb8e21e01d216a5dae2423f057c9c3260f22ef627f1c1f20c37a6216e3a26c755ca088ba60aeab291ae5c8fa1851cdd9bde02755a362d410562f2d4ad29a217d8686f32ab452b655c46641a08ca04fc760c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0f90c4a165955f835dd1b0afa011774384e2583f18ee6106a3fb6cb6e9155e9579a85bac2a128d5f8890bc754e6424b817fdbc7a44a911c6f1da9d17f6092006261d849b3994a3ff35c4a71e99a2df47a0b15f709e0d383c8a1d620d22d1038b299669e7689067f9734531abad069f6dbcabb5eb1907a1797962399eaa056f331dbf72539810bfdea54e6e36ec69bb2ad4d0190d3f6b54841d4a2a8b57906038020d2ab73d89d02cc4c689d4e9d9f806f097b90b80501700f448ae1c89e6c8aa39d72e9dbec2325f0e0e741b903f99d4c3a56244feaae4cf2563ca993609e9d1bd1228db77f2261e714687865ce5644a149a717932e59a08bcccb74fa1a7fab64811ba2838b7cbc8f6b3f8c7dc32600ecf1c41082db37d1987545cf3156de0ba26f6ee8a403dfd475c44946fa12aebf303251322740d79d8e7bfa1adfade89711adb5448f6db074cc6b1977d5fee5e7b10768dab146ce87480a16528dc2032842a8da02b2810dc3ab94e76cbc0dd508bf2578ce4791b7e2eddd3634dab9be70b9d341d456f47ec242f9615e6f08189a378d130055f2cb9ae302899e90818d3ebb927cb2ca532792efc1d4ed8045fcbcad9976080f3f33c9c41ac7ed41fe24a92d58a95dfd584210e381b5b5f86943ca4a6cfd7c7bbe5c1be1f1ceb8493c9e7480986f7215a9b5e4bc69608acaeb755cc0ed4dd7bd88976da07e9c47756f1c9b90ef494c5cc3031ac6c9b5570fe5c45da4cef7173af467d87d9c4448e1a6e13b9b6e6567fa37651a44daa5abffe3f8291de606876bde0fd5afbdb4f2b761e098000008888c00049008010404949003043f80dc25c6532c041f3a1f91f5f57b2eb69bb19811efa75b691453423fe835ab2f204010101044101058841010101010981010080214142010309c10190101030400dc60a87473ed73fdc363c99dcdb5a79bb3d28b9336a8d1d4c0aee61eb8d236e40400287b68423d06d2d2ad02330dd7fcd11ed8fda9de13b71ef3734aae706427998704a008010404a4a50101010103335d8b6a2644adb71be2b1db3ab470cb6b3ee07054e78a7a3f03d565043825f747a3fc9f40004612aeea7d6dbaa7c9366bbbcb3f9249cb7175d8f6662572af2732f957c873fb00ef82a0a88fbf9a090864ff8b16df4e39ba7d8a7f316dfd2625921315200a0800a80004ac08010404b09003043f807dc540c94ceb704a23875c11273e16bb0b8a87aed84de911f2133568115f25400008020000b12e0f474b9f26015e0b73ecde31d97f69f28d7e1c59ebad031b8d9e6b82e2dd9eb05412194b8d7dfc5656738ce0655f6065b3f22801ea67e6dc2d6961f4edf9bc08f4c715bc87df40b44431812d88d8de5a668da196df0acb7e93315d4d632d67cde81e67ad38a8e3d3039d3be4433ec5337103a0febb66a35284ebfa0ab21f30d0461a7149d09f5cdf6e04de2f3ce093922eb13eeb6ccd79b0a976fb8731c261d3b83135f13e6ec52437a9ff6b90078ed40a9cfe12a07f119e282feba7d87e621f0709b91001d9a1d32517c36057def4a738afda4651010f887ce2b8e6a8d8032f460e9ee6a5bcf8bf812d039596ffd7b53f2ebea432a384248ab603143c0f9708701c99b9f39c9ca63134e66cae7b31ba042abdce3e97d484ec667b0269baa313670bea5123373e59c3539d7fe812c5f6717463a5d2c59b9d4e2997648b8b326b353479b2f2ed31aad7e3fdfff8e084a525d1385099059c88e186ef0229b7bb98fc6b8b224c75c2fa164529f89328764fb81900d90b11edd1416ff52ef68578f8325cf5bab48c282a64475d09aeb8eda84c4b4baf2c5989ffbf1db9ffa0c858dd0e97b85ea970061f8af9835a7bdf922b700cc080448756e39da2e3d51429aaad93b6c88c0098ac60ef06fcfda047dbfa096abb7461f487ebe1a3868ea54ddbe518bc94e3589a8a54fcebadfcbde7eeb33f1d44ff5cac75ac40a24211ae6e90fc1b8d6bf770408a3684c6f65a364d1c77cdc034cb1fba4f0539b7cd6621e388c6c43f866be7d1e70a37bd9811b60c9bf759f7851c494b3622abf4f07c6b75794ba7b47223b1d85360341cd13ba5bbc561638a0cab8b6dc42fea9fc99f84c2086181aea63a593c5f308581c0b0750d71cbd545f0e2d3d5bc2de431430c4991081da9745a2c15225adbaae14c62822fc7f086438ce75999e5a9738b58c8ac39f116a8ecb65f6fe5efd5c1cf9bb6dc5b76b4496b135127554f5c339e76bea9fa6e112d0b996ae91a003fd40122ac44a1753033261e0840503ec9f0e9f908c7f81b024950c1e6fec0a27700fc17d399318c407997d38e618ae6e697ab1704cc017ab2c8679d7150ec02aedde42e08f7fb17e9d092709169a45a8cd0cc35318977e5c38064c954eb2db73c93ea32cc516bd40859509da3097dba07a7a89dbf42fb7f037795148f8614e7ba887e9d98a2523d965180acc7550330d5f4506dbe19e9751abf7c12366eb2779f3ebd4a430a84513d43e09c67c8a67b32f0b0aaed8ddd1392b255b4b0e94565f30751076f7e534c7c761f5b1f2b4a57be93d377566ec15ebae8ae45b02da2ce82c1d1d6e7a40cade8c406408c1c2639cfebf53e3d54d9bc380085e0f2111cfb8faaa8501f326b74b13c3a4bf0401e450ae4276cd887c417af0344cfbb03ce237beae5f9afbd86b1f4d00cc827fc0cf87a673c63eb9c0445268c371e2face1d79a0d07f39f0000000000000000000000000000000000000000000000000000000000000000e2cfafd1d8ef53fb2c84a2cab6089b1e252d08f04a65576fae7f6657b5539b4a5adbb4969d4816016f3743f708062e29947087704422b27d36d9c5219a85a132354f23a9482cb3bf32074a4313b380d5c40619c5906771aa8800ccd13fba1b16d477e384bff76cb25c7cdb222bc4a0c1accc058fcfe2c0de6b8d5d943e814f30d190e45759628aae7570392d46ff01f01150230dc547502a45b178e91b7c0560cf765c1007de21bc7ad79c41924774f225af501deb4684254e2aea4701eb9525ee6d7edc1764f700f561fea6c1221b513c0ed5f10b65b0488be1439902dd28303d157d27073bab805460da6c8ec35d6cca28b294341e07e055ee1c5602b94e27f390b6bef7eee93e0dbdc0bfb6fb05612bbe52585726df231d3b70d03d759469e283a62f0fd372cf1a4a8b73db55f3ed18ddda6ef4513624d560273ad73f264e9b2edb47ef5d4f3b268e701cc57c96f73a85ea8a7343151a7d8dc53b2e27e30a5d60a1ef237f433f8eb8b516b13d9b5a48c0bb317797375d471d5ba0d9ab3a531abdbcadec8207d54a2bf406ccabbf2f04857c7c64f95dde3b9a7cd003f59e48d2384e8bb99e9ce48684f13aa3eacf33e544d3fabb8ecd307282890400a1c168e10a8915b5945dceeb96ba9a9ec57262914a5d417fe58834be9ba12fc2c5f3196b9d9eca4b618b84bed97390cb28cf81054a67a93c1aec23d3953b74d9e4f20db94111b9267c473b50e820ded94133f488e1c16b94a49795727584667871781b19f01b25a5d9548a9c22e2943c5150b7566c3b5a4b0594f4026de54b3c0ffb2afdd7a6d02f048ab6d1edab57c3f91b96f1c3790cc25ee4998d2fcd2bd04bd04e0dd996a286ead5a7ef86997c4777c542445af73849e40cff502ed435815f6268471e7865d5952d41f8b9538bef45d4ab2324ba3607ae63e084da6a4d4661e021422e42c7f017036a499f70e4f0c656634c9a6679f8c3ab9d044587f33b1b714fc9679ae7b21ebbadd5889909665f9d94bfd6c58e0a0f47b4235ebc70a2d21727f82e2869f5d11d29ae24e1123648ed7fb6487c2e1217a288f8489116edaa9a32096ef481b45fb56571d4646f7ca70b8f23276b8d6e4689f14888c74ba7f90c690000000000000000000000000000000000000000000000000000000000000000ff2c33513fd0ca34a999eba5b48a5601d1f7061838bdfaf361f6adb0c74ddf4bb0afd49108d388edbd2c35b48875c1459f0d1257b31639dd34db44438f44bf3547e626a825ade25f6c36f006405719232e8ab9d5f0c396f97ac122c65adc3e11e41ff2628b779c222535494f869f32707f160fff9834d320676092e41c901f3c519b2157f3dbc6a56cb3e9673bf61ad23d5e13f83e01242cecb26d990abe3a4d11ae3b765760c0c7f8a65d7ba90b41a0cecf75e62fa3e5cb959b769634aea43ab2bd2c6d9612a1b572cb609381638878409abfe67e58186be0cc7356e8872114471b08d6470400844d57077719eeade0da710959f702e51b4c2c0a5ad6d21a47267f5a92b79f8fcf74b7d042bd88e26e5b2dc4b70b87ee9e31e7ebc9ec0f892c03a264d719e359c23f4a04b2efeb7bba97240847950b321a8c8ef2b0bd452d36055bb58be60c1579265f63c148d6243b009303ebec0d52220eacb11b19f5a434616b42558e4b5b35b2a1259aa740aad0aec658c62bee1ef2ddd25f4232ca976bc3a3a884a4e34e8dab622611dfea800cc7e95e4f2350e40258dcb0a0c71ed221635373857fced41a04c7fc0aa80be9775de4125a6609a6eafad9c4fecbda841442ce674cbca23265fca07a91418eb2bd085cc5841d4603bc4a9304afdc9fdd1e73bd3852fca9f1a6f171df13e27977b93481284c30493c97234a971a51f19e1c829ec9cde87afefbe63f1827519e0ac2e04e5ad8cbac58f814cf63af1397c86bed8c57d584d258f85fd2d7bdf48d352c83c2cb4aa0ba6a7e27a16da4175ef6084f9f43c7aebc74775f1bac6dc877a99edb32c9a352c3c0b5dfa8b1eaae53a74e8cac8c250948f7e09155280dccf0b34319ca5602c87cdb923625a106099a8d65059a2d186468a6b37dede04c1c541b8be74e34ace81de3ce22d2f78462936730c7d0e9ed5aaf88a761df851f3336d99f2975d2a2f046774c3cae4d1854c88b3b58a5170a56bb2d0fbb343eaff1933fa48c835818bfbec2dbd947606bfe7a6d5445cdc8c998c9e9fcab6cb01945720325920cc31dabbbc6fe25a8f243957e8c5503e6ca4bdade615346fd98d562b8a24563662867440314a6aab87598e5257f22c5623807073d47ec1c16a0d1c59aca8abc23e2b9f03fd04018d4eb91d1f89c22b0e31c5eff16a8ff1600676ea7ec2d794db749c00391dbb21223a00ba2d2fc24aad72d54991f7c8cadd87cda66f3c2cbf56286252d1b87c1481b5be864fc4502af9782034514b96029f43e2c9f7e4791de35b98bedba2df4889059467e61fccd1cee6cf74ab474f3fe2b46d1367464735cf6a1231f5522c95c198ca8ca441aedc0d78637615f032c91eaaec84ea6f6241fb8ac391a6292b1e0ea85279c560cdbe3706cfca88b92262626972327e95d355300183f0dfd3ff4ab367e932236d73bd219739b2dc5bd16f57359b0483c096ca8d22f0f3d0017aeba274579f121c8351edd623abb76c1a8c7aee7a4f25e38c8abf51dfbcee26f2bdca88f12e67a596a04bc08010408c0101403124f8b6a0810c4a501010100032b568b6a8a3302f6cf2364701760d5da8e95020318c6d1421a1a5bd3405249f8859106be4eb26bf73799b137a5b4285e2e256896d4b204259d0d31666f281dcd346e4b9f73be46f9236d19058a26fc185af6d72e8f404a7f1390f396d32172806ceb1bb40708b8c80004cc08010404d09003043f809be5efb88ca2013bd8e4eb035fd42d5245468fe9afa70d8ba9c1c419a48c4e804010101010b410101010d410101010101008020808d810b80028756e6465706c6f796564017359f6f5fb2e14c463a3ef071405b353bf95c0ff17772de83d3f0b056240925c01",
|
|
19
|
+
"zswapMerkleTreeRoot": "739e04ceb9281e1c1802460e2bf1226b023763fa7fc35495715fea8a05e526db45",
|
|
20
|
+
"transactionResult": {
|
|
21
|
+
"status": "SUCCESS",
|
|
22
|
+
"segments": null
|
|
23
|
+
},
|
|
24
|
+
"unshieldedSpentOutputs": [],
|
|
25
|
+
"unshieldedCreatedOutputs": [],
|
|
26
|
+
"zswapLedgerEvents": [],
|
|
27
|
+
"contractActions": [
|
|
28
|
+
{
|
|
29
|
+
"address": "3f9b35fec2b6f7a069ee41999217ef90fda0ecbcb05d054549242650cbce1a63"
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
"expectedTokenMints": []
|
|
34
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "counter-increment",
|
|
3
|
+
"purpose": "call",
|
|
4
|
+
"block": {
|
|
5
|
+
"hash": "663f17a0b33794252f8d3158680f222f98cd109765ad6dc773c91fdcac009080",
|
|
6
|
+
"height": 239,
|
|
7
|
+
"protocolVersion": 2000000,
|
|
8
|
+
"timestamp": 1787514696001,
|
|
9
|
+
"parent": {
|
|
10
|
+
"hash": "55f3aa8acdd7f16f2d07224854e1e2e433e04bdd318a4d817d9142ab13fc9fc6"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"transaction": {
|
|
14
|
+
"__typename": "RegularTransaction",
|
|
15
|
+
"id": 33,
|
|
16
|
+
"hash": "3c5cf6006b85bbd6fb88c9f900abb25a9e409d642f01cdcb5dac93dafd56c3af",
|
|
17
|
+
"protocolVersion": 2000000,
|
|
18
|
+
"raw": "6d69646e696768743a7472616e73616374696f6e5b7631325d287369676e61747572655b76325d2c70726f6f662c706564657273656e2d7363686e6f72725b76315d293a780008010000ad2e0b212199d644b073b2fb4500438b5fa5faca1d5622c3c698cf24d0a023d310c534c7f35ddec4223673a48b9c47065c42e8df66aef9d950769e70e16629c1b77dcf7b7021a804bf3107812d90bbef6111b5fc0e1198fb1cc1fe9997caff1349bd0e0dfbb1b64ac74adcb097af3655acf4a7c7e446d6c1af76111ee099b54f2fc1a037526b94958f80fa64d67ddfa36ddd05321ab5899309e6d8957266b9e40ce337a7aef6b19bb089599e7690d2433865cd4edc303bde2adfc2fab35a06a64256bc342ad5050568ce79bf6836d7c1f8e27f536a335cf176d773f025873cfdddd6dedb865fd1c2cfa22e786c19c2897a12cbdd6129c092f63d3d2d44bcacd57317bfe74ca2eb17865d5b08dd8c8f181d366e08ae26de232ad232a784bb474e42b50362a59d443bdff71913a765aa3497b9c9199929e7ee57dddcb6088d5d794ea6e931bdfa55d4a3eac4b6fe16970d35da69d786ec3c38d61c1ea0fe4eff8f5961391894dd11d13036340e7ab713e3ec3f8ceba620b436c4e11b71ff2ec3f1bfbcc6e4b579f1db2128855678bec41fabaa5f0d6f617ff831b2c167c284966f8256062e374acf45f412fb19bccbaf51389b6e23a08c30e2909e2c699ef3a8c9c519160d06f81113f731814af2a30b2061e491300849e599be9056d63a4fecfa055cc2fa9ab7ac6424ee16f1d2817ef89849a4925a074f880723b2e708908aba9d278f811c36a4b59190c3e09810bf928008b9f114f05a73f0c591011077377f5a38f2a82946defbd986384e808c07ab398e68ab1ff889820909bb1e3b329cf01ecdf20d6b32e4fbde0f6cdb8c54e337348970ba9698a59c02a489ec8fa9aa78912fc4a44398b4dcfe35d8f7523c02fce3c911412def0dc2c57b6678f1b78ab14c2e67cec29654f3ece211655c85f96bb1c0a83517b38d47309320a5359026261dbc602de669a65aa99ce68b4f0f1cc7c440c57efbf524495e164f9131828d843f110ffe0958902d22bdf50f7cb10c2492961d78c29741b1acbf5bf394c1a8e615cfe27371784fb64f98d113d8895ea9516d5b1e3941fea833fd38acf18fe4c315dc10273fa5f41a59d22beaf0f9d5855f878115b71a0243149ccc7caaa3dc221dd3a032351e8ac29645570de23ec4d74aa513dd452225d3a1a8a0afb80c7a078e6f470384d154c664e614c5a89867b6812d867ab104a596bff59614296b128480450c5271112f4b718b36334c6d127f12f1faa61236e575fa61a0287caaef0e980ed67e2ecd922ee3c10f5202c1532d19bfdad325819248d1c1c1ec73e67118307b5286a27e19b5d7c8ea383e8ee03b4d9cdc226229a408d4611751439ca417ae4267e37fc148e79634f17e99bdb9536c1d11105ad03fd5558ad48f8a877ef7b73f1080a68932742666e364e921dbec32e0c3990afed327a44969b32023672ce6c760a547d096efbdffc97cfb00000000000000000000000000000000000000000000000000000000000000002ecf62bd14f06a8cd8fb39507a2a1182b5da7a46ec0cef8f48f869312ab34d58f4750c4d90f1ca7b6c233a75c401150803af2e7f9bdb4a0b980c52ea263770353d5474cb01bb3b81385c2ed1388db6b157ecb31b4476dca52d59df6f422ab65dd06bb9aa83fa38f6da74f8d10836d5d93619cc6618caa251677ca56a62da5a0c12d446ee3d578365a12dc74641847195fc38c46f31528a1ba20f7143e042d7480728bfba2ad3e2e10bd142bc317924cb4e5913be9e1e78e487be8314483ec857b27c0780e1f459a605d1797bf68e3a573a818a71e74050cc70115810672abb5f7615961607d0d11f79054555f5e2c1fbacc3e24bbedf278dbc3ac014355fea22156f00b0f52d4aed6997d7f3324e539f9a2e4f712be954a4f3b14e25920f4973d8cb92ed35773eb547e56a5eb1d2e5d28ac1717e0cb489397d5e2168237c433d366e6deee64de7d74b92f9bb5eed9e30dafed53db2a1f9fdc0efd0a4bd5c2c30e2cc0434211bcbeff8fcc9ced786465787f8b51f0d9d861a11b17ed06fed5c70b7cf7daf0996bb1ede41588685fb443a41ce29175645020eb3cdba0c31dac42b798019fe53bcb1ab39fe4c1f473ca3c3774af506fc0914f977d54e44d352af2fca4bb51c0a7a512404627689376d58a32f7d8d3e860182b1ff54f98c692adb6e1ca3699157f35110b2b3853b92b615b311499c0282d9c6b34b68d4bcc6316a3598bacdd4639e3ace32e6ef0b0f0ca33aae69416925a374132af6b81530fed618a721d3288c79a6cc95c742a4cf23f0f6df4c9282330dd478684e0101f436c716d8fb9c70d035f0cabba7942450f35a69c3c3ebf6818b4d83aa5b3d30f760f312269678fa4e87c3d7db4e13235722074194cc79cbb3631405b269f52be67e3d310d4ff996cbd272c2148a047ce1f15e74e3e1a126c28028b10a5360c0239aca20f13c8e44c54c88285b9c4de08f81e9aaabcc71bc97cab921929b87876d3c3f1ef4be4b7d577bfdf6ae1f4dec2b4fadfa6335576ebd5f4039d1e7f788ee5d9649fcfb28c7dc022b51bf6dc6745a43d6146a26e3cf207b055d8d3dab98aa34f70891db48e53f3e07649a87ad0f764ae117c6cfdca123e63e63ea1bfd757ac4a26c00000000000000000000000000000000000000000000000000000000000000002b8a4ad5b7fdfe13ca465298210c644c917483a31098d1692a002df95958bc62a341c71a8c519680b9775c7c9b2f0665aad1853df909520c23e2268a530b1555dfc169be4ac94b62bc4ce42e8a9bf64fbe4c2348869bf049f0df115a55da816332b81e806bdbba3186f84771158c95f7b517791496a5e4a82815bc1fcfcac9056512058ae3ab2f89f9d1e89d4724db651acfbce873c7985374db32a4a8006c6b717f74db7439c5468ab53518ff6ece9f8b25fa67b28656fdd62f34a6dcb718089cbf8207f2acfbc76866399c4c4ad9e2c9e9337992b3bd64c21859e70681ce62cfc35f13bdad7a46de85d66910a55ec062458d5439bedf17f3c042c1a29aa10046d07356b2e856a9590a8111edbab653c6bfb82202d4c65219ced55f0bb728599518ee9703b425d327bf2b768293e12d703e0b42855d2e634cbc8fece3fcae4fc7486f179fb26221c1fc55d553d77865ee911e06d3136971679bc3763ed9d923dfd54637394bead322656fd4321ef92809c988abc608dd78ae950eb79462e1062a79a8969a7835533729a797a9257ba8cc16b73eb811b900c30bace0f5f8c3721a0ac8066368a8d534a8c0bd65d91451b35abf6eb9f7255d47c3fb491d1b194045a4a6d3c978a52f3c78621f20279232bb5df87cb0c147ca083e796f4c5dea3dd1a8741346fc1f3bb31f879b166310b304e7148db59252ba5879acd66309fc0ef3a2fe4066381b8f2f76743bba5910eb41233044f06d63d2bdc89fd3b6fe7c1c689dd3eb1dcd58d852300cd724521affa710089be503bb3ec55a5b0117b3823ec0f0bb06fa28372b44ea6e2c10fa3638abe6952819a427fb26965bcdcebd6b4f8eb97ea5e6d37fc266715a3c92382766cf9bdfdc9db862258471f17b6d49ca71a1267670ff403f510e33deca1352d23bd66a9e852c61e28c91d08974c69b3a4b833500524f2f222c85afa618d1f2b261dc9d3575649fd45a81d8ab2148034b1d4cda99a666874145c49a6e86c3b608940ab0de7087a43d2699de16fdedc3091bc951dc878b8d350519f19343e486dc4e5886c3a82df625b29b525e3503c18c691cbb86b8986b4d1f6a2f768c40a4d47a8d0cb6062f6e9a577ed64b026ffae15db511c3942add91541b6de24da9eb9141445d2edb600839d58ec15b8b07edbb59e3a0e2c5ed1b687ebd4c3dc9c7ca6fe8b07af7e8b22815981bc1baaceed86b7194645822d8ce873a2fc115d2ac840b4eb9beff131e46fce1b86aeac5444a5dd836e951477a2ddab0b0ea795414635ba771b36aef8730b475af3ad3e7c35151270010d62e2d083606cceac9e069e4ed1b67f57668cfc38af6abcbfaa9d48fa566b7b00ea5adf9e922023d605130980a233c07667e19c8abf69604ec06026024eb0240726a938893b459b7ca96521ff324cba481e040b61d11acb6752a20d0130ccaa22de83a3e8765932d48f0bb28fa319415f29aa2617f29fe9693c56610a7ee515b32ea44e99bcf8194ad597cfe9d4b95a4980bb1ad631912834b7eb7cdf21b040408010400040008080c14032a4f8b6a080c10a1010101000343568b6aa3fd19e501b47776de37d8bfd279026c05bbb9191a9ec7a9a2323375f4dea8b117628e9b70d175c8ccc6f1a6eb0a00b54566c8b5a539a4beffcce520067814da6f0ed4f495a533abc8921ebdd679d245b537e8f4415e97f3d7ae7aaa230decd6080014000418080104041c9003043f807dc540c94ceb704a23875c11273e16bb0b8a87aed84de911f2133568115f254000088e68000c0040010428080104042c0c19000100080d040434080104000c1a0101043c080104400c38400c0c0c0c0c0c0c0c0c0c0c0c0c08020808304408040c000802032c0c0c0c0c0c0c0c0c0c484c38022ca330035601137951045104000450c12e3f9b35fec2b6f7a069ee41999217ef90fda0ecbcb05d054549242650cbce1a6324696e6372656d656e74000173bbd0af145e5b60f1620ff7b3712d29bcfc27cea0bf48caea5084214ac46f952b01812d88c9c0257d8e0bda2b9e04cd86f87cf55be40c45d4ff02c1cc1e9eb9754a91f77626fc63b4a7650784f853e9c997745ab077457fdd6241a90b77fecaeedb3b6c6b9d073aaf780b6430656578ce7d4af739973a8c63ba0e012b094220717157c386827e4778800484487949a2a53da621489e6f60f2eaf95a7cee227ee25fcf6ce11d83c47cb4bb29db4b0c1c2a3f55d4a70a12c16079adeea78168723a2da33c876e062413df6d942d0064584ddda278f386adf4777320e02f4f7c9123a6afb58281787642a66ac6f7a698c210a307f22b4f159cfddd67e042af25c4806cfd298291a4741b7e0ed9f17330389be2732fa7697edcf73c51797e0e68ef5c2f050162426a1db3a44d6acc06f6c382866c53c39f122b8aea6b012ef9f11479558311904b3cb89bbcac88fd8139d3f3d07b9a235ff4fe7117204c22e45cb3958b1d49c6c2a76b39cb2a7e5dd5a19e4629ca508f3ccde6b0ee8cde14044cf41b7487cd09423485e4d8e385b5d2ad82abe7e97a6257db7b9dc88a9ad3b04f5280f1c6a68e91e1ec2da90f6e8b5e751d30b3b0c960b92f5fcd6d864e35436b737ffe283172e25a6b096fafb75ab42247e916a5e18b71602f25453603159f78998965e7c2cbb7d0af5038cd68a6327f27e7225df874a9d20b85f6c9d6597393945ee9523e89fee9aedb5fb39253e67f565830c935b424f5f764a863f4dc0a7a55cb6016a1a29778f87201d0c99b8e2e51e3d34ecf8c785021e8d521a42aa17400c25dbfcfe4e79e89308b456adf8716ab430e029c6388e5ce7bcd04077fa8df04e682a267b615da23af3b0feed8831723d7e53e32a9001bf771566303d1aa664b3d599edb29a1671bdc40ac376d40921be0ad92639796fd8de60791ee3c00161723608425d5371e1ecc24a55fedf5902a4dddabd758acbb97bf24ac9c5508076a741b0706a1c32c84604a03dc3dd8d8e87fff2501aa90b0b7472dada1b335213841f6ad38147d0e4549b9dbdd33551e00bedde9ab96927137bb580397c0d289018a266d802352c01ce90a8964f1b5986e8c26259ca2e42527d0c7a0c101655a672d3eb1d1acb4646e948817de0d436666f5465da2f50c80e403a7f7e088ddc0cb1f93463ad7835afa3351902b1b34c0a57491a81c88b4d15a9ccfc4d0ad83aba653a4ec45befa1dae1d9f58137258531631203f4ab840c26784914589f8cc7d460c2bcb038477d972d0f6446ad7a858f3c76d211148e3d5c82196de5f5007794718953bd26a27fa811b2febbd7913c80c83c91e80ae92f3ae113ecce9b9aa16883d22ac82ebb8647bf9ef676e2084892e78787bd6496648d1466627ee295ee60cc010381a00000000000000000000000000000000000000000000000000000000000000008ea2ba318b3397f4f2f0992eb2e8b8d83176d383a402e4836b5ff7e7a27cbb0b6e2b12ec2e1454d7a697ad1ac577f71eba0e8fff5fbb888b1ac5609e2a29db32e86c65d6e3c6578f5a41260231f7e23f96d9bfc7b3464ab9a4e33a3312692e27646536d1d782d8ccc5d1e8b59153e11420f5fa1d2522e05a915e122f7f3439706dfa85c8b47cd6030b5103cef1609102b8ccb28e9562eb3a4959f375c0dfb93781d118259cb8e9687c0f8ea00f0dd45a983ab0a6ef7168cfb40fcc544412816835b9e9b156ebbb5e8ae3e81151b9dbfa0ffd67cdcf2a2b9463756bc4448ef65fab6c495aebf26466648943aa2c94bfacdb28f15bc74224adeb018c1a2ba0c13a1876c565019772f56db208208aef54a1be8a434fdf9e50b3f4f52831b734fa35840be0538e8ba49e0419aa95ea9bee3c09309989b3bccd5bda1f02262f3f9f58ad53d57cd0a7bd9a2a911cd44f0e5d99ed9ad89f83a6017704f13eef8ae89114adbdc250bfcbd9fc0706bc9950ad0e76c85888e419e11fe8d5289f14f0425e6ca6233c5f70e32140c32225bf0139eef7fb69321f0f876c787125e6ed58d00808b30de7ddae7a6857de090ce8e839f8e8f7cd4a11286f4cc87ddb18d9dcca650f86bc4a2e254928e9dcbfb2cf319b275290a3c2de40fa38bc2f13242be5d4b74d35ae6da228bb0439cd29a824eb05acc9dd1ab6cb87974ec320d0dda7c686b96300000000000000000000000000000000000000000000000000000000000000007020f824ef7e714ee4337e1f9a2c8d2c6a6989baf751c6755ab5cb2e361369631e7c70142062028bffaa0eb8d72ac7c44fd8dce91faa803b5602f61f0873dc031809ded837a6868e2a110cd2dae25e730645f52b480d9145b71113a1404f3c38b182a4ad86583688cdcb028afe54530659e325674f7affaf99f517eb1214e567000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4794b73749a9fd11a8e94f0927ed5e3ac8b1e429cb2d9655f4c18e949f07b3600000000000000000000000000000000000000000000000000000000000000000d88ed781e49063277b1720ab6a7e9ee60f6ae82e687d9601e1ad0a9efed761d0000000000000000000000000000000000000000000000000000000000000000f0ca6c6516df0661eaeacb13c120aa3d7d880957c1c179aaf5318386c7843e13948f17b09d38203ce1a5083571cc78d0f7aaf98987c7ceecf850ae70ea3fb46375a132ca3c6d58bc3162db101bf918889d53a0c6ee0e59c2a21d48cca077f005e0eb07fa910da6bf1cb285f50184ee6c1769d8c94f2b013474da0082fb3e9571f1c0f5bff13b318885a28846020661ac0ab21c731ce6e5f60fc8122636b5543ad158d478295148539044b9bc402ce95260d526f42bfda8fe812fc60612ccfe255dece9fc306b898d5bc9b24b5b0523cdcdef92d89506319371dce63abb99f2610266a8757e7a2e510a70b14d864adb22c615bf63c1caa562ce42df0112770b48256634cc498c66b3f30e962366b312eb165bf28124811b53d307313fa9e9603d7809d69e99e5c5d81cd473dae0a94c28ec08496af2c02f53248b90c33749521c8cb5b48d1bb7f0be30c02ebdeda7725350c7bcd4b7a78b00b4390be179321d2fb704f82f0863a674dc20424c16f4771bc05e87dbfe59e7a9967a60116a28ee2fbb14340b10f5b9871110d9f6b8ffe48235914b8940d994296ebc68d13f273f5dd622d4b8af955fc7d7ddb83b87d18aceea6f3b341df2405ba081a21104d58d19d48eeec2067019dec43beaacb7e9375b0dd847aac9ebea9f9c693c1af05e540f614ee891766b27b78eb3ccbaf641ed1844a73c0fedad367cde85bdff68ba1d09f88ba1dd39965117c079f30a4e1d9c8722a628b0feeb56cd5fb3004d975c3138f874c48d7d8821230dc8ed29f1f0f2fb62894b8ce0e2b6ad20219e0c3c138200658f835179f84324e3652fdf83af5e67952373e696890f46366a334253463e50a4b732a2cb5709811e097e937a6328f278584e897923155ad946645dbc4d5d026d0ab2d2283660dcbfccd9167b10d88d44df866f6be13decb84cf74fef423b423414c78f93d88c0ace7438f27e54859ba5ebf5ef6069a2568903587d5c15ec47c1f044ab54678018a732c72d317dcef8bd9707ee5379df122eb36f85ba8cde1c93cc9d84cd79bbbb8e52cb1456fe1685350c7c70311c190666bc27c27c95155aa8b80501b46ad046a172394777dfc11804e2a080d44cece02638b8c58820956f92f0c52fe180752da2ed603ef2bb747b53a4ce2d29816ccb2461e777d661b0dc7384eac3e39145e4cf470b2384e6cccabbe9fc60933cdcf7c7e0158494316c494b60f2baa25031749320c9f52b3bdb4f4789fb5975fa3000dcf1ed332b46f6f254f1ea4c028af5f39f326e398703c65e62d4583c844ed4a91ad5f8c632cd1cf85d49c5120f89dfc89375b97936e8f13443d9578fb64c34ab499c1ad54f09702ba541ad600c360866f4a08a1061b5613f8120aaa50670bf4c1f4d01965d3e580911a90f8e2698d3eeebf3f108e5b7ad05410c4ec3230d1ab24959e593ad32d92c045404000458080104045ca501010101034a5d8b6a75ac6669808c8f2f71c9fc9439108a62dd7b2ff85a20ad747cfd41159327d00e0bdb86fedb3cc783de3a9636a23a8ec689af3430087252f84d9a351e17149e0d73b85e8026b1331fa0a85ce40ee74a140a0f5a14e2ca1402f3f148dbc2b2e7580708246000046408010404689003043f802f865f00aeb19334a6461a902b2c4024be03f69001b2c5b2d885a9c97bc65460400c0c0c0c200c0c0c0c0c0c0c0c6c0c0c08020808700cb80028756e6465706c6f7965640173550da95348eddd4be6abfb5f601134cc41ab763df1117da4297aff25ef4a6707",
|
|
19
|
+
"zswapMerkleTreeRoot": "739e04ceb9281e1c1802460e2bf1226b023763fa7fc35495715fea8a05e526db45",
|
|
20
|
+
"transactionResult": {
|
|
21
|
+
"status": "SUCCESS",
|
|
22
|
+
"segments": null
|
|
23
|
+
},
|
|
24
|
+
"unshieldedSpentOutputs": [],
|
|
25
|
+
"unshieldedCreatedOutputs": [],
|
|
26
|
+
"zswapLedgerEvents": [],
|
|
27
|
+
"contractActions": [
|
|
28
|
+
{
|
|
29
|
+
"address": "3f9b35fec2b6f7a069ee41999217ef90fda0ecbcb05d054549242650cbce1a63"
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
"expectedTokenMints": []
|
|
34
|
+
}
|