1+ use alloy:: {
2+ eips:: Encodable2718 ,
3+ primitives:: { Address , Bytes } ,
4+ } ;
5+
16use crate :: { helper:: msg_caller, store} ;
27
38#[ ic_cdk:: query]
@@ -6,12 +11,41 @@ fn info() -> Result<store::StateInfo, String> {
611}
712
813#[ ic_cdk:: query]
9- fn evm_address ( ) -> Result < String , String > {
14+ fn my_evm_address ( ) -> Result < String , String > {
1015 let caller = msg_caller ( ) ?;
1116 let addr = store:: state:: evm_address ( & caller) ;
1217 Ok ( addr. to_string ( ) )
1318}
1419
20+ #[ ic_cdk:: query]
21+ async fn my_pending_logs ( ) -> Result < Vec < store:: BridgeLog > , String > {
22+ let caller = msg_caller ( ) ?;
23+ let rt = store:: state:: with ( |s| {
24+ s. pending
25+ . iter ( )
26+ . filter_map ( |item| {
27+ if item. user == caller {
28+ Some ( item. clone ( ) )
29+ } else {
30+ None
31+ }
32+ } )
33+ . collect :: < Vec < store:: BridgeLog > > ( )
34+ } ) ;
35+ Ok ( rt)
36+ }
37+
38+ #[ ic_cdk:: query]
39+ async fn my_finalized_logs (
40+ prev : Option < u64 > ,
41+ take : Option < u64 > ,
42+ ) -> Result < Vec < store:: BridgeLog > , String > {
43+ let caller = msg_caller ( ) ?;
44+ let take = take. unwrap_or ( 10 ) . min ( 1000 ) as usize ;
45+ let rt = store:: state:: logs ( caller, prev, take) ;
46+ Ok ( rt)
47+ }
48+
1549#[ ic_cdk:: update]
1650async fn bridge (
1751 from_chain : String ,
@@ -22,3 +56,37 @@ async fn bridge(
2256 let now_ms = ic_cdk:: api:: time ( ) / 1_000_000 ;
2357 store:: state:: bridge ( from_chain, to_chain, icp_amount, caller, now_ms) . await
2458}
59+
60+ #[ ic_cdk:: update]
61+ async fn erc20_transfer_tx ( chain : String , to : String , icp_amount : u128 ) -> Result < String , String > {
62+ let to_addr = to
63+ . parse :: < Address > ( )
64+ . map_err ( |err| format ! ( "invalid to address: {}" , err) ) ?;
65+ let caller = msg_caller ( ) ?;
66+ let now_ms = ic_cdk:: api:: time ( ) / 1_000_000 ;
67+ let ( _, signed_tx) =
68+ store:: state:: build_erc20_transfer_tx ( & chain, & caller, & to_addr, icp_amount, now_ms)
69+ . await ?;
70+ let data = signed_tx. encoded_2718 ( ) ;
71+ Ok ( Bytes :: from ( data) . to_string ( ) )
72+ }
73+
74+ #[ ic_cdk:: update]
75+ async fn erc20_transfer ( chain : String , to : String , icp_amount : u128 ) -> Result < String , String > {
76+ let to_addr = to
77+ . parse :: < Address > ( )
78+ . map_err ( |err| format ! ( "invalid to address: {}" , err) ) ?;
79+ let caller = msg_caller ( ) ?;
80+ let now_ms = ic_cdk:: api:: time ( ) / 1_000_000 ;
81+ let ( cli, signed_tx) =
82+ store:: state:: build_erc20_transfer_tx ( & chain, & caller, & to_addr, icp_amount, now_ms)
83+ . await ?;
84+ let tx_hash = signed_tx. hash ( ) . to_string ( ) ;
85+
86+ let data = signed_tx. encoded_2718 ( ) ;
87+ let _ = cli
88+ . send_raw_transaction ( now_ms, Bytes :: from ( data) . to_string ( ) )
89+ . await ?;
90+
91+ Ok ( tx_hash)
92+ }
0 commit comments