multiversx_wegld_swap_sc/
wegld.rs1#![no_std]
2
3multiversx_sc::imports!();
4
5#[multiversx_sc::contract]
6pub trait EgldEsdtSwap: multiversx_sc_modules::pause::PauseModule {
7 #[init]
8 fn init(&self, wrapped_egld_token_id: TokenIdentifier) {
9 self.wrapped_egld_token_id().set(&wrapped_egld_token_id);
10 }
11
12 #[payable("EGLD")]
15 #[endpoint(wrapEgld)]
16 fn wrap_egld(&self) -> EsdtTokenPayment<Self::Api> {
17 self.require_not_paused();
18
19 let payment_amount = self.call_value().egld();
20 require!(*payment_amount > 0u32, "Payment must be more than 0");
21
22 let wrapped_egld_token_id = self.wrapped_egld_token_id().get();
23 self.send()
24 .esdt_local_mint(&wrapped_egld_token_id, 0, &payment_amount);
25
26 self.tx()
27 .to(ToCaller)
28 .single_esdt(&wrapped_egld_token_id, 0, &payment_amount)
29 .transfer();
30
31 EsdtTokenPayment::new(wrapped_egld_token_id, 0, payment_amount.clone())
32 }
33
34 #[payable("*")]
35 #[endpoint(unwrapEgld)]
36 fn unwrap_egld(&self) {
37 self.require_not_paused();
38
39 let (payment_token, payment_amount) = self.call_value().single_fungible_esdt();
40 let wrapped_egld_token_id = self.wrapped_egld_token_id().get();
41
42 require!(*payment_token == wrapped_egld_token_id, "Wrong esdt token");
43 require!(*payment_amount > 0u32, "Must pay more than 0 tokens!");
44 require!(
45 *payment_amount <= self.get_locked_egld_balance(),
46 "Contract does not have enough funds"
47 );
48
49 self.send()
50 .esdt_local_burn(&wrapped_egld_token_id, 0, &payment_amount);
51
52 let caller = self.blockchain().get_caller();
54 self.tx().to(&caller).egld(&*payment_amount).transfer();
55 }
56
57 #[view(getLockedEgldBalance)]
58 #[title("lockedEgldBalance")]
59 fn get_locked_egld_balance(&self) -> BigUint {
60 self.blockchain()
61 .get_sc_balance(&EgldOrEsdtTokenIdentifier::egld(), 0)
62 }
63
64 #[view(getWrappedEgldTokenId)]
65 #[title("wrappedEgldTokenId")]
66 #[storage_mapper("wrappedEgldTokenId")]
67 fn wrapped_egld_token_id(&self) -> SingleValueMapper<TokenIdentifier>;
68}