Skip to content

Commit

Permalink
Fix modified hook registering as installed
Browse files Browse the repository at this point in the history
  • Loading branch information
zgrguric committed Dec 7, 2023
1 parent 55d83fb commit e8f51b9
Show file tree
Hide file tree
Showing 4 changed files with 122 additions and 5 deletions.
15 changes: 11 additions & 4 deletions src/TxHookParser.php
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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;

Expand All @@ -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;
Expand Down
4 changes: 3 additions & 1 deletion tests/Tx05Test.php
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
35 changes: 35 additions & 0 deletions tests/Tx13Test.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php declare(strict_types=1);

namespace XRPLWin\XRPLHookParser\Tests;

use PHPUnit\Framework\TestCase;
use XRPLWin\XRPLHookParser\TxHookParser;

/***
* SetHook
* In this transaction setHook is executed, modified hook but without changes
* This parser should register this as modified hook.
*/
final class Tx13Test extends TestCase
{
public function testSetHookExtractDestroyedHook()
{
$transaction = file_get_contents(__DIR__.'/fixtures/tx13.json');
$transaction = \json_decode($transaction);
$TxHookParser = new TxHookParser($transaction->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);


}
}
73 changes: 73 additions & 0 deletions tests/fixtures/tx13.json
Original file line number Diff line number Diff line change
@@ -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
}
}

0 comments on commit e8f51b9

Please sign in to comment.