@@ -124,11 +124,23 @@ impl Bridge for Contract {
124
124
#[payable]
125
125
#[storage(read, write)]
126
126
fn withdraw (to : b256 ) {
127
- let amount = msg_amount ();
127
+ let amount : u64 = msg_amount ();
128
+ require (amount != 0 , BridgeFungibleTokenError :: NoCoinsSent );
129
+
128
130
let asset_id = msg_asset_id ();
129
131
let sub_id = _asset_to_sub_id (asset_id );
130
132
let token_id = _asset_to_token_id (asset_id );
131
- require (amount != 0 , BridgeFungibleTokenError :: NoCoinsSent );
133
+ let l1_address = _asset_to_l1_address (asset_id );
134
+ let l1_decimals = storage . l1_decimals. get (l1_address ). read ();
135
+ let l2_decimals = DECIMALS . try_as_u8 (). unwrap_or (DEFAULT_DECIMALS );
136
+
137
+ // This prevents loss due to precision when downscaling decimals in L1
138
+ if l1_decimals < l2_decimals {
139
+ require (
140
+ amount % (10u64 ** (l2_decimals - l1_decimals ). as_u32 ()) == 0 ,
141
+ BridgeFungibleTokenError :: InvalidAmount
142
+ );
143
+ }
132
144
133
145
storage
134
146
. tokens_minted
@@ -148,10 +160,7 @@ impl Bridge for Contract {
148
160
encode_data (
149
161
to ,
150
162
amount . as_u256 (). as_b256 (),
151
- storage
152
- . l1_addresses
153
- . get (asset_id )
154
- . read (),
163
+ l1_address ,
155
164
token_id ,
156
165
),
157
166
0 ,
@@ -178,9 +187,9 @@ impl Bridge for Contract {
178
187
}
179
188
180
189
#[storage(read)]
181
- fn asset_to_l1_decimals (asset_id : AssetId ) -> Option < u8 > {
190
+ fn asset_to_l1_decimals (asset_id : AssetId ) -> u8 {
182
191
let l1_address = _asset_to_l1_address (asset_id );
183
- storage . l1_decimals. get (l1_address ). try_read ()
192
+ storage . l1_decimals. get (l1_address ). read ()
184
193
}
185
194
186
195
}
0 commit comments