From 919315ef690286a21070bb87c19573f4538773e3 Mon Sep 17 00:00:00 2001 From: tequ Date: Fri, 3 Jul 2026 14:50:05 +0900 Subject: [PATCH] Fix length validation error on HookName deletion (#71) --- packages/xahau/HISTORY.md | 3 ++ .../xahau/src/models/transactions/setHook.ts | 6 ++- .../integration/transactions/setHook.test.ts | 45 +++++++++++++++++++ packages/xahau/test/models/setHook.test.ts | 14 +++++- 4 files changed, 66 insertions(+), 2 deletions(-) diff --git a/packages/xahau/HISTORY.md b/packages/xahau/HISTORY.md index fe0f9c30..8c4ae11b 100644 --- a/packages/xahau/HISTORY.md +++ b/packages/xahau/HISTORY.md @@ -2,6 +2,9 @@ ## Unreleased Changes +### Fixed +* Fix HookName validation on HookName deletion + ## 4.1.0 (2026-06-23) ### Added diff --git a/packages/xahau/src/models/transactions/setHook.ts b/packages/xahau/src/models/transactions/setHook.ts index b82078de..00da5ef3 100644 --- a/packages/xahau/src/models/transactions/setHook.ts +++ b/packages/xahau/src/models/transactions/setHook.ts @@ -79,7 +79,11 @@ export function validateSetHook(tx: Record): void { `SetHook: HookNamespace in Hook must be a 256-bit (32-byte) hexadecimal value`, ) } - if (HookName !== undefined && !HOOKNAME_REGEX.test(HookName)) { + if ( + HookName !== undefined && + HookName.length !== 0 && + !HOOKNAME_REGEX.test(HookName) + ) { throw new ValidationError( `SetHook: HookName in Hook must be a hex string of 8-32 hex characters`, ) diff --git a/packages/xahau/test/integration/transactions/setHook.test.ts b/packages/xahau/test/integration/transactions/setHook.test.ts index 08223037..90de3da5 100644 --- a/packages/xahau/test/integration/transactions/setHook.test.ts +++ b/packages/xahau/test/integration/transactions/setHook.test.ts @@ -135,4 +135,49 @@ describe('SetHook', function () { }, TIMEOUT, ) + + it('hook name update', async () => { + let setHookTx: SetHook = { + TransactionType: 'SetHook', + Account: wallet.classicAddress, + Hooks: [ + { + Hook: { + CreateCode: acceptHook, + HookApiVersion: 0, + HookName: '484F4F4B', + HookOn: '00'.repeat(32), + HookNamespace: '00'.repeat(32), + }, + }, + ], + } + await testTransaction(testContext.client, setHookTx, wallet) + { + const ledgerEntryResponse = await testContext.client.request({ + command: 'ledger_entry', + hook: { account: wallet.classicAddress }, + }) + const node = ledgerEntryResponse.result.node as Hook + const hook = node.Hooks[0].Hook + expect(hook.HookName).toEqual('484F4F4B') + } + + // delete HookName + setHookTx = { + TransactionType: 'SetHook', + Account: wallet.classicAddress, + Hooks: [{ Hook: { HookName: '' } }], + } + await testTransaction(testContext.client, setHookTx, wallet) + { + const ledgerEntryResponse = await testContext.client.request({ + command: 'ledger_entry', + hook: { account: wallet.classicAddress }, + }) + const node = ledgerEntryResponse.result.node as Hook + const hook = node.Hooks[0].Hook + expect(hook.HookName).toBeUndefined() + } + }) }) diff --git a/packages/xahau/test/models/setHook.test.ts b/packages/xahau/test/models/setHook.test.ts index f40d7cd5..6ecabae9 100644 --- a/packages/xahau/test/models/setHook.test.ts +++ b/packages/xahau/test/models/setHook.test.ts @@ -175,7 +175,7 @@ describe('SetHook', function () { assert.throws(() => validate(setHookTx), ValidationError, errorMessage) }) - it.each(['', '0'.repeat(7), '0'.repeat(33), 'ZZZZZZZZ'])( + it.each(['00', '0000', '000000', '0'.repeat(7), '0'.repeat(33), 'ZZZZZZZZ'])( `throws w/ invalid HookName in Hooks: %s`, function (value: string) { setHookTx.Hooks = [ @@ -195,4 +195,16 @@ describe('SetHook', function () { assert.throws(() => validate(setHookTx), ValidationError, errorMessage) }, ) + + it(`valid HookName "" (deletion) in Hooks`, function () { + setHookTx.Hooks = [ + { + Hook: { + HookName: '', + }, + }, + ] + assert.doesNotThrow(() => validateSetHook(setHookTx)) + assert.doesNotThrow(() => validate(setHookTx)) + }) })