multiversx_wegld_swap_sc/
wegld.rs

1#![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    // endpoints
13
14    #[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        // 1 wrapped eGLD = 1 eGLD, so we pay back the same amount
53        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}