From 95f1ee8d64caf6d9de16eae79875d37d031a5541 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 6 Jul 2026 16:36:46 +0100 Subject: [PATCH 1/2] fix: preserve ERC-8021 service attribution --- src/builder-code.test.ts | 24 ++++++++++++++++++++++++ src/builder-code.ts | 11 ++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/builder-code.test.ts b/src/builder-code.test.ts index 0797306f..4a31ab76 100644 --- a/src/builder-code.test.ts +++ b/src/builder-code.test.ts @@ -19,6 +19,30 @@ describe("withBuilderCodeServiceCode", () => { expect(info.s).toEqual([BLOCKRUN_SERVICE_CODE]); }); + it("appends the BlockRun code after existing service attribution", () => { + const serviceCodes = ["bc_existing"]; + const ext = withBuilderCodeServiceCode({ + "builder-code": { info: { a: "app", s: serviceCodes } }, + }); + const info = (ext["builder-code"] as BuilderCodeExtension).info; + + expect(info.a).toBe("app"); + expect(info.s).toEqual(["bc_existing", BLOCKRUN_SERVICE_CODE]); + expect(info.s).not.toBe(serviceCodes); + expect(serviceCodes).toEqual(["bc_existing"]); + }); + + it("does not duplicate an existing BlockRun service code", () => { + const ext = withBuilderCodeServiceCode({ + "builder-code": { info: { s: ["bc_existing", BLOCKRUN_SERVICE_CODE] } }, + }); + + expect((ext["builder-code"] as BuilderCodeExtension).info.s).toEqual([ + "bc_existing", + BLOCKRUN_SERVICE_CODE, + ]); + }); + it("preserves unrelated extensions", () => { const ext = withBuilderCodeServiceCode({ "some-ext": { foo: 1 } }); expect(ext["some-ext"]).toEqual({ foo: 1 }); diff --git a/src/builder-code.ts b/src/builder-code.ts index fd5c8ee1..69d2ead7 100644 --- a/src/builder-code.ts +++ b/src/builder-code.ts @@ -27,9 +27,18 @@ export function withBuilderCodeServiceCode( ): Record { const merged: Record = { ...(extensions ?? {}) }; const existing = (merged["builder-code"] as { info?: Record } | undefined) ?? {}; + const existingServiceCodes = + Array.isArray(existing.info?.s) && existing.info.s.every((code) => typeof code === "string") + ? existing.info.s + : []; merged["builder-code"] = { ...existing, - info: { ...(existing.info ?? {}), s: [BLOCKRUN_SERVICE_CODE] }, + info: { + ...(existing.info ?? {}), + s: existingServiceCodes.includes(BLOCKRUN_SERVICE_CODE) + ? [...existingServiceCodes] + : [...existingServiceCodes, BLOCKRUN_SERVICE_CODE], + }, }; return merged; } From 4d18feb7164ac2b614e2d9932791f51ee701491c Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 6 Jul 2026 16:46:17 +0100 Subject: [PATCH 2/2] fix: preserve valid service codes from malformed arrays --- src/builder-code.test.ts | 11 +++++++++++ src/builder-code.ts | 7 +++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/builder-code.test.ts b/src/builder-code.test.ts index 4a31ab76..f565bfe9 100644 --- a/src/builder-code.test.ts +++ b/src/builder-code.test.ts @@ -32,6 +32,17 @@ describe("withBuilderCodeServiceCode", () => { expect(serviceCodes).toEqual(["bc_existing"]); }); + it("preserves valid service codes from a partially malformed array", () => { + const ext = withBuilderCodeServiceCode({ + "builder-code": { info: { s: ["bc_existing", 42, null] } }, + }); + + expect((ext["builder-code"] as BuilderCodeExtension).info.s).toEqual([ + "bc_existing", + BLOCKRUN_SERVICE_CODE, + ]); + }); + it("does not duplicate an existing BlockRun service code", () => { const ext = withBuilderCodeServiceCode({ "builder-code": { info: { s: ["bc_existing", BLOCKRUN_SERVICE_CODE] } }, diff --git a/src/builder-code.ts b/src/builder-code.ts index 69d2ead7..a2153632 100644 --- a/src/builder-code.ts +++ b/src/builder-code.ts @@ -27,10 +27,9 @@ export function withBuilderCodeServiceCode( ): Record { const merged: Record = { ...(extensions ?? {}) }; const existing = (merged["builder-code"] as { info?: Record } | undefined) ?? {}; - const existingServiceCodes = - Array.isArray(existing.info?.s) && existing.info.s.every((code) => typeof code === "string") - ? existing.info.s - : []; + const existingServiceCodes = Array.isArray(existing.info?.s) + ? existing.info.s.filter((code): code is string => typeof code === "string") + : []; merged["builder-code"] = { ...existing, info: {