13
13
import score .annotation .EventLog ;
14
14
import score .annotation .External ;
15
15
import score .annotation .Payable ;
16
- import org .json .JSONObject ;
16
+ import com .eclipsesource .json .Json ;
17
+ import com .eclipsesource .json .JsonObject ;
17
18
18
19
public class Intent extends GeneralizedConnection {
19
20
@@ -68,19 +69,14 @@ public Intent(String _nid, BigInteger _protocolFee, Address _feeHandler, Address
68
69
@ Payable
69
70
public void swap (SwapOrderData swapOrderData ) {
70
71
Context .require (swapOrderData .token != null , "Token can't be null" );
71
- Context .require (Context .getCaller ().toString ().equals (swapOrderData .creator ),
72
+ Context .require (Context .getCaller ().toString ().equals (extractAddress ( swapOrderData .creator ) ),
72
73
"Creator must be sender" );
74
+ Context .require (Context .getValue ().equals (swapOrderData .amount ),
75
+ "Deposit amount not equal to order amount" );
73
76
74
- Address token = Address .fromString (swapOrderData .token );
77
+ Address token = Address .fromString (extractAddress ( swapOrderData .token ) );
75
78
Address nativAddress = nativeAddress .get ();
76
- if (token .equals (nativAddress )) {
77
- Context .require (Context .getValue ().equals (swapOrderData .amount ),
78
- "Deposit amount not equal to order amount" );
79
- } else {
80
- Context .require (Context .getValue ().equals (BigInteger .valueOf (0 )),
81
- "Nativ Token Must Be Zero" );
82
- Context .call (token , "transfer" , Context .getAddress (), swapOrderData .amount );
83
- }
79
+ Context .require (token .equals (nativAddress ), "Not a native token" );
84
80
85
81
SwapOrder swapOrder = new SwapOrder (swapOrderData .id , swapOrderData .emitter ,
86
82
swapOrderData .srcNID ,
@@ -89,15 +85,17 @@ public void swap(SwapOrderData swapOrderData) {
89
85
swapOrderData .amount , swapOrderData .toToken , swapOrderData .toAmount ,
90
86
swapOrderData .data );
91
87
88
+ deposit .at (swapOrderData .creator ).set (swapOrderData .token , swapOrderData .amount );
89
+
92
90
_swap (swapOrder );
93
91
}
94
92
95
93
void _swap (SwapOrder swapOrder ) {
96
94
BigInteger id = this .depositId .getOrDefault (BigInteger .ZERO ).add (BigInteger .valueOf (1 ));
97
95
swapOrder .id = id ;
98
96
Context .require (swapOrder .srcNID .equals (this .networkId .get ()), "NID is misconfigured" );
99
- Context .require (swapOrder .emitter .equals (Context .getAddress ().toString ()),
100
- "Emitter specified is not this" );
97
+ Context .require (extractAddress ( swapOrder .emitter ) .equals (Context .getAddress ().toString ()),
98
+ "Emitter specified is not this" ); // emitter contract or eoa?
101
99
orders .set (id , swapOrder );
102
100
SwapIntent (id , swapOrder .emitter , swapOrder .srcNID , swapOrder .dstNID ,
103
101
swapOrder .creator ,
@@ -121,13 +119,15 @@ public void fill(SwapOrderData swapOrderData, String solverAddress) {
121
119
Context .require (!isFilled , "Order has already been filled" );
122
120
finishedOrders .set (orderHash , true );
123
121
124
- BigInteger fee = swapOrder .toAmount .multiply (protocolFee .get ()).divide (BigInteger .valueOf (1000 )); // add divide
125
- // by 10000
122
+ BigInteger fee = swapOrder .toAmount .multiply (protocolFee .get ()).divide (BigInteger .valueOf (10000 )); // add divide
123
+ // by 10000
126
124
BigInteger toAmount = swapOrder .toAmount .subtract (fee );
125
+
127
126
_transferResult (swapOrder .destinationAddress , swapOrder .toToken , toAmount ,
128
127
fee );
129
128
130
129
OrderFill orderFill = new OrderFill (swapOrder .id , orderBytes , solverAddress );
130
+
131
131
if (swapOrder .srcNID .equals (swapOrder .dstNID )) {
132
132
_resolveFill (networkId .get (), orderFill );
133
133
return ;
@@ -143,7 +143,7 @@ public void cancel(BigInteger id) {
143
143
if (order == null ) {
144
144
Context .revert ("Order already has been cancelled" );
145
145
}
146
- Context .require (Address .fromString (order .creator ).equals (Context .getCaller ()),
146
+ Context .require (Address .fromString (extractAddress ( order .creator ) ).equals (Context .getCaller ()),
147
147
"Only creator can cancel this order" );
148
148
149
149
if (order .srcNID .equals (order .dstNID )) {
@@ -199,35 +199,36 @@ void _resolveFill(String srcNetwork, OrderFill _fill) {
199
199
if (order == null ) {
200
200
Context .revert ("There is no order to resolve" );
201
201
}
202
+ Context .require (Arrays .equals (Context .hash ("keccak-256" , order .toBytes ()),
203
+ Context .hash ("keccak-256" ,
204
+ _fill .orderBytes )),
205
+ "Mismatched order" );
202
206
203
- Context .require (Arrays .equals (Context .hash ("keccak-256" , order .toBytes ()), Context .hash ("keccak-256" ,
204
- _fill .orderBytes )), "Mismatched order" );
205
207
Context .require (order .dstNID .equals (srcNetwork ), "Invalid Network" );
206
208
207
209
orders .set (_fill .id , null );
208
210
OrderClosed (_fill .id );
209
211
210
- Address tokenAddress = Address .fromString (order .token );
212
+ Address tokenAddress = Address .fromString (extractAddress ( order .token ) );
211
213
if (tokenAddress .equals (nativeAddress .get ())) {
212
- Context .transfer (Address .fromString (_fill .solver ), order .amount );
213
-
214
+ Context .transfer (Address .fromString (extractAddress (_fill .solver )), order .amount );
214
215
} else {
215
- Context .call (tokenAddress , "transfer" , Address .fromString (_fill .solver ), order .amount );
216
+ Context .call (tokenAddress , "transfer" , Address .fromString (extractAddress ( _fill .solver ) ), order .amount );
216
217
}
217
218
}
218
219
219
220
void _transferResult (String _toAddress , String _toToken , BigInteger amount ,
220
221
BigInteger fee ) {
221
- Address toAddress = Address .fromString (_toAddress );
222
- Address toTokenAddress = Address .fromString (_toToken );
222
+ Address toAddress = Address .fromString (extractAddress ( _toAddress ) );
223
+ Address toTokenAddress = Address .fromString (extractAddress ( _toToken ) );
223
224
if (toTokenAddress .equals (nativeAddress .get ())) {
224
225
Context .require (Context .getValue ().equals (amount .add (fee )), "\" Deposit amount not equal to order amount\" " );
225
226
_nativeTransfer (toAddress , amount );
226
227
_nativeTransfer (feeHandler .get (), fee );
227
228
} else {
228
- Context .call (toTokenAddress , "transferFrom" , Context . getAddress () , toAddress ,
229
+ Context .call (toTokenAddress , "transfer" , toAddress ,
229
230
amount );
230
- Context .call (toTokenAddress , "transferFrom" , Context . getAddress () ,
231
+ Context .call (toTokenAddress , "transfer" ,
231
232
feeHandler .get (), fee );
232
233
}
233
234
}
@@ -236,48 +237,28 @@ void _nativeTransfer(Address to, BigInteger amount) {
236
237
Context .transfer (to , amount );
237
238
}
238
239
239
- public static byte [] hexStringToByteArray (String s ) {
240
- int len = s .length ();
241
- byte [] data = new byte [len / 2 ];
242
- for (int i = 0 ; i < len ; i += 2 ) {
243
- data [i / 2 ] = (byte ) ((Character .digit (s .charAt (i ), 16 ) << 4 )
244
- + Character .digit (s .charAt (i + 1 ), 16 ));
245
- }
246
- return data ;
247
- }
248
-
249
240
@ External
250
241
public void tokenFallback (Address _from , BigInteger _value , byte [] _data ) {
251
242
Context .require (_value .compareTo (BigInteger .ZERO ) > 0 , "Zero transfers not allowed" );
243
+
252
244
String unpackedData = new String (_data );
253
245
Context .require (!unpackedData .equals ("" ), "Token Fallback: Data can't be empty" );
246
+ JsonObject json = Json .parse (unpackedData ).asObject ();
254
247
255
- JSONObject jsonObject = new JSONObject (unpackedData );
256
- // string(address of depositer) -> string (deposits token address) -> amount of
248
+ // string(address of depositer) -> string (deposits token address) -> amountof
257
249
// token
258
- String depositor = jsonObject .get ("depositor" ).toString ();
259
- String token = jsonObject .get ("token" ).toString ();
260
- BigInteger amount = jsonObject . getBigInteger ("amount" );
250
+ String depositor = json .get ("depositor" ).asString ();
251
+ String token = json .get ("token" ).asString ();
252
+ BigInteger amount = new BigInteger ( json . get ("amount" ). asString () );
261
253
262
254
deposit .at (depositor ).set (token , amount );
263
-
264
255
SwapOrder swapOrder = SwapOrder
265
- .fromBytes (hexStringToByteArray (jsonObject .get ("swapOrderDataBytes" ).toString ()));
266
- Context .require (amount .equals (swapOrder .getAmount ()), "Token amount must be equal" );
256
+ .fromBytes (hexStringToByteArray (json .get ("swapOrderDataBytes" ).asString ()));
257
+
258
+ Context .require (amount .equals (swapOrder .amount ), "Token amount must be equal" );
267
259
Context .require (swapOrder .getToken () != null , "Token can't be null" );
268
- Context .require (Context .getCaller ().toString ().equals (swapOrder .getCreator ()),
260
+ Context .require (Context .getCaller ().toString ().equals (extractAddress ( swapOrder .getCreator () )),
269
261
"Creator must be sender" );
270
-
271
- Address swapOrderToken = Address .fromString (swapOrder .getToken ());
272
- Address nativAddress = nativeAddress .get ();
273
- if (swapOrderToken .equals (nativAddress )) {
274
- Context .require (Context .getValue ().equals (swapOrder .getAmount ()),
275
- "Deposit amount not equal to order amount" );
276
- } else {
277
- Context .require (Context .getValue ().equals (BigInteger .valueOf (0 )),
278
- "Nativ Token Must Be Zero" );
279
- Context .call (swapOrderToken , "transfer" , Context .getAddress (), swapOrder .getAmount ());
280
- }
281
262
_swap (swapOrder );
282
263
}
283
264
@@ -317,4 +298,26 @@ public static BigInteger getDepositAmount(String depositer, String token) {
317
298
static void OnlyOwner () {
318
299
Context .require (owner .get ().equals (Context .getCaller ()), "Not Owner" );
319
300
}
301
+
302
+ public static String extractAddress (String input ) {
303
+ if (input .contains ("0x2.icon/" )) {
304
+ int lastSlashIndex = input .lastIndexOf ('/' );
305
+ if (lastSlashIndex != -1 && lastSlashIndex < input .length () - 1 ) {
306
+ return input .substring (lastSlashIndex + 1 );
307
+ }
308
+ } else {
309
+ return input ;
310
+ }
311
+ return null ;
312
+ }
313
+
314
+ public static byte [] hexStringToByteArray (String s ) {
315
+ int len = s .length ();
316
+ byte [] data = new byte [len / 2 ];
317
+ for (int i = 0 ; i < len ; i += 2 ) {
318
+ data [i / 2 ] = (byte ) ((Character .digit (s .charAt (i ), 16 ) << 4 )
319
+ + Character .digit (s .charAt (i + 1 ), 16 ));
320
+ }
321
+ return data ;
322
+ }
320
323
}
0 commit comments