Skip to content

Commit 7668000

Browse files
committed
fix: ordpool_stamp parent flag now fires for all Stamps-family artifacts
Bug: clicking the "Stamp" filter chip in the frontend returned zero transactions, even though SRC-20 / SRC-721 / SRC-101 traffic was visible under their dedicated chips. Root cause: the analyser only set ordpool_stamp for raw STAMP artifacts, treating SRC-20/721/101 as unrelated families. Stamps is the umbrella protocol; SRC-20 / SRC-721 / SRC-101 are sub-protocols on top of the Stamps encoding (OLGA P2WSH / ARC4 multisig). Same parent-child pattern as ordpool_inscription -> ordpool_brc20. Counterparty stays out: it shares a multisig encoding origin with Stamps but is a separate protocol family, with no parent flag relationship.
1 parent 7a97d68 commit 7668000

3 files changed

Lines changed: 27 additions & 7 deletions

src/digital-artifact-analyser.service.analyse.spec.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ describe('DigitalArtifactAnalyserService.analyse', () => {
217217
} as ParsedSrc20;
218218
const { flags } = await DigitalArtifactAnalyserService.analyse(src20Artifact);
219219
expect(flags).toBe(
220+
OrdpoolTransactionFlags.ordpool_stamp |
220221
OrdpoolTransactionFlags.ordpool_src20 |
221222
OrdpoolTransactionFlags.ordpool_src20_deploy
222223
);
@@ -229,6 +230,7 @@ describe('DigitalArtifactAnalyserService.analyse', () => {
229230
} as ParsedSrc20;
230231
const { flags } = await DigitalArtifactAnalyserService.analyse(src20Artifact);
231232
expect(flags).toBe(
233+
OrdpoolTransactionFlags.ordpool_stamp |
232234
OrdpoolTransactionFlags.ordpool_src20 |
233235
OrdpoolTransactionFlags.ordpool_src20_mint
234236
);
@@ -241,21 +243,25 @@ describe('DigitalArtifactAnalyserService.analyse', () => {
241243
} as ParsedSrc20;
242244
const { flags } = await DigitalArtifactAnalyserService.analyse(src20Artifact);
243245
expect(flags).toBe(
246+
OrdpoolTransactionFlags.ordpool_stamp |
244247
OrdpoolTransactionFlags.ordpool_src20 |
245248
OrdpoolTransactionFlags.ordpool_src20_transfer
246249
);
247250
});
248251

249-
it('should ignore unsupported SRC-20 JSON content (`p` must always be `src-20`)', async () => {
252+
it('should mark Src20 artifact with unsupported `p` as a stamp but skip src20 sub-ops', async () => {
253+
// The artifact type ALONE means a stamps-encoded tx -- ordpool_stamp is the
254+
// parent flag and fires unconditionally. Without `p: src-20`, the SRC-20
255+
// sub-flags don't fire (same pattern as inscription -> brc20 stacking).
250256
const src20Artifact = {
251257
type: DigitalArtifactType.Src20,
252258
getContent: () => JSON.stringify({ p: 'unsupported', op: 'transfer' }),
253259
} as ParsedSrc20;
254260
const { flags } = await DigitalArtifactAnalyserService.analyse(src20Artifact);
255-
expect(flags).toBe(0n);
261+
expect(flags).toBe(OrdpoolTransactionFlags.ordpool_stamp);
256262
});
257263

258-
// -- Invalid SRC-20: operation flags are skipped, only top-level src20 flag is set --
264+
// -- Invalid SRC-20: operation flags are skipped, only top-level src20+stamp flags are set --
259265

260266
it('should skip deploy flag for SRC-20 with missing ticker', async () => {
261267
const src20Artifact = {
@@ -264,6 +270,7 @@ describe('DigitalArtifactAnalyserService.analyse', () => {
264270
} as ParsedSrc20;
265271
const { flags } = await DigitalArtifactAnalyserService.analyse(src20Artifact);
266272
expect(flags).toBe(
273+
OrdpoolTransactionFlags.ordpool_stamp |
267274
OrdpoolTransactionFlags.ordpool_src20
268275
// NO ordpool_src20_deploy -- invalid SRC-20 is silently skipped
269276
);
@@ -276,6 +283,7 @@ describe('DigitalArtifactAnalyserService.analyse', () => {
276283
} as ParsedSrc20;
277284
const { flags } = await DigitalArtifactAnalyserService.analyse(src20Artifact);
278285
expect(flags).toBe(
286+
OrdpoolTransactionFlags.ordpool_stamp |
279287
OrdpoolTransactionFlags.ordpool_src20
280288
// NO ordpool_src20_deploy -- missing lim
281289
);
@@ -288,6 +296,7 @@ describe('DigitalArtifactAnalyserService.analyse', () => {
288296
} as ParsedSrc20;
289297
const { flags } = await DigitalArtifactAnalyserService.analyse(src20Artifact);
290298
expect(flags).toBe(
299+
OrdpoolTransactionFlags.ordpool_stamp |
291300
OrdpoolTransactionFlags.ordpool_src20
292301
// NO ordpool_src20_mint -- missing amt
293302
);

src/digital-artifact-analyser.service.ordpool-flags-real-data.spec.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,13 @@ describe('_ordpoolFlags with real blockchain data (no mocks)', () => {
136136

137137
const flags = (tx as any)._ordpoolFlags;
138138
expect(typeof flags).toBe('number');
139-
// Exact value: just ordpool_src20 (2^53). This tx is picked up by
140-
// Src20ParserService (not StampParserService), so the stamp bit isn't set.
141-
// 2^53 is the highest exact Number; the bigint round-trip is safe here.
142-
expect(BigInt(flags)).toBe(OrdpoolTransactionFlags.ordpool_src20);
139+
// SRC-20 is part of the Stamps family -- ordpool_stamp is the parent flag
140+
// and fires unconditionally on any Src20 artifact (same pattern as
141+
// ordpool_inscription parent for ordpool_brc20).
142+
expect(BigInt(flags)).toBe(
143+
OrdpoolTransactionFlags.ordpool_stamp |
144+
OrdpoolTransactionFlags.ordpool_src20
145+
);
143146
});
144147

145148
// Full block integration: analyseTransactions sets _ordpoolFlags on every tx

src/digital-artifact-analyser.service.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,10 +457,14 @@ export class DigitalArtifactAnalyserService {
457457
break;
458458

459459
case DigitalArtifactType.Src721:
460+
// SRC-721 is a Stamps-family protocol -- always set ordpool_stamp as parent
461+
// (same pattern as ordpool_inscription parent for ordpool_brc20).
462+
flags |= OrdpoolTransactionFlags.ordpool_stamp;
460463
flags |= OrdpoolTransactionFlags.ordpool_src721;
461464
break;
462465

463466
case DigitalArtifactType.Src101:
467+
flags |= OrdpoolTransactionFlags.ordpool_stamp;
464468
flags |= OrdpoolTransactionFlags.ordpool_src101;
465469
break;
466470

@@ -551,6 +555,10 @@ export class DigitalArtifactAnalyserService {
551555
case DigitalArtifactType.Src20:
552556
const src20 = artifact as ParsedSrc20;
553557

558+
// SRC-20 is a Stamps-family protocol -- always set ordpool_stamp as parent
559+
// (same pattern as ordpool_inscription parent for ordpool_brc20).
560+
flags |= OrdpoolTransactionFlags.ordpool_stamp;
561+
554562
src20Content = parseSrc20Content(src20.getContent()) ?? undefined;
555563
if (src20Content) {
556564

0 commit comments

Comments
 (0)