From e915cad42a5b92e76642b45cc4c5259134c8df58 Mon Sep 17 00:00:00 2001 From: PG Herveou <pgherveou@gmail.com> Date: Fri, 21 Feb 2025 16:49:35 +0100 Subject: [PATCH] [pallet-revive] Remove js examples (#7660) Remove JS examples, they now belongs to the evm-test-suite repo --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- Cargo.lock | 18 - prdoc/pr_7660.prdoc | 8 + substrate/frame/revive/rpc/Cargo.toml | 21 - substrate/frame/revive/rpc/examples/README.md | 16 +- substrate/frame/revive/rpc/examples/bun.lockb | Bin 10962 -> 0 bytes .../revive/rpc/examples/{rust => }/deploy.rs | 0 .../rpc/examples/{rust => }/extrinsic.rs | 0 .../frame/revive/rpc/examples/js/.gitignore | 24 - .../revive/rpc/examples/js/.prettierrc.json | 6 - .../revive/rpc/examples/js/.solhint.json | 9 - .../revive/rpc/examples/js/abi/Errors.json | 106 ---- .../revive/rpc/examples/js/abi/Errors.ts | 106 ---- .../rpc/examples/js/abi/EventExample.json | 34 -- .../rpc/examples/js/abi/EventExample.ts | 34 -- .../revive/rpc/examples/js/abi/Flipper.json | 35 -- .../revive/rpc/examples/js/abi/Flipper.ts | 35 -- .../rpc/examples/js/abi/FlipperCaller.json | 46 -- .../rpc/examples/js/abi/FlipperCaller.ts | 46 -- .../revive/rpc/examples/js/abi/PiggyBank.json | 65 --- .../rpc/examples/js/abi/RevertExample.ts | 14 - .../revive/rpc/examples/js/abi/piggyBank.ts | 65 --- .../frame/revive/rpc/examples/js/bun.lockb | Bin 72109 -> 0 bytes .../rpc/examples/js/contracts/Errors.sol | 51 -- .../rpc/examples/js/contracts/Event.sol | 13 - .../rpc/examples/js/contracts/Flipper.sol | 35 -- .../rpc/examples/js/contracts/PiggyBank.sol | 32 -- .../rpc/examples/js/contracts/Tracing.sol | 52 -- .../frame/revive/rpc/examples/js/evm/.gitkeep | 0 .../frame/revive/rpc/examples/js/index.html | 38 -- .../revive/rpc/examples/js/package-lock.json | 443 --------------- .../frame/revive/rpc/examples/js/package.json | 26 - .../revive/rpc/examples/js/pvm/Errors.polkavm | Bin 7274 -> 0 bytes .../rpc/examples/js/pvm/EventExample.polkavm | Bin 2615 -> 0 bytes .../rpc/examples/js/pvm/Flipper.polkavm | Bin 1738 -> 0 bytes .../rpc/examples/js/pvm/FlipperCaller.polkavm | Bin 4615 -> 0 bytes .../rpc/examples/js/pvm/PiggyBank.polkavm | Bin 5090 -> 0 bytes .../revive/rpc/examples/js/src/balance.ts | 8 - .../rpc/examples/js/src/build-contracts.ts | 99 ---- .../frame/revive/rpc/examples/js/src/event.ts | 29 - .../js/src/fixtures/debug_traceCall.json | 143 ----- .../examples/js/src/fixtures/trace_block.json | 152 ----- .../js/src/fixtures/trace_transaction.json | 143 ----- .../rpc/examples/js/src/geth-diff.test.ts | 531 ------------------ .../frame/revive/rpc/examples/js/src/lib.ts | 127 ----- .../revive/rpc/examples/js/src/piggy-bank.ts | 64 --- .../revive/rpc/examples/js/src/solc.d.ts | 83 --- .../revive/rpc/examples/js/src/spammer.ts | 93 --- .../revive/rpc/examples/js/src/transfer.ts | 19 - .../frame/revive/rpc/examples/js/src/util.ts | 212 ------- .../frame/revive/rpc/examples/js/src/web.ts | 129 ----- .../revive/rpc/examples/js/tsconfig.json | 23 - .../examples/{rust => }/remark-extrinsic.rs | 0 .../rpc/examples/{rust => }/rpc-playground.rs | 0 .../revive/rpc/examples/rpc_demo.polkavm | 1 - .../rpc/examples/{rust => }/transfer.rs | 0 substrate/frame/revive/rpc/src/tests.rs | 109 +--- 56 files changed, 11 insertions(+), 3332 deletions(-) create mode 100644 prdoc/pr_7660.prdoc delete mode 100755 substrate/frame/revive/rpc/examples/bun.lockb rename substrate/frame/revive/rpc/examples/{rust => }/deploy.rs (100%) rename substrate/frame/revive/rpc/examples/{rust => }/extrinsic.rs (100%) delete mode 100644 substrate/frame/revive/rpc/examples/js/.gitignore delete mode 100644 substrate/frame/revive/rpc/examples/js/.prettierrc.json delete mode 100644 substrate/frame/revive/rpc/examples/js/.solhint.json delete mode 100644 substrate/frame/revive/rpc/examples/js/abi/Errors.json delete mode 100644 substrate/frame/revive/rpc/examples/js/abi/Errors.ts delete mode 100644 substrate/frame/revive/rpc/examples/js/abi/EventExample.json delete mode 100644 substrate/frame/revive/rpc/examples/js/abi/EventExample.ts delete mode 100644 substrate/frame/revive/rpc/examples/js/abi/Flipper.json delete mode 100644 substrate/frame/revive/rpc/examples/js/abi/Flipper.ts delete mode 100644 substrate/frame/revive/rpc/examples/js/abi/FlipperCaller.json delete mode 100644 substrate/frame/revive/rpc/examples/js/abi/FlipperCaller.ts delete mode 100644 substrate/frame/revive/rpc/examples/js/abi/PiggyBank.json delete mode 100644 substrate/frame/revive/rpc/examples/js/abi/RevertExample.ts delete mode 100644 substrate/frame/revive/rpc/examples/js/abi/piggyBank.ts delete mode 100755 substrate/frame/revive/rpc/examples/js/bun.lockb delete mode 100644 substrate/frame/revive/rpc/examples/js/contracts/Errors.sol delete mode 100644 substrate/frame/revive/rpc/examples/js/contracts/Event.sol delete mode 100644 substrate/frame/revive/rpc/examples/js/contracts/Flipper.sol delete mode 100644 substrate/frame/revive/rpc/examples/js/contracts/PiggyBank.sol delete mode 100644 substrate/frame/revive/rpc/examples/js/contracts/Tracing.sol delete mode 100644 substrate/frame/revive/rpc/examples/js/evm/.gitkeep delete mode 100644 substrate/frame/revive/rpc/examples/js/index.html delete mode 100644 substrate/frame/revive/rpc/examples/js/package-lock.json delete mode 100644 substrate/frame/revive/rpc/examples/js/package.json delete mode 100644 substrate/frame/revive/rpc/examples/js/pvm/Errors.polkavm delete mode 100644 substrate/frame/revive/rpc/examples/js/pvm/EventExample.polkavm delete mode 100644 substrate/frame/revive/rpc/examples/js/pvm/Flipper.polkavm delete mode 100644 substrate/frame/revive/rpc/examples/js/pvm/FlipperCaller.polkavm delete mode 100644 substrate/frame/revive/rpc/examples/js/pvm/PiggyBank.polkavm delete mode 100644 substrate/frame/revive/rpc/examples/js/src/balance.ts delete mode 100644 substrate/frame/revive/rpc/examples/js/src/build-contracts.ts delete mode 100644 substrate/frame/revive/rpc/examples/js/src/event.ts delete mode 100644 substrate/frame/revive/rpc/examples/js/src/fixtures/debug_traceCall.json delete mode 100644 substrate/frame/revive/rpc/examples/js/src/fixtures/trace_block.json delete mode 100644 substrate/frame/revive/rpc/examples/js/src/fixtures/trace_transaction.json delete mode 100644 substrate/frame/revive/rpc/examples/js/src/geth-diff.test.ts delete mode 100644 substrate/frame/revive/rpc/examples/js/src/lib.ts delete mode 100644 substrate/frame/revive/rpc/examples/js/src/piggy-bank.ts delete mode 100644 substrate/frame/revive/rpc/examples/js/src/solc.d.ts delete mode 100644 substrate/frame/revive/rpc/examples/js/src/spammer.ts delete mode 100644 substrate/frame/revive/rpc/examples/js/src/transfer.ts delete mode 100644 substrate/frame/revive/rpc/examples/js/src/util.ts delete mode 100644 substrate/frame/revive/rpc/examples/js/src/web.ts delete mode 100644 substrate/frame/revive/rpc/examples/js/tsconfig.json rename substrate/frame/revive/rpc/examples/{rust => }/remark-extrinsic.rs (100%) rename substrate/frame/revive/rpc/examples/{rust => }/rpc-playground.rs (100%) delete mode 120000 substrate/frame/revive/rpc/examples/rpc_demo.polkavm rename substrate/frame/revive/rpc/examples/{rust => }/transfer.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index cf75334f495..5457e44aeaa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6664,23 +6664,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "ethabi" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" -dependencies = [ - "ethereum-types 0.14.1", - "hex", - "once_cell", - "regex", - "serde", - "serde_json", - "sha3 0.10.8", - "thiserror 1.0.65", - "uint 0.9.5", -] - [[package]] name = "ethabi-decode" version = "1.0.0" @@ -15170,7 +15153,6 @@ dependencies = [ "anyhow", "clap 4.5.13", "env_logger 0.11.3", - "ethabi", "futures", "git2", "hex", diff --git a/prdoc/pr_7660.prdoc b/prdoc/pr_7660.prdoc new file mode 100644 index 00000000000..41a37d0893b --- /dev/null +++ b/prdoc/pr_7660.prdoc @@ -0,0 +1,8 @@ +title: '[pallet-revive] Remove js examples' +doc: +- audience: Runtime Dev + description: |- + Remove JS examples, they now belongs to the evm-test-suite repo +crates: +- name: pallet-revive-eth-rpc + bump: minor diff --git a/substrate/frame/revive/rpc/Cargo.toml b/substrate/frame/revive/rpc/Cargo.toml index 33d447e67a2..0353cf23709 100644 --- a/substrate/frame/revive/rpc/Cargo.toml +++ b/substrate/frame/revive/rpc/Cargo.toml @@ -17,26 +17,6 @@ path = "src/main.rs" name = "eth-rpc-tester" path = "src/eth-rpc-tester.rs" -[[example]] -name = "deploy" -path = "examples/rust/deploy.rs" - -[[example]] -name = "transfer" -path = "examples/rust/transfer.rs" - -[[example]] -name = "rpc-playground" -path = "examples/rust/rpc-playground.rs" - -[[example]] -name = "extrinsic" -path = "examples/rust/extrinsic.rs" - -[[example]] -name = "remark-extrinsic" -path = "examples/rust/remark-extrinsic.rs" - [dependencies] anyhow = { workspace = true } clap = { workspace = true, features = ["derive", "env"] } @@ -70,7 +50,6 @@ tokio = { workspace = true, features = ["full"] } [dev-dependencies] env_logger = { workspace = true } -ethabi = { version = "18.0.0" } pretty_assertions = { workspace = true } static_init = { workspace = true } substrate-cli-test-utils = { workspace = true } diff --git a/substrate/frame/revive/rpc/examples/README.md b/substrate/frame/revive/rpc/examples/README.md index 1079c254b9c..5bbd6255713 100644 --- a/substrate/frame/revive/rpc/examples/README.md +++ b/substrate/frame/revive/rpc/examples/README.md @@ -47,21 +47,7 @@ RUST_LOG="info,eth-rpc=debug" cargo run -p pallet-revive-eth-rpc --example deplo ## JS examples -Interact with the node using MetaMask & Ether.js, by starting the example web app: - -```bash - -cd substrate/frame/revive/rpc/examples/js -bun install -bun run dev -``` - -Alternatively, you can run the example script directly: - -```bash -cd substrate/frame/revive/rpc/examples/js -bun src/script.ts -``` +JS examples have been moved to the [evm-test-suite](https://github.com/paritytech/evm-test-suite) repository. ### Configure MetaMask diff --git a/substrate/frame/revive/rpc/examples/bun.lockb b/substrate/frame/revive/rpc/examples/bun.lockb deleted file mode 100755 index 3a7a0df5cea48f9e639655bd11d1b9b94751e6b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10962 zcmeHN2{@G7|9@j5ZhKNhq?<M~gBgV+Dyg(7+Dn6>Va$wKEG5ytZ&%&q-$J`|uars( z-KcQ2(4s|~cBDnxyT9*uW)5%Nena<v|IhP(?sJdFocEmfd_LdhEblq*_wCw+t&mCC zz5)@OFA6jFRfzQApD7gk1qTR(d}e@H8p4w^!>skSD2nngn=&*Z^XI|~E8^}RJ@_Je za@yJ|zFBz4>^<w3rYl_L4D1DsAepK%s@Ye0jJn*DG*FjSSxbtFk%@(VSdxcGl$AB` ztB3XckTAZKqB5Y|9Lhm5rfepUL+yofYbbA1w_67}@_0jz?FddsTUC}S*(s_3%I)BO zh(II=5y<3_0fM5kq5cP`e+A~^ebc5Yz73EgUpeIZkjFya9&&|_s=WZp9ibc?sidKX zLxwyGT@_AMOHqbaml%h2n`%8v?sZpeVspFqAcHWI=!D2?el1hxpYuJ`e%OQYE!O>5 z-i>ps?bZo94L-ZNp7G)CdeX^4d#mR*?t?2W9Yk&0dkjl7tsTB4XWnpwgkK-rNz58f za93PhEIUY6AE?f`Ie(XF#hTIkFNRlLHL{B@i#zPO=%ICf^g7AGW_QDe2go{1p2B;U zI@9Ej;}eRn)p(nY&&iI~4_(wf{tR{JM2oJA^_$nel()3Gct0bTJKcVG!86+g<A^>6 zrQr^qyE_M5&%b`_!`S$>?8z%F)B8K<iJeYA_1u)%gc$l4a~x%upbsf0@E=}d0{1p5 z5j+oC+o<t43QZb?rYM5XgZ6Bi{4U>#{{-zF0Z;rvcpIW2?OXxK1w7gfL#R%##^M!# zcTwvPLz*IbG!~x@fIezGnZ*rZ@jlVN0`SAs_P2t1n8S@q1kZ&F^dHJb{TrJIUIZ6| z)$+0Kd*!DA$QAG~*Olpe{bvSBWB*~_!4lDE8;Jhn0Pg~L#A5nh`9A^Pie`Uf`;f>l z1N<n!lk)e<@6Dhn`~QV}Kftrpcu=M8NuqRyh99EuTEII49-9&$YJk<<BKY%wNBhaT zL+a}q{+A2Vt~UTtK9*7c@AY32;9b@BBeunVk@s~qkzWOPTt5+ubzn}T62bQbr;SkK z5lHGAA|dT?;0^#h%EdY|j~a{52K-pH{KonYxrzKXF!9Lv|10Zfe*oe5H3ZJat{rsw zv4F?^!?6eZh(?cJ<Uo7zAIA;)5A}z=gt89yAj<Sta^!-&k}_eAGTOjD*27*#nKb3t z9{quO8NomLx)c0k!W{3D=j^v~yiecwVHyAb*>-+z^%;%)I}`9Vp;WwdYR2nHPg1u( zuY9?sXvVZzvwOtfXggJyu({d1ysUPY%X~^k?XncgH^sIn@Sj`QDx+PlsYU7L^wpsP z`TY!@TXXB2Y#J|_N2oS~8k5xh;oBk0ZO@hl&bjP<H%{@+$(LQ`yP>@Nl&fCaSk|5N z)0~ot$;^X~*zJ-RcllxYRI^J~rXLL#+|#P%oa#a2#l9wqv9k5j4ND3(Z@#X$G0w5? z(BuUor-8A@FW)p;cCcT{75-fPsKlQC6X3A&t$DW=xhwYl^4z&oH{+VZM;(8hv{AV9 z=T0<U9K$3rTJbzf6u!S67@E0iLerIp;`@C56t_Wlq}9sNeu}15uOhTlRv8^}b~~8; zvM|fM^wwB!9s9hMK`pa-+g+9L+D|B^@sjl)xfv3ZN1Iy>U$H5!A~o__JFSW}D}vGv zSBx|?47(q?Cw21v7logBGsp7NI(FaX$hH|9ZTjZz>)SeQ=X83Nnz4gxN9V<Lfh2~9 z!kQDc{b8`zQ1|oY-bR~l*9`5|p670GC8I<3oiX>9IBhO|oBCdl+g`7Y;Z}L=yHz&% z#^vS(rTWK{%pT<x>C*JYwSpu@%(SUP4&3d^@fo$)sl@MN$)G6b^~LWh3Yp=R<2P9+ z&uHp?BUQxiKl$~YYd`dK<QKls`uKQDyGz5}GArYL(wbOC<E8H(7_pW1#(DRCFEvdx zNlxhgyP3J=^wWcW+PiqI)g%L}E49tLiApw<$IMS(^ed+_t2$`@r^$zZ-XdRfGP0EW zG3s9aUK%fbZDlwPF06gB^=<g!7V!rA&V1~C-K^T;{or*=ZY=ihVjW;t>$>UaiK0bg zQueZ@TO{VcD$XqQTBLB*ow#gTMfDc1h$%E)`tydt<PI1b=zP%a=7lL4lahA353wlF z@lUwA%<$v7cQwLs+1Dm|Misb@c>JdS%x*qcD<`Lx$M2{**<@n-lzo+Z5-(TNcyS#j ziIK72<Idv_LpumFJx7ZVgr~>WbXaZtbc8tZR!`=zA$}KDMXb?tx%@}!#afFlmIqDx zZP;a@tzTwx_SK~cOvm5n52W#u^&Ghwi4%4Vn4o`X^}G@N&P<B+k`xMif8zc&gE6<) zvZ$*rL&U7B+TII$82h9;g)d}TcsF}cZNFqh%SGp|^<NNBG}`MijhDV}V7x1+@`&r& z-gu$@0?XrpqLT|3=tT5?o$%1`MRe#uf1_9hdyLPxoMQo7$5nk6J2kguxiL;B6ui~; z4&cR=Ur)MA<HhqCNsPj<)AN$Hmr>Jl4;QXmx--d$o!ZJ=-YjmQSFELk7d<z2Ku7zK zbBDuoZ#E5yJh|^wwC(|YT@&fhsR18T^L1MFqw(Tdfh5K~Dr)ooesdnRA3tcxlTP-t z554E!zrTE~CHv5&u=|xyGLN*mR-B(-<+Y{v?0j?oR;g!-SrIEYULAj1)SP+lF1II* zmpu27n{mS`#=RhRO<C!&4oia+Jtwlf$_~Fv%6XY{A<EtQa-5U4=`j;3;a2jV*O}+n zc{!J_^?zINL05l$^4_4Byc3*eG+umulEmod^YU2JuuQv*CAnjluCZ--$@G0x$k>Qm ztTJQCRmq!teOBf(x2dtOJcNS>EvW8&dc4lgg<ICzNp`i4H0aUxz-$_CTS5vs!|Lt} z^M|W>7aw%%G|=_=S?>g&Qy;c+&hH!VeDrl&-J<;L<HFW%p&^gUpPGB8B=B=>4-Rd6 zd2Pk=j+YMTw+ha&r}5%mge1oHPxsb1g-qM#P-7IIu_@o*R{Xp~+o;Fqr_MhM?gW^% z>g+c$eedn)$8(pjoN~d(^i1DfYnuh6hq@1YZMc;0v28Pr*MN{h&X5&7opj=G$|aGm zo3WP#H=|wAkZhw1-n&~bFDXBI&qQxk7uOq%#}3n9&)#t^^nKdy8o6M#@h>gXONY&R z6Q#9KM&l*>5u|4%57_!#JI5`wf-^KYXlJQde8a(O{hbf_1IJDJXy<oP{~@<1`C3KN zIrm?@^IJbki=HxUtyyCA@+S@#&gmVSw%(1#i~AUo7+J;HZx-!1o%{R3ssW)#p14=o zI#+O{m0k8u%-<)Pcl5#?gPHGN1+{4^TYdjGL3Ypw%ZpC7XSeL|?UnWFCtbbT<22q5 zgcNcH@6?4C`@5c8*gvH2u$Jq~ZCNLOG3tGVUpYNpFUxVob${)7gMH7R%@Z_PrAT@) zub<bPW=0EAvipVWd|F`{v+IBrjThc6)g?xaNn%=VSk!Bw-Nv`o1#zBfTQ{C?KC))e zgdW9<ZpQl`T~@UwN9%xF^fIY~eGO-nq+ReZ=ib!4A0KUw4D+2|O&<@qk0Xh(=;qEB zcDs9I6?`1LFnF@zHJ8ZsV_qDcK4{0eDjnA1Oy44Q<c2jXimXH{%N@1GeBw9T9y*2n zW?8kR$0_!x*v)w6C;Jj(LJB#fpDkM`UDk5rv5O9QwYM&Lj%j+Sv!!%5_lEOmi}w#p z^3ueWt7Ohcj5_6JOdUDe$GB$X*p%z61)U8`OFSZ+OV`nO$$k^*8CjK!=NE}j%&-ge z{2}_~{q2EHbED1Aw%`PH=e{%I%i^c#hZPr8+$gOSB<#o;LuKDE99h;RIk(-6nEruw zrZID9ykx(s<ULWfY{2e6EW^$-rtT5)p3O=<G2e5d@!Y(Zb37(FwaD$l2~RTH>tx`1 zYC?=hKzz&j>y3ZAVqBbJ^qc?tABUu#Sq;36O}Nj(cb-8qRnEeTMkXaz{a&;$$b@HJ zOe3Lxdo#K&ZDErK&z*1Tg6+sVSQgt)DEJ<O|8}kaS%lv)?EYDX|7*>^9{AS-|9as6 z(gPCpo2!lLT;EA1^<xP{GC5BuWRZ9&%S+1VJDb~Do67{V_~HO7bFMj0C<qjZ1L{wt zpZ`!LRF}LrBkx5>`K(%ueP@+X`c4XttuwG`;KlVHpRdS;`x!h_;`tBHYIv@~cO>{e z1K&O1djdSuqgJ@b#`6)LZE;_Wdsy6W;@JkzA$VrM{XOc2`$asn&s6Jmvyu9tZiq)2 zs3Xcn9@GJKL7h-H)E)K2{Ugdn{m~Az0d+y0P*=1EbwYhmU$g;r$NQ)|+TYp?ejsUC zsB(R$DYkv4DeR$t`qcT+=Fj~DvSLV_RtuF?rs41l+Q*QHr&g2cwzez>mNn%KcR<G& z5{rd9Hr6a_mW^^}hhP%zg*(<PdzP&|wGL`g4vFI;hGolwSI*nu4tOSpM0(+lJ<A5f z)Wy0<ELe%Lu?0CK8cw3cT1`+4K<eV<B%Z9)fCCVUM8-+v81C4y><~m^?<6*jY}PCe zhoWlKx{+wLR+DJZjActvB<@Y(!b;t2k&Q&sNu*gRM~NXZc@ndRJAIUH`<8BfS#Ym@ z??~d?T20h$tBc%|$TqN9t1u+CPh#IntvSd>qW>g1UavLzK7ho}0Rz^c-^dpMBw`L2 z=mKOT-vE#pxspwJhkPwSqUp*zN;dLc0g1b-F*Y_7`O<(y;+0xsXH$Q+2gVME#ic0n zH3Es&Yc=7*pt1qo$ae@NP7iE-ST+tY;6|ut2g$!&*i@s0<rX35OGP~4IJs0H3UoHN zsh>dhbrUE;&E(h%h6yBCvtX{-d~>R~NO)3#Jd!QthY7;?Gv#uL%#jVHK=>9z8p#q# zLV{#0u{4nVWkWVojbP%Cv}4HwXSv8DC43oMB=+Y^cz(gWKt3}_CKhR+#Pb#qVFolf z9g)XR91_A4`7`+upn^<Y;!6X>LZLXEDdqbMq<lZQEQB8-mPUe-d|rqK88C-H1pF!$ z<#14fSjL13;L(7qYXj)IYo>CNAq9S?qv{e39I6Irq4IFZv}5&!Q2=NS7`j=2q!+;g zSTGvEt5+a^s;`uuwQd0QwQ~XfbrsldV+YHuX7%g33mEFInf9P~Ln?gP?e%c=H~{gu z$ZM8PA9uh&FEUk60wf@Vo5@qiXENpDV7{oXN+A{2cP$)=HT2Ziy^9N@a(HRL(B*)F z^deKa<ThZS6z7Z7Pw5QhWbx<oCEy`BU*r!{K_F31IVSp&FOqB2{?Dy}`WqZf<#OAA zUS$0S3UXPmqXvJ#3JMVTh1MKc0W^0n%~(LuN-)OJdz#U8&aUrvVEINZ%u{$QBAbf@ z);~7<gGWUH8tnM8A<z;GcuzfNRZWmb5Xgd0{9q-M2zh>dHIy$87fXX#emo|A?x$+T z^qa{OXj(w&%|Ix<2o8lm<#?1x#d0xI2&<_E3+fvIQGG$#i`)i0`%M$j311ooTx!1t zO2O~|g^(GbX^7HV0U52tR6R@^rPZGuUgs!!FDTvB&<F~S1Z;35v~74Dr#%hP6Yx-E ns&=WUwL;`C@DnhV4@?bxLT?5n^dhVlxM@H#)ieJ8-|v3_6GD$u diff --git a/substrate/frame/revive/rpc/examples/rust/deploy.rs b/substrate/frame/revive/rpc/examples/deploy.rs similarity index 100% rename from substrate/frame/revive/rpc/examples/rust/deploy.rs rename to substrate/frame/revive/rpc/examples/deploy.rs diff --git a/substrate/frame/revive/rpc/examples/rust/extrinsic.rs b/substrate/frame/revive/rpc/examples/extrinsic.rs similarity index 100% rename from substrate/frame/revive/rpc/examples/rust/extrinsic.rs rename to substrate/frame/revive/rpc/examples/extrinsic.rs diff --git a/substrate/frame/revive/rpc/examples/js/.gitignore b/substrate/frame/revive/rpc/examples/js/.gitignore deleted file mode 100644 index a547bf36d8d..00000000000 --- a/substrate/frame/revive/rpc/examples/js/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/substrate/frame/revive/rpc/examples/js/.prettierrc.json b/substrate/frame/revive/rpc/examples/js/.prettierrc.json deleted file mode 100644 index 123daf08ec5..00000000000 --- a/substrate/frame/revive/rpc/examples/js/.prettierrc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "trailingComma": "es5", - "tabWidth": 4, - "semi": false, - "singleQuote": true -} diff --git a/substrate/frame/revive/rpc/examples/js/.solhint.json b/substrate/frame/revive/rpc/examples/js/.solhint.json deleted file mode 100644 index 83a795a1f4e..00000000000 --- a/substrate/frame/revive/rpc/examples/js/.solhint.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "solhint:recommended", - "rules": { - "compiler-version": ["error", "^0.8.0"], - "gas-custom-errors": "off", - "one-contract-per-file": "off", - "no-empty-blocks": "off" - } -} diff --git a/substrate/frame/revive/rpc/examples/js/abi/Errors.json b/substrate/frame/revive/rpc/examples/js/abi/Errors.json deleted file mode 100644 index 2d8dccc771e..00000000000 --- a/substrate/frame/revive/rpc/examples/js/abi/Errors.json +++ /dev/null @@ -1,106 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "string", - "name": "message", - "type": "string" - } - ], - "name": "CustomError", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bool", - "name": "newState", - "type": "bool" - } - ], - "name": "setState", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "state", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "triggerAssertError", - "outputs": [], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "triggerCustomError", - "outputs": [], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "triggerDivisionByZero", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "triggerOutOfBoundsError", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "triggerRequireError", - "outputs": [], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "triggerRevertError", - "outputs": [], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "valueMatch", - "outputs": [], - "stateMutability": "payable", - "type": "function" - } -] \ No newline at end of file diff --git a/substrate/frame/revive/rpc/examples/js/abi/Errors.ts b/substrate/frame/revive/rpc/examples/js/abi/Errors.ts deleted file mode 100644 index b39567531c6..00000000000 --- a/substrate/frame/revive/rpc/examples/js/abi/Errors.ts +++ /dev/null @@ -1,106 +0,0 @@ -export const ErrorsAbi = [ - { - inputs: [ - { - internalType: "string", - name: "message", - type: "string", - }, - ], - name: "CustomError", - type: "error", - }, - { - inputs: [ - { - internalType: "bool", - name: "newState", - type: "bool", - }, - ], - name: "setState", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "state", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "triggerAssertError", - outputs: [], - stateMutability: "pure", - type: "function", - }, - { - inputs: [], - name: "triggerCustomError", - outputs: [], - stateMutability: "pure", - type: "function", - }, - { - inputs: [], - name: "triggerDivisionByZero", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "pure", - type: "function", - }, - { - inputs: [], - name: "triggerOutOfBoundsError", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "pure", - type: "function", - }, - { - inputs: [], - name: "triggerRequireError", - outputs: [], - stateMutability: "pure", - type: "function", - }, - { - inputs: [], - name: "triggerRevertError", - outputs: [], - stateMutability: "pure", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "value", - type: "uint256", - }, - ], - name: "valueMatch", - outputs: [], - stateMutability: "payable", - type: "function", - }, -] as const; diff --git a/substrate/frame/revive/rpc/examples/js/abi/EventExample.json b/substrate/frame/revive/rpc/examples/js/abi/EventExample.json deleted file mode 100644 index a64c920c406..00000000000 --- a/substrate/frame/revive/rpc/examples/js/abi/EventExample.json +++ /dev/null @@ -1,34 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "message", - "type": "string" - } - ], - "name": "ExampleEvent", - "type": "event" - }, - { - "inputs": [], - "name": "triggerEvent", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] \ No newline at end of file diff --git a/substrate/frame/revive/rpc/examples/js/abi/EventExample.ts b/substrate/frame/revive/rpc/examples/js/abi/EventExample.ts deleted file mode 100644 index efb0d741b48..00000000000 --- a/substrate/frame/revive/rpc/examples/js/abi/EventExample.ts +++ /dev/null @@ -1,34 +0,0 @@ -export const EventExampleAbi = [ - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "sender", - type: "address", - }, - { - indexed: false, - internalType: "uint256", - name: "value", - type: "uint256", - }, - { - indexed: false, - internalType: "string", - name: "message", - type: "string", - }, - ], - name: "ExampleEvent", - type: "event", - }, - { - inputs: [], - name: "triggerEvent", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, -] as const; diff --git a/substrate/frame/revive/rpc/examples/js/abi/Flipper.json b/substrate/frame/revive/rpc/examples/js/abi/Flipper.json deleted file mode 100644 index 4c1b163d294..00000000000 --- a/substrate/frame/revive/rpc/examples/js/abi/Flipper.json +++ /dev/null @@ -1,35 +0,0 @@ -[ - { - "inputs": [], - "name": "flip", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getValue", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "value", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } -] \ No newline at end of file diff --git a/substrate/frame/revive/rpc/examples/js/abi/Flipper.ts b/substrate/frame/revive/rpc/examples/js/abi/Flipper.ts deleted file mode 100644 index d7428beb6aa..00000000000 --- a/substrate/frame/revive/rpc/examples/js/abi/Flipper.ts +++ /dev/null @@ -1,35 +0,0 @@ -export const FlipperAbi = [ - { - inputs: [], - name: "flip", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "getValue", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "value", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool", - }, - ], - stateMutability: "view", - type: "function", - }, -] as const; diff --git a/substrate/frame/revive/rpc/examples/js/abi/FlipperCaller.json b/substrate/frame/revive/rpc/examples/js/abi/FlipperCaller.json deleted file mode 100644 index c4ed4228f47..00000000000 --- a/substrate/frame/revive/rpc/examples/js/abi/FlipperCaller.json +++ /dev/null @@ -1,46 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "_flipperAddress", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "callFlip", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "callGetValue", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "flipperAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } -] \ No newline at end of file diff --git a/substrate/frame/revive/rpc/examples/js/abi/FlipperCaller.ts b/substrate/frame/revive/rpc/examples/js/abi/FlipperCaller.ts deleted file mode 100644 index 2d695886d96..00000000000 --- a/substrate/frame/revive/rpc/examples/js/abi/FlipperCaller.ts +++ /dev/null @@ -1,46 +0,0 @@ -export const FlipperCallerAbi = [ - { - inputs: [ - { - internalType: "address", - name: "_flipperAddress", - type: "address", - }, - ], - stateMutability: "nonpayable", - type: "constructor", - }, - { - inputs: [], - name: "callFlip", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "callGetValue", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "flipperAddress", - outputs: [ - { - internalType: "address", - name: "", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - }, -] as const; diff --git a/substrate/frame/revive/rpc/examples/js/abi/PiggyBank.json b/substrate/frame/revive/rpc/examples/js/abi/PiggyBank.json deleted file mode 100644 index e6655889e21..00000000000 --- a/substrate/frame/revive/rpc/examples/js/abi/PiggyBank.json +++ /dev/null @@ -1,65 +0,0 @@ -[ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "deposit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "getDeposit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "withdrawAmount", - "type": "uint256" - } - ], - "name": "withdraw", - "outputs": [ - { - "internalType": "uint256", - "name": "remainingBal", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } -] \ No newline at end of file diff --git a/substrate/frame/revive/rpc/examples/js/abi/RevertExample.ts b/substrate/frame/revive/rpc/examples/js/abi/RevertExample.ts deleted file mode 100644 index ab483b1811c..00000000000 --- a/substrate/frame/revive/rpc/examples/js/abi/RevertExample.ts +++ /dev/null @@ -1,14 +0,0 @@ -export const RevertExampleAbi = [ - { - inputs: [], - stateMutability: "nonpayable", - type: "constructor", - }, - { - inputs: [], - name: "doRevert", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, -] as const; diff --git a/substrate/frame/revive/rpc/examples/js/abi/piggyBank.ts b/substrate/frame/revive/rpc/examples/js/abi/piggyBank.ts deleted file mode 100644 index a6b8c1b0be5..00000000000 --- a/substrate/frame/revive/rpc/examples/js/abi/piggyBank.ts +++ /dev/null @@ -1,65 +0,0 @@ -export const PiggyBankAbi = [ - { - inputs: [], - stateMutability: "nonpayable", - type: "constructor", - }, - { - inputs: [], - name: "deposit", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "payable", - type: "function", - }, - { - inputs: [], - name: "getDeposit", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "owner", - outputs: [ - { - internalType: "address", - name: "", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "withdrawAmount", - type: "uint256", - }, - ], - name: "withdraw", - outputs: [ - { - internalType: "uint256", - name: "remainingBal", - type: "uint256", - }, - ], - stateMutability: "nonpayable", - type: "function", - }, -] as const; diff --git a/substrate/frame/revive/rpc/examples/js/bun.lockb b/substrate/frame/revive/rpc/examples/js/bun.lockb deleted file mode 100755 index 3b8ad3d048b079b71dffad82cf37fd1952375ce2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72109 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 F{uc>F_R;_V diff --git a/substrate/frame/revive/rpc/examples/js/contracts/Errors.sol b/substrate/frame/revive/rpc/examples/js/contracts/Errors.sol deleted file mode 100644 index abbdba8d32e..00000000000 --- a/substrate/frame/revive/rpc/examples/js/contracts/Errors.sol +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -contract Errors { - bool public state; - - // Payable function that can be used to test insufficient funds errors - function valueMatch(uint256 value) public payable { - require(msg.value == value , "msg.value does not match value"); - } - - function setState(bool newState) public { - state = newState; - } - - // Trigger a require statement failure with a custom error message - function triggerRequireError() public pure { - require(false, "This is a require error"); - } - - // Trigger an assert statement failure - function triggerAssertError() public pure { - assert(false); - } - - // Trigger a revert statement with a custom error message - function triggerRevertError() public pure { - revert("This is a revert error"); - } - - // Trigger a division by zero error - function triggerDivisionByZero() public pure returns (uint256) { - uint256 a = 1; - uint256 b = 0; - return a / b; - } - - // Trigger an out-of-bounds array access - function triggerOutOfBoundsError() public pure returns (uint256) { - uint256[] memory arr = new uint256[](1); - return arr[2]; - } - - // Trigger a custom error - error CustomError(string message); - - function triggerCustomError() public pure { - revert CustomError("This is a custom error"); - } -} - diff --git a/substrate/frame/revive/rpc/examples/js/contracts/Event.sol b/substrate/frame/revive/rpc/examples/js/contracts/Event.sol deleted file mode 100644 index 1e4ce7cf876..00000000000 --- a/substrate/frame/revive/rpc/examples/js/contracts/Event.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -contract EventExample { - event ExampleEvent(address indexed sender, uint256 value, string message); - - function triggerEvent() public { - uint256 value = 12345; - string memory message = "Hello world"; - emit ExampleEvent(msg.sender, value, message); - } -} - diff --git a/substrate/frame/revive/rpc/examples/js/contracts/Flipper.sol b/substrate/frame/revive/rpc/examples/js/contracts/Flipper.sol deleted file mode 100644 index 93b09f08c27..00000000000 --- a/substrate/frame/revive/rpc/examples/js/contracts/Flipper.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -// Flipper - Stores and toggles a boolean value -contract Flipper { - bool public value; - - function flip() external { - value = !value; - } - - function getValue() external view returns (bool) { - return value; - } -} - -// FlipperCaller - Interacts with the Flipper contract -contract FlipperCaller { - // Address of the Flipper contract - address public flipperAddress; - - // Constructor to initialize Flipper's address - constructor(address _flipperAddress) public { - flipperAddress = _flipperAddress; - } - - function callFlip() external { - Flipper(flipperAddress).flip(); - } - - function callGetValue() external view returns (bool) { - return Flipper(flipperAddress).getValue(); - } -} - diff --git a/substrate/frame/revive/rpc/examples/js/contracts/PiggyBank.sol b/substrate/frame/revive/rpc/examples/js/contracts/PiggyBank.sol deleted file mode 100644 index 89be1b2589d..00000000000 --- a/substrate/frame/revive/rpc/examples/js/contracts/PiggyBank.sol +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -contract PiggyBank { - - uint256 private balance; - address public owner; - - constructor() public { - owner = msg.sender; - balance = 0; - } - - function deposit() public payable returns (uint256) { - balance += msg.value; - return balance; - } - - function getDeposit() public view returns (uint256) { - return balance; - } - - function withdraw(uint256 withdrawAmount) public returns (uint256 remainingBal) { - require(msg.sender == owner, "You are not the owner"); - balance -= withdrawAmount; - (bool success, ) = payable(msg.sender).call{value: withdrawAmount}(""); - require(success, "Transfer failed"); - - return balance; - } -} - diff --git a/substrate/frame/revive/rpc/examples/js/contracts/Tracing.sol b/substrate/frame/revive/rpc/examples/js/contracts/Tracing.sol deleted file mode 100644 index c7867fc4a05..00000000000 --- a/substrate/frame/revive/rpc/examples/js/contracts/Tracing.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -contract TracingCaller { - event TraceEvent(uint256 value, string message); - address payable public callee; - - constructor(address payable _callee) public payable { - require(_callee != address(0), "Callee address cannot be zero"); - callee = _callee; - } - - function start(uint256 counter) external { - if (counter == 0) { - return; - } - - uint256 paymentAmount = 0.01 ether; - callee.transfer(paymentAmount); - - emit TraceEvent(counter, "before"); - TracingCallee(callee).consumeGas(counter); - emit TraceEvent(counter, "after"); - - try TracingCallee(callee).failingFunction{value: paymentAmount}() { - } catch { - } - - this.start(counter - 1); - } -} - -contract TracingCallee { - event CalleeCalled(uint256 counter); - - function consumeGas(uint256 counter) external { - // burn some gas - for (uint256 i = 0; i < 10; i++) { - uint256(keccak256(abi.encodePacked(i))); - } - - emit CalleeCalled(counter); - } - - function failingFunction() external payable { - require(false, "This function always fails"); - } - - // Enable contract to receive Ether - receive() external payable {} -} - diff --git a/substrate/frame/revive/rpc/examples/js/evm/.gitkeep b/substrate/frame/revive/rpc/examples/js/evm/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/substrate/frame/revive/rpc/examples/js/index.html b/substrate/frame/revive/rpc/examples/js/index.html deleted file mode 100644 index 97efebe180e..00000000000 --- a/substrate/frame/revive/rpc/examples/js/index.html +++ /dev/null @@ -1,38 +0,0 @@ -<!doctype html> -<html lang="en"> - <head> - <meta charset="UTF-8" /> - <link rel="icon" href="https://polkadot.com/favicon.ico" /> - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <title>MetaMask Playground</title> - <style> - input { - width: 300px; - margin-right: 10px; - } - - button { - display: block; - margin-bottom: 10px; - } - </style> - </head> - <body> - <input - id="transferInput" - type="text" - style="float: left" - placeholder="Destination address" - value="0x3cd0a705a2dc65e5b1e1205896baa2be8a07c6e0" - /> - <button id="transferButton">Transfer coins</button> - - <button id="deployButton">Deploy Contract</button> - - <input id="callInput" type="text" style="float: left" placeholder="Contract address" /> - <button id="callButton">Call Contract</button> - - <button id="deployAndCallButton">Deploy and Call Contract</button> - <script type="module" src="src/web.ts"></script> - </body> -</html> diff --git a/substrate/frame/revive/rpc/examples/js/package-lock.json b/substrate/frame/revive/rpc/examples/js/package-lock.json deleted file mode 100644 index 5c7db0abc93..00000000000 --- a/substrate/frame/revive/rpc/examples/js/package-lock.json +++ /dev/null @@ -1,443 +0,0 @@ -{ - "name": "demo", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "demo", - "version": "0.0.0", - "dependencies": { - "ethers": "^6.13.1", - "solc": "^0.8.28" - }, - "devDependencies": { - "typescript": "^5.5.3", - "vite": "^5.4.8" - } - }, - "node_modules/@adraffy/ens-normalize": { - "version": "1.10.1", - "license": "MIT" - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@noble/curves": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.3.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/hashes": { - "version": "1.3.2", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.24.0", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.24.0", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "18.15.13", - "license": "MIT" - }, - "node_modules/aes-js": { - "version": "4.0.0-beta.5", - "license": "MIT" - }, - "node_modules/command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "license": "MIT" - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/esbuild": { - "version": "0.21.5", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/ethers": { - "version": "6.13.3", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@adraffy/ens-normalize": "1.10.1", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.17.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "license": "MIT" - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/picocolors": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, - "node_modules/postcss": { - "version": "8.4.47", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/rollup": { - "version": "4.24.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.0", - "@rollup/rollup-android-arm64": "4.24.0", - "@rollup/rollup-darwin-arm64": "4.24.0", - "@rollup/rollup-darwin-x64": "4.24.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", - "@rollup/rollup-linux-arm-musleabihf": "4.24.0", - "@rollup/rollup-linux-arm64-gnu": "4.24.0", - "@rollup/rollup-linux-arm64-musl": "4.24.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", - "@rollup/rollup-linux-riscv64-gnu": "4.24.0", - "@rollup/rollup-linux-s390x-gnu": "4.24.0", - "@rollup/rollup-linux-x64-gnu": "4.24.0", - "@rollup/rollup-linux-x64-musl": "4.24.0", - "@rollup/rollup-win32-arm64-msvc": "4.24.0", - "@rollup/rollup-win32-ia32-msvc": "4.24.0", - "@rollup/rollup-win32-x64-msvc": "4.24.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/solc": { - "version": "0.8.28", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.28.tgz", - "integrity": "sha512-AFCiJ+b4RosyyNhnfdVH4ZR1+TxiL91iluPjw0EJslIu4LXGM9NYqi2z5y8TqochC4tcH9QsHfwWhOIC9jPDKA==", - "license": "MIT", - "dependencies": { - "command-exists": "^1.2.8", - "commander": "^8.1.0", - "follow-redirects": "^1.12.1", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "bin": { - "solcjs": "solc.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tslib": { - "version": "2.4.0", - "license": "0BSD" - }, - "node_modules/typescript": { - "version": "5.6.3", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/vite": { - "version": "5.4.8", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/ws": { - "version": "8.17.1", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - } - } -} diff --git a/substrate/frame/revive/rpc/examples/js/package.json b/substrate/frame/revive/rpc/examples/js/package.json deleted file mode 100644 index 5b225711dc5..00000000000 --- a/substrate/frame/revive/rpc/examples/js/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "demo", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "preview": "vite preview", - "prettier": "prettier --write .", - "solhint": "solhint \"contracts/**/*.sol\"" - }, - "dependencies": { - "@parity/revive": "^0.0.9", - "ethers": "^6.13.5", - "solc": "^0.8.28", - "solhint": "^5.0.5", - "viem": "^2.22.4" - }, - "devDependencies": { - "prettier": "^3.4.2", - "@types/bun": "^1.1.15", - "typescript": "^5.7.2", - "vite": "^5.4.11" - } -} diff --git a/substrate/frame/revive/rpc/examples/js/pvm/Errors.polkavm b/substrate/frame/revive/rpc/examples/js/pvm/Errors.polkavm deleted file mode 100644 index 48de6e0aa0c6cc1604008ba4e65c237dd557675b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7274 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 GsQ&}g)MbzW diff --git a/substrate/frame/revive/rpc/examples/js/pvm/EventExample.polkavm b/substrate/frame/revive/rpc/examples/js/pvm/EventExample.polkavm deleted file mode 100644 index cea22e46adcad0dc9bf6375e676dd4923c624c89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2615 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 M#c}`1SXe~=21`UJvj6}9 diff --git a/substrate/frame/revive/rpc/examples/js/pvm/Flipper.polkavm b/substrate/frame/revive/rpc/examples/js/pvm/Flipper.polkavm deleted file mode 100644 index 67f11e68f117309169a317d415ba547020c1f568..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1738 zcmbVMO>7%Q6rNqLGviHL*2Z2>(?7@BMoD@>*&-SWsX<|y394i-DGGurackFZaO;vd zb&}=atQ``l1g@!R+EYaxC5{jR^^mr?v=WC12?-=u;+O-f1VRFFsv2l`wyQ=Fy^xi^ z-JQ2@KELmKZ#Ve%F@(NvK(#}_=w1NbMFA=E8L38g0Coe~0WSgq00VFWa4MWg3`D}I z@W83$`SFcaA{mZstVYgEL}Ss^z(^`N9F9dtqT$5Aa5ObKd~O7yXU?7-O@&V;qBWvw z<VoIzaAGt%kQxr38#x^v9*#!rPI2mhROOxOXoy75Cz9h0A2qtfslzAG1!SUYND>YT zy~2A!Mwk%iM8kH;wp}_YHQGDuFWV#I7bg@Q8}e(qjF9lvC!H&^Bs;w?mtO6A2?DZ? zJ5VP`7QY^Izlz}+8Pl;3i7V6aVB@X>6`g;Y3NbyoQ9;K#2`b`z7bZxQMWG8TNIY!! zAzR3fgNoz`Dh&@{!(CH3WO`mO)z+dXkaMm^R2>I&;tML|{q+#OiF5)4&9?sPDOf%A zAkhs))Q*f9SGw>Z5{uqdDA$b9$Oqg@xmV#{!f`e&W5F7t*1TdZP^(O=#mX$H%;U;5 zHt?G|&H#N-kp=iCZpD;rI)i{iC%QuxI*A*JA+jCnK{jBrgQj}^wx1q{@J=0DaSDmj z6RkUz9~)RglX37;&>cEb;8D@(TQ`-Tk?Hvnnd%BEdREaUm98n^dLZf!P^rt{(T3Dc z0?Q4lHJ#=eT63U}+U7)aNXf>0I*|ooGWJU7X!(y{e&`cJN8k9XbmUiL96fG);j^Av zL!M;~dA2n@BDgV`e#<Kz5xLsW)gV`UxEiS2yoo3>VaAlA_aWH7DUO8fV%E&Y1G-~f z$FdCwtu&<8O@#isFa8t4zY8D6luy%F(ucrI-kL|ebp`-!n4X2vs`?G7>L8@v6Ra4` zjzP%b148ijNzea}uq2Swg`F0-I>y!WT#a*ea0|i)|066=E0*5;JA~c!vFouG`mJ)n zS_~%5<aA|;RLYLzRhYrq8DHhL<H}VZ+#BQp%BEqj8G~VLO2PK~sA|hNcw)uK$`~2@ zcpsyC8QsI^Zbo-8+QjHiMk%9SMpZ^VjJg?po>3R0PDT|*pJQ|fquUwX#%Lp>GNTSg z38R?N21f0SN{reV6&V%GIAx?(`tFBoA^gr{b*#5;@wS@7$GwuP{teiBW6i)z2=SI# z0CczoI^2>$Td=&^`}!~qDb~ETK&-N2Ez+F1j%JpHTpF!cmN0L*1^nLt768{#ao1{Y zc{TE_d54;}74sG`m$G-V@#{6N#;VSSdZE5Yk3#s}^{RYad#`JE@G8p^1dzYgzox^d z%fAOMLQv5>YiKT~IodV1(X)Tfe=yhGQz&WOq*==6OWJ*{jenW%{w*K8kv9%Rj3%eE z&Eb5VG-vWk;aVn>(e{^HIQLI!yw~8pu3}%W*4^v(`<q>5h#V^vx@BItTq<1F+RK-< z?n0?h&_XW%eqPX?{@R-PF{3a9Ic@FV&CHavVo3{K>gE1R)rE&2pXvL&y-kzQzo3ul A@c;k- diff --git a/substrate/frame/revive/rpc/examples/js/pvm/FlipperCaller.polkavm b/substrate/frame/revive/rpc/examples/js/pvm/FlipperCaller.polkavm deleted file mode 100644 index b7b037c1c7b31018fccc0d7bfc0e058d05b68588..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4615 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 D5EZ}k diff --git a/substrate/frame/revive/rpc/examples/js/pvm/PiggyBank.polkavm b/substrate/frame/revive/rpc/examples/js/pvm/PiggyBank.polkavm deleted file mode 100644 index 2fc5e139825aa174d85127c3f29543fd7ebe05fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5090 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 WdcE2KUq64=_gITpjqN#=rT!lU*lM2u diff --git a/substrate/frame/revive/rpc/examples/js/src/balance.ts b/substrate/frame/revive/rpc/examples/js/src/balance.ts deleted file mode 100644 index 1261dcab781..00000000000 --- a/substrate/frame/revive/rpc/examples/js/src/balance.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { walletClient } from './lib.ts' - -const recipient = '0x8D97689C9818892B700e27F316cc3E41e17fBeb9' -try { - console.log(`Recipient balance: ${await walletClient.getBalance({ address: recipient })}`) -} catch (err) { - console.error(err) -} diff --git a/substrate/frame/revive/rpc/examples/js/src/build-contracts.ts b/substrate/frame/revive/rpc/examples/js/src/build-contracts.ts deleted file mode 100644 index 17f5dffd997..00000000000 --- a/substrate/frame/revive/rpc/examples/js/src/build-contracts.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { compile, SolcOutput } from '@parity/revive' -import { format } from 'prettier' -import { parseArgs } from 'node:util' -import solc from 'solc' -import { readdirSync, readFileSync, writeFileSync } from 'fs' -import { basename, join } from 'path' - -type CompileInput = Parameters<typeof compile>[0] - -const { - values: { filter, solcOnly }, -} = parseArgs({ - args: process.argv.slice(2), - options: { - filter: { - type: 'string', - short: 'f', - }, - solcOnly: { - type: 'boolean', - short: 's', - }, - }, -}) - -function evmCompile(sources: CompileInput) { - const input = { - language: 'Solidity', - sources, - settings: { - outputSelection: { - '*': { - '*': ['*'], - }, - }, - }, - } - - return solc.compile(JSON.stringify(input)) -} - -console.log('Compiling contracts...') - -const rootDir = join(__dirname, '..') -const contractsDir = join(rootDir, 'contracts') -const abiDir = join(rootDir, 'abi') -const pvmDir = join(rootDir, 'pvm') -const evmDir = join(rootDir, 'evm') - -const input = readdirSync(contractsDir) - .filter((f) => f.endsWith('.sol')) - .filter((f) => !filter || f.includes(filter)) - -for (const file of input) { - console.log(`🔨 Compiling ${file}...`) - const name = basename(file, '.sol') - const input = { - [name]: { content: readFileSync(join(contractsDir, file), 'utf8') }, - } - - if (!solcOnly) { - console.log('Compiling with revive...') - const reviveOut = await compile(input, { bin: 'resolc' }) - - for (const contracts of Object.values(reviveOut.contracts)) { - for (const [name, contract] of Object.entries(contracts)) { - console.log(`📜 Add PVM contract ${name}`) - writeFileSync( - join(pvmDir, `${name}.polkavm`), - Buffer.from(contract.evm.bytecode.object, 'hex') - ) - } - } - } - - console.log(`Compile with solc ${file}`) - const evmOut = JSON.parse(evmCompile(input)) as SolcOutput - - for (const contracts of Object.values(evmOut.contracts)) { - for (const [name, contract] of Object.entries(contracts)) { - console.log(`📜 Add EVM contract ${name}`) - writeFileSync( - join(evmDir, `${name}.bin`), - Buffer.from(contract.evm.bytecode.object, 'hex') - ) - - const abi = contract.abi - const abiName = `${name}Abi` - writeFileSync(join(abiDir, `${name}.json`), JSON.stringify(abi, null, 2)) - - writeFileSync( - join(abiDir, `${name}.ts`), - await format(`export const ${abiName} = ${JSON.stringify(abi, null, 2)} as const`, { - parser: 'typescript', - }) - ) - } - } -} diff --git a/substrate/frame/revive/rpc/examples/js/src/event.ts b/substrate/frame/revive/rpc/examples/js/src/event.ts deleted file mode 100644 index 2e672a9772f..00000000000 --- a/substrate/frame/revive/rpc/examples/js/src/event.ts +++ /dev/null @@ -1,29 +0,0 @@ -//! Run with bun run script-event.ts - -import { abi } from '../abi/event.ts' -import { assert, getByteCode, walletClient } from './lib.ts' - -const deployHash = await walletClient.deployContract({ - abi, - bytecode: getByteCode('event'), -}) -const deployReceipt = await walletClient.waitForTransactionReceipt({ hash: deployHash }) -const contractAddress = deployReceipt.contractAddress -console.log('Contract deployed:', contractAddress) -assert(contractAddress, 'Contract address should be set') - -const { request } = await walletClient.simulateContract({ - account: walletClient.account, - address: contractAddress, - abi, - functionName: 'triggerEvent', -}) - -const hash = await walletClient.writeContract(request) -const receipt = await walletClient.waitForTransactionReceipt({ hash }) -console.log(`Receipt: ${receipt.status}`) -console.log(`Logs receipt: ${receipt.status}`) - -for (const log of receipt.logs) { - console.log('Event log:', log) -} diff --git a/substrate/frame/revive/rpc/examples/js/src/fixtures/debug_traceCall.json b/substrate/frame/revive/rpc/examples/js/src/fixtures/debug_traceCall.json deleted file mode 100644 index b017c97693d..00000000000 --- a/substrate/frame/revive/rpc/examples/js/src/fixtures/debug_traceCall.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "from": "0x0000000000000000000000000000000000000000", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_addr>", - "input": "0x95805dad0000000000000000000000000000000000000000000000000000000000000002", - "calls": [ - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_callee_addr>", - "input": "0x", - "value": "0x2386f26fc10000", - "type": "CALL" - }, - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_callee_addr>", - "input": "0xa329e8de0000000000000000000000000000000000000000000000000000000000000002", - "logs": [ - { - "address": "<contract_callee_addr>", - "topics": [ - "0xa07465e8ec189714f79f3786a8f616baf78ebd9cb1769bd61f18de45f2567360" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000002", - "position": "0x0" - } - ], - "value": "0x0", - "type": "CALL" - }, - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_callee_addr>", - "input": "0xd1b96663", - "output": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a546869732066756e6374696f6e20616c77617973206661696c73000000000000", - "error": "execution reverted", - "revertReason": "This function always fails", - "value": "0x2386f26fc10000", - "type": "CALL" - }, - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_addr>", - "input": "0x95805dad0000000000000000000000000000000000000000000000000000000000000001", - "calls": [ - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_callee_addr>", - "input": "0x", - "value": "0x2386f26fc10000", - "type": "CALL" - }, - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_callee_addr>", - "input": "0xa329e8de0000000000000000000000000000000000000000000000000000000000000001", - "logs": [ - { - "address": "<contract_callee_addr>", - "topics": [ - "0xa07465e8ec189714f79f3786a8f616baf78ebd9cb1769bd61f18de45f2567360" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "position": "0x0" - } - ], - "value": "0x0", - "type": "CALL" - }, - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_callee_addr>", - "input": "0xd1b96663", - "output": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a546869732066756e6374696f6e20616c77617973206661696c73000000000000", - "error": "execution reverted", - "revertReason": "This function always fails", - "value": "0x2386f26fc10000", - "type": "CALL" - }, - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_addr>", - "input": "0x95805dad0000000000000000000000000000000000000000000000000000000000000000", - "value": "0x0", - "type": "CALL" - } - ], - "logs": [ - { - "address": "<contract_addr>", - "topics": [ - "0x25d760f35a7a9cb2bffd2ea8756913655b3786c642f300a702e2934062763549" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000066265666f72650000000000000000000000000000000000000000000000000000", - "position": "0x1" - }, - { - "address": "<contract_addr>", - "topics": [ - "0x25d760f35a7a9cb2bffd2ea8756913655b3786c642f300a702e2934062763549" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000056166746572000000000000000000000000000000000000000000000000000000", - "position": "0x2" - } - ], - "value": "0x0", - "type": "CALL" - } - ], - "logs": [ - { - "address": "<contract_addr>", - "topics": ["0x25d760f35a7a9cb2bffd2ea8756913655b3786c642f300a702e2934062763549"], - "data": "0x0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000066265666f72650000000000000000000000000000000000000000000000000000", - "position": "0x1" - }, - { - "address": "<contract_addr>", - "topics": ["0x25d760f35a7a9cb2bffd2ea8756913655b3786c642f300a702e2934062763549"], - "data": "0x0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000056166746572000000000000000000000000000000000000000000000000000000", - "position": "0x2" - } - ], - "value": "0x0", - "type": "CALL" -} diff --git a/substrate/frame/revive/rpc/examples/js/src/fixtures/trace_block.json b/substrate/frame/revive/rpc/examples/js/src/fixtures/trace_block.json deleted file mode 100644 index 952c1c5ce08..00000000000 --- a/substrate/frame/revive/rpc/examples/js/src/fixtures/trace_block.json +++ /dev/null @@ -1,152 +0,0 @@ -[ - { - "txHash": "<hash>", - "result": { - "from": "<caller>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_addr>", - "input": "0x95805dad0000000000000000000000000000000000000000000000000000000000000002", - "calls": [ - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_callee_addr>", - "input": "0x", - "value": "0x2386f26fc10000", - "type": "CALL" - }, - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_callee_addr>", - "input": "0xa329e8de0000000000000000000000000000000000000000000000000000000000000002", - "logs": [ - { - "address": "<contract_callee_addr>", - "topics": [ - "0xa07465e8ec189714f79f3786a8f616baf78ebd9cb1769bd61f18de45f2567360" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000002", - "position": "0x0" - } - ], - "value": "0x0", - "type": "CALL" - }, - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_callee_addr>", - "input": "0xd1b96663", - "output": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a546869732066756e6374696f6e20616c77617973206661696c73000000000000", - "error": "execution reverted", - "revertReason": "This function always fails", - "value": "0x2386f26fc10000", - "type": "CALL" - }, - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_addr>", - "input": "0x95805dad0000000000000000000000000000000000000000000000000000000000000001", - "calls": [ - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_callee_addr>", - "input": "0x", - "value": "0x2386f26fc10000", - "type": "CALL" - }, - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_callee_addr>", - "input": "0xa329e8de0000000000000000000000000000000000000000000000000000000000000001", - "logs": [ - { - "address": "<contract_callee_addr>", - "topics": [ - "0xa07465e8ec189714f79f3786a8f616baf78ebd9cb1769bd61f18de45f2567360" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "position": "0x0" - } - ], - "value": "0x0", - "type": "CALL" - }, - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_callee_addr>", - "input": "0xd1b96663", - "output": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a546869732066756e6374696f6e20616c77617973206661696c73000000000000", - "error": "execution reverted", - "revertReason": "This function always fails", - "value": "0x2386f26fc10000", - "type": "CALL" - }, - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_addr>", - "input": "0x95805dad0000000000000000000000000000000000000000000000000000000000000000", - "value": "0x0", - "type": "CALL" - } - ], - "logs": [ - { - "address": "<contract_addr>", - "topics": [ - "0x25d760f35a7a9cb2bffd2ea8756913655b3786c642f300a702e2934062763549" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000066265666f72650000000000000000000000000000000000000000000000000000", - "position": "0x1" - }, - { - "address": "<contract_addr>", - "topics": [ - "0x25d760f35a7a9cb2bffd2ea8756913655b3786c642f300a702e2934062763549" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000056166746572000000000000000000000000000000000000000000000000000000", - "position": "0x2" - } - ], - "value": "0x0", - "type": "CALL" - } - ], - "logs": [ - { - "address": "<contract_addr>", - "topics": [ - "0x25d760f35a7a9cb2bffd2ea8756913655b3786c642f300a702e2934062763549" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000066265666f72650000000000000000000000000000000000000000000000000000", - "position": "0x1" - }, - { - "address": "<contract_addr>", - "topics": [ - "0x25d760f35a7a9cb2bffd2ea8756913655b3786c642f300a702e2934062763549" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000056166746572000000000000000000000000000000000000000000000000000000", - "position": "0x2" - } - ], - "value": "0x0", - "type": "CALL" - } - } -] diff --git a/substrate/frame/revive/rpc/examples/js/src/fixtures/trace_transaction.json b/substrate/frame/revive/rpc/examples/js/src/fixtures/trace_transaction.json deleted file mode 100644 index 9ef9c7c4dfc..00000000000 --- a/substrate/frame/revive/rpc/examples/js/src/fixtures/trace_transaction.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "from": "<caller>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_addr>", - "input": "0x95805dad0000000000000000000000000000000000000000000000000000000000000002", - "calls": [ - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_callee_addr>", - "input": "0x", - "value": "0x2386f26fc10000", - "type": "CALL" - }, - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_callee_addr>", - "input": "0xa329e8de0000000000000000000000000000000000000000000000000000000000000002", - "logs": [ - { - "address": "<contract_callee_addr>", - "topics": [ - "0xa07465e8ec189714f79f3786a8f616baf78ebd9cb1769bd61f18de45f2567360" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000002", - "position": "0x0" - } - ], - "value": "0x0", - "type": "CALL" - }, - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_callee_addr>", - "input": "0xd1b96663", - "output": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a546869732066756e6374696f6e20616c77617973206661696c73000000000000", - "error": "execution reverted", - "revertReason": "This function always fails", - "value": "0x2386f26fc10000", - "type": "CALL" - }, - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_addr>", - "input": "0x95805dad0000000000000000000000000000000000000000000000000000000000000001", - "calls": [ - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_callee_addr>", - "input": "0x", - "value": "0x2386f26fc10000", - "type": "CALL" - }, - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_callee_addr>", - "input": "0xa329e8de0000000000000000000000000000000000000000000000000000000000000001", - "logs": [ - { - "address": "<contract_callee_addr>", - "topics": [ - "0xa07465e8ec189714f79f3786a8f616baf78ebd9cb1769bd61f18de45f2567360" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "position": "0x0" - } - ], - "value": "0x0", - "type": "CALL" - }, - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_callee_addr>", - "input": "0xd1b96663", - "output": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a546869732066756e6374696f6e20616c77617973206661696c73000000000000", - "error": "execution reverted", - "revertReason": "This function always fails", - "value": "0x2386f26fc10000", - "type": "CALL" - }, - { - "from": "<contract_addr>", - "gas": "0x42", - "gasUsed": "0x42", - "to": "<contract_addr>", - "input": "0x95805dad0000000000000000000000000000000000000000000000000000000000000000", - "value": "0x0", - "type": "CALL" - } - ], - "logs": [ - { - "address": "<contract_addr>", - "topics": [ - "0x25d760f35a7a9cb2bffd2ea8756913655b3786c642f300a702e2934062763549" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000066265666f72650000000000000000000000000000000000000000000000000000", - "position": "0x1" - }, - { - "address": "<contract_addr>", - "topics": [ - "0x25d760f35a7a9cb2bffd2ea8756913655b3786c642f300a702e2934062763549" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000056166746572000000000000000000000000000000000000000000000000000000", - "position": "0x2" - } - ], - "value": "0x0", - "type": "CALL" - } - ], - "logs": [ - { - "address": "<contract_addr>", - "topics": ["0x25d760f35a7a9cb2bffd2ea8756913655b3786c642f300a702e2934062763549"], - "data": "0x0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000066265666f72650000000000000000000000000000000000000000000000000000", - "position": "0x1" - }, - { - "address": "<contract_addr>", - "topics": ["0x25d760f35a7a9cb2bffd2ea8756913655b3786c642f300a702e2934062763549"], - "data": "0x0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000056166746572000000000000000000000000000000000000000000000000000000", - "position": "0x2" - } - ], - "value": "0x0", - "type": "CALL" -} diff --git a/substrate/frame/revive/rpc/examples/js/src/geth-diff.test.ts b/substrate/frame/revive/rpc/examples/js/src/geth-diff.test.ts deleted file mode 100644 index 33e38fccd8a..00000000000 --- a/substrate/frame/revive/rpc/examples/js/src/geth-diff.test.ts +++ /dev/null @@ -1,531 +0,0 @@ -import { - jsonRpcErrors, - createEnv, - getByteCode, - killProcessOnPort, - waitForHealth, - polkadotSdkPath, - visit, -} from './util.ts' -import { afterAll, afterEach, describe, expect, test } from 'bun:test' -import { encodeFunctionData, Hex, parseEther, decodeEventLog } from 'viem' -import { ErrorsAbi } from '../abi/Errors' -import { EventExampleAbi } from '../abi/EventExample' -import { TracingCallerAbi } from '../abi/TracingCaller' -import { TracingCalleeAbi } from '../abi/TracingCallee' -import { Subprocess, spawn } from 'bun' -import { fail } from 'node:assert' - -const procs: Subprocess[] = [] -if (process.env.START_GETH) { - process.env.USE_GETH = 'true' - procs.push( - // Run geth on port 8546 - await (async () => { - killProcessOnPort(8546) - console.log('Starting geth') - const proc = spawn( - 'geth --http --http.api web3,eth,debug,personal,net --http.port 8546 --dev --verbosity 0'.split( - ' ' - ), - { stdout: Bun.file('/tmp/geth.out.log'), stderr: Bun.file('/tmp/geth.err.log') } - ) - - await waitForHealth('http://localhost:8546').catch() - return proc - })() - ) -} - -if (process.env.START_SUBSTRATE_NODE) { - procs.push( - //Run the substate node - (() => { - killProcessOnPort(9944) - console.log('Starting substrate node') - return spawn( - [ - './target/debug/substrate-node', - '--dev', - '-l=error,evm=debug,sc_rpc_server=info,runtime::revive=debug', - ], - { - stdout: Bun.file('/tmp/substrate-node.out.log'), - stderr: Bun.file('/tmp/substrate-node.err.log'), - cwd: polkadotSdkPath, - } - ) - })() - ) -} - -if (process.env.START_ETH_RPC) { - process.env.USE_ETH_RPC = 'true' - // Run eth-rpc on 8545 - procs.push( - await (async () => { - killProcessOnPort(8545) - console.log('Starting eth-rpc') - const proc = spawn( - [ - './target/debug/eth-rpc', - '--dev', - '--node-rpc-url=ws://localhost:9944', - '-l=rpc-metrics=debug,eth-rpc=debug', - ], - { - stdout: Bun.file('/tmp/eth-rpc.out.log'), - stderr: Bun.file('/tmp/eth-rpc.err.log'), - cwd: polkadotSdkPath, - } - ) - await waitForHealth('http://localhost:8545').catch() - return proc - })() - ) -} - -afterEach(() => { - jsonRpcErrors.length = 0 -}) - -afterAll(async () => { - procs.forEach((proc) => proc.kill()) -}) - -const envs = await Promise.all([ - ...(process.env.USE_GETH ? [createEnv('geth')] : []), - ...(process.env.USE_ETH_RPC ? [createEnv('eth-rpc')] : []), -]) - -for (const env of envs) { - describe(env.serverWallet.chain.name, () => { - const getErrorTesterAddr = (() => { - let contractAddress: Hex = '0x' - return async () => { - if (contractAddress !== '0x') { - return contractAddress - } - const hash = await env.serverWallet.deployContract({ - abi: ErrorsAbi, - bytecode: getByteCode('Errors', env.evm), - }) - const deployReceipt = await env.serverWallet.waitForTransactionReceipt({ hash }) - contractAddress = deployReceipt.contractAddress! - return contractAddress - } - })() - - const getEventExampleAddr = (() => { - let contractAddress: Hex = '0x' - return async () => { - if (contractAddress !== '0x') { - return contractAddress - } - const hash = await env.serverWallet.deployContract({ - abi: EventExampleAbi, - bytecode: getByteCode('EventExample', env.evm), - }) - const deployReceipt = await env.serverWallet.waitForTransactionReceipt({ hash }) - contractAddress = deployReceipt.contractAddress! - return contractAddress - } - })() - - const getTracingExampleAddrs = (() => { - let callerAddr: Hex = '0x' - let calleeAddr: Hex = '0x' - return async () => { - if (callerAddr !== '0x') { - return [callerAddr, calleeAddr] - } - calleeAddr = await (async () => { - const hash = await env.serverWallet.deployContract({ - abi: TracingCalleeAbi, - bytecode: getByteCode('TracingCallee', env.evm), - }) - const receipt = await env.serverWallet.waitForTransactionReceipt({ - hash, - }) - return receipt.contractAddress! - })() - - callerAddr = await (async () => { - const hash = await env.serverWallet.deployContract({ - abi: TracingCallerAbi, - args: [calleeAddr], - bytecode: getByteCode('TracingCaller', env.evm), - value: parseEther('10'), - }) - const receipt = await env.serverWallet.waitForTransactionReceipt({ - hash, - }) - return receipt.contractAddress! - })() - - return [callerAddr, calleeAddr] - } - })() - - test('triggerAssertError', async () => { - try { - await env.accountWallet.readContract({ - address: await getErrorTesterAddr(), - abi: ErrorsAbi, - functionName: 'triggerAssertError', - }) - fail('Expect call to fail') - } catch (err) { - const lastJsonRpcError = jsonRpcErrors.pop() - expect(lastJsonRpcError?.code).toBe(3) - expect(lastJsonRpcError?.data).toBe( - '0x4e487b710000000000000000000000000000000000000000000000000000000000000001' - ) - expect(lastJsonRpcError?.message).toBeOneOf([ - 'execution reverted: assert(false)', - 'execution reverted: panic: assertion failed (0x01)', - ]) - } - }) - - test('triggerRevertError', async () => { - try { - await env.accountWallet.readContract({ - address: await getErrorTesterAddr(), - abi: ErrorsAbi, - functionName: 'triggerRevertError', - }) - fail('Expect call to fail') - } catch (err) { - const lastJsonRpcError = jsonRpcErrors.pop() - expect(lastJsonRpcError?.code).toBe(3) - expect(lastJsonRpcError?.message).toBeOneOf([ - 'execution reverted: This is a revert error', - 'execution reverted: revert: This is a revert error', - ]) - expect(lastJsonRpcError?.data).toBe( - '0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001654686973206973206120726576657274206572726f7200000000000000000000' - ) - } - }) - - test('triggerDivisionByZero', async () => { - try { - await env.accountWallet.readContract({ - address: await getErrorTesterAddr(), - abi: ErrorsAbi, - functionName: 'triggerDivisionByZero', - }) - expect.assertions(3) - } catch (err) { - const lastJsonRpcError = jsonRpcErrors.pop() - expect(lastJsonRpcError?.code).toBe(3) - expect(lastJsonRpcError?.data).toBe( - '0x4e487b710000000000000000000000000000000000000000000000000000000000000012' - ) - expect(lastJsonRpcError?.message).toBeOneOf([ - 'execution reverted: division or modulo by zero', - 'execution reverted: panic: division or modulo by zero (0x12)', - ]) - } - }) - - test('triggerOutOfBoundsError', async () => { - try { - await env.accountWallet.readContract({ - address: await getErrorTesterAddr(), - abi: ErrorsAbi, - functionName: 'triggerOutOfBoundsError', - }) - fail('Expect call to fail') - } catch (err) { - const lastJsonRpcError = jsonRpcErrors.pop() - expect(lastJsonRpcError?.code).toBe(3) - expect(lastJsonRpcError?.data).toBe( - '0x4e487b710000000000000000000000000000000000000000000000000000000000000032' - ) - expect(lastJsonRpcError?.message).toBeOneOf([ - 'execution reverted: out-of-bounds access of an array or bytesN', - 'execution reverted: panic: array out-of-bounds access (0x32)', - ]) - } - }) - - test('triggerCustomError', async () => { - try { - await env.accountWallet.readContract({ - address: await getErrorTesterAddr(), - abi: ErrorsAbi, - functionName: 'triggerCustomError', - }) - fail('Expect call to fail') - } catch (err) { - const lastJsonRpcError = jsonRpcErrors.pop() - expect(lastJsonRpcError?.code).toBe(3) - expect(lastJsonRpcError?.data).toBe( - '0x8d6ea8be0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001654686973206973206120637573746f6d206572726f7200000000000000000000' - ) - expect(lastJsonRpcError?.message).toBe('execution reverted') - } - }) - - test('eth_call (not enough funds)', async () => { - try { - await env.emptyWallet.simulateContract({ - address: await getErrorTesterAddr(), - abi: ErrorsAbi, - functionName: 'valueMatch', - value: parseEther('10'), - args: [parseEther('10')], - }) - fail('Expect call to fail') - } catch (err) { - const lastJsonRpcError = jsonRpcErrors.pop() - expect(lastJsonRpcError?.code).toBe(-32000) - expect(lastJsonRpcError?.message).toInclude('insufficient funds') - expect(lastJsonRpcError?.data).toBeUndefined() - } - }) - - test('eth_call transfer (not enough funds)', async () => { - const value = parseEther('10') - const balance = await env.emptyWallet.getBalance(env.emptyWallet.account) - expect(balance, 'Balance should be less than 10').toBeLessThan(value) - try { - await env.emptyWallet.sendTransaction({ - to: '0x75E480dB528101a381Ce68544611C169Ad7EB342', - value, - }) - fail('Expect call to fail') - } catch (err) { - const lastJsonRpcError = jsonRpcErrors.pop() - expect(lastJsonRpcError?.code).toBe(-32000) - expect(lastJsonRpcError?.message).toInclude('insufficient funds') - expect(lastJsonRpcError?.data).toBeUndefined() - } - }) - - test('eth_estimate (not enough funds)', async () => { - try { - await env.emptyWallet.estimateContractGas({ - address: await getErrorTesterAddr(), - abi: ErrorsAbi, - functionName: 'valueMatch', - value: parseEther('10'), - args: [parseEther('10')], - }) - fail('Expect call to fail') - } catch (err) { - const lastJsonRpcError = jsonRpcErrors.pop() - expect(lastJsonRpcError?.code).toBe(-32000) - expect(lastJsonRpcError?.message).toInclude('insufficient funds') - expect(lastJsonRpcError?.data).toBeUndefined() - } - }) - - test('eth_estimate call caller (not enough funds)', async () => { - try { - await env.emptyWallet.estimateContractGas({ - address: await getErrorTesterAddr(), - abi: ErrorsAbi, - functionName: 'valueMatch', - value: parseEther('10'), - args: [parseEther('10')], - }) - fail('Expect call to fail') - } catch (err) { - const lastJsonRpcError = jsonRpcErrors.pop() - expect(lastJsonRpcError?.code).toBe(-32000) - expect(lastJsonRpcError?.message).toInclude('insufficient funds') - expect(lastJsonRpcError?.data).toBeUndefined() - } - }) - - test('eth_estimate (revert)', async () => { - try { - await env.serverWallet.estimateContractGas({ - address: await getErrorTesterAddr(), - abi: ErrorsAbi, - functionName: 'valueMatch', - value: parseEther('11'), - args: [parseEther('10')], - }) - fail('Expect call to fail') - } catch (err) { - const lastJsonRpcError = jsonRpcErrors.pop() - expect(lastJsonRpcError?.code).toBe(3) - expect(lastJsonRpcError?.message).toBeOneOf([ - 'execution reverted: msg.value does not match value', - 'execution reverted: revert: msg.value does not match value', - ]) - expect(lastJsonRpcError?.data).toBe( - '0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001e6d73672e76616c756520646f6573206e6f74206d617463682076616c75650000' - ) - } - }) - - test('eth_get_balance (no account)', async () => { - const balance = await env.serverWallet.getBalance({ - address: '0x0000000000000000000000000000000000000123', - }) - expect(balance).toBe(0n) - }) - - test('eth_estimate (not enough funds to cover gas specified)', async () => { - let balance = await env.serverWallet.getBalance(env.emptyWallet.account) - expect(balance).toBe(0n) - try { - await env.emptyWallet.estimateContractGas({ - address: await getErrorTesterAddr(), - abi: ErrorsAbi, - functionName: 'setState', - args: [true], - }) - fail('Expect call to fail') - } catch (err) { - const lastJsonRpcError = jsonRpcErrors.pop() - expect(lastJsonRpcError?.code).toBe(-32000) - expect(lastJsonRpcError?.message).toInclude('insufficient funds') - expect(lastJsonRpcError?.data).toBeUndefined() - } - }) - - test('eth_estimate (no gas specified)', async () => { - let balance = await env.serverWallet.getBalance(env.emptyWallet.account) - expect(balance).toBe(0n) - - const data = encodeFunctionData({ - abi: ErrorsAbi, - functionName: 'setState', - args: [true], - }) - - await env.emptyWallet.request({ - method: 'eth_estimateGas', - params: [ - { - data, - from: env.emptyWallet.account.address, - to: await getErrorTesterAddr(), - }, - ], - }) - }) - - test('logs', async () => { - let address = await getEventExampleAddr() - let { request } = await env.serverWallet.simulateContract({ - address, - abi: EventExampleAbi, - functionName: 'triggerEvent', - }) - - let hash = await env.serverWallet.writeContract(request) - let receipt = await env.serverWallet.waitForTransactionReceipt({ hash }) - const logs = await env.serverWallet.getLogs({ - address, - blockHash: receipt.blockHash, - }) - expect(logs).toHaveLength(1) - expect(logs[0]).toMatchObject({ - address, - data: '0x00000000000000000000000000000000000000000000000000000000000030390000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000b48656c6c6f20776f726c64000000000000000000000000000000000000000000', - transactionHash: hash, - }) - - expect( - decodeEventLog({ - abi: EventExampleAbi, - data: logs[0].data, - topics: logs[0].topics, - }) - ).toEqual({ - eventName: 'ExampleEvent', - args: { - sender: env.serverWallet.account.address, - value: 12345n, - message: 'Hello world', - }, - }) - }) - - test('tracing', async () => { - let [callerAddr, calleeAddr] = await getTracingExampleAddrs() - - const receipt = await (async () => { - const { request } = await env.serverWallet.simulateContract({ - address: callerAddr, - abi: TracingCallerAbi, - functionName: 'start', - args: [2n], - }) - const hash = await env.serverWallet.writeContract(request) - return await env.serverWallet.waitForTransactionReceipt({ hash }) - })() - - const visitor: Parameters<typeof visit>[1] = (key, value) => { - switch (key) { - case 'address': - case 'from': - case 'to': { - if (value === callerAddr) { - return '<contract_addr>' - } else if (value === calleeAddr) { - return '<contract_callee_addr>' - } else if (value == env.serverWallet.account.address.toLowerCase()) { - return '<caller>' - } - - return value - } - case 'revertReason': - return value.startsWith('revert: ') ? value.slice('revert: '.length) : value - - case 'gas': - case 'gasUsed': { - return '0x42' - } - case 'txHash': { - return '<hash>' - } - default: { - return value - } - } - } - - // test debug_traceTransaction - { - const fixture = await Bun.file('./src/fixtures/trace_transaction.json').json() - const res = await env.debugClient.traceTransaction(receipt.transactionHash, { - withLog: true, - }) - expect(visit(res, visitor)).toEqual(fixture) - } - - // test debug_traceBlock - { - const res = await env.debugClient.traceBlock(receipt.blockNumber, { withLog: true }) - const fixture = await Bun.file('./src/fixtures/trace_block.json').json() - expect(visit(res, visitor)).toEqual(fixture) - } - - // test debug_traceCall - { - const fixture = await Bun.file('./src/fixtures/debug_traceCall.json').json() - const res = await env.debugClient.traceCall( - { - to: callerAddr, - data: encodeFunctionData({ - abi: TracingCallerAbi, - functionName: 'start', - args: [2n], - }), - }, - { withLog: true } - ) - expect(visit(res, visitor)).toEqual(fixture) - } - }) - }) -} diff --git a/substrate/frame/revive/rpc/examples/js/src/lib.ts b/substrate/frame/revive/rpc/examples/js/src/lib.ts deleted file mode 100644 index 1470f492e34..00000000000 --- a/substrate/frame/revive/rpc/examples/js/src/lib.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { readFileSync } from 'node:fs' -import { spawn } from 'node:child_process' -import { parseArgs } from 'node:util' -import { createWalletClient, defineChain, Hex, http, parseEther, publicActions } from 'viem' -import { privateKeyToAccount } from 'viem/accounts' - -const { - values: { geth, proxy, westend, endowment, ['private-key']: privateKey }, -} = parseArgs({ - args: process.argv.slice(2), - options: { - ['private-key']: { - type: 'string', - short: 'k', - }, - endowment: { - type: 'string', - short: 'e', - }, - proxy: { - type: 'boolean', - }, - geth: { - type: 'boolean', - }, - westend: { - type: 'boolean', - }, - }, -}) - -if (geth) { - console.log('Testing with Geth') - const child = spawn( - 'geth', - [ - '--http', - '--http.api', - 'web3,eth,debug,personal,net', - '--http.port', - process.env.GETH_PORT ?? '8546', - '--dev', - '--verbosity', - '0', - ], - { stdio: 'inherit' } - ) - - process.on('exit', () => child.kill()) - child.unref() - await new Promise((resolve) => setTimeout(resolve, 500)) -} -const rpcUrl = proxy - ? 'http://localhost:8080' - : westend - ? 'https://westend-asset-hub-eth-rpc.polkadot.io' - : geth - ? 'http://localhost:8546' - : 'http://localhost:8545' - -export const chain = defineChain({ - id: geth ? 1337 : 420420420, - name: 'Asset Hub Westend', - network: 'asset-hub', - nativeCurrency: { - name: 'Westie', - symbol: 'WST', - decimals: 18, - }, - rpcUrls: { - default: { - http: [rpcUrl], - }, - }, - testnet: true, -}) - -const wallet = createWalletClient({ - transport: http(), - chain, -}) -const [account] = await wallet.getAddresses() -export const serverWalletClient = createWalletClient({ - account, - transport: http(), - chain, -}) - -export const walletClient = await (async () => { - if (privateKey) { - const account = privateKeyToAccount(`0x${privateKey}`) - console.log(`Wallet address ${account.address}`) - - const wallet = createWalletClient({ - account, - transport: http(), - chain, - }) - - if (endowment) { - await serverWalletClient.sendTransaction({ - to: account.address, - value: parseEther(endowment), - }) - console.log(`Endowed address ${account.address} with: ${endowment}`) - } - - return wallet.extend(publicActions) - } else { - return serverWalletClient.extend(publicActions) - } -})() - -/** - * Get one of the pre-built contracts - * @param name - the contract name - */ -export function getByteCode(name: string): Hex { - const bytecode = geth ? readFileSync(`evm/${name}.bin`) : readFileSync(`pvm/${name}.polkavm`) - return `0x${Buffer.from(bytecode).toString('hex')}` -} - -export function assert(condition: any, message: string): asserts condition { - if (!condition) { - throw new Error(message) - } -} diff --git a/substrate/frame/revive/rpc/examples/js/src/piggy-bank.ts b/substrate/frame/revive/rpc/examples/js/src/piggy-bank.ts deleted file mode 100644 index 4983a6f3b30..00000000000 --- a/substrate/frame/revive/rpc/examples/js/src/piggy-bank.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { assert, getByteCode, walletClient } from './lib.ts' -import { PiggyBankAbi } from '../abi/piggyBank.ts' -import { parseEther } from 'viem' - -const hash = await walletClient.deployContract({ - abi: PiggyBankAbi, - bytecode: getByteCode('PiggyBank'), -}) -const deployReceipt = await walletClient.waitForTransactionReceipt({ hash }) -const contractAddress = deployReceipt.contractAddress -console.log('Contract deployed:', contractAddress) -assert(contractAddress, 'Contract address should be set') - -// Deposit 10 WST -{ - const result = await walletClient.estimateContractGas({ - account: walletClient.account, - address: contractAddress, - abi: PiggyBankAbi, - functionName: 'deposit', - value: parseEther('10'), - }) - - console.log(`Gas estimate: ${result}`) - - const { request } = await walletClient.simulateContract({ - account: walletClient.account, - address: contractAddress, - abi: PiggyBankAbi, - functionName: 'deposit', - value: parseEther('10'), - }) - - const hash = await walletClient.writeContract(request) - const receipt = await walletClient.waitForTransactionReceipt({ hash }) - console.log(`Deposit receipt: ${receipt.status}`) -} - -// Withdraw 5 WST -{ - const { request } = await walletClient.simulateContract({ - account: walletClient.account, - address: contractAddress, - abi: PiggyBankAbi, - functionName: 'withdraw', - args: [parseEther('5')], - }) - - const hash = await walletClient.writeContract(request) - const receipt = await walletClient.waitForTransactionReceipt({ hash }) - console.log(`Withdraw receipt: ${receipt.status}`) - - // Check remaining balance - const balance = await walletClient.readContract({ - address: contractAddress, - abi: PiggyBankAbi, - functionName: 'getDeposit', - }) - - console.log(`Get deposit: ${balance}`) - console.log( - `Get contract balance: ${await walletClient.getBalance({ address: contractAddress })}` - ) -} diff --git a/substrate/frame/revive/rpc/examples/js/src/solc.d.ts b/substrate/frame/revive/rpc/examples/js/src/solc.d.ts deleted file mode 100644 index 813829f40b6..00000000000 --- a/substrate/frame/revive/rpc/examples/js/src/solc.d.ts +++ /dev/null @@ -1,83 +0,0 @@ -declare module 'solc' { - // Basic types for input/output handling - export interface CompileInput { - language: string - sources: { - [fileName: string]: { - content: string - } - } - settings?: { - optimizer?: { - enabled: boolean - runs: number - } - outputSelection: { - [fileName: string]: { - [contractName: string]: string[] - } - } - } - } - - export interface CompileOutput { - errors?: Array<{ - component: string - errorCode: string - formattedMessage: string - message: string - severity: string - sourceLocation?: { - file: string - start: number - end: number - } - type: string - }> - sources?: { - [fileName: string]: { - id: number - ast: object - } - } - contracts?: { - [fileName: string]: { - [contractName: string]: { - abi: object[] - evm: { - bytecode: { - object: string - sourceMap: string - linkReferences: { - [fileName: string]: { - [libraryName: string]: Array<{ - start: number - length: number - }> - } - } - } - deployedBytecode: { - object: string - sourceMap: string - linkReferences: { - [fileName: string]: { - [libraryName: string]: Array<{ - start: number - length: number - }> - } - } - } - } - } - } - } - } - - // Main exported functions - export function compile( - input: string | CompileInput, - options?: { import: (path: string) => { contents: string } } - ): string -} diff --git a/substrate/frame/revive/rpc/examples/js/src/spammer.ts b/substrate/frame/revive/rpc/examples/js/src/spammer.ts deleted file mode 100644 index 682bfcabb26..00000000000 --- a/substrate/frame/revive/rpc/examples/js/src/spammer.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { spawn } from 'bun' -import { - createEnv, - getByteCode, - killProcessOnPort, - polkadotSdkPath, - wait, - waitForHealth, -} from './util' -import { FlipperAbi } from '../abi/Flipper' - -if (process.env.START_SUBSTRATE_NODE) { - //Run the substate node - console.log('🚀 Start substrate-node...') - killProcessOnPort(9944) - spawn( - [ - './target/debug/substrate-node', - '--dev', - '-l=error,evm=debug,sc_rpc_server=info,runtime::revive=debug', - ], - { - stdout: Bun.file('/tmp/substrate-node.out.log'), - stderr: Bun.file('/tmp/substrate-node.err.log'), - cwd: polkadotSdkPath, - } - ) -} - -// Run eth-rpc on 8545 -if (process.env.START_ETH_RPC) { - console.log('🚀 Start eth-rpc...') - killProcessOnPort(8545) - spawn( - [ - './target/debug/eth-rpc', - '--dev', - '--node-rpc-url=ws://localhost:9944', - '-l=rpc-metrics=debug,eth-rpc=debug', - ], - { - stdout: Bun.file('/tmp/eth-rpc.out.log'), - stderr: Bun.file('/tmp/eth-rpc.err.log'), - cwd: polkadotSdkPath, - } - ) -} - -await waitForHealth('http://localhost:8545').catch() -const env = await createEnv('eth-rpc') -const wallet = env.accountWallet - -console.log('🚀 Deploy flipper...') -const hash = await wallet.deployContract({ - abi: FlipperAbi, - bytecode: getByteCode('Flipper'), -}) - -const deployReceipt = await wallet.waitForTransactionReceipt({ hash }) -if (!deployReceipt.contractAddress) throw new Error('Contract address should be set') -const flipperAddr = deployReceipt.contractAddress - -let nonce = await wallet.getTransactionCount(wallet.account) - -console.log('🔄 Starting loop...') -console.log('Starting nonce:', nonce) -try { - while (true) { - console.log(`Call flip (nonce: ${nonce})...`) - const { request } = await wallet.simulateContract({ - account: wallet.account, - address: flipperAddr, - abi: FlipperAbi, - functionName: 'flip', - nonce, - }) - - const hash = await wallet.writeContract(request) - console.time(hash) - wallet.waitForTransactionReceipt({ hash }).then((receipt) => { - console.timeEnd(hash) - console.log('-----------------------------------') - console.log(`status: ${receipt.status ? '✅' : 'âŒ'}`) - console.log(`block: ${receipt.blockNumber} - hash: ${receipt.blockHash}`) - console.log(`tx: ${hash}`) - console.log('-----------------------------------') - }) - await wait(1_000) - nonce++ - } -} catch (err) { - console.error('Failed with error:', err) -} diff --git a/substrate/frame/revive/rpc/examples/js/src/transfer.ts b/substrate/frame/revive/rpc/examples/js/src/transfer.ts deleted file mode 100644 index 711e4eb8937..00000000000 --- a/substrate/frame/revive/rpc/examples/js/src/transfer.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { parseEther } from 'viem' -import { walletClient } from './lib.ts' - -const recipient = '0x75E480dB528101a381Ce68544611C169Ad7EB342' -try { - console.log(`Signer balance: ${await walletClient.getBalance(walletClient.account)}`) - console.log(`Recipient balance: ${await walletClient.getBalance({ address: recipient })}`) - - let resp = await walletClient.sendTransaction({ - to: recipient, - value: parseEther('1.0'), - }) - console.log(`Transaction hash: ${resp}`) - console.log(`Sent: ${parseEther('1.0')}`) - console.log(`Signer balance: ${await walletClient.getBalance(walletClient.account)}`) - console.log(`Recipient balance: ${await walletClient.getBalance({ address: recipient })}`) -} catch (err) { - console.error(err) -} diff --git a/substrate/frame/revive/rpc/examples/js/src/util.ts b/substrate/frame/revive/rpc/examples/js/src/util.ts deleted file mode 100644 index cf5c08d2561..00000000000 --- a/substrate/frame/revive/rpc/examples/js/src/util.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { spawnSync } from 'bun' -import { resolve } from 'path' -import { readFileSync } from 'fs' -import { - CallParameters, - createClient, - createWalletClient, - defineChain, - formatTransactionRequest, - type Hex, - hexToNumber, - http, - publicActions, -} from 'viem' -import { privateKeyToAccount, nonceManager } from 'viem/accounts' - -export function getByteCode(name: string, evm: boolean = false): Hex { - const bytecode = evm ? readFileSync(`evm/${name}.bin`) : readFileSync(`pvm/${name}.polkavm`) - return `0x${Buffer.from(bytecode).toString('hex')}` -} - -export type JsonRpcError = { - code: number - message: string - data: Hex -} - -export const polkadotSdkPath = resolve(__dirname, '../../../../../../..') - -export function killProcessOnPort(port: number) { - // Check which process is using the specified port - const result = spawnSync(['lsof', '-ti', `:${port}`]) - const output = result.stdout.toString().trim() - - if (output) { - console.log(`Port ${port} is in use. Killing process...`) - const pids = output.split('\n') - - // Kill each process using the port - for (const pid of pids) { - spawnSync(['kill', '-9', pid]) - console.log(`Killed process with PID: ${pid}`) - } - } -} - -export let jsonRpcErrors: JsonRpcError[] = [] -export async function createEnv(name: 'geth' | 'eth-rpc') { - const gethPort = process.env.GETH_PORT || '8546' - const ethRpcPort = process.env.ETH_RPC_PORT || '8545' - const url = `http://localhost:${name == 'geth' ? gethPort : ethRpcPort}` - - let id = await (async () => { - const resp = await fetch(url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ jsonrpc: '2.0', method: 'eth_chainId', id: 1 }), - }) - let { result } = await resp.json() - return hexToNumber(result) - })() - - const chain = defineChain({ - id, - name, - nativeCurrency: { - name: 'Westie', - symbol: 'WST', - decimals: 18, - }, - rpcUrls: { - default: { - http: [url], - }, - }, - testnet: true, - }) - - const transport = http(url, { - onFetchResponse: async (response) => { - const raw = await response.clone().json() - if (raw.error) { - jsonRpcErrors.push(raw.error as JsonRpcError) - } - }, - }) - - const wallet = createWalletClient({ - transport, - chain, - }) - - const [account] = await wallet.getAddresses() - const serverWallet = createWalletClient({ - account, - transport, - chain, - }).extend(publicActions) - - const accountWallet = createWalletClient({ - account: privateKeyToAccount( - '0x5fb92d6e98884f76de468fa3f6278f8807c48bebc13595d45af5bdc4da702133', - { nonceManager } - ), - transport, - chain, - }).extend(publicActions) - - const emptyWallet = createWalletClient({ - account: privateKeyToAccount( - '0x4450c571bae82da0528ecf76fcf7079e12ecc46dc873c9cacb6db8b75ed22f41', - { nonceManager } - ), - transport, - chain, - }).extend(publicActions) - - const debugClient = createClient({ - chain, - transport, - }).extend((client) => ({ - async traceTransaction(txHash: Hex, tracerConfig: { withLog: boolean }) { - return client.request({ - method: 'debug_traceTransaction' as any, - params: [txHash, { tracer: 'callTracer', tracerConfig } as any], - }) - }, - async traceBlock(blockNumber: bigint, tracerConfig: { withLog: boolean }) { - return client.request({ - method: 'debug_traceBlockByNumber' as any, - params: [ - `0x${blockNumber.toString(16)}`, - { tracer: 'callTracer', tracerConfig } as any, - ], - }) - }, - - async traceCall(args: CallParameters, tracerConfig: { withLog: boolean }) { - return client.request({ - method: 'debug_traceCall' as any, - params: [ - formatTransactionRequest(args), - 'latest', - { tracer: 'callTracer', tracerConfig } as any, - ], - }) - }, - })) - - return { debugClient, emptyWallet, serverWallet, accountWallet, evm: name == 'geth' } -} - -export type Env = Awaited<ReturnType<typeof createEnv>> - -export function wait(ms: number) { - return new Promise((resolve) => setTimeout(resolve, ms)) -} - -export function timeout(ms: number) { - return new Promise((_resolve, reject) => setTimeout(() => reject(new Error('timeout hit')), ms)) -} - -// wait for http request to return 200 -export function waitForHealth(url: string) { - return new Promise<void>((resolve, reject) => { - const start = Date.now() - const interval = setInterval(async () => { - try { - const res = await fetch(url, { - method: 'POST', - headers: { - 'content-type': 'application/json', - }, - body: JSON.stringify({ - jsonrpc: '2.0', - method: 'eth_syncing', - params: [], - id: 1, - }), - }) - - if (res.status !== 200) { - return - } - - clearInterval(interval) - resolve() - } catch (_err) { - const elapsed = Date.now() - start - if (elapsed > 30_000) { - clearInterval(interval) - reject(new Error('hit timeout')) - } - } - }, 1000) - }) -} - -export function visit(obj: any, callback: (key: string, value: any) => any): any { - if (Array.isArray(obj)) { - return obj.map((item) => visit(item, callback)) - } else if (typeof obj === 'object' && obj !== null) { - return Object.keys(obj).reduce((acc, key) => { - acc[key] = visit(callback(key, obj[key]), callback) - return acc - }, {} as any) - } else { - return obj - } -} diff --git a/substrate/frame/revive/rpc/examples/js/src/web.ts b/substrate/frame/revive/rpc/examples/js/src/web.ts deleted file mode 100644 index ee7c8ed034d..00000000000 --- a/substrate/frame/revive/rpc/examples/js/src/web.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { - AddressLike, - BrowserProvider, - Contract, - ContractFactory, - Eip1193Provider, - JsonRpcSigner, - parseEther, -} from 'ethers' - -declare global { - interface Window { - ethereum?: Eip1193Provider - } -} - -function str_to_bytes(str: string): Uint8Array { - return new TextEncoder().encode(str) -} - -document.addEventListener('DOMContentLoaded', async () => { - if (typeof window.ethereum == 'undefined') { - return console.log('MetaMask is not installed') - } - - console.log('MetaMask is installed!') - const provider = new BrowserProvider(window.ethereum) - - console.log('Getting signer...') - let signer: JsonRpcSigner - try { - signer = await provider.getSigner() - console.log(`Signer: ${signer.address}`) - } catch (e) { - console.error('Failed to get signer', e) - return - } - - console.log('Getting block number...') - try { - const blockNumber = await provider.getBlockNumber() - console.log(`Block number: ${blockNumber}`) - } catch (e) { - console.error('Failed to get block number', e) - return - } - - const nonce = await signer.getNonce() - console.log(`Nonce: ${nonce}`) - - document.getElementById('transferButton')?.addEventListener('click', async () => { - const address = (document.getElementById('transferInput') as HTMLInputElement).value - await transfer(address) - }) - - document.getElementById('deployButton')?.addEventListener('click', async () => { - await deploy() - }) - document.getElementById('deployAndCallButton')?.addEventListener('click', async () => { - const nonce = await signer.getNonce() - console.log(`deploy with nonce: ${nonce}`) - - const address = await deploy() - if (address) { - const nonce = await signer.getNonce() - console.log(`call with nonce: ${nonce}`) - await call(address) - } - }) - document.getElementById('callButton')?.addEventListener('click', async () => { - const address = (document.getElementById('callInput') as HTMLInputElement).value - await call(address) - }) - - async function deploy() { - console.log('Deploying contract...') - - const bytecode = await fetch('rpc_demo.polkavm') - .then((response) => { - if (!response.ok) { - throw new Error('Network response was not ok') - } - return response.arrayBuffer() - }) - .then((arrayBuffer) => new Uint8Array(arrayBuffer)) - - const contractFactory = new ContractFactory( - ['constructor(bytes memory _data)'], - bytecode, - signer - ) - - try { - const args = str_to_bytes('hello') - const contract = await contractFactory.deploy(args) - await contract.waitForDeployment() - const address = await contract.getAddress() - console.log(`Contract deployed: ${address}`) - return address - } catch (e) { - console.error('Failed to deploy contract', e) - return - } - } - - async function call(address: string) { - const abi = ['function call(bytes data)'] - const contract = new Contract(address, abi, signer) - const tx = await contract.call(str_to_bytes('world')) - - console.log('Transaction hash:', tx.hash) - } - - async function transfer(to: AddressLike) { - console.log(`transferring 1 DOT to ${to}...`) - try { - const tx = await signer.sendTransaction({ - to, - value: parseEther('1.0'), - }) - - const receipt = await tx.wait() - console.log(`Transaction hash: ${receipt?.hash}`) - } catch (e) { - console.error('Failed to send transaction', e) - return - } - } -}) diff --git a/substrate/frame/revive/rpc/examples/js/tsconfig.json b/substrate/frame/revive/rpc/examples/js/tsconfig.json deleted file mode 100644 index 55cb8379e88..00000000000 --- a/substrate/frame/revive/rpc/examples/js/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "module": "ESNext", - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "isolatedModules": true, - "moduleDetection": "force", - "noEmit": true, - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["src"] -} diff --git a/substrate/frame/revive/rpc/examples/rust/remark-extrinsic.rs b/substrate/frame/revive/rpc/examples/remark-extrinsic.rs similarity index 100% rename from substrate/frame/revive/rpc/examples/rust/remark-extrinsic.rs rename to substrate/frame/revive/rpc/examples/remark-extrinsic.rs diff --git a/substrate/frame/revive/rpc/examples/rust/rpc-playground.rs b/substrate/frame/revive/rpc/examples/rpc-playground.rs similarity index 100% rename from substrate/frame/revive/rpc/examples/rust/rpc-playground.rs rename to substrate/frame/revive/rpc/examples/rpc-playground.rs diff --git a/substrate/frame/revive/rpc/examples/rpc_demo.polkavm b/substrate/frame/revive/rpc/examples/rpc_demo.polkavm deleted file mode 120000 index 63925dfcc54..00000000000 --- a/substrate/frame/revive/rpc/examples/rpc_demo.polkavm +++ /dev/null @@ -1 +0,0 @@ -../../../../../target/pallet-revive-fixtures/rpc_demo.polkavm \ No newline at end of file diff --git a/substrate/frame/revive/rpc/examples/rust/transfer.rs b/substrate/frame/revive/rpc/examples/transfer.rs similarity index 100% rename from substrate/frame/revive/rpc/examples/rust/transfer.rs rename to substrate/frame/revive/rpc/examples/transfer.rs diff --git a/substrate/frame/revive/rpc/src/tests.rs b/substrate/frame/revive/rpc/src/tests.rs index 375e3a5dd3f..87178ccdfd7 100644 --- a/substrate/frame/revive/rpc/src/tests.rs +++ b/substrate/frame/revive/rpc/src/tests.rs @@ -15,6 +15,8 @@ // See the License for the specific language governing permissions and // limitations under the License. //! Test the eth-rpc cli with the kitchensink node. +//! This only includes basic transaction tests, most of the other tests are in the +//! [evm-test-suite](https://github.com/paritytech/evm-test-suite) repository. use crate::{ cli::{self, CliCommand}, @@ -22,7 +24,6 @@ use crate::{ EthRpcClient, }; use clap::Parser; -use ethabi::Token; use jsonrpsee::ws_client::{WsClient, WsClientBuilder}; use pallet_revive::{ create1, @@ -48,17 +49,6 @@ async fn ws_client_with_retry(url: &str) -> WsClient { .expect("Hit timeout") } -fn get_contract(name: &str) -> anyhow::Result<(Vec<u8>, ethabi::Contract)> { - let pvm_dir: std::path::PathBuf = "./examples/js/pvm".into(); - let abi_dir: std::path::PathBuf = "./examples/js/abi".into(); - let bytecode = std::fs::read(pvm_dir.join(format!("{}.polkavm", name)))?; - - let abi = std::fs::read(abi_dir.join(format!("{}.json", name)))?; - let contract = ethabi::Contract::load(abi.as_slice())?; - - Ok((bytecode, contract)) -} - struct SharedResources { _node_handle: std::thread::JoinHandle<()>, _rpc_handle: std::thread::JoinHandle<()>, @@ -210,54 +200,6 @@ async fn deploy_and_call() -> anyhow::Result<()> { Ok(()) } -#[tokio::test] -async fn revert_call() -> anyhow::Result<()> { - let _lock = SHARED_RESOURCES.write(); - let client = Arc::new(SharedResources::client().await); - let (bytecode, contract) = get_contract("Errors")?; - let receipt = TransactionBuilder::new(&client) - .input(bytecode) - .send() - .await? - .wait_for_receipt() - .await?; - - let err = TransactionBuilder::new(&client) - .to(receipt.contract_address.unwrap()) - .input(contract.function("triggerRequireError")?.encode_input(&[])?.to_vec()) - .send() - .await - .unwrap_err(); - - let call_err = unwrap_call_err!(err.source().unwrap()); - assert_eq!(call_err.message(), "execution reverted: revert: This is a require error"); - assert_eq!(call_err.code(), 3); - Ok(()) -} - -#[tokio::test] -async fn event_logs() -> anyhow::Result<()> { - let _lock = SHARED_RESOURCES.write(); - let client = Arc::new(SharedResources::client().await); - let (bytecode, contract) = get_contract("EventExample")?; - let receipt = TransactionBuilder::new(&client) - .input(bytecode) - .send() - .await? - .wait_for_receipt() - .await?; - - let receipt = TransactionBuilder::new(&client) - .to(receipt.contract_address.unwrap()) - .input(contract.function("triggerEvent")?.encode_input(&[])?.to_vec()) - .send() - .await? - .wait_for_receipt() - .await?; - assert_eq!(receipt.logs.len(), 1, "There should be one log."); - Ok(()) -} - #[tokio::test] async fn invalid_transaction() -> anyhow::Result<()> { let _lock = SHARED_RESOURCES.write(); @@ -277,50 +219,3 @@ async fn invalid_transaction() -> anyhow::Result<()> { Ok(()) } - -#[tokio::test] -async fn native_evm_ratio_works() -> anyhow::Result<()> { - let _lock = SHARED_RESOURCES.write(); - let client = Arc::new(SharedResources::client().await); - let (bytecode, contract) = get_contract("PiggyBank")?; - let contract_address = TransactionBuilder::new(&client) - .input(bytecode) - .send() - .await? - .wait_for_receipt() - .await? - .contract_address - .unwrap(); - - let value = 10_000_000_000_000_000_000u128; // 10 eth - TransactionBuilder::new(&client) - .to(contract_address) - .input(contract.function("deposit")?.encode_input(&[])?.to_vec()) - .value(value.into()) - .send() - .await? - .wait_for_receipt() - .await?; - - let contract_value = client.get_balance(contract_address, BlockTag::Latest.into()).await?; - assert_eq!(contract_value, value.into()); - - let withdraw_value = 1_000_000_000_000_000_000u128; // 1 eth - TransactionBuilder::new(&client) - .to(contract_address) - .input( - contract - .function("withdraw")? - .encode_input(&[Token::Uint(withdraw_value.into())])? - .to_vec(), - ) - .send() - .await? - .wait_for_receipt() - .await?; - - let contract_value = client.get_balance(contract_address, BlockTag::Latest.into()).await?; - assert_eq!(contract_value, (value - withdraw_value).into()); - - Ok(()) -} -- GitLab