Skip to content

Commit 76e6717

Browse files
committed
continued dev
1 parent 6ed6cb2 commit 76e6717

File tree

6 files changed

+155
-29
lines changed

6 files changed

+155
-29
lines changed

src/main/java/Bundle.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import com.eclipsesource.v8.V8;
2+
import com.eclipsesource.v8.V8Array;
3+
14
import java.util.ArrayList;
25
import java.util.HashMap;
36
import java.util.List;
@@ -23,6 +26,7 @@ public Map<String, Object> toMap() {
2326
public ArrayList<Transaction> getBundles() {
2427
return bundles;
2528
}
29+
2630
}
2731

2832

src/main/java/Helpers.java

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
import java.util.ArrayList;
2-
import java.util.Arrays;
32
import java.util.List;
4-
import java.util.Map;
5-
import java.util.stream.Collectors;
63

74
public class Helpers {
85
public static ArrayList<Bundle> createTransaction(UserObject user, ArrayList<Transfer> transfers, boolean shouldClose) {
@@ -13,19 +10,38 @@ public static ArrayList<Bundle> createTransaction(UserObject user, ArrayList<Tra
1310
System.out.println("No more addresses in channel.");
1411
}
1512

16-
ArrayList<Transfer> newTransfers;
13+
ArrayList<Transaction> newTransfers;
1714

1815
if (shouldClose) {
16+
newTransfers = new ArrayList<>();
1917
// newTransfers = IotaFlashBridge.close(user.getFlash().getSettlementAddresses(), user.getFlash().deposits);
2018
} else {
21-
List<Object> test = IotaFlashBridge.prepare(
19+
newTransfers = IotaFlashBridge.prepare(
2220
user.getFlash().settlementAddresses,
2321
user.getFlash().deposits,
2422
user.getUserIndex(),
2523
transfers
2624
);
2725
}
2826

27+
ArrayList<Bundle> bundles = IotaFlashBridge.compose(
28+
user.getFlash().balance,
29+
user.getFlash().deposits,
30+
user.getFlash().outputs,
31+
toUse.getAddress(),
32+
user.getFlash().remainderAddress,
33+
user.getFlash().transfers,
34+
newTransfers,
35+
shouldClose
36+
);
37+
38+
39+
signTransaction(user, bundles);
40+
2941
return null;
3042
}
43+
44+
public static Object signTransaction(UserObject user, ArrayList<Bundle> bundles) {
45+
return IotaFlashBridge.sign(user.getFlash().root, user.getSeed(), bundles);
46+
}
3147
}

src/main/java/IotaFlashBridge.java

Lines changed: 98 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@
22
import com.eclipsesource.v8.utils.V8ObjectUtils;
33
import com.sun.org.apache.xpath.internal.operations.Mult;
44

5-
import javax.jws.Oneway;
5+
66
import java.io.IOException;
77
import java.nio.charset.Charset;
88
import java.nio.file.Files;
99
import java.nio.file.Paths;
1010
import java.util.ArrayList;
11-
import java.util.HashMap;
1211
import java.util.List;
1312
import java.util.Map;
1413

@@ -111,7 +110,7 @@ public static CreateTransactionHelperObject updateLeafToRoot(MultisigAddress roo
111110
* @param transfers array of all transfers (value, address) pairs
112111
* @return
113112
*/
114-
public static List<Object> prepare(ArrayList<String> settlementAddresses, ArrayList<Integer> deposits, int index, ArrayList<Transfer> transfers) {
113+
public static ArrayList<Transaction> prepare(ArrayList<String> settlementAddresses, ArrayList<Integer> deposits, int index, ArrayList<Transfer> transfers) {
115114
V8Array settlementAddressesJS = V8ObjectUtils.toV8Array(engine, settlementAddresses);
116115
V8Array depositJS = V8ObjectUtils.toV8Array(engine, deposits);
117116
List<Object> transferObj = new ArrayList<Object>();
@@ -131,13 +130,19 @@ public static List<Object> prepare(ArrayList<String> settlementAddresses, ArrayL
131130
V8Array ret = transfer.executeArrayFunction("prepare", V8ObjectUtils.toV8Array(engine, params));
132131
List<Object> transfersReturnJS = V8ObjectUtils.toList(ret);
133132

133+
ArrayList<Transaction> returnTransfers = new ArrayList<>();
134+
134135
for (Object b: transfersReturnJS) {
135-
Map<String, Object> test = V8ObjectUtils.toMap((V8Object) b);
136+
Map<String, ? super Object> values = (Map<String, ? super Object>) b;
137+
String obsoleteTag = (String) values.get("obsoleteTag");
138+
String address = (String) values.get("address");
139+
Integer value = (Integer) values.get("value");
136140

141+
returnTransfers.add(new Transaction(address, value, "", "", 0));
137142
}
138143

139144
// Call js.
140-
return transfersReturnJS;
145+
return returnTransfers;
141146
}
142147

143148
/**
@@ -152,19 +157,33 @@ public static List<Object> prepare(ArrayList<String> settlementAddresses, ArrayL
152157
* @param close
153158
* @return
154159
*/
155-
public static List<Object> compose(int balance, ArrayList<Integer> deposits, ArrayList<Transfer> outputs, MultisigAddress root, String remainderAddress, ArrayList<Bundle> history, ArrayList<Transfer> transfers, boolean close) {
160+
public static ArrayList<Bundle> compose(int balance,
161+
List<Integer> deposits,
162+
List<Bundle> outputs,
163+
MultisigAddress root,
164+
MultisigAddress remainderAddress,
165+
List<Bundle> history,
166+
List<Transaction> transfers,
167+
boolean close) {
156168
V8Array depositsJS = V8ObjectUtils.toV8Array(engine, deposits);
157169
// Outputs
158170
List<Object> outputsObj = new ArrayList<Object>();
159-
for (Transfer t: outputs) {
171+
for (Bundle t: outputs) {
160172
outputsObj.add(t.toMap());
161173
}
162174
V8Array outputsJS = V8ObjectUtils.toV8Array(engine, outputsObj);
175+
V8Object rootJS = V8ObjectUtils.toV8Object(engine, root.toMap());
176+
V8Object remainderJS = V8ObjectUtils.toV8Object(engine, remainderAddress.toMap());
163177

178+
List<Object> historyObj = new ArrayList<Object>();
179+
for (Bundle t: history) {
180+
historyObj.add(t.toMap());
181+
}
182+
V8Array historyJS = V8ObjectUtils.toV8Array(engine, historyObj);
164183

165184

166185
List<Object> transfersObj = new ArrayList<Object>();
167-
for (Transfer t: transfers) {
186+
for (Transaction t: transfers) {
168187
transfersObj.add(t.toMap());
169188
}
170189
V8Array transfersJS = V8ObjectUtils.toV8Array(engine, transfersObj);
@@ -175,16 +194,70 @@ public static List<Object> compose(int balance, ArrayList<Integer> deposits, Arr
175194
params.add(balance);
176195
params.add(depositsJS);
177196
params.add(outputsJS);
178-
197+
params.add(rootJS);
198+
params.add(remainderJS);
199+
params.add(history);
200+
params.add(transfersJS);
179201

180202
// Call js function.
181203
V8Array ret = transfer.executeArrayFunction("compose", V8ObjectUtils.toV8Array(engine, params));
182204
List<Object> transfersReturnJS = V8ObjectUtils.toList(ret);
183205

184206
// Parse return as array of bundles
207+
ArrayList<Bundle> returnBundles = new ArrayList<Bundle>();
208+
for (Object returnEntry: transfersReturnJS) {
209+
ArrayList<Object> b = (ArrayList<Object>) returnEntry;
210+
211+
ArrayList<Transaction> returnedTransactions = new ArrayList<>();
212+
213+
for (Object parsedObjects: b) {
214+
Map<String, Object> bundleData = (Map<String, Object>) parsedObjects;
215+
String signatureMessageFragment = (String) bundleData.get("signatureMessageFragment");
216+
String bundle = (String) bundleData.get("bundle");
217+
String address = (String) bundleData.get("address");
218+
String attachmentTimestampLowerBound = (String) bundleData.get("attachmentTimestampLowerBound");
219+
String attachmentTimestampUpperBound = (String) bundleData.get("attachmentTimestampUpperBound");
220+
String trunkTransaction = (String) bundleData.get("trunkTransaction");
221+
String attachmentTimestamp = (String) bundleData.get("attachmentTimestamp");
222+
Integer timestamp = (Integer) bundleData.get("timestamp");
223+
String tag = (String) bundleData.get("tag");
224+
String branchTransaction = (String) bundleData.get("branchTransaction");
225+
String nonce = (String) bundleData.get("nonce");
226+
String obsoleteTag = (String) bundleData.get("obsoleteTag");
227+
228+
Integer currentIndex = (Integer) bundleData.get("currentIndex");
229+
Integer value = (Integer) bundleData.get("value");
230+
Integer lastIndex = (Integer) bundleData.get("lastIndex");
231+
232+
Transaction parsedTransaction = new Transaction(
233+
address,
234+
bundle,
235+
value.intValue(),
236+
obsoleteTag,
237+
tag,
238+
timestamp,
239+
signatureMessageFragment,
240+
trunkTransaction,
241+
branchTransaction,
242+
243+
attachmentTimestamp,
244+
attachmentTimestampUpperBound,
245+
attachmentTimestampLowerBound,
246+
nonce
247+
);
248+
249+
returnedTransactions.add(parsedTransaction);
250+
251+
System.out.println("Created bundle transaction: " + parsedTransaction.toString());
252+
}
253+
254+
Bundle bundle = new Bundle(returnedTransactions);
255+
returnBundles.add(bundle);
256+
}
185257

258+
System.out.println("Created bundles: " + returnBundles.size());
186259

187-
return transfersReturnJS;
260+
return returnBundles;
188261
}
189262

190263
/**
@@ -200,18 +273,29 @@ public static Object sign(MultisigAddress root, String seed, ArrayList<Bundle> b
200273

201274
List<Object> bundleTmp = new ArrayList<Object>();
202275
for (Bundle b: bundles) {
203-
bundleTmp.add(b.toMap());
276+
List<Object> transactions = new ArrayList<Object>();
277+
for (Transaction t: b.getBundles()) {
278+
transactions.add(t.toMap());
279+
}
280+
bundleTmp.add(transactions);
204281
}
205282
V8Array bundlesJS = V8ObjectUtils.toV8Array(engine, bundleTmp);
206283

207284
// Create params.
208285
// Now put all params into JS ready array.
209-
List<Object> params = new ArrayList<Object>();
286+
List<Object> params = new ArrayList<>();
210287
params.add(rootJS);
211288
params.add(seed);
212-
params.add(bundles);
289+
params.add(bundlesJS);
213290

214-
V8Object signatures = transfer.executeObjectFunction("sign", V8ObjectUtils.toV8Array(engine, params));
291+
V8Array signatures = transfer.executeArrayFunction("sign", V8ObjectUtils.toV8Array(engine, params));
292+
293+
for (Object o: V8ObjectUtils.toList(signatures)) {
294+
Map<String, Object> returnValues = (Map<String, Object>) o;
295+
for (Map.Entry<String, Object> entry: returnValues.entrySet()) {
296+
System.out.println(entry.getKey() + " : " + entry.getValue());
297+
}
298+
}
215299

216300
// TODO: add singature object.
217301
return signatures;

src/main/java/MultisigAddress.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public Map<String, Object> toMap() {
100100
for (Bundle b: bundles) {
101101
bundleList.add(b.getBundles());
102102
}
103-
map.put("bundle", bundleList);
103+
map.put("bundles", bundleList);
104104

105105
return map;
106106
}

src/main/java/Transaction.java

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
import java.util.Map;
33

44
class Transaction {
5-
private String timestamp;
5+
private int timestamp;
66
private String address;
77
private int value;
8-
private int obsoleteTag;
9-
private int tag;
8+
private String obsoleteTag;
9+
private String tag;
1010

1111
// Signature stuff
12+
private String bundle = "";
1213
private String signatureMessageFragment = "";
1314
private String trunkTransaction = "";
1415
private String branchTransaction = "";
@@ -20,7 +21,7 @@ class Transaction {
2021
private String nonce = "";
2122

2223
// Unsigned constructor
23-
public Transaction(String address, int value, int obsoleteTag, int tag, String timestamp) {
24+
public Transaction(String address, int value, String obsoleteTag, String tag, int timestamp) {
2425
this.address = address;
2526
this.value = value;
2627
this.obsoleteTag = obsoleteTag;
@@ -30,17 +31,20 @@ public Transaction(String address, int value, int obsoleteTag, int tag, String t
3031

3132
// Signed constructor
3233
public Transaction(String address,
34+
String bundle,
3335
int value,
34-
int obsoleteTag,
35-
int tag,
36-
String timestamp,
36+
String obsoleteTag,
37+
String tag,
38+
int timestamp,
3739
String signatureMessageFragment,
3840
String trunkTransaction,
3941
String branchTransaction,
4042

4143
String attachmentTimestamp,
4244
String attachmentTimestampUpperBound,
43-
String attachmentTimestampLowerBound
45+
String attachmentTimestampLowerBound,
46+
47+
String nonce
4448
) {
4549
this.address = address;
4650
this.value = value;
@@ -54,6 +58,8 @@ public Transaction(String address,
5458
this.attachmentTimestamp = attachmentTimestamp;
5559
this.attachmentTimestampUpperBound = attachmentTimestampUpperBound;
5660
this.attachmentTimestampLowerBound = attachmentTimestampLowerBound;
61+
62+
this.nonce = nonce;
5763
}
5864

5965
public int getValue() {
@@ -70,6 +76,22 @@ public Map<String, Object> toMap() {
7076
map.put("obsoleteTag", obsoleteTag);
7177
map.put("tag", tag);
7278
map.put("timestamp", timestamp);
79+
map.put("signatureMessageFragment", signatureMessageFragment);
80+
map.put("trunkTransaction", trunkTransaction);
81+
map.put("branchTransaction", branchTransaction);
82+
map.put("attachmentTimestamp", attachmentTimestamp);
83+
map.put("attachmentTimestampLowerBound", attachmentTimestampLowerBound);
84+
map.put("attachmentTimestampUpperBound", attachmentTimestampUpperBound);
7385
return map;
7486
}
87+
88+
public String toString() {
89+
Map<String, Object> mapObj = toMap();
90+
String value = "{";
91+
for (Map.Entry<String, Object> entry: mapObj.entrySet()) {
92+
value += "'" + entry.getKey() + "':'" + entry.getValue().toString() + "', ";
93+
}
94+
value += "}";
95+
return value;
96+
}
7597
}

src/main/java/UserObject.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class FlashObject {
7878
MultisigAddress remainderAddress;
7979
ArrayList<Integer> deposits; // Clone correctly
8080
ArrayList<Bundle> outputs = new ArrayList<Bundle>();
81-
ArrayList<Transfer> transfers = new ArrayList<Transfer>();
81+
ArrayList<Bundle> transfers = new ArrayList<Bundle>();
8282

8383
FlashObject(int signersCount, int balance, ArrayList<Integer> deposits) {
8484
this.signersCount = signersCount;

0 commit comments

Comments
 (0)