/** * Get all contracts involved in current contract registration: contract itself, new items and revoking items * @return contracts tree */ public List<Contract> getAllContractInTree() { List<Contract> contracts = new ArrayList<>(); contracts.add(this); for (Contract c : getNew()) { contracts.addAll(c.getAllContractInTree()); } for (Contract c : getRevoking()) { contracts.addAll(c.getAllContractInTree()); } return contracts; }
@Test public void dupesWrongTest() throws Exception { PrivateKey key = new PrivateKey(Do.read(rootPath + "_xer0yfe2nn1xthc.private.unikey")); Set<PrivateKey> keys = new HashSet<>(); keys.add(key); Contract c_1 = Contract.fromDslFile(rootPath + "coin100.yml"); c_1.addSignerKey(key); c_1.seal(); assertTrue(c_1.check()); c_1.traceErrors(); Contract c_2_1 = ContractsService.createSplit(c_1, new BigDecimal("20"), "amount", keys); Contract c_2_2 = c_2_1.getNew().get(0); if(c_2_2 != null) { Contract c_2_3 = c_2_2.copy(); c_2_3.addSignerKey(key); c_2_3.seal(); c_2_1.addNewItems(c_2_3); } assertEquals(2, c_2_1.getNewItems().size()); c_2_1.check(); c_2_1.traceErrors(); assertFalse(c_2_1.isOk()); // should be BAD_VALUE duplicated revision id assertEquals(2, c_2_1.getErrors().size()); }
private void markContractTest(Contract contract) { ledger.markTestRecord(contract.getId()); contract.getNew().forEach(c -> markContractTest(c)); }
news.addAll(contract.getNew()); outcome.append(" -> "); news.forEach(c -> {
public synchronized static Contract finishSwap(Contract swapContract, Set<PrivateKey> keys) { List<Contract> swappingContracts = (List<Contract>) swapContract.getNew();
public synchronized Contract finishSwap_wrongKey(Contract swapContract, Set<PrivateKey> keys, PrivateKey wrongKey) { List<Contract> swappingContracts = (List<Contract>) swapContract.getNew(); // looking for contract that will be own for (Contract c : swappingContracts) { boolean willBeMine = c.getOwner().isAllowedForKeys(keys); System.out.println("willBeMine: " + willBeMine + " " + c.getSealedByKeys().size()); if(willBeMine) { c.addSignatureToSeal(wrongKey); } } swapContract.seal(); return swapContract; }
private List<Contract> createListOfCoinsWithAmount(List<String> values) throws Exception { Contract money = createCoin(); money.getStateData().set(FIELD_NAME, new Decimal(100500)); money.addSignerKeyFromFile(PRIVATE_KEY_PATH); money.seal(); sealCheckTrace(money, true); List<Contract> res = new ArrayList<>(); for (String value : values) { Contract contract = ContractsService.createSplit(money, new BigDecimal(value), FIELD_NAME, new HashSet<PrivateKey>()); contract.addSignerKeyFromFile(PRIVATE_KEY_PATH); res.add(contract.getNew().get(0)); } return res; }
/** * Completes escrow contract. All linked payments are made available to the executor. * For registration completed escrow contract require quorum of 2 of 3 roles: customer, executor and arbitrator. * * @param escrow contract (external or internal) to complete. Must be registered for creation new revision * * @return completed internal escrow contract or null if error occurred */ public static Contract completeEscrowContract(Contract escrow) { Contract escrowInside = escrow; if (!escrow.getStateData().getString("status", "null").equals("opened")) { // external escrow contract (escrow pack) // Find internal escrow contract in external escrow contract (escrow pack) String escrowOrigin = escrow.getDefinition().getData().getString("EscrowOrigin", null); if (escrowOrigin == null) return null; escrowInside = null; for (Contract c : escrow.getNew()) if (c.getOrigin().toBase64String().equals(escrowOrigin) && c.getStateData().getString("status", "null").equals("opened")) escrowInside = c; if (escrowInside == null) return null; } Contract revisionEscrow = escrowInside.createRevision(); revisionEscrow.getStateData().set("status", "completed"); revisionEscrow.seal(); return revisionEscrow; }
/** * Cancels escrow contract. All linked payments are made available to the customer. * For registration canceled escrow contract require quorum of 2 of 3 roles: customer, executor and arbitrator. * * @param escrow contract (external or internal) to cancel. Must be registered for creation new revision * * @return canceled internal escrow contract or null if error occurred */ public static Contract cancelEscrowContract(Contract escrow) { Contract escrowInside = escrow; if (!escrow.getStateData().getString("status", "null").equals("opened")) { // external escrow contract (escrow pack) // Find internal escrow contract in external escrow contract (escrow pack) String escrowOrigin = escrow.getDefinition().getData().getString("EscrowOrigin", null); if (escrowOrigin == null) return null; escrowInside = null; for (Contract c : escrow.getNew()) if (c.getOrigin().toBase64String().equals(escrowOrigin) && c.getStateData().getString("status", "null").equals("opened")) escrowInside = c; if (escrowInside == null) return null; } Contract revisionEscrow = escrowInside.createRevision(); revisionEscrow.getStateData().set("status", "canceled"); revisionEscrow.seal(); return revisionEscrow; }
/** * Method add found contracts in the new items and revoking items to {@link TransactionPack#subItems} and do it * again for each new item. * Also method add to {@link TransactionPack#referencedItems} referenced contracts from given. * @param c - given contract to extract from. */ protected synchronized void extractAllSubItemsAndReferenced(Contract c) { for (Contract r : c.getRevoking()) { putSubItem(r); for (Contract ref : r.getReferenced()) { addReferencedItem(ref); } } for (Contract n : c.getNew()) { putSubItem(n); extractAllSubItemsAndReferenced(n); } for (Contract ref : c.getReferenced()) { addReferencedItem(ref); } }
@Test(timeout = 90000) public void shouldBreakByQuantizerSplit() throws Exception { if(node == null) { System.out.println("network not inited"); return; } PrivateKey key = new PrivateKey(Do.read(ROOT_PATH + "_xer0yfe2nn1xthc.private.unikey")); // 100 Contract c = Contract.fromDslFile(ROOT_PATH + "coin100.yml"); c.addSignerKeyFromFile(ROOT_PATH +"_xer0yfe2nn1xthc.private.unikey"); c.seal(); registerAndCheckApproved(c); Contract.setTestQuantaLimit(60); // 30 Contract c1 = ContractsService.createSplit(c, new BigDecimal("30"), "amount", new HashSet<PrivateKey>(Arrays.asList(key))); Contract c2 = c1.getNew().get(0); assertEquals("70", c1.getStateData().get("amount").toString()); assertEquals("30", c2.getStateData().get("amount").toString()); node.registerItem(c1); ItemResult itemResult = node.waitItem(c1.getId(), 1500); System.out.println(itemResult); Contract.setTestQuantaLimit(-1); assertEquals(ItemState.UNDEFINED, itemResult.state); }
@Test public void serializeDeserialize() throws Exception { //serialize Binder b1 = serialize(parcel); Binder b2 = serialize(parcelFromFile); //deserialize des_parcel = deserialize(b1); des_parcelFromFile = deserialize(b2); parcelAssertions(parcel, des_parcel); parcelAssertions(des_parcelFromFile, des_parcelFromFile); assertEquals(1, des_parcel.getPayload().getSubItems().size()); assertEquals(1, des_parcel.getPayload().getContract().getNew().size()); }
@Test public void packUnpack() throws Exception { //pack byte[] array = parcel.pack(); byte[] array1 = parcelFromFile.pack(); //unpack des_parcel = Parcel.unpack(array); des_parcelFromFile = Parcel.unpack(array1); parcelAssertions(parcel, des_parcel); parcelAssertions(parcelFromFile, des_parcelFromFile); assertEquals(1, des_parcel.getPayload().getSubItems().size()); assertEquals(1, des_parcel.getPayload().getContract().getNew().size()); } }
@Test @Ignore("it is snatch test") public void joinSnatch() throws Exception { PrivateKey key = new PrivateKey(Do.read(ROOT_PATH + "_xer0yfe2nn1xthc.private.unikey")); Set<PrivateKey> keys = new HashSet<>(); keys.add(key); Contract c1 = Contract.fromDslFile(ROOT_PATH + "coin100.yml"); c1.addSignerKey(key); assertTrue(c1.check()); c1.seal(); registerAndCheckApproved(c1); System.out.println("money before split (c1): " + c1.getStateData().getIntOrThrow("amount")); Contract c2 = ContractsService.createSplit(c1, new BigDecimal("99"), "amount", keys); Contract c3 = c2.getNew().get(0); System.out.println("money after split (c2): " + c2.getStateData().getIntOrThrow("amount")); System.out.println("money after split (c3): " + c3.getStateData().getIntOrThrow("amount")); registerAndCheckApproved(c3); Contract c4 = c3.createRevision(keys); c4.addRevokingItems(c1); c4.getStateData().set("amount", 199);//150); c4.seal(); System.out.println("money after snatch (c4): " + c4.getStateData().getIntOrThrow("amount")); System.out.println("check after snatch (c4): " + c4.check()); c4.traceErrors(); registerAndCheckDeclined(c4); }
@Test(timeout = 90000) public void shouldDeclineSplit() throws Exception { if(node == null) { System.out.println("network not inited"); return; } PrivateKey key = new PrivateKey(Do.read(ROOT_PATH + "_xer0yfe2nn1xthc.private.unikey")); // 100 Contract c = Contract.fromDslFile(ROOT_PATH + "coin100.yml"); c.addSignerKey(key); c.seal(); assertTrue(c.check()); registerAndCheckApproved(c); // 550 Contract c1 = ContractsService.createSplit(c, new BigDecimal("550"), "amount", new HashSet<PrivateKey>(Arrays.asList(key))); Contract c2 = c1.getNew().get(0); assertEquals("-450", c1.getStateData().get("amount").toString()); assertEquals("550", c2.getStateData().get("amount").toString()); registerAndCheckDeclined(c1); assertEquals(ItemState.APPROVED, node.waitItem(c.getId(), 5000).state); assertEquals(ItemState.DECLINED, node.waitItem(c1.getId(), 5000).state); assertEquals(ItemState.UNDEFINED, node.waitItem(c2.getId(), 5000).state); }
@Test(timeout = 90000) public void shouldApproveSplit() throws Exception { if(node == null) { System.out.println("network not inited"); return; } PrivateKey key = new PrivateKey(Do.read(ROOT_PATH + "_xer0yfe2nn1xthc.private.unikey")); // 100 Contract c = Contract.fromDslFile(ROOT_PATH + "coin100.yml"); c.addSignerKey(key); c.seal(); assertTrue(c.check()); registerAndCheckApproved(c); // 100 - 30 = 70 Contract c1 = ContractsService.createSplit(c, new BigDecimal("30"), "amount", new HashSet<PrivateKey>(Arrays.asList(key))); Contract c2 = c1.getNew().get(0); assertEquals("70", c1.getStateData().get("amount").toString()); assertEquals("30", c2.getStateData().get("amount").toString()); registerAndCheckApproved(c1); assertEquals("70", c1.getStateData().get("amount").toString()); assertEquals("30", c2.getStateData().get("amount").toString()); assertEquals(ItemState.REVOKED, node.waitItem(c.getId(), 5000).state); assertEquals(ItemState.APPROVED, node.waitItem(c1.getId(), 5000).state); assertEquals(ItemState.APPROVED, node.waitItem(c2.getId(), 5000).state); }
uContract = payingParcel.getPayloadContract().getNew().get(0);
@Test(timeout = 90000) public void shouldDeclineSplitAndJoinWithWrongAmount() throws Exception { if(node == null) { System.out.println("network not inited"); return; } PrivateKey key = new PrivateKey(Do.read(ROOT_PATH + "_xer0yfe2nn1xthc.private.unikey")); // 100 Contract c = Contract.fromDslFile(ROOT_PATH + "coin100.yml"); c.addSignerKey(key); c.seal(); assertTrue(c.check()); registerAndCheckApproved(c); assertEquals(100, c.getStateData().get("amount")); // split 100 - 30 = 70 Contract c1 = ContractsService.createSplit(c, new BigDecimal("30"), "amount", new HashSet<PrivateKey>(Arrays.asList(key))); Contract c2 = c1.getNew().get(0); registerAndCheckApproved(c1); assertEquals("70", c1.getStateData().get("amount").toString()); assertEquals("30", c2.getStateData().get("amount").toString()); //wrong. send 500 out of 2 contracts (70 + 30) Contract c3 = c2.createRevision(); c3.getStateData().set("amount", new Decimal(500)); c3.addSignerKey(key); c3.addRevokingItems(c1); c3.seal(); assertFalse(c3.check()); registerAndCheckDeclined(c3); }
uContract = payingParcel.getPayloadContract().getNew().get(0);
uContract = payingParcel.getPayloadContract().getNew().get(0);