diff --git a/src/TxHookParser.php b/src/TxHookParser.php index 4b5a725..4520c52 100644 --- a/src/TxHookParser.php +++ b/src/TxHookParser.php @@ -89,7 +89,8 @@ private function extractHooksFromMeta(): void case 'Hook': $parsed = $this->hookChangesFromModifiedHookNode( (isset($AffectedNode->ModifiedNode->PreviousFields) && $AffectedNode->ModifiedNode->PreviousFields)?$AffectedNode->ModifiedNode->PreviousFields->Hooks:null, - (isset($AffectedNode->ModifiedNode->FinalFields) && $AffectedNode->ModifiedNode->FinalFields)?$AffectedNode->ModifiedNode->FinalFields->Hooks:null + (isset($AffectedNode->ModifiedNode->FinalFields) && $AffectedNode->ModifiedNode->FinalFields)?$AffectedNode->ModifiedNode->FinalFields->Hooks:null, + isset($AffectedNode->ModifiedNode->PreviousFields) ); if(count($parsed['added'])) { foreach($parsed['added'] as $h => $hv) { @@ -192,8 +193,12 @@ private function normalizeHookNode(\stdClass $node): array return $n; } - private function hookChangesFromModifiedHookNode(?array $prev, ?array $final): array + private function hookChangesFromModifiedHookNode(?array $prev, ?array $final, bool $prevFieldsSet): array { + //flag to indicate modification of hook (prev does not exist in modified node) + //ledger does not include previous fields when there is no changes + $is_modify = !$prevFieldsSet; + $prev = $prev === null?[]:$prev; $final = $final === null?[]:$final; @@ -218,12 +223,14 @@ private function hookChangesFromModifiedHookNode(?array $prev, ?array $final): a $tracker[$h]['state']++; } } - foreach($tracker as $h => $data) { $state = $data['state']; if($state === 0) { //hook added - $r['added'][$h] = true; + if($is_modify) + $r['modified'][$h] = true; + else + $r['added'][$h] = true; } else if($state === 1) { //hook removed $r['removed'][$h] = true; diff --git a/tests/Tx05Test.php b/tests/Tx05Test.php index 5e4a1cc..d8f6885 100644 --- a/tests/Tx05Test.php +++ b/tests/Tx05Test.php @@ -31,7 +31,9 @@ public function testSetHookUpdate() # List of modified hooks $modifiedHooks = $TxHookParser->modifiedHooks(); $this->assertIsArray($modifiedHooks); - $this->assertEquals([], $modifiedHooks); + $this->assertEquals([ + '012FD32EDF56C26C0C8919E432E15A5F242CC1B31AF814D464891C560465613B', //modified but unchanged + ], $modifiedHooks); # List of all accounts $accounts = $TxHookParser->accounts(); diff --git a/tests/Tx13Test.php b/tests/Tx13Test.php new file mode 100644 index 0000000..071e057 --- /dev/null +++ b/tests/Tx13Test.php @@ -0,0 +1,35 @@ +result); + + # List of installed hooks + $installedHooks = $TxHookParser->installedHooks(); + $this->assertIsArray($installedHooks); + $this->assertEquals([], $installedHooks); + + # List of modified hooks + $modifiedHooks = $TxHookParser->modifiedHooks(); + $this->assertIsArray($modifiedHooks); + $this->assertEquals([ + '8604F7EB191536337C1BF7F9048404FBAD1108F6C7BEBCCB9A07A6FDEDB0A840', + ], $modifiedHooks); + + + } +} \ No newline at end of file diff --git a/tests/fixtures/tx13.json b/tests/fixtures/tx13.json new file mode 100644 index 0000000..8ce3a6e --- /dev/null +++ b/tests/fixtures/tx13.json @@ -0,0 +1,73 @@ +{ + "result": { + "Account": "rpYftCXmEa1gsG95MYGgCKwQhbCHWTtSXx", + "Fee": "2038520", + "Hooks": [ + { + "Hook": { + "CreateCode": "0061736D0100000001350760037F7F7F017E60037F7F7E017E60027F7F017F60057F7F7F7F7F017E60047F7F7F7F017E60067F7F7F7F7F7F017E60017F017E02B8010C03656E760A6F74786E5F6669656C64000003656E7606616363657074000103656E76025F67000203656E760C73746F5F7375626172726179000003656E760974726163655F6E756D000103656E7608726F6C6C6261636B000103656E76057472616365000303656E760C73746F5F7375626669656C64000003656E760A686F6F6B5F706172616D000403656E760B7574696C5F766572696679000503656E76057374617465000403656E760973746174655F7365740004030201060503010002062B077F0141B08F040B7F004180080B7F0041A50F0B7F004180080B7F0041B08F040B7F0041000B7F0041010B07080104686F6F6B000C0AFF950001FB950001027F230041A0136B220124002001200036029C13200120014190036A4180104189803C10003703880320014100360284032001410036028003200141003602FC02200141003602F802200141003602F402200141003602F0022001290388034200570440419B094134420010011A0B200141003602EC020340419C80808078410410021A024020012802EC0241034E0D00200120014190036A200129038803A720012802EC0210033703E00241D808410B20012903E00210041A20012903E0024200530440419D0B413C421E10051A0B200120012903E002422087A720014190036A6A3602DC02200120012903E00242FFFFFFFF0F833E02D80241850F410720012802DC0220012802D802410110061A200120012802DC0220012802D802418A803810073703E002200120012802DC0220012903E002422087A76A3602DC02200120012903E00242FFFFFFFF0F833E02D802200120012802DC0220012802D802418D801C10073703D002200120012802DC0220012802D802418E801C10073703C80241E408410B20012903D00210041A41CA08410D20012903C80210041A024020012903D002420059044020012903C8024200590D010B41D90B41C100422810051A0B200120012802DC0220012903D002422087A76A3602C402200120012903D00242FFFFFFFF0F833E02C002200120012802DC0220012903C802422087A76A3602BC02200120012903C80242FFFFFFFF0F833E02B802200141003602B402200141003602B002200141003602AC02200120012802B8024110463602B402200141003602A8020340418180A88278413110021A4100210020012802B402047F20012802A8024110490520000B4101710440200120012802BC0220012802A8026A2D000020012802A8022D00F509463602B402200120012802A80241016A3602A8020C010B0B200120012802B8024112463602B002200141003602A4020340418180AC8278413710021A20012802B002047F20012802A4024112490520000B4101710440200120012802BC0220012802A4026A2D000020012802A4022D00E209463602B002200120012802A40241016A3602A4020C010B0B200120012802B8024112463602AC02200141003602A0020340418180B08278413710021A20012802AC02047F20012802A0024112490520000B4101710440200120012802BC0220012802A0026A2D000020012802A0022D00CF09463602AC02200120012802A00241016A3602A0020C010B0B024020012802B4020440200120012802C4023602F802200120012802C002360284030C010B024020012802B0020440200120012802C4023602F402200120012802C002360280030C010B20012802AC020440200120012802C4023602F002200120012802C0023602FC020B0B0B200120012802EC0241016A3602EC020C010B0B0240024020012802F802450D0020012802F402450D0020012802F0020D010B419A0C413A423210051A0B20012802FC02412147044041BA0D4129423710051A0B2001200141F0016A412141F008410510083703E80120012903E801422152044041AE08410320012903E80110041A41F6084125423810051A0B419308410D200141F0016A4121410110061A200141003602E401200141013602E401200141003602E0010340418180C08378412210021A4100210020012802E401047F20012802E0014121480520000B4101710440200120012802E001200141F0016A6A2D000020012802F00220012802E0016A2D0000463602E401200120012802E00141016A3602E0010C010B0B20012802E40145044041860A4125423910051A0B20012802F80220012802840320012802F402200128028003200141F0016A4121100950044041940D4126423C10051A0B200120012802F8022001280284034182800810073703D801200120012802F8022001280284034184800810073703D001200120012802F8022001280284034185803C10073703C80141B208410C20012903D80110041A41BF08410A20012903D00110041A41A108410C20012903C80110041A0240024020012903D0014200530D0020012903D8014200530D0020012903C8014200590D010B41D40C41C00042C60010051A0B200120012802F80220012903D001422087A76A31000320012802F80220012903D001422087A76A31000042188620012802F80220012903D001422087A76A3100014210867C20012802F80220012903D001422087A76A3100024208867C7C3E02C401200120012802F80220012903D801422087A76A31000320012802F80220012903D801422087A76A31000042188620012802F80220012903D801422087A76A3100014210867C20012802F80220012903D801422087A76A3100024208867C7C3E02C001200120012802F80220012903C801422087A76A3602BC01200120012903C80142FFFFFFFF0F833E02B80120014100360288010340419781808078412110021A20012802880141204F45044020012802880120014190016A6A41003A0000200120012802880141016A360288010C010B0B2001418C016A410420014190016A4120100A420451044020013502C401200131008F01200131008C01421886200131008D014210867C200131008E014208867C7C58044041E30D413C42CB0010051A0B0B20012001418C016A3602840120012802840120013502C40142188842FF01833C000020012802840120013502C40142108842FF01833C000120012802840120013502C40142088842FF01833C000220012802840120013502C40142FF01833C00032001418C016A410420014190016A4120100B4204520440419F0E413142CD0010051A0B20014100360280012001410036027C034041A981808078410610021A0240200128027C41054E0D00200120012802BC0120012802B801200128027C10033703704180084112200129037010041A20012903704200530D00200120012802BC012001290370422087A76A36026C2001200129037042FFFFFFFF0F833E02682001200128026C20012802684181802010073703602001290360420053044041E80A413542D00010051A0B2001200128026C2001290360422087A76A36025C2001200129036042FFFFFFFF0F833E02582001280258411447044041D00E413542DA0010051A0B200141A40F2D00003A0057200120012802C0014101463602500240200141D7006A2001280250200128025C2001280258100B2001350250510440200120012802800141016A360280010C010B41AB0A413D200128025C2001280258410110061A0B2001200128027C41016A36027C0C010B0B2001410036021C200141003602180340418180A08678411910021A200128021841184F4504402001280218200141206A6A20012802182D008C0F3A00002001200128021841016A3602180C010B0B20012D00374504402001200128021841016B3602180B200128028001410048044020012001280218220041016A360218200141206A20006A412D3A00000B2001027F200128028001410048044041002001280280016B0C010B2001280280010BAC3703102001428080A0CFC8E0C8E38A7F370308200141013602040340418280A08678411510021A410021002001290310420052047F20012903084200520520000B410171044020012001290310200129030880420A823C00030240024020012D00030D002001280204450D000C010B2001410036020420012D000341306A210020012001280218220241016A360218200141206A20026A20003A00000B20012001290308420A803703080C010B0B2001280218200141206A6A41003A00002001200128021836021C20012802C0014504402001412D3A00350B200141206A200128021C420010011A200141A0136A240042000B0BAD0701004180080BA5076C6F6F6B75705F61727261795F656E74727900626C61636B6C6973745F6B6579006C6F6F6B75705F617272617900707276006C6F6F6B75705F666C616773006C6F6F6B75705F73657100666F726D61745F6C6F6F6B7570006D656D6F5F6C6F6F6B757000646174615F6C6F6F6B75700061646D696E00426C61636B6C6973743A202261646D696E2220706172616D65746572206D697373696E6700426C61636B6C6973743A2050617373696E67206E6F6E2D6D656D6F20696E636F6D696E67207472616E73616374696F6E2E205A007369676E65642F7075626C69636B65792B31007369676E65642F7369676E61747572652B31007369676E65642F7061796C6F61642B3100426C61636B6C6973743A20496E76616C69642061646D696E207075626C6963206B65792E00426C61636B6C6973743A204661696C656420746F2075706461746520737461746520666F722074686520666F6C6C6F77696E67206163636F756E742E00426C61636B6C6973743A20496E76616C696420617272617920656E7472792C20657870656374696E672073664163636F756E742E00426C61636B6C6973743A204D656D6F207472616E73616374696F6E20646964206E6F7420636F6E7461696E20636F727265637420666F726D61742E00426C61636B6C6973743A204D656D6F207472616E73616374696F6E20646964206E6F7420636F6E7461696E20636F7272656374206D656D6F20666F726D61742E00426C61636B6C6973743A204D656D6F207472616E73616374696F6E20646964206E6F7420636F6E7461696E20584C53313420666F726D61742E00426C61636B6C6973743A2056616C69646C79207369676E6564206D656D6F206C61636B65642072657175697265642053544F626A656374206669656C64732E00426C61636B6C6973743A20496E76616C6964207369676E617475726520696E206D656D6F2E00426C61636B6C6973743A204D656D6F207075626C6963206B65792077726F6E67206C656E6774682E00426C61636B6C6973743A2053657175656E6365206E756D62657220776173206C657373207468616E2070726576696F75732073657175656E63652E00426C61636B6C6973743A2053657175656E6365206E756D62657220636F756C64206E6F7420626520757064617465642E00426C61636B6C6973743A20496E76616C69642073664163636F756E742C20657870656374696E67206C656E677468203D2032302E004D656D6F3A2000426C61636B6C6973743A2050726F636573736564202B200001", + "Flags": 1, + "HookApiVersion": 0, + "HookNamespace": "D9E9A7DA1936E01C92E4F567D3F6F718932217F022353BDCE4DDA0E206E67788", + "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFE" + } + } + ], + "NetworkID": 21338, + "Sequence": 755264952, + "SigningPubKey": "02C3C07A51635C4AC5309198DAB0D00A47D232B9E85ADD72D973F7BC7170445172", + "TransactionType": "SetHook", + "TxnSignature": "3045022100FC38A4BB2EFEE70B32287866635963E63287757F9C6D48BB43BF12097A1B1F810220523FAF2D5B0D3507745500C7DF933077C87B151D833C71D2BB339B17557DFE1E", + "ctid": "C088AD470000535A", + "date": 755265431, + "hash": "EC4674246C80D9FCA165B1D1FE4A98FC85ECB300D7B6D4188E25FC5CB01115BA", + "inLedger": 8957255, + "ledger_index": 8957255, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rpYftCXmEa1gsG95MYGgCKwQhbCHWTtSXx", + "Flags": 0, + "Hooks": [ + { + "Hook": { + "Flags": 0, + "HookHash": "8604F7EB191536337C1BF7F9048404FBAD1108F6C7BEBCCB9A07A6FDEDB0A840", + "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFE" + } + } + ], + "OwnerNode": "0" + }, + "LedgerEntryType": "Hook", + "LedgerIndex": "5E1FDCB478FD57348BAC31ED7F3104D475533C87C2A809FB36D22D2567590170" + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rpYftCXmEa1gsG95MYGgCKwQhbCHWTtSXx", + "AccountIndex": "2519", + "Balance": "9993884440", + "Flags": 0, + "OwnerCount": 1, + "Sequence": 755264953 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "D13888EF5BBD3C86BE3CCBFBB4C1A7A19DCF9C19A10671BE2E7516FAD3E9E7B6", + "PreviousFields": { + "Balance": "9995922960", + "Sequence": 755264952 + } + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + }, + "status": "success", + "validated": true + } +} \ No newline at end of file