From eadf8b680cdf49343a1854e4abff77aabe40c642 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 13 Jan 2023 20:08:35 +0100 Subject: [PATCH] address review --- api/eth_aliases.go | 2 +- build/openrpc/full.json.gz | Bin 32986 -> 32992 bytes build/openrpc/gateway.json.gz | Bin 8486 -> 8495 bytes gateway/handler.go | 2 +- itests/eth_account_abstraction_test.go | 200 ++++++++++++++++++++++++- node/rpc.go | 2 +- 6 files changed, 195 insertions(+), 11 deletions(-) diff --git a/api/eth_aliases.go b/api/eth_aliases.go index d6e27aa96..cf69bfff7 100644 --- a/api/eth_aliases.go +++ b/api/eth_aliases.go @@ -2,7 +2,7 @@ package api import apitypes "github.com/filecoin-project/lotus/api/types" -func CrateEthRPCAliases(as apitypes.Aliaser) { +func CreateEthRPCAliases(as apitypes.Aliaser) { // TODO: maybe use reflect to automatically register all the eth aliases as.AliasMethod("eth_accounts", "Filecoin.EthAccounts") as.AliasMethod("eth_blockNumber", "Filecoin.EthBlockNumber") diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index b59fd8860e9f2a75dd2319564534a1d9540a9555..6b4fc7b4f84dbe70c394294d61c1448f80608da6 100644 GIT binary patch delta 30616 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 z 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�k0yz>@6MefRxdF}5+I?jfs37J*?=28%adF*II|jKV@Z1DrME2_0E@9Ehx9+r;Po0 zjM9IWBAA9c3I`fQcz62Gq8a36l1c@_R^VAp++M-}|S%U$#>nO-8ezr=T8pC@Q8q)^{~{|2JP`tC1qj!c)U zNt4XF$O2h^5Gg_Tu;%a9DTVBG?a38!C*KRr$v52^{{dyW1^%2B@hED4!ivyGyJ~@E zw-Mt)$yY5lvG=6;sqvC@CefzF% zW|m^^4!r!k;X{K&qJ#@5$cG5}IK5-cy`b;U<_Gi$({(&h(Oeo{xf}i-2RIqB_?o*O zbxq!MM;>-cM93v9pZrv86_9d>hB%ZoOcy)_Tc-Ee%`7!?t3|2;m|)qbj!~@2j=a2{ zX=fB0!-vq_FjIy<3y;`GI)2~t&Yrr^x0U9$CJ1xcut)D6h;$h^`5t49Kdtxb_7#4m zj%Pa_%f~Ov#LfKjPawpHF`6+!wLrUWtN2?{e|Wov=UO!FT4<|LXa1|o-yJoNEw8bS zFWWDA!Yi4<>UPVA05N&uY+k>a+yW~!;dQ|sxW(9n9eq>2h_F?GJ1+09mTywTP{KJb zZ|LqsUf>11Ucx@(iYGmp=s&m8rh9ygLI*d(ndaAjp|PN1l#Zc1PHMF-xIy|$g3`9n zghcL9lU&+H4EzITk#Wslc2uQOgJpbw?$DIUD=TQb`9I1<;Qw1MR<#2jh^xa2|G;3) z9h)iTi9d$)`%Xfh?#zxC(^0xsg*g1}k=9S2?g&HHf%UOblMbGWIlZ%Sh3%FZt(QTT zwHIW9gDzbPcCLcUCVmS8IvF{?-*~e?EbLOu*!?Dyn_T<+&bNw1@x$Wp imM7L}YDkY?k1y4=hu)svK_JlkyM%`SiDE1)=zjoP!I4J* delta 30487 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 VxRU+z{{a91|Noir><&_r1^_ik0-*o^ diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index daeddd75400eadc583cdfa995306979e58c97a78..cc3870a4977ca6f01accdda37a04d03256828e51 100644 GIT binary patch literal 8495 zcmV+~A<*6*iwFP!00000|LnbcbDKE#IQ~``e*d%`ni{a3*faY_b7`7q+iW&Tx1Z

nzK&&>H|PnWhKz4E0u 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 literal 8486 zcmaLcMN}MsvL;|WxF@)~yEHDr-M!J^PUG4*1b25QH0}-|xVuAecL_T8zB7w=W-+y_ zO)aW6_5EZ&5uyI4KF_;--LmDq13sHbvetI^>#ZK+59he2TUPDo9Yv=bFW$5f zR<%RG@PPXDQQyxvOnjGgc4gV3lL<%Ex!H>i_o?0VQ=gd|VGWY%cVU003R_0kGKj!O zsadE)Mcg6=D-dCrx*q@bQ{{8U%mx zg1$NfN^JBL`Z59tc^>hYJd0;X>_bJUD${3Y_un@~zRC~$$ZX%vIho@~#RK1-qMCT2 zEa|KmXFZpyBkqSSYbY-FJBK~RoqX~PoiWiiJjNwHsC(ZqE&??Qt~x&y4wm_jh@>@W zRs=oS?@3JXrq%yl@C}LcI((wNVzT*12+gKwZ1+0fEY95-l1cvLZln5)T3Zkg*nJq$ zG!AgP>;Zhf-Njc`_Pf?Yedv=^=O4{PAYT{$ZPV40`~_uIlW}PVO+rksv8;1V43E6| zAgrY!yb}VySzW5)5!euL(GHEw$LEtPKvJ782)15U=b{ju02o4jV;HFMsB?7`|5D5l z9Du&W(SS?lBZ4|W0810}c+ca&B|a5HnjP}hL{9`2#+tzz)fB1;~^g_Qp> ziHcDl*W!q%UIo4Wtq9wD#Wog|Dh6GxhL=aj7IV)usgNVA*r4R8uR^U&pmgW@UO1} z?uxQRAMocinWid>3tX6fVkn`DH}r2e=mX|EG;D1CZDQk6_dDj14X16jmFZaORiEzX zTc41)!?L@4z}sExwx*J>h$w}IO8$t&Up;4!JtAw94(P6-J9qYVW24%x!1A~NL7qT# zJiZsdUEtn&RC5PHwRpi+Voi5&nP;xP=Y0t3EozIHM(xZ5bPC^_x@ZJ`mE9>)UxD>~ z=aR|}z8(uU0T_{)$-=3x=iUh81wXMEtx`@y_)rbuB(M^3Q0h4X3Nadq$B6!*`f~pZ zH^=IC1Uy1etTUr&*OV&9ynH0NxhncqGE9VJv=8HeMiI^K)~1zi^Tm*+E$ zVGzpz0TLygGe3Dv@g>%DS8*tPM^YqhSmzLGL4cko{ATf&zNdbHk{rxM0&d@&qI&hU zqd2BcB!am0m}7ie7CEh?)5nsmq+l3&sRN7o3nVh`OlRTNc7=t>3Z(oFz3UkI!38sb z%Op&Xd-$~^EX-c40~i0AvzGXb`XV1k;(g5^X^j z(mg%W8Jsb!8B@?~OHIqw4>U=u)fQ z?yHVpi&4cPk_JZO5ILRNWhjgwXg(7Etgxv*&R5j&ks$@bpSO5Yht>UI-;qw zDzqCir1L$etpgvGy1C2#NB}Q+3<@77gg!jCd+q9{FPtchWtvXRE_*HWI#?pAZZp_} zqs1LhdAv6o?AZ4cjq(eS5+hnuj5u&fS5vjyiu2x*m`SVDlfK5)hZ&kL(H&%^*zvg5 zV7?-k80rbKW_or=WSmzDT-uzLV+Q^#9U?&NfwLH+QWEZ_`0_gH?qYD;(EcVnEfv#B z_w%Uf;~4##JFc}M(dZHN_t=Mcu5SO`;Q-w9_;3GDRjP1xqYI3TwHVlIsAwP^nz_i{5+iD6YR5C`5Xk*GE`L(p%l9h)`q8<2elj}G?=*C zDFq83=PKI!);6XsOVzkLB6ThZ5TkcZn+xdMnfGzOHu06$S-aXO7_|7&s8<|HrXogdW?-<-B#A}ypcQUTTuZQ<#sCeZ%m$svn43{AXzPP#^jl~8GW0$=1 zXITKo+9m;yQYlRC*2dXEpEyZrGfT-A@f{)8yxHYyF9bMkt~hA$qVyazcs>t^J1I{~ zD1>5Dp;NkK$m*hDBiorKHz?Qk;Jb^|RdQ?;y@{*N5r9(kXsK?L3_cIIHgyH0VWZkl zyt1WvT1A|7TL~_k%B~w zNb}nclV&WwibhdrUngXHt-w>J075UgA@~O^ZZTl2oP zukXtpAMKv}OAj|nk#*XG+v=LhDpOsdL?^!x6VO7a!Lcg*;i670J;L@ zit^1{jZKGwj1XbgiN0b=U|@uovRY(QDNJcJB|&5=Ob^sAOsO)fE%+j4Lk(~cgX7Sy zthR5pzZ*;;fFzdL+*T>3vIiq}YlQn@*Q5%=Ct1#kpZGqeCky?X{D_QC zzor;eyUQz4_St(I`o&ZjMXYB8>7y_NhVEug+v&H~eB>>B@NlSp0*n(vB0>n|Ey%So z%}IaJ)BJa|*+eaaCwZ8XhZ~g?y^ez))uNgJKXa4^VCc?V)x>uh2kJ!I@<&6t)LNKl zgXZ{@>YrIc9i4#~a%c7Lh{`GCMX8`0Y~IeqoT{CaLp0<_a-|`Nbvyy0HQvipY5W8` zmCGX4nq^Kt{zrqgP48BfX8|(pyMbDBaT1K>kVG9XG?f8`Jz?rMYtIy){_F|z4W+z| zM2l)ExAXefI)yG9b;5#rQ`N6Tn0jx9c_Es(UfIA{;=L;B&o=ns7)efrlN1M=Bo$en z^Cx+U48-bO*!>)oZ3vC9fjSbEwV>9QWC8`PYd}Ttdw?AI7(-q@0zL~=xK%-vTky$b zH9ju|vSmgtwzLnxsIxdBt8f9e)N(~1sw72FFkR3`j(wgXuQ%jc7`g7OmMAi}ge!g_ zN^0T{MIl38;oG~vZD$Z-RFjyz$ueST2}QZ0yg=kw>4J}WIlP{f&X7iVRH=qGB^Ocg z4kzV+S`SKOPmfgz+qX5&YvjmtC6sr~!F2Q&M$$1a;6rScJ{u&NVla7Pdv3PVNFO-V(Dmm!PCnYKP7c z+HZzWegIeH=8ajqyn{M7_!5CYOhSt9&wr}qV`B1% zfv!k`{{{9ADhA;NT;Ge~IeCnl`vbJEa~5+MFn4U*ZjfT7-oNq8rM3VN2fGj*5&b0t zUB7;#KyWkhbD3~%xDYcW|MF6l_Y4J#YV&X0!xHSj1J_4wh1Z0%93Q>if;8`8)t`7F z%}3e|8|-5(AaywR=WG%l-h-n~<#w9N?8hZX5#{3gyBumTsRrA;Y#;0GY%1p9@qGNcYFtd2u zj4CJq^>62r($l({_DgBl{#R=|lO|9V*ha&vD@xbqa?VQ9!Mi`m1b&M#gQ@!d2@;Q<&!%M&yJR^kDN$ zU(NVS&Z-{t?MmmHq!}wXeo3Z2>2axkiUb9cg%oC+A>l4V71f^u(0YzuM3;#z;pF=81&{Ghe}ooB)88oi7>U;&Sex9mS|lR-JhY_md{ zjv4QjgZoJRTjZ=Ndor4;@4Ig9l!}|)dCJIVQg@BfqmsB|v@+qvIW_$Ew55(@ZS((*uU}7 z+H)r+)F*y;=!y(8L3dZB$jn+Ml`sllb*uW+;nNtei?zWROm^!QOvLsz&=IQoqliZ= zIEf^F%c&H|-`3q*8&RG8xZD3Wd<-eK?Nl^?&?V>ct)T~M{+YnZ6yz;e&pb!JAk}wQ zOgj=ok4khLA|=E@naV)@H1p;YJ7kH+37UObD?1N&%X@%P5 z7h!i{euB5MWW`e;G6BI(b80m-YBlbHkS8lB-Z@>*HRvn0lt{y5VY8IRi<;Z0tX*34 zu=kazN0cP6TLcyMlo`}75TmZ3b&_S@CZ~^f`bLYMB-gs(e-CKY3aJ2!4jt$WHQt!Y z_NQO5US1|PeT^^7Y4Dh;qI(U>4F??C{meLOxAw7y$(SnTsJBKpnEdoG0=JZi?L3o)M46DoFdEA48B_ z`om2S;z+cSgJG9E#gk&_MnTu}K73bqXk1thfg5y3>OEHJF>0s}<6*SvxY(x6n|=ViQL!cgR5MNoe%dmBXK>sD z(gvq}7qrbj_&QW%7CG4_t1xwvk%3kepKdm^P&=4fqpbl#;HOd~VnSj^uQ;2mW)h!B zLXxtq@$WA=U0+`d5z`g{VsL(AMjOOvFpv`#my4`p)vSwF^p2H_u#(Mbcpb6qz!G2h z*S0Dr_Mr9NbJXx8p7g;gqj8Q2fC49r`=2(&e0Btx;p`s@zW_)bL6K5i-&E)L26^|7 znj1KO_PLkWFQH_|?}@zp3oj9CJrEM~<{sA7fkqRQ5TM-49|A;W*qConga5-#ypdJ( zaOyr0>|br(J>S{Ds;Lf@5iGi;V9l z!h2mk(eHwLU`S=Yk^3)YU;j<~imaD7=|`sk;~8e)+;uHKwDJGXGukZNH~>}Gvdc~jvYry!NbZ~m)yamm^wYT=G}Tb#TB1$FHs5>Gmb6b9;^Q-o&W#*p-y0aWLgXw|x~)9>1=xu4)naX{%yGprxsF zuDgX+XgApO3N3t+PBzKr$IYD_1yQn{FX%aMH{ve!h6c0;jgcFI7uC20jk zTq*LD}nQpVT9isgSn;jb0O%jS#XCA@M6AWR$zNtLQa&zCf zdhqpEdjGou@%C@HhbCe4WAMrHz^-7ueCUOdmA7_m&aCSBmW43LCr-#XK!(G zxpg}jrH-8_=}1sv;X-sh_R>vq_7X3#E%t$un>N!d*@_^v_%-qGvn)UZo}=Et z`#rn1TIgCvrz1M0IB7Z=Xd1L@Fb_&sE=fi-wJdw}sB(sA0Yt3+)Xao%iG_i7-%d-g znNxROHG=Qx)*q6uXrI=vQuklN;R0X=(b~kn-NzfPBjCUEiMXc6(d6vtpwy*ED$i`u z)G=EdQCbf$-6vbVsj)Q9%qxbE2G<^BYPnVK6iJy!HO^(lp8Sds2;>#4MqIce@YxF% z)AD=D1G%0cI7U3+VHr9~DiFF1rBc!LpdjoXMG@|I@I+!tD-$i}#OvWcDBO-qB6uU* z7~pgcq*|-zwrUI%8-`)3*KkKg*wdH`bs|>UDHy$O-Ld@~WxGp?=qK&`HbGa$y`lIZ z45#folW||rq#*P!db{;UtyPBe?ymbY9d0Vd1m65_i|^*c-d%gC4AAXfxn5R7J}%|8 zLOeI6=_Q2W6R)ty*E0KJy_uUSAT}IRss7R;V6jEY*v?$dyL9Cuh=oc`9wAY6Qb1Hu z4JGbmjy#k1?LR&?zg)!o*m~7_*k;NnQZR z(5aU?f{ywszOOgD&6L%gbRcckmbpUzGTqkbYxSQN9IK$!2RT;y_8npADy=!IN0#`r z9d362Ctl7`(Y8aLrYtXObM_(+kkH?|$9Z%GR~7s?w=g5Ji2;KemS;}b(o@%jE>Tei zw>5Ru5;QsuOKFE`Z-b@+WzN0HfXj1Ir@*>mU!l<~c)t!LJzULXi|w1bADkL|P`ut) zKsdZKQrpvHB}m%vdtPD0ki`tHI8%;k)44g3_?Je#+#7d+*K^nmv24~-@<0C;>gO;h zeY)=xk=P2!x>3VaJ{m-P#Oac}6+_Zpj`6yKX+7S9cSVDs0&kdIL76ry7j>IFAgO$TyUjaHp?@t;hecuqz&yR)M#|r!a2RytVSM1>=fL!vW4hJ6^d8a4A%GivGs=3$aps(@?RsAJvRo16@ zJ$+d|p~Ji8{Y*%xxmv@r{h=1oBAN$lg)kpIM-%$dUK+R96JYjs*6R4 zd-{y%Zrok(`@GGkx;s04pY3FN_jf+c^9TMT6Ww_G2=uD5wbc!bBlqApgJ2^P5CPJB zeNTY93fu1GO}0C`(nX;HU=H?2nJ<3|IfNA5p+wMC;#<(Hclztk;AW80`UUHnZYt5b zf^w9b3aF0z7&x&uk0(Fa<3%M!Q&<97H|u!mXXSh0X3PTfAwnt22UG@Mzr8U8fuNlf z!n=c7nO9J}vO{uk6#)9>1*&k0KwulnzL>0WBx4i9$N>23KboIj$r)eo=%HuBqm+{X z1K}U#n%`w9;%*d0RibLX)|f`cLa$YC2S@PzwO6H*NmVQ!fBDZ z{0k-OSA|~Ml$1^mMIgksl?b6hSiO-r-RhiCnt4TZ_sx)mh|&z4;Tzzh9YF(_jEeR< z*@_Nq;GFj#SKWof%%8>Nb(r0pfJkN`&uO-)OuGV*%C=o-&3}{p>0MCSd9;o-y%${I z|1^Xl+I=uMley*o#S;PEEZFwN^!u)SPro2Jv@oOjNr{yWOn}-!4w*X_I_V|Y6tRlgs#pZ-3a={0+q-0XW2nWa*Sl+jkS~)tX$H@bH;$68Z zBD#o`y7$J~^FLw6r+x|t?u9&wF3td#u; z?Dj57P+(hD*;H`3jICR{Ag(=}$~GdbSC%^JZpXESTI~3DR)Eb-4+pZ#(}XE=;54_i zsNlNaN_ADK8}v=hnK9q5drhcdQ9NX?ND)QYibbxu$!hhl(O)oo_r_~f4`qab1i;|0 z-Yk%&%{X}*VqWyVGy1&~oz(h&a9}Aaxvc9Pr7M=n>{hiPB*--S3hHW}(jcU0Eg>;2 zYTtG-O)hxUdz|_qZkSW9e6`hph#Z{^r$@18`}=DaJ)aM+%DNrTLUnYnq4-YrT|C&i zW)0+|?9XAblYRBzBb{O4{GTKiNr_kK2Ep{E{yL8?W0rbeKd&cK%2z1Y2;YDrWuIg}p4(aYRMWC279`0ONc*u~+d zxMfE>k;oXkCG}QrbGq^Dn-aUGiOC_fIXyuugs4D%u4l~~2|XimM-diRrbM+!lR4DO zDEa?47Rqkd-|O+)W?Ikb$VeK>fymk$pDGSXD<(wV-TgIgGru-VvBxFS0cDOCWkwQa znd~=CMUfC{4dq*_t`hu?#%vx-gRQ6**Jy1ftDo8kCJSGm&g30w3ub#v zD4vUYRV2T_3KmBn^mB{T^WY|%nS1Tlv(3?c5P}JSh;H*@*qVE0$Ox_yW8n-=_luoE zTbaMCHsUDLPm$SZU}nxcK}pkFh=ddj%({7>+aU*wJM<8*qdDz3^q7(clP;pt@SKov z@jxoeY<|&SH%4v?IpuoyRu!2hF~k;xj28cBoU4=yYUvt9d8mjyY?pZZc{r2TVAvo* z0HJ4tzf#+sz?K5eGh0)L&S(FK9;^zEFoqsba_TSY`SFXb{c0|i#`W5HW@}N08{|vO zrl*iz+r5vb%;)HQ8PzQ+MSYdK-<{m$ne?Q5aQatVj%6ua{4sS~ zJ;2v{3X9K}j48hl3pxI3NhdW~YX6b{AzG&Bcg^q#28$hYiOcpe8M;rF4{pFb>6%GR z+?S3Dx^(Cf$*XgdoQDhEK8487D9kNWxz&!^|NN56B`WTRAoXrdpsMH)R#vWHTQs-E z4ijQZ7~S`x)qkEWo~3S=<&;wcmjO`}c|=O-Q%)aU2BMz{A;A2ihe E0U}w84*&oF diff --git a/gateway/handler.go b/gateway/handler.go index c25204a23..e9bee6d52 100644 --- a/gateway/handler.go +++ b/gateway/handler.go @@ -38,7 +38,7 @@ func Handler(gwapi lapi.Gateway, api lapi.FullNode, rateLimit int64, connPerMinu rpcServer.Register("Filecoin", hnd) rpcServer.AliasMethod("rpc.discover", "Filecoin.Discover") - lapi.CrateEthRPCAliases(rpcServer) + lapi.CreateEthRPCAliases(rpcServer) m.Handle(path, rpcServer) } diff --git a/itests/eth_account_abstraction_test.go b/itests/eth_account_abstraction_test.go index b6ad48720..c727c2a73 100644 --- a/itests/eth_account_abstraction_test.go +++ b/itests/eth_account_abstraction_test.go @@ -2,16 +2,19 @@ package itests import ( "context" - "fmt" + "encoding/hex" + "os" "testing" "time" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" @@ -25,9 +28,8 @@ import ( func TestEthAccountAbstraction(t *testing.T) { kit.QuietMiningLogs() - blockTime := 100 * time.Millisecond client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC()) - ens.InterconnectAll().BeginMining(blockTime) + ens.InterconnectAll().BeginMining(10 * time.Millisecond) ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() @@ -38,8 +40,6 @@ func TestEthAccountAbstraction(t *testing.T) { placeholderAddress, err := client.WalletImport(ctx, &secpKey.KeyInfo) require.NoError(t, err) - fmt.Println(placeholderAddress) - // create an placeholder actor at the target address msgCreatePlaceholder := &types.Message{ From: client.DefaultKey.Address, @@ -50,7 +50,8 @@ func TestEthAccountAbstraction(t *testing.T) { require.NoError(t, err) mLookup, err := client.StateWaitMsg(ctx, smCreatePlaceholder.Cid(), 3, api.LookbackNoLimit, true) require.NoError(t, err) - require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode) + + require.True(t, mLookup.Receipt.ExitCode.IsSuccess()) // confirm the placeholder is an placeholder placeholderActor, err := client.StateGetActor(ctx, placeholderAddress, types.EmptyTSK) @@ -58,6 +59,7 @@ func TestEthAccountAbstraction(t *testing.T) { require.Equal(t, uint64(0), placeholderActor.Nonce) require.True(t, builtin.IsPlaceholderActor(placeholderActor.Code)) + require.Equal(t, msgCreatePlaceholder.Value, placeholderActor.Balance) // send a message from the placeholder address msgFromPlaceholder := &types.Message{ @@ -82,7 +84,7 @@ func TestEthAccountAbstraction(t *testing.T) { mLookup, err = client.StateWaitMsg(ctx, smFromPlaceholderCid, 3, api.LookbackNoLimit, true) require.NoError(t, err) - require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode) + require.True(t, mLookup.Receipt.ExitCode.IsSuccess()) // confirm ugly Placeholder duckling has turned into a beautiful EthAccount swan @@ -118,7 +120,7 @@ func TestEthAccountAbstraction(t *testing.T) { mLookup, err = client.StateWaitMsg(ctx, smFromPlaceholderCid, 3, api.LookbackNoLimit, true) require.NoError(t, err) - require.Equal(t, exitcode.Ok, mLookup.Receipt.ExitCode) + require.True(t, mLookup.Receipt.ExitCode.IsSuccess()) // confirm no changes in code CID @@ -129,3 +131,185 @@ func TestEthAccountAbstraction(t *testing.T) { require.False(t, builtin.IsPlaceholderActor(eoaActor.Code)) require.True(t, builtin.IsEthAccountActor(eoaActor.Code)) } + +// Tests that an placeholder turns into an EthAccout even if the message fails +func TestEthAccountAbstractionFailure(t *testing.T) { + kit.QuietMiningLogs() + + client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC()) + ens.InterconnectAll().BeginMining(10 * time.Millisecond) + + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + + secpKey, err := key.GenerateKey(types.KTDelegated) + require.NoError(t, err) + + placeholderAddress, err := client.WalletImport(ctx, &secpKey.KeyInfo) + require.NoError(t, err) + + // create a placeholder actor at the target address + msgCreatePlaceholder := &types.Message{ + From: client.DefaultKey.Address, + To: placeholderAddress, + Value: abi.TokenAmount(types.MustParseFIL("100")), + } + smCreatePlaceholder, err := client.MpoolPushMessage(ctx, msgCreatePlaceholder, nil) + require.NoError(t, err) + mLookup, err := client.StateWaitMsg(ctx, smCreatePlaceholder.Cid(), 3, api.LookbackNoLimit, true) + require.NoError(t, err) + require.True(t, mLookup.Receipt.ExitCode.IsSuccess()) + + // confirm the placeholder is an placeholder + placeholderActor, err := client.StateGetActor(ctx, placeholderAddress, types.EmptyTSK) + require.NoError(t, err) + + require.Equal(t, uint64(0), placeholderActor.Nonce) + require.True(t, builtin.IsPlaceholderActor(placeholderActor.Code)) + require.Equal(t, msgCreatePlaceholder.Value, placeholderActor.Balance) + + // send a message from the placeholder address + msgFromPlaceholder := &types.Message{ + From: placeholderAddress, + To: placeholderAddress, + Value: abi.TokenAmount(types.MustParseFIL("20")), + } + msgFromPlaceholder, err = client.GasEstimateMessageGas(ctx, msgFromPlaceholder, nil, types.EmptyTSK) + require.NoError(t, err) + + msgFromPlaceholder.Value = abi.TokenAmount(types.MustParseFIL("1000")) + txArgs, err := ethtypes.NewEthTxArgsFromMessage(msgFromPlaceholder) + require.NoError(t, err) + + digest, err := txArgs.ToRlpUnsignedMsg() + require.NoError(t, err) + + siggy, err := client.WalletSign(ctx, placeholderAddress, digest) + require.NoError(t, err) + + smFromPlaceholderCid, err := client.MpoolPush(ctx, &types.SignedMessage{Message: *msgFromPlaceholder, Signature: *siggy}) + require.NoError(t, err) + + mLookup, err = client.StateWaitMsg(ctx, smFromPlaceholderCid, 3, api.LookbackNoLimit, true) + require.NoError(t, err) + // message should have failed because we didn't have enough $$$ + require.Equal(t, exitcode.SysErrInsufficientFunds, mLookup.Receipt.ExitCode) + + // BUT, ugly Placeholder duckling should have turned into a beautiful EthAccount swan anyway + + eoaActor, err := client.StateGetActor(ctx, placeholderAddress, types.EmptyTSK) + require.NoError(t, err) + + require.False(t, builtin.IsPlaceholderActor(eoaActor.Code)) + require.True(t, builtin.IsEthAccountActor(eoaActor.Code)) + require.Equal(t, uint64(1), eoaActor.Nonce) + + // Send a valid message now, it should succeed without any code CID changes + + msgFromPlaceholder = &types.Message{ + From: placeholderAddress, + To: placeholderAddress, + Nonce: 1, + Value: abi.NewTokenAmount(1), + } + + msgFromPlaceholder, err = client.GasEstimateMessageGas(ctx, msgFromPlaceholder, nil, types.EmptyTSK) + require.NoError(t, err) + + txArgs, err = ethtypes.NewEthTxArgsFromMessage(msgFromPlaceholder) + require.NoError(t, err) + + digest, err = txArgs.ToRlpUnsignedMsg() + require.NoError(t, err) + + siggy, err = client.WalletSign(ctx, placeholderAddress, digest) + require.NoError(t, err) + + smFromPlaceholderCid, err = client.MpoolPush(ctx, &types.SignedMessage{Message: *msgFromPlaceholder, Signature: *siggy}) + require.NoError(t, err) + + mLookup, err = client.StateWaitMsg(ctx, smFromPlaceholderCid, 3, api.LookbackNoLimit, true) + require.NoError(t, err) + require.True(t, mLookup.Receipt.ExitCode.IsSuccess()) + + // confirm no changes in code CID + + eoaActor, err = client.StateGetActor(ctx, placeholderAddress, types.EmptyTSK) + require.NoError(t, err) + require.Equal(t, uint64(2), eoaActor.Nonce) + + require.False(t, builtin.IsPlaceholderActor(eoaActor.Code)) + require.True(t, builtin.IsEthAccountActor(eoaActor.Code)) +} + +// Tests that f4 addresess that aren't placeholders/ethaccounts can't be top-level senders +func TestEthAccountAbstractionFailsFromEvmActor(t *testing.T) { + kit.QuietMiningLogs() + + client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC()) + ens.InterconnectAll().BeginMining(10 * time.Millisecond) + + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + + // create a new Ethereum account + key, ethAddr, deployer := client.EVM().NewAccount() + + // send some funds to the f410 address + kit.SendFunds(ctx, t, client, deployer, types.FromFil(10)) + + // install a contract from the placeholder + contractHex, err := os.ReadFile("./contracts/SimpleCoin.hex") + require.NoError(t, err) + + contract, err := hex.DecodeString(string(contractHex)) + require.NoError(t, err) + + gaslimit, err := client.EthEstimateGas(ctx, ethtypes.EthCall{ + From: ðAddr, + Data: contract, + }) + require.NoError(t, err) + + maxPriorityFeePerGas, err := client.EthMaxPriorityFeePerGas(ctx) + require.NoError(t, err) + + tx := ethtypes.EthTxArgs{ + ChainID: build.Eip155ChainId, + Value: big.Zero(), + Nonce: 0, + MaxFeePerGas: types.NanoFil, + MaxPriorityFeePerGas: big.Int(maxPriorityFeePerGas), + GasLimit: int(gaslimit), + Input: contract, + V: big.Zero(), + R: big.Zero(), + S: big.Zero(), + } + + client.EVM().SignTransaction(&tx, key.PrivateKey) + + client.EVM().SubmitTransaction(ctx, &tx) + + smsg, err := tx.ToSignedMessage() + require.NoError(t, err) + + ml, err := client.StateWaitMsg(ctx, smsg.Cid(), 1, api.LookbackNoLimit, true) + require.NoError(t, err) + require.True(t, ml.Receipt.ExitCode.IsSuccess()) + + // Get contract address, assert it's an EVM actor + contractAddr, err := client.EVM().ComputeContractAddress(ethAddr, 0).ToFilecoinAddress() + require.NoError(t, err) + + client.AssertActorType(ctx, contractAddr, "evm") + + msgFromContract := &types.Message{ + From: contractAddr, + To: contractAddr, + } + + _, err = client.GasEstimateMessageGas(ctx, msgFromContract, nil, types.EmptyTSK) + require.Error(t, err, "expected gas estimation to fail") + require.Contains(t, err.Error(), "SysErrSenderInvalid") +} diff --git a/node/rpc.go b/node/rpc.go index ccdb20e89..2c1798614 100644 --- a/node/rpc.go +++ b/node/rpc.go @@ -79,7 +79,7 @@ func FullNodeHandler(a v1api.FullNode, permissioned bool, opts ...jsonrpc.Server rpcServer.Register("Filecoin", hnd) rpcServer.AliasMethod("rpc.discover", "Filecoin.Discover") - api.CrateEthRPCAliases(rpcServer) + api.CreateEthRPCAliases(rpcServer) var handler http.Handler = rpcServer if permissioned {