From ee60fcf85793f09524cfe12de9cd9ad3e83b357f Mon Sep 17 00:00:00 2001 From: Daniil Polyakov Date: Wed, 3 Jun 2026 23:50:44 +0300 Subject: [PATCH] feat: add bedrock withdraw events validation --- artifacts/program_methods/amm.bin | Bin 532984 -> 532984 bytes .../associated_token_account.bin | Bin 451064 -> 451064 bytes .../authenticated_transfer.bin | Bin 405176 -> 405176 bytes artifacts/program_methods/bridge.bin | Bin 425196 -> 428948 bytes artifacts/program_methods/clock.bin | Bin 403508 -> 403508 bytes artifacts/program_methods/faucet.bin | Bin 421600 -> 421600 bytes artifacts/program_methods/pinata.bin | Bin 393964 -> 393964 bytes artifacts/program_methods/pinata_token.bin | Bin 399900 -> 399900 bytes .../privacy_preserving_circuit.bin | Bin 588080 -> 588076 bytes artifacts/program_methods/token.bin | Bin 483020 -> 483020 bytes artifacts/program_methods/vault.bin | Bin 413556 -> 413556 bytes .../auth_asserting_noop.bin | Bin 384692 -> 384692 bytes .../auth_transfer_proxy.bin | Bin 403572 -> 403572 bytes artifacts/test_program_methods/burner.bin | Bin 386748 -> 386748 bytes .../test_program_methods/chain_caller.bin | Bin 405464 -> 405464 bytes .../test_program_methods/changer_claimer.bin | Bin 389256 -> 389256 bytes artifacts/test_program_methods/claimer.bin | Bin 386096 -> 386096 bytes .../clock_chain_caller.bin | Bin 392608 -> 392608 bytes .../test_program_methods/data_changer.bin | Bin 385244 -> 385244 bytes .../test_program_methods/extra_output.bin | Bin 385656 -> 385656 bytes .../faucet_chain_caller.bin | Bin 399000 -> 399000 bytes .../flash_swap_callback.bin | Bin 394968 -> 394968 bytes .../flash_swap_initiator.bin | Bin 411184 -> 411184 bytes .../malicious_authorization_changer.bin | Bin 392160 -> 392160 bytes .../malicious_caller_program_id.bin | Bin 384216 -> 384216 bytes .../malicious_injector.bin | Bin 403780 -> 403796 bytes .../malicious_launderer.bin | Bin 389568 -> 389568 bytes .../malicious_self_program_id.bin | Bin 384188 -> 384188 bytes artifacts/test_program_methods/minter.bin | Bin 386444 -> 386444 bytes .../test_program_methods/missing_output.bin | Bin 386220 -> 386220 bytes .../modified_transfer.bin | Bin 385688 -> 385688 bytes .../test_program_methods/nonce_changer.bin | Bin 386776 -> 386776 bytes artifacts/test_program_methods/noop.bin | Bin 384236 -> 384236 bytes .../test_program_methods/pda_claimer.bin | Bin 391240 -> 391240 bytes .../test_program_methods/pda_spend_proxy.bin | Bin 399360 -> 399360 bytes .../test_program_methods/pinata_cooldown.bin | Bin 405084 -> 405084 bytes .../private_pda_delegator.bin | Bin 395388 -> 395388 bytes .../program_owner_changer.bin | Bin 386132 -> 386132 bytes .../simple_balance_transfer.bin | Bin 390816 -> 390816 bytes .../time_locked_transfer.bin | Bin 407644 -> 407644 bytes .../test_program_methods/two_pda_claimer.bin | Bin 391956 -> 391956 bytes .../test_program_methods/validity_window.bin | Bin 387536 -> 387536 bytes .../validity_window_chain_caller.bin | Bin 410128 -> 410128 bytes integration_tests/tests/bridge.rs | 3 + lez/sequencer/core/src/block_publisher.rs | 54 ++- lez/sequencer/core/src/block_store.rs | 18 + lez/sequencer/core/src/lib.rs | 317 +++++++++++------- lez/sequencer/core/src/mock.rs | 7 +- lez/storage/src/sequencer/mod.rs | 62 +++- lez/storage/src/sequencer/sequencer_cells.rs | 36 +- 50 files changed, 346 insertions(+), 151 deletions(-) diff --git a/artifacts/program_methods/amm.bin b/artifacts/program_methods/amm.bin index 046f21bbe3aa2e4f6cbfcd35bdec402888f5591a..c83b1021ce7770c4ff06a58db1b5e9c9af0d8bb3 100644 GIT binary patch delta 285 zcmexySmDQEg@zW!7N!>F7M2#)Eo?V_3L9IP8dw-xSQ;1`8Cx0{m|Ge%OuzVuRZYe~ zFDIugSI^K4mkKFkoGP~G{$e}FB#5DNyU$;?XhtCnapUP5f3Z#4?){(bEE6`_LPK_` o$3>6Gc`nc1gcGxMP!yG8q27WVCHSvb690eits&;S4c delta 285 zcmexySmDQEg@zW!7N!>F7M2#)Eo?V_3Y!`mTAEo{S{NCbn;V;%nj0E3OuzVuRZYe~ zFDIugSI^K4mkKFkoGP~G{$e}FB#5DNyU$;?XhtCnapUP5f3Z#4?){(bEE6`_LPK_` o$3>6Gc`nc1gcGxMP!yG8q27WVCHSvb690kz&vJOBUy diff --git a/artifacts/program_methods/associated_token_account.bin b/artifacts/program_methods/associated_token_account.bin index cae6ed4e8c68cb7f2e6555fd91f81b032c6357b1..f77d0914d0cab71bc15c3fd8533a4d2cfe944d4c 100644 GIT binary patch delta 283 zcmexySo+6d>4p}@7N!>F7M3lnd$tQ3TbLSH7+Y8x7#kT|8W@;c8Z%5^xQRtg%0MqC zrz}^`&4p}@7N!>F7M3lnd$tRk8XH=gSy);a8JU|Ko0*y$8Z%5^xQRtg%0MqC zrz}^`&F7M3lnH@St4Eldq8j4dn;jE#&f4GhdJjTxq2lwnbmG0@A& zDa+L}G{dDr${44L?Rh+`=a>XBbZ+omm+8JPtbEhu#aJCNt!*z9W8GdT#^x>o06BX^3IG5A delta 282 zcmdmSS7OIqiG~)&7N!>F7M3lnH@SsPjSVf$EG#XIjLglA%}mV=jTxq2lwnbmG0@A& zDa+L}G{dDr${44L?Rh+`=a>XBbZ+omm+8JPtbEhu#aJCNt!*z9W8GdT#^x>o0CUJhb^rhX diff --git a/artifacts/program_methods/bridge.bin b/artifacts/program_methods/bridge.bin index 9810c6ac4805b30ad94ec5e3cbe1508f623d2cc7..811f79c3590bfaa9c7018d48cd6af1e7885ea06d 100644 GIT binary patch delta 117649 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 G%=~|n#Wl_V diff --git a/artifacts/program_methods/clock.bin b/artifacts/program_methods/clock.bin index 1124913f31af07de45fa3043f26cae199e0f57bc..455040da520a58431efa2e4b5164269011a4ec97 100644 GIT binary patch delta 266 zcmdmTL1N1ViG~)&7N!>F7M3lnD;b51Eldq8j4dn;jE#&f4GhdJji>Rjs!JQ_<>Zv* z>KU40mzOfeDZky0iS-x Z;&j9GIozyMFpX??F7M3lnD;b4MjSVf$EG#XIjLglA%}mV=ji>Rjs!JQ_<>Zv* z>KU40mzOfeDZky0iS-x Z;&j9GIozyMFpX??F7M3ln^SuO(Eldq8j4dn;jE#&f4GhdJr*H6LHN-BgA!V$W zlT((fXK03@ZM%s#>p3P&ecOfoSfd%Sh}ZkGDzOM*m}5Ns?F3e-F7M3ln^SuO3jSVf$EG#XIjLglA%}mV=r*H6LHN-BgA!V$W zlT((fXK03@ZM%s#>p3P&ecOfoSfd%Sh}ZkGDzOM*m}5Ns?F3e-FEiCW;3mRLP8dw-xSQ;1`8Cx0{m|ISDWYv%|(96jw%hfY9 z!zOKrscCC7>p3P&;q6JxtkH~E#Luy?&SDb6Fx+^$zcH)S@+s`Bj53DnHZW@hm! uJ|WW^Ke32RU-gcKd-{0}R(nhfrpt4(PQhkAqX?^c`yWo$?SDAg6a)ahtwWIj delta 271 zcmbQUMPkktiG~)&7N!>FEiCW;3z`}mTAEo{S{NCbn;V;%nj21aWYv%|(96jw%hfY9 z!zOKrscCC7>p3P&;q6JxtkH~E#Luy?&SDb6Fx+^$zcH)S@+s`Bj53DnHZW@hm! uJ|WW^Ke32RU-gcKd-{0}R(nhfrpt4(PQhkAqX?^c`yWo$?SDAg6a)bH>O=hi diff --git a/artifacts/program_methods/privacy_preserving_circuit.bin b/artifacts/program_methods/privacy_preserving_circuit.bin index 66f6d5b60369b846816e74a3f972a944f9a54c54..e1f5726fe7c59e2c4b2e1a2062cc76da95e6fdd3 100644 GIT binary patch delta 8727 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 G>i+;chE1pd delta 8758 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 BPU8Ro diff --git a/artifacts/program_methods/token.bin b/artifacts/program_methods/token.bin index a36fbbc814c8cc8769bd9748e5d1bf949eb11c2c..3448d9d65c8c399a9f8afa2df5cc87f9a032d541 100644 GIT binary patch delta 266 zcmX@JSN6F7M2#)Eo^^H1&u9C4J?c;EDel}j4cfe%q^z}n6YU{8R+HY zl;!FfnqieU6v7ZTp5AE9roMfb8QU@@OhdO9TCznmViCV<#TLVi%{0MmHmT*Qc5IB; iB;WI~r3qtm+Xs8LDcCd^`m&n0pLJl{e%68gzbpWaE<F7M2#)Eo^^H1x<|&EzK+}EsTuJ&5g}W%?+mqn6YU{8R+HY zl;!FfnqieU6v7ZTp5AE9roMfb8QU@@OhdO9TCznmViCV<#TLVi%{0MmHmT*Qc5IB; iB;WI~r3qtm+Xs8LDcCd^`m&n0pLJl{e%68gzbpX5qeIpJ diff --git a/artifacts/program_methods/vault.bin b/artifacts/program_methods/vault.bin index 7628b459495b227110f167181ce03302b183a015..7a34a8b50d33de7c0fea2eef56dbcb3b3368c760 100644 GIT binary patch delta 260 zcmew|Px8w=$%Yoj7N!>F7M3ln0lI?57N!Ok#uk{b` e49ze!Pj571oq|oF7M3ln0lI>w#)g(=7M2!9M&{{b` e49ze!Pj571oq|oFEi6wD2^m|M8dw-xSQ;1`8Cx0{m|Gf8|9FZ;eY)IX7EYX! z2|!6f44vDn4zrwN!Xh4dj3t^8n_>G7vrO6^af0O}6E<1HFDz2aeNVGs)yjB}Ibr(# gGb|jK_D#QWhGhyi0~sH)n73~|%d&mzS=Rpo08+e6*Z=?k delta 268 zcmdn8SA5G}@rD-07N!>FEi6wD37HxjTAEo{S{NCbn;V;%nj0EV|9FZ;eY)IX7EYX! z2|!6f44vDn4zrwN!Xh4dj3t^8n_>G7vrO6^af0O}6E<1HFDz2aeNVGs)yjB}Ibr(# gGb|jK_D#QWhGhyi0~sH)n73~|%d&mzS=Rpo0E;P2L;wH) diff --git a/artifacts/test_program_methods/auth_transfer_proxy.bin b/artifacts/test_program_methods/auth_transfer_proxy.bin index 6afda3a51701b429e5fce0452cca38045088b9c4..1646113b631bf57743b9ae69f6a8469a17039332 100644 GIT binary patch delta 267 zcmexzLE_5=iG~)&7N!>F7M3lnR=h&S7N!Ok#uk; zF7M3lnR=h%{#)g(=7M2!9M&{; zFEi4hIg^evt4J?c;EDel}j4cfe%q@)>rYF8+R+BN%%gHIr z)iX51r9#RWr;6=wPqUn362#EC{meO*XhtCnapUQRXILg}KYfAaBoj8-4S!gqmLIsx r!iZ_)^ov(mGO_6~ywBn~{q0{C-s$tMvN&RDZ2xeTW&4M#tY-uOjV(~U delta 277 zcmdmUR(#J{@rD-07N!>FEi4hIg-wkOEzK+}EsTuJ&5g}W%?*tirYF8+R+BN%%gHIr z)iX51r9#RWr;6=wPqUn362#EC{meO*XhtCnapUQRXILg}KYfAaBoj8-4S!gqmLIsx r!iZ_)^ov(mGO_6~ywBn~{q0{C-s$tMvN&RDZ2xeTW&4M#tY-uO#qLol diff --git a/artifacts/test_program_methods/chain_caller.bin b/artifacts/test_program_methods/chain_caller.bin index 5829189651f8e2096d9d2c1923b60a7f3ab41547..682321a3d9236fa4d82b7cacb4b80df2f2493ef0 100644 GIT binary patch delta 266 zcmca{U*g7niG~)&7N!>F7M3lnIU>Tw7N!Ok#ukF7M3lnIU>TQ#)g(=7M2!9M&{*eH> z*eH> zFEi6Y*2pLESxwc z9Zs@v3S#Ko9(9uC91|9C%QGy|jMxmDcamk&c8hZ?Cz-Ix*8XCVTCRJMg%Q)p>2{Y` iGO_77D9GwE{qH3fe{7No?yMH=(=M}YpLUsbmH+^X;7kSp delta 268 zcmdmRLVUvs@rD-07N!>FEi6Y*2$>oiTAEo{S{NCbn;V;%nj0EVzj%Q~efqx>ESxwc z9Zs@v3S#Ko9(9uC91|9C%QGy|jMxmDcamk&c8hZ?Cz-Ix*8XCVTCRJMg%Q)p>2{Y` iGO_77D9GwE{qH3fe{7No?yMH=(=M}YpLUsbmH+_5l}vH~ diff --git a/artifacts/test_program_methods/clock_chain_caller.bin b/artifacts/test_program_methods/clock_chain_caller.bin index 5cda67171a10efd927e8826e40d31961da6bb898..f4e1fcc8a8a3391f2ae21dcbd6dd0a4d2f3dd49b 100644 GIT binary patch delta 273 zcmZ4RTYSN9@rD-07N!>FEi9&wgp4gr4J?c;EDel}j4cfe%q@+lJHBF3pPu)Kg%hXb z2B4%MhR*G$9FZvzWMb23sLkp!J@*ZZKQ_q=39J_FY;Re%v%O`VB>(_^w@d~A delta 273 zcmZ4RTYSN9@rD-07N!>FEi9&wgiMVMEzK+}EsTuJ&5g}W%?*vGJHBF3pPu)Kg%hXb z2B4%MhR*G$9FZvzWMb23sLkp!J@*ZZKQ_q=39J_FY;Re%v%O`VB>(`p)J$>! diff --git a/artifacts/test_program_methods/data_changer.bin b/artifacts/test_program_methods/data_changer.bin index 898cea248ddb843e9c00d05a8c698568922e9f51..e2b0e4064cfc35f63dd39e989b21012314bd3154 100644 GIT binary patch delta 260 zcmca}Q2fq8@rD-07N!>FEi45`1&u9C4J?c;EDel}j4cfe%q^!k9%V7aF03*A^-&g1 zOu6l>$5_rWVG)0Ff+d;}i+I2(mKbIs46BW&U--r%wfx3e7A%^kzdXm1iA_)7O%~Vb fygyiYr*AvY;)qSf!|N>O?G6`MwmV#4og)AMVUtPv delta 260 zcmca}Q2fq8@rD-07N!>FEi45`1x<|&EzK+}EsTuJ&5g}W%?+nF9%V7aF03*A^-&g1 zOu6l>$5_rWVG)0Ff+d;}i+I2(mKbIs46BW&U--r%wfx3e7A%^kzdXm1iA_)7O%~Vb fygyiYr*AvY;)qSf!|N>O?G6`MwmV#4og)AMnqW$1 diff --git a/artifacts/test_program_methods/extra_output.bin b/artifacts/test_program_methods/extra_output.bin index a74d931d06f228bce87b499cb55665bca98b0f41..0b6cc151bd79a0704455e7d5e293f1721c4b78f5 100644 GIT binary patch delta 271 zcmexyMEu7Q@rD-07N!>FEi9tPg^Vps4J?c;EDel}j4cfe%q@+lE1qXjpYC^@g%hXb z1fZlKhR*G)jil*k!AbSi>#9c0HvHwqW}N^ delta 271 zcmexyMEu7Q@rD-07N!>FEi9tPg-neNEzK+}EsTuJ&5g}W%?*vGE1qXjpYC^@g%hXb z1fZlKhR*G)jil*k!AbSi>#9c0N+7Q4*&oF diff --git a/artifacts/test_program_methods/faucet_chain_caller.bin b/artifacts/test_program_methods/faucet_chain_caller.bin index 8effbf859fec7145b750d99682144be8b75b85ee..ecfad930cf12ce9631ccc9d5c5e4ddb013e138bd 100644 GIT binary patch delta 272 zcmbQSR$|6liG~)&7N!>FEiCQ7gpDms4J?c;EDel}j4cfe%q@)>rWf+Es7*ici-i-X ztdy}{PEJ{_o}n3r{_QfqSkU5Ci~CEJrQ? delta 272 zcmbQSR$|6liG~)&7N!>FEiCQ7giVbNEzK+}EsTuJ&5g}W%?*tirWf+Es7*ici-i-X ztdy}{PEJ{_o}n3r{_QfqSkU5Ci~)$w!(1 diff --git a/artifacts/test_program_methods/flash_swap_callback.bin b/artifacts/test_program_methods/flash_swap_callback.bin index e4aa09dce09f29cb24c3ea8ba40b767725b73a3a..63c471d2fc5da35e21dcc4da70d379b7d4d1db62 100644 GIT binary patch delta 266 zcmcc7D{-S&qM?Pcg{g&k3(MTsg2oo61{TH^mIlT~#+C*K=9bexyk^mmGSJJ(Da+L} zG{Y)yD1;$wJYDf4i~9DcH!RDTFb&-<_?{)25sP^32bLISY^FU_VU=3W`h^9Hrs>~* fF(*pmcHo4sEK{%;Idvhcd3)|RmhHLUShEEHGmT1q delta 266 zcmcc7D{-S&qM?Pcg{g&k3(MTsf~LlXmSz@~7Dh(q=Ei2G=7!Thyk^mmGSJJ(Da+L} zG{Y)yD1;$wJYDf4i~9DcH!RDTFb&-<_?{)25sP^32bLISY^FU_VU=3W`h^9Hrs>~* fF(*pmcHo4sEK{%;Idvhcd3)|RmhHLUShEEHYdT8m diff --git a/artifacts/test_program_methods/flash_swap_initiator.bin b/artifacts/test_program_methods/flash_swap_initiator.bin index f0d031b86761662c1b7b80e537c60e6bba922385..d186d3a814d3c69bd4dcbfced86dea280994501d 100644 GIT binary patch delta 273 zcmdncBe|hRvY~~sg{g(Pg=GtCppKBSg{gssv4y39v5~Q*fq}WD@pMHUR&{9uy_}q~ zTs=cG915nN(P8Bj#E{(nOo#Ox6BhBK`mE86Si}ttS!0;7xuPJBRciT86ILvmrk^rp n&BUfB-howY`oAJpz3H81tp3z_hS delta 273 zcmdncBe|hRvY~~sg{g(Pg=GtCppKBKv7x1zg{6g&k-53CnW?#<@pMHUR&{9uy_}q~ zTs=cG915nN(P8Bj#E{(nOo#Ox6BhBK`mE86Si}ttS!0;7xuPJBRciT86ILvmrk^rp n&BUfB-howY`oAJpz3H81tp3FEi7dZgpDms4J?c;EDel}j4cfe%q@)>ruYA0R-3;50ShNi zSt(<^oSd>;Jwr1L{oA=8vYcZQ#1wz^m?fG~2t(X>y8lC#N!wpOWjV=&O?ICMtJLy) rFIX5cjhz1eB}*nYJr{~uMW@%lVyVL>DHzXc(eD15WxM-p)|mnT*t1Tk delta 274 zcmaFxUHrj!@rD-07N!>FEi7dZgiVbNEzK+}EsTuJ&5g}W%?*tiruYA0R-3;50ShNi zSt(<^oSd>;Jwr1L{oA=8vYcZQ#1wz^m?fG~2t(X>y8lC#N!wpOWjV=&O?ICMtJLy) rFIX5cjhz1eB}*nYJr{~uMW@%lVyVL>DHzXc(eD15WxM-p)|mnT5&KUR diff --git a/artifacts/test_program_methods/malicious_caller_program_id.bin b/artifacts/test_program_methods/malicious_caller_program_id.bin index 8c0d1350c80323c507318a740d0d5670ff99a8e8..ed67ba1d856c796ce142b774aadfa1935467179b 100644 GIT binary patch delta 253 zcmcbyQ~btG@rD-07N!>FEi85i1&u9C4J?c;EDel}j4cfe%q^!+JjkLUWuTXnQmuQ?MD8c$3Avo$n0GcD^&Lrvw1PPeoM# delta 253 zcmcbyQ~btG@rD-07N!>FEi85i1x<|&EzK+}EsTuJ&5g}W%?+ndJjkLUWuTXnQmuQ?MD8c$3Avo$n0GcD^&Lrvw1@@I}D@ diff --git a/artifacts/test_program_methods/malicious_injector.bin b/artifacts/test_program_methods/malicious_injector.bin index 8bcccb4ee2fb9ed6ffd4338d5c09a79bed697cf5..c496f7949fca396b2e013bc5282e16369aad4870 100644 GIT binary patch delta 9397 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 D-jN8F delta 9389 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 diff --git a/artifacts/test_program_methods/malicious_launderer.bin b/artifacts/test_program_methods/malicious_launderer.bin index 70392d9c6868c2cce535859592063ab1ac4cbea4..fdc5e4012b0d43156c933320058cb8dc7a9d5cc7 100644 GIT binary patch delta 268 zcmX@`Sp2|a@rD-07N!>FEi9qegp4gr4J?c;EDel}j4cfe%q@+lC*EUGpWb(kg%hXb z1)!uLhR*G;uCbhB!Xke1CQCFUHpBF;vrO84;x@}kCTy~Exmcx^@4d&uh-u{XbN5*? hvFQnvXLXt0`+&tCo8&_U7V~!1hb-GwAF|FC007j0OdtRN delta 268 zcmX@`Sp2|a@rD-07N!>FEi9qegiMVMEzK+}EsTuJ&5g}W%?*vGC*EUGpWb(kg%hXb z1)!uLhR*G;uCbhB!Xke1CQCFUHpBF;vrO84;x@}kCTy~Exmcx^@4d&uh-u{XbN5*? hvFQnvXLXt0`+&tCo8&_U7V~!1hb-GwAF|FC000d{OpE{k diff --git a/artifacts/test_program_methods/malicious_self_program_id.bin b/artifacts/test_program_methods/malicious_self_program_id.bin index 62b8af74ddbe5b03247303020310d1a474afe0d6..d91f3bb76f81cced642337a6a0ee33cca8301073 100644 GIT binary patch delta 254 zcmdn9Q+&@(@rD-07N!>FEi4KL1&u9C4J?c;EDel}j4cfe%q^!I9%M1ZF03(q_CXd- zOu6k_53-zN!XiH92un00ruepFEHTVN7&aSEzwn7gYI(;=7A$(E&pgGFiA_(yaaPyq Zk*8Vwut`odU^Q?5aGGWNhtsTQ1OPbiMlApU delta 254 zcmdn9Q+&@(@rD-07N!>FEi4KL1x<|&EzK+}EsTuJ&5g}W%?+m;9%M1ZF03(q_CXd- zOu6k_53-zN!XiH92un00ruepFEHTVN7&aSEzwn7gYI(;=7A$(E&pgGFiA_(yaaPyq Zk*8Vwut`odU^Q?5aGGWNhtsTQ1ORWKMwtKr diff --git a/artifacts/test_program_methods/minter.bin b/artifacts/test_program_methods/minter.bin index c4b115abc568c6ece6ca87885676484a681dddf6..a94c2c1c1161c7c3e2a62bd1ad2598c94700edf2 100644 GIT binary patch delta 264 zcmeA;lwF< z9w;e@p>zAoQ!MA0u!x^H%M#6q%`n~5ER(h$KhJU!o34eISfsJ)x_^Wv1Dk1v4_L&e Z$6aBm#U}Ybg4MiTROEU{g3nL?Qb7M18b3^0l371&Zr}v&>;lwF< z9w;e@p>zAoQ!MA0u!x^H%M#6q%`n~5ER(h$KhJU!o34eISfsJ)x_^Wv1Dk1v4_L&e Z$6aBm#U}Ybg4MiTFEiBF_g^Vps4J?c;EDel}j4cfe%q@+lKRnB#KE3873nxy= zeLzV;44vC=oMbu2ghhP&8J1{9Y=+64Vwtpk+c}n#*mO;}$RdqZ*SW(i>B43h)*DYx e3}+Rc?sJ)?4x3$y5v=Cz!dFFEiBF_g-neNEzK+}EsTuJ&5g}W%?*vGKRnB#KE3873nxy= zeLzV;44vC=oMbu2ghhP&8J1{9Y=+64Vwtpk+c}n#*mO;}$RdqZ*SW(i>B43h)*DYx e3}+Rc?sJ)?4x3$y5v=Cz!dFFEiAFe1&u9C4J?c;EDel}j4cfe%q^#HIL@LWWuTXnQ2RLEb7~(POvOv!ZdXI#ZxTNj9A2N&#=TWV>4~R2NtR2N6)h`Vw04A f$ebXF+l2uaS*BpqmUxH7yj}Ma%XZyMtl0tp4+lwx delta 268 zcmbPnRD8x!@rD-07N!>FEiAFe1x<|&EzK+}EsTuJ&5g}W%?+n-IL@LWWuTXnQ2RLEb7~(POvOv!ZdXI#ZxTNj9A2N&#=TWV>4~R2NtR2N6)h`Vw04A f$ebXF+l2uaS*BpqmUxH7yj}Ma%XZyMtl0tpM|4T@ diff --git a/artifacts/test_program_methods/nonce_changer.bin b/artifacts/test_program_methods/nonce_changer.bin index bc479a80d715018607320a7663a2853e589d6836..59563c524a29130df5656518d090a6bd2ad2cebc 100644 GIT binary patch delta 259 zcmca{R{X|U@rD-07N!>FEiAgH1&u9C4J?c;EDel}j4cfe%q^!koMzFGGSJJ(Da+L} zG{Y)yD1;$wJbmK@7WM6~PO~gy!ZdXI!gDOqj9A2ZFR;WgV>Rsyi`4R|mszlAn!fA` fOD3jS(-p3=Ou=TFEiAgH1x<|&EzK+}EsTuJ&5g}W%?+nFoMzFGGSJJ(Da+L} zG{Y)yD1;$wJbmK@7WM6~PO~gy!ZdXI!gDOqj9A2ZFR;WgV>Rsyi`4R|mszlAn!fA` fOD3jS(-p3=Ou=TFEi3^C1&u9C4J?c;EDel}j4cfe%q^!U9%M1ZF03*A^g$L* zOu6k(53-zN!Xkd;2un007IA}PEHTVN7*-ok`^+M>e8))^EPAG&JjIfUMa%StFEi3^C1x<|&EzK+}EsTuJ&5g}W%?+m~9%M1ZF03*A^g$L* zOu6k(53-zN!Xkd;2un007IA}PEHTVN7*-ok`^+M>e8))^EPAG&JjIfUMa%StFEi8BL2pe0N8dw-xSQ;1`8Cx0{m|Ge%O#k?sSxw47FDIug zSI^K4L&bFcyDWx+7{c2N@3Nd@!Xh54KgEK{(V8~BICynW4cmhEevv(6C!0J@w@_y7O^ delta 268 zcmX@{LHxuA@rD-07N!>FEi8BL2%8!kTAEo{S{NCbn;V;%nj0E3O#k?sSxw47FDIug zSI^K4L&bFcyDWx+7{c2N@3Nd@!Xh54KgEK{(V8~BICynW4cmhEevv(6C!0P~qlWB>pF diff --git a/artifacts/test_program_methods/pda_spend_proxy.bin b/artifacts/test_program_methods/pda_spend_proxy.bin index 33e38f00e299a959dd15f5a8a11b025affe5e2f5..2d322e7b32ca475d9c61516ef9aec4b408481c63 100644 GIT binary patch delta 269 zcmZqJAkhFsEsQNpEzDb3j{gxdwlFoYFt)HXFg7x_G%zr?G@dTU&Z<7`FAFCwIVoek zoSd>;Jwr1L&D&%CvYcZQ#1P+V%^J;!&AbJFStf0_Vq!gsMbq@N|5>D$>$9>lVj4Kz kfsHj2n}HwtSw*K`U}LSrCTUpBYSBJ}opt*RcD4)w0H!xYSpWb4 delta 269 zcmZqJAkhFsEsQNpEzDb3j{gxdH8!*~v#_);Jwr1L&D&%CvYcZQ#1P+V%^J;!&AbJFStf0_Vq!gsMbq@N|5>D$>$9>lVj4Kz kfsHj2n}HwtSw*K`U}LSrCTUpBYSBJ}opt*RcD4)w0N%(%#Q*>R diff --git a/artifacts/test_program_methods/pinata_cooldown.bin b/artifacts/test_program_methods/pinata_cooldown.bin index 65879893e3bf75bb1d1613d4645b6bbb3f11c461..ab4c8562e75e3257d2e3efe1db9fa6a64f8e0e0d 100644 GIT binary patch delta 277 zcmca}N8-*MiG~)&7N!>F7M3lnyc~kY7N!Ok#ukNULMl)g&f6K!f!;HFL)5StT(IpC-hL)uHDXvYNM739)Xk5@LHK4FE+VL}&m2 delta 277 zcmca}N8-*MiG~)&7N!>F7M3lnyc~k2#)g(=7M2!9M&{NULMl)g&f6K!f!;HFL)5StT(IpC-hL)uHDXvYNM739)Xk5@LHK4FG@7MAQHP diff --git a/artifacts/test_program_methods/private_pda_delegator.bin b/artifacts/test_program_methods/private_pda_delegator.bin index 7652eaa7459380304e9407ef0d3600971ceb0c68..41d029e9d06f7a3d7a71dd1e380bde945d69a7ca 100644 GIT binary patch delta 259 zcmew}LE_H@iG~)&7N!>FEi3|W1&u9C4J?c;EDel}j4cfe%q^!YzGX4QF03)V`z;G6 zrrh?WZ&}VUVG(cnz!J@fMf}4@mKbIs46BW&7s#f<@Ex&TlN4SoBQ&$m%+M ftvoC5^sw(Nj#v~-4>V^nZ-4NeW&4BgtaAhaQe;S7 delta 259 zcmew}LE_H@iG~)&7N!>FEi3|W1x<|&EzK+}EsTuJ&5g}W%?+n3zGX4QF03)V`z;G6 zrrh?WZ&}VUVG(cnz!J@fMf}4@mKbIs46BW&7s#f<@Ex&TlN4SoBQ&$m%+M ftvoC5^sw(Nj#v~-4>V^nZ-4NeW&4BgtaAhaiqS~P diff --git a/artifacts/test_program_methods/program_owner_changer.bin b/artifacts/test_program_methods/program_owner_changer.bin index 81d9a7e1d20f0d18b74a82700df470cc28e07d2f..6b7358300623e0d041e3dfbc5e4759e439a0b77a 100644 GIT binary patch delta 264 zcmca|Lj1}J@rD-07N!>FEi5li2pL$1>0*+vYcZQ#L&1s<_t?TBQ_fko@AM{J^CEWNhWNv3x2UkEf2WJ!iZ_) c^u$XnnOKBxUt*bpDcs(0nPq#!W!5VK0GSy|J^%m! delta 264 zcmca|Lj1}J@rD-07N!>FEi5li2$>oiTAEo{S{NCbn;V;%nj0EVx4+DyE^VNflT((f zXK02)fs`>$1>0*+vYcZQ#L&1s<_t?TBQ_fko@AM{J^CEWNhWNv3x2UkEf2WJ!iZ_) c^u$XnnOKBxUt*bpDcs(0nPq#!W!5VK0L_+4ssI20 diff --git a/artifacts/test_program_methods/simple_balance_transfer.bin b/artifacts/test_program_methods/simple_balance_transfer.bin index ef9b3006c997fb64c80251836d5959447beb84db..c8b4e2636ddcb78ab783323aead6b6913ecb4f3d 100644 GIT binary patch delta 283 zcmZ4RR(!!*@rD-07N!>FEi75Lg^Vps4J?c;EDel}j4cfe%q@+lAAHK9E^VNflT((f zXK02)fs`>$1>67MW;w?sh@o-&y?ZRtj9A3I9$ztAa^^9e^)ic&K0RZ>>Q7Zrd delta 283 zcmZ4RR(!!*@rD-07N!>FEi75Lg-neNEzK+}EsTuJ&5g}W%?*vGAAHK9E^VNflT((f zXK02)fs`>$1>67MW;w?sh@o-&y?ZRtj9A3I9$ztAa^^9e^)ic&K0RS{~QI`M! diff --git a/artifacts/test_program_methods/time_locked_transfer.bin b/artifacts/test_program_methods/time_locked_transfer.bin index ba50eebd225eb8fd0a89c9c40934f0b6f10944ba..9b84f0183ab77ddd91de16efe59010f320a3d0c2 100644 GIT binary patch delta 264 zcmccfLE_E_iG~)&7N!>F7M3lnd_sc87N!Ok#ukF7M3lnd_sbz#)g(=7M2!9M&{FEi5bV3mIFO8dw-xSQ;1`8Cx0{m|Gf8d&QzIZJ?KvQXB^lg`Y%o5FrMZEI~OAIp>cT7(dWR+Sj_=1HIo8;|p%n6b> Y9Wi~*OO`2^cC|acV%hHaiuJMp0HwJ{!vFvP delta 265 zcmbR8O?=8X@rD-07N!>FEi5bV3z-@lTAEo{S{NCbn;V;%nj0EVd&QzIZJ?KvQXB^lg`Y%o5FrMZEI~OAIp>cT7(dWR+Sj_=1HIo8;|p%n6b> Y9Wi~*OO`2^cC|acV%hHaiuJMp0Nb8OF8}}l diff --git a/artifacts/test_program_methods/validity_window.bin b/artifacts/test_program_methods/validity_window.bin index 85a380412bdc90d6126a63d9081395a10f17d8d8..b689dc847a6b4fab0bb51efc63332caf59207223 100644 GIT binary patch delta 263 zcmca`S^UCf@rD-07N!>FEi5VLgp4gr4J?c;EDel}j4cfe%q@+l7hGdepFZ~-3nxy= z`#?!S44vD5o?|)3ghl+uMV4qrY=+sMXPLD9`el}r*mP~Y#v;v#Y1;I=*I6>L8TK%S cRdjmp4VF4=l8WzG%-c0G^>st^fc4 delta 263 zcmca`S^UCf@rD-07N!>FEi5VLgiMVMEzK+}EsTuJ&5g}W%?*vG7hGdepFZ~-3nxy= z`#?!S44vD5o?|)3ghl+uMV4qrY=+sMXPLD9`el}r*mP~Y#v;v#Y1;I=*I6>L8TK%S cRdjmp4VF4=l8WzG%-c0M+hH8UO$Q diff --git a/artifacts/test_program_methods/validity_window_chain_caller.bin b/artifacts/test_program_methods/validity_window_chain_caller.bin index 99f379c5e650c5731adf287630abee2f49d19f9b..8cfb83885c91deb9abbd71175c39863b96e28772 100644 GIT binary patch delta 257 zcmbQxA~~T&vY~~sg{g(Pg=GutX*oe-3sVCNV+%_IV2mU{8d3&&IXPvy zdWL3LZ9H9Hk~K{j bo1^w=uuj3I;iDz1dHZZl*6p)3*-9k<$8S9V delta 257 zcmbQxA~~T&vY~~sg{g(Pg=GutX*oetV?#?b3rh2mU{8d3&&IXPvy zdWL3LZ9H9Hk~K{j bo1^w=uuj3I;iDz1dHZZl*6p)3*-9k<{KP$M diff --git a/integration_tests/tests/bridge.rs b/integration_tests/tests/bridge.rs index f2c4ffaf..a803252f 100644 --- a/integration_tests/tests/bridge.rs +++ b/integration_tests/tests/bridge.rs @@ -490,6 +490,9 @@ async fn bedrock_deposit_claim_and_withdraw_round_trip_succeeds() -> anyhow::Res observe_result .context("Failed while waiting for finalized withdraw event from zone indexer")?; + // Sleep to observe sequencer log about validated withdraw event + tokio::time::sleep(Duration::from_secs(1)).await; + Ok(()) } diff --git a/lez/sequencer/core/src/block_publisher.rs b/lez/sequencer/core/src/block_publisher.rs index 2cf2dc5b..49b3e0d3 100644 --- a/lez/sequencer/core/src/block_publisher.rs +++ b/lez/sequencer/core/src/block_publisher.rs @@ -3,19 +3,21 @@ use std::{pin::Pin, sync::Arc, time::Duration}; use anyhow::{Context as _, Result}; use common::block::Block; use log::{info, warn}; -use logos_blockchain_core::mantle::{Note, ledger::Outputs, ops::channel::inscribe::Inscription}; +use logos_blockchain_core::mantle::ops::channel::inscribe::Inscription; pub use logos_blockchain_key_management_system_service::keys::{Ed25519Key, ZkKey}; pub use logos_blockchain_zone_sdk::sequencer::SequencerCheckpoint; use logos_blockchain_zone_sdk::{ CommonHttpClient, adapter::NodeHttpClient, - sequencer::{Event, SequencerConfig as ZoneSdkSequencerConfig, SequencerHandle, ZoneSequencer}, - state::{DepositInfo, FinalizedOp, InscriptionInfo}, + sequencer::{ + Event, SequencerConfig as ZoneSdkSequencerConfig, SequencerHandle, WithdrawArg, + ZoneSequencer, + }, + state::{DepositInfo, FinalizedOp, InscriptionInfo, WithdrawInfo}, }; -use num_bigint::BigUint; use tokio::task::JoinHandle; -use crate::{BridgeWithdrawData, config::BedrockConfig}; +use crate::config::BedrockConfig; /// Sink for `Event::Published` checkpoints emitted by the drive task. /// Caller is responsible for persistence (e.g. writing to rocksdb). @@ -30,8 +32,16 @@ pub type FinalizedBlockSink = Box; pub type OnDepositEventSink = Box Pin + Send>> + Send + 'static>; +/// Sink for finalized Bedrock withdraw events. +pub type OnWithdrawEventSink = + Box Pin + Send>> + Send + 'static>; + #[expect(async_fn_in_trait, reason = "We don't care about Send/Sync here")] pub trait BlockPublisherTrait: Clone { + #[expect( + clippy::too_many_arguments, + reason = "Looks better than bundling all those callbacks into a struct" + )] async fn new( config: &BedrockConfig, bedrock_signing_key: Ed25519Key, @@ -40,15 +50,12 @@ pub trait BlockPublisherTrait: Clone { on_checkpoint: CheckpointSink, on_finalized_block: FinalizedBlockSink, on_deposit_event: OnDepositEventSink, + on_withdraw_event: OnWithdrawEventSink, ) -> Result; /// Fire-and-forget publish. Zone-sdk drives the actual submission and /// retries internally; this just hands the payload off. - async fn publish_block( - &self, - block: &Block, - bridge_withdrawals: Vec, - ) -> Result<()>; + async fn publish_block(&self, block: &Block, withdraws: Vec) -> Result<()>; } /// Real block publisher backed by zone-sdk's `ZoneSequencer`. @@ -76,6 +83,7 @@ impl BlockPublisherTrait for ZoneSdkPublisher { on_checkpoint: CheckpointSink, on_finalized_block: FinalizedBlockSink, on_deposit_event: OnDepositEventSink, + on_withdraw_event: OnWithdrawEventSink, ) -> Result { let basic_auth = config.auth.clone().map(Into::into); let node = NodeHttpClient::new(CommonHttpClient::new(basic_auth), config.node_url.clone()); @@ -112,7 +120,9 @@ impl BlockPublisherTrait for ZoneSdkPublisher { FinalizedOp::Deposit(deposit) => { on_deposit_event(deposit).await; } - FinalizedOp::Withdraw(_) => {} + FinalizedOp::Withdraw(withdraw) => { + on_withdraw_event(withdraw).await; + } } } } @@ -132,18 +142,14 @@ impl BlockPublisherTrait for ZoneSdkPublisher { }) } - async fn publish_block( - &self, - block: &Block, - bridge_withdrawals: Vec, - ) -> Result<()> { + async fn publish_block(&self, block: &Block, withdraws: Vec) -> Result<()> { let data = borsh::to_vec(block).context("Failed to serialize block")?; let data_bounded: Inscription = data .try_into() .context("Block data exceeds maximum allowed size")?; let data_byte_size = data_bounded.len(); - if bridge_withdrawals.is_empty() { + if withdraws.is_empty() { self.handle .publish_message(data_bounded) .await @@ -154,20 +160,6 @@ impl BlockPublisherTrait for ZoneSdkPublisher { return Ok(()); } - let withdraws: Vec<_> = bridge_withdrawals - .into_iter() - .map(|withdrawal| { - let recipient_pk = - logos_blockchain_key_management_system_service::keys::ZkPublicKey::from( - BigUint::from_bytes_le(&withdrawal.bedrock_account_pk), - ); - - logos_blockchain_zone_sdk::sequencer::WithdrawArg { - outputs: Outputs::new(Note::new(withdrawal.amount, recipient_pk)), - } - }) - .collect(); - let withdraw_count = withdraws.len(); self.handle .publish_atomic_withdraw(data_bounded, withdraws) diff --git a/lez/sequencer/core/src/block_store.rs b/lez/sequencer/core/src/block_store.rs index 97a23848..473e12f4 100644 --- a/lez/sequencer/core/src/block_store.rs +++ b/lez/sequencer/core/src/block_store.rs @@ -186,6 +186,24 @@ impl SequencerStore { self.dbio .remove_fulfilled_pending_deposit_events_up_to_block(finalized_block_id) } + + pub fn record_unseen_withdraw( + &self, + amount: u64, + bedrock_account_pk: [u8; 32], + ) -> DbResult { + self.dbio + .increment_unseen_withdraw_count(amount, bedrock_account_pk) + } + + pub fn consume_unseen_withdraw( + &self, + amount: u64, + bedrock_account_pk: [u8; 32], + ) -> DbResult { + self.dbio + .consume_unseen_withdraw_count(amount, bedrock_account_pk) + } } pub(crate) fn block_to_transactions_map(block: &Block) -> HashMap { diff --git a/lez/sequencer/core/src/lib.rs b/lez/sequencer/core/src/lib.rs index 35e27a10..e698e088 100644 --- a/lez/sequencer/core/src/lib.rs +++ b/lez/sequencer/core/src/lib.rs @@ -12,11 +12,13 @@ use lee::{AccountId, PublicTransaction, program::Program, public_transaction::Me use lee_core::GENESIS_BLOCK_ID; use log::{error, info, warn}; use logos_blockchain_key_management_system_service::keys::{ED25519_SECRET_KEY_SIZE, Ed25519Key}; +use logos_blockchain_zone_sdk::sequencer::WithdrawArg; use mempool::{MemPool, MemPoolHandle}; #[cfg(feature = "mock")] pub use mock::SequencerCoreWithMockClients; +use num_bigint::BigUint; pub use storage::error::DbError; -use storage::sequencer::sequencer_cells::PendingDepositEventRecord; +use storage::sequencer::{RocksDBIO, sequencer_cells::PendingDepositEventRecord}; use crate::{ block_publisher::{BlockPublisherTrait, ZoneSdkPublisher}, @@ -132,112 +134,18 @@ impl SequencerCore { .expect("Failed to load zone-sdk checkpoint"); let is_fresh_start = initial_checkpoint.is_none(); - let dbio_for_checkpoint = store.dbio(); - let on_checkpoint: block_publisher::CheckpointSink = Box::new(move |cp| { - let bytes = match serde_json::to_vec(&cp) { - Ok(b) => b, - Err(err) => { - error!("Failed to serialize zone-sdk checkpoint: {err:#}"); - return; - } - }; - if let Err(err) = dbio_for_checkpoint.put_zone_sdk_checkpoint_bytes(&bytes) { - error!("Failed to persist zone-sdk checkpoint: {err:#}"); - } - }); - - let dbio_for_finalized = store.dbio(); - let on_finalized_block: block_publisher::FinalizedBlockSink = Box::new(move |block_id| { - // NOTE: Theoretically Zone SDK may report finalization happening multiple times for the - // same block. In practice this is very unlikely to happen. For that to - // happen Sequencer should crash between receiving Finalized and Checkpoint events while - // these events happen very fast (because Checkpoints are generated by Zone SDK - // locally). - - if let Err(err) = dbio_for_finalized.clean_pending_blocks_up_to(block_id) { - error!("Failed to mark pending blocks finalized up to {block_id}: {err:#}"); - } - - match dbio_for_finalized.remove_fulfilled_pending_deposit_events_up_to_block(block_id) { - Ok(0) => {} - Ok(removed) => { - info!( - "Removed {removed} fulfilled pending deposit events up to finalized block {block_id}" - ); - } - Err(err) => { - error!( - "Failed to remove fulfilled pending deposit events up to block {block_id}: {err:#}" - ); - } - } - }); - let (mempool, mempool_handle) = MemPool::new(config.mempool_max_size); - replay_unfulfilled_deposit_events(&store, mempool_handle.clone()); - let mempool_handle_for_deposit = mempool_handle.clone(); - let dbio_for_deposit = store.dbio(); - let on_deposit_event: block_publisher::OnDepositEventSink = Box::new(move |deposit| { - // NOTE: Theoretically Zone SDK may report multiple identical deposits. In practice this - // is very unlikely to happen. For that to happen Sequencer should crash - // between receiving Deposit and Checkpoint events while these events happen - // very fast (because Checkpoints are generated by Zone SDK locally). - - let dbio_for_deposit = Arc::clone(&dbio_for_deposit); - let mempool_handle_for_deposit = mempool_handle_for_deposit.clone(); - Box::pin(async move { - let id_hex = hex::encode(deposit.op_id); - info!("Observed Bedrock Deposit event with id: {id_hex}"); - - let event_record = pending_deposit_event_record(&deposit); - - match dbio_for_deposit.add_pending_deposit_event(event_record.clone()) { - Ok(true) => {} - Ok(false) => { - info!( - "Deposit event {id_hex} already persisted as unfulfilled, skipping duplicate enqueue", - ); - return; - } - Err(err) => { - error!( - "Failed to persist unfulfilled deposit event {id_hex} before enqueue: {err:#}. Deposit will be lost.", - ); - return; - } - } - - let tx = match build_bridge_deposit_tx_from_event(&event_record) { - Ok(tx) => tx, - Err(err) => { - error!( - "Failed to build transaction from Bedrock deposit event {id_hex}: {err:#}. Deposit will be lost.", - ); - return; - } - }; - - if let Err(err) = mempool_handle_for_deposit - .push((TransactionOrigin::Sequencer, tx)) - .await - { - error!( - "Failed to queue sequencer transaction built from finalized Bedrock event: {err:#}. Deposit will be lost." - ); - } - }) - }); - let block_publisher = BP::new( &config.bedrock_config, bedrock_signing_key, config.retry_pending_blocks_timeout, initial_checkpoint, - on_checkpoint, - on_finalized_block, - on_deposit_event, + Self::on_checkpoint(store.dbio()), + Self::on_finalized_block(store.dbio()), + Self::on_deposit_event(store.dbio(), mempool_handle.clone()), + Self::on_withdraw_event(store.dbio()), ) .await .expect("Failed to initialize Block Publisher"); @@ -265,22 +173,164 @@ impl SequencerCore { (sequencer_core, mempool_handle) } + fn on_checkpoint(dbio: Arc) -> block_publisher::CheckpointSink { + Box::new(move |cp| { + let bytes = match serde_json::to_vec(&cp) { + Ok(b) => b, + Err(err) => { + error!("Failed to serialize zone-sdk checkpoint: {err:#}"); + return; + } + }; + if let Err(err) = dbio.put_zone_sdk_checkpoint_bytes(&bytes) { + error!("Failed to persist zone-sdk checkpoint: {err:#}"); + } + }) + } + + fn on_finalized_block(dbio: Arc) -> block_publisher::FinalizedBlockSink { + Box::new(move |block_id| { + // NOTE: Theoretically Zone SDK may report finalization happening multiple times for the + // same block. In practice this is very unlikely to happen. For that to + // happen Sequencer should crash between receiving Finalized and Checkpoint events while + // these events happen very fast (because Checkpoints are generated by Zone SDK + // locally). + + if let Err(err) = dbio.clean_pending_blocks_up_to(block_id) { + error!("Failed to mark pending blocks finalized up to {block_id}: {err:#}"); + } + + match dbio.remove_fulfilled_pending_deposit_events_up_to_block(block_id) { + Ok(0) => {} + Ok(removed) => { + info!( + "Removed {removed} fulfilled pending deposit events up to finalized block {block_id}" + ); + } + Err(err) => { + error!( + "Failed to remove fulfilled pending deposit events up to block {block_id}: {err:#}" + ); + } + } + }) + } + + fn on_deposit_event( + dbio: Arc, + mempool_handle: MemPoolHandle<(TransactionOrigin, LeeTransaction)>, + ) -> block_publisher::OnDepositEventSink { + Box::new(move |deposit| { + // NOTE: Theoretically Zone SDK may report multiple identical deposits. In practice this + // is very unlikely to happen. For that to happen Sequencer should crash + // between receiving Deposit and Checkpoint events while these events happen + // very fast (because Checkpoints are generated by Zone SDK locally). + + let dbio = Arc::clone(&dbio); + let mempool_handle = mempool_handle.clone(); + + Box::pin(async move { + let id_hex = hex::encode(deposit.op_id); + info!("Observed Bedrock Deposit event with id: {id_hex}"); + + let event_record = pending_deposit_event_record(&deposit); + + match dbio.add_pending_deposit_event(event_record.clone()) { + Ok(true) => {} + Ok(false) => { + info!( + "Deposit event {id_hex} already persisted as unfulfilled, skipping duplicate enqueue", + ); + return; + } + Err(err) => { + error!( + "Failed to persist unfulfilled deposit event {id_hex} before enqueue: {err:#}. Deposit will be lost.", + ); + return; + } + } + + let tx = match build_bridge_deposit_tx_from_event(&event_record) { + Ok(tx) => tx, + Err(err) => { + error!( + "Failed to build transaction from Bedrock deposit event {id_hex}: {err:#}. Deposit will be lost.", + ); + return; + } + }; + + if let Err(err) = mempool_handle + .push((TransactionOrigin::Sequencer, tx)) + .await + { + error!( + "Failed to queue sequencer transaction built from finalized Bedrock event: {err:#}. Deposit will be lost." + ); + } + }) + }) + } + + fn on_withdraw_event(dbio: Arc) -> block_publisher::OnWithdrawEventSink { + Box::new(move |withdraw| { + let dbio = Arc::clone(&dbio); + Box::pin(async move { + let hash_encoded = hex::encode(withdraw.tx_hash.as_ref()); + let withdraw_key = match withdraw_event_reconciliation_key(&withdraw.op.outputs) { + Ok(key) => key, + Err(err) => { + error!( + "Failed to build reconciliation key for Bedrock Withdraw event with tx_hash {hash_encoded}: {err:#}" + ); + return; + } + }; + + match dbio.consume_unseen_withdraw_count( + withdraw_key.amount, + withdraw_key.bedrock_account_pk, + ) { + Ok(true) => { + info!("Validated Bedrock Withdraw event with tx_hash: {hash_encoded}"); + } + Ok(false) => warn!( + "Unexpected Bedrock Withdraw event with tx_hash {hash_encoded}: no matching unseen withdraw found" + ), + Err(err) => error!( + "Failed to reconcile Bedrock Withdraw event with tx_hash {hash_encoded}: {err:#}" + ), + } + }) + }) + } + /// Produces a new block from mempool transactions and publishes it via zone-sdk. pub async fn produce_new_block(&mut self) -> Result { let BlockWithMeta { block, deposit_event_ids, - bridge_withdrawals, + withdraws, } = self .build_block_from_mempool() .context("Failed to build block from mempool transactions")?; + for withdraw in &withdraws { + let withdraw_key = withdraw_event_reconciliation_key(&withdraw.outputs) + .context("Failed to derive unseen-withdraw key from withdraw data")?; + + self.store + .record_unseen_withdraw(withdraw_key.amount, withdraw_key.bedrock_account_pk) + .context("Failed to persist unseen withdraw for reconciliation")?; + } + // TODO: Remove msg_id from store.update — it is no longer needed now that // zone-sdk manages L1 settlement state via its own checkpoint. let placeholder_msg_id = [0_u8; 32]; self.block_publisher - .publish_block(&block, bridge_withdrawals) + .publish_block(&block, withdraws) .await .context("Failed to publish block to Bedrock")?; @@ -308,7 +358,7 @@ impl SequencerCore { let mut valid_transactions = Vec::new(); let mut deposit_event_ids = Vec::new(); - let mut bridge_withdrawals = Vec::new(); + let mut withdraws = Vec::new(); let max_block_size = usize::try_from(self.sequencer_config.max_block_size.as_u64()) .expect("`max_block_size` should fit into usize"); @@ -374,7 +424,7 @@ impl SequencerCore { }; if let Some(withdraw_data) = extract_bridge_withdraw_data(&tx) { - bridge_withdrawals.push(withdraw_data); + withdraws.push(withdraw_data); } self.state.apply_state_diff(validated_diff); @@ -437,7 +487,7 @@ impl SequencerCore { Ok(BlockWithMeta { block, deposit_event_ids, - bridge_withdrawals, + withdraws, }) } @@ -497,13 +547,13 @@ impl SequencerCore { struct BlockWithMeta { block: Block, deposit_event_ids: Vec, - bridge_withdrawals: Vec, + withdraws: Vec, } -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub struct BridgeWithdrawData { - pub amount: u64, - pub bedrock_account_pk: [u8; 32], +#[derive(Debug, Clone, Copy)] +struct WithdrawReconciliationKey { + amount: u64, + bedrock_account_pk: [u8; 32], } /// Checks the database for any pending deposit events that have not yet been marked as submitted in @@ -694,7 +744,7 @@ fn extract_bridge_deposit_id(tx: &LeeTransaction) -> Option { } #[must_use] -fn extract_bridge_withdraw_data(tx: &LeeTransaction) -> Option { +fn extract_bridge_withdraw_data(tx: &LeeTransaction) -> Option { let LeeTransaction::Public(tx) = tx else { return None; }; @@ -712,16 +762,55 @@ fn extract_bridge_withdraw_data(tx: &LeeTransaction) -> Option Some(BridgeWithdrawData { - amount, - bedrock_account_pk, - }), + } => { + let recipient_pk = + logos_blockchain_key_management_system_service::keys::ZkPublicKey::from( + BigUint::from_bytes_le(&bedrock_account_pk), + ); + + Some(WithdrawArg { + outputs: logos_blockchain_core::mantle::ledger::Outputs::new( + logos_blockchain_core::mantle::Note::new(amount, recipient_pk), + ), + }) + } bridge_core::Instruction::Deposit { .. } => unreachable!( "Deposit instructions from users should never pass validation, and thus should never be seen here" ), } } +fn withdraw_event_reconciliation_key( + outputs: &logos_blockchain_core::mantle::ledger::Outputs, +) -> Result { + let [note] = outputs.as_ref().as_slice() else { + return Err(anyhow!( + "Unsupported withdraw output count for reconciliation: {}", + outputs.len() + )); + }; + + // `extract_bridge_withdraw_data` maps [u8;32] LE -> BigUint -> ZkPublicKey. + // Reconcile by reversing that direction here. + let mut bedrock_account_pk = BigUint::from(note.pk.into_inner()).to_bytes_le(); + if bedrock_account_pk.len() > 32 { + return Err(anyhow!( + "Withdraw recipient public key is too large: {} bytes", + bedrock_account_pk.len() + )); + } + bedrock_account_pk.resize(32, 0); + + let bedrock_account_pk: [u8; 32] = bedrock_account_pk + .try_into() + .expect("Public key bytes were padded/truncated to 32 bytes"); + + Ok(WithdrawReconciliationKey { + amount: note.value, + bedrock_account_pk, + }) +} + /// Load signing key from file or generate a new one if it doesn't exist. fn load_or_create_signing_key(path: &Path) -> Result { if path.exists() { diff --git a/lez/sequencer/core/src/mock.rs b/lez/sequencer/core/src/mock.rs index 0b0024ac..5f2ab8cf 100644 --- a/lez/sequencer/core/src/mock.rs +++ b/lez/sequencer/core/src/mock.rs @@ -3,12 +3,12 @@ use std::time::Duration; use anyhow::Result; use common::block::Block; use logos_blockchain_key_management_system_service::keys::Ed25519Key; +use logos_blockchain_zone_sdk::sequencer::WithdrawArg; use crate::{ - BridgeWithdrawData, block_publisher::{ BlockPublisherTrait, CheckpointSink, FinalizedBlockSink, OnDepositEventSink, - SequencerCheckpoint, + OnWithdrawEventSink, SequencerCheckpoint, }, config::BedrockConfig, }; @@ -27,6 +27,7 @@ impl BlockPublisherTrait for MockBlockPublisher { _on_checkpoint: CheckpointSink, _on_finalized_block: FinalizedBlockSink, _on_deposit_event: OnDepositEventSink, + _on_withdraw_event: OnWithdrawEventSink, ) -> Result { Ok(Self) } @@ -34,7 +35,7 @@ impl BlockPublisherTrait for MockBlockPublisher { async fn publish_block( &self, _block: &Block, - _bridge_withdrawals: Vec, + _bridge_withdrawals: Vec, ) -> Result<()> { Ok(()) } diff --git a/lez/storage/src/sequencer/mod.rs b/lez/storage/src/sequencer/mod.rs index 851dc4ff..e4f44914 100644 --- a/lez/storage/src/sequencer/mod.rs +++ b/lez/storage/src/sequencer/mod.rs @@ -11,12 +11,16 @@ use rocksdb::{ use crate::{ CF_BLOCK_NAME, CF_META_NAME, DB_META_FIRST_BLOCK_IN_DB_KEY, DBIO, DbResult, - cells::shared_cells::{BlockCell, FirstBlockCell, FirstBlockSetCell, LastBlockCell}, + cells::{ + SimpleStorableCell, + shared_cells::{BlockCell, FirstBlockCell, FirstBlockSetCell, LastBlockCell}, + }, error::DbError, sequencer::sequencer_cells::{ LEEStateCellOwned, LEEStateCellRef, LastFinalizedBlockIdCell, LatestBlockMetaCellOwned, LatestBlockMetaCellRef, PendingDepositEventRecord, PendingDepositEventsCellOwned, - PendingDepositEventsCellRef, ZoneSdkCheckpointCellOwned, ZoneSdkCheckpointCellRef, + PendingDepositEventsCellRef, UnseenWithdrawCountCell, ZoneSdkCheckpointCellOwned, + ZoneSdkCheckpointCellRef, }, }; @@ -31,6 +35,8 @@ pub const DB_META_ZONE_SDK_CHECKPOINT_KEY: &str = "zone_sdk_checkpoint"; /// Key base for storing queued deposit events that were not yet /// fulfilled on L2. pub const DB_META_PENDING_DEPOSIT_EVENTS_KEY: &str = "pending_deposit_events"; +/// Key base for counting unseen L2 withdraw intents. +pub const DB_META_UNSEEN_WITHDRAW_COUNT_KEY: &str = "unseen_withdraw_count"; /// Key base for storing the LEE state. pub const DB_LEE_STATE_KEY: &str = "lee_state"; @@ -312,6 +318,58 @@ impl RocksDBIO { Ok(removed) } + pub fn increment_unseen_withdraw_count( + &self, + amount: u64, + bedrock_account_pk: [u8; 32], + ) -> DbResult { + let key_params = (amount, bedrock_account_pk); + + let current = self + .get_opt::(key_params)? + .map_or(0, |cell| cell.0); + + let next = current.checked_add(1).ok_or_else(|| { + DbError::db_interaction_error("Unseen withdraw counter overflow".to_owned()) + })?; + + self.put(&UnseenWithdrawCountCell(next), key_params)?; + + Ok(next) + } + + pub fn consume_unseen_withdraw_count( + &self, + amount: u64, + bedrock_account_pk: [u8; 32], + ) -> DbResult { + let key_params = (amount, bedrock_account_pk); + + let Some(current) = self + .get_opt::(key_params)? + .map(|cell| cell.0) + else { + return Ok(false); + }; + + if let Some(next) = current.checked_sub(1) { + self.put(&UnseenWithdrawCountCell(next), key_params)?; + } else { + let cf_meta = self.meta_column(); + let db_key = + ::key_constructor(key_params)?; + + self.db.delete_cf(&cf_meta, db_key).map_err(|rerr| { + DbError::rocksdb_cast_message( + rerr, + Some("Failed to delete unseen withdraw count".to_owned()), + ) + })?; + } + + Ok(true) + } + pub fn put_block( &self, block: &Block, diff --git a/lez/storage/src/sequencer/sequencer_cells.rs b/lez/storage/src/sequencer/sequencer_cells.rs index 39b6a406..7d9c4609 100644 --- a/lez/storage/src/sequencer/sequencer_cells.rs +++ b/lez/storage/src/sequencer/sequencer_cells.rs @@ -9,7 +9,7 @@ use crate::{ sequencer::{ CF_LEE_STATE_NAME, DB_LEE_STATE_KEY, DB_META_LAST_FINALIZED_BLOCK_ID, DB_META_LATEST_BLOCK_META_KEY, DB_META_PENDING_DEPOSIT_EVENTS_KEY, - DB_META_ZONE_SDK_CHECKPOINT_KEY, + DB_META_UNSEEN_WITHDRAW_COUNT_KEY, DB_META_ZONE_SDK_CHECKPOINT_KEY, }, }; @@ -174,6 +174,40 @@ impl SimpleWritableCell for PendingDepositEventsCellRef<'_> { }) } } +#[derive(Debug, BorshSerialize, BorshDeserialize)] +pub struct UnseenWithdrawCountCell(pub u64); + +impl SimpleStorableCell for UnseenWithdrawCountCell { + type KeyParams = (u64, [u8; 32]); + + const CELL_NAME: &'static str = DB_META_UNSEEN_WITHDRAW_COUNT_KEY; + const CF_NAME: &'static str = CF_META_NAME; + + fn key_constructor((amount, bedrock_account_pk): Self::KeyParams) -> DbResult> { + borsh::to_vec(&(Self::CELL_NAME, amount, bedrock_account_pk)).map_err(|err| { + DbError::borsh_cast_message( + err, + Some(format!( + "Failed to serialize {:?} key params", + Self::CELL_NAME + )), + ) + }) + } +} + +impl SimpleReadableCell for UnseenWithdrawCountCell {} + +impl SimpleWritableCell for UnseenWithdrawCountCell { + fn value_constructor(&self) -> DbResult> { + borsh::to_vec(&self).map_err(|err| { + DbError::borsh_cast_message( + err, + Some("Failed to serialize unseen withdraw count".to_owned()), + ) + }) + } +} #[cfg(test)] mod uniform_tests {